gamesheet-sdk-py 0.0.1a1__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.
- gamesheet_sdk_py-0.0.1a1/.gitignore +104 -0
- gamesheet_sdk_py-0.0.1a1/LICENSE +21 -0
- gamesheet_sdk_py-0.0.1a1/PKG-INFO +184 -0
- gamesheet_sdk_py-0.0.1a1/README.md +101 -0
- gamesheet_sdk_py-0.0.1a1/docs/_static/.gitkeep +0 -0
- gamesheet_sdk_py-0.0.1a1/docs/_templates/.gitkeep +0 -0
- gamesheet_sdk_py-0.0.1a1/docs/conf.py +143 -0
- gamesheet_sdk_py-0.0.1a1/docs/explanation/diataxis.md +48 -0
- gamesheet_sdk_py-0.0.1a1/docs/explanation/index.md +30 -0
- gamesheet_sdk_py-0.0.1a1/docs/explanation/why-webui-automation.md +110 -0
- gamesheet_sdk_py-0.0.1a1/docs/how-to/cut-a-release.md +79 -0
- gamesheet_sdk_py-0.0.1a1/docs/how-to/index.md +30 -0
- gamesheet_sdk_py-0.0.1a1/docs/how-to/install-in-github-actions.md +82 -0
- gamesheet_sdk_py-0.0.1a1/docs/index.md +72 -0
- gamesheet_sdk_py-0.0.1a1/docs/reference/api.md +34 -0
- gamesheet_sdk_py-0.0.1a1/docs/reference/cli.md +18 -0
- gamesheet_sdk_py-0.0.1a1/docs/reference/index.md +36 -0
- gamesheet_sdk_py-0.0.1a1/docs/reference/supported-configurations.md +112 -0
- gamesheet_sdk_py-0.0.1a1/docs/tutorials/getting-started.md +128 -0
- gamesheet_sdk_py-0.0.1a1/docs/tutorials/index.md +31 -0
- gamesheet_sdk_py-0.0.1a1/pyproject.toml +305 -0
- gamesheet_sdk_py-0.0.1a1/src/gamesheet_sdk/__init__.py +18 -0
- gamesheet_sdk_py-0.0.1a1/src/gamesheet_sdk/_version.py +24 -0
- gamesheet_sdk_py-0.0.1a1/src/gamesheet_sdk/cli.py +31 -0
- gamesheet_sdk_py-0.0.1a1/src/gamesheet_sdk/py.typed +0 -0
- gamesheet_sdk_py-0.0.1a1/tests/__init__.py +0 -0
- gamesheet_sdk_py-0.0.1a1/tests/cassettes/.gitkeep +0 -0
- gamesheet_sdk_py-0.0.1a1/tests/conftest.py +45 -0
- gamesheet_sdk_py-0.0.1a1/tests/test_smoke.py +13 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# ---- Byte-compiled / cached ----
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
*.so
|
|
6
|
+
|
|
7
|
+
# ---- Distribution / packaging ----
|
|
8
|
+
.Python
|
|
9
|
+
build/
|
|
10
|
+
develop-eggs/
|
|
11
|
+
dist/
|
|
12
|
+
downloads/
|
|
13
|
+
eggs/
|
|
14
|
+
.eggs/
|
|
15
|
+
lib/
|
|
16
|
+
lib64/
|
|
17
|
+
parts/
|
|
18
|
+
sdist/
|
|
19
|
+
var/
|
|
20
|
+
wheels/
|
|
21
|
+
share/python-wheels/
|
|
22
|
+
*.egg-info/
|
|
23
|
+
.installed.cfg
|
|
24
|
+
*.egg
|
|
25
|
+
MANIFEST
|
|
26
|
+
|
|
27
|
+
# ---- PyInstaller ----
|
|
28
|
+
*.manifest
|
|
29
|
+
*.spec
|
|
30
|
+
|
|
31
|
+
# ---- Installer logs ----
|
|
32
|
+
pip-log.txt
|
|
33
|
+
pip-delete-this-directory.txt
|
|
34
|
+
|
|
35
|
+
# ---- Unit test / coverage ----
|
|
36
|
+
htmlcov/
|
|
37
|
+
.tox/
|
|
38
|
+
.nox/
|
|
39
|
+
.coverage
|
|
40
|
+
.coverage.*
|
|
41
|
+
.cache
|
|
42
|
+
nosetests.xml
|
|
43
|
+
coverage.xml
|
|
44
|
+
*.cover
|
|
45
|
+
*.py,cover
|
|
46
|
+
.hypothesis/
|
|
47
|
+
.pytest_cache/
|
|
48
|
+
cover/
|
|
49
|
+
|
|
50
|
+
# ---- Type checkers / linters ----
|
|
51
|
+
.mypy_cache/
|
|
52
|
+
.dmypy.json
|
|
53
|
+
dmypy.json
|
|
54
|
+
.pyre/
|
|
55
|
+
.pytype/
|
|
56
|
+
.ruff_cache/
|
|
57
|
+
|
|
58
|
+
# ---- Virtual environments ----
|
|
59
|
+
.env
|
|
60
|
+
.envrc
|
|
61
|
+
.venv
|
|
62
|
+
env/
|
|
63
|
+
venv/
|
|
64
|
+
ENV/
|
|
65
|
+
env.bak/
|
|
66
|
+
venv.bak/
|
|
67
|
+
|
|
68
|
+
# ---- Tooling: Poetry / Pipenv / pdm / Hatch ----
|
|
69
|
+
poetry.lock
|
|
70
|
+
Pipfile.lock
|
|
71
|
+
.pdm.toml
|
|
72
|
+
.pdm-python
|
|
73
|
+
.pdm-build/
|
|
74
|
+
.hatch/
|
|
75
|
+
|
|
76
|
+
# ---- Jupyter ----
|
|
77
|
+
.ipynb_checkpoints
|
|
78
|
+
profile_default/
|
|
79
|
+
ipython_config.py
|
|
80
|
+
|
|
81
|
+
# ---- Playwright (browser binaries handled separately) ----
|
|
82
|
+
.playwright/
|
|
83
|
+
playwright-report/
|
|
84
|
+
test-results/
|
|
85
|
+
|
|
86
|
+
# ---- IDE / editor ----
|
|
87
|
+
.idea/
|
|
88
|
+
.vscode/
|
|
89
|
+
*.swp
|
|
90
|
+
*.swo
|
|
91
|
+
*~
|
|
92
|
+
.DS_Store
|
|
93
|
+
|
|
94
|
+
# ---- Sphinx documentation ----
|
|
95
|
+
docs/_build/
|
|
96
|
+
_autosummary/
|
|
97
|
+
|
|
98
|
+
# ---- hatch-vcs generated version file ----
|
|
99
|
+
src/gamesheet_sdk/_version.py
|
|
100
|
+
|
|
101
|
+
# ---- Local scratch ----
|
|
102
|
+
*.log
|
|
103
|
+
.local/
|
|
104
|
+
secrets.toml
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 bdperkin
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: gamesheet-sdk-py
|
|
3
|
+
Version: 0.0.1a1
|
|
4
|
+
Summary: Unofficial Python SDK and CLI for the GameSheet Inc. platform — automates WebUI procedures where a native API is absent.
|
|
5
|
+
Project-URL: Homepage, https://github.com/bdperkin/gamesheet-sdk-py
|
|
6
|
+
Project-URL: Repository, https://github.com/bdperkin/gamesheet-sdk-py
|
|
7
|
+
Project-URL: Issues, https://github.com/bdperkin/gamesheet-sdk-py/issues
|
|
8
|
+
Project-URL: Documentation, https://github.com/bdperkin/gamesheet-sdk-py#readme
|
|
9
|
+
Author: bdperkin
|
|
10
|
+
License: MIT License
|
|
11
|
+
|
|
12
|
+
Copyright (c) 2026 bdperkin
|
|
13
|
+
|
|
14
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
15
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
16
|
+
in the Software without restriction, including without limitation the rights
|
|
17
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
18
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
19
|
+
furnished to do so, subject to the following conditions:
|
|
20
|
+
|
|
21
|
+
The above copyright notice and this permission notice shall be included in all
|
|
22
|
+
copies or substantial portions of the Software.
|
|
23
|
+
|
|
24
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
25
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
26
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
27
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
28
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
29
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
30
|
+
SOFTWARE.
|
|
31
|
+
License-File: LICENSE
|
|
32
|
+
Keywords: automation,cli,gamesheet,hockey,scraper,sdk,sports
|
|
33
|
+
Classifier: Development Status :: 3 - Alpha
|
|
34
|
+
Classifier: Intended Audience :: Developers
|
|
35
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
36
|
+
Classifier: Operating System :: OS Independent
|
|
37
|
+
Classifier: Programming Language :: Python :: 3
|
|
38
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
39
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
40
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
41
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
42
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
43
|
+
Classifier: Typing :: Typed
|
|
44
|
+
Requires-Python: <3.15,>=3.11
|
|
45
|
+
Requires-Dist: beautifulsoup4>=4.12
|
|
46
|
+
Requires-Dist: click>=8.1
|
|
47
|
+
Requires-Dist: lxml>=5.2
|
|
48
|
+
Requires-Dist: playwright>=1.45
|
|
49
|
+
Requires-Dist: pydantic>=2.7
|
|
50
|
+
Requires-Dist: requests>=2.32
|
|
51
|
+
Provides-Extra: dev
|
|
52
|
+
Requires-Dist: bandit[toml]>=1.7; extra == 'dev'
|
|
53
|
+
Requires-Dist: black>=26.3; extra == 'dev'
|
|
54
|
+
Requires-Dist: build>=1.2; extra == 'dev'
|
|
55
|
+
Requires-Dist: codespell>=2.4; extra == 'dev'
|
|
56
|
+
Requires-Dist: editorconfig-checker>=3.6; extra == 'dev'
|
|
57
|
+
Requires-Dist: flake8-pyproject>=1.2; extra == 'dev'
|
|
58
|
+
Requires-Dist: flake8>=7.1; extra == 'dev'
|
|
59
|
+
Requires-Dist: isort>=5.13; extra == 'dev'
|
|
60
|
+
Requires-Dist: mdformat-gfm>=0.4; extra == 'dev'
|
|
61
|
+
Requires-Dist: mdformat>=0.7; extra == 'dev'
|
|
62
|
+
Requires-Dist: mypy>=1.10; extra == 'dev'
|
|
63
|
+
Requires-Dist: pre-commit>=3.7; extra == 'dev'
|
|
64
|
+
Requires-Dist: pytest-cov>=5.0; extra == 'dev'
|
|
65
|
+
Requires-Dist: pytest-playwright>=0.5; extra == 'dev'
|
|
66
|
+
Requires-Dist: pytest-recording>=0.13; extra == 'dev'
|
|
67
|
+
Requires-Dist: pytest>=8.2; extra == 'dev'
|
|
68
|
+
Requires-Dist: pyupgrade>=3.19; extra == 'dev'
|
|
69
|
+
Requires-Dist: tox>=4.21; extra == 'dev'
|
|
70
|
+
Requires-Dist: types-requests>=2.32; extra == 'dev'
|
|
71
|
+
Requires-Dist: validate-pyproject>=0.25; extra == 'dev'
|
|
72
|
+
Requires-Dist: yamllint>=1.38; extra == 'dev'
|
|
73
|
+
Provides-Extra: docs
|
|
74
|
+
Requires-Dist: furo>=2024.5; extra == 'docs'
|
|
75
|
+
Requires-Dist: myst-parser[linkify]>=3.0; extra == 'docs'
|
|
76
|
+
Requires-Dist: sphinx-argparse>=0.4; extra == 'docs'
|
|
77
|
+
Requires-Dist: sphinx-autobuild>=2024.4; extra == 'docs'
|
|
78
|
+
Requires-Dist: sphinx-copybutton>=0.5; extra == 'docs'
|
|
79
|
+
Requires-Dist: sphinx-design>=0.5; extra == 'docs'
|
|
80
|
+
Requires-Dist: sphinx-lint>=0.9; extra == 'docs'
|
|
81
|
+
Requires-Dist: sphinx>=7.3; extra == 'docs'
|
|
82
|
+
Description-Content-Type: text/markdown
|
|
83
|
+
|
|
84
|
+
# gamesheet-sdk-py
|
|
85
|
+
|
|
86
|
+
> **Unofficial** Python SDK and command-line interface for the
|
|
87
|
+
> [GameSheet Inc.](https://gamesheet.com) platform.
|
|
88
|
+
|
|
89
|
+
[](LICENSE)
|
|
90
|
+
[](https://www.python.org/downloads/)
|
|
91
|
+
[](https://results.pre-commit.ci/latest/github/bdperkin/gamesheet-sdk-py/main)
|
|
92
|
+
|
|
93
|
+
## ⚠️ Disclaimer
|
|
94
|
+
|
|
95
|
+
This project is **not affiliated with, endorsed by, or sponsored by GameSheet Inc.**
|
|
96
|
+
GameSheet Inc. does not publish a public REST/GraphQL API for the operations this
|
|
97
|
+
SDK covers. Where a native API is absent, this library **automates the GameSheet
|
|
98
|
+
WebUI** (using a combination of HTTP requests, HTML parsing, and headless-browser
|
|
99
|
+
automation) in order to perform routine tasks programmatically.
|
|
100
|
+
|
|
101
|
+
Because this approach depends on the structure of a third-party web interface,
|
|
102
|
+
**it may break without warning** whenever GameSheet ships UI changes. Always
|
|
103
|
+
review the project's CHANGELOG before upgrading in production.
|
|
104
|
+
|
|
105
|
+
Use of this software must comply with the GameSheet Inc. Terms of Service. You
|
|
106
|
+
are responsible for any automation you perform against accounts you control.
|
|
107
|
+
|
|
108
|
+
## Features
|
|
109
|
+
|
|
110
|
+
- Pythonic wrappers over common GameSheet WebUI workflows
|
|
111
|
+
- A `gamesheet-sdk-py` command-line interface for one-off scripting and shell pipelines
|
|
112
|
+
- Typed (PEP 561) — ships a `py.typed` marker for static analysis
|
|
113
|
+
- First-class support for headless automation via [Playwright](https://playwright.dev/python/)
|
|
114
|
+
|
|
115
|
+
## Installation
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
pip install gamesheet-sdk-py
|
|
119
|
+
|
|
120
|
+
# Playwright browser binaries are required for headless WebUI flows:
|
|
121
|
+
python -m playwright install chromium
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### From source
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
git clone https://github.com/bdperkin/gamesheet-sdk-py.git
|
|
128
|
+
cd gamesheet-sdk-py
|
|
129
|
+
pip install -e ".[dev]"
|
|
130
|
+
python -m playwright install chromium
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## Quick start
|
|
134
|
+
|
|
135
|
+
```python
|
|
136
|
+
from gamesheet_sdk import __version__
|
|
137
|
+
|
|
138
|
+
print(__version__)
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
gamesheet-sdk-py --help
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## Project layout
|
|
146
|
+
|
|
147
|
+
```
|
|
148
|
+
gamesheet-sdk-py/
|
|
149
|
+
├── src/gamesheet_sdk/ # library source
|
|
150
|
+
├── tests/ # pytest suite
|
|
151
|
+
├── docs/ # additional documentation
|
|
152
|
+
├── pyproject.toml # PEP 621 metadata + Hatch build
|
|
153
|
+
├── .pre-commit-config.yaml # hooks run locally and on pre-commit.ci
|
|
154
|
+
└── LICENSE # MIT
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## Development
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
# 1. Create an isolated environment
|
|
161
|
+
python -m venv .venv && source .venv/bin/activate
|
|
162
|
+
|
|
163
|
+
# 2. Install with dev extras
|
|
164
|
+
pip install -e ".[dev]"
|
|
165
|
+
|
|
166
|
+
# 3. Install hook scripts
|
|
167
|
+
pre-commit install
|
|
168
|
+
|
|
169
|
+
# 4. Run the test suite
|
|
170
|
+
pytest
|
|
171
|
+
|
|
172
|
+
# 5. Run all hooks against the repo
|
|
173
|
+
pre-commit run --all-files
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
## Contributing
|
|
177
|
+
|
|
178
|
+
Issues and pull requests are welcome. Please run `pre-commit run --all-files`
|
|
179
|
+
and `pytest` before opening a PR.
|
|
180
|
+
|
|
181
|
+
## License
|
|
182
|
+
|
|
183
|
+
Distributed under the terms of the [MIT License](LICENSE).
|
|
184
|
+
© 2026 bdperkin.
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# gamesheet-sdk-py
|
|
2
|
+
|
|
3
|
+
> **Unofficial** Python SDK and command-line interface for the
|
|
4
|
+
> [GameSheet Inc.](https://gamesheet.com) platform.
|
|
5
|
+
|
|
6
|
+
[](LICENSE)
|
|
7
|
+
[](https://www.python.org/downloads/)
|
|
8
|
+
[](https://results.pre-commit.ci/latest/github/bdperkin/gamesheet-sdk-py/main)
|
|
9
|
+
|
|
10
|
+
## ⚠️ Disclaimer
|
|
11
|
+
|
|
12
|
+
This project is **not affiliated with, endorsed by, or sponsored by GameSheet Inc.**
|
|
13
|
+
GameSheet Inc. does not publish a public REST/GraphQL API for the operations this
|
|
14
|
+
SDK covers. Where a native API is absent, this library **automates the GameSheet
|
|
15
|
+
WebUI** (using a combination of HTTP requests, HTML parsing, and headless-browser
|
|
16
|
+
automation) in order to perform routine tasks programmatically.
|
|
17
|
+
|
|
18
|
+
Because this approach depends on the structure of a third-party web interface,
|
|
19
|
+
**it may break without warning** whenever GameSheet ships UI changes. Always
|
|
20
|
+
review the project's CHANGELOG before upgrading in production.
|
|
21
|
+
|
|
22
|
+
Use of this software must comply with the GameSheet Inc. Terms of Service. You
|
|
23
|
+
are responsible for any automation you perform against accounts you control.
|
|
24
|
+
|
|
25
|
+
## Features
|
|
26
|
+
|
|
27
|
+
- Pythonic wrappers over common GameSheet WebUI workflows
|
|
28
|
+
- A `gamesheet-sdk-py` command-line interface for one-off scripting and shell pipelines
|
|
29
|
+
- Typed (PEP 561) — ships a `py.typed` marker for static analysis
|
|
30
|
+
- First-class support for headless automation via [Playwright](https://playwright.dev/python/)
|
|
31
|
+
|
|
32
|
+
## Installation
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
pip install gamesheet-sdk-py
|
|
36
|
+
|
|
37
|
+
# Playwright browser binaries are required for headless WebUI flows:
|
|
38
|
+
python -m playwright install chromium
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### From source
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
git clone https://github.com/bdperkin/gamesheet-sdk-py.git
|
|
45
|
+
cd gamesheet-sdk-py
|
|
46
|
+
pip install -e ".[dev]"
|
|
47
|
+
python -m playwright install chromium
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Quick start
|
|
51
|
+
|
|
52
|
+
```python
|
|
53
|
+
from gamesheet_sdk import __version__
|
|
54
|
+
|
|
55
|
+
print(__version__)
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
gamesheet-sdk-py --help
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Project layout
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
gamesheet-sdk-py/
|
|
66
|
+
├── src/gamesheet_sdk/ # library source
|
|
67
|
+
├── tests/ # pytest suite
|
|
68
|
+
├── docs/ # additional documentation
|
|
69
|
+
├── pyproject.toml # PEP 621 metadata + Hatch build
|
|
70
|
+
├── .pre-commit-config.yaml # hooks run locally and on pre-commit.ci
|
|
71
|
+
└── LICENSE # MIT
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Development
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
# 1. Create an isolated environment
|
|
78
|
+
python -m venv .venv && source .venv/bin/activate
|
|
79
|
+
|
|
80
|
+
# 2. Install with dev extras
|
|
81
|
+
pip install -e ".[dev]"
|
|
82
|
+
|
|
83
|
+
# 3. Install hook scripts
|
|
84
|
+
pre-commit install
|
|
85
|
+
|
|
86
|
+
# 4. Run the test suite
|
|
87
|
+
pytest
|
|
88
|
+
|
|
89
|
+
# 5. Run all hooks against the repo
|
|
90
|
+
pre-commit run --all-files
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Contributing
|
|
94
|
+
|
|
95
|
+
Issues and pull requests are welcome. Please run `pre-commit run --all-files`
|
|
96
|
+
and `pytest` before opening a PR.
|
|
97
|
+
|
|
98
|
+
## License
|
|
99
|
+
|
|
100
|
+
Distributed under the terms of the [MIT License](LICENSE).
|
|
101
|
+
© 2026 bdperkin.
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"""Sphinx configuration for the gamesheet-sdk-py documentation."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from importlib import metadata
|
|
6
|
+
|
|
7
|
+
# -- Project information -----------------------------------------------------
|
|
8
|
+
project = "gamesheet-sdk-py"
|
|
9
|
+
author = "bdperkin"
|
|
10
|
+
copyright = f"2026, {author}"
|
|
11
|
+
release = metadata.version("gamesheet-sdk-py")
|
|
12
|
+
version = ".".join(release.split(".")[:2])
|
|
13
|
+
|
|
14
|
+
# -- General configuration ---------------------------------------------------
|
|
15
|
+
extensions = [
|
|
16
|
+
# API documentation
|
|
17
|
+
"sphinx.ext.autodoc",
|
|
18
|
+
"sphinx.ext.autosummary",
|
|
19
|
+
"sphinx.ext.napoleon",
|
|
20
|
+
"sphinx.ext.viewcode",
|
|
21
|
+
# Cross-referencing
|
|
22
|
+
"sphinx.ext.intersphinx",
|
|
23
|
+
"sphinx.ext.autosectionlabel",
|
|
24
|
+
# Quality
|
|
25
|
+
"sphinx.ext.doctest",
|
|
26
|
+
"sphinx.ext.coverage",
|
|
27
|
+
"sphinx.ext.todo",
|
|
28
|
+
"sphinx.ext.duration",
|
|
29
|
+
# Markdown + UI
|
|
30
|
+
"myst_parser",
|
|
31
|
+
"sphinx_copybutton",
|
|
32
|
+
"sphinx_design",
|
|
33
|
+
# CLI documentation
|
|
34
|
+
"sphinxarg.ext",
|
|
35
|
+
]
|
|
36
|
+
|
|
37
|
+
source_suffix = {
|
|
38
|
+
".md": "markdown",
|
|
39
|
+
".rst": "restructuredtext",
|
|
40
|
+
}
|
|
41
|
+
master_doc = "index"
|
|
42
|
+
exclude_patterns = ["_build", "Thumbs.db", ".DS_Store", "_autosummary"]
|
|
43
|
+
templates_path = ["_templates"]
|
|
44
|
+
|
|
45
|
+
# -- Automatic API documentation --------------------------------------------
|
|
46
|
+
autosummary_generate = True
|
|
47
|
+
autodoc_default_options = {
|
|
48
|
+
"members": True,
|
|
49
|
+
"undoc-members": True,
|
|
50
|
+
"show-inheritance": True,
|
|
51
|
+
"member-order": "bysource",
|
|
52
|
+
}
|
|
53
|
+
autodoc_typehints = "description"
|
|
54
|
+
autodoc_typehints_description_target = "documented_params"
|
|
55
|
+
autoclass_content = "both"
|
|
56
|
+
|
|
57
|
+
# -- Napoleon (Google / NumPy docstrings) -----------------------------------
|
|
58
|
+
napoleon_google_docstring = True
|
|
59
|
+
napoleon_numpy_docstring = True
|
|
60
|
+
napoleon_include_init_with_doc = False
|
|
61
|
+
napoleon_use_admonition_for_examples = True
|
|
62
|
+
napoleon_use_admonition_for_notes = True
|
|
63
|
+
napoleon_use_rtype = False
|
|
64
|
+
|
|
65
|
+
# -- Cross-referencing ------------------------------------------------------
|
|
66
|
+
intersphinx_mapping = {
|
|
67
|
+
"python": ("https://docs.python.org/3", None),
|
|
68
|
+
"requests": ("https://requests.readthedocs.io/en/latest/", None),
|
|
69
|
+
"bs4": ("https://www.crummy.com/software/BeautifulSoup/bs4/doc/", None),
|
|
70
|
+
"pydantic": ("https://docs.pydantic.dev/latest/", None),
|
|
71
|
+
"click": ("https://click.palletsprojects.com/en/stable/", None),
|
|
72
|
+
}
|
|
73
|
+
autosectionlabel_prefix_document = True
|
|
74
|
+
autosectionlabel_maxdepth = 3
|
|
75
|
+
|
|
76
|
+
# -- MyST (Markdown) --------------------------------------------------------
|
|
77
|
+
myst_enable_extensions = [
|
|
78
|
+
"colon_fence",
|
|
79
|
+
"deflist",
|
|
80
|
+
"fieldlist",
|
|
81
|
+
"tasklist",
|
|
82
|
+
"linkify",
|
|
83
|
+
"substitution",
|
|
84
|
+
"attrs_inline",
|
|
85
|
+
"attrs_block",
|
|
86
|
+
]
|
|
87
|
+
myst_heading_anchors = 3
|
|
88
|
+
|
|
89
|
+
# -- TODOs ------------------------------------------------------------------
|
|
90
|
+
todo_include_todos = True
|
|
91
|
+
|
|
92
|
+
# -- HTML output (Furo theme) -----------------------------------------------
|
|
93
|
+
html_theme = "furo"
|
|
94
|
+
html_title = f"{project} {release}"
|
|
95
|
+
html_static_path = ["_static"]
|
|
96
|
+
html_theme_options = {
|
|
97
|
+
"source_repository": "https://github.com/bdperkin/gamesheet-sdk-py/",
|
|
98
|
+
"source_branch": "main",
|
|
99
|
+
"source_directory": "docs/",
|
|
100
|
+
"navigation_with_keys": True,
|
|
101
|
+
"top_of_page_buttons": ["view", "edit"],
|
|
102
|
+
}
|
|
103
|
+
html_show_sourcelink = True
|
|
104
|
+
html_copy_source = True
|
|
105
|
+
|
|
106
|
+
# -- EPUB output ------------------------------------------------------------
|
|
107
|
+
epub_show_urls = "footnote"
|
|
108
|
+
epub_basename = project
|
|
109
|
+
|
|
110
|
+
# -- Man-page output --------------------------------------------------------
|
|
111
|
+
man_pages = [
|
|
112
|
+
(
|
|
113
|
+
"cli",
|
|
114
|
+
"gamesheet-sdk-py",
|
|
115
|
+
"Unofficial CLI for the GameSheet Inc. platform",
|
|
116
|
+
[author],
|
|
117
|
+
1,
|
|
118
|
+
),
|
|
119
|
+
]
|
|
120
|
+
|
|
121
|
+
# -- LaTeX / PDF output -----------------------------------------------------
|
|
122
|
+
latex_engine = "pdflatex"
|
|
123
|
+
latex_documents = [
|
|
124
|
+
(
|
|
125
|
+
master_doc,
|
|
126
|
+
f"{project}.tex",
|
|
127
|
+
f"{project} Documentation",
|
|
128
|
+
author,
|
|
129
|
+
"manual",
|
|
130
|
+
),
|
|
131
|
+
]
|
|
132
|
+
latex_elements = {
|
|
133
|
+
"papersize": "letterpaper",
|
|
134
|
+
"pointsize": "11pt",
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
# -- Link-check options -----------------------------------------------------
|
|
138
|
+
linkcheck_retries = 2
|
|
139
|
+
linkcheck_timeout = 15
|
|
140
|
+
linkcheck_ignore = [
|
|
141
|
+
# Anchors on third-party sites we don't control:
|
|
142
|
+
r"^https?://github\.com/.*#",
|
|
143
|
+
]
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Why these docs are organized into four quadrants
|
|
2
|
+
|
|
3
|
+
This project's documentation is structured following the
|
|
4
|
+
[Diátaxis framework](https://diataxis.fr/), authored by Daniele Procida.
|
|
5
|
+
|
|
6
|
+
Diátaxis observes that effective technical documentation serves four
|
|
7
|
+
*distinct* user needs that cannot be merged without harm:
|
|
8
|
+
|
|
9
|
+
| | **Practical steps** | **Theoretical knowledge** |
|
|
10
|
+
| -------------------- | ------------------- | ------------------------- |
|
|
11
|
+
| **Study (learning)** | Tutorials | Explanation |
|
|
12
|
+
| **Work (doing)** | How-to guides | Reference |
|
|
13
|
+
|
|
14
|
+
When you sit down to write something for these docs, the first question is
|
|
15
|
+
*which of the four quadrants does it belong in?* — and if the answer is
|
|
16
|
+
"more than one," that's usually a signal that the content needs to be split.
|
|
17
|
+
|
|
18
|
+
## Why this matters
|
|
19
|
+
|
|
20
|
+
When a single page tries to teach, demonstrate, document, and explain all at
|
|
21
|
+
once, it does each of those jobs badly. A user who came for a quick lookup
|
|
22
|
+
has to wade through pedagogy; a learner gets dropped into reference material
|
|
23
|
+
before they have context.
|
|
24
|
+
|
|
25
|
+
Splitting by *user need* keeps each page focused. The cross-references
|
|
26
|
+
between quadrants then carry the cognitive load instead of the prose.
|
|
27
|
+
|
|
28
|
+
## How to choose a quadrant
|
|
29
|
+
|
|
30
|
+
Ask yourself, *about the reader who will land on this page:*
|
|
31
|
+
|
|
32
|
+
- Are they **trying to learn the SDK** by following along? →
|
|
33
|
+
{doc}`../tutorials/index`
|
|
34
|
+
- Do they have **a specific task in mind** and need a recipe? →
|
|
35
|
+
{doc}`../how-to/index`
|
|
36
|
+
- Do they need to **look something up** while doing their work? →
|
|
37
|
+
{doc}`../reference/index`
|
|
38
|
+
- Do they want **deeper understanding** of why something is the way it is?
|
|
39
|
+
→ this section ({doc}`index`)
|
|
40
|
+
|
|
41
|
+
If two of those are tied, the content probably needs to be two pages, one
|
|
42
|
+
in each quadrant, cross-linking to the other.
|
|
43
|
+
|
|
44
|
+
## Further reading
|
|
45
|
+
|
|
46
|
+
- [diataxis.fr](https://diataxis.fr/) — the canonical introduction
|
|
47
|
+
- [The four kinds of documentation, and why](https://documentation.divio.com/)
|
|
48
|
+
— an earlier write-up by the same author
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Explanation
|
|
2
|
+
|
|
3
|
+
> Explanation, or discussion, **clarifies and illuminates a particular topic**.
|
|
4
|
+
> It broadens the documentation's coverage of a topic.
|
|
5
|
+
>
|
|
6
|
+
> — [diataxis.fr/explanation](https://diataxis.fr/explanation/)
|
|
7
|
+
|
|
8
|
+
Explanation is **understanding-oriented**. It exists to broaden context — why
|
|
9
|
+
choices were made, how the system behaves under the hood, what assumptions
|
|
10
|
+
constrain the design. It does not give step-by-step instructions and it does
|
|
11
|
+
not list APIs.
|
|
12
|
+
|
|
13
|
+
## Authoring guidance
|
|
14
|
+
|
|
15
|
+
When adding an explanation to this section:
|
|
16
|
+
|
|
17
|
+
- **Free yourself from a concrete task.** Discuss the topic in its own right.
|
|
18
|
+
- **Connect ideas.** Cross-reference {doc}`../reference/index` for *what*
|
|
19
|
+
and {doc}`../how-to/index` for *how*.
|
|
20
|
+
- **Acknowledge trade-offs.** Explanation is the place to say "we don't do
|
|
21
|
+
X because Y."
|
|
22
|
+
- **Welcome multiple perspectives.** Unlike reference, explanation can hold
|
|
23
|
+
competing views and let the reader weigh them.
|
|
24
|
+
|
|
25
|
+
```{toctree}
|
|
26
|
+
:maxdepth: 1
|
|
27
|
+
|
|
28
|
+
why-webui-automation
|
|
29
|
+
diataxis
|
|
30
|
+
```
|