canvas 0.16.0__py3-none-any.whl → 0.17.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.

@@ -1,7 +1,9 @@
1
+ import asyncio
1
2
  import logging
3
+ import pickle
2
4
  import shutil
3
5
  from pathlib import Path
4
- from unittest.mock import MagicMock, patch
6
+ from unittest.mock import AsyncMock, MagicMock, patch
5
7
 
6
8
  import pytest
7
9
 
@@ -14,6 +16,7 @@ from plugin_runner.plugin_runner import (
14
16
  PluginRunner,
15
17
  load_or_reload_plugin,
16
18
  load_plugins,
19
+ synchronize_plugins,
17
20
  )
18
21
 
19
22
 
@@ -229,24 +232,53 @@ async def test_handle_plugin_event_returns_expected_result(
229
232
 
230
233
 
231
234
  @pytest.mark.asyncio
232
- @pytest.mark.parametrize("install_test_plugin", ["example_plugin"], indirect=True)
233
235
  async def test_reload_plugins_event_handler_successfully_publishes_message(
234
- install_test_plugin: Path, plugin_runner: PluginRunner
236
+ plugin_runner: PluginRunner,
235
237
  ) -> None:
236
238
  """Test ReloadPlugins Event handler successfully publishes a message with restart action."""
237
- with patch("plugin_runner.plugin_runner.publish_message", MagicMock()) as mock_publish_message:
239
+ with patch(
240
+ "plugin_runner.plugin_runner.publish_message", new_callable=AsyncMock
241
+ ) as mock_publish_message:
238
242
  request = ReloadPluginsRequest()
239
243
 
240
244
  result = []
241
245
  async for response in plugin_runner.ReloadPlugins(request, None):
242
246
  result.append(response)
243
247
 
244
- mock_publish_message.assert_called_once_with({"action": "restart"})
248
+ mock_publish_message.assert_called_once_with(message={"action": "reload"})
245
249
 
246
250
  assert len(result) == 1
247
251
  assert result[0].success is True
248
252
 
249
253
 
254
+ @pytest.mark.asyncio
255
+ async def test_synchronize_plugins_calls_install_and_load_plugins() -> None:
256
+ """Test that synchronize_plugins calls install_plugins and load_plugins."""
257
+ with (
258
+ patch("plugin_runner.plugin_runner.get_client", new_callable=MagicMock) as mock_get_client,
259
+ patch(
260
+ "plugin_runner.plugin_runner.install_plugins", new_callable=AsyncMock
261
+ ) as mock_install_plugins,
262
+ patch(
263
+ "plugin_runner.plugin_runner.load_plugins", new_callable=AsyncMock
264
+ ) as mock_load_plugins,
265
+ ):
266
+ mock_client = AsyncMock()
267
+ mock_pubsub = AsyncMock()
268
+ mock_get_client.return_value = (mock_client, mock_pubsub)
269
+ mock_pubsub.get_message.return_value = {
270
+ "type": "pmessage",
271
+ "data": pickle.dumps({"action": "reload"}),
272
+ }
273
+
274
+ task = asyncio.create_task(synchronize_plugins(max_iterations=1))
275
+ await asyncio.sleep(0.1) # Give some time for the coroutine to run
276
+ task.cancel()
277
+
278
+ mock_install_plugins.assert_called_once()
279
+ mock_load_plugins.assert_called_once()
280
+
281
+
250
282
  @pytest.mark.asyncio
251
283
  @pytest.mark.parametrize("install_test_plugin", ["test_module_imports_plugin"], indirect=True)
252
284
  async def test_changes_to_plugin_modules_should_be_reflected_after_reload(
@@ -0,0 +1,225 @@
1
+ syntax = 'proto3';
2
+
3
+ package canvas;
4
+
5
+ enum EffectType {
6
+ UNKNOWN_EFFECT = 0;
7
+
8
+ LOG = 1;
9
+ ADD_PLAN_COMMAND = 2;
10
+
11
+ AUTOCOMPLETE_SEARCH_RESULTS = 3;
12
+
13
+ ADD_BANNER_ALERT = 4;
14
+ REMOVE_BANNER_ALERT = 5;
15
+
16
+ ORIGINATE_ASSESS_COMMAND = 6;
17
+ EDIT_ASSESS_COMMAND = 7;
18
+ DELETE_ASSESS_COMMAND = 8;
19
+ COMMIT_ASSESS_COMMAND = 9;
20
+ ENTER_IN_ERROR_ASSESS_COMMAND = 10;
21
+
22
+ ORIGINATE_DIAGNOSE_COMMAND = 11;
23
+ EDIT_DIAGNOSE_COMMAND = 12;
24
+ DELETE_DIAGNOSE_COMMAND = 13;
25
+ COMMIT_DIAGNOSE_COMMAND = 14;
26
+ ENTER_IN_ERROR_DIAGNOSE_COMMAND = 15;
27
+
28
+ ORIGINATE_GOAL_COMMAND = 16;
29
+ EDIT_GOAL_COMMAND = 17;
30
+ DELETE_GOAL_COMMAND = 18;
31
+ COMMIT_GOAL_COMMAND = 19;
32
+ ENTER_IN_ERROR_GOAL_COMMAND = 20;
33
+
34
+ ORIGINATE_HPI_COMMAND = 21;
35
+ EDIT_HPI_COMMAND = 22;
36
+ DELETE_HPI_COMMAND = 23;
37
+ COMMIT_HPI_COMMAND = 24;
38
+ ENTER_IN_ERROR_HPI_COMMAND = 25;
39
+
40
+ ORIGINATE_MEDICATION_STATEMENT_COMMAND = 26;
41
+ EDIT_MEDICATION_STATEMENT_COMMAND = 27;
42
+ DELETE_MEDICATION_STATEMENT_COMMAND = 28;
43
+ COMMIT_MEDICATION_STATEMENT_COMMAND = 29;
44
+ ENTER_IN_ERROR_MEDICATION_STATEMENT_COMMAND = 30;
45
+
46
+ ORIGINATE_PLAN_COMMAND = 31;
47
+ EDIT_PLAN_COMMAND = 32;
48
+ DELETE_PLAN_COMMAND = 33;
49
+ COMMIT_PLAN_COMMAND = 34;
50
+ ENTER_IN_ERROR_PLAN_COMMAND = 35;
51
+
52
+ ORIGINATE_PRESCRIBE_COMMAND = 36;
53
+ EDIT_PRESCRIBE_COMMAND = 37;
54
+ DELETE_PRESCRIBE_COMMAND = 38;
55
+ COMMIT_PRESCRIBE_COMMAND = 39;
56
+ ENTER_IN_ERROR_PRESCRIBE_COMMAND = 40;
57
+
58
+ ORIGINATE_QUESTIONNAIRE_COMMAND = 41;
59
+ EDIT_QUESTIONNAIRE_COMMAND = 42;
60
+ DELETE_QUESTIONNAIRE_COMMAND = 43;
61
+ COMMIT_QUESTIONNAIRE_COMMAND = 44;
62
+ ENTER_IN_ERROR_QUESTIONNAIRE_COMMAND = 45;
63
+
64
+ ORIGINATE_REASON_FOR_VISIT_COMMAND = 46;
65
+ EDIT_REASON_FOR_VISIT_COMMAND = 47;
66
+ DELETE_REASON_FOR_VISIT_COMMAND = 48;
67
+ COMMIT_REASON_FOR_VISIT_COMMAND = 49;
68
+ ENTER_IN_ERROR_REASON_FOR_VISIT_COMMAND = 50;
69
+
70
+ ORIGINATE_STOP_MEDICATION_COMMAND = 51;
71
+ EDIT_STOP_MEDICATION_COMMAND = 52;
72
+ DELETE_STOP_MEDICATION_COMMAND = 53;
73
+ COMMIT_STOP_MEDICATION_COMMAND = 54;
74
+ ENTER_IN_ERROR_STOP_MEDICATION_COMMAND = 55;
75
+
76
+ ORIGINATE_UPDATE_GOAL_COMMAND = 56;
77
+ EDIT_UPDATE_GOAL_COMMAND = 57;
78
+ DELETE_UPDATE_GOAL_COMMAND = 58;
79
+ COMMIT_UPDATE_GOAL_COMMAND = 59;
80
+ ENTER_IN_ERROR_UPDATE_GOAL_COMMAND = 60;
81
+
82
+ ORIGINATE_PERFORM_COMMAND = 61;
83
+ EDIT_PERFORM_COMMAND = 62;
84
+ DELETE_PERFORM_COMMAND = 63;
85
+ COMMIT_PERFORM_COMMAND = 64;
86
+ ENTER_IN_ERROR_PERFORM_COMMAND = 65;
87
+
88
+ ORIGINATE_INSTRUCT_COMMAND = 66;
89
+ EDIT_INSTRUCT_COMMAND = 67 ;
90
+ DELETE_INSTRUCT_COMMAND = 68;
91
+ COMMIT_INSTRUCT_COMMAND = 69;
92
+ ENTER_IN_ERROR_INSTRUCT_COMMAND = 70;
93
+
94
+ ORIGINATE_LAB_ORDER_COMMAND = 71;
95
+ EDIT_LAB_ORDER_COMMAND = 72;
96
+ DELETE_LAB_ORDER_COMMAND = 73;
97
+ COMMIT_LAB_ORDER_COMMAND = 74;
98
+ ENTER_IN_ERROR_LAB_ORDER_COMMAND = 75;
99
+
100
+ ORIGINATE_FAMILY_HISTORY_COMMAND = 76;
101
+ EDIT_FAMILY_HISTORY_COMMAND = 77;
102
+ DELETE_FAMILY_HISTORY_COMMAND = 78;
103
+ COMMIT_FAMILY_HISTORY_COMMAND = 79;
104
+ ENTER_IN_ERROR_FAMILY_HISTORY_COMMAND = 80;
105
+
106
+ ORIGINATE_ALLERGY_COMMAND = 81;
107
+ EDIT_ALLERGY_COMMAND = 82;
108
+ DELETE_ALLERGY_COMMAND = 83;
109
+ COMMIT_ALLERGY_COMMAND = 84;
110
+ ENTER_IN_ERROR_ALLERGY_COMMAND = 85;
111
+
112
+ ORIGINATE_REMOVE_ALLERGY_COMMAND = 86;
113
+ EDIT_REMOVE_ALLERGY_COMMAND = 87;
114
+ DELETE_REMOVE_ALLERGY_COMMAND = 88;
115
+ COMMIT_REMOVE_ALLERGY_COMMAND = 89;
116
+ ENTER_IN_ERROR_REMOVE_ALLERGY_COMMAND = 90;
117
+
118
+ ORIGINATE_SURGICAL_HISTORY_COMMAND = 91;
119
+ EDIT_SURGICAL_HISTORY_COMMAND = 92;
120
+ DELETE_SURGICAL_HISTORY_COMMAND = 93;
121
+ COMMIT_SURGICAL_HISTORY_COMMAND = 94;
122
+ ENTER_IN_ERROR_SURGICAL_HISTORY_COMMAND = 95;
123
+
124
+ CREATE_TASK = 100;
125
+ UPDATE_TASK = 101;
126
+ CREATE_TASK_COMMENT = 102;
127
+
128
+ ORIGINATE_MEDICAL_HISTORY_COMMAND = 103;
129
+ EDIT_MEDICAL_HISTORY_COMMAND = 104;
130
+ DELETE_MEDICAL_HISTORY_COMMAND = 105;
131
+ COMMIT_MEDICAL_HISTORY_COMMAND = 106;
132
+ ENTER_IN_ERROR_MEDICAL_HISTORY_COMMAND = 107;
133
+
134
+ ADD_OR_UPDATE_PROTOCOL_CARD = 110;
135
+
136
+ ORIGINATE_TASK_COMMAND = 133;
137
+ EDIT_TASK_COMMAND = 134;
138
+ DELETE_TASK_COMMAND = 135;
139
+ COMMIT_TASK_COMMAND = 136;
140
+ ENTER_IN_ERROR_TASK_COMMAND = 137;
141
+
142
+ ORIGINATE_REFILL_COMMAND = 113;
143
+ EDIT_REFILL_COMMAND = 114;
144
+ DELETE_REFILL_COMMAND = 115;
145
+ COMMIT_REFILL_COMMAND = 116;
146
+ ENTER_IN_ERROR_REFILL_COMMAND = 117;
147
+
148
+ ORIGINATE_VITALS_COMMAND = 118;
149
+ EDIT_VITALS_COMMAND = 119;
150
+ DELETE_VITALS_COMMAND = 120;
151
+ COMMIT_VITALS_COMMAND = 121;
152
+ ENTER_IN_ERROR_VITALS_COMMAND = 122;
153
+
154
+ ORIGINATE_UPDATE_DIAGNOSIS_COMMAND = 123;
155
+ EDIT_UPDATE_DIAGNOSIS_COMMAND = 124;
156
+ DELETE_UPDATE_DIAGNOSIS_COMMAND = 125;
157
+ COMMIT_UPDATE_DIAGNOSIS_COMMAND = 126;
158
+ ENTER_IN_ERROR_UPDATE_DIAGNOSIS_COMMAND = 127;
159
+
160
+ ORIGINATE_CLOSE_GOAL_COMMAND = 128;
161
+ EDIT_CLOSE_GOAL_COMMAND = 129;
162
+ DELETE_CLOSE_GOAL_COMMAND = 130;
163
+ COMMIT_CLOSE_GOAL_COMMAND = 131;
164
+ ENTER_IN_ERROR_CLOSE_GOAL_COMMAND = 132;
165
+
166
+ CREATE_QUESTIONNAIRE_RESULT = 138;
167
+
168
+ ANNOTATE_PATIENT_CHART_CONDITION_RESULTS = 200;
169
+
170
+ ANNOTATE_CLAIM_CONDITION_RESULTS = 300;
171
+
172
+ SHOW_PATIENT_CHART_SUMMARY_SECTIONS = 400;
173
+
174
+ SHOW_PATIENT_PROFILE_SECTIONS = 500;
175
+
176
+ PATIENT_PROFILE__ADD_PHARMACY__POST_SEARCH_RESULTS = 501;
177
+
178
+ SEND_SURESCRIPTS_ELIGIBILITY_REQUEST = 600;
179
+ SEND_SURESCRIPTS_MEDICATION_HISTORY_REQUEST = 601;
180
+ SEND_SURESCRIPTS_BENEFITS_REQUEST = 602;
181
+
182
+ ORIGINATE_EXAM_COMMAND = 700;
183
+ EDIT_EXAM_COMMAND = 701;
184
+ DELETE_EXAM_COMMAND = 702;
185
+ COMMIT_EXAM_COMMAND = 703;
186
+ ENTER_IN_ERROR_EXAM_COMMAND = 704;
187
+
188
+ ORIGINATE_ROS_COMMAND = 800;
189
+ EDIT_ROS_COMMAND = 801;
190
+ DELETE_ROS_COMMAND = 802;
191
+ COMMIT_ROS_COMMAND = 803;
192
+ ENTER_IN_ERROR_ROS_COMMAND = 804;
193
+
194
+ ORIGINATE_STRUCTURED_ASSESSMENT_COMMAND = 900;
195
+ EDIT_STRUCTURED_ASSESSMENT_COMMAND = 901;
196
+ DELETE_STRUCTURED_ASSESSMENT_COMMAND = 902;
197
+ COMMIT_STRUCTURED_ASSESSMENT_COMMAND = 903;
198
+ ENTER_IN_ERROR_STRUCTURED_ASSESSMENT_COMMAND = 904;
199
+
200
+ SHOW_ACTION_BUTTON = 1000;
201
+
202
+ PATIENT_PORTAL__INTAKE_FORM_RESULTS = 2000;
203
+ PATIENT_PORTAL__APPOINTMENT_IS_CANCELABLE = 2001;
204
+ PATIENT_PORTAL__APPOINTMENT_IS_RESCHEDULABLE = 2002;
205
+
206
+ PATIENT_PORTAL__APPOINTMENTS__SLOTS__POST_SEARCH_RESULTS = 2005;
207
+ PATIENT_PORTAL__APPOINTMENTS__FORM_APPOINTMENT_TYPES__PRE_SEARCH_RESULTS = 2006;
208
+ PATIENT_PORTAL__APPOINTMENTS__FORM_APPOINTMENT_TYPES__POST_SEARCH_RESULTS = 2007;
209
+ PATIENT_PORTAL__APPOINTMENTS__FORM_LOCATIONS__PRE_SEARCH_RESULTS = 2008;
210
+ PATIENT_PORTAL__APPOINTMENTS__FORM_LOCATIONS__POST_SEARCH_RESULTS = 2009;
211
+ PATIENT_PORTAL__APPOINTMENTS__FORM_PROVIDERS__PRE_SEARCH_RESULTS = 2010;
212
+ PATIENT_PORTAL__APPOINTMENTS__FORM_PROVIDERS__POST_SEARCH_RESULTS = 2011;
213
+
214
+ LAUNCH_MODAL = 3000;
215
+ }
216
+
217
+ message Effect {
218
+ EffectType type = 1;
219
+ string payload = 2;
220
+ string plugin_name = 3;
221
+ string classname = 4;
222
+ //Oneof effect_payload {
223
+ // ...
224
+ //}
225
+ }