sqlseed 0.2.0__tar.gz → 0.2.1__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 (74) hide show
  1. {sqlseed-0.2.0 → sqlseed-0.2.1}/PKG-INFO +1 -1
  2. {sqlseed-0.2.0 → sqlseed-0.2.1}/pyproject.toml +2 -1
  3. sqlseed-0.2.1/src/sqlseed/plugins/__init__.py +12 -0
  4. sqlseed-0.2.1/src/sqlseed/plugins/hookspecs.py +119 -0
  5. sqlseed-0.2.1/src/sqlseed/plugins/manager.py +37 -0
  6. {sqlseed-0.2.0 → sqlseed-0.2.1}/.gitignore +0 -0
  7. {sqlseed-0.2.0 → sqlseed-0.2.1}/CHANGELOG.md +0 -0
  8. {sqlseed-0.2.0 → sqlseed-0.2.1}/CHANGELOG.zh-CN.md +0 -0
  9. {sqlseed-0.2.0 → sqlseed-0.2.1}/LICENSE +0 -0
  10. {sqlseed-0.2.0 → sqlseed-0.2.1}/README.md +0 -0
  11. {sqlseed-0.2.0 → sqlseed-0.2.1}/README.zh-CN.md +0 -0
  12. {sqlseed-0.2.0 → sqlseed-0.2.1}/examples/build_demo_db.py +0 -0
  13. {sqlseed-0.2.0 → sqlseed-0.2.1}/examples/notebooks/01-quickstart.ipynb +0 -0
  14. {sqlseed-0.2.0 → sqlseed-0.2.1}/examples/notebooks/02-column-mapping.ipynb +0 -0
  15. {sqlseed-0.2.0 → sqlseed-0.2.1}/examples/notebooks/03-generators.ipynb +0 -0
  16. {sqlseed-0.2.0 → sqlseed-0.2.1}/examples/notebooks/04-database-advanced.ipynb +0 -0
  17. {sqlseed-0.2.0 → sqlseed-0.2.1}/examples/notebooks/05-dag-and-constraints.ipynb +0 -0
  18. {sqlseed-0.2.0 → sqlseed-0.2.1}/examples/notebooks/06-config-deep-dive.ipynb +0 -0
  19. {sqlseed-0.2.0 → sqlseed-0.2.1}/examples/notebooks/07-ai-plugin.ipynb +0 -0
  20. {sqlseed-0.2.0 → sqlseed-0.2.1}/examples/notebooks/08-mcp-server.ipynb +0 -0
  21. {sqlseed-0.2.0 → sqlseed-0.2.1}/examples/notebooks/09-plugin-hooks.ipynb +0 -0
  22. {sqlseed-0.2.0 → sqlseed-0.2.1}/examples/notebooks/10-cli-reference.ipynb +0 -0
  23. {sqlseed-0.2.0 → sqlseed-0.2.1}/examples/notebooks/11-utilities.ipynb +0 -0
  24. {sqlseed-0.2.0 → sqlseed-0.2.1}/examples/notebooks/12-testing-patterns.ipynb +0 -0
  25. {sqlseed-0.2.0 → sqlseed-0.2.1}/scripts/_create_demo_db.py +0 -0
  26. {sqlseed-0.2.0 → sqlseed-0.2.1}/scripts/quickstart.py +0 -0
  27. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/__init__.py +0 -0
  28. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/_utils/__init__.py +0 -0
  29. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/_utils/logger.py +0 -0
  30. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/_utils/metrics.py +0 -0
  31. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/_utils/paths.py +0 -0
  32. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/_utils/progress.py +0 -0
  33. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/_utils/schema_helpers.py +0 -0
  34. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/_utils/sql_safe.py +0 -0
  35. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/_version.py +0 -0
  36. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/cli/__init__.py +0 -0
  37. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/cli/main.py +0 -0
  38. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/config/__init__.py +0 -0
  39. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/config/loader.py +0 -0
  40. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/config/models.py +0 -0
  41. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/config/snapshot.py +0 -0
  42. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/core/__init__.py +0 -0
  43. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/core/column_dag.py +0 -0
  44. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/core/constraints.py +0 -0
  45. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/core/enrichment.py +0 -0
  46. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/core/expression.py +0 -0
  47. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/core/mapper.py +0 -0
  48. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/core/orchestrator.py +0 -0
  49. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/core/plugin_mediator.py +0 -0
  50. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/core/relation.py +0 -0
  51. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/core/result.py +0 -0
  52. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/core/schema.py +0 -0
  53. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/core/transform.py +0 -0
  54. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/core/unique_adjuster.py +0 -0
  55. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/database/__init__.py +0 -0
  56. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/database/_base_adapter.py +0 -0
  57. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/database/_compat.py +0 -0
  58. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/database/_helpers.py +0 -0
  59. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/database/_protocol.py +0 -0
  60. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/database/optimizer.py +0 -0
  61. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/database/raw_sqlite_adapter.py +0 -0
  62. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/database/sqlite_utils_adapter.py +0 -0
  63. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/generators/__init__.py +0 -0
  64. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/generators/_dispatch.py +0 -0
  65. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/generators/_json_helpers.py +0 -0
  66. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/generators/_protocol.py +0 -0
  67. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/generators/_string_helpers.py +0 -0
  68. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/generators/base_provider.py +0 -0
  69. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/generators/faker_provider.py +0 -0
  70. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/generators/mimesis_provider.py +0 -0
  71. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/generators/registry.py +0 -0
  72. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/generators/stream.py +0 -0
  73. {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/py.typed +0 -0
  74. {sqlseed-0.2.0 → sqlseed-0.2.1}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlseed
3
- Version: 0.2.0
3
+ Version: 0.2.1
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
@@ -84,7 +84,8 @@ packages = ["src/sqlseed"]
84
84
  exclude = [
85
85
  "docs/",
86
86
  "tests/",
87
- "plugins/",
87
+ "plugins/sqlseed-ai/",
88
+ "plugins/mcp-server-sqlseed/",
88
89
  ".github/",
89
90
  ".trae/",
90
91
  ".gemini/",
@@ -0,0 +1,12 @@
1
+ from __future__ import annotations
2
+
3
+ from sqlseed.plugins.hookspecs import PROJECT_NAME, SqlseedHookSpec, hookimpl, hookspec
4
+ from sqlseed.plugins.manager import PluginManager
5
+
6
+ __all__ = [
7
+ "PROJECT_NAME",
8
+ "PluginManager",
9
+ "SqlseedHookSpec",
10
+ "hookimpl",
11
+ "hookspec",
12
+ ]
@@ -0,0 +1,119 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Any
4
+
5
+ import pluggy
6
+
7
+ hookspec = pluggy.HookspecMarker("sqlseed")
8
+ hookimpl = pluggy.HookimplMarker("sqlseed")
9
+
10
+ PROJECT_NAME = "sqlseed"
11
+
12
+
13
+ class SqlseedHookSpec:
14
+ @hookspec
15
+ def sqlseed_register_providers(self, registry: Any) -> None:
16
+ raise NotImplementedError
17
+
18
+ @hookspec
19
+ def sqlseed_register_column_mappers(self, mapper: Any) -> None:
20
+ raise NotImplementedError
21
+
22
+ @hookspec(firstresult=True)
23
+ def sqlseed_ai_analyze_table(
24
+ self,
25
+ table_name: str,
26
+ columns: list[Any],
27
+ indexes: list[dict[str, Any]],
28
+ sample_data: list[dict[str, Any]],
29
+ foreign_keys: list[Any],
30
+ all_table_names: list[str],
31
+ ) -> dict[str, Any] | None:
32
+ """
33
+ [AI Hook] 分析整张表,返回完整的列配置建议。
34
+ """
35
+
36
+ @hookspec
37
+ def sqlseed_before_generate(
38
+ self,
39
+ table_name: str,
40
+ count: int,
41
+ config: Any,
42
+ ) -> None:
43
+ raise NotImplementedError
44
+
45
+ @hookspec
46
+ def sqlseed_after_generate(
47
+ self,
48
+ table_name: str,
49
+ count: int,
50
+ elapsed: float,
51
+ ) -> None:
52
+ raise NotImplementedError
53
+
54
+ @hookspec
55
+ def sqlseed_transform_row(
56
+ self,
57
+ table_name: str,
58
+ row: dict[str, Any],
59
+ ) -> dict[str, Any] | None:
60
+ """
61
+ Transform/modify each generated row.
62
+ Return modified row, or None to keep unchanged.
63
+ Note: This hook is in the hot path - performance sensitive.
64
+ """
65
+
66
+ @hookspec
67
+ def sqlseed_transform_batch(
68
+ self,
69
+ table_name: str,
70
+ batch: list[dict[str, Any]],
71
+ ) -> list[dict[str, Any]] | None:
72
+ """
73
+ Transform/modify a batch of generated data.
74
+ Multiple plugins can chain: each plugin's output feeds into the next.
75
+ """
76
+
77
+ @hookspec
78
+ def sqlseed_before_insert(
79
+ self,
80
+ table_name: str,
81
+ batch_number: int,
82
+ batch_size: int,
83
+ ) -> None:
84
+ raise NotImplementedError
85
+
86
+ @hookspec
87
+ def sqlseed_after_insert(
88
+ self,
89
+ table_name: str,
90
+ batch_number: int,
91
+ rows_inserted: int,
92
+ ) -> None:
93
+ raise NotImplementedError
94
+
95
+ @hookspec
96
+ def sqlseed_shared_pool_loaded(
97
+ self,
98
+ table_name: str,
99
+ shared_pool: Any,
100
+ ) -> None:
101
+ """
102
+ Called after a table's generated values are loaded into the shared pool.
103
+ Other plugins can use this to track cross-table associations.
104
+ """
105
+
106
+ @hookspec(firstresult=True)
107
+ def sqlseed_pre_generate_templates(
108
+ self,
109
+ table_name: str,
110
+ column_name: str,
111
+ column_type: str,
112
+ count: int,
113
+ sample_data: list[Any],
114
+ ) -> list[Any] | None:
115
+ """
116
+ [AI Hook] Pre-generate candidate value pool for columns that cannot match
117
+ a deterministic generator. Called before DataStream creation.
118
+ Returns a list of template values, or None if the plugin does not handle this column.
119
+ """
@@ -0,0 +1,37 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Any
4
+
5
+ import pluggy
6
+
7
+ from sqlseed._utils.logger import get_logger
8
+ from sqlseed.plugins.hookspecs import PROJECT_NAME, SqlseedHookSpec
9
+
10
+ logger = get_logger(__name__)
11
+
12
+
13
+ class PluginManager:
14
+ def __init__(self) -> None:
15
+ self._pm = pluggy.PluginManager(PROJECT_NAME)
16
+ self._pm.add_hookspecs(SqlseedHookSpec)
17
+
18
+ def load_plugins(self) -> None:
19
+ self._pm.load_setuptools_entrypoints(PROJECT_NAME)
20
+ logger.debug("Loaded plugins", plugins=self._pm.get_plugins())
21
+
22
+ def register(self, plugin: Any, name: str | None = None) -> None:
23
+ self._pm.register(plugin, name=name)
24
+ logger.debug("Registered plugin", name=name or str(plugin))
25
+
26
+ def unregister(self, plugin: Any) -> None:
27
+ self._pm.unregister(plugin)
28
+
29
+ @property
30
+ def hook(self) -> Any:
31
+ return self._pm.hook
32
+
33
+ def get_plugins(self) -> set[Any]:
34
+ return self._pm.get_plugins()
35
+
36
+ def is_registered(self, plugin: Any) -> bool:
37
+ return self._pm.is_registered(plugin)
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