deltadefi 0.1.0__tar.gz → 0.1.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.

Potentially problematic release.


This version of deltadefi might be problematic. Click here for more details.

Files changed (37) hide show
  1. {deltadefi-0.1.0 → deltadefi-0.1.3}/.env.example +1 -1
  2. {deltadefi-0.1.0 → deltadefi-0.1.3}/.gitignore +1 -1
  3. deltadefi-0.1.3/.pre-commit-config.yaml +67 -0
  4. {deltadefi-0.1.0 → deltadefi-0.1.3}/Makefile +10 -1
  5. {deltadefi-0.1.0 → deltadefi-0.1.3}/PKG-INFO +1 -1
  6. {deltadefi-0.1.0 → deltadefi-0.1.3}/coverage.xml +131 -117
  7. {deltadefi-0.1.0 → deltadefi-0.1.3}/pyproject.toml +6 -3
  8. {deltadefi-0.1.0 → deltadefi-0.1.3}/src/deltadefi/api.py +1 -1
  9. {deltadefi-0.1.0 → deltadefi-0.1.3}/src/deltadefi/clients/accounts.py +1 -1
  10. {deltadefi-0.1.0 → deltadefi-0.1.3}/src/deltadefi/clients/markets.py +1 -1
  11. {deltadefi-0.1.0 → deltadefi-0.1.3}/src/deltadefi/clients/orders.py +34 -3
  12. {deltadefi-0.1.0 → deltadefi-0.1.3}/src/deltadefi/clients/websocket.py +2 -4
  13. {deltadefi-0.1.0 → deltadefi-0.1.3}/src/deltadefi/responses/responses.py +10 -0
  14. deltadefi-0.1.3/src/deltadefi/utils/__init__.py +2 -0
  15. deltadefi-0.1.3/src/deltadefi/utils/helpers.py +46 -0
  16. {deltadefi-0.1.0 → deltadefi-0.1.3}/tests/clients/test_accounts.py +5 -2
  17. {deltadefi-0.1.0 → deltadefi-0.1.3}/tests/clients/test_order.py +6 -3
  18. {deltadefi-0.1.0 → deltadefi-0.1.3}/uv.lock +147 -1
  19. {deltadefi-0.1.0 → deltadefi-0.1.3}/.github/workflows/publish.yml +0 -0
  20. {deltadefi-0.1.0 → deltadefi-0.1.3}/README.md +0 -0
  21. {deltadefi-0.1.0 → deltadefi-0.1.3}/examples/websocket_example.py +0 -0
  22. {deltadefi-0.1.0 → deltadefi-0.1.3}/src/deltadefi/__init__.py +0 -0
  23. {deltadefi-0.1.0 → deltadefi-0.1.3}/src/deltadefi/api_resources/__init__.py +0 -0
  24. {deltadefi-0.1.0 → deltadefi-0.1.3}/src/deltadefi/api_resources/auth.py +0 -0
  25. {deltadefi-0.1.0 → deltadefi-0.1.3}/src/deltadefi/api_resources/validation.py +0 -0
  26. {deltadefi-0.1.0 → deltadefi-0.1.3}/src/deltadefi/clients/__init__.py +0 -0
  27. {deltadefi-0.1.0 → deltadefi-0.1.3}/src/deltadefi/clients/client.py +0 -0
  28. {deltadefi-0.1.0 → deltadefi-0.1.3}/src/deltadefi/constants/__init__.py +0 -0
  29. {deltadefi-0.1.0 → deltadefi-0.1.3}/src/deltadefi/constants/constants.py +0 -0
  30. {deltadefi-0.1.0 → deltadefi-0.1.3}/src/deltadefi/error.py +0 -0
  31. {deltadefi-0.1.0 → deltadefi-0.1.3}/src/deltadefi/models/__init__.py +0 -0
  32. {deltadefi-0.1.0 → deltadefi-0.1.3}/src/deltadefi/models/models.py +0 -0
  33. {deltadefi-0.1.0 → deltadefi-0.1.3}/src/deltadefi/responses/__init__.py +0 -0
  34. {deltadefi-0.1.0 → deltadefi-0.1.3}/src/deltadefi/responses/accounts.py +0 -0
  35. {deltadefi-0.1.0 → deltadefi-0.1.3}/tests/__init__.py +0 -0
  36. {deltadefi-0.1.0 → deltadefi-0.1.3}/tests/clients/__init__.py +0 -0
  37. {deltadefi-0.1.0 → deltadefi-0.1.3}/tests/clients/test_sign.py +0 -0
@@ -1,3 +1,3 @@
1
1
  TRADING_PASSWORD="xxxxxxxx"
2
2
  DELTADEFI_API_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
3
- BASE_URL="http://localhost:8080"
3
+ BASE_URL="http://localhost:8080"
@@ -59,4 +59,4 @@ docs/_build/
59
59
 
60
60
  # OS
61
61
  .DS_Store
62
- Thumbs.db
62
+ Thumbs.db
@@ -0,0 +1,67 @@
1
+ repos:
2
+ # Standard pre-commit hooks
3
+ - repo: https://github.com/pre-commit/pre-commit-hooks
4
+ rev: v5.0.0
5
+ hooks:
6
+ - id: trailing-whitespace
7
+ - id: end-of-file-fixer
8
+ - id: check-yaml
9
+ - id: check-added-large-files
10
+ - id: check-json
11
+ - id: check-toml
12
+ - id: check-merge-conflict
13
+ - id: debug-statements
14
+
15
+ # Ruff for linting and formatting
16
+ - repo: https://github.com/astral-sh/ruff-pre-commit
17
+ rev: v0.12.10
18
+ hooks:
19
+ - id: ruff
20
+ args: [--fix]
21
+ - id: ruff-format
22
+
23
+ # MyPy for type checking (lenient for now)
24
+ - repo: https://github.com/pre-commit/mirrors-mypy
25
+ rev: v1.17.1
26
+ hooks:
27
+ - id: mypy
28
+ additional_dependencies: [types-requests]
29
+ args: [--ignore-missing-imports, --disable-error-code=no-any-return, --disable-error-code=call-arg]
30
+
31
+ # Custom hooks for project-specific checks
32
+ - repo: local
33
+ hooks:
34
+ # Install dependencies
35
+ - id: uv-sync
36
+ name: Install dependencies
37
+ entry: uv sync --dev
38
+ language: system
39
+ pass_filenames: false
40
+ stages: [pre-commit]
41
+
42
+ # Run tests
43
+ - id: pytest
44
+ name: Run tests
45
+ entry: uv run pytest
46
+ language: system
47
+ pass_filenames: false
48
+ stages: [pre-commit]
49
+
50
+ # Build package
51
+ - id: uv-build
52
+ name: Build package
53
+ entry: uv build --out-dir .pre-commit-build
54
+ language: system
55
+ pass_filenames: false
56
+ stages: [pre-commit]
57
+
58
+ # Clean up build artifacts
59
+ - id: cleanup-build
60
+ name: Clean build artifacts
61
+ entry: rm -rf .pre-commit-build
62
+ language: system
63
+ pass_filenames: false
64
+ stages: [pre-commit]
65
+
66
+ # Configure which hooks run at different stages
67
+ default_stages: [pre-commit]
@@ -59,7 +59,7 @@ cov-html: cov ## Check code coverage and generate HTML report [test]
59
59
  @$(UV) run coverage html -d cov_html
