refactor to allow for multiple code locations

This commit is contained in:
2025-07-20 19:49:30 +02:00
parent 9b8cfabee5
commit fd73e1367c
40 changed files with 161 additions and 628 deletions

13
.dockerignore Normal file
View File

@@ -0,0 +1,13 @@
Dockerfile.code
Dockerfile.system
Makefile
__pycache__
build
compose*.yaml
db
poetry.lock
pyproject.toml
requirements.sh
src
storage
trash

View File

@@ -3,7 +3,8 @@ FROM python:3.12-slim
# Checkout and install dagster libraries needed to run the gRPC server # Checkout and install dagster libraries needed to run the gRPC server
# exposing your repository to dagit and dagster-daemon, and to load the DagsterInstance # exposing your repository to dagit and dagster-daemon, and to load the DagsterInstance
COPY dagster-requirements.txt requirements.txt COPY requirements.txt .
RUN pip install uv RUN pip install uv
RUN uv pip install -r requirements.txt --system RUN uv pip install -r requirements.txt --system
RUN uv pip install polars-lts-cpu --system RUN uv pip install polars-lts-cpu --system
@@ -16,5 +17,4 @@ EXPOSE 4000
# CMD allows this to be overridden from run launchers or executors that want # CMD allows this to be overridden from run launchers or executors that want
# to run other commands against your repository # to run other commands against your repository
#CMD ["dagster", "api", "grpc", "-h", "0.0.0.0", "-p", "4000", "-f", "repo.py"] CMD ["dagster", "code-server", "start", "-h", "0.0.0.0", "-p", "4000", "-m", "app.definitions"]
CMD ["dagster", "code-server", "start", "-h", "0.0.0.0", "-p", "4000", "-f", "repo.py"]

View File

@@ -4,6 +4,7 @@
FROM python:3.12-slim FROM python:3.12-slim
COPY dagster-requirements.txt requirements.txt COPY dagster-requirements.txt requirements.txt
RUN pip install uv RUN pip install uv
RUN uv pip install -r requirements.txt --system RUN uv pip install -r requirements.txt --system
RUN uv pip install polars-lts-cpu --system RUN uv pip install polars-lts-cpu --system

View File

