github2gerrit 1.0.6__tar.gz → 1.0.7__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/.pre-commit-config.yaml +1 -1
  2. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/PKG-INFO +1 -1
  3. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/src/github2gerrit/core.py +6 -5
  4. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/src/github2gerrit/models.py +6 -1
  5. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_core_close_pr_policy.py +58 -4
  6. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_duplicate_detection.py +10 -2
  7. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/uv.lock +6 -6
  8. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/.editorconfig +0 -0
  9. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/.gitignore +0 -0
  10. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/.gitlint +0 -0
  11. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/.markdownlint.yaml +0 -0
  12. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/.readthedocs.yml +0 -0
  13. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/.yamllint +0 -0
  14. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/LICENSE +0 -0
  15. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/LICENSES/Apache-2.0.txt +0 -0
  16. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/README.md +0 -0
  17. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/REUSE.toml +0 -0
  18. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/action.yaml +0 -0
  19. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/docs/COMPOSITE_ACTION_TESTING.md +0 -0
  20. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/docs/PR_UPDATE_IMPLEMENTATION.md +0 -0
  21. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/docs/RELEASE-v0.2.0.md +0 -0
  22. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/docs/github2gerrit_token_permissions_classic.png +0 -0
  23. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/pyproject.toml +0 -0
  24. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/sitecustomize.py +0 -0
  25. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/src/github2gerrit/__init__.py +0 -0
  26. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/src/github2gerrit/cli.py +0 -0
  27. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/src/github2gerrit/commit_normalization.py +0 -0
  28. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/src/github2gerrit/config.py +0 -0
  29. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/src/github2gerrit/constants.py +0 -0
  30. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/src/github2gerrit/duplicate_detection.py +0 -0
  31. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/src/github2gerrit/error_codes.py +0 -0
  32. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/src/github2gerrit/external_api.py +0 -0
  33. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/src/github2gerrit/gerrit_pr_closer.py +0 -0
  34. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/src/github2gerrit/gerrit_query.py +0 -0
  35. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/src/github2gerrit/gerrit_rest.py +0 -0
  36. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/src/github2gerrit/gerrit_urls.py +0 -0
  37. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/src/github2gerrit/github_api.py +0 -0
  38. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/src/github2gerrit/gitutils.py +0 -0
  39. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/src/github2gerrit/mapping_comment.py +0 -0
  40. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/src/github2gerrit/netrc.py +0 -0
  41. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/src/github2gerrit/orchestrator/__init__.py +0 -0
  42. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/src/github2gerrit/orchestrator/reconciliation.py +0 -0
  43. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/src/github2gerrit/pr_content_filter.py +0 -0
  44. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/src/github2gerrit/reconcile_matcher.py +0 -0
  45. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/src/github2gerrit/rich_display.py +0 -0
  46. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/src/github2gerrit/rich_logging.py +0 -0
  47. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/src/github2gerrit/similarity.py +0 -0
  48. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/src/github2gerrit/ssh_agent_setup.py +0 -0
  49. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/src/github2gerrit/ssh_common.py +0 -0
  50. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/src/github2gerrit/ssh_config_parser.py +0 -0
  51. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/src/github2gerrit/ssh_discovery.py +0 -0
  52. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/src/github2gerrit/trailers.py +0 -0
  53. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/src/github2gerrit/utils.py +0 -0
  54. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/conftest.py +0 -0
  55. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/fixtures/__init__.py +0 -0
  56. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/fixtures/make_repo.py +0 -0
  57. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/fixtures/ssh_config_samples.py +0 -0
  58. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_action_environment_mapping.py +0 -0
  59. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_action_outputs.py +0 -0
  60. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_action_pr_number_handling.py +0 -0
  61. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_action_step_validation.py +0 -0
  62. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_automation_only.py +0 -0
  63. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_change_id_deduplication.py +0 -0
  64. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_cli.py +0 -0
  65. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_cli_helpers.py +0 -0
  66. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_cli_netrc_options.py +0 -0
  67. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_cli_outputs_file.py +0 -0
  68. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_cli_url_and_dryrun.py +0 -0
  69. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_commit_normalization.py +0 -0
  70. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_composite_action_coverage.py +0 -0
  71. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_config_and_reviewers.py +0 -0
  72. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_config_helpers.py +0 -0
  73. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_core_config_and_errors.py +0 -0
  74. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_core_gerrit_backref_comment.py +0 -0
  75. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_core_gerrit_push_errors.py +0 -0
  76. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_core_gerrit_rest_results.py +0 -0
  77. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_core_integration_fixture_repo.py +0 -0
  78. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_core_prepare_commits.py +0 -0
  79. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_core_shallow_clone.py +0 -0
  80. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_core_ssh_setup.py +0 -0
  81. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_core_ssrf_protection.py +0 -0
  82. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_email_case_normalization.py +0 -0
  83. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_error_codes.py +0 -0
  84. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_external_api_framework.py +0 -0
  85. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_force_flag_cli.py +0 -0
  86. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_gerrit_change_id_footer.py +0 -0
  87. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_gerrit_change_status_checks.py +0 -0
  88. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_gerrit_pr_closer.py +0 -0
  89. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_gerrit_rest_client.py +0 -0
  90. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_gerrit_urls.py +0 -0
  91. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_gerrit_urls_more.py +0 -0
  92. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_ghe_and_gitreview_args.py +0 -0
  93. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_github_api_error_handling.py +0 -0
  94. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_github_api_helpers.py +0 -0
  95. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_github_api_retry_and_helpers.py +0 -0
  96. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_gitutils_helpers.py +0 -0
  97. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_mapping_comment_additional.py +0 -0
  98. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_mapping_comment_digest_and_backref.py +0 -0
  99. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_metadata_and_reconciliation.py +0 -0
  100. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_metadata_trailer_separation_bug.py +0 -0
  101. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_misc_small_coverage.py +0 -0
  102. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_netrc.py +0 -0
  103. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_orphan_rest_side_effects.py +0 -0
  104. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_pr_content_filter.py +0 -0
  105. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_pr_content_filter_integration.py +0 -0
  106. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_pr_update_detection.py +0 -0
  107. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_reconciliation_extracted_module.py +0 -0
  108. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_reconciliation_plan_and_orphans.py +0 -0
  109. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_reconciliation_scenarios.py +0 -0
  110. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_ssh_agent.py +0 -0
  111. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_ssh_agent_ownership.py +0 -0
  112. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_ssh_artifact_prevention.py +0 -0
  113. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_ssh_common.py +0 -0
  114. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_ssh_discovery.py +0 -0
  115. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_ssh_discovery_dry_run.py +0 -0
  116. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_trailers_additional.py +0 -0
  117. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_url_parser.py +0 -0
  118. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/test_utils.py +0 -0
  119. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/unit/test_config_integration.py +0 -0
  120. {github2gerrit-1.0.6 → github2gerrit-1.0.7}/tests/unit/test_ssh_config_parser.py +0 -0
