cinchdb 0.1.15__py3-none-any.whl → 0.1.17__py3-none-any.whl

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.
@@ -1,17 +1,16 @@
1
1
  """
2
- CinchDB Plugin System
2
+ Simple Plugin System for CinchDB
3
3
 
4
- Extensible plugin architecture for CinchDB.
4
+ Easy-to-use plugin architecture for CinchDB.
5
5
  """
6
6
 
7
- from .base import BasePlugin, PluginHook
7
+ from .base import Plugin
8
8
  from .manager import PluginManager
9
- from .decorators import hook, plugin_method
9
+ from .decorators import database_method, auto_extend
10
10
 
11
11
  __all__ = [
12
- "BasePlugin",
13
- "PluginHook",
12
+ "Plugin",
14
13
  "PluginManager",
15
- "hook",
16
- "plugin_method",
14
+ "database_method",
15
+ "auto_extend",
17
16
  ]
cinchdb/plugins/base.py CHANGED
@@ -1,90 +1,73 @@
1
1
  """
2
- Base classes for CinchDB plugins.
2
+ Simple base class for CinchDB plugins.
3
3
  """
4
4
 
5
- from abc import ABC, abstractmethod
6
- from typing import Any, Dict, List, Callable
7
- from enum import Enum
5
+ from typing import Any, Dict, Optional
8
6
 
9
7
 
10
- class PluginHook(Enum):
11
- """Available plugin hooks."""
12
- # Database lifecycle hooks
13
- DATABASE_INIT = "database_init"
14
- DATABASE_CONNECT = "database_connect"
15
- DATABASE_DISCONNECT = "database_disconnect"
8
+ class Plugin:
9
+ """Simple base class for CinchDB plugins."""
16
10
 
17
- # Query hooks
18
- QUERY_BEFORE = "query_before"
19
- QUERY_AFTER = "query_after"
20
- QUERY_ERROR = "query_error"
11
+ # Plugin metadata - override in subclass
12
+ name: str = "unnamed_plugin"
13
+ version: str = "1.0.0"
14
+ description: str = ""
21
15
 
22
- # Table hooks
23
- TABLE_CREATE = "table_create"
24
- TABLE_DROP = "table_drop"
25
- TABLE_ALTER = "table_alter"
26
-
27
- # Tenant hooks
28
- TENANT_CREATE = "tenant_create"
29
- TENANT_DROP = "tenant_drop"
30
-
31
- # Branch hooks
32
- BRANCH_CREATE = "branch_create"
33
- BRANCH_SWITCH = "branch_switch"
34
- BRANCH_MERGE = "branch_merge"
35
-
36
- # CLI hooks
37
- CLI_COMMAND_BEFORE = "cli_command_before"
38
- CLI_COMMAND_AFTER = "cli_command_after"
39
-
40
-
41
- class BasePlugin(ABC):
42
- """Base class for all CinchDB plugins."""
43
-
44
- def __init__(self):
45
- self.name = self.__class__.__name__
46
- self.version = "1.0.0"
47
- self.description = ""
48
- self._hooks: Dict[PluginHook, List[Callable]] = {}
49
- self._methods: Dict[str, Callable] = {}
16
+ def extend_database(self, db) -> None:
17
+ """Add methods or modify the database instance.
18
+
19
+ Override this method to add custom methods to database instances:
50
20
 
51
- @abstractmethod
52
- def initialize(self, cinchdb_instance) -> None:
53
- """Initialize the plugin with a CinchDB instance."""
21
+ Example:
22
+ def extend_database(self, db):
23
+ db.my_custom_method = self.my_custom_method
24
+ """
54
25
  pass
55
26
 
56
- def register_hook(self, hook: PluginHook, callback: Callable) -> None:
57
- """Register a callback for a specific hook."""
58
- if hook not in self._hooks:
59
- self._hooks[hook] = []
60
- self._hooks[hook].append(callback)
61
-
62
- def register_method(self, method_name: str, method: Callable) -> None:
63
- """Register a new method to be added to CinchDB instances."""
64
- self._methods[method_name] = method
27
+ def before_query(self, sql: str, params: Optional[tuple] = None) -> tuple:
28
+ """Called before executing any SQL query.
29
+
30
+ Args:
31
+ sql: The SQL statement to be executed
32
+ params: Parameters for the SQL statement
33
+
34
+ Returns:
35
+ Tuple of (modified_sql, modified_params)
36
+ """
37
+ return sql, params
65
38
 
