tabalyst 0.7.1__tar.gz → 0.7.2__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.2}/PKG-INFO +7 -1
- {tabalyst-0.7.1 → tabalyst-0.7.2}/README.md +6 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/pyproject.toml +3 -1
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/cli/report.py +13 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/config.py +22 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/dedup/analysis.py +2 -2
- tabalyst-0.7.2/src/tabalyst/dedup/calculation.py +14 -0
- tabalyst-0.7.2/src/tabalyst/dedup/count_only.py +321 -0
- tabalyst-0.7.2/src/tabalyst/identifier_uniqueness/__init__.py +33 -0
- tabalyst-0.7.2/src/tabalyst/identifier_uniqueness/facts.py +462 -0
- tabalyst-0.7.2/src/tabalyst/identifier_uniqueness/models.py +278 -0
- tabalyst-0.7.2/src/tabalyst/identifier_uniqueness/near_unique.py +59 -0
- tabalyst-0.7.2/src/tabalyst/identifier_uniqueness/proof.py +130 -0
- tabalyst-0.7.2/src/tabalyst/identifier_uniqueness/rule.py +396 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/models.py +2 -2
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_chain.py +5 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_classification.py +4 -4
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_column_page.py +12 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_deep.py +32 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_labels.py +99 -5
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_profile.py +15 -3
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_service.py +17 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_summary.py +25 -5
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_table.py +7 -0
- tabalyst-0.7.2/src/tabalyst/report_uniqueness.py +350 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/reporting.py +2 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/classify/identifiers.py +3 -2
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzer.py +30 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/__init__.py +6 -0
- tabalyst-0.7.2/src/tabalyst/scanner/planner/analyzers/analytical.py +91 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/common.py +4 -0
- tabalyst-0.7.2/src/tabalyst/scanner/planner/analyzers/copies.py +108 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/distinct.py +12 -2
- tabalyst-0.7.2/src/tabalyst/scanner/planner/analyzers/missing_copies.py +114 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/costmodel.py +29 -1
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/facts.py +161 -48
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/planner.py +50 -5
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/reasons.py +13 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/secondpass.py +6 -3
- tabalyst-0.7.2/src/tabalyst/scanner/secondpass/analytical.py +90 -0
- tabalyst-0.7.2/src/tabalyst/scanner/secondpass/copies.py +115 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/executor.py +110 -13
- tabalyst-0.7.2/src/tabalyst/scanner/secondpass/missing_copies.py +140 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/models.py +86 -1
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/routing.py +14 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/schemas/tabalyst.report.schema.json +957 -4
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/schemas/tabalyst.scan.deep.schema.json +277 -2
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/service.py +48 -5
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/static/theme.css +10 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/summary_models.py +4 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/templates/column.html +14 -2
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/templates/report.html +2 -2
- {tabalyst-0.7.1 → tabalyst-0.7.2/src/tabalyst.egg-info}/PKG-INFO +7 -1
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst.egg-info/SOURCES.txt +15 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/LICENSE +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/MANIFEST.in +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/examples/README.md +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/examples/config.json +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/examples/datasets/basic.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/examples/datasets/insurance-customers.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/examples/generate/README.md +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/examples/generate/cohorts-anomalies/catalog.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/examples/generate/cohorts-anomalies/dataset.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/examples/generate/cohorts-anomalies/schemas/accounts.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/examples/generate/cohorts-anomalies/schemas/contacts.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/examples/generate/common-references/catalog.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/examples/generate/common-references/dataset.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/examples/generate/common-references/schemas/contacts.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/examples/generate/generate_examples.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/setup.cfg +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/__init__.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/__main__.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/_version.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/batch.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/cache_service.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/cli/__init__.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/cli/app.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/cli/cache.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/cli/confirm.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/cli/dedup.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/cli/generate.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/cli/inspect.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/cli/sample.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/cli/scan.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/cli/terminal.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/csv_records.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/dedup/__init__.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/dedup/batch_report.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/dedup/cache.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/dedup/discovery.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/dedup/diskstore.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/dedup/failures.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/dedup/groups.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/dedup/identity.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/dedup/pipeline.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/dedup/publish.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/dedup/report.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/dedup/settings.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/dedup/store.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/dedup/tiered.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/dedup/writer.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/dedup_service.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/deep_service.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/deep_store.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/errors.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/execution_log.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_anomalies.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_columns_package.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_computer.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_computer_output.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_csv.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_definition.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/SOURCES.md +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/catalog.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/brand.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/color.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/computer_type.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/computer_type_form_factor.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/computer_type_product_segment.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/cpu.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/cpu_memory_weight.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/cpu_operating_system.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/display.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/extended_specs.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/form_factor.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/generation_color.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/generation_cpu.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/generation_display.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/generation_gpu.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/generation_memory.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/generation_operating_system.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/generation_profile.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/generation_profile_computer_type.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/generation_profile_segment.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/generation_storage.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/gpu.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/gpu_display.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/gpu_memory_weight.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/gpu_storage_weight.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/memory.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/model_form_factor.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/model_generation.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/operating_system.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/product_category.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/product_family.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/product_family_computer_type.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/product_family_product_segment.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/product_model.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/product_segment.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/product_segment_brand.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/product_segment_display_weight.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/product_segment_memory_weight.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/product_segment_storage_weight.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/product_subcategory.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/profile_exclusions.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/promotion_status.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/promotion_type.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/seller.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/seller_type.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/shipping_availability.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/standard_specs.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/storage.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/data/warehouse.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/dataset.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/computer_type.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/computer_type_form_factor.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/computer_type_product_segment.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/computers.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/cpu.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/cpu_memory_weight.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/cpu_operating_system.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/display.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/extended_specs.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/generation_color.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/generation_cpu.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/generation_display.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/generation_gpu.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/generation_memory.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/generation_operating_system.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/generation_profile.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/generation_profile_computer_type.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/generation_profile_segment.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/generation_storage.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/gpu.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/gpu_display.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/gpu_memory_weight.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/gpu_storage_weight.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/localized.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/memory.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/model_form_factor.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/model_generation.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/operating_system.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/product_family.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/product_family_computer_type.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/product_family_product_segment.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/product_model.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/product_segment.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/product_segment_brand.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/product_segment_display_weight.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/product_segment_memory_weight.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/product_segment_storage_weight.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/product_subcategory.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/profile_exclusions.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/seller.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/standard_specs.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/storage.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/computer/schemas/warehouse.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/crm/catalog.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/crm/dataset.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/crm/schemas/accounts.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/crm/schemas/contacts.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/insurance/SOURCES.md +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/insurance/catalog.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/insurance/data/agencies.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/insurance/data/branch_contract_weights.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/insurance/data/claim_statuses.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/insurance/data/contract_statuses.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/insurance/data/contract_types.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/insurance/data/payment_frequencies.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/insurance/data/payment_methods.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/insurance/dataset.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/insurance/schemas/agencies.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/insurance/schemas/branch_contract_weights.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/insurance/schemas/claim_statuses.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/insurance/schemas/contract_statuses.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/insurance/schemas/contract_types.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/insurance/schemas/customers.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/insurance/schemas/payment_frequencies.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_examples/insurance/schemas/payment_methods.yaml +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_insurance.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_package.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_references.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_resources/SOURCES.md +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_resources/addresses/street_directions_ca.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_resources/addresses/street_names_ca.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_resources/addresses/street_types_ca.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_resources/addresses/unit_types_ca.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_resources/contact/email_patterns.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_resources/contact/email_providers_ca.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_resources/contact/phone_area_codes_ca.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_resources/geography/cities_ca.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_resources/geography/postal_prefixes_ca.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_resources/geography/provinces_ca.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_resources/people/family_names_ca.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_resources/people/first_names_en_ca.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_resources/people/first_names_fr_qc.csv +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_selection.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_service.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/generate_values.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/inspect_service.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/inspector/__init__.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/inspector/choices.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/inspector/excel_inspect/__init__.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/inspector/excel_inspect/build.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/inspector/excel_inspect/detect.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/inspector/excel_inspect/parameters.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/inspector/json_inspect/__init__.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/inspector/json_inspect/build.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/inspector/json_inspect/detect.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/inspector/json_inspect/parameters.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/inspector/models.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/inspector/persistence.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/inspector/resolution.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/json_text.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/option_notices.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/plan_service.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/progress.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/project_open_service.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/project_scan_service.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/__init__.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/_bounded_values.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/_cache.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/_codec.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/_generation.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/_locks.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/_publication.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/_queries.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/_query_budget.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/_recovery.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/_retention.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/_schema.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/_session.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/_staging.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/_sync.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/_validation.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/catalog.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/freshness.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/identity.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/index.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/location.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/models.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/projects/store.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_config.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_details.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_finding_details.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_findings.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_insights.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_measures.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_overview.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_plan.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_preview.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_relations.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_schema.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_sections.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_signals.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/report_views.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/result_model.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/sample_page.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/sampling.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/sampling_service.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scan_document.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scan_page.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scan_reuse.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scan_service.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/__init__.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/api.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/bottomk.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/cases.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/charactermap.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/characters.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/classify/__init__.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/classify/candidates.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/classify/catalog.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/classify/models.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/classify/names.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/classify/rules.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/config.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/convention_rule.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/correlation_ratio.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/crosstab.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/detectors/__init__.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/detectors/amount.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/detectors/base.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/detectors/boolean.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/detectors/currency.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/detectors/email.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/detectors/enumeration.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/detectors/ip.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/detectors/keys.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/detectors/names.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/detectors/number.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/detectors/pattern.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/detectors/percentage.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/detectors/phone.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/detectors/postal.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/detectors/quantity.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/detectors/registry.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/detectors/shape.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/detectors/temporal.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/detectors/url.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/detectors/uuid.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/diagnostics.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/engine.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/exposure.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/features.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/field.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/identity.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/lengthsample.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/longtext.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/measures.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/memory.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/models.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/normalization.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/observations.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/paths.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/pattern_eligibility.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/patternfacets.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/patterninfer.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/patterntree.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/pearson.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/__init__.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/characters.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/crosstab.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/date_order.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/drift.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/duplicates.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/forms.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/frequencies.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/histogram.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/lengths.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/matrix.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/measures.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/parts.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/patterns.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/pearson.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/residuals.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/shape.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/stats.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/structure.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/temporal.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/analyzers/texts.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/categorystats.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/crosstabs.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/identifiers.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/models.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/orders.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/registry.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/relations.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/render.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/samplerows.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/stratification.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/planner/stratmodels.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/process.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/quality.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/rankcorr.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/readers/__init__.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/readers/base.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/readers/csv_reader.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/readers/excel_common.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/readers/excel_reader.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/readers/excel_table.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/readers/factory.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/readers/json_common.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/readers/json_reader.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/readers/jsonl_reader.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/records.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/rowsample.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/schema.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/__init__.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/accumulators.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/bins.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/boundaries.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/characters.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/crosstab.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/document.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/drift.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/duplicates.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/exactset.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/forms.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/frequencies.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/matrix.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/measures.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/orders.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/parallel.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/parts.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/patternreader.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/patterns.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/pearson.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/periods.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/ranks.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/replay.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/residuals.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/schema.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/shape.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/stats.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/structure.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/secondpass/texts.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/smart/__init__.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/smart/bins.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/smart/estimate.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/smart/evaluate.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/smart/execute.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/smart/models.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/smart/near.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/smart/plan.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/smart/reasons.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/smart/render.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/smart/result.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/smart/select.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/smart/targets.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/smart/weights.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/stratify.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/structure.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/technical.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/validation.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/values.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/valuesample.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/scanner/workers.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/schemas/tabalyst.dedup.batch.schema.json +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/schemas/tabalyst.dedup.schema.json +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/schemas/tabalyst.sample.schema.json +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/schemas/tabalyst.scan.schema.json +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/shared_scan_service.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/smart_service.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/source_guard.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/static/report.js +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/templates/characters.html +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/templates/insights.html +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/templates/patterns.html +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst/templates/sample.html +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst.egg-info/dependency_links.txt +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst.egg-info/entry_points.txt +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst.egg-info/requires.txt +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/src/tabalyst.egg-info/top_level.txt +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_all_collections.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_cli.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_csv_records.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_examples_index.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_examples_layout.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_generate.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_generate_anomalies.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_generate_anomalies_regression.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_generate_computer_catalog.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_generate_computer_components.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_generate_computer_derivations.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_generate_computer_hierarchy.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_generate_computer_output.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_generate_computer_service.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_generate_crm.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_generate_crm_package.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_generate_insurance.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_generate_insurance_stress.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_generate_lot4.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_generate_package.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_generate_references.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_generate_selection.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_json_text.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_license_headers.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_make_datasets.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_option_notices.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_project_cache.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_project_database.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_project_generations.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_project_identity.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_project_index.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_project_location.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_project_open_service.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_project_queries.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_project_rescan.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_project_scan.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_project_scan_model.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_project_sessions.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_project_store.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_public_api.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_report_contrast.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_reporting.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_sampling.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_scan_command.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_scanner_amounts.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_scanner_batches.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_scanner_config.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_scanner_csv.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_scanner_email_url.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_scanner_exposure.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_scanner_paths.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_scanner_phone.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_scanner_postal.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_scanner_uuid_ip.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/tests/test_shared_scan_cli.py +0 -0
- {tabalyst-0.7.1 → tabalyst-0.7.2}/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.2
|
|
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.
|
|
@@ -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.
|
|
@@ -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.2"
|
|
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
|
|
|
@@ -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
|
|
@@ -0,0 +1,321 @@
|
|
|
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
|
+
"""Count-only modes of Dedup: the exact count of the extra copies of rows, whole or among the rows
|
|
6
|
+
without an ID, with ceilings and no output."""
|
|
7
|
+
|
|
8
|
+
import time
|
|
9
|
+
from collections.abc import Callable
|
|
10
|
+
from dataclasses import dataclass
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
from typing import Literal
|
|
13
|
+
|
|
14
|
+
from tabalyst.config import CsvConfig
|
|
15
|
+
from tabalyst.csv_records import CsvRecordError, open_records
|
|
16
|
+
from tabalyst.dedup.analysis import (
|
|
17
|
+
source_changed_error,
|
|
18
|
+
staged,
|
|
19
|
+
stat_differs,
|
|
20
|
+
stat_source,
|
|
21
|
+
)
|
|
22
|
+
from tabalyst.dedup.calculation import CALCULATION_VERSION, MISSING_CALCULATION_VERSION
|
|
23
|
+
from tabalyst.dedup.diskstore import MIB
|
|
24
|
+
from tabalyst.dedup.failures import DedupInputError
|
|
25
|
+
from tabalyst.dedup.groups import GroupCounters
|
|
26
|
+
from tabalyst.dedup.identity import IDENTITY, canonical_key
|
|
27
|
+
from tabalyst.dedup.settings import require_positive_int
|
|
28
|
+
from tabalyst.dedup.store import ExactRowStore, MemoryRowStore
|
|
29
|
+
from tabalyst.dedup.tiered import TieredRowStore, estimate_disk_bytes
|
|
30
|
+
from tabalyst.errors import ConfigurationError
|
|
31
|
+
from tabalyst.progress import ProgressCallback, byte_progress
|
|
32
|
+
|
|
33
|
+
CopyStatus = Literal["exact", "limited"]
|
|
34
|
+
LimitReason = Literal["memory_budget", "disk_budget", "row_limit"]
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@dataclass(frozen=True)
|
|
38
|
+
class CopyLimits:
|
|
39
|
+
"""The ceilings of one count, all deterministic (they never depend on a clock).
|
|
40
|
+
|
|
41
|
+
``memory_budget_mb`` is the accounted size of the table of distinct rows, as for
|
|
42
|
+
``tabalyst dedup``. ``disk_budget_mb`` is the estimated size of the temporary
|
|
43
|
+
database that takes over when the table passes it; ``0`` forbids the disk, so the
|
|
44
|
+
count stops at the memory budget. ``max_rows`` is the number of records read.
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
max_rows: int
|
|
48
|
+
memory_budget_mb: int
|
|
49
|
+
disk_budget_mb: int
|
|
50
|
+
temp_dir: Path | None = None
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
@dataclass(frozen=True)
|
|
54
|
+
class CopyCount:
|
|
55
|
+
"""What a count-only run proves about the rows of a CSV file.
|
|
56
|
+
|
|
57
|
+
``exact`` counts every record of the file. ``limited`` stopped at a ceiling after
|
|
58
|
+
``records_read`` records: ``extra_copies`` and ``duplicate_groups`` are then lower
|
|
59
|
+
bounds of the file's, ``distinct_rows`` is the number of distinct rows among the
|
|
60
|
+
records read. ``content_sha256`` is the digest of the whole file and is only known
|
|
61
|
+
when the reading went to its end.
|
|
62
|
+
"""
|
|
63
|
+
|
|
64
|
+
status: CopyStatus
|
|
65
|
+
records_read: int
|
|
66
|
+
distinct_rows: int
|
|
67
|
+
extra_copies: int
|
|
68
|
+
duplicate_groups: int
|
|
69
|
+
reason: LimitReason | None
|
|
70
|
+
content_sha256: str | None
|
|
71
|
+
bytes_read: int
|
|
72
|
+
storage_mode: str
|
|
73
|
+
seconds: float
|
|
74
|
+
identity: str = IDENTITY
|
|
75
|
+
calculation_version: int = CALCULATION_VERSION
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
@dataclass(frozen=True)
|
|
79
|
+
class IdColumn:
|
|
80
|
+
"""A column whose absent cells the light count follows: ``key`` names it for the caller and
|
|
81
|
+
``index`` is its 0-based position in a record."""
|
|
82
|
+
|
|
83
|
+
key: str
|
|
84
|
+
index: int
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
@dataclass(frozen=True)
|
|
88
|
+
class ColumnCopies:
|
|
89
|
+
"""The rows of a file whose cell in one column is absent: how many records, how many of them
|
|
90
|
+
are distinct rows and how many repeat an earlier row (``E_missing``, lower bounds when the
|
|
91
|
+
count stopped)."""
|
|
92
|
+
|
|
93
|
+
key: str
|
|
94
|
+
rows_without_id: int
|
|
95
|
+
distinct_rows_without_id: int
|
|
96
|
+
extra_copies_without_id: int
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
@dataclass(frozen=True)
|
|
100
|
+
class MissingCopyCount:
|
|
101
|
+
"""What a light count proves about the copies of the rows that have no ID.
|
|
102
|
+
|
|
103
|
+
The shape of ``CopyCount``: ``exact`` read the whole file (``content_sha256`` is then its
|
|
104
|
+
digest), ``limited`` stopped at a ceiling after ``records_read`` records and every figure of
|
|
105
|
+
``columns`` is a lower bound.
|
|
106
|
+
"""
|
|
107
|
+
|
|
108
|
+
status: CopyStatus
|
|
109
|
+
records_read: int
|
|
110
|
+
columns: tuple[ColumnCopies, ...]
|
|
111
|
+
reason: LimitReason | None
|
|
112
|
+
content_sha256: str | None
|
|
113
|
+
bytes_read: int
|
|
114
|
+
storage_mode: str
|
|
115
|
+
seconds: float
|
|
116
|
+
identity: str = IDENTITY
|
|
117
|
+
calculation_version: int = MISSING_CALCULATION_VERSION
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
@dataclass(frozen=True)
|
|
121
|
+
class _Reading:
|
|
122
|
+
"""How a reading of the rows ended, whatever it counted."""
|
|
123
|
+
|
|
124
|
+
read: int
|
|
125
|
+
reason: LimitReason | None
|
|
126
|
+
digest: str | None
|
|
127
|
+
bytes_read: int
|
|
128
|
+
storage_mode: str
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def _check_limits(limits: CopyLimits) -> None:
|
|
132
|
+
require_positive_int("max_rows", limits.max_rows)
|
|
133
|
+
require_positive_int("memory_budget_mb", limits.memory_budget_mb)
|
|
134
|
+
if limits.disk_budget_mb < 0:
|
|
135
|
+
raise ConfigurationError("disk_budget_mb must be 0 or more.")
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def _read(
|
|
139
|
+
path: Path,
|
|
140
|
+
csv: CsvConfig,
|
|
141
|
+
limits: CopyLimits,
|
|
142
|
+
on_progress: ProgressCallback | None,
|
|
143
|
+
observe: Callable[[list[str], int, ExactRowStore], int | None],
|
|
144
|
+
) -> _Reading:
|
|
145
|
+
"""Read ``path`` once and hand each record to ``observe``, within the ceilings.
|
|
146
|
+
|
|
147
|
+
``observe`` returns the length of the key of a row it added to the store (a distinct row), or
|
|
148
|
+
``None`` when it added none. The reading stops at the first ceiling; the temporary database,
|
|
149
|
+
if any, is deleted whatever happens. Raises ``DedupInputError`` as ``count_extra_copies``.
|
|
150
|
+
"""
|
|
151
|
+
before = stat_source(path)
|
|
152
|
+
forward = staged(on_progress)
|
|
153
|
+
memory_bytes = limits.memory_budget_mb * MIB
|
|
154
|
+
disk_bytes = limits.disk_budget_mb * MIB
|
|
155
|
+
store: ExactRowStore
|
|
156
|
+
if disk_bytes:
|
|
157
|
+
store = TieredRowStore(memory_bytes, limits.temp_dir)
|
|
158
|
+
else:
|
|
159
|
+
store = MemoryRowStore()
|
|
160
|
+
key_bytes = 0
|
|
161
|
+
distinct = 0
|
|
162
|
+
read = 0
|
|
163
|
+
reason: LimitReason | None = None
|
|
164
|
+
digest: str | None = None
|
|
165
|
+
try:
|
|
166
|
+
with open_records(
|
|
167
|
+
path,
|
|
168
|
+
csv,
|
|
169
|
+
hash_content=True,
|
|
170
|
+
on_bytes=byte_progress(forward, path, before.st_size),
|
|
171
|
+
) as records:
|
|
172
|
+
for position, row in enumerate(records):
|
|
173
|
+
if position >= limits.max_rows:
|
|
174
|
+
reason = "row_limit"
|
|
175
|
+
break
|
|
176
|
+
read = position + 1
|
|
177
|
+
added = observe(row, position, store)
|
|
178
|
+
if added is None:
|
|
179
|
+
continue
|
|
180
|
+
key_bytes += added
|
|
181
|
+
distinct += 1
|
|
182
|
+
if isinstance(store, MemoryRowStore):
|
|
183
|
+
if store.accounted_bytes > memory_bytes:
|
|
184
|
+
reason = "memory_budget"
|
|
185
|
+
break
|
|
186
|
+
elif store.storage_mode == "disk" and (
|
|
187
|
+
estimate_disk_bytes(key_bytes, distinct) > disk_bytes
|
|
188
|
+
):
|
|
189
|
+
reason = "disk_budget"
|
|
190
|
+
break
|
|
191
|
+
if reason is None:
|
|
192
|
+
digest = records.content_digest()
|
|
193
|
+
bytes_read = records.bytes_read
|
|
194
|
+
storage_mode = store.storage_mode
|
|
195
|
+
except CsvRecordError as exc:
|
|
196
|
+
# A file rewritten during the read often looks malformed: say what changed.
|
|
197
|
+
if stat_differs(before, stat_source(path)):
|
|
198
|
+
raise source_changed_error(exc.records_read) from exc
|
|
199
|
+
message = (
|
|
200
|
+
"The source cannot be opened or read."
|
|
201
|
+
if exc.kind == "source_unreadable"
|
|
202
|
+
else str(exc)
|
|
203
|
+
)
|
|
204
|
+
raise DedupInputError(
|
|
205
|
+
message, reason=exc.kind, records_read=exc.records_read
|
|
206
|
+
) from exc
|
|
207
|
+
finally:
|
|
208
|
+
store.close()
|
|
209
|
+
if stat_differs(before, stat_source(path)) or (
|
|
210
|
+
reason is None and bytes_read != before.st_size
|
|
211
|
+
):
|
|
212
|
+
raise source_changed_error(read)
|
|
213
|
+
return _Reading(read, reason, digest, bytes_read, storage_mode)
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
def count_extra_copies(
|
|
217
|
+
source: str | Path,
|
|
218
|
+
*,
|
|
219
|
+
csv: CsvConfig,
|
|
220
|
+
limits: CopyLimits,
|
|
221
|
+
on_progress: ProgressCallback | None = None,
|
|
222
|
+
) -> CopyCount:
|
|
223
|
+
"""Read ``source`` once and count its extra copies of rows, writing nothing.
|
|
224
|
+
|
|
225
|
+
The rows are compared as ``tabalyst dedup`` compares them (``full_decoded_csv_row_v1``,
|
|
226
|
+
whole and without normalization), so an ``exact`` result equals ``extra_copies`` of
|
|
227
|
+
``dedup_csv``. The ceilings stop the reading cleanly: the copies met so far are a lower
|
|
228
|
+
bound, never a count. The temporary database, if any, is deleted whatever happens and
|
|
229
|
+
no other file is created.
|
|
230
|
+
|
|
231
|
+
Raises ``DedupInputError`` for an unreadable or malformed source (``invalid_csv``,
|
|
232
|
+
``encoding_error``, ``source_unreadable``) and for a source whose size or time changed
|
|
233
|
+
during the reading (``source_changed``); ``DedupReportError`` for a storage failure.
|
|
234
|
+
``ConfigurationError`` if a ceiling is below its minimum.
|
|
235
|
+
"""
|
|
236
|
+
_check_limits(limits)
|
|
237
|
+
path = Path(source)
|
|
238
|
+
started = time.perf_counter()
|
|
239
|
+
counters = GroupCounters()
|
|
240
|
+
|
|
241
|
+
def observe(row: list[str], position: int, store: ExactRowStore) -> int | None:
|
|
242
|
+
key = canonical_key(row)
|
|
243
|
+
occurrence = store.observe(key, position)
|
|
244
|
+
counters.update(occurrence.count)
|
|
245
|
+
return len(key) if occurrence.count == 1 else None
|
|
246
|
+
|
|
247
|
+
reading = _read(path, csv, limits, on_progress, observe)
|
|
248
|
+
stats = counters.stats()
|
|
249
|
+
stats.check()
|
|
250
|
+
return CopyCount(
|
|
251
|
+
status="exact" if reading.reason is None else "limited",
|
|
252
|
+
records_read=stats.total,
|
|
253
|
+
distinct_rows=stats.distinct,
|
|
254
|
+
extra_copies=stats.extra_copies,
|
|
255
|
+
duplicate_groups=stats.duplicate_groups,
|
|
256
|
+
reason=reading.reason,
|
|
257
|
+
content_sha256=reading.digest,
|
|
258
|
+
bytes_read=reading.bytes_read,
|
|
259
|
+
storage_mode=reading.storage_mode,
|
|
260
|
+
seconds=time.perf_counter() - started,
|
|
261
|
+
)
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
def count_missing_id_copies(
|
|
265
|
+
source: str | Path,
|
|
266
|
+
*,
|
|
267
|
+
csv: CsvConfig,
|
|
268
|
+
limits: CopyLimits,
|
|
269
|
+
columns: tuple[IdColumn, ...],
|
|
270
|
+
is_present: Callable[[str], bool],
|
|
271
|
+
on_progress: ProgressCallback | None = None,
|
|
272
|
+
) -> MissingCopyCount:
|
|
273
|
+
"""Read ``source`` once and count, per column, the copies of the rows whose cell is absent.
|
|
274
|
+
|
|
275
|
+
``is_present`` says whether a cell holds a value (the caller gives the Scan's definition).
|
|
276
|
+
Only the rows that lack a value in at least one of ``columns`` are keyed and stored, so the
|
|
277
|
+
table follows the number of such rows and not the size of the file; every other row costs
|
|
278
|
+
its reading alone. A copy of a row repeats the whole row, so the absence of a value is the
|
|
279
|
+
same in all of its copies and ``extra_copies_without_id`` of a column is exactly the copies
|
|
280
|
+
of the rows that lack its value (``E_missing``). Rows are compared as in
|
|
281
|
+
``count_extra_copies``. The ceilings, the files and the errors are those of that function.
|
|
282
|
+
"""
|
|
283
|
+
_check_limits(limits)
|
|
284
|
+
if not columns:
|
|
285
|
+
raise ConfigurationError("count_missing_id_copies needs at least one column.")
|
|
286
|
+
path = Path(source)
|
|
287
|
+
started = time.perf_counter()
|
|
288
|
+
rows = [0] * len(columns)
|
|
289
|
+
distinct = [0] * len(columns)
|
|
290
|
+
extra = [0] * len(columns)
|
|
291
|
+
indexes = [column.index for column in columns]
|
|
292
|
+
|
|
293
|
+
def observe(row: list[str], position: int, store: ExactRowStore) -> int | None:
|
|
294
|
+
absent = [n for n, index in enumerate(indexes) if not is_present(row[index])]
|
|
295
|
+
if not absent:
|
|
296
|
+
return None
|
|
297
|
+
key = canonical_key(row)
|
|
298
|
+
occurrence = store.observe(key, position)
|
|
299
|
+
first = occurrence.count == 1
|
|
300
|
+
for n in absent:
|
|
301
|
+
rows[n] += 1
|
|
302
|
+
if first:
|
|
303
|
+
distinct[n] += 1
|
|
304
|
+
else:
|
|
305
|
+
extra[n] += 1
|
|
306
|
+
return len(key) if first else None
|
|
307
|
+
|
|
308
|
+
reading = _read(path, csv, limits, on_progress, observe)
|
|
309
|
+
return MissingCopyCount(
|
|
310
|
+
status="exact" if reading.reason is None else "limited",
|
|
311
|
+
records_read=reading.read,
|
|
312
|
+
columns=tuple(
|
|
313
|
+
ColumnCopies(column.key, rows[n], distinct[n], extra[n])
|
|
314
|
+
for n, column in enumerate(columns)
|
|
315
|
+
),
|
|
316
|
+
reason=reading.reason,
|
|
317
|
+
content_sha256=reading.digest,
|
|
318
|
+
bytes_read=reading.bytes_read,
|
|
319
|
+
storage_mode=reading.storage_mode,
|
|
320
|
+
seconds=time.perf_counter() - started,
|
|
321
|
+
)
|
|
@@ -0,0 +1,33 @@
|
|
|
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
|
+
"""Identifier uniqueness: separate ID repetitions explained by copied rows from residual ones."""
|
|
6
|
+
|
|
7
|
+
from tabalyst.identifier_uniqueness.models import (
|
|
8
|
+
NEAR_UNIQUE_VERSION,
|
|
9
|
+
RULE_VERSION,
|
|
10
|
+
DedupReportRef,
|
|
11
|
+
DistinctEvidence,
|
|
12
|
+
DuplicateEvidence,
|
|
13
|
+
IdentifierUniqueness,
|
|
14
|
+
NearUnique,
|
|
15
|
+
RejectedProof,
|
|
16
|
+
UniquenessFacts,
|
|
17
|
+
)
|
|
18
|
+
from tabalyst.identifier_uniqueness.near_unique import assess_near_unique
|
|
19
|
+
from tabalyst.identifier_uniqueness.rule import assess_identifier_uniqueness
|
|
20
|
+
|
|
21
|
+
__all__ = [
|
|
22
|
+
"NEAR_UNIQUE_VERSION",
|
|
23
|
+
"RULE_VERSION",
|
|
24
|
+
"DedupReportRef",
|
|
25
|
+
"DistinctEvidence",
|
|
26
|
+
"DuplicateEvidence",
|
|
27
|
+
"IdentifierUniqueness",
|
|
28
|
+
"NearUnique",
|
|
29
|
+
"RejectedProof",
|
|
30
|
+
"UniquenessFacts",
|
|
31
|
+
"assess_identifier_uniqueness",
|
|
32
|
+
"assess_near_unique",
|
|
33
|
+
]
|