@@ -59,7 +59,7 @@ repos:
59
59
  types: [yaml]
60
60
 
61
61
  - repo: https://github.com/astral-sh/ruff-pre-commit
62
- rev: fa93bc3224c614a0e9786d3e2d3d48edcca246eb # frozen: v0.15.1
62
+ rev: 0839f92796ae388643a08a21640a029b322be5c2 # frozen: v0.15.2
63
63
  hooks:
64
64
  - id: ruff
65
65
  files: ^(src|scripts|tests)/.+\.py$
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: github2gerrit
3
- Version: 1.0.6
3
+ Version: 1.0.7
4
4
  Summary: Submit a GitHub pull request to a Gerrit repository.
5
5
  Project-URL: Homepage, https://github.com/lfreleng-actions/github2gerrit-action
6
6
  Project-URL: Repository, https://github.com/lfreleng-actions/github2gerrit-action
@@ -3424,7 +3424,7 @@ class Orchestrator:
3424
3424
  )
3425
3425
  if (
3426
3426
  not sync_all_prs
3427
- and gh.event_name == "pull_request_target"
3427
+ and gh.event_name in ("pull_request", "pull_request_target")
3428
3428
  and gh.event_action in ("reopened", "synchronize")
3429
3429
  ):
3430
3430
  try:
@@ -5518,8 +5518,9 @@ class Orchestrator:
5518
5518
  self,
