tabalyst 0.7.1__tar.gz → 0.7.3__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.
- {tabalyst-0.7.1/src/tabalyst.egg-info → tabalyst-0.7.3}/PKG-INFO +13 -2
- {tabalyst-0.7.1 → tabalyst-0.7.3}/README.md +12 -1
- {tabalyst-0.7.1 → tabalyst-0.7.3}/pyproject.toml +3 -1
- tabalyst-0.7.3/src/tabalyst/cli/generate.py +190 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/cli/report.py +13 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/config.py +22 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/dedup/analysis.py +2 -2
- tabalyst-0.7.3/src/tabalyst/dedup/calculation.py +14 -0
- tabalyst-0.7.3/src/tabalyst/dedup/count_only.py +321 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_anomalies.py +8 -1
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_computer.py +39 -17
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_computer_output.py +71 -23
- tabalyst-0.7.3/src/tabalyst/generate_computer_parallel.py +184 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_selection.py +170 -53
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_service.py +228 -70
- tabalyst-0.7.3/src/tabalyst/identifier_uniqueness/__init__.py +33 -0
- tabalyst-0.7.3/src/tabalyst/identifier_uniqueness/facts.py +462 -0
- tabalyst-0.7.3/src/tabalyst/identifier_uniqueness/models.py +278 -0
- tabalyst-0.7.3/src/tabalyst/identifier_uniqueness/near_unique.py +59 -0
- tabalyst-0.7.3/src/tabalyst/identifier_uniqueness/proof.py +130 -0
- tabalyst-0.7.3/src/tabalyst/identifier_uniqueness/rule.py +396 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/models.py +2 -2
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/report_chain.py +5 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/report_classification.py +4 -4
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/report_column_page.py +12 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/report_deep.py +32 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/report_labels.py +99 -5
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/report_profile.py +15 -3
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/report_service.py +17 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/report_summary.py +25 -5
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/report_table.py +7 -0
- tabalyst-0.7.3/src/tabalyst/report_uniqueness.py +350 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/reporting.py +2 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/classify/identifiers.py +3 -2
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzer.py +30 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/__init__.py +6 -0
- tabalyst-0.7.3/src/tabalyst/scanner/planner/analyzers/analytical.py +91 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/common.py +4 -0
- tabalyst-0.7.3/src/tabalyst/scanner/planner/analyzers/copies.py +108 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/distinct.py +12 -2
- tabalyst-0.7.3/src/tabalyst/scanner/planner/analyzers/missing_copies.py +114 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/costmodel.py +29 -1
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/facts.py +161 -48
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/planner.py +50 -5
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/reasons.py +13 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/secondpass.py +6 -3
- tabalyst-0.7.3/src/tabalyst/scanner/secondpass/analytical.py +90 -0
- tabalyst-0.7.3/src/tabalyst/scanner/secondpass/copies.py +115 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/executor.py +110 -13
- tabalyst-0.7.3/src/tabalyst/scanner/secondpass/missing_copies.py +140 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/models.py +86 -1
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/routing.py +14 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/schemas/tabalyst.report.schema.json +957 -4
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/schemas/tabalyst.scan.deep.schema.json +277 -2
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/service.py +48 -5
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/static/theme.css +10 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/summary_models.py +4 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/templates/column.html +14 -2
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/templates/report.html +2 -2
- {tabalyst-0.7.1 → tabalyst-0.7.3/src/tabalyst.egg-info}/PKG-INFO +13 -2
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst.egg-info/SOURCES.txt +17 -0
- tabalyst-0.7.3/tests/test_generate_computer_parallel.py +115 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_generate_computer_service.py +263 -0
- tabalyst-0.7.1/src/tabalyst/cli/generate.py +0 -106
- {tabalyst-0.7.1 → tabalyst-0.7.3}/LICENSE +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/MANIFEST.in +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/examples/README.md +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/examples/config.json +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/examples/datasets/basic.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/examples/datasets/insurance-customers.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/examples/generate/README.md +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/examples/generate/cohorts-anomalies/catalog.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/examples/generate/cohorts-anomalies/dataset.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/examples/generate/cohorts-anomalies/schemas/accounts.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/examples/generate/cohorts-anomalies/schemas/contacts.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/examples/generate/common-references/catalog.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/examples/generate/common-references/dataset.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/examples/generate/common-references/schemas/contacts.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/examples/generate/generate_examples.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/setup.cfg +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/__init__.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/__main__.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/_version.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/batch.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/cache_service.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/cli/__init__.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/cli/app.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/cli/cache.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/cli/confirm.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/cli/dedup.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/cli/inspect.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/cli/sample.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/cli/scan.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/cli/terminal.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/csv_records.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/dedup/__init__.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/dedup/batch_report.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/dedup/cache.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/dedup/discovery.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/dedup/diskstore.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/dedup/failures.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/dedup/groups.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/dedup/identity.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/dedup/pipeline.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/dedup/publish.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/dedup/report.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/dedup/settings.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/dedup/store.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/dedup/tiered.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/dedup/writer.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/dedup_service.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/deep_service.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/deep_store.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/errors.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/execution_log.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_columns_package.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_csv.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_definition.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/SOURCES.md +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/catalog.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/brand.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/color.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/computer_type.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/computer_type_form_factor.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/computer_type_product_segment.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/cpu.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/cpu_memory_weight.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/cpu_operating_system.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/display.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/extended_specs.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/form_factor.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/generation_color.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/generation_cpu.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/generation_display.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/generation_gpu.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/generation_memory.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/generation_operating_system.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/generation_profile.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/generation_profile_computer_type.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/generation_profile_segment.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/generation_storage.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/gpu.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/gpu_display.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/gpu_memory_weight.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/gpu_storage_weight.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/memory.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/model_form_factor.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/model_generation.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/operating_system.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/product_category.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/product_family.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/product_family_computer_type.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/product_family_product_segment.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/product_model.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/product_segment.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/product_segment_brand.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/product_segment_display_weight.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/product_segment_memory_weight.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/product_segment_storage_weight.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/product_subcategory.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/profile_exclusions.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/promotion_status.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/promotion_type.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/seller.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/seller_type.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/shipping_availability.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/standard_specs.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/storage.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/data/warehouse.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/dataset.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/computer_type.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/computer_type_form_factor.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/computer_type_product_segment.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/computers.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/cpu.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/cpu_memory_weight.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/cpu_operating_system.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/display.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/extended_specs.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/generation_color.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/generation_cpu.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/generation_display.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/generation_gpu.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/generation_memory.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/generation_operating_system.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/generation_profile.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/generation_profile_computer_type.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/generation_profile_segment.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/generation_storage.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/gpu.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/gpu_display.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/gpu_memory_weight.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/gpu_storage_weight.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/localized.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/memory.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/model_form_factor.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/model_generation.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/operating_system.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/product_family.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/product_family_computer_type.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/product_family_product_segment.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/product_model.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/product_segment.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/product_segment_brand.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/product_segment_display_weight.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/product_segment_memory_weight.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/product_segment_storage_weight.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/product_subcategory.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/profile_exclusions.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/seller.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/standard_specs.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/storage.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/computer/schemas/warehouse.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/crm/catalog.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/crm/dataset.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/crm/schemas/accounts.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/crm/schemas/contacts.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/insurance/SOURCES.md +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/insurance/catalog.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/insurance/data/agencies.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/insurance/data/branch_contract_weights.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/insurance/data/claim_statuses.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/insurance/data/contract_statuses.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/insurance/data/contract_types.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/insurance/data/payment_frequencies.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/insurance/data/payment_methods.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/insurance/dataset.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/insurance/schemas/agencies.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/insurance/schemas/branch_contract_weights.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/insurance/schemas/claim_statuses.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/insurance/schemas/contract_statuses.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/insurance/schemas/contract_types.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/insurance/schemas/customers.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/insurance/schemas/payment_frequencies.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_examples/insurance/schemas/payment_methods.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_insurance.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_package.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_references.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_resources/SOURCES.md +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_resources/addresses/street_directions_ca.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_resources/addresses/street_names_ca.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_resources/addresses/street_types_ca.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_resources/addresses/unit_types_ca.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_resources/contact/email_patterns.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_resources/contact/email_providers_ca.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_resources/contact/phone_area_codes_ca.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_resources/geography/cities_ca.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_resources/geography/postal_prefixes_ca.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_resources/geography/provinces_ca.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_resources/people/family_names_ca.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_resources/people/first_names_en_ca.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_resources/people/first_names_fr_qc.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/generate_values.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/inspect_service.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/inspector/__init__.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/inspector/choices.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/inspector/excel_inspect/__init__.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/inspector/excel_inspect/build.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/inspector/excel_inspect/detect.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/inspector/excel_inspect/parameters.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/inspector/json_inspect/__init__.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/inspector/json_inspect/build.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/inspector/json_inspect/detect.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/inspector/json_inspect/parameters.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/inspector/models.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/inspector/persistence.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/inspector/resolution.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/json_text.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/option_notices.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/plan_service.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/progress.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/project_open_service.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/project_scan_service.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/projects/__init__.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/projects/_bounded_values.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/projects/_cache.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/projects/_codec.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/projects/_generation.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/projects/_locks.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/projects/_publication.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/projects/_queries.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/projects/_query_budget.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/projects/_recovery.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/projects/_retention.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/projects/_schema.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/projects/_session.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/projects/_staging.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/projects/_sync.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/projects/_validation.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/projects/catalog.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/projects/freshness.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/projects/identity.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/projects/index.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/projects/location.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/projects/models.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/projects/store.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/report_config.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/report_details.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/report_finding_details.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/report_findings.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/report_insights.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/report_measures.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/report_overview.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/report_plan.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/report_preview.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/report_relations.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/report_schema.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/report_sections.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/report_signals.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/report_views.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/result_model.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/sample_page.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/sampling.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/sampling_service.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scan_document.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scan_page.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scan_reuse.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scan_service.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/__init__.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/api.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/bottomk.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/cases.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/charactermap.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/characters.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/classify/__init__.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/classify/candidates.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/classify/catalog.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/classify/models.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/classify/names.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/classify/rules.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/config.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/convention_rule.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/correlation_ratio.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/crosstab.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/detectors/__init__.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/detectors/amount.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/detectors/base.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/detectors/boolean.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/detectors/currency.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/detectors/email.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/detectors/enumeration.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/detectors/ip.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/detectors/keys.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/detectors/names.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/detectors/number.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/detectors/pattern.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/detectors/percentage.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/detectors/phone.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/detectors/postal.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/detectors/quantity.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/detectors/registry.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/detectors/shape.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/detectors/temporal.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/detectors/url.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/detectors/uuid.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/diagnostics.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/engine.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/exposure.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/features.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/field.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/identity.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/lengthsample.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/longtext.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/measures.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/memory.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/models.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/normalization.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/observations.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/paths.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/pattern_eligibility.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/patternfacets.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/patterninfer.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/patterntree.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/pearson.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/__init__.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/characters.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/crosstab.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/date_order.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/drift.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/duplicates.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/forms.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/frequencies.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/histogram.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/lengths.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/matrix.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/measures.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/parts.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/patterns.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/pearson.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/residuals.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/shape.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/stats.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/structure.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/temporal.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/analyzers/texts.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/categorystats.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/crosstabs.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/identifiers.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/models.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/orders.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/registry.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/relations.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/render.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/samplerows.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/stratification.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/planner/stratmodels.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/process.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/quality.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/rankcorr.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/readers/__init__.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/readers/base.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/readers/csv_reader.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/readers/excel_common.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/readers/excel_reader.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/readers/excel_table.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/readers/factory.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/readers/json_common.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/readers/json_reader.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/readers/jsonl_reader.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/records.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/rowsample.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/schema.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/__init__.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/accumulators.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/bins.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/boundaries.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/characters.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/crosstab.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/document.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/drift.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/duplicates.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/exactset.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/forms.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/frequencies.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/matrix.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/measures.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/orders.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/parallel.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/parts.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/patternreader.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/patterns.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/pearson.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/periods.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/ranks.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/replay.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/residuals.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/schema.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/shape.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/stats.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/structure.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/secondpass/texts.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/smart/__init__.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/smart/bins.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/smart/estimate.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/smart/evaluate.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/smart/execute.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/smart/models.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/smart/near.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/smart/plan.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/smart/reasons.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/smart/render.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/smart/result.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/smart/select.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/smart/targets.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/smart/weights.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/stratify.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/structure.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/technical.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/validation.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/values.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/valuesample.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/scanner/workers.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/schemas/tabalyst.dedup.batch.schema.json +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/schemas/tabalyst.dedup.schema.json +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/schemas/tabalyst.sample.schema.json +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/schemas/tabalyst.scan.schema.json +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/shared_scan_service.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/smart_service.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/source_guard.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/static/report.js +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/templates/characters.html +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/templates/insights.html +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/templates/patterns.html +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst/templates/sample.html +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst.egg-info/dependency_links.txt +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst.egg-info/entry_points.txt +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst.egg-info/requires.txt +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/src/tabalyst.egg-info/top_level.txt +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_all_collections.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_cli.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_csv_records.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_examples_index.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_examples_layout.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_generate.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_generate_anomalies.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_generate_anomalies_regression.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_generate_computer_catalog.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_generate_computer_components.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_generate_computer_derivations.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_generate_computer_hierarchy.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_generate_computer_output.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_generate_crm.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_generate_crm_package.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_generate_insurance.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_generate_insurance_stress.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_generate_lot4.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_generate_package.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_generate_references.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_generate_selection.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_json_text.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_license_headers.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_make_datasets.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_option_notices.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_project_cache.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_project_database.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_project_generations.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_project_identity.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_project_index.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_project_location.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_project_open_service.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_project_queries.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_project_rescan.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_project_scan.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_project_scan_model.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_project_sessions.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_project_store.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_public_api.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_report_contrast.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_reporting.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_sampling.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_scan_command.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_scanner_amounts.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_scanner_batches.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_scanner_config.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_scanner_csv.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_scanner_email_url.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_scanner_exposure.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_scanner_paths.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_scanner_phone.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_scanner_postal.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_scanner_uuid_ip.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_shared_scan_cli.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.3}/tests/test_source_freshness.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tabalyst
|
|
3
|
-
Version: 0.7.
|
|
3
|
+
Version: 0.7.3
|
|
4
4
|
Summary: Open-source toolkit for understanding and working with unfamiliar data.
|
|
5
5
|
Author: Gregory Borelli
|
|
6
6
|
License-Expression: MPL-2.0
|
|
@@ -146,6 +146,12 @@ Details: [Tabalyst Report](https://docs.tabalyst.com/report/),
|
|
|
146
146
|
- Dataset dimensions, missing cells, duplicates, and quality observations.
|
|
147
147
|
- A family and a type for each column (identifier, text, date, boolean...),
|
|
148
148
|
with the evidence behind them, and the technical type with its error rates.
|
|
149
|
+
- For an identifier column, whether the ID is unique across all rows and after
|
|
150
|
+
row deduplication: the repetitions that exact copies of whole rows explain
|
|
151
|
+
are told apart from those between distinct records, with the evidence (the
|
|
152
|
+
Scan, the second pass or a [Dedup](https://docs.tabalyst.com/dedup/) report),
|
|
153
|
+
the case of missing IDs, and a non-binding near-unique reading of the few
|
|
154
|
+
repetitions that remain.
|
|
149
155
|
- A summary table with one row per column: its type, a sentence about its
|
|
150
156
|
values, the missing share, its Errors and Issues with a preview of each, and
|
|
151
157
|
its details; above it, the Column quality and Signals cards.
|
|
@@ -274,10 +280,15 @@ tabalyst generate --example crm -o crm-contacts.csv
|
|
|
274
280
|
tabalyst generate --example insurance --rows 3000 -d insurance-output/
|
|
275
281
|
tabalyst generate --example computer --rows 10000 -d computer-output/
|
|
276
282
|
tabalyst generate --example insurance --rows 3000 --anomaly-profile dirty_realistic -d insurance-dirty/
|
|
283
|
+
tabalyst generate --example computer --rows 30000 -o pcs.csv --anomaly-profile dirty_realistic
|
|
277
284
|
```
|
|
278
285
|
|
|
279
286
|
An anomaly profile writes an altered CSV, a cell change log and a summary
|
|
280
|
-
beside the untouched clean CSV.
|
|
287
|
+
beside the untouched clean CSV. For Computer, `-o` writes one CSV with the
|
|
288
|
+
errors and its `.changes.csv` log, and `--anomaly-profile` accepts several
|
|
289
|
+
profiles with `-d` to get one variant of each. Computer rows are generated by
|
|
290
|
+
several processes from 5,000 rows (`--workers` sets the number), and the command
|
|
291
|
+
shows its progress and ends with a timing report.
|
|
281
292
|
|
|
282
293
|
Details: [Tabalyst Generate](https://docs.tabalyst.com/generate/),
|
|
283
294
|
[`examples/generate/README.md`](examples/generate/README.md) and the
|
|
@@ -106,6 +106,12 @@ Details: [Tabalyst Report](https://docs.tabalyst.com/report/),
|
|
|
106
106
|
- Dataset dimensions, missing cells, duplicates, and quality observations.
|
|
107
107
|
- A family and a type for each column (identifier, text, date, boolean...),
|
|
108
108
|
with the evidence behind them, and the technical type with its error rates.
|
|
109
|
+
- For an identifier column, whether the ID is unique across all rows and after
|
|
110
|
+
row deduplication: the repetitions that exact copies of whole rows explain
|
|
111
|
+
are told apart from those between distinct records, with the evidence (the
|
|
112
|
+
Scan, the second pass or a [Dedup](https://docs.tabalyst.com/dedup/) report),
|
|
113
|
+
the case of missing IDs, and a non-binding near-unique reading of the few
|
|
114
|
+
repetitions that remain.
|
|
109
115
|
- A summary table with one row per column: its type, a sentence about its
|
|
110
116
|
values, the missing share, its Errors and Issues with a preview of each, and
|
|
111
117
|
its details; above it, the Column quality and Signals cards.
|
|
@@ -234,10 +240,15 @@ tabalyst generate --example crm -o crm-contacts.csv
|
|
|
234
240
|
tabalyst generate --example insurance --rows 3000 -d insurance-output/
|
|
235
241
|
tabalyst generate --example computer --rows 10000 -d computer-output/
|
|
236
242
|
tabalyst generate --example insurance --rows 3000 --anomaly-profile dirty_realistic -d insurance-dirty/
|
|
243
|
+
tabalyst generate --example computer --rows 30000 -o pcs.csv --anomaly-profile dirty_realistic
|
|
237
244
|
```
|
|
238
245
|
|
|
239
246
|
An anomaly profile writes an altered CSV, a cell change log and a summary
|
|
240
|
-
beside the untouched clean CSV.
|
|
247
|
+
beside the untouched clean CSV. For Computer, `-o` writes one CSV with the
|
|
248
|
+
errors and its `.changes.csv` log, and `--anomaly-profile` accepts several
|
|
249
|
+
profiles with `-d` to get one variant of each. Computer rows are generated by
|
|
250
|
+
several processes from 5,000 rows (`--workers` sets the number), and the command
|
|
251
|
+
shows its progress and ends with a timing report.
|
|
241
252
|
|
|
242
253
|
Details: [Tabalyst Generate](https://docs.tabalyst.com/generate/),
|
|
243
254
|
[`examples/generate/README.md`](examples/generate/README.md) and the
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "tabalyst"
|
|
7
|
-
version = "0.7.
|
|
7
|
+
version = "0.7.3"
|
|
8
8
|
description = "Open-source toolkit for understanding and working with unfamiliar data."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11"
|
|
@@ -80,6 +80,8 @@ markers = [
|
|
|
80
80
|
"dedup_lot(name): Tabalyst Dedup implementation lot (plan 2026-10-22) that provides the tested behavior; skipped until the lot is enabled in tests/dedup/conftest.py",
|
|
81
81
|
"dedup_t(*ids): requirement tests (T01 to T30 of the Dedup specification) that the test covers",
|
|
82
82
|
"dedup_heavy: Dedup large-scale test, never run by default; select it with -m dedup_heavy",
|
|
83
|
+
"uid_lot(name): Unique ID plan (2026-10-23) lot that provides the tested behavior; skipped until the lot is enabled in tests/report/conftest.py",
|
|
84
|
+
"uid_t(*ids): requirement tests (T01 to T34 of the Unique ID specification) that the test covers",
|
|
83
85
|
"shipped_exposure_default: the test reads the shipped default of scan.exposure.sensitive_values (show), not the masking default the suite runs with",
|
|
84
86
|
]
|
|
85
87
|
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
+
|
|
5
|
+
"""CLI adapter for Tabalyst Generate."""
|
|
6
|
+
|
|
7
|
+
import sys
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from typing import Annotated
|
|
10
|
+
|
|
11
|
+
import typer
|
|
12
|
+
|
|
13
|
+
from tabalyst.cli.terminal import error_exit_code
|
|
14
|
+
from tabalyst.errors import TabalystError
|
|
15
|
+
from tabalyst.generate_service import (
|
|
16
|
+
GenerateProgress,
|
|
17
|
+
GenerateResult,
|
|
18
|
+
build_generate_plan,
|
|
19
|
+
generate_datasets,
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
PHASE_NAMES = {"rows": "generating rows", "errors": "injecting errors", "publish": "writing files"}
|
|
23
|
+
# Below this, a phase is noise in the report.
|
|
24
|
+
MIN_REPORTED_SECONDS = 0.05
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def format_duration(seconds: float) -> str:
|
|
28
|
+
"""A duration for people: tenths of a second under a minute, then minutes and seconds."""
|
|
29
|
+
if seconds < 60:
|
|
30
|
+
return f"{seconds:.1f}s"
|
|
31
|
+
minutes, rest = divmod(round(seconds), 60)
|
|
32
|
+
if minutes < 60:
|
|
33
|
+
return f"{minutes}m {rest:02d}s"
|
|
34
|
+
hours, minutes = divmod(minutes, 60)
|
|
35
|
+
return f"{hours}h {minutes:02d}m"
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class GenerateProgressPrinter:
|
|
39
|
+
"""One rewritten standard error line per stage, with the time left once it is known."""
|
|
40
|
+
|
|
41
|
+
def __init__(self, enabled: bool) -> None:
|
|
42
|
+
self.enabled = enabled
|
|
43
|
+
self._stage: str | None = None
|
|
44
|
+
self._stage_start = 0.0
|
|
45
|
+
self._width = 0
|
|
46
|
+
|
|
47
|
+
def __call__(self, event: GenerateProgress) -> None:
|
|
48
|
+
if not self.enabled or not event.total:
|
|
49
|
+
return
|
|
50
|
+
if event.stage != self._stage:
|
|
51
|
+
self._stage = event.stage
|
|
52
|
+
self._stage_start = event.elapsed_seconds
|
|
53
|
+
spent = event.elapsed_seconds - self._stage_start
|
|
54
|
+
message = f"{event.stage} {event.done:,}/{event.total:,} ({100 * event.done // event.total}%)"
|
|
55
|
+
if event.done >= event.total:
|
|
56
|
+
message += f" - {format_duration(spent)}"
|
|
57
|
+
elif event.done and spent >= 1:
|
|
58
|
+
message += (f" - {format_duration(spent)}, "
|
|
59
|
+
f"about {format_duration(spent * (event.total - event.done) / event.done)} left")
|
|
60
|
+
finished = event.done >= event.total
|
|
61
|
+
typer.echo(f"\r{message.ljust(self._width)}", nl=finished, err=True)
|
|
62
|
+
self._width = 0 if finished else max(self._width, len(message))
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def timing_report(result: GenerateResult) -> str:
|
|
66
|
+
"""The closing line: rows, total time, rate and where the time went."""
|
|
67
|
+
rows = sum(result.row_counts.values()) if len(result.row_counts) == 1 else None
|
|
68
|
+
text = f"Done in {format_duration(result.seconds)}"
|
|
69
|
+
if rows is not None:
|
|
70
|
+
text = f"{rows:,} rows in {format_duration(result.seconds)}"
|
|
71
|
+
if result.seconds > 0:
|
|
72
|
+
processes = f", {result.workers} processes" if result.workers > 1 else ""
|
|
73
|
+
text += f" ({rows / result.seconds:,.0f} rows/s{processes})"
|
|
74
|
+
changed = sum(result.anomaly_counts.values())
|
|
75
|
+
if changed:
|
|
76
|
+
profiles = {key.split("/", 1)[1] for key in result.anomaly_counts if "/" in key}
|
|
77
|
+
text += f", {changed:,} cells changed"
|
|
78
|
+
if len(profiles) > 1:
|
|
79
|
+
text += f" in {len(profiles)} profiles"
|
|
80
|
+
parts = [f"{PHASE_NAMES[name]} {format_duration(value)}"
|
|
81
|
+
for name, value in result.timings.items()
|
|
82
|
+
if name in PHASE_NAMES and value >= MIN_REPORTED_SECONDS]
|
|
83
|
+
return f"{text}: {', '.join(parts)}" if len(parts) > 1 else text
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def generate_command(
|
|
87
|
+
definition: Annotated[
|
|
88
|
+
Path | None,
|
|
89
|
+
typer.Argument(help="Generate definition or package directory."),
|
|
90
|
+
] = None,
|
|
91
|
+
example: Annotated[
|
|
92
|
+
str | None,
|
|
93
|
+
typer.Option("--example", help="Packaged example: crm, insurance, or computer."),
|
|
94
|
+
] = None,
|
|
95
|
+
output: Annotated[
|
|
96
|
+
Path | None,
|
|
97
|
+
typer.Option("--output", "-o", help="One CSV file (with --anomaly-profile: the CSV with errors, plus FILE.changes.csv)."),
|
|
98
|
+
] = None,
|
|
99
|
+
output_dir: Annotated[
|
|
100
|
+
Path | None,
|
|
101
|
+
typer.Option("--output-dir", "-d", help="Directory for all artifacts."),
|
|
102
|
+
] = None,
|
|
103
|
+
rows: Annotated[
|
|
104
|
+
int | None,
|
|
105
|
+
typer.Option("--rows", help="Number of generated rows."),
|
|
106
|
+
] = None,
|
|
107
|
+
seed: Annotated[
|
|
108
|
+
int | None,
|
|
109
|
+
typer.Option("--seed", help="Root random seed."),
|
|
110
|
+
] = None,
|
|
111
|
+
as_of_date: Annotated[
|
|
112
|
+
str | None,
|
|
113
|
+
typer.Option("--as-of-date", help="Reference date (YYYY-MM-DD)."),
|
|
114
|
+
] = None,
|
|
115
|
+
anomaly_profile: Annotated[
|
|
116
|
+
str | None,
|
|
117
|
+
typer.Option("--anomaly-profile", help="Inject errors. Computer: dirty_realistic, dirty_stress, unit_variants, unit_variants_extended; several, comma separated, with -d."),
|
|
118
|
+
] = None,
|
|
119
|
+
request: Annotated[
|
|
120
|
+
Path | None,
|
|
121
|
+
typer.Option("--request", help="JSON generation request."),
|
|
122
|
+
] = None,
|
|
123
|
+
generation_profile: Annotated[
|
|
124
|
+
str | None,
|
|
125
|
+
typer.Option("--generation-profile", help="Catalog selection profile."),
|
|
126
|
+
] = None,
|
|
127
|
+
output_profile: Annotated[
|
|
128
|
+
str | None,
|
|
129
|
+
typer.Option("--output-profile", help="Output column profile."),
|
|
130
|
+
] = None,
|
|
131
|
+
market: Annotated[
|
|
132
|
+
str | None,
|
|
133
|
+
typer.Option("--market", help="Offer market: ca or us."),
|
|
134
|
+
] = None,
|
|
135
|
+
locales: Annotated[
|
|
136
|
+
str | None,
|
|
137
|
+
typer.Option("--locales", help="Computer locales: en, fr or en,fr (default en with -o, en,fr with -d)."),
|
|
138
|
+
] = None,
|
|
139
|
+
unit_style: Annotated[
|
|
140
|
+
str | None,
|
|
141
|
+
typer.Option("--unit-style", help="Computer values: numeric or localized units."),
|
|
142
|
+
] = None,
|
|
143
|
+
unit_columns: Annotated[
|
|
144
|
+
str | None,
|
|
145
|
+
typer.Option("--unit-columns", help="Comma-separated Computer measurement columns to format with units."),
|
|
146
|
+
] = None,
|
|
147
|
+
validate_only: Annotated[
|
|
148
|
+
bool,
|
|
149
|
+
typer.Option("--validate-only", help="Validate a package without writing."),
|
|
150
|
+
] = False,
|
|
151
|
+
force: Annotated[
|
|
152
|
+
bool,
|
|
153
|
+
typer.Option("--force", "-f", help="Replace existing artifacts."),
|
|
154
|
+
] = False,
|
|
155
|
+
no_progress: Annotated[
|
|
156
|
+
bool,
|
|
157
|
+
typer.Option("--no-progress", help="Hide the progress line. It is also hidden outside a terminal."),
|
|
158
|
+
] = False,
|
|
159
|
+
workers: Annotated[
|
|
160
|
+
int | None,
|
|
161
|
+
typer.Option(
|
|
162
|
+
"--workers", min=1,
|
|
163
|
+
help=("Computer: processes that generate the rows, 1 for one process. By default, "
|
|
164
|
+
"5,000 rows or more use one per spare processor, at most 6."),
|
|
165
|
+
),
|
|
166
|
+
] = None,
|
|
167
|
+
) -> None:
|
|
168
|
+
"""Validate and generate datasets from a definition or package."""
|
|
169
|
+
try:
|
|
170
|
+
plan = build_generate_plan(
|
|
171
|
+
definition, example=example, output=output, output_dir=output_dir,
|
|
172
|
+
rows=rows, seed=seed, as_of_date=as_of_date,
|
|
173
|
+
anomaly_profile=anomaly_profile, force=force, request=request,
|
|
174
|
+
generation_profile=generation_profile, output_profile=output_profile,
|
|
175
|
+
market=market, locales=locales, unit_style=unit_style,
|
|
176
|
+
unit_columns=unit_columns,
|
|
177
|
+
validate_only=validate_only, workers=workers,
|
|
178
|
+
)
|
|
179
|
+
if validate_only:
|
|
180
|
+
typer.echo("Valid Generate package.", err=True)
|
|
181
|
+
return
|
|
182
|
+
result = generate_datasets(
|
|
183
|
+
plan, on_progress=GenerateProgressPrinter(not no_progress and sys.stderr.isatty()),
|
|
184
|
+
)
|
|
185
|
+
except TabalystError as exc:
|
|
186
|
+
typer.echo(f"Error: {exc}", err=True)
|
|
187
|
+
raise typer.Exit(error_exit_code(exc)) from exc
|
|
188
|
+
for path in result.paths:
|
|
189
|
+
typer.echo(f"Created: {path}", err=True)
|
|
190
|
+
typer.echo(timing_report(result), err=True)
|
|
@@ -250,6 +250,18 @@ def report_command(
|
|
|
250
250
|
),
|
|
251
251
|
),
|
|
252
252
|
] = False,
|
|
253
|
+
dedup_report: Annotated[
|
|
254
|
+
Path | None,
|
|
255
|
+
typer.Option(
|
|
256
|
+
"--dedup-report",
|
|
257
|
+
help=(
|
|
258
|
+
"A Dedup report (.dedup.json), or the folder holding the one of each "
|
|
259
|
+
"source, that proves the copies of rows behind the uniqueness of "
|
|
260
|
+
"identifier columns. CSV sources only. Without it, the report beside "
|
|
261
|
+
"each source is tried."
|
|
262
|
+
),
|
|
263
|
+
),
|
|
264
|
+
] = None,
|
|
253
265
|
yes: Annotated[
|
|
254
266
|
bool,
|
|
255
267
|
typer.Option(
|
|
@@ -292,6 +304,7 @@ def report_command(
|
|
|
292
304
|
all_collections=all_collections,
|
|
293
305
|
deep=deep,
|
|
294
306
|
confirm=confirm,
|
|
307
|
+
dedup_report=dedup_report,
|
|
295
308
|
)
|
|
296
309
|
except ConfirmationRequired as exc:
|
|
297
310
|
if decisions and decisions[-1] is Decision.DECLINED:
|
|
@@ -118,6 +118,10 @@ class PresentationSettings(BaseModel):
|
|
|
118
118
|
default_factory=ValueExamplesSettings
|
|
119
119
|
)
|
|
120
120
|
row_sample: RowSampleSettings = Field(default_factory=RowSampleSettings)
|
|
121
|
+
# A Dedup report (file) or the folder holding ``<source stem>.dedup.json``: the proof of
|
|
122
|
+
# the copies of rows behind ``identifier_uniqueness``. A CSV source only; the path is not
|
|
123
|
+
# stored in the Report, which names the file only.
|
|
124
|
+
dedup_report: str | None = None
|
|
121
125
|
|
|
122
126
|
|
|
123
127
|
class OutputSettings(BaseModel):
|
|
@@ -349,6 +353,23 @@ class DuplicateSettings(BaseModel):
|
|
|
349
353
|
records: bool = False
|
|
350
354
|
|
|
351
355
|
|
|
356
|
+
class CopySettings(BaseModel):
|
|
357
|
+
"""The ceilings of the count of the extra copies of rows (design 20.40).
|
|
358
|
+
|
|
359
|
+
``memory_mb`` is the accounted size of the table of distinct rows, ``disk_mb``
|
|
360
|
+
the estimated size of the temporary database that takes over when the table
|
|
361
|
+
passes it (``0`` forbids the disk), ``max_rows`` the records read. A count that
|
|
362
|
+
meets a ceiling stops and is ``limited``: its copies are a lower bound. All are
|
|
363
|
+
part of the key of a result, and none depends on a clock or a machine.
|
|
364
|
+
"""
|
|
365
|
+
|
|
366
|
+
model_config = ConfigDict(extra="forbid", frozen=True)
|
|
367
|
+
|
|
368
|
+
memory_mb: int = Field(default=256, ge=1, le=1_048_576)
|
|
369
|
+
disk_mb: int = Field(default=2_048, ge=0, le=16_777_216)
|
|
370
|
+
max_rows: int = Field(default=10_000_000, ge=1)
|
|
371
|
+
|
|
372
|
+
|
|
352
373
|
class PatternCountSettings(BaseModel):
|
|
353
374
|
"""How the validation of the patterns is bounded in memory (design 20.9).
|
|
354
375
|
|
|
@@ -520,6 +541,7 @@ class DeepSettings(BaseModel):
|
|
|
520
541
|
patterns: PatternCountSettings = Field(default_factory=PatternCountSettings)
|
|
521
542
|
residuals: ResidualSettings = Field(default_factory=ResidualSettings)
|
|
522
543
|
duplicates: DuplicateSettings = Field(default_factory=DuplicateSettings)
|
|
544
|
+
copies: CopySettings = Field(default_factory=CopySettings)
|
|
523
545
|
drift: DriftSettings = Field(default_factory=DriftSettings)
|
|
524
546
|
date_order: DateOrderSettings = Field(default_factory=DateOrderSettings)
|
|
525
547
|
missing: MissingSettings = Field(default_factory=MissingSettings)
|
|
@@ -123,7 +123,7 @@ def analyze_dedup(
|
|
|
123
123
|
path = Path(source)
|
|
124
124
|
started = time.perf_counter()
|
|
125
125
|
before = stat_source(path)
|
|
126
|
-
forward =
|
|
126
|
+
forward = staged(on_progress)
|
|
127
127
|
spilled_at: int | None = None
|
|
128
128
|
|
|
129
129
|
def spilled(event: SpillEvent) -> None:
|
|
@@ -204,7 +204,7 @@ def source_changed_error(records_read: int) -> DedupInputError:
|
|
|
204
204
|
)
|
|
205
205
|
|
|
206
206
|
|
|
207
|
-
def
|
|
207
|
+
def staged(callback: ProgressCallback | None) -> ProgressCallback | None:
|
|
208
208
|
"""Name the stage on every event that the pass emits."""
|
|
209
209
|
if callback is None:
|
|
210
210
|
return None
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
+
|
|
5
|
+
"""The versions of the counts of the copies of rows, apart from the engine so the planner can read them."""
|
|
6
|
+
|
|
7
|
+
# Changes with any change of what the count means (identity, ceilings, order of the checks). The
|
|
8
|
+
# analyzer ``duplicate_rows_count`` takes it as its version, so stored results of an older count
|
|
9
|
+
# are stale (Unique ID lot 8, cahier 12.5).
|
|
10
|
+
CALCULATION_VERSION = 1
|
|
11
|
+
|
|
12
|
+
# The same for the light count of the copies of the rows that have no ID (``missing_id_copies``,
|
|
13
|
+
# Unique ID lot 10): what it counts, the identity of the rows, the order of the checks.
|
|
14
|
+
MISSING_CALCULATION_VERSION = 1
|