exness-data-preprocess 1.0.0__tar.gz → 1.2.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 (156) hide show
  1. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/.gitignore +5 -0
  2. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/.lint-relative-paths-results.txt +2 -2
  3. exness_data_preprocess-1.2.0/.mise.toml +509 -0
  4. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/CHANGELOG.md +19 -0
  5. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/PKG-INFO +1 -1
  6. exness_data_preprocess-1.2.0/docs/adr/2025-12-10-clickhouse-e2e-validation-pipeline.md +332 -0
  7. exness_data_preprocess-1.2.0/docs/adr/2025-12-10-clickhouse-pydantic-config.md +237 -0
  8. exness_data_preprocess-1.2.0/docs/adr/diagrams/2025-12-10-clickhouse-pydantic-config-after.dot +21 -0
  9. exness_data_preprocess-1.2.0/docs/adr/diagrams/2025-12-10-clickhouse-pydantic-config-arch.dot +17 -0
  10. exness_data_preprocess-1.2.0/docs/adr/diagrams/2025-12-10-clickhouse-pydantic-config-before.dot +20 -0
  11. exness_data_preprocess-1.2.0/docs/design/2025-12-10-clickhouse-e2e-validation-pipeline/spec.md +127 -0
  12. exness_data_preprocess-1.2.0/docs/design/2025-12-10-clickhouse-pydantic-config/spec.md +153 -0
  13. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/pyproject.toml +1 -1
  14. exness_data_preprocess-1.2.0/scripts/generate_dbeaver_config.py +212 -0
  15. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/src/exness_data_preprocess/__init__.py +15 -12
  16. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/src/exness_data_preprocess/clickhouse_client.py +24 -10
  17. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/src/exness_data_preprocess/clickhouse_gap_detector.py +0 -1
  18. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/src/exness_data_preprocess/clickhouse_manager.py +71 -103
  19. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/src/exness_data_preprocess/clickhouse_ohlc_generator.py +0 -1
  20. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/src/exness_data_preprocess/clickhouse_query_engine.py +232 -58
  21. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/src/exness_data_preprocess/gap_detector.py +0 -1
  22. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/src/exness_data_preprocess/models.py +53 -0
  23. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/src/exness_data_preprocess/processor.py +1 -2
  24. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/.cz.toml +0 -0
  25. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/.github/workflows/ci.yml +0 -0
  26. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/.github/workflows/pre-commit-autoupdate.yml +0 -0
  27. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/.github/workflows/publish.yml +0 -0
  28. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/.pre-commit-config.yaml +0 -0
  29. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/.releaserc.yml +0 -0
  30. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/CLAUDE.md +0 -0
  31. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/CONTRIBUTING.md +0 -0
  32. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/LICENSE +0 -0
  33. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/Makefile +0 -0
  34. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/README.md +0 -0
  35. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/cliff-release-notes.toml +0 -0
  36. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/cliff.toml +0 -0
  37. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/DATABASE_SCHEMA.md +0 -0
  38. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/EXNESS_DATA_SOURCES.md +0 -0
  39. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/MODULE_ARCHITECTURE.md +0 -0
  40. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/PRIORITY3_CLEANUP_PLAN.yaml +0 -0
  41. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/README.md +0 -0
  42. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/REPOSITORY_REFACTORING_PLAN.yaml +0 -0
  43. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/RESEARCH_PATTERNS.md +0 -0
  44. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/TRADING_HOURS_RESEARCH.md +0 -0
  45. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/UNIFIED_DUCKDB_PLAN_v2.md +0 -0
  46. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/adr/2025-12-09-codebase-pruning.md +0 -0
  47. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/adr/2025-12-09-exness-clickhouse-migration.md +0 -0
  48. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/archive/CLAUDE_MD_AUDIT_2025-10-16_PASS2.md +0 -0
  49. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/archive/CLAUDE_MD_VERIFICATION_CHECKLIST_2025-10-16.md +0 -0
  50. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/archive/CLAUDE_MD_VERIFICATION_FINDINGS_2025-10-16.md +0 -0
  51. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/archive/DOCUMENTATION_AUDIT_2025-10-15.md +0 -0
  52. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/archive/DOCUMENTATION_AUDIT_PASS2_2025-10-15.md +0 -0
  53. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/archive/DOCUMENTATION_BEST_PRACTICES_LINE_COUNTS.md +0 -0
  54. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/archive/E2E_TESTING_PLAN_v1.0.0.md +0 -0
  55. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/archive/EXCHANGE_SESSION_AUDIT_2025-10-17.md +0 -0
  56. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/archive/FUNCTIONALITY_VALIDATION_REPORT_2025-10-15.md +0 -0
  57. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/archive/FUNCTIONALITY_VALIDATION_REPORT_2025-10-16.md +0 -0
  58. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/archive/GAP_DETECTION_COMPARISON.md +0 -0
  59. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/archive/GAP_DETECTION_SQL_APPROACH.md +0 -0
  60. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/archive/PHASE4_DRY_RUN_CONFIG_PLAN.yaml +0 -0
  61. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/archive/PHASE7_v1.5.0_REFACTORING_PLAN.md +0 -0
  62. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/archive/PHASE7_v1.6.0_REFACTORING_PROGRESS.md +0 -0
  63. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/archive/PYDANTIC_REFACTORING_PLAN_v0.2.0_COMPLETE.md +0 -0
  64. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/archive/PYDANTIC_REFACTORING_STATUS_v0.2.0_COMPLETE.md +0 -0
  65. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/archive/REFACTORING_CHECKLIST.md +0 -0
  66. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/archive/RESEARCH_PATTERNS_CANONICALIZATION_2025-10-17.md +0 -0
  67. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/archive/SCHEMA_v1.6.0_AUDIT_FINDINGS.md +0 -0
  68. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/archive/SCHEMA_v1.6.0_MIGRATION_GUIDE.md +0 -0
  69. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/archive/SESSION_2025-10-15_SUMMARY.md +0 -0
  70. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/archive/UNIFIED_DUCKDB_PLAN_v1.0.0_LEGACY.md +0 -0
  71. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/archive/implementation-plan-2024-11-24.yaml +0 -0
  72. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/design/2025-12-09-codebase-pruning/spec.md +0 -0
  73. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/design/2025-12-09-exness-clickhouse-migration/spec.md +0 -0
  74. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/optimization/OPTIMIZATION_OPPORTUNITIES_2025-10-18.md +0 -0
  75. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/phases/PHASE2_SESSION_VECTORIZATION_PLAN.yaml +0 -0
  76. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/phases/PHASE3_SQL_GAP_DETECTION_PLAN.yaml +0 -0
  77. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/releases/RELEASE_NOTES.md +0 -0
  78. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/releases/RELEASE_NOTES_SHORT.md +0 -0
  79. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/HYBRID_SESSION_DETECTION_ANALYSIS.md +0 -0
  80. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/compression-benchmarks/README.md +0 -0
  81. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/compression-benchmarks/test_all_compression_methods.py +0 -0
  82. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/compression-benchmarks/test_delta_encoding_properly.py +0 -0
  83. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/compression-benchmarks/test_parquet_compression_methods.py +0 -0
  84. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/eurusd-spread-analysis/01-methodology.md +0 -0
  85. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/eurusd-spread-analysis/02-mode-truncated-analysis.md +0 -0
  86. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/eurusd-spread-analysis/03-hurdle-model-analysis.md +0 -0
  87. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/eurusd-spread-analysis/04-temporal-patterns.md +0 -0
  88. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/eurusd-spread-analysis/05-final-recommendations.md +0 -0
  89. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/eurusd-spread-analysis/README.md +0 -0
  90. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/eurusd-spread-analysis/scripts/reproduction_guide.md +0 -0
  91. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/eurusd-spread-analysis/visualizations/hurdle-model/hurdle_decomposition.png +0 -0
  92. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/eurusd-spread-analysis/visualizations/mode-truncated/cv_mode_comparison.png +0 -0
  93. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/eurusd-spread-analysis/visualizations/mode-truncated/distribution_overlay.png +0 -0
  94. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/eurusd-spread-analysis/visualizations/mode-truncated/signal_quality_comparison.png +0 -0
  95. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/eurusd-spread-analysis/visualizations/mode-truncated/variance_decomposition.png +0 -0
  96. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/eurusd-spread-analysis/visualizations/temporal/concentration_curve.png +0 -0
  97. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/eurusd-spread-analysis/visualizations/temporal/percentile_analysis.png +0 -0
  98. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/eurusd-zero-spread-deviations/01-methodology.md +0 -0
  99. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/eurusd-zero-spread-deviations/02-baseline-sep2024.md +0 -0
  100. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/eurusd-zero-spread-deviations/03-multiperiod-validation.md +0 -0
  101. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/eurusd-zero-spread-deviations/04-discoveries-and-plan-evolution.md +0 -0
  102. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/eurusd-zero-spread-deviations/README.md +0 -0
  103. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/eurusd-zero-spread-deviations/findings/baseline-sep2024-comprehensive-summary.md +0 -0
  104. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/eurusd-zero-spread-deviations/findings/phase2-mean-reversion-report.md +0 -0
  105. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/eurusd-zero-spread-deviations/findings/phase3-volatility-model-report.md +0 -0
  106. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/eurusd-zero-spread-deviations/findings/phase4-5-statistical-tests-survivorship-report.md +0 -0
  107. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/eurusd-zero-spread-deviations/scripts/baseline-sep2024/01_mean_reversion_analysis.py +0 -0
  108. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/eurusd-zero-spread-deviations/scripts/baseline-sep2024/02_volatility_model_simple.py +0 -0
  109. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/eurusd-zero-spread-deviations/scripts/baseline-sep2024/03_liquidity_crisis_detection.py +0 -0
  110. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/eurusd-zero-spread-deviations/scripts/baseline-sep2024/04_regime_detection_analysis.py +0 -0
  111. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase1_data_validation.py +0 -0
  112. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase2_mean_reversion.py +0 -0
  113. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase3_volatility_model.py +0 -0
  114. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase4_statistical_tests.py +0 -0
  115. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase5_survivorship_bias.py +0 -0
  116. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase5_survivorship_bias_v1.0.1.py +0 -0
  117. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase6a_interval_analysis.py +0 -0
  118. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase6b_price_clustering.py +0 -0
  119. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/eurusd-zero-spread-deviations/scripts/multiperiod-validation/phase6c_combined_pattern.py +0 -0
  120. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/eurusd-zero-spread-deviations/scripts/reproduction_guide.md +0 -0
  121. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/eurusd-zero-spread-deviations/scripts/visualization/diagnostic_burst_decay.py +0 -0
  122. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/eurusd-zero-spread-deviations/scripts/visualization/generate_interactive_dashboard.py +0 -0
  123. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/eurusd-zero-spread-deviations/scripts/visualization/generate_lightweight_dashboard.py +0 -0
  124. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/eurusd-zero-spread-deviations/scripts/visualization/prepare_visualization_data.py +0 -0
  125. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/research/gap_detection_implementation_example.py +0 -0
  126. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/setup/GITHUB_PYPI_SETUP.md +0 -0
  127. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/validation/ARCHITECTURE_AUDIT_2025-10-17.md +0 -0
  128. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/validation/ARCHITECTURE_EFFICIENCY_AUDIT_2025-10-18.md +0 -0
  129. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/validation/DOCUMENTATION_SURVEY_v1.7.0.md +0 -0
  130. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/validation/E2E_VALIDATION_RESULTS_v1.6.0.md +0 -0
  131. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/validation/SPIKE_TEST_RESULTS_PHASE1_2025-10-18.md +0 -0
  132. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/validation/SPIKE_TEST_RESULTS_PHASE2_2025-10-18.md +0 -0
  133. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/validation/WEEKEND_GAP_VALIDATION_SUMMARY.md +0 -0
  134. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/docs/validation/WORKSPACE_SURVEY_2025-10-17.md +0 -0
  135. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/examples/basic_usage.py +0 -0
  136. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/examples/batch_processing.py +0 -0
  137. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/package-lock.json +0 -0
  138. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/package.json +0 -0
  139. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/src/exness_data_preprocess/clickhouse_base.py +0 -0
  140. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/src/exness_data_preprocess/config.py +0 -0
  141. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/src/exness_data_preprocess/database_manager.py +0 -0
  142. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/src/exness_data_preprocess/downloader.py +0 -0
  143. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/src/exness_data_preprocess/exchanges.py +0 -0
  144. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/src/exness_data_preprocess/ohlc_generator.py +0 -0
  145. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/src/exness_data_preprocess/query_engine.py +0 -0
  146. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/src/exness_data_preprocess/schema.py +0 -0
  147. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/src/exness_data_preprocess/session_detector.py +0 -0
  148. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/src/exness_data_preprocess/tick_loader.py +0 -0
  149. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/tests/README.md +0 -0
  150. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/tests/__init__.py +0 -0
  151. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/tests/conftest.py +0 -0
  152. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/tests/test_basic.py +0 -0
  153. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/tests/test_functional_regression.py +0 -0
  154. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/tests/test_models.py +0 -0
  155. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/tests/test_processor_pydantic.py +0 -0
  156. {exness_data_preprocess-1.0.0 → exness_data_preprocess-1.2.0}/tests/test_types.py +0 -0
@@ -107,3 +107,8 @@ node_modules/
107
107
  # Link checking (lychee)
108
108
  .lychee*
109
109
  .lycheecache
110
+
111
+ # DBeaver (credentials in generated JSON)
112
+ # ADR: /docs/adr/2025-12-10-clickhouse-pydantic-config.md
113
+ .dbeaver/
114
+ .dbeaver-workspace/
@@ -1,7 +1,7 @@
1
1
  🔍 Scanning for non-repo-relative paths in: /Users/terryli/eon/exness-data-preprocess
2
2
  Violations: paths not starting with / or http(s)
3
3
 
4
- ❌ Found 141 violation(s):
4
+ ❌ Found 140 violation(s):
5
5
 
6
6
  /Users/terryli/eon/exness-data-preprocess/README.md:112:- **Column Definitions**: See [`schema.py`](src/exness_data_preprocess/schema.py) - Single source of truth
7
7
  /Users/terryli/eon/exness-data-preprocess/README.md:113:- **Comprehensive Reference**: See [`DATABASE_SCHEMA.md`](docs/DATABASE_SCHEMA.md) - Query examples and usage patterns
@@ -54,7 +54,7 @@
54
54
  /Users/terryli/eon/exness-data-preprocess/docs/DATABASE_SCHEMA.md:244:**Column Definitions**: See [`../src/exness_data_preprocess/schema.py`](../src/exness_data_preprocess/schema.py) for complete column definitions with types and descriptions.
