triggerware 0.1.0__tar.gz → 0.1.2__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.
@@ -1,10 +1,10 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: triggerware
3
- Version: 0.1.0
3
+ Version: 0.1.2
4
4
  Summary:
5
5
  Author: godofavacyn
6
6
  Author-email: godofavacyn <aidenmeyer@mailbox.org>
7
- Requires-Dist: jayson-rpc
7
+ Requires-Dist: jayson-rpc[websockets]
8
8
  Requires-Dist: sphinx
9
9
  Requires-Python: >=3.11
10
10
  Description-Content-Type: text/markdown
@@ -1,12 +1,12 @@
1
1
  [project]
2
2
  name = "triggerware"
3
- version = "0.1.0"
3
+ version = "0.1.2"
4
4
  description = ""
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
7
7
  authors = [{name = "godofavacyn", email = "aidenmeyer@mailbox.org"}]
8
8
  dependencies = [
9
- "jayson-rpc",
9
+ "jayson-rpc[websockets]",
10
10
  "sphinx"
11
11
  ]
12
12
 
@@ -73,7 +73,7 @@ class ResultSet[T](TriggerwareObject, ResourceRestricted):
73
73
  for _ in range(n):
74
74
  try:
75
75
  items.append(await anext(self))
76
- except StopIteration:
76
+ except StopAsyncIteration:
77
77
  break
78
78
  return items
79
79
 
@@ -48,7 +48,8 @@ class TriggerwareClient:
48
48
  Args:
49
49
  uri: The WebSocket URI to connect to.
50
50
  """
51
- uri = "ws://tw-instance-load-balancer-194323221.us-east-2.elb.amazonaws.com"
51
+ # uri = "ws://tw-instance-load-balancer-194323221.us-east-2.elb.amazonaws.com"
52
+ uri = "wss://instances.triggerware.com"
52
53
  json_rpc = await JsonRpcWebSocketConnection.connect(
53
54
  uri,
54
55
  headers={
@@ -95,10 +96,34 @@ class TriggerwareClient:
95
96
  return await View(self, query).validate()
96
97
 
97
98
  async def close(self):
99
+ """Closes the connection to the server."""
100
+ await self.json_rpc.close()
101
+
102
+ async def activate_connector(self, name: str, json_data: dict | None = None):
103
+ """Activate a connector on the server.
104
+
105
+ Args:
106
+ name: The name of the connector to activate.
107
+ json_data: Optional data to pass to the connector upon activation.
108
+ """
109
+ await self.json_rpc.call("activate_connector", {"name": name, "json_data": json_data})
110
+
111
+ async def deactivate_connector(self, name: str):
112
+ """Deactivate a connector on the server.
113
+
114
+ Args:
115
+ name: The name of the connector to deactivate.
98
116
  """
99
- Closes the connection to the server.
117
+ await self.json_rpc.call("deactivate_connector", {"name": name})
118
+
119
+ async def list_active_connectors(self) -> list[str]:
120
+ """Query the server for which connectors are currently activated.
121
+
122
+ Returns:
123
+ list[str]: The names of all currently active connectors.
100
124
  """
101
- await self.json_rpc.close()
125
+ result = await self.json_rpc.call("list-active-connectors", {})
126
+ return result["connectors"]
102
127
 
103
128
  @property
104
129
  def is_closed(self) -> bool:
@@ -1,130 +0,0 @@
1
- from typing import Any, TYPE_CHECKING, Callable
2
- import threading
3
- import inspect
4
- import importlib
5
-
6
- if TYPE_CHECKING:
7
- import triggerware as tw
8
-
9
- sql_types = {
10
- "str": "casesensitive",
11
- "int": "int",
12
- }
13
-
14
-
15
- class ConnectorManager:
16
- def __init__(
17
- self,
18
- tw_client: "tw.TriggerwareClient",
19
- external_address: str,
20
- external_port: int,
21
- ) -> None:
22
- self._client: "tw.TriggerwareClient" = tw_client
23
- self._address = external_address
24
- self._port = external_port
25
- self._lock = threading.Lock()
26
- self._conn_names: set[str] = set()
27
- self._gen_functions: dict[str, Callable[..., Any]] = {}
28
- threading.Thread(target=self._run, daemon=True).start()
29
-
30
- def create_schema(self, schema: str):
31
- params = {"name": schema}
32
- _ = self._client.json_rpc.call("create-sql-schema", params)
33
-
34
- def add_connector(self, connector: "Connector"):
35
- generators: list[dict] = []
36
- with self._lock:
37
- if connector.name in self._conn_names:
38
- raise ValueError(
39
- f"Connector with name {connector.name} already exists."
40
- )
41
- self._conn_names.add(connector.name)
42
- for gen_name, generator in connector.generators.items():
43
- generators.append(
44
- {
45
- "name": gen_name,
46
- "cost": generator.cost,
47
- "inputs": generator.inputs,
48
- }
49
- )
50
- self._gen_functions[gen_name] = generator.func
51
- params = {
52
- "columns": connector.columns,
53
- "generator": generators,
54
- "host": self._address,
55
- "port": self._port,
56
- "schema": connector.schema,
57
- "name": connector.name,
58
- }
59
- _ = self._client.json_rpc.call("define-external-jsonrpc-table", params)
60
-
61
- def _run(self):
62
- # for conn in TcpStreamConnection.serve(self._address, self._port):
63
- async def handler(conn: JsonRpcStreamConnection):
64
- @conn.method()
65
- def generate(
66
- inputs: list[Any] = [],
67
- name: str = "",
68
- limit=None,
69
- notify_timelimit=None,
70
- ):
71
- with self._lock:
72
- if name in self._gen_functions:
73
- return self._gen_functions[name](*inputs)
74
- else:
75
- raise ValueError(f"'{name}' not found in connectors.")
76
- await conn.wait_closed()
77
-
78
- async def close(self):
79
- with self._lock:
80
- await self._client.close()
81
-
82
- @property
83
- def is_closed(self) -> bool:
84
- with self._lock:
85
- return self._client.is_closed
86
-
87
-
88
- class Generator:
89
- def __init__(
90
- self, name: str, func: Callable[..., Any], inputs: list[str], cost: int
91
- ):
92
- self.name = name
93
- self.func = func
94
- self.inputs = inputs
95
- self.cost = cost
96
-
97
-
98
- class Connector:
99
- def __init__(
100
- self,
101
- *,
102
- name: str,
103
- columns: list[tuple[str, str | type]],
104
- schema: str = "DEMO",
105
- ):
106
- self.name = name
107
- self.schema = schema
108
- try:
109
- type_name = lambda ty: (
110
- sql_types[ty.__name__] if isinstance(ty, type) else ty
111
- )
112
- self.columns = [[name, type_name(ty)] for name, ty in columns]
113
- except KeyError as e:
114
- raise TypeError(f"Unsupported type in columns: {e}")
115
- self.generators: dict[str, Generator] = {}
116
- self.generator_count = 0
117
-
118
- def generate(self, cost: int = 1):
119
- def decorator(func: Callable[..., Any]):
120
- gen_name = f"{self.name}__{self.generator_count}"
121
- inputs = [
122
- param.name for param in inspect.signature(func).parameters.values()
123
- ]
124
- self.generators[gen_name] = Generator(gen_name, func, inputs, cost)
125
- self.generator_count += 1
126
- return func
127
-
128
- return decorator
129
-
130
- __all__ = ["ConnectorManager", "Connector", "Generator"]
File without changes