hackerrank-cli 2026.10.7__tar.gz → 2026.10.8__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 (73) hide show
  1. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/.github/workflows/ci.yml +4 -0
  2. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/.github/workflows/release.yml +10 -4
  3. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/MANIFEST.in +2 -2
  4. {hackerrank_cli-2026.10.7/src/hackerrank_cli.egg-info → hackerrank_cli-2026.10.8}/PKG-INFO +1 -1
  5. hackerrank_cli-2026.10.8/VERSION +1 -0
  6. hackerrank_cli-2026.10.8/docs/source/changelog/2026.10.1.1.md +7 -0
  7. hackerrank_cli-2026.10.8/docs/source/changelog/2026.10.7.md +7 -0
  8. hackerrank_cli-2026.10.8/docs/source/changelog/2026.10.8.md +6 -0
  9. hackerrank_cli-2026.10.8/docs/source/changelog.md +11 -0
  10. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/docs/source/conf.py +1 -1
  11. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/docs/source/development.rst +12 -3
  12. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/prek.toml +2 -2
  13. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/pyproject.toml +5 -4
  14. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/src/hackerrank_cli/_version.py +3 -3
  15. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8/src/hackerrank_cli.egg-info}/PKG-INFO +1 -1
  16. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/src/hackerrank_cli.egg-info/SOURCES.txt +4 -2
  17. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/src/hackerrank_cli.egg-info/scm_file_list.json +4 -2
  18. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/src/hackerrank_cli.egg-info/scm_version.json +2 -2
  19. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/uv.lock +2 -0
  20. hackerrank_cli-2026.10.7/CHANGELOG.rst +0 -27
  21. hackerrank_cli-2026.10.7/VERSION +0 -1
  22. hackerrank_cli-2026.10.7/docs/source/changelog.rst +0 -1
  23. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/.dockerignore +0 -0
  24. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/.gitattributes +0 -0
  25. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/.github/dependabot.yml +0 -0
  26. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/.github/workflows/autofix.yml +0 -0
  27. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/.github/workflows/binaries.yml +0 -0
  28. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/.github/workflows/dependabot-merge.yml +0 -0
  29. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/.github/workflows/docs.yml +0 -0
  30. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/.github/workflows/lint.yml +0 -0
  31. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/.github/workflows/nix.yml +0 -0
  32. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/.github/workflows/publish-site.yml +0 -0
  33. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/.gitignore +0 -0
  34. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/.vale.ini +0 -0
  35. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/Dockerfile +0 -0
  36. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/LICENSE +0 -0
  37. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/README.rst +0 -0
  38. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/bin/__init__.py +0 -0
  39. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/bin/hackerrank_wrapper.py +0 -0
  40. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/docs/__init__.py +0 -0
  41. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/docs/source/__init__.py +0 -0
  42. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/docs/source/cli.rst +0 -0
  43. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/docs/source/index.rst +0 -0
  44. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/docs/source/macos-releases.rst +0 -0
  45. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/docs/source/migration.rst +0 -0
  46. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/docs/source/usage.rst +0 -0
  47. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/flake.lock +0 -0
  48. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/flake.nix +0 -0
  49. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/newsfragments/.gitkeep +0 -0
  50. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/setup.cfg +0 -0
  51. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/spelling_private_dict.txt +0 -0
  52. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/src/hackerrank_cli/__init__.py +0 -0
  53. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/src/hackerrank_cli/__main__.py +0 -0
  54. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/src/hackerrank_cli/_sources.py +0 -0
  55. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/src/hackerrank_cli/py.typed +0 -0
  56. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/src/hackerrank_cli.egg-info/dependency_links.txt +0 -0
  57. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/src/hackerrank_cli.egg-info/entry_points.txt +0 -0
  58. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/src/hackerrank_cli.egg-info/not-zip-safe +0 -0
  59. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/src/hackerrank_cli.egg-info/requires.txt +0 -0
  60. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/src/hackerrank_cli.egg-info/top_level.txt +0 -0
  61. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/styles/snapper/LongProseLine.yml +0 -0
  62. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/styles/snapper/SemanticLineBreaks.yml +0 -0
  63. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/tests/__init__.py +0 -0
  64. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/tests/test_archive.py +0 -0
  65. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/tests/test_cli.py +0 -0
  66. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/tests/test_help/test_help_archive_.txt +0 -0
  67. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/tests/test_help/test_help_questions_.txt +0 -0
  68. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/tests/test_help/test_help_root_.txt +0 -0
  69. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/tests/test_help/test_help_upload_.txt +0 -0
  70. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/tests/test_help.py +0 -0
  71. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/tests/test_http.py +0 -0
  72. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/tests/test_sources.py +0 -0
  73. {hackerrank_cli-2026.10.7 → hackerrank_cli-2026.10.8}/zizmor.yml +0 -0
