canvas 0.3.0__py3-none-any.whl → 0.4.0__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.
Potentially problematic release.
This version of canvas might be problematic. Click here for more details.
- {canvas-0.3.0.dist-info → canvas-0.4.0.dist-info}/METADATA +2 -1
- canvas-0.4.0.dist-info/RECORD +218 -0
- canvas_cli/apps/emit/__init__.py +3 -0
- canvas_cli/apps/emit/emit.py +67 -0
- canvas_cli/apps/emit/event_fixtures/ALLERGY_INTOLERANCE_CREATED.ndjson +1 -0
- canvas_cli/apps/emit/event_fixtures/ALLERGY_INTOLERANCE_UPDATED.ndjson +1 -0
- canvas_cli/apps/emit/event_fixtures/APPOINTMENT_CANCELED.ndjson +1 -0
- canvas_cli/apps/emit/event_fixtures/APPOINTMENT_CHECKED_IN.ndjson +1 -0
- canvas_cli/apps/emit/event_fixtures/APPOINTMENT_CREATED.ndjson +1 -0
- canvas_cli/apps/emit/event_fixtures/APPOINTMENT_NO_SHOWED.ndjson +1 -0
- canvas_cli/apps/emit/event_fixtures/APPOINTMENT_RESCHEDULED.ndjson +1 -0
- canvas_cli/apps/emit/event_fixtures/APPOINTMENT_RESTORED.ndjson +1 -0
- canvas_cli/apps/emit/event_fixtures/APPOINTMENT_UPDATED.ndjson +2 -0
- canvas_cli/apps/emit/event_fixtures/ASSESS_COMMAND__CONDITION_SELECTED.ndjson +1 -0
- canvas_cli/apps/emit/event_fixtures/ASSESS_COMMAND__POST_COMMIT.ndjson +3 -0
- canvas_cli/apps/emit/event_fixtures/ASSESS_COMMAND__POST_ORIGINATE.ndjson +4 -0
- canvas_cli/apps/emit/event_fixtures/ASSESS_COMMAND__POST_UPDATE.ndjson +5 -0
- canvas_cli/apps/emit/event_fixtures/ASSESS_COMMAND__PRE_COMMIT.ndjson +3 -0
- canvas_cli/apps/emit/event_fixtures/ASSESS_COMMAND__PRE_ORIGINATE.ndjson +4 -0
- canvas_cli/apps/emit/event_fixtures/ASSESS_COMMAND__PRE_UPDATE.ndjson +5 -0
- canvas_cli/apps/emit/event_fixtures/BILLING_LINE_ITEM_CREATED.ndjson +3 -0
- canvas_cli/apps/emit/event_fixtures/BILLING_LINE_ITEM_UPDATED.ndjson +2 -0
- canvas_cli/apps/emit/event_fixtures/CONDITION_ASSESSED.ndjson +2 -0
- canvas_cli/apps/emit/event_fixtures/CONDITION_CREATED.ndjson +4 -0
- canvas_cli/apps/emit/event_fixtures/CONDITION_UPDATED.ndjson +5 -0
- canvas_cli/apps/emit/event_fixtures/CRON.ndjson +3 -0
- canvas_cli/apps/emit/event_fixtures/ENCOUNTER_CREATED.ndjson +3 -0
- canvas_cli/apps/emit/event_fixtures/ENCOUNTER_UPDATED.ndjson +2 -0
- canvas_cli/apps/emit/event_fixtures/IMMUNIZATION_CREATED.ndjson +1 -0
- canvas_cli/apps/emit/event_fixtures/IMMUNIZATION_STATEMENT_CREATED.ndjson +1 -0
- canvas_cli/apps/emit/event_fixtures/IMMUNIZATION_STATEMENT_UPDATED.ndjson +1 -0
- canvas_cli/apps/emit/event_fixtures/IMMUNIZATION_UPDATED.ndjson +1 -0
- canvas_cli/apps/emit/event_fixtures/INTERVIEW_CREATED.ndjson +1 -0
- canvas_cli/apps/emit/event_fixtures/INTERVIEW_UPDATED.ndjson +1 -0
- canvas_cli/apps/emit/event_fixtures/LAB_ORDER_CREATED.ndjson +1 -0
- canvas_cli/apps/emit/event_fixtures/LAB_ORDER_UPDATED.ndjson +1 -0
- canvas_cli/apps/emit/event_fixtures/MEDICATION_LIST_ITEM_CREATED.ndjson +1 -0
- canvas_cli/apps/emit/event_fixtures/MEDICATION_LIST_ITEM_UPDATED.ndjson +1 -0
- canvas_cli/apps/emit/event_fixtures/MEDICATION_STATEMENT_COMMAND__POST_COMMIT.ndjson +1 -0
- canvas_cli/apps/emit/event_fixtures/MEDICATION_STATEMENT_COMMAND__POST_ORIGINATE.ndjson +1 -0
- canvas_cli/apps/emit/event_fixtures/MEDICATION_STATEMENT_COMMAND__POST_UPDATE.ndjson +2 -0
- canvas_cli/apps/emit/event_fixtures/MEDICATION_STATEMENT_COMMAND__PRE_COMMIT.ndjson +1 -0
- canvas_cli/apps/emit/event_fixtures/MEDICATION_STATEMENT_COMMAND__PRE_ORIGINATE.ndjson +1 -0
- canvas_cli/apps/emit/event_fixtures/MEDICATION_STATEMENT_COMMAND__PRE_UPDATE.ndjson +2 -0
- canvas_cli/apps/emit/event_fixtures/MEDICATION_STATEMENT__MEDICATION__POST_SEARCH.ndjson +2 -0
- canvas_cli/apps/emit/event_fixtures/PATIENT_CREATED.ndjson +1 -0
- canvas_cli/apps/emit/event_fixtures/PATIENT_UPDATED.ndjson +1 -0
- canvas_cli/apps/emit/event_fixtures/PLAN_COMMAND__POST_ORIGINATE.ndjson +1 -0
- canvas_cli/apps/emit/event_fixtures/PLAN_COMMAND__PRE_ORIGINATE.ndjson +1 -0
- canvas_cli/apps/emit/event_fixtures/QUESTIONNAIRE_COMMAND__POST_COMMIT.ndjson +1 -0
- canvas_cli/apps/emit/event_fixtures/QUESTIONNAIRE_COMMAND__POST_ORIGINATE.ndjson +1 -0
- canvas_cli/apps/emit/event_fixtures/QUESTIONNAIRE_COMMAND__POST_UPDATE.ndjson +2 -0
- canvas_cli/apps/emit/event_fixtures/QUESTIONNAIRE_COMMAND__PRE_COMMIT.ndjson +1 -0
- canvas_cli/apps/emit/event_fixtures/QUESTIONNAIRE_COMMAND__PRE_ORIGINATE.ndjson +1 -0
- canvas_cli/apps/emit/event_fixtures/QUESTIONNAIRE_COMMAND__PRE_UPDATE.ndjson +2 -0
- canvas_cli/apps/emit/event_fixtures/QUESTIONNAIRE__QUESTIONNAIRE__POST_SEARCH.ndjson +4 -0
- canvas_cli/apps/emit/event_fixtures/TASK_COMMENT_CREATED.ndjson +1 -0
- canvas_cli/apps/emit/event_fixtures/TASK_CREATED.ndjson +1 -0
- canvas_cli/apps/emit/event_fixtures/TASK_UPDATED.ndjson +1 -0
- canvas_cli/apps/emit/event_fixtures/VITAL_SIGN_CREATED.ndjson +14 -0
- canvas_cli/apps/emit/event_fixtures/VITAL_SIGN_UPDATED.ndjson +364 -0
- canvas_cli/apps/logs/logs.py +6 -6
- canvas_cli/apps/plugin/plugin.py +11 -7
- canvas_cli/apps/run_plugins/__init__.py +3 -0
- canvas_cli/apps/run_plugins/run_plugins.py +16 -0
- canvas_cli/main.py +8 -38
- canvas_cli/templates/plugins/default/{{ cookiecutter.__project_slug }}/README.md +0 -1
- canvas_cli/templates/plugins/default/{{ cookiecutter.__project_slug }}/protocols/my_protocol.py +1 -1
- canvas_cli/tests.py +12 -5
- canvas_cli/utils/context/context.py +2 -2
- canvas_cli/utils/context/tests.py +5 -4
- canvas_cli/utils/print/print.py +1 -1
- canvas_cli/utils/print/tests.py +2 -3
- canvas_generated/messages/events_pb2.py +2 -2
- canvas_generated/messages/events_pb2.pyi +12 -0
- canvas_sdk/base.py +2 -1
- canvas_sdk/commands/base.py +25 -25
- canvas_sdk/commands/tests/protocol/tests.py +5 -3
- canvas_sdk/commands/tests/test_utils.py +8 -44
- canvas_sdk/commands/tests/unit/tests.py +3 -3
- canvas_sdk/data/client.py +1 -1
- canvas_sdk/effects/banner_alert/tests.py +12 -4
- canvas_sdk/effects/protocol_card/protocol_card.py +1 -1
- canvas_sdk/effects/protocol_card/tests.py +2 -2
- canvas_sdk/protocols/clinical_quality_measure.py +1 -0
- canvas_sdk/utils/http.py +2 -2
- canvas_sdk/v1/data/base.py +1 -1
- canvas_sdk/v1/data/command.py +27 -0
- canvas_sdk/v1/data/common.py +46 -0
- canvas_sdk/v1/data/device.py +44 -0
- canvas_sdk/v1/data/imaging.py +102 -0
- canvas_sdk/v1/data/lab.py +182 -10
- canvas_sdk/v1/data/observation.py +117 -0
- canvas_sdk/v1/data/patient.py +4 -1
- canvas_sdk/v1/data/questionnaire.py +4 -2
- canvas_sdk/value_set/tests/test_value_sets.py +9 -6
- canvas_sdk/value_set/v2022/intervention.py +0 -24
- canvas_sdk/value_set/value_set.py +24 -21
- plugin_runner/__init__.py +0 -0
- plugin_runner/authentication.py +48 -0
- plugin_runner/plugin_runner.py +389 -0
- plugin_runner/plugin_synchronizer.py +87 -0
- plugin_runner/sandbox.py +273 -0
- pubsub/__init__.py +0 -0
- pubsub/pubsub.py +38 -0
- canvas-0.3.0.dist-info/RECORD +0 -145
- {canvas-0.3.0.dist-info → canvas-0.4.0.dist-info}/WHEEL +0 -0
- {canvas-0.3.0.dist-info → canvas-0.4.0.dist-info}/entry_points.txt +0 -0
plugin_runner/sandbox.py
ADDED
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
import ast
|
|
2
|
+
import builtins
|
|
3
|
+
from _ast import AnnAssign
|
|
4
|
+
from functools import cached_property
|
|
5
|
+
from typing import Any, cast
|
|
6
|
+
|
|
7
|
+
from RestrictedPython import (
|
|
8
|
+
CompileResult,
|
|
9
|
+
PrintCollector,
|
|
10
|
+
RestrictingNodeTransformer,
|
|
11
|
+
compile_restricted_exec,
|
|
12
|
+
safe_builtins,
|
|
13
|
+
utility_builtins,
|
|
14
|
+
)
|
|
15
|
+
from RestrictedPython.Eval import default_guarded_getitem
|
|
16
|
+
from RestrictedPython.Guards import (
|
|
17
|
+
guarded_iter_unpack_sequence,
|
|
18
|
+
guarded_unpack_sequence,
|
|
19
|
+
)
|
|
20
|
+
from RestrictedPython.transformer import (
|
|
21
|
+
ALLOWED_FUNC_NAMES,
|
|
22
|
+
FORBIDDEN_FUNC_NAMES,
|
|
23
|
+
copy_locations,
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
##
|
|
27
|
+
# ALLOWED_MODULES
|
|
28
|
+
#
|
|
29
|
+
# The modules in this list are the only ones that can be imported in a sandboxed
|
|
30
|
+
# runtime.
|
|
31
|
+
#
|
|
32
|
+
ALLOWED_MODULES = frozenset(
|
|
33
|
+
[
|
|
34
|
+
"_strptime",
|
|
35
|
+
"arrow",
|
|
36
|
+
"base64",
|
|
37
|
+
"cached_property",
|
|
38
|
+
"canvas_sdk.commands",
|
|
39
|
+
"canvas_sdk.data",
|
|
40
|
+
"canvas_sdk.effects",
|
|
41
|
+
"canvas_sdk.events",
|
|
42
|
+
"canvas_sdk.handlers",
|
|
43
|
+
"canvas_sdk.protocols",
|
|
44
|
+
"canvas_sdk.utils",
|
|
45
|
+
"canvas_sdk.v1",
|
|
46
|
+
"canvas_sdk.value_set",
|
|
47
|
+
"canvas_sdk.views",
|
|
48
|
+
"contextlib",
|
|
49
|
+
"datetime",
|
|
50
|
+
"dateutil",
|
|
51
|
+
"enum",
|
|
52
|
+
"functools",
|
|
53
|
+
"hashlib",
|
|
54
|
+
"hmac",
|
|
55
|
+
"http",
|
|
56
|
+
"json",
|
|
57
|
+
"logger",
|
|
58
|
+
"math",
|
|
59
|
+
"operator",
|
|
60
|
+
"pickletools",
|
|
61
|
+
"random",
|
|
62
|
+
"re",
|
|
63
|
+
"requests",
|
|
64
|
+
"string",
|
|
65
|
+
"time",
|
|
66
|
+
"traceback",
|
|
67
|
+
"typing",
|
|
68
|
+
"urllib",
|
|
69
|
+
"uuid",
|
|
70
|
+
]
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def _is_known_module(name: str) -> bool:
|
|
75
|
+
return any(name.startswith(m) for m in ALLOWED_MODULES)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def _safe_import(name: str, *args: Any, **kwargs: Any) -> Any:
|
|
79
|
+
if not _is_known_module(name):
|
|
80
|
+
raise ImportError(f"{name!r} is not an allowed import.")
|
|
81
|
+
return __import__(name, *args, **kwargs)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def _unrestricted(_ob: Any, *args: Any, **kwargs: Any) -> Any:
|
|
85
|
+
"""Return the given object, unmodified."""
|
|
86
|
+
return _ob
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def _apply(_ob: Any, *args: Any, **kwargs: Any) -> Any:
|
|
90
|
+
"""Call the bound method with args, support calling super().__init__()."""
|
|
91
|
+
return _ob(*args, **kwargs)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
class Sandbox:
|
|
95
|
+
"""A restricted sandbox for safely executing arbitrary Python code."""
|
|
96
|
+
|
|
97
|
+
source_code: str
|
|
98
|
+
namespace: str
|
|
99
|
+
|
|
100
|
+
class Transformer(RestrictingNodeTransformer):
|
|
101
|
+
"""A node transformer for customizing the sandbox compiler."""
|
|
102
|
+
|
|
103
|
+
def visit_AnnAssign(self, node: AnnAssign) -> AnnAssign:
|
|
104
|
+
"""Allow type annotations."""
|
|
105
|
+
return node
|
|
106
|
+
|
|
107
|
+
def check_import_names(self, node: ast.ImportFrom) -> ast.AST:
|
|
108
|
+
"""Check the names being imported.
|
|
109
|
+
|
|
110
|
+
This is a protection against rebinding dunder names like
|
|
111
|
+
_getitem_, _write_ via imports.
|
|
112
|
+
|
|
113
|
+
=> 'from _a import x' is ok, because '_a' is not added to the scope.
|
|
114
|
+
"""
|
|
115
|
+
for name in node.names:
|
|
116
|
+
if "*" in name.name and node.module and not _is_known_module(node.module):
|
|
117
|
+
self.error(node, '"*" imports are not allowed.')
|
|
118
|
+
self.check_name(node, name.name)
|
|
119
|
+
if name.asname:
|
|
120
|
+
self.check_name(node, name.asname)
|
|
121
|
+
|
|
122
|
+
return self.node_contents_visit(node)
|
|
123
|
+
|
|
124
|
+
def check_name(
|
|
125
|
+
self, node: ast.ImportFrom, name: str | None, allow_magic_methods: bool = False
|
|
126
|
+
) -> None:
|
|
127
|
+
"""Check names if they are allowed.
|
|
128
|
+
|
|
129
|
+
If ``allow_magic_methods is True`` names in `ALLOWED_FUNC_NAMES`
|
|
130
|
+
are additionally allowed although their names start with `_`.
|
|
131
|
+
|
|
132
|
+
Override to turn errors into warnings for leading underscores.
|
|
133
|
+
"""
|
|
134
|
+
if name is None:
|
|
135
|
+
return
|
|
136
|
+
|
|
137
|
+
if (
|
|
138
|
+
name.startswith("_")
|
|
139
|
+
and name != "_"
|
|
140
|
+
and not (
|
|
141
|
+
allow_magic_methods and name in ALLOWED_FUNC_NAMES and node.col_offset != 0
|
|
142
|
+
)
|
|
143
|
+
):
|
|
144
|
+
self.warn(
|
|
145
|
+
node,
|
|
146
|
+
'"{name}" is an invalid variable name because it '
|
|
147
|
+
'starts with "_"'.format(name=name),
|
|
148
|
+
)
|
|
149
|
+
elif name.endswith("__roles__"):
|
|
150
|
+
self.error(
|
|
151
|
+
node,
|
|
152
|
+
'"%s" is an invalid variable name because ' 'it ends with "__roles__".' % name,
|
|
153
|
+
)
|
|
154
|
+
elif name in FORBIDDEN_FUNC_NAMES:
|
|
155
|
+
self.error(node, f'"{name}" is a reserved name.')
|
|
156
|
+
|
|
157
|
+
def visit_Attribute(self, node: ast.Attribute) -> ast.AST:
|
|
158
|
+
"""Checks and mutates attribute access/assignment.
|
|
159
|
+
|
|
160
|
+
'a.b' becomes '_getattr_(a, "b")'
|
|
161
|
+
'a.b = c' becomes '_write_(a).b = c'
|
|
162
|
+
'del a.b' becomes 'del _write_(a).b'
|
|
163
|
+
|
|
164
|
+
The _write_ function should return a security proxy.
|
|
165
|
+
|
|
166
|
+
Override to turn errors into warnings for leading underscores.
|
|
167
|
+
"""
|
|
168
|
+
if node.attr.startswith("_") and node.attr != "_":
|
|
169
|
+
self.warn(
|
|
170
|
+
node,
|
|
171
|
+
'"{name}" is an invalid attribute name because it starts '
|
|
172
|
+
'with "_".'.format(name=node.attr),
|
|
173
|
+
)
|
|
174
|
+
|
|
175
|
+
if node.attr.endswith("__roles__"):
|
|
176
|
+
self.error(
|
|
177
|
+
node,
|
|
178
|
+
'"{name}" is an invalid attribute name because it ends '
|
|
179
|
+
'with "__roles__".'.format(name=node.attr),
|
|
180
|
+
)
|
|
181
|
+
|
|
182
|
+
if isinstance(node.ctx, ast.Load):
|
|
183
|
+
node = self.node_contents_visit(node)
|
|
184
|
+
new_node = ast.Call(
|
|
185
|
+
func=ast.Name("_getattr_", ast.Load()),
|
|
186
|
+
args=[node.value, ast.Str(node.attr)],
|
|
187
|
+
keywords=[],
|
|
188
|
+
)
|
|
189
|
+
|
|
190
|
+
copy_locations(new_node, node)
|
|
191
|
+
return new_node
|
|
192
|
+
|
|
193
|
+
elif isinstance(node.ctx, (ast.Store, ast.Del)):
|
|
194
|
+
node = self.node_contents_visit(node)
|
|
195
|
+
new_value = ast.Call(
|
|
196
|
+
func=ast.Name("_write_", ast.Load()), args=[node.value], keywords=[]
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
copy_locations(new_value, node.value)
|
|
200
|
+
node.value = new_value
|
|
201
|
+
return node
|
|
202
|
+
|
|
203
|
+
else: # pragma: no cover
|
|
204
|
+
# Impossible Case only ctx Load, Store and Del are defined in ast.
|
|
205
|
+
raise NotImplementedError(f"Unknown ctx type: {type(node.ctx)}")
|
|
206
|
+
|
|
207
|
+
def __init__(self, source_code: str, namespace: str | None = None) -> None:
|
|
208
|
+
if source_code is None:
|
|
209
|
+
raise TypeError("source_code may not be None")
|
|
210
|
+
self.namespace = namespace or "protocols"
|
|
211
|
+
self.source_code = source_code
|
|
212
|
+
|
|
213
|
+
@cached_property
|
|
214
|
+
def scope(self) -> dict[str, Any]:
|
|
215
|
+
"""Return the scope used for evaluation."""
|
|
216
|
+
return {
|
|
217
|
+
"__builtins__": {
|
|
218
|
+
**safe_builtins.copy(),
|
|
219
|
+
**utility_builtins.copy(),
|
|
220
|
+
"__import__": _safe_import,
|
|
221
|
+
"classmethod": builtins.classmethod,
|
|
222
|
+
"staticmethod": builtins.staticmethod,
|
|
223
|
+
"any": builtins.any,
|
|
224
|
+
"all": builtins.all,
|
|
225
|
+
"enumerate": builtins.enumerate,
|
|
226
|
+
"property": builtins.property,
|
|
227
|
+
"super": builtins.super,
|
|
228
|
+
"dict": builtins.dict,
|
|
229
|
+
"filter": builtins.filter,
|
|
230
|
+
"max": builtins.max,
|
|
231
|
+
"min": builtins.min,
|
|
232
|
+
"list": builtins.list,
|
|
233
|
+
"next": builtins.next,
|
|
234
|
+
"iter": builtins.iter,
|
|
235
|
+
"type": builtins.type,
|
|
236
|
+
},
|
|
237
|
+
"__metaclass__": type,
|
|
238
|
+
"__name__": self.namespace,
|
|
239
|
+
"_write_": _unrestricted,
|
|
240
|
+
"_getiter_": _unrestricted,
|
|
241
|
+
"_getitem_": default_guarded_getitem,
|
|
242
|
+
"_getattr_": getattr,
|
|
243
|
+
"_print_": PrintCollector,
|
|
244
|
+
"_apply_": _apply,
|
|
245
|
+
"_inplacevar_": _unrestricted,
|
|
246
|
+
"_iter_unpack_sequence_": guarded_iter_unpack_sequence,
|
|
247
|
+
"_unpack_sequence_": guarded_unpack_sequence,
|
|
248
|
+
"hasattr": hasattr,
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
@cached_property
|
|
252
|
+
def compile_result(self) -> CompileResult:
|
|
253
|
+
"""Compile the source code into bytecode."""
|
|
254
|
+
return compile_restricted_exec(self.source_code, policy=self.Transformer)
|
|
255
|
+
|
|
256
|
+
@property
|
|
257
|
+
def errors(self) -> tuple[str, ...]:
|
|
258
|
+
"""Return errors encountered when compiling the source code."""
|
|
259
|
+
return cast(tuple[str, ...], self.compile_result.errors)
|
|
260
|
+
|
|
261
|
+
@property
|
|
262
|
+
def warnings(self) -> tuple[str, ...]:
|
|
263
|
+
"""Return warnings encountered when compiling the source code."""
|
|
264
|
+
return cast(tuple[str, ...], self.compile_result.warnings)
|
|
265
|
+
|
|
266
|
+
def execute(self) -> dict:
|
|
267
|
+
"""Execute the given code in a restricted sandbox."""
|
|
268
|
+
if self.errors:
|
|
269
|
+
raise RuntimeError(f"Code is invalid: {self.errors}")
|
|
270
|
+
|
|
271
|
+
exec(self.compile_result.code, self.scope)
|
|
272
|
+
|
|
273
|
+
return self.scope
|
pubsub/__init__.py
ADDED
|
File without changes
|
pubsub/pubsub.py
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import os
|
|
2
|
+
from typing import Any
|
|
3
|
+
|
|
4
|
+
import redis
|
|
5
|
+
|
|
6
|
+
REDIS_ENDPOINT = os.getenv("REDIS_ENDPOINT")
|
|
7
|
+
CUSTOMER_IDENTIFIER = os.getenv("CUSTOMER_IDENTIFIER")
|
|
8
|
+
CHANNEL_SUFFIX = "plugin-logging-stream"
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class PubSubBase:
|
|
12
|
+
"""Base class for pub/sub."""
|
|
13
|
+
|
|
14
|
+
def __init__(self) -> None:
|
|
15
|
+
self.redis_endpoint = REDIS_ENDPOINT
|
|
16
|
+
self.channel = self._get_channel_name()
|
|
17
|
+
self.client = self._create_client()
|
|
18
|
+
|
|
19
|
+
def _get_channel_name(self) -> str | None:
|
|
20
|
+
if CUSTOMER_IDENTIFIER:
|
|
21
|
+
return f"{CUSTOMER_IDENTIFIER}:{CHANNEL_SUFFIX}"
|
|
22
|
+
|
|
23
|
+
return None
|
|
24
|
+
|
|
25
|
+
def _create_client(self) -> redis.Redis | None:
|
|
26
|
+
if self.redis_endpoint and self.channel:
|
|
27
|
+
return redis.Redis.from_url(self.redis_endpoint, decode_responses=True)
|
|
28
|
+
|
|
29
|
+
return None
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class Publisher(PubSubBase):
|
|
33
|
+
"""Publisher class for pub/sub."""
|
|
34
|
+
|
|
35
|
+
def publish(self, message: Any) -> None:
|
|
36
|
+
"""Publishes a message to the channel."""
|
|
37
|
+
if self.client and self.channel:
|
|
38
|
+
self.client.publish(self.channel, message)
|
canvas-0.3.0.dist-info/RECORD
DELETED
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
canvas_cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
-
canvas_cli/apps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
3
|
-
canvas_cli/apps/auth/__init__.py,sha256=gIwJ2qWvRlLqbiRkudrGqTKV-orlb8OTkG487qoRda4,105
|
|
4
|
-
canvas_cli/apps/auth/tests.py,sha256=WK7hSLTK95gEweMRaj3RdPC-qSwjnuulxMUg6D0bY_k,4528
|
|
5
|
-
canvas_cli/apps/auth/utils.py,sha256=IH5oZB3pdlb4_FRfCZKkNTncx_kdKagpiBqlhtM8h2U,5434
|
|
6
|
-
canvas_cli/apps/logs/__init__.py,sha256=ehY9SRb6nBw81xZF50yyBlUZJtNR2VeVSNI5sFuWJ7o,64
|
|
7
|
-
canvas_cli/apps/logs/logs.py,sha256=Ixue8Z1wgxABunVIx6TzmsH6oZ0FPf2H51Sd3nFUnAI,1969
|
|
8
|
-
canvas_cli/apps/plugin/__init__.py,sha256=G_nLsu6cdko5OjatnbqUyEboGcNlGGLwpZmCBxMKdfo,236
|
|
9
|
-
canvas_cli/apps/plugin/plugin.py,sha256=9U-lvAVdPbHdUKkOaYO2OwjwY-XHDB9oHFjkTkJyV38,14228
|
|
10
|
-
canvas_cli/apps/plugin/tests.py,sha256=nH-LunSfkpFIvcONVeJxr8JQ-z5vZmuZFaZJanB2m2s,2661
|
|
11
|
-
canvas_cli/conftest.py,sha256=pGvVS6VT0Zll_Lp3ezLh2jykOk-2HTBVH8RP5FwLUVw,930
|
|
12
|
-
canvas_cli/main.py,sha256=lUCh5M7u0KJ9CWOL_oPa0J4284ggxHxteURYv6dGU4g,3790
|
|
13
|
-
canvas_cli/templates/plugins/default/cookiecutter.json,sha256=dWEB3wJ8U4bko8jX26PgLLg_jgWlafLTNqsGnY1PUcg,124
|
|
14
|
-
canvas_cli/templates/plugins/default/{{ cookiecutter.__project_slug }}/CANVAS_MANIFEST.json,sha256=9N0u5hN0GqjPvUh_B3YHtvyntEvxUGbInbQeprU0TS0,787
|
|
15
|
-
canvas_cli/templates/plugins/default/{{ cookiecutter.__project_slug }}/README.md,sha256=7QdF2JWlWwq6Us9LzkO9XWJU4IU7Q6RD_w8ImcS-hrI,347
|
|
16
|
-
canvas_cli/templates/plugins/default/{{ cookiecutter.__project_slug }}/protocols/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
17
|
-
canvas_cli/templates/plugins/default/{{ cookiecutter.__project_slug }}/protocols/my_protocol.py,sha256=liFrvx-5NRfeODOBbRNB1Cg0P04UvxpAkkLtAiEmckQ,2252
|
|
18
|
-
canvas_cli/tests.py,sha256=64aAOgHrC09UeWqsFo__K3zmSHrXHCtMJAc1rE7ziTc,5916
|
|
19
|
-
canvas_cli/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
20
|
-
canvas_cli/utils/context/__init__.py,sha256=HhYvI-hydP0mV18nJiU7uo5gk0yN7EYNgouxieoGDOE,102
|
|
21
|
-
canvas_cli/utils/context/context.py,sha256=Q-MniBuvzDKhLODOOrOVdaRTLz9Lp0m7cAz-i6YRRpA,5138
|
|
22
|
-
canvas_cli/utils/context/tests.py,sha256=aNmAggwvjKV-1WrgIvp66M46EX2QCbbHmity3bSCBTg,4211
|
|
23
|
-
canvas_cli/utils/print/__init__.py,sha256=zkRiQCUhPIB3wNGeJ1Hwfd12zJyvbRRiWqequJORvdE,88
|
|
24
|
-
canvas_cli/utils/print/print.py,sha256=GejLUtC5hfWuKHUBapyEwVHNIaIILxW60_xBQchiGpI,1420
|
|
25
|
-
canvas_cli/utils/print/tests.py,sha256=4kqp_uMpUUjSXokD_Hxs2aMyx50_JzGABAQoNC4XTrM,2376
|
|
26
|
-
canvas_cli/utils/urls/__init__.py,sha256=08hlrQhQ1pKBjlIRaC0j53IkgK723jfK8-j3djvR0ko,81
|
|
27
|
-
canvas_cli/utils/urls/tests.py,sha256=opXDF2i3lXTdsKJ7ywIRzWDDzZ5KAO0JbGIR3hbJdoE,407
|
|
28
|
-
canvas_cli/utils/urls/urls.py,sha256=KwWTh5ERrEsZEvdBrZpZB71xtyWkDuglpXUbycWmBOo,798
|
|
29
|
-
canvas_cli/utils/validators/__init__.py,sha256=rBvSR2O1hWkNAnUBdcr-zUkmqT796_A61b9pnvEhwrM,113
|
|
30
|
-
canvas_cli/utils/validators/manifest_schema.py,sha256=_WCqFat9AGnOdYWQh20hfWJL-_4d3gDY5PpNQt2AHIE,3165
|
|
31
|
-
canvas_cli/utils/validators/tests.py,sha256=cZHLSx7oteOfLOoU1tXGvw88n6itcvUT2B3ZBg-bmEY,1206
|
|
32
|
-
canvas_cli/utils/validators/validators.py,sha256=lrUBQ0sF7seTe_pNGsNgASdr2BGp6g-Qui58V4H9qfQ,1598
|
|
33
|
-
canvas_generated/messages/effects_pb2.py,sha256=2ie5j_MhD4boYsIZiDIWE30xSCXl4nunXcuQcMUkzTY,7800
|
|
34
|
-
canvas_generated/messages/effects_pb2.pyi,sha256=ecDvQX8UYu0rb-4g6QVSgNWMT9v2WOJwiBdJ0JpU-IU,13349
|
|
35
|
-
canvas_generated/messages/effects_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
|
|
36
|
-
canvas_generated/messages/events_pb2.py,sha256=d-ZeaAB4F_Ts_Hzb3vNCDZ3z43ChbTSAW71WLeZDvhc,33226
|
|
37
|
-
canvas_generated/messages/events_pb2.pyi,sha256=_8IzwXvyrVbmOeVT7ILIx60vFyWMec4cxxL_jdKEgpk,59008
|
|
38
|
-
canvas_generated/messages/events_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
|
|
39
|
-
canvas_generated/messages/plugins_pb2.py,sha256=j2yt9uoSlVMtWg-cAoOmxiT-XWbBrqqCBZXOxEz7z4g,1271
|
|
40
|
-
canvas_generated/messages/plugins_pb2.pyi,sha256=G1seqytP8GlJJh-AL2CJ0VyUNlReEvK61C-Oh8QuGiE,501
|
|
41
|
-
canvas_generated/messages/plugins_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
|
|
42
|
-
canvas_generated/services/plugin_runner_pb2.py,sha256=RfAo_imYoSuoexq-1IHhMhXZgQpzq91pqugxsigL8NU,1557
|
|
43
|
-
canvas_generated/services/plugin_runner_pb2.pyi,sha256=1w-Pa4k7HtlmQAr7B6sgV64zdZplBKQKHN-S8bjwO3w,265
|
|
44
|
-
canvas_generated/services/plugin_runner_pb2_grpc.py,sha256=EzJJVkP_AZ3dwBA7OxUito0NSalRmjjg8q9TZ_P18ww,4549
|
|
45
|
-
canvas_sdk/__init__.py,sha256=d7V1Qsp4hSqp8opmvqp-0J33uibArUjwENMfzSDAdZg,102
|
|
46
|
-
canvas_sdk/base.py,sha256=DvkCWdeSEFKJGtYmbI1CCGGovGBdOrXz5XnZ88HeR3g,1811
|
|
47
|
-
canvas_sdk/commands/__init__.py,sha256=ApJy2i8IRCL2YFUumk1q-YihLL2YcmLYKKiWFK04evY,2365
|
|
48
|
-
canvas_sdk/commands/base.py,sha256=Z5JN793VSoLvaVqSmyHs4extxIMoKB5XR3jG38wx2BE,5147
|
|
49
|
-
canvas_sdk/commands/commands/allergy.py,sha256=_S0tY43sErRlTeUGCC6Thb8gMSD_JiOmRSFdLaDlr48,1296
|
|
50
|
-
canvas_sdk/commands/commands/assess.py,sha256=IjsvkhzKinRaykMRzbnk6G4JAkzDhyqGG6ZvjDhNAuE,1723
|
|
51
|
-
canvas_sdk/commands/commands/close_goal.py,sha256=RTmi8fGPEEag8YSrlsPn7sy9Y-WymVuU8IWpXRKgNjg,792
|
|
52
|
-
canvas_sdk/commands/commands/diagnose.py,sha256=eM-hGfwoFgRWHDvpSBxni5uxQDxJHDrMFBz0N0nOcsA,1007
|
|
53
|
-
canvas_sdk/commands/commands/family_history.py,sha256=uXUQ0xHE2Ye2uJecAim96gID_WCZtwXvTC9nCnuLWcE,590
|
|
54
|
-
canvas_sdk/commands/commands/goal.py,sha256=VTRJp_w6bEM3CG8nHCL1FqbhrQqtAYT3YCiLM22fE-w,1599
|
|
55
|
-
canvas_sdk/commands/commands/history_present_illness.py,sha256=AcF1835FkqBqgXyeSMkXnGrOqg7jvNXkfP7-JV60ii4,428
|
|
56
|
-
canvas_sdk/commands/commands/instruct.py,sha256=M8YxdzolIbOkMw-ZrXKCX4jDKyBlkSrtfkCCJboSjcQ,507
|
|
57
|
-
canvas_sdk/commands/commands/lab_order.py,sha256=hkPeVBm8Gv1q9i_6mPCG7G4Xnamqkg8l7H4ZGljE9tQ,1046
|
|
58
|
-
canvas_sdk/commands/commands/medical_history.py,sha256=NZiiQFY4mV6IlWPAKhqI6Xl7oGS-m_-xsxGtFGGrpqw,1190
|
|
59
|
-
canvas_sdk/commands/commands/medication_statement.py,sha256=qnX--dtB5wV9Jz6smhq_9coStXlZNwMrN4YnETApuPY,1020
|
|
60
|
-
canvas_sdk/commands/commands/past_surgical_history.py,sha256=mbY1G8MG8jFmyBNL633EL3z3hQDOJfl0tCgBlpQ0M8s,887
|
|
61
|
-
canvas_sdk/commands/commands/perform.py,sha256=FpumHzPJp5pzb4F0CBW2QbSWdR_5mpib1PTOK5amvZc,470
|
|
62
|
-
canvas_sdk/commands/commands/plan.py,sha256=uxjXmdNcG32R4S0CJ7fqDaaXTMiJJH9RuvwlWuztlZ0,403
|
|
63
|
-
canvas_sdk/commands/commands/prescribe.py,sha256=crgL2FnS8FaLu-C9GWQeMe9W7_gnvO5OH_ku_sVr8OA,2223
|
|
64
|
-
canvas_sdk/commands/commands/questionnaire.py,sha256=Giu4stTzpddO8fH3iVyxm2lUeDwe7AmhfuIfb_0WUj4,644
|
|
65
|
-
canvas_sdk/commands/commands/reason_for_visit.py,sha256=20i2A8V4of_Q-Kqb37k-fUJ-JaHVGsrMtoIGZAYhPNw,1480
|
|
66
|
-
canvas_sdk/commands/commands/refill.py,sha256=HC9Nl3_BkGn3HRZ-4YNT9lqIywFVom6PyJChK3_0Zyc,458
|
|
67
|
-
canvas_sdk/commands/commands/remove_allergy.py,sha256=6CXo3s63z7oqMlROExPWudQBZeSvD3x0SC_efQSb0Lw,748
|
|
68
|
-
canvas_sdk/commands/commands/stop_medication.py,sha256=h-I95y2P7EgOsKMarHDp8C_MVdpB90e-fzqDWv8-haM,715
|
|
69
|
-
canvas_sdk/commands/commands/task.py,sha256=5oQRIocOUKr6O__XMFFr-2DjZv-q1zA0Erbj4_hkruw,1330
|
|
70
|
-
canvas_sdk/commands/commands/update_diagnosis.py,sha256=fqPcKBaiRemo8Qa4H4g6ZvKM2YczVlj9FxpBGjs8J9Q,824
|
|
71
|
-
canvas_sdk/commands/commands/update_goal.py,sha256=ddvxlDnoTm5k-G5aJ-pW2fMIC-s5K8jYia9tISXsxAk,1580
|
|
72
|
-
canvas_sdk/commands/commands/vitals.py,sha256=ZmAok_oMy5Txv52cEmwnLWi0ET9BLmRIMgpbjtMTa4c,3155
|
|
73
|
-
canvas_sdk/commands/constants.py,sha256=eYzVI3wKBQUfRbfDm8CoGaKWmkBOwtDeeL91znK6a5A,341
|
|
74
|
-
canvas_sdk/commands/tests/protocol/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
75
|
-
canvas_sdk/commands/tests/protocol/tests.py,sha256=Pke6UTH3hLXUevWsG0U2KKH3wWxY1KKrZ4-5iFCdCws,1464
|
|
76
|
-
canvas_sdk/commands/tests/schema/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
77
|
-
canvas_sdk/commands/tests/schema/tests.py,sha256=ggegssIRQK1ACn7oFp31tCsq19reUfsAvM9OL7mh67s,3505
|
|
78
|
-
canvas_sdk/commands/tests/test_utils.py,sha256=6fXsyZt9eyHNgOKoW3kpAxJA62WnrBA0_WmMc1SlByc,10411
|
|
79
|
-
canvas_sdk/commands/tests/unit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
80
|
-
canvas_sdk/commands/tests/unit/tests.py,sha256=2AG_YRjFIcgTwLBnWv4OJzsxJmVTXm51APAxP-qIffk,9673
|
|
81
|
-
canvas_sdk/data/__init__.py,sha256=dmqlcw11-0DCbH2lOebwBCq6njSQ6BDhxygmncUgZRs,28
|
|
82
|
-
canvas_sdk/data/base.py,sha256=XgVAOoT_sOZtavJn0Q5WxRmeZWborvpAuSP2ZbV9cbI,868
|
|
83
|
-
canvas_sdk/data/client.py,sha256=hLOVEDd4NAZsOLBcFQIZ_nttWo7EDRWtgNnZAuOzAyA,2105
|
|
84
|
-
canvas_sdk/data/patient.py,sha256=dkfv59VIOyDfHr2tdFcwFikPDDGjrIm1XrVtEh82XyQ,167
|
|
85
|
-
canvas_sdk/data/staff.py,sha256=Po-NH2UdGTTP4LnUzfItfzriJKdul-2Cd31oq9uFHQE,210
|
|
86
|
-
canvas_sdk/data/task.py,sha256=UpjWjB1QqClR83zeqFcM7b7gg2w0NjfzNKsWrgShN_s,1995
|
|
87
|
-
canvas_sdk/effects/__init__.py,sha256=oChQi5y_8mK2zDiNMwWYp6CaQX1_zbmwXILPF7iSt-4,69
|
|
88
|
-
canvas_sdk/effects/banner_alert/__init__.py,sha256=8z5l9rwonKEcRkvD5q4DWvHPYhKJzwyGuUYoUNKYwX4,158
|
|
89
|
-
canvas_sdk/effects/banner_alert/add_banner_alert.py,sha256=RhMEIc62T5rLO_FltGvOq0XVU_wXIdCcBpxfaQeqCJY,1497
|
|
90
|
-
canvas_sdk/effects/banner_alert/remove_banner_alert.py,sha256=9oLetlX_22B3iRwVZqB4IpA9e9YqZ_1cmWV4vJRNDmE,559
|
|
91
|
-
canvas_sdk/effects/banner_alert/tests.py,sha256=t0SrJGeW1WpCXFIdA7AzslqGR-4iU0ohbi7hzD9lmGg,7472
|
|
92
|
-
canvas_sdk/effects/base.py,sha256=cyTEQ4p3IxZ3mPu6Ancr4Y7RcrVirWBbNUs9V6g7Odc,674
|
|
93
|
-
canvas_sdk/effects/patient_chart_summary_configuration.py,sha256=VdrQgfTJpfqM1ll0nLJisVRQ5HZ-D9F70lHfZOOSeCI,1148
|
|
94
|
-
canvas_sdk/effects/protocol_card/__init__.py,sha256=ESzUYajBBmcTAad2PIwHuV3SgGj4B9JHtf9uop_V4YA,88
|
|
95
|
-
canvas_sdk/effects/protocol_card/protocol_card.py,sha256=vGqwGGDLmftnIAgLqrhGaMUPg1VX6LWUBoNoVMsvaPc,2443
|
|
96
|
-
canvas_sdk/effects/protocol_card/tests.py,sha256=KQhGFWcAlOzEyGYnlRgloMiutdGAv39SITKmcc6WtRg,6413
|
|
97
|
-
canvas_sdk/events/__init__.py,sha256=JGZ-3uf0Luzr4kg5UqduupD4w6B2WVEgQ9WlcoMaPwE,81
|
|
98
|
-
canvas_sdk/handlers/__init__.py,sha256=VVz2_Xyb9720R2MZmSbGPG0T8u2a5u6zSDkWlwiJZv4,49
|
|
99
|
-
canvas_sdk/handlers/base.py,sha256=7kw95-nYOsphP2_dVoJxBvi2RsuUpwBo5RcKvo924Yw,599
|
|
100
|
-
canvas_sdk/handlers/cron_task.py,sha256=Q4_D3bDKE5hyEpCf0JnGSgZlnLh_g9RSP3oEfIuLJ9Y,945
|
|
101
|
-
canvas_sdk/protocols/__init__.py,sha256=t9PD9lCQbWPT1tW6s8w8J5nK-Hb4i5MLCSKnX2Q3eow,132
|
|
102
|
-
canvas_sdk/protocols/base.py,sha256=Tn2PrQrP-idp8qGx6HAVhaal0FEKcf7x31zDPpBAl1s,571
|
|
103
|
-
canvas_sdk/protocols/clinical_quality_measure.py,sha256=3uA3gQBGcLNfg0GpBsS5_RIC4fzoaUkMKwklHjMys0s,1183
|
|
104
|
-
canvas_sdk/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
105
|
-
canvas_sdk/utils/__init__.py,sha256=sFuhqcWvXb2-33FOuXZgWuUeC5jZL2MDoqjGoQZGwd8,60
|
|
106
|
-
canvas_sdk/utils/db.py,sha256=0AO5bhu-k9OsAHpXe1RHzyDZnBGHUEzrv8-vYtTIoeA,592
|
|
107
|
-
canvas_sdk/utils/http.py,sha256=1f50xdXdJp_DWIpb0uXKeCvLVS8-VDYWG5NVSXsYMxo,2225
|
|
108
|
-
canvas_sdk/utils/stats.py,sha256=sJhIW_IssUVefQN6rrUAt1P0KvVIUIYcnpZlMHLibNA,732
|
|
109
|
-
canvas_sdk/utils/tests.py,sha256=t3MScbIfzXkQttMIvj0dRzJlFVS8LFU8WgWRrChM-H0,1931
|
|
110
|
-
canvas_sdk/v1/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
111
|
-
canvas_sdk/v1/data/__init__.py,sha256=LWAcICOx4fWea_lp_yNt0UIuhgjZMoNOaWx-7ZuM-dg,132
|
|
112
|
-
canvas_sdk/v1/data/allergy_intolerance.py,sha256=KJg7UR8BJMuASWL5zXZ57JTmC0TQT7FAnODPvdq2mFg,2093
|
|
113
|
-
canvas_sdk/v1/data/base.py,sha256=wSFarS53MS0yCtL9xWov8JIuhRf1ClelNCwVhvoKjMM,3502
|
|
114
|
-
canvas_sdk/v1/data/condition.py,sha256=hJ3APJvRh-dKYwujujdo5kugnc6YXBES7YpUIKUTjhI,1525
|
|
115
|
-
canvas_sdk/v1/data/lab.py,sha256=Ni_yTcye_GeDZGTVFU3ENHBA1LzOqrO1-B6Rd8Vk5Bw,3754
|
|
116
|
-
canvas_sdk/v1/data/medication.py,sha256=XbV_iYgt40n8Q1IcVPtsinW2v-VJEms4T13cFNquBRE,1798
|
|
117
|
-
canvas_sdk/v1/data/patient.py,sha256=6tMNSpuzYCe_wZ-7rogz_pPVtT0KN3_nHW00_0LMPuI,1837
|
|
118
|
-
canvas_sdk/v1/data/questionnaire.py,sha256=kG707mDOLbvpZYdK7WyVUlaGK_0XySi2sgRwAHvhdsE,6773
|
|
119
|
-
canvas_sdk/v1/data/user.py,sha256=DmA8fNNGwiNOmuR-RYxQw1NpxN5yYhgwtRtRBRJ_22g,309
|
|
120
|
-
canvas_sdk/value_set/tests/test_value_sets.py,sha256=fl-E1vJN_wnWcr88atoK83N_muX-HrZoRj_aZTl9GpY,2655
|
|
121
|
-
canvas_sdk/value_set/v2022/adverse_event.py,sha256=8zsNFBsLDRY0mrPomzogD-W15xyo2CFFkiEcT2ruGCg,1032
|
|
122
|
-
canvas_sdk/value_set/v2022/allergy.py,sha256=n_P8Aqso5M6spTsatp4K4hzlbwaC3rjUBZs2bZsFVVg,11132
|
|
123
|
-
canvas_sdk/value_set/v2022/assessment.py,sha256=a9hoSxz_VLhfWJp-QrvIUmzSf_cK7x5Da7JsNapg17U,8342
|
|
124
|
-
canvas_sdk/value_set/v2022/communication.py,sha256=FlWMUDx_CKxEVw7JktTzSBykFEHRz2QA6aVVGowwUAc,18036
|
|
125
|
-
canvas_sdk/value_set/v2022/condition.py,sha256=S6gsxSPDF0CupZTi0rH7nqb_8mBynyPr6487vHzhdcM,3390031
|
|
126
|
-
canvas_sdk/value_set/v2022/device.py,sha256=TvEXAzC_nnzmHEY2cWZqfLr_niFyXsJ5YqUetiQI-bU,12983
|
|
127
|
-
canvas_sdk/value_set/v2022/diagnostic_study.py,sha256=wo4AQu2p5X51HZ3RsbU5NhUpgv8Fg2mPKs2YexWCMjA,301934
|
|
128
|
-
canvas_sdk/value_set/v2022/encounter.py,sha256=PxOkkob8ggpDxKfKG9EtmQQ2teGWCTOeX7_5IJqLiZI,370965
|
|
129
|
-
canvas_sdk/value_set/v2022/immunization.py,sha256=dYPWL2Un1HTUrjKZTh_MBPVmU2ImtMXVaMqVRKP_7MA,13189
|
|
130
|
-
canvas_sdk/value_set/v2022/individual_characteristic.py,sha256=1NZI2r4-9x2qTbYTkjUOAU9PgvMOBB3cpddHFr7msaU,13198
|
|
131
|
-
canvas_sdk/value_set/v2022/intervention.py,sha256=ZULGA6OhrRv4jLDhTD2z1rB92TvjUHY43rp6tanq3hM,79792
|
|
132
|
-
canvas_sdk/value_set/v2022/laboratory_test.py,sha256=x-o7SAjYw5sS9x8tGPcYUg03L_mKxxDu0b6LJsnjmQc,77876
|
|
133
|
-
canvas_sdk/value_set/v2022/medication.py,sha256=L1yNzrwD2nUox8F6x8RSKhmFsn9VcFbFEy1nM7AHRis,316430
|
|
134
|
-
canvas_sdk/value_set/v2022/physical_exam.py,sha256=C5PfLR4YB6pB_0wIy6Wfocyso5a9wuwGoKj84k_jR-U,7645
|
|
135
|
-
canvas_sdk/value_set/v2022/procedure.py,sha256=MA1yBHJskzGyp0nypzTwrR6u4pxZTo20Iv25W4FOIjM,367721
|
|
136
|
-
canvas_sdk/value_set/v2022/symptom.py,sha256=4-ouetYI8soAAZy9Gq8AXBiqTfJjdgfZgWZPhBE-Ing,9384
|
|
137
|
-
canvas_sdk/value_set/value_set.py,sha256=1SID9g4M6BsfVLNawI-96Tu33mAFGOj4wwHOinPzXdM,3528
|
|
138
|
-
canvas_sdk/views/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
139
|
-
logger/__init__.py,sha256=9o2iRCjzFEhfULgXvrrECRFK-4IslWJTqKKjTCEUbq8,61
|
|
140
|
-
logger/logger.py,sha256=axf7UffBJtETjwDCtmi1IaaJKsvcFj8zaLfouGsq68A,1847
|
|
141
|
-
settings.py,sha256=aKySQIXYBQLu06zJKiGSln12w3th3mbB_11VFMGDsm8,1480
|
|
142
|
-
canvas-0.3.0.dist-info/METADATA,sha256=pGNxx99DqpQT8ll2L1ORkHy3pr-YHe17CHy5TgWQEqQ,4500
|
|
143
|
-
canvas-0.3.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
|
144
|
-
canvas-0.3.0.dist-info/entry_points.txt,sha256=VSmSo1IZ3aEfL7enmLmlWSraS_IIkoXNVeyXzgRxFiY,46
|
|
145
|
-
canvas-0.3.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|