60
60
  @echo "Coverage report generated in cov_html/"
61
61
 
62
- # 🏗️ Building & Distribution
62
+ # 🏗️ Building & Distribution
63
63
  build: install ## Build the package [build]
64
64
  @$(UV) build
65
65
 
@@ -83,3 +83,12 @@ clean: clean-test ## Remove caches, build artifacts, and temp files
83
83
  version: ## Show uv and Python versions
84
84
  @$(UV) --version
85
85
  @$(UV) run $(PY) -c "import platform; print('Python', platform.python_version())"
86
+
87
+ precommit-install: ## Install pre-commit hooks
88
+ @$(UV) run pre-commit install
89
+
90
+ precommit: ## Run pre-commit hooks on all files
91
+ @$(UV) run pre-commit run --all-files
92
+
93
+ precommit-update: ## Update pre-commit hooks
94
+ @$(UV) run pre-commit autoupdate
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: deltadefi
3
- Version: 0.1.0
3
+ Version: 0.1.3
4
4
  Summary: Python SDK for DeltaDeFi protocol.
5
5
  Author-email: HinsonSIDAN <wongkahinhinson@gmail.com>
6
6
  License-Expression: Apache-2.0
@@ -1,5 +1,5 @@
1
1
  <?xml version="1.0" ?>
2
- <coverage version="7.10.6" timestamp="1756706611321" lines-valid="620" lines-covered="282" line-rate="0.4548" branches-covered="0" branches-valid="0" branch-rate="0" complexity="0">
2
+ <coverage version="7.10.6" timestamp="1760881961146" lines-valid="633" lines-covered="291" line-rate="0.4597" branches-covered="0" branches-valid="0" branch-rate="0" complexity="0">
3
3
  <!-- Generated by coverage.py: https://coverage.readthedocs.io/en/7.10.6 -->
4
4
  <!-- Based on https://raw.githubusercontent.com/cobertura/web/master/htdocs/xml/coverage-04.dtd -->
5
5
  <sources>
@@ -159,7 +159,7 @@
159
159
  </class>
160
160
  </classes>
161
161
  </package>
162
- <package name="src.deltadefi.clients" line-rate="0.2492" branch-rate="0" complexity="0">
162
+ <package name="src.deltadefi.clients" line-rate="0.2508" branch-rate="0" complexity="0">
163
163
  <classes>
164
164
  <class name="__init__.py" filename="src/deltadefi/clients/__init__.py" complexity="0" line-rate="1" branch-rate="0">
165
165
  <methods/>
@@ -175,8 +175,8 @@
175
175
  <line number="5" hits="1"/>
176
176
  <line number="6" hits="1"/>
177
177
  <line number="7" hits="1"/>
178
- <line number="8" hits="1"/>
179
- <line number="18" hits="1"/>
178
+ <line number="17" hits="1"/>
179
+ <line number="24" hits="1"/>
180
180
  <line number="27" hits="1"/>
181
181
  <line number="32" hits="1"/>
182
182
  <line number="34" hits="1"/>
@@ -307,43 +307,51 @@
307
307
  <line number="59" hits="0"/>
308
308
  </lines>
309
309
  </class>
310
- <class name="orders.py" filename="src/deltadefi/clients/orders.py" complexity="0" line-rate="0.3548" branch-rate="0">
310
+ <class name="orders.py" filename="src/deltadefi/clients/orders.py" complexity="0" line-rate="0.3333" branch-rate="0">
311
311
  <methods/>
312
312
  <lines>
313
313
  <line number="1" hits="1"/>
314
314
  <line number="2" hits="1"/>
315
315
  <line number="3" hits="1"/>
316
- <line number="4" hits="1"/>
317
- <line number="11" hits="1"/>
318
- <line number="16" hits="1"/>
316
+ <line number="10" hits="1"/>
317
+ <line number="13" hits="1"/>
319
318
  <line number="18" hits="1"/>
320
- <line number="19" hits="0"/>
321
- <line number="21" hits="1"/>
322
- <line number="43" hits="0"/>
323
- <line number="52" hits="0"/>
324
- <line number="53" hits="0"/>
319
+ <line number="20" hits="1"/>
320
+ <line number="21" hits="0"/>
321
+ <line number="23" hits="1"/>
322
+ <line number="45" hits="0"/>
323
+ <line number="54" hits="0"/>
325
324
  <line number="55" hits="0"/>
326
- <line number="56" hits="0"/>
327
- <line number="60" hits="0"/>
328
- <line number="68" hits="0"/>
329
- <line number="69" hits="0"/>
330
- <line number="71" hits="1"/>
331
- <line number="84" hits="0"/>
325
+ <line number="57" hits="0"/>
326
+ <line number="58" hits="0"/>
327
+ <line number="62" hits="0"/>
328
+ <line number="70" hits="0"/>
329
+ <line number="71" hits="0"/>
330
+ <line number="73" hits="1"/>
332
331
  <line number="86" hits="0"/>
333
- <line number="87" hits="0"/>
334
- <line number="89" hits="1"/>
332
+ <line number="88" hits="0"/>
333
+ <line number="89" hits="0"/>
334
+ <line number="91" hits="1"/>
335
335
  <line number="101" hits="0"/>
336
336
  <line number="102" hits="0"/>
337
- <line number="104" hits="0"/>
338
- <line number="105" hits="0"/>
339
- <line number="107" hits="1"/>
340
- <line number="114" hits="0"/>
341
- <line number="115" hits="0"/>
337
+ <line number="104" hits="1"/>
342
338
  <line number="117" hits="0"/>
343
339
  <line number="118" hits="0"/>
340
+ <line number="120" hits="0"/>
341
+ <line number="121" hits="0"/>
342
+ <line number="123" hits="1"/>
343
+ <line number="130" hits="0"/>
344
+ <line number="131" hits="0"/>
345
+ <line number="133" hits="0"/>
346
+ <line number="134" hits="0"/>
347
+ <line number="136" hits="1"/>
348
+ <line number="145" hits="0"/>
349
+ <line number="146" hits="0"/>
350
+ <line number="148" hits="0"/>
351
+ <line number="149" hits="0"/>
344
352
  </lines>
