{"id":22144020,"url":"https://github.com/pytask-dev/pytask-julia","last_synced_at":"2025-10-12T22:51:09.168Z","repository":{"id":40558887,"uuid":"447884112","full_name":"pytask-dev/pytask-julia","owner":"pytask-dev","description":"A pytask plugin for Julia.","archived":false,"fork":false,"pushed_at":"2025-09-15T18:05:23.000Z","size":210,"stargazers_count":3,"open_issues_count":7,"forks_count":0,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-09-15T20:13:09.625Z","etag":null,"topics":["pytask"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pytask-dev.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGES.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2022-01-14T07:49:32.000Z","updated_at":"2025-07-26T11:30:41.000Z","dependencies_parsed_at":"2023-12-25T20:24:49.354Z","dependency_job_id":"2df71d2c-1e63-4c2f-b9f4-49d3843c84eb","html_url":"https://github.com/pytask-dev/pytask-julia","commit_stats":{"total_commits":23,"total_committers":4,"mean_commits":5.75,"dds":0.4782608695652174,"last_synced_commit":"358ee121e4d5ace94ae6eaaab6fee1d54b315e4c"},"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/pytask-dev/pytask-julia","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pytask-dev%2Fpytask-julia","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pytask-dev%2Fpytask-julia/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pytask-dev%2Fpytask-julia/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pytask-dev%2Fpytask-julia/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pytask-dev","download_url":"https://codeload.github.com/pytask-dev/pytask-julia/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pytask-dev%2Fpytask-julia/sbom","scorecard":{"id":402094,"data":{"date":"2025-08-11","repo":{"name":"github.com/pytask-dev/pytask-julia","commit":"2bd1be75b6396b8541489aaa3a77b861189cda10"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.3,"checks":[{"name":"Code-Review","score":0,"reason":"Found 1/16 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Maintained","score":1,"reason":"2 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 1","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: jobLevel 'contents' permission set to 'write': .github/workflows/publish-to-pypi.yml:60","Warn: no topLevel permission defined: .github/workflows/main.yml:1","Warn: no topLevel permission defined: .github/workflows/publish-to-pypi.yml:1"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/pytask-dev/pytask-julia/main.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/pytask-dev/pytask-julia/main.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:45: update your workflow using https://app.stepsecurity.io/secureworkflow/pytask-dev/pytask-julia/main.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/main.yml:47: update your workflow using https://app.stepsecurity.io/secureworkflow/pytask-dev/pytask-julia/main.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/main.yml:48: update your workflow using https://app.stepsecurity.io/secureworkflow/pytask-dev/pytask-julia/main.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/main.yml:61: update your workflow using https://app.stepsecurity.io/secureworkflow/pytask-dev/pytask-julia/main.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/main.yml:70: update your workflow using https://app.stepsecurity.io/secureworkflow/pytask-dev/pytask-julia/main.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish-to-pypi.yml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/pytask-dev/pytask-julia/publish-to-pypi.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish-to-pypi.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/pytask-dev/pytask-julia/publish-to-pypi.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish-to-pypi.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/pytask-dev/pytask-julia/publish-to-pypi.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish-to-pypi.yml:44: update your workflow using https://app.stepsecurity.io/secureworkflow/pytask-dev/pytask-julia/publish-to-pypi.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/publish-to-pypi.yml:49: update your workflow using https://app.stepsecurity.io/secureworkflow/pytask-dev/pytask-julia/publish-to-pypi.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish-to-pypi.yml:65: update your workflow using https://app.stepsecurity.io/secureworkflow/pytask-dev/pytask-julia/publish-to-pypi.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/publish-to-pypi.yml:70: update your workflow using https://app.stepsecurity.io/secureworkflow/pytask-dev/pytask-julia/publish-to-pypi.yml/main?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/main.yml:31","Warn: pipCommand not pinned by hash: .github/workflows/publish-to-pypi.yml:18","Info:   0 out of   8 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   6 third-party GitHubAction dependencies pinned","Info:   0 out of   2 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/publish-to-pypi.yml:30"],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}}]},"last_synced_at":"2025-08-18T20:18:35.502Z","repository_id":40558887,"created_at":"2025-08-18T20:18:35.502Z","updated_at":"2025-08-18T20:18:35.502Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279013281,"owners_count":26085250,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-12T02:00:06.719Z","response_time":53,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["pytask"],"created_at":"2024-12-01T22:18:05.692Z","updated_at":"2025-10-12T22:51:09.128Z","avatar_url":"https://github.com/pytask-dev.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# pytask-julia\n\n[![PyPI](https://img.shields.io/pypi/v/pytask-julia?color=blue)](https://pypi.org/project/pytask-julia)\n[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/pytask-julia)](https://pypi.org/project/pytask-julia)\n[![image](https://img.shields.io/conda/vn/conda-forge/pytask-julia.svg)](https://anaconda.org/conda-forge/pytask-julia)\n[![image](https://img.shields.io/conda/pn/conda-forge/pytask-julia.svg)](https://anaconda.org/conda-forge/pytask-julia)\n[![PyPI - License](https://img.shields.io/pypi/l/pytask-julia)](https://pypi.org/project/pytask-julia)\n[![image](https://img.shields.io/github/actions/workflow/status/pytask-dev/pytask-julia/main.yml?branch=main)](https://github.com/pytask-dev/pytask-julia/actions?query=branch%3Amain)\n[![image](https://codecov.io/gh/pytask-dev/pytask-julia/branch/main/graph/badge.svg)](https://codecov.io/gh/pytask-dev/pytask-julia)\n[![pre-commit.ci status](https://results.pre-commit.ci/badge/github/pytask-dev/pytask-julia/main.svg)](https://results.pre-commit.ci/latest/github/pytask-dev/pytask-julia/main)\n[![image](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/ambv/black)\n\n______________________________________________________________________\n\nRun Julia scripts with pytask.\n\n## Installation\n\npytask-julia is available on [PyPI](https://pypi.org/project/pytask-julia) and\n[Anaconda.org](https://anaconda.org/conda-forge/pytask-julia). Install it with\n\n```console\n$ pip install pytask-julia\n\n# or\n\n$ conda install -c conda-forge pytask-julia\n```\n\nYou also need to have Julia installed and `julia` on your command line. Test it by\ntyping the following on the command line\n\n```console\njulia -h\n```\n\nIf an error is shown instead of a help page, you can install Julia on Unix systems with\n\n```console\nconda install -c conda-forge julia\n```\n\nor choose one of the installers on this [page](https://julialang.org/downloads/).\n\n## Usage\n\nTo create a task that runs a Julia script, define a task function with the\n`@pytask.mark.julia` decorator. The `script` keyword provides a path relative to the\ntask module to the Julia script.\n\n```python\nimport pytask\nfrom pathlib import Path\nfrom pytask import task\n\n\n@task(kwargs={\"path\": Path(\"out.csv\")})\n@pytask.mark.julia(script=\"script.jl\")\ndef task_run_jl_script():\n    pass\n```\n\nIf you are wondering why the function body is empty, know that pytask-julia replaces the\nbody with a predefined internal function. See the section on implementation details for\nmore information.\n\n### Dependencies and Products\n\nDependencies and products can be added as usual. Read this\n[tutorial](https://pytask-dev.readthedocs.io/en/stable/tutorials/defining_dependencies_products.html).\n\nFor example, with the `@pytask.task` decorator as shown before. (The choice of the kwarg\nname, here `path`, is arbitrary.)\n\n### Accessing dependencies and products in the script\n\nTo access the paths of dependencies and products in the script, pytask-julia stores the\ninformation by default in a `.json` file. The path to this file is passed as a\npositional argument to the script. Inside the script, you can read the information.\n\n```julia\nimport JSON\n\npath_to_json = ARGS[1]  # Contains the path to the .json file.\n\nconfig = JSON.parse(read(path_to_json, String))  # A dictionary.\n\nconfig[\"path\"]  # Is the path to the output file \"../out.csv\".\n```\n\nThe `.json` file is stored in the same folder as the task in a `.pytask` directory.\n\nTo parse the JSON file, you need to install\n[JSON.jl](https://github.com/JuliaIO/JSON.jl).\n\nYou can also pass any other information to your script by using the `@task` decorator.\n\n```python\n@task(kwargs={\"path\": Path(\"out.csv\"), \"number\": 1})\n@pytask.mark.julia(script=\"script.jl\")\ndef task_run_jl_script():\n    pass\n```\n\nand inside the script use\n\n```julia\nconfig[\"number\"]  # Is 1.\n```\n\n### Debugging\n\nIn case a task throws an error, you might want to execute the script independently from\npytask. After a failed execution, you see the command that executed the Julia script in\nthe report of the task. It looks roughly like this\n\n```console\njulia \u003coptions\u003e -- script.jl \u003cpath-to\u003e/.pytask/pytask-julia/\u003cuuid\u003e.json\n```\n\n### Managing Julia environments\n\nJulia has support for environments to execute your tasks via `Pkg.jl` which is explained\n[here](https://pkgdocs.julialang.org/v1/environments/).\n\npytask-julia allows you define a default environment via your\n[pytask configuration file](https://pytask-dev.readthedocs.io/en/stable/tutorials/configuration.html).\n\nUse the `julia_project` key to define a path to your configuration file to point to your\nenvironment.\n\nProbably your environment files `Manifest.toml` and `Project.toml` reside at the root of\nyour project folder as well as your pytask configuration file. Then, the content will\nlook like this.\n\n```toml\n[tool.pytask.ini_options]\njulia_project = \".\"\n```\n\nYou can also define environments for each task which will overwrite any other default\nwith the `project` keyword argument. Pass a path to the task module.\n\n```python\n@task(kwargs={\"path\": Path(\"out.csv\")})\n@pytask.mark.julia(script=\"script.jl\", project=\".\")\ndef task_run_jl_script():\n    pass\n```\n\n### Command Line Options\n\nCommand line options can be passed via the `options` keyword argument.\n\n```python\n@task(kwargs={\"path\": Path(\"out.csv\")})\n@pytask.mark.julia(script=\"script.jl\", options=[\"--threads\", \"2\"])\ndef task_run_jl_script():\n    pass\n```\n\nThis example will execute the script using threads.\n\n### Repeating tasks with different scripts or inputs\n\nYou can also repeat the execution of tasks, meaning executing multiple Julia scripts or\npassing different command line arguments to the same Julia script.\n\nThe following task executes two Julia scripts, `script_1.jl` and `script_2.jl`, which\nproduce different outputs.\n\n```python\nfor i in range(2):\n\n    @task(kwargs={\"path\": Path(f\"out_{i}.csv\")})\n    @pytask.mark.julia(script=f\"script_{i}.jl\")\n    def task_execute_julia_script():\n        pass\n```\n\nIf you want to pass different inputs to the same Julia script, pass these arguments with\nthe `kwargs` keyword of the `@task` decorator.\n\n```python\nfor i in range(2):\n\n    @task(kwargs={\"path\": Path(f\"out_{i}.csv\"), \"i\": i})\n    @pytask.mark.julia(script=\"script.jl\")\n    def task_execute_julia_script():\n        pass\n```\n\nand inside the task access the argument `i` with\n\n```julia\nimport JSON\n\npath_to_json = ARGS[1]  # Contains the path to the .json file.\n\nconfig = JSON.parse(read(path_to_json, String))  # A dictionary.\n\nconfig[\"path\"]  # Is the path to the output file \"../output_{i}.csv\".\n\nconfig[\"i\"]  # Is the number.\n```\n\n### Serializers\n\nYou can also serialize your data with any other tool you like. By default, pytask-julia\nalso supports YAML (if PyYaml is installed).\n\nUse the `serializer` keyword arguments of the `@pytask.mark.julia` decorator with\n\n```python\n@pytask.mark.julia(script=\"script.jl\", serializer=\"yaml\")\ndef task_example(): ...\n```\n\nAnd in your Julia script use\n\n```julia\nimport YAML\nconfig = YAML.load_file(ARGS[1])\n```\n\nNote that the `YAML` package needs to be installed.\n\nIf you need a custom serializer, you can also provide any callable for `serializer`\nwhich transforms data into a string. Use `suffix` to set the correct file ending.\n\nHere is a replication of the JSON example.\n\n```python\nimport json\n\n\n@pytask.mark.julia(script=\"script.jl\", serializer=json.dumps, suffix=\".json\")\ndef task_example(): ...\n```\n\n### Configuration\n\nYou can influence the default behavior of pytask-julia with some configuration values.\nPlace them into a `pyproject.toml` file.\n\n**`julia_serializer`**\n\nUse this option to change the default serializer.\n\n```toml\n[tool.pytask.ini_options]\njulia_serializer = \"json\"\n```\n\n**`julia_suffix`**\n\nUse this option to set the default suffix of the file which contains serialized paths to\ndependencies, products and more.\n\n```toml\n[tool.pytask.ini_options]\njulia_suffix = \".json\"\n```\n\n**`julia_options`**\n\nUse this option to set default options for each task which are separated by whitespace.\n\n```toml\n[tool.pytask.ini_options]\njulia_options = [\"--threads\", 2]\n```\n\n**`julia_project`**\n\nUse this option to set a default environment for each task. If your environment with\n`Manifest.toml` and `Project.toml` is defined in the same directory as the configuration\nfile `pyproject.toml`, just use a dot.\n\n```toml\n[tool.pytask.ini_options]\njulia_project = \".\"\n```\n\nIf the environment files were in a folder next to the configuration file called\n`environment` use\n\n```toml\n[tool.pytask.ini_options]\njulia_project = \"environment\"\n```\n\n## Changes\n\nConsult the [release notes](CHANGES.md) to find out about what is new.\n\n## Development\n\nAfter setting up the environment, enter\n\n```console\n$ julia\n$ ]\n$ pkg\u003e activate .\n$ pkg\u003e instantiate\n```\n\nto set up the Julia environment.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpytask-dev%2Fpytask-julia","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpytask-dev%2Fpytask-julia","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpytask-dev%2Fpytask-julia/lists"}