gapless-crypto-data 5.0.2__tar.gz → 5.0.3__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 (202) hide show
  1. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/CHANGELOG.md +6 -0
  2. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/Earthfile +6 -4
  3. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/PKG-INFO +1 -1
  4. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/pyproject.toml +1 -1
  5. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/scripts/test-pushover.sh +6 -4
  6. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/__init__.py +1 -1
  7. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/uv.lock +2 -2
  8. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/.gitattributes +0 -0
  9. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/.github/workflows/publish.yml +0 -0
  10. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/.github/workflows/release.yml +0 -0
  11. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/.gitignore +0 -0
  12. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/.pre-commit-config.yaml +0 -0
  13. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/.python-version +0 -0
  14. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/.releaserc.json +0 -0
  15. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/.sessions/.gitignore +0 -0
  16. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/AUTHORS.md +0 -0
  17. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/CLAUDE.md +0 -0
  18. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/CONTRIBUTING.md +0 -0
  19. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/DOCUMENTATION.md +0 -0
  20. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/LICENSE +0 -0
  21. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/MANIFEST.in +0 -0
  22. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/PROBE_USAGE_EXAMPLE.md +0 -0
  23. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/README.md +0 -0
  24. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/cliff-release-notes.toml +0 -0
  25. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/cliff.toml +0 -0
  26. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/docs/CURRENT_ARCHITECTURE_STATUS.yaml +0 -0
  27. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/docs/PYPI_PUBLISHING_CONFIGURATION.yaml +0 -0
  28. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/docs/README.md +0 -0
  29. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/docs/SDK_QUALITY_STANDARDS.yaml +0 -0
  30. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/docs/SSOT_DOCUMENTATION_ARCHITECTURE.yaml +0 -0
  31. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/docs/SSOT_PLANNING_SUMMARY.md +0 -0
  32. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/docs/api/dual-parameter-enhancement.yaml +0 -0
  33. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/docs/api/gapless-dataframe-enhancement.yaml +0 -0
  34. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/docs/api/pruning-parquet-implementation.yaml +0 -0
  35. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/docs/api/quick-start.md +0 -0
  36. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/docs/architecture/DATA_FORMAT.md +0 -0
  37. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/docs/architecture/OVERVIEW.md +0 -0
  38. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/docs/architecture/decisions/0001-repository-split-clickhouse.md +0 -0
  39. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/docs/architecture/decisions/0002-lychee-link-validation.md +0 -0
  40. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/docs/architecture/decisions/0003-repository-housekeeping.md +0 -0
  41. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/docs/architecture/decisions/0004-yaml-audit-redundancy-removal.md +0 -0
  42. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/docs/architecture/decisions/0005-earthly-release-pipeline.md +0 -0
  43. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/docs/audit/comprehensive-audit-findings.yaml +0 -0
  44. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/docs/audit/comprehensive-audit-plan.yaml +0 -0
  45. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/docs/development/CLI_MIGRATION_GUIDE.md +0 -0
  46. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/docs/development/COMMANDS.md +0 -0
  47. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/docs/development/PUBLISHING.md +0 -0
  48. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/docs/development/SETUP.md +0 -0
  49. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/docs/diagrams/01-collection-pipeline.mmd +0 -0
  50. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/docs/diagrams/02-gap-filling.mmd +0 -0
  51. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/docs/diagrams/03-multi-symbol-collection.mmd +0 -0
  52. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/docs/diagrams/04-download-caching.mmd +0 -0
  53. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/docs/diagrams/05-validation-flow.mmd +0 -0
  54. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/docs/diagrams/README.md +0 -0
  55. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/docs/guides/DATA_COLLECTION.md +0 -0
  56. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/docs/guides/pypi-documentation.md +0 -0
  57. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/docs/guides/python-api.md +0 -0
  58. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/docs/milestones/archive/MILESTONE_v3.0.0.yaml +0 -0
  59. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/docs/milestones/archive/MILESTONE_v3.1.0.yaml +0 -0
  60. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/docs/plan/0001-v4.0.1-release/plan.md +0 -0
  61. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/docs/plan/0002-lychee-link-validation/plan.md +0 -0
  62. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/docs/plan/0003-repository-housekeeping/plan.md +0 -0
  63. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/docs/plan/0004-yaml-audit-redundancy-removal/plan.md +0 -0
  64. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/docs/plan/0005-earthly-release-pipeline/plan.md +0 -0
  65. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/docs/release-notes.md +0 -0
  66. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/docs/validation/OVERVIEW.md +0 -0
  67. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/docs/validation/QUERY_PATTERNS.md +0 -0
  68. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/docs/validation/STORAGE.md +0 -0
  69. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/examples/README.md +0 -0
  70. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/examples/advanced_api_examples.py +0 -0
  71. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/examples/basic_data_collection.py +0 -0
  72. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/examples/cli_usage_examples.sh +0 -0
  73. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/examples/complete_workflow.py +0 -0
  74. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/examples/gap_filling_example.py +0 -0
  75. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/examples/safe_data_collection.py +0 -0
  76. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/examples/simple_api_examples.py +0 -0
  77. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/llms.txt +0 -0
  78. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/lychee.toml +0 -0
  79. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/package.json +0 -0
  80. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/scripts/publish-to-pypi.sh +0 -0
  81. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/__probe__.py +0 -0
  82. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/api.py +0 -0
  83. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/cli.py +0 -0
  84. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/collectors/__init__.py +0 -0
  85. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/collectors/binance_public_data_collector.py +0 -0
  86. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/collectors/concurrent_collection_orchestrator.py +0 -0
  87. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/collectors/httpx_downloader.py +0 -0
  88. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/collectors/hybrid_url_generator.py +0 -0
  89. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/exceptions.py +0 -0
  90. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/gap_filling/__init__.py +0 -0
  91. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/gap_filling/safe_file_operations.py +0 -0
  92. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/gap_filling/universal_gap_filler.py +0 -0
  93. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/py.typed +0 -0
  94. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/resume/__init__.py +0 -0
  95. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/resume/intelligent_checkpointing.py +0 -0
  96. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20240101-20240102_v2.10.0.csv +0 -0
  97. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20240101-20240102_v2.10.0.metadata.json +0 -0
  98. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20240101-20240102_v2.5.0.csv +0 -0
  99. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20240101-20240102_v2.5.0.metadata.json +0 -0
  100. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20250819-20250831_v2.5.0.csv +0 -0
  101. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20250819-20250831_v2.5.0.metadata.json +0 -0
  102. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20250921-20250921_v2.10.0.csv +0 -0
  103. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20250921-20250921_v2.10.0.metadata.json +0 -0
  104. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20251002-20251002_v2.10.0.csv +0 -0
  105. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20251002-20251002_v2.10.0.metadata.json +0 -0
  106. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20251015-20251016_v2.10.0.csv +0 -0
  107. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20251015-20251016_v2.10.0.metadata.json +0 -0
  108. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20251016-20251016_v2.10.0.csv +0 -0
  109. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20251016-20251016_v2.10.0.metadata.json +0 -0
  110. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20251016-20251017_v2.10.0.csv +0 -0
  111. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20251016-20251017_v2.10.0.metadata.json +0 -0
  112. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20251017-20251017_v2.10.0.csv +0 -0
  113. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20251017-20251017_v2.10.0.metadata.json +0 -0
  114. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20251116-20251117_v2.10.0.csv +0 -0
  115. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20251116-20251117_v2.10.0.metadata.json +0 -0
  116. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20251117-20251117_v2.10.0.csv +0 -0
  117. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1d_20251117-20251117_v2.10.0.metadata.json +0 -0
  118. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1h_20240101-20240101_v2.5.0.csv +0 -0
  119. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1h_20240101-20240101_v2.5.0.metadata.json +0 -0
  120. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1h_20240101-20240102_v2.10.0.csv +0 -0
  121. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1h_20240101-20240102_v2.10.0.metadata.json +0 -0
  122. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1h_20240101-20240102_v2.5.0.csv +0 -0
  123. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1h_20240101-20240102_v2.5.0.metadata.json +0 -0
  124. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1h_20250918-20250921_v2.10.0.csv +0 -0
  125. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1h_20250918-20250921_v2.10.0.metadata.json +0 -0
  126. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1h_20251016-20251016_v2.10.0.csv +0 -0
  127. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1h_20251016-20251016_v2.10.0.metadata.json +0 -0
  128. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1h_20251017-20251017_v2.10.0.csv +0 -0
  129. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1h_20251017-20251017_v2.10.0.metadata.json +0 -0
  130. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1h_20251117-20251117_v2.10.0.csv +0 -0
  131. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-1h_20251117-20251117_v2.10.0.metadata.json +0 -0
  132. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-4h_20240101-20240101_v2.5.0.csv +0 -0
  133. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-4h_20240101-20240101_v2.5.0.metadata.json +0 -0
  134. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-5m_20230320-20230328_v2.10.0.csv +0 -0
  135. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-5m_20230320-20230328_v2.10.0.metadata.json +0 -0
  136. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-5m_20230323-20230325_v2.10.0.csv +0 -0
  137. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_BTCUSDT-5m_20230323-20230325_v2.10.0.metadata.json +0 -0
  138. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-1d_20250819-20250831_v2.5.0.csv +0 -0
  139. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-1d_20250819-20250831_v2.5.0.metadata.json +0 -0
  140. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-1h_20240101-20240101_v2.10.0.csv +0 -0
  141. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-1h_20240101-20240101_v2.10.0.metadata.json +0 -0
  142. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-1h_20240101-20240101_v2.5.0.csv +0 -0
  143. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-1h_20240101-20240101_v2.5.0.metadata.json +0 -0
  144. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-1h_20251001-20251002_v2.10.0.csv +0 -0
  145. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-1h_20251001-20251002_v2.10.0.metadata.json +0 -0
  146. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-1h_20251014-20251016_v2.10.0.csv +0 -0
  147. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-1h_20251014-20251016_v2.10.0.metadata.json +0 -0
  148. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-1h_20251015-20251016_v2.10.0.csv +0 -0
  149. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-1h_20251015-20251016_v2.10.0.metadata.json +0 -0
  150. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-1h_20251015-20251017_v2.10.0.csv +0 -0
  151. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-1h_20251015-20251017_v2.10.0.metadata.json +0 -0
  152. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-1h_20251016-20251017_v2.10.0.csv +0 -0
  153. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-1h_20251016-20251017_v2.10.0.metadata.json +0 -0
  154. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-1h_20251115-20251117_v2.10.0.csv +0 -0
  155. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-1h_20251115-20251117_v2.10.0.metadata.json +0 -0
  156. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-1h_20251116-20251117_v2.10.0.csv +0 -0
  157. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-1h_20251116-20251117_v2.10.0.metadata.json +0 -0
  158. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-4h_20240101-20240201_v2.5.0.csv +0 -0
  159. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-4h_20240101-20240201_v2.5.0.metadata.json +0 -0
  160. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-5m_20230320-20230328_v2.10.0.csv +0 -0
  161. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_ETHUSDT-5m_20230320-20230328_v2.10.0.metadata.json +0 -0
  162. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_SOLUSDT-1d_20250819-20250831_v2.5.0.csv +0 -0
  163. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_SOLUSDT-1d_20250819-20250831_v2.5.0.metadata.json +0 -0
  164. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_SOLUSDT-1h_20240101-20240101_v2.5.0.csv +0 -0
  165. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/sample_data/binance_spot_SOLUSDT-1h_20240101-20240101_v2.5.0.metadata.json +0 -0
  166. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/utils/__init__.py +0 -0
  167. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/utils/error_handling.py +0 -0
  168. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/utils/etag_cache.py +0 -0
  169. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/utils/timeframe_constants.py +0 -0
  170. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/utils/timestamp_format_analyzer.py +0 -0
  171. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/validation/__init__.py +0 -0
  172. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/validation/csv_validator.py +0 -0
  173. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/validation/models.py +0 -0
  174. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/src/gapless_crypto_data/validation/storage.py +0 -0
  175. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/tests/__init__.py +0 -0
  176. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/tests/conftest.py +0 -0
  177. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/tests/fixtures/test_data/binance_spot_BTCUSDT-1h_20240101-20240101_v2.10.0.csv +0 -0
  178. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/tests/fixtures/test_data/binance_spot_BTCUSDT-1h_20240101-20240101_v2.10.0.metadata.json +0 -0
  179. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/tests/fixtures/test_data_large/binance_spot_BTCUSDT-1h_20140101-20240101_v2.10.0.csv +0 -0
  180. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/tests/fixtures/test_data_large/binance_spot_BTCUSDT-1h_20140101-20240101_v2.10.0.metadata.json +0 -0
  181. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/tests/fixtures/test_data_large/binance_spot_BTCUSDT-1h_20140101-20240101_v2.10.0_gapped.csv.bak +0 -0
  182. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/tests/test_1s_1d_gap_filling.py +0 -0
  183. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/tests/test_api_edge_cases.py +0 -0
  184. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/tests/test_atomic_operations.py +0 -0
  185. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/tests/test_binance_collector.py +0 -0
  186. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/tests/test_binance_collector_advanced.py +0 -0
  187. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/tests/test_cli.py +0 -0
  188. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/tests/test_cli_integration.py +0 -0
  189. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/tests/test_concurrent_download.py +0 -0
  190. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/tests/test_error_handling.py +0 -0
  191. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/tests/test_etag_cache.py +0 -0
  192. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/tests/test_gap_filler.py +0 -0
  193. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/tests/test_gapless_validation_1d_2018_present.py +0 -0
  194. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/tests/test_integration.py +0 -0
  195. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/tests/test_monthly_to_daily_fallback.py +0 -0
  196. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/tests/test_output_dir_dataframe_fix.py +0 -0
  197. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/tests/test_package.py +0 -0
  198. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/tests/test_probe_module.py +0 -0
  199. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/tests/test_simple_api.py +0 -0
  200. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/tests/test_timeframe_constants.py +0 -0
  201. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/tests/test_validation_storage.py +0 -0
  202. {gapless_crypto_data-5.0.2 → gapless_crypto_data-5.0.3}/tmp/.gitkeep +0 -0
