Async-Sharepoint 0.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.
- async_sharepoint-0.1.1/.editorconfig +37 -0
- async_sharepoint-0.1.1/.github/ISSUE_TEMPLATE/bug_report.yml +61 -0
- async_sharepoint-0.1.1/.github/ISSUE_TEMPLATE/config.yml +1 -0
- async_sharepoint-0.1.1/.github/ISSUE_TEMPLATE/feature_request.yml +30 -0
- async_sharepoint-0.1.1/.github/dependabot.yml +17 -0
- async_sharepoint-0.1.1/.github/pull_request_template.md +17 -0
- async_sharepoint-0.1.1/.github/workflows/ci.yml +174 -0
- async_sharepoint-0.1.1/.gitignore +58 -0
- async_sharepoint-0.1.1/.vscode/settings.json +9 -0
- async_sharepoint-0.1.1/CHANGELOG/unreleased.md +38 -0
- async_sharepoint-0.1.1/CONTRIBUTING.md +163 -0
- async_sharepoint-0.1.1/Cargo.lock +1867 -0
- async_sharepoint-0.1.1/Cargo.toml +33 -0
- async_sharepoint-0.1.1/LICENSE +21 -0
- async_sharepoint-0.1.1/PKG-INFO +100 -0
- async_sharepoint-0.1.1/README.md +79 -0
- async_sharepoint-0.1.1/SECURITY.md +32 -0
- async_sharepoint-0.1.1/async_sharepoint.pyi +169 -0
- async_sharepoint-0.1.1/core/Cargo.lock +1806 -0
- async_sharepoint-0.1.1/core/Cargo.toml +28 -0
- async_sharepoint-0.1.1/core/src/auth.rs +333 -0
- async_sharepoint-0.1.1/core/src/client.rs +128 -0
- async_sharepoint-0.1.1/core/src/error.rs +58 -0
- async_sharepoint-0.1.1/core/src/http.rs +184 -0
- async_sharepoint-0.1.1/core/src/lib.rs +12 -0
- async_sharepoint-0.1.1/core/src/odata.rs +123 -0
- async_sharepoint-0.1.1/docs/api.md +74 -0
- async_sharepoint-0.1.1/docs/auth.md +214 -0
- async_sharepoint-0.1.1/docs/index.md +9 -0
- async_sharepoint-0.1.1/docs/installation.md +41 -0
- async_sharepoint-0.1.1/docs/usage.md +35 -0
- async_sharepoint-0.1.1/justfile +125 -0
- async_sharepoint-0.1.1/log1.txt +705 -0
- async_sharepoint-0.1.1/log2.txt +410 -0
- async_sharepoint-0.1.1/pyproject.toml +113 -0
- async_sharepoint-0.1.1/rust/auth.rs +47 -0
- async_sharepoint-0.1.1/rust/http.rs +7 -0
- async_sharepoint-0.1.1/rust/lib.rs +1623 -0
- async_sharepoint-0.1.1/rust/odata.rs +128 -0
- async_sharepoint-0.1.1/scripts/build.sh +2 -0
- async_sharepoint-0.1.1/scripts/bump_version.py +47 -0
- async_sharepoint-0.1.1/scripts/release.py +251 -0
- async_sharepoint-0.1.1/tests/conftest.py +3 -0
- async_sharepoint-0.1.1/tests/test_api.py +122 -0
- async_sharepoint-0.1.1/tests/test_native_http.py +216 -0
- async_sharepoint-0.1.1/uv.lock +1709 -0
- async_sharepoint-0.1.1/zensical.toml +27 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# https://editorconfig.org
|
|
2
|
+
root = true
|
|
3
|
+
|
|
4
|
+
[*]
|
|
5
|
+
charset = utf-8
|
|
6
|
+
end_of_line = lf
|
|
7
|
+
indent_style = space
|
|
8
|
+
indent_size = 4
|
|
9
|
+
trim_trailing_whitespace = true
|
|
10
|
+
insert_final_newline = true
|
|
11
|
+
|
|
12
|
+
[*.{html,css,js,json,sh,yml,yaml}]
|
|
13
|
+
indent_size = 2
|
|
14
|
+
|
|
15
|
+
[*.bat]
|
|
16
|
+
indent_style = tab
|
|
17
|
+
end_of_line = crlf
|
|
18
|
+
|
|
19
|
+
[LICENSE]
|
|
20
|
+
insert_final_newline = false
|
|
21
|
+
|
|
22
|
+
[justfile]
|
|
23
|
+
indent_style = space
|
|
24
|
+
indent_size = 4
|
|
25
|
+
|
|
26
|
+
# Ignore binary or generated files
|
|
27
|
+
[*.{png,jpg,gif,ico,woff,woff2,ttf,eot,svg,pdf}]
|
|
28
|
+
charset = unset
|
|
29
|
+
end_of_line = unset
|
|
30
|
+
indent_style = unset
|
|
31
|
+
indent_size = unset
|
|
32
|
+
trim_trailing_whitespace = unset
|
|
33
|
+
insert_final_newline = unset
|
|
34
|
+
max_line_length = unset
|
|
35
|
+
|
|
36
|
+
[*.{diff,patch}]
|
|
37
|
+
trim_trailing_whitespace = false
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
name: Bug Report
|
|
2
|
+
description: Something isn't working as expected.
|
|
3
|
+
title: "BUG: "
|
|
4
|
+
labels: [bug]
|
|
5
|
+
body:
|
|
6
|
+
- type: textarea
|
|
7
|
+
id: description
|
|
8
|
+
attributes:
|
|
9
|
+
label: Describe the bug
|
|
10
|
+
description: What happened? What did you expect to happen?
|
|
11
|
+
validations:
|
|
12
|
+
required: true
|
|
13
|
+
- type: textarea
|
|
14
|
+
id: steps
|
|
15
|
+
attributes:
|
|
16
|
+
label: Steps to reproduce
|
|
17
|
+
description: Minimal steps to trigger the bug.
|
|
18
|
+
placeholder: |
|
|
19
|
+
1. Install with `uv pip install Async-Sharepoint`
|
|
20
|
+
2. Run `...`
|
|
21
|
+
3. See error
|
|
22
|
+
validations:
|
|
23
|
+
required: true
|
|
24
|
+
- type: textarea
|
|
25
|
+
id: expected
|
|
26
|
+
attributes:
|
|
27
|
+
label: Expected behavior
|
|
28
|
+
validations:
|
|
29
|
+
required: true
|
|
30
|
+
- type: input
|
|
31
|
+
id: version
|
|
32
|
+
attributes:
|
|
33
|
+
label: "Async Sharepoint version"
|
|
34
|
+
placeholder: "0.1.0"
|
|
35
|
+
validations:
|
|
36
|
+
required: true
|
|
37
|
+
- type: input
|
|
38
|
+
id: python-version
|
|
39
|
+
attributes:
|
|
40
|
+
label: Python version
|
|
41
|
+
placeholder: "3.13"
|
|
42
|
+
validations:
|
|
43
|
+
required: true
|
|
44
|
+
- type: dropdown
|
|
45
|
+
id: os
|
|
46
|
+
attributes:
|
|
47
|
+
label: Operating system
|
|
48
|
+
options:
|
|
49
|
+
- macOS
|
|
50
|
+
- Linux
|
|
51
|
+
- Windows
|
|
52
|
+
- Other
|
|
53
|
+
validations:
|
|
54
|
+
required: true
|
|
55
|
+
- type: textarea
|
|
56
|
+
id: context
|
|
57
|
+
attributes:
|
|
58
|
+
label: Additional context
|
|
59
|
+
description: Logs, tracebacks, screenshots, or anything else that helps.
|
|
60
|
+
validations:
|
|
61
|
+
required: false
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
blank_issues_enabled: true
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
name: Feature Request
|
|
2
|
+
description: Suggest something new.
|
|
3
|
+
title: "FEAT: "
|
|
4
|
+
labels: [enhancement]
|
|
5
|
+
body:
|
|
6
|
+
- type: textarea
|
|
7
|
+
id: description
|
|
8
|
+
attributes:
|
|
9
|
+
label: Describe the feature
|
|
10
|
+
validations:
|
|
11
|
+
required: true
|
|
12
|
+
- type: textarea
|
|
13
|
+
id: motivation
|
|
14
|
+
attributes:
|
|
15
|
+
label: Motivation
|
|
16
|
+
description: What problem does this solve? What's the use case?
|
|
17
|
+
validations:
|
|
18
|
+
required: true
|
|
19
|
+
- type: textarea
|
|
20
|
+
id: alternatives
|
|
21
|
+
attributes:
|
|
22
|
+
label: Alternatives considered
|
|
23
|
+
validations:
|
|
24
|
+
required: false
|
|
25
|
+
- type: textarea
|
|
26
|
+
id: context
|
|
27
|
+
attributes:
|
|
28
|
+
label: Additional context
|
|
29
|
+
validations:
|
|
30
|
+
required: false
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
updates:
|
|
3
|
+
- package-ecosystem: github-actions
|
|
4
|
+
directory: /
|
|
5
|
+
schedule:
|
|
6
|
+
interval: weekly
|
|
7
|
+
cooldown:
|
|
8
|
+
default-days: 7
|
|
9
|
+
open-pull-requests-limit: 5
|
|
10
|
+
|
|
11
|
+
- package-ecosystem: uv
|
|
12
|
+
directory: /
|
|
13
|
+
schedule:
|
|
14
|
+
interval: weekly
|
|
15
|
+
cooldown:
|
|
16
|
+
default-days: 7
|
|
17
|
+
open-pull-requests-limit: 5
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
## What
|
|
2
|
+
|
|
3
|
+
<!-- 1-3 sentences. Link the issue if there is one. -->
|
|
4
|
+
|
|
5
|
+
## AI Provenance
|
|
6
|
+
|
|
7
|
+
<!-- Remove this section for human-authored PRs. -->
|
|
8
|
+
|
|
9
|
+
- **Tool:** <!-- Claude Code, Cursor, Copilot, Codex, etc. -->
|
|
10
|
+
- **Model:** <!-- Claude Opus 4.6, GPT-4o, etc. -->
|
|
11
|
+
- **Prompt/thread:** <!-- Paste your prompt or a link to the thread. -->
|
|
12
|
+
|
|
13
|
+
## Checklist
|
|
14
|
+
|
|
15
|
+
- [ ] Addresses exactly one issue or feature
|
|
16
|
+
- [ ] New or changed behavior has test coverage
|
|
17
|
+
- [ ] Diff contains only changes for this task
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
on:
|
|
3
|
+
push:
|
|
4
|
+
branches: [main]
|
|
5
|
+
pull_request:
|
|
6
|
+
branches: [main]
|
|
7
|
+
|
|
8
|
+
concurrency:
|
|
9
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
10
|
+
cancel-in-progress: true
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
# Runs for every commit, from anyone.
|
|
14
|
+
test:
|
|
15
|
+
runs-on: ubuntu-latest
|
|
16
|
+
steps:
|
|
17
|
+
- uses: actions/checkout@v4
|
|
18
|
+
|
|
19
|
+
- name: Install Rust
|
|
20
|
+
uses: dtolnay/rust-toolchain@stable
|
|
21
|
+
with:
|
|
22
|
+
components: rustfmt, clippy
|
|
23
|
+
|
|
24
|
+
- name: Cache Rust build
|
|
25
|
+
uses: Swatinem/rust-cache@v2
|
|
26
|
+
|
|
27
|
+
- name: Install uv
|
|
28
|
+
uses: astral-sh/setup-uv@v6
|
|
29
|
+
with:
|
|
30
|
+
python-version: "3.14"
|
|
31
|
+
|
|
32
|
+
- name: Sync Python dependencies
|
|
33
|
+
run: uv sync
|
|
34
|
+
|
|
35
|
+
- name: cargo fmt --check
|
|
36
|
+
run: cargo fmt --check
|
|
37
|
+
|
|
38
|
+
- name: cargo clippy
|
|
39
|
+
run: cargo clippy --all-targets --all-features -- -D warnings
|
|
40
|
+
|
|
41
|
+
- name: cargo test
|
|
42
|
+
run: cargo test
|
|
43
|
+
|
|
44
|
+
- name: ruff format --check
|
|
45
|
+
run: uv run --no-sync ruff format --check .
|
|
46
|
+
|
|
47
|
+
- name: ruff check
|
|
48
|
+
run: uv run --no-sync ruff check .
|
|
49
|
+
|
|
50
|
+
- name: ty check
|
|
51
|
+
run: uv run --no-sync ty check .
|
|
52
|
+
|
|
53
|
+
- name: maturin develop
|
|
54
|
+
run: uv run --no-sync maturin develop --uv
|
|
55
|
+
|
|
56
|
+
- name: pytest
|
|
57
|
+
run: uv run --no-sync pytest
|
|
58
|
+
|
|
59
|
+
# Only runs for pushes to main authored by deanm0000, and only after tests pass.
|
|
60
|
+
bump-version:
|
|
61
|
+
needs: test
|
|
62
|
+
if: github.event_name == 'push' && github.ref == 'refs/heads/main' && github.actor == 'deanm0000'
|
|
63
|
+
runs-on: ubuntu-latest
|
|
64
|
+
permissions:
|
|
65
|
+
contents: write
|
|
66
|
+
outputs:
|
|
67
|
+
version: ${{ steps.bump.outputs.version }}
|
|
68
|
+
tag: ${{ steps.bump.outputs.tag }}
|
|
69
|
+
steps:
|
|
70
|
+
- uses: actions/checkout@v4
|
|
71
|
+
with:
|
|
72
|
+
fetch-depth: 0
|
|
73
|
+
|
|
74
|
+
- name: Bump version
|
|
75
|
+
id: bump
|
|
76
|
+
run: python3 scripts/bump_version.py
|
|
77
|
+
|
|
78
|
+
- name: Commit and tag
|
|
79
|
+
run: |
|
|
80
|
+
git config user.name "github-actions[bot]"
|
|
81
|
+
git config user.email "github-actions[bot]@users.noreply.github.com"
|
|
82
|
+
git commit -am "chore: bump version to ${{ steps.bump.outputs.version }}"
|
|
83
|
+
git tag "${{ steps.bump.outputs.tag }}"
|
|
84
|
+
git push origin HEAD:main
|
|
85
|
+
git push origin "${{ steps.bump.outputs.tag }}"
|
|
86
|
+
|
|
87
|
+
build-wheels:
|
|
88
|
+
needs: bump-version
|
|
89
|
+
strategy:
|
|
90
|
+
fail-fast: false
|
|
91
|
+
matrix:
|
|
92
|
+
include:
|
|
93
|
+
- os: ubuntu-latest
|
|
94
|
+
target: x86_64
|
|
95
|
+
- os: windows-latest
|
|
96
|
+
target: x64
|
|
97
|
+
- os: macos-latest
|
|
98
|
+
target: universal2-apple-darwin
|
|
99
|
+
runs-on: ${{ matrix.os }}
|
|
100
|
+
steps:
|
|
101
|
+
- uses: actions/checkout@v4
|
|
102
|
+
with:
|
|
103
|
+
ref: ${{ needs.bump-version.outputs.tag }}
|
|
104
|
+
|
|
105
|
+
# abi3-py310 means one wheel per OS/arch covers Python 3.10-3.14.
|
|
106
|
+
- name: Build wheels
|
|
107
|
+
uses: PyO3/maturin-action@v1
|
|
108
|
+
with:
|
|
109
|
+
target: ${{ matrix.target }}
|
|
110
|
+
args: --release --out dist
|
|
111
|
+
manylinux: auto
|
|
112
|
+
|
|
113
|
+
- uses: actions/upload-artifact@v4
|
|
114
|
+
with:
|
|
115
|
+
name: wheels-${{ matrix.os }}
|
|
116
|
+
path: dist
|
|
117
|
+
|
|
118
|
+
build-sdist:
|
|
119
|
+
needs: bump-version
|
|
120
|
+
runs-on: ubuntu-latest
|
|
121
|
+
steps:
|
|
122
|
+
- uses: actions/checkout@v4
|
|
123
|
+
with:
|
|
124
|
+
ref: ${{ needs.bump-version.outputs.tag }}
|
|
125
|
+
|
|
126
|
+
- name: Build sdist
|
|
127
|
+
uses: PyO3/maturin-action@v1
|
|
128
|
+
with:
|
|
129
|
+
command: sdist
|
|
130
|
+
args: --out dist
|
|
131
|
+
|
|
132
|
+
- uses: actions/upload-artifact@v4
|
|
133
|
+
with:
|
|
134
|
+
name: sdist
|
|
135
|
+
path: dist
|
|
136
|
+
|
|
137
|
+
publish-pypi:
|
|
138
|
+
needs: [build-wheels, build-sdist]
|
|
139
|
+
runs-on: ubuntu-latest
|
|
140
|
+
environment: pypi
|
|
141
|
+
steps:
|
|
142
|
+
- uses: actions/download-artifact@v4
|
|
143
|
+
with:
|
|
144
|
+
pattern: wheels-*
|
|
145
|
+
path: dist
|
|
146
|
+
merge-multiple: true
|
|
147
|
+
|
|
148
|
+
- uses: actions/download-artifact@v4
|
|
149
|
+
with:
|
|
150
|
+
name: sdist
|
|
151
|
+
path: dist
|
|
152
|
+
merge-multiple: true
|
|
153
|
+
|
|
154
|
+
- name: Publish to PyPI
|
|
155
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
156
|
+
with:
|
|
157
|
+
password: ${{ secrets.PYPI_API_TOKEN }}
|
|
158
|
+
packages-dir: dist
|
|
159
|
+
|
|
160
|
+
publish-crate:
|
|
161
|
+
needs: bump-version
|
|
162
|
+
runs-on: ubuntu-latest
|
|
163
|
+
steps:
|
|
164
|
+
- uses: actions/checkout@v4
|
|
165
|
+
with:
|
|
166
|
+
ref: ${{ needs.bump-version.outputs.tag }}
|
|
167
|
+
|
|
168
|
+
- name: Install Rust
|
|
169
|
+
uses: dtolnay/rust-toolchain@stable
|
|
170
|
+
|
|
171
|
+
- name: Publish core crate to crates.io
|
|
172
|
+
env:
|
|
173
|
+
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
|
|
174
|
+
run: cargo publish --manifest-path core/Cargo.toml
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Byte-compiled / optimized / DLL files
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[codz]
|
|
4
|
+
*$py.class
|
|
5
|
+
|
|
6
|
+
# C extensions
|
|
7
|
+
*.so
|
|
8
|
+
|
|
9
|
+
# Distribution / packaging
|
|
10
|
+
build/
|
|
11
|
+
dist/
|
|
12
|
+
target/
|
|
13
|
+
eggs/
|
|
14
|
+
.eggs/
|
|
15
|
+
*.egg-info/
|
|
16
|
+
*.egg
|
|
17
|
+
MANIFEST
|
|
18
|
+
target
|
|
19
|
+
|
|
20
|
+
# Unit test / coverage reports
|
|
21
|
+
htmlcov/
|
|
22
|
+
.tox/
|
|
23
|
+
.nox/
|
|
24
|
+
.coverage
|
|
25
|
+
.coverage.*
|
|
26
|
+
coverage.xml
|
|
27
|
+
.hypothesis/
|
|
28
|
+
.pytest_cache/
|
|
29
|
+
|
|
30
|
+
# Environments
|
|
31
|
+
.env
|
|
32
|
+
.envrc
|
|
33
|
+
.venv
|
|
34
|
+
|
|
35
|
+
# uv
|
|
36
|
+
# Generally recommended to include uv.lock in version control for
|
|
37
|
+
# reproducibility. Uncomment for libraries where you want consumers
|
|
38
|
+
# to resolve their own dependencies.
|
|
39
|
+
# uv.lock
|
|
40
|
+
|
|
41
|
+
# Ruff
|
|
42
|
+
.ruff_cache/
|
|
43
|
+
|
|
44
|
+
# Type checkers
|
|
45
|
+
.mypy_cache/
|
|
46
|
+
.dmypy.json
|
|
47
|
+
dmypy.json
|
|
48
|
+
.pyre/
|
|
49
|
+
.pytype/
|
|
50
|
+
|
|
51
|
+
# Documentation build output
|
|
52
|
+
site/
|
|
53
|
+
|
|
54
|
+
# IDE files
|
|
55
|
+
# .idea/
|
|
56
|
+
# .vscode/
|
|
57
|
+
test_comm.py
|
|
58
|
+
test_projects.py
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"python.defaultInterpreterPath": "${workspaceFolder}/.venv/bin/python",
|
|
3
|
+
"chat.tools.terminal.autoApprove": {
|
|
4
|
+
"/^cargo check --message-format=short && uv build >/dev/null && uv pip install --python /tmp/async-sharepoint-py3\\.14/bin/python --reinstall dist/\\*\\.whl >/dev/null && python -m pytest tests/test_projects\\.py -q -x$/": {
|
|
5
|
+
"approve": true,
|
|
6
|
+
"matchCommandLine": true
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Unreleased
|
|
2
|
+
|
|
3
|
+
These are the changes that will go out in the next release.
|
|
4
|
+
|
|
5
|
+
## Changed
|
|
6
|
+
|
|
7
|
+
- **Breaking:** `SharePointClient` now takes a `CertificateCredential` instead of a `get_token`
|
|
8
|
+
callable. Authentication runs entirely in Rust, so no Python code executes on the request path.
|
|
9
|
+
- Token refresh moved to a background task owned by the client. It refreshes five minutes before
|
|
10
|
+
expiry and on any 401 or 403, and entering the async context manager waits for the first token so
|
|
11
|
+
invalid credentials fail at connect time.
|
|
12
|
+
- The token scope is now derived from the site host rather than supplied by the caller.
|
|
13
|
+
- Replaced the Python runtime implementation with a PyO3 extension using Tokio and Reqwest.
|
|
14
|
+
- Preserved the public async client method names and signatures.
|
|
15
|
+
- Switched package builds from hatchling to maturin and removed the unused CLI metadata.
|
|
16
|
+
- Published type information through `async_sharepoint.pyi`.
|
|
17
|
+
|
|
18
|
+
## Added
|
|
19
|
+
|
|
20
|
+
- `CertificateCredential` for the Entra ID certificate client-credentials flow.
|
|
21
|
+
- `SharePointClient.from_static_token()` for wrapping a token you already hold.
|
|
22
|
+
|
|
23
|
+
Async Sharepoint started out as a project generated from [Cookiecutter PyPackage](https://github.com/audreyfeldroy/cookiecutter-pypackage) containing:
|
|
24
|
+
|
|
25
|
+
- Initial scaffold for Async Sharepoint.
|
|
26
|
+
- `src/async_sharepoint/` package with CLI (Typer + Rich), py.typed marker
|
|
27
|
+
- Tests with pytest, coverage across Python 3.12/3.13/3.14
|
|
28
|
+
- CI via GitHub Actions: lint (Ruff), type check (ty), test matrix, coverage reporting
|
|
29
|
+
- Security scanning: CodeQL analysis for public repositories, Dependabot, and a Zizmor workflow audit
|
|
30
|
+
- Docs site with Zensical + mkdocstrings and a GitHub Pages deployment workflow
|
|
31
|
+
- Trusted publishing to PyPI with OIDC and build provenance attestation
|
|
32
|
+
- `justfile` with dev commands: qa, test, type-check, docs-serve, release
|
|
33
|
+
- Issue templates, PR template, contributing guide, code of conduct, security policy
|
|
34
|
+
- MIT license, .editorconfig, .gitignore
|
|
35
|
+
|
|
36
|
+
### Contributors
|
|
37
|
+
|
|
38
|
+
[@deanm0000](https://github.com/deanm0000) (Dean MacGregor) created Async Sharepoint.
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
Contributions are welcome, and they are greatly appreciated! Every little bit helps, and credit will always be given.
|
|
4
|
+
|
|
5
|
+
You can contribute in many ways:
|
|
6
|
+
|
|
7
|
+
## Types of Contributions
|
|
8
|
+
|
|
9
|
+
### Report Bugs
|
|
10
|
+
|
|
11
|
+
Report bugs at https://github.com/deanm0000/Async-Sharepoint/issues.
|
|
12
|
+
|
|
13
|
+
If you are reporting a bug, please include:
|
|
14
|
+
|
|
15
|
+
- Your operating system name and version.
|
|
16
|
+
- Any details about your local setup that might be helpful in troubleshooting.
|
|
17
|
+
- Detailed steps to reproduce the bug.
|
|
18
|
+
|
|
19
|
+
### Fix Bugs
|
|
20
|
+
|
|
21
|
+
Look through the GitHub issues for bugs. Anything tagged with "bug" and "help wanted" is open to whoever wants to implement it.
|
|
22
|
+
|
|
23
|
+
### Implement Features
|
|
24
|
+
|
|
25
|
+
Look through the GitHub issues for features. Anything tagged with "enhancement" and "help wanted" is open to whoever wants to implement it.
|
|
26
|
+
|
|
27
|
+
### Write Documentation
|
|
28
|
+
|
|
29
|
+
Async Sharepoint could always use more documentation, whether as part of the official docs, in docstrings, or even on the web in blog posts, articles, and such.
|
|
30
|
+
|
|
31
|
+
To preview the docs locally:
|
|
32
|
+
|
|
33
|
+
```sh
|
|
34
|
+
just docs-serve
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
This starts a local server at http://localhost:8000 with live reload. Edit
|
|
38
|
+
files in `docs/` and run `just docs-build` to verify a production build.
|
|
39
|
+
|
|
40
|
+
Docs deploy automatically on push to `main` after GitHub Pages is enabled. If
|
|
41
|
+
the generator did not enable it, review the visibility implications first:
|
|
42
|
+
[Pages sites can be public even when their repositories are private](https://docs.github.com/en/pages/getting-started-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site),
|
|
43
|
+
and the feature may require a paid GitHub plan for private repositories. Then
|
|
44
|
+
go to Settings > Pages, set the source to **GitHub Actions**, and enable the
|
|
45
|
+
deployment workflow:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
gh variable set DOCS_DEPLOYMENT_ENABLED \
|
|
49
|
+
--repo deanm0000/Async-Sharepoint \
|
|
50
|
+
--body true
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Until then, deployment stays paused and local preview and builds still work.
|
|
54
|
+
|
|
55
|
+
### Submit Feedback
|
|
56
|
+
|
|
57
|
+
The best way to send feedback is to file an issue at https://github.com/deanm0000/Async-Sharepoint/issues.
|
|
58
|
+
|
|
59
|
+
If you are proposing a feature:
|
|
60
|
+
|
|
61
|
+
- Explain in detail how it would work.
|
|
62
|
+
- Keep the scope as narrow as possible, to make it easier to implement.
|
|
63
|
+
- Remember that this is a volunteer-driven project, and that contributions are welcome :)
|
|
64
|
+
|
|
65
|
+
## Get Started!
|
|
66
|
+
|
|
67
|
+
Ready to contribute? Here's how to set up Async-Sharepoint for local development.
|
|
68
|
+
|
|
69
|
+
1. Fork the Async-Sharepoint repo on GitHub.
|
|
70
|
+
2. Clone your fork locally:
|
|
71
|
+
|
|
72
|
+
```sh
|
|
73
|
+
git clone git@github.com:your_name_here/Async-Sharepoint.git
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
3. Install your local copy with uv:
|
|
77
|
+
|
|
78
|
+
```sh
|
|
79
|
+
cd Async-Sharepoint/
|
|
80
|
+
uv sync
|
|
81
|
+
uv run maturin develop --uv
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Building the extension requires Rust 1.88 or newer. Rust dependencies are
|
|
85
|
+
pinned in `Cargo.lock` and Python dependencies are pinned in `uv.lock`.
|
|
86
|
+
|
|
87
|
+
4. Create a branch for local development:
|
|
88
|
+
|
|
89
|
+
```sh
|
|
90
|
+
git checkout -b name-of-your-bugfix-or-feature
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Now you can make your changes locally.
|
|
94
|
+
|
|
95
|
+
5. When you're done making changes, verify formatting, linting, types, and tests without modifying files:
|
|
96
|
+
|
|
97
|
+
```sh
|
|
98
|
+
just check
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Use `just fix` to apply Ruff's automatic fixes, or `just fix-and-check` to apply them before verification.
|
|
102
|
+
|
|
103
|
+
Or run the tests alone:
|
|
104
|
+
|
|
105
|
+
```sh
|
|
106
|
+
just test
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
6. Commit your changes and push your branch to GitHub:
|
|
110
|
+
|
|
111
|
+
```sh
|
|
112
|
+
git add .
|
|
113
|
+
git commit -m "Your detailed description of your changes."
|
|
114
|
+
git push origin name-of-your-bugfix-or-feature
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
7. Submit a pull request through the GitHub website.
|
|
118
|
+
|
|
119
|
+
## Pull Request Guidelines
|
|
120
|
+
|
|
121
|
+
Before you submit a pull request, check that it meets these guidelines:
|
|
122
|
+
|
|
123
|
+
1. The pull request should include tests.
|
|
124
|
+
2. If the pull request adds functionality, the docs should be updated. Put your new functionality into a function with a docstring, and add the feature to the list in README.md.
|
|
125
|
+
3. The pull request should pass `cargo fmt`, Clippy, Rust tests, and the Python 3.12, 3.13, and 3.14 test suite.
|
|
126
|
+
|
|
127
|
+
## Tips
|
|
128
|
+
|
|
129
|
+
To run a subset of tests:
|
|
130
|
+
|
|
131
|
+
```sh
|
|
132
|
+
uv run pytest tests/
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Releasing a New Version
|
|
136
|
+
|
|
137
|
+
1. **Bump the version:**
|
|
138
|
+
```bash
|
|
139
|
+
uv version <version> # or: uv version --bump minor
|
|
140
|
+
```
|
|
141
|
+
2. **Commit:**
|
|
142
|
+
```bash
|
|
143
|
+
git add pyproject.toml uv.lock
|
|
144
|
+
git commit -m "Bump version to <version>"
|
|
145
|
+
```
|
|
146
|
+
3. **Release:**
|
|
147
|
+
```bash
|
|
148
|
+
just release
|
|
149
|
+
```
|
|
150
|
+
This finalizes `CHANGELOG/unreleased.md` as
|
|
151
|
+
`CHANGELOG/<version>.md`, creates a fresh unreleased file, commits and
|
|
152
|
+
pushes that notes commit, then creates an annotated `v*` tag and GitHub
|
|
153
|
+
Release. The tag push triggers `.github/workflows/publish.yml`, which
|
|
154
|
+
builds the package, generates SLSA provenance attestations, and publishes
|
|
155
|
+
to PyPI via trusted publishing.
|
|
156
|
+
|
|
157
|
+
Record release-worthy changes in `CHANGELOG/unreleased.md` as they merge.
|
|
158
|
+
Projects generated before this changelog lifecycle was introduced remain
|
|
159
|
+
compatible when they already have a versioned changelog file.
|
|
160
|
+
|
|
161
|
+
## Code of Conduct
|
|
162
|
+
|
|
163
|
+
Please note that this project is released with a [Contributor Code of Conduct](CODE_OF_CONDUCT.md). By participating in this project you agree to abide by its terms.
|