multiedge-relay 0.5.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.
- multiedge_relay-0.5.0/.github/copilot-instructions.md +26 -0
- multiedge_relay-0.5.0/.github/workflows/ci.yml +50 -0
- multiedge_relay-0.5.0/.github/workflows/release.yml +37 -0
- multiedge_relay-0.5.0/.gitignore +22 -0
- multiedge_relay-0.5.0/.hypothesis/.gitignore +9 -0
- multiedge_relay-0.5.0/.hypothesis/constants/06249be8e61f3f7a +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/076de148ac672c93 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/1278a345f455b7df +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/19e4cfe654576a55 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/1b22fd7aadfe44b6 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/1c58368a400f7be0 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/1d0f3f36815dcac2 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/2122ee0c87e1bda6 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/2562f4d115706706 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/2a7c1e4199f411be +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/2ba6a3e5f1eb5f5a +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/316cc7d4f8c51e48 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/358961f02304d16f +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/3ecb2bde6b07b5f2 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/40432abd8e6d1195 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/456e165186f6f56c +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/47113bc876385751 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/478f7747c1ed7409 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/47b4c486823c765f +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/4a2f727f9c213a05 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/4de687b3835dfeb5 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/503be4182c70fad2 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/5738f39367760881 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/5a7f1b85c6e08bfb +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/5b014fc25ace03ff +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/6147080478539147 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/61b1c5fc272c0bc2 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/664955f98d3bf410 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/6791cb70be7c37a2 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/6ded921d9a092dc6 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/6e76992f228568d3 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/78a00c3887be6174 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/80c159607300c963 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/83598369d673adcd +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/87206c07ba7daeef +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/88eab668cd23076e +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/8b0913e4785ba9e0 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/90ba6257b6a4be60 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/910df09b59291d17 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/957a4364cb62cf30 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/9626473cf694dc08 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/97c187b4db5ba937 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/99f4253d2066617d +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/9c664a9630c4dd57 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/a84661cd3a01c0df +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/aaa553b934505fd4 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/ac92a72993c94ec3 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/ad41fdbb685888c8 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/ae5e9995f3eab4a3 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/b0ac2ffbedab2186 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/b396b0e47b4158d4 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/b4a884f724cf92cd +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/b588b45def3e6d67 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/b784cae93287e843 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/bb62fc04664ff5ee +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/bb770130fce17e7d +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/bb93db6422c8fbe9 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/bf326643c9da2ade +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/c3cf86bd9ae86bff +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/cf6f75dce9f5f8c8 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/da474050c1a76c42 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/dde594ae7be821cb +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/e46c5c6ef840adb8 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/e9e6a0e35e5a3eaa +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/ecc0d9a30d822122 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/ecc4726657beccaa +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/ecf4a12e6bbc3c25 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/ef964c44f4e014cc +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/f1aaa150ebdc52b0 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/fbad0ad0b63b3336 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/fd7751dc086ba0e3 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/fd960d75271f84c5 +4 -0
- multiedge_relay-0.5.0/.hypothesis/constants/ffc5d3bdbbfc4a3a +4 -0
- multiedge_relay-0.5.0/.hypothesis/tmp/tmp0okuvyf2 +0 -0
- multiedge_relay-0.5.0/.hypothesis/tmp/tmp0pnyfyls +0 -0
- multiedge_relay-0.5.0/.hypothesis/tmp/tmp1odyu__n +0 -0
- multiedge_relay-0.5.0/.hypothesis/tmp/tmp1yl9q0nr +0 -0
- multiedge_relay-0.5.0/.hypothesis/tmp/tmp2ch54p6r +0 -0
- multiedge_relay-0.5.0/.hypothesis/tmp/tmp40iqz8t4 +0 -0
- multiedge_relay-0.5.0/.hypothesis/tmp/tmp4vebkjik +0 -0
- multiedge_relay-0.5.0/.hypothesis/tmp/tmp6hyu0vd2 +0 -0
- multiedge_relay-0.5.0/.hypothesis/tmp/tmp6nrhbwxq +0 -0
- multiedge_relay-0.5.0/.hypothesis/tmp/tmp6zs_aung +0 -0
- multiedge_relay-0.5.0/.hypothesis/tmp/tmp7_4hg22r +0 -0
- multiedge_relay-0.5.0/.hypothesis/tmp/tmp82mkc8y5 +0 -0
- multiedge_relay-0.5.0/.hypothesis/tmp/tmp8j7v6dgg +0 -0
- multiedge_relay-0.5.0/.hypothesis/tmp/tmp_7fsdxev +0 -0
- multiedge_relay-0.5.0/.hypothesis/tmp/tmpa_ceilzq +0 -0
- multiedge_relay-0.5.0/.hypothesis/tmp/tmpbefutqwo +0 -0
- multiedge_relay-0.5.0/.hypothesis/tmp/tmpd_e5wlx_ +0 -0
- multiedge_relay-0.5.0/.hypothesis/tmp/tmpgzy60fn4 +0 -0
- multiedge_relay-0.5.0/.hypothesis/tmp/tmpih8s3g3c +0 -0
- multiedge_relay-0.5.0/.hypothesis/tmp/tmpknxu3u9k +0 -0
- multiedge_relay-0.5.0/.hypothesis/tmp/tmpl2bb8roc +0 -0
- multiedge_relay-0.5.0/.hypothesis/tmp/tmpm6tk9mxu +0 -0
- multiedge_relay-0.5.0/.hypothesis/tmp/tmpofcppitv +0 -0
- multiedge_relay-0.5.0/.hypothesis/tmp/tmpp9ad2pa5 +0 -0
- multiedge_relay-0.5.0/.hypothesis/tmp/tmpplb3bwbb +0 -0
- multiedge_relay-0.5.0/.hypothesis/tmp/tmppslni351 +0 -0
- multiedge_relay-0.5.0/.hypothesis/tmp/tmppt49epyj +0 -0
- multiedge_relay-0.5.0/.hypothesis/tmp/tmpq_mj2qo0 +0 -0
- multiedge_relay-0.5.0/.hypothesis/tmp/tmpqbd4gjnf +0 -0
- multiedge_relay-0.5.0/.hypothesis/tmp/tmpqmf5qnsm +0 -0
- multiedge_relay-0.5.0/.hypothesis/tmp/tmpsrpuamt2 +0 -0
- multiedge_relay-0.5.0/.hypothesis/tmp/tmptk3ub46g +0 -0
- multiedge_relay-0.5.0/.hypothesis/tmp/tmpwgamxsxh +0 -0
- multiedge_relay-0.5.0/.hypothesis/tmp/tmpz7_s_pb6 +0 -0
- multiedge_relay-0.5.0/.hypothesis/tmp/tmpzpcokwzu +0 -0
- multiedge_relay-0.5.0/.hypothesis/unicode_data/14.0.0/charmap.json.gz +0 -0
- multiedge_relay-0.5.0/.hypothesis/unicode_data/14.0.0/codec-v2-utf-8.json.gz +0 -0
- multiedge_relay-0.5.0/.hypothesis/unicode_data/15.0.0/charmap.json.gz +0 -0
- multiedge_relay-0.5.0/.hypothesis/unicode_data/15.0.0/codec-v2-utf-8.json.gz +0 -0
- multiedge_relay-0.5.0/.hypothesis/unicode_data/16.0.0/charmap.json.gz +0 -0
- multiedge_relay-0.5.0/.hypothesis/unicode_data/16.0.0/codec-v2-utf-8.json.gz +0 -0
- multiedge_relay-0.5.0/.python-version +1 -0
- multiedge_relay-0.5.0/CHANGELOG.md +196 -0
- multiedge_relay-0.5.0/CLAUDE.md +134 -0
- multiedge_relay-0.5.0/CONTRIBUTING.md +33 -0
- multiedge_relay-0.5.0/LICENSE +202 -0
- multiedge_relay-0.5.0/PKG-INFO +487 -0
- multiedge_relay-0.5.0/README.md +455 -0
- multiedge_relay-0.5.0/examples/prod_demo/consumer_rebalance.py +177 -0
- multiedge_relay-0.5.0/examples/prod_demo/generate_demo_csv.py +243 -0
- multiedge_relay-0.5.0/examples/prod_demo/producer_rebalance.py +171 -0
- multiedge_relay-0.5.0/examples/prod_demo/setup_demo.py +215 -0
- multiedge_relay-0.5.0/examples/publish_batch_with_dlq.py +42 -0
- multiedge_relay-0.5.0/examples/publish_minimal.py +30 -0
- multiedge_relay-0.5.0/examples/publish_rebalance_from_csv.py +85 -0
- multiedge_relay-0.5.0/examples/seal_publish.py +47 -0
- multiedge_relay-0.5.0/examples/subscribe_catchup.py +43 -0
- multiedge_relay-0.5.0/examples/subscribe_exactly_once.py +57 -0
- multiedge_relay-0.5.0/examples/subscribe_rebalance_to_csv.py +90 -0
- multiedge_relay-0.5.0/examples/unseal_subscribe.py +54 -0
- multiedge_relay-0.5.0/examples/webhook_fastapi.py +40 -0
- multiedge_relay-0.5.0/examples/webhook_flask.py +38 -0
- multiedge_relay-0.5.0/pyproject.toml +101 -0
- multiedge_relay-0.5.0/src/multiedge_relay/__init__.py +57 -0
- multiedge_relay-0.5.0/src/multiedge_relay/_http.py +67 -0
- multiedge_relay-0.5.0/src/multiedge_relay/_retry.py +193 -0
- multiedge_relay-0.5.0/src/multiedge_relay/cli.py +295 -0
- multiedge_relay-0.5.0/src/multiedge_relay/cursor.py +139 -0
- multiedge_relay-0.5.0/src/multiedge_relay/dlq.py +230 -0
- multiedge_relay-0.5.0/src/multiedge_relay/exceptions.py +158 -0
- multiedge_relay-0.5.0/src/multiedge_relay/models.py +115 -0
- multiedge_relay-0.5.0/src/multiedge_relay/publisher.py +263 -0
- multiedge_relay-0.5.0/src/multiedge_relay/publisher_async.py +166 -0
- multiedge_relay-0.5.0/src/multiedge_relay/py.typed +0 -0
- multiedge_relay-0.5.0/src/multiedge_relay/sealed/__init__.py +46 -0
- multiedge_relay-0.5.0/src/multiedge_relay/sealed/core.py +282 -0
- multiedge_relay-0.5.0/src/multiedge_relay/sealed/keys.py +364 -0
- multiedge_relay-0.5.0/src/multiedge_relay/sealed/registry.py +350 -0
- multiedge_relay-0.5.0/src/multiedge_relay/state_sqlite.py +411 -0
- multiedge_relay-0.5.0/src/multiedge_relay/subscriber.py +513 -0
- multiedge_relay-0.5.0/src/multiedge_relay/ulid.py +61 -0
- multiedge_relay-0.5.0/src/multiedge_relay/webhook.py +136 -0
- multiedge_relay-0.5.0/tasks/todo.md +55 -0
- multiedge_relay-0.5.0/tests/conftest.py +40 -0
- multiedge_relay-0.5.0/tests/fake_relay.py +219 -0
- multiedge_relay-0.5.0/tests/fixtures/sealed_v1_recipient.key.json +13 -0
- multiedge_relay-0.5.0/tests/fixtures/sealed_v1_vector.json +44 -0
- multiedge_relay-0.5.0/tests/fixtures/synthetic_rebalance.csv +10 -0
- multiedge_relay-0.5.0/tests/test_cli.py +115 -0
- multiedge_relay-0.5.0/tests/test_cli_sealed.py +135 -0
- multiedge_relay-0.5.0/tests/test_cursor.py +139 -0
- multiedge_relay-0.5.0/tests/test_dlq.py +117 -0
- multiedge_relay-0.5.0/tests/test_examples_rebalance.py +100 -0
- multiedge_relay-0.5.0/tests/test_http_defaults.py +13 -0
- multiedge_relay-0.5.0/tests/test_models.py +84 -0
- multiedge_relay-0.5.0/tests/test_prod_demo.py +382 -0
- multiedge_relay-0.5.0/tests/test_publisher.py +326 -0
- multiedge_relay-0.5.0/tests/test_publisher_async.py +166 -0
- multiedge_relay-0.5.0/tests/test_retry.py +150 -0
- multiedge_relay-0.5.0/tests/test_sealed_core.py +326 -0
- multiedge_relay-0.5.0/tests/test_sealed_import.py +88 -0
- multiedge_relay-0.5.0/tests/test_sealed_integration.py +369 -0
- multiedge_relay-0.5.0/tests/test_sealed_keys.py +139 -0
- multiedge_relay-0.5.0/tests/test_sealed_wrappers.py +125 -0
- multiedge_relay-0.5.0/tests/test_state_sqlite.py +403 -0
- multiedge_relay-0.5.0/tests/test_subscriber.py +370 -0
- multiedge_relay-0.5.0/tests/test_ulid.py +29 -0
- multiedge_relay-0.5.0/tests/test_webhook.py +193 -0
- multiedge_relay-0.5.0/uv.lock +1449 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# GitHub Copilot instructions — multiedge-relay (Python SDK)
|
|
2
|
+
|
|
3
|
+
See [../CLAUDE.md](../CLAUDE.md) for the full engineering contract — single source of
|
|
4
|
+
truth for both agents, kept in sync in the same commit.
|
|
5
|
+
|
|
6
|
+
Non-negotiables: never-silent-loss error taxonomy; at-least-once subscriber with atomic
|
|
7
|
+
file cursor committed after the callback; catch-up/gap-fill ordered by relay `sequence`;
|
|
8
|
+
one shared `RetryPolicy` (`_retry.py`) for all three call sites, bounded by WALL CLOCK
|
|
9
|
+
(publishers: `retry_budget_seconds=90`, long enough to ride out a relay deployment;
|
|
10
|
+
subscriber catch-up: unbounded, bounded by `stop()`, every attempt reported via
|
|
11
|
+
`on_error`), 8 s per-sleep cap, `Retry-After` honoured, terminal statuses never retried;
|
|
12
|
+
exactly-once *processing* via `SqliteStateStore` (marker committed atomically with
|
|
13
|
+
handler success; watermark + `signal_id` ledger invariant; loud `StateStoreCorruptError`,
|
|
14
|
+
never silent reset; never claim exactly-once *delivery*);
|
|
15
|
+
HMAC verify over `"{ts}." + raw_body` with constant-time compare and 5-min freshness;
|
|
16
|
+
TDD; `uv` tooling; ruff + black + mypy --strict green before "done"; runtime deps only
|
|
17
|
+
httpx + pydantic (extras: `[webpubsub]`, `[sealed]`); public-repo hygiene (no internal
|
|
18
|
+
business content or credentials).
|
|
19
|
+
|
|
20
|
+
Sealed mode (relay ADR 0004): all crypto lives in `multiedge_relay/sealed/` behind the
|
|
21
|
+
`[sealed]` extra (`cryptography>=47`); core NEVER imports it (CI core-only job proves
|
|
22
|
+
it). The sealed envelope v1 wire format is FROZEN by the committed vector
|
|
23
|
+
`tests/fixtures/sealed_v1_vector.json` — changes require `sealed: "v2"` + a new vector.
|
|
24
|
+
Sealing happens in `prepare_signal` after ULID assignment and before DLQ spill; fetched
|
|
25
|
+
key bundles are always re-fingerprinted locally (the relay is untrusted for key
|
|
26
|
+
authenticity); never log or serialize private key material.
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
test:
|
|
10
|
+
name: py${{ matrix.python-version }} / ${{ matrix.os }}
|
|
11
|
+
runs-on: ${{ matrix.os }}
|
|
12
|
+
strategy:
|
|
13
|
+
fail-fast: false
|
|
14
|
+
matrix:
|
|
15
|
+
os: [ubuntu-latest]
|
|
16
|
+
python-version: ["3.11", "3.12", "3.13", "3.14"]
|
|
17
|
+
include:
|
|
18
|
+
- os: windows-latest
|
|
19
|
+
python-version: "3.14"
|
|
20
|
+
# Core must stay importable and green WITHOUT the crypto extra —
|
|
21
|
+
# proves sealed mode never became a hard dependency.
|
|
22
|
+
- os: ubuntu-latest
|
|
23
|
+
python-version: "3.14"
|
|
24
|
+
core-only: true
|
|
25
|
+
steps:
|
|
26
|
+
- uses: actions/checkout@v4
|
|
27
|
+
|
|
28
|
+
- name: Install uv
|
|
29
|
+
uses: astral-sh/setup-uv@v4
|
|
30
|
+
with:
|
|
31
|
+
python-version: ${{ matrix.python-version }}
|
|
32
|
+
|
|
33
|
+
- name: Sync dependencies
|
|
34
|
+
run: uv sync
|
|
35
|
+
|
|
36
|
+
- name: Remove crypto dependency (core-only job)
|
|
37
|
+
if: matrix.core-only
|
|
38
|
+
run: uv pip uninstall cryptography
|
|
39
|
+
|
|
40
|
+
- name: Lint (ruff)
|
|
41
|
+
run: uv run ruff check .
|
|
42
|
+
|
|
43
|
+
- name: Format check (black)
|
|
44
|
+
run: uv run black --check .
|
|
45
|
+
|
|
46
|
+
- name: Type check (mypy --strict)
|
|
47
|
+
run: uv run mypy --strict src
|
|
48
|
+
|
|
49
|
+
- name: Tests
|
|
50
|
+
run: uv run pytest -m "not integration" --cov=multiedge_relay --cov-report=term-missing
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags: ["v*"]
|
|
6
|
+
|
|
7
|
+
jobs:
|
|
8
|
+
build:
|
|
9
|
+
runs-on: ubuntu-latest
|
|
10
|
+
steps:
|
|
11
|
+
- uses: actions/checkout@v4
|
|
12
|
+
|
|
13
|
+
- name: Install uv
|
|
14
|
+
uses: astral-sh/setup-uv@v4
|
|
15
|
+
|
|
16
|
+
- name: Build sdist and wheel
|
|
17
|
+
run: uv build
|
|
18
|
+
|
|
19
|
+
- uses: actions/upload-artifact@v4
|
|
20
|
+
with:
|
|
21
|
+
name: dist
|
|
22
|
+
path: dist/
|
|
23
|
+
|
|
24
|
+
publish:
|
|
25
|
+
needs: build
|
|
26
|
+
runs-on: ubuntu-latest
|
|
27
|
+
environment: pypi
|
|
28
|
+
permissions:
|
|
29
|
+
id-token: write # PyPI trusted publishing (OIDC) — no API token stored
|
|
30
|
+
steps:
|
|
31
|
+
- uses: actions/download-artifact@v4
|
|
32
|
+
with:
|
|
33
|
+
name: dist
|
|
34
|
+
path: dist/
|
|
35
|
+
|
|
36
|
+
- name: Publish to PyPI
|
|
37
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
.venv/
|
|
5
|
+
dist/
|
|
6
|
+
build/
|
|
7
|
+
*.egg-info/
|
|
8
|
+
.pytest_cache/
|
|
9
|
+
.mypy_cache/
|
|
10
|
+
.ruff_cache/
|
|
11
|
+
.coverage
|
|
12
|
+
htmlcov/
|
|
13
|
+
|
|
14
|
+
# Environments & secrets
|
|
15
|
+
.env
|
|
16
|
+
.env.*
|
|
17
|
+
!.env.example
|
|
18
|
+
|
|
19
|
+
# OS / editor
|
|
20
|
+
.DS_Store
|
|
21
|
+
Thumbs.db
|
|
22
|
+
.vs/
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# This .gitignore file was automatically created by Hypothesis. Hypothesis gitignores
|
|
2
|
+
# .hypothesis by default, because we generally recommend that .hypothesis not be checked
|
|
3
|
+
# into version control.
|
|
4
|
+
#
|
|
5
|
+
# If you *would* like to check .hypothesis into version control, you should delete this
|
|
6
|
+
# file. Hypothesis will not re-create this .gitignore unless .hypothesis is deleted (and
|
|
7
|
+
# if it does, that's a bug - please report it!)
|
|
8
|
+
|
|
9
|
+
*
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: C:\src\RocketEdge.com\multiedge-relay-python\src\multiedge_relay\subscriber.py
|
|
2
|
+
# hypothesis_version: 6.165.9
|
|
3
|
+
|
|
4
|
+
[1.0, 5.0, 200, 401, 403, 500, 10000, '/v1/signals', '/v1/ws/negotiate', 'Retry-After', 'catchup', 'cursor', 'earliest', 'gapfill', 'group-message', 'latest', 'limit', 'live', 'poll', 'signals', 'since_sequence', 'strategy_id', 'unknown error', 'url', 'webpubsub']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: C:\src\RocketEdge.com\multiedge-relay-python\src\multiedge_relay\__init__.py
|
|
2
|
+
# hypothesis_version: 6.165.9
|
|
3
|
+
|
|
4
|
+
['0.5.0', 'AsyncSignalPublisher', 'AuthError', 'BufferFullError', 'CursorCorruptError', 'CursorStore', 'DLQEntry', 'DLQResendReport', 'DiskDLQ', 'FileCursorStore', 'MultiEdgeError', 'PublishFailed', 'ReceivedSignal', 'Signal', 'SignalAck', 'SignalMeta', 'SignalPublisher', 'SignalSubscriber', 'SqliteStateStore', 'ValidationRejected', '__version__', 'new_ulid', 'verify_signature']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: C:\src\RocketEdge.com\multiedge-relay-python\examples\subscribe_rebalance_to_csv.py
|
|
2
|
+
# hypothesis_version: 6.165.9
|
|
3
|
+
|
|
4
|
+
['Action', 'MULTIEDGE_API_KEY', 'NONE', 'PORTFOLIO', 'PlannedExecutionDate', 'SignalDate', 'Ticker', '__main__', 'action', 'earliest', 'mek_your_api_key', 'positions', 'rebalance-demo', 'signal_date', 'ticker', 'utf-8', 'w']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: C:\src\RocketEdge.com\multiedge-relay-python\src\multiedge_relay\sealed\keys.py
|
|
2
|
+
# hypothesis_version: 6.165.9
|
|
3
|
+
|
|
4
|
+
[384, '+00:00', ',', ':', 'Z', 'ascii', 'bundle', 'created_at', 'ed25519_priv', 'ed25519_pub', 'kid', 'kind', 'mek-v1', 'mldsa65_pub', 'mldsa65_seed', 'mlkem768_ek', 'mlkem768_seed', 'purpose', 'recipient', 'seconds', 'sender', 'utf-8', 'w', 'x25519_priv', 'x25519_pub']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: C:\src\RocketEdge.com\multiedge-relay-python\examples\prod_demo\setup_demo.py
|
|
2
|
+
# hypothesis_version: 6.165.9
|
|
3
|
+
|
|
4
|
+
[30.0, 400, 409, '(already granted)', '--admin-key', '--base-url', '--client-name', '--display-name', '--slug', '/v1/api-keys', '/v1/clients', '/v1/entitlements', '/v1/strategies', '=', 'Authorization', 'Demo Rebalance', 'Demo Subscriber Fund', 'MULTIEDGE_ADMIN_KEY', '__main__', 'api_key', 'client_id', 'clients', 'compliance_profile', 'demo-rebalance', 'display_name', 'endpoint_id', 'entitlement_id', 'ops@example.invalid', 'policy_json', 'rest_pull', 'scope', 'signal_schema_json', 'slug', 'strategies', 'strategy_id', 'transport', 'url', '{}']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: C:\src\RocketEdge.com\multiedge-relay-python\src\multiedge_relay\subscriber.py
|
|
2
|
+
# hypothesis_version: 6.165.9
|
|
3
|
+
|
|
4
|
+
[1.0, 5.0, 200, 401, 403, 500, 10000, '/v1/signals', '/v1/ws/negotiate', 'Retry-After', 'catchup', 'cursor', 'earliest', 'gapfill', 'group-message', 'latest', 'limit', 'live', 'poll', 'signals', 'since_sequence', 'strategy_id', 'unknown error', 'url', 'webpubsub']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: C:\src\RocketEdge.com\multiedge-relay-python\src\multiedge_relay\dlq.py
|
|
2
|
+
# hypothesis_version: 6.165.9
|
|
3
|
+
|
|
4
|
+
['%Y-%m-%d', '*.jsonl', ',', '.jsonl.tmp', '.multiedge', ':', '[^A-Za-z0-9._-]', '_', 'a', 'attempts', 'dlq', 'entry_id', 'error', 'failed_at', 'json', 'signal', 'utf-8']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: C:\src\RocketEdge.com\multiedge-relay-python\examples\prod_demo\consumer_rebalance.py
|
|
2
|
+
# hypothesis_version: 6.165.9
|
|
3
|
+
|
|
4
|
+
[2.0, '--base-url', '--catchup-only', '--out', '--poll-interval', '--strategy-id', '.demo', 'Action', 'BUY', 'INITIALIZE', 'MULTIEDGE_API_KEY', 'NONE', 'PORTFOLIO', 'PlannedExecutionDate', 'SELL', 'SignalDate', 'Ticker', '__main__', 'action', 'cursor', 'poll', 'positions', 'signal_date', 'store_true', 'ticker', 'utf-8', 'w']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: C:\src\RocketEdge.com\multiedge-relay-python\examples\prod_demo\producer_rebalance.py
|
|
2
|
+
# hypothesis_version: 6.165.9
|
|
3
|
+
|
|
4
|
+
[3.0, ' (deduplicated)', '--base-url', '--limit', '--pace', '--strategy-id', '.demo', 'Action', 'MULTIEDGE_API_KEY', 'PORTFOLIO', 'PlannedExecutionDate', 'SignalDate', 'Ticker', '__main__', 'action', 'csv_path', 'dlq', 'kind', 'portfolio_rebalance', 'positions', 'signal_date', 'ticker', 'utf-8']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: C:\src\RocketEdge.com\multiedge-relay-python\src\multiedge_relay\subscriber.py
|
|
2
|
+
# hypothesis_version: 6.165.9
|
|
3
|
+
|
|
4
|
+
[1.0, 5.0, 200, 401, 403, 500, 10000, '/v1/signals', '/v1/ws/negotiate', 'Retry-After', 'catchup', 'cursor', 'earliest', 'gapfill', 'group-message', 'latest', 'limit', 'live', 'poll', 'signals', 'since_sequence', 'strategy_id', 'unknown error', 'url', 'webpubsub']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: C:\src\RocketEdge.com\multiedge-relay-python\examples\prod_demo\setup_demo.py
|
|
2
|
+
# hypothesis_version: 6.165.9
|
|
3
|
+
|
|
4
|
+
[30.0, 400, 409, '(already granted)', '--admin-key', '--base-url', '--client-name', '--display-name', '--slug', '/v1/api-keys', '/v1/clients', '/v1/entitlements', '/v1/strategies', '=', 'Authorization', 'Demo Rebalance', 'Demo Subscriber Fund', 'MULTIEDGE_ADMIN_KEY', '__main__', 'api_key', 'client_id', 'clients', 'compliance_profile', 'demo-rebalance', 'display_name', 'endpoint_id', 'entitlement_id', 'ops@example.invalid', 'policy_json', 'rest_pull', 'scope', 'signal_schema_json', 'slug', 'strategies', 'strategy_id', 'transport', 'url', '{}']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: C:\src\RocketEdge.com\multiedge-relay-python\src\multiedge_relay\__init__.py
|
|
2
|
+
# hypothesis_version: 6.165.9
|
|
3
|
+
|
|
4
|
+
['0.1.1', 'AsyncSignalPublisher', 'AuthError', 'BufferFullError', 'CursorCorruptError', 'CursorStore', 'DLQEntry', 'DLQResendReport', 'DiskDLQ', 'FileCursorStore', 'MultiEdgeError', 'PublishFailed', 'ReceivedSignal', 'Signal', 'SignalAck', 'SignalMeta', 'SignalPublisher', 'SignalSubscriber', 'SqliteStateStore', 'ValidationRejected', '__version__', 'new_ulid', 'verify_signature']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: C:\src\RocketEdge.com\multiedge-relay-python\src\multiedge_relay\__init__.py
|
|
2
|
+
# hypothesis_version: 6.165.9
|
|
3
|
+
|
|
4
|
+
['0.5.0', 'AsyncSignalPublisher', 'AuthError', 'BufferFullError', 'CursorCorruptError', 'CursorStore', 'DLQEntry', 'DLQResendReport', 'DiskDLQ', 'FileCursorStore', 'MultiEdgeError', 'PublishFailed', 'ReceivedSignal', 'Signal', 'SignalAck', 'SignalMeta', 'SignalPublisher', 'SignalSubscriber', 'SqliteStateStore', 'ValidationRejected', '__version__', 'new_ulid', 'verify_signature']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: C:\src\RocketEdge.com\multiedge-relay-python\src\multiedge_relay\sealed\core.py
|
|
2
|
+
# hypothesis_version: 6.165.9
|
|
3
|
+
|
|
4
|
+
[b'\x00', b'multiedge-sealed-v1', b'multiedge-sealed-v1-kek', 'aead', 'alg', 'ascii', 'chacha20poly1305', 'ct', 'ed25519', 'ed25519+mldsa65', 'ed25519_pub', 'epk', 'hkdf-sha256', 'kdf', 'kem', 'kem_ct', 'kid', 'mldsa65_pub', 'mlkem768_ek', 'nonce', 'recipients', 'sealed', 'sender_kid', 'sig', 'sig_pq', 'v1', 'wrap', 'x25519-mlkem768', 'x25519_pub']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: C:\src\RocketEdge.com\multiedge-relay-python\src\multiedge_relay\__init__.py
|
|
2
|
+
# hypothesis_version: 6.165.9
|
|
3
|
+
|
|
4
|
+
['0.1.0', 'AsyncSignalPublisher', 'AuthError', 'BufferFullError', 'CursorCorruptError', 'CursorStore', 'DLQEntry', 'DLQResendReport', 'DiskDLQ', 'FileCursorStore', 'MultiEdgeError', 'PublishFailed', 'ReceivedSignal', 'Signal', 'SignalAck', 'SignalMeta', 'SignalPublisher', 'SignalSubscriber', 'ValidationRejected', '__version__', 'new_ulid', 'verify_signature']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: C:\src\RocketEdge.com\multiedge-relay-python\src\multiedge_relay\cli.py
|
|
2
|
+
# hypothesis_version: 6.165.9
|
|
3
|
+
|
|
4
|
+
['*.json', '--api-key', '--base-url', '--dry-run', '--root', '--strategy', '--to', 'CORRUPT', 'MULTIEDGE_API_KEY', 'MULTIEDGE_BASE_URL', 'No cursors found.', '__main__', 'command', 'cursor', 'cursor_command', 'dlq', 'dlq_command', 'dry-run-unused', 'list', 'multiedge', 'purge', 'resend', 'reset', 'show', 'store_true', 'strategy id to reset']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: C:\src\RocketEdge.com\multiedge-relay-python\src\multiedge_relay\subscriber.py
|
|
2
|
+
# hypothesis_version: 6.165.9
|
|
3
|
+
|
|
4
|
+
[1.0, 5.0, 200, 401, 403, 500, 10000, '/v1/signals', '/v1/ws/negotiate', 'catchup', 'cursor', 'earliest', 'gapfill', 'group-message', 'latest', 'limit', 'live', 'poll', 'signals', 'since_sequence', 'strategy_id', 'unknown error', 'url', 'webpubsub']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: C:\src\RocketEdge.com\multiedge-relay-python\src\multiedge_relay\__init__.py
|
|
2
|
+
# hypothesis_version: 6.165.9
|
|
3
|
+
|
|
4
|
+
['0.1.1', 'AsyncSignalPublisher', 'AuthError', 'BufferFullError', 'CursorCorruptError', 'CursorStore', 'DLQEntry', 'DLQResendReport', 'DiskDLQ', 'FileCursorStore', 'MultiEdgeError', 'PublishFailed', 'ReceivedSignal', 'Signal', 'SignalAck', 'SignalMeta', 'SignalPublisher', 'SignalSubscriber', 'ValidationRejected', '__version__', 'new_ulid', 'verify_signature']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: C:\src\RocketEdge.com\multiedge-relay-python\src\multiedge_relay\subscriber.py
|
|
2
|
+
# hypothesis_version: 6.165.9
|
|
3
|
+
|
|
4
|
+
[1.0, 5.0, 200, 401, 403, 500, 10000, '/v1/signals', '/v1/ws/negotiate', 'catchup', 'cursor', 'earliest', 'gapfill', 'group-message', 'latest', 'limit', 'live', 'poll', 'signals', 'since_sequence', 'strategy_id', 'unknown error', 'url', 'webpubsub']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: C:\src\RocketEdge.com\multiedge-relay-python\src\multiedge_relay\subscriber.py
|
|
2
|
+
# hypothesis_version: 6.165.9
|
|
3
|
+
|
|
4
|
+
[1.0, 5.0, 200, 401, 403, 500, 10000, '/v1/signals', '/v1/ws/negotiate', 'Retry-After', 'catchup', 'cursor', 'earliest', 'gapfill', 'group-message', 'latest', 'limit', 'live', 'poll', 'signals', 'since_sequence', 'strategy_id', 'unknown error', 'url', 'webpubsub']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: C:\src\RocketEdge.com\multiedge-relay-python\src\multiedge_relay\subscriber.py
|
|
2
|
+
# hypothesis_version: 6.165.9
|
|
3
|
+
|
|
4
|
+
[1.0, 5.0, 200, 401, 403, 500, 10000, '/v1/signals', '/v1/ws/negotiate', 'catchup', 'cursor', 'earliest', 'gapfill', 'group-message', 'latest', 'limit', 'live', 'poll', 'signals', 'since_sequence', 'strategy_id', 'unknown error', 'url', 'webpubsub']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: C:\src\RocketEdge.com\multiedge-relay-python\examples\subscribe_rebalance_to_csv.py
|
|
2
|
+
# hypothesis_version: 6.165.9
|
|
3
|
+
|
|
4
|
+
['Action', 'MULTIEDGE_API_KEY', 'NONE', 'PORTFOLIO', 'PlannedExecutionDate', 'SignalDate', 'Ticker', '__main__', 'action', 'earliest', 'mek_your_api_key', 'positions', 'rebalance-demo', 'signal_date', 'ticker', 'utf-8', 'w']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: C:\src\RocketEdge.com\multiedge-relay-python\examples\publish_rebalance_from_csv.py
|
|
2
|
+
# hypothesis_version: 6.165.9
|
|
3
|
+
|
|
4
|
+
[' (deduplicated)', 'Action', 'MULTIEDGE_API_KEY', 'PORTFOLIO', 'PlannedExecutionDate', 'SignalDate', 'Ticker', '__main__', 'action', 'kind', 'mek_your_api_key', 'portfolio_rebalance', 'positions', 'rebalance-demo', 'signal_date', 'ticker', 'utf-8']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: C:\src\RocketEdge.com\multiedge-relay-python\src\multiedge_relay\__init__.py
|
|
2
|
+
# hypothesis_version: 6.165.9
|
|
3
|
+
|
|
4
|
+
['0.4.0', 'AsyncSignalPublisher', 'AuthError', 'BufferFullError', 'CursorCorruptError', 'CursorStore', 'DLQEntry', 'DLQResendReport', 'DiskDLQ', 'FileCursorStore', 'MultiEdgeError', 'PublishFailed', 'ReceivedSignal', 'Signal', 'SignalAck', 'SignalMeta', 'SignalPublisher', 'SignalSubscriber', 'SqliteStateStore', 'ValidationRejected', '__version__', 'new_ulid', 'verify_signature']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: C:\src\RocketEdge.com\multiedge-relay-python\src\multiedge_relay\cli.py
|
|
2
|
+
# hypothesis_version: 6.165.9
|
|
3
|
+
|
|
4
|
+
['*.json', '--api-key', '--base-url', '--client', '--dry-run', '--key', '--kind', '--no-dual', '--out', '--root', '--strategy', '--to', 'CORRUPT', 'MULTIEDGE_API_KEY', 'MULTIEDGE_BASE_URL', 'No cursors found.', '__main__', 'command', 'cursor', 'cursor_command', 'dlq', 'dlq_command', 'dry-run-unused', 'fingerprint', 'key file path', 'keygen', 'list', 'multiedge', 'purge', 'recipient', 'register', 'resend', 'reset', 'sealed', 'sealed_command', 'sender', 'show', 'store_true', 'strategy id to reset']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: C:\src\RocketEdge.com\multiedge-relay-python\examples\prod_demo\producer_rebalance.py
|
|
2
|
+
# hypothesis_version: 6.165.9
|
|
3
|
+
|
|
4
|
+
[3.0, ' (deduplicated)', '--base-url', '--limit', '--pace', '--strategy-id', '.demo', 'Action', 'MULTIEDGE_API_KEY', 'PORTFOLIO', 'PlannedExecutionDate', 'SignalDate', 'Ticker', '__main__', 'action', 'csv_path', 'dlq', 'kind', 'portfolio_rebalance', 'positions', 'signal_date', 'ticker', 'utf-8']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: C:\src\RocketEdge.com\multiedge-relay-python\examples\prod_demo\setup_demo.py
|
|
2
|
+
# hypothesis_version: 6.165.9
|
|
3
|
+
|
|
4
|
+
[30.0, 400, 409, '(already granted)', '--admin-key', '--base-url', '--client-name', '--display-name', '--slug', '/v1/api-keys', '/v1/clients', '/v1/entitlements', '/v1/strategies', '=', 'Authorization', 'Demo Rebalance', 'Demo Subscriber Fund', 'MULTIEDGE_ADMIN_KEY', '__main__', 'api_key', 'client_id', 'clients', 'compliance_profile', 'demo-rebalance', 'display_name', 'endpoint_id', 'entitlement_id', 'ops@example.invalid', 'policy_json', 'rest_pull', 'scope', 'signal_schema_json', 'slug', 'strategies', 'strategy_id', 'transport', 'url', '{}']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: C:\src\RocketEdge.com\multiedge-relay-python\examples\prod_demo\producer_rebalance.py
|
|
2
|
+
# hypothesis_version: 6.165.9
|
|
3
|
+
|
|
4
|
+
[3.0, ' (deduplicated)', '--base-url', '--limit', '--pace', '--strategy-id', '.demo', 'Action', 'MULTIEDGE_API_KEY', 'PORTFOLIO', 'PlannedExecutionDate', 'SignalDate', 'Ticker', '__main__', 'action', 'csv_path', 'dlq', 'kind', 'portfolio_rebalance', 'positions', 'signal_date', 'ticker', 'utf-8']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: C:\src\RocketEdge.com\multiedge-relay-python\src\multiedge_relay\cli.py
|
|
2
|
+
# hypothesis_version: 6.165.9
|
|
3
|
+
|
|
4
|
+
['*.json', '--api-key', '--base-url', '--dry-run', '--root', '--strategy', '--to', 'CORRUPT', 'MULTIEDGE_API_KEY', 'MULTIEDGE_BASE_URL', 'No cursors found.', '__main__', 'command', 'cursor', 'cursor_command', 'dlq', 'dlq_command', 'dry-run-unused', 'list', 'multiedge', 'purge', 'resend', 'reset', 'show', 'store_true', 'strategy id to reset']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: C:\src\RocketEdge.com\multiedge-relay-python\src\multiedge_relay\__init__.py
|
|
2
|
+
# hypothesis_version: 6.165.9
|
|
3
|
+
|
|
4
|
+
['0.3.0', 'AsyncSignalPublisher', 'AuthError', 'BufferFullError', 'CursorCorruptError', 'CursorStore', 'DLQEntry', 'DLQResendReport', 'DiskDLQ', 'FileCursorStore', 'MultiEdgeError', 'PublishFailed', 'ReceivedSignal', 'Signal', 'SignalAck', 'SignalMeta', 'SignalPublisher', 'SignalSubscriber', 'SqliteStateStore', 'ValidationRejected', '__version__', 'new_ulid', 'verify_signature']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: C:\src\RocketEdge.com\multiedge-relay-python\examples\prod_demo\generate_demo_csv.py
|
|
2
|
+
# hypothesis_version: 6.165.9
|
|
3
|
+
|
|
4
|
+
[0.02, 0.03, 0.05, 0.06, 0.1, 0.15, 0.25, 1.0, 2024, '--months', '--out', '--seed', '--start', 'Action', 'BOND', 'BUY', 'CASH', 'CMDTY', 'CRYP', 'EQTY', 'GOLD', 'INITIALIZE', 'LOWV', 'NONE', 'PORTFOLIO', 'PlannedExecutionDate', 'SELL', 'SignalDate', 'TIPS', 'TREND', 'Ticker', 'TradeWeightDelta', '__main__', 'utf-8', 'w']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: C:\src\RocketEdge.com\multiedge-relay-python\examples\prod_demo\consumer_rebalance.py
|
|
2
|
+
# hypothesis_version: 6.165.9
|
|
3
|
+
|
|
4
|
+
[2.0, '--base-url', '--catchup-only', '--out', '--poll-interval', '--strategy-id', '.demo', 'Action', 'BUY', 'INITIALIZE', 'MULTIEDGE_API_KEY', 'NONE', 'PORTFOLIO', 'PlannedExecutionDate', 'SELL', 'SignalDate', 'Ticker', '__main__', 'action', 'cursor', 'poll', 'positions', 'signal_date', 'store_true', 'ticker', 'utf-8', 'w']
|