@@ -2,6 +2,12 @@
2
2
 
3
3
  All notable changes to gapless-crypto-data will be documented in this file.
4
4
 
5
+ ## [5.0.3](https://github.com/terrylica/gapless-crypto-data/compare/v5.0.2...v5.0.3) (2026-10-16)
6
+
7
+ ### Bug Fixes
8
+
9
+ * **notify:** pass the Pushover token and user key to curl on stdin, not argv ([12b462f](https://github.com/terrylica/gapless-crypto-data/commit/12b462f7dcadb73beaf333bcaa3058111e6b4d57))
10
+
5
11
  ## [5.0.2](https://github.com/terrylica/gapless-crypto-data/compare/v5.0.1...v5.0.2) (2026-08-31)
6
12
 
7
13
  ### Bug Fixes
@@ -76,11 +76,13 @@ pushover-notify:
76
76
  FROM alpine:3.19
77
77
  RUN apk add --no-cache curl
78
78
 
79
- # Send Pushover notification
79
+ # Send Pushover notification. The token and user key reach curl as a config on stdin (-K -),
80
+ # never as arguments (argv is readable by `ps`). Pushover keys are alphanumeric; anything else
81
+ # is refused so it cannot break the config syntax.
80
82
  RUN --no-cache --secret PUSHOVER_USER_KEY --secret PUSHOVER_APP_TOKEN \
81
- curl -s \
82
- --form-string "token=$PUSHOVER_APP_TOKEN" \
83
- --form-string "user=$PUSHOVER_USER_KEY" \
83
+ case "$PUSHOVER_APP_TOKEN$PUSHOVER_USER_KEY" in *[!A-Za-z0-9]*) echo "Pushover key is not alphanumeric" >&2; exit 1 ;; esac && \
84
+ printf 'form-string = "token=%s"\nform-string = "user=%s"\n' "$PUSHOVER_APP_TOKEN" "$PUSHOVER_USER_KEY" \
85
+ | curl -s -K - \
84
86
  --form-string "title=$TITLE" \
85
87
  --form-string "message=Version $VERSION released successfully" \
86
88
  --form-string "url=$RELEASE_URL" \
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: gapless-crypto-data
3
- Version: 5.0.2
3
+ Version: 5.0.3
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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "gapless-crypto-data"
3
- version = "5.0.2"
3
+ version = "5.0.3"
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 = [
@@ -39,10 +39,12 @@ PUSHOVER_APP_TOKEN=$(doppler secrets get PUSHOVER_APP_TOKEN --project notificati
39
39
  exit 1
40
40
  }
41
41
 
42
- # Send test notification
43
- RESPONSE=$(curl -s \
44
- --form-string "token=$PUSHOVER_APP_TOKEN" \
45
- --form-string "user=$PUSHOVER_USER_KEY" \
42
+ # Send test notification. The token and user key reach curl as a config on stdin (-K -), never
43
+ # as arguments (argv is readable by every user's `ps`); escaped for curl's config syntax.
44
+ PO_TOK=${PUSHOVER_APP_TOKEN//\\/\\\\}; PO_TOK=${PO_TOK//\"/\\\"}
45
+ PO_USR=${PUSHOVER_USER_KEY//\\/\\\\}; PO_USR=${PO_USR//\"/\\\"}
46
+ RESPONSE=$(printf 'form-string = "token=%s"\nform-string = "user=%s"\n' "$PO_TOK" "$PO_USR" \
47
+ | curl -s -K - \
46
48
  --form-string "title=gapless-crypto-data Test" \
47
49
  --form-string "message=Test notification for version $VERSION" \
48
50
  --form-string "url=$RELEASE_URL" \
@@ -34,7 +34,7 @@ Usage:
34
34
  result = collector.collect_timeframe_data("1h")
35
35
  """
36
36
 
37
- __version__ = "5.0.2"
37
+ __version__ = "5.0.3"
38
38
  __author__ = "Eon Labs"
39
39
  __email__ = "terry@eonlabs.com"
40
40
 
@@ -1,5 +1,5 @@
1
1
  version = 1
2
- revision = 3
2
+ revision = 5
3
3
  requires-python = ">=3.9"
4
4
  resolution-markers = [
5
5
  "python_full_version >= '3.12'",
@@ -368,7 +368,7 @@ wheels = [
368
368
 
369
369
  [[package]]
370
370
  name = "gapless-crypto-data"
371
- version = "5.0.2"
371
+ version = "5.0.3"
372
372
  source = { editable = "." }
373
373
  dependencies = [
374
374
  { name = "duckdb" },