66
- def get_hooks(self) -> Dict[PluginHook, List[Callable]]:
67
- """Get all registered hooks."""
68
- return self._hooks.copy()
39
+ def after_query(self, sql: str, params: Optional[tuple], result: Any) -> Any:
40
+ """Called after executing any SQL query.
41
+
42
+ Args:
43
+ sql: The SQL statement that was executed
44
+ params: Parameters that were used
45
+ result: The query result
46
+
47
+ Returns:
48
+ Modified result (or original result)
49
+ """
50
+ return result
69
51
 
70
- def get_methods(self) -> Dict[str, Callable]:
71
- """Get all registered methods."""
72
- return self._methods.copy()
52
+ def on_connect(self, db_path: str, connection) -> None:
53
+ """Called when a database connection is established.
54
+
55
+ Args:
56
+ db_path: Path to the database file
57
+ connection: SQLite connection object
58
+ """
59
+ pass
73
60
 
74
- def call_hook(self, hook: PluginHook, *args, **kwargs) -> Any:
75
- """Call all callbacks for a specific hook."""
76
- results = []
77
- for callback in self._hooks.get(hook, []):
78
- try:
79
- result = callback(*args, **kwargs)
80
- results.append(result)
81
- except Exception as e:
82
- # Log error but don't break other plugins
83
- print(f"Plugin {self.name} hook {hook} failed: {e}")
84
- return results
61
+ def on_disconnect(self, db_path: str) -> None:
62
+ """Called when a database connection is closed.
63
+
64
+ Args:
65
+ db_path: Path to the database file
66
+ """
67
+ pass
85
68
 
86
69
  def cleanup(self) -> None:
87
- """Cleanup when plugin is unloaded."""
70
+ """Called when plugin is being unloaded."""
88
71
  pass
89
72
 
90
73
  @property
@@ -94,6 +77,4 @@ class BasePlugin(ABC):
94
77
  "name": self.name,
95
78
  "version": self.version,
96
79
  "description": self.description,
97
- "hooks": list(self._hooks.keys()),
98
- "methods": list(self._methods.keys()),
99
80
  }
@@ -1,45 +1,49 @@
1
1
  """
2
- Decorators for plugin development.
2
+ Simple decorators for plugin development.
3
3
  """
4
4
 
5
5
  from typing import Callable
6
6
 
7
- from .base import PluginHook
8
7
 
9
-
10
- def hook(hook_type: PluginHook):
11
- """Decorator to register a method as a hook callback."""
12
- def decorator(func: Callable) -> Callable:
13
- func._plugin_hook = hook_type
14
- return func
15
- return decorator
16
-
17
-
18
- def plugin_method(method_name: str):
19
- """Decorator to register a method to be added to CinchDB instances."""
8
+ def database_method(method_name: str):
9
+ """Decorator to mark a method for database extension.
10
+
11
+ Usage:
12
+ class Plugin:
13
+ @database_method("my_method")
14
+ def my_custom_method(self, db):
15
+ return "Hello from plugin!"
16
+ """
20
17
  def decorator(func: Callable) -> Callable:
21
- func._plugin_method_name = method_name
18
+ func._database_method_name = method_name
22
19
  return func
23
20
  return decorator
24
21
 
25
22
 
26
- class PluginDecorators:
27
- """Helper class to collect decorated methods from a plugin class."""
23
+ def auto_extend(plugin_class):
24
+ """Class decorator to automatically extend databases with decorated methods.
25
+
26
+ Usage:
27
+ @auto_extend
28
+ class Plugin:
29
+ @database_method("custom_query")
30
+ def custom_query_method(self, db, query):
31
+ # Method will be added to db instances as db.custom_query()
32
+ return "Custom result"
33
+ """
34
+ original_extend = getattr(plugin_class, 'extend_database', None)
28
35
 
