Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,11 @@ jobs:
tags: local/app:latest

- name: Run image help
run: docker run --rm --entrypoint "app" local/app:latest --help
run: |
docker run --rm --entrypoint "app" local/app:latest --help
docker run --rm --entrypoint "adminapi" local/app:latest --help
docker run --rm --entrypoint "dataapi" local/app:latest --help
docker run --rm --entrypoint "tasks" local/app:latest --help

- name: Save image
run: docker save local/app:latest -o image.tar
Expand Down
5 changes: 5 additions & 0 deletions app/adminapi/cache/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from app.adminapi.cache.background_cache import BackgroundCache

__all__ = [
"BackgroundCache",
]
18 changes: 18 additions & 0 deletions app/adminapi/cli.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import os

import click

from app.adminapi.command import AdminAPICommand
from app.lib import commands


@click.command(short_help=AdminAPICommand.help())
@click.option(
"-c",
"--config",
type=str,
default=lambda: os.environ.get("CONFIG", ""),
help="Path to configuration file",
)
def main(config: str) -> None:
commands.run(AdminAPICommand(config))
File renamed without changes.
10 changes: 5 additions & 5 deletions app/commands/adminapi/command.py → app/adminapi/command.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,14 @@
import structlog
import yaml

from app.adminapi import cache, clients, domain, presentation
from app.adminapi.domain import table_stats
from app.data import enums as data_enums
from app.data import repositories
from app.domain import adminapi as domain
from app.domain.adminapi import table_stats
from app.lib import audit, auth, cache, clients, commands, config, tracing
from app.lib import audit, auth, commands, config, tracing
from app.lib.storage import postgres
from app.lib.tracing import TracingConfig
from app.lib.web import server
from app.presentation import adminapi as presentation

log: structlog.stdlib.BoundLogger = structlog.get_logger()

Expand All @@ -38,7 +38,7 @@ def prepare(self):

tracing.setup_tracing("adminapi", cfg.tracing)

self.pg_storage = postgres.PgStorage(cfg.storage, log)
self.pg_storage = postgres.PgStorage(cfg.storage, log, data_enums.PG_ENUM_REGISTRY)
self.pg_storage.connect()