@@ -1,13 +1,12 @@
from assets import asset_multi_1, asset_multi_2, asset_single_1, asset_single_2
from dagster_polars import PolarsParquetIOManager from dagster_polars import PolarsParquetIOManager
from dagster import Definitions, define_asset_job from dagster import Definitions, define_asset_job
from .assets import asset_multi_1, asset_multi_2, asset_single_1, asset_single_2
# Define a job that includes both assets # Define a job that includes both assets
daily_job = define_asset_job("daily_job", selection=[asset_multi_1, asset_multi_2]) daily_job = define_asset_job("daily_job", selection=[asset_multi_1, asset_multi_2])
vinyl = Definitions( definitions = Definitions(
assets=[asset_single_1, asset_multi_1, asset_single_2, asset_multi_2], assets=[asset_single_1, asset_multi_1, asset_single_2, asset_multi_2],
resources={"polars_parquet_io_manager": PolarsParquetIOManager()}, resources={"polars_parquet_io_manager": PolarsParquetIOManager()},
jobs=[daily_job], jobs=[daily_job],

View File

@@ -1,11 +1,6 @@
from assets import asset_multi_1, asset_multi_2, asset_single_1, asset_single_2
from dagster_polars import PolarsParquetIOManager from dagster_polars import PolarsParquetIOManager
from app.vinyl.assets import (
asset_multi_1,
asset_multi_2,
asset_single_1,
asset_single_2,
)
from dagster import materialize from dagster import materialize
resources = { resources = {

3
apps/test/__init__.py Normal file
View File

@@ -0,0 +1,3 @@
from icecream import install
install()

View File

@@ -0,0 +1,3 @@
from icecream import install
install()

View File

@@ -5,10 +5,10 @@ import duckdb
import polars as pl import polars as pl
import structlog import structlog
from duckdb.typing import DATE, VARCHAR from duckdb.typing import DATE, VARCHAR
from plato.fetch import scrape_plato
from sounds.fetch import fetch_deals
from utils import parse_date
from app.vinyl.plato.fetch import scrape_plato
from app.vinyl.sounds.fetch import fetch_deals
from app.vinyl.utils import parse_date
from dagster import ( from dagster import (
DailyPartitionsDefinition, DailyPartitionsDefinition,
DimensionPartitionMapping, DimensionPartitionMapping,

View File

@@ -1,17 +1,16 @@
from collections.abc import Sequence from collections.abc import Sequence
from assets import deals, new_deals, works
from dagster_duckdb import DuckDBIOManager from dagster_duckdb import DuckDBIOManager
from dagster_duckdb.io_manager import DbTypeHandler from dagster_duckdb.io_manager import DbTypeHandler
from dagster_duckdb_pandas import DuckDBPandasTypeHandler from dagster_duckdb_pandas import DuckDBPandasTypeHandler
from dagster_polars import PolarsParquetIOManager from dagster_polars import PolarsParquetIOManager
from jobs import check_partititions_job, deals_job, musicbrainz_lookup_job
from schedules import deals_schedule
from sensors import musicbrainz_lookup_sensor
from dagster import Definitions from dagster import Definitions
from .assets import deals, new_deals, works
from .jobs import check_partititions_job, deals_job, musicbrainz_lookup_job
from .schedules import deals_schedule
from .sensors import musicbrainz_lookup_sensor
class PandasDuckDBIOManager(DuckDBIOManager): class PandasDuckDBIOManager(DuckDBIOManager):
@staticmethod @staticmethod
@@ -19,7 +18,7 @@ class PandasDuckDBIOManager(DuckDBIOManager):
return [DuckDBPandasTypeHandler()] return [DuckDBPandasTypeHandler()]
vinyl = Definitions( definitions = Definitions(
assets=[deals, new_deals, works], assets=[deals, new_deals, works],
resources={ resources={
"polars_parquet_io_manager": PolarsParquetIOManager(), "polars_parquet_io_manager": PolarsParquetIOManager(),

View File

@@ -1,3 +1,5 @@
from assets import deals, new_deals, works
from dagster import ( from dagster import (
AssetKey, AssetKey,
AssetMaterialization, AssetMaterialization,
@@ -7,8 +9,6 @@ from dagster import (
op, op,
) )
from .assets import deals, new_deals, works
deals_job = define_asset_job( deals_job = define_asset_job(
"deals_job", selection=[deals], partitions_def=deals.partitions_def "deals_job", selection=[deals], partitions_def=deals.partitions_def
) )

View File

@@ -1,6 +1,6 @@
from dagster import DefaultScheduleStatus, build_schedule_from_partitioned_job from jobs import deals_job
from app.vinyl.repo import deals_job from dagster import DefaultScheduleStatus, build_schedule_from_partitioned_job
deals_schedule = build_schedule_from_partitioned_job( deals_schedule = build_schedule_from_partitioned_job(
job=deals_job, job=deals_job,

View File

@@ -1,5 +1,6 @@
from app.vinyl.assets import deals from assets import deals
from app.vinyl.jobs import musicbrainz_lookup_job from jobs import musicbrainz_lookup_job
from dagster import ( from dagster import (
DefaultSensorStatus, DefaultSensorStatus,
EventLogEntry, EventLogEntry,

View File

@@ -72,7 +72,7 @@ if __name__ == "__main__":
done = True done = True
if len(deals) > 0: if len(deals) > 0:
print(f"Discounted items:") print("Discounted items:")
print(deals) print(deals)
done = True done = True

View File

@@ -1,16 +1,15 @@
import logging
import warnings import warnings
from datetime import datetime from datetime import datetime
from dagster import materialize from assets import deals
from dagster_polars import PolarsParquetIOManager from dagster_polars import PolarsParquetIOManager
from jobs import check_partititions_job
from app.vinyl.assets import deals from dagster import materialize
from app.vinyl.jobs import check_partititions_job
warnings.filterwarnings("ignore", category=UserWarning) warnings.filterwarnings("ignore", category=UserWarning)
import logging
logging.getLogger().setLevel(logging.INFO) logging.getLogger().setLevel(logging.INFO)
resources = { resources = {

View File

@@ -4,15 +4,6 @@ x-dagster-env: &dagster_env
DAGSTER_POSTGRES_USER: ${POSTGRES_USER} DAGSTER_POSTGRES_USER: ${POSTGRES_USER}
DAGSTER_POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} DAGSTER_POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
DAGSTER_POSTGRES_DB: ${POSTGRES_DB} DAGSTER_POSTGRES_DB: ${POSTGRES_DB}
DAGSTER_CURRENT_IMAGE: ${DAGSTER_CURRENT_IMAGE}
x-volumes: &volumes
volumes:
#- /opt/dagster/storage/:/opt/dagster/home/storage/
- /opt/dagster/storage/import/:/opt/dagster/home/storage/import/
- /opt/dagster/storage/deals/:/opt/dagster/home/storage/deals/
- /opt/dagster/src/app/:/opt/dagster/home/app/
- /opt/dagster/src/repo.py:/opt/dagster/home/repo.py
services: services:
# This service runs the gRPC server that loads your user code, in both dagit # This service runs the gRPC server that loads your user code, in both dagit
@@ -20,30 +11,37 @@ services:
# run launcher to use this same image when launching runs in a new container as well. # run launcher to use this same image when launching runs in a new container as well.
# Multiple containers like this can be deployed separately - each just needs to run on # Multiple containers like this can be deployed separately - each just needs to run on
# its own port, and have its own entry in the workspace.yaml file that's loaded by dagit. # its own port, and have its own entry in the workspace.yaml file that's loaded by dagit.
user_code: user_code_vinyl:
build: build:
context: . context: apps/vinyl
dockerfile: Dockerfile.code dockerfile: ../../Dockerfile.code
container_name: user_code container_name: user_code_vinyl
image: user_code_image image: user_code_vinyl
restart: always restart: always
environment: environment:
<<: *dagster_env <<: *dagster_env
<<: *volumes DAGSTER_CURRENT_IMAGE: user_code_vinyl
PYTHONPATH: app
volumes:
- /opt/dagster/storage/import/:/opt/dagster/home/storage/import/
- /opt/dagster/storage/deals/:/opt/dagster/home/storage/deals/
- /opt/dagster/apps/vinyl/src/:/opt/dagster/home/app/
networks: networks:
- dagster - dagster
other_image: user_code_other:
profiles: [ disabled ] # profiles: [ disabled ]
build: build:
context: . context: apps/other
dockerfile: Dockerfile dockerfile: ../../Dockerfile.code
container_name: other_image container_name: user_code_other
image: user_code_image image: user_code_other
restart: always restart: always
environment: environment:
<<: *dagster_env <<: *dagster_env
DAGSTER_CURRENT_IMAGE: something_else DAGSTER_CURRENT_IMAGE: user_code_other
<<: *volumes PYTHONPATH: app
volumes:
- /opt/dagster/apps/other/src/:/opt/dagster/home/app/
networks: networks:
- dagster - dagster

View File

@@ -67,7 +67,6 @@ services:
- dagster - dagster
depends_on: depends_on:
- postgresql - postgresql
- user_code
# This service runs the dagster-daemon process, which is responsible for taking runs # This service runs the dagster-daemon process, which is responsible for taking runs
# off of the queue and launching them, as well as creating runs from schedules or sensors. # off of the queue and launching them, as well as creating runs from schedules or sensors.

View File

@@ -1,398 +0,0 @@
# This file was autogenerated by uv via the following command:
# uv pip compile --constraint=requirements.txt --output-file=dagster-requirements.txt --extra=dagster pyproject.toml
aiobotocore==2.15.1
# via s3fs
aiohappyeyeballs==2.4.3
# via aiohttp
aiohttp==3.10.8
# via
# aiobotocore
# s3fs
aioitertools==0.12.0
# via aiobotocore
aiosignal==1.3.1
# via aiohttp
alembic==1.13.3
# via dagster
aniso8601==9.0.1
# via graphene
annotated-types==0.7.0
# via pydantic
anyio==4.6.0
# via
# gql
# starlette
# watchfiles
appdirs==1.4.4
# via pint
asttokens==2.4.1
# via icecream
attrs==24.2.0
# via aiohttp
backoff==2.2.1
# via gql
beautifulsoup4==4.12.3
boto3==1.35.23
# via
# aiobotocore
# dagster-aws
botocore==1.35.23
# via
# aiobotocore
# boto3
# s3transfer
cachetools==5.5.0
# via google-auth
certifi==2024.8.30
# via
# influxdb-client
# kubernetes
# pyogrio
# pyproj
# requests
charset-normalizer==3.3.2
# via requests
click==8.1.7
# via
# dagster
# dagster-webserver
# uvicorn
colorama==0.4.6
# via icecream
coloredlogs==14.0
# via dagster
contourpy==1.3.0
# via matplotlib
cramjam==2.8.4
# via fastparquet
croniter==3.0.3
# via dagster
cycler==0.12.1
# via matplotlib
dagit==1.8.9
dagster==1.8.9
# via
# dagster-aws
# dagster-docker
# dagster-duckdb
# dagster-duckdb-pandas
# dagster-graphql
# dagster-polars
# dagster-postgres
# dagster-webserver
dagster-aws==0.24.9
dagster-docker==0.24.9
dagster-duckdb==0.24.9
# via dagster-duckdb-pandas
dagster-duckdb-pandas==0.24.9
dagster-graphql==1.8.9
# via dagster-webserver
dagster-pipes==1.8.9
# via dagster
dagster-polars==0.24.9
dagster-postgres==0.24.9
dagster-webserver==1.8.9
# via dagit
dnspython==2.6.1
# via email-validator
docker==7.1.0
# via dagster-docker
docker-image-py==0.1.13
# via dagster-docker
docstring-parser==0.16
# via dagster
duckdb==1.1.1
# via dagster-duckdb
durationpy==0.8
# via kubernetes
email-validator==2.2.0
# via pydantic
et-xmlfile==1.1.0
# via openpyxl
executing==2.1.0
# via icecream
fastapi==0.115.0
fastparquet==2024.5.0
filelock==3.16.1
# via dagster
flexcache==0.3
# via pint
flexparser==0.3.1
# via pint
fonttools==4.54.1
# via matplotlib
frozenlist==1.4.1
# via
# aiohttp
# aiosignal
fsspec==2024.9.0
# via
# fastparquet
# s3fs
# universal-pathlib
geopandas==1.0.1
gitdb==4.0.11
# via gitpython
gitpython==3.1.43
google-auth==2.35.0
# via kubernetes
gql==3.5.0
# via dagster-graphql
graphene==3.3
# via dagster-graphql
graphql-core==3.2.4
# via
# gql
# graphene
# graphql-relay
graphql-relay==3.2.0
# via graphene
grpcio==1.66.2
# via
# dagster
# grpcio-health-checking
grpcio-health-checking==1.62.3
# via dagster
h11==0.14.0
# via uvicorn
httptools==0.6.1
# via uvicorn
humanfriendly==10.0
# via coloredlogs
icecream==2.1.3
idna==3.10
# via
# anyio
# email-validator
# requests
# yarl
influxdb-client==1.46.0
jinja2==3.1.4
# via dagster
jmespath==1.0.1
# via
# boto3
# botocore
kiwisolver==1.4.7
# via matplotlib
kubernetes==31.0.0
lxml==5.3.0
mako==1.3.5
# via alembic
markdown-it-py==3.0.0
# via rich
markupsafe==2.1.5
# via
# jinja2
# mako
matplotlib==3.9.2
# via seaborn
mdurl==0.1.2
# via markdown-it-py
multidict==6.1.0
# via
# aiohttp
# yarl
networkx==3.3
numpy==2.1.1
# via
# contourpy
# fastparquet
# geopandas
# matplotlib
# pandas
# pyarrow
# pyogrio
# seaborn
# shapely
oauthlib==3.2.2
# via
# kubernetes
# requests-oauthlib
openpyxl==3.1.5
packaging==24.1
# via
# dagster
# dagster-aws
# fastparquet
# geopandas
# matplotlib
# pyogrio
pandas==2.2.3
# via
# dagster-duckdb-pandas
# fastparquet
# geopandas
# pint-pandas
# seaborn
pillow==10.4.0
# via matplotlib
pint==0.24.3
# via pint-pandas
pint-pandas==0.6.2
polars==1.9.0
# via dagster-polars
protobuf==4.25.5
# via
# dagster
# grpcio-health-checking
psycopg2-binary==2.9.9
# via dagster-postgres
pyarrow==17.0.0
# via dagster-polars
pyasn1==0.6.1
# via
# pyasn1-modules
# rsa
pyasn1-modules==0.4.1
# via google-auth
pydantic==2.9.2
# via
# dagster
# fastapi
# pydantic-settings
pydantic-core==2.23.4
# via pydantic
pydantic-settings==2.5.2
pygments==2.18.0
# via
# icecream
# rich
pyogrio==0.10.0
# via geopandas
pyparsing==3.1.4
# via matplotlib
pyproj==3.7.0
# via geopandas
pysocks==1.7.1
# via requests
python-dateutil==2.9.0.post0
# via
# botocore
# croniter
# influxdb-client
# kubernetes
# matplotlib
# pandas
python-dotenv==1.0.1
# via
# dagster
# pydantic-settings
# uvicorn
pytz==2024.2
# via
# croniter
# dagster
# pandas
pyyaml==6.0.2
# via
# dagster
# kubernetes
# uvicorn
reactivex==4.0.4
# via influxdb-client
regex==2024.9.11
# via docker-image-py
requests==2.32.3
# via
# dagster
# dagster-aws
# dagster-graphql
# docker
# gql
# kubernetes
# requests-oauthlib
# requests-toolbelt
requests-oauthlib==2.0.0
# via kubernetes
requests-toolbelt==1.0.0
# via gql
rich==13.8.1
# via dagster
rsa==4.9
# via google-auth
s3fs==2024.9.0
s3transfer==0.10.2
# via boto3
seaborn==0.13.2
setuptools==75.1.0
# via
# dagster
# influxdb-client
shapely==2.0.6
# via geopandas
six==1.16.0
# via
# asttokens
# kubernetes
# python-dateutil
smmap==5.0.1
# via gitdb
sniffio==1.3.1
# via anyio
soupsieve==2.6
# via beautifulsoup4
sqlalchemy==2.0.35
# via
# alembic
# dagster
starlette==0.38.6
# via
# dagster-graphql
# dagster-webserver
# fastapi
structlog==24.4.0
# via dagster
tabulate==0.9.0
# via dagster
tomli==2.0.1
# via dagster
toposort==1.10
# via dagster
tqdm==4.66.5
# via dagster
typing-extensions==4.12.2
# via
# alembic
# dagster
# dagster-polars
# fastapi
# flexcache
# flexparser
# pint
# pydantic
# pydantic-core
# reactivex
# sqlalchemy
tzdata==2024.2
# via pandas
universal-pathlib==0.2.5
# via
# dagster
# dagster-polars
urllib3==2.2.3
# via
# botocore
# docker
# influxdb-client
# kubernetes
# requests
uvicorn==0.31.0
# via dagster-webserver
uvloop==0.20.0
# via uvicorn
watchdog==5.0.3
# via dagster
watchfiles==0.24.0
# via uvicorn
websocket-client==1.8.0
# via kubernetes
websockets==13.1
# via uvicorn
wrapt==1.16.0
# via aiobotocore
xlsxwriter==3.2.0
yarl==1.13.1
# via
# aiohttp
# gql

View File

@@ -1,7 +1,6 @@
telemetry: telemetry:
enabled: false enabled: false
concurrency: concurrency:
default_op_concurrency_limit: 2 default_op_concurrency_limit: 2
@@ -19,15 +18,13 @@ run_launcher:
- DAGSTER_POSTGRES_USER - DAGSTER_POSTGRES_USER
- DAGSTER_POSTGRES_PASSWORD - DAGSTER_POSTGRES_PASSWORD
- DAGSTER_POSTGRES_DB - DAGSTER_POSTGRES_DB
- PYTHONPATH=app
network: dagster network: dagster
container_kwargs: container_kwargs:
volumes: volumes:
- /opt/dagster/src/app/:/opt/dagster/home/app/
- /opt/dagster/src/repo.py:/opt/dagster/home/repo.py
- /opt/dagster/storage/import/:/opt/dagster/home/storage/import/ - /opt/dagster/storage/import/:/opt/dagster/home/storage/import/
- /opt/dagster/storage/deals/:/opt/dagster/home/storage/deals/ - /opt/dagster/storage/deals/:/opt/dagster/home/storage/deals/
- /opt/dagster/apps/vinyl/src/:/opt/dagster/home/app/
- /opt/dagster/storage/:/opt/dagster/home/storage/ - /opt/dagster/storage/:/opt/dagster/home/storage/
run_storage: run_storage:

View File

@@ -6,34 +6,25 @@ authors = [
] ]
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"fastapi", "beautifulsoup4",
"boto3",
"duckdb",
"fastparquet",
"gitpython", "gitpython",
"kubernetes", "icecream",
"matplotlib", "lxml",
"seaborn",
"openpyxl", "openpyxl",
"xlsxwriter",
"pandas", "pandas",
"pyarrow", "pyarrow",
"pydantic[email]", "pydantic[email]",
"pydantic-settings", "pydantic-settings",
"pyyaml", "pyyaml",
"requests", "requests",
"s3fs[boto3]",
"structlog",
"uvicorn",
"duckdb",
"geopandas",
"lxml",
"networkx",
"Pint",
"Pint-Pandas",
"boto3",
"influxdb-client",
"requests[socks]", "requests[socks]",
"beautifulsoup4", "s3fs[boto3]",
"fastparquet", "seaborn",
"icecream" "structlog",
"xlsxwriter"
] ]
[project.optional-dependencies] [project.optional-dependencies]
@@ -61,15 +52,19 @@ dagster = [
"dagster-duckdb-pandas", "dagster-duckdb-pandas",
"dagit" "dagit"
] ]
vinyl = []
[tool.poetry] other = []
name = "dev" unknown = [
version = "0.1.0" "fastapi",
description = "" "geopandas",
authors = ["Rik Veenboer <rik.veenboer@gmail.com>"] "influxdb-client",
"kubernetes",
[tool.poetry.dependencies] "matplotlib",
seven = "^1.0.0" "networkx",
"Pint",
"Pint-Pandas",
"uvicorn"
]
[tool.ruff] [tool.ruff]
builtins = ["ic"] builtins = ["ic"]

5
requirements.sh Executable file
View File

@@ -0,0 +1,5 @@
uv pip compile pyproject.toml
uv pip compile pyproject.toml --extra=dagster --output-file=dagster-requirements.txt
uv pip compile pyproject.toml --extra=dagster --extra=dev --extra=local --output-file=dev-requirements.txt
uv pip compile pyproject.toml --extra=dagster --extra=vinyl --output-file=src/vinyl/requirements.txt
uv pip compile pyproject.toml --extra=dagster --extra=other --output-file=src/other/requirements.txt

View File

@@ -1,238 +1,160 @@
# This file was autogenerated by uv via the following command: # This file was autogenerated by uv via the following command:
# uv pip compile --output-file=requirements.txt pyproject.toml # uv pip compile --output-file=requirements.txt pyproject.toml
aiobotocore==2.15.1
# via s3fs
aiohappyeyeballs==2.4.3
# via aiohttp
aiohttp==3.10.8
# via
# aiobotocore
# s3fs
aioitertools==0.12.0
# via aiobotocore
aiosignal==1.3.1
# via aiohttp
annotated-types==0.7.0 annotated-types==0.7.0
# via pydantic # via pydantic
anyio==4.6.0 asttokens==3.0.0
# via starlette
appdirs==1.4.4
# via pint
asttokens==2.4.1
# via icecream # via icecream
attrs==24.2.0 beautifulsoup4==4.13.4
# via aiohttp boto3==1.39.9
beautifulsoup4==4.12.3 botocore==1.39.9
boto3==1.35.23
# via aiobotocore
botocore==1.35.23
# via # via
# aiobotocore
# boto3 # boto3
# s3fs
# s3transfer # s3transfer
cachetools==5.5.0 cachetools==5.5.2
# via google-auth # via google-auth
certifi==2024.8.30 certifi==2025.7.14
# via # via
# influxdb-client
# kubernetes # kubernetes
# pyogrio
# pyproj
# requests # requests
charset-normalizer==3.3.2 charset-normalizer==3.4.2
# via requests # via requests
click==8.1.7
# via uvicorn
colorama==0.4.6 colorama==0.4.6
# via icecream # via icecream
contourpy==1.3.0 contourpy==1.3.2
# via matplotlib # via matplotlib
cramjam==2.8.4 cramjam==2.10.0
# via fastparquet # via fastparquet
cycler==0.12.1 cycler==0.12.1
# via matplotlib # via matplotlib
dnspython==2.6.1 dnspython==2.7.0
# via email-validator # via email-validator
duckdb==1.1.1 duckdb==1.3.2
durationpy==0.8 durationpy==0.10
# via kubernetes # via kubernetes
email-validator==2.2.0 email-validator==2.2.0
# via pydantic # via pydantic
et-xmlfile==1.1.0 et-xmlfile==2.0.0
# via openpyxl # via openpyxl
executing==2.1.0 executing==2.2.0
# via icecream # via icecream
fastapi==0.115.0 fastparquet==2024.11.0
fastparquet==2024.5.0 fonttools==4.59.0
flexcache==0.3
# via pint
flexparser==0.3.1
# via pint
fonttools==4.54.1
# via matplotlib # via matplotlib
frozenlist==1.4.1 fsspec==2025.7.0
# via
# aiohttp
# aiosignal
fsspec==2024.9.0
# via # via
# fastparquet # fastparquet
# s3fs # s3fs
geopandas==1.0.1 gitdb==4.0.12
gitdb==4.0.11
# via gitpython # via gitpython
gitpython==3.1.43 gitpython==3.1.44
google-auth==2.35.0 google-auth==2.40.3
# via kubernetes # via kubernetes
h11==0.14.0 icecream==2.1.5
# via uvicorn
icecream==2.1.3
idna==3.10 idna==3.10
# via # via
# anyio
# email-validator # email-validator
# requests # requests
# yarl
influxdb-client==1.46.0
jmespath==1.0.1 jmespath==1.0.1
# via # via
# boto3 # boto3
# botocore # botocore
kiwisolver==1.4.7 kiwisolver==1.4.8
# via matplotlib # via matplotlib
kubernetes==31.0.0 kubernetes==33.1.0
lxml==5.3.0 lxml==6.0.0
matplotlib==3.9.2 matplotlib==3.10.3
# via seaborn # via seaborn
multidict==6.1.0 numpy==2.3.1
# via
# aiohttp
# yarl
networkx==3.3
numpy==2.1.1
# via # via
# contourpy # contourpy
# fastparquet # fastparquet
# geopandas
# matplotlib # matplotlib
# pandas # pandas
# pyarrow
# pyogrio
# seaborn # seaborn
# shapely oauthlib==3.3.1
oauthlib==3.2.2
# via # via
# kubernetes # kubernetes
# requests-oauthlib # requests-oauthlib
openpyxl==3.1.5 openpyxl==3.1.5
packaging==24.1 packaging==25.0
# via # via
# fastparquet # fastparquet
# geopandas
# matplotlib # matplotlib
# pyogrio pandas==2.3.1
pandas==2.2.3
# via # via
# fastparquet # fastparquet
# geopandas
# pint-pandas
# seaborn # seaborn
pillow==10.4.0 pillow==11.3.0
# via matplotlib # via matplotlib
pint==0.24.3 pyarrow==21.0.0
# via pint-pandas
pint-pandas==0.6.2
pyarrow==17.0.0
pyasn1==0.6.1 pyasn1==0.6.1
# via # via
# pyasn1-modules # pyasn1-modules
# rsa # rsa
pyasn1-modules==0.4.1 pyasn1-modules==0.4.2
# via google-auth # via google-auth
pydantic==2.9.2 pydantic==2.11.7
# via # via pydantic-settings
# fastapi pydantic-core==2.33.2
# pydantic-settings
pydantic-core==2.23.4
# via pydantic # via pydantic
pydantic-settings==2.5.2 pydantic-settings==2.10.1
pygments==2.18.0 pygments==2.19.2
# via icecream # via icecream
pyogrio==0.10.0 pyparsing==3.2.3
# via geopandas
pyparsing==3.1.4
# via matplotlib # via matplotlib
pyproj==3.7.0
# via geopandas
pysocks==1.7.1 pysocks==1.7.1
# via requests # via requests
python-dateutil==2.9.0.post0 python-dateutil==2.9.0.post0
# via # via
# botocore # botocore
# influxdb-client
# kubernetes # kubernetes
# matplotlib # matplotlib
# pandas # pandas
python-dotenv==1.0.1 python-dotenv==1.1.1
# via pydantic-settings # via pydantic-settings
pytz==2024.2 pytz==2025.2
# via pandas # via pandas
pyyaml==6.0.2 pyyaml==6.0.2
# via kubernetes # via kubernetes
reactivex==4.0.4 requests==2.32.4
# via influxdb-client
requests==2.32.3
# via # via
# kubernetes # kubernetes
# requests-oauthlib # requests-oauthlib
requests-oauthlib==2.0.0 requests-oauthlib==2.0.0
# via kubernetes # via kubernetes
rsa==4.9 rsa==4.9.1
# via google-auth # via google-auth
s3fs==2024.9.0 s3fs==0.4.2
s3transfer==0.10.2 s3transfer==0.13.1
# via boto3 # via boto3
seaborn==0.13.2 seaborn==0.13.2
setuptools==75.1.0 six==1.17.0
# via influxdb-client
shapely==2.0.6
# via geopandas
six==1.16.0
# via # via
# asttokens
# kubernetes # kubernetes
# python-dateutil # python-dateutil
smmap==5.0.1 smmap==5.0.2
# via gitdb # via gitdb
sniffio==1.3.1 soupsieve==2.7
# via anyio
soupsieve==2.6
# via beautifulsoup4 # via beautifulsoup4
starlette==0.38.6 structlog==25.4.0
# via fastapi typing-extensions==4.14.1
structlog==24.4.0
typing-extensions==4.12.2
# via # via
# fastapi # beautifulsoup4
# flexcache
# flexparser
# pint
# pydantic # pydantic
# pydantic-core # pydantic-core
# reactivex # typing-inspection
tzdata==2024.2 typing-inspection==0.4.1
# via
# pydantic
# pydantic-settings
tzdata==2025.2
# via pandas # via pandas
urllib3==2.2.3 urllib3==2.5.0
# via # via
# botocore # botocore
# influxdb-client
# kubernetes # kubernetes
# requests # requests
uvicorn==0.31.0
websocket-client==1.8.0 websocket-client==1.8.0
# via kubernetes # via kubernetes
wrapt==1.16.0 xlsxwriter==3.2.5
# via aiobotocore
xlsxwriter==3.2.0
yarl==1.13.1
# via aiohttp

View File

@@ -1 +0,0 @@
from app.vinyl.repo import vinyl # noqa

View File

@@ -1,4 +1,7 @@
load_from: load_from:
- grpc_server: - grpc_server:
host: user_code host: user_code_vinyl
port: 4000
- grpc_server:
host: user_code_other
port: 4000 port: 4000