29
- @staticmethod
30
- def collect_hooks(plugin_instance) -> None:
31
- """Collect and register hook methods from a plugin instance."""
32
- for attr_name in dir(plugin_instance):
33
- attr = getattr(plugin_instance, attr_name)
34
- if callable(attr) and hasattr(attr, '_plugin_hook'):
35
- hook_type = attr._plugin_hook
36
- plugin_instance.register_hook(hook_type, attr)
36
+ def new_extend_database(self, db):
37
+ # Call original extend_database if it exists
38
+ if original_extend:
39
+ original_extend(self, db)
40
+
41
+ # Auto-add decorated methods
42
+ for attr_name in dir(self):
43
+ attr = getattr(self, attr_name)
44
+ if callable(attr) and hasattr(attr, '_database_method_name'):
45
+ method_name = attr._database_method_name
46
+ setattr(db, method_name, lambda *args, **kwargs: attr(db, *args, **kwargs))
37
47
 
38
- @staticmethod
39
- def collect_methods(plugin_instance) -> None:
40
- """Collect and register plugin methods from a plugin instance."""
41
- for attr_name in dir(plugin_instance):
42
- attr = getattr(plugin_instance, attr_name)
43
- if callable(attr) and hasattr(attr, '_plugin_method_name'):
44
- method_name = attr._plugin_method_name
45
- plugin_instance.register_method(method_name, attr)
48
+ plugin_class.extend_database = new_extend_database
49
+ return plugin_class
@@ -1,43 +1,31 @@
1
1
  """
2
- Plugin manager for CinchDB.
2
+ Simple plugin manager for CinchDB.
3
3
  """
4
4
 
5
5
  import importlib
6
6
  import importlib.util
7
7
  import logging
8
8
  from pathlib import Path
9
- from typing import Dict, List, Optional, Any
10
- try:
11
- from importlib.metadata import entry_points
12
- except ImportError:
13
- # Fallback for Python < 3.8
14
- from importlib_metadata import entry_points
9
+ from typing import Dict, List, Optional, Any, Union
15
10
 
16
- from .base import BasePlugin, PluginHook
11
+ from .base import Plugin
17
12
 
18
13
  logger = logging.getLogger(__name__)
19
14
 
20
15
 
21
16
  class PluginManager:
22
- """Manages plugin lifecycle and hooks for CinchDB."""
17
+ """Simple plugin manager for CinchDB."""
23
18
 
24
19
  def __init__(self):
25
- self.plugins: Dict[str, BasePlugin] = {}
26
- self._cinchdb_instance = None
20
+ self.plugins: Dict[str, Plugin] = {}
21
+ self._database_instances: List[Any] = []
27
22
 
28
- def set_cinchdb_instance(self, instance):
29
- """Set the CinchDB instance for plugins."""
30
- self._cinchdb_instance = instance
31
-
32
- # Initialize any already loaded plugins
33
- for plugin in self.plugins.values():
34
- try:
35
- plugin.initialize(instance)
36
- except Exception as e:
37
- logger.error(f"Failed to initialize plugin {plugin.name}: {e}")
38
-
39
- def register_plugin(self, plugin: BasePlugin) -> None:
40
- """Register a plugin instance."""
23
+ def register_plugin(self, plugin: Union[Plugin, type]) -> None:
24
+ """Register a plugin instance or class."""
25
+ # If it's a class, instantiate it
26
+ if isinstance(plugin, type):
27
+ plugin = plugin()
28
+
41
29
  plugin_name = plugin.name
42
30
 
43
31
  if plugin_name in self.plugins:
@@ -45,13 +33,12 @@ class PluginManager:
45
33
 
46
34
  self.plugins[plugin_name] = plugin
47
35
 
48
- # Initialize with CinchDB instance if available
49
- if self._cinchdb_instance:
36
+ # Apply to existing database instances
37
+ for db_instance in self._database_instances:
50
38
  try:
51
- plugin.initialize(self._cinchdb_instance)
52
- self._apply_plugin_methods(plugin)
39
+ plugin.extend_database(db_instance)
53
40
  except Exception as e:
