coderpad-py 2026.9.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 (71) hide show
  1. coderpad_py-2026.9.7/.git_archival.txt +1 -0
  2. coderpad_py-2026.9.7/.gitattributes +2 -0
  3. coderpad_py-2026.9.7/.github/dependabot.yml +19 -0
  4. coderpad_py-2026.9.7/.github/workflows/autofix.yml +37 -0
  5. coderpad_py-2026.9.7/.github/workflows/ci.yml +52 -0
  6. coderpad_py-2026.9.7/.github/workflows/dependabot-merge.yml +19 -0
  7. coderpad_py-2026.9.7/.github/workflows/lint.yml +57 -0
  8. coderpad_py-2026.9.7/.github/workflows/publish-site.yml +28 -0
  9. coderpad_py-2026.9.7/.github/workflows/release.yml +105 -0
  10. coderpad_py-2026.9.7/.gitignore +112 -0
  11. coderpad_py-2026.9.7/.prettierrc +11 -0
  12. coderpad_py-2026.9.7/.vale.ini +13 -0
  13. coderpad_py-2026.9.7/.vscode/extensions.json +6 -0
  14. coderpad_py-2026.9.7/.vscode/settings.json +15 -0
  15. coderpad_py-2026.9.7/CHANGELOG.rst +159 -0
  16. coderpad_py-2026.9.7/LICENSE +21 -0
  17. coderpad_py-2026.9.7/PKG-INFO +214 -0
  18. coderpad_py-2026.9.7/README.rst +137 -0
  19. coderpad_py-2026.9.7/conftest.py +82 -0
  20. coderpad_py-2026.9.7/docs/source/__init__.py +1 -0
  21. coderpad_py-2026.9.7/docs/source/api-reference.rst +36 -0
  22. coderpad_py-2026.9.7/docs/source/changelog.rst +1 -0
  23. coderpad_py-2026.9.7/docs/source/conf.py +110 -0
  24. coderpad_py-2026.9.7/docs/source/contributing.rst +93 -0
  25. coderpad_py-2026.9.7/docs/source/field-reference.rst +199 -0
  26. coderpad_py-2026.9.7/docs/source/index.rst +80 -0
  27. coderpad_py-2026.9.7/docs/source/openapi-spec.rst +56 -0
  28. coderpad_py-2026.9.7/docs/source/release-process.rst +22 -0
  29. coderpad_py-2026.9.7/docs/source/screen-usage.rst +30 -0
  30. coderpad_py-2026.9.7/docs/source/stability.rst +30 -0
  31. coderpad_py-2026.9.7/docs/source/unreleased.rst +8 -0
  32. coderpad_py-2026.9.7/docs/towncrier_template.rst.jinja +14 -0
  33. coderpad_py-2026.9.7/newsfragments/.gitkeep +0 -0
  34. coderpad_py-2026.9.7/openapi.json +4972 -0
  35. coderpad_py-2026.9.7/prek.toml +528 -0
  36. coderpad_py-2026.9.7/pyproject.toml +521 -0
  37. coderpad_py-2026.9.7/scripts/sync_openapi.py +20 -0
  38. coderpad_py-2026.9.7/setup.cfg +4 -0
  39. coderpad_py-2026.9.7/spelling_private_dict.txt +55 -0
  40. coderpad_py-2026.9.7/src/coderpad/__init__.py +104 -0
  41. coderpad_py-2026.9.7/src/coderpad/_dict_types.py +241 -0
  42. coderpad_py-2026.9.7/src/coderpad/_openapi_sync.py +117 -0
  43. coderpad_py-2026.9.7/src/coderpad/_question_content.py +39 -0
  44. coderpad_py-2026.9.7/src/coderpad/async_client.py +1020 -0
  45. coderpad_py-2026.9.7/src/coderpad/async_screen.py +374 -0
  46. coderpad_py-2026.9.7/src/coderpad/client.py +993 -0
  47. coderpad_py-2026.9.7/src/coderpad/exceptions.py +167 -0
  48. coderpad_py-2026.9.7/src/coderpad/py.typed +0 -0
  49. coderpad_py-2026.9.7/src/coderpad/screen.py +362 -0
  50. coderpad_py-2026.9.7/src/coderpad/screen_types.py +386 -0
  51. coderpad_py-2026.9.7/src/coderpad/transports.py +583 -0
  52. coderpad_py-2026.9.7/src/coderpad/types.py +1065 -0
  53. coderpad_py-2026.9.7/src/coderpad_py.egg-info/PKG-INFO +214 -0
  54. coderpad_py-2026.9.7/src/coderpad_py.egg-info/SOURCES.txt +69 -0
  55. coderpad_py-2026.9.7/src/coderpad_py.egg-info/dependency_links.txt +1 -0
  56. coderpad_py-2026.9.7/src/coderpad_py.egg-info/not-zip-safe +1 -0
  57. coderpad_py-2026.9.7/src/coderpad_py.egg-info/requires.txt +57 -0
  58. coderpad_py-2026.9.7/src/coderpad_py.egg-info/scm_file_list.json +65 -0
  59. coderpad_py-2026.9.7/src/coderpad_py.egg-info/scm_version.json +8 -0
  60. coderpad_py-2026.9.7/src/coderpad_py.egg-info/top_level.txt +1 -0
  61. coderpad_py-2026.9.7/tests/__init__.py +1 -0
  62. coderpad_py-2026.9.7/tests/conftest.py +320 -0
  63. coderpad_py-2026.9.7/tests/openapi_mock.py +237 -0
  64. coderpad_py-2026.9.7/tests/test_async_client.py +1413 -0
  65. coderpad_py-2026.9.7/tests/test_async_screen.py +261 -0
  66. coderpad_py-2026.9.7/tests/test_client.py +1651 -0
  67. coderpad_py-2026.9.7/tests/test_openapi_mock.py +143 -0
  68. coderpad_py-2026.9.7/tests/test_screen.py +225 -0
  69. coderpad_py-2026.9.7/tests/test_sync_openapi.py +158 -0
  70. coderpad_py-2026.9.7/tests/test_types.py +826 -0
  71. coderpad_py-2026.9.7/zizmor.yml +10 -0
