exness-data-preprocess 1.2.0__tar.gz → 2.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- exness_data_preprocess-2.0.0/.github/workflows/ci.yml +25 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/.mise.toml +24 -15
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/CHANGELOG.md +37 -0
- exness_data_preprocess-2.0.0/CLAUDE.md +152 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/CONTRIBUTING.md +14 -20
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/PKG-INFO +141 -85
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/README.md +138 -81
- exness_data_preprocess-2.0.0/docs/adr/2025-12-11-duckdb-removal-clickhouse.md +236 -0
- exness_data_preprocess-2.0.0/docs/design/2025-12-11-duckdb-removal-clickhouse/spec.md +399 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-zero-spread-deviations/scripts/baseline-sep2024/02_volatility_model_simple.py +1 -1
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase1_data_validation.py +1 -1
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-zero-spread-deviations/scripts/visualization/generate_interactive_dashboard.py +1 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-zero-spread-deviations/scripts/visualization/generate_lightweight_dashboard.py +1 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/gap_detection_implementation_example.py +5 -5
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/pyproject.toml +6 -8
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/scripts/generate_dbeaver_config.py +2 -6
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/src/exness_data_preprocess/__init__.py +21 -15
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/src/exness_data_preprocess/clickhouse_client.py +6 -1
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/src/exness_data_preprocess/clickhouse_gap_detector.py +2 -6
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/src/exness_data_preprocess/clickhouse_manager.py +17 -15
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/src/exness_data_preprocess/clickhouse_ohlc_generator.py +29 -9
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/src/exness_data_preprocess/clickhouse_query_engine.py +3 -5
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/src/exness_data_preprocess/config.py +6 -9
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/src/exness_data_preprocess/models.py +59 -62
- exness_data_preprocess-2.0.0/src/exness_data_preprocess/processor.py +582 -0
- exness_data_preprocess-2.0.0/tests/conftest.py +79 -0
- exness_data_preprocess-2.0.0/tests/test_basic.py +57 -0
- exness_data_preprocess-2.0.0/tests/test_functional_regression.py +136 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/tests/test_models.py +55 -62
- exness_data_preprocess-2.0.0/tests/test_processor_pydantic.py +217 -0
- exness_data_preprocess-1.2.0/.github/workflows/ci.yml +0 -50
- exness_data_preprocess-1.2.0/.lint-relative-paths-results.txt +0 -62
- exness_data_preprocess-1.2.0/CLAUDE.md +0 -213
- exness_data_preprocess-1.2.0/docs/archive/CLAUDE_MD_AUDIT_2025-10-16_PASS2.md +0 -378
- exness_data_preprocess-1.2.0/docs/archive/CLAUDE_MD_VERIFICATION_CHECKLIST_2025-10-16.md +0 -438
- exness_data_preprocess-1.2.0/docs/archive/CLAUDE_MD_VERIFICATION_FINDINGS_2025-10-16.md +0 -340
- exness_data_preprocess-1.2.0/docs/archive/DOCUMENTATION_AUDIT_2025-10-15.md +0 -363
- exness_data_preprocess-1.2.0/docs/archive/DOCUMENTATION_AUDIT_PASS2_2025-10-15.md +0 -208
- exness_data_preprocess-1.2.0/docs/archive/DOCUMENTATION_BEST_PRACTICES_LINE_COUNTS.md +0 -527
- exness_data_preprocess-1.2.0/docs/archive/E2E_TESTING_PLAN_v1.0.0.md +0 -197
- exness_data_preprocess-1.2.0/docs/archive/EXCHANGE_SESSION_AUDIT_2025-10-17.md +0 -520
- exness_data_preprocess-1.2.0/docs/archive/FUNCTIONALITY_VALIDATION_REPORT_2025-10-15.md +0 -415
- exness_data_preprocess-1.2.0/docs/archive/FUNCTIONALITY_VALIDATION_REPORT_2025-10-16.md +0 -386
- exness_data_preprocess-1.2.0/docs/archive/GAP_DETECTION_COMPARISON.md +0 -496
- exness_data_preprocess-1.2.0/docs/archive/GAP_DETECTION_SQL_APPROACH.md +0 -434
- exness_data_preprocess-1.2.0/docs/archive/REFACTORING_CHECKLIST.md +0 -219
- exness_data_preprocess-1.2.0/docs/archive/RESEARCH_PATTERNS_CANONICALIZATION_2025-10-17.md +0 -315
- exness_data_preprocess-1.2.0/docs/archive/SCHEMA_v1.6.0_AUDIT_FINDINGS.md +0 -434
- exness_data_preprocess-1.2.0/docs/archive/SCHEMA_v1.6.0_MIGRATION_GUIDE.md +0 -574
- exness_data_preprocess-1.2.0/docs/archive/SESSION_2025-10-15_SUMMARY.md +0 -342
- exness_data_preprocess-1.2.0/docs/archive/UNIFIED_DUCKDB_PLAN_v1.0.0_LEGACY.md +0 -705
- exness_data_preprocess-1.2.0/docs/archive/implementation-plan-2024-11-24.yaml +0 -36
- exness_data_preprocess-1.2.0/docs/validation/ARCHITECTURE_AUDIT_2025-10-17.md +0 -406
- exness_data_preprocess-1.2.0/docs/validation/ARCHITECTURE_EFFICIENCY_AUDIT_2025-10-18.md +0 -374
- exness_data_preprocess-1.2.0/docs/validation/DOCUMENTATION_SURVEY_v1.7.0.md +0 -294
- exness_data_preprocess-1.2.0/docs/validation/WEEKEND_GAP_VALIDATION_SUMMARY.md +0 -109
- exness_data_preprocess-1.2.0/docs/validation/WORKSPACE_SURVEY_2025-10-17.md +0 -267
- exness_data_preprocess-1.2.0/src/exness_data_preprocess/database_manager.py +0 -208
- exness_data_preprocess-1.2.0/src/exness_data_preprocess/gap_detector.py +0 -133
- exness_data_preprocess-1.2.0/src/exness_data_preprocess/ohlc_generator.py +0 -265
- exness_data_preprocess-1.2.0/src/exness_data_preprocess/processor.py +0 -764
- exness_data_preprocess-1.2.0/src/exness_data_preprocess/query_engine.py +0 -290
- exness_data_preprocess-1.2.0/src/exness_data_preprocess/schema.py +0 -323
- exness_data_preprocess-1.2.0/tests/conftest.py +0 -83
- exness_data_preprocess-1.2.0/tests/test_basic.py +0 -31
- exness_data_preprocess-1.2.0/tests/test_functional_regression.py +0 -327
- exness_data_preprocess-1.2.0/tests/test_processor_pydantic.py +0 -223
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/.cz.toml +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/.github/workflows/pre-commit-autoupdate.yml +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/.github/workflows/publish.yml +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/.gitignore +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/.pre-commit-config.yaml +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/.releaserc.yml +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/LICENSE +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/Makefile +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/cliff-release-notes.toml +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/cliff.toml +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/DATABASE_SCHEMA.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/EXNESS_DATA_SOURCES.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/MODULE_ARCHITECTURE.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/PRIORITY3_CLEANUP_PLAN.yaml +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/README.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/REPOSITORY_REFACTORING_PLAN.yaml +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/RESEARCH_PATTERNS.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/TRADING_HOURS_RESEARCH.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/UNIFIED_DUCKDB_PLAN_v2.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/adr/2025-12-09-codebase-pruning.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/adr/2025-12-09-exness-clickhouse-migration.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/adr/2025-12-10-clickhouse-e2e-validation-pipeline.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/adr/2025-12-10-clickhouse-pydantic-config.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/adr/diagrams/2025-12-10-clickhouse-pydantic-config-after.dot +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/adr/diagrams/2025-12-10-clickhouse-pydantic-config-arch.dot +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/adr/diagrams/2025-12-10-clickhouse-pydantic-config-before.dot +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/archive/PHASE4_DRY_RUN_CONFIG_PLAN.yaml +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/archive/PHASE7_v1.5.0_REFACTORING_PLAN.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/archive/PHASE7_v1.6.0_REFACTORING_PROGRESS.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/archive/PYDANTIC_REFACTORING_PLAN_v0.2.0_COMPLETE.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/archive/PYDANTIC_REFACTORING_STATUS_v0.2.0_COMPLETE.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/design/2025-12-09-codebase-pruning/spec.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/design/2025-12-09-exness-clickhouse-migration/spec.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/design/2025-12-10-clickhouse-e2e-validation-pipeline/spec.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/design/2025-12-10-clickhouse-pydantic-config/spec.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/optimization/OPTIMIZATION_OPPORTUNITIES_2025-10-18.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/phases/PHASE2_SESSION_VECTORIZATION_PLAN.yaml +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/phases/PHASE3_SQL_GAP_DETECTION_PLAN.yaml +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/releases/RELEASE_NOTES.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/releases/RELEASE_NOTES_SHORT.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/HYBRID_SESSION_DETECTION_ANALYSIS.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/compression-benchmarks/README.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/compression-benchmarks/test_all_compression_methods.py +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/compression-benchmarks/test_delta_encoding_properly.py +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/compression-benchmarks/test_parquet_compression_methods.py +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-spread-analysis/01-methodology.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-spread-analysis/02-mode-truncated-analysis.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-spread-analysis/03-hurdle-model-analysis.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-spread-analysis/04-temporal-patterns.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-spread-analysis/05-final-recommendations.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-spread-analysis/README.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-spread-analysis/scripts/reproduction_guide.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-spread-analysis/visualizations/hurdle-model/hurdle_decomposition.png +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-spread-analysis/visualizations/mode-truncated/cv_mode_comparison.png +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-spread-analysis/visualizations/mode-truncated/distribution_overlay.png +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-spread-analysis/visualizations/mode-truncated/signal_quality_comparison.png +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-spread-analysis/visualizations/mode-truncated/variance_decomposition.png +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-spread-analysis/visualizations/temporal/concentration_curve.png +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-spread-analysis/visualizations/temporal/percentile_analysis.png +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-zero-spread-deviations/01-methodology.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-zero-spread-deviations/02-baseline-sep2024.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-zero-spread-deviations/03-multiperiod-validation.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-zero-spread-deviations/04-discoveries-and-plan-evolution.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-zero-spread-deviations/README.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-zero-spread-deviations/findings/baseline-sep2024-comprehensive-summary.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-zero-spread-deviations/findings/phase2-mean-reversion-report.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-zero-spread-deviations/findings/phase3-volatility-model-report.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-zero-spread-deviations/findings/phase4-5-statistical-tests-survivorship-report.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-zero-spread-deviations/scripts/baseline-sep2024/01_mean_reversion_analysis.py +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-zero-spread-deviations/scripts/baseline-sep2024/03_liquidity_crisis_detection.py +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-zero-spread-deviations/scripts/baseline-sep2024/04_regime_detection_analysis.py +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase2_mean_reversion.py +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase3_volatility_model.py +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase4_statistical_tests.py +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase5_survivorship_bias.py +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase5_survivorship_bias_v1.0.1.py +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase6a_interval_analysis.py +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase6b_price_clustering.py +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase6c_combined_pattern.py +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-zero-spread-deviations/scripts/reproduction_guide.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-zero-spread-deviations/scripts/visualization/diagnostic_burst_decay.py +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-zero-spread-deviations/scripts/visualization/prepare_visualization_data.py +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/setup/GITHUB_PYPI_SETUP.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/validation/E2E_VALIDATION_RESULTS_v1.6.0.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/validation/SPIKE_TEST_RESULTS_PHASE1_2025-10-18.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/validation/SPIKE_TEST_RESULTS_PHASE2_2025-10-18.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/examples/basic_usage.py +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/examples/batch_processing.py +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/package-lock.json +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/package.json +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/src/exness_data_preprocess/clickhouse_base.py +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/src/exness_data_preprocess/downloader.py +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/src/exness_data_preprocess/exchanges.py +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/src/exness_data_preprocess/session_detector.py +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/src/exness_data_preprocess/tick_loader.py +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/tests/README.md +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/tests/__init__.py +0 -0
- {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/tests/test_types.py +0 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
pre-commit:
|
|
11
|
+
name: Pre-commit hooks
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
steps:
|
|
14
|
+
- uses: actions/checkout@v4
|
|
15
|
+
|
|
16
|
+
- uses: actions/setup-python@v5
|
|
17
|
+
with:
|
|
18
|
+
python-version: '3.12'
|
|
19
|
+
|
|
20
|
+
- name: Run pre-commit hooks
|
|
21
|
+
uses: pre-commit/action@v3.0.1
|
|
22
|
+
|
|
23
|
+
# NOTE: Tests removed per local-first testing standard
|
|
24
|
+
# See: ~/.claude/CLAUDE.md - "NO unit testing in GitHub Actions"
|
|
25
|
+
# Run tests locally with: mise run validate
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
# E2E validation workflow for codebase pruning verification
|
|
3
3
|
|
|
4
4
|
[env]
|
|
5
|
-
# Python version for validation
|
|
6
|
-
PYTHON_VERSION = "3.
|
|
5
|
+
# Python version for validation (pinned for alpha-forge compatibility)
|
|
6
|
+
PYTHON_VERSION = "3.11"
|
|
7
7
|
# Package name
|
|
8
8
|
PACKAGE_NAME = "exness_data_preprocess"
|
|
9
9
|
# Validation temp directory
|
|
@@ -26,7 +26,8 @@ DBEAVER_CONFIG_PATH = ".dbeaver/data-sources.json"
|
|
|
26
26
|
# CLICKHOUSE_PASSWORD_READONLY - set in .env
|
|
27
27
|
|
|
28
28
|
[tools]
|
|
29
|
-
|
|
29
|
+
# Pin Python 3.11 for alpha-forge compatibility (numpy requirements)
|
|
30
|
+
python = "3.11"
|
|
30
31
|
|
|
31
32
|
# =============================================================================
|
|
32
33
|
# Validation Tasks - E2E Testing Pipeline
|
|
@@ -34,8 +35,9 @@ python = "3.14"
|
|
|
34
35
|
|
|
35
36
|
[tasks.validate]
|
|
36
37
|
description = "Run full E2E validation pipeline"
|
|
37
|
-
# ADR: /docs/adr/2025-12-
|
|
38
|
+
# ADR: /docs/adr/2025-12-11-duckdb-removal-clickhouse.md
|
|
38
39
|
depends = [
|
|
40
|
+
"clickhouse:ensure", # Fail fast if ClickHouse not running
|
|
39
41
|
"validate:imports",
|
|
40
42
|
"validate:lint",
|
|
41
43
|
"validate:typecheck",
|
|
@@ -43,24 +45,36 @@ depends = [
|
|
|
43
45
|
"validate:build",
|
|
44
46
|
"validate:install",
|
|
45
47
|
"validate:mixin",
|
|
48
|
+
"validate:clickhouse", # ClickHouse E2E validation
|
|
46
49
|
]
|
|
47
50
|
run = '''
|
|
48
51
|
echo ""
|
|
49
52
|
echo "=============================================="
|
|
50
53
|
echo "✅ ALL VALIDATIONS PASSED"
|
|
51
54
|
echo "=============================================="
|
|
52
|
-
echo ""
|
|
53
|
-
echo "💡 To run ClickHouse validation (requires ClickHouse running):"
|
|
54
|
-
echo " mise run clickhouse:start"
|
|
55
|
-
echo " mise run validate:clickhouse"
|
|
56
55
|
'''
|
|
57
56
|
|
|
58
57
|
# -----------------------------------------------------------------------------
|
|
59
58
|
# Individual Validation Tasks
|
|
60
59
|
# -----------------------------------------------------------------------------
|
|
61
60
|
|
|
61
|
+
[tasks."clickhouse:ensure"]
|
|
62
|
+
description = "Ensure ClickHouse is running (fail fast)"
|
|
63
|
+
# ADR: /docs/adr/2025-12-11-duckdb-removal-clickhouse.md
|
|
64
|
+
run = '''
|
|
65
|
+
#!/usr/bin/env bash
|
|
66
|
+
set -e
|
|
67
|
+
if ! nc -z localhost 8123 2>/dev/null; then
|
|
68
|
+
echo "ERROR: ClickHouse not running on port 8123" >&2
|
|
69
|
+
echo "Start with: mise run clickhouse:start" >&2
|
|
70
|
+
exit 1
|
|
71
|
+
fi
|
|
72
|
+
echo "✅ ClickHouse connection verified"
|
|
73
|
+
'''
|
|
74
|
+
|
|
62
75
|
[tasks."validate:imports"]
|
|
63
76
|
description = "Validate all module imports (catch circular imports, missing deps)"
|
|
77
|
+
# ADR: /docs/adr/2025-12-11-duckdb-removal-clickhouse.md - DuckDB modules removed
|
|
64
78
|
run = '''
|
|
65
79
|
#!/usr/bin/env bash
|
|
66
80
|
set -e
|
|
@@ -94,7 +108,7 @@ from exness_data_preprocess import (
|
|
|
94
108
|
print('✅ All public exports importable')
|
|
95
109
|
" || { echo "❌ Public exports import failed"; exit 1; }
|
|
96
110
|
|
|
97
|
-
# Test all internal modules
|
|
111
|
+
# Test all internal modules (ClickHouse-only, DuckDB modules removed)
|
|
98
112
|
uv run python -c "
|
|
99
113
|
modules = [
|
|
100
114
|
'exness_data_preprocess.clickhouse_base',
|
|
@@ -104,15 +118,10 @@ modules = [
|
|
|
104
118
|
'exness_data_preprocess.clickhouse_ohlc_generator',
|
|
105
119
|
'exness_data_preprocess.clickhouse_query_engine',
|
|
106
120
|
'exness_data_preprocess.config',
|
|
107
|
-
'exness_data_preprocess.database_manager',
|
|
108
121
|
'exness_data_preprocess.downloader',
|
|
109
122
|
'exness_data_preprocess.exchanges',
|
|
110
|
-
'exness_data_preprocess.gap_detector',
|
|
111
123
|
'exness_data_preprocess.models',
|
|
112
|
-
'exness_data_preprocess.ohlc_generator',
|
|
113
124
|
'exness_data_preprocess.processor',
|
|
114
|
-
'exness_data_preprocess.query_engine',
|
|
115
|
-
'exness_data_preprocess.schema',
|
|
116
125
|
'exness_data_preprocess.session_detector',
|
|
117
126
|
'exness_data_preprocess.tick_loader',
|
|
118
127
|
]
|
|
@@ -120,7 +129,7 @@ import importlib
|
|
|
120
129
|
for mod in modules:
|
|
121
130
|
importlib.import_module(mod)
|
|
122
131
|
print(f' ✓ {mod}')
|
|
123
|
-
print('✅ All
|
|
132
|
+
print('✅ All 13 modules importable')
|
|
124
133
|
"
|
|
125
134
|
echo "✅ Import validation passed"
|
|
126
135
|
'''
|
|
@@ -1,3 +1,40 @@
|
|
|
1
|
+
# [2.0.0](https://github.com/terrylica/exness-data-preprocess/compare/v1.2.1...v2.0.0) (2025-12-27)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
* feat!: migrate to ClickHouse-only backend, remove DuckDB ([7fd83bc](https://github.com/terrylica/exness-data-preprocess/commit/7fd83bc5720b2f5997a661ef8060757abd602a81))
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
### BREAKING CHANGES
|
|
8
|
+
|
|
9
|
+
* This release removes DuckDB and makes ClickHouse the sole storage backend.
|
|
10
|
+
|
|
11
|
+
API Changes:
|
|
12
|
+
- `duckdb_path` → `database` (str, ClickHouse database name)
|
|
13
|
+
- `duckdb_size_mb` → `storage_bytes` (int, bytes not MB)
|
|
14
|
+
- `database_exists` → removed
|
|
15
|
+
- `base_dir` constructor parameter → removed
|
|
16
|
+
|
|
17
|
+
Schema Changes:
|
|
18
|
+
- OHLC schema reduced from 30 to 26 columns (removed 4 normalized metrics)
|
|
19
|
+
|
|
20
|
+
Deleted Files (~1,219 lines):
|
|
21
|
+
- database_manager.py (209 lines)
|
|
22
|
+
- gap_detector.py (134 lines)
|
|
23
|
+
- ohlc_generator.py (266 lines)
|
|
24
|
+
- query_engine.py (291 lines)
|
|
25
|
+
- schema.py (324 lines)
|
|
26
|
+
|
|
27
|
+
Requires: ClickHouse running on localhost:8123
|
|
28
|
+
|
|
29
|
+
ADR: docs/adr/2025-12-11-duckdb-removal-clickhouse.md
|
|
30
|
+
|
|
31
|
+
## [1.2.1](https://github.com/terrylica/exness-data-preprocess/compare/v1.2.0...v1.2.1) (2025-12-11)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
### Bug Fixes
|
|
35
|
+
|
|
36
|
+
* **clickhouse:** bootstrap database creation without existing database context ([0fdfef1](https://github.com/terrylica/exness-data-preprocess/commit/0fdfef17cf797d64a66b3b163037a01c1e8245a7))
|
|
37
|
+
|
|
1
38
|
# [1.2.0](https://github.com/terrylica/exness-data-preprocess/compare/v1.1.0...v1.2.0) (2025-12-10)
|
|
2
39
|
|
|
3
40
|
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
# CLAUDE.md
|
|
2
|
+
|
|
3
|
+
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
4
|
+
|
|
5
|
+
**Package**: `exness-data-preprocess` — Forex tick data preprocessing with ClickHouse backend
|
|
6
|
+
|
|
7
|
+
**Version**: See [`pyproject.toml`](pyproject.toml) line 3 (SSoT via semantic-release)
|
|
8
|
+
|
|
9
|
+
**Quick Start**: [`README.md`](README.md) — Installation, API reference, usage examples
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Documentation Hub (Progressive Disclosure)
|
|
14
|
+
|
|
15
|
+
### Essential Links
|
|
16
|
+
|
|
17
|
+
| Topic | SSoT Document | Purpose |
|
|
18
|
+
| ---------------- | ------------------------------------------------------------------------------------------------------ | ---------------------------- |
|
|
19
|
+
| **User Guide** | [`README.md`](README.md) | Installation, API, examples |
|
|
20
|
+
| **Architecture** | [`docs/adr/2025-12-11-duckdb-removal-clickhouse.md`](docs/adr/2025-12-11-duckdb-removal-clickhouse.md) | ClickHouse-only decision |
|
|
21
|
+
| **Schema** | [`docs/DATABASE_SCHEMA.md`](docs/DATABASE_SCHEMA.md) | 26-column OHLC specification |
|
|
22
|
+
| **Modules** | [`docs/MODULE_ARCHITECTURE.md`](docs/MODULE_ARCHITECTURE.md) | 13 modules with SLOs |
|
|
23
|
+
| **Data Sources** | [`docs/EXNESS_DATA_SOURCES.md`](docs/EXNESS_DATA_SOURCES.md) | Exness tick data variants |
|
|
24
|
+
| **Tasks** | [`.mise.toml`](.mise.toml) | Validation, ClickHouse tasks |
|
|
25
|
+
| **Contributing** | [`CONTRIBUTING.md`](CONTRIBUTING.md) | Development guidelines |
|
|
26
|
+
|
|
27
|
+
### Deep Dives (On-Demand)
|
|
28
|
+
|
|
29
|
+
| Topic | Location | When to Read |
|
|
30
|
+
| ------------------ | -------------------------------------- | ------------------------- |
|
|
31
|
+
| ADRs | [`docs/adr/`](docs/adr/) | Architecture decisions |
|
|
32
|
+
| Design Specs | [`docs/design/`](docs/design/) | Implementation blueprints |
|
|
33
|
+
| Validation Results | [`docs/validation/`](docs/validation/) | Spike test proofs |
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Architecture Overview (v2.0.0)
|
|
38
|
+
|
|
39
|
+
### ClickHouse-Only Backend
|
|
40
|
+
|
|
41
|
+
**ADR**: [`docs/adr/2025-12-11-duckdb-removal-clickhouse.md`](docs/adr/2025-12-11-duckdb-removal-clickhouse.md)
|
|
42
|
+
|
|
43
|
+
| Feature | Description |
|
|
44
|
+
| --------------- | ------------------------------------------------ |
|
|
45
|
+
| **Database** | `exness` (single database for all instruments) |
|
|
46
|
+
| **Tables** | `raw_spread_ticks`, `standard_ticks`, `ohlc_1m` |
|
|
47
|
+
| **Engine** | ReplacingMergeTree (deduplication at merge time) |
|
|
48
|
+
| **Connection** | localhost:8123 (local) or cloud via env vars |
|
|
49
|
+
| **Entry Point** | `ExnessDataProcessor` |
|
|
50
|
+
|
|
51
|
+
### Module Structure (13 Modules)
|
|
52
|
+
|
|
53
|
+
**ClickHouse Backend (7 modules)**:
|
|
54
|
+
|
|
55
|
+
- `processor.py` — Main orchestrator with ClickHouse backend
|
|
56
|
+
- `clickhouse_manager.py` — Schema management, data loading
|
|
57
|
+
- `clickhouse_gap_detector.py` — Gap detection for incremental updates
|
|
58
|
+
- `clickhouse_query_engine.py` — Query with pagination
|
|
59
|
+
- `clickhouse_ohlc_generator.py` — OHLC generation
|
|
60
|
+
- `clickhouse_client.py` — Connection factory with error handling
|
|
61
|
+
- `clickhouse_base.py` — Shared mixin for client lifecycle
|
|
62
|
+
|
|
63
|
+
**Shared (6 modules)**:
|
|
64
|
+
|
|
65
|
+
- `downloader.py` — HTTP download operations
|
|
66
|
+
- `tick_loader.py` — CSV parsing
|
|
67
|
+
- `session_detector.py` — Holiday/session detection (vectorized)
|
|
68
|
+
- `config.py` — Configuration management
|
|
69
|
+
- `models.py` — Pydantic models (UpdateResult, CoverageInfo, etc.)
|
|
70
|
+
- `exchanges.py` — Exchange calendar integration
|
|
71
|
+
|
|
72
|
+
**Deleted in v2.0.0**:
|
|
73
|
+
|
|
74
|
+
- ~~`database_manager.py`~~ — DuckDB database operations
|
|
75
|
+
- ~~`gap_detector.py`~~ — DuckDB gap detection
|
|
76
|
+
- ~~`ohlc_generator.py`~~ — DuckDB OHLC generation
|
|
77
|
+
- ~~`query_engine.py`~~ — DuckDB query operations
|
|
78
|
+
- ~~`schema.py`~~ — DuckDB SQL schema definitions
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Development Commands
|
|
83
|
+
|
|
84
|
+
### Quick Reference
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
# Setup
|
|
88
|
+
uv sync --dev
|
|
89
|
+
|
|
90
|
+
# Testing (45 tests)
|
|
91
|
+
uv run pytest # All tests
|
|
92
|
+
mise run validate # Full E2E validation (requires ClickHouse)
|
|
93
|
+
|
|
94
|
+
# Linting
|
|
95
|
+
uv run ruff check --fix src/ tests/
|
|
96
|
+
|
|
97
|
+
# ClickHouse (required for full validation)
|
|
98
|
+
mise run clickhouse:start # Start local server
|
|
99
|
+
mise run clickhouse:status # Check connection
|
|
100
|
+
mise run clickhouse:ensure # Fail fast if not running
|
|
101
|
+
|
|
102
|
+
# Build & Publish
|
|
103
|
+
uv build
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### mise Tasks
|
|
107
|
+
|
|
108
|
+
All validation and tooling tasks are defined in [`.mise.toml`](.mise.toml):
|
|
109
|
+
|
|
110
|
+
| Task | Description |
|
|
111
|
+
| ------------------------------ | --------------------------------------- |
|
|
112
|
+
| `mise run validate` | Full E2E pipeline (requires ClickHouse) |
|
|
113
|
+
| `mise run clickhouse:ensure` | Fail fast if ClickHouse not running |
|
|
114
|
+
| `mise run clickhouse:start` | Start mise-installed ClickHouse |
|
|
115
|
+
| `mise run validate:clickhouse` | ClickHouse E2E tests |
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## Key Changes in v2.0.0
|
|
120
|
+
|
|
121
|
+
### Breaking Changes
|
|
122
|
+
|
|
123
|
+
| v1.x (DuckDB) | v2.0.0 (ClickHouse) |
|
|
124
|
+
| ----------------- | ------------------------------- |
|
|
125
|
+
| `duckdb_path` | `database` (str) |
|
|
126
|
+
| `duckdb_size_mb` | `storage_bytes` (int) |
|
|
127
|
+
| `database_exists` | removed |
|
|
128
|
+
| `base_dir` param | removed (ClickHouse manages) |
|
|
129
|
+
| 30-column OHLC | 26-column OHLC (4 cols removed) |
|
|
130
|
+
|
|
131
|
+
### Removed Files
|
|
132
|
+
|
|
133
|
+
```
|
|
134
|
+
src/exness_data_preprocess/database_manager.py (209 lines)
|
|
135
|
+
src/exness_data_preprocess/gap_detector.py (134 lines)
|
|
136
|
+
src/exness_data_preprocess/ohlc_generator.py (266 lines)
|
|
137
|
+
src/exness_data_preprocess/query_engine.py (291 lines)
|
|
138
|
+
src/exness_data_preprocess/schema.py (324 lines)
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
**Total: ~1,224 lines deleted**
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## References
|
|
146
|
+
|
|
147
|
+
- **Exness Data**: <https://ticks.ex2archive.com/>
|
|
148
|
+
- **ClickHouse**: <https://clickhouse.com/>
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
**Last Updated**: 2025-12-11
|
|
@@ -6,7 +6,7 @@ Thank you for your interest in contributing to Exness Data Preprocess! This docu
|
|
|
6
6
|
|
|
7
7
|
### Prerequisites
|
|
8
8
|
|
|
9
|
-
- Python 3.
|
|
9
|
+
- Python 3.11 or higher (see `pyproject.toml` requires-python)
|
|
10
10
|
- uv package manager (recommended) or pip
|
|
11
11
|
- Git
|
|
12
12
|
|
|
@@ -114,6 +114,7 @@ When reporting issues, please include:
|
|
|
114
114
|
```
|
|
115
115
|
|
|
116
116
|
7. **Push to your fork** and submit a pull request:
|
|
117
|
+
|
|
117
118
|
```bash
|
|
118
119
|
git push origin feature/your-feature-name
|
|
119
120
|
```
|
|
@@ -143,31 +144,24 @@ test: add integration tests for DuckDB operations
|
|
|
143
144
|
|
|
144
145
|
### Project Structure
|
|
145
146
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
│ ├── test_processor.py # Processor tests
|
|
156
|
-
│ ├── test_api.py # API tests
|
|
157
|
-
│ └── test_cli.py # CLI tests
|
|
158
|
-
├── docs/ # Documentation
|
|
159
|
-
├── pyproject.toml # Package configuration
|
|
160
|
-
└── README.md # Main documentation
|
|
161
|
-
```
|
|
147
|
+
**See [`CLAUDE.md`](CLAUDE.md) for complete module structure (19 modules).**
|
|
148
|
+
|
|
149
|
+
Key directories:
|
|
150
|
+
|
|
151
|
+
- `src/exness_data_preprocess/` — Source modules (DuckDB + ClickHouse backends)
|
|
152
|
+
- `tests/` — Test suite (48 tests)
|
|
153
|
+
- `docs/` — Documentation hub
|
|
154
|
+
- `.mise.toml` — Validation and tooling tasks
|
|
155
|
+
- `pyproject.toml` — Package configuration (SSoT for version via semantic-release)
|
|
162
156
|
|
|
163
157
|
### Adding New Features
|
|
164
158
|
|
|
165
159
|
When adding new features:
|
|
166
160
|
|
|
167
|
-
1. **Add implementation** in appropriate module (
|
|
168
|
-
2. **Add tests** in corresponding test file
|
|
161
|
+
1. **Add implementation** in appropriate module (see CLAUDE.md Module Structure)
|
|
162
|
+
2. **Add tests** in corresponding test file under `tests/`
|
|
169
163
|
3. **Update API exports** in `__init__.py` if needed
|
|
170
|
-
4. **Update
|
|
164
|
+
4. **Update CLAUDE.md** with module links if adding new modules
|
|
171
165
|
5. **Add docstrings** following Google style
|
|
172
166
|
|
|
173
167
|
Example docstring:
|