{"id":23066751,"url":"https://github.com/marcusoftnet/jira-stat-extractor","last_synced_at":"2026-06-23T13:31:54.628Z","repository":{"id":267431494,"uuid":"840296255","full_name":"marcusoftnet/jira-stat-extractor","owner":"marcusoftnet","description":null,"archived":false,"fork":false,"pushed_at":"2025-09-23T07:31:45.000Z","size":14,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-09-23T09:23:48.944Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"unlicense","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/marcusoftnet.png","metadata":{"files":{"readme":"README.md","changelog":null,"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":"2024-08-09T11:45:08.000Z","updated_at":"2025-09-23T07:31:49.000Z","dependencies_parsed_at":"2024-12-10T10:27:23.921Z","dependency_job_id":"e4006d62-b772-44f3-8068-6c85c7c63fa3","html_url":"https://github.com/marcusoftnet/jira-stat-extractor","commit_stats":null,"previous_names":["marcusoftnet/jira-stat-extractor"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/marcusoftnet/jira-stat-extractor","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marcusoftnet%2Fjira-stat-extractor","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marcusoftnet%2Fjira-stat-extractor/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marcusoftnet%2Fjira-stat-extractor/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marcusoftnet%2Fjira-stat-extractor/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/marcusoftnet","download_url":"https://codeload.github.com/marcusoftnet/jira-stat-extractor/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marcusoftnet%2Fjira-stat-extractor/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34691724,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-23T02:00:07.161Z","response_time":65,"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":[],"created_at":"2024-12-16T05:14:49.675Z","updated_at":"2026-06-23T13:31:54.617Z","avatar_url":"https://github.com/marcusoftnet.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Jira Stats Exporter\n\nWe use this script to export data about issues from JIRA to be used in our status reporting. The script creates a CSV file that can be imported into the Google Sheet where the statistical processing happens.\n\nThe script gets the issues from the passed in JQL and then parses the changelog for each issue to get the Work Started Status (`-s` / `--workstartedstatus`) parameter to get a proper state date\n\nThe main reasons for having this script in the first place is that we cannot use \"Created\" as our start date, since that date often is weeks (and sometime months or years) before actual work starts in the first place. Hence we need to look into the changelog and get the change that indicates the real start of work.\n\n## Using the script\n\n### Prerequisite\n\nThe script uses Python 3 and you will have to install that on your computer.\n\n### Quick start\n\nOpen a terminal in the same directory as where the `main.py` file is located\n\nUsing abbreviations:\n\n```bash\npython3 main.py -u {your username} -t {your token} -j {a JQL statement}\n```\n\nUsing long parameter names:\n\n```bash\npython3 main.py --username {your username} --token {your token} --jql {a JQL statement}\n```\n\n### Parameters\n\nThe script takes 3 required parameters\n\n| Parameter name | Description | Example |\n| :--- | :--- | :--- |\n| `-u` / `--username` | The username you have generated a token for. \u003cbr/\u003e Typically this is your email address | `-u marcus.hammarberg@umain.com` |\n| `-t` / `--token` | A token to access the API with. You can [easily generate one here](https://id.atlassian.com/manage-profile/security/api-tokens) | `-t WI34GH9W29843R892F92RH2` |\n| `-j` / `--jql` | A JQl query to get issues for. Note that your user needs to have access to things you are querying for; projects, filters etc. \u003cbr/\u003e Supply the JQL statement in **double**quotes. You might need to change the quotes in your query to use single quotes. | `\"filter = 'Filter for Team 418' and issuetype=Story and statuscategory=Done\"` |\n\nThere are also two optional parameters that you only need to supply if the default values are not useful\n\n| Parameter name | Description | Default value | Example |\n| :--- | :--- | :--- | :--- |\n| `-s` / `--workstartedstatus` | The name of the status that should start the clock for our work time. Looking up the first time the issue changed into this status, is the main reason for us having to create this script in the first place. \u003cbr\u003e The comparison is done case-insensitive. | `Implementing` | `-w Accepted` |\n| `-o` / `--output` | Name and location of the output file. The file will be created if it doesn't exist and overwritten if it does exist. | `jira-stats-export-{date}` | `-o marcus.csv` \u003cbr\u003e `-o ~/Downloads/export.csv` |\n\n### Full example\n\n```bash\npython3 main.py --username marcus.hammarberg@umain.com --token WI34GH9W29843R892F92RH2 --jql \"filter = 'Filter for Team 418' and issuetype=Story and statuscategory=Done\" --workstartedstatus Accepted --output ~/Downloads/export_291212.csv\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarcusoftnet%2Fjira-stat-extractor","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmarcusoftnet%2Fjira-stat-extractor","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarcusoftnet%2Fjira-stat-extractor/lists"}