irusdk 0.1.0__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 (89) hide show
  1. irusdk-0.1.0/.github/CODEOWNERS +1 -0
  2. irusdk-0.1.0/.github/ISSUE_TEMPLATE/bug_report.yml +147 -0
  3. irusdk-0.1.0/.github/ISSUE_TEMPLATE/config.yml +11 -0
  4. irusdk-0.1.0/.github/ISSUE_TEMPLATE/feature_request.yml +79 -0
  5. irusdk-0.1.0/.github/ISSUE_TEMPLATE/feedback.yml +42 -0
  6. irusdk-0.1.0/.github/dependabot.yml +21 -0
  7. irusdk-0.1.0/.github/workflows/build-release-publish.yml +107 -0
  8. irusdk-0.1.0/.github/workflows/run-tests.yml +42 -0
  9. irusdk-0.1.0/.gitignore +163 -0
  10. irusdk-0.1.0/.pre-commit-config.yaml +76 -0
  11. irusdk-0.1.0/.python-version +1 -0
  12. irusdk-0.1.0/.readthedocs.yaml +17 -0
  13. irusdk-0.1.0/CHANGELOG.md +46 -0
  14. irusdk-0.1.0/CLAUDE.md +98 -0
  15. irusdk-0.1.0/LICENSE +201 -0
  16. irusdk-0.1.0/Makefile +62 -0
  17. irusdk-0.1.0/PKG-INFO +199 -0
  18. irusdk-0.1.0/README.md +140 -0
  19. irusdk-0.1.0/docs/_static/css/custom.css +11 -0
  20. irusdk-0.1.0/docs/conf.py +123 -0
  21. irusdk-0.1.0/docs/contributing/adding-an-endpoint.md +139 -0
  22. irusdk-0.1.0/docs/contributing/api-spec.md +81 -0
  23. irusdk-0.1.0/docs/guide/authentication.md +60 -0
  24. irusdk-0.1.0/docs/guide/cli.md +63 -0
  25. irusdk-0.1.0/docs/guide/errors.md +86 -0
  26. irusdk-0.1.0/docs/guide/pagination.md +76 -0
  27. irusdk-0.1.0/docs/guide/quickstart.md +46 -0
  28. irusdk-0.1.0/docs/guide/scope.md +76 -0
  29. irusdk-0.1.0/docs/guide/sync-and-async.md +87 -0
  30. irusdk-0.1.0/docs/index.md +101 -0
  31. irusdk-0.1.0/docs/reference/clients.md +25 -0
  32. irusdk-0.1.0/docs/reference/exceptions.md +20 -0
  33. irusdk-0.1.0/docs/reference/index.md +17 -0
  34. irusdk-0.1.0/docs/reference/models.md +85 -0
  35. irusdk-0.1.0/docs/reference/services.md +44 -0
  36. irusdk-0.1.0/pyproject.toml +138 -0
  37. irusdk-0.1.0/src/irusdk/__about__.py +2 -0
  38. irusdk-0.1.0/src/irusdk/__init__.py +35 -0
  39. irusdk-0.1.0/src/irusdk/_core/__init__.py +0 -0
  40. irusdk-0.1.0/src/irusdk/_core/config.py +52 -0
  41. irusdk-0.1.0/src/irusdk/_core/errors.py +155 -0
  42. irusdk-0.1.0/src/irusdk/_core/pagination.py +247 -0
  43. irusdk-0.1.0/src/irusdk/_core/ratelimit.py +81 -0
  44. irusdk-0.1.0/src/irusdk/_core/retry.py +107 -0
  45. irusdk-0.1.0/src/irusdk/_core/spec.py +98 -0
  46. irusdk-0.1.0/src/irusdk/_core/urls.py +56 -0
  47. irusdk-0.1.0/src/irusdk/_endpoints/__init__.py +0 -0
  48. irusdk-0.1.0/src/irusdk/_endpoints/blueprints.py +86 -0
  49. irusdk-0.1.0/src/irusdk/_endpoints/devices.py +87 -0
  50. irusdk-0.1.0/src/irusdk/_endpoints/tags.py +38 -0
  51. irusdk-0.1.0/src/irusdk/_endpoints/users.py +47 -0
  52. irusdk-0.1.0/src/irusdk/_transport/__init__.py +0 -0
  53. irusdk-0.1.0/src/irusdk/_transport/_common.py +181 -0
  54. irusdk-0.1.0/src/irusdk/_transport/async_transport.py +243 -0
  55. irusdk-0.1.0/src/irusdk/_transport/sync_transport.py +225 -0
  56. irusdk-0.1.0/src/irusdk/cli/__init__.py +44 -0
  57. irusdk-0.1.0/src/irusdk/cli/_console.py +114 -0
  58. irusdk-0.1.0/src/irusdk/cli/_helpers.py +60 -0
  59. irusdk-0.1.0/src/irusdk/cli/blueprints.py +66 -0
  60. irusdk-0.1.0/src/irusdk/cli/devices.py +88 -0
  61. irusdk-0.1.0/src/irusdk/cli/tags.py +57 -0
  62. irusdk-0.1.0/src/irusdk/cli/users.py +55 -0
  63. irusdk-0.1.0/src/irusdk/client.py +154 -0
  64. irusdk-0.1.0/src/irusdk/models/__init__.py +35 -0
  65. irusdk-0.1.0/src/irusdk/models/base.py +63 -0
  66. irusdk-0.1.0/src/irusdk/models/blueprints.py +76 -0
  67. irusdk-0.1.0/src/irusdk/models/common.py +31 -0
  68. irusdk-0.1.0/src/irusdk/models/devices.py +115 -0
  69. irusdk-0.1.0/src/irusdk/models/library.py +24 -0
  70. irusdk-0.1.0/src/irusdk/models/tags.py +15 -0
  71. irusdk-0.1.0/src/irusdk/models/users.py +51 -0
  72. irusdk-0.1.0/src/irusdk/py.typed +0 -0
  73. irusdk-0.1.0/src/irusdk/services/__init__.py +28 -0
  74. irusdk-0.1.0/src/irusdk/services/blueprints.py +209 -0
  75. irusdk-0.1.0/src/irusdk/services/devices.py +220 -0
  76. irusdk-0.1.0/src/irusdk/services/tags.py +96 -0
  77. irusdk-0.1.0/src/irusdk/services/users.py +117 -0
  78. irusdk-0.1.0/tests/conftest.py +116 -0
  79. irusdk-0.1.0/tests/test_cli.py +195 -0
  80. irusdk-0.1.0/tests/test_client.py +106 -0
  81. irusdk-0.1.0/tests/test_core.py +139 -0
  82. irusdk-0.1.0/tests/test_models.py +124 -0
  83. irusdk-0.1.0/tests/test_pagination_strategies.py +117 -0
  84. irusdk-0.1.0/tests/test_pagination_transport.py +89 -0
  85. irusdk-0.1.0/tests/test_parity.py +80 -0
  86. irusdk-0.1.0/tests/test_prefetch.py +112 -0
  87. irusdk-0.1.0/tests/test_services.py +139 -0
  88. irusdk-0.1.0/tests/test_transport.py +182 -0
  89. irusdk-0.1.0/uv.lock +1361 -0
@@ -0,0 +1 @@
1
+ * @liquidz00
@@ -0,0 +1,147 @@
1
+ name: Bug report
2
+ description: Report a defect in irusdk
3
+ title: "[BUG] "
4
+ labels: ["bug"]
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: |
9
+ Thanks for taking the time to file a bug report. The more details you can provide, the faster the fix.
10
+
11
+ - type: dropdown
12
+ id: surface
13
+ attributes:
14
+ label: How are you using irusdk?
15
+ options:
16
+ - Python library
17
+ - CLI (`irusdk`)
18
+ - Both
19
+ validations:
20
+ required: true
21
+
22
+ - type: dropdown
23
+ id: client
24
+ attributes:
25
+ label: Which client?
26
+ description: The CLI drives the synchronous client, so pick that if you're unsure.
27
+ options:
28
+ - Synchronous (`IruClient`)
29
+ - Asynchronous (`AsyncIruClient`)
30
+ - Both
31
+ - Not applicable
32
+ validations:
33
+ required: true
34
+
35
+ - type: textarea
36
+ id: description
37
+ attributes:
38
+ label: Describe the issue
39
+ description: What is not working as expected?
40
+ validations:
41
+ required: true
42
+
43
+ - type: textarea
44
+ id: reproduction
45
+ attributes:
46
+ label: Steps to reproduce
47
+ description: |
48
+ The smallest snippet or command that triggers the problem. Replace your tenant and token with placeholders.
49
+ render: python
50
+ placeholder: |
51
+ from irusdk import IruClient
52
+
53
+ client = IruClient(subdomain="mycompany", token="...")
54
+
55
+ for device in client.devices.list(platform="Mac"):
56
+ print(device.device_name)
57
+
58
+ # Or, for a CLI issue:
59
+ # irusdk devices list --platform Mac
60
+ validations:
61
+ required: true
62
+
63
+ - type: textarea
64
+ id: expected
65
+ attributes:
66
+ label: Expected behavior
67
+ description: A clear and concise description of what you expected to happen.
68
+ validations:
69
+ required: true
70
+
71
+ - type: textarea
72
+ id: actual
73
+ attributes:
74
+ label: Actual behavior / error message
75
+ description: |
76
+ What happened instead? Please copy and paste the exact error message or full traceback.
77
+ render: text
78
+ placeholder: |
79
+ irusdk._core.errors.AuthenticationError: Authentication failed (status_code: 403 | url: https://mycompany.api.kandji.io/api/v1/devices | detail: You do not have permission to perform this action.)
80
+ validations:
81
+ required: true
82
+
83
+ - type: input
84
+ id: irusdk-version
85
+ attributes:
86
+ label: irusdk version
87
+ description: 'Output of `python -c "import irusdk; print(irusdk.__version__)"`, or `irusdk --version`'
88
+ placeholder: "0.1.0"
89
+ validations:
90
+ required: true
91
+
92
+ - type: input
93
+ id: python-version
94
+ attributes:
95
+ label: Python version
96
+ description: 'Output of `python --version`'
97
+ placeholder: "3.13.2"
98
+ validations:
99
+ required: true
100
+
101
+ - type: input
102
+ id: os
103
+ attributes:
104
+ label: Operating system
105
+ description: Where the code is running — your Mac, a CI runner, a container.
106
+ placeholder: "macOS 26.4.1 / ubuntu-latest / python:3.13-slim"
107
+ validations:
108
+ required: false
109
+
110
+ - type: dropdown
111
+ id: region
112
+ attributes:
113
+ label: Tenant region
114
+ description: Only relevant if the issue involves connecting to your tenant at all.
115
+ options:
116
+ - US
117
+ - EU
118
+ - Not sure / not relevant
119
+ validations:
120
+ required: false
121
+
122
+ - type: markdown
123
+ attributes:
124
+ value: |
125
+ ### Logs
126
+
127
+ `irusdk` logs to the `irusdk` logger; enable `DEBUG` to capture retries and request details:
128
+
129
+ ```python
130
+ import logging
131
+ logging.basicConfig(level=logging.DEBUG)
132
+ ```
133
+
134
+ **Debug output can contain sensitive information** — your API token, tenant subdomain, device
135
+ serial numbers, and user email addresses. Please review and redact before sharing publicly.
136
+
137
+ - **Preferred (private)**: DM the maintainer in the [MacAdmins Slack](https://macadmins.slack.com/team/U04EC7ZN4SJ).
138
+ - **Public**: paste below, but only after removing sensitive data.
139
+
140
+ - type: textarea
141
+ id: logs
142
+ attributes:
143
+ label: Logs (optional, public)
144
+ description: Paste here only if you're comfortable. Redact your token, tenant, serials, and emails first.
145
+ render: text
146
+ validations:
147
+ required: false
@@ -0,0 +1,11 @@
1
+ blank_issues_enabled: false
2
+ contact_links:
3
+ - name: Documentation
4
+ url: https://irusdk.readthedocs.io/en/latest
5
+ about: Browse the user guide and API reference before opening an issue.
6
+ - name: Managing library content (Custom Apps, Scripts, Profiles)
7
+ url: https://github.com/kandji-inc/iructl
8
+ about: irusdk does not author library content by design. Use iructl, Iru's own tool, for that.
9
+ - name: MacAdmins Slack
10
+ url: https://macadmins.slack.com
11
+ about: For questions and general discussion rather than a specific defect or request.
@@ -0,0 +1,79 @@
1
+ name: Feature request
2
+ description: Suggest an idea for irusdk
3
+ title: "[FEATURE] "
4
+ labels: ["enhancement"]
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: |
9
+ Thanks for the suggestion! The more context you provide, the better.
10
+
11
+ **Before you file:** `irusdk` covers the *fleet* surface of the Iru API — devices, blueprints,
12
+ users, and tags. It deliberately does not author library content (Custom Apps, Scripts,
13
+ Profiles, In-House Apps); Iru's own [`iructl`](https://github.com/kandji-inc/iructl) does that
14
+ job well. See [Scope](https://irusdk.readthedocs.io/en/latest/guide/scope.html).
15
+
16
+ - type: dropdown
17
+ id: area
18
+ attributes:
19
+ label: What area does this touch?
20
+ options:
21
+ - Devices
22
+ - Blueprints
23
+ - Users or tags
24
+ - An unwrapped endpoint (Prism, vulnerabilities, threats, audit events, ADE)
25
+ - Core (pagination, retries, rate limiting, errors, models)
26
+ - CLI
27
+ - Documentation
28
+ - Something else
29
+ validations:
30
+ required: true
31
+
32
+ - type: textarea
33
+ id: current-behavior
34
+ attributes:
35
+ label: Current behavior
36
+ description: |
37
+ Briefly describe how irusdk currently behaves, or what is missing, that prompted this request.
38
+ validations:
39
+ required: true
40
+
41
+ - type: textarea
42
+ id: proposed-change
43
+ attributes:
44
+ label: Proposed change
45
+ description: A description of the feature or improvement you are suggesting. Focus on what you'd like to see happen.
46
+ validations:
47
+ required: true
48
+
49
+ - type: textarea
50
+ id: additional-context
51
+ attributes:
52
+ label: Additional context
53
+ description: |
54
+ Anything that would help others understand your proposal — a link to the relevant
55
+ [Iru API documentation](https://api-docs.iru.com), an example response payload, or the
56
+ workflow you are trying to automate.
57
+ validations:
58
+ required: false
59
+
60
+ - type: textarea
61
+ id: sample-code
62
+ attributes:
63
+ label: Sample code (optional)
64
+ description: How you would like the API to look. Pseudo-code is fine.
65
+ render: python
66
+ placeholder: |
67
+ for detection in client.vulnerabilities.detections(severity="critical"):
68
+ print(detection.cve_id, detection.device_name)
69
+ validations:
70
+ required: false
71
+
72
+ - type: input
73
+ id: related-issues
74
+ attributes:
75
+ label: Related issues (optional)
76
+ description: Link to any existing or previously closed issues related to this request.
77
+ placeholder: "#123, #456"
78
+ validations:
79
+ required: false
@@ -0,0 +1,42 @@
1
+ name: Feedback
2
+ description: Share your thoughts about irusdk
3
+ title: "[FEEDBACK] "
4
+ labels: ["feedback"]
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: |
9
+ Thanks for sharing! All feedback is welcome — what's working, what's not, what's confusing.
10
+
11
+ Thoughts on the API surface, naming, or documentation are especially useful while the SDK is
12
+ pre-1.0 and things can still change without breaking anyone.
13
+
14
+ - type: dropdown
15
+ id: area
16
+ attributes:
17
+ label: What is this about?
18
+ options:
19
+ - The Python API (naming, ergonomics, typing)
20
+ - Documentation
21
+ - The CLI
22
+ - Scope — what the SDK does and does not cover
23
+ - General impressions
24
+ - Something else
25
+ validations:
26
+ required: true
27
+
28
+ - type: textarea
29
+ id: feedback
30
+ attributes:
31
+ label: Your feedback
32
+ description: A clear and concise description of your feedback.
33
+ validations:
34
+ required: true
35
+
36
+ - type: textarea
37
+ id: additional-context
38
+ attributes:
39
+ label: Additional context
40
+ description: Any other context, code snippets, or screenshots related to your feedback.
41
+ validations:
42
+ required: false
@@ -0,0 +1,21 @@
1
+ version: 2
2
+ updates:
3
+
4
+ # GitHub Actions
5
+ - package-ecosystem: "github-actions"
6
+ directory: "/"
7
+ schedule:
8
+ interval: "monthly"
9
+ groups:
10
+ github-actions:
11
+ patterns: ["*"]
12
+
13
+ # Python (uv-managed). Groups all updates into a single weekly PR
14
+ # to avoid noise — security alerts still fire individually as needed.
15
+ - package-ecosystem: "uv"
16
+ directory: "/"
17
+ schedule:
18
+ interval: "weekly"
19
+ groups:
20
+ python-deps:
21
+ patterns: ["*"]
@@ -0,0 +1,107 @@
1
+ name: Build, Release and Publish
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ inputs:
6
+ contributors:
7
+ description: "Contributors for this release"
8
+ required: false
9
+ default: ''
10
+
11
+ permissions:
12
+ contents: write
13
+ id-token: write
14
+
15
+ jobs:
16
+ build-and-release:
17
+ name: Build, Release, and Publish to PyPi
18
+ runs-on: ubuntu-latest
19
+
20
+ steps:
21
+ - name: Checkout repository
22
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
23
+
24
+ - name: Install uv
25
+ uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
26
+ with:
27
+ enable-cache: true
28
+ cache-dependency-glob: "uv.lock"
29
+
30
+ - name: Set up Python
31
+ run: uv python install 3.12
32
+
33
+ - name: Sync dependencies
34
+ run: uv sync --extra dev
35
+
36
+ - name: Read release version
37
+ id: version
38
+ run: |
39
+ VERSION=$(uv run python -c 'from irusdk.__about__ import __version__; print(__version__)')
40
+ echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
41
+ echo "Building version: ${VERSION}"
42
+
43
+ - name: Check if tag exists
44
+ env:
45
+ VERSION: ${{ steps.version.outputs.version }}
46
+ run: |
47
+ # Anchored so v0.1.1 doesn't match an existing v0.1.10.
48
+ if git ls-remote --tags origin | grep -qE "refs/tags/v${VERSION}$"; then
49
+ echo "Tag v${VERSION} already exists!"
50
+ exit 1
51
+ fi
52
+
53
+ - name: Build distribution packages
54
+ run: make build
55
+
56
+ - name: Store distribution package
57
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
58
+ with:
59
+ name: irusdk-${{ steps.version.outputs.version }}
60
+ path: dist/
61
+
62
+ - name: Publish package to PyPI
63
+ id: publish_pypi
64
+ uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
65
+
66
+ - name: Get Changelog updates
67
+ id: changelog_reader
68
+ uses: mindsers/changelog-reader-action@1faaf50aa09d5793d9a100819973df801febfb31 # v2.4.0
69
+ with:
70
+ validation_depth: 100
71
+ version: v${{ steps.version.outputs.version }}
72
+
73
+ - name: Generate changelog
74
+ id: changelog
75
+ uses: metcalfc/changelog-generator@98b12822c5dc6bad335d1d60d920cb69831b9c5d # v4.8.0
76
+ continue-on-error: true # don't block releases
77
+ with:
78
+ myToken: ${{ secrets.GITHUB_TOKEN }}
79
+ reverse: 'true'
80
+
81
+ - name: Create Release
82
+ id: create_release
83
+ if: ${{ steps.publish_pypi.outcome == 'success' }}
84
+ uses: softprops/action-gh-release@3d0d9888cb7fd7b750713d6e236d1fcb99157228 # v3.0.2
85
+ with:
86
+ name: irusdk ${{ steps.version.outputs.version }}
87
+ tag_name: v${{ steps.version.outputs.version }}
88
+ draft: false
89
+ prerelease: false
90
+ token: ${{ secrets.GITHUB_TOKEN }}
91
+ files: |
92
+ ./dist/*.tar.gz
93
+ ./dist/*.whl
94
+ body: |
95
+ # Release Notes
96
+ This release has been automatically generated by a GitHub Action.
97
+ For detailed installation instructions, please refer to the [README](https://github.com/liquidz00/irusdk/blob/main/README.md).
98
+
99
+ ## Changelog for this release
100
+ This amended changelog is specific to this release. View the [full changelog](https://github.com/liquidz00/irusdk/blob/main/CHANGELOG.md) for all details.
101
+ ${{ steps.changelog_reader.outputs.changes }}
102
+
103
+ ## Changes
104
+ ${{ steps.changelog.outputs.changelog }}
105
+
106
+ ### Contributors
107
+ ${{ github.event.inputs.contributors }}
@@ -0,0 +1,42 @@
1
+ name: Run Tests
2
+
3
+ on: [push, pull_request]
4
+
5
+ permissions: read-all
6
+
7
+ jobs:
8
+ run-tests:
9
+ strategy:
10
+ fail-fast: false
11
+ matrix:
12
+ os: [ubuntu-latest, macos-latest]
13
+ python-version:
14
+ - "3.11"
15
+ - "3.12"
16
+ - "3.13"
17
+ - "3.14"
18
+ name: Run unit tests
19
+ runs-on: ${{ matrix.os }}
20
+ env:
21
+ UV_PYTHON: ${{ matrix.python-version }}
22
+ steps:
23
+ - name: Checkout code
24
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
25
+
26
+ - name: Install uv
27
+ uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
28
+ with:
29
+ enable-cache: true
30
+ cache-dependency-glob: "uv.lock"
31
+
32
+ - name: Set up Python with uv
33
+ run: uv python install ${{ matrix.python-version }}
34
+
35
+ - name: Install dependencies
36
+ run: make install-dev
37
+
38
+ - name: Lint and format
39
+ run: make lint
40
+
41
+ - name: Run tests
42
+ run: make test-cov
@@ -0,0 +1,163 @@
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
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ share/python-wheels/
24
+ *.egg-info/
25
+ .installed.cfg
26
+ *.egg
27
+ MANIFEST
28
+
29
+ # PyInstaller
30
+ # Usually these files are written by a python script from a template
31
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
32
+ *.manifest
33
+ *.spec
34
+
35
+ # Installer logs
36
+ pip-log.txt
37
+ pip-delete-this-directory.txt
38
+
39
+ # Unit test / coverage reports
40
+ htmlcov/
41
+ .tox/
42
+ .nox/
43
+ .coverage
44
+ .coverage.*
45
+ .cache
46
+ nosetests.xml
47
+ coverage.xml
48
+ *.cover
49
+ *.py,cover
50
+ .hypothesis/
51
+ .pytest_cache/
52
+ cover/
53
+ coverage/
54
+
55
+ # Translations
56
+ *.mo
57
+ *.pot
58
+
59
+ # Scrapy stuff:
60
+ .scrapy
61
+
62
+ # Sphinx documentation
63
+ docs/_build/
64
+
65
+ # PyBuilder
66
+ .pybuilder/
67
+ target/
68
+
69
+ # Jupyter Notebook
70
+ .ipynb_checkpoints
71
+
72
+ # IPython
73
+ profile_default/
74
+ ipython_config.py
75
+
76
+ # pyenv
77
+ # For a library or package, you might want to ignore these files since the code is
78
+ # intended to run in multiple environments; otherwise, check them in:
79
+ # .python-version
80
+
81
+ # pipenv
82
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
83
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
84
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
85
+ # install all needed dependencies.
86
+ #Pipfile.lock
87
+
88
+ # poetry
89
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
90
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
91
+ # commonly ignored for libraries.
92
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
93
+ #poetry.lock
94
+
95
+ # pdm
96
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
97
+ #pdm.lock
98
+ # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
99
+ # in version control.
100
+ # https://pdm.fming.dev/#use-with-ide
101
+ .pdm.toml
102
+
103
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
104
+ __pypackages__/
105
+
106
+ # Celery stuff
107
+ celerybeat-schedule
108
+ celerybeat.pid
109
+
110
+ # SageMath parsed files
111
+ *.sage.py
112
+
113
+ # Environments
114
+ .env
115
+ .venv
116
+ env/
117
+ venv/
118
+ ENV/
119
+ env.bak/
120
+ venv.bak/
121
+
122
+ # Spyder project settings
123
+ .spyderproject
124
+ .spyproject
125
+
126
+ # Rope project settings
127
+ .ropeproject
128
+
129
+ # ruff
130
+ .ruff_cache/
131
+
132
+ # mkdocs documentation
133
+ /site
134
+
135
+ # mypy
136
+ .mypy_cache/
137
+ .dmypy.json
138
+ dmypy.json
139
+
140
+ # Pyre type checker
141
+ .pyre/
142
+
143
+ # pytype static type analyzer
144
+ .pytype/
145
+
146
+ # Cython debug symbols
147
+ cython_debug/
148
+
149
+ # PyCharm
150
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
151
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
152
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
153
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
154
+ .idea/
155
+
156
+ # macOS
157
+ *.DS_Store
158
+
159
+ # VSCode
160
+ .vscode/
161
+
162
+ # Project specific
163
+ spec/
@@ -0,0 +1,76 @@
1
+ # See https://pre-commit.com for more information
2
+ # See https://pre-commit.com/hooks.html for more hooks
3
+ default_language_version:
4
+ python: python3
5
+
6
+ repos:
7
+ # General file fixes and checks
8
+ - repo: https://github.com/pre-commit/pre-commit-hooks
9
+ rev: v6.0.0
10
+ hooks:
11
+ # File hygiene
12
+ - id: trailing-whitespace
13
+ args: [--markdown-linebreak-ext=md]
14
+ - id: end-of-file-fixer
15
+ - id: mixed-line-ending
16
+ args: [--fix=lf]
17
+
18
+ # File format validation
19
+ - id: check-yaml
20
+ args: [--unsafe] # Allow custom tags
21
+ - id: check-toml
22
+
23
+ # Python specific checks
24
+ - id: check-ast
25
+ - id: check-docstring-first
26
+ - id: debug-statements
27
+ - id: check-builtin-literals
28
+
29
+ # Security
30
+ - id: detect-private-key
31
+
32
+ # General checks
33
+ - id: check-case-conflict
34
+ - id: check-merge-conflict
35
+ - id: check-added-large-files
36
+ args: [--maxkb=500]
37
+
38
+ # Python linting and formatting with ruff
39
+ - repo: https://github.com/astral-sh/ruff-pre-commit
40
+ rev: v0.16.3
41
+ hooks:
42
+ # Run the linter
43
+ - id: ruff
44
+ args: [--fix, --exit-non-zero-on-fix]
45
+ # Run the formatter
46
+ - id: ruff-format
47
+
48
+ # Validate GitHub Actions workflows
49
+ - repo: https://github.com/rhysd/actionlint
50
+ rev: v1.7.12
51
+ hooks:
52
+ - id: actionlint
53
+
54
+ # Validate pyproject.toml
55
+ - repo: https://github.com/abravalheri/validate-pyproject
56
+ rev: v0.24.1
57
+ hooks:
58
+ - id: validate-pyproject
59
+
60
+ # Configuration to skip certain paths
61
+ exclude: |
62
+ (?x)^(
63
+ \.git/|
64
+ \.venv/|
65
+ venv/|
66
+ __pycache__/|
67
+ \.pytest_cache/|
68
+ \.ruff_cache/|
69
+ \.mypy_cache/|
70
+ build/|
71
+ dist/|
72
+ .*\.egg-info/|
73
+ htmlcov/|
74
+ coverage/|
75
+ \.coverage
76
+ )$
@@ -0,0 +1 @@
1
+ 3.14