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.
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/.github/dependabot.yml +2 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/.github/workflows/autofix.yml +3 -4
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/.github/workflows/binaries.yml +12 -4
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/.github/workflows/ci.yml +5 -5
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/.github/workflows/docs.yml +2 -2
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/.github/workflows/lint.yml +2 -2
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/.github/workflows/publish-site.yml +2 -2
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/.github/workflows/release.yml +2 -2
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/Dockerfile +4 -2
- {hackerrank_cli-2026.10.8/src/hackerrank_cli.egg-info → hackerrank_cli-2026.11.7}/PKG-INFO +43 -2
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/README.rst +40 -0
- hackerrank_cli-2026.11.7/VERSION +1 -0
- hackerrank_cli-2026.11.7/docs/source/changelog/2026.10.30.md +14 -0
- hackerrank_cli-2026.11.7/docs/source/changelog/2026.11.7.md +7 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/docs/source/development.rst +5 -5
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/flake.nix +14 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/prek.toml +0 -2
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/pyproject.toml +27 -18
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/spelling_private_dict.txt +6 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/src/hackerrank_cli/__init__.py +126 -4
- hackerrank_cli-2026.11.7/src/hackerrank_cli/_api.py +205 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/src/hackerrank_cli/_version.py +3 -3
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7/src/hackerrank_cli.egg-info}/PKG-INFO +43 -2
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/src/hackerrank_cli.egg-info/SOURCES.txt +9 -3
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/src/hackerrank_cli.egg-info/requires.txt +1 -1
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/src/hackerrank_cli.egg-info/scm_file_list.json +8 -2
- hackerrank_cli-2026.11.7/src/hackerrank_cli.egg-info/scm_version.json +8 -0
- hackerrank_cli-2026.11.7/tests/test_api.py +240 -0
- hackerrank_cli-2026.11.7/tests/test_help/test_help_questions_.txt +11 -0
- hackerrank_cli-2026.11.7/tests/test_help/test_help_questions_set_system_prompt_.txt +9 -0
- hackerrank_cli-2026.11.7/tests/test_help/test_help_root_.txt +11 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/tests/test_help.py +2 -1
- hackerrank_cli-2026.11.7/tests/test_system_prompt.py +266 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/uv.lock +694 -572
- hackerrank_cli-2026.10.8/VERSION +0 -1
- hackerrank_cli-2026.10.8/src/hackerrank_cli.egg-info/scm_version.json +0 -8
- hackerrank_cli-2026.10.8/tests/test_help/test_help_questions_.txt +0 -10
- hackerrank_cli-2026.10.8/tests/test_help/test_help_root_.txt +0 -10
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/.dockerignore +0 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/.gitattributes +0 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/.github/workflows/dependabot-merge.yml +0 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/.github/workflows/nix.yml +0 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/.gitignore +0 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/.vale.ini +0 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/LICENSE +0 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/MANIFEST.in +0 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/bin/__init__.py +0 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/bin/hackerrank_wrapper.py +0 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/docs/__init__.py +0 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/docs/source/__init__.py +0 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/docs/source/changelog/2026.10.1.1.md +0 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/docs/source/changelog/2026.10.7.md +0 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/docs/source/changelog/2026.10.8.md +0 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/docs/source/changelog.md +0 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/docs/source/cli.rst +0 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/docs/source/conf.py +0 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/docs/source/index.rst +0 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/docs/source/macos-releases.rst +0 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/docs/source/migration.rst +0 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/docs/source/usage.rst +0 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/flake.lock +0 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/newsfragments/.gitkeep +0 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/setup.cfg +0 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/src/hackerrank_cli/__main__.py +0 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/src/hackerrank_cli/_sources.py +0 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/src/hackerrank_cli/py.typed +0 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/src/hackerrank_cli.egg-info/dependency_links.txt +0 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/src/hackerrank_cli.egg-info/entry_points.txt +0 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/src/hackerrank_cli.egg-info/not-zip-safe +0 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/src/hackerrank_cli.egg-info/top_level.txt +0 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/styles/snapper/LongProseLine.yml +0 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/styles/snapper/SemanticLineBreaks.yml +0 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/tests/__init__.py +0 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/tests/test_archive.py +0 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/tests/test_cli.py +0 -0
- /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
- /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
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/tests/test_http.py +0 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/tests/test_sources.py +0 -0
- {hackerrank_cli-2026.10.8 → hackerrank_cli-2026.11.7}/zizmor.yml +0 -0
|
@@ -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
|
|
20
|
+
- uses: astral-sh/setup-uv@v10.3.2
|
|
22
21
|
with:
|
|
23
|
-
version: 0.
|
|
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
|
|
50
|
+
- uses: astral-sh/setup-uv@v10.3.2
|
|
51
51
|
with:
|
|
52
|
-
version: 0.
|
|
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@
|
|
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
|
-
|
|
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
|
|
27
|
+
- uses: astral-sh/setup-uv@v10.3.2
|
|
28
28
|
with:
|
|
29
|
-
version: 0.
|
|
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
|
|
40
|
+
- uses: astral-sh/setup-uv@v10.3.2
|
|
41
41
|
with:
|
|
42
|
-
version: 0.
|
|
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
|
|
22
|
+
- uses: astral-sh/setup-uv@v10.3.2
|
|
23
23
|
with:
|
|
24
|
-
version: 0.
|
|
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
|
|
30
|
+
- uses: astral-sh/setup-uv@v10.3.2
|
|
31
31
|
with:
|
|
32
|
-
version: 0.
|
|
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
|
|
26
|
+
- uses: astral-sh/setup-uv@v10.3.2
|
|
27
27
|
with:
|
|
28
|
-
version: 0.
|
|
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
|
|
19
|
+
- uses: astral-sh/setup-uv@v10.3.2
|
|
20
20
|
with:
|
|
21
|
-
version: 0.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
@@ -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
|
+
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
|
-
|
|
34
|
-
metadata updates, preserve text, binary contents and executable
|
|
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 = [
|
|
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.
|
|
41
|
-
"mypy-pytest-parametrize==2026.10.5",
|
|
42
|
-
"mypy-strict-kwargs==2026.
|
|
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.
|
|
52
|
+
"prek==0.5.9",
|
|
46
53
|
"pydocstringformatter==1.0.0",
|
|
47
|
-
"pylint[spelling]==4.
|
|
48
|
-
"pylint-per-file-ignores==
|
|
49
|
-
"pyproject-fmt==2.
|
|
50
|
-
"pyrefly==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.
|
|
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.
|
|
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.
|
|
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.
|
|
76
|
+
"strict-kwargs==2026.10.9",
|
|
70
77
|
"towncrier==26.9",
|
|
71
78
|
"twine==7.0.0",
|
|
72
|
-
"ty==0.0.
|
|
73
|
-
"vale==3.
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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
|