345
353
  </class>
346
- <class name="websocket.py" filename="src/deltadefi/clients/websocket.py" complexity="0" line-rate="0.141" branch-rate="0">
354
+ <class name="websocket.py" filename="src/deltadefi/clients/websocket.py" complexity="0" line-rate="0.1429" branch-rate="0">
347
355
  <methods/>
348
356
  <lines>
349
357
  <line number="1" hits="1"/>
@@ -437,71 +445,69 @@
437
445
  <line number="185" hits="0"/>
438
446
  <line number="188" hits="0"/>
439
447
  <line number="189" hits="0"/>
440
- <line number="190" hits="0"/>
441
448
  <line number="191" hits="0"/>
442
449
  <line number="193" hits="0"/>
443
450
  <line number="195" hits="0"/>
451
+ <line number="196" hits="0"/>
444
452
  <line number="197" hits="0"/>
445
453
  <line number="198" hits="0"/>
446
- <line number="199" hits="0"/>
447
- <line number="200" hits="0"/>
448
- <line number="202" hits="1"/>
449
- <line number="204" hits="0"/>
450
- <line number="205" hits="0"/>
454
+ <line number="200" hits="1"/>
455
+ <line number="202" hits="0"/>
456
+ <line number="203" hits="0"/>
457
+ <line number="207" hits="0"/>
458
+ <line number="208" hits="0"/>
451
459
  <line number="209" hits="0"/>
452
460
  <line number="210" hits="0"/>
453
461
  <line number="211" hits="0"/>
454
- <line number="212" hits="0"/>
455
- <line number="213" hits="0"/>
456
- <line number="215" hits="1"/>
457
- <line number="223" hits="0"/>
458
- <line number="225" hits="1"/>
459
- <line number="232" hits="0"/>
460
- <line number="233" hits="0"/>
461
- <line number="238" hits="0"/>
462
- <line number="239" hits="0"/>
463
- <line number="242" hits="0"/>
464
- <line number="243" hits="0"/>
465
- <line number="246" hits="0"/>
466
- <line number="251" hits="0"/>
467
- <line number="253" hits="1"/>
468
- <line number="260" hits="0"/>
469
- <line number="261" hits="0"/>
470
- <line number="266" hits="0"/>
471
- <line number="267" hits="0"/>
472
- <line number="270" hits="0"/>
473
- <line number="271" hits="0"/>
474
- <line number="274" hits="0"/>
475
- <line number="279" hits="0"/>
476
- <line number="281" hits="1"/>
477
- <line number="288" hits="0"/>
478
- <line number="289" hits="0"/>
479
- <line number="294" hits="0"/>
480
- <line number="295" hits="0"/>
481
- <line number="298" hits="0"/>
482
- <line number="299" hits="0"/>
483
- <line number="302" hits="0"/>
484
- <line number="307" hits="0"/>
485
- <line number="309" hits="1"/>
486
- <line number="314" hits="0"/>
487
- <line number="315" hits="0"/>
488
- <line number="320" hits="0"/>
489
- <line number="321" hits="0"/>
490
- <line number="324" hits="0"/>
491
- <line number="325" hits="0"/>
492
- <line number="328" hits="0"/>
493
- <line number="329" hits="0"/>
494
- <line number="331" hits="1"/>
495
- <line number="338" hits="0"/>
462
+ <line number="213" hits="1"/>
463
+ <line number="221" hits="0"/>
464
+ <line number="223" hits="1"/>
465
+ <line number="230" hits="0"/>
466
+ <line number="231" hits="0"/>
467
+ <line number="236" hits="0"/>
468
+ <line number="237" hits="0"/>
469
+ <line number="240" hits="0"/>
470
+ <line number="241" hits="0"/>
471
+ <line number="244" hits="0"/>
472
+ <line number="249" hits="0"/>
473
+ <line number="251" hits="1"/>
474
+ <line number="258" hits="0"/>
475
+ <line number="259" hits="0"/>
476
+ <line number="264" hits="0"/>
477
+ <line number="265" hits="0"/>
478
+ <line number="268" hits="0"/>
479
+ <line number="269" hits="0"/>
480
+ <line number="272" hits="0"/>
481
+ <line number="277" hits="0"/>
482
+ <line number="279" hits="1"/>
483
+ <line number="286" hits="0"/>
484
+ <line number="287" hits="0"/>
485
+ <line number="292" hits="0"/>
486
+ <line number="293" hits="0"/>
487
+ <line number="296" hits="0"/>
488
+ <line number="297" hits="0"/>
489
+ <line number="300" hits="0"/>
490
+ <line number="305" hits="0"/>
491
+ <line number="307" hits="1"/>
492
+ <line number="312" hits="0"/>
493
+ <line number="313" hits="0"/>
494
+ <line number="318" hits="0"/>
495
+ <line number="319" hits="0"/>
496
+ <line number="322" hits="0"/>
497
+ <line number="323" hits="0"/>
498
+ <line number="326" hits="0"/>
499
+ <line number="327" hits="0"/>
500
+ <line number="329" hits="1"/>
501
+ <line number="336" hits="0"/>
502
+ <line number="337" hits="0"/>
496
503
  <line number="339" hits="0"/>
497
- <line number="341" hits="0"/>
498
- <line number="342" hits="0"/>
504
+ <line number="340" hits="0"/>
505
+ <line number="346" hits="0"/>
506
+ <line number="347" hits="0"/>
499
507
  <line number="348" hits="0"/>
500
- <line number="349" hits="0"/>
501
- <line number="350" hits="0"/>
502
- <line number="352" hits="1"/>
503
- <line number="354" hits="0"/>
504
- <line number="355" hits="0"/>
508
+ <line number="350" hits="1"/>
509
+ <line number="352" hits="0"/>
510
+ <line number="353" hits="0"/>
505
511
  </lines>
506
512
  </class>
507
513
  </classes>
@@ -526,41 +532,6 @@
526
532
  </class>
527
533
  </classes>
528
534
  </package>
