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.
Files changed (69) hide show
  1. {sqlseed-0.1.17 → sqlseed-0.1.19}/CHANGELOG.md +18 -0
  2. {sqlseed-0.1.17 → sqlseed-0.1.19}/CHANGELOG.zh-CN.md +18 -0
  3. {sqlseed-0.1.17 → sqlseed-0.1.19}/PKG-INFO +7 -4
  4. {sqlseed-0.1.17 → sqlseed-0.1.19}/pyproject.toml +4 -3
  5. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/core/mapper.py +21 -1
  6. {sqlseed-0.1.17 → sqlseed-0.1.19}/.gitignore +0 -0
  7. {sqlseed-0.1.17 → sqlseed-0.1.19}/LICENSE +0 -0
  8. {sqlseed-0.1.17 → sqlseed-0.1.19}/README.md +0 -0
  9. {sqlseed-0.1.17 → sqlseed-0.1.19}/README.zh-CN.md +0 -0
  10. {sqlseed-0.1.17 → sqlseed-0.1.19}/examples/build_demo_db.py +0 -0
  11. {sqlseed-0.1.17 → sqlseed-0.1.19}/examples/notebooks/01-quickstart.ipynb +0 -0
  12. {sqlseed-0.1.17 → sqlseed-0.1.19}/examples/notebooks/02-column-mapping.ipynb +0 -0
  13. {sqlseed-0.1.17 → sqlseed-0.1.19}/examples/notebooks/03-generators.ipynb +0 -0
  14. {sqlseed-0.1.17 → sqlseed-0.1.19}/examples/notebooks/04-database-advanced.ipynb +0 -0
  15. {sqlseed-0.1.17 → sqlseed-0.1.19}/examples/notebooks/05-dag-and-constraints.ipynb +0 -0
  16. {sqlseed-0.1.17 → sqlseed-0.1.19}/examples/notebooks/06-config-deep-dive.ipynb +0 -0
  17. {sqlseed-0.1.17 → sqlseed-0.1.19}/examples/notebooks/07-ai-plugin.ipynb +0 -0
  18. {sqlseed-0.1.17 → sqlseed-0.1.19}/examples/notebooks/08-mcp-server.ipynb +0 -0
  19. {sqlseed-0.1.17 → sqlseed-0.1.19}/examples/notebooks/09-plugin-hooks.ipynb +0 -0
  20. {sqlseed-0.1.17 → sqlseed-0.1.19}/examples/notebooks/10-cli-reference.ipynb +0 -0
  21. {sqlseed-0.1.17 → sqlseed-0.1.19}/examples/notebooks/11-utilities.ipynb +0 -0
  22. {sqlseed-0.1.17 → sqlseed-0.1.19}/examples/notebooks/12-testing-patterns.ipynb +0 -0
  23. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/__init__.py +0 -0
  24. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/_utils/__init__.py +0 -0
  25. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/_utils/logger.py +0 -0
  26. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/_utils/metrics.py +0 -0
  27. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/_utils/paths.py +0 -0
  28. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/_utils/progress.py +0 -0
  29. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/_utils/schema_helpers.py +0 -0
  30. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/_utils/sql_safe.py +0 -0
  31. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/_version.py +0 -0
  32. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/cli/__init__.py +0 -0
  33. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/cli/main.py +0 -0
  34. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/config/__init__.py +0 -0
  35. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/config/loader.py +0 -0
  36. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/config/models.py +0 -0
  37. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/config/snapshot.py +0 -0
  38. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/core/__init__.py +0 -0
  39. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/core/column_dag.py +0 -0
  40. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/core/constraints.py +0 -0
  41. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/core/enrichment.py +0 -0
  42. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/core/expression.py +0 -0
  43. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/core/orchestrator.py +0 -0
  44. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/core/plugin_mediator.py +0 -0
  45. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/core/relation.py +0 -0
  46. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/core/result.py +0 -0
  47. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/core/schema.py +0 -0
  48. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/core/transform.py +0 -0
  49. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/core/unique_adjuster.py +0 -0
  50. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/database/__init__.py +0 -0
  51. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/database/_base_adapter.py +0 -0
  52. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/database/_compat.py +0 -0
  53. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/database/_helpers.py +0 -0
  54. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/database/_protocol.py +0 -0
  55. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/database/optimizer.py +0 -0
  56. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/database/raw_sqlite_adapter.py +0 -0
  57. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/database/sqlite_utils_adapter.py +0 -0
  58. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/generators/__init__.py +0 -0
  59. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/generators/_dispatch.py +0 -0
  60. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/generators/_json_helpers.py +0 -0
  61. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/generators/_protocol.py +0 -0
  62. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/generators/_string_helpers.py +0 -0
  63. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/generators/base_provider.py +0 -0
  64. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/generators/faker_provider.py +0 -0
  65. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/generators/mimesis_provider.py +0 -0
  66. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/generators/registry.py +0 -0
  67. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/generators/stream.py +0 -0
  68. {sqlseed-0.1.17 → sqlseed-0.1.19}/src/sqlseed/py.typed +0 -0
  69. {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.17
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: notebook
55
- Requires-Dist: tqdm>=4.66; extra == 'notebook'
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
- notebook = ["tqdm>=4.66"]
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
- (r"(?i).*_no$|.*_nbr$|.*[A-Z]no$|.*[A-Z]nbr$", "foreign_key_or_integer", {}),
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