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.

Files changed (108) hide show
  1. {canvas-0.3.0.dist-info → canvas-0.4.0.dist-info}/METADATA +2 -1
  2. canvas-0.4.0.dist-info/RECORD +218 -0
  3. canvas_cli/apps/emit/__init__.py +3 -0
  4. canvas_cli/apps/emit/emit.py +67 -0
  5. canvas_cli/apps/emit/event_fixtures/ALLERGY_INTOLERANCE_CREATED.ndjson +1 -0
  6. canvas_cli/apps/emit/event_fixtures/ALLERGY_INTOLERANCE_UPDATED.ndjson +1 -0
  7. canvas_cli/apps/emit/event_fixtures/APPOINTMENT_CANCELED.ndjson +1 -0
  8. canvas_cli/apps/emit/event_fixtures/APPOINTMENT_CHECKED_IN.ndjson +1 -0
  9. canvas_cli/apps/emit/event_fixtures/APPOINTMENT_CREATED.ndjson +1 -0
  10. canvas_cli/apps/emit/event_fixtures/APPOINTMENT_NO_SHOWED.ndjson +1 -0
  11. canvas_cli/apps/emit/event_fixtures/APPOINTMENT_RESCHEDULED.ndjson +1 -0
  12. canvas_cli/apps/emit/event_fixtures/APPOINTMENT_RESTORED.ndjson +1 -0
  13. canvas_cli/apps/emit/event_fixtures/APPOINTMENT_UPDATED.ndjson +2 -0
  14. canvas_cli/apps/emit/event_fixtures/ASSESS_COMMAND__CONDITION_SELECTED.ndjson +1 -0
  15. canvas_cli/apps/emit/event_fixtures/ASSESS_COMMAND__POST_COMMIT.ndjson +3 -0
  16. canvas_cli/apps/emit/event_fixtures/ASSESS_COMMAND__POST_ORIGINATE.ndjson +4 -0
  17. canvas_cli/apps/emit/event_fixtures/ASSESS_COMMAND__POST_UPDATE.ndjson +5 -0
  18. canvas_cli/apps/emit/event_fixtures/ASSESS_COMMAND__PRE_COMMIT.ndjson +3 -0
  19. canvas_cli/apps/emit/event_fixtures/ASSESS_COMMAND__PRE_ORIGINATE.ndjson +4 -0
  20. canvas_cli/apps/emit/event_fixtures/ASSESS_COMMAND__PRE_UPDATE.ndjson +5 -0
  21. canvas_cli/apps/emit/event_fixtures/BILLING_LINE_ITEM_CREATED.ndjson +3 -0
  22. canvas_cli/apps/emit/event_fixtures/BILLING_LINE_ITEM_UPDATED.ndjson +2 -0
  23. canvas_cli/apps/emit/event_fixtures/CONDITION_ASSESSED.ndjson +2 -0
  24. canvas_cli/apps/emit/event_fixtures/CONDITION_CREATED.ndjson +4 -0
  25. canvas_cli/apps/emit/event_fixtures/CONDITION_UPDATED.ndjson +5 -0
  26. canvas_cli/apps/emit/event_fixtures/CRON.ndjson +3 -0
  27. canvas_cli/apps/emit/event_fixtures/ENCOUNTER_CREATED.ndjson +3 -0
  28. canvas_cli/apps/emit/event_fixtures/ENCOUNTER_UPDATED.ndjson +2 -0
  29. canvas_cli/apps/emit/event_fixtures/IMMUNIZATION_CREATED.ndjson +1 -0
  30. canvas_cli/apps/emit/event_fixtures/IMMUNIZATION_STATEMENT_CREATED.ndjson +1 -0
  31. canvas_cli/apps/emit/event_fixtures/IMMUNIZATION_STATEMENT_UPDATED.ndjson +1 -0
  32. canvas_cli/apps/emit/event_fixtures/IMMUNIZATION_UPDATED.ndjson +1 -0
  33. canvas_cli/apps/emit/event_fixtures/INTERVIEW_CREATED.ndjson +1 -0
  34. canvas_cli/apps/emit/event_fixtures/INTERVIEW_UPDATED.ndjson +1 -0
  35. canvas_cli/apps/emit/event_fixtures/LAB_ORDER_CREATED.ndjson +1 -0
  36. canvas_cli/apps/emit/event_fixtures/LAB_ORDER_UPDATED.ndjson +1 -0
  37. canvas_cli/apps/emit/event_fixtures/MEDICATION_LIST_ITEM_CREATED.ndjson +1 -0
  38. canvas_cli/apps/emit/event_fixtures/MEDICATION_LIST_ITEM_UPDATED.ndjson +1 -0
  39. canvas_cli/apps/emit/event_fixtures/MEDICATION_STATEMENT_COMMAND__POST_COMMIT.ndjson +1 -0
  40. canvas_cli/apps/emit/event_fixtures/MEDICATION_STATEMENT_COMMAND__POST_ORIGINATE.ndjson +1 -0
  41. canvas_cli/apps/emit/event_fixtures/MEDICATION_STATEMENT_COMMAND__POST_UPDATE.ndjson +2 -0
  42. canvas_cli/apps/emit/event_fixtures/MEDICATION_STATEMENT_COMMAND__PRE_COMMIT.ndjson +1 -0
  43. canvas_cli/apps/emit/event_fixtures/MEDICATION_STATEMENT_COMMAND__PRE_ORIGINATE.ndjson +1 -0
  44. canvas_cli/apps/emit/event_fixtures/MEDICATION_STATEMENT_COMMAND__PRE_UPDATE.ndjson +2 -0
  45. canvas_cli/apps/emit/event_fixtures/MEDICATION_STATEMENT__MEDICATION__POST_SEARCH.ndjson +2 -0
  46. canvas_cli/apps/emit/event_fixtures/PATIENT_CREATED.ndjson +1 -0
  47. canvas_cli/apps/emit/event_fixtures/PATIENT_UPDATED.ndjson +1 -0
  48. canvas_cli/apps/emit/event_fixtures/PLAN_COMMAND__POST_ORIGINATE.ndjson +1 -0
  49. canvas_cli/apps/emit/event_fixtures/PLAN_COMMAND__PRE_ORIGINATE.ndjson +1 -0
  50. canvas_cli/apps/emit/event_fixtures/QUESTIONNAIRE_COMMAND__POST_COMMIT.ndjson +1 -0
  51. canvas_cli/apps/emit/event_fixtures/QUESTIONNAIRE_COMMAND__POST_ORIGINATE.ndjson +1 -0
  52. canvas_cli/apps/emit/event_fixtures/QUESTIONNAIRE_COMMAND__POST_UPDATE.ndjson +2 -0
  53. canvas_cli/apps/emit/event_fixtures/QUESTIONNAIRE_COMMAND__PRE_COMMIT.ndjson +1 -0
  54. canvas_cli/apps/emit/event_fixtures/QUESTIONNAIRE_COMMAND__PRE_ORIGINATE.ndjson +1 -0
  55. canvas_cli/apps/emit/event_fixtures/QUESTIONNAIRE_COMMAND__PRE_UPDATE.ndjson +2 -0
  56. canvas_cli/apps/emit/event_fixtures/QUESTIONNAIRE__QUESTIONNAIRE__POST_SEARCH.ndjson +4 -0
  57. canvas_cli/apps/emit/event_fixtures/TASK_COMMENT_CREATED.ndjson +1 -0
  58. canvas_cli/apps/emit/event_fixtures/TASK_CREATED.ndjson +1 -0
  59. canvas_cli/apps/emit/event_fixtures/TASK_UPDATED.ndjson +1 -0
  60. canvas_cli/apps/emit/event_fixtures/VITAL_SIGN_CREATED.ndjson +14 -0
  61. canvas_cli/apps/emit/event_fixtures/VITAL_SIGN_UPDATED.ndjson +364 -0
  62. canvas_cli/apps/logs/logs.py +6 -6
  63. canvas_cli/apps/plugin/plugin.py +11 -7
  64. canvas_cli/apps/run_plugins/__init__.py +3 -0
  65. canvas_cli/apps/run_plugins/run_plugins.py +16 -0
  66. canvas_cli/main.py +8 -38
  67. canvas_cli/templates/plugins/default/{{ cookiecutter.__project_slug }}/README.md +0 -1
  68. canvas_cli/templates/plugins/default/{{ cookiecutter.__project_slug }}/protocols/my_protocol.py +1 -1
  69. canvas_cli/tests.py +12 -5
  70. canvas_cli/utils/context/context.py +2 -2
  71. canvas_cli/utils/context/tests.py +5 -4
  72. canvas_cli/utils/print/print.py +1 -1
  73. canvas_cli/utils/print/tests.py +2 -3
  74. canvas_generated/messages/events_pb2.py +2 -2
  75. canvas_generated/messages/events_pb2.pyi +12 -0
  76. canvas_sdk/base.py +2 -1
  77. canvas_sdk/commands/base.py +25 -25
  78. canvas_sdk/commands/tests/protocol/tests.py +5 -3
  79. canvas_sdk/commands/tests/test_utils.py +8 -44
  80. canvas_sdk/commands/tests/unit/tests.py +3 -3
  81. canvas_sdk/data/client.py +1 -1
  82. canvas_sdk/effects/banner_alert/tests.py +12 -4
  83. canvas_sdk/effects/protocol_card/protocol_card.py +1 -1
  84. canvas_sdk/effects/protocol_card/tests.py +2 -2
  85. canvas_sdk/protocols/clinical_quality_measure.py +1 -0
  86. canvas_sdk/utils/http.py +2 -2
  87. canvas_sdk/v1/data/base.py +1 -1
  88. canvas_sdk/v1/data/command.py +27 -0
  89. canvas_sdk/v1/data/common.py +46 -0
  90. canvas_sdk/v1/data/device.py +44 -0
  91. canvas_sdk/v1/data/imaging.py +102 -0
  92. canvas_sdk/v1/data/lab.py +182 -10
  93. canvas_sdk/v1/data/observation.py +117 -0
  94. canvas_sdk/v1/data/patient.py +4 -1
  95. canvas_sdk/v1/data/questionnaire.py +4 -2
  96. canvas_sdk/value_set/tests/test_value_sets.py +9 -6
  97. canvas_sdk/value_set/v2022/intervention.py +0 -24
  98. canvas_sdk/value_set/value_set.py +24 -21
  99. plugin_runner/__init__.py +0 -0
  100. plugin_runner/authentication.py +48 -0
  101. plugin_runner/plugin_runner.py +389 -0
  102. plugin_runner/plugin_synchronizer.py +87 -0
  103. plugin_runner/sandbox.py +273 -0
  104. pubsub/__init__.py +0 -0
  105. pubsub/pubsub.py +38 -0
  106. canvas-0.3.0.dist-info/RECORD +0 -145
  107. {canvas-0.3.0.dist-info → canvas-0.4.0.dist-info}/WHEEL +0 -0
  108. {canvas-0.3.0.dist-info → canvas-0.4.0.dist-info}/entry_points.txt +0 -0
@@ -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)
@@ -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