oe-python-template 0.14.0__py3-none-any.whl → 0.14.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -194,7 +194,7 @@ def fail() -> None:
194
194
 
195
195
  @cli.command()
196
196
  def sleep(
197
- seconds: Annotated[int, typer.Option(help="Duration in seconds")] = 10,
197
+ seconds: Annotated[int, typer.Option(help="Duration in seconds")] = 2,
198
198
  ) -> None:
199
199
  """Sleep given for given number of seconds.
200
200
 
@@ -12,6 +12,7 @@ from ._constants import (
12
12
  __env_file__,
13
13
  __is_development_mode__,
14
14
  __is_running_in_container__,
15
+ __is_running_in_read_only_environment__,
15
16
  __project_name__,
16
17
  __project_path__,
17
18
  __repository_url__,
@@ -46,6 +47,7 @@ __all__ = [
46
47
  "__env_file__",
47
48
  "__is_development_mode__",
48
49
  "__is_running_in_container__",
50
+ "__is_running_in_read_only_environment__",
49
51
  "__project_name__",
50
52
  "__project_path__",
51
53
  "__repository_url__",
@@ -15,6 +15,14 @@ __version__ = metadata.version(__project_name__)
15
15
  __is_development_mode__ = "uvx" not in sys.argv[0].lower()
16
16
  __is_running_in_container__ = os.getenv(f"{__project_name__.upper()}_RUNNING_IN_CONTAINER")
17
17
 
18
+ # Determine if we're running in a read-only runtime environment
19
+ READ_ONLY_ENV_INDICATORS = [
20
+ f"{__project_name__.upper()}_RUNNING_IN_CONTAINER",
21
+ "VERCEL_ENV",
22
+ "RAILWAY_ENVIRONMENT",
23
+ ]
24
+ __is_running_in_read_only_environment__ = any(os.getenv(env_var) is not None for env_var in READ_ONLY_ENV_INDICATORS)
25
+
18
26
  # Determine environment we are deployed on
19
27
  ENV_VAR_MAPPINGS = {
20
28
  "ENV": lambda env: env,
@@ -14,7 +14,7 @@ from pydantic_settings import BaseSettings, SettingsConfigDict
14
14
  from rich.console import Console
15
15
  from rich.logging import RichHandler
16
16
 
17
- from ._constants import __env_file__, __project_name__
17
+ from ._constants import __env_file__, __is_running_in_read_only_environment__, __project_name__
18
18
  from ._settings import load_settings
19
19
 
20
20
 
@@ -54,15 +54,15 @@ def _validate_file_name(file_name: str | None) -> str | None:
54
54
 
55
55
  file_path = Path(file_name)
56
56
  if file_path.exists():
57
- if not file_path.is_file():
58
- message = f"File name {file_path.absolute()} is not a file"
57
+ if not file_path.is_file() and not file_path.is_symlink():
58
+ message = f"File name {file_path.absolute()} is not a file or symlink"
59
59
  raise ValueError(message)
60
60
  if not os.access(file_path, os.W_OK):
61
61
  message = f"File {file_path.absolute()} is not writable"
62
62
  raise ValueError(message)
63
63
  else:
64
64
  try:
65
- file_path.touch(exist_ok=False)
65
+ file_path.touch(exist_ok=True)
66
66
  file_path.unlink()
67
67
  except OSError as e:
68
68
  message = f"File {file_path.absolute()} cannot be created: {e}"
@@ -92,7 +92,10 @@ class LogSettings(BaseSettings):
92
92
  file_name: Annotated[
93
93
  str,
94
94
  AfterValidator(_validate_file_name),
95
- Field(description="Name of the log file", default=f"{__project_name__}.log"),
95
+ Field(
96
+ description="Name of the log file",
97
+ default="/dev/stdout" if __is_running_in_read_only_environment__ else f"{__project_name__}.log",
98
+ ),
96
99
  ]
97
100
  console_enabled: Annotated[
98
101
  bool,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: oe-python-template
3
- Version: 0.14.0
3
+ Version: 0.14.2
4
4
  Summary: 🧠 Copier template to scaffold Python projects compliant with best practices and modern tooling.
5
5
  Project-URL: Homepage, https://oe-python-template.readthedocs.io/en/latest/
6
6
  Project-URL: Documentation, https://oe-python-template.readthedocs.io/en/latest/
@@ -12,19 +12,19 @@ oe_python_template/hello/_service.py,sha256=22-IqNpra43IQcdeZNnzY4uhdPZmlXL6mCsL
12
12
  oe_python_template/hello/_settings.py,sha256=_85PIdq8UuS4orCZ0qFJ22RTQTooOTB0USRxBapBK3M,1533
13
13
  oe_python_template/system/__init__.py,sha256=7e2z8HATzy3dAIBXy5PM9rlCC7Rbu8m8NapROdrf3Wk,624
14
14
  oe_python_template/system/_api.py,sha256=rE9Aau3IIHXdEkOBUXOwJ7SxN3cZpgtYEuojnSWfT_4,3687
15
- oe_python_template/system/_cli.py,sha256=D19TuXtGGmxzQ-VkmCD7fmuqKQ5TQoJq9O0VzJKvWVE,6960
15
+ oe_python_template/system/_cli.py,sha256=0cGwSicK0j7P53SMm9nSyQqj0WYpHKvFvkISCcjeTPU,6959
16
16
  oe_python_template/system/_gui.py,sha256=uKI-tlBSJXMaxY79wgdYtMttEyu8BLQC1UQLEPOcoZg,653
17
17
  oe_python_template/system/_service.py,sha256=f-EtWEAanajo4S2KeGm26K9_RezYgPza1qVqPRBOFvY,6376
18
18
  oe_python_template/system/_settings.py,sha256=MwMAJYifJ6jGImeSh4e9shmIXmiUSuQGHXz_Ts0mSdk,901
19
- oe_python_template/utils/__init__.py,sha256=ggcc7xvH6MJ3kP45lfjmp8yZSPDTeQRaQYbZbG0M7yM,1924
19
+ oe_python_template/utils/__init__.py,sha256=jYGR60l2tiT2OZHVwrN6e2bJhCFOCeUT-I68h0pZkao,2016
20
20
  oe_python_template/utils/_api.py,sha256=w3hPQK1pL2gBI4_1qNWNa2b4S_oH-8mY-ckRX0KrCWM,617
21
21
  oe_python_template/utils/_cli.py,sha256=J_mFtXZ1gGeovGrE5i3wlokTOBfiTTKEz5magiRP7GA,2091
22
22
  oe_python_template/utils/_console.py,sha256=u0-utcdRmVu4rabrYUyNOx8yPxLhxB3E92m22kSCwPQ,293
23
- oe_python_template/utils/_constants.py,sha256=FRe5ZNaBwpBPwOHZVWYOlI-ijamfzdBVr8gl7gHMGT0,2932
23
+ oe_python_template/utils/_constants.py,sha256=fPS1leVqg7NRo_FFE3Xs3QI7un5_YRrY8cKQAfThwgg,3247
24
24
  oe_python_template/utils/_di.py,sha256=KdjiD4xZ_QSfbddkKWwsPJmG5YrIg6dzuBrlsd-FhxA,2189
25
25
  oe_python_template/utils/_gui.py,sha256=PmMTSmUOxbf6pmYCIgKrK5wNheh35aGd90I12y3L7Uc,5720
26
26
  oe_python_template/utils/_health.py,sha256=35QOWe2r5InrEpGtuVMym9dI5aRHS0HWf4BHBRAUIj0,4102
27
- oe_python_template/utils/_log.py,sha256=5tMW1xY_FlpPEfZNeaTCdngBF3FKp8VWmQatt4_7RFU,4863
27
+ oe_python_template/utils/_log.py,sha256=9aalm3FzkIgx38Em4a49m5SrXvg0DiTzodTPTICUNuc,5042
28
28
  oe_python_template/utils/_logfire.py,sha256=wZYNVowQx7kh3XJoJ59FjUKdrta7tp6cXOJRUT6lDU8,2128
29
29
  oe_python_template/utils/_notebook.py,sha256=oBQw9IBcXjuhzd1ECfOEPN4WJHGOm9xiPtrs11GtWG4,1777
30
30
  oe_python_template/utils/_process.py,sha256=40R0NZMqJUn0iUPERzohSUpJgU1HcJApIg1HipIxFCw,941
@@ -33,8 +33,8 @@ oe_python_template/utils/_service.py,sha256=atHAejvBucKXjzhsMSdOBBFa7rRD74zcV70P
33
33
  oe_python_template/utils/_settings.py,sha256=owFoaHEzJnVD3EVyOWF4rfIY7g6eLnU6rN0m4VHhCbA,2464
34
34
  oe_python_template/utils/boot.py,sha256=Qgq1sjT8d3fcfibnMyx5CVUJ_KKXgFI3ozZUIJbhh4I,2921
35
35
  oe_python_template/utils/.vendored/bottle.py,sha256=kZAZmh3nRzCUf-9IKGpv0yqlMciZMA_DNaaMDdcQmt0,175437
36
- oe_python_template-0.14.0.dist-info/METADATA,sha256=Wh1-2sJe-H5Dk11_X72hMRvXkErIcsBkNy_ndCKEuPI,34475
37
- oe_python_template-0.14.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
38
- oe_python_template-0.14.0.dist-info/entry_points.txt,sha256=IroSSWhLGxus9rxcashkYQda39TTvf7LbUMYtOKXUBE,66
39
- oe_python_template-0.14.0.dist-info/licenses/LICENSE,sha256=5H409K6xzz9U5eUaoAHQExNkoWJRlU0LEj6wL2QJ34s,1113
40
- oe_python_template-0.14.0.dist-info/RECORD,,
36
+ oe_python_template-0.14.2.dist-info/METADATA,sha256=9jHC5kAbcOQZFBHDluyrDeo2y35pPuUX7JCfJBPqtiY,34475
37
+ oe_python_template-0.14.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
38
+ oe_python_template-0.14.2.dist-info/entry_points.txt,sha256=IroSSWhLGxus9rxcashkYQda39TTvf7LbUMYtOKXUBE,66
39
+ oe_python_template-0.14.2.dist-info/licenses/LICENSE,sha256=5H409K6xzz9U5eUaoAHQExNkoWJRlU0LEj6wL2QJ34s,1113
40
+ oe_python_template-0.14.2.dist-info/RECORD,,