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.
Files changed (47) hide show
  1. async_sharepoint-0.1.1/.editorconfig +37 -0
  2. async_sharepoint-0.1.1/.github/ISSUE_TEMPLATE/bug_report.yml +61 -0
  3. async_sharepoint-0.1.1/.github/ISSUE_TEMPLATE/config.yml +1 -0
  4. async_sharepoint-0.1.1/.github/ISSUE_TEMPLATE/feature_request.yml +30 -0
  5. async_sharepoint-0.1.1/.github/dependabot.yml +17 -0
  6. async_sharepoint-0.1.1/.github/pull_request_template.md +17 -0
  7. async_sharepoint-0.1.1/.github/workflows/ci.yml +174 -0
  8. async_sharepoint-0.1.1/.gitignore +58 -0
  9. async_sharepoint-0.1.1/.vscode/settings.json +9 -0
  10. async_sharepoint-0.1.1/CHANGELOG/unreleased.md +38 -0
  11. async_sharepoint-0.1.1/CONTRIBUTING.md +163 -0
  12. async_sharepoint-0.1.1/Cargo.lock +1867 -0
  13. async_sharepoint-0.1.1/Cargo.toml +33 -0
  14. async_sharepoint-0.1.1/LICENSE +21 -0
  15. async_sharepoint-0.1.1/PKG-INFO +100 -0
  16. async_sharepoint-0.1.1/README.md +79 -0
  17. async_sharepoint-0.1.1/SECURITY.md +32 -0
  18. async_sharepoint-0.1.1/async_sharepoint.pyi +169 -0
  19. async_sharepoint-0.1.1/core/Cargo.lock +1806 -0
  20. async_sharepoint-0.1.1/core/Cargo.toml +28 -0
  21. async_sharepoint-0.1.1/core/src/auth.rs +333 -0
  22. async_sharepoint-0.1.1/core/src/client.rs +128 -0
  23. async_sharepoint-0.1.1/core/src/error.rs +58 -0
  24. async_sharepoint-0.1.1/core/src/http.rs +184 -0
  25. async_sharepoint-0.1.1/core/src/lib.rs +12 -0
  26. async_sharepoint-0.1.1/core/src/odata.rs +123 -0
  27. async_sharepoint-0.1.1/docs/api.md +74 -0
  28. async_sharepoint-0.1.1/docs/auth.md +214 -0
  29. async_sharepoint-0.1.1/docs/index.md +9 -0
  30. async_sharepoint-0.1.1/docs/installation.md +41 -0
  31. async_sharepoint-0.1.1/docs/usage.md +35 -0
  32. async_sharepoint-0.1.1/justfile +125 -0
  33. async_sharepoint-0.1.1/log1.txt +705 -0
  34. async_sharepoint-0.1.1/log2.txt +410 -0
  35. async_sharepoint-0.1.1/pyproject.toml +113 -0
  36. async_sharepoint-0.1.1/rust/auth.rs +47 -0
  37. async_sharepoint-0.1.1/rust/http.rs +7 -0
  38. async_sharepoint-0.1.1/rust/lib.rs +1623 -0
  39. async_sharepoint-0.1.1/rust/odata.rs +128 -0
  40. async_sharepoint-0.1.1/scripts/build.sh +2 -0
  41. async_sharepoint-0.1.1/scripts/bump_version.py +47 -0
  42. async_sharepoint-0.1.1/scripts/release.py +251 -0
  43. async_sharepoint-0.1.1/tests/conftest.py +3 -0
  44. async_sharepoint-0.1.1/tests/test_api.py +122 -0
  45. async_sharepoint-0.1.1/tests/test_native_http.py +216 -0
  46. async_sharepoint-0.1.1/uv.lock +1709 -0
  47. 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.