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.
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/.releaserc.json +3 -2
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/CHANGELOG.md +29 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/PKG-INFO +7 -2
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/README.md +6 -1
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/plan/0005-earthly-release-pipeline/plan.md +7 -8
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/pyproject.toml +1 -1
- gapless_crypto_data-5.0.0/src/gapless_crypto_data/__init__.py +92 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/api.py +23 -1
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/uv.lock +1 -1
- gapless_crypto_data-4.0.2/src/gapless_crypto_data/__init__.py +0 -134
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/.claude/settings.local.json +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/.gitattributes +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/.github/workflows/publish.yml +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/.github/workflows/release.yml +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/.gitignore +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/.pre-commit-config.yaml +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/.python-version +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/.sessions/.gitignore +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/AUTHORS.md +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/CLAUDE.md +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/CONTRIBUTING.md +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/DOCUMENTATION.md +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/Earthfile +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/LICENSE +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/MANIFEST.in +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/PROBE_USAGE_EXAMPLE.md +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/cliff-release-notes.toml +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/cliff.toml +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/CURRENT_ARCHITECTURE_STATUS.yaml +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/PYPI_PUBLISHING_CONFIGURATION.yaml +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/README.md +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/SDK_QUALITY_STANDARDS.yaml +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/SSOT_DOCUMENTATION_ARCHITECTURE.yaml +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/SSOT_PLANNING_SUMMARY.md +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/api/dual-parameter-enhancement.yaml +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/api/gapless-dataframe-enhancement.yaml +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/api/pruning-parquet-implementation.yaml +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/api/quick-start.md +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/architecture/DATA_FORMAT.md +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/architecture/OVERVIEW.md +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/architecture/decisions/0001-repository-split-clickhouse.md +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/architecture/decisions/0002-lychee-link-validation.md +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/architecture/decisions/0003-repository-housekeeping.md +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/architecture/decisions/0004-yaml-audit-redundancy-removal.md +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/architecture/decisions/0005-earthly-release-pipeline.md +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/audit/comprehensive-audit-findings.yaml +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/audit/comprehensive-audit-plan.yaml +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/development/CLI_MIGRATION_GUIDE.md +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/development/COMMANDS.md +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/development/PUBLISHING.md +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/development/SETUP.md +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/diagrams/01-collection-pipeline.mmd +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/diagrams/02-gap-filling.mmd +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/diagrams/03-multi-symbol-collection.mmd +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/diagrams/04-download-caching.mmd +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/diagrams/05-validation-flow.mmd +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/diagrams/README.md +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/guides/DATA_COLLECTION.md +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/guides/pypi-documentation.md +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/guides/python-api.md +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/milestones/archive/MILESTONE_v3.0.0.yaml +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/milestones/archive/MILESTONE_v3.1.0.yaml +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/plan/0001-v4.0.1-release/plan.md +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/plan/0002-lychee-link-validation/plan.md +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/plan/0003-repository-housekeeping/plan.md +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/plan/0004-yaml-audit-redundancy-removal/plan.md +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/release-notes.md +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/validation/OVERVIEW.md +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/validation/QUERY_PATTERNS.md +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/validation/STORAGE.md +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/examples/README.md +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/examples/advanced_api_examples.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/examples/basic_data_collection.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/examples/cli_usage_examples.sh +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/examples/complete_workflow.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/examples/gap_filling_example.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/examples/safe_data_collection.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/examples/simple_api_examples.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/llms.txt +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/lychee.toml +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/package.json +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/scripts/publish-to-pypi.sh +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/scripts/test-pushover.sh +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/__probe__.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/cli.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/collectors/__init__.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/collectors/binance_public_data_collector.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/collectors/concurrent_collection_orchestrator.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/collectors/httpx_downloader.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/collectors/hybrid_url_generator.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/exceptions.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/gap_filling/__init__.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/gap_filling/safe_file_operations.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/gap_filling/universal_gap_filler.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/py.typed +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/resume/__init__.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/resume/intelligent_checkpointing.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/utils/__init__.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/utils/error_handling.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/utils/etag_cache.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/utils/timeframe_constants.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/utils/timestamp_format_analyzer.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/validation/__init__.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/validation/csv_validator.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/validation/models.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/validation/storage.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/__init__.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/conftest.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/test_1s_1d_gap_filling.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/test_api_edge_cases.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/test_atomic_operations.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/test_binance_collector.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/test_binance_collector_advanced.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/test_cli.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/test_cli_integration.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/test_concurrent_download.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/test_error_handling.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/test_etag_cache.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/test_gap_filler.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/test_gapless_validation_1d_2018_present.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/test_integration.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/test_monthly_to_daily_fallback.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/test_output_dir_dataframe_fix.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/test_package.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/test_probe_module.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/test_simple_api.py +0 -0
- {gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/tests/test_timeframe_constants.py +0 -0
- {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:
|
|
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
|
|
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
|
|
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
|
|
199
|
-
|
|
200
|
-
| Earthly +build
|
|
201
|
-
| semantic-release | ✅ PASS | Dry run shows v5.0.0 release
|
|
202
|
-
| Pushover
|
|
203
|
-
| GitHub Secrets
|
|
204
|
-
| GitHub Actions
|
|
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 = "
|
|
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. "
|
|
@@ -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
|
-
]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/CURRENT_ARCHITECTURE_STATUS.yaml
RENAMED
|
File without changes
|
{gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/PYPI_PUBLISHING_CONFIGURATION.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/SSOT_DOCUMENTATION_ARCHITECTURE.yaml
RENAMED
|
File without changes
|
|
File without changes
|
{gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/api/dual-parameter-enhancement.yaml
RENAMED
|
File without changes
|
{gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/api/gapless-dataframe-enhancement.yaml
RENAMED
|
File without changes
|
{gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/api/pruning-parquet-implementation.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/audit/comprehensive-audit-findings.yaml
RENAMED
|
File without changes
|
{gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/audit/comprehensive-audit-plan.yaml
RENAMED
|
File without changes
|
{gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/development/CLI_MIGRATION_GUIDE.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/diagrams/01-collection-pipeline.mmd
RENAMED
|
File without changes
|
|
File without changes
|
{gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/diagrams/03-multi-symbol-collection.mmd
RENAMED
|
File without changes
|
{gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/diagrams/04-download-caching.mmd
RENAMED
|
File without changes
|
{gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/diagrams/05-validation-flow.mmd
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/docs/plan/0001-v4.0.1-release/plan.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/__probe__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gapless_crypto_data-4.0.2 → gapless_crypto_data-5.0.0}/src/gapless_crypto_data/exceptions.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|