54
- logger.error(f"Failed to initialize plugin {plugin_name}: {e}")
41
+ logger.error(f"Failed to extend database with plugin {plugin_name}: {e}")
55
42
 
56
43
  logger.info(f"Plugin {plugin_name} registered successfully")
57
44
 
@@ -72,18 +59,24 @@ class PluginManager:
72
59
  try:
73
60
  module = importlib.import_module(module_name)
74
61
 
75
- # Look for plugin classes
62
+ # Look for Plugin class first
63
+ if hasattr(module, 'Plugin'):
64
+ plugin_instance = module.Plugin()
65
+ self.register_plugin(plugin_instance)
66
+ return
67
+
68
+ # Fallback: look for any Plugin subclass
76
69
  for attr_name in dir(module):
77
70
  attr = getattr(module, attr_name)
78
71
  if (isinstance(attr, type) and
79
- issubclass(attr, BasePlugin) and
80
- attr != BasePlugin):
72
+ issubclass(attr, Plugin) and
73
+ attr != Plugin):
81
74
 
82
75
  plugin_instance = attr()
83
76
  self.register_plugin(plugin_instance)
84
77
  return
85
78
 
86
- logger.warning(f"No plugin class found in module {module_name}")
79
+ logger.warning(f"No Plugin class found in module {module_name}")
87
80
 
88
81
  except ImportError as e:
89
82
  logger.error(f"Failed to import plugin module {module_name}: {e}")
@@ -98,69 +91,108 @@ class PluginManager:
98
91
  module = importlib.util.module_from_spec(spec)
99
92
  spec.loader.exec_module(module)
100
93
 
101
- # Look for plugin classes
102
- for attr_name in dir(module):
103
- attr = getattr(module, attr_name)
104
- if (isinstance(attr, type) and
105
- issubclass(attr, BasePlugin) and
106
- attr != BasePlugin):
107
-
108
- plugin_instance = attr()
109
- self.register_plugin(plugin_instance)
110
- return
94
+ # Look for Plugin class
95
+ if hasattr(module, 'Plugin'):
96
+ plugin_instance = module.Plugin()
97
+ self.register_plugin(plugin_instance)
98
+ return
111
99
 
112
- logger.warning(f"No plugin class found in file {file_path}")
100
+ logger.warning(f"No Plugin class found in file {file_path}")
113
101
 
114
102
  except Exception as e:
115
103
  logger.error(f"Failed to load plugin from file {file_path}: {e}")
116
104
 
105
+ def load_plugins_from_directory(self, plugins_dir: Path) -> None:
106
+ """Load all plugins from a directory."""
107
+ if not plugins_dir.exists():
108
+ logger.info(f"Plugins directory {plugins_dir} does not exist")
109
+ return
110
+
111
+ for plugin_file in plugins_dir.glob("*.py"):
112
+ if plugin_file.name == "__init__.py":
113
+ continue
114
+ self.load_plugin_from_file(plugin_file)
115
+
117
116
  def discover_plugins(self) -> None:
118
- """Discover plugins using entry points."""
117
+ """Discover plugins using entry points and plugins directory."""
118
+ # Try entry points for installed plugins
119
119
  try:
120
+ try:
121
+ from importlib.metadata import entry_points
122
+ except ImportError:
123
+ from importlib_metadata import entry_points
124
+
120
125
  eps = entry_points()
121
- # Handle both old and new entry_points API
122
126
  if hasattr(eps, 'select'):
123
- # New API (Python 3.10+)
124
127
  plugin_eps = eps.select(group='cinchdb.plugins')
125
128
  else:
126
- # Old API
127
129
  plugin_eps = eps.get('cinchdb.plugins', [])
128
130
 
129
131
  for entry_point in plugin_eps:
130
132
  try:
131
133
  plugin_class = entry_point.load()
132
- if issubclass(plugin_class, BasePlugin):
133
- plugin_instance = plugin_class()
134
- self.register_plugin(plugin_instance)
134
+ self.register_plugin(plugin_class)
135
135
  except Exception as e:
