FovesConfig 0.1.1__tar.gz → 0.1.2__tar.gz

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.
@@ -13,17 +13,25 @@ class ConfigLoader[T: BaseModel]:
13
13
  else:
14
14
  self.model = self.model_cls()
15
15
 
16
+ def _write(self):
17
+ self.path.parent.mkdir(parents=True, exist_ok=True)
18
+ self.path.write_text(
19
+ self.model.model_dump_json(indent=2, ensure_ascii=False),
20
+ encoding="utf-8",
21
+ )
22
+
16
23
  def readonly(self) -> T:
17
24
  self._read()
18
25
  return self.model
26
+
27
+ def overwrite(self, model: T) -> T:
28
+ self.model = model
29
+ self._write()
30
+ return self.model
19
31
 
20
32
  def __enter__(self) -> T:
21
33
  self._read()
22
34
  return self.model
23
35
 
24
36
  def __exit__(self, exc_type, exc, tb):
25
- self.path.parent.mkdir(parents=True, exist_ok=True)
26
- self.path.write_text(
27
- self.model.model_dump_json(indent=2, ensure_ascii=False),
28
- encoding="utf-8",
29
- )
37
+ self._write()
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: FovesConfig
3
- Version: 0.1.1
3
+ Version: 0.1.2
4
4
  Summary: 四叶的配置管理工具 — 基于 Pydantic 的配置加载器,上下文管理器自动读写
5
5
  Project-URL: Repository, https://github.com/Foves7017/FovesLib
6
6
  Author: Foves7017
@@ -78,10 +78,27 @@ cfg = loader.readonly()
78
78
  print(cfg.host)
79
79
  ```
80
80
 
81
+ ### 覆盖写入
82
+
83
+ 不想进上下文、只想把一份新配置整体写回去时,用 `overwrite()`:调用即落盘,并把这个实例返回给你。
84
+ 一个典型用法(也是我创建这个方法的原因)就是在配置初始化时创建文件。
85
+
86
+ ```Python
87
+ loader = ConfigLoader("config.json", AppConfig)
88
+ cfg = loader.overwrite(AppConfig(port=9090))
89
+ ```
90
+
91
+ - **写入时机**:调用时立刻写,不需要等 `with` 块退出;父目录不存在会自动递归创建。
92
+ - **不会先读取**:所以磁盘上是坏掉的 JSON 也能被直接覆盖。
93
+ - **不做校验**:入参必须是你在 `ConfigLoader` 上声明的那个模型实例。传 `dict`、`None` 之类会直接抛 `AttributeError`(它只会去调 `model_dump_json`);传成别的模型也会被原样写出去。
94
+ - **和 `readonly()` 的关系**:`readonly()` 每次调用都会重新从磁盘读取,因此**以磁盘上最后一次写入的内容为准**。`overwrite()` 之后再 `readonly()`,拿到的是重新反序列化出来的新对象,不是你传进去的那个引用。
95
+
81
96
  ### 读写行为
82
97
 
83
98
  - **读取**:进入上下文管理器时,若文件存在则 `model_validate_json` 反序列化,否则用 `model_cls()` 构造默认实例。
84
99
  - **写入**:退出上下文管理器时自动创建父目录,以 `indent=2`、`ensure_ascii=False` 写出 JSON。
100
+ - **写入实现**:落盘逻辑集中在内部的 `_write()`,上下文退出和 `overwrite()` 共用同一套行为,两者格式完全一致。
101
+ - **异常路径**:`__exit__` 不会吞掉异常,也不会因为异常就跳过写入——块内抛异常时配置依然会写回磁盘。
85
102
 
86
103
  ### 其他
87
104
  如果你发现自己需要手动调用 save() 或 exit(),请先考虑是否应该使用上下文管理器。大多数修改配置的场景都更适合:
@@ -91,4 +108,6 @@ with ConfigLoader(...) as config:
91
108
  ...
92
109
  ```
93
110
 
94
- 而不是手动管理配置对象的生命周期。
111
+ 而不是手动管理配置对象的生命周期。
112
+
113
+ 如果确实需要“不进上下文也要写盘”的场景(例如程序启动时生成一份默认配置、或把外部来源的配置整体落盘),直接用 `overwrite()` 就够了,不必自己造 `save()` / `exit()`。
@@ -46,10 +46,27 @@ cfg = loader.readonly()
46
46
  print(cfg.host)
47
47
  ```
48
48
 
49
+ ### 覆盖写入
50
+
51
+ 不想进上下文、只想把一份新配置整体写回去时,用 `overwrite()`:调用即落盘,并把这个实例返回给你。
52
+ 一个典型用法(也是我创建这个方法的原因)就是在配置初始化时创建文件。
53
+
54
+ ```Python
55
+ loader = ConfigLoader("config.json", AppConfig)
56
+ cfg = loader.overwrite(AppConfig(port=9090))
57
+ ```
58
+
59
+ - **写入时机**:调用时立刻写,不需要等 `with` 块退出;父目录不存在会自动递归创建。
60
+ - **不会先读取**:所以磁盘上是坏掉的 JSON 也能被直接覆盖。
61
+ - **不做校验**:入参必须是你在 `ConfigLoader` 上声明的那个模型实例。传 `dict`、`None` 之类会直接抛 `AttributeError`(它只会去调 `model_dump_json`);传成别的模型也会被原样写出去。
62
+ - **和 `readonly()` 的关系**:`readonly()` 每次调用都会重新从磁盘读取,因此**以磁盘上最后一次写入的内容为准**。`overwrite()` 之后再 `readonly()`,拿到的是重新反序列化出来的新对象,不是你传进去的那个引用。
63
+
49
64
  ### 读写行为
50
65
 
51
66
  - **读取**:进入上下文管理器时,若文件存在则 `model_validate_json` 反序列化,否则用 `model_cls()` 构造默认实例。
52
67
  - **写入**:退出上下文管理器时自动创建父目录,以 `indent=2`、`ensure_ascii=False` 写出 JSON。
68
+ - **写入实现**:落盘逻辑集中在内部的 `_write()`,上下文退出和 `overwrite()` 共用同一套行为,两者格式完全一致。
69
+ - **异常路径**:`__exit__` 不会吞掉异常,也不会因为异常就跳过写入——块内抛异常时配置依然会写回磁盘。
53
70
 
54
71
  ### 其他
55
72
  如果你发现自己需要手动调用 save() 或 exit(),请先考虑是否应该使用上下文管理器。大多数修改配置的场景都更适合:
@@ -59,4 +76,6 @@ with ConfigLoader(...) as config:
59
76
  ...
60
77
  ```
61
78
 
62
- 而不是手动管理配置对象的生命周期。
79
+ 而不是手动管理配置对象的生命周期。
80
+
81
+ 如果确实需要“不进上下文也要写盘”的场景(例如程序启动时生成一份默认配置、或把外部来源的配置整体落盘),直接用 `overwrite()` 就够了,不必自己造 `save()` / `exit()`。
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "FovesConfig"
7
- version = "0.1.1"
7
+ version = "0.1.2"
8
8
  description = "四叶的配置管理工具 — 基于 Pydantic 的配置加载器,上下文管理器自动读写"
9
9
  readme = "README.md"
10
10
  license = {file = "LICENSE"}
File without changes
File without changes