mlx.jira-juggler


Namemlx.jira-juggler JSON
Version 3.5.0 PyPI version JSON
download
home_pageNone
SummaryA Python script for extracting data from Jira, and converting to TaskJuggler (tj3) output
upload_time2025-09-15 10:23:51
maintainerNone
docs_urlNone
authorNone
requires_python>=3.10
licenseNone
keywords jira taskjuggler gantt project planning planning software engineering
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            .. image:: https://img.shields.io/hexpm/l/plug.svg
    :target: http://www.apache.org/licenses/LICENSE-2.0

=============================
JIRA to TaskJuggler Convertor
=============================

Tool for converting a set of JIRA tasks to TaskJuggler (TJ3) syntax, with support for hierarchical task structures including Epics, Stories, and Sub-tasks.

----
Goal
----

When using JIRA to track your project, and tasks/issues are estimated using the time-tracking plugin, this python
module can convert the JIRA tasks to a gantt chart using the `TaskJuggler <http://taskjuggler.org/>`_ tool.

The tool supports both flat task lists and hierarchical task structures. With the hierarchical mode enabled,
Epics become parent tasks containing their child Stories and Sub-tasks, creating properly nested TaskJuggler
task structures with automatic effort rollup from children to parents.

------------
Installation
------------

Installation from PyPI:

.. code::

    pip install mlx.jira-juggler

-----
Usage
-----

See help from python module:

.. code::

    jira-juggler -h

By default, the following endpoint for the JIRA API is used: *https://melexis.atlassian.net*.
The script will ask you to input your email address (or username) and API token (or password). These three
variables can be configured by setting them in a *.env* file. This *.env* file shall be located in the directory where
pip has installed the package. You can find an example configuration in *.env.example*. JIRA Cloud requires the
combination of email address and API token, while JIRA Server might accept a username and password.

**Basic Usage:**

.. code::

    jira-juggler -q "project = MYPROJECT" -o output.tjp

**Hierarchical Epic Support:**

To enable hierarchical task structures with Epics, Stories, and Sub-tasks, use the ``-E`` or ``--enable-epics`` flag:

.. code::

    jira-juggler -q "project = MYPROJECT" -E -o hierarchical_output.tjp

This will create nested TaskJuggler tasks where:

- Epics become parent tasks containing their child Stories
- Stories become parent tasks containing their child Sub-tasks
- Effort is automatically rolled up from children to parents
- Proper indentation is used for nested task structures

**Example Hierarchical Output:**

.. code::

    task EPIC_123 "User Management" {
        Jira "EPIC-123"
        allocate product_owner
        effort 5.0d

        task STORY_456 "User Authentication" {
            Jira "STORY-456"
            allocate backend_dev
            effort 3.0d

            task SUB_789 "Login API" {
                Jira "SUB-789"
                allocate backend_dev
                effort 1.0d
            }
        }
    }

.. note::

    To include resolved **and** unresolved tasks while excluding invalid tasks, you can add the following logic to the
    value for the `--query` argument: `(resolution !=  Invalid OR resolution = Unresolved)`.

.. warning::

    The generated tj3-file, can at the moment not be parsed by TaskJuggler directly. Only the tasks are exported
    to the tj3-file. The list of tasks needs to be embedded in a complete tj3-file. See the
    `TaskJuggler website <http://taskjuggler.org/>`_ for more details.

.. note::

    Unresolved tasks with logged time, i.e. time spent, will have their 'start' property set to the set current date
    and time minus the logged time, calculated with 8 hours per workday and a default of 5 allocated workdays per week
    with the day(s) off ending on Sunday. The latter number can be changed.

.. note::

    **Epic and Hierarchy Detection**: The tool automatically detects hierarchical relationships through:

    - **Epic relationships**: Stories/Tasks linked to Epics via ``epic``, ``epiclink``, or custom fields like ``customfield_10014``
    - **Parent-child relationships**: Sub-tasks linked to their parent Stories/Tasks via the ``parent`` field
    - **Issue types**: Automatic detection of Epic and Sub-task issue types

    Only tasks included in your query results will be part of the hierarchy. Child tasks without their parents in
    the query results will appear as standalone top-level tasks.

--------------------
Command-line Options
--------------------

Key command-line options include:

- ``-q, --query``: **Required**. JQL query to fetch issues from JIRA
- ``-o, --output``: Output .tjp file (default: jira_export.tjp)
- ``-E, --enable-epics``: **NEW**. Enable hierarchical Epic/Story/Sub-task support
- ``-D, --depend-on-preceding``: Make tasks depend on preceding task with same assignee
- ``-s, --sort-on-sprint``: Sort tasks by sprint field (e.g., customfield_10851)
- ``-w, --weeklymax``: Workdays per week for time calculations (default: 5.0)
- ``-L, --links``: Specify issue link types for dependencies
- ``-l, --loglevel``: Logging level (default: warning)