5519
5519
  gh: GitHubContext,
5520
5520
  ) -> None:
5521
- """Close the PR if policy requires (pull_request_target events).
5521
+ """Close the PR if policy requires.
5522
5522
 
5523
+ Supports both ``pull_request`` and ``pull_request_target`` triggers.
5523
5524
  When PRESERVE_GITHUB_PRS is true, skip closing PRs (useful for testing).
5524
5525
  """
5525
5526
  # Respect PRESERVE_GITHUB_PRS to avoid closing PRs during tests
@@ -5530,9 +5531,9 @@ class Orchestrator:
5530
5531
  gh.pr_number,
5531
5532
  )
5532
5533
  return
5533
- # The current shell action closes PR on pull_request_target events.
5534
- if gh.event_name != "pull_request_target":
5535
- log.debug("Event is not pull_request_target; not closing PR")
5534
+ # Close PRs on pull_request or pull_request_target events.
5535
+ if gh.event_name not in ("pull_request", "pull_request_target"):
5536
+ log.debug("Event is not a pull_request event; not closing PR")
5536
5537
  return
5537
5538
  log.info("Closing PR #%s", gh.pr_number)
5538
5539
  try:
@@ -117,10 +117,15 @@ class GitHubContext:
117
117
  def get_operation_mode(self) -> PROperationMode:
118
118
  """Determine the operation mode based on event type and action.
119
119
 
120
+ Supports both ``pull_request`` and ``pull_request_target`` triggers.
121
+ Using ``pull_request`` is preferred for security (avoids granting
122
+ secrets to untrusted fork code), while ``pull_request_target`` is
123
+ accepted for backward compatibility.
124
+
120
125
  Returns:
121
126
  PROperationMode enum indicating the type of operation
