hackerrank-cli 2026.10.8__tar.gz → 2026.11.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 (80) hide show
  1. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/.github/dependabot.yml +2 -0
  2. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/.github/workflows/autofix.yml +3 -4
  3. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/.github/workflows/binaries.yml +12 -4
  4. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/.github/workflows/ci.yml +5 -5
  5. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/.github/workflows/docs.yml +2 -2
  6. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/.github/workflows/lint.yml +2 -2
  7. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/.github/workflows/publish-site.yml +2 -2
  8. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/.github/workflows/release.yml +2 -2
  9. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/Dockerfile +4 -2
  10. {hackerrank_cli-2026.10.8/src/hackerrank_cli.egg-info → hackerrank_cli-2026.11.7}/PKG-INFO +43 -2
  11. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/README.rst +40 -0
  12. hackerrank_cli-2026.11.7/VERSION +1 -0
  13. hackerrank_cli-2026.11.7/docs/source/changelog/2026.10.30.md +14 -0
  14. hackerrank_cli-2026.11.7/docs/source/changelog/2026.11.7.md +7 -0
  15. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/docs/source/development.rst +5 -5
  16. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/flake.nix +14 -0
  17. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/prek.toml +0 -2
  18. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/pyproject.toml +27 -18
  19. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/spelling_private_dict.txt +6 -0
  20. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/src/hackerrank_cli/__init__.py +126 -4
  21. hackerrank_cli-2026.11.7/src/hackerrank_cli/_api.py +205 -0
  22. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/src/hackerrank_cli/_version.py +3 -3
  23. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7/src/hackerrank_cli.egg-info}/PKG-INFO +43 -2
  24. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/src/hackerrank_cli.egg-info/SOURCES.txt +9 -3
  25. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/src/hackerrank_cli.egg-info/requires.txt +1 -1
  26. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/src/hackerrank_cli.egg-info/scm_file_list.json +8 -2
  27. hackerrank_cli-2026.11.7/src/hackerrank_cli.egg-info/scm_version.json +8 -0
  28. hackerrank_cli-2026.11.7/tests/test_api.py +240 -0
  29. hackerrank_cli-2026.11.7/tests/test_help/test_help_questions_.txt +11 -0
  30. hackerrank_cli-2026.11.7/tests/test_help/test_help_questions_set_system_prompt_.txt +9 -0
  31. hackerrank_cli-2026.11.7/tests/test_help/test_help_root_.txt +11 -0
  32. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/tests/test_help.py +2 -1
  33. hackerrank_cli-2026.11.7/tests/test_system_prompt.py +266 -0
  34. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/uv.lock +694 -572
  35. hackerrank_cli-2026.10.8/VERSION +0 -1
  36. hackerrank_cli-2026.10.8/src/hackerrank_cli.egg-info/scm_version.json +0 -8
  37. hackerrank_cli-2026.10.8/tests/test_help/test_help_questions_.txt +0 -10
  38. hackerrank_cli-2026.10.8/tests/test_help/test_help_root_.txt +0 -10
  39. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/.dockerignore +0 -0
  40. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/.gitattributes +0 -0
  41. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/.github/workflows/dependabot-merge.yml +0 -0
  42. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/.github/workflows/nix.yml +0 -0
  43. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/.gitignore +0 -0
  44. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/.vale.ini +0 -0
  45. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/LICENSE +0 -0
  46. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/MANIFEST.in +0 -0
  47. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/bin/__init__.py +0 -0
  48. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/bin/hackerrank_wrapper.py +0 -0
  49. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/docs/__init__.py +0 -0
  50. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/docs/source/__init__.py +0 -0
  51. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/docs/source/changelog/2026.10.1.1.md +0 -0
  52. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/docs/source/changelog/2026.10.7.md +0 -0
  53. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/docs/source/changelog/2026.10.8.md +0 -0
  54. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/docs/source/changelog.md +0 -0
  55. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/docs/source/cli.rst +0 -0
  56. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/docs/source/conf.py +0 -0
  57. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/docs/source/index.rst +0 -0
  58. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/docs/source/macos-releases.rst +0 -0
  59. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/docs/source/migration.rst +0 -0
  60. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/docs/source/usage.rst +0 -0
  61. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/flake.lock +0 -0
  62. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/newsfragments/.gitkeep +0 -0
  63. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/setup.cfg +0 -0
  64. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/src/hackerrank_cli/__main__.py +0 -0
  65. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/src/hackerrank_cli/_sources.py +0 -0
  66. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/src/hackerrank_cli/py.typed +0 -0
  67. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/src/hackerrank_cli.egg-info/dependency_links.txt +0 -0
  68. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/src/hackerrank_cli.egg-info/entry_points.txt +0 -0
  69. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/src/hackerrank_cli.egg-info/not-zip-safe +0 -0
  70. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/src/hackerrank_cli.egg-info/top_level.txt +0 -0
  71. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/styles/snapper/LongProseLine.yml +0 -0
  72. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/styles/snapper/SemanticLineBreaks.yml +0 -0
  73. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/tests/__init__.py +0 -0
  74. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/tests/test_archive.py +0 -0
  75. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/tests/test_cli.py +0 -0
  76. /hackerrank_cli-2026.10.8/tests/test_help/test_help_archive_.txt → /hackerrank_cli-2026.11.7/tests/test_help/test_help_questions_archive_.txt +0 -0
  77. /hackerrank_cli-2026.10.8/tests/test_help/test_help_upload_.txt → /hackerrank_cli-2026.11.7/tests/test_help/test_help_questions_upload_.txt +0 -0
  78. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/tests/test_http.py +0 -0
  79. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/tests/test_sources.py +0 -0
  80. {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/zizmor.yml +0 -0
@@ -3,6 +3,8 @@ version: 2
3
3
 
4
4
  updates:
5
5
  - package-ecosystem: uv
6
+ allow:
7
+ - dependency-type: all
6
8
  directory: /
7
9
  schedule:
8
10
  interval: daily
@@ -2,8 +2,7 @@
2
2
  name: autofix.ci
3
3
 
4
4
  on:
5
- pull_request:
6
- branches: [main]
5
+ pull_request: {}
7
6
  push:
8
7
  branches: [main]
9
8
 
@@ -18,9 +17,9 @@ jobs:
18
17
  with:
19
18
  fetch-depth: 0
20
19
  persist-credentials: false
21
- - uses: astral-sh/setup-uv@v10.2.0
20
+ - uses: astral-sh/setup-uv@v10.3.2
22
21
  with:
23
- version: 0.12.19
22
+ version: 0.13.0
24
23
  python-version: '3.13'
25
24
  - name: Run repository fixers and checks
26
25
  run: uv run --locked prek run --all-files --stage pre-commit --no-fail-fast
@@ -47,9 +47,9 @@ jobs:
47
47
  with:
48
48
  persist-credentials: false
49
49
  fetch-depth: 0
50
- - uses: astral-sh/setup-uv@v10.2.0
50
+ - uses: astral-sh/setup-uv@v10.3.2
51
51
  with:
52
- version: 0.12.19
52
+ version: 0.13.0
53
53
  python-version: '3.13'
54
54
  - name: Require release credentials
55
55
  if: runner.os == 'macOS' && inputs.notarize
@@ -65,8 +65,9 @@ jobs:
65
65
  : "${APPLE_ID:?Missing APPLE_ID}" "${APPLE_TEAM_ID:?Missing APPLE_TEAM_ID}" "${APPLE_APP_PASSWORD:?Missing APPLE_APP_PASSWORD}"
66
66
  # The action removes its temporary keychain in its post step.
67
67
  - name: Import the Developer ID certificate
68
+ id: signing_certificate
68
69
  if: runner.os == 'macOS' && inputs.notarize
69
- uses: Apple-Actions/import-codesign-certs@5142e029c445c10ffc7149d172e540235a065466 # v7.0.0
70
+ uses: Apple-Actions/import-codesign-certs@288b8ec97b82c66b6f2a6baaf7acc8dfbcbe331c # v7.2.0
70
71
  with:
71
72
  p12-file-base64: ${{ secrets.DEVELOPER_ID_APP_CERT_P12_BASE64 }}
72
73
  p12-password: ${{ secrets.DEVELOPER_ID_APP_CERT_PASSWORD }}
@@ -75,12 +76,19 @@ jobs:
75
76
  env:
76
77
  NAME: ${{ matrix.name }}
77
78
  NOTARIZE: ${{ inputs.notarize }}
79
+ IDENTITIES: ${{ steps.signing_certificate.outputs.identities }}
78
80
  run: |
79
81
  signing=()
80
82
  if [ "$RUNNER_OS" = macOS ] && [ "$NOTARIZE" = true ]; then
81
83
  # Sign embedded libraries before packing the one-file archive.
82
84
  # PyInstaller enables the hardened runtime and secure timestamp.
83
- signing=(--codesign-identity "Developer ID Application")
85
+ signing_identity="$(jq -er '
86
+ [.[] | select(.name | startswith("Developer ID Application:"))]
87
+ | if length == 1 then .[0].hash
88
+ else error("Expected exactly one Developer ID Application identity; found \(length)")
89
+ end
90
+ ' <<< "$IDENTITIES")"
91
+ signing=(--codesign-identity "$signing_identity")
84
92
  fi
85
93
  uv run --locked --group binary pyinstaller --clean --onefile --copy-metadata hackerrank-cli --name "$NAME" "${signing[@]}" bin/hackerrank_wrapper.py
86
94
  - name: Verify Developer ID signature
@@ -16,7 +16,7 @@ jobs:
16
16
  tests:
17
17
  strategy:
18
18
  matrix:
19
- python: ['3.13', '3.14']
19
+ python: ['3.13', '3.14', '3.15']
20
20
  os: [ubuntu-latest, macos-latest, windows-latest]
21
21
  runs-on: ${{ matrix.os }}
22
22
  steps:
@@ -24,9 +24,9 @@ jobs:
24
24
  with:
25
25
  persist-credentials: false
26
26
  fetch-depth: 0
27
- - uses: astral-sh/setup-uv@v10.2.0
27
+ - uses: astral-sh/setup-uv@v10.3.2
28
28
  with:
29
- version: 0.12.19
29
+ version: 0.13.0
30
30
  python-version: ${{ matrix.python }}
31
31
  enable-cache: true
32
32
  - run: uv run --locked pytest
@@ -37,9 +37,9 @@ jobs:
37
37
  with:
38
38
  persist-credentials: false
39
39
  fetch-depth: 0
40
- - uses: astral-sh/setup-uv@v10.2.0
40
+ - uses: astral-sh/setup-uv@v10.3.2
41
41
  with:
42
- version: 0.12.19
42
+ version: 0.13.0
43
43
  python-version: '3.13'
44
44
  - run: uv build
45
45
  - run: uv run --locked twine check dist/*
@@ -19,9 +19,9 @@ jobs:
19
19
  with:
20
20
  persist-credentials: false
21
21
  fetch-depth: 0
22
- - uses: astral-sh/setup-uv@v10.2.0
22
+ - uses: astral-sh/setup-uv@v10.3.2
23
23
  with:
24
- version: 0.12.19
24
+ version: 0.13.0
25
25
  python-version: '3.13'
26
26
  - run: uv run --locked prek run --all-files --stage manual --group docs
27
27
  - run: uv run --locked towncrier build --draft --version unreleased
@@ -27,9 +27,9 @@ jobs:
27
27
  with:
28
28
  persist-credentials: false
29
29
  fetch-depth: 0
30
- - uses: astral-sh/setup-uv@v10.2.0
30
+ - uses: astral-sh/setup-uv@v10.3.2
31
31
  with:
32
- version: 0.12.19
32
+ version: 0.13.0
33
33
  python-version: '3.13'
34
34
  enable-cache: true
35
35
  - run: uv run --locked prek run --all-files --no-fail-fast
@@ -23,9 +23,9 @@ jobs:
23
23
  with:
24
24
  persist-credentials: false
25
25
  fetch-depth: 0
26
- - uses: astral-sh/setup-uv@v10.2.0
26
+ - uses: astral-sh/setup-uv@v10.3.2
27
27
  with:
28
- version: 0.12.19
28
+ version: 0.13.0
29
29
  python-version: '3.13'
30
30
  - run: uv run --locked sphinx-build -W --keep-going -b html docs/source docs/build/html
31
31
  - uses: actions/configure-pages@v6
@@ -16,9 +16,9 @@ jobs:
16
16
  with:
17
17
  persist-credentials: false
18
18
  fetch-depth: 0
19
- - uses: astral-sh/setup-uv@v10.2.0
19
+ - uses: astral-sh/setup-uv@v10.3.2
20
20
  with:
21
- version: 0.12.19
21
+ version: 0.13.0
22
22
  python-version: '3.13'
23
23
  - run: uv run --locked pytest
24
24
  - run: uv run --locked prek run --all-files
@@ -1,15 +1,17 @@
1
1
  FROM python:3.13-slim AS build
2
2
  LABEL org.opencontainers.image.source="https://github.com/adamtheturtle/hackerrank-cli"
3
- COPY --from=ghcr.io/astral-sh/uv:0.12.19 /uv /bin/uv
3
+ COPY --from=ghcr.io/astral-sh/uv:0.13.0 /uv /bin/uv
4
4
  WORKDIR /build
5
5
  COPY . .
6
6
  ARG HACKERRANK_CLI_VERSION=0.0.0
7
+ RUN apt-get update && apt-get install -y --no-install-recommends git && rm -rf /var/lib/apt/lists/*
7
8
  RUN SETUPTOOLS_SCM_PRETEND_VERSION_FOR_HACKERRANK_CLI=$HACKERRANK_CLI_VERSION uv build --wheel --out-dir /wheels
9
+ RUN uv pip compile pyproject.toml -o /tmp/runtime.txt && uv run --no-project --with pip python -m pip wheel --wheel-dir /wheels -r /tmp/runtime.txt
8
10
 
9
11
  FROM python:3.13-slim
10
12
  LABEL org.opencontainers.image.source="https://github.com/adamtheturtle/hackerrank-cli"
11
13
  LABEL org.opencontainers.image.description="Upload HackerRank question starter code"
12
14
  LABEL org.opencontainers.image.licenses="MIT"
13
15
  COPY --from=build /wheels /wheels
14
- RUN pip install --no-cache-dir /wheels/*.whl && rm -rf /wheels
16
+ RUN pip install --no-cache-dir --no-index --no-deps /wheels/*.whl && rm -rf /wheels
15
17
  ENTRYPOINT ["hackerrank"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hackerrank-cli
3
- Version: 2026.10.8
3
+ Version: 2026.11.7
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
@@ -14,11 +14,12 @@ Classifier: Operating System :: OS Independent
14
14
  Classifier: Programming Language :: Python :: 3 :: Only
15
15
  Classifier: Programming Language :: Python :: 3.13
16
16
  Classifier: Programming Language :: Python :: 3.14
17
+ Classifier: Programming Language :: Python :: 3.15
17
18
  Requires-Python: >=3.13
18
19
  Description-Content-Type: text/x-rst
19
20
  License-File: LICENSE
20
21
  Requires-Dist: click<8.6,>=8.3
21
- Requires-Dist: hackerrank>=2026.9.16
22
+ Requires-Dist: hackerrank>=2026.11.7
22
23
  Requires-Dist: httpx>=0.28
23
24
  Requires-Dist: httpx2>=2.12
24
25
  Requires-Dist: pathspec>=1
@@ -168,3 +169,43 @@ There are no prebuilt artifacts yet.
168
169
 
169
170
  See ``docs/source/migration.rst`` for migrating an existing shell uploader and
170
171
  keeping repository-specific snippet preparation outside this CLI.
172
+
173
+ Project AI system prompts
174
+ -------------------------
175
+
176
+ Set an existing project question's AI assistant prompt from a UTF-8 file:
177
+
178
+ .. code-block:: console
179
+
180
+ $ hackerrank questions set-system-prompt 123456 --prompt-file prompt.txt
181
+
182
+ Use ``--dry-run`` to validate without credentials or network access.
183
+ Prompts may contain up to 15,000 characters.
184
+ Text is sent exactly as read, including whitespace and line endings.
185
+ An empty file explicitly clears the prompt.
186
+ The command reads the question first to preserve its other metadata.
187
+
188
+ Complete API access
189
+ -------------------
190
+
191
+ The ``api`` command group exposes all 76 documented v3, ATS and SCIM
192
+ operations.
193
+ Use ``hackerrank api operations`` to list names and ``api describe OPERATION``
194
+ to inspect parameters and body schemas.
195
+
196
+ .. code-block:: console
197
+
198
+ hackerrank api call api_list_all_tests --query '{"limit": 10}'
199
+ hackerrank api call api_update_interviewer_note --path '{"interview_id": "123"}' --body-file note.json --dry-run
200
+
201
+ ``--path`` and ``--query`` accept JSON objects.
202
+ ``--body-file`` reads a JSON object from a UTF-8 file, or stdin when set to
203
+ ``-``.
204
+ Real v3 requests use ``HACKERRANK_API_TOKEN``.
205
+ SCIM requests use their own ``HACKERRANK_SCIM_API_TOKEN`` and provisioning
206
+ host.
207
+ Dry runs validate requests before reading credentials and make no API calls.
208
+ Responses include status, headers and complete JSON data, including empty and
209
+ pending responses.
210
+
211
+ The complete API commands require ``hackerrank>=2026.11.7``.
@@ -142,3 +142,43 @@ There are no prebuilt artifacts yet.
142
142
 
143
143
  See ``docs/source/migration.rst`` for migrating an existing shell uploader and
144
144
  keeping repository-specific snippet preparation outside this CLI.
145
+
146
+ Project AI system prompts
147
+ -------------------------
148
+
149
+ Set an existing project question's AI assistant prompt from a UTF-8 file:
150
+
151
+ .. code-block:: console
152
+
153
+ $ hackerrank questions set-system-prompt 123456 --prompt-file prompt.txt
154
+
155
+ Use ``--dry-run`` to validate without credentials or network access.
156
+ Prompts may contain up to 15,000 characters.
157
+ Text is sent exactly as read, including whitespace and line endings.
158
+ An empty file explicitly clears the prompt.
159
+ The command reads the question first to preserve its other metadata.
160
+
161
+ Complete API access
162
+ -------------------
163
+
164
+ The ``api`` command group exposes all 76 documented v3, ATS and SCIM
165
+ operations.
166
+ Use ``hackerrank api operations`` to list names and ``api describe OPERATION``
167
+ to inspect parameters and body schemas.
168
+
169
+ .. code-block:: console
170
+
171
+ hackerrank api call api_list_all_tests --query '{"limit": 10}'
172
+ hackerrank api call api_update_interviewer_note --path '{"interview_id": "123"}' --body-file note.json --dry-run
173
+
174
+ ``--path`` and ``--query`` accept JSON objects.
175
+ ``--body-file`` reads a JSON object from a UTF-8 file, or stdin when set to
176
+ ``-``.
177
+ Real v3 requests use ``HACKERRANK_API_TOKEN``.
178
+ SCIM requests use their own ``HACKERRANK_SCIM_API_TOKEN`` and provisioning
179
+ host.
180
+ Dry runs validate requests before reading credentials and make no API calls.
181
+ Responses include status, headers and complete JSON data, including empty and
182
+ pending responses.
183
+
184
+ The complete API commands require ``hackerrank>=2026.11.7``.
@@ -0,0 +1 @@
1
+ 2026.11.7
@@ -0,0 +1,14 @@
1
+ # 2026.10.30 (2026-10-30)
2
+
3
+ ## Features
4
+
5
+ - Add `hackerrank questions set-system-prompt QUESTION_ID --prompt-file FILE`
6
+ for project AI prompts.
7
+ Validate UTF-8 text and the 15,000-character limit before network access,
8
+ preserve exact whitespace, and clear prompts with an empty file.
9
+ - Add support for Python 3.15.
10
+
11
+ ## Bug fixes
12
+
13
+ - Run validation workflows for pull requests targeting feature branches so
14
+ stacked changes receive the normal checks.
@@ -0,0 +1,7 @@
1
+ # 2026.11.7 (2026-11-07)
2
+
3
+ ## Features
4
+
5
+ - Expose all documented HackerRank v3, ATS and SCIM operations through the API
6
+ command group, with offline discovery and validation.
7
+ ([#69](https://github.com/adamtheturtle/hackerrank-cli/issues/69))
@@ -6,13 +6,13 @@ This standalone repository follows ``coderpad-cli`` main at
6
6
  It adapts the src layout, Click entry points, setuptools-scm versions, uv
7
7
  lockfile, strict checks, 100% branch coverage, Sphinx, Towncrier, and
8
8
  distribution workflows.
9
- The SDK baseline is the released ``hackerrank==2026.9.16`` in ``uv.lock``.
9
+ The SDK baseline is the released ``hackerrank==2026.11.7`` in ``uv.lock``.
10
10
  Python 3.13 or later is required by the SDK.
11
11
 
12
12
  The released SDK exposes ``questions.upload_project_zip``.
13
- Its newer ``upload_project_directory`` helper is not yet released.
14
13
  This CLI prepares filtered ZIPs with the standard library and uses the public
15
14
  released SDK for multipart serialization and all API communication.
15
+ Project AI prompt updates use the SDK's question read and update methods.
16
16
  It does not import private SDK helpers or install an unreleased Git dependency.
17
17
 
18
18
  .. code-block:: shell
@@ -30,9 +30,9 @@ Tests use the real SDK with its public ``Transport`` interface and default
30
30
  HTTPX transport.
31
31
  No SDK methods are replaced and no live questions are mutated.
32
32
  RESPX intercepts the HTTP boundary and fails closed for unregistered requests.
33
- Tests inspect the actual multipart body and ZIP bytes, assert the absence of
34
- metadata updates, preserve text, binary contents and executable bits, and
35
- exercise SDK retries with immutable archive bytes.
33
+ Upload tests inspect the actual multipart body and ZIP bytes, assert the
34
+ absence of metadata updates, preserve text, binary contents and executable
35
+ bits, and exercise SDK retries with immutable archive bytes.
36
36
 
37
37
  The SDK's checked-in Swagger specification does not describe the
38
38
  ``upload_project_zip`` endpoint.
@@ -52,6 +52,19 @@
52
52
  else
53
53
  "0.0.0+${self.shortRev or self.dirtyShortRev or "unknown"}";
54
54
 
55
+ # The pinned SDK is built from source, so supply its build backend.
56
+ hackerrankSourceOverlay = final: prev: {
57
+ hackerrank = prev.hackerrank.overrideAttrs (old: {
58
+ nativeBuildInputs = (old.nativeBuildInputs or [ ]) ++ final.resolveBuildSystem {
59
+ setuptools = [ ];
60
+ setuptools-scm = [ ];
61
+ };
62
+ env = (old.env or { }) // {
63
+ SETUPTOOLS_SCM_PRETEND_VERSION = old.version;
64
+ };
65
+ });
66
+ };
67
+
55
68
  # Override hackerrank-cli to set the version
56
69
  hackerrankCliOverlay = final: prev: {
57
70
  hackerrank-cli = prev.hackerrank-cli.overrideAttrs (old: {
@@ -74,6 +87,7 @@
74
87
  lib.composeManyExtensions [
75
88
  pyproject-build-systems.overlays.wheel
76
89
  overlay
90
+ hackerrankSourceOverlay
77
91
  hackerrankCliOverlay
78
92
  ]
79
93
  )
@@ -506,8 +506,6 @@ hooks = [
506
506
  {
507
507
  id = "vale-sync",
508
508
  name = "vale sync",
509
- # The Python Vale wrapper may fail transiently while downloading its binary; see
510
- # https://github.com/daniperez/vale-python-package/issues/77
511
509
  entry = "uv run --locked --group=dev vale sync",
512
510
  language = "system",
513
511
  pass_filenames = false,
@@ -18,9 +18,16 @@ classifiers = [
18
18
  "Programming Language :: Python :: 3 :: Only",
19
19
  "Programming Language :: Python :: 3.13",
20
20
  "Programming Language :: Python :: 3.14",
21
+ "Programming Language :: Python :: 3.15",
21
22
  ]
22
23
  dynamic = [ "version" ]
23
- dependencies = [ "click>=8.3,<8.6", "hackerrank>=2026.9.16", "httpx>=0.28", "httpx2>=2.12", "pathspec>=1" ]
24
+ dependencies = [
25
+ "click>=8.3,<8.6",
26
+ "hackerrank>=2026.11.7",
27
+ "httpx>=0.28",
28
+ "httpx2>=2.12",
29
+ "pathspec>=1",
30
+ ]
24
31
  urls.Documentation = "https://adamtheturtle.github.io/hackerrank-cli/"
25
32
  urls.Issues = "https://github.com/adamtheturtle/hackerrank-cli/issues"
26
33
  urls.Source = "https://github.com/adamtheturtle/hackerrank-cli"
@@ -37,43 +44,43 @@ dev = [
37
44
  "doccmd==2026.9.16.1",
38
45
  "furo==2025.12.19",
39
46
  "interrogate==1.7.0",
40
- "mypy==2.4.0",
41
- "mypy-pytest-parametrize==2026.10.5",
42
- "mypy-strict-kwargs==2026.8.25.1",
47
+ "mypy==2.4.1",
48
+ "mypy-pytest-parametrize==2026.10.5.1",
49
+ "mypy-strict-kwargs==2026.10.19",
43
50
  "myst-parser==5.1.0",
44
51
  "no-defaults==2026.9.1",
45
- "prek==0.5.4",
52
+ "prek==0.5.9",
46
53
  "pydocstringformatter==1.0.0",
47
- "pylint[spelling]==4.0.9",
48
- "pylint-per-file-ignores==3.2.1",
49
- "pyproject-fmt==2.29.4",
50
- "pyrefly==1.3.1",
54
+ "pylint[spelling]==4.1.3",
55
+ "pylint-per-file-ignores==4.0.0",
56
+ "pyproject-fmt==2.30.3",
57
+ "pyrefly==1.4.0",
51
58
  "pyright==1.1.414",
52
59
  "pyroma==5.0.1",
53
- "pytest==9.1.1",
60
+ "pytest==9.2.0",
54
61
  "pytest-beartype==0.3.0",
55
62
  "pytest-cov==7.1",
56
63
  "pytest-regressions==2.11.0",
57
64
  "pytest-xdist==3.8.0",
58
65
  "respx==0.23.1",
59
- "ruff==0.16.9",
66
+ "ruff==0.17.3",
60
67
  "setuptools>=77",
61
68
  "setuptools-scm>=8.1",
62
69
  "shellcheck-py==0.11.0.1",
63
70
  "shfmt-py==4.2.0",
64
- "snapper-fmt==0.11.7",
71
+ "snapper-fmt==0.11.10",
65
72
  "sphinx>=8.1.3",
66
73
  "sphinx-click==6.2",
67
74
  "sphinx-lint==1.0.2",
68
75
  "sphinxcontrib-spelling==8.0.2",
69
- "strict-kwargs==2026.8.28.post2",
76
+ "strict-kwargs==2026.10.9",
70
77
  "towncrier==26.9",
71
78
  "twine==7.0.0",
72
- "ty==0.0.84",
73
- "vale==3.22.0.0",
79
+ "ty==0.0.96",
80
+ "vale==3.26.0.1",
74
81
  "vulture==2.16",
75
82
  "yamlfix==1.19.1",
76
- "zizmor==1.30.1",
83
+ "zizmor==1.32.0",
77
84
  ]
78
85
  binary = [ "pyinstaller>=6.12" ]
79
86
 
@@ -87,7 +94,8 @@ version_file = "src/hackerrank_cli/_version.py"
87
94
  version_scheme = "post-release"
88
95
 
89
96
  [tool.uv]
90
- required-version = "==0.12.19"
97
+ # Dependabot currently ships uv 0.12.18; CI pins uv separately.
98
+ required-version = ">=0.12.18"
91
99
 
92
100
  [tool.ruff]
93
101
  line-length = 79
@@ -191,7 +199,7 @@ ignore_names = [
191
199
 
192
200
  [tool.pyproject-fmt]
193
201
  keep_full_version = true
194
- max_supported_python = "3.14"
202
+ max_supported_python = "3.15"
195
203
 
196
204
  [tool.mypy]
197
205
  files = [ "." ]
@@ -201,6 +209,7 @@ follow_untyped_imports = true
201
209
  python_version = "3.13"
202
210
  strict = true
203
211
  plugins = [ "mypy_pytest_parametrize", "mypy_strict_kwargs" ]
212
+ show_traceback = true
204
213
  num_workers = "auto"
205
214
 
206
215
  [tool.pyrefly]
@@ -23,22 +23,26 @@ Symlinked
23
23
  Towncrier
24
24
  UTF
25
25
  Untagged
26
+ api
26
27
  autofix
27
28
  backend
28
29
  backoff
29
30
  basename
30
31
  bugfix
32
+ catalogue
31
33
  changelog
32
34
  cli
33
35
  dereference
34
36
  dereferenced
35
37
  dereferences
36
38
  dereferencing
39
+ discoverable
37
40
  docstrings
38
41
  filesystem
39
42
  frontend
40
43
  fullstack
41
44
  hackerrank
45
+ injectable
42
46
  jsonschema
43
47
  jsonschema's
44
48
  keychain
@@ -50,9 +54,11 @@ nonretryable
50
54
  prebuilt
51
55
  prek
52
56
  retryable
57
+ schemas
53
58
  scm
54
59
  setuptools
55
60
  src
61
+ stdin
56
62
  symlink
57
63
  symlinks
58
64
  uploader