sqlseed 0.1.17__tar.gz → 0.1.19__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.
- {sqlseed-0.1.17 → sqlseed-0.1.19}/CHANGELOG.md +18 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/CHANGELOG.zh-CN.md +18 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/PKG-INFO +7 -4
- {sqlseed-0.1.17 → sqlseed-0.1.19}/pyproject.toml +4 -3
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/core/mapper.py +21 -1
- {sqlseed-0.1.17 → sqlseed-0.1.19}/.gitignore +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/LICENSE +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/README.md +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/README.zh-CN.md +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/examples/build_demo_db.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/examples/notebooks/01-quickstart.ipynb +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/examples/notebooks/02-column-mapping.ipynb +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/examples/notebooks/03-generators.ipynb +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/examples/notebooks/04-database-advanced.ipynb +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/examples/notebooks/05-dag-and-constraints.ipynb +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/examples/notebooks/06-config-deep-dive.ipynb +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/examples/notebooks/07-ai-plugin.ipynb +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/examples/notebooks/08-mcp-server.ipynb +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/examples/notebooks/09-plugin-hooks.ipynb +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/examples/notebooks/10-cli-reference.ipynb +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/examples/notebooks/11-utilities.ipynb +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/examples/notebooks/12-testing-patterns.ipynb +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/__init__.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/_utils/__init__.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/_utils/logger.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/_utils/metrics.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/_utils/paths.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/_utils/progress.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/_utils/schema_helpers.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/_utils/sql_safe.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/_version.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/cli/__init__.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/cli/main.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/config/__init__.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/config/loader.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/config/models.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/config/snapshot.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/core/__init__.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/core/column_dag.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/core/constraints.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/core/enrichment.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/core/expression.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/core/orchestrator.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/core/plugin_mediator.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/core/relation.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/core/result.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/core/schema.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/core/transform.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/core/unique_adjuster.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/database/__init__.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/database/_base_adapter.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/database/_compat.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/database/_helpers.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/database/_protocol.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/database/optimizer.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/database/raw_sqlite_adapter.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/database/sqlite_utils_adapter.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/generators/__init__.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/generators/_dispatch.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/generators/_json_helpers.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/generators/_protocol.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/generators/_string_helpers.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/generators/base_provider.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/generators/faker_provider.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/generators/mimesis_provider.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/generators/registry.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/generators/stream.py +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/py.typed +0 -0
- {sqlseed-0.1.17 → sqlseed-0.1.19}/uv.lock +0 -0
|
@@ -7,6 +7,24 @@ All notable changes to this project will be documented in this file.
|
|
|
7
7
|
Format based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
8
8
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
9
9
|
|
|
10
|
+
## [v0.1.19]
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- Column mapper `_to_snake_case()` normalization: camelCase/PascalCase/Hungarian column names (`sOrderNo`, `sItemNo`, `userName`, `isActive`) now auto-resolve via snake-case fallback after direct matching
|
|
15
|
+
- Sensitive identifier pattern rule: `user_no`, `card_no`, `card_number`, `identity_no` (and Hungarian variants `sUserNo`, `sCardNo`) map to masked string output instead of `foreign_key_or_integer`, preventing real values from leaking through FK resolution
|
|
16
|
+
- `tests/test_mapper_camelcase.py` — 23 test cases covering camelCase mapping, sensitive field desensitization, and `_to_snake_case()` helper
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
|
|
20
|
+
- `pyproject.toml`: moved `sqlite-utils` from required to optional dependency (matches `HAS_SQLITE_UTILS` fallback logic)
|
|
21
|
+
- `pyproject.toml`: renamed `notebook` optional dep group to `tqdm` for clarity
|
|
22
|
+
- `pyproject.toml`: restored `plugins/` to sdist exclude; added sdist exclude configs to plugin `pyproject.toml` files
|
|
23
|
+
|
|
24
|
+
### Fixed
|
|
25
|
+
|
|
26
|
+
- `test_fill_with_snapshot` now sets `SQLSEED_CACHE_DIR` to `tmp_path` via `monkeypatch.setenv`, fixing `PermissionError` when default cache directory is not writable
|
|
27
|
+
|
|
10
28
|
## [v0.1.17]
|
|
11
29
|
|
|
12
30
|
### Added
|
|
@@ -7,6 +7,24 @@
|
|
|
7
7
|
格式基于 [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
8
8
|
本项目遵循[语义化版本](https://semver.org/spec/v2.0.0.html)。
|
|
9
9
|
|
|
10
|
+
## [v0.1.19]
|
|
11
|
+
|
|
12
|
+
### 新增
|
|
13
|
+
|
|
14
|
+
- 列映射器 `_to_snake_case()` 规范化:camelCase/PascalCase/Hungarian 列名(`sOrderNo`、`sItemNo`、`userName`、`isActive`)在直接匹配失败后自动通过 snake_case 回退解析
|
|
15
|
+
- 敏感标识符模式规则:`user_no`、`card_no`、`card_number`、`identity_no`(及 Hungarian 变体 `sUserNo`、`sCardNo`)映射为脱敏字符串,防止真实值通过 FK 解析或 SharedPool 泄露
|
|
16
|
+
- `tests/test_mapper_camelcase.py` — 23 个测试用例,覆盖 camelCase 映射、敏感字段脱敏和 `_to_snake_case()` 辅助函数
|
|
17
|
+
|
|
18
|
+
### 变更
|
|
19
|
+
|
|
20
|
+
- `pyproject.toml`:`sqlite-utils` 从必需依赖移至可选依赖(与 `HAS_SQLITE_UTILS` 回退逻辑一致)
|
|
21
|
+
- `pyproject.toml`:可选依赖组 `notebook` 重命名为 `tqdm`
|
|
22
|
+
- `pyproject.toml`:恢复 `plugins/` 到 sdist 排除列表;插件 `pyproject.toml` 新增 sdist 排除配置
|
|
23
|
+
|
|
24
|
+
### 修复
|
|
25
|
+
|
|
26
|
+
- `test_fill_with_snapshot` 通过 `monkeypatch.setenv` 将 `SQLSEED_CACHE_DIR` 设置为 `tmp_path`,修复默认缓存目录无写入权限时的 `PermissionError`
|
|
27
|
+
|
|
10
28
|
## [v0.1.17]
|
|
11
29
|
|
|
12
30
|
### 新增
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sqlseed
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.19
|
|
4
4
|
Summary: Declarative SQLite test data generation toolkit
|
|
5
5
|
Project-URL: Homepage, https://github.com/sunbos/sqlseed
|
|
6
6
|
Project-URL: Documentation, https://github.com/sunbos/sqlseed#readme
|
|
@@ -28,12 +28,12 @@ Requires-Dist: pyyaml>=6.0
|
|
|
28
28
|
Requires-Dist: rich>=13.0
|
|
29
29
|
Requires-Dist: rstr>=3.2
|
|
30
30
|
Requires-Dist: simpleeval>=1.0
|
|
31
|
-
Requires-Dist: sqlite-utils>=3.36
|
|
32
31
|
Requires-Dist: structlog>=24.0
|
|
33
32
|
Requires-Dist: typing-extensions>=4.4
|
|
34
33
|
Provides-Extra: all
|
|
35
34
|
Requires-Dist: faker>=30.0; extra == 'all'
|
|
36
35
|
Requires-Dist: mimesis>=18.0; extra == 'all'
|
|
36
|
+
Requires-Dist: sqlite-utils>=3.36; extra == 'all'
|
|
37
37
|
Requires-Dist: tqdm>=4.66; extra == 'all'
|
|
38
38
|
Provides-Extra: dev
|
|
39
39
|
Requires-Dist: mypy>=1.10; extra == 'dev'
|
|
@@ -43,6 +43,7 @@ Requires-Dist: pytest-benchmark>=4.0; extra == 'dev'
|
|
|
43
43
|
Requires-Dist: pytest-cov>=5.0; extra == 'dev'
|
|
44
44
|
Requires-Dist: pytest>=8.0; extra == 'dev'
|
|
45
45
|
Requires-Dist: ruff>=0.5; extra == 'dev'
|
|
46
|
+
Requires-Dist: sqlite-utils>=3.36; extra == 'dev'
|
|
46
47
|
Requires-Dist: tqdm>=4.66; extra == 'dev'
|
|
47
48
|
Provides-Extra: docs
|
|
48
49
|
Requires-Dist: mkdocs-material>=9.0; extra == 'docs'
|
|
@@ -51,8 +52,10 @@ Provides-Extra: faker
|
|
|
51
52
|
Requires-Dist: faker>=30.0; extra == 'faker'
|
|
52
53
|
Provides-Extra: mimesis
|
|
53
54
|
Requires-Dist: mimesis>=18.0; extra == 'mimesis'
|
|
54
|
-
Provides-Extra:
|
|
55
|
-
Requires-Dist:
|
|
55
|
+
Provides-Extra: sqlite-utils
|
|
56
|
+
Requires-Dist: sqlite-utils>=3.36; extra == 'sqlite-utils'
|
|
57
|
+
Provides-Extra: tqdm
|
|
58
|
+
Requires-Dist: tqdm>=4.66; extra == 'tqdm'
|
|
56
59
|
Description-Content-Type: text/markdown
|
|
57
60
|
|
|
58
61
|
<div align="center">
|
|
@@ -27,7 +27,6 @@ classifiers = [
|
|
|
27
27
|
]
|
|
28
28
|
|
|
29
29
|
dependencies = [
|
|
30
|
-
"sqlite-utils>=3.36",
|
|
31
30
|
"pydantic>=2.0",
|
|
32
31
|
"pluggy>=1.3",
|
|
33
32
|
"structlog>=24.0",
|
|
@@ -46,11 +45,13 @@ Repository = "https://github.com/sunbos/sqlseed"
|
|
|
46
45
|
Issues = "https://github.com/sunbos/sqlseed/issues"
|
|
47
46
|
|
|
48
47
|
[project.optional-dependencies]
|
|
48
|
+
sqlite-utils = ["sqlite-utils>=3.36"]
|
|
49
49
|
faker = ["faker>=30.0"]
|
|
50
50
|
mimesis = ["mimesis>=18.0"]
|
|
51
|
-
|
|
52
|
-
all = ["faker>=30.0", "mimesis>=18.0", "tqdm>=4.66"]
|
|
51
|
+
tqdm = ["tqdm>=4.66"]
|
|
52
|
+
all = ["sqlite-utils>=3.36", "faker>=30.0", "mimesis>=18.0", "tqdm>=4.66"]
|
|
53
53
|
dev = [
|
|
54
|
+
"sqlite-utils>=3.36",
|
|
54
55
|
"pytest>=8.0",
|
|
55
56
|
"pytest-cov>=5.0",
|
|
56
57
|
"pytest-asyncio>=0.24",
|
|
@@ -130,7 +130,12 @@ class ColumnMapper:
|
|
|
130
130
|
PATTERN_MATCH_RULES: ClassVar[list[tuple[str, str, dict[str, Any]]]] = [
|
|
131
131
|
(r"^id$", "autoincrement", {}),
|
|
132
132
|
(r".*_id$", "foreign_key_or_integer", {}),
|
|
133
|
-
(
|
|
133
|
+
(
|
|
134
|
+
r".*(?:user|card|identity)(?:_no|_number|_nbr)$",
|
|
135
|
+
"string",
|
|
136
|
+
{"min_length": 8, "max_length": 20, "charset": "alphanumeric"},
|
|
137
|
+
),
|
|
138
|
+
(r".*_no$|.*_nbr$", "foreign_key_or_integer", {}),
|
|
134
139
|
(r".*_ids$", "json", {}),
|
|
135
140
|
(r".*_at$", "datetime", {}),
|
|
136
141
|
(r".*_date$", "date", {}),
|
|
@@ -255,6 +260,12 @@ class ColumnMapper:
|
|
|
255
260
|
return GeneratorSpec(generator_name="skip")
|
|
256
261
|
return None
|
|
257
262
|
|
|
263
|
+
_CAMELCASE_RE: ClassVar[re.Pattern[str]] = re.compile(r"(?<=[a-z0-9])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])")
|
|
264
|
+
|
|
265
|
+
@classmethod
|
|
266
|
+
def _to_snake_case(cls, name: str) -> str:
|
|
267
|
+
return cls._CAMELCASE_RE.sub("_", name).lower()
|
|
268
|
+
|
|
258
269
|
def map_column(
|
|
259
270
|
self,
|
|
260
271
|
column_info: ColumnInfo,
|
|
@@ -287,6 +298,15 @@ class ColumnMapper:
|
|
|
287
298
|
if pattern_match:
|
|
288
299
|
return pattern_match
|
|
289
300
|
|
|
301
|
+
snake_name = self._to_snake_case(column_info.name)
|
|
302
|
+
if snake_name != column_name:
|
|
303
|
+
snake_exact = self._match_exact(snake_name)
|
|
304
|
+
if snake_exact:
|
|
305
|
+
return snake_exact
|
|
306
|
+
snake_pattern = self._match_pattern(snake_name)
|
|
307
|
+
if snake_pattern:
|
|
308
|
+
return snake_pattern
|
|
309
|
+
|
|
290
310
|
fallback_spec = self._map_from_default_or_nullable(column_info, column_type, enrich, force_type_infer)
|
|
291
311
|
if fallback_spec:
|
|
292
312
|
return fallback_spec
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|