Skip to content

Commit

Permalink
swap back to __getattribute__ (#6)
Browse files Browse the repository at this point in the history
  • Loading branch information
joshuadavidthomas authored May 13, 2024
1 parent 03ab401 commit 3b9bec0
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 16 deletions.
37 changes: 24 additions & 13 deletions src/django_opfield/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,34 +2,45 @@

import os
import shutil
import sys
from dataclasses import dataclass
from pathlib import Path
from typing import Any

from django.conf import settings
from django.core.exceptions import ImproperlyConfigured

if sys.version_info >= (3, 12):
from typing import override
else:
from typing_extensions import (
override, # pyright: ignore[reportUnreachable] # pragma: no cover
)

OPFIELD_SETTINGS_NAME = "DJANGO_OPFIELD"


@dataclass(frozen=True)
class AppSettings:
def __getattr__(self, __name: str) -> Any:
return self._get_user_settings(__name, super().__getattribute__(__name))
def _get_user_setting(setting: str, fallback: Any = None) -> Any:
user_settings = getattr(settings, OPFIELD_SETTINGS_NAME, {})

def _get_user_settings(self, setting: str, fallback: Any = None) -> Any:
user_settings = getattr(settings, OPFIELD_SETTINGS_NAME, {})
if user_setting := user_settings.get(setting, fallback):
ret = user_setting
else:
ret = os.environ.get(setting, None)

if user_setting := user_settings.get(setting, fallback):
ret = user_setting
else:
ret = os.environ.get(setting, None)
return ret

return ret

@dataclass(frozen=True)
class AppSettings:
@override
def __getattribute__(self, __name: str) -> Any:
user_setting = _get_user_setting(__name)
return user_setting or super().__getattribute__(__name)

@property
def OP_CLI_PATH(self) -> Path:
if user_cli_path := self._get_user_settings("OP_CLI_PATH"):
if user_cli_path := _get_user_setting("OP_CLI_PATH"):
path = user_cli_path
else:
path = shutil.which("op")
Expand All @@ -41,7 +52,7 @@ def OP_CLI_PATH(self) -> Path:

@property
def OP_SERVICE_ACCOUNT_TOKEN(self) -> str:
token = self._get_user_settings("OP_SERVICE_ACCOUNT_TOKEN")
token = _get_user_setting("OP_SERVICE_ACCOUNT_TOKEN")

if not token:
raise ImproperlyConfigured("OP_SERVICE_ACCOUNT_TOKEN is not set")
Expand Down
7 changes: 4 additions & 3 deletions tests/test_conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,21 @@
from django.test import override_settings

from django_opfield.conf import OPFIELD_SETTINGS_NAME
from django_opfield.conf import _get_user_setting
from django_opfield.conf import app_settings


class TestGetUserSettings:
def test_not_set(self):
assert app_settings._get_user_settings("TEST_SETTING") is None
assert _get_user_setting("TEST_SETTING") is None

@override_settings(**{OPFIELD_SETTINGS_NAME: {"TEST_SETTING": "test value"}})
def test_set_in_settings(self):
assert app_settings._get_user_settings("TEST_SETTING") == "test value"
assert _get_user_setting("TEST_SETTING") == "test value"

@patch.dict(os.environ, {"TEST_SETTING": "test value"})
def test_set_in_env(self):
assert app_settings._get_user_settings("TEST_SETTING") == "test value"
assert _get_user_setting("TEST_SETTING") == "test value"


@patch.dict(os.environ, {"OP_CLI_PATH": ""})
Expand Down

0 comments on commit 3b9bec0

Please sign in to comment.