136
136
  logger.error(f"Failed to load plugin {entry_point.name}: {e}")
137
137
  except Exception as e:
138
- logger.error(f"Failed to discover plugins: {e}")
138
+ logger.debug(f"Entry points not available: {e}")
139
+
140
+ # Also check for local plugins directory
141
+ plugins_dir = Path("plugins")
142
+ if plugins_dir.exists():
143
+ self.load_plugins_from_directory(plugins_dir)
139
144
 
140
- def _apply_plugin_methods(self, plugin: BasePlugin) -> None:
141
- """Apply plugin methods to the CinchDB instance."""
142
- if not self._cinchdb_instance:
143
- return
144
-
145
- for method_name, method in plugin.get_methods().items():
146
- # Bind method to the instance
147
- bound_method = method.__get__(self._cinchdb_instance, type(self._cinchdb_instance))
148
- setattr(self._cinchdb_instance, method_name, bound_method)
149
-
150
- def call_hook(self, hook: PluginHook, *args, **kwargs) -> List[Any]:
151
- """Call all plugin hooks for a specific event."""
152
- results = []
145
+ def register_database(self, db_instance) -> None:
146
+ """Register a database instance with all plugins."""
147
+ self._database_instances.append(db_instance)
153
148
 
149
+ # Apply all plugins to this database instance
154
150
  for plugin in self.plugins.values():
155
151
  try:
156
- plugin_results = plugin.call_hook(hook, *args, **kwargs)
157
- results.extend(plugin_results)
152
+ plugin.extend_database(db_instance)
158
153
  except Exception as e:
159
- logger.error(f"Plugin {plugin.name} hook {hook} failed: {e}")
160
-
161
- return results
154
+ logger.error(f"Failed to extend database with plugin {plugin.name}: {e}")
155
+
156
+ def unregister_database(self, db_instance) -> None:
157
+ """Unregister a database instance."""
158
+ if db_instance in self._database_instances:
159
+ self._database_instances.remove(db_instance)
160
+
161
+ def before_query(self, sql: str, params: Optional[tuple] = None) -> tuple:
162
+ """Call before_query on all plugins."""
163
+ for plugin in self.plugins.values():
164
+ try:
165
+ sql, params = plugin.before_query(sql, params)
166
+ except Exception as e:
167
+ logger.error(f"Plugin {plugin.name} before_query failed: {e}")
168
+ return sql, params
169
+
170
+ def after_query(self, sql: str, params: Optional[tuple], result: Any) -> Any:
171
+ """Call after_query on all plugins."""
172
+ for plugin in self.plugins.values():
173
+ try:
174
+ result = plugin.after_query(sql, params, result)
175
+ except Exception as e:
176
+ logger.error(f"Plugin {plugin.name} after_query failed: {e}")
177
+ return result
178
+
179
+ def on_connect(self, db_path: str, connection) -> None:
180
+ """Call on_connect on all plugins."""
181
+ for plugin in self.plugins.values():
182
+ try:
183
+ plugin.on_connect(db_path, connection)
184
+ except Exception as e:
185
+ logger.error(f"Plugin {plugin.name} on_connect failed: {e}")
186
+
187
+ def on_disconnect(self, db_path: str) -> None:
188
+ """Call on_disconnect on all plugins."""
189
+ for plugin in self.plugins.values():
190
+ try:
191
+ plugin.on_disconnect(db_path)
192
+ except Exception as e:
193
+ logger.error(f"Plugin {plugin.name} on_disconnect failed: {e}")
162
194
 
163
- def get_plugin(self, name: str) -> Optional[BasePlugin]:
195
+ def get_plugin(self, name: str) -> Optional[Plugin]:
164
196
  """Get a plugin by name."""
165
197
  return self.plugins.get(name)
166
198
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cinchdb
3
- Version: 0.1.15
3
+ Version: 0.1.17
4
4
  Summary: A Git-like SQLite database management system with branching and multi-tenancy
5
5
  Project-URL: Homepage, https://github.com/russellromney/cinchdb
6
6
  Project-URL: Documentation, https://russellromney.github.io/cinchdb
@@ -31,6 +31,10 @@ Description-Content-Type: text/markdown
31
31
 
32
32
  **Git-like SQLite database management with branching and multi-tenancy**
33
33
 
34
+ [![PyPI version](https://badge.fury.io/py/cinchdb.svg)](https://badge.fury.io/py/cinchdb)
35
+ [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
36
+
37
+
34
38
  NOTE: CinchDB is in early alpha. This is project to test out an idea. Do not use this in production.
35
39
 
36
40
  CinchDB is for projects that need fast queries, isolated data per-tenant [or even per-user](https://turso.tech/blog/give-each-of-your-users-their-own-sqlite-database-b74445f4), and a branchable database that makes it easy to merge changes between branches.
@@ -1,6 +1,6 @@
1
1
  cinchdb/__init__.py,sha256=qnBv5kpL4GJjNbQkp-nBcOgrsskwDr7WTnUPCGwg3zs,603
2
2
  cinchdb/__main__.py,sha256=OpkDqn9zkTZhhYgvv_grswWLAHKbmxs4M-8C6Z5HfWY,85
3
- cinchdb/config.py,sha256=gocjMnYKLWhgvnteo6zprgwtK6Oevoxq547J_v-C9Ns,5265
3
+ cinchdb/config.py,sha256=hYcT91mMcV0NEvJMAgtJkihfaxHJ97qqGOetnlaNZjI,4889
4
4
  cinchdb/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  cinchdb/cli/main.py,sha256=x2bF19e0lY_0V3_tx6CO9M3AaFlII75bAdWaOg0ne_A,4587
6
6
  cinchdb/cli/utils.py,sha256=InAGuo7uENvsfBQu6EKIbbiNXqmvg-BecLmhLvOz5qg,6485
@@ -19,27 +19,28 @@ cinchdb/cli/commands/view.py,sha256=ZmS1IW7idzzHAXmgVyY3C4IQRo7toHb6fHNFY_tQJjI,
19
19
  cinchdb/cli/handlers/__init__.py,sha256=f2f-Cc96rSBLbVsiIbf-b4pZCKZoHfmhNEvnZ0OurRs,131
20
20
  cinchdb/cli/handlers/codegen_handler.py,sha256=i5we_AbiUW3zfO6pIKWxvtO8OvOqz3H__4xPmTLEuQM,6524
21
21
  cinchdb/core/__init__.py,sha256=iNlT0iO9cM0HLoYwzBavUBoXRh1Tcnz1l_vfbwVxK_Q,246
22
- cinchdb/core/connection.py,sha256=FdYVQuoFYo7B0JSHfCTZFTq3DkM_NWHF4ei-fMyyEMI,5171
23
- cinchdb/core/database.py,sha256=K5zPG8wXdh9-jAg69QZ7ImE0u3qAuvCDulfAx1fOq5U,33307
22
+ cinchdb/core/connection.py,sha256=_Yt0ki4IbNQJ6lwvloDZ58CCA7SBJwHaB1SU1Yy-rpI,5186
23
+ cinchdb/core/database.py,sha256=4jZwJE4UMpPv77wyQbn0FaTB1MMJv0BHl3umLJzO0q4,33680
24
24
  cinchdb/core/initializer.py,sha256=CAzq947plgEF-KXV-PD-ycJ8Zy4zXCQqCrmQ0-pV0i4,14474
25
- cinchdb/core/maintenance.py,sha256=PAgrSL7Cj9p3rKHV0h_L7gupN6nLD0-5eQpJZNiqyEs,2097
26
- cinchdb/core/path_utils.py,sha256=Va4y2Dkd5QI6FI5h1ePyVH5pwr7tzRpYZLA4KEpDV0Q,4874
25
+ cinchdb/core/maintenance_utils.py,sha256=FYEZK2FybghuGxo37QeTd1DLsuId0p3rKGIlpPTFJZw,1852
26
+ cinchdb/core/path_utils.py,sha256=xcclmafzETDtivr-Qoi2gP6xZh5C49EoR6duc6YY4gw,4698
27
+ cinchdb/core/tenant_activation.py,sha256=56FaxgZJ2IGYcF6arJfr0gc63wBpyQ4E9ssJDghlPmA,7290
27
28
  cinchdb/infrastructure/metadata_connection_pool.py,sha256=PeVsyuZKdI3Y7_InWMOn9HcSNhE0MVcP7I7wAj9esmI,4859
28
- cinchdb/infrastructure/metadata_db.py,sha256=t3WDyE9SjWhTB2S0-v82AmWKXfl1571V_dv4Bv1-u10,15894
29
+ cinchdb/infrastructure/metadata_db.py,sha256=gP-UORs2Ec33p9_64L2xPTZ51PQDYrmfHlofJfQUM2M,19933
29
30
  cinchdb/managers/__init__.py,sha256=ic61ZUdsg-muq0ETYO6fuZRQWF4j7l920PthTkt2QrE,808
30
31
  cinchdb/managers/branch.py,sha256=bEzl83mN9a9KW8AHC_w50QHtVdVPHUzEY-j9T2EAyR4,9445
31
- cinchdb/managers/change_applier.py,sha256=cCgjUL6SJvrgVCCHAw0mAbGqZqKmMsLa0QbziSiuW68,15576
32
+ cinchdb/managers/change_applier.py,sha256=JWfK-B42fCc5ANGvIIogzF5SeSCkSO16y67RCNsPu08,15602
32
33
  cinchdb/managers/change_comparator.py,sha256=08pwybpSt36cFwhZRSIkHynvFMUaLKEVwa8Ajn_R9yQ,6862
33
34
  cinchdb/managers/change_tracker.py,sha256=U93BPnuGv8xSaO5qr_y5Q8ppKrVXygozdp5zUvLUqwg,5054
34
35
  cinchdb/managers/codegen.py,sha256=1CfIwjgHnNDdjrq4SzQ9VE7DFgnWfk7RtpupBFUTqxk,21804
35
- cinchdb/managers/column.py,sha256=i0EzDKavMvZeeaVrY9OVRNHOW60v0rUEkDjMtIs3PaE,20749
36
- cinchdb/managers/data.py,sha256=9JAcJ1bxTKb15s0Zb0ATH4YW-6O03iSvyJnk1SsDq80,23170
36
+ cinchdb/managers/column.py,sha256=JyBIu372ExMppvqklhtVAc-eZzikIqedB_8uoJtFu-Y,20755
37
+ cinchdb/managers/data.py,sha256=zAtVLR4GaiY7ijIbWAXC7JN701KtX2zgcg4ZUlGpyts,23176
37
38
  cinchdb/managers/index.py,sha256=55_fafWd4lSju4Nw32B_1Fi1c2DPHxOgAhdsqcTR404,10343
38
39
  cinchdb/managers/merge_manager.py,sha256=R8S2hLkLJg4hLDpeJTzjVkduZgqPOjXtYgOSJhTXXrE,15690
39
40
  cinchdb/managers/query.py,sha256=hgNHda20PWMijbVRnjTKFGFBvBthep2fulkJEK1gkqU,8562
40
- cinchdb/managers/table.py,sha256=GgwW_lVl9qmbr5x6JXDdvTBL_Ylkk4AzAD2HXQAOH0E,15246
41
- cinchdb/managers/tenant.py,sha256=Oy60CKWTgDetF_SpbTFcS8bjumlNjEInd_APRg86f5M,31628
42
- cinchdb/managers/view.py,sha256=v9gYtRufZyxywPKLGvIjvlUXcxYh9CLRArefu9QX6zk,7809
41
+ cinchdb/managers/table.py,sha256=mv5p5WCXy1VXKRyaAZquZofdKR0gEth7It82j6p7j0E,15252
42
+ cinchdb/managers/tenant.py,sha256=gk3Nn68n4avl2mcMcPB5HuKOsOPsMhnvgxHyK8Uwuik,31634
43
+ cinchdb/managers/view.py,sha256=uXcRnZxF4TCcycbwH7cTje_QU3NO47fmOzJULQHHeVI,7815
43
44
  cinchdb/models/__init__.py,sha256=cZ-ailJ6qu44Iap5Rq555iB-_w9ufXVDBH3rDH-ojk0,622
44
45
  cinchdb/models/base.py,sha256=7j4rlFTP5K9ZuF8vxwC7lMFEaL7O90NJ47Ig5i7ubcw,1320
45
46
  cinchdb/models/branch.py,sha256=gRgLpRFkMC3fxf9ZigVOkS6wdkBERWqlLk0_gOYjqNk,1180
@@ -49,15 +50,15 @@ cinchdb/models/project.py,sha256=6GMXUZUsEIebqQJgRXIthWzpWKuNNmJ3drgI1vFDrMo,644
49
50
  cinchdb/models/table.py,sha256=nxf__C_YvDOW-6-vdOQ4xKmwWPZwgEdYw1I4mO_C44o,2955
50
51
  cinchdb/models/tenant.py,sha256=wTvGoO_tQdtueVB0faZFVIhSjh_DNJzywflrUpngWTM,1072
51
52
  cinchdb/models/view.py,sha256=q6j-jYzFJuhRJO87rKt6Uv8hOizHQx8xwoPKoH6XnNY,530
52
- cinchdb/plugins/__init__.py,sha256=cpqB9y9sY6b9N5Gy9f78Zd2LJ-VpRnwEMS6GpQeW-KY,301
53
- cinchdb/plugins/base.py,sha256=f0WOTVOLAqWLOSKI6GSNLhHN-wziBGWJza7z1QH0_MY,3038
54
- cinchdb/plugins/decorators.py,sha256=vSTDC3TDywqDi8Da5aoKe7rRVA2EbTuJXAk6VV4BosM,1533
55
- cinchdb/plugins/manager.py,sha256=1GcDhCwJvdkXSrgYe-jGA7g8NJNyYk0037_tMNugijE,6807
53
+ cinchdb/plugins/__init__.py,sha256=jZtwwY0t_dhFKz-uR2V3KWBmAGknWnoLkiDWSzULdc8,293
54
+ cinchdb/plugins/base.py,sha256=Upfgw78eOhTAfQd9FwcgGZLIT0zefPDgD4LlpzXgOBg,2232
55
+ cinchdb/plugins/decorators.py,sha256=vY9Zh5nhGiSM6kO55srGHSP32gnyMq77UtJSO3lULq4,1550
56
+ cinchdb/plugins/manager.py,sha256=vetdsiwTkadp3BrhjUIp2vkmCpqfuXqy-3yQBdlxruQ,8143
56
57
  cinchdb/utils/__init__.py,sha256=yQQhEjndDiB2SUJybUmp9dvEOQKiR-GySe-WiCius5E,490
57
58
  cinchdb/utils/name_validator.py,sha256=dyGX5bjlTFRA9EGrWRQKp6kR__HSV04hLV5VueJs4IQ,4027
58
59
  cinchdb/utils/sql_validator.py,sha256=aWOGlPX0gBkuR6R1EBP2stbP4PHZuI6FUBi2Ljx7JUI,5815
59
- cinchdb-0.1.15.dist-info/METADATA,sha256=LdviGmMLfCUhko3Y6v9ViCFPVaX9KtiXv_ZwGhKwwlo,5958
60
- cinchdb-0.1.15.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
61
- cinchdb-0.1.15.dist-info/entry_points.txt,sha256=VBOIzvnGbkKudMCCmNORS3885QSyjZUVKJQ-Syqa62w,47
62
- cinchdb-0.1.15.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
63
- cinchdb-0.1.15.dist-info/RECORD,,
60
+ cinchdb-0.1.17.dist-info/METADATA,sha256=cTeJ-n2bL2mqALrAZt9yPES_Xt6uC_suDB8HJmNTFTo,6155
61
+ cinchdb-0.1.17.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
62
+ cinchdb-0.1.17.dist-info/entry_points.txt,sha256=VBOIzvnGbkKudMCCmNORS3885QSyjZUVKJQ-Syqa62w,47
63
+ cinchdb-0.1.17.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
64
+ cinchdb-0.1.17.dist-info/RECORD,,