122
127
  """
123
- if self.event_name != "pull_request_target":
128
+ if self.event_name not in ("pull_request", "pull_request_target"):
124
129
  return PROperationMode.UNKNOWN
125
130
 
126
131
  action = self.event_action.lower() if self.event_action else ""
@@ -58,16 +58,16 @@ def test_close_pr_skipped_when_preserve_github_prs_true(
58
58
  orch._close_pull_request_if_required(gh)
59
59
 
60
60
 
61
- def test_close_pr_not_invoked_for_non_target_event(
61
+ def test_close_pr_not_invoked_for_non_pr_event(
62
62
  tmp_path: Path, monkeypatch: pytest.MonkeyPatch
63
63
  ) -> None:
64
64
  # Ensure preservation is disabled so only event controls behavior
65
65
  monkeypatch.delenv("PRESERVE_GITHUB_PRS", raising=False)
66
66
 
67
- # Non-target event should not attempt to close
67
+ # Non-PR events (e.g. workflow_dispatch, push) should not attempt to close
68
68
  def _fail(*args: Any, **kwargs: Any) -> Any:
69
69
  raise AssertionError(
70
- "GitHub API should not be called for non-target events"
70
+ "GitHub API should not be called for non-PR events"
71
71
  )
72
72
 
73
73
  monkeypatch.setattr("github2gerrit.core.build_client", _fail)
@@ -75,12 +75,66 @@ def test_close_pr_not_invoked_for_non_target_event(
75
75
  monkeypatch.setattr("github2gerrit.core.get_pull", _fail)
76
76
  monkeypatch.setattr("github2gerrit.core.close_pr", _fail)
77
77
 
78
+ orch = Orchestrator(workspace=tmp_path)
79
+ gh = _gh_ctx(event_name="workflow_dispatch", pr_number=42)
80
+
81
+ # Act: should no-op for non-PR events
82
+ orch._close_pull_request_if_required(gh)
83
+
84
+
85
+ def test_close_pr_invoked_for_pull_request_event(
86
+ tmp_path: Path, monkeypatch: pytest.MonkeyPatch
87
+ ) -> None:
88
+ """Verify that pull_request events (not just pull_request_target) close PRs.
89
+
90
+ The code now supports both ``pull_request`` and ``pull_request_target``
91
+ triggers. Using ``pull_request`` is preferred for security.
92
+ """
93
+ # Ensure preservation is disabled so closing is allowed
94
+ monkeypatch.delenv("PRESERVE_GITHUB_PRS", raising=False)
95
+
96
+ calls: dict[str, Any] = {}
97
+
98
+ class DummyClient:
99
+ pass
100
+
101
+ class DummyRepo:
102
+ pass
103
+
104
+ class DummyPR:
105
+ def __init__(self, number: int) -> None:
106
+ self.number = number
107
+ self.closed_state: str | None = None
108
+
109
+ # Patch the GitHub helper functions used by the close path
110
+ monkeypatch.setattr("github2gerrit.core.build_client", DummyClient)
111
+ monkeypatch.setattr(
112
+ "github2gerrit.core.get_repo_from_env", lambda _c: DummyRepo()
113
+ )
114
+
115
+ def _get_pull(_repo: DummyRepo, number: int) -> DummyPR:
116
+ calls["get_pull_number"] = number
117
+ return DummyPR(number)
118
+
119
+ def _close_pr(pr: DummyPR, *, comment: str | None = None) -> None:
120
+ calls["closed_pr_number"] = pr.number
121
+ calls["comment"] = comment
122
+ pr.closed_state = "closed"
123
+
124
+ monkeypatch.setattr("github2gerrit.core.get_pull", _get_pull)
125
+ monkeypatch.setattr("github2gerrit.core.close_pr", _close_pr)
126
+
78
127
  orch = Orchestrator(workspace=tmp_path)
79
128
  gh = _gh_ctx(event_name="pull_request", pr_number=42)
80
129
 
81
- # Act: should no-op
130
+ # Act: pull_request events should now close the PR
82
131
  orch._close_pull_request_if_required(gh)
83
132
 
133
+ # Assert
134
+ assert calls.get("get_pull_number") == 42
135
+ assert calls.get("closed_pr_number") == 42
136
+ assert calls.get("comment") == "Auto-closing pull request"
137
+
84
138
 
85
139
  def test_close_pr_invoked_for_pull_request_target_event(
86
140
  tmp_path: Path, monkeypatch: pytest.MonkeyPatch
@@ -425,7 +425,10 @@ project=test/project.git
425
425
 
426
426
  responses.add(
427
427
  responses.GET,
428
- re.compile(r"https://gerrit\.example\.org/a?/?changes/\?.*"),
428
+ re.compile(
429
+ r"https://gerrit\.example\.org"
430
+ r"(/[a-z]+)?/a?/?changes/\?.*"
431
+ ),
429
432
  json=gerrit_response,
430
433
  status=200,
431
434
  )
@@ -435,6 +438,7 @@ project=test/project.git
435
438
  {
436
439
  "GERRIT_SERVER": "gerrit.example.org",
437
440
  "GERRIT_PROJECT": "test/project",
441
+ "GERRIT_HTTP_BASE_PATH": "r",
438
442
  },
439
443
  ):
440
444
  with pytest.raises(DuplicateChangeError) as exc_info:
@@ -489,7 +493,10 @@ project=test/project.git
489
493
 
490
494
  responses.add(
491
495
  responses.GET,
492
- re.compile(r"https://gerrit\.example\.org/a?/?changes/\?.*"),
496
+ re.compile(
497
+ r"https://gerrit\.example\.org"
498
+ r"(/[a-z]+)?/a?/?changes/\?.*"
499
+ ),
493
500
  json=gerrit_response,
494
501
  status=200,
495
502
  )
@@ -499,6 +506,7 @@ project=test/project.git
499
506
  {
500
507
  "GERRIT_SERVER": "gerrit.example.org",
501
508
  "GERRIT_PROJECT": "test/project",
509
+ "GERRIT_HTTP_BASE_PATH": "r",
502
510
  },
503
511
  ):
504
512
  # Should NOT raise when allow_duplicates=True
@@ -415,7 +415,7 @@ wheels = [
415
415
 
416
416
  [[package]]
417
417
  name = "hatchling"
418
- version = "1.28.0"
418
+ version = "1.29.0"
419
419
  source = { registry = "https://pypi.org/simple" }
420
420
  dependencies = [
421
421
  { name = "packaging" },
@@ -423,9 +423,9 @@ dependencies = [
423
423
  { name = "pluggy" },
424
424
  { name = "trove-classifiers" },
425
425
  ]
426
- sdist = { url = "https://files.pythonhosted.org/packages/0b/8e/e480359492affde4119a131da729dd26da742c2c9b604dff74836e47eef9/hatchling-1.28.0.tar.gz", hash = "sha256:4d50b02aece6892b8cd0b3ce6c82cb218594d3ec5836dbde75bf41a21ab004c8", size = 55365, upload-time = "2025-11-27T00:31:13.766Z" }
426
+ sdist = { url = "https://files.pythonhosted.org/packages/cf/9c/b4cfe330cd4f49cff17fd771154730555fa4123beb7f292cf0098b4e6c20/hatchling-1.29.0.tar.gz", hash = "sha256:793c31816d952cee405b83488ce001c719f325d9cda69f1fc4cd750527640ea6", size = 55656, upload-time = "2026-02-23T19:42:06.539Z" }
427
427
  wheels = [
428
- { url = "https://files.pythonhosted.org/packages/0d/a5/48cb7efb8b4718b1a4c0c331e3364a3a33f614ff0d6afd2b93ee883d3c47/hatchling-1.28.0-py3-none-any.whl", hash = "sha256:dc48722b68b3f4bbfa3ff618ca07cdea6750e7d03481289ffa8be1521d18a961", size = 76075, upload-time = "2025-11-27T00:31:12.544Z" },
428
+ { url = "https://files.pythonhosted.org/packages/d3/8a/44032265776062a89171285ede55a0bdaadc8ac00f27f0512a71a9e3e1c8/hatchling-1.29.0-py3-none-any.whl", hash = "sha256:50af9343281f34785fab12da82e445ed987a6efb34fd8c2fc0f6e6630dbcc1b0", size = 76356, upload-time = "2026-02-23T19:42:05.197Z" },
429
429
  ]
430
430
 
431
431
  [[package]]
@@ -965,7 +965,7 @@ wheels = [
965
965
 
966
966
  [[package]]
967
967
  name = "typer"
968
- version = "0.24.0"
968
+ version = "0.24.1"
969
969
  source = { registry = "https://pypi.org/simple" }
970
970
  dependencies = [
971
971
  { name = "annotated-doc" },
@@ -973,9 +973,9 @@ dependencies = [
973
973
  { name = "rich" },
974
974
  { name = "shellingham" },
975
975
  ]
976
- sdist = { url = "https://files.pythonhosted.org/packages/5a/b6/3e681d3b6bb22647509bdbfdd18055d5adc0dce5c5585359fa46ff805fdc/typer-0.24.0.tar.gz", hash = "sha256:f9373dc4eff901350694f519f783c29b6d7a110fc0dcc11b1d7e353b85ca6504", size = 118380, upload-time = "2026-02-16T22:08:48.496Z" }
976
+ sdist = { url = "https://files.pythonhosted.org/packages/f5/24/cb09efec5cc954f7f9b930bf8279447d24618bb6758d4f6adf2574c41780/typer-0.24.1.tar.gz", hash = "sha256:e39b4732d65fbdcde189ae76cf7cd48aeae72919dea1fdfc16593be016256b45", size = 118613, upload-time = "2026-02-21T16:54:40.609Z" }
977
977
  wheels = [
978
- { url = "https://files.pythonhosted.org/packages/85/d0/4da85c2a45054bb661993c93524138ace4956cb075a7ae0c9d1deadc331b/typer-0.24.0-py3-none-any.whl", hash = "sha256:5fc435a9c8356f6160ed6e85a6301fdd6e3d8b2851da502050d1f92c5e9eddc8", size = 56441, upload-time = "2026-02-16T22:08:47.535Z" },
978
+ { url = "https://files.pythonhosted.org/packages/4a/91/48db081e7a63bb37284f9fbcefda7c44c277b18b0e13fbc36ea2335b71e6/typer-0.24.1-py3-none-any.whl", hash = "sha256:112c1f0ce578bfb4cab9ffdabc68f031416ebcc216536611ba21f04e9aa84c9e", size = 56085, upload-time = "2026-02-21T16:54:41.616Z" },
979
979
  ]
980
980
 
981
981
  [[package]]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes