tha-wright-stuff 0.1.37__tar.gz → 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.
Files changed (19) hide show
  1. {tha_wright_stuff-0.1.37 → tha_wright_stuff-0.2.0}/.github/workflows/bump-dep-floors.yml +25 -9
  2. {tha_wright_stuff-0.1.37 → tha_wright_stuff-0.2.0}/.github/workflows/dep-floors-check.yml +2 -2
  3. {tha_wright_stuff-0.1.37 → tha_wright_stuff-0.2.0}/.github/workflows/publish.yml +1 -1
  4. {tha_wright_stuff-0.1.37 → tha_wright_stuff-0.2.0}/CHANGELOG.md +10 -0
  5. {tha_wright_stuff-0.1.37 → tha_wright_stuff-0.2.0}/PKG-INFO +11 -11
  6. {tha_wright_stuff-0.1.37 → tha_wright_stuff-0.2.0}/README.md +2 -2
  7. {tha_wright_stuff-0.1.37 → tha_wright_stuff-0.2.0}/pyproject.toml +9 -9
  8. {tha_wright_stuff-0.1.37 → tha_wright_stuff-0.2.0}/.github/dependabot.yml +0 -0
  9. {tha_wright_stuff-0.1.37 → tha_wright_stuff-0.2.0}/.github/pull_request_template.md +0 -0
  10. {tha_wright_stuff-0.1.37 → tha_wright_stuff-0.2.0}/.github/workflows/auto-assign-pr.yml +0 -0
  11. {tha_wright_stuff-0.1.37 → tha_wright_stuff-0.2.0}/.github/workflows/check-yanked-floors.yml +0 -0
  12. {tha_wright_stuff-0.1.37 → tha_wright_stuff-0.2.0}/.github/workflows/ci.yml +0 -0
  13. {tha_wright_stuff-0.1.37 → tha_wright_stuff-0.2.0}/.github/workflows/dependabot-auto-merge.yml +0 -0
  14. {tha_wright_stuff-0.1.37 → tha_wright_stuff-0.2.0}/.gitignore +0 -0
  15. {tha_wright_stuff-0.1.37 → tha_wright_stuff-0.2.0}/.pre-commit-config.yaml +0 -0
  16. {tha_wright_stuff-0.1.37 → tha_wright_stuff-0.2.0}/LICENSE +0 -0
  17. {tha_wright_stuff-0.1.37 → tha_wright_stuff-0.2.0}/src/tha_wright_stuff/__init__.py +0 -0
  18. {tha_wright_stuff-0.1.37 → tha_wright_stuff-0.2.0}/src/tha_wright_stuff/py.typed +0 -0
  19. {tha_wright_stuff-0.1.37 → tha_wright_stuff-0.2.0}/tests/test_imports.py +0 -0
@@ -28,14 +28,15 @@ jobs:
28
28
  with open("pyproject.toml") as f:
29
29
  content = f.read()
30
30
 
31
- pattern = r'"(tha-[a-z-]+)(\[[a-z, ]+\])?>=([\d]+\.[\d]+\.[\d]+)"'
31
+ pattern = r'"(tha-[a-z-]+)(\[[a-z0-9, _-]+\])?==([\d]+\.[\d]+\.[\d]+)"'
32
32
  deps = [(pkg, extra or "", floor) for pkg, extra, floor in re.findall(pattern, content)]
33
33
 
34
34
  bumps = []
35
35
  for pkg, extra, floor in deps:
36
36
  try:
37
37
  with urlopen(f"https://pypi.org/pypi/{pkg}/json", timeout=10) as r:
38
- latest = json.load(r)["info"]["version"]
38
+ info = json.load(r)["info"]
39
+ latest = info["version"]
39
40
  except Exception:
40
41
  print(f" skipping {pkg} (PyPI lookup failed)")
41
42
  continue
@@ -44,10 +45,25 @@ jobs:
44
45
  latest_t = tuple(int(x) for x in latest.split("."))
45
46
 
46
47
  if latest_t > floor_t:
48
+ if extra:
49
+ # `extra` is a bracket carried forward as literal text (e.g. "[httpx]") --
50
+ # this script has no way to know an extra was renamed upstream, so verify
51
+ # it still exists on the target version rather than silently bumping to a
52
+ # version/extra combo that doesn't resolve.
53
+ extra_names = [e.strip() for e in extra.strip("[]").split(",") if e.strip()]
54
+ provided = set(info.get("provides_extra") or [])
55
+ missing = [e for e in extra_names if e not in provided]
56
+ if missing:
57
+ print(
58
+ f" WARNING: {pkg}{extra}: extra(s) {missing} not found on "
59
+ f"{pkg} {latest} (available: {sorted(provided)}) -- "
60
+ f"SKIPPING auto-bump, needs a manual PR"
61
+ )
62
+ continue
47
63
  bumps.append((pkg, extra, floor, latest))
48
- print(f" {pkg}{extra}: >={floor} -> >={latest}")
64
+ print(f" {pkg}{extra}: =={floor} -> =={latest}")
49
65
  else:
50
- print(f" {pkg}{extra}: >={floor} ok (latest={latest})")
66
+ print(f" {pkg}{extra}: =={floor} ok (latest={latest})")
51
67
 
52
68
  gho = os.environ["GITHUB_OUTPUT"]
53
69
  if not bumps:
@@ -58,7 +74,7 @@ jobs:
58
74
 
59
75
  new_content = content
60
76
  for pkg, extra, old, new in bumps:
61
- new_content = new_content.replace(f'"{pkg}{extra}>={old}"', f'"{pkg}{extra}>={new}"')
77
+ new_content = new_content.replace(f'"{pkg}{extra}=={old}"', f'"{pkg}{extra}=={new}"')
62
78
 
63
79
  ver_m = re.search(r'^version = "(\d+)\.(\d+)\.(\d+)"', new_content, re.MULTILINE)
64
80
  major, minor, patch = int(ver_m.group(1)), int(ver_m.group(2)), int(ver_m.group(3))
@@ -70,11 +86,11 @@ jobs:
70
86
  f.write(new_content)
71
87
 
72
88
  today = date.today().isoformat()
73
- bumped_summary = ", ".join(f"{pkg}{extra}>={new}" for pkg, extra, _, new in bumps)
89
+ bumped_summary = ", ".join(f"{pkg}{extra}=={new}" for pkg, extra, _, new in bumps)
74
90
  changelog_entry = (
75
91
  f"## [{new_ver}] - {today}\n"
76
92
  f"### Changed\n"
77
- f"- Bumped dep floors: {bumped_summary}.\n"
93
+ f"- Bumped dep pins: {bumped_summary}.\n"
78
94
  )
79
95
  with open("CHANGELOG.md") as f:
80
96
  cl = f.read()
@@ -82,9 +98,9 @@ jobs:
82
98
  with open("CHANGELOG.md", "w") as f:
83
99
  f.write(cl)
84
100
 
85
- pr_lines = [f"- `{pkg}{extra}`: `>={old}` -> `>={new}`" for pkg, extra, old, new in bumps]
101
+ pr_lines = [f"- `{pkg}{extra}`: `=={old}` -> `=={new}`" for pkg, extra, old, new in bumps]
86
102
  pr_body = (
87
- "## Dependency Floor Bumps\n\n"
103
+ "## Dependency Pin Bumps\n\n"
88
104
  + "\n".join(pr_lines)
89
105
  + f"\n\nVersion bumped `{old_ver}` -> `{new_ver}`."
90
106
  )
@@ -20,7 +20,7 @@ jobs:
20
20
  with open("pyproject.toml") as f:
21
21
  content = f.read()
22
22
 
23
- pattern = r'"(tha-[a-z-]+)(\[[a-z, ]+\])?>=([\d]+\.[\d]+\.[\d]+)"'
23
+ pattern = r'"(tha-[a-z-]+)(\[[a-z0-9, _-]+\])?==([\d]+\.[\d]+\.[\d]+)"'
24
24
  deps = [(pkg, extra or "", floor) for pkg, extra, floor in re.findall(pattern, content)]