@@ -0,0 +1 @@
1
+ ref-names: $Format:%D$
@@ -0,0 +1,2 @@
1
+ .git_archival.txt export-subst
2
+ * text=auto eol=lf
@@ -0,0 +1,19 @@
1
+ ---
2
+ version: 2
3
+
4
+ updates:
5
+ - package-ecosystem: pip
6
+ directory: /
7
+ schedule:
8
+ interval: daily
9
+ open-pull-requests-limit: 10
10
+ - package-ecosystem: github-actions
11
+ directory: /
12
+ schedule:
13
+ interval: daily
14
+ open-pull-requests-limit: 10
15
+
16
+ - package-ecosystem: pre-commit
17
+ directory: /
18
+ schedule:
19
+ interval: daily
@@ -0,0 +1,37 @@
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
+ fetch-tags: true
21
+ persist-credentials: false
22
+
23
+ - name: Install uv
24
+ uses: astral-sh/setup-uv@v10.0.1
25
+
26
+ - name: Run fixers
27
+ uses: j178/prek-action@v3.0.0
28
+ with:
29
+ prek-version: 0.4.11
30
+ extra-args: >-
31
+ --all-files --hook-stage pre-commit --no-fail-fast --verbose
32
+ env:
33
+ UV_NO_CACHE: '1'
34
+ UV_PYTHON: 3.13
35
+
36
+ - uses: autofix-ci/action@v1.3.4
37
+ if: always()
@@ -0,0 +1,52 @@
1
+ ---
2
+ name: Test
3
+
4
+ on:
5
+ push:
6
+ branches: [main]
7
+ pull_request:
8
+ branches: [main]
9
+ schedule:
10
+ # * is a special character in YAML so you have to quote this string
11
+ # Run at 1:00 every day
12
+ - cron: 0 1 * * *
13
+
14
+ permissions: {}
15
+
16
+ jobs:
17
+ build:
18
+ strategy:
19
+ matrix:
20
+ python-version: ['3.12', '3.13', '3.14']
21
+ platform: [ubuntu-latest, windows-latest]
22
+
23
+ runs-on: ${{ matrix.platform }}
24
+
25
+ steps:
26
+ - uses: actions/checkout@v7
27
+ with:
28
+ persist-credentials: false
29
+
30
+ - name: Install uv
31
+ uses: astral-sh/setup-uv@v10.0.1
32
+ with:
33
+ enable-cache: true
34
+ cache-dependency-glob: '**/pyproject.toml'
35
+
36
+ - name: Run tests
37
+ run: |
38
+ # We run tests against "." and not the tests directory as we test the README
39
+ # and documentation.
40
+ uv run --extra=dev --python=${{ matrix.python-version }} pytest -s -vvv --cov-fail-under 100 --cov=src/ --cov=tests/ .
41
+
42
+ completion-ci:
43
+ needs: build
44
+ runs-on: ubuntu-latest
45
+ if: always() # Run even if one matrix job fails
46
+ steps:
47
+ - name: Check matrix job status
48
+ run: |-
49
+ if ! ${{ needs.build.result == 'success' }}; then
50
+ echo "One or more matrix jobs failed"
51
+ exit 1
52
+ fi
@@ -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,57 @@
1
+ ---
2
+ name: Lint
3
+
4
+ on:
5
+ push:
6
+ branches: [main]
7
+ pull_request:
8
+ branches: [main]
9
+ schedule:
10
+ # * is a special character in YAML so you have to quote this string
11
+ # Run at 1:00 every day
12
+ - cron: 0 1 * * *
13
+
14
+ permissions: {}
15
+
16
+ jobs:
17
+ build:
18
+ strategy:
19
+ matrix:
20
+ python-version: ['3.13']
21
+ platform: [ubuntu-latest, windows-latest]
22
+ hook-stage: [pre-commit, pre-push, manual]
23
+
24
+ runs-on: ${{ matrix.platform }}
25
+
26
+ steps:
27
+ - uses: actions/checkout@v7
28
+ with:
29
+ persist-credentials: false
30
+
31
+ - name: Install uv
32
+ uses: astral-sh/setup-uv@v10.0.1
33
+ with:
34
+ enable-cache: true
35
+ cache-dependency-glob: '**/pyproject.toml'
36
+
37
+ - name: Lint
38
+ uses: j178/prek-action@v3.0.0
39
+ with:
40
+ prek-version: 0.4.11
41
+ extra-args: >-
42
+ --all-files --hook-stage ${{ matrix.hook-stage }} --verbose
43
+ env:
44
+ UV_NO_CACHE: '1'
45
+ UV_PYTHON: ${{ matrix.python-version }}
46
+
47
+ completion-lint:
48
+ needs: build
49
+ runs-on: ubuntu-latest
50
+ if: always() # Run even if one matrix job fails
51
+ steps:
52
+ - name: Check matrix job status
53
+ run: |-
54
+ if ! ${{ needs.build.result == 'success' }}; then
55
+ echo "One or more matrix jobs failed"
56
+ exit 1
57
+ fi
@@ -0,0 +1,28 @@
1
+ ---
2
+ name: Deploy documentation
3
+
4
+ on:
5
+ push:
6
+ branches: [main]
7
+ pull_request:
8
+ branches: [main]
9
+
10
+ jobs:
11
+ pages:
12
+ runs-on: ubuntu-latest
13
+ environment:
14
+ name: ${{ github.ref_name == 'main' && 'github-pages' || 'development' }}
15
+ url: ${{ steps.deployment.outputs.page_url }}
16
+ permissions:
17
+ pages: write
18
+ id-token: write
19
+ steps:
20
+ - id: deployment
21
+ uses: sphinx-notes/pages@v3
22
+ with:
23
+ documentation_path: docs/source
24
+ pyproject_extras: dev
25
+ python_version: '3.13'
26
+ sphinx_build_options: -W
27
+ cache: false
28
+ publish: ${{ github.ref_name == 'main' }}
@@ -0,0 +1,105 @@
1
+ ---
2
+ name: Release
3
+
4
+ on: workflow_dispatch
5
+
6
+ jobs:
7
+ build:
8
+ name: Publish a release
9
+ runs-on: ubuntu-latest
10
+
11
+ # Specifying an environment is strongly recommended by PyPI.
12
+ # See https://github.com/pypa/gh-action-pypi-publish/tree/release/v1/?tab=readme-ov-file#trusted-publishing.
13
+ environment: release
14
+
15
+ permissions:
16
+ # This is needed for PyPI publishing.
17
+ # See https://github.com/pypa/gh-action-pypi-publish/tree/release/v1/?tab=readme-ov-file#trusted-publishing.
18
+ id-token: write
19
+ # This is needed for https://github.com/stefanzweifel/git-auto-commit-action.
20
+ contents: write
21
+
22
+ steps:
23
+ - uses: actions/checkout@v7
24
+ with: # zizmor: ignore[artipacked] git-auto-commit-action requires credentials
25
+ # See
26
+ # https://github.com/stefanzweifel/git-auto-commit-action?tab=readme-ov-file#push-to-protected-branches
27
+ token: ${{ secrets.RELEASE_PAT }}
28
+ # Fetch all history including tags.
29
+ # Needed to find the latest tag.
30
+ #
31
+ # Also, avoids
32
+ # https://github.com/stefanzweifel/git-auto-commit-action/issues/99.
33
+ fetch-depth: 0
34
+
35
+ - name: Install uv
36
+ uses: astral-sh/setup-uv@v10.0.1
37
+ with:
38
+ enable-cache: true
39
+ cache-dependency-glob: '**/pyproject.toml'
40
+
41
+ - name: Calver calculate version
42
+ uses: StephaneBour/actions-calver@master
43
+ id: calver
44
+ with:
45
+ date_format: '%Y.%m.%d'
46
+ release: false
47
+ env:
48
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
49
+
50
+ # towncrier writes the rendered notes to stdout (informational
51
+ # chatter goes to stderr), so this is the curated release body for
52
+ # this version, not github-tag-action's commit-derived changelog.
53
+ - name: Generate the GitHub release notes
54
+ env:
55
+ RELEASE: ${{ steps.calver.outputs.release }}
56
+ run: uv run --extra=release towncrier build --draft --version "$RELEASE" >
57
+ release-notes.md
58
+
59
+ # Assemble the same fragments into CHANGELOG.rst under a new
60
+ # ``$RELEASE`` section and delete the consumed fragment files.
61
+ - name: Update the changelog
62
+ env:
63
+ RELEASE: ${{ steps.calver.outputs.release }}
64
+ run: uv run --extra=release towncrier build --yes --version "$RELEASE"
65
+
66
+ - uses: stefanzweifel/git-auto-commit-action@v7
67
+ id: commit
68
+ with:
69
+ commit_message: Bump CHANGELOG
70
+ file_pattern: CHANGELOG.rst newsfragments
71
+ # Error if there are no changes.
72
+ skip_dirty_check: true
73
+
74
+ - name: Bump version and push tag
75
+ id: tag_version
76
+ uses: mathieudutour/github-tag-action@v6.2
77
+ with:
78
+ github_token: ${{ secrets.GITHUB_TOKEN }}
79
+ custom_tag: ${{ steps.calver.outputs.release }}
80
+ tag_prefix: ''
81
+ commit_sha: ${{ steps.commit.outputs.commit_hash }}
82
+
83
+ - name: Create a GitHub release
84
+ uses: ncipollo/release-action@v1
85
+ with:
86
+ tag: ${{ steps.tag_version.outputs.new_tag }}
87
+ makeLatest: true
88
+ name: Release ${{ steps.tag_version.outputs.new_tag }}
89
+ bodyFile: release-notes.md
90
+
91
+ - name: Build a binary wheel and a source tarball
92
+ env:
93
+ NEW_TAG: ${{ steps.tag_version.outputs.new_tag }}
94
+ run: |
95
+ git fetch --tags
96
+ git checkout "$NEW_TAG"
97
+ uv build --sdist --wheel --out-dir dist/
98
+ uv run --extra=release check-wheel-contents dist/*.whl
99
+
100
+ - name: Publish distribution to PyPI
101
+ # We use PyPI trusted publishing rather than a PyPI API token.
102
+ # See https://github.com/pypa/gh-action-pypi-publish/tree/release/v1/?tab=readme-ov-file#trusted-publishing.
103
+ uses: pypa/gh-action-pypi-publish@release/v1
104
+ with:
105
+ verbose: true
@@ -0,0 +1,112 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ env/
12
+ build/
13
+ develop-eggs/
14
+ dist/
15
+ downloads/
16
+ eggs/
17
+ .eggs/
18
+ lib/
19
+ lib64/
20
+ parts/
21
+ sdist/
22
+ var/
23
+ wheels/
24
+ *.egg-info/
25
+ .installed.cfg
26
+ *.egg
27
+
28
+ # PyInstaller
29
+ # Usually these files are written by a python script from a template
30
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
31
+ *.manifest
32
+ *.spec
33
+
34
+ # Installer logs
35
+ pip-log.txt
36
+ pip-delete-this-directory.txt
37
+
38
+ # Unit test / coverage reports
39
+ htmlcov/
40
+ .tox/
41
+ .coverage
42
+ .coverage.*
43
+ .cache
44
+ nosetests.xml
45
+ coverage.xml
46
+ *,cover
47
+ .hypothesis/
48
+
49
+ # Translations
50
+ *.mo
51
+ *.pot
52
+
53
+ # Django stuff:
54
+ *.log
55
+ local_settings.py
56
+
57
+ # Flask stuff:
58
+ instance/
59
+ .webassets-cache
60
+
61
+ # Scrapy stuff:
62
+ .scrapy
63
+
64
+ # Sphinx documentation
65
+ docs/_build/
66
+
67
+ # PyBuilder
68
+ target/
69
+
70
+ # Jupyter Notebook
71
+ .ipynb_checkpoints
72
+
73
+ # pyenv
74
+ .python-version
75
+
76
+ # celery beat schedule file
77
+ celerybeat-schedule
78
+
79
+ # dotenv
80
+ .env
81
+
82
+ # virtualenv
83
+ .venv/
84
+ venv/
85
+ ENV/
86
+
87
+ # Spyder project settings
88
+ .spyderproject
89
+
90
+ # Rope project settings
91
+ .ropeproject
92
+
93
+ # mypy
94
+ .mypy_cache/
95
+
96
+ # Ignore Mac DS_Store files
97
+ .DS_Store
98
+ **/.DS_Store
99
+
100
+ # pyre
101
+ .pyre/
102
+
103
+ # pytest
104
+ .pytest_cache/
105
+
106
+ # setuptools_scm
107
+ src/*/_setuptools_scm_version.txt
108
+
109
+ uv.lock
110
+
111
+ # Vale styles downloaded by ``vale sync``
112
+ styles/
@@ -0,0 +1,11 @@
1
+ {
2
+ "overrides": [
3
+ {
4
+ "files": ["*.yaml", "*.yml"],
5
+ "options": {
6
+ "singleQuote": true,
7
+ "printWidth": 100
8
+ }
9
+ }
10
+ ]
11
+ }
@@ -0,0 +1,13 @@
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
8
+
9
+ # These rules misclassify established technical, example, or release-note prose
10
+ # in this repository. All other ai-tells rules remain enforced.
11
+ ai-tells.FigurativeLands = NO
12
+ ai-tells.FormalTransitions = NO
13
+ ai-tells.VerbTricolon = NO
@@ -0,0 +1,6 @@
1
+ {
2
+ "recommendations": [
3
+ "charliermarsh.ruff",
4
+ "ms-python.python"
5
+ ]
6
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "[python]": {
3
+ "editor.codeActionsOnSave": {
4
+ "source.fixAll": "explicit"
5
+ },
6
+ "editor.defaultFormatter": "charliermarsh.ruff",
7
+ "editor.formatOnSave": true
8
+ },
9
+ "esbonio.sphinx.confDir": "",
10
+ "python.testing.pytestArgs": [
11
+ "."
12
+ ],
13
+ "python.testing.unittestEnabled": false,
14
+ "python.testing.pytestEnabled": true
15
+ }
@@ -0,0 +1,159 @@
1
+ Changelog
2
+ =========
3
+
4
+ .. towncrier release notes start
5
+
6
+ 2026.09.07
7
+ ----------
8
+
9
+ - Removed ``client.quota.get()``. Use ``client.organization.get_quota()``,
10
+ which it only delegated to.
11
+
12
+ - Removed ``PadHistory.replay_to_file`` and ``coderpad.screen.save_screen_report``.
13
+ Callers can write replayed contents or report bytes with ``pathlib.Path``
14
+ directly.
15
+
16
+ - Add synchronous and asynchronous HTTPX2 transports while retaining HTTPX as
17
+ the default client family.
18
+
19
+ 2026.08.23
20
+ ----------
21
+
22
+ - Add ``pads.all()`` to iterate Interview pads across paginated responses.
23
+
24
+ - Add ``screen.tests.all()`` to iterate Screen tests across paginated responses.
25
+
26
+ - Expose ``prev_page`` on Interview API ``PaginatedList`` responses.
27
+
28
+ - Interview API types such as ``Pad``, ``Question``, and ``Language`` are now available from ``coderpad``.
29
+
30
+ - Exception classes such as ``CoderPadError`` and ``NotFoundError`` are now available from ``coderpad``.
31
+
32
+ - Documented which ``Question`` and ``Pad`` fields are writable versus read-only in a new "Writable and read-only fields" reference page.
33
+
34
+ - Validate that ``contents``, ``file_contents``, and ``zip_file`` are mutually exclusive on question create/update.
35
+
36
+ - Support configurable ``httpx`` timeouts on ``CoderPad`` and ``AsyncCoderPad``.
37
+
38
+ - Parse JSON API error bodies into optional ``CoderPadError.code`` and ``CoderPadError.message`` attributes.
39
+
40
+ - Added ``BadGatewayError``, ``ServiceUnavailableError``, and ``GatewayTimeoutError`` for HTTP 502, 503, and 504 responses.
41
+
42
+ - Defer Screen namespace initialization until first access on CoderPad clients.
43
+
44
+ - Fail fast with a clear error when Screen methods are called without a ``screen_api_key``.
45
+
46
+ - Support custom default headers on ``CoderPad`` and ``AsyncCoderPad``.
47
+
48
+ - Support configuring an ``httpx`` proxy on ``CoderPad`` and ``AsyncCoderPad``.
49
+
50
+ - Bump PyPI development status classifier from Planning to Beta.
51
+
52
+ - Fixed the README minimum Python version badge to match ``requires-python`` (3.12).
53
+
54
+ - Add Screen API usage documentation.
55
+
56
+ - Document the exception hierarchy in the Sphinx API reference.
57
+
58
+ - Add ``save_screen_report`` to write Screen report bytes to a file.
59
+
60
+ - ``SortOrder`` is now a ``StrEnum``, so its values work directly as query strings.
61
+
62
+ - ``Language`` is now a ``StrEnum``, so its values work directly in API requests.
63
+
64
+ - Add ``scripts/sync_openapi.py`` to normalize Postman OpenAPI exports
65
+ into the bundled ``openapi.json``.
66
+
67
+ - Load API keys from ``CODERPAD_API_KEY`` and ``CODERPAD_SCREEN_API_KEY`` via ``from_env()``.
68
+
69
+ - ``PaginatedList`` and ``ScreenTestsPage`` now include concise ``__repr__`` output for debugging.
70
+
71
+ - Add ``tests.report_json`` (sync and async) returning a typed
72
+ ``ScreenReport`` from the Screen test session payload.
73
+
74
+ - Document the public API stability policy.
75
+
76
+ - Add ``PadHistory.replay_to_file`` to write replayed editor contents to disk.
77
+
78
+ - Support configuring ``httpx`` connection pool limits on CoderPad clients.
79
+
80
+ - Document the maintainer workflow for empirically observed API variants
81
+ and link it to towncrier news fragments and the API drift issue template.
82
+
83
+ - Add ``client.quota.get()`` as an alias for ``client.organization.get_quota()``.
84
+
85
+ - Validate that Screen invitations include ``candidate_email`` and ``candidate_name`` before send.
86
+
87
+ 2026.08.16
88
+ ----------
89
+
90
+ - Add typed synchronous and asynchronous CoderPad Screen clients covering
91
+ campaigns, invitations, tests, reports, pagination, regions, and webhooks.
92
+
93
+ - Add synchronous and asynchronous organization user listing, with optional
94
+ server-side email filtering.
95
+
96
+ - Validate client form requests against request-body definitions in the bundled
97
+ OpenAPI specification during tests.
98
+
99
+ - API resource types are now strict, frozen Pydantic v2 models. Responses are
100
+ validated with ``model_validate`` and request models support
101
+ ``model_dump``. Beartype continues to provide runtime type checking
102
+ alongside Pydantic.
103
+
104
+ 2026.07.24
105
+ ----------
106
+
107
+ - Expose the optional ``ai_assist_custom_system_prompt`` field on question
108
+ responses so custom AI Assist prompts can be read and synchronized.
109
+
110
+ 2026.07.22.1
111
+ ------------
112
+
113
+ - Add ``ai_assist_custom_system_prompt`` to ``questions.update`` so AI Assist
114
+ system prompts can be synchronized for existing questions.
115
+
116
+ 2026.07.22
117
+ ----------
118
+
119
+ - Add synchronous and asynchronous support for retrieving and replaying per-file pad editor history.
120
+
121
+ - Support empirically observed API response variants for binary files, organization metadata, pad interviewer notifications, and question custom databases.
122
+
123
+ - Add an ``ai_assist_custom_system_prompt`` parameter to ``questions.create``
124
+ to configure AI Assist's system prompt for a question.
125
+
126
+ 2026.06.29
127
+ ----------
128
+
129
+ - Add a ``candidate_instructions`` parameter to ``questions.create`` and ``questions.update`` so progressively-revealed candidate instruction blocks can be authored via the API.
130
+
131
+ 2026.05.04
132
+ ----------
133
+
134
+
135
+ 2026.04.01
136
+ ----------
137
+
138
+
139
+ 2026.03.31.2
140
+ ------------
141
+
142
+
143
+ - Removed support for Python 3.11.
144
+ - Changed default ``base_url`` from ``https://api.interview.coderpad.io`` to ``https://app.coderpad.io``.
145
+
146
+ 2026.03.31.1
147
+ ------------
148
+
149
+
150
+ 2026.03.31
151
+ ----------
152
+
153
+
154
+ 2026.03.29.1
155
+ ------------
156
+
157
+
158
+ 2026.03.29
159
+ ----------
@@ -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.