dccd 2.3.3__tar.gz → 2.4.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 (86) hide show
  1. {dccd-2.3.3 → dccd-2.4.0}/CHANGELOG.md +26 -0
  2. {dccd-2.3.3 → dccd-2.4.0}/PKG-INFO +28 -3
  3. {dccd-2.3.3 → dccd-2.4.0}/README.md +16 -2
  4. dccd-2.4.0/dccd/daemon/api.py +702 -0
  5. {dccd-2.3.3 → dccd-2.4.0}/dccd/daemon/backfill.py +136 -16
  6. {dccd-2.3.3 → dccd-2.4.0}/dccd/daemon/cli.py +104 -2
  7. {dccd-2.3.3 → dccd-2.4.0}/dccd/daemon/config.py +11 -0
  8. {dccd-2.3.3 → dccd-2.4.0}/dccd/daemon/stream_manager.py +161 -21
  9. dccd-2.4.0/dccd/daemon/ui/__init__.py +4 -0
  10. dccd-2.4.0/dccd/daemon/ui/static/favicon.svg +27 -0
  11. dccd-2.4.0/dccd/daemon/ui/static/htmx.min.js +1 -0
  12. dccd-2.4.0/dccd/daemon/ui/static/logo.svg +59 -0
  13. dccd-2.4.0/dccd/daemon/ui/templates/base.html +160 -0
  14. dccd-2.4.0/dccd/daemon/ui/templates/config.html +225 -0
  15. dccd-2.4.0/dccd/daemon/ui/templates/dashboard.html +159 -0
  16. dccd-2.4.0/dccd/daemon/ui/templates/inventory.html +92 -0
  17. dccd-2.4.0/dccd/daemon/ui/templates/jobs.html +141 -0
  18. dccd-2.4.0/dccd/daemon/ui/templates/logs.html +19 -0
  19. dccd-2.4.0/dccd/daemon/ui/templates/partials/backfill_modal.html +123 -0
  20. dccd-2.4.0/dccd/daemon/ui/templates/storage.html +51 -0
  21. {dccd-2.3.3 → dccd-2.4.0}/dccd/histo_dl/coinbase.py +31 -24
  22. {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_backfill.py +39 -1
  23. {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_coinbase.py +23 -0
  24. dccd-2.4.0/dccd/tests/test_daemon_api.py +438 -0
  25. {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_daemon_stream_manager.py +172 -4
  26. {dccd-2.3.3 → dccd-2.4.0}/dccd.egg-info/PKG-INFO +28 -3
  27. {dccd-2.3.3 → dccd-2.4.0}/dccd.egg-info/SOURCES.txt +14 -0
  28. {dccd-2.3.3 → dccd-2.4.0}/dccd.egg-info/requires.txt +12 -0
  29. {dccd-2.3.3 → dccd-2.4.0}/pyproject.toml +7 -3
  30. {dccd-2.3.3 → dccd-2.4.0}/CONTRIBUTING.md +0 -0
  31. {dccd-2.3.3 → dccd-2.4.0}/LICENSE.txt +0 -0
  32. {dccd-2.3.3 → dccd-2.4.0}/MANIFEST.in +0 -0
  33. {dccd-2.3.3 → dccd-2.4.0}/dccd/__init__.py +0 -0
  34. {dccd-2.3.3 → dccd-2.4.0}/dccd/continuous_dl/__init__.py +0 -0
  35. {dccd-2.3.3 → dccd-2.4.0}/dccd/continuous_dl/binance.py +0 -0
  36. {dccd-2.3.3 → dccd-2.4.0}/dccd/continuous_dl/bitfinex.py +0 -0
  37. {dccd-2.3.3 → dccd-2.4.0}/dccd/continuous_dl/bitmex.py +0 -0
  38. {dccd-2.3.3 → dccd-2.4.0}/dccd/continuous_dl/bybit.py +0 -0
  39. {dccd-2.3.3 → dccd-2.4.0}/dccd/continuous_dl/exchange.py +0 -0
  40. {dccd-2.3.3 → dccd-2.4.0}/dccd/continuous_dl/kraken.py +0 -0
  41. {dccd-2.3.3 → dccd-2.4.0}/dccd/continuous_dl/okx.py +0 -0
  42. {dccd-2.3.3 → dccd-2.4.0}/dccd/daemon/__init__.py +0 -0
  43. {dccd-2.3.3 → dccd-2.4.0}/dccd/daemon/health.py +0 -0
  44. {dccd-2.3.3 → dccd-2.4.0}/dccd/daemon/scheduler.py +0 -0
  45. {dccd-2.3.3 → dccd-2.4.0}/dccd/daemon/storage.py +0 -0
  46. {dccd-2.3.3 → dccd-2.4.0}/dccd/histo_dl/__init__.py +0 -0
  47. {dccd-2.3.3 → dccd-2.4.0}/dccd/histo_dl/binance.py +0 -0
  48. {dccd-2.3.3 → dccd-2.4.0}/dccd/histo_dl/bybit.py +0 -0
  49. {dccd-2.3.3 → dccd-2.4.0}/dccd/histo_dl/exchange.py +0 -0
  50. {dccd-2.3.3 → dccd-2.4.0}/dccd/histo_dl/kraken.py +0 -0
  51. {dccd-2.3.3 → dccd-2.4.0}/dccd/histo_dl/okx.py +0 -0
  52. {dccd-2.3.3 → dccd-2.4.0}/dccd/models.py +0 -0
  53. {dccd-2.3.3 → dccd-2.4.0}/dccd/process_data.py +0 -0
  54. {dccd-2.3.3 → dccd-2.4.0}/dccd/storage.py +0 -0
  55. {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/__init__.py +0 -0
  56. {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/conftest.py +0 -0
  57. {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_binance.py +0 -0
  58. {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_binance_ws.py +0 -0
  59. {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_bitfinex.py +0 -0
  60. {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_bitmex.py +0 -0
  61. {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_bybit.py +0 -0
  62. {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_bybit_ws.py +0 -0
  63. {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_daemon_cli.py +0 -0
  64. {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_daemon_config.py +0 -0
  65. {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_daemon_health.py +0 -0
  66. {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_daemon_scheduler.py +0 -0
  67. {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_daemon_storage.py +0 -0
  68. {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_date_time.py +0 -0
  69. {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_histo_dl.py +0 -0
  70. {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_io.py +0 -0
  71. {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_kraken.py +0 -0
  72. {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_kraken_ws.py +0 -0
  73. {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_models.py +0 -0
  74. {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_okx.py +0 -0
  75. {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_okx_ws.py +0 -0
  76. {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_process_data.py +0 -0
  77. {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_storage.py +0 -0
  78. {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_websocket.py +0 -0
  79. {dccd-2.3.3 → dccd-2.4.0}/dccd/tools/__init__.py +0 -0
  80. {dccd-2.3.3 → dccd-2.4.0}/dccd/tools/date_time.py +0 -0
  81. {dccd-2.3.3 → dccd-2.4.0}/dccd/tools/io.py +0 -0
  82. {dccd-2.3.3 → dccd-2.4.0}/dccd/tools/websocket.py +0 -0
  83. {dccd-2.3.3 → dccd-2.4.0}/dccd.egg-info/dependency_links.txt +0 -0
  84. {dccd-2.3.3 → dccd-2.4.0}/dccd.egg-info/entry_points.txt +0 -0
  85. {dccd-2.3.3 → dccd-2.4.0}/dccd.egg-info/top_level.txt +0 -0
  86. {dccd-2.3.3 → dccd-2.4.0}/setup.cfg +0 -0
@@ -6,10 +6,36 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [2.4.0] - 2026-06-04
10
+
11
+ ### Added
12
+
13
+ - `dccd/daemon/api.py` — web UI and JSON API (FastAPI + Jinja2 + htmx): a thin
14
+ HTTP layer over the existing daemon modules exposing dashboard (live health
15
+ metrics), inventory (stored data coverage), jobs (histo/stream list + add/remove
16
+ + live backfill progress), logs (tail), config (view/validate/save the YAML),
17
+ and storage (rclone status + manual sync). JSON-only API (`/api/*`) with
18
+ dumb-shell templates, so the front-end can be swapped without touching the API.
19
+ Optional Bearer-token auth via `settings.ui_auth_token`
20
+ - `dccd/daemon/cli.py` — `dccd ui`: serve the web UI standalone; the UI is also
21
+ started automatically (background thread) by `dccd start` when the `[ui]` extra
22
+ is installed
23
+ - `dccd/daemon/config.py` — `SettingsConfig.ui_host`, `ui_port`, `ui_auth_token`:
24
+ web UI bind address, port, and optional auth token
25
+ - `dccd/daemon/backfill.py` — `progress_callback` and `stop_event` on
26
+ `_BackfillBase.run()` / `run_backfill()`: let the UI report live progress and
27
+ cancel a running backfill (defaults keep CLI behaviour unchanged)
28
+ - `dccd/daemon/stream_manager.py` — `SyncService` writes
29
+ `{local_path}/.dccd/last_sync.json` after each successful remote push, so the UI
30
+ can display the last sync time
31
+ - `pyproject.toml` — new optional extra `[ui]` (`fastapi`, `uvicorn[standard]`,
32
+ `jinja2`); install with `pip install dccd[daemon,ui]`
33
+
9
34
  ## [2.3.3] - 2026-05-31
10
35
 
11
36
  ### Added
12
37
 
38
+
13
39
  - `doc/source/` — complete Sphinx documentation overhaul: redesigned homepage
14
40
  with sphinx-design cards, captioned toctrees (Getting Started / Data Collection /
15
41
  Reference), new pages (`installation`, `quickstart`, `changelog`, `cli`,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dccd
3
- Version: 2.3.3
3
+ Version: 2.4.0
4
4
  Summary: Download Crypto Currency Data from different exchanges.
5
5
  Author-email: Arthur Bernard <arthur.bernard.92@gmail.com>
6
6
  License: MIT
@@ -39,6 +39,10 @@ Requires-Dist: pyyaml>=6.0; extra == "daemon"
39
39
  Requires-Dist: apscheduler<4,>=3.10; extra == "daemon"
40
40
  Requires-Dist: typer>=0.12; extra == "daemon"
41
41
  Requires-Dist: tqdm>=4.64; extra == "daemon"
42
+ Provides-Extra: ui
43
+ Requires-Dist: fastapi>=0.110; extra == "ui"
44
+ Requires-Dist: uvicorn[standard]>=0.29; extra == "ui"
45
+ Requires-Dist: jinja2>=3.1; extra == "ui"
42
46
  Provides-Extra: dev
43
47
  Requires-Dist: pytest>=7.4; extra == "dev"
44
48
  Requires-Dist: pytest-asyncio>=0.23; extra == "dev"
@@ -50,6 +54,10 @@ Requires-Dist: pyyaml>=6.0; extra == "dev"
50
54
  Requires-Dist: apscheduler<4,>=3.10; extra == "dev"
51
55
  Requires-Dist: typer>=0.12; extra == "dev"
52
56
  Requires-Dist: tqdm>=4.64; extra == "dev"
57
+ Requires-Dist: fastapi>=0.110; extra == "dev"
58
+ Requires-Dist: uvicorn[standard]>=0.29; extra == "dev"
59
+ Requires-Dist: jinja2>=3.1; extra == "dev"
60
+ Requires-Dist: httpx>=0.27; extra == "dev"
53
61
  Provides-Extra: doc
54
62
  Requires-Dist: sphinx>=7.0; extra == "doc"
55
63
  Requires-Dist: furo; extra == "doc"
@@ -58,14 +66,17 @@ Requires-Dist: sphinx-design; extra == "doc"
58
66
  Requires-Dist: sphinx-copybutton; extra == "doc"
59
67
  Requires-Dist: pyyaml>=6.0; extra == "doc"
60
68
  Requires-Dist: apscheduler<4,>=3.10; extra == "doc"
69
+ Requires-Dist: fastapi>=0.110; extra == "doc"
70
+ Requires-Dist: uvicorn[standard]>=0.29; extra == "doc"
71
+ Requires-Dist: jinja2>=3.1; extra == "doc"
61
72
  Dynamic: license-file
62
73
 
63
74
  <picture>
64
75
  <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/ArthurBernard/Download_Crypto_Currencies_Data/develop/doc/source/_static/logo-dark-transparent.svg">
65
- <img alt="dccd logo" src="https://raw.githubusercontent.com/ArthurBernard/Download_Crypto_Currencies_Data/develop/doc/source/_static/logo-light-transparent.svg" height="130px" align="left">
76
+ <img alt="dccd logo" src="https://raw.githubusercontent.com/ArthurBernard/Download_Crypto_Currencies_Data/develop/doc/source/_static/logo-light-transparent.svg" height="180px" align="left">
66
77
  </picture>
67
78
 
68
- # Download Crypto-Currency Data
79
+ # **Download Crypto-Currency Data**
69
80
 
70
81
  [![Python versions](https://img.shields.io/pypi/pyversions/dccd)](https://pypi.org/project/dccd/)
71
82
  [![PyPI](https://img.shields.io/pypi/v/dccd.svg)](https://pypi.org/project/dccd/)
@@ -77,6 +88,8 @@ Dynamic: license-file
77
88
  [![Docstring coverage](https://raw.githubusercontent.com/ArthurBernard/Download_Crypto_Currencies_Data/badges/interrogate_badge.svg)](https://github.com/ArthurBernard/Download_Crypto_Currencies_Data)
78
89
  [![Downloads](https://pepy.tech/badge/dccd)](https://pepy.tech/project/dccd)
79
90
 
91
+ ___
92
+
80
93
  Python package to download crypto-currency data (OHLCV, trades, order book) from multiple
81
94
  exchanges via REST and WebSocket APIs. Data can be saved to CSV, Excel, SQLite, PostgreSQL,
82
95
  or Parquet.
@@ -93,6 +106,12 @@ With autonomous daemon support (APScheduler + PyYAML):
93
106
  pip install "dccd[daemon]"
94
107
  ```
95
108
 
109
+ With the web UI (FastAPI + htmx — `dccd ui`):
110
+
111
+ ```bash
112
+ pip install "dccd[daemon,ui]"
113
+ ```
114
+
96
115
  From source:
97
116
 
98
117
  ```bash
@@ -127,6 +146,9 @@ Stream real-time data (order book, trades) via WebSocket with automatic reconnec
127
146
  **Daemon** `dccd.daemon`
128
147
  Autonomous, server-side collector driven by a YAML config. Runs REST jobs on a schedule (APScheduler), opens WebSocket streams for real-time collection, and periodically syncs all local data to one or more remote destinations (NAS, S3, SFTP, …) via rclone. Multiple remotes and a configurable sync interval are supported; collection is never blocked by remote availability.
129
148
 
149
+ **Web UI** `dccd.daemon.api`
150
+ Optional browser interface (FastAPI + htmx) mirroring the CLI: dashboard of live health metrics, data inventory, job management (add/remove pairs, launch and cancel backfills), log tail, config editor, and remote-storage status. Runs standalone (`dccd ui`) or embedded in `dccd start`.
151
+
130
152
  ### Output formats
131
153
 
132
154
  Historical data can be saved as **CSV**, **Excel** (`.xlsx`), **SQLite**, **PostgreSQL** (via SQLAlchemy), or **Parquet**.
@@ -241,6 +263,9 @@ dccd remove --exchange kraken --pair ETH/USD --span 86400 --config config.yml
241
263
  # Inspect all data on disk (OHLC, trades, orderbook)
242
264
  dccd inventory --config config.yml
243
265
 
266
+ # Web UI — dashboard, inventory, jobs, logs, config (needs: pip install "dccd[daemon,ui]")
267
+ dccd ui --config config.yml # http://127.0.0.1:8080
268
+
244
269
  # Enable shell tab-completion (run once after install)
245
270
  dccd --install-completion
246
271
  ```
@@ -1,9 +1,9 @@
1
1
  <picture>
2
2
  <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/ArthurBernard/Download_Crypto_Currencies_Data/develop/doc/source/_static/logo-dark-transparent.svg">
3
- <img alt="dccd logo" src="https://raw.githubusercontent.com/ArthurBernard/Download_Crypto_Currencies_Data/develop/doc/source/_static/logo-light-transparent.svg" height="130px" align="left">
3
+ <img alt="dccd logo" src="https://raw.githubusercontent.com/ArthurBernard/Download_Crypto_Currencies_Data/develop/doc/source/_static/logo-light-transparent.svg" height="180px" align="left">
4
4
  </picture>
5
5
 
6
- # Download Crypto-Currency Data
6
+ # **Download Crypto-Currency Data**
7
7
 
8
8
  [![Python versions](https://img.shields.io/pypi/pyversions/dccd)](https://pypi.org/project/dccd/)
9
9
  [![PyPI](https://img.shields.io/pypi/v/dccd.svg)](https://pypi.org/project/dccd/)
@@ -15,6 +15,8 @@
15
15
  [![Docstring coverage](https://raw.githubusercontent.com/ArthurBernard/Download_Crypto_Currencies_Data/badges/interrogate_badge.svg)](https://github.com/ArthurBernard/Download_Crypto_Currencies_Data)
16
16
  [![Downloads](https://pepy.tech/badge/dccd)](https://pepy.tech/project/dccd)
17
17
 
18
+ ___
19
+
18
20
  Python package to download crypto-currency data (OHLCV, trades, order book) from multiple
19
21
  exchanges via REST and WebSocket APIs. Data can be saved to CSV, Excel, SQLite, PostgreSQL,
20
22
  or Parquet.
@@ -31,6 +33,12 @@ With autonomous daemon support (APScheduler + PyYAML):
31
33
  pip install "dccd[daemon]"
32
34
  ```
33
35
 
36
+ With the web UI (FastAPI + htmx — `dccd ui`):
37
+
38
+ ```bash
39
+ pip install "dccd[daemon,ui]"
40
+ ```
41
+
34
42
  From source:
35
43
 
36
44
  ```bash
@@ -65,6 +73,9 @@ Stream real-time data (order book, trades) via WebSocket with automatic reconnec
65
73
  **Daemon** `dccd.daemon`
66
74
  Autonomous, server-side collector driven by a YAML config. Runs REST jobs on a schedule (APScheduler), opens WebSocket streams for real-time collection, and periodically syncs all local data to one or more remote destinations (NAS, S3, SFTP, …) via rclone. Multiple remotes and a configurable sync interval are supported; collection is never blocked by remote availability.
67
75
 
76
+ **Web UI** `dccd.daemon.api`
77
+ Optional browser interface (FastAPI + htmx) mirroring the CLI: dashboard of live health metrics, data inventory, job management (add/remove pairs, launch and cancel backfills), log tail, config editor, and remote-storage status. Runs standalone (`dccd ui`) or embedded in `dccd start`.
78
+
68
79
  ### Output formats
69
80
 
70
81
  Historical data can be saved as **CSV**, **Excel** (`.xlsx`), **SQLite**, **PostgreSQL** (via SQLAlchemy), or **Parquet**.
@@ -179,6 +190,9 @@ dccd remove --exchange kraken --pair ETH/USD --span 86400 --config config.yml
179
190
  # Inspect all data on disk (OHLC, trades, orderbook)
180
191
  dccd inventory --config config.yml
181
192
 
193
+ # Web UI — dashboard, inventory, jobs, logs, config (needs: pip install "dccd[daemon,ui]")
194
+ dccd ui --config config.yml # http://127.0.0.1:8080
195
+
182
196
  # Enable shell tab-completion (run once after install)
183
197
  dccd --install-completion
184
198
  ```