@@ -44,6 +44,10 @@ jobs:
44
44
  - run: uv build
45
45
  - run: uv run --locked twine check dist/*
46
46
  - run: uv run --locked check-wheel-contents dist/*.whl
47
+ - name: Check release notes exist
48
+ run: |
49
+ RELEASE_VERSION="$(cat VERSION)"
50
+ test -s "docs/source/changelog/$RELEASE_VERSION.md"
47
51
  - name: Smoke installed wheel
48
52
  run: |
49
53
  uv venv /tmp/hackerrank-wheel
@@ -27,10 +27,18 @@ jobs:
27
27
  - run: uv build
28
28
  - run: uv run --locked twine check dist/*
29
29
  - run: uv run --locked check-wheel-contents dist/*.whl
30
+ - name: Select the tagged release notes
31
+ env:
32
+ RELEASE_VERSION: ${{ github.ref_name }}
33
+ run: cp "docs/source/changelog/$RELEASE_VERSION.md" release-notes.md
30
34
  - uses: actions/upload-artifact@v7
31
35
  with:
32
36
  name: distributions
33
37
  path: dist/*
38
+ - uses: actions/upload-artifact@v7
39
+ with:
40
+ name: release-notes
41
+ path: release-notes.md
34
42
  binaries:
35
43
  # actionlint 1.7.12 accepts ./ for local workflows and rejects $/.
36
44
  uses: ./.github/workflows/binaries.yml # zizmor: ignore[self-repository]
@@ -60,18 +68,16 @@ jobs:
60
68
  permissions:
61
69
  contents: write
62
70
  steps:
63
- - uses: actions/checkout@v7
64
- with:
65
- persist-credentials: false
66
71
  - uses: actions/download-artifact@v8
67
72
  with:
68
73
  path: artifacts
69
74
  - name: Attach distributions and binaries
70
75
  env:
76
+ GH_REPO: ${{ github.repository }}
71
77
  GH_TOKEN: ${{ github.token }}
72
78
  TAG: ${{ github.ref_name }}
73
79
  run: gh release create "$TAG" artifacts/distributions/* artifacts/hackerrank-*/*
74
- --title "$TAG" --notes-file CHANGELOG.rst --verify-tag
80
+ --title "$TAG" --notes-file artifacts/release-notes/release-notes.md --verify-tag
75
81
  docker:
76
82
  needs: publish
77
83
  runs-on: ubuntu-latest
@@ -1,6 +1,6 @@
1
- include LICENSE README.rst CHANGELOG.rst
1
+ include LICENSE README.rst
2
2
  recursive-include src *.py *.typed
3
- recursive-include docs *.rst *.py
3
+ recursive-include docs *.rst *.md *.py
4
4
  recursive-include newsfragments *
5
5
  include .vale.ini prek.toml spelling_private_dict.txt zizmor.yml
6
6
  recursive-include styles/snapper *.yml
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hackerrank-cli
3
- Version: 2026.10.7
3
+ Version: 2026.10.8
4
4
  Summary: Upload starter files to existing HackerRank project questions.
5
5
  Author-email: Adam Dangoor <adamdangoor@gmail.com>
6
6
  License-Expression: MIT
