Skip to content
This repository was archived by the owner on Jul 2, 2024. It is now read-only.

Commit b5b614d

Browse files
WarpedPixelWarpedPixel
WarpedPixel
authored and
WarpedPixel
committed
Can't read Pydantic Settings from stdin
Fixes pydantic#296 Adds a method _read_env_file to DotEnvSettingsSource that can be easily overridden. This fix keeps a global function so it can continue to be tested, but adds an underscore to the name. The plain read_env_file is marked as deprecated.
1 parent 7ede0ec commit b5b614d

File tree

2 files changed

+38
-13
lines changed

2 files changed

+38
-13
lines changed

Diff for: pydantic_settings/sources.py

+34-9
Original file line numberDiff line numberDiff line change
@@ -753,6 +753,18 @@ def __init__(
753753
def _load_env_vars(self) -> Mapping[str, str | None]:
754754
return self._read_env_files()
755755

756+
def _read_env_file(
757+
self,
758+
file_path: Path,
759+
) -> Mapping[str, str | None]:
760+
return _read_env_file(
761+
file_path,
762+
encoding=self.env_file_encoding,
763+
case_sensitive=self.case_sensitive,
764+
ignore_empty=self.env_ignore_empty,
765+
parse_none_str=self.env_parse_none_str,
766+
)
767+
756768
def _read_env_files(self) -> Mapping[str, str | None]:
757769
env_files = self.env_file
758770
if env_files is None:
@@ -765,15 +777,7 @@ def _read_env_files(self) -> Mapping[str, str | None]:
765777
for env_file in env_files:
766778
env_path = Path(env_file).expanduser()
767779
if env_path.is_file():
768-
dotenv_vars.update(
769-
read_env_file(
770-
env_path,
771-
encoding=self.env_file_encoding,
772-
case_sensitive=self.case_sensitive,
773-
ignore_empty=self.env_ignore_empty,
774-
parse_none_str=self.env_parse_none_str,
775-
)
776-
)
780+
dotenv_vars.update(self._read_env_file(env_path))
777781

778782
return dotenv_vars
779783

@@ -1708,6 +1712,27 @@ def read_env_file(
17081712
case_sensitive: bool = False,
17091713
ignore_empty: bool = False,
17101714
parse_none_str: str | None = None,
1715+
) -> Mapping[str, str | None]:
1716+
warnings.warn(
1717+
'read_env_file will be removed in the next version, use DotEnvSettingsSource._read_env_file instead',
1718+
DeprecationWarning,
1719+
)
1720+
return _read_env_file(
1721+
file_path,
1722+
encoding=encoding,
1723+
case_sensitive=case_sensitive,
1724+
ignore_empty=ignore_empty,
1725+
parse_none_str=parse_none_str,
1726+
)
1727+
1728+
1729+
def _read_env_file(
1730+
file_path: Path,
1731+
*,
1732+
encoding: str | None = None,
1733+
case_sensitive: bool = False,
1734+
ignore_empty: bool = False,
1735+
parse_none_str: str | None = None,
17111736
) -> Mapping[str, str | None]:
17121737
file_vars: dict[str, str | None] = dotenv_values(file_path, encoding=encoding or 'utf8')
17131738
return parse_env_vars(file_vars, case_sensitive, ignore_empty, parse_none_str)

Diff for: tests/test_settings.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
TomlConfigSettingsSource,
5050
YamlConfigSettingsSource,
5151
)
52-
from pydantic_settings.sources import CliPositionalArg, CliSettingsSource, CliSubCommand, SettingsError, read_env_file
52+
from pydantic_settings.sources import CliPositionalArg, CliSettingsSource, CliSubCommand, SettingsError, _read_env_file
5353

5454
try:
5555
import dotenv
@@ -1039,15 +1039,15 @@ def test_read_env_file_case_sensitive(tmp_path):
10391039
p = tmp_path / '.env'
10401040
p.write_text('a="test"\nB=123')
10411041

1042-
assert read_env_file(p) == {'a': 'test', 'b': '123'}
1043-
assert read_env_file(p, case_sensitive=True) == {'a': 'test', 'B': '123'}
1042+
assert _read_env_file(p) == {'a': 'test', 'b': '123'}
1043+
assert _read_env_file(p, case_sensitive=True) == {'a': 'test', 'B': '123'}
10441044

10451045

10461046
def test_read_env_file_syntax_wrong(tmp_path):
10471047
p = tmp_path / '.env'
10481048
p.write_text('NOT_AN_ASSIGNMENT')
10491049

1050-
assert read_env_file(p, case_sensitive=True) == {'NOT_AN_ASSIGNMENT': None}
1050+
assert _read_env_file(p, case_sensitive=True) == {'NOT_AN_ASSIGNMENT': None}
10511051

10521052

10531053
def test_env_file_example(tmp_path):

0 commit comments

Comments
 (0)