25
25
 
26
26
  stale = []
@@ -32,7 +32,7 @@ jobs:
32
32
  print(f" skipping {pkg}{extra}")
33
33
  continue
34
34
  if tuple(int(x) for x in latest.split(".")) > tuple(int(x) for x in floor.split(".")):
35
- stale.append(f"{pkg}{extra} (>={floor}, latest {latest})")
35
+ stale.append(f"{pkg}{extra} (=={floor}, latest {latest})")
36
36
  print(f" stale: {stale[-1]}")
37
37
 
38
38
  if not stale:
@@ -12,7 +12,7 @@ jobs:
12
12
  - uses: actions/checkout@v7
13
13
 
14
14
  - name: Install uv
15
- uses: astral-sh/setup-uv@v10.0.1
15
+ uses: astral-sh/setup-uv@v10.1.0
16
16
 
17
17
  - name: Build
18
18
  run: uv build
@@ -7,6 +7,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.2.0] - 2026-09-25
11
+ ### Changed
12
+ - Pinned all tha-* dependencies to exact versions (`==`) instead of minimum floors (`>=`). Installing `tha-wright-stuff` now yields one known-good, CI-tested set of family versions; installing a different version of a member lib alongside it will now conflict at resolve time.
13
+ - `bump-dep-floors.yml` and `dep-floors-check.yml` now match and rewrite `==` pins.
14
+ - Fixed both workflows' extras regex, which could not match extras containing digits (e.g. `[httpx2]`), so `tha-req-runner` was silently skipped by the bump and status checks.
15
+
16
+ ## [0.1.38] - 2026-09-22
17
+ ### Changed
18
+ - Bumped dep floors: tha-req-runner[httpx2]>=0.3.0 (renamed from the `httpx` extra — tha-req-runner 0.3.0 replaced the `httpx` backend with `httpx2`), tha-edfi-runner>=0.1.15, tha-google-runner>=0.3.0.
19
+
10
20
  ## [0.1.37] - 2026-09-08
11
21
  ### Changed
12
22
  - Bumped dep floors: tha-edfi-runner>=0.1.14.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: tha-wright-stuff
3
- Version: 0.1.37
3
+ Version: 0.2.0
4
4
  Summary: A Tabular Helper meta-package that bundles the full tha-* library family in a single install.
5
5
  Project-URL: Homepage, https://github.com/tha-guy-nate/tha-wright-stuff
6
6
  Project-URL: Issues, https://github.com/tha-guy-nate/tha-wright-stuff/issues
@@ -21,14 +21,14 @@ Classifier: Programming Language :: Python :: 3.14
21
21
  Classifier: Topic :: Utilities
22
22
  Classifier: Typing :: Typed
23
23
  Requires-Python: >=3.10
24
- Requires-Dist: tha-aws-runner>=0.2.10
25
- Requires-Dist: tha-csv-runner>=0.4.2
26
- Requires-Dist: tha-edfi-runner>=0.1.14
27
- Requires-Dist: tha-google-runner>=0.2.3
28
- Requires-Dist: tha-map-runner>=0.3.1
29
- Requires-Dist: tha-req-runner[httpx]>=0.2.8
30
- Requires-Dist: tha-snowflake-runner>=0.3.4
31
- Requires-Dist: tha-utils-helper>=0.2.6
24
+ Requires-Dist: tha-aws-runner==0.2.10
25
+ Requires-Dist: tha-csv-runner==0.4.2
26
+ Requires-Dist: tha-edfi-runner==0.1.15
27
+ Requires-Dist: tha-google-runner==0.3.0
28
+ Requires-Dist: tha-map-runner==0.3.1
29
+ Requires-Dist: tha-req-runner[httpx2]==0.3.0
30
+ Requires-Dist: tha-snowflake-runner==0.3.4
31
+ Requires-Dist: tha-utils-helper==0.2.6
32
32
  Provides-Extra: dev
33
33
  Requires-Dist: mypy>=2.1.0; extra == 'dev'
34
34
  Requires-Dist: pip-audit>=2.10.1; extra == 'dev'
