From 7579d4a0638eeb63d3125e75fe8f0caa79f3df1d Mon Sep 17 00:00:00 2001 From: Bryan Yue Date: Sun, 9 Nov 2025 02:10:28 -0800 Subject: [PATCH] Unnest Alpaca Directory --- README.md | 2 +- docker-compose.yml | 2 +- services/feed-ingestor/Dockerfile | 2 +- src/feed_ingestor/{alpaca => }/alpaca_client.py | 4 ++-- .../{alpaca => }/alpaca_client_factory.py | 4 ++-- .../{alpaca => }/bar_event_processor.py | 2 +- src/feed_ingestor/{alpaca => }/event_consumer.py | 4 ++-- src/feed_ingestor/{alpaca => }/event_producer.py | 4 ++-- .../{alpaca => }/fake_alpaca_client.py | 2 +- src/feed_ingestor/{alpaca => }/healthcheck.py | 0 src/feed_ingestor/{alpaca => }/main.py | 8 ++++---- src/feed_ingestor/{alpaca => }/metrics.py | 0 .../{alpaca => }/test_alpaca_client.py | 4 ++-- .../{alpaca => }/test_bar_event_processor.py | 2 +- .../{alpaca => }/test_event_consumer.py | 2 +- .../{alpaca => }/test_event_producer.py | 4 ++-- .../{alpaca => }/test_fake_alpaca_client.py | 14 +++++++------- tst/feed_ingestor/{alpaca => }/test_healthcheck.py | 2 +- .../{alpaca => }/test_ingestor_main.py | 2 +- 19 files changed, 32 insertions(+), 32 deletions(-) rename src/feed_ingestor/{alpaca => }/alpaca_client.py (93%) rename src/feed_ingestor/{alpaca => }/alpaca_client_factory.py (75%) rename src/feed_ingestor/{alpaca => }/bar_event_processor.py (96%) rename src/feed_ingestor/{alpaca => }/event_consumer.py (80%) rename src/feed_ingestor/{alpaca => }/event_producer.py (78%) rename src/feed_ingestor/{alpaca => }/fake_alpaca_client.py (98%) rename src/feed_ingestor/{alpaca => }/healthcheck.py (100%) rename src/feed_ingestor/{alpaca => }/main.py (89%) rename src/feed_ingestor/{alpaca => }/metrics.py (100%) rename tst/feed_ingestor/{alpaca => }/test_alpaca_client.py (93%) rename tst/feed_ingestor/{alpaca => }/test_bar_event_processor.py (98%) rename tst/feed_ingestor/{alpaca => }/test_event_consumer.py (96%) rename tst/feed_ingestor/{alpaca => }/test_event_producer.py (91%) rename tst/feed_ingestor/{alpaca => }/test_fake_alpaca_client.py (83%) rename tst/feed_ingestor/{alpaca => }/test_healthcheck.py (97%) rename tst/feed_ingestor/{alpaca => }/test_ingestor_main.py (98%) diff --git a/README.md b/README.md index f267a38..ea4d00e 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,7 @@ To get started with the repository, follow these steps: ``` 2. **Setup Alpaca API Keys**: - Create account on Alpaca and retrieve API key/secret: https://app.alpaca.markets/user/profile#manage-accounts. Add ALPACA_API_KEY and ALPACA_API_SECRET to environment variables. + Create account on Alpaca and retrieve API key/secret: https://app.markets/user/profile#manage-accounts. Add ALPACA_API_KEY and ALPACA_API_SECRET to environment variables. 3. **Update the `.env` file**: ``` diff --git a/docker-compose.yml b/docker-compose.yml index f70ce62..c18419d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -128,7 +128,7 @@ services: kafka-topic-init: condition: service_completed_successfully healthcheck: - test: ["CMD", "python", "-m", "src.feed_ingestor.alpaca.healthcheck"] + test: ["CMD", "python", "-m", "src.feed_ingestor.healthcheck"] interval: 30s timeout: 10s retries: 3 diff --git a/services/feed-ingestor/Dockerfile b/services/feed-ingestor/Dockerfile index 4b4ada2..7770761 100644 --- a/services/feed-ingestor/Dockerfile +++ b/services/feed-ingestor/Dockerfile @@ -11,4 +11,4 @@ RUN pip install --no-cache-dir -r /tmp/requirements.txt COPY src /app/src -CMD ["python", "-m", "src.feed_ingestor.alpaca.main"] +CMD ["python", "-m", "src.feed_ingestor.main"] diff --git a/src/feed_ingestor/alpaca/alpaca_client.py b/src/feed_ingestor/alpaca_client.py similarity index 93% rename from src/feed_ingestor/alpaca/alpaca_client.py rename to src/feed_ingestor/alpaca_client.py index 92a5fb2..a8e92d3 100644 --- a/src/feed_ingestor/alpaca/alpaca_client.py +++ b/src/feed_ingestor/alpaca_client.py @@ -3,7 +3,7 @@ import websockets -from src.feed_ingestor.alpaca.metrics import ( +from src.feed_ingestor.metrics import ( NUM_ALPACA_EVENTS, NUM_ALPACA_RESPONSES, ) @@ -12,7 +12,7 @@ class AlpacaClient: - ALPACA_URL = "wss://stream.data.alpaca.markets" + ALPACA_URL = "wss://stream.data.markets" ALPACA_FEED = "v2/iex" AUTHORIZE_ACTION = "auth" SUBSCRIBE_ACTION = "subscribe" diff --git a/src/feed_ingestor/alpaca/alpaca_client_factory.py b/src/feed_ingestor/alpaca_client_factory.py similarity index 75% rename from src/feed_ingestor/alpaca/alpaca_client_factory.py rename to src/feed_ingestor/alpaca_client_factory.py index 972574c..835c54f 100644 --- a/src/feed_ingestor/alpaca/alpaca_client_factory.py +++ b/src/feed_ingestor/alpaca_client_factory.py @@ -1,7 +1,7 @@ import logging -from src.feed_ingestor.alpaca.alpaca_client import AlpacaClient -from src.feed_ingestor.alpaca.fake_alpaca_client import FakeAlpacaClient +from src.feed_ingestor.alpaca_client import AlpacaClient +from src.feed_ingestor.fake_alpaca_client import FakeAlpacaClient logger = logging.getLogger(__name__) diff --git a/src/feed_ingestor/alpaca/bar_event_processor.py b/src/feed_ingestor/bar_event_processor.py similarity index 96% rename from src/feed_ingestor/alpaca/bar_event_processor.py rename to src/feed_ingestor/bar_event_processor.py index 135cadf..e7bd0f2 100644 --- a/src/feed_ingestor/alpaca/bar_event_processor.py +++ b/src/feed_ingestor/bar_event_processor.py @@ -3,7 +3,7 @@ from aiokafka import AIOKafkaProducer -from src.feed_ingestor.alpaca.metrics import NUM_EVENTS_FAILED, NUM_EVENTS_PROCESSED +from src.feed_ingestor.metrics import NUM_EVENTS_FAILED, NUM_EVENTS_PROCESSED from src.models.bar_model import Bar from src.models.ticker_model import Ticker diff --git a/src/feed_ingestor/alpaca/event_consumer.py b/src/feed_ingestor/event_consumer.py similarity index 80% rename from src/feed_ingestor/alpaca/event_consumer.py rename to src/feed_ingestor/event_consumer.py index 79afab4..6ba9202 100644 --- a/src/feed_ingestor/alpaca/event_consumer.py +++ b/src/feed_ingestor/event_consumer.py @@ -1,7 +1,7 @@ from asyncio import Queue -from src.feed_ingestor.alpaca.bar_event_processor import BarEventProcessor -from src.feed_ingestor.alpaca.metrics import NUM_QUEUE_DEQUEUED +from src.feed_ingestor.bar_event_processor import BarEventProcessor +from src.feed_ingestor.metrics import NUM_QUEUE_DEQUEUED from src.models.bar_model import EVENT_TYPE diff --git a/src/feed_ingestor/alpaca/event_producer.py b/src/feed_ingestor/event_producer.py similarity index 78% rename from src/feed_ingestor/alpaca/event_producer.py rename to src/feed_ingestor/event_producer.py index 49c9ace..faf52a0 100644 --- a/src/feed_ingestor/alpaca/event_producer.py +++ b/src/feed_ingestor/event_producer.py @@ -1,8 +1,8 @@ import logging from asyncio import Queue -from src.feed_ingestor.alpaca.alpaca_client import AlpacaClient -from src.feed_ingestor.alpaca.metrics import NUM_ALPACA_ERRORS, NUM_QUEUE_ENQUEUED +from src.feed_ingestor.alpaca_client import AlpacaClient +from src.feed_ingestor.metrics import NUM_ALPACA_ERRORS, NUM_QUEUE_ENQUEUED logger = logging.getLogger(__name__) diff --git a/src/feed_ingestor/alpaca/fake_alpaca_client.py b/src/feed_ingestor/fake_alpaca_client.py similarity index 98% rename from src/feed_ingestor/alpaca/fake_alpaca_client.py rename to src/feed_ingestor/fake_alpaca_client.py index e487609..3f1c9df 100644 --- a/src/feed_ingestor/alpaca/fake_alpaca_client.py +++ b/src/feed_ingestor/fake_alpaca_client.py @@ -3,7 +3,7 @@ import random from datetime import datetime, timezone -from src.feed_ingestor.alpaca.metrics import ( +from src.feed_ingestor.metrics import ( NUM_ALPACA_EVENTS, NUM_ALPACA_RESPONSES, ) diff --git a/src/feed_ingestor/alpaca/healthcheck.py b/src/feed_ingestor/healthcheck.py similarity index 100% rename from src/feed_ingestor/alpaca/healthcheck.py rename to src/feed_ingestor/healthcheck.py diff --git a/src/feed_ingestor/alpaca/main.py b/src/feed_ingestor/main.py similarity index 89% rename from src/feed_ingestor/alpaca/main.py rename to src/feed_ingestor/main.py index 4a494c6..7d0f2ef 100644 --- a/src/feed_ingestor/alpaca/main.py +++ b/src/feed_ingestor/main.py @@ -4,10 +4,10 @@ from aiokafka import AIOKafkaProducer from prometheus_client import start_http_server -from src.feed_ingestor.alpaca.alpaca_client_factory import create_alpaca_client -from src.feed_ingestor.alpaca.bar_event_processor import BarEventProcessor -from src.feed_ingestor.alpaca.event_consumer import EventConsumer -from src.feed_ingestor.alpaca.event_producer import EventProducer +from src.feed_ingestor.alpaca_client_factory import create_alpaca_client +from src.feed_ingestor.bar_event_processor import BarEventProcessor +from src.feed_ingestor.event_consumer import EventConsumer +from src.feed_ingestor.event_producer import EventProducer from src.models.bar_model import MINUTE_BAR_EVENT_TYPE from src.util.environment import get_env diff --git a/src/feed_ingestor/alpaca/metrics.py b/src/feed_ingestor/metrics.py similarity index 100% rename from src/feed_ingestor/alpaca/metrics.py rename to src/feed_ingestor/metrics.py diff --git a/tst/feed_ingestor/alpaca/test_alpaca_client.py b/tst/feed_ingestor/test_alpaca_client.py similarity index 93% rename from tst/feed_ingestor/alpaca/test_alpaca_client.py rename to tst/feed_ingestor/test_alpaca_client.py index 99fe297..7e93360 100644 --- a/tst/feed_ingestor/alpaca/test_alpaca_client.py +++ b/tst/feed_ingestor/test_alpaca_client.py @@ -4,7 +4,7 @@ import pytest from prometheus_client import REGISTRY -from src.feed_ingestor.alpaca.alpaca_client import AlpacaClient +from src.feed_ingestor.alpaca_client import AlpacaClient class FakeWebSocket: @@ -61,7 +61,7 @@ def test_alpaca_client_get_events(monkeypatch): def fake_connect(url): return FakeConnect(fake_ws) - monkeypatch.setattr("src.feed_ingestor.alpaca.alpaca_client.websockets.connect", fake_connect) + monkeypatch.setattr("src.feed_ingestor.alpaca_client.websockets.connect", fake_connect) client = AlpacaClient(api_key="key", api_secret="secret") responses_before = REGISTRY.get_sample_value("num_alpaca_responses_total") or 0 diff --git a/tst/feed_ingestor/alpaca/test_bar_event_processor.py b/tst/feed_ingestor/test_bar_event_processor.py similarity index 98% rename from tst/feed_ingestor/alpaca/test_bar_event_processor.py rename to tst/feed_ingestor/test_bar_event_processor.py index defc5d8..e69011e 100644 --- a/tst/feed_ingestor/alpaca/test_bar_event_processor.py +++ b/tst/feed_ingestor/test_bar_event_processor.py @@ -5,7 +5,7 @@ import pytest -from src.feed_ingestor.alpaca.bar_event_processor import BarEventProcessor +from src.feed_ingestor.bar_event_processor import BarEventProcessor from src.models.bar_model import ( CLOSE_PRICE, HIGH_PRICE, diff --git a/tst/feed_ingestor/alpaca/test_event_consumer.py b/tst/feed_ingestor/test_event_consumer.py similarity index 96% rename from tst/feed_ingestor/alpaca/test_event_consumer.py rename to tst/feed_ingestor/test_event_consumer.py index 2a3d1db..8cbadb4 100644 --- a/tst/feed_ingestor/alpaca/test_event_consumer.py +++ b/tst/feed_ingestor/test_event_consumer.py @@ -3,7 +3,7 @@ import pytest -from src.feed_ingestor.alpaca.event_consumer import EventConsumer +from src.feed_ingestor.event_consumer import EventConsumer from src.models.bar_model import EVENT_TYPE, MINUTE_BAR_EVENT_TYPE diff --git a/tst/feed_ingestor/alpaca/test_event_producer.py b/tst/feed_ingestor/test_event_producer.py similarity index 91% rename from tst/feed_ingestor/alpaca/test_event_producer.py rename to tst/feed_ingestor/test_event_producer.py index 343cb81..3d2a71a 100644 --- a/tst/feed_ingestor/alpaca/test_event_producer.py +++ b/tst/feed_ingestor/test_event_producer.py @@ -2,8 +2,8 @@ import pytest -from src.feed_ingestor.alpaca.event_producer import EventProducer -from src.feed_ingestor.alpaca.metrics import NUM_ALPACA_ERRORS +from src.feed_ingestor.event_producer import EventProducer +from src.feed_ingestor.metrics import NUM_ALPACA_ERRORS class FakeClient: diff --git a/tst/feed_ingestor/alpaca/test_fake_alpaca_client.py b/tst/feed_ingestor/test_fake_alpaca_client.py similarity index 83% rename from tst/feed_ingestor/alpaca/test_fake_alpaca_client.py rename to tst/feed_ingestor/test_fake_alpaca_client.py index 27b9ca6..8fc65c2 100644 --- a/tst/feed_ingestor/alpaca/test_fake_alpaca_client.py +++ b/tst/feed_ingestor/test_fake_alpaca_client.py @@ -2,9 +2,9 @@ import pytest -from src.feed_ingestor.alpaca.alpaca_client import AlpacaClient -from src.feed_ingestor.alpaca.alpaca_client_factory import create_alpaca_client -from src.feed_ingestor.alpaca.fake_alpaca_client import ( +from src.feed_ingestor.alpaca_client import AlpacaClient +from src.feed_ingestor.alpaca_client_factory import create_alpaca_client +from src.feed_ingestor.fake_alpaca_client import ( ANOMALY_INTERVAL, BASE_PRICE, BASE_VOLUME, @@ -53,7 +53,7 @@ def test_fake_alpaca_client_waits_when_interval(monkeypatch): async def fake_sleep(duration): sleep_calls.append(duration) - monkeypatch.setattr("src.feed_ingestor.alpaca.fake_alpaca_client.asyncio.sleep", fake_sleep) + monkeypatch.setattr("src.feed_ingestor.fake_alpaca_client.asyncio.sleep", fake_sleep) client = FakeAlpacaClient(interval_seconds=1) asyncio.run(asyncio.wait_for(_get_first_event(client), timeout=0.1)) @@ -67,11 +67,11 @@ def test_fake_alpaca_client_generates_normal_variation(monkeypatch): client._last_close_price = BASE_PRICE monkeypatch.setattr( - "src.feed_ingestor.alpaca.fake_alpaca_client.random.uniform", + "src.feed_ingestor.fake_alpaca_client.random.uniform", lambda *_: -0.001, ) monkeypatch.setattr( - "src.feed_ingestor.alpaca.fake_alpaca_client.random.randint", + "src.feed_ingestor.fake_alpaca_client.random.randint", lambda *_: 1, ) @@ -94,7 +94,7 @@ def fake_uniform(a, b): return 0.1 if len(uniform_calls) == 1 else 8.0 monkeypatch.setattr( - "src.feed_ingestor.alpaca.fake_alpaca_client.random.uniform", + "src.feed_ingestor.fake_alpaca_client.random.uniform", fake_uniform, ) diff --git a/tst/feed_ingestor/alpaca/test_healthcheck.py b/tst/feed_ingestor/test_healthcheck.py similarity index 97% rename from tst/feed_ingestor/alpaca/test_healthcheck.py rename to tst/feed_ingestor/test_healthcheck.py index fedd5d5..14cb81e 100644 --- a/tst/feed_ingestor/alpaca/test_healthcheck.py +++ b/tst/feed_ingestor/test_healthcheck.py @@ -2,7 +2,7 @@ import pytest -from src.feed_ingestor.alpaca import healthcheck +from src.feed_ingestor import healthcheck class _DummyProducer: diff --git a/tst/feed_ingestor/alpaca/test_ingestor_main.py b/tst/feed_ingestor/test_ingestor_main.py similarity index 98% rename from tst/feed_ingestor/alpaca/test_ingestor_main.py rename to tst/feed_ingestor/test_ingestor_main.py index e02c81f..81f596e 100644 --- a/tst/feed_ingestor/alpaca/test_ingestor_main.py +++ b/tst/feed_ingestor/test_ingestor_main.py @@ -2,7 +2,7 @@ import pytest -import src.feed_ingestor.alpaca.main as main_module +import src.feed_ingestor.main as main_module def _set_common_env(monkeypatch):