Changelog¶
v0.16.1 - 2026-09-14¶
Fixed¶
- Create-metadata helpers now aggregate official Jira REST API v3
issueTypesandfieldspages usingstartAtand the current page'stotal.issue_types()preserves Jira's ordered bare raw list, whilecreate_fields()stops issue-type discovery at the first case-insensitive match with a nonblank raw ID and aggregates all field pages. Later failures raiseJiraHelperOperationErrorrather than returning partial lists. - Tightened undocumented test/mock compatibility: metadata-free pages and
values/isLast-only create-metadata pages are no longer accepted by the high-level helpers. Low-level create-metadata methods remain unchanged one-page raw pass-throughs.
v0.16.0 - 2026-09-11¶
Breaking changes¶
Attachments.download_attachment_content()no longer returns buffered bytes. It now requires a binary destination and positivemax_bytes, streams bounded content, and returns observed bytes. Optionalexpected_sizeenforces an exact count.- Removed
AttachmentDownloadPlanandAttachmentHelpers.plan_download(). UseAttachmentHelpers.download(attachment_id, *, directory=".", filename=None, max_download=...), which owns metadata lookup, filename handling, temporary files, and atomic replacement. Result data now reports observedsizeand no longer exposescontent_url.
Security and reliability¶
- Public attachment transfers start at the configured Jira endpoint, follow redirects
without forwarding credentials cross-origin, enforce limits cumulatively, retry 429
only before output starts, and report sanitized failures. Missing metadata
sizeuses only the cap; supplied zero requires an empty transfer. The separate managed-media bounded reader is unchanged.
v0.15.0 - 2026-09-09¶
Added¶
- Managed Jira Markdown images now receive exact intrinsic dimensions before a helper writes ADF. A 64-byte authenticated no-follow range probe handles PNG/APNG, GIF, WebP, and BMP first; JPEG, TIFF, and inconclusive probes use one complete fallback limited to 100 MiB. JPEG/TIFF EXIF orientation is applied. Dimensions must be positive, at most 65,535 per axis, and at most 89,478,485 pixels. The resulting managed media is centered at 100% parent width with intrinsic child dimensions.
Compatibility¶
- Public attachment downloads retain their existing redirect-following, fully buffered behavior. Managed-image acquisition remains private, avoids external fetches, and verifies raw persisted ADF structure rather than making a browser-rendering claim.
Security fixes¶
- Private managed-image reads use
redirect=false, do not follow redirects, request identity encoding, and validate the response status, byte range, total size, and length before parsing in-memory bytes. Malformed, oversized, incomplete, or redirected responses are rejected; attachment bytes are not persisted.
v0.14.0 - 2026-09-07¶
Added¶
- Replaced direct
marklassianandpyadfuse withadf-bridge>=0.1.2. Formatted ADF presentation uses adf-bridge's identity-preserving[~accountId:<id>]mention tokens and remains readable and presentation-only; managed media attachment-content URLs cannot be recovered from formatted Markdown or leak Media Services IDs. - Added automatic Jira-managed Markdown images on existing-issue high-level writes:
issue edit rich fields, comment add/update, and worklog add/update. Only canonical
configured-Jira attachment-content URLs for associated
image/*attachments qualify; source query and fragment delimiters, including bare?and#, are rejected. Create remains create → upload → complete-field edit, never an implicit upload. Jira's private no-follow303Media Services mapping is compatibility-sensitive observed behavior; public bytes downloads remain unchanged. Verification reads raw persisted ADF structure, not rendered response expansions. - Direct issue, comment, and worklog mutations now flag connection and Jira 5xx failures
as potentially delivered with
mutation_may_have_succeeded; callers must reread before retrying, and jira2py does not retry or roll back after that uncertain failure.
v0.13.0 - 2026-09-04¶
Breaking changes¶
- High-level Markdown inputs shaped as
[~accountId:<id>]now create Jira mentions rather than literal text.
Added¶
- Added universal Jira account mentions to high-level Markdown writes: issue create/edit descriptions,
environment, compatible custom textarea fields, comment add/update bodies, and worklog add/update comments. Input accepts case-insensitiveaccountId, including IDs containing:. Formatted ADF reads remain presentation-only through pyadf and can lose mention identity if edited and written back; raw ADF is required for identity-safe edits until dedicated formatted read/edit/write support is added.
v0.12.0 - 2026-09-01¶
Added¶
- Added named low-level transition-discovery controls for
includeUnavailableTransitions,skipRemoteOnlyCondition, andsortByOpsBarAndStatus, while retaining the existing positional arguments andextra_paramsprecedence. - Added focused transition discovery through
MetadataHelpers.transitions(..., transition_id=..., include_unavailable_transitions=...). It always expandstransitions.fields, keeps Jira's complete raw transition envelope in helper data, and presents destination IDs/names, availability and workflow indicators, plus screen field keys/names/requirements/operations. - Added Jira-native
fieldsandupdatemappings toIssueHelpers.transition(). The helper rejects exact overlap between their field keys, forwards neither submitted body in its result, and leaves Jira as the validator for screen requirements and field values. Successful helper transition results now addverified: false: Jira accepted the request, but jira2py did not perform a verification read and reports the destination only as expected.
v0.11.0 - 2026-08-28¶
Added¶
- Added one-page
IssueFields.search_fields()support for Jira's stable/field/searchendpoint, including canonical field IDs, system/custom type filters, project IDs, ordering, expansions, and raw query overrides.IssueFields.get_fields()is unchanged. - Added
MetadataHelpers.list_fields()for one searchable raw field page with concise canonical-ID text and optional project-key-to-numeric-ID context resolution. Jira documents field search for Classic projects; project context does not determine issue-type or create/edit-screen applicability. - Added exact case-sensitive raw
fieldIdfiltering to ordinary and known-ID changelog helpers. Ordinary changelog retrieval also supports optional post-filter event pagination withresult_pagemetadata after all Jira pages, timestamp filtering, item pruning, and empty-event removal.
v0.10.0 - 2026-08-27¶
Added¶
- Added
Issues.get_changelogs_by_ids()for Jira's official issue-scoped changelog-list POST endpoint. - Added
JiraHelpers.changelogsfor complete changelog retrieval with optional UTC-normalized half-open creation bounds, plus one-request known-ID retrieval. - Added permissive changelog/page models and concise changelog helper text while retaining complete original Jira mappings in structured helper output.
v0.9.0 - 2026-08-23¶
Breaking changes¶
Issues.get_issue()now acceptsSequence[str] | Noneforfields. A supplied sequence is validated and serialized only at the Get Issue endpoint; comma-delimited scalar strings are no longer accepted.- Removed
IssueHelpers.read()and its fixed retrieval profile. Retrieve issues directly withJiraAPI, which now remains the sole full-issue retrieval authority. fields=Noneomits the parameter for Jira's default behavior unless rawextra_params["fields"]overrides it. Selectors are forwarded exactly, without implicit fields orexpand; wildcard and negative selectors may be broad.
# Before (removed)
from jira2py.helpers import JiraHelpers
helpers = JiraHelpers(api)
api.issues.get_issue("PROJ-123", fields="summary,status")
helpers.issues.read("PROJ-123", extra_fields=["customfield_10001"])
# After
from jira2py.helpers import format_issue
issue = api.issues.get_issue(
"PROJ-123",
fields=["summary", "status", "customfield_10001"],
)
text = format_issue(
issue,
browse_url=f"{api.credentials.url}/browse/{issue['key']}",
)
Added¶
- Added public pure
jira2py.helpers.format_issue(data, *, browse_url=None)for optional presence-aware issue text presentation without I/O, mutation, or retrieval policy.
v0.8.1 - 2026-08-22¶
Fixed¶
- Fixed cursor continuation for enhanced search and saved-filter runs by accepting
next_page_tokeninSearchHelpers.issues()andFiltersHelpers.run()and forwarding it toIssueSearch.enhanced_search(). Each call returns one raw Jira page; callers must pass the returnednextPageTokento request the next page.
v0.8.0 - 2026-06-28¶
Added¶
- Added opt-in complete JSON credential files through
credentials_file, with explicit constructor values taking precedence over file values and environment variables. No default credential-file path is used. - Expanded Jira Cloud operation coverage with current-user/auth status, issue transitions, comment update/delete, attachment list/metadata/download/upload/delete, issue-link listing, project lookup, status and priority metadata, and saved-filter list/search/run operations.
- Added low-level worklog add/update/delete operations and high-level worklog list/add/update/delete workflows on the paginated retrieval API introduced in
v0.6.0. - Added agent-readable authentication failures and explicit attachment upload/delete result contracts.
v0.7.0 - 2026-06-25¶
Added¶
- Added
jira2py.helpers.JiraHelpers, a grouped high-level workflow facade around the unchanged low-levelJiraAPI. - Added grouped helper entry points for
issues,search,comments,worklogs,attachments,metadata, andlinks. - Added
HelperResultand helper-layer errors for readable workflow output plus structured data. - Added validation that rejects supplying an issue description both through
IssueHelpers.create(description=...)and through itsfieldsmapping, avoiding an ambiguous create payload.
Documentation¶
- Documented when to use low-level
JiraAPIvs high-levelJiraHelpers. - Added high-level helper guide/API reference pages and a repository example.
- Documented that private helper internals such as
jira2py.helpers._adfandjira2py.helpers._textare internal implementation details, not supported public API.
v0.6.0 - 2026-06-25¶
Added¶
- Added the low-level
IssueWorklogsAPI atJiraAPI.worklogsfor paginated issue-worklog retrieval.
v0.5.0 - 2026-06-23¶
Compatibility-honest minor release for accepted caller-visible behavior changes that should not be framed as a patch-only update.
Compatibility notes¶
extra_paramsandextra_dataoverride named query/body fields when the same keys are provided in both places.JiraAuthenticationErrorsubclassesJiraAPIError, so broadexcept JiraAPIErrorhandlers also catch authentication/authorization failures.search.enhanced_search()omits optionalNonevalues from the request body instead of sending JSONnull.
Documentation¶
- Clarified the caller-visible precedence behavior for
extra_paramsandextra_data. - Documented the
JiraAuthenticationError/JiraAPIErrorhierarchy and shared API error metadata (status_code,response, anderror_messages) when available. - Documented that
search.enhanced_search()omits optionalNonevalues from the request body.
Tooling¶
- Added a reusable version bump helper plus safer release-prep and tag-push automation for the
dev -> PR -> main -> tagrelease flow.
v0.4.0¶
Breaking Changes¶
-
New entry point — The library is now accessed through a single
JiraAPIfacade. The previous per-class imports (from jira2py import Issues) have been removed. See Installation for the new usage. -
Constructor parameter names changed:
v0.3.x v0.4.0 jira_urlurljira_userusernamejira_api_tokenapi_token -
raw_responsemode removed — All methods return parsed JSON (dict,list, orNone). -
Method signature changes — Several methods had parameters removed in favor of
extra_params/extra_data. See API Reference — Conventions for how to pass additional parameters.get_issue()— removed:fields_by_keys,properties,update_history,fail_fastedit_issue()— removed:override_screen_security,override_editable_flag,history_metadata,properties,transitions,update,additional_propertiesenhanced_search()— removed:properties,fields_by_keys,fail_fast,reconcile_issues
-
Return type changes:
edit_issue()returnsNoneon success instead ofTrue. Returnsdictwhenreturn_issue=True.get_changelogs()returns the full paginated response dict instead of just the values list.
-
Error types changed — All errors were previously raised as
ValueError. They are now specific exception types. See Error Handling. -
Pydantic validation removed —
@validate_calldecorators are no longer used. Type hints remain for IDE support and static analysis.
New Features¶
-
Unified API facade — Single
JiraAPIentry point with access to all modules via properties (jira.issues,jira.search,jira.comments, etc.). -
Automatic rate limit handling — Requests that receive HTTP 429 are retried automatically with exponential backoff and
Retry-Afterheader support. See Rate Limiting. -
Structured exception hierarchy — Typed exceptions for authentication errors, not found, validation failures, rate limits, and connection issues. See Error Handling.
-
11 new API methods:
Method Description issues.create_issue()Create a new issue issues.get_edit_metadata()Get fields available for editing issues.get_create_issue_types()Get issue types for a project issues.get_create_fields()Get fields for creating an issue type comments.add_comment()Add a comment to an issue issue_links.get_link_types()List available link types issue_links.create_link()Link two issues issue_links.delete_link()Delete an issue link attachments.get_attachment_metadata()Get attachment metadata projects.search_projects()Search and list projects users.search_users()Search users by name or email -
HTTP/2 support with persistent connections and configurable timeouts.
-
PEP 561 compliant —
py.typedmarker included for downstream type checking.
Bug Fixes¶
get_comments()ordering — Fixed theorder_byquery parameter name fromorderbytoorderBy. The incorrect name was silently ignored by Jira, so comments were always returned in default order.
Documentation¶
-
Migrated from Sphinx to MkDocs Material — complete rewrite of all documentation with new content, Material theme (light/dark toggle, navigation tabs, search, code copy, content tabs).
-
Machine-readable documentation for AI agents:
llms.txt/llms-full.txt— following the llmstxt.org standard, generated by mkdocs-llmstxtapi-reference.json— full API schema with signatures, types, and docstrings, generated from source code by griffe
-
Documentation dependency changes:
Removed Added sphinxmkdocs-materialpydata-sphinx-thememkdocssphinx-sitemapmkdocs-llmstxtgriffe
Dependency Changes¶
| Removed | Added |
|---|---|
requests |
httpx[http2] |
pydantic |
tenacity |
pydantic-core |
|
email-validator |
|
python-dotenv |
v0.3.1¶
Initial public release.