{"id":13820827,"url":"https://github.com/zarifpour/jira-dependency-graph","last_synced_at":"2025-04-24T02:25:10.216Z","repository":{"id":63201878,"uuid":"561481399","full_name":"zarifpour/jira-dependency-graph","owner":"zarifpour","description":"🧿 Graph visualizer for JIRA ticket dependencies (epics, tasks, statuses, links, and more).","archived":false,"fork":false,"pushed_at":"2024-07-12T04:58:07.000Z","size":590,"stargazers_count":17,"open_issues_count":1,"forks_count":4,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-18T05:05:40.097Z","etag":null,"topics":["atlassian","atlassian-jira","chart","dependency-graph","dependency-tree","epic","graph","graphviz","jira","jira-api","nodes","python","relationships","ticket","tree","treeview","visualization"],"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/zarifpour.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE.md","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},"funding":{"github":"zarifpour","buy_me_a_coffee":"zarifpour"}},"created_at":"2022-11-03T19:37:21.000Z","updated_at":"2024-12-23T17:09:42.000Z","dependencies_parsed_at":"2024-08-04T08:15:42.994Z","dependency_job_id":null,"html_url":"https://github.com/zarifpour/jira-dependency-graph","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zarifpour%2Fjira-dependency-graph","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zarifpour%2Fjira-dependency-graph/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zarifpour%2Fjira-dependency-graph/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zarifpour%2Fjira-dependency-graph/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zarifpour","download_url":"https://codeload.github.com/zarifpour/jira-dependency-graph/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250546909,"owners_count":21448410,"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","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":["atlassian","atlassian-jira","chart","dependency-graph","dependency-tree","epic","graph","graphviz","jira","jira-api","nodes","python","relationships","ticket","tree","treeview","visualization"],"created_at":"2024-08-04T08:01:09.825Z","updated_at":"2025-04-24T02:25:10.201Z","avatar_url":"https://github.com/zarifpour.png","language":"Python","funding_links":["https://github.com/sponsors/zarifpour","https://buymeacoffee.com/zarifpour"],"categories":["Python"],"sub_categories":[],"readme":"# jira-dependency-graph\n\nGraph visualizer for dependencies between JIRA tickets (with subtasks and issue links).\n\n* Uses JIRA rest API v2 for fetching information on issues.\n* Uses [Google Chart API](https://developers.google.com/chart/) for graphical presentation.\n\n![Example graph](examples/issue_graph_new.svg)\n\n\u003cdetails\u003e\n  \u003csummary\u003eRequirements\u003c/summary\u003e\n\n* Python 2.7+ or Python 3+\n* [poetry](https://github.com/python-poetry/poetry) (recommended)\n* [requests](https://github.com/psf/requests)\n* ...\n\n\u003c/details\u003e\n\n## Prerequisites\n\nCreate an API token from your Atlassian account:\n\n1. Log in to \u003chttps://id.atlassian.com/manage-profile/security/api-tokens\u003e.\n\n2. Click **Create API token**.\n\n3. From the dialog that appears, enter a memorable and concise **Label** for your token and click **Create**.\n\n4. Click **Copy to clipboard**, then paste the token to your script, or elsewhere to save.\n\nRefer to [Atlassian support](https://support.atlassian.com/atlassian-account/docs/manage-api-tokens-for-your-atlassian-account/) for more information.\n\n## Usage\n\n```shell\ngit clone https://github.com/zarifpour/jira-dependency-graph.git\ncd jira-dependency-graph\npoetry install\npoetry shell\npython jira-dependency-graph.py --user=\u003cJIRA_EMAIL\u003e --password=\u003cJIRA_API_KEY\u003e --jira=https://\u003cYOUR_ORGANIZATION\u003e.atlassian.net \u003cJIRA_ISSUE_KEY\u003e --show-directions outward\n```\n\n\u003e [!Note]\n\u003e\n\u003e * Graphs are saved to `/out/gv/` (.gv) and `/out/png/` (.png)\n\u003e * If a filename is not specified, by default, the issue name(s) are used\n\u003e * Multiple issue-keys can be passed separated with spaces, i.e. `...atlassian.net JIRA-8 JIRA-11`\n\n\u003cdetails\u003e\n  \u003csummary\u003eExamples\u003c/summary\u003e\n\n```shell\npython jira-dependency-graph.py --user=daniel.zarifpour@simbachain.com --password=A11P22I33K44E55Y --jira=https://simbachain.atlassian.net JIRA-899\n\n🐕 Fetching issues.../\n\nGraphs written to:\n\n - /path/to/jira_tree/out/gv/JIRA-899.gv\n - /path/to/jira_tree/out/png/JIRA-899.png\n\n🎉 Woohoo, it's done!       %\n```\n\n---\n\n![Example graph](examples/issue_graph_new.svg)\n\n\u003c/details\u003e\n\n## Useful flags\n\n| Description       | Flag                      | Example     | Notes       |\n| -----------       | -----------               | ----------- | ----------- |\n| Show directions      | `--show-directions`          | `... JIRA-8 --show-directions outward` | Only display outward/inward links. **Useful to avoid cycles (recommended)**.     |\n| Exclude link      | `--exclude-link`          | `... JIRA-8 --exclude-link \"blocks\"` | Exclude specified links, repeatable for multiple links. Useful to ignore bi-directional edges.     |\n| Ignore Epic       | `--ignore-epic`           | `... --ignore-epic JIRA-8` | Skip issues in an Epic.  |\n| Filter by issue prefix  | `--issue-include`   | `... JIRA-8 --issue-include BLK`  | Display issues with a specific prefix. In this example the prefix is \"BLK\". |\n| Exclude issue(s)  | `--issue-exclude` / `-xi` | `... JIRA-8 --issue-exclude JIRA-2` | Exclude specific issues, repeatable. Use as last-resort when other exclusions not suitable.  |\n| Use JQL           | `--jql` | `... --jql 'project = Blockchain'` | Use Jira Query Language command instead of issue-keys.\n| Ignore closed     | `--ignore-closed`         | `... JIRA-8 --ignore-closed` |  Ignore closed tickets. |\n| No merge \"relates to\"  | `--no-merge-relates`      | `... JIRA-8 --no-merge-relates` | Avoid merging related issue edges (creates cycles). |\n| PNG only  | `--png`      | `... JIRA-8 --png` | Save graph as \".png\" only (Google API). |\n| Graphviz only  | `--gv`      | `... JIRA-8 --gv` | Save graph as \".gv\" only (does not hit Google API). |\n| Filename               | `--file`                  | `... JIRA-8 --file=graphimg`         | Specify a custom file name for saving output. If not used, output is saved as a concatenated list of JIRA issue keys, which may cause errors if the list is too long. |\n\n\u003e **Note**\n\u003e `...` is equivalent to `python jira-dependency-graph.py --user=\u003cJIRA_EMAIL\u003e --password=\u003cJIRA_API_KEY\u003e --jira=https://\u003cYOUR_ORGANIZATION\u003e.atlassian.net`\n\n## Contributing\n\nTo make this tool even more awesome, consider some of the following when contributing.\n\n### Schemas\n\nSchemas makes data much easier to consume... To add a schema from the [JIRA API](https://docs.atlassian.com/software/jira/docs/api/REST/9.3.1/#api/2/):\n\n1. Copy-paste one of the [JIRA json schemas](https://docs.atlassian.com/software/jira/docs/api/REST/9.3.1/#api/2/issue-getIssue) into `schemas/json/\u003cSCHEMA\u003e.json`.\n2. Autogenerate the pydantic schemas with the [datamodel-codegen](https://github.com/koxudaxi/datamodel-code-generator) tool (see code sample below).\n3. Replace `constr(...)` - in most cases - with `Any` from the typing package.\n4. Try fetching and processing some data from the API and update the schemas as you learn more about them.\n\n```shell\ndatamodel-codegen  --input schemas/json/\u003cSCHEMA\u003e.json --input-file-type jsonschema --output schemas/\u003cSCHEMA\u003e.py\n```\n\n### Pre-commit\n\nThe [pre-commit](https://pre-commit.com/) ensures code quality. Several checks are done upon each commit, including:\n\n* [black](https://github.com/psf/black)\n* [mypy](https://github.com/python/mypy)\n* [flake8](https://github.com/PyCQA/flake8)\n* [isort](https://github.com/PyCQA/isort)\n* [conventional-commit](https://github.com/nebbles/gitcommit)\n\nIf these requirements are not satisfied, you will not be able to commit.\n\nAlternatively, if the pre-commit checks are interrupting your workflow, use the following command:\n\n```shell\ngit commit . -m '\u003cCOMMIT_MSG\u003e' --no-verify\n```\n\n#### Conventional Commit\n\nThe [pre-commit](https://pre-commit.com/) enforces the [Conventional Commits](https://www.conventionalcommits.org/) standard for git commit messages. This is a lightweight convention that creates an explicit commit history, which makes it easier to write automated tools on top of.\n\nTo use the commit CLI run the command:\n\n```sh\ngitcommit\n```\n\nIf you are using VS Code the extension [Commitizen Support](https://github.com/KnisterPeter/vscode-commitizen.git) streamlines this process.\n\n## Notes\n\nThis is a fork of [pawelrychlik/jira-dependency-graph](https://github.com/pawelrychlik/jira-dependency-graph), please refer to that repository for complete documentation (some features may be deprecated). The old repo's method of authentication (using a password) has been deprecated and you must now use your API key instead. It also enables duplicated relationships by default (i.e. nodes that are connected may have the relationship \"blocks\" and \"is blocked by\" pointing to each other). You may continue to use that repo and exclude these types of duplicated links - this repo excludes some of them by default.\n\n### Changes\n\n* Documented auth (API Key)\n* Opinionated exclusion of duplicate edges\n* Added poetry for simplified virtual environment management\n* Added pydantic schemas for clearer data parsing and validation\n* Added mypy typing to verify soundness of types\n* Added other code quality stuff...\n* Added support for Epics in team-managed projects\n* Added bearer token\n* Added storage of gv files without using google api\n* Fixed Dockerfile\n\n### Contributors\n\n\u003cdetails\u003e\n  \u003csummary\u003e\n    Everyone from \u003ca href=\"https://github.com/pawelrychlik/jira-dependency-graph\" target=\"_blank\"\u003epawelrychlik/jira-dependency-graph\u003c/a\u003e\n  \u003c/summary\u003e\n  \u003cul\u003e\n    \u003cli\u003eThank you 🌈\u003c/li\u003e\n  \u003c/ul\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e\n    Changes by \u003ca href=\"https://github.com/jlinkohr\" target=\"_blank\"\u003ejlinkohr\u003c/a\u003e\n  \u003c/summary\u003e\n  \u003cul\u003e\n    \u003cli\u003eAdded bearer token\u003c/li\u003e\n    \u003cli\u003eAdded storage of gv files without using google api\u003c/li\u003e\n    \u003cli\u003eFixed Dockerfile\u003c/li\u003e\n  \u003c/ul\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e\n    Changes by \u003ca href=\"https://github.com/svscorp\" target=\"_blank\"\u003esvscorp\u003c/a\u003e\n  \u003c/summary\u003e\n  \u003cul\u003e\n    \u003cli\u003eImprove compatibility with Python versions\u003c/li\u003e\n  \u003c/ul\u003e\n\u003c/details\u003e\n\n---\n\n\u003ca href = \"https://github.com/zarifpour/jira-dependency-graph/graphs/contributors\"\u003e\n  \u003cimg src = \"https://contrib.rocks/image?repo=zarifpour/jira-dependency-graph\"/\u003e\n\u003c/a\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzarifpour%2Fjira-dependency-graph","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzarifpour%2Fjira-dependency-graph","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzarifpour%2Fjira-dependency-graph/lists"}