529
- <package name="src.deltadefi.lib" line-rate="0.3636" branch-rate="0" complexity="0">
530
- <classes>
531
- <class name="__init__.py" filename="src/deltadefi/lib/__init__.py" complexity="0" line-rate="1" branch-rate="0">
532
- <methods/>
533
- <lines/>
534
- </class>
535
- <class name="utils.py" filename="src/deltadefi/lib/utils.py" complexity="0" line-rate="0.3636" branch-rate="0">
536
- <methods/>
537
- <lines>
538
- <line number="1" hits="1"/>
539
- <line number="3" hits="1"/>
540
- <line number="10" hits="1"/>
541
- <line number="11" hits="0"/>
542
- <line number="12" hits="0"/>
543
- <line number="13" hits="0"/>
544
- <line number="14" hits="0"/>
545
- <line number="15" hits="0"/>
546
- <line number="18" hits="1"/>
547
- <line number="19" hits="0"/>
548
- <line number="20" hits="0"/>
549
- <line number="23" hits="1"/>
550
- <line number="31" hits="0"/>
551
- <line number="32" hits="0"/>
552
- <line number="35" hits="1"/>
553
- <line number="36" hits="0"/>
554
- <line number="37" hits="0"/>
555
- <line number="40" hits="1"/>
556
- <line number="41" hits="0"/>
557
- <line number="42" hits="0"/>
558
- <line number="45" hits="1"/>
559
- <line number="46" hits="0"/>
560
- </lines>
561
- </class>
562
- </classes>
563
- </package>
564
535
  <package name="src.deltadefi.models" line-rate="1" branch-rate="0" complexity="0">
565
536
  <classes>
566
537
  <class name="__init__.py" filename="src/deltadefi/models/__init__.py" complexity="0" line-rate="1" branch-rate="0">
@@ -754,6 +725,49 @@
754
725
  <line number="61" hits="1"/>
755
726
  <line number="62" hits="1"/>
756
727
  <line number="63" hits="1"/>
728
+ <line number="66" hits="1"/>
729
+ <line number="67" hits="1"/>
730
+ <line number="68" hits="1"/>
731
+ <line number="71" hits="1"/>
732
+ <line number="72" hits="1"/>
733
+ <line number="73" hits="1"/>
734
+ </lines>
735
+ </class>
736
+ </classes>
737
+ </package>
738
+ <package name="src.deltadefi.utils" line-rate="0.3913" branch-rate="0" complexity="0">
739
+ <classes>
740
+ <class name="__init__.py" filename="src/deltadefi/utils/__init__.py" complexity="0" line-rate="1" branch-rate="0">
741
+ <methods/>
742
+ <lines>
743
+ <line number="2" hits="1"/>
744
+ </lines>
745
+ </class>
746
+ <class name="helpers.py" filename="src/deltadefi/utils/helpers.py" complexity="0" line-rate="0.3636" branch-rate="0">
747
+ <methods/>
748
+ <lines>
749
+ <line number="1" hits="1"/>
750
+ <line number="3" hits="1"/>
751
+ <line number="10" hits="1"/>
752
+ <line number="11" hits="0"/>
753
+ <line number="12" hits="0"/>
754
+ <line number="13" hits="0"/>
755
+ <line number="14" hits="0"/>
756
+ <line number="15" hits="0"/>
757
+ <line number="18" hits="1"/>
758
+ <line number="19" hits="0"/>
759
+ <line number="20" hits="0"/>
760
+ <line number="23" hits="1"/>
761
+ <line number="31" hits="0"/>
762
+ <line number="32" hits="0"/>
763
+ <line number="35" hits="1"/>
764
+ <line number="36" hits="0"/>
765
+ <line number="37" hits="0"/>
766
+ <line number="40" hits="1"/>
767
+ <line number="41" hits="0"/>
768
+ <line number="42" hits="0"/>
769
+ <line number="45" hits="1"/>
770
+ <line number="46" hits="0"/>
757
771
  </lines>
758
772
  </class>
759
773
  </classes>
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "deltadefi"
3
- version = "0.1.0"
3
+ version = "0.1.3"
4
4
  description = "Python SDK for DeltaDeFi protocol."
5
5
  readme = "README.md"
6
6
  requires-python = ">3.11,<4.0.0"
