src-py-lib 0.1.7__tar.gz → 0.1.9__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 (35) hide show
  1. src_py_lib-0.1.9/.github/CODEOWNERS +1 -0
  2. {src_py_lib-0.1.7 → src_py_lib-0.1.9}/.github/workflows/release.yml +57 -25
  3. {src_py_lib-0.1.7 → src_py_lib-0.1.9}/.github/workflows/validate.yml +2 -0
  4. {src_py_lib-0.1.7 → src_py_lib-0.1.9}/.gitignore +2 -1
  5. {src_py_lib-0.1.7 → src_py_lib-0.1.9}/AGENTS.md +14 -97
  6. {src_py_lib-0.1.7 → src_py_lib-0.1.9}/PKG-INFO +4 -4
  7. {src_py_lib-0.1.7 → src_py_lib-0.1.9}/pyproject.toml +10 -7
  8. {src_py_lib-0.1.7 → src_py_lib-0.1.9}/renovate.json +9 -0
  9. {src_py_lib-0.1.7 → src_py_lib-0.1.9}/uv.lock +27 -28
  10. {src_py_lib-0.1.7 → src_py_lib-0.1.9}/.github/workflows/ci.yml +0 -0
  11. {src_py_lib-0.1.7 → src_py_lib-0.1.9}/.markdownlint-cli2.yaml +0 -0
  12. {src_py_lib-0.1.7 → src_py_lib-0.1.9}/.python-version +0 -0
  13. {src_py_lib-0.1.7 → src_py_lib-0.1.9}/LICENSE +0 -0
  14. {src_py_lib-0.1.7 → src_py_lib-0.1.9}/README.md +0 -0
  15. {src_py_lib-0.1.7 → src_py_lib-0.1.9}/SECURITY.md +0 -0
  16. {src_py_lib-0.1.7 → src_py_lib-0.1.9}/src/src_py_lib/__init__.py +0 -0
  17. {src_py_lib-0.1.7 → src_py_lib-0.1.9}/src/src_py_lib/clients/__init__.py +0 -0
  18. {src_py_lib-0.1.7 → src_py_lib-0.1.9}/src/src_py_lib/clients/github.py +0 -0
  19. {src_py_lib-0.1.7 → src_py_lib-0.1.9}/src/src_py_lib/clients/google_sheets.py +0 -0
  20. {src_py_lib-0.1.7 → src_py_lib-0.1.9}/src/src_py_lib/clients/graphql.py +0 -0
  21. {src_py_lib-0.1.7 → src_py_lib-0.1.9}/src/src_py_lib/clients/linear.py +0 -0
  22. {src_py_lib-0.1.7 → src_py_lib-0.1.9}/src/src_py_lib/clients/one_password.py +0 -0
  23. {src_py_lib-0.1.7 → src_py_lib-0.1.9}/src/src_py_lib/clients/slack.py +0 -0
  24. {src_py_lib-0.1.7 → src_py_lib-0.1.9}/src/src_py_lib/clients/sourcegraph.py +0 -0
  25. {src_py_lib-0.1.7 → src_py_lib-0.1.9}/src/src_py_lib/py.typed +0 -0
  26. {src_py_lib-0.1.7 → src_py_lib-0.1.9}/src/src_py_lib/utils/__init__.py +0 -0
  27. {src_py_lib-0.1.7 → src_py_lib-0.1.9}/src/src_py_lib/utils/config.py +0 -0
  28. {src_py_lib-0.1.7 → src_py_lib-0.1.9}/src/src_py_lib/utils/http.py +0 -0
  29. {src_py_lib-0.1.7 → src_py_lib-0.1.9}/src/src_py_lib/utils/json_cache.py +0 -0
  30. {src_py_lib-0.1.7 → src_py_lib-0.1.9}/src/src_py_lib/utils/json_types.py +0 -0
  31. {src_py_lib-0.1.7 → src_py_lib-0.1.9}/src/src_py_lib/utils/logging.py +0 -0
  32. {src_py_lib-0.1.7 → src_py_lib-0.1.9}/src/src_py_lib/utils/tsv.py +0 -0
  33. {src_py_lib-0.1.7 → src_py_lib-0.1.9}/tests/test_import.py +0 -0
  34. {src_py_lib-0.1.7 → src_py_lib-0.1.9}/tests/test_logging_http_clients.py +0 -0
  35. {src_py_lib-0.1.7 → src_py_lib-0.1.9}/tests/test_tsv.py +0 -0
@@ -0,0 +1 @@
1
+ * @marcleblanc2
@@ -6,8 +6,8 @@ on:
6
6
  - "v*"
7
7
  workflow_dispatch:
8
8
  inputs:
9
- tag:
10
- description: "Existing release tag to publish, for example v0.1.0"
9
+ version:
10
+ description: "Package version to publish, for example 0.1.0 or v0.1.0"
11
11
  required: true
12
12
  type: string
13
13
 
@@ -16,7 +16,7 @@ permissions:
16
16
  pull-requests: read
17
17
 
