equiframe 0.12.4__py3-none-any.whl
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.
- equiframe/__init__.py +832 -0
- equiframe/__main__.py +3 -0
- equiframe/_base.py +84 -0
- equiframe/_cli_support.py +125 -0
- equiframe/_comparison_io.py +161 -0
- equiframe/_dataset_provenance.py +146 -0
- equiframe/_decimal.py +22 -0
- equiframe/_diff_capture.py +433 -0
- equiframe/_doctor.py +123 -0
- equiframe/_document_io.py +61 -0
- equiframe/_documents.py +79 -0
- equiframe/_duckdb_transport.py +149 -0
- equiframe/_error_reporting.py +52 -0
- equiframe/_first_use.py +102 -0
- equiframe/_path_compat.py +26 -0
- equiframe/_physical.py +133 -0
- equiframe/_r_review.R +308 -0
- equiframe/_regular_io.py +167 -0
- equiframe/_report_format_v1.py +298 -0
- equiframe/_report_io.py +591 -0
- equiframe/_stability_inventory.py +1421 -0
- equiframe/_timezones.py +257 -0
- equiframe/_vendor/cyclonedx/LICENSE +201 -0
- equiframe/_vendor/cyclonedx/PROVENANCE.md +18 -0
- equiframe/_vendor/cyclonedx/bom-1.6.schema.json +5673 -0
- equiframe/_vendor/cyclonedx/jsf-0.82.schema.json +240 -0
- equiframe/_vendor/cyclonedx/spdx.schema.json +712 -0
- equiframe/adapters.py +454 -0
- equiframe/assertion_types.py +122 -0
- equiframe/assertions.py +271 -0
- equiframe/benchmark.py +101 -0
- equiframe/bundle.py +240 -0
- equiframe/cli.py +693 -0
- equiframe/comparison.py +937 -0
- equiframe/comparison_report.py +660 -0
- equiframe/comparison_types.py +257 -0
- equiframe/compatibility.py +546 -0
- equiframe/contracts.py +879 -0
- equiframe/datasets.py +1301 -0
- equiframe/decision.py +34 -0
- equiframe/destinations.py +295 -0
- equiframe/detector_types.py +431 -0
- equiframe/detectors.py +389 -0
- equiframe/diff.py +192 -0
- equiframe/diff_contracts.py +523 -0
- equiframe/docs/adoption.md +329 -0
- equiframe/docs/api.md +534 -0
- equiframe/docs/arquitecto.md +143 -0
- equiframe/docs/choosing-api.md +84 -0
- equiframe/docs/cientifico.md +180 -0
- equiframe/docs/compatibility.md +254 -0
- equiframe/docs/contributing.md +171 -0
- equiframe/docs/dependencies.md +237 -0
- equiframe/docs/eda.md +166 -0
- equiframe/docs/extending.md +158 -0
- equiframe/docs/fast-ci.md +52 -0
- equiframe/docs/first-use.md +78 -0
- equiframe/docs/index.md +142 -0
- equiframe/docs/ingestion.md +145 -0
- equiframe/docs/inicio.md +129 -0
- equiframe/docs/installed-private.md +97 -0
- equiframe/docs/journeys.md +362 -0
- equiframe/docs/lectura-conversion.md +211 -0
- equiframe/docs/licensing.md +17 -0
- equiframe/docs/maintenance.md +233 -0
- equiframe/docs/migration-ir.md +333 -0
- equiframe/docs/option-audit.md +45 -0
- equiframe/docs/outcome-gates.md +134 -0
- equiframe/docs/performance.md +263 -0
- equiframe/docs/piloto-simulado.md +56 -0
- equiframe/docs/quickstart.md +156 -0
- equiframe/docs/r_review.md +212 -0
- equiframe/docs/recipes.md +248 -0
- equiframe/docs/releasing.md +183 -0
- equiframe/docs/security.md +218 -0
- equiframe/docs/semantics.md +274 -0
- equiframe/docs/sqlite-snapshots.md +262 -0
- equiframe/docs/universal-sources.md +49 -0
- equiframe/docs/universalidad-cinco-pasos.md +107 -0
- equiframe/docs/upgrading.md +538 -0
- equiframe/duckdb_capture.py +410 -0
- equiframe/eda/__init__.py +36 -0
- equiframe/eda/__main__.py +3 -0
- equiframe/eda/_backend.py +612 -0
- equiframe/eda/_inventory.py +49 -0
- equiframe/eda/_paths.py +49 -0
- equiframe/eda/_report.py +291 -0
- equiframe/eda/api.py +535 -0
- equiframe/eda/cli.py +102 -0
- equiframe/eda/models.py +239 -0
- equiframe/errors.py +83 -0
- equiframe/evidence.py +375 -0
- equiframe/examples/integrations/eda_generic.py +60 -0
- equiframe/examples/integrations/outcome_gates.py +94 -0
- equiframe/examples/integrations/sqlite_snapshot.py +246 -0
- equiframe/examples/integrations/sqlite_snapshot_demo.py +226 -0
- equiframe/examples/integrations/universal_first_use.py +296 -0
- equiframe/examples/journeys/README.md +31 -0
- equiframe/examples/journeys/__init__.py +1 -0
- equiframe/examples/journeys/a_pandas_refactor.py +88 -0
- equiframe/examples/journeys/b_native_migration.py +181 -0
- equiframe/examples/journeys/c_retail_etl.py +460 -0
- equiframe/examples/journeys/common.py +136 -0
- equiframe/examples/journeys/d_financial_reconciliation.py +96 -0
- equiframe/examples/journeys/e_telemetry.py +135 -0
- equiframe/examples/journeys/f_data_science_preparation.py +84 -0
- equiframe/examples/journeys/g_external_snapshots.py +197 -0
- equiframe/examples/journeys/h_portable_ci.py +129 -0
- equiframe/examples/journeys/requirements.lock +249 -0
- equiframe/examples/journeys/verify_journeys.py +117 -0
- equiframe/examples/load_convert_compare.py +85 -0
- equiframe/execution.py +355 -0
- equiframe/execution_types.py +177 -0
- equiframe/ingestion.py +744 -0
- equiframe/local.py +126 -0
- equiframe/migration/__init__.py +94 -0
- equiframe/migration/_physical.py +8 -0
- equiframe/migration/backends/_timestamp_transport.py +109 -0
- equiframe/migration/backends/duckdb.py +651 -0
- equiframe/migration/backends/duckdb_decimal.py +125 -0
- equiframe/migration/backends/duckdb_time.py +87 -0
- equiframe/migration/backends/pandas.py +544 -0
- equiframe/migration/backends/polars.py +915 -0
- equiframe/migration/backends/polars_decimal.py +231 -0
- equiframe/migration/io.py +198 -0
- equiframe/migration/ports.py +96 -0
- equiframe/migration/runner.py +545 -0
- equiframe/migration/runner_types.py +405 -0
- equiframe/migration/types.py +354 -0
- equiframe/migration/validation.py +619 -0
- equiframe/normalization.py +358 -0
- equiframe/pipeline.py +274 -0
- equiframe/pipeline_types.py +247 -0
- equiframe/ports.py +39 -0
- equiframe/preprocessing.py +110 -0
- equiframe/profile_types.py +343 -0
- equiframe/profiles.py +447 -0
- equiframe/py.typed +0 -0
- equiframe/r_review.py +706 -0
- equiframe/reduction.py +518 -0
- equiframe/registry.py +121 -0
- equiframe/report_rendering.py +366 -0
- equiframe/report_types.py +294 -0
- equiframe/reporting.py +26 -0
- equiframe/rule_types.py +178 -0
- equiframe/rules.py +819 -0
- equiframe/schemas/r-execution-binding-1.0.schema.json +46 -0
- equiframe/schemas/r-review-binding-1.0.schema.json +28 -0
- equiframe/schemas/r-review-options-1.0.schema.json +38 -0
- equiframe/schemas/r-review-result-1.0.schema.json +207 -0
- equiframe/schemas/reviewed-decision-1.0.schema.json +3394 -0
- equiframe/serialization.py +152 -0
- equiframe/snapshot.py +296 -0
- equiframe/sources.py +283 -0
- equiframe/tables.py +459 -0
- equiframe/types.py +71 -0
- equiframe/values.py +252 -0
- equiframe/verification_request.py +35 -0
- equiframe/verify.py +799 -0
- equiframe/verify_types.py +255 -0
- equiframe/workflow.py +510 -0
- equiframe/workflow_request.py +38 -0
- equiframe-0.12.4.dist-info/METADATA +268 -0
- equiframe-0.12.4.dist-info/RECORD +170 -0
- equiframe-0.12.4.dist-info/WHEEL +4 -0
- equiframe-0.12.4.dist-info/entry_points.txt +3 -0
- equiframe-0.12.4.dist-info/licenses/LICENSE +21 -0
- equiframe-0.12.4.dist-info/licenses/THIRD_PARTY_NOTICES.md +42 -0
- equiframe-0.12.4.dist-info/licenses/tools/cyclonedx/LICENSE +201 -0
- equiframe-0.12.4.dist-info/licenses/tools/cyclonedx/PROVENANCE.md +18 -0
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: equiframe
|
|
3
|
+
Version: 0.12.4
|
|
4
|
+
Summary: Operational verification, native ETL migration and portable semantic evidence
|
|
5
|
+
Project-URL: Homepage, https://github.com/htroya/equiframe
|
|
6
|
+
Project-URL: Source, https://github.com/htroya/equiframe
|
|
7
|
+
Project-URL: Documentation, https://github.com/htroya/equiframe/blob/main/docs/index.md
|
|
8
|
+
Project-URL: Issue Tracker, https://github.com/htroya/equiframe/issues
|
|
9
|
+
Author: Hernán Troya
|
|
10
|
+
License-Expression: MIT AND Apache-2.0
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
License-File: THIRD_PARTY_NOTICES.md
|
|
13
|
+
License-File: tools/cyclonedx/LICENSE
|
|
14
|
+
License-File: tools/cyclonedx/PROVENANCE.md
|
|
15
|
+
Keywords: data-validation,dataframes,duckdb,etl,pandas,polars,semantic-diff
|
|
16
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
17
|
+
Classifier: Operating System :: Microsoft :: Windows
|
|
18
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
23
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
24
|
+
Classifier: Typing :: Typed
|
|
25
|
+
Requires-Python: <3.14,>=3.10
|
|
26
|
+
Requires-Dist: pydantic<3,>=2.12
|
|
27
|
+
Requires-Dist: typer<1,>=0.20
|
|
28
|
+
Requires-Dist: typing-extensions<5,>=4.14
|
|
29
|
+
Requires-Dist: tzdata<2027,>=2025.2
|
|
30
|
+
Provides-Extra: arrow
|
|
31
|
+
Requires-Dist: pyarrow<26,>=23.0.1; extra == 'arrow'
|
|
32
|
+
Provides-Extra: duckdb
|
|
33
|
+
Requires-Dist: duckdb<2,>=1.5.6; extra == 'duckdb'
|
|
34
|
+
Requires-Dist: pyarrow<26,>=23.0.1; extra == 'duckdb'
|
|
35
|
+
Provides-Extra: eda
|
|
36
|
+
Requires-Dist: duckdb<2,>=1.5.6; extra == 'eda'
|
|
37
|
+
Requires-Dist: pyarrow<26,>=23.0.1; extra == 'eda'
|
|
38
|
+
Provides-Extra: eda-charts
|
|
39
|
+
Requires-Dist: duckdb<2,>=1.5.6; extra == 'eda-charts'
|
|
40
|
+
Requires-Dist: plotly<8,>=6.3; extra == 'eda-charts'
|
|
41
|
+
Requires-Dist: pyarrow<26,>=23.0.1; extra == 'eda-charts'
|
|
42
|
+
Provides-Extra: engines
|
|
43
|
+
Requires-Dist: duckdb<2,>=1.5.6; extra == 'engines'
|
|
44
|
+
Requires-Dist: pandas!=3.0.3,!=3.0.4,!=3.0.5,!=3.0.6,<4,>=2.2; extra == 'engines'
|
|
45
|
+
Requires-Dist: polars<2,>=1.30; extra == 'engines'
|
|
46
|
+
Requires-Dist: pyarrow<26,>=23.0.1; extra == 'engines'
|
|
47
|
+
Provides-Extra: files
|
|
48
|
+
Requires-Dist: defusedxml<1,>=0.7; extra == 'files'
|
|
49
|
+
Requires-Dist: openpyxl<4,>=3.1; extra == 'files'
|
|
50
|
+
Requires-Dist: pandas!=3.0.3,!=3.0.4,!=3.0.5,!=3.0.6,<4,>=2.2; extra == 'files'
|
|
51
|
+
Requires-Dist: pyarrow<26,>=23.0.1; extra == 'files'
|
|
52
|
+
Requires-Dist: xlrd<3,>=2; extra == 'files'
|
|
53
|
+
Provides-Extra: ml
|
|
54
|
+
Requires-Dist: numpy<3,>=2; extra == 'ml'
|
|
55
|
+
Requires-Dist: scikit-learn<1.10,>=1.7; extra == 'ml'
|
|
56
|
+
Provides-Extra: pandas
|
|
57
|
+
Requires-Dist: pandas!=3.0.3,!=3.0.4,!=3.0.5,!=3.0.6,<4,>=2.2; extra == 'pandas'
|
|
58
|
+
Requires-Dist: pyarrow<26,>=23.0.1; extra == 'pandas'
|
|
59
|
+
Provides-Extra: polars
|
|
60
|
+
Requires-Dist: polars<2,>=1.30; extra == 'polars'
|
|
61
|
+
Requires-Dist: pyarrow<26,>=23.0.1; extra == 'polars'
|
|
62
|
+
Description-Content-Type: text/markdown
|
|
63
|
+
|
|
64
|
+
# EquiFrame: semantic comparison and dataframe migration
|
|
65
|
+
|
|
66
|
+
> Release target: **0.12.4**. Check the official index for availability and
|
|
67
|
+
> verify the identified artifact hashes. Publication requires the
|
|
68
|
+
> [release gates](https://github.com/htroya/equiframe/blob/main/docs/releasing.md).
|
|
69
|
+
|
|
70
|
+
[Documentation](https://github.com/htroya/equiframe/blob/main/docs/index.md) |
|
|
71
|
+
[API](https://github.com/htroya/equiframe/blob/main/docs/api.md) |
|
|
72
|
+
[Examples](https://github.com/htroya/equiframe/blob/main/docs/journeys.md) |
|
|
73
|
+
[Issues](https://github.com/htroya/equiframe/issues)
|
|
74
|
+
|
|
75
|
+
**EquiFrame** checks whether tabular data and supported transformations preserve
|
|
76
|
+
their meaning when moving between **Pandas, Polars and DuckDB**. It reads files,
|
|
77
|
+
creates native dataframe objects, converts between engines and reports semantic
|
|
78
|
+
differences under explicit comparison policies.
|
|
79
|
+
|
|
80
|
+
Use it to check a dataframe refactor, validate an ETL result or add migration
|
|
81
|
+
checks to an existing application. Contracts describe keys, types, numeric
|
|
82
|
+
precision, missing values, duplicates, order and dates. The library works with
|
|
83
|
+
your own data, independently of procurement schemas, warehouses and cloud services.
|
|
84
|
+
|
|
85
|
+
## Install
|
|
86
|
+
|
|
87
|
+
EquiFrame 0.12.4 supports **Python 3.10, 3.11, 3.12 and 3.13**.
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
python -m pip install "equiframe[files,engines,ml]==0.12.4"
|
|
91
|
+
python -m pip check
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
The base installation is `python -m pip install equiframe==0.12.4`.
|
|
95
|
+
Optional engines and machine-learning libraries are loaded when requested.
|
|
96
|
+
|
|
97
|
+
| Extra | Purpose |
|
|
98
|
+
| --- | --- |
|
|
99
|
+
| `files` | JSON, JSONL, CSV, delimited TXT, XML, Excel, Parquet and GeoJSON readers |
|
|
100
|
+
| `pandas`, `polars`, `duckdb` | The selected engine and Arrow transport |
|
|
101
|
+
| `engines` | Pandas, Polars, DuckDB and Arrow |
|
|
102
|
+
| `ml` | Isolation Forest with scikit-learn and NumPy |
|
|
103
|
+
| `eda`, `eda-charts` | Experimental exploratory analysis and optional charts |
|
|
104
|
+
|
|
105
|
+
The independent R reviewer requires an external `Rscript` installation.
|
|
106
|
+
See [dependencies](https://github.com/htroya/equiframe/blob/main/docs/dependencies.md)
|
|
107
|
+
and [supported ranges](https://github.com/htroya/equiframe/blob/main/pyproject.toml).
|
|
108
|
+
|
|
109
|
+
## Quick start
|
|
110
|
+
|
|
111
|
+
Local file reading and comparison need no EquiFrame account or API key.
|
|
112
|
+
Install the optional engine extras above; install R separately only for R review.
|
|
113
|
+
|
|
114
|
+
### Read a file and choose its destination
|
|
115
|
+
|
|
116
|
+
With the `files` and `engines` extras installed, provide an existing file:
|
|
117
|
+
|
|
118
|
+
```python
|
|
119
|
+
import equiframe as ef
|
|
120
|
+
|
|
121
|
+
with ef.load_dataset("orders.json") as loaded:
|
|
122
|
+
print(loaded.info.to_dict())
|
|
123
|
+
pandas_df = loaded.pandas
|
|
124
|
+
|
|
125
|
+
with ef.convert_dataset(loaded, target="polars") as converted:
|
|
126
|
+
polars_df = converted.frame
|
|
127
|
+
|
|
128
|
+
with ef.convert_dataset(loaded, target="duckdb") as converted:
|
|
129
|
+
relation = converted.frame
|
|
130
|
+
print(relation.limit(5).df())
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
EquiFrame reports columns, detected types and row count. The initial load
|
|
134
|
+
constructs Pandas; `target` selects the native object exposed as `loaded.frame`.
|
|
135
|
+
Later conversions consume the selected native frame and record its provenance.
|
|
136
|
+
Keep the context open while using an owned DuckDB relation.
|
|
137
|
+
|
|
138
|
+
Select a destination directly:
|
|
139
|
+
|
|
140
|
+
```python
|
|
141
|
+
import equiframe as ef
|
|
142
|
+
|
|
143
|
+
with ef.load_dataset("orders.parquet", target="polars") as loaded:
|
|
144
|
+
polars_df = loaded.frame
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
Pass `DatasetReadOptions` for multiple Excel sheets, nested JSON/XML, ambiguous
|
|
148
|
+
delimiters or exact column representations. The
|
|
149
|
+
[file-reading guide](https://github.com/htroya/equiframe/blob/main/docs/lectura-conversion.md)
|
|
150
|
+
describes supported forms, preserved representations and resource limits.
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
equiframe dataset load orders.json
|
|
154
|
+
equiframe dataset load orders.json --target polars
|
|
155
|
+
equiframe dataset inspect orders.parquet
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
The first command asks for a destination in an interactive terminal. Supply
|
|
159
|
+
`--target` in automated jobs. Invalid inputs return a nonzero exit and an error
|
|
160
|
+
on `stderr`.
|
|
161
|
+
|
|
162
|
+
## Compare independently produced results
|
|
163
|
+
|
|
164
|
+
This example deliberately changes one amount:
|
|
165
|
+
|
|
166
|
+
```python
|
|
167
|
+
from pathlib import Path
|
|
168
|
+
|
|
169
|
+
import pandas as pd
|
|
170
|
+
import polars as pl
|
|
171
|
+
|
|
172
|
+
import equiframe as ef
|
|
173
|
+
|
|
174
|
+
original = pd.DataFrame({"id": [1, 2], "amount": [100, 200]})
|
|
175
|
+
migrated = pl.DataFrame({"id": [1, 2], "amount": [100, 201]})
|
|
176
|
+
|
|
177
|
+
result = ef.diff(original, migrated, keys=["id"], work_dir=Path("equiframe-runs"))
|
|
178
|
+
print(result.state) # different
|
|
179
|
+
print(result.complete)
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
Inspect differences with `ef.iter_differences(result.differences)`. Enforce
|
|
183
|
+
acceptance with `ef.assert_equivalent(result)`; divergent or incomplete results
|
|
184
|
+
raise `ef.EquivalenceAssertionError`. Operational failures use the
|
|
185
|
+
`ef.EquiFrameError` hierarchy, including `DatasetReadError`,
|
|
186
|
+
`MissingDependencyError` and `InvalidExecutionInput`. See the
|
|
187
|
+
[API reference](https://github.com/htroya/equiframe/blob/main/docs/api.md)
|
|
188
|
+
for argument-validation exceptions and command-specific exits.
|
|
189
|
+
|
|
190
|
+
All six directed combinations of Pandas, Polars and DuckDB are supported.
|
|
191
|
+
A verdict concerns the supplied inputs and contract. Preserve `complete` and
|
|
192
|
+
unavailable-component states when deciding whether to accept a migration.
|
|
193
|
+
|
|
194
|
+
## ETL, rules, anomalies and R review
|
|
195
|
+
|
|
196
|
+
- **Data conversion:** `load_dataset` and `convert_dataset` move loaded data
|
|
197
|
+
between native objects.
|
|
198
|
+
- **Transformation migration:** `check_migration` and `migrate` validate and run
|
|
199
|
+
supported declarative plans: projections, filters, joins, aggregations, windows
|
|
200
|
+
and ordering. Each engine executes its own native plan.
|
|
201
|
+
- **Semantic checks:** policies cover values, types, decimals, missing values,
|
|
202
|
+
keys, multiplicity, order and time semantics.
|
|
203
|
+
- **Anomaly detection:** rules, Isolation Forest and MAD keep separate results.
|
|
204
|
+
Fitting, calibration and inference are explicit operations.
|
|
205
|
+
- **Independent R review:** `review_with_r`, `finalize_with_r` and
|
|
206
|
+
`finalize_execution_with_r` use a real R process and an explicit contract,
|
|
207
|
+
preserving earlier alerts, disagreements and unavailable components.
|
|
208
|
+
|
|
209
|
+
See [entry points](https://github.com/htroya/equiframe/blob/main/docs/choosing-api.md),
|
|
210
|
+
[semantics](https://github.com/htroya/equiframe/blob/main/docs/semantics.md),
|
|
211
|
+
[migration](https://github.com/htroya/equiframe/blob/main/docs/migration-ir.md)
|
|
212
|
+
and [R review](https://github.com/htroya/equiframe/blob/main/docs/r_review.md).
|
|
213
|
+
Registered callbacks and SQL are trusted application code; EquiFrame does not
|
|
214
|
+
sandbox untrusted programs.
|
|
215
|
+
|
|
216
|
+
## Run a complete example
|
|
217
|
+
|
|
218
|
+
The source distribution includes `examples/load_convert_compare.py`. It creates
|
|
219
|
+
temporary synthetic orders, loads Pandas, converts to Polars and DuckDB, checks
|
|
220
|
+
equivalence and verifies a deliberate one-row regression. Its files are removed
|
|
221
|
+
when finished:
|
|
222
|
+
|
|
223
|
+
```bash
|
|
224
|
+
python examples/load_convert_compare.py --rows 30000
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
Installed wheels provide the same example as
|
|
228
|
+
`python -m equiframe.examples.load_convert_compare --rows 30000`. Further
|
|
229
|
+
[examples](https://github.com/htroya/equiframe/blob/main/docs/journeys.md)
|
|
230
|
+
and [recipes](https://github.com/htroya/equiframe/blob/main/docs/recipes.md)
|
|
231
|
+
cover ETL, reconciliation and terminal usage.
|
|
232
|
+
|
|
233
|
+
## Compatibility and development
|
|
234
|
+
|
|
235
|
+
The [compatibility register](https://github.com/htroya/equiframe/blob/main/docs/compatibility.md)
|
|
236
|
+
distinguishes stable interfaces and experimental capabilities. Advanced
|
|
237
|
+
orchestration, standalone pipelines, EDA and reduction remain experimental.
|
|
238
|
+
The separate `equiframe-benchmark` distribution remains Beta.
|
|
239
|
+
|
|
240
|
+
Releases use `MAJOR.MINOR.PATCH`: patches preserve documented contracts, minor
|
|
241
|
+
releases add compatible functionality, and breaking changes require migration
|
|
242
|
+
notes. During `0.x`, consult the
|
|
243
|
+
[upgrade guide](https://github.com/htroya/equiframe/blob/main/docs/upgrading.md)
|
|
244
|
+
and [changelog](https://github.com/htroya/equiframe/blob/main/CHANGELOG.md).
|
|
245
|
+
Release versions derive from reviewed Git tags.
|
|
246
|
+
|
|
247
|
+
The source distribution includes `src/`, `py.typed`, examples, tests, schemas and
|
|
248
|
+
release tools. Development uses **Ruff** for linting and formatting, **mypy** in
|
|
249
|
+
strict mode, and source and installed-distribution tests. The
|
|
250
|
+
[contribution guide](https://github.com/htroya/equiframe/blob/main/CONTRIBUTING.md)
|
|
251
|
+
provides commands and dependency locks.
|
|
252
|
+
|
|
253
|
+
## Support and license
|
|
254
|
+
|
|
255
|
+
Use the [issue tracker](https://github.com/htroya/equiframe/issues) for
|
|
256
|
+
reproducible bugs. Include package, Python and engine versions, operating system,
|
|
257
|
+
expected results and a shareable example. Sensitive reports belong in the
|
|
258
|
+
[private security channel](https://github.com/htroya/equiframe/security/advisories/new).
|
|
259
|
+
|
|
260
|
+
Hernán Troya (`htroya`) maintains releases and security handling without a fixed
|
|
261
|
+
response-time SLA. The reusable library and its scientific benchmark have
|
|
262
|
+
separate acceptance criteria.
|
|
263
|
+
|
|
264
|
+
Original code is licensed under
|
|
265
|
+
[MIT](https://github.com/htroya/equiframe/blob/main/LICENSE).
|
|
266
|
+
Bundled CycloneDX schemas retain Apache-2.0. See
|
|
267
|
+
[third-party notices](https://github.com/htroya/equiframe/blob/main/THIRD_PARTY_NOTICES.md)
|
|
268
|
+
and [license scope](https://github.com/htroya/equiframe/blob/main/NOTICE.md).
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
equiframe/__init__.py,sha256=Q7sijM6sQ62dkIaNeRMoEETqeUhLDaTiDji7s4Hvbo0,19186
|
|
2
|
+
equiframe/__main__.py,sha256=t4Snte8rx9OLV4YvhDlYhmhTdroUKAV_FSfKlf6ocDc,39
|
|
3
|
+
equiframe/_base.py,sha256=HJiBUwI2jNBsq9s7kbN2XHl9-sDklgoNDeujRbWler0,2758
|
|
4
|
+
equiframe/_cli_support.py,sha256=vpfVJDlpAwA-zHEXj0m1TR7hMm7XjvOGc9qJq7g1Ars,5269
|
|
5
|
+
equiframe/_comparison_io.py,sha256=KRUhOSUVURoa1MTm1TeUFntTphomU7HstFp5MLvKXRw,5984
|
|
6
|
+
equiframe/_dataset_provenance.py,sha256=W0475wC0abeUDFhblq7DsIKrkxPrBDqOU2mcPs7caNs,5265
|
|
7
|
+
equiframe/_decimal.py,sha256=rW-FjV1w-W3S-e05BAikkEB_VrqrgHNXPQrhtclWN6I,788
|
|
8
|
+
equiframe/_diff_capture.py,sha256=FpXI_iiQAd38VeESPUrQzx7Mzn8NrgAC2xJVTVt0T_g,17474
|
|
9
|
+
equiframe/_doctor.py,sha256=YwTRHJpAZrS15xxiIBfoU4hLXJ_7T2MNyPgclh5Bbdc,4248
|
|
10
|
+
equiframe/_document_io.py,sha256=OFzcwsM0T7MbMjQCXve8fiBfDTC_ULRanTEj8i-zkMY,2323
|
|
11
|
+
equiframe/_documents.py,sha256=SQXndZJGdX8Cey1B52x3DChDBt3KMBJUI-1VeYSTrvE,2556
|
|
12
|
+
equiframe/_duckdb_transport.py,sha256=D7p2EezeFTQ27a5ysVjQo3KUGE4G_rJQtnlvAXZstR4,6442
|
|
13
|
+
equiframe/_error_reporting.py,sha256=nZAi3N2mtuhIhlOco3wg21TyOhYv05iv8YcJ01h8kpA,1799
|
|
14
|
+
equiframe/_first_use.py,sha256=1OSKTMfEVQtXvp-Il_wrt4FpkIS2nooc1bKAOIUMMwU,3818
|
|
15
|
+
equiframe/_path_compat.py,sha256=Luny7GCEfRzVMIb7uoYJTx9TWRXuRMDX-m5_-yDUqwY,930
|
|
16
|
+
equiframe/_physical.py,sha256=M08SYKkxQbZR4c1ZWir875EIaul5T0vbP5hHDHiMSV0,5510
|
|
17
|
+
equiframe/_r_review.R,sha256=E3zdgAT_qxEKyMK7BJLAjhTymzaSx4V9YrUqwO8seWU,13890
|
|
18
|
+
equiframe/_regular_io.py,sha256=MACQPgbGlrSejbShuEiXDDoEXWY-tm5fs7blfKQWYws,6860
|
|
19
|
+
equiframe/_report_format_v1.py,sha256=G4YDCDPF0fSkTJn9Pp2GXOj__AyAQ9HP1146jIUVsAA,12921
|
|
20
|
+
equiframe/_report_io.py,sha256=DPQJEyqxMFKfqLvGme-iYjYxD0TPgKjwdfWdXe9x2Lc,26382
|
|
21
|
+
equiframe/_stability_inventory.py,sha256=PA7A1naiuxzHFn1AVzwYVwTQgmt50XDu7zQ1YFCUBpQ,56867
|
|
22
|
+
equiframe/_timezones.py,sha256=M6d5VKOT9fGbDB1o28TQ_IGn1IIFuIsODbiKfnvoTDE,11152
|
|
23
|
+
equiframe/adapters.py,sha256=GybSqDwhF02GyRsFex_yMOFzBjwCTlp-zRhxKzFbils,20397
|
|
24
|
+
equiframe/assertion_types.py,sha256=4eFwYN-2IUkdTLRAbbWUrGMNizIS2AleEjvhuo_IYsc,4634
|
|
25
|
+
equiframe/assertions.py,sha256=Tq0ofuO5qxvcKg4bjXKY-aiMwsk5uH-MsKAFXrXvYYQ,11102
|
|
26
|
+
equiframe/benchmark.py,sha256=lcV1ORwMi4s25NRhZ3-mRzViKcolVvbnxFhi7OOtghU,3803
|
|
27
|
+
equiframe/bundle.py,sha256=AKmvY4Qqaynqjg9hHNKNawt6zJOyh3GncXM3gzF8MKU,10036
|
|
28
|
+
equiframe/cli.py,sha256=xt-LK9CkMD077rCFq5SgTc8DI1q0GzJik8WsY_6thdI,26999
|
|
29
|
+
equiframe/comparison.py,sha256=Z_RvwqlyXO9z9K7x7NwuuQ5k8eLRoeseAYjlKi-M1XU,41508
|
|
30
|
+
equiframe/comparison_report.py,sha256=fl89rJUOuX8W908rap-7kLbOu030U1OG-kjjLuQ8qTo,28104
|
|
31
|
+
equiframe/comparison_types.py,sha256=Qlo3IHzAoIhQ7cKIJ4Vp8yXaZr8g9XS7JF74zbZE1v0,10298
|
|
32
|
+
equiframe/compatibility.py,sha256=9esvsqYReiqbM3pbB-3nxIWg0gF-MmZmu1gJQG9IXOs,27354
|
|
33
|
+
equiframe/contracts.py,sha256=dZa4OKHYgVHDet3iUHEQ7DZ0ZQOSPX-SCBR8weW8Z7U,35217
|
|
34
|
+
equiframe/datasets.py,sha256=HgyH4ZqxzbSjl2bSLN4dSHOWLe4YfIvI-KI2YcYVZ5g,55599
|
|
35
|
+
equiframe/decision.py,sha256=W4Wbb1fFQuH_PIzU3Rllpuk_Pi4AKNMLc1fX7ujWFY8,1167
|
|
36
|
+
equiframe/destinations.py,sha256=wvpQK2K2MSfG-pizmvvXXx0FQb3mveh3PAJpep-g8ns,13333
|
|
37
|
+
equiframe/detector_types.py,sha256=nWVhAINTgJk1RutbY4CFHrKVdIJ7U3JUbc3SPd9HWWQ,17654
|
|
38
|
+
equiframe/detectors.py,sha256=9MAfL9Er3KLU4xvrM2PrbFbmD6eWWOblUggHqVreqPs,15098
|
|
39
|
+
equiframe/diff.py,sha256=I4ZDz3UpnOC9DbaDWU_p4fJlFCAYYANnr1jdtmG0BcA,8349
|
|
40
|
+
equiframe/diff_contracts.py,sha256=m8jkmdCK1qmbXum3BWYrvcf-tehEtIzm5Kcz47IB18w,19706
|
|
41
|
+
equiframe/duckdb_capture.py,sha256=mSTD5T5nuw3fqf_EL3QMI4VTtMZoLFFkJvUqgFKY8oc,18396
|
|
42
|
+
equiframe/errors.py,sha256=igK2Kts__WS_W_fS3hX6hlYjJHLLBlMm7a9KG0WnL60,1908
|
|
43
|
+
equiframe/evidence.py,sha256=Rj5xwEfZnwj2pPioE7kdNtwIK5L9SyRSQ2NldwKomFA,15420
|
|
44
|
+
equiframe/execution.py,sha256=DPtS32jI2F8BHj3-6LlfkxV6i54FlLzTzB_umTndOfw,14402
|
|
45
|
+
equiframe/execution_types.py,sha256=UHpYl21-1OmamF8AiGqmI3eU58ZQe2-qPWBdLv15zcM,6355
|
|
46
|
+
equiframe/ingestion.py,sha256=BkYGLm9mfm7j0igxrYWZaytkm3vr6LkPxTyKrgd_RyM,30992
|
|
47
|
+
equiframe/local.py,sha256=XbShMzixz--5c-ohOqpP81WlNU6ISJA2ohS1UoWCQ9o,5129
|
|
48
|
+
equiframe/normalization.py,sha256=G3NHd6pmp2Gt46t9i326ZBkDzUd1sltziDGwLEJF5l8,14230
|
|
49
|
+
equiframe/pipeline.py,sha256=-l2f3N6Hz4S5qJSX-thhhhf7yjVd9YUOVnO3jNWQdng,10125
|
|
50
|
+
equiframe/pipeline_types.py,sha256=uklhCUhj5pfkAk32T7uHYKl69pujoEShFqHF0rBN4QA,11341
|
|
51
|
+
equiframe/ports.py,sha256=6hlWNw6fXrA6ukBstOvjB_MjU4HIzQYQaNB9sHXLX6Q,1111
|
|
52
|
+
equiframe/preprocessing.py,sha256=8WQ097CmIFeiotTrxk01mi3RFQuAPQucZMVA7HkfSfU,4244
|
|
53
|
+
equiframe/profile_types.py,sha256=m4eUw_lhMLOwhjwvVHxYQPlyD4avmlwsUzjZHTn9e5E,13425
|
|
54
|
+
equiframe/profiles.py,sha256=oNX8-MXl9kH_UyJ7vSYLyM0EFIKYm88CCCyT0sX6CtA,19563
|
|
55
|
+
equiframe/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
56
|
+
equiframe/r_review.py,sha256=B_fpn1bJqrKm43hrU2t0XCI3VTulEEXId35Otlo08_8,29708
|
|
57
|
+
equiframe/reduction.py,sha256=F6FT4fAegEGu6jIcfgB1___NcWLeU90P6SU7nGKLL_M,22612
|
|
58
|
+
equiframe/registry.py,sha256=Wmnkwm5EetYh2OMedhTvrmE9BVGKv_Vuk67rnjvv4UU,4480
|
|
59
|
+
equiframe/report_rendering.py,sha256=-vbXl6Wvxci9s49WnntyBjp8KJml3D_rv6q4LNAAF0U,14435
|
|
60
|
+
equiframe/report_types.py,sha256=Wywd6h08eqbOhLxY2LK0LDTlZtA9T-rJ9By3Mc3kjFQ,12215
|
|
61
|
+
equiframe/reporting.py,sha256=i3rCyPwhrmZjuPlKVnU2rPvxwjzP7jgNOoYRsDCs7jY,1109
|
|
62
|
+
equiframe/rule_types.py,sha256=o3ejBKz2dtj4AQfnBFfualpKvI0DxJlw-pPjHX5e-R8,7456
|
|
63
|
+
equiframe/rules.py,sha256=pAGwdZlxfHzbigV7VEbpZ9OzST_gae965rImvo30xX0,33070
|
|
64
|
+
equiframe/serialization.py,sha256=mOUvv1HVNGF0f0F-XQs8UK1GSxHxlxB3d_R1FFqjzUE,5744
|
|
65
|
+
equiframe/snapshot.py,sha256=zJrbHJUbFm2TydxO9gMi65SoZ9FOWjIK_IH_7Wlnf_8,12758
|
|
66
|
+
equiframe/sources.py,sha256=MyG46aG_WH8Gw8F4Aa5VAy0i0YV5nKbgPect6iLuNgs,12217
|
|
67
|
+
equiframe/tables.py,sha256=7o9gbrSLnnZOpY1RekmJprUubpFpw6fuZIOpbwn1Gpk,17865
|
|
68
|
+
equiframe/types.py,sha256=_xnMSrxLUc1YSAXu_09ZIuLzu1xWGyKby4PgJ5Xjf60,2802
|
|
69
|
+
equiframe/values.py,sha256=sco4-ukTMpD7pMTEvIqU9wYIvuA0723UL4LdcX8G6p4,8418
|
|
70
|
+
equiframe/verification_request.py,sha256=zpkF_OGxMyDRzYdcbRHyVpTU_h6ZPelt5TBucBgnWPQ,1407
|
|
71
|
+
equiframe/verify.py,sha256=7oO00czXupD7IckCiZz8tCpzLFwhbe6aVeWG3QGP24M,36848
|
|
72
|
+
equiframe/verify_types.py,sha256=gtoMq_Gvvim3KeIGHGKNKK22z7HMBCRKSZPIvEk1eVk,10145
|
|
73
|
+
equiframe/workflow.py,sha256=uRZQYhMOkv1zfIbD-KMqDsXQzBjtVpmWUe09tbQ3PKY,22611
|
|
74
|
+
equiframe/workflow_request.py,sha256=2MMenMiABScnP_6Ac_ki3YyeOnLsQv_2MIHlHN3V_lY,1468
|
|
75
|
+
equiframe/eda/__init__.py,sha256=9CF1BolC7TY61zNTSalduK-iOy9VskuisaWxJ0lcTAk,682
|
|
76
|
+
equiframe/eda/__main__.py,sha256=bYt9eEaoRQWdejEHFD8REx9jxVEdZptECFsV7F49Ink,30
|
|
77
|
+
equiframe/eda/_backend.py,sha256=hIhYlHS6vOQk3TgK_RRBrVEb0DgreSzQ5VncOHnmz9A,28058
|
|
78
|
+
equiframe/eda/_inventory.py,sha256=gHIRiJe7cfT4BY2kY3CKSGxgf51yTMGnPy2Xk9MKDcg,2250
|
|
79
|
+
equiframe/eda/_paths.py,sha256=ZenvsbO25v5gX2VGmDcprNWGLJvp7z46t_n1Zn_0czw,1808
|
|
80
|
+
equiframe/eda/_report.py,sha256=HvQmKbFq1mVrD0dAT2CCPJDbPI0qgWFLqpT2Fb5l334,11691
|
|
81
|
+
equiframe/eda/api.py,sha256=-bLAwi0mTsu-1In7iv2iknZHZ-03MRDjW_MuXCZgL2Y,23082
|
|
82
|
+
equiframe/eda/cli.py,sha256=ryc0oWHJiXlJA2EBMJ_djloHkF14QGLfxPO0T01XADU,3303
|
|
83
|
+
equiframe/eda/models.py,sha256=rcIrguFj_L5sGokiFrNAUjPWlM8kSuSJ0YWGccCcn2o,8651
|
|
84
|
+
equiframe/migration/__init__.py,sha256=HFU9Tzg4RiyheYXPuPIdWI-rFMK5ZiZaoe7dydHqKCY,1900
|
|
85
|
+
equiframe/migration/_physical.py,sha256=IPZ_9oyLA_rTfIPFjYipWboD_aRZXFB-HPQXYe_2uj4,378
|
|
86
|
+
equiframe/migration/io.py,sha256=pMIhBS4YV2RLXel0dmrFt5QgdFifwfW9xsdtKWB9B6A,9156
|
|
87
|
+
equiframe/migration/ports.py,sha256=e1HR9KLsQ9Ua6l5OOyv5XQUMDd1hE63o3YTMFl3Fqp8,3457
|
|
88
|
+
equiframe/migration/runner.py,sha256=txQ9I4rh13ev0tYPQwR6R62C_3E_uqsHQ2IN8iriPvE,22345
|
|
89
|
+
equiframe/migration/runner_types.py,sha256=N1KFKd0SvlQFq9uTXNrW66YoHAX6yPgNYCI_OHogBIE,17473
|
|
90
|
+
equiframe/migration/types.py,sha256=VVoDjoF6VvJ0vLBU-gtHnPIKCvCsgrvVUJ2itCwQ6Ms,9936
|
|
91
|
+
equiframe/migration/validation.py,sha256=c7ukEbviOjDBQyWsWRiaKiXKl_OpCsgeByitow2dpT0,27165
|
|
92
|
+
equiframe/migration/backends/_timestamp_transport.py,sha256=LN7LTKl1zwS41tdA7Nk8OqrV1C-RGqmAFoyx-uQYHq8,4201
|
|
93
|
+
equiframe/migration/backends/duckdb.py,sha256=KIw0R-xxaWNl0Kr_88zH3GzFmRbghu_JzQDJEvR_eTk,27865
|
|
94
|
+
equiframe/migration/backends/duckdb_decimal.py,sha256=4_-6X-qcUKYcs7pC49M0N4mYvRbNOr8yCkpxSTvdeFU,5416
|
|
95
|
+
equiframe/migration/backends/duckdb_time.py,sha256=_-rcs7pLHrvcOjWn4zLahoXbvgvzjFmqIJFfI8PMfjQ,4183
|
|
96
|
+
equiframe/migration/backends/pandas.py,sha256=hYoGySgtSOUD96TmuuWE-4nPMtV5pLFjQsw3wY7O4eA,25077
|
|
97
|
+
equiframe/migration/backends/polars.py,sha256=OWVmBTwsPo9tb1bVYFOKKFZEWC6ycbm4h29NuQ2rJZk,40194
|
|
98
|
+
equiframe/migration/backends/polars_decimal.py,sha256=E-qL1Ie23xtyil3LuksYkezqBZ7Qq6geHX_zA6ZeTvY,9049
|
|
99
|
+
equiframe/docs/adoption.md,sha256=aiAcxnRs4jcVwCMl1BdAunFsCB4GC_t8lcPSBpSWmFw,21415
|
|
100
|
+
equiframe/docs/api.md,sha256=QR7ByRL7Rx8uCd17w9eZf6bV5EaZj4iVdncxnh53rR8,30598
|
|
101
|
+
equiframe/docs/arquitecto.md,sha256=_Jal6mvYj1xvOXv1Ae2gZFT4fVPPrG0REqtE-xH8V5Y,7197
|
|
102
|
+
equiframe/docs/choosing-api.md,sha256=At8bX7-YaV31HFjWig-UikTcoR6hMXA4R4lfDeZKdOg,6509
|
|
103
|
+
equiframe/docs/cientifico.md,sha256=fUrr-6-fEcF63M23kDZKhkipx8kioagKKqcqj2vmokI,8166
|
|
104
|
+
equiframe/docs/compatibility.md,sha256=Vg7gVhWzgdNyyqXJNa7y5fkhEup68Z52UkTukC_OYAk,16295
|
|
105
|
+
equiframe/docs/contributing.md,sha256=1UDUf-DvclwqPZ8_Ou1BH3JXciUp65Tcc-McOzthEzE,9467
|
|
106
|
+
equiframe/docs/dependencies.md,sha256=Zr999WLnx75otsWaJk3xK9ftKnG1NKB6KnpqhSOXkPo,14237
|
|
107
|
+
equiframe/docs/eda.md,sha256=8YaRaJc8vF1TTiKNhUq4VQe6BWiGXBht8tAeWIBldB4,9470
|
|
108
|
+
equiframe/docs/extending.md,sha256=zeE31xvmuYlKrr9-KI-K0wVOnft6G_nTt_66iAjPDxs,9374
|
|
109
|
+
equiframe/docs/fast-ci.md,sha256=oEoOscwz7HPcKf65Icip9xsa0Za2vAWLPm0rwHjSL2E,2584
|
|
110
|
+
equiframe/docs/first-use.md,sha256=8AyxWAjasHtE1fSyxNZN2SzHAW7LFPjO5zLzOpL0kno,4253
|
|
111
|
+
equiframe/docs/index.md,sha256=fuaQfnvJgqcuoOYf1-BSju2ae93Va4ZhvLR8V2xbBgI,8450
|
|
112
|
+
equiframe/docs/ingestion.md,sha256=kxm9jvU6WvW9vDaIreVpEBpQiQmUAzQJ60sci32O9RU,7536
|
|
113
|
+
equiframe/docs/inicio.md,sha256=LKr195zXr3LLxtObBuTgr22dqpZ70FQIFcp596zNczg,6819
|
|
114
|
+
equiframe/docs/installed-private.md,sha256=8Pl-ainhdhfuI0tYQvn5ezYlmhx9lvIEJxs03NvuaxE,5153
|
|
115
|
+
equiframe/docs/journeys.md,sha256=pMoXnxnMMMOMj4dxgafhPjTspc4Rd38e8r33Cd67hMc,21293
|
|
116
|
+
equiframe/docs/lectura-conversion.md,sha256=9lqwEMfwxzsxLbQIWKBUiIFaYP2L7gGUEPupCE2uTN4,12231
|
|
117
|
+
equiframe/docs/licensing.md,sha256=dIQhr95T5XwvqFyI5jXi8slYIUF5oraXtpqfE4RdtRI,876
|
|
118
|
+
equiframe/docs/maintenance.md,sha256=NE1Abmijs_GF5CB51Y99jOpwKEIP9kaq0I3WI7-Rwfo,15420
|
|
119
|
+
equiframe/docs/migration-ir.md,sha256=QucJWqfunasCf_kMslaTNX60lZeuNteNjr29g3dl9kg,18097
|
|
120
|
+
equiframe/docs/option-audit.md,sha256=7Cq2vO163PIYJyQVpZTzt_YkyCJpfPZO1Dc5izMka2o,2534
|
|
121
|
+
equiframe/docs/outcome-gates.md,sha256=rN9YfShY3qCbHEul1jHA4CzsiN_Wo_h1kxpB8u6WLTM,8329
|
|
122
|
+
equiframe/docs/performance.md,sha256=eVRkZzLV3jOa7jndfNht4bsilIHXza74S3u90RCWX8c,15292
|
|
123
|
+
equiframe/docs/piloto-simulado.md,sha256=RpfkAN56y-FCVs55B0y6p18DRbi_fpK7eEg9Oi6L5jk,3374
|
|
124
|
+
equiframe/docs/quickstart.md,sha256=hKK65QBymw0x7QrmVce5XWhJxWrCthVZrKnRGFs1BL0,7359
|
|
125
|
+
equiframe/docs/r_review.md,sha256=GzIQWAeUsozCh3U_AtanBskxFJcvn_f5c4OvSXEQeQk,11682
|
|
126
|
+
equiframe/docs/recipes.md,sha256=9ur8kgEZfnEWs5sal145FomPWGDPffCOFQzt5DCCY-Y,12935
|
|
127
|
+
equiframe/docs/releasing.md,sha256=I8xb9JX5VzNGkx0cMWghl7U2gevOqfnxZfUezbpBB9s,10461
|
|
128
|
+
equiframe/docs/security.md,sha256=pCm5MN_oYw8ubqAMDZpHWstyFVgfZj572lPr4UBh79o,15271
|
|
129
|
+
equiframe/docs/semantics.md,sha256=shKdwftOkWYX8b4Qd1Z8ZuQcG1tmmI147x_U0A1wAHU,16624
|
|
130
|
+
equiframe/docs/sqlite-snapshots.md,sha256=M-S8cmt146PiAqty7uQtKsxMiOTlfTmqWMaSj7w32nA,13893
|
|
131
|
+
equiframe/docs/universal-sources.md,sha256=gEFbV9g_aDiIR9M8dZOnUTk5Im1deJdI0A3zTbBAX8s,3206
|
|
132
|
+
equiframe/docs/universalidad-cinco-pasos.md,sha256=5XWanHTp_e5WHJjSnrqmYFs-d6h_2GjWAzcaQ2-ogV4,6036
|
|
133
|
+
equiframe/docs/upgrading.md,sha256=3ovA4ZSPtpbE721AZzO51PNbF0_F1RkCj5-FUx_lpc8,31829
|
|
134
|
+
equiframe/_vendor/cyclonedx/LICENSE,sha256=bCnyKkpzhShcb1eeyfM8XpifAHOdayVyQ6CwguyUR64,11341
|
|
135
|
+
equiframe/_vendor/cyclonedx/PROVENANCE.md,sha256=RIh9vvF_cCzKQ0lnoB1rHSVeTOz0y3I1UimTrksGuow,1029
|
|
136
|
+
equiframe/_vendor/cyclonedx/bom-1.6.schema.json,sha256=PpLd28MM9_agK4DwlCsaTP1PscJvHfxDEK-p1hPK-5M,252625
|
|
137
|
+
equiframe/_vendor/cyclonedx/jsf-0.82.schema.json,sha256=i64ALCXnI9t-4fJq_eaArhorGo9rS0sP1l3DvssJCq4,8058
|
|
138
|
+
equiframe/_vendor/cyclonedx/spdx.schema.json,sha256=uqnTvR7Ve2dRsIh-3q1rUGP_U_90Kc-F1HbGyUrwFm4,14269
|
|
139
|
+
equiframe/examples/load_convert_compare.py,sha256=ERCy7PNcImZEGskBnbNBGpnZUdlo5p4ED9lQSnI2Ru0,3264
|
|
140
|
+
equiframe/schemas/r-execution-binding-1.0.schema.json,sha256=iBZOKK2Mguz4ZodVqu78-RfWAVqLPmO14gol9OPeZpw,1049
|
|
141
|
+
equiframe/schemas/r-review-binding-1.0.schema.json,sha256=CbNEQ-9NCR498u72jRQSyUKO4_nmEXiZ-g4MPmQUsIk,667
|
|
142
|
+
equiframe/schemas/r-review-options-1.0.schema.json,sha256=vbM7kOw2UV6A0QU_9S-t6aPDUhhqSMyDM4ZirpkSK8g,1010
|
|
143
|
+
equiframe/schemas/r-review-result-1.0.schema.json,sha256=LHrUhiu_P5fzHbVDtH6Ok0Xn4tEr_pujrOpHzL42K6E,4298
|
|
144
|
+
equiframe/schemas/reviewed-decision-1.0.schema.json,sha256=MxY6zuCYtb9C73iLRnw19hZx-Rxuw-K34DimUJee9hM,77533
|
|
145
|
+
equiframe/examples/integrations/eda_generic.py,sha256=LwghbMFnTI_pVDTuLU7lI3noXdJp-YAh-kpcRzV_Qwg,2162
|
|
146
|
+
equiframe/examples/integrations/outcome_gates.py,sha256=17T-Le9sFxABtHGLnWmYRYrJmmdthVeadHXLG56tAdc,3666
|
|
147
|
+
equiframe/examples/integrations/sqlite_snapshot.py,sha256=pcATjYki1lzCFB2uih7pXmmV1-K4zK4U2ObzAv7L4yg,10100
|
|
148
|
+
equiframe/examples/integrations/sqlite_snapshot_demo.py,sha256=qVGpO3wl7H50gcodj-l1U0r8HTmulwCa2qJe4ztuD6s,8371
|
|
149
|
+
equiframe/examples/integrations/universal_first_use.py,sha256=VzSn-lQENmbKperRDRbAZMEJySGBTZq8aRfMaIjuBII,10389
|
|
150
|
+
equiframe/examples/journeys/README.md,sha256=t_Ojax-kckrRSVbUsVmk0vQFrRuZQW_t2zOTTmQsXJc,1501
|
|
151
|
+
equiframe/examples/journeys/__init__.py,sha256=SWhddkfhCLfvVXXYj-jVKfznz2Wmvw5csgd-IUsuBDU,78
|
|
152
|
+
equiframe/examples/journeys/a_pandas_refactor.py,sha256=-V02DP-LhwokV4SeREowJGdzEvgVIGeeor8cZ1RKWJY,2921
|
|
153
|
+
equiframe/examples/journeys/b_native_migration.py,sha256=QeYUvnK8kMJGbI5pPFEbQR9dCcAenGkdEaJVafFQH9A,6479
|
|
154
|
+
equiframe/examples/journeys/c_retail_etl.py,sha256=N_E7QCHQu-1um12C6OKiLqXI-swOCvTkG8YP9MoKQDQ,18158
|
|
155
|
+
equiframe/examples/journeys/common.py,sha256=VA-9sfof9iEwqbVSyMkKYL7hODTbT5r_JFeMDM86ZbU,4760
|
|
156
|
+
equiframe/examples/journeys/d_financial_reconciliation.py,sha256=ilzFCvaIg2CP2ZHWqGuzN7tUIfxnbyGmoJXB801qI1g,3236
|
|
157
|
+
equiframe/examples/journeys/e_telemetry.py,sha256=k-51cSZUOTkZwLUnQ3oBv4pJOm4Rl85P1o29Ssseahs,4535
|
|
158
|
+
equiframe/examples/journeys/f_data_science_preparation.py,sha256=vym-y6uGLII3LVLic5-E6C_Xahz5UczsxFS69K_VAEQ,2874
|
|
159
|
+
equiframe/examples/journeys/g_external_snapshots.py,sha256=7prifgYfxwCvReKPC9qJRUjlIh64HMJt44bAqvkHVQQ,7187
|
|
160
|
+
equiframe/examples/journeys/h_portable_ci.py,sha256=keF2uj43y8vgGvro-_s4ctRkW12LJcPbssDc46a1Wk8,4960
|
|
161
|
+
equiframe/examples/journeys/requirements.lock,sha256=PndI_DA49ActhYiKlJjaQWPyCvx8Nvpb8Lwe_EX_-EM,19427
|
|
162
|
+
equiframe/examples/journeys/verify_journeys.py,sha256=3XLQLggIwdWrQrgSmIk6Oa-vxFO645ZGOkmeT8nE3xI,4092
|
|
163
|
+
equiframe-0.12.4.dist-info/METADATA,sha256=pSaqL6YDqCK2fW918TFLuFQo7SQ934wzm6senIlWI58,11765
|
|
164
|
+
equiframe-0.12.4.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
165
|
+
equiframe-0.12.4.dist-info/entry_points.txt,sha256=n60mVXeOZTh-sKjUrPlS9BuC1KaOlyln7U8NNAdJFl4,88
|
|
166
|
+
equiframe-0.12.4.dist-info/licenses/LICENSE,sha256=KbNEP-20dJmFziJl6wTjeU3TZvhJ-TBkOKnZJOeuGjA,1070
|
|
167
|
+
equiframe-0.12.4.dist-info/licenses/THIRD_PARTY_NOTICES.md,sha256=c3bCwtKF5ZYbAj_Z9LZP4HeSO_eDbmrAKaKEfP41JpI,1801
|
|
168
|
+
equiframe-0.12.4.dist-info/licenses/tools/cyclonedx/LICENSE,sha256=bCnyKkpzhShcb1eeyfM8XpifAHOdayVyQ6CwguyUR64,11341
|
|
169
|
+
equiframe-0.12.4.dist-info/licenses/tools/cyclonedx/PROVENANCE.md,sha256=RIh9vvF_cCzKQ0lnoB1rHSVeTOz0y3I1UimTrksGuow,1029
|
|
170
|
+
equiframe-0.12.4.dist-info/RECORD,,
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Hernán Troya
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Third-party notices
|
|
2
|
+
|
|
3
|
+
EquiFrame's original code and accompanying project documentation, examples and
|
|
4
|
+
tools are licensed under MIT; see LICENSE. Third-party material retains its
|
|
5
|
+
original terms.
|
|
6
|
+
|
|
7
|
+
## CycloneDX schemas
|
|
8
|
+
|
|
9
|
+
The source distribution includes these unmodified schemas under tools/cyclonedx;
|
|
10
|
+
the wheel includes the same files under equiframe/_vendor/cyclonedx:
|
|
11
|
+
|
|
12
|
+
- bom-1.6.schema.json
|
|
13
|
+
- spdx.schema.json
|
|
14
|
+
- jsf-0.82.schema.json
|
|
15
|
+
|
|
16
|
+
They come from the official CycloneDX specification, tag 1.6:
|
|
17
|
+
https://github.com/CycloneDX/specification/tree/1.6/schema
|
|
18
|
+
|
|
19
|
+
Their Apache License 2.0 is preserved in tools/cyclonedx/LICENSE. Provenance and
|
|
20
|
+
the original SHA-256 inventory remain in tools/cyclonedx/PROVENANCE.md. The
|
|
21
|
+
package's license files also carry this upstream license for redistribution.
|
|
22
|
+
MIT does not replace the schemas' Apache-2.0 terms.
|
|
23
|
+
|
|
24
|
+
## External dependencies and data
|
|
25
|
+
|
|
26
|
+
Python dependencies and the external R runtime are separate installations;
|
|
27
|
+
their licenses remain their own. EquiFrame's MIT grant does not relicense them.
|
|
28
|
+
Downloaded datasets and the thesis manuscript are not part of this grant.
|
|
29
|
+
|
|
30
|
+
### Optional legacy XLS reader
|
|
31
|
+
|
|
32
|
+
The optional `files` extra uses the separately installed `xlrd` package for
|
|
33
|
+
legacy XLS files. No xlrd source or binary is vendored in EquiFrame. The license
|
|
34
|
+
included with xlrd 2.0.2 contains both a later three-clause notice and an earlier
|
|
35
|
+
notice requiring attribution in advertising materials mentioning that software
|
|
36
|
+
and retention of the acknowledgement in redistributions:
|
|
37
|
+
|
|
38
|
+
> This product includes software developed by David Giffin <david@giffin.org>.
|
|
39
|
+
|
|
40
|
+
Preserve xlrd's complete upstream license and notices when redistributing it;
|
|
41
|
+
this acknowledgement does not replace either of its license texts. See
|
|
42
|
+
https://github.com/python-excel/xlrd/blob/2.0.2/LICENSE.
|