hackerrank-cli 2026.10.1.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 (66) hide show
  1. hackerrank_cli-2026.10.1.1/.dockerignore +11 -0
  2. hackerrank_cli-2026.10.1.1/.gitattributes +1 -0
  3. hackerrank_cli-2026.10.1.1/.github/dependabot.yml +12 -0
  4. hackerrank_cli-2026.10.1.1/.github/workflows/autofix.yml +28 -0
  5. hackerrank_cli-2026.10.1.1/.github/workflows/binaries.yml +135 -0
  6. hackerrank_cli-2026.10.1.1/.github/workflows/ci.yml +56 -0
  7. hackerrank_cli-2026.10.1.1/.github/workflows/dependabot-merge.yml +19 -0
  8. hackerrank_cli-2026.10.1.1/.github/workflows/docs.yml +31 -0
  9. hackerrank_cli-2026.10.1.1/.github/workflows/lint.yml +37 -0
  10. hackerrank_cli-2026.10.1.1/.github/workflows/nix.yml +27 -0
  11. hackerrank_cli-2026.10.1.1/.github/workflows/publish-site.yml +36 -0
  12. hackerrank_cli-2026.10.1.1/.github/workflows/release.yml +97 -0
  13. hackerrank_cli-2026.10.1.1/.gitignore +18 -0
  14. hackerrank_cli-2026.10.1.1/.vale.ini +8 -0
  15. hackerrank_cli-2026.10.1.1/CHANGELOG.rst +16 -0
  16. hackerrank_cli-2026.10.1.1/Dockerfile +15 -0
  17. hackerrank_cli-2026.10.1.1/LICENSE +21 -0
  18. hackerrank_cli-2026.10.1.1/MANIFEST.in +13 -0
  19. hackerrank_cli-2026.10.1.1/PKG-INFO +143 -0
  20. hackerrank_cli-2026.10.1.1/README.rst +117 -0
  21. hackerrank_cli-2026.10.1.1/VERSION +1 -0
  22. hackerrank_cli-2026.10.1.1/bin/__init__.py +1 -0
  23. hackerrank_cli-2026.10.1.1/bin/hackerrank_wrapper.py +6 -0
  24. hackerrank_cli-2026.10.1.1/docs/__init__.py +1 -0
  25. hackerrank_cli-2026.10.1.1/docs/source/__init__.py +1 -0
  26. hackerrank_cli-2026.10.1.1/docs/source/changelog.rst +1 -0
  27. hackerrank_cli-2026.10.1.1/docs/source/cli.rst +6 -0
  28. hackerrank_cli-2026.10.1.1/docs/source/conf.py +17 -0
  29. hackerrank_cli-2026.10.1.1/docs/source/development.rst +156 -0
  30. hackerrank_cli-2026.10.1.1/docs/source/index.rst +12 -0
  31. hackerrank_cli-2026.10.1.1/docs/source/macos-releases.rst +102 -0
  32. hackerrank_cli-2026.10.1.1/docs/source/migration.rst +29 -0
  33. hackerrank_cli-2026.10.1.1/docs/source/usage.rst +1 -0
  34. hackerrank_cli-2026.10.1.1/flake.lock +99 -0
  35. hackerrank_cli-2026.10.1.1/flake.nix +140 -0
  36. hackerrank_cli-2026.10.1.1/newsfragments/.gitkeep +0 -0
  37. hackerrank_cli-2026.10.1.1/prek.toml +681 -0
  38. hackerrank_cli-2026.10.1.1/pyproject.toml +266 -0
  39. hackerrank_cli-2026.10.1.1/setup.cfg +4 -0
  40. hackerrank_cli-2026.10.1.1/spelling_private_dict.txt +64 -0
  41. hackerrank_cli-2026.10.1.1/src/hackerrank_cli/__init__.py +224 -0
  42. hackerrank_cli-2026.10.1.1/src/hackerrank_cli/__main__.py +5 -0
  43. hackerrank_cli-2026.10.1.1/src/hackerrank_cli/_sources.py +182 -0
  44. hackerrank_cli-2026.10.1.1/src/hackerrank_cli/_version.py +24 -0
  45. hackerrank_cli-2026.10.1.1/src/hackerrank_cli/py.typed +0 -0
  46. hackerrank_cli-2026.10.1.1/src/hackerrank_cli.egg-info/PKG-INFO +143 -0
  47. hackerrank_cli-2026.10.1.1/src/hackerrank_cli.egg-info/SOURCES.txt +64 -0
  48. hackerrank_cli-2026.10.1.1/src/hackerrank_cli.egg-info/dependency_links.txt +1 -0
  49. hackerrank_cli-2026.10.1.1/src/hackerrank_cli.egg-info/entry_points.txt +2 -0
  50. hackerrank_cli-2026.10.1.1/src/hackerrank_cli.egg-info/not-zip-safe +1 -0
  51. hackerrank_cli-2026.10.1.1/src/hackerrank_cli.egg-info/requires.txt +5 -0
  52. hackerrank_cli-2026.10.1.1/src/hackerrank_cli.egg-info/scm_file_list.json +58 -0
  53. hackerrank_cli-2026.10.1.1/src/hackerrank_cli.egg-info/scm_version.json +8 -0
  54. hackerrank_cli-2026.10.1.1/src/hackerrank_cli.egg-info/top_level.txt +1 -0
  55. hackerrank_cli-2026.10.1.1/styles/snapper/LongProseLine.yml +11 -0
  56. hackerrank_cli-2026.10.1.1/styles/snapper/SemanticLineBreaks.yml +11 -0
  57. hackerrank_cli-2026.10.1.1/tests/__init__.py +1 -0
  58. hackerrank_cli-2026.10.1.1/tests/test_cli.py +509 -0
  59. hackerrank_cli-2026.10.1.1/tests/test_help/test_help_questions_.txt +9 -0
  60. hackerrank_cli-2026.10.1.1/tests/test_help/test_help_root_.txt +10 -0
  61. hackerrank_cli-2026.10.1.1/tests/test_help/test_help_upload_.txt +15 -0
  62. hackerrank_cli-2026.10.1.1/tests/test_help.py +38 -0
  63. hackerrank_cli-2026.10.1.1/tests/test_http.py +397 -0
  64. hackerrank_cli-2026.10.1.1/tests/test_sources.py +274 -0
  65. hackerrank_cli-2026.10.1.1/uv.lock +2721 -0
  66. hackerrank_cli-2026.10.1.1/zizmor.yml +8 -0
@@ -0,0 +1,11 @@
1
+ .git
2
+ .venv
3
+ __pycache__
4
+ *.egg-info
5
+ build
6
+ dist
7
+ docs/build
8
+ .pytest_cache
9
+ .mypy_cache
10
+ .ruff_cache
11
+ .coverage*
@@ -0,0 +1 @@
1
+ * text=auto eol=lf
@@ -0,0 +1,12 @@
1
+ ---
2
+ version: 2
3
+
4
+ updates:
5
+ - package-ecosystem: uv
6
+ directory: /
7
+ schedule:
8
+ interval: daily
9
+ - package-ecosystem: github-actions
10
+ directory: /
11
+ schedule:
12
+ interval: weekly
@@ -0,0 +1,28 @@
1
+ ---
2
+ name: autofix.ci
3
+
4
+ on:
5
+ pull_request:
6
+ branches: [main]
7
+ push:
8
+ branches: [main]
9
+
10
+ permissions:
11
+ contents: read
12
+
13
+ jobs:
14
+ autofix:
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - uses: actions/checkout@v7
18
+ with:
19
+ fetch-depth: 0
20
+ persist-credentials: false
21
+ - uses: astral-sh/setup-uv@v10.2.0
22
+ with:
23
+ version: 0.12.19
24
+ python-version: '3.13'
25
+ - name: Run repository fixers and checks
26
+ run: uv run --locked prek run --all-files --stage pre-commit --no-fail-fast
27
+ - uses: autofix-ci/action@v1.3.4
28
+ if: always()
@@ -0,0 +1,135 @@
1
+ ---
2
+ name: Standalone binaries
3
+
4
+ on:
5
+ workflow_dispatch:
6
+ inputs:
7
+ notarize:
8
+ description: Sign and notarize the macOS artifact without publishing a release
9
+ type: boolean
10
+ default: false
11
+ workflow_call:
12
+ inputs:
13
+ notarize:
14
+ description: Require Developer ID signing and notarization for macOS releases
15
+ type: boolean
16
+ default: false
17
+ secrets:
18
+ DEVELOPER_ID_APP_CERT_P12_BASE64:
19
+ required: false
20
+ DEVELOPER_ID_APP_CERT_PASSWORD:
21
+ required: false
22
+ APPLE_ID:
23
+ required: false
24
+ APPLE_TEAM_ID:
25
+ required: false
26
+ APPLE_APP_PASSWORD:
27
+ required: false
28
+
29
+ permissions:
30
+ contents: read
31
+
32
+ jobs:
33
+ binary:
34
+ if: ${{ !inputs.notarize || github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/20') }}
35
+ strategy:
36
+ matrix:
37
+ include:
38
+ - os: ubuntu-latest
39
+ name: hackerrank-linux
40
+ - os: macos-latest
41
+ name: hackerrank-macos
42
+ - os: windows-latest
43
+ name: hackerrank-windows
44
+ runs-on: ${{ matrix.os }}
45
+ steps:
46
+ - uses: actions/checkout@v7
47
+ with:
48
+ persist-credentials: false
49
+ fetch-depth: 0
50
+ - uses: astral-sh/setup-uv@v10.2.0
51
+ with:
52
+ version: 0.12.19
53
+ python-version: '3.13'
54
+ - name: Require release credentials
55
+ if: runner.os == 'macOS' && inputs.notarize
56
+ env:
57
+ CERTIFICATE: ${{ secrets.DEVELOPER_ID_APP_CERT_P12_BASE64 }}
58
+ CERTIFICATE_PASSWORD: ${{ secrets.DEVELOPER_ID_APP_CERT_PASSWORD }}
59
+ APPLE_ID: ${{ secrets.APPLE_ID }}
60
+ APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
61
+ APPLE_APP_PASSWORD: ${{ secrets.APPLE_APP_PASSWORD }}
62
+ run: |
63
+ : "${CERTIFICATE:?Missing DEVELOPER_ID_APP_CERT_P12_BASE64}"
64
+ : "${CERTIFICATE_PASSWORD:?Missing DEVELOPER_ID_APP_CERT_PASSWORD}"
65
+ : "${APPLE_ID:?Missing APPLE_ID}" "${APPLE_TEAM_ID:?Missing APPLE_TEAM_ID}" "${APPLE_APP_PASSWORD:?Missing APPLE_APP_PASSWORD}"
66
+ # The action removes its temporary keychain in its post step.
67
+ - name: Import the Developer ID certificate
68
+ if: runner.os == 'macOS' && inputs.notarize
69
+ uses: Apple-Actions/import-codesign-certs@5142e029c445c10ffc7149d172e540235a065466 # v7.0.0
70
+ with:
71
+ p12-file-base64: ${{ secrets.DEVELOPER_ID_APP_CERT_P12_BASE64 }}
72
+ p12-password: ${{ secrets.DEVELOPER_ID_APP_CERT_PASSWORD }}
73
+ - name: Build binary
74
+ shell: bash
75
+ env:
76
+ NAME: ${{ matrix.name }}
77
+ NOTARIZE: ${{ inputs.notarize }}
78
+ run: |
79
+ signing=()
80
+ if [ "$RUNNER_OS" = macOS ] && [ "$NOTARIZE" = true ]; then
81
+ # Sign embedded libraries before packing the one-file archive.
82
+ # PyInstaller enables the hardened runtime and secure timestamp.
83
+ signing=(--codesign-identity "Developer ID Application")
84
+ fi
85
+ uv run --locked --group binary pyinstaller --clean --onefile --copy-metadata hackerrank-cli --name "$NAME" "${signing[@]}" bin/hackerrank_wrapper.py
86
+ - name: Verify Developer ID signature
87
+ if: runner.os == 'macOS' && inputs.notarize
88
+ run: codesign --verify --strict --verbose=2 dist/hackerrank-macos
89
+ - name: Smoke binary
90
+ shell: bash
91
+ env:
92
+ NAME: ${{ matrix.name }}
93
+ run: |
94
+ executable="dist/$NAME"
95
+ if [ "$RUNNER_OS" = Windows ]; then executable="$executable.exe"; fi
96
+ "$executable" --help
97
+ "$executable" --version
98
+ "$executable" questions upload --help
99
+ - name: Notarize macOS binary
100
+ if: runner.os == 'macOS' && inputs.notarize
101
+ env:
102
+ APPLE_ID: ${{ secrets.APPLE_ID }}
103
+ APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
104
+ APPLE_APP_PASSWORD: ${{ secrets.APPLE_APP_PASSWORD }}
105
+ run: |
106
+ archive="$RUNNER_TEMP/hackerrank-macos.zip"
107
+ result="$RUNNER_TEMP/notarization.json"
108
+ ditto -c -k --sequesterRsrc dist/hackerrank-macos "$archive"
109
+ xcrun notarytool submit "$archive" \
110
+ --apple-id "$APPLE_ID" --team-id "$APPLE_TEAM_ID" --password "$APPLE_APP_PASSWORD" \
111
+ --wait --timeout 30m --output-format json > "$result" || true
112
+ cat "$result"
113
+ # A rejected submission can still return exit status zero.
114
+ if ! jq -e '.status == "Accepted"' "$result" > /dev/null; then
115
+ submission_id=$(jq -r '.id // empty' "$result")
116
+ if [ -n "$submission_id" ]; then
117
+ xcrun notarytool log "$submission_id" \
118
+ --apple-id "$APPLE_ID" --team-id "$APPLE_TEAM_ID" --password "$APPLE_APP_PASSWORD" || true
119
+ fi
120
+ exit 1
121
+ fi
122
+ # A bare Mach-O cannot be stapled. Verify the online ticket, allowing
123
+ # time for Apple's service to propagate it after acceptance.
124
+ - name: Verify notarization ticket
125
+ if: runner.os == 'macOS' && inputs.notarize
126
+ uses: nick-fields/retry@v4
127
+ with:
128
+ timeout_seconds: 60
129
+ max_attempts: 10
130
+ retry_wait_seconds: 30
131
+ command: codesign -vvvv -R="notarized" --check-notarization dist/hackerrank-macos
132
+ - uses: actions/upload-artifact@v7
133
+ with:
134
+ name: ${{ matrix.name }}
135
+ path: dist/hackerrank-*
@@ -0,0 +1,56 @@
1
+ ---
2
+ name: CI
3
+
4
+ on:
5
+ push:
6
+ branches: [main]
7
+ pull_request:
8
+ workflow_dispatch:
9
+ schedule:
10
+ - cron: 0 1 * * *
11
+
12
+ permissions:
13
+ contents: read
14
+
15
+ jobs:
16
+ tests:
17
+ strategy:
18
+ matrix:
19
+ python: ['3.13', '3.14']
20
+ os: [ubuntu-latest, macos-latest, windows-latest]
21
+ runs-on: ${{ matrix.os }}
22
+ steps:
23
+ - uses: actions/checkout@v7
24
+ with:
25
+ persist-credentials: false
26
+ fetch-depth: 0
27
+ - uses: astral-sh/setup-uv@v10.2.0
28
+ with:
29
+ version: 0.12.19
30
+ python-version: ${{ matrix.python }}
31
+ enable-cache: true
32
+ - run: uv run --locked pytest
33
+ package:
34
+ runs-on: ubuntu-latest
35
+ steps:
36
+ - uses: actions/checkout@v7
37
+ with:
38
+ persist-credentials: false
39
+ fetch-depth: 0
40
+ - uses: astral-sh/setup-uv@v10.2.0
41
+ with:
42
+ version: 0.12.19
43
+ python-version: '3.13'
44
+ - run: uv build
45
+ - run: uv run --locked twine check dist/*
46
+ - run: uv run --locked check-wheel-contents dist/*.whl
47
+ - name: Smoke installed wheel
48
+ run: |
49
+ uv venv /tmp/hackerrank-wheel
50
+ uv pip install --python /tmp/hackerrank-wheel/bin/python dist/*.whl
51
+ cd /tmp
52
+ /tmp/hackerrank-wheel/bin/hackerrank --help
53
+ /tmp/hackerrank-wheel/bin/hackerrank --version
54
+ /tmp/hackerrank-wheel/bin/python -m hackerrank_cli questions upload --help
55
+ - run: docker build -t hackerrank-cli .
56
+ - run: docker run --rm hackerrank-cli --help
@@ -0,0 +1,19 @@
1
+ ---
2
+
3
+ name: Dependabot auto-merge
4
+ on: pull_request
5
+
6
+ permissions:
7
+ contents: write
8
+ pull-requests: write
9
+
10
+ jobs:
11
+ dependabot:
12
+ runs-on: ubuntu-latest
13
+ if: github.event.pull_request.user.login == 'dependabot[bot]'
14
+ steps:
15
+ - name: Enable auto-merge for Dependabot PRs
16
+ run: gh pr merge --auto --merge "$PR_URL"
17
+ env:
18
+ PR_URL: ${{github.event.pull_request.html_url}}
19
+ GH_TOKEN: ${{secrets.GITHUB_TOKEN}}
@@ -0,0 +1,31 @@
1
+ ---
2
+ name: Documentation
3
+
4
+ on:
5
+ push:
6
+ branches: [main]
7
+ pull_request:
8
+ workflow_dispatch:
9
+
10
+ permissions:
11
+ contents: read
12
+
13
+ jobs:
14
+ docs:
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - run: sudo apt-get update && sudo apt-get install --yes libenchant-2-2 hunspell-en-us
18
+ - uses: actions/checkout@v7
19
+ with:
20
+ persist-credentials: false
21
+ fetch-depth: 0
22
+ - uses: astral-sh/setup-uv@v10.2.0
23
+ with:
24
+ version: 0.12.19
25
+ python-version: '3.13'
26
+ - run: uv run --locked prek run --all-files --stage manual --group docs
27
+ - run: uv run --locked towncrier build --draft --version unreleased
28
+ - uses: actions/upload-artifact@v7
29
+ with:
30
+ name: documentation
31
+ path: docs/build/html
@@ -0,0 +1,37 @@
1
+ ---
2
+ name: Lint
3
+
4
+ on:
5
+ push:
6
+ branches: [main]
7
+ pull_request:
8
+ workflow_dispatch:
9
+ schedule:
10
+ - cron: 0 1 * * *
11
+
12
+ permissions:
13
+ contents: read
14
+
15
+ jobs:
16
+ lint:
17
+ name: ${{ matrix.os == 'ubuntu-latest' && 'lint' || 'lint-windows' }}
18
+ strategy:
19
+ fail-fast: false
20
+ matrix:
21
+ os: [ubuntu-latest, windows-latest]
22
+ runs-on: ${{ matrix.os }}
23
+ steps:
24
+ - if: runner.os == 'Linux'
25
+ run: sudo apt-get update && sudo apt-get install --yes libenchant-2-2 hunspell-en-us
26
+ - uses: actions/checkout@v7
27
+ with:
28
+ persist-credentials: false
29
+ fetch-depth: 0
30
+ - uses: astral-sh/setup-uv@v10.2.0
31
+ with:
32
+ version: 0.12.19
33
+ python-version: '3.13'
34
+ enable-cache: true
35
+ - run: uv run --locked prek run --all-files --no-fail-fast
36
+ - run: uv run --locked prek run --all-files --no-fail-fast --stage pre-push
37
+ - run: uv run --locked prek run --all-files --no-fail-fast --stage manual
@@ -0,0 +1,27 @@
1
+ ---
2
+ name: Nix
3
+
4
+ on:
5
+ push:
6
+ branches: [main]
7
+ pull_request:
8
+ workflow_dispatch:
9
+
10
+ permissions:
11
+ contents: read
12
+
13
+ jobs:
14
+ build:
15
+ strategy:
16
+ matrix:
17
+ os: [ubuntu-latest, macos-latest]
18
+ runs-on: ${{ matrix.os }}
19
+ steps:
20
+ - uses: actions/checkout@v7
21
+ with:
22
+ persist-credentials: false
23
+ fetch-depth: 0
24
+ - uses: DeterminateSystems/nix-installer-action@v23
25
+ - run: nix flake check
26
+ - run: nix build
27
+ - run: nix run . -- --help
@@ -0,0 +1,36 @@
1
+ ---
2
+ name: Deploy documentation
3
+
4
+ on:
5
+ workflow_dispatch:
6
+
7
+ permissions:
8
+ contents: read
9
+
10
+ jobs:
11
+ pages:
12
+ runs-on: ubuntu-latest
13
+ environment:
14
+ name: github-pages
15
+ url: ${{ steps.deployment.outputs.page_url }}
16
+ permissions:
17
+ contents: read
18
+ pages: write
19
+ id-token: write
20
+ steps:
21
+ - run: sudo apt-get update && sudo apt-get install --yes libenchant-2-2 hunspell-en-us
22
+ - uses: actions/checkout@v7
23
+ with:
24
+ persist-credentials: false
25
+ fetch-depth: 0
26
+ - uses: astral-sh/setup-uv@v10.2.0
27
+ with:
28
+ version: 0.12.19
29
+ python-version: '3.13'
30
+ - run: uv run --locked sphinx-build -W --keep-going -b html docs/source docs/build/html
31
+ - uses: actions/configure-pages@v6
32
+ - uses: actions/upload-pages-artifact@v5
33
+ with:
34
+ path: docs/build/html
35
+ - id: deployment
36
+ uses: actions/deploy-pages@v5
@@ -0,0 +1,97 @@
1
+ ---
2
+ name: Release
3
+
4
+ on:
5
+ push:
6
+ tags: [20*]
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ jobs:
12
+ validate:
13
+ runs-on: ubuntu-latest
14
+ steps:
15
+ - uses: actions/checkout@v7
16
+ with:
17
+ persist-credentials: false
18
+ fetch-depth: 0
19
+ - uses: astral-sh/setup-uv@v10.2.0
20
+ with:
21
+ version: 0.12.19
22
+ python-version: '3.13'
23
+ - run: uv run --locked pytest
24
+ - run: uv run --locked prek run --all-files
25
+ - run: uv run --locked prek run --all-files --stage pre-push
26
+ - run: uv run --locked sphinx-build -W -b html docs/source docs/build/html
27
+ - run: uv build
28
+ - run: uv run --locked twine check dist/*
29
+ - run: uv run --locked check-wheel-contents dist/*.whl
30
+ - uses: actions/upload-artifact@v7
31
+ with:
32
+ name: distributions
33
+ path: dist/*
34
+ binaries:
35
+ # actionlint 1.7.12 accepts ./ for local workflows and rejects $/.
36
+ uses: ./.github/workflows/binaries.yml # zizmor: ignore[self-repository]
37
+ with:
38
+ notarize: true
39
+ secrets:
40
+ DEVELOPER_ID_APP_CERT_P12_BASE64: ${{ secrets.DEVELOPER_ID_APP_CERT_P12_BASE64 }}
41
+ DEVELOPER_ID_APP_CERT_PASSWORD: ${{ secrets.DEVELOPER_ID_APP_CERT_PASSWORD }}
42
+ APPLE_ID: ${{ secrets.APPLE_ID }}
43
+ APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
44
+ APPLE_APP_PASSWORD: ${{ secrets.APPLE_APP_PASSWORD }}
45
+ publish:
46
+ needs: [validate, binaries]
47
+ runs-on: ubuntu-latest
48
+ environment: release
49
+ permissions:
50
+ id-token: write
51
+ steps:
52
+ - uses: actions/download-artifact@v8
53
+ with:
54
+ name: distributions
55
+ path: dist
56
+ - uses: pypa/gh-action-pypi-publish@release/v1
57
+ github-release:
58
+ needs: publish
59
+ runs-on: ubuntu-latest
60
+ permissions:
61
+ contents: write
62
+ steps:
63
+ - uses: actions/checkout@v7
64
+ with:
65
+ persist-credentials: false
66
+ - uses: actions/download-artifact@v8
67
+ with:
68
+ path: artifacts
69
+ - name: Attach distributions and binaries
70
+ env:
71
+ GH_TOKEN: ${{ github.token }}
72
+ TAG: ${{ github.ref_name }}
73
+ run: gh release create "$TAG" artifacts/distributions/* artifacts/hackerrank-*/*
74
+ --title "$TAG" --notes-file CHANGELOG.rst --verify-tag
75
+ docker:
76
+ needs: publish
77
+ runs-on: ubuntu-latest
78
+ permissions:
79
+ contents: read
80
+ packages: write
81
+ steps:
82
+ - uses: actions/checkout@v7
83
+ with:
84
+ persist-credentials: false
85
+ fetch-depth: 0
86
+ - uses: docker/setup-buildx-action@v4
87
+ - uses: docker/login-action@v4
88
+ with:
89
+ registry: ghcr.io
90
+ username: ${{ github.actor }}
91
+ password: ${{ github.token }}
92
+ - uses: docker/build-push-action@v7
93
+ with:
94
+ context: .
95
+ push: true
96
+ tags: ghcr.io/adamtheturtle/hackerrank-cli:${{ github.ref_name }},ghcr.io/adamtheturtle/hackerrank-cli:latest
97
+ build-args: HACKERRANK_CLI_VERSION=${{ github.ref_name }}
@@ -0,0 +1,18 @@
1
+ .venv/
2
+ __pycache__/
3
+ *.py[cod]
4
+ *.egg-info/
5
+ .coverage
6
+ .coverage.*
7
+ .pytest_cache/
8
+ .mypy_cache/
9
+ .ruff_cache/
10
+ src/hackerrank_cli/_version.py
11
+ build/
12
+ dist/
13
+ docs/build/
14
+ *.spec
15
+ styles/ai-tells/
16
+ doccmd_*
17
+ .pyrefly_cache/
18
+ styles/config/
@@ -0,0 +1,8 @@
1
+ StylesPath = styles
2
+ MinAlertLevel = error
3
+
4
+ Packages = https://github.com/tbhb/vale-ai-tells/releases/download/v1.29.0/ai-tells.zip
5
+
6
+ [*.{rst,md}]
7
+ BasedOnStyles = ai-tells, snapper
8
+ snapper.SemanticLineBreaks = error
@@ -0,0 +1,16 @@
1
+ Changelog
2
+ =========
3
+
4
+ Releases are assembled from ``newsfragments/`` using Towncrier.
5
+
6
+ .. towncrier release notes start
7
+
8
+ 2026.10.1.1 (2026-10-01)
9
+ ------------------------
10
+
11
+ Features
12
+ ~~~~~~~~
13
+
14
+ - Upload existing HackerRank project-question starter files from a directory or
15
+ a single file, with nested ignore rules, configurable exclusions, offline dry
16
+ runs, and SDK retry handling.
@@ -0,0 +1,15 @@
1
+ FROM python:3.13-slim AS build
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
4
+ WORKDIR /build
5
+ COPY . .
6
+ ARG HACKERRANK_CLI_VERSION=0.0.0
7
+ RUN SETUPTOOLS_SCM_PRETEND_VERSION_FOR_HACKERRANK_CLI=$HACKERRANK_CLI_VERSION uv build --wheel --out-dir /wheels
8
+
9
+ FROM python:3.13-slim
10
+ LABEL org.opencontainers.image.source="https://github.com/adamtheturtle/hackerrank-cli"
11
+ LABEL org.opencontainers.image.description="Upload HackerRank question starter code"
12
+ LABEL org.opencontainers.image.licenses="MIT"
13
+ COPY --from=build /wheels /wheels
14
+ RUN pip install --no-cache-dir /wheels/*.whl && rm -rf /wheels
15
+ ENTRYPOINT ["hackerrank"]
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Adam Dangoor
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,13 @@
1
+ include LICENSE README.rst CHANGELOG.rst VERSION
2
+ recursive-include src *.py *.typed
3
+ recursive-include docs *.rst *.py
4
+ recursive-include newsfragments *
5
+ include .vale.ini prek.toml spelling_private_dict.txt zizmor.yml
6
+ recursive-include styles/snapper *.yml
7
+ include .github/dependabot.yml
8
+ recursive-include .github/workflows *.yml
9
+ include Dockerfile flake.nix flake.lock uv.lock
10
+ recursive-include bin *.py
11
+ recursive-include tests *.py *.txt
12
+ include .dockerignore
13
+ include .gitattributes