18
18
  concurrency:
19
- group: release-${{ github.event.inputs.tag || github.ref_name }}
19
+ group: release-${{ github.event_name == 'workflow_dispatch' && inputs.version || github.ref_name }}
20
20
  cancel-in-progress: false
21
21
 
22
22
  defaults:
@@ -24,15 +24,41 @@ defaults:
24
24
  shell: bash
25
25
 
26
26
  jobs:
27
+ release_ref:
28
+ name: Resolve release tag
29
+ runs-on: ubuntu-24.04
30
+ outputs:
31
+ tag: ${{ steps.release.outputs.tag }}
32
+ version: ${{ steps.release.outputs.version }}
33
+
34
+ steps:
35
+ - name: Resolve release tag
36
+ id: release
37
+ env:
38
+ RELEASE_INPUT: ${{ github.event_name == 'workflow_dispatch' && inputs.version || github.ref_name }}
39
+ run: |
40
+ release_input="${RELEASE_INPUT}"
41
+ if [[ ! "${release_input}" =~ ^v?[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
42
+ echo "::error title=Invalid release version::Use MAJOR.MINOR.PATCH or vMAJOR.MINOR.PATCH, got '${release_input}'."
43
+ exit 1
44
+ fi
45
+
46
+ release_version="${release_input#v}"
47
+ release_tag="v${release_version}"
48
+ echo "tag=${release_tag}" >> "${GITHUB_OUTPUT}"
49
+ echo "version=${release_version}" >> "${GITHUB_OUTPUT}"
50
+
27
51
  validate:
28
52
  name: Validate
53
+ needs: release_ref
29
54
  uses: ./.github/workflows/validate.yml
30
55
  with:
31
- ref: ${{ github.event.inputs.tag || github.ref }}
56
+ ref: ${{ needs.release_ref.outputs.tag }}
32
57
  build-package: false
33
58
 
34
59
  wheel:
35
60
  name: Build wheel
61
+ needs: release_ref
36
62
  runs-on: ubuntu-24.04
37
63
  env:
38
64
  IMPORT_NAME: src_py_lib
@@ -45,7 +71,7 @@ jobs:
45
71
  with:
46
72
  fetch-depth: 0
47
73
  persist-credentials: false
48
- ref: ${{ github.event.inputs.tag || github.ref }}
74
+ ref: ${{ needs.release_ref.outputs.tag }}
49
75
 
50
76
  - name: Set up Python
51
77
  uses: actions/setup-python@v6
@@ -66,7 +92,7 @@ jobs:
66
92
  - name: Validate release inputs
67
93
  id: release
68
94
  env:
69
- RELEASE_TAG: ${{ github.event.inputs.tag || github.ref_name }}
95
+ RELEASE_TAG: ${{ needs.release_ref.outputs.tag }}
70
96
  run: |
71
97
  release_tag="${RELEASE_TAG}"
72
98
  if [[ ! "${release_tag}" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
@@ -80,29 +106,19 @@ jobs:
80
106
  tag_revision="$(git rev-list -n 1 "${release_tag}")"
81
107
  git fetch --no-tags origin main
82
108
  main_revision="$(git rev-parse origin/main)"
83
- if ! git merge-base --is-ancestor "${tag_revision}" "${main_revision}"; then
84
- echo "::error title=Tag is not on main::Tag '${release_tag}' points at ${tag_revision}, which is not reachable from origin/main."
85
- echo "::error::Merge the release PR first, then tag the main commit."
86
- exit 1
87
- fi
88
-
89
- project_version=$(uv run --frozen python - <<'PY'
90
- import tomllib
91
-
92
- with open("pyproject.toml", "rb") as pyproject_file:
93
- print(tomllib.load(pyproject_file)["project"]["version"])
94
- PY
95
- )
96
- if [[ "v${project_version}" != "${release_tag}" ]]; then
97
- echo "::error title=Version mismatch::pyproject.toml version '${project_version}' does not match tag '${release_tag}'."
109
+ if [[ "${tag_revision}" != "${main_revision}" ]]; then
110
+ echo "::error title=Tag is not origin/main::Tag '${release_tag}' points at ${tag_revision}, but origin/main is ${main_revision}."
111
+ echo "::error::Tag the remote head of main, then rerun the release."
98
112
  exit 1
99
113
  fi
100
114
 
101
115
  echo "tag=${release_tag}" >> "${GITHUB_OUTPUT}"
116
+ echo "version=${release_tag#v}" >> "${GITHUB_OUTPUT}"
102
117
 
103
118
  - name: Build distributions
104
119
  id: build
105
120
  run: |
121
+ release_version="${{ steps.release.outputs.version }}"
106
122
  dist_dir="build/release/dist"
107
123
  rm -rf build/release
108
124
  mkdir -p "${dist_dir}"
@@ -123,6 +139,22 @@ jobs:
123
139
  wheel_name="$(basename "${wheel_path}")"
124
140
  source_distribution_path="${source_distributions[0]}"
125
141
  source_distribution_name="$(basename "${source_distribution_path}")"
142
+ case "${wheel_name}" in
143
+ src_py_lib-"${release_version}"-*.whl)
144
+ ;;
145
+ *)
146
+ echo "::error title=Wheel version mismatch::Expected wheel version ${release_version}, got '${wheel_name}'."
147
+ exit 1
148
+ ;;
149
+ esac
150
+ case "${source_distribution_name}" in
151
+ src_py_lib-"${release_version}".tar.gz)
152
+ ;;
153
+ *)
154
+ echo "::error title=Source distribution version mismatch::Expected source distribution version ${release_version}, got '${source_distribution_name}'."
155
+ exit 1
156
+ ;;
157
+ esac
126
158
  wheel_checksum_path="${wheel_path}.sha256"
127
159
  source_distribution_checksum_path="${source_distribution_path}.sha256"
128
160
 
@@ -214,14 +246,14 @@ jobs:
214
246
 
215
247
  github-release:
216
248
  name: Publish GitHub release assets
217
- needs: [validate, wheel]
249
+ needs: [release_ref, validate, wheel]
218
250
  runs-on: ubuntu-24.04
219
251
  permissions:
220
252
  contents: write
221
253
 
222
254
  steps:
223
255
  - name: Download release assets
224
- uses: actions/download-artifact@v7
256
+ uses: actions/download-artifact@v8
225
257
  with:
226
258
  name: src-py-lib-release
227
259
  path: release-assets
@@ -230,7 +262,7 @@ jobs:
230
262
  env:
231
263
  GH_TOKEN: ${{ github.token }}
232
264
  GH_REPO: ${{ github.repository }}
233
- RELEASE_TAG: ${{ github.event.inputs.tag || github.ref_name }}
265
+ RELEASE_TAG: ${{ needs.release_ref.outputs.tag }}
234
266
  run: |
235
267
  release_tag="${RELEASE_TAG}"
236
268
  notes_path="$(find release-assets -name release-notes.md -print -quit)"
@@ -269,7 +301,7 @@ jobs:
269
301
 
270
302
  steps:
271
303
  - name: Download built distribution
272
- uses: actions/download-artifact@v7
304
+ uses: actions/download-artifact@v8
273
305
  with:
274
306
  name: pypi-distributions
275
307
  path: dist
@@ -158,6 +158,7 @@ jobs:
158
158
  - name: Check out code
159
159
  uses: actions/checkout@v6
160
160
  with:
161
+ fetch-depth: 0
161
162
  persist-credentials: false
162
163
  ref: ${{ inputs.ref || github.ref }}
163
164
 
@@ -217,6 +218,7 @@ jobs:
217
218
  - name: Check out code
218
219
  uses: actions/checkout@v6
219
220
  with:
221
+ fetch-depth: 0
220
222
  persist-credentials: false
221
223
  ref: ${{ inputs.ref || github.ref }}
222
224
 
@@ -10,6 +10,7 @@ __pycache__
10
10
  *.gql
11
11
  *.py[cod]
12
12
  *.py[oc]
13
+ *.swp
13
14
  *.yaml
14
15
  build/
15
16
  dist/
@@ -17,4 +18,4 @@ wheels/
17
18
 
18
19
  # Allow
19
20
  !.env.example
20
- !.markdownlint-cli2.yaml
21
+ !.markdownlint-cli2.yaml
@@ -51,111 +51,28 @@ uv run python -m unittest discover -s tests
51
51
 
52
52
  ## Release process
53
53
 
54
- - The tagged source commit must already contain the package version it
55
- releases. Do not make the release workflow edit `pyproject.toml`.
56
- - The tag must be `vMAJOR.MINOR.PATCH`, and `.github/workflows/release.yml`
57
- verifies that it matches `project.version` before building GitHub release
58
- assets and publishing to PyPI.
59
- - Prepare releases on a branch from current `main`. Set `VERSION`, then run:
60
- - As part of every release bump, find old release-version literals in
61
- `AGENTS.md`, `README.md`, and release snippets, and replace them with the
62
- new version where they are meant to stay current.
54
+ - Package versions are derived from Git tags through `hatch-vcs`.
55
+ - `pyproject.toml` must use `dynamic = ["version"]`; do not add a hard-coded
56
+ `project.version` for releases.
57
+ - The release tag must be `vMAJOR.MINOR.PATCH` and point at a commit reachable
58
+ from `origin/main`.
59
+ - The release workflow builds from the tag and checks that wheel and source
60
+ distribution filenames match the tag version before publishing.
61
+ - Do not make the release workflow edit `pyproject.toml` or `uv.lock`.
62
+ - Tag the remote head of `main` directly:
63
63
 
64
64
  ```sh
65
65
  set -euo pipefail
66
66
 
67
- VERSION=0.1.6
68
- BRANCH="release-v${VERSION}"
69
-
70
- git fetch origin --tags --prune
71
- git switch main
72
- git pull --ff-only
73
- git switch -c "${BRANCH}"
74
-
75
- uv run python - "${VERSION}" <<'PY'
76
- from pathlib import Path
77
- import re
78
- import sys
79
-
80
- version = sys.argv[1]
81
- path = Path("pyproject.toml")
82
- text = path.read_text()
83
- new_text = re.sub(
84
- r'(?m)^version = "[^"]+"$',
85
- f'version = "{version}"',
86
- text,
87
- count=1,
88
- )
89
- if new_text == text:
90
- raise SystemExit("pyproject.toml version was not updated")
91
- path.write_text(new_text)
92
- PY
93
-
94
- uv lock
95
- ```
96
-
97
- - Validate before opening the PR:
98
-
99
- ```sh
100
- set -euo pipefail
101
-
102
- uv lock --check
103
- actionlint
104
- npx --yes markdownlint-cli2@0.22.1
105
- uv run ruff check .
106
- uv run ruff format --check .
107
- uv run pyright
108
- uv run python -m unittest discover -s tests
109
- uv build --wheel --sdist --out-dir /tmp/src-py-lib-release-check --no-create-gitignore
110
- rm -rf /tmp/src-py-lib-release-check
111
- ```
112
-
113
- - Commit, push, open the PR, wait for checks, then merge it. If review is
114
- required, stop after `gh pr checks` and ask for review before merging.
115
-
116
- ```sh
117
- set -euo pipefail
118
-
119
- VERSION=0.1.6
120
- BRANCH="release-v${VERSION}"
67
+ VERSION_INPUT=<next-version>
68
+ VERSION="${VERSION_INPUT#v}"
121
69
  GH_REPO="sourcegraph/src-py-lib"
122
70
 
123
- git add pyproject.toml uv.lock
124
- git commit -m "Release v${VERSION}"
125
- git push -u origin "${BRANCH}"
126
-
127
- gh pr create \
128
- --repo "${GH_REPO}" \
129
- --base main \
130
- --head "${BRANCH}" \
131
- --title "Release v${VERSION}" \
132
- --body "Bump src-py-lib package metadata to ${VERSION}."
133
-
134
- gh pr checks "${BRANCH}" --repo "${GH_REPO}" --watch --fail-fast
135
- gh pr merge "${BRANCH}" --repo "${GH_REPO}" --squash --delete-branch
136
- ```
137
-
138
- - Tag the merged `main` commit. Do not tag a branch commit.
139
-
140
- ```sh
141
- set -euo pipefail
142
-
143
- VERSION=0.1.6
144
-
71
+ [[ "${VERSION_INPUT}" =~ ^v?[0-9]+\.[0-9]+\.[0-9]+$ ]]
145
72
  git fetch origin --tags --prune
146
- git switch main
147
- git pull --ff-only
148
- git tag "v${VERSION}"
73
+ MAIN_COMMIT="$(git rev-parse origin/main)"
74
+ git tag -a "v${VERSION}" "${MAIN_COMMIT}" -m "Release v${VERSION}"
149
75
  git push origin "v${VERSION}"
150
- ```
151
-
152
- - Watch the release workflow and confirm the GitHub release and PyPI project.
153
-
154
- ```sh
155
- set -euo pipefail
156
-
157
- VERSION=0.1.6
158
- GH_REPO="sourcegraph/src-py-lib"
159
76
 
160
77
  RUN_ID="$(
161
78
  gh run list \
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: src-py-lib
3
- Version: 0.1.7
3
+ Version: 0.1.9
4
4
  Summary: Reusable libraries for Sourcegraph projects
5
5
  Project-URL: Homepage, https://github.com/sourcegraph/src-py-lib
6
6
  Project-URL: Issues, https://github.com/sourcegraph/src-py-lib/issues
@@ -16,9 +16,9 @@ Classifier: Operating System :: OS Independent
16
16
  Classifier: Programming Language :: Python :: 3
17
17
  Classifier: Typing :: Typed
18
18
  Requires-Python: >=3.11
19
- Requires-Dist: httpx<1,>=0.28
20
- Requires-Dist: pydantic<3,>=2
21
- Requires-Dist: python-dotenv<2,>=1.2
19
+ Requires-Dist: httpx<1,>=0.28.1
20
+ Requires-Dist: pydantic<3,>=2.13.4
21
+ Requires-Dist: python-dotenv<2,>=1.2.2
22
22
  Description-Content-Type: text/markdown
23
23
 
24
24
  # src-py-lib
@@ -1,16 +1,16 @@
1
1
  [build-system]
2
- requires = ["hatchling"]
2
+ requires = ["hatchling", "hatch-vcs"]
3
3
  build-backend = "hatchling.build"
4
4
 
5
5
  [dependency-groups]
6
6
  dev = [
7
- "pyright>=1.1.409",
8
- "ruff>=0.7.0",
7
+ "pyright>=1.1.410",
8
+ "ruff>=0.15.16",
9
9
  ]
10
10
 
11
11
  [project]
12
12
  name = "src-py-lib"
13
- version = "0.1.7"
13
+ dynamic = ["version"]
14
14
  description = "Reusable libraries for Sourcegraph projects"
15
15
  readme = "README.md"
16
16
  requires-python = ">=3.11"
@@ -29,9 +29,9 @@ classifiers = [
29
29
  "Typing :: Typed",
30
30
  ]
31
31
  dependencies = [
32
- "httpx>=0.28,<1",
33
- "pydantic>=2,<3",
34
- "python-dotenv>=1.2,<2",
32
+ "httpx>=0.28.1,<1",
33
+ "pydantic>=2.13.4,<3",
34
+ "python-dotenv>=1.2.2,<2",
35
35
  ]
36
36
  keywords = [
37
37
  "Sourcegraph"
@@ -44,6 +44,9 @@ Issues = "https://github.com/sourcegraph/src-py-lib/issues"
44
44
  [tool.hatch.build.targets.wheel]
45
45
  packages = ["src/src_py_lib"]
46
46
 
47
+ [tool.hatch.version]
48
+ source = "vcs"
49
+
47
50
  [tool.pyright]
48
51
  include = ["src/src_py_lib", "tests"]
49
52
  typeCheckingMode = "strict"
@@ -9,6 +9,15 @@
9
9
  "python"
10
10
  ],
11
11
  "allowedVersions": "<3.12"
12
+ },
13
+ {
14
+ "matchPackageNames": [
15
+ "python"
16
+ ],
17
+ "matchUpdateTypes": [
18
+ "patch"
19
+ ],
20
+ "enabled": false
12
21
  }
13
22
  ],
14
23
  "schedule": [
@@ -207,15 +207,15 @@ wheels = [
207
207
 
208
208
  [[package]]
209
209
  name = "pyright"
210
- version = "1.1.409"
210
+ version = "1.1.410"
211
211
  source = { registry = "https://pypi.org/simple" }
212
212
  dependencies = [
213
213
  { name = "nodeenv" },
214
214
  { name = "typing-extensions" },
215
215
  ]
216
- sdist = { url = "https://files.pythonhosted.org/packages/51/4e/3aa27f74211522dba7e9cbc3e74de779c6d4b654c54e50a4840623be8014/pyright-1.1.409.tar.gz", hash = "sha256:986ee05beca9e077c165758ad123667c679e050059a2546aa02473930394bc93", size = 4430434, upload-time = "2026-04-23T11:02:03.799Z" }
216
+ sdist = { url = "https://files.pythonhosted.org/packages/10/53/e4d8ea1391bd4355231be6f91bf239479aa0014260ed3fb5526eeb12a1f2/pyright-1.1.410.tar.gz", hash = "sha256:07a073b8ba6749826773c1269773efa11b93440d9a6aa60419d9a3172d6dc488", size = 4062013, upload-time = "2026-06-01T17:35:48.894Z" }
217
217
  wheels = [
218
- { url = "https://files.pythonhosted.org/packages/16/6b/330d8ebae582b30c2959a1ef4c3bc344ebde48c2ff0c3f113c4710735e11/pyright-1.1.409-py3-none-any.whl", hash = "sha256:aa3ea228cab90c845c7a60d28db7a844c04315356392aa09fafcee98c8c22fb3", size = 6438161, upload-time = "2026-04-23T11:02:01.309Z" },
218
+ { url = "https://files.pythonhosted.org/packages/d7/33/288b5868fa00846dacf249633719d747893e54aebd196b9968ac1878a5d3/pyright-1.1.410-py3-none-any.whl", hash = "sha256:5e961bed37cacf96b3f7cd7b1da39b350a9239aa2e69138d0e88f728cfaf296c", size = 6082448, upload-time = "2026-06-01T17:35:46.387Z" },
219
219
  ]
220
220
 
221
221
  [[package]]
@@ -229,32 +229,31 @@ wheels = [
229
229
 
230
230
  [[package]]
231
231
  name = "ruff"
232
- version = "0.15.13"
232
+ version = "0.15.16"
233
233
  source = { registry = "https://pypi.org/simple" }
234
- sdist = { url = "https://files.pythonhosted.org/packages/24/21/a7d5c126d5b557715ef81098f3db2fe20f622a039ff2e626af28d674ab80/ruff-0.15.13.tar.gz", hash = "sha256:f9d89f17f7ba7fb2ed42921f0df75da797a9a5d71bc39049e2c687cf2baf44b7", size = 4678180, upload-time = "2026-05-14T13:44:37.869Z" }
234
+ sdist = { url = "https://files.pythonhosted.org/packages/a6/bd/5f7ec371001337d8fa61701c186ff8b613ecac1651848c5950f4c4d5f2e9/ruff-0.15.16.tar.gz", hash = "sha256:d05e78d38c78caf020b03789e25106c93017db5a0cb6e2819885018c61343b78", size = 4714267, upload-time = "2026-06-04T16:33:09.974Z" }
235
235
  wheels = [
236
- { url = "https://files.pythonhosted.org/packages/c6/61/11d458dc6ac22504fd8e237b29dfd40504c7fbbcc8930402cfe51a8e63ed/ruff-0.15.13-py3-none-linux_armv6l.whl", hash = "sha256:444b580fc72fd6887e650acd3e575e18cdc79dbcf42fb4030b491057921f61f8", size = 10738279, upload-time = "2026-05-14T13:44:18.7Z" },
237
- { url = "https://files.pythonhosted.org/packages/86/ca/caa871ee7be718c45256fada4e16a218ee3e33f0c4a46b729a60a24912e6/ruff-0.15.13-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6590d009e7cb7ebf36f83dbdd44a3fa48a0994ff6f1cdc1b08006abe58f98dc7", size = 11124798, upload-time = "2026-05-14T13:44:06.427Z" },
238
- { url = "https://files.pythonhosted.org/packages/d3/19/43f5f2e568dddde567fc41f8471f9432c09563e19d3e617a48cfa52f8f0a/ruff-0.15.13-py3-none-macosx_11_0_arm64.whl", hash = "sha256:1c26d2f66163deeb6e08d8b39fbbe983ce3c71cea06a6d7591cfd1421793c629", size = 10460761, upload-time = "2026-05-14T13:44:04.375Z" },
239
- { url = "https://files.pythonhosted.org/packages/99/df/cf938cd6de3003178f03ad7c1ea2a6c099468c03a35037985070b37e76be/ruff-0.15.13-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dbd6f94b434f896308e4d57fb7bfde0d02b99f7a64b3bdab0fdfa6a864203a5", size = 10804451, upload-time = "2026-05-14T13:44:25.221Z" },
240
- { url = "https://files.pythonhosted.org/packages/c7/7d/5d0973129b154ded2225729169d7068f26b467760b146493fde138415f23/ruff-0.15.13-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bf3259f3be4d181bda591da5db2571aed6853c6a048157756448020bc6c5cd22", size = 10534285, upload-time = "2026-05-14T13:44:08.888Z" },
241
- { url = "https://files.pythonhosted.org/packages/1f/e3/6b999bbc66cd51e5f073842bc2a3995e99c5e0e72e16b15e7261f7abf57a/ruff-0.15.13-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae9c17e5eb4430c154e76abc25d79a318190f5a997f38fb6b114416c5319ffc9", size = 11312063, upload-time = "2026-05-14T13:44:11.274Z" },
242
- { url = "https://files.pythonhosted.org/packages/af/5a/642639e9f5db04f1e97fbd6e091c6fd20725bdf072fb114d00eefb9e6eb8/ruff-0.15.13-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e2e39bff6c341f4b577a21b801326fab0b11847f48fcaa83f00a113c9b3cb55", size = 12183079, upload-time = "2026-05-14T13:44:01.634Z" },
243
- { url = "https://files.pythonhosted.org/packages/19/4c/7585735f6b53b0f12de13618b2f7d250a844f018822efc899df2e7b8295f/ruff-0.15.13-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e8d9a8e08013542e94d3220bc5b62cc3e5ef87c5f74bff367d3fac14fab013e6", size = 11440833, upload-time = "2026-05-14T13:43:59.043Z" },
244
- { url = "https://files.pythonhosted.org/packages/e8/31/bf1a0803d077e679cfeee5f2f67290a0fa79c7385b5d9a8c17b9db2c48f0/ruff-0.15.13-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc411dfebe5eebe55ce041c6ae080eb7668955e866daa2fbb16692a784f1c4ca", size = 11434486, upload-time = "2026-05-14T13:44:27.761Z" },
245
- { url = "https://files.pythonhosted.org/packages/e1/4e/62c9b999875d4f14db80f277c030578f5e249c9852d65b7ac7ad0b43c041/ruff-0.15.13-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:768494eb08b9cee54e2fd27969966f74db5a57f6eaa7a90fcb3306af34dfc4bd", size = 11385189, upload-time = "2026-05-14T13:44:13.704Z" },
246
- { url = "https://files.pythonhosted.org/packages/fc/89/7e959047a104df3eb12863447c110140191fc5b6c4f379ea2e803fcdb0e4/ruff-0.15.13-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:fb75f9a3a7e42ffe117d734494e6c5e5cb3565d66e12612cb63d0e572a41a5b6", size = 10781380, upload-time = "2026-05-14T13:43:56.734Z" },
247
- { url = "https://files.pythonhosted.org/packages/ff/52/5fd18f3b88cab63e88aa11516b3b4e1e5f720e5c330f8dbe5c26210f41f8/ruff-0.15.13-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8cb74dd33bb2f6613faf7fc03b660053b5ac4f80e706d5788c6335e2a8048d51", size = 10540605, upload-time = "2026-05-14T13:44:20.748Z" },
248
- { url = "https://files.pythonhosted.org/packages/e8/e0/9e35f338990d3e41a82875ff7053ffe97541dae81c9d02143177f381d572/ruff-0.15.13-py3-none-musllinux_1_2_i686.whl", hash = "sha256:7ef823f817fcd191dc934e984be9cf4094f808effa16f2542ad8e821ba02bbf2", size = 11036554, upload-time = "2026-05-14T13:44:16.256Z" },
249
- { url = "https://files.pythonhosted.org/packages/c2/13/070fb048c24080fba188f66371e2a92785be257ad02242066dc7255ac6e9/ruff-0.15.13-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:f345a13937bd7f09f6f5d19fa0721b0c103e00e7f62bc67089a8e5e037719e0b", size = 11528133, upload-time = "2026-05-14T13:44:22.808Z" },
250
- { url = "https://files.pythonhosted.org/packages/6b/8c/b1e1666aef7fc6555094d73ae6cd981701781ae85b97ceefc0eebd0b4668/ruff-0.15.13-py3-none-win32.whl", hash = "sha256:4044f94208b3b05ba0fc4a4abd0558cf4d6459bd18325eead7fd8cc66f909b41", size = 10721455, upload-time = "2026-05-14T13:44:35.697Z" },
251
- { url = "https://files.pythonhosted.org/packages/ab/a6/870a3e8a50590bb92be184ad928c2922f088b00d9dc5c5ec7b924ee08c22/ruff-0.15.13-py3-none-win_amd64.whl", hash = "sha256:7064884d442b7d477b4e7473d12da7f08851d2b1982763c5d3f388a19468a1a4", size = 11900409, upload-time = "2026-05-14T13:44:30.389Z" },
252
- { url = "https://files.pythonhosted.org/packages/9b/36/9c015cd052fca743dae8cb2aeb16b551444787467db42ceab0fc968865af/ruff-0.15.13-py3-none-win_arm64.whl", hash = "sha256:2471da9bd1068c8c064b5fd9c0c4b6dddffd6369cb1cd68b29993b1709ff1b21", size = 11179336, upload-time = "2026-05-14T13:44:33.026Z" },
236
+ { url = "https://files.pythonhosted.org/packages/0c/42/53ef1c3953f157956db9bf7861e3bc50b9b887ce93300aa48cdba8336fe6/ruff-0.15.16-py3-none-linux_armv6l.whl", hash = "sha256:6ac3c0b3969cc6cf6b158c4e2f8f682acb58e7d700d8a44b65ecdc72d66ab0b2", size = 10709025, upload-time = "2026-06-04T16:32:51.935Z" },
237
+ { url = "https://files.pythonhosted.org/packages/93/9a/a79159346f19134a956607754e57d8d128f7a4c00f4ad2f7514d224c172c/ruff-0.15.16-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:197c207ed75ffba54a0dec23db4aa939a27a3053073e085e0042433cbdc58e4a", size = 11063550, upload-time = "2026-06-04T16:32:42.24Z" },
238
+ { url = "https://files.pythonhosted.org/packages/bc/72/3ce2ac000a5299ec238e01f51397b3b653c93b077d9b1bfe8715bb895f20/ruff-0.15.16-py3-none-macosx_11_0_arm64.whl", hash = "sha256:3a39fec45ab316cc23e7558f23fea4a70403ddb5648ea9a4a3854a16973d0071", size = 10421345, upload-time = "2026-06-04T16:32:37.251Z" },
239
+ { url = "https://files.pythonhosted.org/packages/b0/c2/cc7fad3ec9169373f5b6a18f1917b91080feec40c3f9658334a1d28e2f03/ruff-0.15.16-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba93191d79003116b95128c9d306e045200fdbd0bccb782b110f3cd1d4abc5cf", size = 10757217, upload-time = "2026-06-04T16:32:54.722Z" },
240
+ { url = "https://files.pythonhosted.org/packages/69/d2/3474009eaa0a65b31fa7152a2fad5e2f050c640ceb1e6b02ee6922e94c82/ruff-0.15.16-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c6ee4b90520630120ef032aa5cc10db483852dff950e78b1d717e2993a61ac8d", size = 10507035, upload-time = "2026-06-04T16:33:05.343Z" },
241
+ { url = "https://files.pythonhosted.org/packages/ca/81/b7ae6ccbd11f0c8dc3d5d67fc4be9b57ff57ca86ba56152021378e1277f2/ruff-0.15.16-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e4215bc938bc3c8215c1472c1aa437e310fee20cd427335fec9d7e609563628", size = 11255291, upload-time = "2026-06-04T16:32:49.49Z" },
242
+ { url = "https://files.pythonhosted.org/packages/d9/e1/46e526f1a7cc90857ce6ddf25fbb77eb6568651ac38d71b033af07076dd5/ruff-0.15.16-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7c8d26be963b090f10e29abc8b3e74a2a321f6fa34e02424e30b5af89350ecbb", size = 12124922, upload-time = "2026-06-04T16:33:07.821Z" },
243
+ { url = "https://files.pythonhosted.org/packages/1a/da/5c791b088b596b24d0deb967fa28ae02ad751a140c0b9ea81c5ab915d6c0/ruff-0.15.16-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f198cf4123602a2280ed46c307bcbafe41758d6fee5b456b6b6058ca1514b3b4", size = 11332186, upload-time = "2026-06-04T16:33:02.971Z" },
244
+ { url = "https://files.pythonhosted.org/packages/72/11/5da87abe20047c8962361473923ebb2f62b595250126aadfad8c20649c1e/ruff-0.15.16-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb27515fa6240fb586ae82b901a59e67d24acff86f2190b433dc542fe0435aeb", size = 11373541, upload-time = "2026-06-04T16:32:47.007Z" },
245
+ { url = "https://files.pythonhosted.org/packages/fe/2a/8554754c23a854ae3fd6b507e36ad61ddb121e298c6d5d617dec94ed0f14/ruff-0.15.16-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:a267c46ba1593fc26b8eecbea050b39d40c0b6bb7781ee11c90a02cd10032951", size = 11353014, upload-time = "2026-06-04T16:32:34.795Z" },
246
+ { url = "https://files.pythonhosted.org/packages/62/25/62ea41529ec89f742ea3fed9cb1059c72877ec7cf9b9e99ac9cf3294d1d9/ruff-0.15.16-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:528c68f39a91498a8d50e91ff5985df3d105782bab49cc378e73ac26bff083e8", size = 10737467, upload-time = "2026-06-04T16:32:26.348Z" },
247
+ { url = "https://files.pythonhosted.org/packages/90/17/334d3ad9de4d40f9dd58fdd09e35ce64553bb501e2f19a839e2fb6be14fc/ruff-0.15.16-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:7ed55c58950df60589a9a7a5d2f8fa5f54ebd287163be805adfe6ee95a9de123", size = 10521910, upload-time = "2026-06-04T16:32:32.54Z" },
248
+ { url = "https://files.pythonhosted.org/packages/4d/bd/3ac7c6ae77a885c1004b3dda2446ea401768d24f851c14b4ad4b24f6639c/ruff-0.15.16-py3-none-musllinux_1_2_i686.whl", hash = "sha256:d482feaf51512b50f9790ceb417a56a61dd1e9d9bf967662b9ed27c01b34f53a", size = 10979190, upload-time = "2026-06-04T16:32:57.492Z" },
249
+ { url = "https://files.pythonhosted.org/packages/33/d7/609546e6a413c3f216fbf2a50c928f97c80939154f6a0503114094a86191/ruff-0.15.16-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:1e15bc8c94513dae2a40cc9ef07c94fdd4ecc9e29dabebeebe170f952322c9e3", size = 11477014, upload-time = "2026-06-04T16:32:44.687Z" },
250
+ { url = "https://files.pythonhosted.org/packages/74/0d/f2cd247ad32633a5c36e97141a2c21b11c6279f7957bc2ff360b1e08fddd/ruff-0.15.16-py3-none-win32.whl", hash = "sha256:580378f7bd4aa25f72e74aa54948a9622f142b1e509521dd10902e886681cc1e", size = 10735541, upload-time = "2026-06-04T16:32:30.145Z" },
251
+ { url = "https://files.pythonhosted.org/packages/8b/9e/02e845ef151b1dee585e55c4739f8e1734ae1d9f1221dff65761c162208b/ruff-0.15.16-py3-none-win_amd64.whl", hash = "sha256:408256017284eddf98fff77b29aa4fb30f586042d535b2d9befc6512f400aaec", size = 11843403, upload-time = "2026-06-04T16:32:39.76Z" },
252
+ { url = "https://files.pythonhosted.org/packages/15/19/016553f86f207450aebebc2b2b5088d086b901cc8186c02ac4284db3bd88/ruff-0.15.16-py3-none-win_arm64.whl", hash = "sha256:8cd61783afb39638a7133ef0d2dfb1e91277593962f81b5a8423eb0b888a6121", size = 11134555, upload-time = "2026-06-04T16:33:00.136Z" },
253
253
  ]
254
254
 
255
255
  [[package]]
256
256
  name = "src-py-lib"
257
- version = "0.1.7"
258
257
  source = { editable = "." }
259
258
  dependencies = [
260
259
  { name = "httpx" },
@@ -270,15 +269,15 @@ dev = [
270
269
 
271
270
  [package.metadata]
272
271
  requires-dist = [
273
- { name = "httpx", specifier = ">=0.28,<1" },
274
- { name = "pydantic", specifier = ">=2,<3" },
275
- { name = "python-dotenv", specifier = ">=1.2,<2" },
272
+ { name = "httpx", specifier = ">=0.28.1,<1" },
273
+ { name = "pydantic", specifier = ">=2.13.4,<3" },
274
+ { name = "python-dotenv", specifier = ">=1.2.2,<2" },
276
275
  ]
277
276
 
278
277
  [package.metadata.requires-dev]
279
278
  dev = [
280
- { name = "pyright", specifier = ">=1.1.409" },
281
- { name = "ruff", specifier = ">=0.7.0" },
279
+ { name = "pyright", specifier = ">=1.1.410" },
280
+ { name = "ruff", specifier = ">=0.15.16" },
282
281
  ]
283
282
 
284
283
  [[package]]
File without changes
File without changes
File without changes
File without changes
File without changes