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.
- {dccd-2.3.3 → dccd-2.4.0}/CHANGELOG.md +26 -0
- {dccd-2.3.3 → dccd-2.4.0}/PKG-INFO +28 -3
- {dccd-2.3.3 → dccd-2.4.0}/README.md +16 -2
- dccd-2.4.0/dccd/daemon/api.py +702 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/daemon/backfill.py +136 -16
- {dccd-2.3.3 → dccd-2.4.0}/dccd/daemon/cli.py +104 -2
- {dccd-2.3.3 → dccd-2.4.0}/dccd/daemon/config.py +11 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/daemon/stream_manager.py +161 -21
- dccd-2.4.0/dccd/daemon/ui/__init__.py +4 -0
- dccd-2.4.0/dccd/daemon/ui/static/favicon.svg +27 -0
- dccd-2.4.0/dccd/daemon/ui/static/htmx.min.js +1 -0
- dccd-2.4.0/dccd/daemon/ui/static/logo.svg +59 -0
- dccd-2.4.0/dccd/daemon/ui/templates/base.html +160 -0
- dccd-2.4.0/dccd/daemon/ui/templates/config.html +225 -0
- dccd-2.4.0/dccd/daemon/ui/templates/dashboard.html +159 -0
- dccd-2.4.0/dccd/daemon/ui/templates/inventory.html +92 -0
- dccd-2.4.0/dccd/daemon/ui/templates/jobs.html +141 -0
- dccd-2.4.0/dccd/daemon/ui/templates/logs.html +19 -0
- dccd-2.4.0/dccd/daemon/ui/templates/partials/backfill_modal.html +123 -0
- dccd-2.4.0/dccd/daemon/ui/templates/storage.html +51 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/histo_dl/coinbase.py +31 -24
- {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_backfill.py +39 -1
- {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_coinbase.py +23 -0
- dccd-2.4.0/dccd/tests/test_daemon_api.py +438 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_daemon_stream_manager.py +172 -4
- {dccd-2.3.3 → dccd-2.4.0}/dccd.egg-info/PKG-INFO +28 -3
- {dccd-2.3.3 → dccd-2.4.0}/dccd.egg-info/SOURCES.txt +14 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd.egg-info/requires.txt +12 -0
- {dccd-2.3.3 → dccd-2.4.0}/pyproject.toml +7 -3
- {dccd-2.3.3 → dccd-2.4.0}/CONTRIBUTING.md +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/LICENSE.txt +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/MANIFEST.in +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/__init__.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/continuous_dl/__init__.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/continuous_dl/binance.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/continuous_dl/bitfinex.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/continuous_dl/bitmex.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/continuous_dl/bybit.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/continuous_dl/exchange.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/continuous_dl/kraken.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/continuous_dl/okx.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/daemon/__init__.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/daemon/health.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/daemon/scheduler.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/daemon/storage.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/histo_dl/__init__.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/histo_dl/binance.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/histo_dl/bybit.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/histo_dl/exchange.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/histo_dl/kraken.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/histo_dl/okx.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/models.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/process_data.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/storage.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/__init__.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/conftest.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_binance.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_binance_ws.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_bitfinex.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_bitmex.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_bybit.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_bybit_ws.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_daemon_cli.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_daemon_config.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_daemon_health.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_daemon_scheduler.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_daemon_storage.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_date_time.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_histo_dl.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_io.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_kraken.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_kraken_ws.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_models.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_okx.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_okx_ws.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_process_data.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_storage.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/tests/test_websocket.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/tools/__init__.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/tools/date_time.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/tools/io.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd/tools/websocket.py +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd.egg-info/dependency_links.txt +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd.egg-info/entry_points.txt +0 -0
- {dccd-2.3.3 → dccd-2.4.0}/dccd.egg-info/top_level.txt +0 -0
- {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
|
+
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="
|
|
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
|
[](https://pypi.org/project/dccd/)
|
|
71
82
|
[](https://pypi.org/project/dccd/)
|
|
@@ -77,6 +88,8 @@ Dynamic: license-file
|
|
|
77
88
|
[](https://github.com/ArthurBernard/Download_Crypto_Currencies_Data)
|
|
78
89
|
[](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="
|
|
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
|
[](https://pypi.org/project/dccd/)
|
|
9
9
|
[](https://pypi.org/project/dccd/)
|
|
@@ -15,6 +15,8 @@
|
|
|
15
15
|
[](https://github.com/ArthurBernard/Download_Crypto_Currencies_Data)
|
|
16
16
|
[](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
|
```
|