From de5b10e193c2f8670bd6b64d3c5b5f198741aa0c Mon Sep 17 00:00:00 2001 From: dmitri-mcguckin Date: Sun, 30 Aug 2026 16:20:14 -0600 Subject: [PATCH 1/3] Add gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..1c544e35 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +# Custom +**/*.code-workspace \ No newline at end of file From 0a1e057e4eaa3142803b784206e67c27e5197c42 Mon Sep 17 00:00:00 2001 From: dmitri-mcguckin Date: Sun, 30 Aug 2026 16:28:57 -0600 Subject: [PATCH 2/3] Update backend file structure --- .vscode/settings.json | 9 ++++ .dockerignore => backend/docker/.dockerignore | 0 backend/{ => docker}/Dockerfile | 0 backend/{ => docker}/Makefile | 0 backend/{ => docker}/docker-compose.yaml | 0 backend/pyproject.toml | 41 ++++++++++++------- backend/ruff.toml | 13 ------ backend/{ => src}/cesium_api/__init__.py | 8 ++-- backend/{ => src}/cesium_api/__main__.py | 18 ++++++-- backend/{ => src}/cesium_api/app.py | 7 ++-- backend/{ => src}/cesium_api/data.py | 11 ++--- backend/{ => src}/cesium_api/dev-cors.html | 0 .../{ => src}/cesium_api/views/__init__.py | 0 backend/{ => src}/cesium_api/views/czml.py | 2 +- .../cesium_api/views/groundstation.py | 3 +- backend/{ => src}/cesium_api/views/passes.py | 0 .../{ => src}/cesium_api/views/satellite.py | 4 +- backend/{ => src}/cesium_api/views/tiles.py | 4 +- 18 files changed, 73 insertions(+), 47 deletions(-) create mode 100644 .vscode/settings.json rename .dockerignore => backend/docker/.dockerignore (100%) rename backend/{ => docker}/Dockerfile (100%) rename backend/{ => docker}/Makefile (100%) rename backend/{ => docker}/docker-compose.yaml (100%) delete mode 100644 backend/ruff.toml rename backend/{ => src}/cesium_api/__init__.py (99%) rename backend/{ => src}/cesium_api/__main__.py (92%) rename backend/{ => src}/cesium_api/app.py (95%) rename backend/{ => src}/cesium_api/data.py (99%) rename backend/{ => src}/cesium_api/dev-cors.html (100%) rename backend/{ => src}/cesium_api/views/__init__.py (100%) rename backend/{ => src}/cesium_api/views/czml.py (92%) rename backend/{ => src}/cesium_api/views/groundstation.py (99%) rename backend/{ => src}/cesium_api/views/passes.py (100%) rename backend/{ => src}/cesium_api/views/satellite.py (99%) rename backend/{ => src}/cesium_api/views/tiles.py (89%) diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..1c49803f --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,9 @@ +{ + "python-envs.pythonProjects": [ + { + "path": ".", + "envManager": "ms-python.python:venv", + "packageManager": "ms-python.python:pip" + } + ] +} \ No newline at end of file diff --git a/.dockerignore b/backend/docker/.dockerignore similarity index 100% rename from .dockerignore rename to backend/docker/.dockerignore diff --git a/backend/Dockerfile b/backend/docker/Dockerfile similarity index 100% rename from backend/Dockerfile rename to backend/docker/Dockerfile diff --git a/backend/Makefile b/backend/docker/Makefile similarity index 100% rename from backend/Makefile rename to backend/docker/Makefile diff --git a/backend/docker-compose.yaml b/backend/docker/docker-compose.yaml similarity index 100% rename from backend/docker-compose.yaml rename to backend/docker/docker-compose.yaml diff --git a/backend/pyproject.toml b/backend/pyproject.toml index 4fcad6d3..e7b4deb2 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -1,7 +1,3 @@ -[build-system] -requires = ["setuptools", "setuptools_scm"] -build-backend = "setuptools.build_meta" - [project] name = "cesium-api" description = "A supporting API for the CesiumJS App" @@ -18,28 +14,45 @@ classifiers = [ "Programming Language :: Python :: 3.11", ] dependencies = [ - "dataclasses-json", - "flask", - "flask-cors", - "gunicorn", + "flask==3.1.3", + "flask-cors==6.0.5", + "skyfield==1.55", "pygeoif==0.7", - "python-dateutil", - "requests", - "satellite-czml", - "skyfield", + "dataclasses-json==0.6.7", + "python-dateutil==2.9.0.post0", + "requests==2.34.2", + "satellite-czml==0.1.2", + "gunicorn==26.2.0", ] [project.scripts] cesium-api = "cesium_api.__main__:main" +[build-system] +requires = ["setuptools", "setuptools_scm"] +build-backend = "setuptools.build_meta" + [tool.setuptools.packages.find] exclude = ["docs*", "tests*"] [tool.setuptools.package-data] "*" = ["*.yaml", "*.csv"] -[tool.black] -line_length = 100 +[tool.ruff] +line-length = 100 +indent-width = 4 + +[tool.ruff.lint] +select = [ + "E", # pycodestyle + "F", # Pyflakes + "I", # isort +] + +[tool.ruff.format] +quote-style = "double" +indent-style = "space" + [tool.pylama] format = "pylint" diff --git a/backend/ruff.toml b/backend/ruff.toml deleted file mode 100644 index fc465a1b..00000000 --- a/backend/ruff.toml +++ /dev/null @@ -1,13 +0,0 @@ -line-length = 100 -indent-width = 4 - -[lint] -select = [ - "E", # pycodestyle - "F", # Pyflakes - "I", # isort -] - -[format] -quote-style = "double" -indent-style = "space" diff --git a/backend/cesium_api/__init__.py b/backend/src/cesium_api/__init__.py similarity index 99% rename from backend/cesium_api/__init__.py rename to backend/src/cesium_api/__init__.py index 4306f562..8c6225ec 100644 --- a/backend/cesium_api/__init__.py +++ b/backend/src/cesium_api/__init__.py @@ -1,8 +1,10 @@ -import os import json -from flask_cors import CORS -from flask import Flask, send_file +import os from importlib.metadata import version + +from flask import Flask, send_file +from flask_cors import CORS + from .data import Data, GroundStation, Satellite APP_NAME = "cesium-api" diff --git a/backend/cesium_api/__main__.py b/backend/src/cesium_api/__main__.py similarity index 92% rename from backend/cesium_api/__main__.py rename to backend/src/cesium_api/__main__.py index 6eeec6a9..a87f70c0 100644 --- a/backend/cesium_api/__main__.py +++ b/backend/src/cesium_api/__main__.py @@ -1,11 +1,21 @@ import logging - from argparse import ArgumentParser, Namespace -from .app import App -from .data import Data + from flask_cors import CORS -from . import APP_NAME, APP_DESCRIPTION, APP_VERSION, SATELLITES, GROUND_STATIONS, DEFAULT_HOST, DEFAULT_PORT, DEFAULT_DATA_DIR, DEFAULT_API_PREFIX +from . import ( + APP_DESCRIPTION, + APP_NAME, + APP_VERSION, + DEFAULT_API_PREFIX, + DEFAULT_DATA_DIR, + DEFAULT_HOST, + DEFAULT_PORT, + GROUND_STATIONS, + SATELLITES, +) +from .app import App +from .data import Data LOG = logging.getLogger(__name__) logging.basicConfig(level=logging.INFO) diff --git a/backend/cesium_api/app.py b/backend/src/cesium_api/app.py similarity index 95% rename from backend/cesium_api/app.py rename to backend/src/cesium_api/app.py index 924cab08..71840e39 100644 --- a/backend/cesium_api/app.py +++ b/backend/src/cesium_api/app.py @@ -1,9 +1,10 @@ from __future__ import annotations -from flask import Flask, Blueprint -from flask_cors import CORS + +from flask import Flask + from . import DEFAULT_DATA_DIR -from .views import view_czml, view_groundstation, view_passes, view_satellite, view_tiles from .data import Data +from .views import view_czml, view_groundstation, view_passes, view_satellite, view_tiles class App(Flask): diff --git a/backend/cesium_api/data.py b/backend/src/cesium_api/data.py similarity index 99% rename from backend/cesium_api/data.py rename to backend/src/cesium_api/data.py index 330c4363..ebcbd567 100644 --- a/backend/cesium_api/data.py +++ b/backend/src/cesium_api/data.py @@ -1,14 +1,15 @@ from __future__ import annotations import json -import requests -from time import sleep -from threading import Thread -from marshmallow import fields from dataclasses import dataclass, field -from satellite_czml import satellite_czml from datetime import datetime, timedelta, timezone +from threading import Thread +from time import sleep + +import requests from dataclasses_json import config, dataclass_json +from marshmallow import fields +from satellite_czml import satellite_czml from skyfield.api import EarthSatellite, Loader, Topos, wgs84 ACTIVAE_SAT_URL = "https://celestrak.org/NORAD/elements/gp.php?GROUP=active&FORMAT=tle" diff --git a/backend/cesium_api/dev-cors.html b/backend/src/cesium_api/dev-cors.html similarity index 100% rename from backend/cesium_api/dev-cors.html rename to backend/src/cesium_api/dev-cors.html diff --git a/backend/cesium_api/views/__init__.py b/backend/src/cesium_api/views/__init__.py similarity index 100% rename from backend/cesium_api/views/__init__.py rename to backend/src/cesium_api/views/__init__.py diff --git a/backend/cesium_api/views/czml.py b/backend/src/cesium_api/views/czml.py similarity index 92% rename from backend/cesium_api/views/czml.py rename to backend/src/cesium_api/views/czml.py index aedbb985..c1f96e8c 100644 --- a/backend/cesium_api/views/czml.py +++ b/backend/src/cesium_api/views/czml.py @@ -1,5 +1,5 @@ from json import loads -from ..data import Data + from flask import Blueprint, current_app view_czml = Blueprint("view_czml", __name__) diff --git a/backend/cesium_api/views/groundstation.py b/backend/src/cesium_api/views/groundstation.py similarity index 99% rename from backend/cesium_api/views/groundstation.py rename to backend/src/cesium_api/views/groundstation.py index 8609fe92..5af7d19c 100644 --- a/backend/cesium_api/views/groundstation.py +++ b/backend/src/cesium_api/views/groundstation.py @@ -1,6 +1,7 @@ -from ..data import Data from flask import Blueprint, current_app +from ..data import Data + view_groundstation = Blueprint("view_groundstation", __name__) diff --git a/backend/cesium_api/views/passes.py b/backend/src/cesium_api/views/passes.py similarity index 100% rename from backend/cesium_api/views/passes.py rename to backend/src/cesium_api/views/passes.py diff --git a/backend/cesium_api/views/satellite.py b/backend/src/cesium_api/views/satellite.py similarity index 99% rename from backend/cesium_api/views/satellite.py rename to backend/src/cesium_api/views/satellite.py index 7578c698..8e66b7a5 100644 --- a/backend/cesium_api/views/satellite.py +++ b/backend/src/cesium_api/views/satellite.py @@ -1,7 +1,9 @@ from json import dumps -from ..data import Data + from flask import Blueprint, current_app +from ..data import Data + view_satellite = Blueprint("view_satellite", __name__) diff --git a/backend/cesium_api/views/tiles.py b/backend/src/cesium_api/views/tiles.py similarity index 89% rename from backend/cesium_api/views/tiles.py rename to backend/src/cesium_api/views/tiles.py index 0af616ef..ffcd204b 100644 --- a/backend/cesium_api/views/tiles.py +++ b/backend/src/cesium_api/views/tiles.py @@ -1,5 +1,5 @@ -from os.path import exists, abspath -from json import dumps +from os.path import abspath, exists + from flask import Blueprint, current_app, send_file view_tiles = Blueprint("view_tiles", __name__) From 35636e2f997a18620f3964b33305c360853d9c73 Mon Sep 17 00:00:00 2001 From: dmitri-mcguckin Date: Sun, 30 Aug 2026 16:59:21 -0600 Subject: [PATCH 3/3] Update docker with context build --- backend/docker/Dockerfile | 20 ++++++++--------- backend/docker/docker-compose.yaml | 12 ++++++++-- backend/pyproject.toml | 35 +++++------------------------- backend/src/cesium_api/__init__.py | 4 +--- 4 files changed, 26 insertions(+), 45 deletions(-) diff --git a/backend/docker/Dockerfile b/backend/docker/Dockerfile index 7b8a8fba..7d191d94 100644 --- a/backend/docker/Dockerfile +++ b/backend/docker/Dockerfile @@ -1,26 +1,26 @@ -FROM python:3.10-alpine +FROM python:3.14 ARG VERSION ARG API_HOST -ENV API_HOST=0.0.0.0 +ENV API_HOST=${API_HOST} ARG API_PORT -ENV API_PORT=9000 +ENV API_PORT=${API_PORT} -ARG DATA_DIR -ENV DATA_DIR=/var/cesium-api/ +ARG DATA_DIR="/var/cesium-api/" +ENV DATA_DIR=${DATA_DIR} -ARG API_PREFIX -ENV API_PREFIX=/ +ARG API_PREFIX="/" +ENV API_PREFIX=${API_PREFIX} ARG WHL_NAME ENV WHL_NAME=cesium_api-${VERSION}-py3-none-any.whl -COPY build/${WHL_NAME} / -RUN pip install /${WHL_NAME} +COPY --from=dist ${WHL_NAME} / +RUN pip install -U /${WHL_NAME} RUN rm /${WHL_NAME} EXPOSE ${API_PORT} -CMD cesium-api --host ${API_HOST} --port ${API_PORT} --data-dir ${DATA_DIR} --prefix ${API_PREFIX} +ENTRYPOINT cesium-api --host ${API_HOST} --port ${API_PORT} --data-dir ${DATA_DIR} --prefix ${API_PREFIX} diff --git a/backend/docker/docker-compose.yaml b/backend/docker/docker-compose.yaml index 1020905a..4cfe959e 100644 --- a/backend/docker/docker-compose.yaml +++ b/backend/docker/docker-compose.yaml @@ -1,12 +1,20 @@ services: cesium-api: image: cesium-api:latest - build: - context: . ports: - '9000:9000' volumes: - globe_data:/var/cesium-api/ + build: + additional_contexts: + dist: ../dist + args: + VERSION: 1.1.0 + API_HOST: 0.0.0.0 + API_PORT: 9000 + tags: + - uniclogs/cesium-api:latest + - uniclogs/cesium-api:1.1.0 volumes: globe_data: \ No newline at end of file diff --git a/backend/pyproject.toml b/backend/pyproject.toml index e7b4deb2..166fbc39 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -1,9 +1,9 @@ [project] name = "cesium-api" description = "A supporting API for the CesiumJS App" -version = "1.0.2" +version = "1.1.0" readme = "README.md" -requires-python = ">=3.9" +requires-python = ">=3.14" license = { text = "GPL-2.0" } classifiers = [ "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", @@ -22,21 +22,12 @@ dependencies = [ "python-dateutil==2.9.0.post0", "requests==2.34.2", "satellite-czml==0.1.2", - "gunicorn==26.2.0", ] -[project.scripts] -cesium-api = "cesium_api.__main__:main" +[project.optional-dependencies] +ci = ["ruff==0.16.5", "pytest==9.1.1"] +build = ["build==1.6.0", "gunicorn==26.2.0"] -[build-system] -requires = ["setuptools", "setuptools_scm"] -build-backend = "setuptools.build_meta" - -[tool.setuptools.packages.find] -exclude = ["docs*", "tests*"] - -[tool.setuptools.package-data] -"*" = ["*.yaml", "*.csv"] [tool.ruff] line-length = 100 @@ -52,19 +43,3 @@ select = [ [tool.ruff.format] quote-style = "double" indent-style = "space" - - -[tool.pylama] -format = "pylint" -skip = "*/.tox/*,*/.env/,*/.git/*,*/.github/*,*/build/*,.direnv/*" -linters = "pycodestyle,pyflakes,pylint,mccabe,mypy,radon" - -[[tool.pylama.files]] -path = "*/__init__.py" -# W0611: Imported but unused -# R0903: Too few public methods -ignore = "W0611,R0903" - -[tool.isort] -profile = "black" -line_length = 100 diff --git a/backend/src/cesium_api/__init__.py b/backend/src/cesium_api/__init__.py index 8c6225ec..1bf092b4 100644 --- a/backend/src/cesium_api/__init__.py +++ b/backend/src/cesium_api/__init__.py @@ -1,11 +1,9 @@ -import json import os from importlib.metadata import version -from flask import Flask, send_file from flask_cors import CORS -from .data import Data, GroundStation, Satellite +from .data import GroundStation, Satellite APP_NAME = "cesium-api" APP_DESCRIPTION = "A supporting API for the CesiumJS App"