create central config.py based on pydantic_settings

This commit is contained in:
Helmut Merz 2026-11-02 09:42:23 +01:00
parent 0a60389152
commit 2b02de2012
8 changed files with 69 additions and 92 deletions

View file

@ -2,10 +2,10 @@
"""Common API dependencies""" """Common API dependencies"""
import config from scopes import config
def storage(): def storage():
stf = config.StorageFactory(config) stf = config.StorageFactory(config.settings)
return stf(config.dbschema) return stf(config.settings.dbschema)

29
scopes/config.py Normal file
View file

@ -0,0 +1,29 @@
# py-scopes/apidemo/config.py
from pydantic_settings import BaseSettings, SettingsConfigDict
from scopes.storage.db.postgres import StorageFactory
class Settings(BaseSettings):
model_config = SettingsConfigDict(env_file='.env', extra='ignore')
#, env_prefix='SCOPES_')
base_url: str = 'https://test.cy7.eu'
log_file: str = 'log/scopes.log'
log_level: str = 'INFO'
log_format: str = '%(asctime)s %(levelname)s %(name)s %(message)s'
log_dateformat: str = '%Y-%m-%dT%H:%M:%S'
dbengine: str = 'postgresql+psycopg'
dbname: str = 'demo'
dbuser: str = 'demo'
dbpassword: str = 'secret'
dbschema: str = 'demo'
settings = Settings()
import logging
logging.basicConfig(filename=settings.log_file, level=settings.log_level,
format=settings.log_format, datefmt=settings.log_dateformat)
logging.getLogger('uvicorn.error').propagate = True

View file

@ -2,17 +2,3 @@
"""Common stuff (config, fixtures, ...) for testing""" """Common stuff (config, fixtures, ...) for testing"""
import os, sys
sys.path = [os.path.dirname(__file__)] + sys.path
import config
from scopes.storage.db import postgres
config.dbengine = 'postgresql+psycopg'
config.dbname = 'testdb'
config.dbuser = 'testuser'
config.dbpassword = 'secret'
config.dbschema = 'testing'
config.StorageFactory = postgres.StorageFactory

View file

@ -1,65 +0,0 @@
# py-scopes/tests/config.py
import logging
from pydantic_settings import BaseSettings, SettingsConfigDict
from scopes.storage.db.postgres import StorageFactory
class Settings(BaseSettings):
model_config = SettingsConfigDict(env_file='.env')
base_url: str = 'https://test.cy7.eu'
log_file: str = 'scopes/tests/log/scopes-test.log'
log_level: str = 'INFO'
log_format: str = '%(asctime)s %(levelname)s %(name)s %(message)s'
log_dateformat: str = '%Y-%m-%dT%H:%M:%S'
dbengine: str = 'postgresql+psycopg'
dbname: str = 'testdb'
dbuser: str = 'testuser'
dbpassword: str = 'secret'
dbschema: str = 'testing'
settings = Settings()
from os import getenv
import sys
base_url = settings.base_url
logging.basicConfig(filename=settings.log_file, level=settings.log_level,
format=settings.log_format, datefmt=settings.log_dateformat)
# storage settings
dbengine = settings.dbengine
dbname = settings.dbname
dbuser = settings.dbuser
dbpassword = settings.dbpassword
dbschema = settings.dbschema
# special testing stuff
from scopes.tests import data_auth # add oidc URIs and keys to dummy_requests data
from scopes.tests import dummy_requests
sys.modules['requests'] = dummy_requests
# authentication settings
oidc_provider = 'test://oidc'
oidc_client_id = getenv('OIDC_CLIENT_ID', '12345')
oidc_params = dict(
op_config_url=oidc_provider + '/.well-known/openid-configuration',
op_uris=None,
op_keys=None,
op_project_scope='urn:zitadel:iam:org:project:id:zitadel:aud',
callback_url=getenv('OIDC_CALLBACK_URL', base_url + '/auth/callback'),
client_id=oidc_client_id,
principal_prefix=getenv('OIDC_PRINCIPAL_PREFIX', 'loops.'),
cookie_name=getenv('OIDC_COOKIE_NAME', 'oidc_' + oidc_client_id),
cookie_domain=getenv('OIDC_COOKIE_DOMAIN', None),
cookie_lifetime=getenv('OIDC_COOKIE_LIFETIME', '86400'),
cookie_crypt=getenv('OIDC_COOKIE_CRYPT', None),
private_key_file=getenv('OIDC_SERVICE_USER_PRIVATE_KEY_FILE',
'scopes/tests/test-private-key.json'),
organization_id=getenv('OIDC_ORGANIZATION_ID', '12346'),
project_id=getenv('OIDC_PROJECT_ID', None),
)

16
tests/test.env Normal file
View file

@ -0,0 +1,16 @@
# tests/test.env
BASE_URL=http://test
DBNAME=testdb
DBUSER=testuser
DBPASSWORD=secret
DBSCHEMA=testing
OIDC_PROVIDER=https://oidc.example.com
OIDC_CLIENT_ID=12345
OIDC_COOKIE_CRYPT=secret_crypt
OIDC_ORGANIZATION_ID=12346
OIDC_PROJECT_ID=12347

View file

@ -2,12 +2,7 @@
"""Tests for the fastapi- (and asyncio-) based stuff""" """Tests for the fastapi- (and asyncio-) based stuff"""
from scopes import testing from scopes import config
import os, sys
import config
from scopes.storage import tracking
import pytest import pytest
from fastapi.testclient import TestClient from fastapi.testclient import TestClient
@ -15,10 +10,11 @@ from httpx2 import ASGITransport, AsyncClient
from scopes.api import main from scopes.api import main
from scopes.api.main import app from scopes.api.main import app
from scopes.storage import tracking
@pytest.fixture(scope='module') @pytest.fixture(scope='module')
def storage(): def storage():
storage = config.StorageFactory(config)(config.dbschema) storage = config.StorageFactory(config.settings)(config.settings.dbschema)
storage.dropTable('tracks') storage.dropTable('tracks')
storage.commit() storage.commit()
return storage return storage

16
tests/test_config.py Normal file
View file

@ -0,0 +1,16 @@
# py-scopes: tests.test_config
"""Tests for scopes configuration settings via config.py and .env"""
import os
import pytest
from scopes import config
config.settings = config.Settings(_env_file='tests/test.env')
from scopes.config import settings
def test_config():
assert settings.dbname == 'testdb'
assert settings.dbschema == 'testing'

View file

@ -2,8 +2,7 @@
""" Tests for the (PostgreSQL) storage-related functionalities""" """ Tests for the (PostgreSQL) storage-related functionalities"""
from scopes import testing from scopes import config
import config
from datetime import datetime from datetime import datetime
import pytest import pytest
@ -17,7 +16,7 @@ k('session system')
@pytest.fixture(scope='module') @pytest.fixture(scope='module')
def storage(): def storage():
storage = config.StorageFactory(config)(config.dbschema) storage = config.StorageFactory(config.settings)(config.settings.dbschema)
storage.dropTable('tracks') storage.dropTable('tracks')
storage.dropTable('folders') storage.dropTable('folders')
storage.dropTable('types') storage.dropTable('types')