{ "info": { "author": "Martin Aspeli", "author_email": "optilude@gmail.com", "bugtrack_url": null, "classifiers": [], "description": "# JIRA Agile Metrics\n\nA tool to extract Agile metrics and charts from JIRA projects.\n\n## Installation\n\nRequires Python 3.6 or later.\n\nInstall Python 3 and the `pip` package manager. Then run:\n\n $ pip install jira-agile-metrics\n\nYou can do this globally, but you may want to use a virtual Python environment\n(`venv`) instead to keep things self-contained.\n\nSee [The Hitchhiker's Guide to Python](http://python-guide.org/en/latest/) for\nthe full details about how to install Python and venvs.\n\nThis should install a binary called `jira-agile-metrics` in the relevant `bin`\ndirectory. You can test it using:\n\n $ jira-agile-metrics --help\n\n... which should print a help message.\n\n### Using Docker\n\nIf you prefer, you can use [Docker](http://docker.com) to install and run\n`jira-agile-metrics` with all the relevant dependencies in place. After\ninstalling Docker, run:\n\n $ docker run -it --rm -v $PWD:/data optilude/jira-agile-metrics:latest config.yml\n\nThis will run `jira-agile-metrics` with the configuration file `config.yml` from\nthe current directory, writing outputs also to the current directory. The\nargument `-v $PWD:/data` mounts the `/data` volume, where output files will be\nwritten, to the current working directory. You can of course specify a\ndifferent bind mount.\n\n### Using Docker in batch mode\n\nThere is a second Docker image, which can be used to run multiple config files\nin batch mode, for example to generate metrics overnight.\n\nTo use it, create a directory containing one or more configuration files, with\nthe extension `.yml` or `.yaml`, and a _different_ directory for the outputs.\nAssuming these are `/path/to/config` and `/path/to/output`, you can run\nthe following Docker command periodically, e.g. using `cron` or another\nscheduler:\n\n $ docker run --rm -v /path/to/config:/config -v /path/to/output:/data optilude/jira-agile-metrics:batch-latest\n\nWhen this is finished, you should see a directory under the `output` directory\nfor each of the config files in the `config` directory, containing the reports\nand charts. You will also find a file called `metrics.log` containing the log\noutput during the run, which may be helpful in diagnosing any problems.\n\nAny command line arguments passed to `docker run` after the image name will be\npassed directly to `jira-agile-metrics`. So, for example, if you wanted to use\nthe `-n` option to limit the number of results fetched from JIRA (for testing\npurposes), you can pass `-n 10` (or some different number) at the end of the\ncommand line above.\n\n## Usage\n\nThe basic usage pattern is to run `jira-agile-metrics` with a configuration\nfile, written in YAML format (see below), which describes:\n\n- how to connect to a remote JIRA instance (this can also be set using command\n line options);\n- what metrics (spreadsheet-like data files, charts as images) to output;\n- various settings used to calculate those metrics; and\n- a description of the stages of the workflow the relevant JIRA tickets go\n through.\n\nThe tool will then connect to JIRA using its web services API, run a query to\nthe relevant tickets and their history, and calculate the requierd metrics.\n\nThe outputs are written to local filesystem files. Data files can be written in\nCSV, XLSX or JSON formats (depending on the extension of the desired output\nfile), whilst charts are written as PNG images.\n\n### Server mode\n\n`jira-agile-metrics` comes with a simple web server that can be used to produce\nmetrics by uploading a configuration file and downloading a ZIP file with data\nand charts. To start it, run:\n\n $ jira-agile-metrics --server 5000\n\nThis will start a server on port `5000` (you can also specify a bind host name\nor IP address, e.g. `0.0.0.0:5000`). Visit this address in a web browser and\nupload a file.\n\nIn this mode, all other command line options are ignored.\n\n**Note:** The web server is designed for low-volume usage only, and does not\nhave a sophisticated security model. It is simply a more accessible front end\nto the features of the command line tool. The server will wait, synchronously,\nwhilst JIRA is queried and charts are produced, which can take a long time.\nDuring this time, the browser will wait, and threads will block.\n\n**Warning:** The web server does not encrypt requests, which means that by\ndefault JIRA credentials are transmitted in plain-text. You are strongly adviced\nto configure a reverse proxy (e.g. `nginx`) with SSL enabled in front of it.\n\n#### Using Docker to run the web server\n\nThere is a separate Docker image for running the web server, which uses `nginx`\nand `uwsgi` for improved performance and stability (but still not SSL, which\nwould need to be configured with a domain-specific certificate):\n\n $ docker run -d --rm -p 8080:80 --name jira_metrics optilude/jira-agile-metrics:server-latest\n\nThis will run the server in daemon mode and bind it to port `8080` on the local\nhost. To stop it, run:\n\n $ docker stop jira_metrics\n\nSee the [Docker documentation](https://docs.docker.com) for more details.\n\n### An important note about passwords\n\nThe tool uses a simple username/password combination to connect to JIRA. You\nneed to ensure this user exists in the remote JIRA instance, and has the\nrequired permissions.\n\nThere are three ways to provide the credentials for JIRA -- in particular, the\npassword, which should be kept scret. You should think carefully about which\napproach makes most sense for you.\n\n- The safest option is to not set it in either the configuration file, or as\n a command line option. In this case, you will be prompted to input a\n password (and username, if you didn't set this either) each time the tool\n is run.\n- You can use the `--username` and/or `--password` command line options to set\n credentails when you invoke the `jira-agile-metrics` command. This keeps\n them out of the configuration file, but if you do this in an interactive\n shell that records command history (i.e. virtually all of them), your\n password will likely be stored in plain text in the command history!\n- If you are confident you can keep the configuration file secret, you can\n store them there, under the `Connection` section (see below).\n\n### What issues should you include?\n\nThe most common use case is to calculate metrics for a team using a JIRA issue\ntype called something like `Story`, going through a workflow with stages like\n`Backlog`, `Committed`, `Elaboration`, `Build`, `Code review`, `Test`, and `Done`,\nand allowing a set of resolutions like `Completed`, `Withdrawn`, and `Duplicate`.\n\n`jira-agile-metrics` lets you use JIRA JQL syntax to specify which issues you\nare interested in. See the JIRA documentation for more details (or construct a\nsearch using the JIRA UI and then have JIRA show you the corresponding JQL).\n\n### Creating a configuration file\n\nHere is an example configuration file for a basic example using the workflow\nabove:\n\n # How to connect to JIRA. Can also include `Username` and `Password`\n Connection:\n Domain: https://myjira.atlassian.net # your JIRA instance\n\n # What issues to search for. Uses JQL syntax.\n Query: Project=ABC AND IssueType=Story AND (Resolution IS NULL OR Resolution IN (Completed, Withdrawn))\n\n # The workflow we want to analyse. By convention, the first stage should be\n # the backlog / initial state, and the final stage should indicate the work\n # is done.\n #\n # We map analytics names to JIRA status names. It's possible to collapse\n # multiple JIRA statuses into a single workflow stage, as with `QA` below.\n Workflow: \n Backlog: Backlog\n Committed: Committed\n Elaboration: Elaboration\n Build: Build\n QA:\n - Code review\n - Test\n Done: Done\n\n # What outputs to produce. These are all optional. If an option isn't set\n # the relevant metric will not be produced.\n\n Output:\n\n # CSV files with raw data for input to other tools or further analysis in a spreadsheet\n # If you use .json or .xlsx as the extension, you can get JSON data files or Excel\n # spreadsheets instead\n\n Cycle time data:\n - cycletime.csv\n - cycletime.json\n CFD data: cfd.csv\n Scatterplot data: scatterplot.csv\n Histogram data: histogram.csv\n Throughput data: throughput.csv\n Percentiles data: percentiles.csv\n\n # Various charts\n\n Scatterplot chart: scatterplot.png\n Scatterplot chart title: Cycle time scatter plot\n\n Histogram chart: histogram.png\n Histogram chart title: Cycle time histogram\n\n CFD chart: cfd.png\n CFD chart title: Cumulative Flow Diagram\n\n Throughput chart: throughput.png\n Throughput chart title: Throughput trend\n\n Burnup chart: burnup.png\n Burnup chart title: Burn-up\n\n Burnup forecast chart: burnup-forecast.png\n Burnup forecast chart title: Burn-up forecast\n Burnup forecast chart trials: 100 # number of Monte Carlo trials to run to estimate completion date\n\n # Burnup forecast chart throughput window: 60 # Days in the past to use for calculating historical throughput\n # Burnup forecast chart throughput window end: 2018-06-01 #\u00a0Calculate throughput window to this date (defaults to today)\n # Burnup forecast chart target: 100 # items to complete in total; by default uses the current size of the backlog\n # Burnup forecast chart deadline: 2018-06-01 # deadline date, in ISO format; if not set, no deadline is drawn.\n # Burnup forecast chart deadline confidence: .85 # percentile to use to compare forecast to deadline\n\n WIP chart: wip.png\n WIP chart title: Work in Progress\n\n Ageing WIP chart: ageing-wip.png\n Ageing WIP chart title: Ageing WIP\n\n Net flow chart: net-flow.png\n Net flow chart title: Net flow\n\nHint: If you prefer to manage your queries as saved filters in JIRA, you can\nuse the special JQL syntax of `filter=123`, where `123` is the filter ID.\n\nIf you save this file as e.g. `config.yaml`, you can run:\n\n $ jira-agile-metrics config.yaml\n\nThis should prompt you for a username and password, and then connect to your\nJIRA instance, fetch the issues matching the query, calculate metrics, and\nwrite a number of CSV and PNG files to the current working directory (you can\nuse the `--output-directory` option to write to another directory).\n\nWhen testing configuration, it is often helpful to fetch just a small number of\nissues to speed things up. You can either do this by making your query more\nrestrictive, or by using the `-n` flag to limit the number of issues fetched:\n\n $ jira-agile-metrics -n 20 config.yaml\n\nIf you want more information about what's going on, use the `-v` flag:\n\n $ jira-agile-metrics -v config.yaml\n\nAnd if you are realy curious:\n\n $ jira-agile-metrics -vv config.yaml\n\n## Reusing elements of a config file\n\nIf you want to reuse some configuration elements (e.g., `Connection`,\n`Workflow`) across multiple configuration files, you can use the `Extends`\noption to \"import\" one file into another.\n\nFor example, if you had a file called `common.yaml` with:\n\n Connection:\n Domain: https://myjira.atlassian.net\n\n Workflow: \n Backlog: Backlog\n Committed: Committed\n Elaboration: Elaboration\n Build: Build\n QA:\n - Code review\n - Test\n Done: Done\n\n Output:\n\n Quantiles:\n - 0.5\n - 0.75\n - 0.95\n\nAnother file, e.g. `team1.yaml`, could then reuse these settings with:\n\n Extends: common.yaml\n\n Output:\n Cycle time data: team1-cycletime.csv\n CFD chart: team1-cfd.png\n CFD chart title: Team 1: CFD\n\nThe extended filename is resolved relative to the file being loaded, so in\nthis example they would be in the same directory. You can use relative or\nabsolute paths. Note that the path separator for relative paths is always `/`\n(forward slash), even on Windows!\n\nWhen one file extends another, the extending file can override any options\nset in the extended file. So, for example, if `team1.yaml` also set `Quantiles`\nunder `Output`, the list from `common.yaml` would be overridden in its entirety.\nThis is the case for any option under `Output`, and for the `Query` / `Queries`\nand `Workflow` options in their entirety. Any `Attributes` will be merged.\n\nYou can use `Extends` recursively, i.e. an extended file can extend another\nfile.\n\n**Note:** The `Extends` feature is not available in server mode. If a file with\nan `Extends` line is uploaded to the server, an error will be thrown.\n\n## Available metrics\n\n`jira-agile-metrics` can produce a number of data files and charts, which can\nbe enabled in the `Output` section of the configuration file, or with a\ncorresponding command line option.\n\n**Note:** In the configuration file, you can specify output file *names*, but\nnot absolute or relative paths. Files will always be written to the current\nworking directory. This is to prevent unexpeced behaviour and the potential of\noverwriting other files when configuration files are moved around or used on\na remote machine. No such restriction applies to output files specified in\ncommand line arguments.\n\n### Cycle time details\n\nDetails about each ticket and the date it entered each stage of the workflow.\nBoth the CSV and JSON versions of this file can be used by the\n[Actionable Agile Analytics](http://actionableagile.com/) tool, which offers\npowerful, interactive analysis of Agile flow.\n\nIn the configuration file:\n\n Output:\n Cycle time data: cycletime.csv\n\nYou can also use `.json` or `.xlsx` formats. To output multiple files, use a\nlist like:\n\n Output:\n Cycle time data:\n - cycletime.json\n - cycletime.xlsx\n - cycletime.csv\n\nNote: the \"Blocked Days\" calculation relies on the \"Flagged\" feature in JIRA,\nshowing the total number of days (rounded up to the nearest whole day) that each\nticket was flagged as impeded. Impediments raised whilst the ticket is in the\nbacklog or done do not count.\n\n### Cumulative Flow Diagram (CFD)\n\nRaw data for creating a valid Cumulative Flow Diagram, in spreadsheet format,\nand/or an image file of the same. The CFD shows the number of work items in\neach stage of the flow as a stacked area chart, day by day. This allows us to\nvisualise WIP, cycle time, and throughput.\n\n![](./docs/images/cfd.png)\n\nIn the configuration file:\n\n Output:\n CFD data: cfd.csv\n CFD chart: cfd.png\n CFD chart title: Cumulative Flow Diagram\n\nYou can also use `.json` or `.xlsx` formats for the data file. To output\nmultiple files, use a list like:\n\n Output:\n CFD data:\n - cfd.json\n - cfd.xlsx\n - cfd.csv\n\nTo only show the 30 most recent days in the chart:\n\n CFD window: 30\n\n### Cycle time scatter plot\n\nRaw data for creating a valid Cycle Time scatter plot graph, and/or an image\nfile of the same. This chart plots the end-to-end cycle time (excluding time\nspent in the backlog) for each work item against its completion date, and\noverlays quantiles (e.g. 85% of tickets took 18 days or fewer)\n\n![](./docs/images/scatterplot.png)\n\nIn the configuration file:\n\n Output:\n Scatterplot data: scatterplot.csv\n Scatterplot chart: scatterplot.png\n Scatterplot chart title: Cycle time scatter plot\n\nYou can also use `.json` or `.xlsx` formats for the data file. To output\nmultiple files, use a list like:\n\n Output:\n Scatterplot data:\n - scatterplot.json\n - scatterplot.xlsx\n - scatterplot.csv\n\nBy default, the quantiles used are the 50th, 85th and 95th percentile, but you\ncan specify a different list with the `Quantiles` option under `Output`:\n\n Quantiles:\n - 0.3\n - 0.5\n - 0.75\n - 0.85\n - 0.95\n\nNote that this option affects all charts that use quantiles.\n\nTo get the quantile values (number of day at each quantile) in a data file, use:\n\n Percentiles data: percentiles.csv\n\nTo only show the 30 most recent days in the chart:\n\n Scatterplot window: 30\n\n### Cycle time histogram\n\nThis is a different view of the cycle time , calculatd and/or plotted as a\nhistogram.\n\n![](./docs/images/histogram.png)\n\nIn the configuration file:\n\n Output:\n Histogram data: histogram.csv\n Histogram chart: histogram.png\n Histogram chart title: Cycle time histogram\n\nYou can also use `.json` or `.xlsx` formats for the data file. To output\nmultiple files, use a list like:\n\n Output:\n Histogram data:\n - histogram.json\n - histogram.xlsx\n - histogram.csv\n\nThis also respects the `Quantiles` option (see above).\n\nTo only show the 30 most recent days in the chart:\n\n Histogram window: 30\n\n### Throughput\n\nWeekly throughput, i.e. the number of items completed week by week. The chart\nalso shows a trend line.\n\n![](./docs/images/throughput.png)\n\nIn the configuration file:\n\n Output:\n Throughput data: throughput.csv\n Throughput chart: throughput.png\n Throughput chart title: Throughput trend\n\nYou can also use `.json` or `.xlsx` formats for the data file.\n\nTo change the frequency from weekly to something else, use:\n\n Throughput frequency: 1D\n\nHere, `1D` means daily. The default is `1W-MON`, which means weekly starting on\nMondays.\n\nTo only show the 6 most recent periods (e.g. weeks) in the chart:\n\n Throughput window: 6\n\n### WIP box plot\n\nShows a box plot of WIP, week by week (or some other frequency).\n\n![](./docs/images/wip.png)\n\nIn the configuration file:\n\n WIP chart: wip.png\n WIP chart title: Work in Progress\n\nTo change the frequency from weekly to something else, use:\n\n WIP frequency: 1D\n\nHere, `1D` means daily. The default is `1W-MON`, which means weekly starting on\nMondays.\n\nTo only show the 6 most recent periods (e.g. weeks) in the chart:\n\n WIP window: 6\n\n### Net flow chart\n\nShows the difference between arrivals and departures week on week. In a\nperfectly stable system, the net flow would be 0.\n\n![](./docs/images/net-flow.png)\n\nIn the configuration file:\n\n Net flow chart: net-flow.png\n Net flow chart title: Net flow\n\nTo change the frequency from weekly to something else, use:\n\n Net flow frequency: 1D\n\nHere, `1D` means daily. The default is `1W-MON`, which means weekly starting on\nMondays.\n\nTo only show the 6 most recent periods (e.g. weeks) in the chart:\n\n Net flow window: 6\n\n### Ageing WIP chart\n\nShows the cycle time to date for each work item, grouped into the stages of\nthe workflow. This can help identify slow-moving tickets.\n\n![](./docs/images/ageing-wip.png)\n\nIn the configuration file:\n\n Ageing WIP chart: ageing-wip.png\n Ageing WIP chart title: Ageing WIP\n\n### Burn-up chart\n\nA basic Agile burn-up chart, based on a count of items completed and in the\nbacklog.\n\n![](./docs/images/burnup.png)\n\nIn the configuration file:\n\n Burnup chart: burnup.png\n Burnup chart title: Burn-up\n\nTo only show the 30 most recent days in the chart:\n\n Burnup window: 30\n\n### Burn-up chart with forecast line\n\nA more advanced version of the burn-up chart, which will run a Monte Carlo\nsimulation based on historical throughput to forecast a completion date for\nthe scope.\n\n![](./docs/images/burnup-forecast.png)\n\nThe simulation can be calibrated with a series of options to set:\n\n- The number of trials to run. Each trial will be drawn as a hypotehtical\n burn-up to completion.\n- The window of time from which to sample historical throughput. This should\n be representative of the near future, and ideally about 6-12 weeks long.\n- The target to aim for, as a number of stories to have completed. Defaults\n to the size of the backlog, but can be set to an assumed figure.\n- A deadline date, which, if set, can be compared to a forecast at a given\n confidence interval.\n\nIn the configuration file:\n\n Burnup forecast chart: burnup-forecast.png\n Burnup forecast chart title: Burn-up forecast\n Burnup forecast chart trials: 100 # number of Monte Carlo trials to run to estimate completion date\n\n Burnup forecast chart throughput window: 60 # Days in the past to use for calculating historical throughput\n Burnup forecast chart throughput window end: 2018-06-01 #\u00a0Calculate throughput window to this date (defaults to last day of burnup)\n Burnup forecast chart target: 100 # items to complete in total; by default uses the current size of the backlog\n Burnup forecast chart deadline: 2018-06-01 # deadline date, in ISO format; if not set, no deadline is drawn.\n Burnup forecast chart deadline confidence: .85 # percentile to use to compare forecast to deadline\n\nTo only show the 30 most recent days in the chart:\n\n Burnup forecast window: 30\n\n## Impediments\n\nIf you use the \"Flagged\" feature in JIRA to mark (and unmark) tickets as impeded\nwhen they are blocked, you can produce charts showing the number of impediments\nraised, and the cumulative amount of time tickets have spent being impeded,\nbroken down by month and either the flag set or the the workflow stage a ticket\nwas in when the flag was set. You can also write out the impediment events to a\nfile.\n\n![](./docs/images/impediments.png)\n\n![](./docs/images/impediments-days.png)\n\n![](./docs/images/impediments-status.png)\n\n![](./docs/images/impediments-status-days.png)\n\nThe charts can be enabled with:\n\n Impediments data: impediments.csv\n Impediments window: 6\n Impediments chart: impediments.png\n Impediments chart title: Number of impediments\n Impediments days chart: impediments-days.png\n Impediments days chart title: Total impeded days\n Impediments status chart: impediments-status.png\n Impediments status chart title: Number of impediments by status\n Impediments status days chart: impediments-status-days.png\n Impediments status days chart title: Total impeded days by status\n\nNote that by default, only a single value (`\"Impediment\"`) is available for the\n`Flagged` field in JIRA, and indeed only one field can be set when using the\n`\"Set flag\"` option on a JIRA Agile board. However, you can enable additional\nvalues in the field configuration for the relevant field, and make that field\navailable on the issue edit screen.\n\nThe `Impediments window`, which is optional, can be used to limit the chart to\nshowing only the most recent months' data: six in this case.\n\nThe `Impediments chart` and `Impediments status chart` will count the number of\nimpediment events that were active each month, i.e. a ticket was flagged as\nimpeded at some point during the month.\n\nThe `Impediments days chart` and `Impediments status days chart` uses the same\nunderlying logic, but instead of counting impediments, it sums the number of\ndays of all impediments in each month.\n\nNote that:\n\n- Impediments raised against tickets in the backlog or in the \"done\" column are\n not shown.\n- If a ticket is flagged and then resolved before being unflagged, the impeded\n time is calculated to the resolution date.\n- If a ticket is still flagged at the time the chart is generated, the impeded\n day count will run to today's date.\n- Blocking time is always rounded up to the nearest whole day.\n\n## Defect density\n\nThree charts for analysing the amount of defects that have been open\nhistorically, grouped in various ways into stacked bar graphs.\n\n![](./docs/images/defects-by-priority.png)\n\n![](./docs/images/defects-by-type.png)\n\n![](./docs/images/defects-by-environment.png)\n\nThese charts all rely on a separate JIRA query:\n\n Defects query: issueType = Bug\n\nAgain, you can use the `filter=123` JQL syntax to delegate the query specifics\nto a named filtered.\n\nThe three available groupings are:\n\n- Show how many defects remained open each month, grouped by _priority_.\n- Show how many defects remained open each month, grouped by _type_.\n- Show how many defects remained open each month, grouped by _environment_.\n\nThey each require you to specify the name of the relevant field, and a chart\noutput. You can also optionally specify a list of allowed values for each field,\nwhich lets you control the order. Finally, you can specify a \"window\" of how\nmany of the most recent months to show (the default is to show all months for\nwhich there is data). Here is an example that enables all charts, and limits to\nshowing the six most recent months in each:\n\n Defects query: issueType = Bug\n Defects window: 6\n Defects priority field: Priority\n Defects priority values:\n - Low\n - Medium\n - High\n Defects type field: Root cause\n Defects type values:\n - Config\n - Data\n - Code\n Defects environment field: Environment\n Defects environment values:\n - SIT\n - UAT\n - PROD\n\n Defects by priority chart: defects-by-priority.png\n Defects by priority chart title: Defects by priority\n Defects by type chart: defects-by-type.png\n Defects by type chart title: Defects by type\n Defects by environment chart: defects-by-environment.png\n Defects by environment chart title: Defects by environment\n\nIf you omit any of the chart names, the relevant chart will not be produced. If\nyou omit any of the field names, the relevant chart will not be stacked. If you\nomit the values list, all unique values will be shown.\n\n## Technical debt\n\nTwo charts that show the nature and age of recorded (unresolved) technical debt.\n\n![](./docs/images/tech-debt.png)\n\n![](./docs/images/tech-debt-age.png)\n\nThese require a separate JIRA query. You should also identify the field\nindicating priority:\n\n Debt query: issueType = \"Tech debt\"\n Debt priority field: Priority\n Debt priority values:\n - Low\n - Medium\n - High\n\nAs ever, use `filter=123` to use a named filter instead. If you omit the\n`Debt priority values` option, all unique priority values will be used, in\nalphabetical order.\n\nThe first chart shows the open technical debt items each month as a stacked bar\nchart grouped by priority. You can optionally specify a \"window\" to show only\na limited number of the most recent months:\n\n Debt window: 3\n Debt chart: tech-debt.png\n Debt chart title: Technical debt\n\nThe second chart shows the number of open technical debt items by their current\nage in days, broken down by priority, and stacked into \"bins\":\n\n Debt age chart: tech-debt-age.png\n Debt age chart title: Technical debt age\n Debt age chart bins:\n - 30\n - 60\n - 90\n\nThis will use the age brackets 0-30 days, 31-60 days, 61-90 days, and over 90\ndays (which also happens to be the default).\n\n## Waste (withdrawn items)\n\nThis chart shows how many work items are withdrawn or cancelled after work\nhas started. It relies on a separate JIRA query, and assumes that withdrawn\nwork items are all \"resolved\" in JIRA. Moreover, it assumes that these work\nitems follow the same workflow as that used for the other charts and files,\ni.e. as mapped in the `Workflow` section of the configuration file.\n\n![](./docs/images/waste.png)\n\nHere is an example:\n\n Waste query: issueType = Story AND resolution IN (Withdrawn, Invalid)\n Waste window: 10\n Waste frequency: 2W-WED\n Waste chart: waste.png\n Waste chart title: Waste\n\nThis will show withdrawn items broken down by the period in which they were\nwithdrawn for the the 10 most recent periods. The default period length is\nmonthlyasfd, but here we have set it to `2W-WED`, which means a two-week period\nstarting on a Wednesday. `Waste window` and `Waste frequency` are both\noptional.\n\n## Progress report\n\nAn status report that uses Monte Carlo simulation forecasting at the epic\nlevel.\n\nThe report is presented as a self-contained HTML file with embedded\nimages. It relies on a small number of commonly used, externally hosted\nlibraries (the *Bootstrap* CSS/JS library and its *jQuery* dependency; the\n*Fontawesome* icon font), but can be served from any static web server or opened\nas a local file on any modern web browser. It should also print reasonably well,\nalthough the embedded images showing context-specific Cumulative Flow Diagrams\nand Cycle Time Scatter Plots are only accessible by clicking on the relevant\nicons in a browser.\n\n![](./docs/images/progressreport.png)\n\nThe status report is based on the principle of *outcomes* (e.g. projects,\nreleases, objectives) that are broken down into *epics*, which will eventually\nbe further broken down into *stories*. Epics are assumed to be fully owned by\nexactly one *team*. Epics and stories are represented by JIRA tickets\ndiscoverable by JQL queries specified in the configuration file, whereas\noutcomes and teams are enumerated in the configuration file directly.\n\nA forecast to complete is then produced for each epic by calculating:\n\n- the presumed number of stories in the epic (randomly sampling between a\n minimum and maximum number of stories as set on the epic ticket in JIRA, or\n using the total number of stories raised against the epic, if higher);\n- the number of stories raised against the epic that have been completed to\n date;\n- and the presumed throughput of the relevant team (randomly sampled, either\n from a range of the minimum to maximum number of stories the team can complete\n per week, or through a JQL query that identifies the team's historical\n performance).\n\nThis is done many times over in a Monte Carlo simulation, to identify a range of\nplausible completion dates. If a deadline is set on an epic, the forecast to\ncomplete will be compared with it, to highlight the likelihood of hitting the\ndeadline. (Deadlines may also be set at the outcome-level, in which case the\noutcome deadline is the default for all epics.)\n\nThe simulation takes into account that a single team may have multiple epics to\ncomplete. A team can be configured to have an epic WIP limit of 1 (the default)\nor more. If the team is working on more than one epic at a time, it is assumed\nto distribute its throughout roughly evenly across all active epics, and to work\nthrough the epics in the order in which their respective outcomes are listed in\nthe configuration file, and then in the order in which they are returned by the\nquery used to find them.\n\nHere is a complete example configuration file that produces a report akin to\nthe screenshot above:\n\n Connection:\n # not shown\n\n # ...\n\n # Used for calculating progress against an epic, and team throughput: to\n # identify whether stories are in the backlog, in progress, or completed.\n Workflow:\n Backlog: Backlog\n Committed: Next\n Build: Build\n Test:\n - Code review\n - QA\n Done: Done\n\n Output:\n # Used to determine which percentiles to show in the forecast\n Quantiles:\n - 0.75\n - 0.85\n - 0.95\n\n # The name of the file to write. If not set, the progress report will\n # not be produced\n Progress report: progress.html\n\n # Report title\n Progress report title: Acme Corp Websites\n\n # Names of JIRA fields on epics, used to determine the deadline, team,\n # and min/max stories. All are optional:\n\n # - if no deadline field is set, the report will not include any\n # deadline calculations\n Progress report epic deadline field: Due date\n\n # - if no team field is set, you must specify exactly one team under\n # `Progress report teams`, which will be used for all epics\n Progress report epic team field: Team\n\n # - if no min stories field is set, the story count will be based solely\n # on the number of stories raised against each epic, rather than an\n # estimated range; if no max stories field is set, the min stories\n # field will be used to identify an absolute value\n Progress report epic min stories field: Min stories\n Progress report epic max stories field: Max stories\n\n # The query used to identify epics for each outcome. The special\n # placeholder `{outcome}` will be replaced by the outcome key (or name,\n # if the key is not set). May be overridden by the `Epic query` set on\n # an individual outcome. If not set, the `Epic query` must be specified\n # on each outcome, and it is not possible to use outcomes as tickets.\n Progress report epic query template: project = ABC AND type = Epic AND Outcome = {outcome} ORDER BY created\n\n # The query used to identify stories for an epic. The placeholders\n # `{epic}`, `{outcome}`, and `{team}` may be used to parameterise the\n # query.\n Progress report story query template: project = ABC AND type = Story AND \"Epic link\" = {epic}\n\n # A list of teams. At least one team is required, and each team must\n # have a `Name` and *either* `Min throughput` and `Max throughput`\n # (stories per week), *or* a query in `Throughput samples`. `WIP`\n # (number of epics the team may work on in parallel) and\n # `Throughput samples window` (number of weeks in the past from which to\n # draw samples) are optional. The placeholder `{team}` can be used to\n # reference the team name in the samples query.\n Progress report teams:\n - Name: Red\n Min throughput: 5\n Max throughput: 10\n - Name: Blue\n WIP: 2\n Throughput samples: project = ABC AND type = Story AND Team = {team}\n Throughput samples window: 6\n\n # A list of outcomes. May be omitted, in which case epics will not be\n # grouped into outcomes and the `Progress report epic query template`\n # specifies a non-parameterised query for all relevant epics. If\n # included, each outcome must have a `Name`. `Key`, which is used in\n # the epic query template, is optional, defaulting to the same value as\n # `Name`. `Deadline` can be used to specify a deadline for all epics\n # in the report, which can be overridden on a per-epic basis.\n # `Epic query` may be used to specify a particular query for\n # epics, overriding the more general `Progress report epic query template`.\n Progress report outcomes:\n - Name: MVP\n Key: O1\n Deadline: 2019-01-01\n - Name: Asia launch\n Key: O2\n - Name: Europe revamp\n Key: O3\n Epic query: project = ABC and type = Feature\n\nIn this example, we have listed the outcomes explicitly in the configuration\nfile. It is also possible for the outcomes to be managed as JIRA ticket (or even\nto mix the two approaches). To do this, you need to specify a query for finding\nthe outcomes:\n\n Progress report outcome query: project = ABC AND type = Outcome AND resolution IS EMPTY ORDER BY summary\n\n # Optionally give a field name for the outcome-level deadline, which\n # will be used as a fallback if epic-level deadlines are not set\n Progress report outcome deadline field: Due date\n\nIf using tickets to specify outcomes, `Progress report epic query template` must\nbe set. The `{outcome}` placeholder will be replaced by the relevant outcome\nticket `key`. You can thus use a linked issue field to specify the outcome.\n\nIn a simpler use case, you can model a single team performing all work, and/or\ndispense with the \"outcome\" level entirely, modelling only epics. The estimated\nmin/max story count and the entire concept of deadlines are also optional.\n\nHere is a minimal example:\n\n # ...\n\n Workflow:\n Backlog: Backlog\n Committed: Next\n Build: Build\n Test:\n - Code review\n - QA\n Done: Done\n\n Output:\n\n Quantiles:\n - 0.75\n - 0.85\n - 0.95\n\n Progress report: progress-minimal.html\n Progress report title: Acme Corp Websites\n Progress report epic min stories field: Story count\n Progress report epic query template: project = ABC AND type = Epic AND resolution IS EMPTY ORDER BY created\n Progress report story query template: project = ABC AND type = Story AND \"Epic link\" = {epic}\n Progress report teams:\n - Name: Default\n Min throughput: 5\n Max throughput: 10\n\nYou can also turn off forecasts for some or all teams, if you don't have\nconfidence in the predictability of team pace or in the underlying data quality.\nYou will still get the progress bars and charts. In this case, you can either\nomit the `Min throughput` / `Max throughput` fields for a specific team, or \nomit the `Progress report teams` section in its entirety.\nTeam names will be taken from the relevant field on epics (presuming an epic\nteam field name is specified):\n\n # ...\n\n Workflow:\n Backlog: Backlog\n Committed: Next\n Build: Build\n Test:\n - Code review\n - QA\n Done: Done\n\n Output:\n\n Quantiles:\n - 0.75\n - 0.85\n - 0.95\n\n Progress report: progress-teams.html\n Progress report title: Acme Corp Websites\n Progress report epic min stories field: Story count\n Progress report epic query template: project = ABC AND type = Epic AND resolution IS EMPTY ORDER BY created\n Progress report story query template: project = ABC AND type = Story AND \"Epic link\" = {epic}\n Progress report epic team field: Team\n\nTechnically you can omit both the teams list (so no forecasts) and the team\nfield name, in which case you just get a breakdown of the epics with no\nforecasting or grouping.\n\nAlso note that if you do specify a list of teams and an epic team field, the\nlist of teams will be automatically extended with any team names found that are\nnot explicitly listed in the configuration.\n\n## More details about the configuration file format\n\nThe configuration file is written in YAML format. If you are unfamiliar with\nYAML, know that:\n\n* Comments start with `#`\n* Sections are defined with a name followed by a colon, and then an indented\n block underneath. `Connection`, `Output`, `Workflow` and `Attributes` area\n all sections in the example above.\n* Indentation has to use spaces, not tabs!\n* Single values can be set using `Key: value` pairs. For example,\n `Burnup chart: burnup.png` above sets the key `Burnup chart` to the value\n `burnup.png`.\n* Lists of values can be set by indenting a new block and placing a `-` in front\n of each list value. In the example above, the `QA` list contains\n the values `Code review` and `Test`.\n\nThe sections for `Workflow` is required. Additionally, you must either specfiy a\nsingle `Query`, or a block of `Queries` (see below). Connection details must\nbe set either in the `Connection` file or as command line arguments.\n\nUnder `Workflow`, at least two steps are required. Specify the steps in order.\nYou may either specify a single workflow value or a list (as shown for `QA`\nabove), in which case multiple JIRA statuses will be collapsed into a single\nstate for analytics purposes.\n\nThe file, and values for things like workflow statuses and attributes, are case\ninsensitive.\n\n### Extracting additional attributes\n\nYou may want to add additional fields to the cycle time output data. Use an\n`Attributes` block to do this:\n\n Attributes:\n Priority: Priority\n Release: Fix version/s\n Team: Team name\n\nHere, three additional columns will be added: `Priority`, `Release` and `Team`,\ncorresponding to the JIRA fields `Priority`, `Fix version/s` and `Team name`,\nrespectively.\n\nWhen specifying attributes, use the *name* of the field (as rendered on screen\nin JIRA), not its id (as you might do in JQL), so e.g. use `Component/s` not\n`components`.\n\nThe attributes `Type` (issue type), `Status` and `Resolution` are always\nincluded.\n\n### Multi-valued fields\n\nSome fields in JIRA can contain multiple values, e.g. `fixVersion`. By default,\nthe extractor will use the first value in such a field if one is specified in\nthe `Attributes` block. However, you may want to extract only specific values.\n\nTo do so, add a block like the following::\n\n Attributes:\n Release: Fix version/s\n\n Known values:\n Release:\n - \"R01\"\n - \"R02\"\n - \"R03\"\n\nThe extractor will pick the first \"known value\" found for the field. If none of\nthe known values match, the cell will be empty.\n\n### Combining multiple queries\n\nIf it is difficult to construct a single set of criteria that returns all\nrequired issues, multiple queries can be added into a `Queries` block, like so:\n\n Queries:\n Attribute: Team\n Criteria:\n - Value: Team 1\n JQL: (filter=123)\n\n - Value: Team 2\n JQL: (filter=124)\n\nIn this example, two queries will be run, based on the two filters `123` and\n`124` (you can use any valid JQL).\n\nIn the cycle time output, a new column called `Team` will be added, as specified\nby the `Attribute` field under `Queries`. For all items returned by\nthe first query, the value will be `Team 1` as per the `Value` field, and for\nall items returned by the second query, it will be `Team 2`.\n\n## Troubleshooting\n\n* If Excel complains about a `SYLK` format error, ignore it. Click OK. See\n https://support.microsoft.com/en-us/kb/215591.\n* JIRA error messages may be printed out as HTML in the console. The error is\n in there somewhere, but may be difficult to see. Most likely, this is either\n an authentication failure (incorrect username/password or blocked account),\n or an error in the `Query` option resulting in invalid JQL.\n* If you aren't getting the issues you expected to see, use the `-v` option to\n see the JQL being sent to JIRA. Paste this into the JIRA issue filter search\n box (\"Advanced mode\") to see how JIRA evaluates it.\n* Old workflow states can still be part of an issue's history after a workflow\n has been modified. Use the `-v` option to find out about workflow states that\n haven't been mapped.\n* Excel sometimes picks funny formats for data in CSV files. Just set them to\n whatever makes sense.\n* If you are on a Mac and you get an error about Python not being installed as\n a framework, try to create a file `~/.matplotlib/matplotlibrc` with the\n following contents:\n\n backend : Agg\n\n* To install the charting dependencies on a Mac, you might need to install a\n `gfortran` compiler for `scipy`. Use [Homebrew](http://brew.sh) and install the\n `gcc` brew.\n\n## Output settings reference\n\nThe following options can be set in the `Output:` section of the configuration\nfile.\n\n### General options\n\nThese options affect multiple charts and files.\n\n- `Quantiles: ` \u2013 Quantiles to use when calculating percentiles.\n- `Backlog column: ` --Name of the backlog column. Defaults to the first column.\n- `Committed column: ` \u2013 Name of the column from which work is considered\n committed. Defaults to the second column.\n- `Final column: ` \u2013 Name of the final 'work' column. Defaults to the\n penultimate column.\n- `Done column: ` \u2013 Name of the 'done' column. Defaults to the last column.\n\n### Data files\n\nThese options name data files to write. Use an extension of `.csv`, `.xlsx`, or\n`.json` according to the required file format. May be specified as either a list\nof filenames, or a single filename.\n\n- `Cycle time data: .[csv,xlsx,json]` \u2013 Output file suitable for\n processing Actionable Agile. Contains all issues described by the\n configuration file, metadata, and dates of entry to each state in the cycle.\n- `CFD data: .[csv,xlsx,json]` \u2013 Calculate data to draw a Cumulative\n Flow Diagram and write to file. Hint: Plot as a (non-stacked) area chart.\n- `Scatterplot data: .[csv,xlsx,json]` \u2013 Calculate data to draw a\n cycle time scatter plot and write to file. Hint: Plot as a scatter chart.\n- `Histogram data: .[csv,xlsx,json]` \u2013 Calculate data to draw a cycle\n time histogram and write to file. Hint: Plot as a column chart.\n- `Throughput data: .[csv,xlsx,json]` \u2013 Calculate daily throughput\n data and write to file. Hint: Plot as a column chart. Respects the\n `Throughput frequency` setting (see below).\n- `Percentiles data: .[csv,xlsx,json]` \u2013 Calculate cycle time\n percentiles and write to file.\n- `Impediments data: .[csv,xlsx,json]` \u2013 Output impediment start and\n end dates against tickets.\n\n### Scatterplot chart\n\n- `Scatterplot window: ` \u2013 Number of recent days to show in scatterplot.\n Defaults to showing all data.\n- `Scatterplot chart: .png` \u2013 Draw cycle time scatter plot.\n- `Scatterplot chart title: ` \u2013 Title for cycle time\n scatter plot.\n\n### Histogram chart\n\n- `Histogram window: <number>` \u2013 Number of recent days to show in histogram.\n Defaults to showing all data.\n- `Histogram chart: <filename>.png` \u2013 Draw cycle time histogram.\n- `Histogram chart title: <title>` \u2013 Title for cycle time\n histogram.\n\n### Cumulative Flow Diagram\n\n- `CFD window: <number>` \u2013 Number of recent periods to show in the CFD.\n Defaults to showing all periods.\n- `CFD chart: <filename>.png` \u2013 Draw Cumulative Flow Diagram.\n- `CFD chart title: <title>` \u2013 Title for the CFD.\n\n### Throughput chart\n\n- `Throughput frequency: <freq>` \u2013 Interval to use for calculating frequency,\n e.g. 1D for daily or 1W for weekly.\n- `Throughput window: <number>` \u2013 Number of recent periods to show in throughput chart.\n Defaults to showing all periods.\n- `Throughput chart: <filename>.png` \u2013 Draw weekly throughput chart with trend\n line.\n- `Throughput chart title: <title>` \u2013 Title for throughput chart.\n\n### Burnup chart\n\n- `Burnup window: <number>` \u2013 Number of recent periods to show in burnup.\n Defaults to showing all periods.\n- `Burnup chart: <filename>.png` \u2013 Draw simple burn-up chart.\n- `Burnup-chart-title <title>` \u2013 Title for burn-up charts_scatterplot.\n\n### Burnup forecast chart\n\n- `Burnup forecast window: <number>` \u2013 Number of recent periods to show in the\n burnup forecast chart. Defaults to showing all periods.\n- `Burnup forecast chart: <filename>.png` \u2013 Draw burn-up chart with Monte Carlo\n simulation forecast to completion.\n- `Burnup forecast chart title: <title>` \u2013 Title for burn-up forecast chart.\n- `Burnup forecast chart target: <number>` \u2013 Target completion scope for\n forecast. Defaults to current size of backlog.\n- `Burnup forecast chart deadline: <date>` \u2013 Deadline date for completion of\n backlog. If set, it will be shown on the chart, and the forecast delta will\n also be shown. Use ISO date format, e.g. `2018-01-02` for January 2nd 2018.\n- `Burnup forecast chart deadline confidence: <number>` \u2013 Quantile to use when\n comparing deadline to forecast. Use a fraction, e.g. `0.85`.\n- `Burnup forecast chart trials: <number>` \u2013 Number of iterations in Monte\n Carlo simulation.\n- `Burnup forecast chart throughput window: <number>` \u2013 How many days in the\n past to use for calculating throughput.\n- `Burnup forecast chart throughput window end: <date>` \u2013 By default, the\n throughput window runs to today's date. Use this option to set an alternative\n end date for the window. Use ISO date format, e.g. `2018-01-02` for January\n 2nd 2018.\n\n### WIP chart\n\n- `WIP frequency: <freq>` \u2013 Frequency interval for WIP chart. `1W-Mon`\n means 1 week, starting Mondays.\n- `WIP window: <number>` \u2013 Number of recent periods to show in WIP chart.\n Defaults to showing all periods.\n- `WIP chart: <filename>.png` \u2013 Draw weekly WIP box plot.\n- `WIP chart title: <title>` \u2013 Title for WIP chart\n\n### Ageing WIP chart\n\n- `Ageing WIP chart: <filename>.png` \u2013 Draw current ageing WIP chart.\n- `Ageing WIP chart title: <title>` \u2013 Title for ageing WIP chart.\n\n### Net flow chart\n\n- `Net flow frequency: <freq>` \u2013 Frequency interval for net flow chart.\n `1W-Mon` means 1 week, starting Mondays.\n- `Net flow window: <number>` \u2013 Number of recent periods to show in net flow\n chart. Defaults to showing all periods.\n- `Net flow chart: <filename>.png` \u2013 Draw weekly net flow bar chart.\n- `Net flow chart title: <title>` \u2013 Title for net flow bar chart.\n\n## Impediments chart\n\n- `Impediments window: <number>` \u2013 How many months to show.\n- `Impediments chart: <filename>.png` \u2013 Draw a bar chart of the number of\n active impediments during each month, stacked by the impediments flag set.\n- `Impediments chart title: <title>` \u2013 Title for the impediments chart.\n- `Impediments days chart: <filename>.png` \u2013 Draw a bar chart of the total\n number of days of all the impediments active during each month, stacked by\n the impediments flag set.\n- `Impediments days chart title: <title>` \u2013 Title for the impediments days\n chart.\n- `Impediments status chart: <filename>.png` \u2013 Draw a bar chart of the number of\n active impediments during each month, stacked by the ticket status at the\n time the impediment was raised.\n- `Impediments status chart title: <title>` \u2013 Title for the impediments status\n chart.\n- `Impediments status days chart: <filename>.png` \u2013 Draw a bar chart of the\n total number of days of all the impediments active during each month, stacked\n by the ticket status at the time each impediment was raised.\n- `Impediments status days chart title: <title>` \u2013 Title for the impediments\n status days chart.\n\n\n### Defect density charts\n\n- `Defects query: <query>` \u2013 JQL query used to identify defects.\n- `Defects window: <number>` \u2013 How many months to show.\n- `Defects priority field: <fieldname>` \u2013 Name of field identifying\n defect priority.\n- `Defects priority values: <list>` \u2013 List of valid values, in order,\n for defect priorities.\n- `Defects type field: <fieldname>` \u2013 Name of field identifying defect\n type.\n- `Defects type values: <list>` \u2013 List of valid values, in order, for\n defect values.\n- `Defects environment field: <fieldname>` \u2013 Name of field identifying\n the environment in which a defect was discovered.\n- `Defects environment values: <list>` \u2013 List of valid values, in\n order, for defect environments.\n\n- `Defects by priority chart: <filename>.png` \u2013 Draw stacked bar chart of\n defects grouped by priority over time.\n- `defects-by priority chart title: <title>` \u2013 Title for defects-by-priority\n chart.\n\n- `Defects by type chart: <filename>.png` \u2013 Draw stacked bar chart of defects\n grouped by type over time.\n- `Defects by type chart title: <title>` \u2013 Title for defects-by-type chart.\n\n- `Defects by environment chart: <filename>.png` \u2013 Draw stacked bar chart of\n defects grouped by environment over time.\n- `Defects by environment chart title: <title>` \u2013 Title for defects-by-\n environment chart.\n\n### Debt density chart\n\n- `Debt query: <query>` \u2013 JQL query used to identify technical debt items.\n- `Debt window: <number>` \u2013 How many months to show in the debt chart. Defaults\n to showing all months for which there is data.\n- `Debt priority field: <fieldname>` \u2013 Name of field identifying technical debt\n item priority.\n- `Debt priority values: <list>` \u2013 List of valid values, in order, for\n technical debt item priorities.\n\n- `Debt chart: <filename>.png` \u2013 Draw a stacked bar chart of technical debt\n grouped by priority over time.\n- `Debt chart title: <title>` \u2013 Title for the technical debt chart.\n\n- `Debt age chart: <filename>.png` \u2013 Draw a stacked bar chart of technical debt\n grouped by priority by age.\n- `Debt age chart title: <title>` \u2013 Title for the technical debt age chart.\n- `Debt age chart bins: <list>` \u2013\u00a0List of bins for bracketing the ages shown.\n Defaults to `30`, `60`, and `90`, which will group ages into `0-30 days`,\n `31-60 days`, `61-90 days` and `91 days or more`.\n\n### Waste chart\n\n- `Waste query: <query>` \u2013 JQL query used to identify waste items, e.g.\n those withdrawn after work has begun.\n- `Waste frequency: <freq>` \u2013 Frequency to group waste chart by. Defaults to\n month start (`MS`). Use e.g. `2W-WED` to group by fortnight starting\n Wednesday.\n- `Waste window: <number>` \u2013 How many months to show.\n- `Waste chart: <filename>.png` \u2013 Draw a stacked bar chart of wasted items,\n grouped by last non-resolved status.\n- `Waste chart title: <title>` \u2013 Title for the waste chart.\n\n### Progress report\n\n- `Progress report: <filename>.html` \u2013 Write progress report to a standalone\n HTML file.\n- `Progress report title: <title>` \u2013 Title of the progress report page.\n- `Progress report epic deadline field: <fieldname>` \u2013 Name of a date field\n giving the deadline of an epic.\n- `Progress report epic team field: <fieldname>` \u2013 Name of a field giving the\n name of the team responsible for an epic.\n- `Progress report epic min stories field: <fieldname>` \u2013 Name of an integer\n field giving the minimum number of stories expected for an epic, for\n forecasting purposes.\n- `Progress report epic max stories field: <fieldname>` \u2013 Name of an integer\n field giving the maximum number of stories expected for an epic, for\n forecasting purposes.\n- `Progress report epic query template: <query>` \u2013 Query used to identify epics\n for an outcome. The placeholder `{outcome}` will be substituted for the given\n outcome key (if set) or name.\n- `Progress report story query template: <query>` \u2013 Query used to identify\n stories for an epic. The placeholder `{epic}` will be substituted for the\n given epic key (JIRA reference). The placeholders `{outcome}` and `{team}`\n may also be used to identify the outcome key/name and team name, respectively.\n- `Progress report teams: <list>` \u2013 A list of records with keys `Name`, `WIP`,\n `Min throughput`, `Max throughput`, `Throughput samples` and/or\n `Throughput samples window` which specify the teams that may be associated\n with epics. `Name` is required, and you can specify either\n `Min/Max throughput` (numeric values, in stories per week) or\n `Throughput samples`, which is a JQL query to identify stories for the given\n team for the purpose of calculating historical throughput. If\n `Throughput samples window` is given, it specifies the number of weeks into\n the past (from today's date) to use when calculating historical throughput.\n You can use the placeholder `{team}` in `Throughput samples` as a shortcut\n to repeating the team name. `WIP` defaults to 1.\n- `Progress report outcomes: <list>` \u2013 A list of records with keys `Name`,\n `Key`, `Deadline`, and/or `Epic query`, which specify the outcomes to list on\n the progress report. `Key` will default to the same value as `Name`.\n `Deadline` will be used as a fallback if an epic level deadline is not set.\n `Epic query`, if given, takes precedence over\n `Progress report epic query template` when finding epics for this outcome.\n- `Progress report outcome query: <query>` \u2013 Allows outcomes to be enumerated\n in JIRA issues, rather than the `Progress report outcomes` list. Each matching\n issue will be used as an outcome, with the outcome key for the epic query\n template being the issue key and the issue summary being the outcome title.\n If used, `Progress report epic query template` *must* be set.\n- `Progress report epic deadline field: <fieldname>` \u2013 Name of a date field\n giving the deadline of an outcome. Used as a fallback if no epic-level\n deadline is set. Optional.\n\n## Changelog\n\n### 0.24\n\n- Allow using either field id or title for field names in the progress report.\n- Fix several errors that would occur when running with no defined teams or\n outcomes in the configuration file.\n\n### 0.23\n\n- Allow deadline to be set on outcomes as a fallback for epic level deadlines\n- Add support for `Progress report outcome query` and\n `Progress report outcome deadline field`.\n- Allow progress report to run without a forecast for some/all teams.\n- Allow progress report to be run without teams being explicitly defined.\n Team names are picked up from the epic teams field if specified, and no\n forecasting will take place for such teams.\n- Add target and deadline lines to epic level CFDs in progress report.\n- Add out-come level CFD in progress reports.\n\n### 0.22\n\n- Add support for `Extends` in config file.\n- Allow `-o` as an alias for `--output-directory`\n\n### 0.21\n\n- Allow progress report output to be viewed by team as well as by outcome.\n\n### 0.20\n\n- Use a cumulative distribution function definition of a percentile when\n calculating chance of hitting the deadilne (basically: if the deadline is\n in the same week as the forecast worst case date, treat it as 100% not 50%\n likely)\n\n### 0.19\n\n- Fix a crash with newer versions of Pandas calculating CFD charts\n\n### 0.18\n\n- Don't show a forecast for epics that are complete\n\n### 0.17\n\n- Make logging output date/time and logging level again for easier debugging\n\n### 0.16\n\n- Attempted fix for throughput calculator crashing in some edge cases\n\n\n### 0.15\n\n- Brown bag\n\n\n### 0.14\n\n- Force min/max stories fields to integers even if string fields in JIRA\n- Log which state change caused a backward move\n\n### 0.13\n\n- Make sure change history is always iterated in date order, even if JIRA returns\n them differently.\n\n### 0.12\n\n- Preserve background colour in print CSS for progress report\n- Allow use of `{team}` placeholder in team throughput sample query.\n\n### 0.11\n\n- Added progress report calculator\n- Fixed issue with web server where template would not load if the package was\n installed as an egg (i.e. not from source)\n\n### 0.10\n\n* Make it possible to optionally specify multiple output files (via YAML lists)\n for `* data:` file names. The use case here is to output both a CSV/XLSX and\n JSON version of the `cycletime` calculations, for example.\n* Stop swallowing exceptions in calculators (but keep on doing so when writing\n output files). It's too confusing to debug problems.\n\n### 0.9\n\n* Made the default impediments charts use the impeded flag value as breakdown,\n and added specific `Impediments status *` charts for breakdown by status.\n\n### 0.8\n\n* Added `--http-proxy` and `--https-proxy` options to command line, and\n corresponding `HTTP Proxy` and `HTTPS Proxy` in the `Connection` section.\n\n### 0.7\n\n* Turn throughput chart into a line chart\n\n### 0.6\n\n* Don't log every list value resolution at debug\n\n### 0.5\n\n* Added batch mode docker image\n\n### 0.4\n\n* Added impediments charts\n\n### 0.3\n\n* Added debt, defects, and waste charts.\n* Added `window` options to most charts.\n\n### 0.2\n\n* Added `--output-directory` option.\n\n### 0.1\n\n* Forked from `jira-agile-metrics`\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/optilude/jira-agile-metrics", "keywords": "agile jira analytics metrics", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "jira-agile-metrics", "package_url": "https://pypi.org/project/jira-agile-metrics/", "platform": "", "project_url": "https://pypi.org/project/jira-agile-metrics/", "project_urls": { "Homepage": "https://github.com/optilude/jira-agile-metrics" }, "release_url": "https://pypi.org/project/jira-agile-metrics/0.24/", "requires_dist": [ "cryptography", "pyjwt", "requests-oauthlib (>=1.2.0)", "jira", "PyYAML", "pandas (>=0.23.0)", "numpy", "seaborn", "matplotlib", "statsmodels", "python-dateutil", "pydicti", "openpyxl", "flask", "Jinja2" ], "requires_python": "", "summary": "Agile metrics and summary data extracted from JIRA", "version": "0.24" }, "last_serial": 5804640, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "6d4a5ba28711eca52b2ed02a57cbe182", "sha256": "f1f6ef5fe00d6c56c9b2349332ab6df468e92e73c73c67acfdb14d3db9b11d14" }, "downloads": -1, "filename": "jira_agile_metrics-0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "6d4a5ba28711eca52b2ed02a57cbe182", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 53323, "upload_time": "2018-05-29T19:45:31", "url": "https://files.pythonhosted.org/packages/a0/3c/e08086b43015fac4a7d09ea7e9dc4a45c0b4d995f8d5d4a39660fef9735b/jira_agile_metrics-0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8c6a10af480f1bf2a0a6a606f79862ab", "sha256": "2dc01fa3e86c29075760f7521a5d4e08afe104defcd15c1b673103c3da8bac26" }, "downloads": -1, "filename": "jira-agile-metrics-0.1.tar.gz", "has_sig": false, "md5_digest": "8c6a10af480f1bf2a0a6a606f79862ab", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 37011, "upload_time": "2018-05-29T19:45:33", "url": "https://files.pythonhosted.org/packages/30/a6/5409fdd4c85fac6062531bd03f9299e6d33a3e0e885697186ebb55784b79/jira-agile-metrics-0.1.tar.gz" } ], "0.10": [ { "comment_text": "", "digests": { "md5": "6b3608d47f36b225d101b495e67ad027", "sha256": "43529d8f950a9ea5ec4bf353b48701d7164f9edf77a88f57e6c186e7050a1099" }, "downloads": -1, "filename": "jira_agile_metrics-0.10-py3-none-any.whl", "has_sig": false, "md5_digest": "6b3608d47f36b225d101b495e67ad027", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 75820, "upload_time": "2018-09-06T15:14:01", "url": "https://files.pythonhosted.org/packages/01/2d/b50eb0c0904dad35d52c09c4cfe5f626dfcfdc89b24ec2c877001ff897cc/jira_agile_metrics-0.10-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f50b3135afc3ba925f87fe366dce8476", "sha256": "de601ad94db3a33a7d4bebcc216e40fbb58e943c6edebfb2c32970b1bc61df30" }, "downloads": -1, "filename": "jira-agile-metrics-0.10.tar.gz", "has_sig": false, "md5_digest": "f50b3135afc3ba925f87fe366dce8476", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 77124, "upload_time": "2018-09-06T15:14:04", "url": "https://files.pythonhosted.org/packages/a4/cc/a8f25ae8e407dcb9b92d43d184eb2ffa6845c7143c33a65cf5d5333305a6/jira-agile-metrics-0.10.tar.gz" } ], "0.11": [ { "comment_text": "", "digests": { "md5": "84616a196079603f319753d1016e793a", "sha256": "e1ee0e3ed1c67b51431341b2a1a1fd7b34975fac8dfc827069d5392c4865b574" }, "downloads": -1, "filename": "jira_agile_metrics-0.11-py3-none-any.whl", "has_sig": false, "md5_digest": "84616a196079603f319753d1016e793a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 120377, "upload_time": "2019-01-03T16:55:03", "url": "https://files.pythonhosted.org/packages/28/85/b872ee3d56c3701f07b0ee0f5f4a0238b36d3ba1036b7efeb060908516e1/jira_agile_metrics-0.11-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8699658be7b74612d0d26a1c8a5819a5", "sha256": "7c0cde32dfc1e8f5fd7d836990b5ef755b43c2351a3d39b89c2de50740f85d9c" }, "downloads": -1, "filename": "jira-agile-metrics-0.11.tar.gz", "has_sig": false, "md5_digest": "8699658be7b74612d0d26a1c8a5819a5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 97624, "upload_time": "2019-01-03T16:55:05", "url": "https://files.pythonhosted.org/packages/66/35/4e6e7bd4a09772084488c78eb0fbffb167a93f10186728702a3b277363ef/jira-agile-metrics-0.11.tar.gz" } ], "0.12": [ { "comment_text": "", "digests": { "md5": "71da22a62b66d35fb369b27ff7a63a13", "sha256": "0bf8ac27d0a2ce9acbc524d2acad1efa0c6ac4bcce94f12162091aa9e67d4e40" }, "downloads": -1, "filename": "jira_agile_metrics-0.12-py3-none-any.whl", "has_sig": false, "md5_digest": "71da22a62b66d35fb369b27ff7a63a13", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 120650, "upload_time": "2019-01-08T11:44:00", "url": "https://files.pythonhosted.org/packages/e5/a4/c816968c79ed6a5fb0824ccfdfe0287af5956e04c635119cdf496d2af934/jira_agile_metrics-0.12-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e642651fe1e31c863c74c98bb79b1cac", "sha256": "92a0ce221af728db0aebb2250c3a3ac5b4395ba469530c1839b8abacda585ae4" }, "downloads": -1, "filename": "jira-agile-metrics-0.12.tar.gz", "has_sig": false, "md5_digest": "e642651fe1e31c863c74c98bb79b1cac", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 98021, "upload_time": "2019-01-08T11:44:02", "url": "https://files.pythonhosted.org/packages/93/87/99f445d560ac6c00ec632c1dbc0ff9961e942dd202a813c91c7a4a7b559b/jira-agile-metrics-0.12.tar.gz" } ], "0.14": [ { "comment_text": "", "digests": { "md5": "87205a06e6e5cda4d0d9068c674ce9ec", "sha256": "34b8e53eddf56d64931febb3a8e8ea158e2f0cd9f296968a2703460fd418ef4d" }, "downloads": -1, "filename": "jira_agile_metrics-0.14-py3-none-any.whl", "has_sig": false, "md5_digest": "87205a06e6e5cda4d0d9068c674ce9ec", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 120862, "upload_time": "2019-01-17T12:31:39", "url": "https://files.pythonhosted.org/packages/d6/cb/2750c4ef3028c2fce311cd9005e481fecc1fe849b21109051cf60c52985a/jira_agile_metrics-0.14-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "85e4c91bf36386aff88dcca57206ec42", "sha256": "f4104bd25b5810dfd339a88d6eea10149cff01157c00251be66c71a1bf3b88ca" }, "downloads": -1, "filename": "jira-agile-metrics-0.14.tar.gz", "has_sig": false, "md5_digest": "85e4c91bf36386aff88dcca57206ec42", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 98397, "upload_time": "2019-01-17T12:31:41", "url": "https://files.pythonhosted.org/packages/b1/03/c72795c9ae47d5bb5f44c031956d356642d83fe550c4de105e1b263ff158/jira-agile-metrics-0.14.tar.gz" } ], "0.15": [ { "comment_text": "", "digests": { "md5": "626a972e19e4d509efae10a5d15b64dd", "sha256": "f7743c2affd3d5c8be1be88384f7b29b7eebc9dd35b0498b1b72ba912090be49" }, "downloads": -1, "filename": "jira_agile_metrics-0.15-py3-none-any.whl", "has_sig": false, "md5_digest": "626a972e19e4d509efae10a5d15b64dd", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 121008, "upload_time": "2019-01-22T16:54:57", "url": "https://files.pythonhosted.org/packages/62/36/fb269dc8ff1ba6c7cc047e317e5e2b5b8577a9b048539990841bc1d7dcd1/jira_agile_metrics-0.15-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b6114a67bd3c0ac3b46b111734bcbf2f", "sha256": "1aa52dc797d67bcd8ccb6f7bd8a658a5a584a34ec12182aae67078a74b23649d" }, "downloads": -1, "filename": "jira-agile-metrics-0.15.tar.gz", "has_sig": false, "md5_digest": "b6114a67bd3c0ac3b46b111734bcbf2f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 98531, "upload_time": "2019-01-22T16:54:58", "url": "https://files.pythonhosted.org/packages/8b/d1/aebffbc049e45360f4cf813e82e416f1b456bf4e4741466d1ea99482d56b/jira-agile-metrics-0.15.tar.gz" } ], "0.16": [ { "comment_text": "", "digests": { "md5": "4799bb7465e36d54c90a812b58cc011c", "sha256": "a1e1cdd83fffd85d6c4d14f47e87899fd3749496f31e12a590342e67f2db3922" }, "downloads": -1, "filename": "jira_agile_metrics-0.16-py3-none-any.whl", "has_sig": false, "md5_digest": "4799bb7465e36d54c90a812b58cc011c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 121091, "upload_time": "2019-01-24T12:19:54", "url": "https://files.pythonhosted.org/packages/c9/50/7c417155fdd81a93a38392669bf2d27e060ef052b5374261f813575ab46c/jira_agile_metrics-0.16-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "dd08640c86da06b24772955f322da3c5", "sha256": "7455a48f6efb4be9ea90a74b7c90291b18589ed0fa7c189b5a06de9cba9c465f" }, "downloads": -1, "filename": "jira-agile-metrics-0.16.tar.gz", "has_sig": false, "md5_digest": "dd08640c86da06b24772955f322da3c5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 98842, "upload_time": "2019-01-24T12:19:56", "url": "https://files.pythonhosted.org/packages/2b/6b/3e21bb47c3ea19980c046015cb77e50c44bb3e665db47d8dc2da91050f2f/jira-agile-metrics-0.16.tar.gz" } ], "0.17": [ { "comment_text": "", "digests": { "md5": "2e6577effeb6d52587aaca88a92e4269", "sha256": "a1c8c37d2cbea186173686f10b76550fdccfeb40e3a3b4850fb73b512280a609" }, "downloads": -1, "filename": "jira_agile_metrics-0.17-py3-none-any.whl", "has_sig": false, "md5_digest": "2e6577effeb6d52587aaca88a92e4269", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 121162, "upload_time": "2019-01-24T16:43:28", "url": "https://files.pythonhosted.org/packages/77/fd/9ea973b7184ae9b399ce5aeb6a2570ab5a13aaa519bb941210809dfd2f2e/jira_agile_metrics-0.17-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "85aa4ba606eed8b400d65fe87b567962", "sha256": "7c59b6db5ad50b187e6068cf170ba1ff75a3a5c7e0e818a1cae57b8ca25b192e" }, "downloads": -1, "filename": "jira-agile-metrics-0.17.tar.gz", "has_sig": false, "md5_digest": "85aa4ba606eed8b400d65fe87b567962", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 98959, "upload_time": "2019-01-24T16:43:30", "url": "https://files.pythonhosted.org/packages/20/f4/adbb989ac0924d6f2f57444422db11d6d0985be9fb632c5454bfdbf4e7d9/jira-agile-metrics-0.17.tar.gz" } ], "0.18": [ { "comment_text": "", "digests": { "md5": "bb3e1239cb98e5c43e96aefee06fe16c", "sha256": "3110f2d388afe57e66eb54bc9f42c46ead3f3dd4f9d5569b763a58a4ef075192" }, "downloads": -1, "filename": "jira_agile_metrics-0.18-py3-none-any.whl", "has_sig": false, "md5_digest": "bb3e1239cb98e5c43e96aefee06fe16c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 121241, "upload_time": "2019-02-05T17:03:29", "url": "https://files.pythonhosted.org/packages/89/17/0814178477f01b49fe0cc89a684b22d9baaaf3a90738ff9225d4dc66eaf8/jira_agile_metrics-0.18-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d7816f27f111818a925ef8bdaee144ae", "sha256": "b196fbe733c3f90234a9bf76b1a681b9e4734e1788697943e85fe05590e4a0bc" }, "downloads": -1, "filename": "jira-agile-metrics-0.18.tar.gz", "has_sig": false, "md5_digest": "d7816f27f111818a925ef8bdaee144ae", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 99105, "upload_time": "2019-02-05T17:03:31", "url": "https://files.pythonhosted.org/packages/a8/87/d826d2f614d13a77b22c9f39a74a666f295dcb6bd8b11cb739dfd88edd33/jira-agile-metrics-0.18.tar.gz" } ], "0.19": [ { "comment_text": "", "digests": { "md5": "691e8db6d6dc54a34705896818a2d1b9", "sha256": "7d8644573dc24c0037f29de6e421d45373ab3520b4cf40e73ce1e4f5f2fa31a0" }, "downloads": -1, "filename": "jira_agile_metrics-0.19-py3-none-any.whl", "has_sig": false, "md5_digest": "691e8db6d6dc54a34705896818a2d1b9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 121272, "upload_time": "2019-02-06T15:56:42", "url": "https://files.pythonhosted.org/packages/2c/14/13e0cdce71f174ccb14e29913b82152cfcfaf1bc7b8bdab2ff6bcbb8587a/jira_agile_metrics-0.19-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "cdacebf968488640a19d13d6047942fb", "sha256": "e9c3c8361863008390ee373ab8b4f677f65e79e9a79a973ef6901a439d775e17" }, "downloads": -1, "filename": "jira-agile-metrics-0.19.tar.gz", "has_sig": false, "md5_digest": "cdacebf968488640a19d13d6047942fb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 99161, "upload_time": "2019-02-06T15:56:44", "url": "https://files.pythonhosted.org/packages/46/09/dfcb429b1986208c0af0a2ee8d27cbcd9163655cd3fec5b03429d0aaa1b7/jira-agile-metrics-0.19.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "0a6079fe974895054ccbb267384c82a5", "sha256": "d2558de7167607f361f9bfbf9142fe9d8fc82fc0a66b13c6e4ccca2b2802a3ae" }, "downloads": -1, "filename": "jira_agile_metrics-0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "0a6079fe974895054ccbb267384c82a5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 53476, "upload_time": "2018-05-30T08:12:54", "url": "https://files.pythonhosted.org/packages/0d/e5/eb9d0a8718d78572b713019797a25b24ccca170af03425c79b4bc04f0c20/jira_agile_metrics-0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "911d5491b3818935034fdc585cd98f68", "sha256": "90e3df61d37c40342176c92f4d1a19bf1196a80a819e3807368d58553adce5bb" }, "downloads": -1, "filename": "jira-agile-metrics-0.2.tar.gz", "has_sig": false, "md5_digest": "911d5491b3818935034fdc585cd98f68", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 37796, "upload_time": "2018-05-30T08:12:59", "url": "https://files.pythonhosted.org/packages/ec/be/e62b51ea84833125d7213d68e657cfe6e79b8f7093ecc22c0e9e91152760/jira-agile-metrics-0.2.tar.gz" } ], "0.20": [ { "comment_text": "", "digests": { "md5": "076094c05e59fd373ab735478d3fd2cb", "sha256": "875800b7188334e078ef6edda7960913205d5a0cb80ce7342e19d2beff68c413" }, "downloads": -1, "filename": "jira_agile_metrics-0.20-py3-none-any.whl", "has_sig": false, "md5_digest": "076094c05e59fd373ab735478d3fd2cb", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 121382, "upload_time": "2019-02-06T17:48:52", "url": "https://files.pythonhosted.org/packages/53/bf/222b89b0dcc6b6e6df8c3f2e7dc5c23a6deb83e12336c0aecc314ad66943/jira_agile_metrics-0.20-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d1347f442628581f71b08b77e2f37755", "sha256": "70db848ff09ed4f11a869a54f495babec3b1f62c9e4c56882fd43c8425df3fed" }, "downloads": -1, "filename": "jira-agile-metrics-0.20.tar.gz", "has_sig": false, "md5_digest": "d1347f442628581f71b08b77e2f37755", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 99470, "upload_time": "2019-02-06T17:48:54", "url": "https://files.pythonhosted.org/packages/5b/bf/2d54cad34c4649c1d213c30f9bfb6aa4add0aa85a9373e24b6af218614b9/jira-agile-metrics-0.20.tar.gz" } ], "0.21": [ { "comment_text": "", "digests": { "md5": "4b08527412eb1283dbfc8032d2dfe226", "sha256": "918f9cba48f0de98499ea4a519e82e2b0ce38052b9fb0c8ead5251e296ae6ba9" }, "downloads": -1, "filename": "jira_agile_metrics-0.21-py3-none-any.whl", "has_sig": false, "md5_digest": "4b08527412eb1283dbfc8032d2dfe226", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 121892, "upload_time": "2019-03-26T16:22:16", "url": "https://files.pythonhosted.org/packages/c8/d4/f8ef73a850c596514d846d71b07e98024f7492e5edaf00c804ce74c36dec/jira_agile_metrics-0.21-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "75f1f1c3b242c665e4db6b7ebedf8c51", "sha256": "40b8a7b0eef76f31c7c3028dcf35c8c78a3c00a5381052268370847a32708a31" }, "downloads": -1, "filename": "jira-agile-metrics-0.21.tar.gz", "has_sig": false, "md5_digest": "75f1f1c3b242c665e4db6b7ebedf8c51", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 99689, "upload_time": "2019-03-26T16:22:20", "url": "https://files.pythonhosted.org/packages/6d/58/b503d41f6da7cbe6e859473c5b9486cbb848332a796e559c4888179ad38a/jira-agile-metrics-0.21.tar.gz" } ], "0.22": [ { "comment_text": "", "digests": { "md5": "9d6f75b5b0f9f6a6857d0205dd108c6e", "sha256": "d32291f2059966282d408ef8bf4e32388bbb79b5e52b592b93d9ec901eb8b83d" }, "downloads": -1, "filename": "jira_agile_metrics-0.22-py3-none-any.whl", "has_sig": false, "md5_digest": "9d6f75b5b0f9f6a6857d0205dd108c6e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 123241, "upload_time": "2019-08-31T20:37:34", "url": "https://files.pythonhosted.org/packages/3b/72/881c7890a979ee1fb9908cefb94396be13bb14fceb4f77c64245b5140f76/jira_agile_metrics-0.22-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4fd8621f77c9696e2b35695cadc57051", "sha256": "a0c08d5e3ea5d904c50910b66af946c445feaa41529045045840b1a1dccf1805" }, "downloads": -1, "filename": "jira-agile-metrics-0.22.tar.gz", "has_sig": false, "md5_digest": "4fd8621f77c9696e2b35695cadc57051", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 102070, "upload_time": "2019-08-31T20:37:36", "url": "https://files.pythonhosted.org/packages/f5/2c/fb557123ac7a09b46a777d6194ceb831073d3bcf01ebf5dd2cefb3b34676/jira-agile-metrics-0.22.tar.gz" } ], "0.23": [ { "comment_text": "", "digests": { "md5": "6e7fbdf4d0c31bf5523fce736ed0c8bd", "sha256": "3ddf56e95be270f960791af3f911808812f64fb931f07f359a8c73d5b1f5f3f7" }, "downloads": -1, "filename": "jira_agile_metrics-0.23-py3-none-any.whl", "has_sig": false, "md5_digest": "6e7fbdf4d0c31bf5523fce736ed0c8bd", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 126862, "upload_time": "2019-09-04T13:48:46", "url": "https://files.pythonhosted.org/packages/18/70/20414fe3217fdb757ed872f89e747a2191b7f1109f27518ff434fa0af1a0/jira_agile_metrics-0.23-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fe08df93f7df7290c4703907eaf0ae68", "sha256": "d61615d2a03dc0cd94afb175bf9bb4f97799a77f034fe35a8f52ebaa1815ddba" }, "downloads": -1, "filename": "jira-agile-metrics-0.23.tar.gz", "has_sig": false, "md5_digest": "fe08df93f7df7290c4703907eaf0ae68", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 108048, "upload_time": "2019-09-04T13:48:48", "url": "https://files.pythonhosted.org/packages/46/9a/19c17696eaece2357b0e3c6bd3466d4edfe4efae4aeb05985c94d3c253de/jira-agile-metrics-0.23.tar.gz" } ], "0.24": [ { "comment_text": "", "digests": { "md5": "8c365801a488fb79c129a41eac74ff24", "sha256": "58dd4f9a160b022e3ca636a66dd15f51c0587188a0cf80352f634697cb93c7cc" }, "downloads": -1, "filename": "jira_agile_metrics-0.24-py3-none-any.whl", "has_sig": false, "md5_digest": "8c365801a488fb79c129a41eac74ff24", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 126971, "upload_time": "2019-09-09T17:16:53", "url": "https://files.pythonhosted.org/packages/67/8a/3a948efa3755cf52fc0a20f3d9f97a4b615c7756a0cef96dd40feafb8af7/jira_agile_metrics-0.24-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4bd8009aebe0652de91394a4a65176ca", "sha256": "ef1d58f784bf4af28924ac22026cda4a6b3f1eb75cc430e227d08c99e49e33d6" }, "downloads": -1, "filename": "jira-agile-metrics-0.24.tar.gz", "has_sig": false, "md5_digest": "4bd8009aebe0652de91394a4a65176ca", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 108268, "upload_time": "2019-09-09T17:16:55", "url": "https://files.pythonhosted.org/packages/97/74/04492e736bd18e3876efdfd60ff1e5ad9b8b8d2afc48c2dc41abe3f29eea/jira-agile-metrics-0.24.tar.gz" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "aaebbdb621bb45c81b4f55c57443b8e8", "sha256": "5502bcacd10bc56db04411ac07862d9fd72672ef90901d4c1bbaf4ed1dac0d4a" }, "downloads": -1, "filename": "jira_agile_metrics-0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "aaebbdb621bb45c81b4f55c57443b8e8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 67995, "upload_time": "2018-06-08T20:56:39", "url": "https://files.pythonhosted.org/packages/d2/b2/1a0f9e3168ea94e3a63922b271bce7629817014f998faf7c7f8a0fd8661e/jira_agile_metrics-0.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "25681809f98d5a41838495b78427e918", "sha256": "8929b0a3cefc1f823bffbf895c89520b6c2f471ac314c829ca09bfed3888fb65" }, "downloads": -1, "filename": "jira-agile-metrics-0.3.tar.gz", "has_sig": false, "md5_digest": "25681809f98d5a41838495b78427e918", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 67062, "upload_time": "2018-06-08T20:56:40", "url": "https://files.pythonhosted.org/packages/cb/31/1f05ddf4087a95afccb235a7d18ef2753508393a1c9aa06d7c51b0cfa33e/jira-agile-metrics-0.3.tar.gz" } ], "0.5": [ { "comment_text": "", "digests": { "md5": "1d7f50a89f52ea338b8fac7b387184f3", "sha256": "3b55d05d4be87df584bae8492d9fbcb3e22e0e408b537d866232dafe156c245f" }, "downloads": -1, "filename": "jira_agile_metrics-0.5-py3-none-any.whl", "has_sig": false, "md5_digest": "1d7f50a89f52ea338b8fac7b387184f3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 74253, "upload_time": "2018-06-11T13:37:59", "url": "https://files.pythonhosted.org/packages/29/84/decacf8ab59ed10c7c91a91157eea9365491e324fc2968e949fa5283f45a/jira_agile_metrics-0.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "66b8fa83d5b88d86d4e3d861019dc591", "sha256": "2f4a1da2b99e160b0424bec3bc3cffd42e5d949509bdb3aa7deb769a41e812ea" }, "downloads": -1, "filename": "jira-agile-metrics-0.5.tar.gz", "has_sig": false, "md5_digest": "66b8fa83d5b88d86d4e3d861019dc591", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 73984, "upload_time": "2018-06-11T13:38:01", "url": "https://files.pythonhosted.org/packages/75/bc/021cfb3ac5784ba655e25ebb5c7afaedfa1d3fa2083f9634377a2f96f878/jira-agile-metrics-0.5.tar.gz" } ], "0.6": [ { "comment_text": "", "digests": { "md5": "5bae0cf43fb5756cac0b4c6604bd97f4", "sha256": "d839db45d314b3766a20810a26c8a0901ce2f48d54f0020044726a1aa08fbd56" }, "downloads": -1, "filename": "jira_agile_metrics-0.6-py3-none-any.whl", "has_sig": false, "md5_digest": "5bae0cf43fb5756cac0b4c6604bd97f4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 74274, "upload_time": "2018-06-11T15:28:09", "url": "https://files.pythonhosted.org/packages/15/3f/a2d534c10e189d78487c979ca2721cc6d51c52bd20e52ebee849302c7526/jira_agile_metrics-0.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a1f0a93078047357e0ea0bcf070e1bb9", "sha256": "6886f703a0e13c70b97c1a464025159224cf7a0abdd7631b14c1ac560c3e2122" }, "downloads": -1, "filename": "jira-agile-metrics-0.6.tar.gz", "has_sig": false, "md5_digest": "a1f0a93078047357e0ea0bcf070e1bb9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 74153, "upload_time": "2018-06-11T15:28:10", "url": "https://files.pythonhosted.org/packages/0d/5b/39e4bb2df9c05b72530729698c9c6b3fd44f173545df002565f63d598395/jira-agile-metrics-0.6.tar.gz" } ], "0.7": [ { "comment_text": "", "digests": { "md5": "88a79420b53c542791794c31fbea4055", "sha256": "8ad2e49118d5c89be1e1029262e44f647cc6e1a5697d69437ab8b0aa01cb6ff7" }, "downloads": -1, "filename": "jira_agile_metrics-0.7-py3-none-any.whl", "has_sig": false, "md5_digest": "88a79420b53c542791794c31fbea4055", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 74295, "upload_time": "2018-06-19T11:07:14", "url": "https://files.pythonhosted.org/packages/1c/53/e5e23d377d6b01cc18812c01328b971018e3d9e4c4b56b4d1dfb3bc3a8b1/jira_agile_metrics-0.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "72e27c76e9c5531f93c1aec3aa5ffdbd", "sha256": "49848cc05aa495ead6e015126d71f99bbdba505edeaf19d400d492bd38ad875e" }, "downloads": -1, "filename": "jira-agile-metrics-0.7.tar.gz", "has_sig": false, "md5_digest": "72e27c76e9c5531f93c1aec3aa5ffdbd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 74178, "upload_time": "2018-06-19T11:07:17", "url": "https://files.pythonhosted.org/packages/e1/07/095381cbd609cbf309a65f3393f42caa4ecabbd8d30a929abdd9013230e8/jira-agile-metrics-0.7.tar.gz" } ], "0.8": [ { "comment_text": "", "digests": { "md5": "4cf5160f9deb138127c70d6bb74fb0bb", "sha256": "b6bf3090fa8992cf9570a5ebbc139464ca592d3fe87a7f646f4756d7fe68b8e7" }, "downloads": -1, "filename": "jira_agile_metrics-0.8-py3-none-any.whl", "has_sig": false, "md5_digest": "4cf5160f9deb138127c70d6bb74fb0bb", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 74559, "upload_time": "2018-06-20T14:22:31", "url": "https://files.pythonhosted.org/packages/5c/d9/cf8cd0f1bea36974eef0f438dd71635c27ac36c81c348759ea7c867a34bc/jira_agile_metrics-0.8-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f4291db8a8ec1ae0cb6318dc96524280", "sha256": "e8cedd2bc36a23cf58095c57ce6ce6393d7f3c321dd7b877a8c0482bab319701" }, "downloads": -1, "filename": "jira-agile-metrics-0.8.tar.gz", "has_sig": false, "md5_digest": "f4291db8a8ec1ae0cb6318dc96524280", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 74572, "upload_time": "2018-06-20T14:22:32", "url": "https://files.pythonhosted.org/packages/c9/ae/39df6854c96e7ef6bb5f3d133871de094b278673481ddb157f058497d9a2/jira-agile-metrics-0.8.tar.gz" } ], "0.9": [ { "comment_text": "", "digests": { "md5": "ce5d9c37d85e3cb57bead204c473505b", "sha256": "5ffe968ffc79b569579af4d2263652e5756bbfffb02326579600ec70def86643" }, "downloads": -1, "filename": "jira_agile_metrics-0.9-py3-none-any.whl", "has_sig": false, "md5_digest": "ce5d9c37d85e3cb57bead204c473505b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 75263, "upload_time": "2018-06-21T21:52:33", "url": "https://files.pythonhosted.org/packages/1c/f6/c38dd757811b917b61d3fb9d67696d1d8cf1ac8446b39b9683e6de56007d/jira_agile_metrics-0.9-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d8097ef37f950703b783bea5b045cd5f", "sha256": "bc30681ea3fdc1ac925a71f5a1f9d92ab27355abc87b8c0a2677ad381d62d996" }, "downloads": -1, "filename": "jira-agile-metrics-0.9.tar.gz", "has_sig": false, "md5_digest": "d8097ef37f950703b783bea5b045cd5f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 75968, "upload_time": "2018-06-21T21:52:35", "url": "https://files.pythonhosted.org/packages/2a/bb/6107c6192b047eceea74189561236f919f2523218db4addb2a39ccba6588/jira-agile-metrics-0.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "8c365801a488fb79c129a41eac74ff24", "sha256": "58dd4f9a160b022e3ca636a66dd15f51c0587188a0cf80352f634697cb93c7cc" }, "downloads": -1, "filename": "jira_agile_metrics-0.24-py3-none-any.whl", "has_sig": false, "md5_digest": "8c365801a488fb79c129a41eac74ff24", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 126971, "upload_time": "2019-09-09T17:16:53", "url": "https://files.pythonhosted.org/packages/67/8a/3a948efa3755cf52fc0a20f3d9f97a4b615c7756a0cef96dd40feafb8af7/jira_agile_metrics-0.24-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4bd8009aebe0652de91394a4a65176ca", "sha256": "ef1d58f784bf4af28924ac22026cda4a6b3f1eb75cc430e227d08c99e49e33d6" }, "downloads": -1, "filename": "jira-agile-metrics-0.24.tar.gz", "has_sig": false, "md5_digest": "4bd8009aebe0652de91394a4a65176ca", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 108268, "upload_time": "2019-09-09T17:16:55", "url": "https://files.pythonhosted.org/packages/97/74/04492e736bd18e3876efdfd60ff1e5ad9b8b8d2afc48c2dc41abe3f29eea/jira-agile-metrics-0.24.tar.gz" } ] }