@@ -95,7 +95,7 @@ Every public class, function, and error type from all eight libraries is availab
95
95
  |---|---|---|---|---|
96
96
  | **tha-csv-runner** | [![PyPI](https://img.shields.io/pypi/v/tha-csv-runner)](https://pypi.org/project/tha-csv-runner/) | [![wheel size](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fpypi.org%2Fpypi%2Ftha-csv-runner%2Fjson&label=&query=%24.urls%5B0%5D.size&suffix=%20B)](https://pypi.org/project/tha-csv-runner/#files) | [tha-csv-runner](https://github.com/tha-guy-nate/tha-csv-runner) | Read and write CSVs with progress bars, header validation, chunking, sort/filter, and an optional per-row validator callback. |
97
97
  | **tha-map-runner** | [![PyPI](https://img.shields.io/pypi/v/tha-map-runner)](https://pypi.org/project/tha-map-runner/) | [![wheel size](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fpypi.org%2Fpypi%2Ftha-map-runner%2Fjson&label=&query=%24.urls%5B0%5D.size&suffix=%20B)](https://pypi.org/project/tha-map-runner/#files) | [tha-map-runner](https://github.com/tha-guy-nate/tha-map-runner) | Enrich and join dicts using dotted-path projection and O(n+m) index-based lookups. Supports left / inner / anti joins and DynamoDB result shapes. |
98
- | **tha-req-runner** | [![PyPI](https://img.shields.io/pypi/v/tha-req-runner)](https://pypi.org/project/tha-req-runner/) | [![wheel size](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fpypi.org%2Fpypi%2Ftha-req-runner%2Fjson&label=&query=%24.urls%5B0%5D.size&suffix=%20B)](https://pypi.org/project/tha-req-runner/#files) | [tha-req-runner](https://github.com/tha-guy-nate/tha-req-runner) | Transport layer for API runners — session management, retries, `safe_call`, and a normalized `parse_response` dict. Supports both `requests` and `httpx` backends. |
98
+ | **tha-req-runner** | [![PyPI](https://img.shields.io/pypi/v/tha-req-runner)](https://pypi.org/project/tha-req-runner/) | [![wheel size](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fpypi.org%2Fpypi%2Ftha-req-runner%2Fjson&label=&query=%24.urls%5B0%5D.size&suffix=%20B)](https://pypi.org/project/tha-req-runner/#files) | [tha-req-runner](https://github.com/tha-guy-nate/tha-req-runner) | Transport layer for API runners — session management, retries, `safe_call`, and a normalized `parse_response` dict. Supports both `requests` and `httpx2` backends. |
99
99
  | **tha-aws-runner** | [![PyPI](https://img.shields.io/pypi/v/tha-aws-runner)](https://pypi.org/project/tha-aws-runner/) | [![wheel size](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fpypi.org%2Fpypi%2Ftha-aws-runner%2Fjson&label=&query=%24.urls%5B0%5D.size&suffix=%20B)](https://pypi.org/project/tha-aws-runner/#files) | [tha-aws-runner](https://github.com/tha-guy-nate/tha-aws-runner) | DynamoDB (`ThaDdb`), GSI queries (`ThaGsi`), S3 (`ThaS3`), SSM Parameter Store (`ThaSSM`), a `DdbCostTracker` context manager that tallies RCU/WCU and USD cost per run, and standalone helpers (`cli_auth_check`, `current_identity`, `parse_arn`, `parse_assumed_role_arn`). |
100
100
  | **tha-utils-helper** | [![PyPI](https://img.shields.io/pypi/v/tha-utils-helper)](https://pypi.org/project/tha-utils-helper/) | [![wheel size](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fpypi.org%2Fpypi%2Ftha-utils-helper%2Fjson&label=&query=%24.urls%5B0%5D.size&suffix=%20B)](https://pypi.org/project/tha-utils-helper/#files) | [tha-utils-helper](https://github.com/tha-guy-nate/tha-utils-helper) | Zero-dependency utilities: `ThaStr` (slugify, format), `ThaNum` (currency, parens-as-negative, cast), `ThaDT` (auto-detect date formats), `ThaDict` (pick, omit, rename), `ThaList` (chunk, flatten), `ThaType` (bool/int/float coercion). All include matching `*_rows` batch methods. |
101
101
  | **tha-edfi-runner** | [![PyPI](https://img.shields.io/pypi/v/tha-edfi-runner)](https://pypi.org/project/tha-edfi-runner/) | [![wheel size](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fpypi.org%2Fpypi%2Ftha-edfi-runner%2Fjson&label=&query=%24.urls%5B0%5D.size&suffix=%20B)](https://pypi.org/project/tha-edfi-runner/#files) | [tha-edfi-runner](https://github.com/tha-guy-nate/tha-edfi-runner) | Ed-Fi ODS API client — OAuth client-credentials auth, pagination, and chunked parallel posting via `ThreadPoolExecutor`. |
@@ -108,7 +108,7 @@ Every public class, function, and error type from all eight libraries is availab
108
108
 
109
109
  - Python 3.10+
110
110
 
111
- All eight libraries are installed automatically as dependencies, including the `httpx` transport backend for `tha-req-runner`.
111
+ All eight libraries are installed automatically as dependencies, including the `httpx2` transport backend for `tha-req-runner`.
112
112
 
113
113
  ---
114
114
 
@@ -56,7 +56,7 @@ Every public class, function, and error type from all eight libraries is availab
56
56
  |---|---|---|---|---|
57
57
  | **tha-csv-runner** | [![PyPI](https://img.shields.io/pypi/v/tha-csv-runner)](https://pypi.org/project/tha-csv-runner/) | [![wheel size](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fpypi.org%2Fpypi%2Ftha-csv-runner%2Fjson&label=&query=%24.urls%5B0%5D.size&suffix=%20B)](https://pypi.org/project/tha-csv-runner/#files) | [tha-csv-runner](https://github.com/tha-guy-nate/tha-csv-runner) | Read and write CSVs with progress bars, header validation, chunking, sort/filter, and an optional per-row validator callback. |
58
58
  | **tha-map-runner** | [![PyPI](https://img.shields.io/pypi/v/tha-map-runner)](https://pypi.org/project/tha-map-runner/) | [![wheel size](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fpypi.org%2Fpypi%2Ftha-map-runner%2Fjson&label=&query=%24.urls%5B0%5D.size&suffix=%20B)](https://pypi.org/project/tha-map-runner/#files) | [tha-map-runner](https://github.com/tha-guy-nate/tha-map-runner) | Enrich and join dicts using dotted-path projection and O(n+m) index-based lookups. Supports left / inner / anti joins and DynamoDB result shapes. |
59
- | **tha-req-runner** | [![PyPI](https://img.shields.io/pypi/v/tha-req-runner)](https://pypi.org/project/tha-req-runner/) | [![wheel size](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fpypi.org%2Fpypi%2Ftha-req-runner%2Fjson&label=&query=%24.urls%5B0%5D.size&suffix=%20B)](https://pypi.org/project/tha-req-runner/#files) | [tha-req-runner](https://github.com/tha-guy-nate/tha-req-runner) | Transport layer for API runners — session management, retries, `safe_call`, and a normalized `parse_response` dict. Supports both `requests` and `httpx` backends. |
59
+ | **tha-req-runner** | [![PyPI](https://img.shields.io/pypi/v/tha-req-runner)](https://pypi.org/project/tha-req-runner/) | [![wheel size](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fpypi.org%2Fpypi%2Ftha-req-runner%2Fjson&label=&query=%24.urls%5B0%5D.size&suffix=%20B)](https://pypi.org/project/tha-req-runner/#files) | [tha-req-runner](https://github.com/tha-guy-nate/tha-req-runner) | Transport layer for API runners — session management, retries, `safe_call`, and a normalized `parse_response` dict. Supports both `requests` and `httpx2` backends. |
60
60
  | **tha-aws-runner** | [![PyPI](https://img.shields.io/pypi/v/tha-aws-runner)](https://pypi.org/project/tha-aws-runner/) | [![wheel size](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fpypi.org%2Fpypi%2Ftha-aws-runner%2Fjson&label=&query=%24.urls%5B0%5D.size&suffix=%20B)](https://pypi.org/project/tha-aws-runner/#files) | [tha-aws-runner](https://github.com/tha-guy-nate/tha-aws-runner) | DynamoDB (`ThaDdb`), GSI queries (`ThaGsi`), S3 (`ThaS3`), SSM Parameter Store (`ThaSSM`), a `DdbCostTracker` context manager that tallies RCU/WCU and USD cost per run, and standalone helpers (`cli_auth_check`, `current_identity`, `parse_arn`, `parse_assumed_role_arn`). |
61
61
  | **tha-utils-helper** | [![PyPI](https://img.shields.io/pypi/v/tha-utils-helper)](https://pypi.org/project/tha-utils-helper/) | [![wheel size](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fpypi.org%2Fpypi%2Ftha-utils-helper%2Fjson&label=&query=%24.urls%5B0%5D.size&suffix=%20B)](https://pypi.org/project/tha-utils-helper/#files) | [tha-utils-helper](https://github.com/tha-guy-nate/tha-utils-helper) | Zero-dependency utilities: `ThaStr` (slugify, format), `ThaNum` (currency, parens-as-negative, cast), `ThaDT` (auto-detect date formats), `ThaDict` (pick, omit, rename), `ThaList` (chunk, flatten), `ThaType` (bool/int/float coercion). All include matching `*_rows` batch methods. |
62
62
  | **tha-edfi-runner** | [![PyPI](https://img.shields.io/pypi/v/tha-edfi-runner)](https://pypi.org/project/tha-edfi-runner/) | [![wheel size](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fpypi.org%2Fpypi%2Ftha-edfi-runner%2Fjson&label=&query=%24.urls%5B0%5D.size&suffix=%20B)](https://pypi.org/project/tha-edfi-runner/#files) | [tha-edfi-runner](https://github.com/tha-guy-nate/tha-edfi-runner) | Ed-Fi ODS API client — OAuth client-credentials auth, pagination, and chunked parallel posting via `ThreadPoolExecutor`. |
@@ -69,7 +69,7 @@ Every public class, function, and error type from all eight libraries is availab
69
69
 
70
70
  - Python 3.10+
71
71
 
72
- All eight libraries are installed automatically as dependencies, including the `httpx` transport backend for `tha-req-runner`.
72
+ All eight libraries are installed automatically as dependencies, including the `httpx2` transport backend for `tha-req-runner`.
73
73
 
74
74
  ---
75
75
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "tha-wright-stuff"
7
- version = "0.1.37"
7
+ version = "0.2.0"
8
8
  description = "A Tabular Helper meta-package that bundles the full tha-* library family in a single install."
9
9
  readme = "README.md"
10
10
  license = { text = "MIT" }
@@ -25,14 +25,14 @@ classifiers = [
25
25
  ]
26
26
  keywords = ["tabular", "helper", "api", "csv", "aws", "edfi", "google", "snowflake", "utilities", "meta"]
27
27
  dependencies = [
28
- "tha-csv-runner>=0.4.2",
29
- "tha-map-runner>=0.3.1",
30
- "tha-req-runner[httpx]>=0.2.8",
31
- "tha-aws-runner>=0.2.10",
32
- "tha-utils-helper>=0.2.6",
33
- "tha-edfi-runner>=0.1.14",
34
- "tha-google-runner>=0.2.3",
35
- "tha-snowflake-runner>=0.3.4",
28
+ "tha-csv-runner==0.4.2",
29
+ "tha-map-runner==0.3.1",
30
+ "tha-req-runner[httpx2]==0.3.0",
31
+ "tha-aws-runner==0.2.10",
32
+ "tha-utils-helper==0.2.6",
33
+ "tha-edfi-runner==0.1.15",
34
+ "tha-google-runner==0.3.0",
35
+ "tha-snowflake-runner==0.3.4",
36
36
  ]
37
37
 
38
38
  [project.optional-dependencies]