tha-wright-stuff 0.1.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.
@@ -0,0 +1,17 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: github-actions
4
+ directory: /
5
+ schedule:
6
+ interval: weekly
7
+ day: monday
8
+ groups:
9
+ github-actions:
10
+ patterns:
11
+ - "*"
12
+
13
+ - package-ecosystem: pip
14
+ directory: /
15
+ schedule:
16
+ interval: weekly
17
+ day: monday
@@ -0,0 +1,36 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: ["main"]
6
+ pull_request:
7
+
8
+ jobs:
9
+ test:
10
+ runs-on: ubuntu-latest
11
+ strategy:
12
+ matrix:
13
+ python-version: ["3.10", "3.11", "3.12", "3.13"]
14
+
15
+ steps:
16
+ - uses: actions/checkout@v6
17
+
18
+ - name: Install uv
19
+ uses: astral-sh/setup-uv@v7
20
+ with:
21
+ version: "latest"
22
+
23
+ - name: Set up Python ${{ matrix.python-version }}
24
+ run: uv python install ${{ matrix.python-version }}
25
+
26
+ - name: Install dependencies
27
+ run: uv sync --extra dev --python ${{ matrix.python-version }}
28
+
29
+ - name: Lint
30
+ run: uv run ruff check src/
31
+
32
+ - name: Test
33
+ run: uv run pytest
34
+
35
+ - name: Type check
36
+ run: uv run mypy src/
@@ -0,0 +1,62 @@
1
+ name: Publish
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+
8
+ jobs:
9
+ build:
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - uses: actions/checkout@v6
13
+
14
+ - name: Install uv
15
+ uses: astral-sh/setup-uv@v7
16
+
17
+ - name: Build
18
+ run: uv build
19
+
20
+ - name: Upload dist
21
+ uses: actions/upload-artifact@v7
22
+ with:
23
+ name: dist
24
+ path: dist/
25
+
26
+ publish-testpypi:
27
+ needs: build
28
+ runs-on: ubuntu-latest
29
+ environment: testpypi
30
+ permissions:
31
+ id-token: write
32
+ steps:
33
+ - name: Download dist
34
+ uses: actions/download-artifact@v8
35
+ with:
36
+ name: dist
37
+ path: dist/
38
+
39
+ - name: Install uv
40
+ uses: astral-sh/setup-uv@v7
41
+
42
+ - name: Publish to TestPyPI
43
+ run: uv publish --publish-url https://test.pypi.org/legacy/ --trusted-publishing always
44
+
45
+ publish-pypi:
46
+ needs: publish-testpypi
47
+ runs-on: ubuntu-latest
48
+ environment: pypi
49
+ permissions:
50
+ id-token: write
51
+ steps:
52
+ - name: Download dist
53
+ uses: actions/download-artifact@v8
54
+ with:
55
+ name: dist
56
+ path: dist/
57
+
58
+ - name: Install uv
59
+ uses: astral-sh/setup-uv@v7
60
+
61
+ - name: Publish to PyPI
62
+ run: uv publish --trusted-publishing always
@@ -0,0 +1,6 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ dist/
4
+ .venv/
5
+ *.egg-info/
6
+ uv.lock
@@ -0,0 +1,89 @@
1
+ Metadata-Version: 2.4
2
+ Name: tha-wright-stuff
3
+ Version: 0.1.0
4
+ Summary: A Tabular Helper meta-package that bundles the full tha-* library family in a single install.
5
+ Project-URL: Homepage, https://github.com/tha-guy-nate/tha-wright-stuff
6
+ Project-URL: Issues, https://github.com/tha-guy-nate/tha-wright-stuff/issues
7
+ Author: Nate Wright
8
+ License: MIT
9
+ Keywords: api,aws,csv,edfi,google,helper,meta,snowflake,tabular,utilities
10
+ Classifier: Intended Audience :: Developers
11
+ Classifier: License :: OSI Approved :: MIT License
12
+ Classifier: Operating System :: OS Independent
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.10
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Topic :: Utilities
18
+ Classifier: Typing :: Typed
19
+ Requires-Python: >=3.10
20
+ Requires-Dist: tha-aws-runner>=0.1.15
21
+ Requires-Dist: tha-csv-runner>=0.2.6
22
+ Requires-Dist: tha-edfi-runner>=0.1.2
23
+ Requires-Dist: tha-google-runner>=0.1.0
24
+ Requires-Dist: tha-map-runner>=0.2.7
25
+ Requires-Dist: tha-req-runner>=0.2.2
26
+ Requires-Dist: tha-snowflake-runner>=0.1.1
27
+ Requires-Dist: tha-utils-helper>=0.2.3
28
+ Provides-Extra: dev
29
+ Requires-Dist: mypy>=2.1.0; extra == 'dev'
30
+ Requires-Dist: pytest>=9.1.0; extra == 'dev'
31
+ Requires-Dist: ruff>=0.15.17; extra == 'dev'
32
+ Description-Content-Type: text/markdown
33
+
34
+ # tha-wright-stuff
35
+
36
+ > Install the entire Tabular Helper (`tha-*`) library family in one shot.
37
+
38
+ ```bash
39
+ pip install tha-wright-stuff
40
+ ```
41
+
42
+ ---
43
+
44
+ ## What is this?
45
+
46
+ `tha-wright-stuff` serves two purposes at once:
47
+
48
+ ### 1. Meta-package
49
+
50
+ One install pulls in every `tha-*` library and re-exports all of their public symbols from a single namespace. Instead of installing and importing from eight separate packages, you can just do:
51
+
52
+ ```python
53
+ from tha_wright_stuff import ThaCSV, ThaMap, ThaReq, ThaDict, ThaDdb, ThaEdfiBase, ThaSheets, ThaSnowflake
54
+ ```
55
+
56
+ Every public class, function, and error type from all eight libraries is available at the top level.
57
+
58
+ ### 2. Cross-family integration canary
59
+
60
+ `uv.lock` is intentionally **not committed** to this repo. That means every CI run resolves all eight libraries fresh from PyPI — no pinned snapshot. If any two libraries in the family ship incompatible dependency requirements, this repo's CI will fail, surfacing the conflict before users hit it.
61
+
62
+ ---
63
+
64
+ ## Included libraries
65
+
66
+ | Package | PyPI | GitHub | What it does |
67
+ |---|---|---|---|
68
+ | **tha-csv-runner** | [![PyPI](https://img.shields.io/pypi/v/tha-csv-runner)](https://pypi.org/project/tha-csv-runner/) | [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. |
69
+ | **tha-map-runner** | [![PyPI](https://img.shields.io/pypi/v/tha-map-runner)](https://pypi.org/project/tha-map-runner/) | [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. |
70
+ | **tha-req-runner** | [![PyPI](https://img.shields.io/pypi/v/tha-req-runner)](https://pypi.org/project/tha-req-runner/) | [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. |
71
+ | **tha-aws-runner** | [![PyPI](https://img.shields.io/pypi/v/tha-aws-runner)](https://pypi.org/project/tha-aws-runner/) | [tha-aws-runner](https://github.com/tha-guy-nate/tha-aws-runner) | DynamoDB (`ThaDdb`), GSI queries (`ThaGsi`), S3 (`ThaS3`), SSM Parameter Store (`ThaSSM`), and a `DdbCostTracker` context manager that tallies RCU/WCU and USD cost per run. |
72
+ | **tha-utils-helper** | [![PyPI](https://img.shields.io/pypi/v/tha-utils-helper)](https://pypi.org/project/tha-utils-helper/) | [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. |
73
+ | **tha-edfi-runner** | [![PyPI](https://img.shields.io/pypi/v/tha-edfi-runner)](https://pypi.org/project/tha-edfi-runner/) | [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`. |
74
+ | **tha-google-runner** | [![PyPI](https://img.shields.io/pypi/v/tha-google-runner)](https://pypi.org/project/tha-google-runner/) | [tha-google-runner](https://github.com/tha-guy-nate/tha-google-runner) | Google Sheets reader/writer (`ThaSheets`) using a service account — reads sheets to row dicts, writes row dicts back with optional header control. |
75
+ | **tha-snowflake-runner** | [![PyPI](https://img.shields.io/pypi/v/tha-snowflake-runner)](https://pypi.org/project/tha-snowflake-runner/) | [tha-snowflake-runner](https://github.com/tha-guy-nate/tha-snowflake-runner) | Snowflake query runner (`ThaSnowflake`) — named connection profiles, query execution to row dicts, and chunked parallel inserts. |
76
+
77
+ ---
78
+
79
+ ## Requirements
80
+
81
+ - Python 3.10+
82
+
83
+ All eight libraries are installed automatically as dependencies. Optional extras from individual libraries (e.g. `tha-csv-runner[excel]`, `tha-req-runner[httpx]`) are not pulled in by default — install them separately if needed.
84
+
85
+ ---
86
+
87
+ ## License
88
+
89
+ MIT
@@ -0,0 +1,56 @@
1
+ # tha-wright-stuff
2
+
3
+ > Install the entire Tabular Helper (`tha-*`) library family in one shot.
4
+
5
+ ```bash
6
+ pip install tha-wright-stuff
7
+ ```
8
+
9
+ ---
10
+
11
+ ## What is this?
12
+
13
+ `tha-wright-stuff` serves two purposes at once:
14
+
15
+ ### 1. Meta-package
16
+
17
+ One install pulls in every `tha-*` library and re-exports all of their public symbols from a single namespace. Instead of installing and importing from eight separate packages, you can just do:
18
+
19
+ ```python
20
+ from tha_wright_stuff import ThaCSV, ThaMap, ThaReq, ThaDict, ThaDdb, ThaEdfiBase, ThaSheets, ThaSnowflake
21
+ ```
22
+
23
+ Every public class, function, and error type from all eight libraries is available at the top level.
24
+
25
+ ### 2. Cross-family integration canary
26
+
27
+ `uv.lock` is intentionally **not committed** to this repo. That means every CI run resolves all eight libraries fresh from PyPI — no pinned snapshot. If any two libraries in the family ship incompatible dependency requirements, this repo's CI will fail, surfacing the conflict before users hit it.
28
+
29
+ ---
30
+
31
+ ## Included libraries
32
+
33
+ | Package | PyPI | GitHub | What it does |
34
+ |---|---|---|---|
35
+ | **tha-csv-runner** | [![PyPI](https://img.shields.io/pypi/v/tha-csv-runner)](https://pypi.org/project/tha-csv-runner/) | [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. |
36
+ | **tha-map-runner** | [![PyPI](https://img.shields.io/pypi/v/tha-map-runner)](https://pypi.org/project/tha-map-runner/) | [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. |
37
+ | **tha-req-runner** | [![PyPI](https://img.shields.io/pypi/v/tha-req-runner)](https://pypi.org/project/tha-req-runner/) | [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. |
38
+ | **tha-aws-runner** | [![PyPI](https://img.shields.io/pypi/v/tha-aws-runner)](https://pypi.org/project/tha-aws-runner/) | [tha-aws-runner](https://github.com/tha-guy-nate/tha-aws-runner) | DynamoDB (`ThaDdb`), GSI queries (`ThaGsi`), S3 (`ThaS3`), SSM Parameter Store (`ThaSSM`), and a `DdbCostTracker` context manager that tallies RCU/WCU and USD cost per run. |
39
+ | **tha-utils-helper** | [![PyPI](https://img.shields.io/pypi/v/tha-utils-helper)](https://pypi.org/project/tha-utils-helper/) | [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. |
40
+ | **tha-edfi-runner** | [![PyPI](https://img.shields.io/pypi/v/tha-edfi-runner)](https://pypi.org/project/tha-edfi-runner/) | [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`. |
41
+ | **tha-google-runner** | [![PyPI](https://img.shields.io/pypi/v/tha-google-runner)](https://pypi.org/project/tha-google-runner/) | [tha-google-runner](https://github.com/tha-guy-nate/tha-google-runner) | Google Sheets reader/writer (`ThaSheets`) using a service account — reads sheets to row dicts, writes row dicts back with optional header control. |
42
+ | **tha-snowflake-runner** | [![PyPI](https://img.shields.io/pypi/v/tha-snowflake-runner)](https://pypi.org/project/tha-snowflake-runner/) | [tha-snowflake-runner](https://github.com/tha-guy-nate/tha-snowflake-runner) | Snowflake query runner (`ThaSnowflake`) — named connection profiles, query execution to row dicts, and chunked parallel inserts. |
43
+
44
+ ---
45
+
46
+ ## Requirements
47
+
48
+ - Python 3.10+
49
+
50
+ All eight libraries are installed automatically as dependencies. Optional extras from individual libraries (e.g. `tha-csv-runner[excel]`, `tha-req-runner[httpx]`) are not pulled in by default — install them separately if needed.
51
+
52
+ ---
53
+
54
+ ## License
55
+
56
+ MIT
@@ -0,0 +1,61 @@
1
+ [build-system]
2
+ requires = ["hatchling"]
3
+ build-backend = "hatchling.build"
4
+
5
+ [project]
6
+ name = "tha-wright-stuff"
7
+ version = "0.1.0"
8
+ description = "A Tabular Helper meta-package that bundles the full tha-* library family in a single install."
9
+ readme = "README.md"
10
+ license = { text = "MIT" }
11
+ authors = [{ name = "Nate Wright" }]
12
+ requires-python = ">=3.10"
13
+ classifiers = [
14
+ "Programming Language :: Python :: 3",
15
+ "Programming Language :: Python :: 3.10",
16
+ "Programming Language :: Python :: 3.11",
17
+ "Programming Language :: Python :: 3.12",
18
+ "License :: OSI Approved :: MIT License",
19
+ "Operating System :: OS Independent",
20
+ "Intended Audience :: Developers",
21
+ "Topic :: Utilities",
22
+ "Typing :: Typed",
23
+ ]
24
+ keywords = ["tabular", "helper", "api", "csv", "aws", "edfi", "google", "snowflake", "utilities", "meta"]
25
+ dependencies = [
26
+ "tha-csv-runner>=0.2.6",
27
+ "tha-map-runner>=0.2.7",
28
+ "tha-req-runner>=0.2.2",
29
+ "tha-aws-runner>=0.1.15",
30
+ "tha-utils-helper>=0.2.3",
31
+ "tha-edfi-runner>=0.1.2",
32
+ "tha-google-runner>=0.1.0",
33
+ "tha-snowflake-runner>=0.1.1",
34
+ ]
35
+
36
+ [project.optional-dependencies]
37
+ dev = [
38
+ "pytest>=9.1.0",
39
+ "ruff>=0.15.17",
40
+ "mypy>=2.1.0",
41
+ ]
42
+
43
+ [project.urls]
44
+ Homepage = "https://github.com/tha-guy-nate/tha-wright-stuff"
45
+ Issues = "https://github.com/tha-guy-nate/tha-wright-stuff/issues"
46
+
47
+ [tool.hatch.build.targets.wheel]
48
+ packages = ["src/tha_wright_stuff"]
49
+
50
+ [tool.ruff]
51
+ line-length = 100
52
+ target-version = "py310"
53
+
54
+ [tool.ruff.lint]
55
+ select = ["E", "F", "I", "B", "UP", "RUF"]
56
+
57
+ [tool.mypy]
58
+ ignore_missing_imports = true
59
+
60
+ [tool.pytest.ini_options]
61
+ testpaths = ["tests"]
@@ -0,0 +1,95 @@
1
+ """tha-wright-stuff: the full tha-* Tabular Helper library family in one install."""
2
+
3
+ from tha_aws_runner import (
4
+ AWSBase,
5
+ AWSClients,
6
+ AwsError,
7
+ BatchCountResult,
8
+ BatchQueryResult,
9
+ BatchUpdateResult,
10
+ DdbCostTracker,
11
+ ThaDdb,
12
+ ThaGsi,
13
+ ThaS3,
14
+ ThaSSM,
15
+ cli_auth_check,
16
+ current_identity,
17
+ parse_arn,
18
+ parse_assumed_role_arn,
19
+ )
20
+ from tha_csv_runner import ConfigError, ThaCSV
21
+ from tha_edfi_runner import EdfiError, ThaEdfiBase, ThaStudentAssessment
22
+ from tha_google_runner import GoogleError, ThaSheets
23
+ from tha_map_runner import MapperError, ThaMap
24
+ from tha_req_runner import ReqError, ThaReq
25
+ from tha_snowflake_runner import Session, SnowflakeError, ThaSnowflake, list_profiles
26
+ from tha_utils_helper import (
27
+ DateError,
28
+ DictUtils,
29
+ ListUtils,
30
+ NumError,
31
+ StrError,
32
+ ThaDict,
33
+ ThaDT,
34
+ ThaList,
35
+ ThaNum,
36
+ ThaStr,
37
+ ThaType,
38
+ TypeUtils,
39
+ UtilsError,
40
+ )
41
+
42
+ __version__ = "0.1.0"
43
+ __all__ = [
44
+ # tha-aws-runner
45
+ "AWSBase",
46
+ "AWSClients",
47
+ "AwsError",
48
+ "BatchCountResult",
49
+ "BatchQueryResult",
50
+ "BatchUpdateResult",
51
+ # tha-csv-runner
52
+ "ConfigError",
53
+ "DateError",
54
+ "DdbCostTracker",
55
+ "DictUtils",
56
+ # tha-edfi-runner
57
+ "EdfiError",
58
+ # tha-google-runner
59
+ "GoogleError",
60
+ "ListUtils",
61
+ # tha-map-runner
62
+ "MapperError",
63
+ "NumError",
64
+ # tha-req-runner
65
+ "ReqError",
66
+ # tha-snowflake-runner
67
+ "Session",
68
+ "SnowflakeError",
69
+ "StrError",
70
+ "ThaCSV",
71
+ "ThaDT",
72
+ "ThaDdb",
73
+ # tha-utils-helper
74
+ "ThaDict",
75
+ "ThaEdfiBase",
76
+ "ThaGsi",
77
+ "ThaList",
78
+ "ThaMap",
79
+ "ThaNum",
80
+ "ThaReq",
81
+ "ThaS3",
82
+ "ThaSSM",
83
+ "ThaSheets",
84
+ "ThaSnowflake",
85
+ "ThaStr",
86
+ "ThaStudentAssessment",
87
+ "ThaType",
88
+ "TypeUtils",
89
+ "UtilsError",
90
+ "cli_auth_check",
91
+ "current_identity",
92
+ "list_profiles",
93
+ "parse_arn",
94
+ "parse_assumed_role_arn",
95
+ ]
File without changes
@@ -0,0 +1,60 @@
1
+ def test_top_level_imports() -> None:
2
+ from tha_wright_stuff import (
3
+ AWSBase,
4
+ ConfigError,
5
+ DdbCostTracker,
6
+ EdfiError,
7
+ GoogleError,
8
+ MapperError,
9
+ ReqError,
10
+ Session,
11
+ SnowflakeError,
12
+ ThaCSV,
13
+ ThaDT,
14
+ ThaDdb,
15
+ ThaDict,
16
+ ThaEdfiBase,
17
+ ThaGsi,
18
+ ThaList,
19
+ ThaMap,
20
+ ThaNum,
21
+ ThaReq,
22
+ ThaS3,
23
+ ThaSSM,
24
+ ThaSheets,
25
+ ThaSnowflake,
26
+ ThaStr,
27
+ ThaStudentAssessment,
28
+ ThaType,
29
+ UtilsError,
30
+ list_profiles,
31
+ )
32
+
33
+ assert ThaCSV is not None
34
+ assert ThaMap is not None
35
+ assert ThaReq is not None
36
+ assert ThaDdb is not None
37
+ assert ThaGsi is not None
38
+ assert ThaS3 is not None
39
+ assert ThaSSM is not None
40
+ assert ThaDict is not None
41
+ assert ThaList is not None
42
+ assert ThaType is not None
43
+ assert ThaStr is not None
44
+ assert ThaNum is not None
45
+ assert ThaDT is not None
46
+ assert ThaStudentAssessment is not None
47
+ assert ThaEdfiBase is not None
48
+ assert ThaSheets is not None
49
+ assert ThaSnowflake is not None
50
+ assert Session is not None
51
+ assert AWSBase is not None
52
+ assert DdbCostTracker is not None
53
+ assert ConfigError is not None
54
+ assert MapperError is not None
55
+ assert ReqError is not None
56
+ assert UtilsError is not None
57
+ assert EdfiError is not None
58
+ assert GoogleError is not None
59
+ assert SnowflakeError is not None
60
+ assert list_profiles is not None