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.
Files changed (165) hide show
  1. exness_data_preprocess-2.0.0/.github/workflows/ci.yml +25 -0
  2. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/.mise.toml +24 -15
  3. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/CHANGELOG.md +37 -0
  4. exness_data_preprocess-2.0.0/CLAUDE.md +152 -0
  5. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/CONTRIBUTING.md +14 -20
  6. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/PKG-INFO +141 -85
  7. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/README.md +138 -81
  8. exness_data_preprocess-2.0.0/docs/adr/2025-12-11-duckdb-removal-clickhouse.md +236 -0
  9. exness_data_preprocess-2.0.0/docs/design/2025-12-11-duckdb-removal-clickhouse/spec.md +399 -0
  10. {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
  11. {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
  12. {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
  13. {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
  14. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/gap_detection_implementation_example.py +5 -5
  15. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/pyproject.toml +6 -8
  16. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/scripts/generate_dbeaver_config.py +2 -6
  17. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/src/exness_data_preprocess/__init__.py +21 -15
  18. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/src/exness_data_preprocess/clickhouse_client.py +6 -1
  19. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/src/exness_data_preprocess/clickhouse_gap_detector.py +2 -6
  20. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/src/exness_data_preprocess/clickhouse_manager.py +17 -15
  21. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/src/exness_data_preprocess/clickhouse_ohlc_generator.py +29 -9
  22. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/src/exness_data_preprocess/clickhouse_query_engine.py +3 -5
  23. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/src/exness_data_preprocess/config.py +6 -9
  24. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/src/exness_data_preprocess/models.py +59 -62
  25. exness_data_preprocess-2.0.0/src/exness_data_preprocess/processor.py +582 -0
  26. exness_data_preprocess-2.0.0/tests/conftest.py +79 -0
  27. exness_data_preprocess-2.0.0/tests/test_basic.py +57 -0
  28. exness_data_preprocess-2.0.0/tests/test_functional_regression.py +136 -0
  29. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/tests/test_models.py +55 -62
  30. exness_data_preprocess-2.0.0/tests/test_processor_pydantic.py +217 -0
  31. exness_data_preprocess-1.2.0/.github/workflows/ci.yml +0 -50
  32. exness_data_preprocess-1.2.0/.lint-relative-paths-results.txt +0 -62
  33. exness_data_preprocess-1.2.0/CLAUDE.md +0 -213
  34. exness_data_preprocess-1.2.0/docs/archive/CLAUDE_MD_AUDIT_2025-10-16_PASS2.md +0 -378
  35. exness_data_preprocess-1.2.0/docs/archive/CLAUDE_MD_VERIFICATION_CHECKLIST_2025-10-16.md +0 -438
  36. exness_data_preprocess-1.2.0/docs/archive/CLAUDE_MD_VERIFICATION_FINDINGS_2025-10-16.md +0 -340
  37. exness_data_preprocess-1.2.0/docs/archive/DOCUMENTATION_AUDIT_2025-10-15.md +0 -363
  38. exness_data_preprocess-1.2.0/docs/archive/DOCUMENTATION_AUDIT_PASS2_2025-10-15.md +0 -208
  39. exness_data_preprocess-1.2.0/docs/archive/DOCUMENTATION_BEST_PRACTICES_LINE_COUNTS.md +0 -527
  40. exness_data_preprocess-1.2.0/docs/archive/E2E_TESTING_PLAN_v1.0.0.md +0 -197
  41. exness_data_preprocess-1.2.0/docs/archive/EXCHANGE_SESSION_AUDIT_2025-10-17.md +0 -520
  42. exness_data_preprocess-1.2.0/docs/archive/FUNCTIONALITY_VALIDATION_REPORT_2025-10-15.md +0 -415
  43. exness_data_preprocess-1.2.0/docs/archive/FUNCTIONALITY_VALIDATION_REPORT_2025-10-16.md +0 -386
  44. exness_data_preprocess-1.2.0/docs/archive/GAP_DETECTION_COMPARISON.md +0 -496
  45. exness_data_preprocess-1.2.0/docs/archive/GAP_DETECTION_SQL_APPROACH.md +0 -434
  46. exness_data_preprocess-1.2.0/docs/archive/REFACTORING_CHECKLIST.md +0 -219
  47. exness_data_preprocess-1.2.0/docs/archive/RESEARCH_PATTERNS_CANONICALIZATION_2025-10-17.md +0 -315
  48. exness_data_preprocess-1.2.0/docs/archive/SCHEMA_v1.6.0_AUDIT_FINDINGS.md +0 -434
  49. exness_data_preprocess-1.2.0/docs/archive/SCHEMA_v1.6.0_MIGRATION_GUIDE.md +0 -574
  50. exness_data_preprocess-1.2.0/docs/archive/SESSION_2025-10-15_SUMMARY.md +0 -342
  51. exness_data_preprocess-1.2.0/docs/archive/UNIFIED_DUCKDB_PLAN_v1.0.0_LEGACY.md +0 -705
  52. exness_data_preprocess-1.2.0/docs/archive/implementation-plan-2024-11-24.yaml +0 -36
  53. exness_data_preprocess-1.2.0/docs/validation/ARCHITECTURE_AUDIT_2025-10-17.md +0 -406
  54. exness_data_preprocess-1.2.0/docs/validation/ARCHITECTURE_EFFICIENCY_AUDIT_2025-10-18.md +0 -374
  55. exness_data_preprocess-1.2.0/docs/validation/DOCUMENTATION_SURVEY_v1.7.0.md +0 -294
  56. exness_data_preprocess-1.2.0/docs/validation/WEEKEND_GAP_VALIDATION_SUMMARY.md +0 -109
  57. exness_data_preprocess-1.2.0/docs/validation/WORKSPACE_SURVEY_2025-10-17.md +0 -267
  58. exness_data_preprocess-1.2.0/src/exness_data_preprocess/database_manager.py +0 -208
  59. exness_data_preprocess-1.2.0/src/exness_data_preprocess/gap_detector.py +0 -133
  60. exness_data_preprocess-1.2.0/src/exness_data_preprocess/ohlc_generator.py +0 -265
  61. exness_data_preprocess-1.2.0/src/exness_data_preprocess/processor.py +0 -764
  62. exness_data_preprocess-1.2.0/src/exness_data_preprocess/query_engine.py +0 -290
  63. exness_data_preprocess-1.2.0/src/exness_data_preprocess/schema.py +0 -323
  64. exness_data_preprocess-1.2.0/tests/conftest.py +0 -83
  65. exness_data_preprocess-1.2.0/tests/test_basic.py +0 -31
  66. exness_data_preprocess-1.2.0/tests/test_functional_regression.py +0 -327
  67. exness_data_preprocess-1.2.0/tests/test_processor_pydantic.py +0 -223
  68. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/.cz.toml +0 -0
  69. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/.github/workflows/pre-commit-autoupdate.yml +0 -0
  70. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/.github/workflows/publish.yml +0 -0
  71. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/.gitignore +0 -0
  72. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/.pre-commit-config.yaml +0 -0
  73. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/.releaserc.yml +0 -0
  74. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/LICENSE +0 -0
  75. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/Makefile +0 -0
  76. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/cliff-release-notes.toml +0 -0
  77. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/cliff.toml +0 -0
  78. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/DATABASE_SCHEMA.md +0 -0
  79. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/EXNESS_DATA_SOURCES.md +0 -0
  80. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/MODULE_ARCHITECTURE.md +0 -0
  81. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/PRIORITY3_CLEANUP_PLAN.yaml +0 -0
  82. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/README.md +0 -0
  83. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/REPOSITORY_REFACTORING_PLAN.yaml +0 -0
  84. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/RESEARCH_PATTERNS.md +0 -0
  85. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/TRADING_HOURS_RESEARCH.md +0 -0
  86. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/UNIFIED_DUCKDB_PLAN_v2.md +0 -0
  87. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/adr/2025-12-09-codebase-pruning.md +0 -0
  88. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/adr/2025-12-09-exness-clickhouse-migration.md +0 -0
  89. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/adr/2025-12-10-clickhouse-e2e-validation-pipeline.md +0 -0
  90. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/adr/2025-12-10-clickhouse-pydantic-config.md +0 -0
  91. {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
  92. {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
  93. {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
  94. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/archive/PHASE4_DRY_RUN_CONFIG_PLAN.yaml +0 -0
  95. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/archive/PHASE7_v1.5.0_REFACTORING_PLAN.md +0 -0
  96. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/archive/PHASE7_v1.6.0_REFACTORING_PROGRESS.md +0 -0
  97. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/archive/PYDANTIC_REFACTORING_PLAN_v0.2.0_COMPLETE.md +0 -0
  98. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/archive/PYDANTIC_REFACTORING_STATUS_v0.2.0_COMPLETE.md +0 -0
  99. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/design/2025-12-09-codebase-pruning/spec.md +0 -0
  100. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/design/2025-12-09-exness-clickhouse-migration/spec.md +0 -0
  101. {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
  102. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/design/2025-12-10-clickhouse-pydantic-config/spec.md +0 -0
  103. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/optimization/OPTIMIZATION_OPPORTUNITIES_2025-10-18.md +0 -0
  104. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/phases/PHASE2_SESSION_VECTORIZATION_PLAN.yaml +0 -0
  105. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/phases/PHASE3_SQL_GAP_DETECTION_PLAN.yaml +0 -0
  106. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/releases/RELEASE_NOTES.md +0 -0
  107. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/releases/RELEASE_NOTES_SHORT.md +0 -0
  108. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/HYBRID_SESSION_DETECTION_ANALYSIS.md +0 -0
  109. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/compression-benchmarks/README.md +0 -0
  110. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/compression-benchmarks/test_all_compression_methods.py +0 -0
  111. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/compression-benchmarks/test_delta_encoding_properly.py +0 -0
  112. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/compression-benchmarks/test_parquet_compression_methods.py +0 -0
  113. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-spread-analysis/01-methodology.md +0 -0
  114. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-spread-analysis/02-mode-truncated-analysis.md +0 -0
  115. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-spread-analysis/03-hurdle-model-analysis.md +0 -0
  116. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-spread-analysis/04-temporal-patterns.md +0 -0
  117. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-spread-analysis/05-final-recommendations.md +0 -0
  118. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-spread-analysis/README.md +0 -0
  119. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-spread-analysis/scripts/reproduction_guide.md +0 -0
  120. {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
  121. {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
  122. {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
  123. {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
  124. {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
  125. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-spread-analysis/visualizations/temporal/concentration_curve.png +0 -0
  126. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-spread-analysis/visualizations/temporal/percentile_analysis.png +0 -0
  127. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-zero-spread-deviations/01-methodology.md +0 -0
  128. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-zero-spread-deviations/02-baseline-sep2024.md +0 -0
  129. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-zero-spread-deviations/03-multiperiod-validation.md +0 -0
  130. {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
  131. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-zero-spread-deviations/README.md +0 -0
  132. {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
  133. {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
  134. {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
  135. {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
  136. {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
  137. {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
  138. {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
  139. {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
  140. {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
  141. {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
  142. {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
  143. {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
  144. {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
  145. {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
  146. {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
  147. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/research/eurusd-zero-spread-deviations/scripts/reproduction_guide.md +0 -0
  148. {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
  149. {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
  150. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/setup/GITHUB_PYPI_SETUP.md +0 -0
  151. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/validation/E2E_VALIDATION_RESULTS_v1.6.0.md +0 -0
  152. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/validation/SPIKE_TEST_RESULTS_PHASE1_2025-10-18.md +0 -0
  153. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/docs/validation/SPIKE_TEST_RESULTS_PHASE2_2025-10-18.md +0 -0
  154. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/examples/basic_usage.py +0 -0
  155. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/examples/batch_processing.py +0 -0
  156. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/package-lock.json +0 -0
  157. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/package.json +0 -0
  158. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/src/exness_data_preprocess/clickhouse_base.py +0 -0
  159. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/src/exness_data_preprocess/downloader.py +0 -0
  160. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/src/exness_data_preprocess/exchanges.py +0 -0
  161. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/src/exness_data_preprocess/session_detector.py +0 -0
  162. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/src/exness_data_preprocess/tick_loader.py +0 -0
  163. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/tests/README.md +0 -0
  164. {exness_data_preprocess-1.2.0 → exness_data_preprocess-2.0.0}/tests/__init__.py +0 -0
  165. {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.14"
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
- python = "3.14"
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-10-clickhouse-e2e-validation-pipeline.md
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 18 modules importable')
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 or higher
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
- exness-data-preprocess/
148
- ├── src/exness_data_preprocess/
149
- │ ├── __init__.py # Package entry point
150
- │ ├── processor.py # Core processor class
151
- │ ├── api.py # Simple API functions
152
- │ └── cli.py # Command-line interface
153
- ├── tests/
154
- │ ├── conftest.py # Pytest fixtures
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 (processor.py, api.py, or cli.py)
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 README.md** with usage examples
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: