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