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.
- hackerrank_cli-2026.10.1.1/.dockerignore +11 -0
- hackerrank_cli-2026.10.1.1/.gitattributes +1 -0
- hackerrank_cli-2026.10.1.1/.github/dependabot.yml +12 -0
- hackerrank_cli-2026.10.1.1/.github/workflows/autofix.yml +28 -0
- hackerrank_cli-2026.10.1.1/.github/workflows/binaries.yml +135 -0
- hackerrank_cli-2026.10.1.1/.github/workflows/ci.yml +56 -0
- hackerrank_cli-2026.10.1.1/.github/workflows/dependabot-merge.yml +19 -0
- hackerrank_cli-2026.10.1.1/.github/workflows/docs.yml +31 -0
- hackerrank_cli-2026.10.1.1/.github/workflows/lint.yml +37 -0
- hackerrank_cli-2026.10.1.1/.github/workflows/nix.yml +27 -0
- hackerrank_cli-2026.10.1.1/.github/workflows/publish-site.yml +36 -0
- hackerrank_cli-2026.10.1.1/.github/workflows/release.yml +97 -0
- hackerrank_cli-2026.10.1.1/.gitignore +18 -0
- hackerrank_cli-2026.10.1.1/.vale.ini +8 -0
- hackerrank_cli-2026.10.1.1/CHANGELOG.rst +16 -0
- hackerrank_cli-2026.10.1.1/Dockerfile +15 -0
- hackerrank_cli-2026.10.1.1/LICENSE +21 -0
- hackerrank_cli-2026.10.1.1/MANIFEST.in +13 -0
- hackerrank_cli-2026.10.1.1/PKG-INFO +143 -0
- hackerrank_cli-2026.10.1.1/README.rst +117 -0
- hackerrank_cli-2026.10.1.1/VERSION +1 -0
- hackerrank_cli-2026.10.1.1/bin/__init__.py +1 -0
- hackerrank_cli-2026.10.1.1/bin/hackerrank_wrapper.py +6 -0
- hackerrank_cli-2026.10.1.1/docs/__init__.py +1 -0
- hackerrank_cli-2026.10.1.1/docs/source/__init__.py +1 -0
- hackerrank_cli-2026.10.1.1/docs/source/changelog.rst +1 -0
- hackerrank_cli-2026.10.1.1/docs/source/cli.rst +6 -0
- hackerrank_cli-2026.10.1.1/docs/source/conf.py +17 -0
- hackerrank_cli-2026.10.1.1/docs/source/development.rst +156 -0
- hackerrank_cli-2026.10.1.1/docs/source/index.rst +12 -0
- hackerrank_cli-2026.10.1.1/docs/source/macos-releases.rst +102 -0
- hackerrank_cli-2026.10.1.1/docs/source/migration.rst +29 -0
- hackerrank_cli-2026.10.1.1/docs/source/usage.rst +1 -0
- hackerrank_cli-2026.10.1.1/flake.lock +99 -0
- hackerrank_cli-2026.10.1.1/flake.nix +140 -0
- hackerrank_cli-2026.10.1.1/newsfragments/.gitkeep +0 -0
- hackerrank_cli-2026.10.1.1/prek.toml +681 -0
- hackerrank_cli-2026.10.1.1/pyproject.toml +266 -0
- hackerrank_cli-2026.10.1.1/setup.cfg +4 -0
- hackerrank_cli-2026.10.1.1/spelling_private_dict.txt +64 -0
- hackerrank_cli-2026.10.1.1/src/hackerrank_cli/__init__.py +224 -0
- hackerrank_cli-2026.10.1.1/src/hackerrank_cli/__main__.py +5 -0
- hackerrank_cli-2026.10.1.1/src/hackerrank_cli/_sources.py +182 -0
- hackerrank_cli-2026.10.1.1/src/hackerrank_cli/_version.py +24 -0
- hackerrank_cli-2026.10.1.1/src/hackerrank_cli/py.typed +0 -0
- hackerrank_cli-2026.10.1.1/src/hackerrank_cli.egg-info/PKG-INFO +143 -0
- hackerrank_cli-2026.10.1.1/src/hackerrank_cli.egg-info/SOURCES.txt +64 -0
- hackerrank_cli-2026.10.1.1/src/hackerrank_cli.egg-info/dependency_links.txt +1 -0
- hackerrank_cli-2026.10.1.1/src/hackerrank_cli.egg-info/entry_points.txt +2 -0
- hackerrank_cli-2026.10.1.1/src/hackerrank_cli.egg-info/not-zip-safe +1 -0
- hackerrank_cli-2026.10.1.1/src/hackerrank_cli.egg-info/requires.txt +5 -0
- hackerrank_cli-2026.10.1.1/src/hackerrank_cli.egg-info/scm_file_list.json +58 -0
- hackerrank_cli-2026.10.1.1/src/hackerrank_cli.egg-info/scm_version.json +8 -0
- hackerrank_cli-2026.10.1.1/src/hackerrank_cli.egg-info/top_level.txt +1 -0
- hackerrank_cli-2026.10.1.1/styles/snapper/LongProseLine.yml +11 -0
- hackerrank_cli-2026.10.1.1/styles/snapper/SemanticLineBreaks.yml +11 -0
- hackerrank_cli-2026.10.1.1/tests/__init__.py +1 -0
- hackerrank_cli-2026.10.1.1/tests/test_cli.py +509 -0
- hackerrank_cli-2026.10.1.1/tests/test_help/test_help_questions_.txt +9 -0
- hackerrank_cli-2026.10.1.1/tests/test_help/test_help_root_.txt +10 -0
- hackerrank_cli-2026.10.1.1/tests/test_help/test_help_upload_.txt +15 -0
- hackerrank_cli-2026.10.1.1/tests/test_help.py +38 -0
- hackerrank_cli-2026.10.1.1/tests/test_http.py +397 -0
- hackerrank_cli-2026.10.1.1/tests/test_sources.py +274 -0
- hackerrank_cli-2026.10.1.1/uv.lock +2721 -0
- hackerrank_cli-2026.10.1.1/zizmor.yml +8 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
* text=auto eol=lf
|
|
@@ -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,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
|