Skip to content

Commit 9dc6c97

Browse files
authored
Environ secrets (#356)
1 parent 0b12b41 commit 9dc6c97

File tree

5 files changed

+41
-24
lines changed

5 files changed

+41
-24
lines changed

luxonis_ml/data/parsers/luxonis_parser.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ def _download_roboflow_dataset(
285285
"Please set it to your Roboflow API key."
286286
)
287287

288-
rf = Roboflow(api_key=environ.ROBOFLOW_API_KEY)
288+
rf = Roboflow(api_key=environ.ROBOFLOW_API_KEY.get_secret_value())
289289
parts = dataset_dir.split("roboflow://")[1].split("/")
290290
if len(parts) != 4:
291291
raise ValueError(

luxonis_ml/utils/environ.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from pathlib import Path
33
from typing import Any, Literal, cast
44

5-
from pydantic import NonNegativeInt, model_serializer
5+
from pydantic import NonNegativeInt, SecretStr, model_serializer
66
from pydantic_settings import BaseSettings, SettingsConfigDict
77

88
from luxonis_ml.typing import Params
@@ -17,18 +17,18 @@ class Environ(BaseSettings):
1717
env_file=".env", env_file_encoding="utf-8", extra="ignore"
1818
)
1919

20-
AWS_ACCESS_KEY_ID: str | None = None
21-
AWS_SECRET_ACCESS_KEY: str | None = None
20+
AWS_ACCESS_KEY_ID: SecretStr | None = None
21+
AWS_SECRET_ACCESS_KEY: SecretStr | None = None
2222
AWS_S3_ENDPOINT_URL: str | None = None
2323

2424
MLFLOW_CLOUDFLARE_ID: str | None = None
25-
MLFLOW_CLOUDFLARE_SECRET: str | None = None
25+
MLFLOW_CLOUDFLARE_SECRET: SecretStr | None = None
2626
MLFLOW_S3_BUCKET: str | None = None
2727
MLFLOW_S3_ENDPOINT_URL: str | None = None
2828
MLFLOW_TRACKING_URI: str | None = None
2929

3030
POSTGRES_USER: str | None = None
31-
POSTGRES_PASSWORD: str | None = None
31+
POSTGRES_PASSWORD: SecretStr | None = None
3232
POSTGRES_HOST: str | None = None
3333
POSTGRES_PORT: NonNegativeInt | None = None
3434
POSTGRES_DB: str | None = None
@@ -38,9 +38,9 @@ class Environ(BaseSettings):
3838
LUXONISML_TEAM_ID: str = "offline"
3939
LUXONISML_DISABLE_SETUP_LOGGING: bool = False
4040

41-
ROBOFLOW_API_KEY: str | None = None
41+
ROBOFLOW_API_KEY: SecretStr | None = None
4242

43-
GOOGLE_APPLICATION_CREDENTIALS: str | None = None
43+
GOOGLE_APPLICATION_CREDENTIALS: SecretStr | None = None
4444

4545
LOG_LEVEL: Literal["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"] = (
4646
"INFO"

luxonis_ml/utils/filesystem.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -152,8 +152,12 @@ def init_fsspec_filesystem(self) -> fsspec.AbstractFileSystem:
152152
# NOTE: In theory boto3 should look in environment variables automatically but it doesn't seem to work
153153
fs = fsspec.filesystem(
154154
self.protocol,
155-
key=environ.AWS_ACCESS_KEY_ID,
156-
secret=environ.AWS_SECRET_ACCESS_KEY,
155+
key=environ.AWS_ACCESS_KEY_ID.get_secret_value()
156+
if environ.AWS_ACCESS_KEY_ID is not None
157+
else None,
158+
secret=environ.AWS_SECRET_ACCESS_KEY.get_secret_value()
159+
if environ.AWS_SECRET_ACCESS_KEY is not None
160+
else None,
157161
endpoint_url=environ.AWS_S3_ENDPOINT_URL,
158162
)
159163
elif self.protocol == "gcs":

tests/test_utils/test_config.py

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
from pydantic import BaseModel
88

99
from luxonis_ml.typing import Params
10-
from luxonis_ml.utils import environ
1110
from luxonis_ml.utils.config import LuxonisConfig
1211

1312
CONFIG_DATA = {
@@ -271,19 +270,6 @@ def test_get(config_file: str):
271270
cfg.get("list_config.index.int_list_param")
272271

273272

274-
def test_environ(monkeypatch: pytest.MonkeyPatch):
275-
monkeypatch.delenv("POSTGRES_HOST", raising=False)
276-
assert environ.POSTGRES_HOST is None
277-
278-
monkeypatch.setenv("POSTGRES_HOST", "first.example.com")
279-
assert environ.POSTGRES_HOST == "first.example.com"
280-
281-
monkeypatch.setenv("POSTGRES_HOST", "second.example.com")
282-
assert environ.POSTGRES_HOST == "second.example.com"
283-
284-
assert environ.model_dump() == {}
285-
286-
287273
def test_safe_load(config_file: str):
288274
cfg = Config.get_config(config_file)
289275
with tempfile.NamedTemporaryFile(delete=False) as f:

tests/test_utils/test_environ.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
from collections.abc import Generator
2+
from pathlib import Path
3+
4+
import pytest
5+
from pydantic import SecretStr
6+
7+
from luxonis_ml.utils.environ import Environ
8+
9+
10+
@pytest.fixture
11+
def dotenv_file(tempdir: Path) -> Generator[Path]:
12+
path = tempdir / "dotenv"
13+
path.write_text("POSTGRES_USER=test\nPOSTGRES_PASSWORD=pass\n")
14+
yield path
15+
path.unlink(missing_ok=True)
16+
17+
18+
def test_environ(dotenv_file: Path):
19+
environ = Environ(
20+
POSTGRES_USER="user",
21+
_env_file=dotenv_file, # type: ignore
22+
)
23+
assert environ.POSTGRES_USER == "user"
24+
assert isinstance(environ.POSTGRES_PASSWORD, SecretStr)
25+
assert environ.POSTGRES_PASSWORD.get_secret_value() == "pass"
26+
27+
assert environ.model_dump() == {}

0 commit comments

Comments
 (0)