polars-yahoo 0.2.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.
- polars_yahoo-0.2.0/.bandit +19 -0
- polars_yahoo-0.2.0/.editorconfig +41 -0
- polars_yahoo-0.2.0/.github/CONFIG.md +187 -0
- polars_yahoo-0.2.0/.github/PULL_REQUEST_TEMPLATE.md +82 -0
- polars_yahoo-0.2.0/.github/dependabot.yml +86 -0
- polars_yahoo-0.2.0/.github/release.yml +67 -0
- polars_yahoo-0.2.0/.github/rulesets/main-branch-protection.json +47 -0
- polars_yahoo-0.2.0/.github/rulesets/tag-protection.json +24 -0
- polars_yahoo-0.2.0/.github/secret_scanning.yml +19 -0
- polars_yahoo-0.2.0/.github/workflows/rhiza_benchmark.yml +30 -0
- polars_yahoo-0.2.0/.github/workflows/rhiza_book.yml +51 -0
- polars_yahoo-0.2.0/.github/workflows/rhiza_ci.yml +47 -0
- polars_yahoo-0.2.0/.github/workflows/rhiza_codeql.yml +39 -0
- polars_yahoo-0.2.0/.github/workflows/rhiza_marimo.yml +38 -0
- polars_yahoo-0.2.0/.github/workflows/rhiza_release.yml +1087 -0
- polars_yahoo-0.2.0/.github/workflows/rhiza_scorecard.yml +44 -0
- polars_yahoo-0.2.0/.github/workflows/rhiza_sync.yml +36 -0
- polars_yahoo-0.2.0/.github/workflows/rhiza_weekly.yml +38 -0
- polars_yahoo-0.2.0/.gitignore +126 -0
- polars_yahoo-0.2.0/.pre-commit-config.yaml +139 -0
- polars_yahoo-0.2.0/.python-version +2 -0
- polars_yahoo-0.2.0/.rhiza/scripts/release_publish.py +168 -0
- polars_yahoo-0.2.0/.rhiza/semgrep.yml +84 -0
- polars_yahoo-0.2.0/.rhiza/template.lock +43 -0
- polars_yahoo-0.2.0/.rhiza/template.yml +5 -0
- polars_yahoo-0.2.0/CHANGELOG.md +41 -0
- polars_yahoo-0.2.0/LICENSE +202 -0
- polars_yahoo-0.2.0/Makefile +71 -0
- polars_yahoo-0.2.0/PKG-INFO +121 -0
- polars_yahoo-0.2.0/README.md +96 -0
- polars_yahoo-0.2.0/cliff.toml +102 -0
- polars_yahoo-0.2.0/docs/development/rhiza.md +23 -0
- polars_yahoo-0.2.0/docs/index.md +1 -0
- polars_yahoo-0.2.0/docs/mkdocs-base.yml +133 -0
- polars_yahoo-0.2.0/mkdocs.yml +6 -0
- polars_yahoo-0.2.0/pyproject.toml +73 -0
- polars_yahoo-0.2.0/pytest.ini +27 -0
- polars_yahoo-0.2.0/renovate.json +6 -0
- polars_yahoo-0.2.0/ruff.toml +153 -0
- polars_yahoo-0.2.0/src/polars_yahoo/__init__.py +26 -0
- polars_yahoo-0.2.0/src/polars_yahoo/_chart.py +195 -0
- polars_yahoo-0.2.0/src/polars_yahoo/_download.py +82 -0
- polars_yahoo-0.2.0/src/polars_yahoo/_http.py +88 -0
- polars_yahoo-0.2.0/src/polars_yahoo/_ticker.py +63 -0
- polars_yahoo-0.2.0/src/polars_yahoo/exceptions.py +38 -0
- polars_yahoo-0.2.0/src/polars_yahoo/py.typed +0 -0
- polars_yahoo-0.2.0/tests/conftest.py +106 -0
- polars_yahoo-0.2.0/tests/test_api.py +168 -0
- polars_yahoo-0.2.0/tests/test_chart.py +153 -0
- polars_yahoo-0.2.0/tests/test_rhiza_packaging.py +99 -0
- polars_yahoo-0.2.0/uv.lock +425 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Bandit configuration. This file โ not the pre-commit hook's args โ is the
|
|
2
|
+
# single source of truth for bandit's scope, because it is the only part any
|
|
3
|
+
# other runner can see. CodeFactor, IDE plugins and a contributor typing
|
|
4
|
+
# `bandit -r .` all read `.bandit` and none of them read our hook args, so
|
|
5
|
+
# scope kept in the args made every external analyser disagree with CI (#1493).
|
|
6
|
+
#
|
|
7
|
+
# Both spellings of each path are listed deliberately. Bandit matches an
|
|
8
|
+
# exclude entry against the path string it is handed, and that string depends on
|
|
9
|
+
# how it was invoked: a recursive `bandit -r .` discovers `./tests/foo.py`,
|
|
10
|
+
# whereas pre-commit passes `tests/foo.py`. So `./tests` alone silently covers
|
|
11
|
+
# only the recursive case and `tests` alone only the pre-commit case โ a
|
|
12
|
+
# one-spelling list looks correct and half-works. Verified in
|
|
13
|
+
# tests/security/test_security_patterns.py, which runs bandit both ways.
|
|
14
|
+
#
|
|
15
|
+
# Note these are *added* to bandit's own defaults (.git, __pycache__, .tox,
|
|
16
|
+
# .eggs, โฆ), so those need no repeating here.
|
|
17
|
+
[bandit]
|
|
18
|
+
exclude = tests,./tests,.venv,./.venv
|
|
19
|
+
skips = B101
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# This file is part of the jebel-quant/rhiza repository
|
|
2
|
+
# (https://github.com/jebel-quant/rhiza).
|
|
3
|
+
#
|
|
4
|
+
root = true
|
|
5
|
+
|
|
6
|
+
# Default settings for all files
|
|
7
|
+
[*]
|
|
8
|
+
end_of_line = lf
|
|
9
|
+
trim_trailing_whitespace = true
|
|
10
|
+
insert_final_newline = true
|
|
11
|
+
charset = utf-8
|
|
12
|
+
|
|
13
|
+
# Python, reStructuredText, and text files
|
|
14
|
+
[*.{py,rst,txt}]
|
|
15
|
+
indent_style = space
|
|
16
|
+
indent_size = 4
|
|
17
|
+
|
|
18
|
+
# YAML, JSON, and other config files
|
|
19
|
+
[*.{yml,yaml,json}]
|
|
20
|
+
indent_style = space
|
|
21
|
+
indent_size = 2
|
|
22
|
+
|
|
23
|
+
# Markdown files
|
|
24
|
+
# [*.{md,markdown}]
|
|
25
|
+
# trim_trailing_whitespace = false
|
|
26
|
+
|
|
27
|
+
# Makefiles require tabs
|
|
28
|
+
[{Makefile,*.mk,*.make}]
|
|
29
|
+
indent_style = tab
|
|
30
|
+
indent_size = 4
|
|
31
|
+
|
|
32
|
+
# Don't apply editorconfig rules to vendor/ resources
|
|
33
|
+
# This is a "defensive" rule for the day we may have
|
|
34
|
+
# the vendor folder
|
|
35
|
+
[vendor/**]
|
|
36
|
+
charset = unset
|
|
37
|
+
end_of_line = unset
|
|
38
|
+
indent_size = unset
|
|
39
|
+
indent_style = unset
|
|
40
|
+
insert_final_newline = unset
|
|
41
|
+
trim_trailing_whitespace = unset
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
# GitHub Actions Configuration
|
|
2
|
+
|
|
3
|
+
This document describes the secrets used by the Rhiza-provided GitHub Actions workflows
|
|
4
|
+
(`.github/workflows/rhiza_*.yml`) and how to configure them.
|
|
5
|
+
|
|
6
|
+
## PAT_TOKEN
|
|
7
|
+
|
|
8
|
+
Some workflows may need to push changes to files under `.github/workflows/`. The
|
|
9
|
+
automatic `github.token` **cannot** do that โ GitHub rejects such pushes unless
|
|
10
|
+
the token carries the `workflow` scope. If you need it, create a Personal Access
|
|
11
|
+
Token (PAT) with the `workflow` scope and store it as a repository secret named
|
|
12
|
+
`PAT_TOKEN`.
|
|
13
|
+
|
|
14
|
+
If `PAT_TOKEN` is not configured, workflows fall back to `github.token`.
|
|
15
|
+
|
|
16
|
+
### Creating the token
|
|
17
|
+
|
|
18
|
+
**Fine-grained PAT** (recommended):
|
|
19
|
+
|
|
20
|
+
1. Go to **Settings โ Developer settings โ Fine-grained tokens โ Generate new token**
|
|
21
|
+
(<https://github.com/settings/personal-access-tokens/new>).
|
|
22
|
+
2. Restrict **Repository access** to the repository (or repositories) using Rhiza.
|
|
23
|
+
3. Under **Repository permissions**, grant:
|
|
24
|
+
- **Contents**: Read and write
|
|
25
|
+
- **Workflows**: Read and write
|
|
26
|
+
- **Pull requests**: Read and write (needed for the scheduled sync-PR mode)
|
|
27
|
+
4. Generate the token and copy it.
|
|
28
|
+
|
|
29
|
+
**Classic PAT** (alternative):
|
|
30
|
+
|
|
31
|
+
1. Go to **Settings โ Developer settings โ Tokens (classic) โ Generate new token**.
|
|
32
|
+
2. Select the `repo` and `workflow` scopes.
|
|
33
|
+
3. Generate the token and copy it.
|
|
34
|
+
|
|
35
|
+
### Storing the secret
|
|
36
|
+
|
|
37
|
+
In the repository that consumes Rhiza:
|
|
38
|
+
|
|
39
|
+
1. Go to **Settings โ Secrets and variables โ Actions โ New repository secret**.
|
|
40
|
+
2. Name: `PAT_TOKEN`
|
|
41
|
+
3. Value: the token created above.
|
|
42
|
+
|
|
43
|
+
Or with the GitHub CLI:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
gh secret set PAT_TOKEN
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
A PAT expires; when sync pushes start failing with a `refusing to allow ... workflow` error,
|
|
50
|
+
regenerate the token and update the secret.
|
|
51
|
+
|
|
52
|
+
## Daily template sync (`rhiza_sync.yml`)
|
|
53
|
+
|
|
54
|
+
Every day at 06:00 UTC the sync workflow compares `ref` in `.rhiza/template.yml` with
|
|
55
|
+
the template repository's latest release. When the ref is behind, the workflow bumps it,
|
|
56
|
+
syncs the template files with the rhiza-claude scripts that `/rhiza:update` also uses,
|
|
57
|
+
and opens a pull request from `rhiza/sync-<tag>`. The PR stages only paths listed in
|
|
58
|
+
`.rhiza/template.lock`. Merge conflicts resolve to the upstream side. A major bump (for
|
|
59
|
+
example `v1.x` โ `v2.0.0`) is never applied automatically; the run warns and you run
|
|
60
|
+
`/rhiza:update` yourself. When the branch for that release already exists, later runs
|
|
61
|
+
skip it, so you get one PR per release.
|
|
62
|
+
|
|
63
|
+
The workflow reads the `GH_PAT` secret. Give the token the permissions listed above
|
|
64
|
+
(Contents, Workflows and Pull requests: read and write, or classic `repo` + `workflow`).
|
|
65
|
+
Without `GH_PAT` the workflow falls back to `github.token`, which has two limits:
|
|
66
|
+
|
|
67
|
+
- it cannot push a sync that changes `.github/workflows/*`, and
|
|
68
|
+
- GitHub does not start CI on a pull request opened with it.
|
|
69
|
+
|
|
70
|
+
To run a check right away: `gh workflow run rhiza_sync.yml`.
|
|
71
|
+
|
|
72
|
+
## Release workflow secrets (optional)
|
|
73
|
+
|
|
74
|
+
The release workflow (`.github/workflows/rhiza_release.yml`) supports additional secrets, all
|
|
75
|
+
optional depending on which release features you use:
|
|
76
|
+
|
|
77
|
+
| Secret | Purpose |
|
|
78
|
+
| --- | --- |
|
|
79
|
+
| `PYPI_TOKEN` | Publish the built package to PyPI. Not needed when using trusted publishing (OIDC). |
|
|
80
|
+
| `RELEASE_PUBLISH_CREDENTIALS` | Optional credentials input for a repository-owned custom publisher. Not needed when the extension uses OIDC. |
|
|
81
|
+
| `GH_PAT` | Git authentication for installing private dependencies during the release build. |
|
|
82
|
+
| `UV_EXTRA_INDEX_URL` | Extra package index URL (with credentials) for private dependencies. |
|
|
83
|
+
|
|
84
|
+
`GITHUB_TOKEN` is provided automatically by GitHub Actions and needs no configuration.
|
|
85
|
+
|
|
86
|
+
## Release publisher selection
|
|
87
|
+
|
|
88
|
+
Set the Actions **variable** `RELEASE_PUBLISHER` to choose package deployment:
|
|
89
|
+
|
|
90
|
+
| Value | Behaviour |
|
|
91
|
+
| --- | --- |
|
|
92
|
+
| Unset or `pypi` | Existing PyPI Trusted Publishing. `PYPI_REPOSITORY_URL` (variable) and `PYPI_TOKEN` (secret) still support PyPI-compatible custom endpoints. |
|
|
93
|
+
| `custom` | Run your repository-owned composite action at `.github/actions/release-publish/action.yml` (or `action.yaml`). No fallback to public PyPI. |
|
|
94
|
+
| `none` | Skip package publishing, retaining the other release outputs. |
|
|
95
|
+
|
|
96
|
+
No bundle syncs the custom action path: it remains repository-owned.
|
|
97
|
+
Commit the action before tagging the release;
|
|
98
|
+
it runs from that release revision with the `release` environment, `contents: read` and
|
|
99
|
+
`id-token: write`. It receives `artifacts-dir` (absolute path to the downloaded build
|
|
100
|
+
artifacts), `tag`, `version` (tag without `v`) and the optional `credentials` input.
|
|
101
|
+
It owns provider login, tool setup and upload, and must fail on unsuccessful publication.
|
|
102
|
+
Use the existing distributions rather than rebuilding them; the directory can also
|
|
103
|
+
contain provenance files.
|
|
104
|
+
|
|
105
|
+
For OIDC-capable feeds, obtain and immediately mask short-lived credentials in this
|
|
106
|
+
action. Otherwise, supply the optional `RELEASE_PUBLISH_CREDENTIALS` secret in the
|
|
107
|
+
format your action expects. Only that explicit secret is forwarded to the extension.
|
|
108
|
+
An optional `artifact-url` output supplies a public HTTPS artifact link for release notes;
|
|
109
|
+
omit it for private destinations and never include credentials or signed access tokens.
|
|
110
|
+
|
|
111
|
+
The private-package classifier still suppresses built-in PyPI uploads; `custom`
|
|
112
|
+
explicitly permits private distributions. Invalid modes, missing custom actions and
|
|
113
|
+
missing expected distributions fail closed. Failed required uploads prevent release
|
|
114
|
+
finalization. Conda recipes are generated only after successful public PyPI publication
|
|
115
|
+
with no `PYPI_REPOSITORY_URL` override.
|
|
116
|
+
|
|
117
|
+
This is a GitHub publishing extension, not private dependency-consumption setup or a
|
|
118
|
+
GitLab feature. See the
|
|
119
|
+
[publisher contract](https://jebel-quant.github.io/rhiza/reference/ARCHITECTURE/#repository-owned-publishing-action)
|
|
120
|
+
for details.
|
|
121
|
+
|
|
122
|
+
## Private dependency secrets in other workflows
|
|
123
|
+
|
|
124
|
+
`GH_PAT` and `UV_EXTRA_INDEX_URL` are read by the CI, benchmark, CodeQL, marimo, book,
|
|
125
|
+
weekly and docker workflows too. The stubs that call those reusable workflows forward each secret by
|
|
126
|
+
name rather than with `secrets: inherit`, because GitHub only honours `inherit` when the
|
|
127
|
+
caller sits in the same organisation or enterprise as `jebel-quant/rhiza` โ from any other
|
|
128
|
+
organisation the secrets simply never arrived, and private dependencies failed to install
|
|
129
|
+
with `could not read Password for 'https://***@github.com'` (#1689). A secret that is not
|
|
130
|
+
defined is forwarded empty and the workflow falls back to `github.token`, so nothing is
|
|
131
|
+
required for a project with no private dependencies. Pull requests from forks never receive
|
|
132
|
+
secrets at all, so a fork PR that needs a private dependency fails at install; that is
|
|
133
|
+
GitHub's rule rather than a rhiza setting.
|
|
134
|
+
|
|
135
|
+
The docker workflow is the one place the runner's git configuration cannot reach, because
|
|
136
|
+
`uv sync` runs inside the image build. It passes both secrets to `docker buildx build` as
|
|
137
|
+
BuildKit secrets instead, which exist only for that one instruction and are written into no
|
|
138
|
+
layer; a build argument would be readable with `docker history` (#1691). See
|
|
139
|
+
`docs/development/DOCKER.md` for building such an image locally.
|
|
140
|
+
|
|
141
|
+
## Private dependency setup (opt-in)
|
|
142
|
+
|
|
143
|
+
Set `RHIZA_SETUP_ENABLED=true` and commit a consumer-owned
|
|
144
|
+
`.github/actions/rhiza-setup/action.yml` (or `action.yaml`). The action receives
|
|
145
|
+
`purpose` and the optional `RHIZA_SETUP_CREDENTIALS` secret as `credentials`.
|
|
146
|
+
Keep provider settings inside that action; no repository variables are forwarded.
|
|
147
|
+
Setup exports through `GITHUB_ENV` survive an unset legacy `UV_EXTRA_INDEX_URL`
|
|
148
|
+
secret. Publication is independent: built-in PyPI remains the default.
|
|
149
|
+
|
|
150
|
+
For Dependabot PRs, also define `RHIZA_SETUP_CREDENTIALS` as a Dependabot secret
|
|
151
|
+
when setup requires it; Actions secrets are not available to those runs. The same
|
|
152
|
+
applies to `BOOK_SETUP_TOKEN` for deprecated book callers.
|
|
153
|
+
|
|
154
|
+
In the shipped workflows, OIDC-based setup works only in the release `build` job,
|
|
155
|
+
which already has `id-token: write` for attestations. CI, book, marimo, benchmark
|
|
156
|
+
and weekly setup support token-based authentication only.
|
|
157
|
+
|
|
158
|
+
Default setup jobs explicitly retain read-only permissions; the book build never
|
|
159
|
+
inherits Pages deployment permissions. A caller-only `id-token: write` grant is
|
|
160
|
+
insufficient for OIDC setup: opt in with a consumer-owned workflow copy granting
|
|
161
|
+
OIDC only to the dependency jobs, plus the matching caller grant. See the setup
|
|
162
|
+
contract below for the procedure. Excluded wrappers no longer receive automatic
|
|
163
|
+
workflow-version updates; bump their references and maintain workflow copies manually.
|
|
164
|
+
Pages deployment and release signing retain their existing separate permissions.
|
|
165
|
+
Fork PRs and `pull_request_target` fail when setup is enabled, before the action runs.
|
|
166
|
+
|
|
167
|
+
For the CodeArtifact example, IAM/OIDC configuration, workflow coverage, book-hook
|
|
168
|
+
migration and deferred container/AWS validation work, see the
|
|
169
|
+
[setup contract](https://jebel-quant.github.io/rhiza/reference/ARCHITECTURE/#consumer-owned-dependency-setup).
|
|
170
|
+
Rename the former book action to `rhiza-setup`, its `token` input to `credentials`,
|
|
171
|
+
and `BOOK_SETUP_TOKEN` to `RHIZA_SETUP_CREDENTIALS`; remove `with.book-setup` and set
|
|
172
|
+
`RHIZA_SETUP_ENABLED=true` instead. The old input and secret remain deprecated aliases
|
|
173
|
+
until the next major release. `book-setup: true` enables setup for the book job and
|
|
174
|
+
emits a warning. The generic action takes precedence; if absent, the old
|
|
175
|
+
`rhiza-book-setup` action runs with its `token` input. `RHIZA_SETUP_CREDENTIALS`
|
|
176
|
+
takes precedence over `BOOK_SETUP_TOKEN`. Only one action runs.
|
|
177
|
+
|
|
178
|
+
## CI profiles (prototype)
|
|
179
|
+
|
|
180
|
+
Select `lean`, `standard` or `comprehensive` with `[tool.rhiza.ci].profile` in the
|
|
181
|
+
consumer's `pyproject.toml`. The default is `comprehensive`. Lean consolidates
|
|
182
|
+
quality checks and runs the primary Python version on ordinary changes; scheduled
|
|
183
|
+
and full manual runs restore the complete compatibility matrix. Standard moves
|
|
184
|
+
lowest-direct dependency testing to those broader runs.
|
|
185
|
+
|
|
186
|
+
See the [CI profiles guide](https://github.com/Jebel-Quant/rhiza/blob/main/docs/guides/CI_PROFILES.md)
|
|
187
|
+
for scope, migration, branch protection and unreleased-prototype limitations.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Thanks for contributing!
|
|
3
|
+
|
|
4
|
+
Every section below is optional guidance, not a form to fill in completely.
|
|
5
|
+
Delete what does not apply; keep the checklist.
|
|
6
|
+
-->
|
|
7
|
+
|
|
8
|
+
#### Reference issues/PRs
|
|
9
|
+
|
|
10
|
+
<!--
|
|
11
|
+
Example: Fixes #1234. See also #3456.
|
|
12
|
+
|
|
13
|
+
Use a closing keyword (Fixes, Closes, Resolves) so the linked issue closes
|
|
14
|
+
automatically when this PR is merged:
|
|
15
|
+
https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue
|
|
16
|
+
If no issue exists, open one first or explain the motivation below.
|
|
17
|
+
-->
|
|
18
|
+
|
|
19
|
+
#### What does this implement/fix? Explain your changes.
|
|
20
|
+
|
|
21
|
+
<!--
|
|
22
|
+
A clear and concise description of what you changed and why. If the change is
|
|
23
|
+
a bug fix, say what the observed behaviour was and what it is now.
|
|
24
|
+
-->
|
|
25
|
+
|
|
26
|
+
#### Does your contribution introduce a new dependency? If yes, which one?
|
|
27
|
+
|
|
28
|
+
<!--
|
|
29
|
+
Only relevant if you changed the project manifest (pyproject.toml, Cargo.toml,
|
|
30
|
+
go.mod), a GitHub Actions pin or a pre-commit hook. We try to keep the
|
|
31
|
+
dependency set small; say why the new one is needed and whether it is
|
|
32
|
+
optional.
|
|
33
|
+
-->
|
|
34
|
+
|
|
35
|
+
#### What should a reviewer concentrate their feedback on?
|
|
36
|
+
|
|
37
|
+
<!--
|
|
38
|
+
Particularly useful for a PR that is still in development: point reviewers
|
|
39
|
+
at the parts that are ready for comments. Bullets (* or -) and filled
|
|
40
|
+
checkboxes [x] work well here.
|
|
41
|
+
-->
|
|
42
|
+
|
|
43
|
+
#### Did you add any tests for the change?
|
|
44
|
+
|
|
45
|
+
<!--
|
|
46
|
+
New behaviour should come with a test that fails without the change, so
|
|
47
|
+
later edits cannot reintroduce the same bug. If the change is not testable,
|
|
48
|
+
say why.
|
|
49
|
+
-->
|
|
50
|
+
|
|
51
|
+
#### Any other comments?
|
|
52
|
+
|
|
53
|
+
<!--
|
|
54
|
+
Trade-offs you considered, follow-up work you deliberately left out,
|
|
55
|
+
anything a reviewer would otherwise have to guess.
|
|
56
|
+
-->
|
|
57
|
+
|
|
58
|
+
#### PR checklist
|
|
59
|
+
|
|
60
|
+
<!--
|
|
61
|
+
Go through the list below. Remove points that do not apply.
|
|
62
|
+
-->
|
|
63
|
+
|
|
64
|
+
##### For all contributions
|
|
65
|
+
|
|
66
|
+
- [ ] The PR title follows [Conventional Commits](https://www.conventionalcommits.org/)
|
|
67
|
+
(`feat:`, `fix:`, `docs:`, `test:`, `ci:`, `chore:`, `refactor:`, ...). It becomes
|
|
68
|
+
the squash-merge commit and the changelog entry.
|
|
69
|
+
- [ ] `make fmt` and `make test` pass locally.
|
|
70
|
+
- [ ] No hand edits to template-owned files. Anything listed in
|
|
71
|
+
`.rhiza/template.lock` is overwritten by the next sync; propose the change
|
|
72
|
+
upstream in [Jebel-Quant/rhiza](https://github.com/Jebel-Quant/rhiza) or add the
|
|
73
|
+
path to `exclude:` in `.rhiza/template.yml`.
|
|
74
|
+
|
|
75
|
+
##### For user-visible changes
|
|
76
|
+
|
|
77
|
+
- [ ] Documentation (README, docstrings, docs pages) is updated to match.
|
|
78
|
+
- [ ] Breaking changes are marked with `!` in the title or a `BREAKING CHANGE:` footer.
|
|
79
|
+
|
|
80
|
+
<!--
|
|
81
|
+
Thanks again for contributing!
|
|
82
|
+
-->
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# This file is part of the jebel-quant/rhiza repository
|
|
2
|
+
# (https://github.com/jebel-quant/rhiza).
|
|
3
|
+
#
|
|
4
|
+
# Configuration: Dependabot
|
|
5
|
+
#
|
|
6
|
+
# Purpose: Automate dependency updates for Python packages, GitHub Actions, and Docker images.
|
|
7
|
+
#
|
|
8
|
+
# Documentation: https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
|
|
9
|
+
|
|
10
|
+
version: 2
|
|
11
|
+
updates:
|
|
12
|
+
# Python dependencies using uv
|
|
13
|
+
- package-ecosystem: "uv"
|
|
14
|
+
directory: "/"
|
|
15
|
+
# Bump uv.lock only; leave pyproject.toml ranges alone unless a new version falls
|
|
16
|
+
# outside them. Without this, Dependabot's default ("auto") treats any project it
|
|
17
|
+
# cannot find on PyPI -- private, unpublished, or whose name belongs to another
|
|
18
|
+
# project -- as an application and rewrites every `>=` floor to the latest version,
|
|
19
|
+
# which then fails the lowest-direct-dependency CI job.
|
|
20
|
+
versioning-strategy: "increase-if-necessary"
|
|
21
|
+
schedule:
|
|
22
|
+
interval: "weekly"
|
|
23
|
+
day: "tuesday"
|
|
24
|
+
time: "09:00"
|
|
25
|
+
timezone: "Asia/Dubai"
|
|
26
|
+
ignore:
|
|
27
|
+
- dependency-name: "*"
|
|
28
|
+
update-types: ["version-update:semver-major"]
|
|
29
|
+
open-pull-requests-limit: 10
|
|
30
|
+
labels:
|
|
31
|
+
- "dependencies"
|
|
32
|
+
- "python"
|
|
33
|
+
groups:
|
|
34
|
+
python-dependencies:
|
|
35
|
+
patterns:
|
|
36
|
+
- "*"
|
|
37
|
+
update-types:
|
|
38
|
+
- "patch"
|
|
39
|
+
- "minor"
|
|
40
|
+
commit-message:
|
|
41
|
+
prefix: "chore(deps)"
|
|
42
|
+
prefix-development: "chore(deps-dev)"
|
|
43
|
+
include: "scope"
|
|
44
|
+
|
|
45
|
+
# GitHub Actions
|
|
46
|
+
- package-ecosystem: "github-actions"
|
|
47
|
+
directory: "/"
|
|
48
|
+
schedule:
|
|
49
|
+
interval: "weekly"
|
|
50
|
+
day: "tuesday"
|
|
51
|
+
time: "09:00"
|
|
52
|
+
timezone: "Asia/Dubai"
|
|
53
|
+
ignore:
|
|
54
|
+
- dependency-name: "*"
|
|
55
|
+
update-types: ["version-update:semver-major"]
|
|
56
|
+
open-pull-requests-limit: 10
|
|
57
|
+
labels:
|
|
58
|
+
- "dependencies"
|
|
59
|
+
- "github-actions"
|
|
60
|
+
groups:
|
|
61
|
+
github-actions:
|
|
62
|
+
patterns:
|
|
63
|
+
- "*"
|
|
64
|
+
update-types:
|
|
65
|
+
- "patch"
|
|
66
|
+
- "minor"
|
|
67
|
+
|
|
68
|
+
commit-message:
|
|
69
|
+
prefix: "chore(deps)"
|
|
70
|
+
include: "scope"
|
|
71
|
+
|
|
72
|
+
# Docker
|
|
73
|
+
#- package-ecosystem: "docker"
|
|
74
|
+
# directory: "/docker"
|
|
75
|
+
# schedule:
|
|
76
|
+
# interval: "weekly"
|
|
77
|
+
# day: "tuesday"
|
|
78
|
+
# time: "09:00"
|
|
79
|
+
# timezone: "Asia/Dubai"
|
|
80
|
+
# open-pull-requests-limit: 10
|
|
81
|
+
# labels:
|
|
82
|
+
# - "dependencies"
|
|
83
|
+
# - "docker"
|
|
84
|
+
# commit-message:
|
|
85
|
+
# prefix: "chore(deps)"
|
|
86
|
+
# include: "scope"
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# GitHub Release Notes Configuration
|
|
2
|
+
# This file configures automatic categorization of pull requests in release notes
|
|
3
|
+
# See: https://docs.github.com/en/repositories/releasing-projects-on-github/automatically-generated-release-notes
|
|
4
|
+
|
|
5
|
+
changelog:
|
|
6
|
+
exclude:
|
|
7
|
+
labels:
|
|
8
|
+
- ignore-for-release
|
|
9
|
+
- duplicate
|
|
10
|
+
- question
|
|
11
|
+
- invalid
|
|
12
|
+
- wontfix
|
|
13
|
+
authors:
|
|
14
|
+
- dependabot
|
|
15
|
+
- renovate
|
|
16
|
+
|
|
17
|
+
categories:
|
|
18
|
+
- title: ๐ Features
|
|
19
|
+
labels:
|
|
20
|
+
- feature
|
|
21
|
+
- enhancement
|
|
22
|
+
|
|
23
|
+
- title: ๐ Bug Fixes
|
|
24
|
+
labels:
|
|
25
|
+
- bug
|
|
26
|
+
- fix
|
|
27
|
+
|
|
28
|
+
- title: ๐ Documentation
|
|
29
|
+
labels:
|
|
30
|
+
- documentation
|
|
31
|
+
- docs
|
|
32
|
+
|
|
33
|
+
- title: ๐ง Technical Debt
|
|
34
|
+
labels:
|
|
35
|
+
- technical-debt
|
|
36
|
+
- refactor
|
|
37
|
+
- cleanup
|
|
38
|
+
|
|
39
|
+
- title: ๐๏ธ Infrastructure
|
|
40
|
+
labels:
|
|
41
|
+
- ci
|
|
42
|
+
- build
|
|
43
|
+
- infrastructure
|
|
44
|
+
|
|
45
|
+
- title: โก Performance
|
|
46
|
+
labels:
|
|
47
|
+
- performance
|
|
48
|
+
- optimization
|
|
49
|
+
|
|
50
|
+
- title: ๐งช Testing
|
|
51
|
+
labels:
|
|
52
|
+
- test
|
|
53
|
+
- testing
|
|
54
|
+
|
|
55
|
+
- title: ๐ Security
|
|
56
|
+
labels:
|
|
57
|
+
- security
|
|
58
|
+
- vulnerability
|
|
59
|
+
|
|
60
|
+
- title: ๐ฆ Dependencies
|
|
61
|
+
labels:
|
|
62
|
+
- dependencies
|
|
63
|
+
- deps
|
|
64
|
+
|
|
65
|
+
- title: ๐ Other Changes
|
|
66
|
+
labels:
|
|
67
|
+
- "*"
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "main-branch-protection",
|
|
3
|
+
"target": "branch",
|
|
4
|
+
"enforcement": "active",
|
|
5
|
+
"conditions": {
|
|
6
|
+
"ref_name": {
|
|
7
|
+
"include": ["~DEFAULT_BRANCH"],
|
|
8
|
+
"exclude": []
|
|
9
|
+
}
|
|
10
|
+
},
|
|
11
|
+
"rules": [
|
|
12
|
+
{ "type": "deletion" },
|
|
13
|
+
{ "type": "non_fast_forward" },
|
|
14
|
+
{
|
|
15
|
+
"type": "pull_request",
|
|
16
|
+
"parameters": {
|
|
17
|
+
"required_approving_review_count": 1,
|
|
18
|
+
"dismiss_stale_reviews_on_push": true,
|
|
19
|
+
"require_code_owner_review": true,
|
|
20
|
+
"require_last_push_approval": true,
|
|
21
|
+
"required_review_thread_resolution": false,
|
|
22
|
+
"allowed_merge_methods": ["squash", "merge", "rebase"]
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"type": "required_status_checks",
|
|
27
|
+
"parameters": {
|
|
28
|
+
"strict_required_status_checks_policy": false,
|
|
29
|
+
"required_status_checks": [
|
|
30
|
+
{ "context": "ci / Pre-commit hooks", "integration_id": 15368 },
|
|
31
|
+
{ "context": "ci / Check dependencies with deptry", "integration_id": 15368 },
|
|
32
|
+
{ "context": "ci / docs-coverage", "integration_id": 15368 },
|
|
33
|
+
{ "context": "ci / Security scanning", "integration_id": 15368 },
|
|
34
|
+
{ "context": "ci / License compliance scan", "integration_id": 15368 },
|
|
35
|
+
{ "context": "ci / CI gate", "integration_id": 15368 }
|
|
36
|
+
]
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
],
|
|
40
|
+
"bypass_actors": [
|
|
41
|
+
{
|
|
42
|
+
"actor_type": "RepositoryRole",
|
|
43
|
+
"actor_id": 5,
|
|
44
|
+
"bypass_mode": "always"
|
|
45
|
+
}
|
|
46
|
+
]
|
|
47
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "version-tag-protection",
|
|
3
|
+
"target": "tag",
|
|
4
|
+
"enforcement": "active",
|
|
5
|
+
"conditions": {
|
|
6
|
+
"ref_name": {
|
|
7
|
+
"include": ["refs/tags/v*"],
|
|
8
|
+
"exclude": []
|
|
9
|
+
}
|
|
10
|
+
},
|
|
11
|
+
"rules": [
|
|
12
|
+
{ "type": "creation" },
|
|
13
|
+
{ "type": "update" },
|
|
14
|
+
{ "type": "deletion" },
|
|
15
|
+
{ "type": "non_fast_forward" }
|
|
16
|
+
],
|
|
17
|
+
"bypass_actors": [
|
|
18
|
+
{
|
|
19
|
+
"actor_type": "RepositoryRole",
|
|
20
|
+
"actor_id": 5,
|
|
21
|
+
"bypass_mode": "always"
|
|
22
|
+
}
|
|
23
|
+
]
|
|
24
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# This file is part of the jebel-quant/rhiza repository
|
|
2
|
+
# (https://github.com/jebel-quant/rhiza).
|
|
3
|
+
#
|
|
4
|
+
# Configuration: GitHub Secret Scanning
|
|
5
|
+
#
|
|
6
|
+
# Purpose: Configure GitHub secret scanning to identify and prevent accidental
|
|
7
|
+
# exposure of secrets, credentials, and tokens in the repository.
|
|
8
|
+
#
|
|
9
|
+
# Note: Secret scanning must be enabled in repository Settings >
|
|
10
|
+
# Security > Code security and analysis > Secret scanning.
|
|
11
|
+
#
|
|
12
|
+
# Documentation: https://docs.github.com/en/code-security/secret-scanning/configuring-secret-scanning-for-your-repository
|
|
13
|
+
|
|
14
|
+
paths-ignore:
|
|
15
|
+
# Ignore test fixtures that may contain example/fake secrets
|
|
16
|
+
- "tests/**"
|
|
17
|
+
# Ignore documentation that references example tokens/keys
|
|
18
|
+
- "docs/**/*.md"
|
|
19
|
+
- "book/**"
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# This file is part of the jebel-quant/rhiza repository
|
|
2
|
+
# (https://github.com/jebel-quant/rhiza).
|
|
3
|
+
#
|
|
4
|
+
# Workflow: Benchmarks
|
|
5
|
+
#
|
|
6
|
+
# Purpose: Run the benchmark suite on pushes to main to create a measurable
|
|
7
|
+
# performance baseline over time.
|
|
8
|
+
#
|
|
9
|
+
# Trigger: This workflow runs on pushes to the main branch.
|
|
10
|
+
|
|
11
|
+
name: "(RHIZA) BENCHMARK"
|
|
12
|
+
|
|
13
|
+
permissions:
|
|
14
|
+
contents: read
|
|
15
|
+
|
|
16
|
+
on:
|
|
17
|
+
push:
|
|
18
|
+
branches:
|
|
19
|
+
- main
|
|
20
|
+
|
|
21
|
+
jobs:
|
|
22
|
+
benchmark:
|
|
23
|
+
uses: jebel-quant/rhiza/.github/workflows/rhiza_benchmark.yml@v1.12.0
|
|
24
|
+
# Forwarded explicitly: `secrets: inherit` only reaches a reusable workflow in the
|
|
25
|
+
# caller's own organisation or enterprise (#1689). A secret this repository has not
|
|
26
|
+
# defined arrives empty and the workflow falls back to `github.token`.
|
|
27
|
+
secrets:
|
|
28
|
+
RHIZA_SETUP_CREDENTIALS: ${{ secrets.RHIZA_SETUP_CREDENTIALS }}
|
|
29
|
+
GH_PAT: ${{ secrets.GH_PAT }}
|
|
30
|
+
UV_EXTRA_INDEX_URL: ${{ secrets.UV_EXTRA_INDEX_URL }}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# This file is part of the jebel-quant/rhiza repository
|
|
2
|
+
# (https://github.com/jebel-quant/rhiza).
|
|
3
|
+
#
|
|
4
|
+
# Workflow: Book
|
|
5
|
+
# Purpose: This workflow builds and deploys comprehensive documentation for the project.
|
|
6
|
+
# It combines API documentation, test coverage reports, test results, and
|
|
7
|
+
# interactive notebooks into a single GitHub Pages site.
|
|
8
|
+
#
|
|
9
|
+
# Trigger: This workflow runs on every push (any branch), so every commit
|
|
10
|
+
# validates that the book still builds. The reusable workflow deploys
|
|
11
|
+
# to GitHub Pages only from the repository's default branch and never
|
|
12
|
+
# from a fork; other branches build and upload an artifact only.
|
|
13
|
+
#
|
|
14
|
+
# Components:
|
|
15
|
+
# - ๐ Process Marimo notebooks
|
|
16
|
+
# - ๐ Build documentation site via zensical
|
|
17
|
+
# - ๐งช Run tests and generate coverage reports
|
|
18
|
+
# - ๐ Deploy combined documentation to GitHub Pages
|
|
19
|
+
|
|
20
|
+
name: "(RHIZA) BOOK"
|
|
21
|
+
|
|
22
|
+
on:
|
|
23
|
+
push:
|
|
24
|
+
branches:
|
|
25
|
+
- '**'
|
|
26
|
+
|
|
27
|
+
permissions:
|
|
28
|
+
contents: read
|
|
29
|
+
|
|
30
|
+
jobs:
|
|
31
|
+
book:
|
|
32
|
+
uses: jebel-quant/rhiza/.github/workflows/rhiza_book.yml@v1.12.0
|
|
33
|
+
# Forwarded explicitly: `secrets: inherit` only reaches a reusable workflow in the
|
|
34
|
+
# caller's own organisation or enterprise (#1689). A secret this repository has not
|
|
35
|
+
# defined arrives empty and the workflow falls back to `github.token`.
|
|
36
|
+
secrets:
|
|
37
|
+
BOOK_SETUP_TOKEN: ${{ secrets.BOOK_SETUP_TOKEN }}
|
|
38
|
+
RHIZA_SETUP_CREDENTIALS: ${{ secrets.RHIZA_SETUP_CREDENTIALS }}
|
|
39
|
+
GH_PAT: ${{ secrets.GH_PAT }}
|
|
40
|
+
UV_EXTRA_INDEX_URL: ${{ secrets.UV_EXTRA_INDEX_URL }}
|
|
41
|
+
permissions:
|
|
42
|
+
contents: read
|
|
43
|
+
pages: write
|
|
44
|
+
id-token: write
|
|
45
|
+
# Set `deploy-pages: false` for artifact-only mode -- the reusable workflow
|
|
46
|
+
# still uploads the generic `book` artifact, and a consumer-owned job below
|
|
47
|
+
# can download it and deploy to Cloudflare Pages, Azure Static Web Apps,
|
|
48
|
+
# S3/CloudFront, an internal web server, etc. See docs/guides/BOOK.md for a
|
|
49
|
+
# full Cloudflare Pages example.
|
|
50
|
+
# with:
|
|
51
|
+
# deploy-pages: false
|