python-gitea 0.12.2__tar.gz → 0.13.1__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 (430) hide show
  1. {python_gitea-0.12.2 → python_gitea-0.13.1}/.github/workflows/codeql.yml +3 -3
  2. {python_gitea-0.12.2 → python_gitea-0.13.1}/.github/workflows/scheduled_release.yml +1 -1
  3. {python_gitea-0.12.2 → python_gitea-0.13.1}/.github/workflows/support_floor_update.yml +1 -1
  4. {python_gitea-0.12.2 → python_gitea-0.13.1}/.pre-commit-config.yaml +4 -4
  5. {python_gitea-0.12.2 → python_gitea-0.13.1}/PKG-INFO +1 -1
  6. {python_gitea-0.12.2 → python_gitea-0.13.1}/docs/user-guide/cli.md +46 -13
  7. {python_gitea-0.12.2 → python_gitea-0.13.1}/pyproject.toml +2 -2
  8. python_gitea-0.13.1/src/gitea/cli/issue/get.py +241 -0
  9. python_gitea-0.13.1/src/gitea/cli/issue/ids.py +85 -0
  10. python_gitea-0.13.1/src/gitea/cli/issue/list.py +247 -0
  11. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/project/column/issues.py +27 -3
  12. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/project/column/list.py +11 -1
  13. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/project/issues.py +9 -1
  14. python_gitea-0.13.1/src/gitea/cli/utils/projection.py +61 -0
  15. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/issue/project_column.py +123 -19
  16. python_gitea-0.13.1/tests/cli/issue/test_cli_issue_columns.py +214 -0
  17. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/issue/test_cli_issue_get.py +135 -6
  18. python_gitea-0.13.1/tests/cli/issue/test_cli_issue_multi_read.py +435 -0
  19. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/project/test_cli_project_column_issues.py +217 -4
  20. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/test_cli_contract.py +11 -1
  21. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/test_cli_main.py +19 -3
  22. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/issue/test_issue_project_column.py +98 -1
  23. {python_gitea-0.12.2 → python_gitea-0.13.1}/uv.lock +505 -424
  24. python_gitea-0.12.2/src/gitea/cli/issue/get.py +0 -98
  25. python_gitea-0.12.2/src/gitea/cli/issue/list.py +0 -153
  26. {python_gitea-0.12.2 → python_gitea-0.13.1}/.coderabbit.yaml +0 -0
  27. {python_gitea-0.12.2 → python_gitea-0.13.1}/.github/ISSUE_TEMPLATE/bug-report.md +0 -0
  28. {python_gitea-0.12.2 → python_gitea-0.13.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  29. {python_gitea-0.12.2 → python_gitea-0.13.1}/.github/ISSUE_TEMPLATE/feature-request.md +0 -0
  30. {python_gitea-0.12.2 → python_gitea-0.13.1}/.github/pull_request_template.md +0 -0
  31. {python_gitea-0.12.2 → python_gitea-0.13.1}/.github/workflows/ci.yml +0 -0
  32. {python_gitea-0.12.2 → python_gitea-0.13.1}/.github/workflows/documentation.yml +0 -0
  33. {python_gitea-0.12.2 → python_gitea-0.13.1}/.github/workflows/draft_release.yml +0 -0
  34. {python_gitea-0.12.2 → python_gitea-0.13.1}/.github/workflows/publish.yml +0 -0
  35. {python_gitea-0.12.2 → python_gitea-0.13.1}/.github/workflows/publish_testpypi.yml +0 -0
  36. {python_gitea-0.12.2 → python_gitea-0.13.1}/.github/workflows/release.yml +0 -0
  37. {python_gitea-0.12.2 → python_gitea-0.13.1}/.github/workflows/semantic_pull_request.yml +0 -0
  38. {python_gitea-0.12.2 → python_gitea-0.13.1}/.gitignore +0 -0
  39. {python_gitea-0.12.2 → python_gitea-0.13.1}/.markdownlint.yaml +0 -0
  40. {python_gitea-0.12.2 → python_gitea-0.13.1}/.prettierrc +0 -0
  41. {python_gitea-0.12.2 → python_gitea-0.13.1}/.pypirc +0 -0
  42. {python_gitea-0.12.2 → python_gitea-0.13.1}/.typos.toml +0 -0
  43. {python_gitea-0.12.2 → python_gitea-0.13.1}/CITATION.cff +0 -0
  44. {python_gitea-0.12.2 → python_gitea-0.13.1}/CODE_OF_CONDUCT.md +0 -0
  45. {python_gitea-0.12.2 → python_gitea-0.13.1}/CONTRIBUTING.md +0 -0
  46. {python_gitea-0.12.2 → python_gitea-0.13.1}/LICENSE +0 -0
  47. {python_gitea-0.12.2 → python_gitea-0.13.1}/README.md +0 -0
  48. {python_gitea-0.12.2 → python_gitea-0.13.1}/SECURITY.md +0 -0
  49. {python_gitea-0.12.2 → python_gitea-0.13.1}/SUPPORT.md +0 -0
  50. {python_gitea-0.12.2 → python_gitea-0.13.1}/cliff.toml +0 -0
  51. {python_gitea-0.12.2 → python_gitea-0.13.1}/docs/contributing.md +0 -0
  52. {python_gitea-0.12.2 → python_gitea-0.13.1}/docs/dev/architecture.md +0 -0
  53. {python_gitea-0.12.2 → python_gitea-0.13.1}/docs/dev/troubleshooting.md +0 -0
  54. {python_gitea-0.12.2 → python_gitea-0.13.1}/docs/gen_ref_pages.py +0 -0
  55. {python_gitea-0.12.2 → python_gitea-0.13.1}/docs/index.md +0 -0
  56. {python_gitea-0.12.2 → python_gitea-0.13.1}/docs/javascripts/mathjax.js +0 -0
  57. {python_gitea-0.12.2 → python_gitea-0.13.1}/docs/security.md +0 -0
  58. {python_gitea-0.12.2 → python_gitea-0.13.1}/docs/style/api.css +0 -0
  59. {python_gitea-0.12.2 → python_gitea-0.13.1}/docs/user-guide/configuration.md +0 -0
  60. {python_gitea-0.12.2 → python_gitea-0.13.1}/docs/user-guide/installation.md +0 -0
  61. {python_gitea-0.12.2 → python_gitea-0.13.1}/docs/user-guide/python-api.md +0 -0
  62. {python_gitea-0.12.2 → python_gitea-0.13.1}/docs/user-guide/quickstart.md +0 -0
  63. {python_gitea-0.12.2 → python_gitea-0.13.1}/mkdocs.yml +0 -0
  64. {python_gitea-0.12.2 → python_gitea-0.13.1}/renovate.json +0 -0
  65. {python_gitea-0.12.2 → python_gitea-0.13.1}/scripts/release_version.py +0 -0
  66. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/__init__.py +0 -0
  67. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/__main__.py +0 -0
  68. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/_lazy.py +0 -0
  69. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/actions/__init__.py +0 -0
  70. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/actions/actions.py +0 -0
  71. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/actions/artifact.py +0 -0
  72. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/actions/async_actions.py +0 -0
  73. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/actions/async_artifact.py +0 -0
  74. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/actions/async_run_management.py +0 -0
  75. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/actions/async_runner.py +0 -0
  76. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/actions/async_secret.py +0 -0
  77. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/actions/async_variable.py +0 -0
  78. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/actions/base.py +0 -0
  79. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/actions/run_management.py +0 -0
  80. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/actions/runner.py +0 -0
  81. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/actions/scope.py +0 -0
  82. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/actions/secret.py +0 -0
  83. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/actions/variable.py +0 -0
  84. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/__init__.py +0 -0
  85. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/actions/__init__.py +0 -0
  86. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/actions/artifact/__init__.py +0 -0
  87. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/actions/artifact/delete.py +0 -0
  88. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/actions/artifact/download.py +0 -0
  89. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/actions/artifact/get.py +0 -0
  90. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/actions/artifact/list.py +0 -0
  91. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/actions/job/__init__.py +0 -0
  92. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/actions/job/get.py +0 -0
  93. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/actions/job/list.py +0 -0
  94. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/actions/job/logs.py +0 -0
  95. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/actions/job/rerun.py +0 -0
  96. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/actions/main.py +0 -0
  97. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/actions/run/__init__.py +0 -0
  98. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/actions/run/approve.py +0 -0
  99. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/actions/run/cancel.py +0 -0
  100. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/actions/run/delete.py +0 -0
  101. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/actions/run/force_cancel.py +0 -0
  102. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/actions/run/get.py +0 -0
  103. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/actions/run/jobs.py +0 -0
  104. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/actions/run/list.py +0 -0
  105. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/actions/run/rerun.py +0 -0
  106. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/actions/runner/__init__.py +0 -0
  107. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/actions/runner/delete.py +0 -0
  108. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/actions/runner/get.py +0 -0
  109. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/actions/runner/list.py +0 -0
  110. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/actions/runner/registration_token.py +0 -0
  111. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/actions/runner/state.py +0 -0
  112. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/actions/runner/update.py +0 -0
  113. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/actions/secret/__init__.py +0 -0
  114. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/actions/secret/delete.py +0 -0
  115. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/actions/secret/list.py +0 -0
  116. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/actions/secret/set.py +0 -0
  117. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/actions/variable/__init__.py +0 -0
  118. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/actions/variable/create.py +0 -0
  119. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/actions/variable/delete.py +0 -0
  120. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/actions/variable/get.py +0 -0
  121. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/actions/variable/list.py +0 -0
  122. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/actions/variable/update.py +0 -0
  123. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/actions/workflow/__init__.py +0 -0
  124. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/actions/workflow/dispatch.py +0 -0
  125. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/actions/workflow/get.py +0 -0
  126. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/actions/workflow/list.py +0 -0
  127. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/comment/__init__.py +0 -0
  128. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/comment/add.py +0 -0
  129. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/comment/delete.py +0 -0
  130. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/comment/edit.py +0 -0
  131. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/comment/list.py +0 -0
  132. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/comment/main.py +0 -0
  133. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/config/__init__.py +0 -0
  134. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/config/add.py +0 -0
  135. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/config/delete.py +0 -0
  136. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/config/list.py +0 -0
  137. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/config/main.py +0 -0
  138. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/config/update.py +0 -0
  139. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/issue/__init__.py +0 -0
  140. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/issue/close.py +0 -0
  141. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/issue/create.py +0 -0
  142. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/issue/dependency/__init__.py +0 -0
  143. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/issue/dependency/add.py +0 -0
  144. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/issue/dependency/list.py +0 -0
  145. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/issue/dependency/main.py +0 -0
  146. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/issue/dependency/remove.py +0 -0
  147. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/issue/edit.py +0 -0
  148. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/issue/label/__init__.py +0 -0
  149. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/issue/label/add.py +0 -0
  150. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/issue/label/clear.py +0 -0
  151. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/issue/label/common.py +0 -0
  152. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/issue/label/list.py +0 -0
  153. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/issue/label/main.py +0 -0
  154. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/issue/label/remove.py +0 -0
  155. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/issue/label/set.py +0 -0
  156. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/issue/main.py +0 -0
  157. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/label/__init__.py +0 -0
  158. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/label/create.py +0 -0
  159. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/label/delete.py +0 -0
  160. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/label/list.py +0 -0
  161. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/label/main.py +0 -0
  162. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/label/update.py +0 -0
  163. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/main.py +0 -0
  164. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/milestone/__init__.py +0 -0
  165. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/milestone/create.py +0 -0
  166. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/milestone/list.py +0 -0
  167. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/milestone/main.py +0 -0
  168. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/notification/__init__.py +0 -0
  169. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/notification/list.py +0 -0
  170. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/notification/main.py +0 -0
  171. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/notification/read.py +0 -0
  172. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/organization/__init__.py +0 -0
  173. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/organization/list.py +0 -0
  174. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/organization/main.py +0 -0
  175. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/output.py +0 -0
  176. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/project/__init__.py +0 -0
  177. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/project/column/__init__.py +0 -0
  178. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/project/column/create.py +0 -0
  179. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/project/create.py +0 -0
  180. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/project/delete.py +0 -0
  181. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/project/edit.py +0 -0
  182. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/project/get.py +0 -0
  183. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/project/issue/__init__.py +0 -0
  184. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/project/issue/add.py +0 -0
  185. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/project/issue/move.py +0 -0
  186. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/project/issue/remove.py +0 -0
  187. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/project/list.py +0 -0
  188. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/project/main.py +0 -0
  189. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/project/show.py +0 -0
  190. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/pull_request/__init__.py +0 -0
  191. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/pull_request/list.py +0 -0
  192. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/pull_request/main.py +0 -0
  193. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/repository/__init__.py +0 -0
  194. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/repository/list.py +0 -0
  195. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/repository/main.py +0 -0
  196. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/user/__init__.py +0 -0
  197. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/user/get.py +0 -0
  198. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/user/main.py +0 -0
  199. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/user/update_settings.py +0 -0
  200. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/utils/__init__.py +0 -0
  201. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/utils/api.py +0 -0
  202. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/utils/auth.py +0 -0
  203. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/utils/convert.py +0 -0
  204. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/utils/errors.py +0 -0
  205. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/utils/issue.py +0 -0
  206. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/utils/options.py +0 -0
  207. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/watch/__init__.py +0 -0
  208. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/watch/advance.py +0 -0
  209. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/watch/list.py +0 -0
  210. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/watch/main.py +0 -0
  211. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/cli/watch/scopes.py +0 -0
  212. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/client/__init__.py +0 -0
  213. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/client/async_gitea.py +0 -0
  214. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/client/base.py +0 -0
  215. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/client/gitea.py +0 -0
  216. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/comment/__init__.py +0 -0
  217. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/comment/async_comment.py +0 -0
  218. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/comment/base.py +0 -0
  219. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/comment/comment.py +0 -0
  220. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/config/__init__.py +0 -0
  221. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/config/manager.py +0 -0
  222. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/config/model.py +0 -0
  223. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/issue/__init__.py +0 -0
  224. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/issue/async_issue.py +0 -0
  225. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/issue/base.py +0 -0
  226. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/issue/issue.py +0 -0
  227. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/label/__init__.py +0 -0
  228. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/label/async_label.py +0 -0
  229. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/label/base.py +0 -0
  230. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/label/label.py +0 -0
  231. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/milestone/__init__.py +0 -0
  232. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/milestone/async_milestone.py +0 -0
  233. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/milestone/base.py +0 -0
  234. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/milestone/milestone.py +0 -0
  235. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/notification/__init__.py +0 -0
  236. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/notification/async_notification.py +0 -0
  237. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/notification/base.py +0 -0
  238. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/notification/notification.py +0 -0
  239. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/organization/__init__.py +0 -0
  240. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/organization/async_organization.py +0 -0
  241. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/organization/base.py +0 -0
  242. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/organization/organization.py +0 -0
  243. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/project/__init__.py +0 -0
  244. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/project/async_project.py +0 -0
  245. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/project/base.py +0 -0
  246. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/project/project.py +0 -0
  247. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/pull_request/__init__.py +0 -0
  248. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/pull_request/async_pull_request.py +0 -0
  249. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/pull_request/base.py +0 -0
  250. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/pull_request/pull_request.py +0 -0
  251. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/repository/__init__.py +0 -0
  252. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/repository/async_repository.py +0 -0
  253. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/repository/base.py +0 -0
  254. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/repository/repository.py +0 -0
  255. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/resource/__init__.py +0 -0
  256. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/resource/async_resource.py +0 -0
  257. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/resource/protocol.py +0 -0
  258. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/resource/resource.py +0 -0
  259. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/user/__init__.py +0 -0
  260. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/user/async_user.py +0 -0
  261. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/user/base.py +0 -0
  262. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/user/user.py +0 -0
  263. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/utils/__init__.py +0 -0
  264. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/utils/fields.py +0 -0
  265. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/utils/log.py +0 -0
  266. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/utils/pagination.py +0 -0
  267. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/utils/response.py +0 -0
  268. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/version.py +0 -0
  269. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/watch/__init__.py +0 -0
  270. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/watch/changes.py +0 -0
  271. {python_gitea-0.12.2 → python_gitea-0.13.1}/src/gitea/watch/state.py +0 -0
  272. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/__init__.py +0 -0
  273. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/actions/__init__.py +0 -0
  274. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/actions/test_actions_base.py +0 -0
  275. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/actions/test_actions_imports.py +0 -0
  276. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/actions/test_actions_requests.py +0 -0
  277. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/actions/test_actions_scope.py +0 -0
  278. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/board.py +0 -0
  279. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/__init__.py +0 -0
  280. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/actions/__init__.py +0 -0
  281. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/actions/invoking.py +0 -0
  282. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/actions/test_cli_actions_artifact.py +0 -0
  283. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/actions/test_cli_actions_job_get.py +0 -0
  284. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/actions/test_cli_actions_job_list.py +0 -0
  285. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/actions/test_cli_actions_job_logs.py +0 -0
  286. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/actions/test_cli_actions_main.py +0 -0
  287. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/actions/test_cli_actions_run_get.py +0 -0
  288. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/actions/test_cli_actions_run_jobs.py +0 -0
  289. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/actions/test_cli_actions_run_list.py +0 -0
  290. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/actions/test_cli_actions_run_management.py +0 -0
  291. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/actions/test_cli_actions_runner.py +0 -0
  292. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/actions/test_cli_actions_secret.py +0 -0
  293. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/actions/test_cli_actions_variable.py +0 -0
  294. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/actions/test_cli_actions_workflow_dispatch.py +0 -0
  295. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/actions/test_cli_actions_workflow_get.py +0 -0
  296. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/actions/test_cli_actions_workflow_list.py +0 -0
  297. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/comment/__init__.py +0 -0
  298. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/comment/test_cli_comment_add.py +0 -0
  299. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/comment/test_cli_comment_delete.py +0 -0
  300. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/comment/test_cli_comment_edit.py +0 -0
  301. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/comment/test_cli_comment_list.py +0 -0
  302. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/comment/test_cli_comment_main.py +0 -0
  303. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/config/__init__.py +0 -0
  304. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/config/test_cli_config_add.py +0 -0
  305. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/config/test_cli_config_delete.py +0 -0
  306. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/config/test_cli_config_list.py +0 -0
  307. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/config/test_cli_config_main.py +0 -0
  308. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/config/test_cli_config_update.py +0 -0
  309. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/envelope.py +0 -0
  310. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/issue/__init__.py +0 -0
  311. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/issue/dependency/__init__.py +0 -0
  312. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/issue/dependency/test_cli_issue_dependency.py +0 -0
  313. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/issue/label/__init__.py +0 -0
  314. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/issue/label/test_cli_issue_label.py +0 -0
  315. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/issue/test_cli_issue_close.py +0 -0
  316. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/issue/test_cli_issue_comment.py +0 -0
  317. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/issue/test_cli_issue_create.py +0 -0
  318. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/issue/test_cli_issue_edit.py +0 -0
  319. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/issue/test_cli_issue_list.py +0 -0
  320. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/issue/test_cli_issue_main.py +0 -0
  321. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/label/__init__.py +0 -0
  322. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/label/test_cli_label_create.py +0 -0
  323. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/label/test_cli_label_delete.py +0 -0
  324. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/label/test_cli_label_list.py +0 -0
  325. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/label/test_cli_label_main.py +0 -0
  326. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/label/test_cli_label_update.py +0 -0
  327. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/milestone/__init__.py +0 -0
  328. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/milestone/test_cli_milestone_create.py +0 -0
  329. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/milestone/test_cli_milestone_list.py +0 -0
  330. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/milestone/test_cli_milestone_main.py +0 -0
  331. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/notification/__init__.py +0 -0
  332. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/notification/test_cli_notification.py +0 -0
  333. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/organization/__init__.py +0 -0
  334. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/organization/test_cli_organization_list.py +0 -0
  335. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/organization/test_cli_organization_main.py +0 -0
  336. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/project/__init__.py +0 -0
  337. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/project/test_cli_project.py +0 -0
  338. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/project/test_cli_project_show.py +0 -0
  339. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/pull_request/__init__.py +0 -0
  340. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/pull_request/test_cli_pull_request_list.py +0 -0
  341. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/pull_request/test_cli_pull_request_main.py +0 -0
  342. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/rendering.py +0 -0
  343. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/repository/__init__.py +0 -0
  344. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/repository/test_cli_repository_list.py +0 -0
  345. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/repository/test_cli_repository_main.py +0 -0
  346. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/test_cli_output.py +0 -0
  347. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/tree.py +0 -0
  348. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/user/__init__.py +0 -0
  349. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/user/test_cli_user_get.py +0 -0
  350. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/user/test_cli_user_update_settings.py +0 -0
  351. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/utils/__init__.py +0 -0
  352. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/utils/test_cli_utils_api.py +0 -0
  353. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/utils/test_cli_utils_auth.py +0 -0
  354. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/utils/test_cli_utils_convert.py +0 -0
  355. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/utils/test_cli_utils_errors.py +0 -0
  356. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/utils/test_cli_utils_issue.py +0 -0
  357. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/utils/test_cli_utils_options.py +0 -0
  358. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/watch/__init__.py +0 -0
  359. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/watch/support.py +0 -0
  360. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/watch/test_cli_watch_advance.py +0 -0
  361. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/watch/test_cli_watch_list.py +0 -0
  362. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/cli/watch/test_cli_watch_scopes.py +0 -0
  363. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/client/__init__.py +0 -0
  364. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/client/test_client_async_gitea.py +0 -0
  365. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/client/test_client_base.py +0 -0
  366. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/client/test_client_gitea.py +0 -0
  367. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/comment/__init__.py +0 -0
  368. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/comment/test_comment_async_comment.py +0 -0
  369. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/comment/test_comment_base.py +0 -0
  370. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/comment/test_comment_comment.py +0 -0
  371. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/config/__init__.py +0 -0
  372. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/config/test_config_manager.py +0 -0
  373. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/config/test_config_model.py +0 -0
  374. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/conftest.py +0 -0
  375. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/issue/__init__.py +0 -0
  376. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/issue/test_issue_async_issue.py +0 -0
  377. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/issue/test_issue_async_project_column.py +0 -0
  378. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/issue/test_issue_base.py +0 -0
  379. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/issue/test_issue_dependencies.py +0 -0
  380. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/issue/test_issue_issue.py +0 -0
  381. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/issue/test_issue_labels.py +0 -0
  382. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/label/__init__.py +0 -0
  383. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/label/test_label_async_label.py +0 -0
  384. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/label/test_label_base.py +0 -0
  385. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/label/test_label_label.py +0 -0
  386. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/milestone/__init__.py +0 -0
  387. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/milestone/test_milestone_async_milestone.py +0 -0
  388. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/milestone/test_milestone_base.py +0 -0
  389. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/milestone/test_milestone_milestone.py +0 -0
  390. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/notification/__init__.py +0 -0
  391. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/notification/test_notification_base.py +0 -0
  392. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/notification/test_notification_notification.py +0 -0
  393. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/organization/__init__.py +0 -0
  394. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/organization/test_organization_async_organization.py +0 -0
  395. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/organization/test_organization_base.py +0 -0
  396. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/organization/test_organization_organization.py +0 -0
  397. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/project/__init__.py +0 -0
  398. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/project/test_project_base.py +0 -0
  399. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/project/test_project_project.py +0 -0
  400. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/project/test_project_requests.py +0 -0
  401. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/pull_request/__init__.py +0 -0
  402. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/pull_request/test_pull_request_async_pull_request.py +0 -0
  403. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/pull_request/test_pull_request_base.py +0 -0
  404. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/pull_request/test_pull_request_pull_request.py +0 -0
  405. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/repository/__init__.py +0 -0
  406. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/repository/test_repository_async_repository.py +0 -0
  407. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/repository/test_repository_base.py +0 -0
  408. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/repository/test_repository_repository.py +0 -0
  409. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/resource/__init__.py +0 -0
  410. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/resource/test_resource_async_resource.py +0 -0
  411. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/resource/test_resource_resource.py +0 -0
  412. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/smoke_test.py +0 -0
  413. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/test_import.py +0 -0
  414. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/test_lazy_reexports.py +0 -0
  415. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/test_main.py +0 -0
  416. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/test_release_version.py +0 -0
  417. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/test_version.py +0 -0
  418. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/transport.py +0 -0
  419. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/user/__init__.py +0 -0
  420. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/user/test_user_async_user.py +0 -0
  421. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/user/test_user_base.py +0 -0
  422. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/user/test_user_user.py +0 -0
  423. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/utils/__init__.py +0 -0
  424. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/utils/test_utils_fields.py +0 -0
  425. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/utils/test_utils_log.py +0 -0
  426. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/utils/test_utils_pagination.py +0 -0
  427. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/utils/test_utils_response.py +0 -0
  428. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/watch/__init__.py +0 -0
  429. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/watch/test_watch_changes.py +0 -0
  430. {python_gitea-0.12.2 → python_gitea-0.13.1}/tests/watch/test_watch_state.py +0 -0
@@ -22,13 +22,13 @@ jobs:
22
22
  uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
23
23
 
24
24
  - name: Initialize CodeQL
25
- uses: github/codeql-action/init@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4
25
+ uses: github/codeql-action/init@24c54180a607b1449ed407dd24f251e4e9147c8d # v4
26
26
  with:
27
27
  languages: python
28
28
  queries: security-and-quality
29
29
 
30
30
  - name: Autobuild
31
- uses: github/codeql-action/autobuild@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4
31
+ uses: github/codeql-action/autobuild@24c54180a607b1449ed407dd24f251e4e9147c8d # v4
32
32
 
33
33
  - name: Perform CodeQL Analysis
34
- uses: github/codeql-action/analyze@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4
34
+ uses: github/codeql-action/analyze@24c54180a607b1449ed407dd24f251e4e9147c8d # v4
@@ -31,7 +31,7 @@ jobs:
31
31
 
32
32
  - name: Check for new commits
33
33
  id: check_commits
34
- uses: isaac-cf-wong/detect-git-changes-action@051225b2ef2faf2a02d61f16d1a027cdf941498d # v0.0.21
34
+ uses: isaac-cf-wong/detect-git-changes-action@9863c3c0ba155ed10b54072f711ae8807aedbc87 # v0.0.22
35
35
  with:
36
36
  use-latest-tag: true
37
37
 
@@ -22,7 +22,7 @@ jobs:
22
22
 
23
23
  - name: Apply support policy (spec0, from pyproject tool table)
24
24
  id: policy
25
- uses: isaac-cf-wong/dependency-support-policy-action@af9e20cfdcb7d14a4c08614e981e8c2339d3da0f # v0.2.11
25
+ uses: isaac-cf-wong/dependency-support-policy-action@f83b1c576c82b2a7dde5d3c38c222d68b76bb9cf # v0.2.12
26
26
  with:
27
27
  mode: update
28
28
 
@@ -16,7 +16,7 @@ repos:
16
16
  - id: check-json
17
17
 
18
18
  - repo: https://github.com/astral-sh/ruff-pre-commit
19
- rev: v0.16.10
19
+ rev: v0.17.0
20
20
  hooks:
21
21
  - id: ruff
22
22
  args: [--fix, --config=pyproject.toml]
@@ -28,13 +28,13 @@ repos:
28
28
  - id: taplo-format
29
29
 
30
30
  - repo: https://github.com/crate-ci/typos
31
- rev: v1.50.3
31
+ rev: v1.51.1
32
32
  hooks:
33
33
  - id: typos
34
34
  args: []
35
35
 
36
36
  - repo: https://github.com/rbubley/mirrors-prettier
37
- rev: v3.9.9
37
+ rev: v3.9.10
38
38
  hooks:
39
39
  - id: prettier
40
40
 
@@ -52,7 +52,7 @@ repos:
52
52
  - id: actionlint
53
53
 
54
54
  - repo: https://github.com/astral-sh/uv-pre-commit
55
- rev: 0.12.23
55
+ rev: 0.13.0
56
56
  hooks:
57
57
  # Update the uv lockfile
58
58
  - id: uv-lock
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: python-gitea
3
- Version: 0.12.2
3
+ Version: 0.13.1
4
4
  Summary: A Python package for interacting with the Gitea API, offering a simple interface to access repositories, users, organizations, issues, and more for automation and data management.
5
5
  Project-URL: Documentation, https://isaac-cf-wong.github.io/python-gitea
6
6
  Project-URL: Source, https://github.com/isaac-cf-wong/python-gitea
@@ -74,10 +74,10 @@ non-zero, so nothing is printed on stdout for a failed command. Log output also
74
74
  goes to stderr in both formats, so stdout stays parsable.
75
75
 
76
76
  One failure is deliberately not an error: the board lookup that fills in the
77
- `column_id` of `issue get`. A refused, timed-out or otherwise failed lookup logs
78
- a warning to stderr and reports that project's column as `null`, because the
79
- issue the command was asked for has already been retrieved and is not worth
80
- failing over an enrichment of it.
77
+ `column_id` of `issue get`, unless `--no-columns` turns it off. A refused,
78
+ timed-out or otherwise failed lookup logs a warning to stderr and reports that
79
+ project's column as `null`, because the issue the command was asked for has
80
+ already been retrieved and is not worth failing over an enrichment of it.
81
81
 
82
82
  Tokens are never included in the output of `config` commands in either format.
83
83
 
@@ -91,9 +91,9 @@ which command fetched it.
91
91
 
92
92
  A field the API cannot send is added only where it carries something the API has
93
93
  no way of saying, and is documented with the command that adds it: `column_id`
94
- on the project entries of `issue get`, and `issue_count` and `issue_ids` on the
95
- columns of `project show`, are the ones today. Such a field is never a second
96
- name for a field already in the payload.
94
+ on the project entries of `issue get` (omitted under `--no-columns`), and
95
+ `issue_count` and `issue_ids` on the columns of `project show`, are the ones
96
+ today. Such a field is never a second name for a field already in the payload.
97
97
 
98
98
  Two consequences worth knowing:
99
99
 
@@ -442,17 +442,31 @@ otherwise look like.
442
442
  `--due-date`, `--closed`
443
443
  - `gitea-cli issue list --owner <owner> --repository <repo>`
444
444
  - Optional: `--state`, `--labels`, `--search-string`, `--created-by`,
445
- `--assigned-by`, `--since`, `--before`, `--page`, `--limit`
445
+ `--assigned-by`, `--since`, `--before`, `--page`, `--limit`, `--issue-ids`
446
+ - `--issue-ids 12,7,40` lists only those issues, in that order. Gitea's
447
+ listing has no such filter, so its pages are walked until every one of
448
+ them has been seen; the other filters still apply, so
449
+ `--state open --issue-ids ...` answers "which of these are open" in one
450
+ call. `metadata.not_listed` names each requested issue the listing did not
451
+ hold - one the filters exclude, or one that does not exist. `--page`
452
+ cannot be combined with it; `--limit` still sets the page size.
446
453
  - `gitea-cli issue get --owner <owner> --repository <repo> --issue-id <number>`
454
+ - `--issue-id` can be repeated, and `--issue-id-file <path>` reads more
455
+ numbers - separated by commas, whitespace or newlines - from a file, or
456
+ from stdin when the path is `-`. With one `--issue-id` and no file, `data`
457
+ is the issue, as it always was; otherwise it is a list of the issues in
458
+ the order requested, each once. An issue that does not exist fails the
459
+ run, which prints nothing on stdout and names every missing issue.
447
460
  - The `comments` field is the number of comments on the issue, not the
448
461
  comments themselves; use `gitea-cli issue comment list` to read the
449
462
  bodies. The field keeps the API's name, as
450
463
  [the field-name convention](#field-names) requires: this command used to
451
464
  rename it to `comment_count` and was alone in doing so.
452
- - Each entry of `projects` carries a `column_id`: the column the issue's
453
- card sits in, or `null` when the issue has no card on that project. Gitea
454
- does not report it on the issue itself, so it is resolved from each
455
- project's board, which costs a few extra requests per project.
465
+ - Unless `--no-columns` is passed, each entry of `projects` carries a
466
+ `column_id`: the column the issue's card sits in, or `null` when the issue
467
+ has no card on that project. Gitea does not report it on the issue itself,
468
+ so it is resolved from each project's board, which costs a few extra
469
+ requests per project.
456
470
  - Resolution is best-effort. It reflects the board as it was during the
457
471
  walk, not at one instant: a card moved while the columns are being read
458
472
  may be reported under either column or as `null`. A lookup that is
@@ -461,6 +475,13 @@ otherwise look like.
461
475
  so `null` means "no card here" and "could not tell" alike. The columns of
462
476
  a user-owned (individual) project cannot be listed at all, so its
463
477
  `column_id` is always `null`.
478
+ - `--no-columns` turns that resolution off. Every project entry is then
479
+ emitted as the API sent it, without a `column_id`, and no board is read:
480
+ the run costs one request per issue however many projects the issues are
481
+ on. `--columns`, the default, resolves the columns. Reach for
482
+ `--no-columns` when the issue's own fields are what is wanted - `state`,
483
+ `labels`, `title` - since it is the board walk that a read of a set of
484
+ issues pays most for.
464
485
  - `gitea-cli issue edit --owner <owner> --repository <repo> --issue-id <number>`
465
486
  - Optional: `--title`, `--body`, `--state`, `--assignees`, `--milestone`,
466
487
  `--due-date`
@@ -579,9 +600,15 @@ gitea-cli project list --owner my-org --repository my-repo # that repository's
579
600
  - `gitea-cli project column create --owner <owner> [--repository <repo>] --project-id <id> --title <title>`
580
601
  - Optional: `--color`
581
602
  - `gitea-cli project column list --owner <owner> [--repository <repo>] --project-id <id>`
603
+ - Optional: `--fields`
582
604
  - `gitea-cli project column issues --owner <owner> [--repository <repo>] --project-id <id> --column-id <id>`
583
- - Optional: `--page`, `--limit`
605
+ - Optional: `--page`, `--limit`, `--fields`
606
+ - `data` is `{"column": {"id": ..., "title": ...}, "issues": [...]}`: the
607
+ column is echoed by the ID and title the API reports for `--column-id`, so
608
+ a read of another column of the same project says which column it read.
609
+ Earlier releases emitted the list of issues alone as `data`.
584
610
  - `gitea-cli project issues --owner <owner> [--repository <repo>] --project-id <id>`
611
+ - Optional: `--fields`
585
612
  - `gitea-cli project issue add --owner <owner> [--repository <repo>] --project-id <id> --column-id <id> --issue-id <id>`
586
613
  - Optional: `--issue-repository`
587
614
  - `gitea-cli project issue move --owner <owner> [--repository <repo>] --project-id <id> --column-id <id> --issue-id <id>`
@@ -596,6 +623,12 @@ gitea-cli project list --owner my-org --repository my-repo # that repository's
596
623
  card is in, and is found on the board when it is omitted; an issue with no
597
624
  card there is reported as having none.
598
625
 
626
+ `--fields id,number,title,state` cuts every record of the listing - each column
627
+ for `column list`, each issue for `column issues` and `project issues` - down to
628
+ the named fields, in that order. The echoed column is never cut. A field a
629
+ record does not carry is emitted as `null`, so a misspelled field shows up as
630
+ nulls rather than disappearing.
631
+
599
632
  The project endpoints identify an issue by its global ID, which is not the
600
633
  number shown in the web UI: `my-org/my-repo#15` may well be global ID `1854`.
601
634
  The three `project issue` commands therefore take `--issue-id` as the number
@@ -29,13 +29,13 @@ dependencies = [
29
29
 
30
30
  [dependency-groups]
31
31
  dev = [
32
- "ruff>=0.16.10",
32
+ "ruff>=0.17.0",
33
33
  # The mutation runner, in the environment `uv run` resolves, so that
34
34
  # `uv run mutmut run` reaches the same interpreter as `uv run pytest` and finds
35
35
  # the pytest plugins the suite's own options need. Run from a tool environment
36
36
  # of its own it cannot read `--cov`, and the run dies at collection.
37
37
  "mutmut>=3.8.0",
38
- "prek>=0.5.4",
38
+ "prek>=0.5.5",
39
39
  "pytest-github-actions-annotate-failures>=0.4.2",
40
40
  "pytest-cov>=7.1.0",
41
41
  "pytest-mock>=3.16.0",
@@ -0,0 +1,241 @@
1
+ """Get issues command.
2
+
3
+ The issue is emitted with the field names the API sends, as `gitea.utils.fields`
4
+ requires. `comments` is one worth knowing about: it is the *number* of comments
5
+ on the issue and not their bodies, which `gitea-cli issue comment list` is for.
6
+ An earlier version of this command renamed it to `comment_count` to say so, and
7
+ was the only command emitting an issue that did - the same count arrived under
8
+ two names depending on which command fetched the issue, which was the worse
9
+ surprise of the two.
10
+
11
+ Several issues can be read in one run: `--issue-id` may be repeated, and
12
+ `--issue-id-file` reads a list of numbers from a file or from stdin, so a set of
13
+ hundreds need not fit on a command line. The shape of `data` follows from how
14
+ the command was invoked, never from what the API answered: one `--issue-id` and
15
+ no file gives the issue itself, as it always has; anything else gives a list of
16
+ issues in the order they were asked for, each once. An issue that does not exist
17
+ fails the run, after every requested issue has been tried, with an error naming
18
+ each missing one, so a single typo in a long list is not reported one run at a
19
+ time.
20
+
21
+ Every project an issue is on is emitted with the column its card sits in there,
22
+ resolved from that project's board: the issue payload names the projects without
23
+ saying where on them the card sits, so the column costs a walk of the board's
24
+ columns and their issue listings, a few requests per project. `--no-columns`
25
+ turns that walk off. Every project entry is then emitted as the API sent it,
26
+ without a `column_id`, and the run reads no board at all - one request per issue,
27
+ whatever boards the issues are on. It is the form to use when the issue's own
28
+ fields are what is wanted - `state`, `labels`, `title` - since it is the board
29
+ walk that a read of a set of issues pays most for.
30
+ """
31
+
32
+ from __future__ import annotations
33
+
34
+ from collections.abc import Callable
35
+ from typing import Annotated, Any
36
+
37
+ import typer
38
+
39
+ from gitea.cli.issue.ids import ISSUE_ID_FILE_HELP
40
+ from gitea.cli.utils.options import DEPRECATED_INDEX_HELP, REPOSITORY_REQUIRED_HELP
41
+
42
+ _NOT_FOUND = 404
43
+
44
+ ISSUE_IDS_HELP = "Issue number shown in the web UI. Repeat the option to read several issues."
45
+ ISSUE_COLUMNS_HELP = (
46
+ "Resolve the project column of each issue's card. Pass --no-columns to leave every project entry "
47
+ "as the API sent it and read no board, which is what a read of the issue's own fields wants."
48
+ )
49
+
50
+
51
+ def get_command(
52
+ ctx: typer.Context,
53
+ owner: Annotated[str, typer.Option("--owner", help="Owner of the repository.")],
54
+ repository: Annotated[str | None, typer.Option("--repository", help=REPOSITORY_REQUIRED_HELP)] = None,
55
+ issue_ids: Annotated[list[int] | None, typer.Option("--issue-id", help=ISSUE_IDS_HELP)] = None,
56
+ issue_id_file: Annotated[str | None, typer.Option("--issue-id-file", help=ISSUE_ID_FILE_HELP)] = None,
57
+ resolve_columns: Annotated[bool, typer.Option("--columns/--no-columns", help=ISSUE_COLUMNS_HELP)] = True,
58
+ index: Annotated[int | None, typer.Option("--index", help=DEPRECATED_INDEX_HELP, hidden=True)] = None,
59
+ account_name: Annotated[
60
+ str | None,
61
+ typer.Option(
62
+ "--account-name",
63
+ help="Name of the account to use for authentication.",
64
+ ),
65
+ ] = None,
66
+ token: Annotated[
67
+ str | None,
68
+ typer.Option(
69
+ "--token",
70
+ help="Token for authentication. If not provided, the token from the specified account will be used.",
71
+ ),
72
+ ] = None,
73
+ base_url: Annotated[
74
+ str | None,
75
+ typer.Option(
76
+ "--base-url",
77
+ help="Base URL of the Gitea platform. If not provided, the base URL from the specified account will be used.",
78
+ ),
79
+ ] = None,
80
+ ) -> None:
81
+ """Get one or more issues in a repository.
82
+
83
+ Args:
84
+ ctx: The Typer context.
85
+ owner: The owner of the repository.
86
+ repository: The name of the repository, which this command requires.
87
+ issue_ids: The issue numbers shown in the web UI.
88
+ issue_id_file: A file listing more issue numbers, or `-` to read them from stdin.
89
+ resolve_columns: Whether to resolve the column each issue's card sits in.
90
+ index: The deprecated name of `--issue-id`, which names one issue.
91
+ account_name: Name of the account to use for authentication.
92
+ token: Token for authentication. If not provided, the token from the specified account will be used.
93
+ base_url: Base URL of the Gitea platform. If not provided, the base URL from the specified account will be used.
94
+
95
+ """
96
+ from gitea.cli.utils.api import execute_api_command # noqa: PLC0415
97
+ from gitea.cli.utils.auth import get_auth_params # noqa: PLC0415
98
+ from gitea.cli.utils.options import require_repository # noqa: PLC0415
99
+ from gitea.client.gitea import Gitea # noqa: PLC0415
100
+ from gitea.issue.project_column import ColumnListings, resolve_project_column_ids # noqa: PLC0415
101
+
102
+ command = "gitea-cli issue get"
103
+ token, base_url = get_auth_params(
104
+ config_path=ctx.obj.get("config_path"),
105
+ account_name=account_name,
106
+ token=token,
107
+ base_url=base_url,
108
+ )
109
+
110
+ def api_call() -> tuple[dict[str, Any] | list[dict[str, Any]], dict[str, Any]]:
111
+ """Get the issues' information.
112
+
113
+ The column of each project an issue is on is resolved from the project's
114
+ board, because the issue payload names the projects without saying where
115
+ on them the issue's card sits. The issues of one run share the listings
116
+ of their boards' columns, so a board is listed once however many of the
117
+ issues are on it. `--no-columns` asks for no such resolution: the issues
118
+ are emitted as the API sent them and no board is read, which is what a
119
+ read of the issues' own fields wants.
120
+
121
+ Returns:
122
+ A tuple containing the issue data, or a list of it, and metadata.
123
+
124
+ """
125
+ target_repository = require_repository(repository, command=command)
126
+ targets, single = _requested_issues(issue_ids, issue_id_file, index, command=command)
127
+
128
+ with Gitea(token=token, base_url=base_url) as client:
129
+ columns = ColumnListings()
130
+
131
+ def get_one(number: int) -> tuple[dict[str, Any], dict[str, Any]]:
132
+ data, metadata = client.issue.get_issue(owner=owner, repository=target_repository, index=number)
133
+ if not resolve_columns:
134
+ return data, metadata
135
+ data = resolve_project_column_ids(
136
+ client=client, owner=owner, repository=target_repository, issue=data, columns=columns
137
+ )
138
+ return data, metadata
139
+
140
+ if single:
141
+ return get_one(targets[0])
142
+ return _get_each(targets, get_one, owner=owner, repository=target_repository, command=command)
143
+
144
+ execute_api_command(api_call=api_call, base_url=base_url, command_name=command)
145
+
146
+
147
+ def _requested_issues(
148
+ issue_ids: list[int] | None, issue_id_file: str | None, index: int | None, *, command: str
149
+ ) -> tuple[list[int], bool]:
150
+ """Read which issues the command reads, and whether it was asked for exactly one.
151
+
152
+ Args:
153
+ issue_ids: The values passed as --issue-id, or None when it was omitted.
154
+ issue_id_file: The value passed as --issue-id-file, or None when it was omitted.
155
+ index: The value passed as the deprecated --index, or None when it was omitted.
156
+ command: The command being run, named as the user invoked it.
157
+
158
+ Returns:
159
+ The issue numbers, in the order given with those of the file last, each
160
+ once; and True when one --issue-id (or --index) and no file named them,
161
+ which is the invocation that reports the issue itself rather than a list.
162
+
163
+ Raises:
164
+ CommandError: If no issue was given, or --index was combined with
165
+ several issues.
166
+
167
+ """
168
+ from gitea.cli.issue.ids import read_issue_id_file # noqa: PLC0415
169
+ from gitea.cli.utils.errors import CommandError # noqa: PLC0415
170
+ from gitea.cli.utils.options import resolve_issue_id # noqa: PLC0415
171
+
172
+ given = list(issue_ids or [])
173
+ if index is not None:
174
+ if len(given) > 1 or issue_id_file is not None:
175
+ raise CommandError(
176
+ f"'{command}': --index names one issue and cannot be combined with several. "
177
+ f"It is the deprecated name of --issue-id: pass --issue-id once per issue instead."
178
+ )
179
+ given = [resolve_issue_id(issue_id=given[0] if given else None, index=index, command=command)]
180
+
181
+ if issue_id_file is None:
182
+ if not given:
183
+ raise CommandError(
184
+ f"'{command}' needs an issue: pass --issue-id NUMBER, once per issue, or --issue-id-file PATH."
185
+ )
186
+ return list(dict.fromkeys(given)), len(given) == 1
187
+
188
+ given += read_issue_id_file(issue_id_file, command=command)
189
+ return list(dict.fromkeys(given)), False
190
+
191
+
192
+ def _get_each(
193
+ numbers: list[int],
194
+ get_one: Callable[[int], tuple[dict[str, Any], dict[str, Any]]],
195
+ *,
196
+ owner: str,
197
+ repository: str,
198
+ command: str,
199
+ ) -> tuple[list[dict[str, Any]], dict[str, Any]]:
200
+ """Read each issue in turn, and report every one that does not exist together.
201
+
202
+ Args:
203
+ numbers: The issues to read.
204
+ get_one: Callable reading one issue and returning its data and metadata.
205
+ owner: The owner of the repository.
206
+ repository: The name of the repository.
207
+ command: The command being run, named as the user invoked it.
208
+
209
+ Returns:
210
+ A tuple containing the issues, in the order asked for, and the metadata
211
+ of the last response.
212
+
213
+ Raises:
214
+ CommandError: If any of the issues does not exist. Any other failure is
215
+ raised as it was, on the issue that met it.
216
+
217
+ """
218
+ from requests import HTTPError # noqa: PLC0415
219
+
220
+ from gitea.cli.utils.errors import CommandError # noqa: PLC0415
221
+
222
+ issues: list[dict[str, Any]] = []
223
+ missing: list[int] = []
224
+ metadata: dict[str, Any] = {}
225
+ for number in numbers:
226
+ try:
227
+ data, metadata = get_one(number)
228
+ except HTTPError as e:
229
+ response = getattr(e, "response", None)
230
+ if response is None or response.status_code != _NOT_FOUND:
231
+ raise
232
+ missing.append(number)
233
+ continue
234
+ issues.append(data)
235
+
236
+ if missing:
237
+ raise CommandError(
238
+ f"'{command}': no issue {', '.join(str(number) for number in missing)} in {owner}/{repository}; "
239
+ f"the other {len(issues)} of the {len(numbers)} requested exist. Nothing was printed."
240
+ )
241
+ return issues, {"status_code": metadata["status_code"]}
@@ -0,0 +1,85 @@
1
+ """Reading a set of issue numbers given as text: a comma list, a file, or stdin.
2
+
3
+ `issue get` reads several issues at once and `issue list` can be narrowed to a
4
+ known set, so both need the numbers as a set rather than one option value per
5
+ issue. The numbers are separated by commas, whitespace or newlines, in any mix,
6
+ so a list written by hand, one printed by `jq -r '.[]'`, and one pasted from a
7
+ comma-separated cell all read the same. A value that is not a positive whole
8
+ number is an error naming it, rather than a number quietly dropped.
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ import re
14
+ import sys
15
+ from pathlib import Path
16
+
17
+ from gitea.cli.utils.errors import CommandError
18
+
19
+ # The value of `--issue-id-file` that asks for the numbers to be read from stdin.
20
+ FROM_STDIN = "-"
21
+
22
+ ISSUE_ID_FILE_HELP = (
23
+ "File listing issue numbers, separated by commas, whitespace or newlines. Pass '-' to read them from stdin."
24
+ )
25
+
26
+ _SEPARATORS = re.compile(r"[\s,]+")
27
+ _ISSUE_NUMBER = re.compile(r"[0-9]+")
28
+
29
+
30
+ def parse_issue_numbers(text: str, *, source: str, command: str) -> list[int]:
31
+ """Read the issue numbers in a piece of text.
32
+
33
+ Args:
34
+ text: The numbers, separated by commas, whitespace or newlines.
35
+ source: Where the text came from, for the error, e.g. "--issue-ids".
36
+ command: The command being run, named as the user invoked it.
37
+
38
+ Returns:
39
+ The numbers, in the order given, repeats included.
40
+
41
+ Raises:
42
+ CommandError: If a value is not a positive whole number.
43
+
44
+ """
45
+ tokens = [token for token in _SEPARATORS.split(text) if token]
46
+ invalid = [token for token in tokens if not _ISSUE_NUMBER.fullmatch(token) or int(token) == 0]
47
+ if invalid:
48
+ raise CommandError(
49
+ f"'{command}': {source} holds {', '.join(repr(token) for token in invalid)}, "
50
+ f"which {'is not an issue number' if len(invalid) == 1 else 'are not issue numbers'}. "
51
+ f"Issue numbers are the positive whole numbers shown in the web UI."
52
+ )
53
+ return [int(token) for token in tokens]
54
+
55
+
56
+ def read_issue_id_file(path: str, *, command: str) -> list[int]:
57
+ """Read the issue numbers listed in a file, or on stdin.
58
+
59
+ Args:
60
+ path: The value passed as --issue-id-file, or `-` to read stdin.
61
+ command: The command being run, named as the user invoked it.
62
+
63
+ Returns:
64
+ The numbers, in the order listed, repeats included.
65
+
66
+ Raises:
67
+ CommandError: If the file cannot be read, lists no number, or lists a
68
+ value that is not one. A file listing nothing is an error rather than
69
+ an empty result, since that is what a pipeline that failed upstream
70
+ looks like.
71
+
72
+ """
73
+ source = "stdin" if path == FROM_STDIN else path
74
+ if path == FROM_STDIN:
75
+ text = sys.stdin.read()
76
+ else:
77
+ try:
78
+ text = Path(path).read_text(encoding="utf-8")
79
+ except OSError as e:
80
+ raise CommandError(f"'{command}' could not read --issue-id-file {path}: {e.strerror or e}.") from e
81
+
82
+ numbers = parse_issue_numbers(text, source=f"--issue-id-file {source}", command=command)
83
+ if not numbers:
84
+ raise CommandError(f"'{command}': --issue-id-file {source} lists no issue number.")
85
+ return numbers