Run ``jira-juggler -h`` for complete help.

**Comparison Example:**

Without ``-E`` (flat output):
::

    task EPIC_123 "User Management" { ... }
    task STORY_456 "User Authentication" { ... }
    task SUB_789 "Login API" { ... }

With ``-E`` (hierarchical output):
::

    task EPIC_123 "User Management" {
        task STORY_456 "User Authentication" {
            task SUB_789 "Login API" { ... }
        }
    }

-----------
Limitations
-----------

- When two tasks end on the same date and time, TaskJuggler won't necessarily preserve the order in which the tasks
  appear in jira-juggler's output.

- **Hierarchical mode**: Epic hierarchy is only enabled with the ``-E`` flag. By default, all tasks are output as a flat list
  to maintain backward compatibility.

- **Effort rollup**: When using hierarchical mode, parent task efforts are automatically calculated from their children.
  Manual effort estimates on parent tasks (Epics/Stories with children) may be overridden by the rollup calculation.

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "mlx.jira-juggler",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.10",
    "maintainer_email": null,
    "keywords": "Jira, taskjuggler, gantt, project planning, planning, software engineering",
    "author": null,
    "author_email": "Jasper Craeghs <jce@melexis.com>",
    "download_url": null,
    "platform": null,
    "description": ".. image:: https://img.shields.io/hexpm/l/plug.svg\n    :target: http://www.apache.org/licenses/LICENSE-2.0\n\n=============================\nJIRA to TaskJuggler Convertor\n=============================\n\nTool for converting a set of JIRA tasks to TaskJuggler (TJ3) syntax, with support for hierarchical task structures including Epics, Stories, and Sub-tasks.\n\n----\nGoal\n----\n\nWhen using JIRA to track your project, and tasks/issues are estimated using the time-tracking plugin, this python\nmodule can convert the JIRA tasks to a gantt chart using the `TaskJuggler <http://taskjuggler.org/>`_ tool.\n\nThe tool supports both flat task lists and hierarchical task structures. With the hierarchical mode enabled,\nEpics become parent tasks containing their child Stories and Sub-tasks, creating properly nested TaskJuggler\ntask structures with automatic effort rollup from children to parents.\n\n------------\nInstallation\n------------\n\nInstallation from PyPI:\n\n.. code::\n\n    pip install mlx.jira-juggler\n\n-----\nUsage\n-----\n\nSee help from python module:\n\n.. code::\n\n    jira-juggler -h\n\nBy default, the following endpoint for the JIRA API is used: *https://melexis.atlassian.net*.\nThe script will ask you to input your email address (or username) and API token (or password). These three\nvariables can be configured by setting them in a *.env* file. This *.env* file shall be located in the directory where\npip has installed the package. You can find an example configuration in *.env.example*. JIRA Cloud requires the\ncombination of email address and API token, while JIRA Server might accept a username and password.\n\n**Basic Usage:**\n\n.. code::\n\n    jira-juggler -q \"project = MYPROJECT\" -o output.tjp\n\n**Hierarchical Epic Support:**\n\nTo enable hierarchical task structures with Epics, Stories, and Sub-tasks, use the ``-E`` or ``--enable-epics`` flag:\n\n.. code::\n\n    jira-juggler -q \"project = MYPROJECT\" -E -o hierarchical_output.tjp\n\nThis will create nested TaskJuggler tasks where:\n\n- Epics become parent tasks containing their child Stories\n- Stories become parent tasks containing their child Sub-tasks\n- Effort is automatically rolled up from children to parents\n- Proper indentation is used for nested task structures\n\n**Example Hierarchical Output:**\n\n.. code::\n\n    task EPIC_123 \"User Management\" {\n        Jira \"EPIC-123\"\n        allocate product_owner\n        effort 5.0d\n\n        task STORY_456 \"User Authentication\" {\n            Jira \"STORY-456\"\n            allocate backend_dev\n            effort 3.0d\n\n            task SUB_789 \"Login API\" {\n                Jira \"SUB-789\"\n                allocate backend_dev\n                effort 1.0d\n            }\n        }\n    }\n\n.. note::\n\n    To include resolved **and** unresolved tasks while excluding invalid tasks, you can add the following logic to the\n    value for the `--query` argument: `(resolution !=  Invalid OR resolution = Unresolved)`.\n\n.. warning::\n\n    The generated tj3-file, can at the moment not be parsed by TaskJuggler directly. Only the tasks are exported\n    to the tj3-file. The list of tasks needs to be embedded in a complete tj3-file. See the\n    `TaskJuggler website <http://taskjuggler.org/>`_ for more details.\n\n.. note::\n\n    Unresolved tasks with logged time, i.e. time spent, will have their 'start' property set to the set current date\n    and time minus the logged time, calculated with 8 hours per workday and a default of 5 allocated workdays per week\n    with the day(s) off ending on Sunday. The latter number can be changed.\n\n.. note::\n\n    **Epic and Hierarchy Detection**: The tool automatically detects hierarchical relationships through:\n\n    - **Epic relationships**: Stories/Tasks linked to Epics via ``epic``, ``epiclink``, or custom fields like ``customfield_10014``\n    - **Parent-child relationships**: Sub-tasks linked to their parent Stories/Tasks via the ``parent`` field\n    - **Issue types**: Automatic detection of Epic and Sub-task issue types\n\n    Only tasks included in your query results will be part of the hierarchy. Child tasks without their parents in\n    the query results will appear as standalone top-level tasks.\n\n--------------------\nCommand-line Options\n--------------------\n\nKey command-line options include:\n\n- ``-q, --query``: **Required**. JQL query to fetch issues from JIRA\n- ``-o, --output``: Output .tjp file (default: jira_export.tjp)\n- ``-E, --enable-epics``: **NEW**. Enable hierarchical Epic/Story/Sub-task support\n- ``-D, --depend-on-preceding``: Make tasks depend on preceding task with same assignee\n- ``-s, --sort-on-sprint``: Sort tasks by sprint field (e.g., customfield_10851)\n- ``-w, --weeklymax``: Workdays per week for time calculations (default: 5.0)\n- ``-L, --links``: Specify issue link types for dependencies\n- ``-l, --loglevel``: Logging level (default: warning)\n\nRun ``jira-juggler -h`` for complete help.\n\n**Comparison Example:**\n\nWithout ``-E`` (flat output):\n::\n\n    task EPIC_123 \"User Management\" { ... }\n    task STORY_456 \"User Authentication\" { ... }\n    task SUB_789 \"Login API\" { ... }\n\nWith ``-E`` (hierarchical output):\n::\n\n    task EPIC_123 \"User Management\" {\n        task STORY_456 \"User Authentication\" {\n            task SUB_789 \"Login API\" { ... }\n        }\n    }\n\n-----------\nLimitations\n-----------\n\n- When two tasks end on the same date and time, TaskJuggler won't necessarily preserve the order in which the tasks\n  appear in jira-juggler's output.\n\n- **Hierarchical mode**: Epic hierarchy is only enabled with the ``-E`` flag. By default, all tasks are output as a flat list\n  to maintain backward compatibility.\n\n- **Effort rollup**: When using hierarchical mode, parent task efforts are automatically calculated from their children.\n  Manual effort estimates on parent tasks (Epics/Stories with children) may be overridden by the rollup calculation.\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "A Python script for extracting data from Jira, and converting to TaskJuggler (tj3) output",
    "version": "3.5.0",
    "project_urls": {
        "Homepage": "https://github.com/melexis/jira-juggler",
        "Repository": "https://github.com/melexis/jira-juggler"
    },
    "split_keywords": [
        "jira",
        " taskjuggler",
        " gantt",
        " project planning",
        " planning",
        " software engineering"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "ecfd2eb33898a07d74e69f80b9af4ed7382e5443328f1ff343b2ae1ba18c34f2",
                "md5": "79bb4b7c87344aab7565dbf3e045fbf8",
                "sha256": "22c333e2c1ef48f57a9c20e4acb6fbbfd2b419d84fb10547fd526445f4f9e060"
            },
            "downloads": -1,
            "filename": "mlx_jira_juggler-3.5.0-py2.py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "79bb4b7c87344aab7565dbf3e045fbf8",
            "packagetype": "bdist_wheel",
            "python_version": "py2.py3",
            "requires_python": ">=3.10",
            "size": 20787,
            "upload_time": "2025-09-15T10:23:51",
            "upload_time_iso_8601": "2025-09-15T10:23:51.916265Z",
            "url": "https://files.pythonhosted.org/packages/ec/fd/2eb33898a07d74e69f80b9af4ed7382e5443328f1ff343b2ae1ba18c34f2/mlx_jira_juggler-3.5.0-py2.py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-09-15 10:23:51",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "melexis",
    "github_project": "jira-juggler",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "tox": true,
    "lcname": "mlx.jira-juggler"
}
        
Elapsed time: 1.10451s