55
55
  /Users/terryli/eon/exness-data-preprocess/docs/DATABASE_SCHEMA.md:258:**Architecture**: Exchange Registry Pattern (v1.6.0) - Session columns dynamically generated from centralized EXCHANGES dict in [`exchanges.py`](../src/exness_data_preprocess/exchanges.py)
56
56
 
57
- ... and 91 more (showing first 50)
57
+ ... and 90 more (showing first 50)
58
58
 
59
59
  📝 Fix: Convert relative paths to repo-relative paths starting with /
60
60
  WRONG: [Link](../docs/foo.md)
@@ -0,0 +1,509 @@
1
+ # mise configuration for exness-data-preprocess
2
+ # E2E validation workflow for codebase pruning verification
3
+
4
+ [env]
5
+ # Python version for validation
6
+ PYTHON_VERSION = "3.14"
7
+ # Package name
8
+ PACKAGE_NAME = "exness_data_preprocess"
9
+ # Validation temp directory
10
+ VALIDATION_TMP = "./tmp/validation"
11
+
12
+ # ADR: /docs/adr/2025-12-10-clickhouse-pydantic-config.md
13
+ # ClickHouse SSoT Configuration
14
+ # Connection identity
15
+ CLICKHOUSE_NAME = "exness-clickhouse-local"
16
+ CLICKHOUSE_MODE = "local" # "local" or "cloud"
17
+ CLICKHOUSE_TYPE = "dev" # "dev", "test", or "prod"
18
+ # Connection parameters (match existing clickhouse_client.py defaults)
19
+ CLICKHOUSE_HOST = "localhost"
20
+ CLICKHOUSE_PORT = "8123"
21
+ CLICKHOUSE_DATABASE = "exness"
22
+ # Output paths
23
+ DBEAVER_CONFIG_PATH = ".dbeaver/data-sources.json"
24
+ # Cloud credentials (read from .env for security)
25
+ # CLICKHOUSE_USER_READONLY - set in .env
26
+ # CLICKHOUSE_PASSWORD_READONLY - set in .env
27
+
28
+ [tools]
29
+ python = "3.14"
30
+
31
+ # =============================================================================
32
+ # Validation Tasks - E2E Testing Pipeline
33
+ # =============================================================================
34
+
35
+ [tasks.validate]
36
+ description = "Run full E2E validation pipeline"
37
+ # ADR: /docs/adr/2025-12-10-clickhouse-e2e-validation-pipeline.md
38
+ depends = [
39
+ "validate:imports",
40
+ "validate:lint",
41
+ "validate:typecheck",
42
+ "validate:test",
43
+ "validate:build",
44
+ "validate:install",
45
+ "validate:mixin",
46
+ ]
47
+ run = '''
48
+ echo ""
49
+ echo "=============================================="
50
+ echo "✅ ALL VALIDATIONS PASSED"
51
+ 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
+ '''
57
+
58
+ # -----------------------------------------------------------------------------
59
+ # Individual Validation Tasks
60
+ # -----------------------------------------------------------------------------
61
+
62
+ [tasks."validate:imports"]
63
+ description = "Validate all module imports (catch circular imports, missing deps)"
64
+ run = '''
65
+ #!/usr/bin/env bash
66
+ set -e
67
+ echo "🔍 Validating module imports..."
68
+
69
+ # Test package import
70
+ uv run python -c "import exness_data_preprocess" || { echo "❌ Package import failed"; exit 1; }
71
+
72
+ # Test all public exports
73
+ uv run python -c "
74
+ from exness_data_preprocess import (
75
+ ExnessDataProcessor,
76
+ UpdateResult,
77
+ CoverageInfo,
78
+ DryRunResult,
79
+ PairType,
80
+ TimeframeType,
81
+ VariantType,
82
+ supported_pairs,
83
+ supported_timeframes,
84
+ supported_variants,
85
+ # ClickHouse exports
86
+ ClickHouseManager,
87
+ ClickHouseGapDetector,
88
+ ClickHouseQueryEngine,
89
+ ClickHouseOHLCGenerator,
90
+ ClickHouseConnectionError,
91
+ ClickHouseQueryError,
92
+ get_clickhouse_client,
93
+ )
94
+ print('✅ All public exports importable')
95
+ " || { echo "❌ Public exports import failed"; exit 1; }
96
+
97
+ # Test all internal modules
98
+ uv run python -c "
99
+ modules = [
100
+ 'exness_data_preprocess.clickhouse_base',
101
+ 'exness_data_preprocess.clickhouse_client',
102
+ 'exness_data_preprocess.clickhouse_gap_detector',
103
+ 'exness_data_preprocess.clickhouse_manager',
104
+ 'exness_data_preprocess.clickhouse_ohlc_generator',
105
+ 'exness_data_preprocess.clickhouse_query_engine',
106
+ 'exness_data_preprocess.config',
107
+ 'exness_data_preprocess.database_manager',
108
+ 'exness_data_preprocess.downloader',
109
+ 'exness_data_preprocess.exchanges',
110
+ 'exness_data_preprocess.gap_detector',
111
+ 'exness_data_preprocess.models',
112
+ 'exness_data_preprocess.ohlc_generator',
113
+ 'exness_data_preprocess.processor',
114
+ 'exness_data_preprocess.query_engine',
115
+ 'exness_data_preprocess.schema',
116
+ 'exness_data_preprocess.session_detector',
117
+ 'exness_data_preprocess.tick_loader',
118
+ ]
119
+ import importlib
120
+ for mod in modules:
121
+ importlib.import_module(mod)
122
+ print(f' ✓ {mod}')
123
+ print('✅ All 18 modules importable')
124
+ "
125
+ echo "✅ Import validation passed"
126
+ '''
127
+
128
+ [tasks."validate:lint"]
129
+ description = "Run ruff linting"
130
+ run = '''
131
+ #!/usr/bin/env bash
132
+ set -e
133
+ echo "🔍 Running ruff check..."
134
+ uv run ruff check src/ tests/ --output-format=concise
135
+ echo "✅ Lint validation passed"
136
+ '''
137
+
138
+ [tasks."validate:typecheck"]
139
+ description = "Run mypy type checking"
140
+ run = '''
141
+ #!/usr/bin/env bash
142
+ set -e
143
+ echo "🔍 Running mypy..."
144
+ uv run mypy src/exness_data_preprocess/ --ignore-missing-imports --no-error-summary 2>&1 | head -50
145
+ echo "✅ Type check validation passed (warnings may exist)"
146
+ '''
147
+
148
+ [tasks."validate:test"]
149
+ description = "Run pytest test suite"
150
+ run = '''
151
+ #!/usr/bin/env bash
152
+ set -e
153
+ echo "🔍 Running pytest..."
154
+ uv run pytest tests/ -v --tb=short -q
155
+ echo "✅ Test validation passed"
156
+ '''
157
+
158
+ [tasks."validate:test-coverage"]
159
+ description = "Run pytest with coverage report"
160
+ run = '''
161
+ #!/usr/bin/env bash
162
+ set -e
163
+ echo "🔍 Running pytest with coverage..."
164
+ uv run pytest tests/ --cov=exness_data_preprocess --cov-report=term-missing --cov-report=html:tmp/coverage
165
+ echo ""
166
+ echo "📊 Coverage report: tmp/coverage/index.html"
167
+ '''
168
+
169
+ [tasks."validate:build"]
170
+ description = "Validate package builds correctly"
171
+ run = '''
172
+ #!/usr/bin/env bash
173
+ set -e
174
+ echo "🔍 Building package..."
175
+ rm -rf dist/
176
+ uv build 2>&1 | tail -5
177
+ echo ""
178
+ ls -la dist/
179
+ echo "✅ Build validation passed"
180
+ '''
181
+
182
+ [tasks."validate:install"]
183
+ description = "Test fresh install in isolated environment"
184
+ depends = ["validate:build"]
185
+ run = '''
186
+ #!/usr/bin/env bash
187
+ set -e
188
+ echo "🔍 Testing fresh install..."
189
+
190
+ # Create isolated temp venv
191
+ TMPDIR=$(mktemp -d)
192
+ trap "rm -rf $TMPDIR" EXIT
193
+
194
+ # Create fresh venv and install wheel using uv
195
+ uv venv "$TMPDIR/venv" --python 3.14 -q
196
+ WHEEL=$(ls dist/*.whl | head -1)
197
+ uv pip install "$WHEEL" --python "$TMPDIR/venv/bin/python" -q
198
+
199
+ # Test import in fresh environment
200
+ "$TMPDIR/venv/bin/python" -c "
201
+ import exness_data_preprocess as edp
202
+ print(f'Version: {edp.__version__}')
203
+ print(f'Processor: {edp.ExnessDataProcessor}')
204
+ print(f'ClickHouseManager: {edp.ClickHouseManager}')
205
+ print('✅ Fresh install works')
206
+ "
207
+ echo "✅ Install validation passed"
208
+ '''
209
+
210
+ # -----------------------------------------------------------------------------
211
+ # Mixin Validation
212
+ # -----------------------------------------------------------------------------
213
+
214
+ [tasks."validate:mixin"]
215
+ description = "Validate ClickHouseClientMixin inheritance"
216
+ run = '''
217
+ #!/usr/bin/env bash
218
+ set -e
219
+ echo "🔍 Validating ClickHouseClientMixin..."
220
+
221
+ uv run python -c "
222
+ from exness_data_preprocess.clickhouse_base import ClickHouseClientMixin
223
+ from exness_data_preprocess.clickhouse_manager import ClickHouseManager
224
+ from exness_data_preprocess.clickhouse_gap_detector import ClickHouseGapDetector
225
+ from exness_data_preprocess.clickhouse_query_engine import ClickHouseQueryEngine
226
+ from exness_data_preprocess.clickhouse_ohlc_generator import ClickHouseOHLCGenerator
227
+
228
+ # Verify inheritance
229
+ classes = [
230
+ ('ClickHouseManager', ClickHouseManager),
231
+ ('ClickHouseGapDetector', ClickHouseGapDetector),
232
+ ('ClickHouseQueryEngine', ClickHouseQueryEngine),
233
+ ('ClickHouseOHLCGenerator', ClickHouseOHLCGenerator),
234
+ ]
235
+
236
+ for name, cls in classes:
237
+ assert issubclass(cls, ClickHouseClientMixin), f'{name} should inherit from ClickHouseClientMixin'
238
+ print(f' ✓ {name} inherits ClickHouseClientMixin')
239
+
240
+ # Verify mixin methods exist at class level (properties/methods are on class, not instance)
241
+ for name, cls in classes:
242
+ assert hasattr(cls, 'client'), f'{name} missing client property'
243
+ assert hasattr(cls, 'close'), f'{name} missing close method'
244
+ assert hasattr(cls, '_init_client'), f'{name} missing _init_client method'
245
+ print(f' ✓ {name} has mixin methods')
246
+
247
+ print('✅ Mixin validation passed')
248
+ "
249
+ '''
250
+
251
+ # -----------------------------------------------------------------------------
252
+ # Quick Tasks
253
+ # -----------------------------------------------------------------------------
254
+
255
+ [tasks.test]
256
+ description = "Run tests (alias for validate:test)"
257
+ alias = "t"
258
+ run = "uv run pytest tests/ -v --tb=short"
259
+
260
+ [tasks.lint]
261
+ description = "Run linting (alias for validate:lint)"
262
+ alias = "l"
263
+ run = "uv run ruff check src/ tests/"
264
+
265
+ [tasks.fix]
266
+ description = "Auto-fix linting issues"
267
+ run = "uv run ruff check --fix src/ tests/ && uv run ruff format src/ tests/"
268
+
269
+ # -----------------------------------------------------------------------------
270
+ # CI Simulation
271
+ # -----------------------------------------------------------------------------
272
+
273
+ [tasks.ci]
274
+ description = "Simulate CI pipeline locally"
275
+ depends = ["validate"]
276
+ depends_post = ["validate:test-coverage"]
277
+ run = '''
278
+ echo ""
279
+ echo "=============================================="
280
+ echo "✅ CI SIMULATION COMPLETE"
281
+ echo "=============================================="
282
+ '''
283
+
284
+ # =============================================================================
285
+ # ClickHouse Server Management
286
+ # ADR: /docs/adr/2025-12-10-clickhouse-e2e-validation-pipeline.md
287
+ # =============================================================================
288
+
289
+ [tasks."clickhouse:start"]
290
+ description = "Start mise-installed ClickHouse server"
291
+ run = '''
292
+ #!/usr/bin/env bash
293
+ set -euo pipefail
294
+
295
+ SHIM="${HOME}/.local/share/mise/shims/clickhouse"
296
+
297
+ # Check mise ClickHouse installation
298
+ if [[ ! -x "${SHIM}" ]]; then
299
+ echo "ERROR: mise ClickHouse not found. Install: mise install clickhouse" >&2
300
+ exit 1
301
+ fi
302
+
303
+ # Check if already running
304
+ if nc -z localhost 8123 2>/dev/null; then
305
+ echo "✅ ClickHouse already running on port 8123"
306
+ "${SHIM}" client --query "SELECT version()"
307
+ exit 0
308
+ fi
309
+
310
+ # Start server in daemon mode
311
+ echo "Starting ClickHouse server..."
312
+ "${SHIM}" server --daemon
313
+
314
+ # Wait for server to be ready
315
+ for i in $(seq 1 10); do
316
+ if nc -z localhost 8123 2>/dev/null; then
317
+ echo "✅ ClickHouse server started"
318
+ "${SHIM}" client --query "SELECT version()"
319
+ exit 0
320
+ fi
321
+ sleep 1
322
+ done
323
+
324
+ echo "ERROR: ClickHouse failed to start" >&2
325
+ exit 1
326
+ '''
327
+
328
+ [tasks."clickhouse:stop"]
329
+ description = "Stop mise-installed ClickHouse server"
330
+ run = '''
331
+ #!/usr/bin/env bash
332
+ if pkill -f "clickhouse server" 2>/dev/null; then
333
+ echo "✅ ClickHouse server stopped"
334
+ else
335
+ echo "ClickHouse was not running"
336
+ fi
337
+ '''
338
+
339
+ [tasks."clickhouse:status"]
340
+ description = "Check ClickHouse connection via Python client"
341
+ run = '''
342
+ #!/usr/bin/env bash
343
+ set -e
344
+
345
+ if ! nc -z localhost 8123 2>/dev/null; then
346
+ echo "❌ ClickHouse not running on port 8123"
347
+ exit 1
348
+ fi
349
+
350
+ uv run python -c "
351
+ from exness_data_preprocess import get_clickhouse_client
352
+ from exness_data_preprocess.clickhouse_client import check_connection
353
+ client = get_clickhouse_client()
354
+ check_connection(client)
355
+ print('✅ ClickHouse connection OK')
356
+ client.close()
357
+ "
358
+ '''
359
+
360
+ # =============================================================================
361
+ # ClickHouse E2E Validation Tasks
362
+ # ADR: /docs/adr/2025-12-10-clickhouse-e2e-validation-pipeline.md
363
+ # =============================================================================
364
+
365
+ [tasks."validate:clickhouse"]
366
+ description = "Run all ClickHouse E2E validations with real data"
367
+ depends = ["clickhouse:status"]
368
+ run = '''
369
+ #!/usr/bin/env bash
370
+ set -e
371
+ echo "🔍 Running ClickHouse E2E validation..."
372
+ mise run validate:clickhouse-schema
373
+ mise run validate:clickhouse-data
374
+ mise run validate:clickhouse-pagination
375
+ mise run validate:clickhouse-ohlc
376
+ echo "✅ All ClickHouse validations passed"
377
+ '''
378
+
379
+ [tasks."validate:clickhouse-schema"]
380
+ description = "Validate ClickHouse schema creation"
381
+ depends = ["clickhouse:status"]
382
+ run = '''
383
+ #!/usr/bin/env bash
384
+ set -e
385
+ echo "🔍 Validating ClickHouse schema..."
386
+ uv run python -c "
387
+ from exness_data_preprocess import ClickHouseManager
388
+
389
+ manager = ClickHouseManager()
390
+ manager.ensure_schema()
391
+ print(' ✓ ticks table created')
392
+ print(' ✓ ohlc table created')
393
+ manager.close()
394
+ print('✅ Schema validation passed')
395
+ "
396
+ '''
397
+
398
+ [tasks."validate:clickhouse-data"]
399
+ description = "Validate ClickHouse data queries with real Exness data"
400
+ depends = ["validate:clickhouse-schema"]
401
+ run = '''
402
+ #!/usr/bin/env bash
403
+ set -e
404
+ echo "🔍 Validating ClickHouse data operations..."
405
+ uv run python -c "
406
+ from exness_data_preprocess import ClickHouseQueryEngine
407
+
408
+ engine = ClickHouseQueryEngine()
409
+
410
+ # Query with limit to verify functionality
411
+ df = engine.query_ticks('EURUSD', limit=1000)
412
+ print(f' ✓ query_ticks returned {len(df)} rows')
413
+
414
+ # Verify columns
415
+ expected_cols = ['timestamp', 'bid', 'ask']
416
+ for col in expected_cols:
417
+ assert col in df.columns, f'Missing column: {col}'
418
+ print(' ✓ All expected columns present')
419
+
420
+ engine.close()
421
+ print('✅ Data validation passed')
422
+ "
423
+ '''
424
+
425
+ [tasks."validate:clickhouse-pagination"]
426
+ description = "Validate ClickHouse pagination (LIMIT/OFFSET/cursor/batch)"
427
+ depends = ["validate:clickhouse-schema"]
428
+ run = '''
429
+ #!/usr/bin/env bash
430
+ set -e
431
+ echo "🔍 Validating ClickHouse pagination..."
432
+ uv run python -c "
433
+ from exness_data_preprocess import ClickHouseQueryEngine
434
+
435
+ engine = ClickHouseQueryEngine()
436
+
437
+ # Test LIMIT
438
+ df1 = engine.query_ticks('EURUSD', limit=100)
439
+ assert len(df1) <= 100, f'LIMIT failed: got {len(df1)} rows'
440
+ print(f' ✓ LIMIT=100 returned {len(df1)} rows')
441
+
442
+ # Test OFFSET
443
+ df2 = engine.query_ticks('EURUSD', limit=100, offset=100)
444
+ assert len(df2) <= 100, f'OFFSET failed: got {len(df2)} rows'
445
+ print(f' ✓ LIMIT=100 OFFSET=100 returned {len(df2)} rows')
446
+
447
+ # Test cursor-based pagination
448
+ result = engine.query_ticks_paginated('EURUSD', page_size=1000)
449
+ print(f' ✓ Cursor pagination: {len(result.data)} rows, has_more={result.has_more}')
450
+
451
+ # Test batch iterator
452
+ batches = list(engine.query_ticks_batches('EURUSD', batch_size=1000, max_batches=3))
453
+ print(f' ✓ Batch iterator: {len(batches)} batches')
454
+
455
+ engine.close()
456
+ print('✅ Pagination validation passed')
457
+ "
458
+ '''
459
+
460
+ [tasks."validate:clickhouse-ohlc"]
461
+ description = "Validate ClickHouse OHLC queries"
462
+ depends = ["validate:clickhouse-schema"]
463
+ run = '''
464
+ #!/usr/bin/env bash
465
+ set -e
466
+ echo "🔍 Validating ClickHouse OHLC queries..."
467
+ uv run python -c "
468
+ from exness_data_preprocess import ClickHouseQueryEngine
469
+
470
+ engine = ClickHouseQueryEngine()
471
+
472
+ # Query OHLC with limit
473
+ df = engine.query_ohlc('EURUSD', timeframe='1h', limit=100)
474
+ print(f' ✓ query_ohlc(1h) returned {len(df)} bars')
475
+
476
+ # Verify OHLC columns exist (if data present)
477
+ if len(df) > 0:
478
+ ohlc_cols = ['open', 'high', 'low', 'close']
479
+ for col in ohlc_cols:
480
+ assert col in df.columns, f'Missing OHLC column: {col}'
481
+ print(' ✓ All OHLC columns present')
482
+ else:
483
+ print(' ⚠ No OHLC data available (expected if no data loaded)')
484
+
485
+ engine.close()
486
+ print('✅ OHLC validation passed')
487
+ "
488
+ '''
489
+
490
+ # =============================================================================
491
+ # DBeaver Config Generation
492
+ # ADR: /docs/adr/2025-12-10-clickhouse-pydantic-config.md
493
+ # =============================================================================
494
+
495
+ [tasks.db-client-generate]
496
+ description = "Generate DBeaver config from Pydantic model"
497
+ run = "uv run scripts/generate_dbeaver_config.py --output ${DBEAVER_CONFIG_PATH}"
498
+
499
+ [tasks."db-client:cloud"]
500
+ description = "Generate config for ClickHouse Cloud"
501
+ run = "uv run scripts/generate_dbeaver_config.py --mode cloud --output ${DBEAVER_CONFIG_PATH}"
502
+
503
+ [tasks."db-client:dry-run"]
504
+ description = "Preview generated config without writing"
505
+ run = "uv run scripts/generate_dbeaver_config.py --dry-run"
506
+
507
+ [tasks.dbeaver]
508
+ description = "Launch DBeaver with project workspace"
509
+ run = '"/Applications/DBeaver.app/Contents/MacOS/dbeaver" -data .dbeaver-workspace &'
@@ -1,3 +1,22 @@
1
+ # [1.2.0](https://github.com/terrylica/exness-data-preprocess/compare/v1.1.0...v1.2.0) (2025-12-10)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * **clickhouse:** resolve E2E validation bugs in schema and query engine ([5c618f7](https://github.com/terrylica/exness-data-preprocess/commit/5c618f717cadc23097e9fd11d2fed87947ecf25f))
7
+
8
+
9
+ ### Features
10
+
11
+ * add DBeaver config generation with CLICKHOUSE_MODE support ([0e97618](https://github.com/terrylica/exness-data-preprocess/commit/0e9761818f137461623f744af92f0b1e98b3a797))
12
+
13
+ # [1.1.0](https://github.com/terrylica/exness-data-preprocess/compare/v1.0.0...v1.1.0) (2025-12-10)
14
+
15
+
16
+ ### Features
17
+
18
+ * add ClickHouse E2E validation pipeline with pagination API ([2ec7325](https://github.com/terrylica/exness-data-preprocess/commit/2ec7325905459f3073e591af4f800b942de9a099))
19
+
1
20
  # [1.0.0](https://github.com/terrylica/exness-data-preprocess/compare/v0.8.0...v1.0.0) (2025-12-10)
2
21
 
3
22
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: exness-data-preprocess
3
- Version: 1.0.0
3
+ Version: 1.2.0
4
4
  Summary: Professional Exness forex tick data preprocessing with optimal compression (Parquet Zstd-22) and DuckDB OHLC generation. Provides efficient storage (9% smaller than ZIP) with lossless precision and direct queryability.
5
5
  Project-URL: Homepage, https://github.com/terrylica/exness-data-preprocess
6
6
  Project-URL: Documentation, https://github.com/terrylica/exness-data-preprocess#readme