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.
- irusdk-0.1.0/.github/CODEOWNERS +1 -0
- irusdk-0.1.0/.github/ISSUE_TEMPLATE/bug_report.yml +147 -0
- irusdk-0.1.0/.github/ISSUE_TEMPLATE/config.yml +11 -0
- irusdk-0.1.0/.github/ISSUE_TEMPLATE/feature_request.yml +79 -0
- irusdk-0.1.0/.github/ISSUE_TEMPLATE/feedback.yml +42 -0
- irusdk-0.1.0/.github/dependabot.yml +21 -0
- irusdk-0.1.0/.github/workflows/build-release-publish.yml +107 -0
- irusdk-0.1.0/.github/workflows/run-tests.yml +42 -0
- irusdk-0.1.0/.gitignore +163 -0
- irusdk-0.1.0/.pre-commit-config.yaml +76 -0
- irusdk-0.1.0/.python-version +1 -0
- irusdk-0.1.0/.readthedocs.yaml +17 -0
- irusdk-0.1.0/CHANGELOG.md +46 -0
- irusdk-0.1.0/CLAUDE.md +98 -0
- irusdk-0.1.0/LICENSE +201 -0
- irusdk-0.1.0/Makefile +62 -0
- irusdk-0.1.0/PKG-INFO +199 -0
- irusdk-0.1.0/README.md +140 -0
- irusdk-0.1.0/docs/_static/css/custom.css +11 -0
- irusdk-0.1.0/docs/conf.py +123 -0
- irusdk-0.1.0/docs/contributing/adding-an-endpoint.md +139 -0
- irusdk-0.1.0/docs/contributing/api-spec.md +81 -0
- irusdk-0.1.0/docs/guide/authentication.md +60 -0
- irusdk-0.1.0/docs/guide/cli.md +63 -0
- irusdk-0.1.0/docs/guide/errors.md +86 -0
- irusdk-0.1.0/docs/guide/pagination.md +76 -0
- irusdk-0.1.0/docs/guide/quickstart.md +46 -0
- irusdk-0.1.0/docs/guide/scope.md +76 -0
- irusdk-0.1.0/docs/guide/sync-and-async.md +87 -0
- irusdk-0.1.0/docs/index.md +101 -0
- irusdk-0.1.0/docs/reference/clients.md +25 -0
- irusdk-0.1.0/docs/reference/exceptions.md +20 -0
- irusdk-0.1.0/docs/reference/index.md +17 -0
- irusdk-0.1.0/docs/reference/models.md +85 -0
- irusdk-0.1.0/docs/reference/services.md +44 -0
- irusdk-0.1.0/pyproject.toml +138 -0
- irusdk-0.1.0/src/irusdk/__about__.py +2 -0
- irusdk-0.1.0/src/irusdk/__init__.py +35 -0
- irusdk-0.1.0/src/irusdk/_core/__init__.py +0 -0
- irusdk-0.1.0/src/irusdk/_core/config.py +52 -0
- irusdk-0.1.0/src/irusdk/_core/errors.py +155 -0
- irusdk-0.1.0/src/irusdk/_core/pagination.py +247 -0
- irusdk-0.1.0/src/irusdk/_core/ratelimit.py +81 -0
- irusdk-0.1.0/src/irusdk/_core/retry.py +107 -0
- irusdk-0.1.0/src/irusdk/_core/spec.py +98 -0
- irusdk-0.1.0/src/irusdk/_core/urls.py +56 -0
- irusdk-0.1.0/src/irusdk/_endpoints/__init__.py +0 -0
- irusdk-0.1.0/src/irusdk/_endpoints/blueprints.py +86 -0
- irusdk-0.1.0/src/irusdk/_endpoints/devices.py +87 -0
- irusdk-0.1.0/src/irusdk/_endpoints/tags.py +38 -0
- irusdk-0.1.0/src/irusdk/_endpoints/users.py +47 -0
- irusdk-0.1.0/src/irusdk/_transport/__init__.py +0 -0
- irusdk-0.1.0/src/irusdk/_transport/_common.py +181 -0
- irusdk-0.1.0/src/irusdk/_transport/async_transport.py +243 -0
- irusdk-0.1.0/src/irusdk/_transport/sync_transport.py +225 -0
- irusdk-0.1.0/src/irusdk/cli/__init__.py +44 -0
- irusdk-0.1.0/src/irusdk/cli/_console.py +114 -0
- irusdk-0.1.0/src/irusdk/cli/_helpers.py +60 -0
- irusdk-0.1.0/src/irusdk/cli/blueprints.py +66 -0
- irusdk-0.1.0/src/irusdk/cli/devices.py +88 -0
- irusdk-0.1.0/src/irusdk/cli/tags.py +57 -0
- irusdk-0.1.0/src/irusdk/cli/users.py +55 -0
- irusdk-0.1.0/src/irusdk/client.py +154 -0
- irusdk-0.1.0/src/irusdk/models/__init__.py +35 -0
- irusdk-0.1.0/src/irusdk/models/base.py +63 -0
- irusdk-0.1.0/src/irusdk/models/blueprints.py +76 -0
- irusdk-0.1.0/src/irusdk/models/common.py +31 -0
- irusdk-0.1.0/src/irusdk/models/devices.py +115 -0
- irusdk-0.1.0/src/irusdk/models/library.py +24 -0
- irusdk-0.1.0/src/irusdk/models/tags.py +15 -0
- irusdk-0.1.0/src/irusdk/models/users.py +51 -0
- irusdk-0.1.0/src/irusdk/py.typed +0 -0
- irusdk-0.1.0/src/irusdk/services/__init__.py +28 -0
- irusdk-0.1.0/src/irusdk/services/blueprints.py +209 -0
- irusdk-0.1.0/src/irusdk/services/devices.py +220 -0
- irusdk-0.1.0/src/irusdk/services/tags.py +96 -0
- irusdk-0.1.0/src/irusdk/services/users.py +117 -0
- irusdk-0.1.0/tests/conftest.py +116 -0
- irusdk-0.1.0/tests/test_cli.py +195 -0
- irusdk-0.1.0/tests/test_client.py +106 -0
- irusdk-0.1.0/tests/test_core.py +139 -0
- irusdk-0.1.0/tests/test_models.py +124 -0
- irusdk-0.1.0/tests/test_pagination_strategies.py +117 -0
- irusdk-0.1.0/tests/test_pagination_transport.py +89 -0
- irusdk-0.1.0/tests/test_parity.py +80 -0
- irusdk-0.1.0/tests/test_prefetch.py +112 -0
- irusdk-0.1.0/tests/test_services.py +139 -0
- irusdk-0.1.0/tests/test_transport.py +182 -0
- 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
|
irusdk-0.1.0/.gitignore
ADDED
|
@@ -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
|