@@ -26,7 +26,7 @@ dependencies = [
26
26
  "sidan-gin>=0.1.6",
27
27
  "requests>=2.25.0",
28
28
  "certifi>=2024.8.30",
29
- "charset-normalizer>=3.4.0",
29
+ "charset-normalizer>=3.4.0",
30
30
  "idna>=3.10",
31
31
  "urllib3>=2.2.3",
32
32
  "pycardano>=0.12.3",
@@ -42,6 +42,8 @@ dev = [
42
42
  "ruff>=0.12.10",
43
43
  "mypy>=1.17.1",
44
44
  "twine>=5.0.0",
45
+ "build>=1.3.0",
46
+ "pre-commit>=4.3.0",
45
47
  ]
46
48
 
47
49
  docs = [
@@ -54,6 +56,7 @@ docs = [
54
56
  requires = ["hatchling"]
55
57
  build-backend = "hatchling.build"
56
58
 
59
+
57
60
  [tool.ruff]
58
61
  line-length = 88
59
62
  target-version = "py311"
@@ -63,7 +66,7 @@ exclude = [
63
66
  ".venv",
64
67
  "__pycache__",
65
68
  "build",
66
- "dist",
69
+ "dist",
67
70
  ".pytest_cache",
68
71
  ".mypy_cache",
69
72
  ".ruff_cache",
@@ -3,7 +3,7 @@ import json
3
3
  import requests
4
4
 
5
5
  from deltadefi.error import ClientError, ServerError
6
- from deltadefi.lib.utils import clean_none_value, encoded_string
6
+ from deltadefi.utils import clean_none_value, encoded_string
7
7
 
8
8
 
9
9
  class API:
@@ -3,7 +3,6 @@
3
3
  from sidan_gin import Asset, UTxO
4
4
 
5
5
  from deltadefi.api import API
6
- from deltadefi.lib.utils import check_required_parameter, check_required_parameters
7
6
  from deltadefi.models.models import OrderStatusType
8
7
  from deltadefi.responses import (
9
8
  BuildDepositTransactionResponse,
@@ -22,6 +21,7 @@ from deltadefi.responses.accounts import (
22
21
  GetOrderRecordsResponse,
23
22
  SubmitTransferalTransactionResponse,
24
23
  )
24
+ from deltadefi.utils import check_required_parameter, check_required_parameters
25
25
 
26
26
 
27
27
  class Accounts(API):
@@ -1,8 +1,8 @@
1
1
  from typing import Literal
2
2
 
3
3
  from deltadefi.api import API
4
- from deltadefi.lib.utils import check_required_parameter, check_required_parameters
5
4
  from deltadefi.responses import GetAggregatedPriceResponse, GetMarketPriceResponse
5
+ from deltadefi.utils import check_required_parameter, check_required_parameters
6
6
 
7
7
 
8
8
  class Market(API):
@@ -1,11 +1,13 @@
1
1
  from deltadefi.api import API
2
- from deltadefi.lib.utils import check_required_parameter, check_required_parameters
3
2
  from deltadefi.models.models import OrderSide, OrderType
4
3
  from deltadefi.responses import (
4
+ BuildCancelAllOrdersTransactionResponse,
5
5
  BuildCancelOrderTransactionResponse,
6
6
  BuildPlaceOrderTransactionResponse,
7
+ SubmitCancelAllOrdersTransactionResponse,
7
8
  SubmitPlaceOrderTransactionResponse,
8
9
  )
10
+ from deltadefi.utils import check_required_parameter, check_required_parameters
9
11
 
10
12
 
11
13
  class Order(API):
@@ -86,6 +88,19 @@ class Order(API):
86
88
  url_path = f"/{order_id}/build"
87
89
  return self.send_request("DELETE", self.group_url_path + url_path, **kwargs)
88
90
 
91
+ def build_cancel_all_orders_transaction(
92
+ self, **kwargs
93
+ ) -> BuildCancelAllOrdersTransactionResponse:
94
+ """
95
+ Build a cancel all orders transaction.
96
+
97
+ Returns:
98
+ A BuildCancelAllOrdersTransactionResponse object containing the built cancel all orders transaction.
99
+ """
100
+
101
+ url_path = "/cancel-all/build"
102
+ return self.send_request("DELETE", self.group_url_path + url_path, **kwargs)
103
+
89
104
  def submit_place_order_transaction(
90
105
  self, order_id: str, signed_tx: str, **kwargs
91
106
  ) -> SubmitPlaceOrderTransactionResponse:
@@ -93,7 +108,8 @@ class Order(API):
93
108
  Submit a place order transaction.
94
109
 
95
110
  Args:
96
- data: A SubmitPlaceOrderTransactionRequest object containing the order details.
111
+ order_id: The ID of the order to be placed.
112
+ signed_tx: The signed transaction hex string for placing the order.
97
113
 
98
114
  Returns:
99
115
  A SubmitPlaceOrderTransactionResponse object containing the submitted order transaction.
@@ -109,10 +125,25 @@ class Order(API):
109
125
  Submit a cancel order transaction.
110
126
 
111
127
  Args:
112
- data: A SubmitCancelOrderTransactionRequest object containing the cancel order details.
128
+ signed_tx: The signed transaction hex string for canceling the order.
113
129
  """
114
130
  check_required_parameter(signed_tx, "signed_tx")
115
131
  payload = {"signed_tx": signed_tx, **kwargs}
116
132
 
117
133
  path_url = "/submit"
118
134
  return self.send_request("DELETE", self.group_url_path + path_url, payload)
135
+
136
+ def submit_cancel_all_orders_transaction(
137
+ self, signed_txs: list[str], **kwargs
138
+ ) -> SubmitCancelAllOrdersTransactionResponse:
139
+ """
140
+ Submit a cancel all orders transaction.
141
+
142
+ Args:
143
+ signed_txs: A list of signed transaction hex strings for canceling all orders.
144
+ """
145
+ check_required_parameter(signed_txs, "signed_txs")
146
+ payload = {"signed_txs": signed_txs, **kwargs}
147
+
148
+ path_url = "/cancel-all/submit"
149
+ return self.send_request("DELETE", self.group_url_path + path_url, payload)
@@ -187,10 +187,8 @@ class WebSocketClient:
187
187
  # In a more complex implementation, you'd want to handle multiple concurrent subscriptions
188
188
  if self.subscriptions:
189
189
  first_sub = next(iter(self.subscriptions.values()))
190
- if first_sub.get("type") == "trade":
191
- await self.connect(first_sub["endpoint"])
192
- else:
193
- await self.connect()
190
+ # Always use the stored endpoint for reconnection
191
+ await self.connect(first_sub["endpoint"])
194
192
  else:
195
193
  await self.connect()
196
194
 
@@ -61,3 +61,13 @@ class PostOrderResponse(SubmitPlaceOrderTransactionResponse):
61
61
  @dataclass
62
62
  class BuildCancelOrderTransactionResponse(TypedDict):
63
63
  tx_hex: str
64
+
65
+
66
+ @dataclass
67
+ class BuildCancelAllOrdersTransactionResponse(TypedDict):
68
+ tx_hexes: list[str]
69
+
70
+
71
+ @dataclass
72
+ class SubmitCancelAllOrdersTransactionResponse(TypedDict):
73
+ cancelled_order_ids: list[str]
@@ -0,0 +1,2 @@
1
+ # flake8: noqa
2
+ from .helpers import *
@@ -0,0 +1,46 @@
1
+ from urllib.parse import urlencode
2
+
3
+ from deltadefi.error import (
4
+ ParameterRequiredError,
5
+ ParameterTypeError,
6
+ ParameterValueError,
7
+ )
8
+
9
+
10
+ def clean_none_value(d) -> dict:
11
+ out = {}
12
+ for k in d:
13
+ if d[k] is not None:
14
+ out[k] = d[k]
15
+ return out
16
+
17
+
18
+ def check_required_parameter(value, name):
19
+ if not value and value != 0:
20
+ raise ParameterRequiredError([name])
21
+
22
+
23
+ def check_required_parameters(params):
24
+ """Validate multiple parameters
25
+ params = [
26
+ ['btcusdt', 'symbol'],
27
+ [10, 'price']
28
+ ]
29
+
30
+ """
31
+ for p in params:
32
+ check_required_parameter(p[0], p[1])
33
+
34
+
35
+ def check_enum_parameter(value, enum_class):
36
+ if value not in {item.value for item in enum_class}:
37
+ raise ParameterValueError([value])
38
+
39
+
40
+ def check_type_parameter(value, name, data_type):
41
+ if value is not None and not isinstance(value, data_type):
42
+ raise ParameterTypeError([name, data_type])
43
+
44
+
45
+ def encoded_string(query):
46
+ return urlencode(query, True).replace("%40", "@")
@@ -2,19 +2,22 @@
2
2
  import os
3
3
  import unittest
4
4
 
5
+ import dotenv
6
+
5
7
  from deltadefi.clients import ApiClient
6
8
  from deltadefi.responses import GetAccountBalanceResponse
7
9
  from deltadefi.responses.accounts import GetOperationKeyResponse
8
10
 
11
+ dotenv.load_dotenv()
12
+
9
13
 
10
14
  class TestAccounts(unittest.TestCase):
11
15
  def setUp(self):
12
16
  api_key = os.getenv("DELTADEFI_API_KEY")
13
- base_url = os.getenv("BASE_URL", "http://localhost:8080")
14
17
  print(api_key)
15
18
  if not api_key:
16
19
  self.skipTest("DELTADEFI_API_KEY not set in environment variables")
17
- self.api = ApiClient(api_key=api_key, base_url=base_url)
20
+ self.api = ApiClient(api_key=api_key)
18
21
 
19
22
  def test_get_operation_key(self):
20
23
  response: GetOperationKeyResponse = self.api.accounts.get_operation_key()
@@ -2,20 +2,23 @@
2
2
  import os
3
3
  import unittest
4
4
 
5
- from sidan_gin import Wallet
5
+ import dotenv
6
6
 
7
7
  from deltadefi.clients import ApiClient
8
8
  from deltadefi.responses import PostOrderResponse
9
9
 
10
+ dotenv.load_dotenv()
11
+
10
12
 
11
13
  class TestOrder(unittest.TestCase):
12
14
  def setUp(self):
13
15
  api_key = os.getenv("DELTADEFI_API_KEY")
14
16
  password = os.getenv("TRADING_PASSWORD")
15
- base_url = os.getenv("BASE_URL", "http://localhost:8080")
16
17
  if not api_key:
17
18
  self.skipTest("DELTADEFI_API_KEY not set in environment variables")
18
- api = ApiClient(api_key=api_key, base_url=base_url)
19
+ if not password:
20
+ self.skipTest("TRADING_PASSWORD not set in environment variables")
21
+ api = ApiClient(api_key=api_key)
19
22
  api.load_operation_key(password)
20
23
  self.api = api
21
24
 
@@ -68,6 +68,20 @@ wheels = [
68
68
  { url = "https://files.pythonhosted.org/packages/f7/5a/340b4d06f20ec087a86012bc2294db1ed7c6c85a764d19b329993787a28b/blockfrost_python-0.6.0-py3-none-any.whl", hash = "sha256:c88840b8034b30dc06c637ccd14806e472d830d63522d2a667d9263640a354f4", size = 30857, upload-time = "2024-08-28T10:42:37.412Z" },
69
69
  ]
70
70
 
71
+ [[package]]
72
+ name = "build"
73
+ version = "1.3.0"
74
+ source = { registry = "https://pypi.org/simple" }
75
+ dependencies = [
76
+ { name = "colorama", marker = "os_name == 'nt'" },
77
+ { name = "packaging" },
78
+ { name = "pyproject-hooks" },
79
+ ]
80
+ sdist = { url = "https://files.pythonhosted.org/packages/25/1c/23e33405a7c9eac261dff640926b8b5adaed6a6eb3e1767d441ed611d0c0/build-1.3.0.tar.gz", hash = "sha256:698edd0ea270bde950f53aed21f3a0135672206f3911e0176261a31e0e07b397", size = 48544, upload-time = "2025-08-01T21:27:09.268Z" }
81
+ wheels = [
82
+ { url = "https://files.pythonhosted.org/packages/cb/8c/2b30c12155ad8de0cf641d76a8b396a16d2c36bc6d50b621a62b7c4567c1/build-1.3.0-py3-none-any.whl", hash = "sha256:7145f0b5061ba90a1500d60bd1b13ca0a8a4cebdd0cc16ed8adf1c0e739f43b4", size = 23382, upload-time = "2025-08-01T21:27:07.844Z" },
83
+ ]
84
+
71
85
  [[package]]
72
86
  name = "cachetools"
73
87
  version = "5.5.2"
@@ -204,6 +218,15 @@ wheels = [
204
218
  { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009, upload-time = "2024-09-04T20:44:45.309Z" },
205
219
  ]
206
220
 
221
+ [[package]]
222
+ name = "cfgv"
223
+ version = "3.4.0"
224
+ source = { registry = "https://pypi.org/simple" }
225
+ sdist = { url = "https://files.pythonhosted.org/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560", size = 7114, upload-time = "2023-08-12T20:38:17.776Z" }
226
+ wheels = [
227
+ { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249, upload-time = "2023-08-12T20:38:16.269Z" },
228
+ ]
229
+
207
230
  [[package]]
208
231
  name = "charset-normalizer"
209
232
  version = "3.4.3"
@@ -412,7 +435,7 @@ wheels = [
412
435
 
413
436
  [[package]]
414
437
  name = "deltadefi"
415
- version = "0.1.0"
438
+ version = "0.1.3"
416
439
  source = { editable = "." }
417
440
  dependencies = [
418
441
  { name = "certifi" },
@@ -428,7 +451,9 @@ dependencies = [
428
451
 
429
452
  [package.dev-dependencies]
430
453
  dev = [
454
+ { name = "build" },
431
455
  { name = "mypy" },
456
+ { name = "pre-commit" },
432
457
  { name = "pytest" },
433
458
  { name = "pytest-cov" },
434
459
  { name = "pytest-xdist" },
@@ -456,7 +481,9 @@ requires-dist = [
456
481
 
457
482
  [package.metadata.requires-dev]
458
483
  dev = [
484
+ { name = "build", specifier = ">=1.3.0" },
459
485
  { name = "mypy", specifier = ">=1.17.1" },
486
+ { name = "pre-commit", specifier = ">=4.3.0" },
460
487
  { name = "pytest", specifier = ">=8.2.0" },
461
488
  { name = "pytest-cov", specifier = ">=5.0.0" },
462
489
  { name = "pytest-xdist", specifier = ">=3.5.0" },
@@ -469,6 +496,15 @@ docs = [
469
496
  { name = "sphinx-rtd-theme", specifier = ">=2.0.0" },
470
497
  ]
471
498
 
499
+ [[package]]
500
+ name = "distlib"
501
+ version = "0.4.0"
502
+ source = { registry = "https://pypi.org/simple" }
503
+ sdist = { url = "https://files.pythonhosted.org/packages/96/8e/709914eb2b5749865801041647dc7f4e6d00b549cfe88b65ca192995f07c/distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d", size = 614605, upload-time = "2025-07-17T16:52:00.465Z" }
504
+ wheels = [
505
+ { url = "https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16", size = 469047, upload-time = "2025-07-17T16:51:58.613Z" },
506
+ ]
507
+
472
508
  [[package]]
473
509
  name = "docker"
474
510
  version = "7.1.0"
@@ -522,6 +558,15 @@ wheels = [
522
558
  { url = "https://files.pythonhosted.org/packages/43/09/2aea36ff60d16dd8879bdb2f5b3ee0ba8d08cbbdcdfe870e695ce3784385/execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc", size = 40612, upload-time = "2024-04-08T09:04:17.414Z" },
523
559
  ]
524
560
 
561
+ [[package]]
562
+ name = "filelock"
563
+ version = "3.19.1"
564
+ source = { registry = "https://pypi.org/simple" }
565
+ sdist = { url = "https://files.pythonhosted.org/packages/40/bb/0ab3e58d22305b6f5440629d20683af28959bf793d98d11950e305c1c326/filelock-3.19.1.tar.gz", hash = "sha256:66eda1888b0171c998b35be2bcc0f6d75c388a7ce20c3f3f37aa8e96c2dddf58", size = 17687, upload-time = "2025-08-14T16:56:03.016Z" }
566
+ wheels = [
567
+ { url = "https://files.pythonhosted.org/packages/42/14/42b2651a2f46b022ccd948bca9f2d5af0fd8929c4eec235b8d6d844fbe67/filelock-3.19.1-py3-none-any.whl", hash = "sha256:d38e30481def20772f5baf097c122c3babc4fcdb7e14e57049eb9d88c6dc017d", size = 15988, upload-time = "2025-08-14T16:56:01.633Z" },
568
+ ]
569
+
525
570
  [[package]]
526
571
  name = "frozendict"
527
572
  version = "2.4.6"
@@ -634,6 +679,15 @@ wheels = [
634
679
  { url = "https://files.pythonhosted.org/packages/9f/cb/18326d2d89ad3b0dd143da971e77afd1e6ca6674f1b1c3df4b6bec6279fc/id-1.5.0-py3-none-any.whl", hash = "sha256:f1434e1cef91f2cbb8a4ec64663d5a23b9ed43ef44c4c957d02583d61714c658", size = 13611, upload-time = "2024-12-04T19:53:03.02Z" },
635
680
  ]
636
681
 
682
+ [[package]]
683
+ name = "identify"
684
+ version = "2.6.13"
685
+ source = { registry = "https://pypi.org/simple" }
686
+ sdist = { url = "https://files.pythonhosted.org/packages/82/ca/ffbabe3635bb839aa36b3a893c91a9b0d368cb4d8073e03a12896970af82/identify-2.6.13.tar.gz", hash = "sha256:da8d6c828e773620e13bfa86ea601c5a5310ba4bcd65edf378198b56a1f9fb32", size = 99243, upload-time = "2025-08-09T19:35:00.6Z" }
687
+ wheels = [
688
+ { url = "https://files.pythonhosted.org/packages/e7/ce/461b60a3ee109518c055953729bf9ed089a04db895d47e95444071dcdef2/identify-2.6.13-py2.py3-none-any.whl", hash = "sha256:60381139b3ae39447482ecc406944190f690d4a2997f2584062089848361b33b", size = 99153, upload-time = "2025-08-09T19:34:59.1Z" },
689
+ ]
690
+
637
691
  [[package]]
638
692
  name = "idna"
639
693
  version = "3.10"
@@ -915,6 +969,15 @@ wheels = [
915
969
  { url = "https://files.pythonhosted.org/packages/5b/76/3165e84e5266d146d967a6cc784ff2fbf6ddd00985a55ec006b72bc39d5d/nh3-0.3.0-cp38-abi3-win_arm64.whl", hash = "sha256:d97d3efd61404af7e5721a0e74d81cdbfc6e5f97e11e731bb6d090e30a7b62b2", size = 585971, upload-time = "2025-07-17T14:43:35.936Z" },
916
970
  ]
917
971
 
972
+ [[package]]
973
+ name = "nodeenv"
974
+ version = "1.9.1"
975
+ source = { registry = "https://pypi.org/simple" }
976
+ sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437, upload-time = "2024-06-04T18:44:11.171Z" }
977
+ wheels = [
978
+ { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314, upload-time = "2024-06-04T18:44:08.352Z" },
979
+ ]
980
+
918
981
  [[package]]
919
982
  name = "ogmios"
920
983
  version = "1.3.0"
@@ -1039,6 +1102,15 @@ wheels = [
1039
1102
  { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload-time = "2023-11-25T06:56:14.81Z" },
1040
1103
  ]
1041
1104
 
1105
+ [[package]]
1106
+ name = "platformdirs"
1107
+ version = "4.4.0"
1108
+ source = { registry = "https://pypi.org/simple" }
1109
+ sdist = { url = "https://files.pythonhosted.org/packages/23/e8/21db9c9987b0e728855bd57bff6984f67952bea55d6f75e055c46b5383e8/platformdirs-4.4.0.tar.gz", hash = "sha256:ca753cf4d81dc309bc67b0ea38fd15dc97bc30ce419a7f58d13eb3bf14c4febf", size = 21634, upload-time = "2025-08-26T14:32:04.268Z" }
1110
+ wheels = [
1111
+ { url = "https://files.pythonhosted.org/packages/40/4b/2028861e724d3bd36227adfa20d3fd24c3fc6d52032f4a93c133be5d17ce/platformdirs-4.4.0-py3-none-any.whl", hash = "sha256:abd01743f24e5287cd7a5db3752faf1a2d65353f38ec26d98e25a6db65958c85", size = 18654, upload-time = "2025-08-26T14:32:02.735Z" },
1112
+ ]
1113
+
1042
1114
  [[package]]
1043
1115
  name = "pluggy"
1044
1116
  version = "1.6.0"
@@ -1057,6 +1129,22 @@ wheels = [
1057
1129
  { url = "https://files.pythonhosted.org/packages/4e/d1/e4ed95fdd3ef13b78630280d9e9e240aeb65cc7c544ec57106149c3942fb/pprintpp-0.4.0-py2.py3-none-any.whl", hash = "sha256:b6b4dcdd0c0c0d75e4d7b2f21a9e933e5b2ce62b26e1a54537f9651ae5a5c01d", size = 16952, upload-time = "2018-07-01T01:42:36.496Z" },
1058
1130
  ]
1059
1131
 
1132
+ [[package]]
1133
+ name = "pre-commit"
1134
+ version = "4.3.0"
1135
+ source = { registry = "https://pypi.org/simple" }
1136
+ dependencies = [
1137
+ { name = "cfgv" },
1138
+ { name = "identify" },
1139
+ { name = "nodeenv" },
1140
+ { name = "pyyaml" },
1141
+ { name = "virtualenv" },
1142
+ ]
1143
+ sdist = { url = "https://files.pythonhosted.org/packages/ff/29/7cf5bbc236333876e4b41f56e06857a87937ce4bf91e117a6991a2dbb02a/pre_commit-4.3.0.tar.gz", hash = "sha256:499fe450cc9d42e9d58e606262795ecb64dd05438943c62b66f6a8673da30b16", size = 193792, upload-time = "2025-08-09T18:56:14.651Z" }
1144
+ wheels = [
1145
+ { url = "https://files.pythonhosted.org/packages/5b/a5/987a405322d78a73b66e39e4a90e4ef156fd7141bf71df987e50717c321b/pre_commit-4.3.0-py2.py3-none-any.whl", hash = "sha256:2b0747ad7e6e967169136edffee14c16e148a778a54e4f967921aa1ebf2308d8", size = 220965, upload-time = "2025-08-09T18:56:13.192Z" },
1146
+ ]
1147
+
1060
1148
  [[package]]
1061
1149
  name = "ptyprocess"
1062
1150
  version = "0.7.0"
@@ -1211,6 +1299,15 @@ wheels = [
1211
1299
  { url = "https://files.pythonhosted.org/packages/5e/22/d3db169895faaf3e2eda892f005f433a62db2decbcfbc2f61e6517adfa87/PyNaCl-1.5.0-cp36-abi3-win_amd64.whl", hash = "sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93", size = 212141, upload-time = "2022-01-07T22:06:01.861Z" },
1212
1300
  ]
1213
1301
 
1302
+ [[package]]
1303
+ name = "pyproject-hooks"
1304
+ version = "1.2.0"
1305
+ source = { registry = "https://pypi.org/simple" }
1306
+ sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228, upload-time = "2024-09-29T09:24:13.293Z" }
1307
+ wheels = [
1308
+ { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload-time = "2024-09-29T09:24:11.978Z" },
1309
+ ]
1310
+
1214
1311
  [[package]]
1215
1312
  name = "pyreadline3"
1216
1313
  version = "3.5.4"
@@ -1300,6 +1397,41 @@ wheels = [
1300
1397
  { url = "https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8", size = 30756, upload-time = "2024-08-14T10:15:33.187Z" },
1301
1398
  ]
1302
1399
 
1400
+ [[package]]
1401
+ name = "pyyaml"
1402
+ version = "6.0.2"
1403
+ source = { registry = "https://pypi.org/simple" }
1404
+ sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631, upload-time = "2024-08-06T20:33:50.674Z" }
1405
+ wheels = [
1406
+ { url = "https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", size = 184612, upload-time = "2024-08-06T20:32:03.408Z" },
1407
+ { url = "https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", size = 172040, upload-time = "2024-08-06T20:32:04.926Z" },
1408
+ { url = "https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", size = 736829, upload-time = "2024-08-06T20:32:06.459Z" },
1409
+ { url = "https://files.pythonhosted.org/packages/51/16/6af8d6a6b210c8e54f1406a6b9481febf9c64a3109c541567e35a49aa2e7/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", size = 764167, upload-time = "2024-08-06T20:32:08.338Z" },
1410
+ { url = "https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", size = 762952, upload-time = "2024-08-06T20:32:14.124Z" },
1411
+ { url = "https://files.pythonhosted.org/packages/9b/97/ecc1abf4a823f5ac61941a9c00fe501b02ac3ab0e373c3857f7d4b83e2b6/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4", size = 735301, upload-time = "2024-08-06T20:32:16.17Z" },
1412
+ { url = "https://files.pythonhosted.org/packages/45/73/0f49dacd6e82c9430e46f4a027baa4ca205e8b0a9dce1397f44edc23559d/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", size = 756638, upload-time = "2024-08-06T20:32:18.555Z" },
1413
+ { url = "https://files.pythonhosted.org/packages/22/5f/956f0f9fc65223a58fbc14459bf34b4cc48dec52e00535c79b8db361aabd/PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", size = 143850, upload-time = "2024-08-06T20:32:19.889Z" },
1414
+ { url = "https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", size = 161980, upload-time = "2024-08-06T20:32:21.273Z" },
1415
+ { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873, upload-time = "2024-08-06T20:32:25.131Z" },
1416
+ { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302, upload-time = "2024-08-06T20:32:26.511Z" },
1417
+ { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154, upload-time = "2024-08-06T20:32:28.363Z" },
1418
+ { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223, upload-time = "2024-08-06T20:32:30.058Z" },
1419
+ { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542, upload-time = "2024-08-06T20:32:31.881Z" },
1420
+ { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164, upload-time = "2024-08-06T20:32:37.083Z" },
1421
+ { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611, upload-time = "2024-08-06T20:32:38.898Z" },
1422
+ { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591, upload-time = "2024-08-06T20:32:40.241Z" },
1423
+ { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338, upload-time = "2024-08-06T20:32:41.93Z" },
1424
+ { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309, upload-time = "2024-08-06T20:32:43.4Z" },
1425
+ { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679, upload-time = "2024-08-06T20:32:44.801Z" },
1426
+ { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428, upload-time = "2024-08-06T20:32:46.432Z" },
1427
+ { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361, upload-time = "2024-08-06T20:32:51.188Z" },
1428
+ { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523, upload-time = "2024-08-06T20:32:53.019Z" },
1429
+ { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660, upload-time = "2024-08-06T20:32:54.708Z" },
1430
+ { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597, upload-time = "2024-08-06T20:32:56.985Z" },
1431
+ { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527, upload-time = "2024-08-06T20:33:03.001Z" },
1432
+ { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload-time = "2024-08-06T20:33:04.33Z" },
1433
+ ]
1434
+
1303
1435
  [[package]]
1304
1436
  name = "readme-renderer"
1305
1437
  version = "44.0"
@@ -1635,6 +1767,20 @@ wheels = [
1635
1767
  { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" },
1636
1768
  ]
1637
1769
 
1770
+ [[package]]
1771
+ name = "virtualenv"
1772
+ version = "20.34.0"
1773
+ source = { registry = "https://pypi.org/simple" }
1774
+ dependencies = [
1775
+ { name = "distlib" },
1776
+ { name = "filelock" },
1777
+ { name = "platformdirs" },
1778
+ ]
1779
+ sdist = { url = "https://files.pythonhosted.org/packages/1c/14/37fcdba2808a6c615681cd216fecae00413c9dab44fb2e57805ecf3eaee3/virtualenv-20.34.0.tar.gz", hash = "sha256:44815b2c9dee7ed86e387b842a84f20b93f7f417f95886ca1996a72a4138eb1a", size = 6003808, upload-time = "2025-08-13T14:24:07.464Z" }
1780
+ wheels = [
1781
+ { url = "https://files.pythonhosted.org/packages/76/06/04c8e804f813cf972e3262f3f8584c232de64f0cde9f703b46cf53a45090/virtualenv-20.34.0-py3-none-any.whl", hash = "sha256:341f5afa7eee943e4984a9207c025feedd768baff6753cd660c857ceb3e36026", size = 5983279, upload-time = "2025-08-13T14:24:05.111Z" },
1782
+ ]
1783
+
1638
1784
  [[package]]
1639
1785
  name = "websocket-client"
1640
1786
  version = "1.8.0"
File without changes
File without changes