gapless-crypto-data 4.0.2__tar.gz → 5.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 (203) hide show
  1. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/.releaserc.json +3 -2
  2. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/CHANGELOG.md +29 -0
  3. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/PKG-INFO +7 -2
  4. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/README.md +6 -1
  5. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/plan/0005-earthly-release-pipeline/plan.md +7 -8
  6. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/pyproject.toml +1 -1
  7. gapless_crypto_data-5.0.0/src/gapless_crypto_data/__init__.py +92 -0
  8. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/api.py +23 -1
  9. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/uv.lock +1 -1
  10. gapless_crypto_data-4.0.2/src/gapless_crypto_data/__init__.py +0 -134
  11. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/.claude/settings.local.json +0 -0
  12. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/.gitattributes +0 -0
  13. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/.github/workflows/publish.yml +0 -0
  14. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/.github/workflows/release.yml +0 -0
  15. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/.gitignore +0 -0
  16. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/.pre-commit-config.yaml +0 -0
  17. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/.python-version +0 -0
  18. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/.sessions/.gitignore +0 -0
  19. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/AUTHORS.md +0 -0
  20. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/CLAUDE.md +0 -0
  21. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/CONTRIBUTING.md +0 -0
  22. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/DOCUMENTATION.md +0 -0
  23. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/Earthfile +0 -0
  24. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/LICENSE +0 -0
  25. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/MANIFEST.in +0 -0
  26. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/PROBE_USAGE_EXAMPLE.md +0 -0
  27. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/cliff-release-notes.toml +0 -0
  28. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/cliff.toml +0 -0
  29. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/CURRENT_ARCHITECTURE_STATUS.yaml +0 -0
  30. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/PYPI_PUBLISHING_CONFIGURATION.yaml +0 -0
  31. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/README.md +0 -0
  32. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/SDK_QUALITY_STANDARDS.yaml +0 -0
  33. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/SSOT_DOCUMENTATION_ARCHITECTURE.yaml +0 -0
  34. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/SSOT_PLANNING_SUMMARY.md +0 -0
  35. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/api/dual-parameter-enhancement.yaml +0 -0
  36. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/api/gapless-dataframe-enhancement.yaml +0 -0
  37. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/api/pruning-parquet-implementation.yaml +0 -0
  38. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/api/quick-start.md +0 -0
  39. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/architecture/DATA_FORMAT.md +0 -0
  40. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/architecture/OVERVIEW.md +0 -0
  41. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/architecture/decisions/0001-repository-split-clickhouse.md +0 -0
  42. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/architecture/decisions/0002-lychee-link-validation.md +0 -0
  43. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/architecture/decisions/0003-repository-housekeeping.md +0 -0
  44. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/architecture/decisions/0004-yaml-audit-redundancy-removal.md +0 -0
  45. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/architecture/decisions/0005-earthly-release-pipeline.md +0 -0
  46. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/audit/comprehensive-audit-findings.yaml +0 -0
  47. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/audit/comprehensive-audit-plan.yaml +0 -0
  48. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/development/CLI_MIGRATION_GUIDE.md +0 -0
  49. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/development/COMMANDS.md +0 -0
  50. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/development/PUBLISHING.md +0 -0
  51. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/development/SETUP.md +0 -0
  52. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/diagrams/01-collection-pipeline.mmd +0 -0
  53. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/diagrams/02-gap-filling.mmd +0 -0
  54. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/diagrams/03-multi-symbol-collection.mmd +0 -0
  55. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/diagrams/04-download-caching.mmd +0 -0
  56. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/diagrams/05-validation-flow.mmd +0 -0
  57. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/diagrams/README.md +0 -0
  58. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/guides/DATA_COLLECTION.md +0 -0
  59. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/guides/pypi-documentation.md +0 -0
  60. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/guides/python-api.md +0 -0
  61. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/milestones/archive/MILESTONE_v3.0.0.yaml +0 -0
  62. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/milestones/archive/MILESTONE_v3.1.0.yaml +0 -0
  63. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/plan/0001-v4.0.1-release/plan.md +0 -0
  64. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/plan/0002-lychee-link-validation/plan.md +0 -0
  65. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/plan/0003-repository-housekeeping/plan.md +0 -0
  66. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/plan/0004-yaml-audit-redundancy-removal/plan.md +0 -0
  67. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/release-notes.md +0 -0
  68. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/validation/OVERVIEW.md +0 -0
  69. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/validation/QUERY_PATTERNS.md +0 -0
  70. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/validation/STORAGE.md +0 -0
  71. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/examples/README.md +0 -0
  72. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/examples/advanced_api_examples.py +0 -0
  73. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/examples/basic_data_collection.py +0 -0
  74. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/examples/cli_usage_examples.sh +0 -0
  75. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/examples/complete_workflow.py +0 -0
  76. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/examples/gap_filling_example.py +0 -0
  77. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/examples/safe_data_collection.py +0 -0
  78. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/examples/simple_api_examples.py +0 -0
  79. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/llms.txt +0 -0
  80. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/lychee.toml +0 -0
  81. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/package.json +0 -0
  82. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/scripts/publish-to-pypi.sh +0 -0
  83. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/scripts/test-pushover.sh +0 -0
  84. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/__probe__.py +0 -0
  85. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/cli.py +0 -0
  86. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/collectors/__init__.py +0 -0
  87. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/collectors/binance_public_data_collector.py +0 -0
  88. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/collectors/concurrent_collection_orchestrator.py +0 -0
  89. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/collectors/httpx_downloader.py +0 -0
  90. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/collectors/hybrid_url_generator.py +0 -0
  91. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/exceptions.py +0 -0
  92. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/gap_filling/__init__.py +0 -0
  93. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/gap_filling/safe_file_operations.py +0 -0
  94. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/gap_filling/universal_gap_filler.py +0 -0
  95. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/py.typed +0 -0
  96. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/resume/__init__.py +0 -0
  97. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/resume/intelligent_checkpointing.py +0 -0
  98. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20240101-20240102_v2.10.0.csv +0 -0
  99. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20240101-20240102_v2.10.0.metadata.json +0 -0
  100. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20240101-20240102_v2.5.0.csv +0 -0
  101. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20240101-20240102_v2.5.0.metadata.json +0 -0
  102. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20250819-20250831_v2.5.0.csv +0 -0
  103. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20250819-20250831_v2.5.0.metadata.json +0 -0
  104. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20250921-20250921_v2.10.0.csv +0 -0
  105. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20250921-20250921_v2.10.0.metadata.json +0 -0
  106. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20251002-20251002_v2.10.0.csv +0 -0
  107. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20251002-20251002_v2.10.0.metadata.json +0 -0
  108. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20251015-20251016_v2.10.0.csv +0 -0
  109. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20251015-20251016_v2.10.0.metadata.json +0 -0
  110. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20251016-20251016_v2.10.0.csv +0 -0
  111. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20251016-20251016_v2.10.0.metadata.json +0 -0
  112. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20251016-20251017_v2.10.0.csv +0 -0
  113. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20251016-20251017_v2.10.0.metadata.json +0 -0
  114. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20251017-20251017_v2.10.0.csv +0 -0
  115. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20251017-20251017_v2.10.0.metadata.json +0 -0
  116. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20251116-20251117_v2.10.0.csv +0 -0
  117. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20251116-20251117_v2.10.0.metadata.json +0 -0
  118. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20251117-20251117_v2.10.0.csv +0 -0
  119. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20251117-20251117_v2.10.0.metadata.json +0 -0
  120. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1h_20240101-20240101_v2.5.0.csv +0 -0
  121. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1h_20240101-20240101_v2.5.0.metadata.json +0 -0
  122. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1h_20240101-20240102_v2.10.0.csv +0 -0
  123. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1h_20240101-20240102_v2.10.0.metadata.json +0 -0
  124. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1h_20240101-20240102_v2.5.0.csv +0 -0
  125. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1h_20240101-20240102_v2.5.0.metadata.json +0 -0
  126. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1h_20250918-20250921_v2.10.0.csv +0 -0
  127. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1h_20250918-20250921_v2.10.0.metadata.json +0 -0
  128. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1h_20251016-20251016_v2.10.0.csv +0 -0
  129. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1h_20251016-20251016_v2.10.0.metadata.json +0 -0
  130. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1h_20251017-20251017_v2.10.0.csv +0 -0
  131. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1h_20251017-20251017_v2.10.0.metadata.json +0 -0
  132. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1h_20251117-20251117_v2.10.0.csv +0 -0
  133. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1h_20251117-20251117_v2.10.0.metadata.json +0 -0
  134. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-4h_20240101-20240101_v2.5.0.csv +0 -0
  135. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-4h_20240101-20240101_v2.5.0.metadata.json +0 -0
  136. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-5m_20230320-20230328_v2.10.0.csv +0 -0
  137. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-5m_20230320-20230328_v2.10.0.metadata.json +0 -0
  138. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-5m_20230323-20230325_v2.10.0.csv +0 -0
  139. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-5m_20230323-20230325_v2.10.0.metadata.json +0 -0
  140. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-1d_20250819-20250831_v2.5.0.csv +0 -0
  141. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-1d_20250819-20250831_v2.5.0.metadata.json +0 -0
  142. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-1h_20240101-20240101_v2.10.0.csv +0 -0
  143. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-1h_20240101-20240101_v2.10.0.metadata.json +0 -0
  144. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-1h_20240101-20240101_v2.5.0.csv +0 -0
  145. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-1h_20240101-20240101_v2.5.0.metadata.json +0 -0
  146. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-1h_20251001-20251002_v2.10.0.csv +0 -0
  147. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-1h_20251001-20251002_v2.10.0.metadata.json +0 -0
  148. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-1h_20251014-20251016_v2.10.0.csv +0 -0
  149. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-1h_20251014-20251016_v2.10.0.metadata.json +0 -0
  150. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-1h_20251015-20251016_v2.10.0.csv +0 -0
  151. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-1h_20251015-20251016_v2.10.0.metadata.json +0 -0
  152. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-1h_20251015-20251017_v2.10.0.csv +0 -0
  153. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-1h_20251015-20251017_v2.10.0.metadata.json +0 -0
  154. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-1h_20251016-20251017_v2.10.0.csv +0 -0
  155. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-1h_20251016-20251017_v2.10.0.metadata.json +0 -0
  156. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-1h_20251115-20251117_v2.10.0.csv +0 -0
  157. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-1h_20251115-20251117_v2.10.0.metadata.json +0 -0
  158. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-1h_20251116-20251117_v2.10.0.csv +0 -0
  159. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-1h_20251116-20251117_v2.10.0.metadata.json +0 -0
  160. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-4h_20240101-20240201_v2.5.0.csv +0 -0
  161. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-4h_20240101-20240201_v2.5.0.metadata.json +0 -0
  162. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-5m_20230320-20230328_v2.10.0.csv +0 -0
  163. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-5m_20230320-20230328_v2.10.0.metadata.json +0 -0
  164. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_SOLUSDT-1d_20250819-20250831_v2.5.0.csv +0 -0
  165. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_SOLUSDT-1d_20250819-20250831_v2.5.0.metadata.json +0 -0
  166. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_SOLUSDT-1h_20240101-20240101_v2.5.0.csv +0 -0
  167. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/sample_data/binance_spot_SOLUSDT-1h_20240101-20240101_v2.5.0.metadata.json +0 -0
  168. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/utils/__init__.py +0 -0
  169. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/utils/error_handling.py +0 -0
  170. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/utils/etag_cache.py +0 -0
  171. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/utils/timeframe_constants.py +0 -0
  172. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/utils/timestamp_format_analyzer.py +0 -0
  173. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/validation/__init__.py +0 -0
  174. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/validation/csv_validator.py +0 -0
  175. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/validation/models.py +0 -0
  176. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/validation/storage.py +0 -0
  177. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/__init__.py +0 -0
  178. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/conftest.py +0 -0
  179. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/fixtures/test_data/binance_spot_BTCUSDT-1h_20240101-20240101_v2.10.0.csv +0 -0
  180. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/fixtures/test_data/binance_spot_BTCUSDT-1h_20240101-20240101_v2.10.0.metadata.json +0 -0
  181. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/fixtures/test_data_large/binance_spot_BTCUSDT-1h_20140101-20240101_v2.10.0.csv +0 -0
  182. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/fixtures/test_data_large/binance_spot_BTCUSDT-1h_20140101-20240101_v2.10.0.metadata.json +0 -0
  183. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/fixtures/test_data_large/binance_spot_BTCUSDT-1h_20140101-20240101_v2.10.0_gapped.csv.bak +0 -0
  184. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/test_1s_1d_gap_filling.py +0 -0
  185. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/test_api_edge_cases.py +0 -0
  186. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/test_atomic_operations.py +0 -0
  187. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/test_binance_collector.py +0 -0
  188. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/test_binance_collector_advanced.py +0 -0
  189. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/test_cli.py +0 -0
  190. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/test_cli_integration.py +0 -0
  191. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/test_concurrent_download.py +0 -0
  192. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/test_error_handling.py +0 -0
  193. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/test_etag_cache.py +0 -0
  194. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/test_gap_filler.py +0 -0
  195. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/test_gapless_validation_1d_2018_present.py +0 -0
  196. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/test_integration.py +0 -0
  197. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/test_monthly_to_daily_fallback.py +0 -0
  198. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/test_output_dir_dataframe_fix.py +0 -0
  199. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/test_package.py +0 -0
  200. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/test_probe_module.py +0 -0
  201. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/test_simple_api.py +0 -0
  202. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/test_timeframe_constants.py +0 -0
  203. {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/test_validation_storage.py +0 -0
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/semantic-release.json",
3
3
  "branches": ["main"],
4
+ "repositoryUrl": "git@github.com:terrylica/gapless-crypto-data.git",
4
5
  "tagFormat": "v${version}",
5
6
  "plugins": [
6
7
  [
@@ -47,14 +48,14 @@
47
48
  [
48
49
  "@semantic-release/exec",
49
50
  {
50
- "prepareCmd": "sed -i.bak 's/^version = \".*\"/version = \"${nextRelease.version}\"/' pyproject.toml && rm -f pyproject.toml.bak",
51
+ "prepareCmd": "sed -i.bak 's/^version = \".*\"/version = \"${nextRelease.version}\"/' pyproject.toml && rm -f pyproject.toml.bak && sed -i.bak 's/^__version__ = \".*\"/__version__ = \"${nextRelease.version}\"/' src/gapless_crypto_data/__init__.py && rm -f src/gapless_crypto_data/__init__.py.bak",
51
52
  "publishCmd": "echo 'Version ${nextRelease.version} prepared for release'"
52
53
  }
53
54
  ],
54
55
  [
55
56
  "@semantic-release/git",
56
57
  {
57
- "assets": ["CHANGELOG.md", "pyproject.toml"],
58
+ "assets": ["CHANGELOG.md", "pyproject.toml", "src/gapless_crypto_data/__init__.py"],
58
59
  "message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"
59
60
  }
60
61
  ],
@@ -2,6 +2,35 @@
2
2
 
3
3
  All notable changes to gapless-crypto-data will be documented in this file.
4
4
 
5
+ ## [5.0.0](https://github.com/terrylica/gapless-crypto-data/compare/v4.0.1...v5.0.0) (2026-01-02)
6
+
7
+ ### ⚠ BREAKING CHANGES
8
+
9
+ * **ci:** CI no longer runs tests. Run `uv run pytest` locally before push.
10
+
11
+ Refs: ADR-0005
12
+
13
+ ### Features
14
+
15
+ * **ci:** add Earthly pipeline and semantic-release configuration ([a45a321](https://github.com/terrylica/gapless-crypto-data/commit/a45a32144ac0b0f663e8425253b78a9f9f58f9d3))
16
+ * **ci:** add Pushover notification scripts and update gitignore ([a403ffd](https://github.com/terrylica/gapless-crypto-data/commit/a403ffd3501a850690de77875fe32ec5f557f6c0))
17
+
18
+ ### Bug Fixes
19
+
20
+ * **api:** ensure datetime64 types after CSV reload ([2a3afbc](https://github.com/terrylica/gapless-crypto-data/commit/2a3afbc8568bd268fb6c01811249cfb690b7ee4a)), closes [#90](https://github.com/terrylica/gapless-crypto-data/issues/90)
21
+ * **ci:** add --no-install-project flag to Earthly deps targets ([a7b776e](https://github.com/terrylica/gapless-crypto-data/commit/a7b776e69ef45cf4479f3851a097d1adf87a7f7c))
22
+ * **ci:** use correct Doppler secret names for Pushover ([54c3e4e](https://github.com/terrylica/gapless-crypto-data/commit/54c3e4e122a151359418b7b6c97d1e15e7c7865d))
23
+ * **config:** correct repository and project names in automation ([44b1b27](https://github.com/terrylica/gapless-crypto-data/commit/44b1b27d5b9b0dfb461bde3a6b127b51092a1318))
24
+ * **docs:** correct version references and feature status ([4c1a2da](https://github.com/terrylica/gapless-crypto-data/commit/4c1a2da4d2041fa80de3b1876d7b7e39b9ec69c7))
25
+ * **docs:** fix broken links and standardize file paths ([30e332e](https://github.com/terrylica/gapless-crypto-data/commit/30e332eeb24e5aba478ab05ff19438f3715c1fd5))
26
+
27
+ ### Refactoring
28
+
29
+ * **ci:** remove tests from GitHub Actions per local-first policy ([9e149c7](https://github.com/terrylica/gapless-crypto-data/commit/9e149c7b16093cd235583db91b4bd9e5ae723f0a))
30
+ * **docs:** apply AOD/IOI principles and remove magic numbers ([2bc7b58](https://github.com/terrylica/gapless-crypto-data/commit/2bc7b58909d976295583e4980e8b030d053bbb0e))
31
+ * **docs:** apply AOD/IOI principles to README ([cb810dd](https://github.com/terrylica/gapless-crypto-data/commit/cb810dd1961beb1f272d03e0d724a6e473be98ff))
32
+ * **naming:** standardize SDK standards YAML to UPPERCASE convention ([5b47371](https://github.com/terrylica/gapless-crypto-data/commit/5b47371068575956eec6c6c0c9c6d51640c69182))
33
+
5
34
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
35
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
36
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gapless-crypto-data
3
- Version: 4.0.2
3
+ Version: 5.0.0
4
4
  Summary: Cryptocurrency OHLCV data collection with gap-free guarantee. Retrieves microstructure-enriched kline data from Binance Public Data Repository with automatic gap detection and filling.
5
5
  Project-URL: Homepage, https://github.com/terrylica/gapless-crypto-data
6
6
  Project-URL: Documentation, https://github.com/terrylica/gapless-crypto-data#readme
@@ -92,7 +92,12 @@ See [Data Format Specification](https://github.com/terrylica/gapless-crypto-data
92
92
 
93
93
  ## Supported Timeframes
94
94
 
95
- All Binance spot kline intervals: `1s`, `1m`, `3m`, `5m`, `15m`, `30m`, `1h`, `2h`, `4h`, `6h`, `8h`, `12h`, `1d`
95
+ All Binance spot kline intervals. Query dynamically:
96
+
97
+ ```python
98
+ import gapless_crypto_data as gcd
99
+ print(gcd.get_supported_timeframes())
100
+ ```
96
101
 
97
102
  ## API Reference
98
103
 
@@ -55,7 +55,12 @@ See [Data Format Specification](https://github.com/terrylica/gapless-crypto-data
55
55
 
56
56
  ## Supported Timeframes
57
57
 
58
- All Binance spot kline intervals: `1s`, `1m`, `3m`, `5m`, `15m`, `30m`, `1h`, `2h`, `4h`, `6h`, `8h`, `12h`, `1d`
58
+ All Binance spot kline intervals. Query dynamically:
59
+
60
+ ```python
61
+ import gapless_crypto_data as gcd
62
+ print(gcd.get_supported_timeframes())
63
+ ```
59
64
 
60
65
  ## API Reference
61
66
 
@@ -195,13 +195,13 @@ updated: "2025-11-25"
195
195
 
196
196
  **Validation Results**:
197
197
 
198
- | Component | Status | Details |
199
- | ---------------- | ------- | ----------------------------------------- |
200
- | Earthly +build | ✅ PASS | Builds Python package successfully |
201
- | semantic-release | ✅ PASS | Dry run shows v5.0.0 release |
202
- | Pushover | ✅ PASS | Test notification received |
203
- | GitHub Secrets | ✅ PASS | PUSHOVER_USER_KEY, PUSHOVER_APP_TOKEN set |
204
- | GitHub Actions | ✅ PASS | Workflows validated with actionlint |
198
+ | Component | Status | Details |
199
+ |-----------|--------|---------|
200
+ | Earthly +build | ✅ PASS | Builds Python package successfully |
201
+ | semantic-release | ✅ PASS | Dry run shows v5.0.0 release |
202
+ | Pushover | ✅ PASS | Test notification received |
203
+ | GitHub Secrets | ✅ PASS | PUSHOVER_USER_KEY, PUSHOVER_APP_TOKEN set |
204
+ | GitHub Actions | ✅ PASS | Workflows validated with actionlint |
205
205
 
206
206
  **Key Fixes Applied**:
207
207
 
@@ -211,7 +211,6 @@ updated: "2025-11-25"
211
211
  4. GitHub Secrets: Synced from Doppler using `gh secret set`
212
212
 
213
213
  **Release Ready**: Run `npm run release` to create v5.0.0 with:
214
-
215
214
  - GitHub Release with changelog
216
215
  - Pushover notification with release link
217
216
  - Package build artifacts
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "gapless-crypto-data"
3
- version = "4.0.2"
3
+ version = "5.0.0"
4
4
  description = "Cryptocurrency OHLCV data collection with gap-free guarantee. Retrieves microstructure-enriched kline data from Binance Public Data Repository with automatic gap detection and filling."
5
5
  readme = { file = "README.md", content-type = "text/markdown" }
6
6
  authors = [
@@ -0,0 +1,92 @@
1
+ """
2
+ Gapless Crypto Data - Binance USDT spot market OHLCV collection with gap-free guarantee.
3
+
4
+ Scope:
5
+ - USDT spot pairs only (BTCUSDT, ETHUSDT, SOLUSDT, etc.)
6
+ - No futures, perpetuals, derivatives, or margin data
7
+
8
+ Capabilities:
9
+ - Bulk historical data via Binance Public Data Repository
10
+ - Microstructure-enriched kline format (OHLCV + order flow metrics)
11
+ - Gap detection and API-based filling
12
+ - All Binance spot kline intervals supported
13
+
14
+ Data Source:
15
+ https://data.binance.vision/data/spot/monthly/klines/
16
+
17
+ Usage:
18
+ import gapless_crypto_data as gcd
19
+
20
+ # Fetch data
21
+ df = gcd.fetch_data("BTCUSDT", timeframe="1h", limit=1000)
22
+ df = gcd.download("ETHUSDT", timeframe="4h", start="2024-01-01", end="2024-06-30")
23
+
24
+ # Discovery
25
+ symbols = gcd.get_supported_symbols()
26
+ timeframes = gcd.get_supported_timeframes()
27
+
28
+ # Gap filling
29
+ results = gcd.fill_gaps("./data")
30
+
31
+ # Class-based API
32
+ from gapless_crypto_data import BinancePublicDataCollector, UniversalGapFiller
33
+ collector = BinancePublicDataCollector()
34
+ result = collector.collect_timeframe_data("1h")
35
+ """
36
+
37
+ __version__ = "5.0.0"
38
+ __author__ = "Eon Labs"
39
+ __email__ = "terry@eonlabs.com"
40
+
41
+ # Core classes (advanced/power-user API)
42
+ # Enhanced DataFrame for domain-specific operations
43
+ # Convenience functions (simple/intuitive API)
44
+ # API-only probe hooks for AI coding agents
45
+ from . import __probe__
46
+ from .api import (
47
+ download,
48
+ fetch_data,
49
+ fill_gaps,
50
+ get_info,
51
+ get_supported_intervals,
52
+ get_supported_symbols,
53
+ get_supported_timeframes,
54
+ load_parquet,
55
+ save_parquet,
56
+ )
57
+ from .collectors.binance_public_data_collector import BinancePublicDataCollector
58
+ from .exceptions import (
59
+ DataCollectionError,
60
+ GapFillingError,
61
+ GaplessCryptoDataError,
62
+ NetworkError,
63
+ ValidationError,
64
+ )
65
+ from .gap_filling.safe_file_operations import AtomicCSVOperations, SafeCSVMerger
66
+ from .gap_filling.universal_gap_filler import UniversalGapFiller
67
+
68
+ __all__ = [
69
+ # Simple function-based API (recommended for most users)
70
+ "fetch_data",
71
+ "download",
72
+ "get_supported_symbols",
73
+ "get_supported_timeframes",
74
+ "get_supported_intervals", # Legacy compatibility
75
+ "fill_gaps",
76
+ "get_info",
77
+ "save_parquet",
78
+ "load_parquet",
79
+ # Advanced class-based API (for complex workflows)
80
+ "BinancePublicDataCollector",
81
+ "UniversalGapFiller",
82
+ "AtomicCSVOperations",
83
+ "SafeCSVMerger",
84
+ # Structured exception hierarchy (v3.2.0)
85
+ "GaplessCryptoDataError",
86
+ "DataCollectionError",
87
+ "ValidationError",
88
+ "NetworkError",
89
+ "GapFillingError",
90
+ # AI agent probe hooks
91
+ "__probe__",
92
+ ]
@@ -30,6 +30,27 @@ import pandas as pd
30
30
  from .collectors.binance_public_data_collector import BinancePublicDataCollector
31
31
  from .gap_filling.universal_gap_filler import UniversalGapFiller
32
32
 
33
+ # Timestamp columns requiring datetime64 conversion
34
+ TIMESTAMP_COLUMNS = ("date", "close_time")
35
+
36
+
37
+ def _ensure_datetime_types(df: pd.DataFrame) -> pd.DataFrame:
38
+ """Ensure timestamp columns are datetime64 type, not strings.
39
+
40
+ Applies pd.to_datetime() to timestamp columns. Idempotent - safe to call
41
+ on DataFrames that already have datetime types.
42
+
43
+ Args:
44
+ df: DataFrame with potential string timestamp columns
45
+
46
+ Returns:
47
+ DataFrame with datetime64 timestamp columns
48
+ """
49
+ for col in TIMESTAMP_COLUMNS:
50
+ if col in df.columns:
51
+ df[col] = pd.to_datetime(df[col])
52
+ return df
53
+
33
54
 
34
55
  def get_supported_symbols() -> List[str]:
35
56
  """Get list of supported USDT spot trading pairs.
@@ -263,8 +284,9 @@ def _perform_gap_filling(
263
284
  f"✅ Auto-filled {gap_result['gaps_filled']}/{gap_result['gaps_detected']} "
264
285
  f"gap(s) with authentic Binance API data"
265
286
  )
266
- # Reload DataFrame with filled gaps
287
+ # Reload DataFrame with filled gaps and restore datetime types
267
288
  df = pd.read_csv(csv_file, comment="#")
289
+ df = _ensure_datetime_types(df)
268
290
  else:
269
291
  logger.warning(
270
292
  f"⚠️ Detected {gap_result['gaps_detected']} gap(s) but could not fill them. "
@@ -368,7 +368,7 @@ wheels = [
368
368
 
369
369
  [[package]]
370
370
  name = "gapless-crypto-data"
371
- version = "4.0.1"
371
+ version = "4.0.2"
372
372
  source = { editable = "." }
373
373
  dependencies = [
374
374
  { name = "duckdb" },
@@ -1,134 +0,0 @@
1
- """
2
- Gapless Crypto Data v4.0.1 - USDT spot market data collection with zero gaps guarantee
3
-
4
- Market Compatibility:
5
- - USDT SPOT PAIRS ONLY (BTCUSDT, ETHUSDT, SOLUSDT, etc.)
6
- - NO futures, perpetuals, or derivatives support
7
- - NO non-USDT pairs (BTC/ETH, etc.)
8
- - NO margin trading data
9
-
10
- Core Features:
11
- - Data collection via Binance public data repository (22x performance vs API calls)
12
- - Full 11-column microstructure format with order flow and liquidity metrics
13
- - Zero gaps guarantee through authentic API-first validation
14
- - UV-based Python tooling
15
- - Atomic file operations
16
- - Complete 13-timeframe support (1s, 1m, 3m, 5m, 15m, 30m, 1h, 2h, 4h, 6h, 8h, 12h, 1d)
17
- - Ultra-high frequency (1s) to daily (1d) data collection
18
- - Intelligent monthly-to-daily fallback for seamless recent data access
19
- - Gap detection and filling with authentic data only
20
- - CCXT-compatible dual parameter support (timeframe/interval)
21
- - Backward compatibility with 5-year deprecation period
22
-
23
- Data Source:
24
- Binance Spot Market: https://data.binance.vision/data/spot/monthly/klines/
25
- Market Type: SPOT only (no futures/derivatives)
26
- Supported Pairs: USDT-quoted spot pairs exclusively
27
-
28
- Usage:
29
- # Function-based API
30
- import gapless_crypto_data as gcd
31
-
32
- # Fetch recent data as standard pandas DataFrame
33
- df = gcd.fetch_data("BTCUSDT", timeframe="1h", limit=1000)
34
-
35
- # Standard pandas operations for analysis
36
- returns = df['close'].pct_change() # Returns calculation
37
- rolling_vol = df['close'].rolling(20).std() # Rolling volatility
38
- max_drawdown = (df['close'] / df['close'].cummax() - 1).min() # Drawdown
39
-
40
- # Resampling with pandas
41
- df_resampled = df.set_index('date').resample('4H').agg({
42
- 'open': 'first', 'high': 'max', 'low': 'min',
43
- 'close': 'last', 'volume': 'sum'
44
- })
45
-
46
- # Backward compatibility (legacy interval parameter)
47
- df = gcd.fetch_data("BTCUSDT", interval="1h", limit=1000) # DeprecationWarning
48
-
49
- # Download with date range
50
- df = gcd.download("ETHUSDT", timeframe="4h", start="2024-01-01", end="2024-06-30")
51
-
52
- # Get available symbols and timeframes
53
- symbols = gcd.get_supported_symbols()
54
- timeframes = gcd.get_supported_timeframes()
55
-
56
- # Fill gaps in existing data
57
- results = gcd.fill_gaps("./data")
58
-
59
- # Class-based API (for complex workflows)
60
- from gapless_crypto_data import BinancePublicDataCollector, UniversalGapFiller
61
-
62
- collector = BinancePublicDataCollector()
63
- result = collector.collect_timeframe_data("1h")
64
- df = result["dataframe"]
65
-
66
- CLI Usage (DEPRECATED - Will be removed in v4.0.0):
67
- ⚠️ The CLI is deprecated. Please use the Python API instead (see above).
68
-
69
- Legacy CLI (deprecated):
70
- uv run gapless-crypto-data --symbol SOLUSDT --timeframes 1s,1m,5m,1h,4h,1d
71
- uv run gapless-crypto-data --symbol BTCUSDT --timeframes 1s,6h,8h,12h,1d
72
- uv run gapless-crypto-data --fill-gaps --directory ./data
73
-
74
- Supported Symbols (USDT Spot Only):
75
- BTCUSDT, ETHUSDT, SOLUSDT, ADAUSDT, DOTUSDT, LINKUSDT, MATICUSDT,
76
- AVAXUSDT, ATOMUSDT, NEARUSDT, FTMUSDT, SANDUSDT, MANAUSDT, etc.
77
- """
78
-
79
- __version__ = "4.0.1"
80
- __author__ = "Eon Labs"
81
- __email__ = "terry@eonlabs.com"
82
-
83
- # Core classes (advanced/power-user API)
84
- # Enhanced DataFrame for domain-specific operations
85
- # Convenience functions (simple/intuitive API)
86
- # API-only probe hooks for AI coding agents
87
- from . import __probe__
88
- from .api import (
89
- download,
90
- fetch_data,
91
- fill_gaps,
92
- get_info,
93
- get_supported_intervals,
94
- get_supported_symbols,
95
- get_supported_timeframes,
96
- load_parquet,
97
- save_parquet,
98
- )
99
- from .collectors.binance_public_data_collector import BinancePublicDataCollector
100
- from .exceptions import (
101
- DataCollectionError,
102
- GapFillingError,
103
- GaplessCryptoDataError,
104
- NetworkError,
105
- ValidationError,
106
- )
107
- from .gap_filling.safe_file_operations import AtomicCSVOperations, SafeCSVMerger
108
- from .gap_filling.universal_gap_filler import UniversalGapFiller
109
-
110
- __all__ = [
111
- # Simple function-based API (recommended for most users)
112
- "fetch_data",
113
- "download",
114
- "get_supported_symbols",
115
- "get_supported_timeframes",
116
- "get_supported_intervals", # Legacy compatibility
117
- "fill_gaps",
118
- "get_info",
119
- "save_parquet",
120
- "load_parquet",
121
- # Advanced class-based API (for complex workflows)
122
- "BinancePublicDataCollector",
123
- "UniversalGapFiller",
124
- "AtomicCSVOperations",
125
- "SafeCSVMerger",
126
- # Structured exception hierarchy (v3.2.0)
127
- "GaplessCryptoDataError",
128
- "DataCollectionError",
129
- "ValidationError",
130
- "NetworkError",
131
- "GapFillingError",
132
- # AI agent probe hooks
133
- "__probe__",
134
- ]