authenticator: auth.Authenticator = (
Expand Down
15 changes: 15 additions & 0 deletions app/adminapi/domain/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from app.adminapi.domain.actions import Actions
from app.adminapi.domain.crossmatch import CrossmatchManager
from app.adminapi.domain.login import LoginManager
from app.adminapi.domain.mock import get_mock_actions
from app.adminapi.domain.sources import SourceManager
from app.adminapi.domain.table_upload import TableUploadManager

__all__ = [
"Actions",
"CrossmatchManager",
"get_mock_actions",
"LoginManager",
"TableUploadManager",
"SourceManager",
]
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
from typing import final

from app.adminapi import cache, clients
from app.adminapi import presentation as adminapi
from app.adminapi.domain import catalogs, crossmatch, layer1_write, login, pgc, sources, table_upload
from app.data import repositories
from app.domain.adminapi import catalogs, crossmatch, layer1_write, login, pgc, sources, table_upload
from app.lib import auth, cache, clients
from app.presentation import adminapi
from app.lib import auth


@final
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from typing import Any, final

from app.adminapi import presentation as adminapi
from app.data import model, repositories
from app.presentation import adminapi

_INTERNAL_COLUMNS = frozenset({"record_id", "object_id", "id", "modification_time"})

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@
from astropy import coordinates
from astropy import units as u

from app.adminapi import presentation as adminapi
from app.data import model
from app.data.repositories import layer0, layer1, layer2
from app.data.repositories.layer0.records import AssignRecordPgcsPreconditionError
from app.lib import astronomy
from app.lib.storage import enums
from app.lib.web.errors import ConflictError, NotFoundError
from app.presentation import adminapi

logger = structlog.stdlib.get_logger()

Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import psycopg
from astropy import units as u

from app.adminapi import presentation as adminapi
from app.data import model
from app.data.repositories import layer1
from app.lib.web.errors import RuleValidationError
from app.presentation import adminapi


class Layer1Writer:
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from app.adminapi import presentation as adminapi
from app.lib import auth
from app.lib.web.errors import UnauthorizedError
from app.presentation import adminapi


class LoginManager:
Expand Down
7 changes: 4 additions & 3 deletions app/domain/adminapi/mock.py → app/adminapi/domain/mock.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import datetime
from unittest import mock

from app.domain.adminapi import actions
from app.lib import auth, clients
from app.presentation import adminapi
from app.adminapi import clients
from app.adminapi import presentation as adminapi
from app.adminapi.domain import actions
from app.lib import auth


def get_mock_table_stats_cache() -> mock.MagicMock:
Expand Down
2 changes: 1 addition & 1 deletion app/domain/adminapi/pgc.py → app/adminapi/domain/pgc.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
from typing import final

from app.adminapi import presentation as adminapi
from app.data import repositories
from app.lib.web.errors import NotFoundError
from app.presentation import adminapi


@final
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from app.adminapi import presentation as adminapi
from app.data import repositories
from app.presentation import adminapi

ALLOWED_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_"

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import datetime
from collections.abc import Callable

from app.adminapi import presentation as adminapi
from app.data import model, repositories
from app.presentation import adminapi


def table_progress_to_presentation(progress: model.TableProgress) -> adminapi.TableProgress:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,15 @@
from astropy import units as u
from astroquery import nasa_ads as ads

from app.adminapi import cache, clients
from app.adminapi import presentation as adminapi
from app.adminapi.domain import table_stats
from app.data import model, repositories
from app.data.repositories.common import ColumnSchemaInfo, TableSchemaInfo
from app.data.repositories.layer0.common import RAWDATA_SCHEMA
from app.domain.adminapi import table_stats
from app.lib import astronomy, cache, clients, concurrency
from app.lib import astronomy, concurrency
from app.lib.storage import enums, mapping
from app.lib.web.errors import NotFoundError, RuleValidationError
from app.presentation import adminapi

BIBCODE_REGEX = "^([0-9]{4}[A-Za-z.&]{5}[A-Za-z0-9.]{4}[AELPQ-Z0-9.][0-9.]{4}[A-Z])$"

Expand Down
5 changes: 5 additions & 0 deletions app/adminapi/presentation/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from app.adminapi.presentation.interface import *
from app.adminapi.presentation.records import *
from app.adminapi.presentation.server import Server

__all__ = ["Server"]
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@

import pydantic

from app.adminapi.presentation.records import GetRecordsRequest, GetRecordsResponse
from app.lib.storage import enums, mapping
from app.presentation.adminapi.records import GetRecordsRequest, GetRecordsResponse

DatatypeEnum = enum.StrEnum(
"DatatypeEnum",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@
import fastapi
import structlog

from app.adminapi.presentation import interface
from app.lib import audit, auth
from app.lib.web import server
from app.lib.web.middlewares import identity_from_request
from app.presentation.adminapi import interface


def _logout_token(request: fastapi.Request) -> str:
Expand Down
44 changes: 6 additions & 38 deletions app/cli.py
Original file line number Diff line number Diff line change
@@ -1,47 +1,15 @@
import os

import click

from app.commands.adminapi import AdminAPICommand
from app.commands.dataapi import DataAPICommand
from app.lib import commands
from app.adminapi.cli import main as adminapi
from app.dataapi.cli import main as dataapi
from app.tasks.cli import main as serve_tasks


@click.group()
def cli() -> None:
pass


@cli.command(short_help=AdminAPICommand.help())
@click.option(
"-c",
"--config",
type=str,
default=lambda: os.environ.get("CONFIG", ""),
help="Path to configuration file",
)
def adminapi(config: str):
commands.run(AdminAPICommand(config))


@cli.command(short_help=DataAPICommand.help())
@click.option(
"-c",
"--config",
type=str,
default=lambda: os.environ.get("CONFIG", ""),
help="Path to configuration file",
)
def dataapi(config: str):
commands.run(DataAPICommand(config))


@cli.command(
"serve-tasks",
short_help="Registers layer2 import Prefect deployments and serves them.",
)
def serve_tasks() -> None:
# Lazy-load: ServeTasksCommand pulls in Prefect, which slows other commands
from app.commands.serve_tasks import ServeTasksCommand # noqa: PLC0415

commands.run(ServeTasksCommand())
cli.add_command(adminapi, name="adminapi")
cli.add_command(dataapi, name="dataapi")
cli.add_command(serve_tasks, name="serve-tasks")
6 changes: 0 additions & 6 deletions app/commands/adminapi/__init__.py

This file was deleted.

3 changes: 0 additions & 3 deletions app/commands/dataapi/__init__.py

This file was deleted.

3 changes: 0 additions & 3 deletions app/commands/serve_tasks/__init__.py

This file was deleted.

8 changes: 8 additions & 0 deletions app/data/enums.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from psycopg.types import enum

from app.lib.storage import enums

PG_ENUM_REGISTRY: list[tuple[type[enum.Enum], str]] = [
(enums.DataType, "common.datatype"),
(enums.RecordTriageStatus, "layer0.triage_status"),
]
18 changes: 18 additions & 0 deletions app/dataapi/cli.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import os

import click

from app.dataapi.command import DataAPICommand
from app.lib import commands


@click.command(short_help=DataAPICommand.help())
@click.option(
"-c",
"--config",
type=str,
default=lambda: os.environ.get("CONFIG", ""),
help="Path to configuration file",
)
def main(config: str) -> None:
commands.run(DataAPICommand(config))
7 changes: 3 additions & 4 deletions app/commands/dataapi/command.py → app/dataapi/command.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,13 @@
import structlog
import yaml

from app.data import enums as data_enums
from app.data import repositories
from app.domain import dataapi as domain
from app.domain import responders
from app.dataapi import domain, presentation, responders
from app.lib import auth, commands, config, tracing
from app.lib.storage import postgres
from app.lib.tracing import TracingConfig
from app.lib.web import server
from app.presentation import dataapi as presentation

log: structlog.stdlib.BoundLogger = structlog.get_logger()

Expand All @@ -34,7 +33,7 @@ def prepare(self):
tracing.setup_tracing("dataapi", self.config.tracing)

self.pg_auth = postgres.PgStorage(self.config.storage.auth, log)
self.pg_main = postgres.PgStorage(self.config.storage.main, log)
self.pg_main = postgres.PgStorage(self.config.storage.main, log, data_enums.PG_ENUM_REGISTRY)

authenticator: auth.Authenticator = (
auth.PostgresAuthenticator(self.pg_auth) if self.config.auth_enabled else auth.NoopAuthenticator()
Expand Down
5 changes: 5 additions & 0 deletions app/dataapi/domain/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from app.dataapi.domain.actions import Actions

__all__ = [
"Actions",
]
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
from typing import final

from app.data import model, repositories
from app.domain import responders
from app.domain.dataapi import parameterized_query, tap_types
from app.presentation import dataapi
from app.dataapi import presentation as dataapi
from app.dataapi import responders
from app.dataapi.domain import parameterized_query, tap_types

ENABLED_CATALOGS = [
model.RawCatalog.DESIGNATION,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from app.data import model, repositories
from app.data.repositories import layer2
from app.domain import responders
from app.presentation import dataapi
from app.dataapi import presentation as dataapi
from app.dataapi import responders

CATALOGS_FOR_PGC_QUERY = [
model.RawCatalog.DESIGNATION,
Expand Down
File renamed without changes.
5 changes: 5 additions & 0 deletions app/dataapi/presentation/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from app.dataapi.presentation.interface import *
from app.dataapi.presentation.server import Server
from app.dataapi.presentation.tap import *

__all__ = ["Server"]
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import pydantic

from app.presentation.dataapi import tap
from app.dataapi.presentation import tap


class EquatorialCoordinates(pydantic.BaseModel):
Expand Down
Loading
Loading