@@ -0,0 +1 @@
1
+ 2026.10.8
@@ -0,0 +1,7 @@
1
+ # 2026.10.1.1 (2026-10-01)
2
+
3
+ ## Features
4
+
5
+ - Upload existing HackerRank project-question starter files from a directory or
6
+ a single file, with nested ignore rules, configurable exclusions, offline dry
7
+ runs, and SDK retry handling.
@@ -0,0 +1,7 @@
1
+ # 2026.10.7 (2026-10-07)
2
+
3
+ ## Features
4
+
5
+ - Export project ZIP archives offline with `hackerrank questions archive`,
6
+ using the same file selection and packaging as uploads.
7
+ ([#6](https://github.com/adamtheturtle/hackerrank-cli/issues/6))
@@ -0,0 +1,6 @@
1
+ # 2026.10.8 (2026-10-08)
2
+
3
+ ## Bug fixes
4
+
5
+ - Render GitHub release notes correctly and include only that version's
6
+ changes.
@@ -0,0 +1,11 @@
1
+ # Changelog
2
+
3
+ Releases are assembled from `newsfragments/` using Towncrier.
4
+
5
+ ```{toctree}
6
+ :maxdepth: 1
7
+ :glob:
8
+ :reversed:
9
+
10
+ changelog/*
11
+ ```
@@ -5,7 +5,7 @@ import importlib.metadata
5
5
  project = "hackerrank-cli"
6
6
  author = "Adam Dangoor"
7
7
  release = importlib.metadata.version(distribution_name="hackerrank-cli")
8
- extensions = ["sphinx_click.ext", "sphinxcontrib.spelling"]
8
+ extensions = ["myst_parser", "sphinx_click.ext", "sphinxcontrib.spelling"]
9
9
  html_theme = "furo"
10
10
  nitpicky = True
11
11
  html_theme_options = {
@@ -40,18 +40,27 @@ The upload tests so assert the released SDK's actual wire behavior instead of
40
40
  inventing an OpenAPI schema.
41
41
  No separate mock-spec repository is needed for this scope.
42
42
 
43
- Add a Towncrier feature or bugfix fragment for each user-visible change.
43
+ Add a Towncrier feature or bugfix fragment in Markdown for each user-visible
44
+ change, such as ``newsfragments/123.bugfix.md``.
44
45
 
45
46
  Versions derive from Git tags using setuptools-scm.
46
47
  Untagged builds have a development version.
47
48
  Use date-based tags such as ``2026.10.7`` for releases.
48
49
  Before tagging a release, assemble notes with
49
- ``uv run towncrier build --yes --version VERSION``, commit the changelog, then
50
- write the same version to ``VERSION``, commit it, then tag the commit.
50
+ ``uv run towncrier build --yes --version VERSION``, commit the generated notes
51
+ in ``docs/source/changelog/VERSION.md``, then write the same version to
52
+ ``VERSION``, commit it, then tag the commit.
51
53
  Pushing a tag is the explicit publication trigger.
52
54
  The release workflow builds and checks packages, builds three standalone
53
55
  binaries, and then publishes to PyPI, GitHub Releases, and GHCR.
54
56
 
57
+ Towncrier writes a separate Markdown file for each release.
58
+ Sphinx reads those files through MyST and lists them in the changelog.
59
+ The release workflow uploads the tagged version's file directly as its GitHub
60
+ release notes.
61
+ Pull requests check that the notes for ``VERSION`` exist.
62
+ Review the generated Markdown before pushing a release tag.
63
+
55
64
  Local builds
56
65
  ------------
57
66
 
@@ -597,7 +597,7 @@ hooks = [
597
597
  name = "linkcheck",
598
598
  entry = "uv run --locked --group=dev sphinx-build -M linkcheck docs/source docs/build -W --keep-going -d docs/build/.doctrees-linkcheck",
599
599
  language = "system",
600
- types_or = ["rst"],
600
+ types_or = ["rst", "markdown"],
601
601
  stages = ["manual"],
602
602
  groups = ["docs"],
603
603
  priority = 610,
@@ -609,7 +609,7 @@ hooks = [
609
609
  name = "spelling",
610
610
  entry = "uv run --locked --group=dev sphinx-build -M spelling docs/source docs/build -W -d docs/build/.doctrees-spelling",
611
611
  language = "system",
612
- types_or = ["rst"],
612
+ types_or = ["rst", "markdown"],
613
613
  stages = ["manual"],
614
614
  groups = ["docs"],
615
615
  priority = 610,
@@ -40,6 +40,7 @@ dev = [
40
40
  "mypy==2.4.0",
41
41
  "mypy-pytest-parametrize==2026.10.5",
42
42
  "mypy-strict-kwargs==2026.8.25.1",
43
+ "myst-parser==5.1.0",
43
44
  "no-defaults==2026.9.1",
44
45
  "prek==0.5.4",
45
46
  "pydocstringformatter==1.0.0",
@@ -241,10 +242,10 @@ report.show_missing = true
241
242
 
242
243
  [tool.towncrier]
243
244
  directory = "newsfragments"
244
- filename = "CHANGELOG.rst"
245
- title_format = "{version} ({project_date})"
246
- issue_format = "#{issue}"
247
- underlines = [ "-", "~", "^" ]
245
+ filename = "docs/source/changelog/{version}.md"
246
+ title_format = "# {version} ({project_date})"
247
+ issue_format = "[#{issue}](https://github.com/adamtheturtle/hackerrank-cli/issues/{issue})"
248
+ single_file = false
248
249
  ignore = [ ".gitkeep" ]
249
250
  type = [
250
251
  { directory = "feature", name = "Features", showcontent = true },
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '2026.10.7'
22
- __version_tuple__ = version_tuple = (2026, 10, 7)
21
+ __version__ = version = '2026.10.8'
22
+ __version_tuple__ = version_tuple = (2026, 10, 8)
23
23
 
24
- __commit_id__ = commit_id = 'g3aa79e260'
24
+ __commit_id__ = commit_id = 'gfb4c14cb0'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hackerrank-cli
3
- Version: 2026.10.7
3
+ Version: 2026.10.8
4
4
  Summary: Upload starter files to existing HackerRank project questions.
5
5
  Author-email: Adam Dangoor <adamdangoor@gmail.com>
6
6
  License-Expression: MIT
@@ -2,7 +2,6 @@
2
2
  .gitattributes
3
3
  .gitignore
4
4
  .vale.ini
5
- CHANGELOG.rst
6
5
  Dockerfile
7
6
  LICENSE
8
7
  MANIFEST.in
@@ -29,7 +28,7 @@ bin/__init__.py
29
28
  bin/hackerrank_wrapper.py
30
29
  docs/__init__.py
31
30
  docs/source/__init__.py
32
- docs/source/changelog.rst
31
+ docs/source/changelog.md
33
32
  docs/source/cli.rst
34
33
  docs/source/conf.py
35
34
  docs/source/development.rst
@@ -37,6 +36,9 @@ docs/source/index.rst
37
36
  docs/source/macos-releases.rst
38
37
  docs/source/migration.rst
39
38
  docs/source/usage.rst
39
+ docs/source/changelog/2026.10.1.1.md
40
+ docs/source/changelog/2026.10.7.md
41
+ docs/source/changelog/2026.10.8.md
40
42
  newsfragments/.gitkeep
41
43
  src/hackerrank_cli/__init__.py
42
44
  src/hackerrank_cli/__main__.py
@@ -14,7 +14,6 @@
14
14
  ".github/workflows/release.yml",
15
15
  ".gitignore",
16
16
  ".vale.ini",
17
- "CHANGELOG.rst",
18
17
  "Dockerfile",
19
18
  "LICENSE",
20
19
  "MANIFEST.in",
@@ -24,7 +23,10 @@
24
23
  "bin/hackerrank_wrapper.py",
25
24
  "docs/__init__.py",
26
25
  "docs/source/__init__.py",
27
- "docs/source/changelog.rst",
26
+ "docs/source/changelog.md",
27
+ "docs/source/changelog/2026.10.1.1.md",
28
+ "docs/source/changelog/2026.10.7.md",
29
+ "docs/source/changelog/2026.10.8.md",
28
30
  "docs/source/cli.rst",
29
31
  "docs/source/conf.py",
30
32
  "docs/source/development.rst",
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "2026.10.7",
2
+ "tag": "2026.10.8",
3
3
  "distance": 0,
4
- "node": "g3aa79e260810c5ec602dd26903495b5f856d4022",
4
+ "node": "gfb4c14cb097f47881863bfaa1ac87d36b8cb44d8",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-10-07"
@@ -775,6 +775,7 @@ dev = [
775
775
  { name = "mypy" },
776
776
  { name = "mypy-pytest-parametrize" },
777
777
  { name = "mypy-strict-kwargs" },
778
+ { name = "myst-parser" },
778
779
  { name = "no-defaults" },
779
780
  { name = "prek" },
780
781
  { name = "pydocstringformatter" },
@@ -834,6 +835,7 @@ dev = [
834
835
  { name = "mypy", specifier = "==2.4.0" },
835
836
  { name = "mypy-pytest-parametrize", specifier = "==2026.10.5" },
836
837
  { name = "mypy-strict-kwargs", specifier = "==2026.8.25.1" },
838
+ { name = "myst-parser", specifier = "==5.1.0" },
837
839
  { name = "no-defaults", specifier = "==2026.9.1" },
838
840
  { name = "prek", specifier = "==0.5.4" },
839
841
  { name = "pydocstringformatter", specifier = "==1.0.0" },
@@ -1,27 +0,0 @@
1
- Changelog
2
- =========
3
-
4
- Releases are assembled from ``newsfragments/`` using Towncrier.
5
-
6
- .. towncrier release notes start
7
-
8
- 2026.10.7 (2026-10-07)
9
- ----------------------
10
-
11
- Features
12
- ~~~~~~~~
13
-
14
- - Export project ZIP archives offline with ``hackerrank questions archive``,
15
- using the same file selection and packaging as uploads.
16
- (#6)
17
-
18
-
19
- 2026.10.1.1 (2026-10-01)
20
- ------------------------
21
-
22
- Features
23
- ~~~~~~~~
24
-
25
- - Upload existing HackerRank project-question starter files from a directory or
26
- a single file, with nested ignore rules, configurable exclusions, offline dry
27
- runs, and SDK retry handling.
@@ -1 +0,0 @@
1
- 2026.10.7
@@ -1 +0,0 @@
1
- .. include:: ../../CHANGELOG.rst