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.
- {sqlseed-0.2.0 → sqlseed-0.2.1}/PKG-INFO +1 -1
- {sqlseed-0.2.0 → sqlseed-0.2.1}/pyproject.toml +2 -1
- sqlseed-0.2.1/src/sqlseed/plugins/__init__.py +12 -0
- sqlseed-0.2.1/src/sqlseed/plugins/hookspecs.py +119 -0
- sqlseed-0.2.1/src/sqlseed/plugins/manager.py +37 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/.gitignore +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/CHANGELOG.md +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/CHANGELOG.zh-CN.md +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/LICENSE +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/README.md +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/README.zh-CN.md +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/examples/build_demo_db.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/examples/notebooks/01-quickstart.ipynb +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/examples/notebooks/02-column-mapping.ipynb +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/examples/notebooks/03-generators.ipynb +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/examples/notebooks/04-database-advanced.ipynb +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/examples/notebooks/05-dag-and-constraints.ipynb +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/examples/notebooks/06-config-deep-dive.ipynb +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/examples/notebooks/07-ai-plugin.ipynb +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/examples/notebooks/08-mcp-server.ipynb +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/examples/notebooks/09-plugin-hooks.ipynb +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/examples/notebooks/10-cli-reference.ipynb +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/examples/notebooks/11-utilities.ipynb +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/examples/notebooks/12-testing-patterns.ipynb +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/scripts/_create_demo_db.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/scripts/quickstart.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/__init__.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/_utils/__init__.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/_utils/logger.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/_utils/metrics.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/_utils/paths.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/_utils/progress.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/_utils/schema_helpers.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/_utils/sql_safe.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/_version.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/cli/__init__.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/cli/main.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/config/__init__.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/config/loader.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/config/models.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/config/snapshot.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/core/__init__.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/core/column_dag.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/core/constraints.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/core/enrichment.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/core/expression.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/core/mapper.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/core/orchestrator.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/core/plugin_mediator.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/core/relation.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/core/result.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/core/schema.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/core/transform.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/core/unique_adjuster.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/database/__init__.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/database/_base_adapter.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/database/_compat.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/database/_helpers.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/database/_protocol.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/database/optimizer.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/database/raw_sqlite_adapter.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/database/sqlite_utils_adapter.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/generators/__init__.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/generators/_dispatch.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/generators/_json_helpers.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/generators/_protocol.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/generators/_string_helpers.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/generators/base_provider.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/generators/faker_provider.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/generators/mimesis_provider.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/generators/registry.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/generators/stream.py +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/src/sqlseed/py.typed +0 -0
- {sqlseed-0.2.0 → sqlseed-0.2.1}/uv.lock +0 -0
|
@@ -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
|
|
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
|