canvas 0.29.1__tar.gz → 0.31.0__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.
Potentially problematic release.
This version of canvas might be problematic. Click here for more details.
- {canvas-0.29.1 → canvas-0.31.0}/PKG-INFO +1 -1
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/utils/validators/manifest_schema.py +1 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/effects/protocol_card/protocol_card.py +3 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/handlers/base.py +3 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/handlers/simple_api/__init__.py +6 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/handlers/simple_api/security.py +65 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/tests/handlers/test_simple_api.py +56 -2
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/v1/data/user.py +1 -0
- {canvas-0.29.1 → canvas-0.31.0}/logger/logger.py +7 -1
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/plugin_runner.py +43 -27
- {canvas-0.29.1 → canvas-0.31.0}/pyproject.toml +1 -1
- {canvas-0.29.1 → canvas-0.31.0}/.gitignore +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/README.md +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/auth/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/auth/tests.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/auth/utils.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/emit.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/ALLERGY_INTOLERANCE_CREATED.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/ALLERGY_INTOLERANCE_UPDATED.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/APPOINTMENT_CANCELED.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/APPOINTMENT_CHECKED_IN.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/APPOINTMENT_CREATED.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/APPOINTMENT_NO_SHOWED.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/APPOINTMENT_RESCHEDULED.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/APPOINTMENT_RESTORED.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/APPOINTMENT_UPDATED.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/ASSESS_COMMAND__CONDITION_SELECTED.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/ASSESS_COMMAND__POST_COMMIT.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/ASSESS_COMMAND__POST_ORIGINATE.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/ASSESS_COMMAND__POST_UPDATE.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/ASSESS_COMMAND__PRE_COMMIT.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/ASSESS_COMMAND__PRE_ORIGINATE.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/ASSESS_COMMAND__PRE_UPDATE.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/BILLING_LINE_ITEM_CREATED.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/BILLING_LINE_ITEM_UPDATED.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/CONDITION_ASSESSED.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/CONDITION_CREATED.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/CONDITION_UPDATED.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/CRON.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/ENCOUNTER_CREATED.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/ENCOUNTER_UPDATED.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/IMMUNIZATION_CREATED.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/IMMUNIZATION_STATEMENT_CREATED.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/IMMUNIZATION_STATEMENT_UPDATED.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/IMMUNIZATION_UPDATED.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/INTERVIEW_CREATED.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/INTERVIEW_UPDATED.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/LAB_ORDER_CREATED.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/LAB_ORDER_UPDATED.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/MEDICATION_LIST_ITEM_CREATED.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/MEDICATION_LIST_ITEM_UPDATED.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/MEDICATION_STATEMENT_COMMAND__POST_COMMIT.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/MEDICATION_STATEMENT_COMMAND__POST_ORIGINATE.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/MEDICATION_STATEMENT_COMMAND__POST_UPDATE.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/MEDICATION_STATEMENT_COMMAND__PRE_COMMIT.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/MEDICATION_STATEMENT_COMMAND__PRE_ORIGINATE.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/MEDICATION_STATEMENT_COMMAND__PRE_UPDATE.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/MEDICATION_STATEMENT__MEDICATION__POST_SEARCH.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/PATIENT_CREATED.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/PATIENT_UPDATED.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/PLAN_COMMAND__POST_ORIGINATE.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/PLAN_COMMAND__PRE_ORIGINATE.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/QUESTIONNAIRE_COMMAND__POST_COMMIT.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/QUESTIONNAIRE_COMMAND__POST_ORIGINATE.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/QUESTIONNAIRE_COMMAND__POST_UPDATE.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/QUESTIONNAIRE_COMMAND__PRE_COMMIT.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/QUESTIONNAIRE_COMMAND__PRE_ORIGINATE.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/QUESTIONNAIRE_COMMAND__PRE_UPDATE.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/QUESTIONNAIRE__QUESTIONNAIRE__POST_SEARCH.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/SIMPLE_API_REQUEST.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/TASK_COMMENT_CREATED.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/TASK_CREATED.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/TASK_UPDATED.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/VITAL_SIGN_CREATED.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/VITAL_SIGN_UPDATED.ndjson +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/logs/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/logs/logs.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/plugin/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/plugin/plugin.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/plugin/tests.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/run_plugins/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/run_plugins/run_plugins.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/conftest.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/main.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/templates/plugins/application/cookiecutter.json +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/templates/plugins/application/{{ cookiecutter.__project_slug }}/CANVAS_MANIFEST.json +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/templates/plugins/application/{{ cookiecutter.__project_slug }}/README.md +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/templates/plugins/application/{{ cookiecutter.__project_slug }}/applications/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/templates/plugins/application/{{ cookiecutter.__project_slug }}/applications/my_application.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/templates/plugins/application/{{ cookiecutter.__project_slug }}/assets/python-logo.png +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/templates/plugins/default/cookiecutter.json +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/templates/plugins/default/{{ cookiecutter.__project_slug }}/CANVAS_MANIFEST.json +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/templates/plugins/default/{{ cookiecutter.__project_slug }}/README.md +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/templates/plugins/default/{{ cookiecutter.__project_slug }}/protocols/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/templates/plugins/default/{{ cookiecutter.__project_slug }}/protocols/my_protocol.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/tests.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/utils/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/utils/context/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/utils/context/context.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/utils/context/tests.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/utils/print/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/utils/print/print.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/utils/print/tests.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/utils/urls/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/utils/urls/tests.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/utils/urls/urls.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/utils/validators/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/utils/validators/tests.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_cli/utils/validators/validators.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_generated/messages/effects_pb2.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_generated/messages/effects_pb2.pyi +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_generated/messages/effects_pb2_grpc.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_generated/messages/events_pb2.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_generated/messages/events_pb2.pyi +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_generated/messages/events_pb2_grpc.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_generated/messages/plugins_pb2.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_generated/messages/plugins_pb2.pyi +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_generated/messages/plugins_pb2_grpc.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_generated/services/plugin_runner_pb2.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_generated/services/plugin_runner_pb2.pyi +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_generated/services/plugin_runner_pb2_grpc.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/base.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/base.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/commands/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/commands/adjust_prescription.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/commands/allergy.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/commands/assess.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/commands/close_goal.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/commands/diagnose.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/commands/exam.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/commands/family_history.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/commands/follow_up.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/commands/goal.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/commands/history_present_illness.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/commands/imaging_order.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/commands/instruct.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/commands/lab_order.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/commands/medical_history.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/commands/medication_statement.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/commands/past_surgical_history.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/commands/perform.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/commands/plan.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/commands/prescribe.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/commands/questionnaire/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/commands/questionnaire/question.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/commands/reason_for_visit.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/commands/refer.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/commands/refill.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/commands/remove_allergy.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/commands/resolve_condition.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/commands/review_of_systems.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/commands/stop_medication.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/commands/structured_assessment.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/commands/task.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/commands/update_diagnosis.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/commands/update_goal.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/commands/vitals.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/constants.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/tests/protocol/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/tests/protocol/tests.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/tests/schema/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/tests/schema/tests.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/tests/test_base_command.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/tests/test_utils.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/tests/unit/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/commands/tests/unit/tests.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/effects/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/effects/banner_alert/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/effects/banner_alert/add_banner_alert.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/effects/banner_alert/remove_banner_alert.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/effects/banner_alert/tests.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/effects/base.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/effects/billing_line_item/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/effects/billing_line_item/add_billing_line_item.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/effects/billing_line_item/remove_billing_line_item.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/effects/billing_line_item/update_billing_line_item.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/effects/launch_modal.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/effects/patient_chart_summary_configuration.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/effects/patient_portal/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/effects/patient_portal/application_configuration.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/effects/patient_portal/form_result.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/effects/patient_portal_menu_configuration.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/effects/patient_profile_configuration.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/effects/protocol_card/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/effects/protocol_card/tests.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/effects/questionnaire_result.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/effects/show_button.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/effects/simple_api.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/effects/surescripts/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/effects/surescripts/surescripts_messages.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/effects/task/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/effects/task/task.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/effects/widgets/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/effects/widgets/portal_widget.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/events/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/events/base.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/handlers/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/handlers/action_button.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/handlers/application.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/handlers/cron_task.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/handlers/simple_api/api.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/handlers/simple_api/exceptions.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/handlers/simple_api/tools.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/protocols/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/protocols/base.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/protocols/clinical_quality_measure.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/protocols/timeframe.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/questionnaires/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/questionnaires/tests/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/questionnaires/tests/test_utils.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/questionnaires/utils.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/templates/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/templates/tests/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/templates/tests/test_utils.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/templates/utils.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/tests/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/tests/handlers/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/utils/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/utils/http.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/utils/plugins.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/utils/stats.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/utils/tests.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/v1/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/v1/apps.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/v1/data/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/v1/data/allergy_intolerance.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/v1/data/appointment.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/v1/data/assessment.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/v1/data/banner_alert.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/v1/data/base.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/v1/data/billing.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/v1/data/care_team.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/v1/data/command.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/v1/data/common.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/v1/data/condition.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/v1/data/coverage.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/v1/data/detected_issue.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/v1/data/device.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/v1/data/imaging.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/v1/data/lab.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/v1/data/medication.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/v1/data/note.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/v1/data/observation.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/v1/data/organization.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/v1/data/patient.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/v1/data/practicelocation.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/v1/data/protocol_override.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/v1/data/questionnaire.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/v1/data/reason_for_visit.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/v1/data/staff.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/v1/data/task.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/v1/data/team.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/v1/models.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/value_set/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/value_set/custom.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/value_set/hcc2018.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/value_set/tests/test_value_sets.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/value_set/v2022/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/value_set/v2022/adverse_event.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/value_set/v2022/allergy.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/value_set/v2022/assessment.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/value_set/v2022/communication.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/value_set/v2022/condition.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/value_set/v2022/device.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/value_set/v2022/diagnostic_study.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/value_set/v2022/encounter.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/value_set/v2022/immunization.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/value_set/v2022/individual_characteristic.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/value_set/v2022/intervention.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/value_set/v2022/laboratory_test.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/value_set/v2022/medication.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/value_set/v2022/physical_exam.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/value_set/v2022/procedure.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/value_set/v2022/symptom.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/value_set/value_set.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/canvas_sdk/views/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/logger/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/authentication.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/aws_headers.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/exceptions.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/installation.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/sandbox.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/example_plugin/CANVAS_MANIFEST.json +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/example_plugin/README.md +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/example_plugin/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/example_plugin/protocols/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/example_plugin/protocols/my_protocol.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_implicit_imports_plugin/CANVAS_MANIFEST.json +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_implicit_imports_plugin/README.md +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_implicit_imports_plugin/protocols/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_implicit_imports_plugin/protocols/my_protocol.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_implicit_imports_plugin/templates/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_implicit_imports_plugin/templates/base.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_implicit_imports_plugin/utils/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_implicit_imports_plugin/utils/base.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_load_questionnaire/CANVAS_MANIFEST.json +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_load_questionnaire/README.md +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_load_questionnaire/protocols/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_load_questionnaire/protocols/my_protocol.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_load_questionnaire/questionnaires/example_questionnaire.yml +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_module_forbidden_imports_plugin/CANVAS_MANIFEST.json +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_module_forbidden_imports_plugin/README.md +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_module_forbidden_imports_plugin/other_module/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_module_forbidden_imports_plugin/other_module/base.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_module_forbidden_imports_plugin/protocols/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_module_forbidden_imports_plugin/protocols/my_protocol.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_module_forbidden_imports_runtime_plugin/CANVAS_MANIFEST.json +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_module_forbidden_imports_runtime_plugin/README.md +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_module_forbidden_imports_runtime_plugin/other_module/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_module_forbidden_imports_runtime_plugin/other_module/base.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_module_forbidden_imports_runtime_plugin/protocols/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_module_forbidden_imports_runtime_plugin/protocols/my_protocol.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_module_imports_outside_plugin_v1/CANVAS_MANIFEST.json +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_module_imports_outside_plugin_v1/README.md +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_module_imports_outside_plugin_v1/other_module/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_module_imports_outside_plugin_v1/other_module/base.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_module_imports_outside_plugin_v1/protocols/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_module_imports_outside_plugin_v1/protocols/my_protocol.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_module_imports_outside_plugin_v2/CANVAS_MANIFEST.json +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_module_imports_outside_plugin_v2/README.md +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_module_imports_outside_plugin_v2/other_module/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_module_imports_outside_plugin_v2/other_module/base.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_module_imports_outside_plugin_v2/protocols/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_module_imports_outside_plugin_v2/protocols/my_protocol.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_module_imports_outside_plugin_v3/CANVAS_MANIFEST.json +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_module_imports_outside_plugin_v3/README.md +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_module_imports_outside_plugin_v3/other_module/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_module_imports_outside_plugin_v3/other_module/base.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_module_imports_outside_plugin_v3/protocols/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_module_imports_outside_plugin_v3/protocols/my_protocol.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_module_imports_plugin/CANVAS_MANIFEST.json +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_module_imports_plugin/README.md +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_module_imports_plugin/other_module/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_module_imports_plugin/other_module/base.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_module_imports_plugin/protocols/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_module_imports_plugin/protocols/my_protocol.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_render_template/CANVAS_MANIFEST.json +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_render_template/README.md +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_render_template/protocols/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_render_template/protocols/my_protocol.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_render_template/templates/template.html +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_simple_api/CANVAS_MANIFEST.json +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_simple_api/README.md +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_simple_api/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_simple_api/protocols/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/fixtures/plugins/test_simple_api/protocols/my_protocol.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/test_application.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/test_plugin_installer.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/test_plugin_runner.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/plugin_runner/tests/test_sandbox.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/protobufs/canvas_generated/messages/effects.proto +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/protobufs/canvas_generated/messages/events.proto +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/protobufs/canvas_generated/messages/plugins.proto +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/protobufs/canvas_generated/services/plugin_runner.proto +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/pubsub/__init__.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/pubsub/pubsub.py +0 -0
- {canvas-0.29.1 → canvas-0.31.0}/settings.py +0 -0
|
@@ -39,6 +39,9 @@ class ProtocolCard(_BaseEffect):
|
|
|
39
39
|
class Status(Enum):
|
|
40
40
|
DUE = "due"
|
|
41
41
|
SATISFIED = "satisfied"
|
|
42
|
+
NOT_APPLICABLE = "not_applicable"
|
|
43
|
+
PENDING = "pending"
|
|
44
|
+
NOT_RELEVANT = "not_relevant"
|
|
42
45
|
|
|
43
46
|
class Meta:
|
|
44
47
|
effect_type = EffectType.ADD_OR_UPDATE_PROTOCOL_CARD
|
|
@@ -13,6 +13,7 @@ version = importlib.metadata.version("canvas")
|
|
|
13
13
|
class BaseHandler(ABC):
|
|
14
14
|
"""The class that all handlers inherit from."""
|
|
15
15
|
|
|
16
|
+
environment: dict[str, Any]
|
|
16
17
|
secrets: dict[str, Any]
|
|
17
18
|
event: Event
|
|
18
19
|
|
|
@@ -20,9 +21,11 @@ class BaseHandler(ABC):
|
|
|
20
21
|
self,
|
|
21
22
|
event: Event,
|
|
22
23
|
secrets: dict[str, Any] | None = None,
|
|
24
|
+
environment: dict[str, Any] | None = None,
|
|
23
25
|
) -> None:
|
|
24
26
|
self.event = event
|
|
25
27
|
self.secrets = secrets or {}
|
|
28
|
+
self.environment = environment or {}
|
|
26
29
|
|
|
27
30
|
@property
|
|
28
31
|
@deprecation.deprecated(
|
|
@@ -7,6 +7,9 @@ from .security import (
|
|
|
7
7
|
BasicCredentials,
|
|
8
8
|
BearerCredentials,
|
|
9
9
|
Credentials,
|
|
10
|
+
PatientSessionAuthMixin,
|
|
11
|
+
SessionCredentials,
|
|
12
|
+
StaffSessionAuthMixin,
|
|
10
13
|
)
|
|
11
14
|
|
|
12
15
|
__all__ = [
|
|
@@ -17,6 +20,9 @@ __all__ = [
|
|
|
17
20
|
"BasicCredentials",
|
|
18
21
|
"BearerCredentials",
|
|
19
22
|
"Credentials",
|
|
23
|
+
"PatientSessionAuthMixin",
|
|
24
|
+
"SessionCredentials",
|
|
20
25
|
"SimpleAPI",
|
|
21
26
|
"SimpleAPIRoute",
|
|
27
|
+
"StaffSessionAuthMixin",
|
|
22
28
|
]
|
|
@@ -114,6 +114,39 @@ class APIKeyCredentials(Credentials):
|
|
|
114
114
|
self.key = key
|
|
115
115
|
|
|
116
116
|
|
|
117
|
+
class SessionCredentials(Credentials):
|
|
118
|
+
"""
|
|
119
|
+
Session credentials class.
|
|
120
|
+
|
|
121
|
+
Looks for headers set by Canvas with information about the logged in user based on browser
|
|
122
|
+
cookies and session information in the Canvas database. These headers are removed if received by
|
|
123
|
+
the client and intentionally set by Canvas only if there is a valid session from an active user.
|
|
124
|
+
|
|
125
|
+
One must look at the type of user in order to understand what the id refers to – a patient or a
|
|
126
|
+
staff member.
|
|
127
|
+
|
|
128
|
+
If a SimpleAPI handler is protected by SessionCredentials, the non-presence of these headers
|
|
129
|
+
results in an unauthorized response. Users of SessionCredentials will likely wish to further
|
|
130
|
+
restrict access based on the type of user (patient or staff) and perhaps based on the roles
|
|
131
|
+
associated with the user. This logic is the concern of the implementer of the handler's
|
|
132
|
+
authenticate method.
|
|
133
|
+
"""
|
|
134
|
+
|
|
135
|
+
def __init__(self, request: "Request") -> None:
|
|
136
|
+
super().__init__(request)
|
|
137
|
+
|
|
138
|
+
if (
|
|
139
|
+
"canvas-logged-in-user-type" not in request.headers
|
|
140
|
+
or "canvas-logged-in-user-id" not in request.headers
|
|
141
|
+
):
|
|
142
|
+
raise InvalidCredentialsError
|
|
143
|
+
|
|
144
|
+
self.logged_in_user = {
|
|
145
|
+
"id": request.headers.get("canvas-logged-in-user-id"),
|
|
146
|
+
"type": request.headers.get("canvas-logged-in-user-type"),
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
|
|
117
150
|
class AuthSchemeMixin(Protocol):
|
|
118
151
|
"""Protocol for authentication scheme mixins."""
|
|
119
152
|
|
|
@@ -182,3 +215,35 @@ class APIKeyAuthMixin(AuthSchemeMixin):
|
|
|
182
215
|
raise InvalidCredentialsError
|
|
183
216
|
|
|
184
217
|
return True
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
class StaffSessionAuthMixin(AuthSchemeMixin):
|
|
221
|
+
"""
|
|
222
|
+
Staff Session authentication scheme mixin.
|
|
223
|
+
|
|
224
|
+
Provides an implementation of the authenticate method that ensures only logged in staff members
|
|
225
|
+
can access the urls provided by this handler. It only cares that they are a staff, with no
|
|
226
|
+
regard to roles or any other permissioning schemes.
|
|
227
|
+
"""
|
|
228
|
+
|
|
229
|
+
def authenticate(self, credentials: SessionCredentials) -> bool: # type: ignore[override]
|
|
230
|
+
"""Authenticate the request."""
|
|
231
|
+
if credentials.logged_in_user["type"] != "Staff":
|
|
232
|
+
raise InvalidCredentialsError
|
|
233
|
+
return True
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
class PatientSessionAuthMixin(AuthSchemeMixin):
|
|
237
|
+
"""
|
|
238
|
+
Patient Session authentication scheme mixin.
|
|
239
|
+
|
|
240
|
+
Provides an implementation of the authenticate method that ensures only logged in patients can
|
|
241
|
+
access the urls provided by this handler. It only cares that they are a patient, with no regard
|
|
242
|
+
any other information.
|
|
243
|
+
"""
|
|
244
|
+
|
|
245
|
+
def authenticate(self, credentials: SessionCredentials) -> bool: # type: ignore[override]
|
|
246
|
+
"""Authenticate the request."""
|
|
247
|
+
if credentials.logged_in_user["type"] != "Patient":
|
|
248
|
+
raise InvalidCredentialsError
|
|
249
|
+
return True
|
|
@@ -37,6 +37,9 @@ from canvas_sdk.handlers.simple_api.security import (
|
|
|
37
37
|
BasicCredentials,
|
|
38
38
|
BearerCredentials,
|
|
39
39
|
Credentials,
|
|
40
|
+
PatientSessionAuthMixin,
|
|
41
|
+
SessionCredentials,
|
|
42
|
+
StaffSessionAuthMixin,
|
|
40
43
|
)
|
|
41
44
|
from canvas_sdk.handlers.simple_api.tools import (
|
|
42
45
|
CaseInsensitiveMultiDict,
|
|
@@ -890,6 +893,13 @@ def custom_headers(api_key: str, app_key: str) -> dict[str, str]:
|
|
|
890
893
|
return {"API-Key": api_key, "App-Key": app_key}
|
|
891
894
|
|
|
892
895
|
|
|
896
|
+
def session_headers(id: str, type: str) -> dict[str, str]:
|
|
897
|
+
"""
|
|
898
|
+
Given an id and a type, return headers that include the expected session based auth headers.
|
|
899
|
+
"""
|
|
900
|
+
return {"canvas-logged-in-user-type": type, "canvas-logged-in-user-id": id}
|
|
901
|
+
|
|
902
|
+
|
|
893
903
|
USERNAME = uuid4().hex
|
|
894
904
|
PASSWORD = uuid4().hex
|
|
895
905
|
TOKEN = uuid4().hex
|
|
@@ -915,6 +925,11 @@ APP_KEY = uuid4().hex
|
|
|
915
925
|
lambda _, credentials: credentials.key == API_KEY,
|
|
916
926
|
api_key_headers(API_KEY),
|
|
917
927
|
),
|
|
928
|
+
(
|
|
929
|
+
SessionCredentials,
|
|
930
|
+
lambda _, credentials: credentials.logged_in_user["type"] == "Staff",
|
|
931
|
+
session_headers("abc123", "Staff"),
|
|
932
|
+
),
|
|
918
933
|
(
|
|
919
934
|
Credentials,
|
|
920
935
|
lambda request, _: request.headers.get("API-Key") == API_KEY
|
|
@@ -922,7 +937,7 @@ APP_KEY = uuid4().hex
|
|
|
922
937
|
custom_headers(API_KEY, APP_KEY),
|
|
923
938
|
),
|
|
924
939
|
],
|
|
925
|
-
ids=["basic", "bearer", "API key", "custom"],
|
|
940
|
+
ids=["basic", "bearer", "API key", "custom", "session"],
|
|
926
941
|
)
|
|
927
942
|
def authenticated_route(request: SubRequest) -> SimpleNamespace:
|
|
928
943
|
"""
|
|
@@ -998,8 +1013,9 @@ def test_authentication_failure(
|
|
|
998
1013
|
(BearerCredentials, bearer_headers(TOKEN)),
|
|
999
1014
|
(APIKeyCredentials, api_key_headers(API_KEY)),
|
|
1000
1015
|
(Credentials, custom_headers(API_KEY, APP_KEY)),
|
|
1016
|
+
(SessionCredentials, session_headers("abc123", "Patient")),
|
|
1001
1017
|
],
|
|
1002
|
-
ids=["basic", "bearer", "API key", "custom"],
|
|
1018
|
+
ids=["basic", "bearer", "API key", "custom", "session"],
|
|
1003
1019
|
)
|
|
1004
1020
|
def test_authentication_exception(
|
|
1005
1021
|
credentials_cls: type[Credentials], headers: Mapping[str, str]
|
|
@@ -1079,6 +1095,40 @@ def test_authentication_exception(
|
|
|
1079
1095
|
).apply()
|
|
1080
1096
|
],
|
|
1081
1097
|
),
|
|
1098
|
+
(
|
|
1099
|
+
StaffSessionAuthMixin,
|
|
1100
|
+
{},
|
|
1101
|
+
session_headers("abc123", "Staff"),
|
|
1102
|
+
[Effect(type=EffectType.CREATE_TASK, payload="create task")],
|
|
1103
|
+
),
|
|
1104
|
+
(
|
|
1105
|
+
StaffSessionAuthMixin,
|
|
1106
|
+
{},
|
|
1107
|
+
session_headers("abc123", "Patient"),
|
|
1108
|
+
[
|
|
1109
|
+
JSONResponse(
|
|
1110
|
+
content={"error": "Provided credentials are invalid"},
|
|
1111
|
+
status_code=HTTPStatus.UNAUTHORIZED,
|
|
1112
|
+
).apply()
|
|
1113
|
+
],
|
|
1114
|
+
),
|
|
1115
|
+
(
|
|
1116
|
+
PatientSessionAuthMixin,
|
|
1117
|
+
{},
|
|
1118
|
+
session_headers("abc123", "Patient"),
|
|
1119
|
+
[Effect(type=EffectType.CREATE_TASK, payload="create task")],
|
|
1120
|
+
),
|
|
1121
|
+
(
|
|
1122
|
+
PatientSessionAuthMixin,
|
|
1123
|
+
{},
|
|
1124
|
+
session_headers("abc123", "Staff"),
|
|
1125
|
+
[
|
|
1126
|
+
JSONResponse(
|
|
1127
|
+
content={"error": "Provided credentials are invalid"},
|
|
1128
|
+
status_code=HTTPStatus.UNAUTHORIZED,
|
|
1129
|
+
).apply()
|
|
1130
|
+
],
|
|
1131
|
+
),
|
|
1082
1132
|
],
|
|
1083
1133
|
ids=[
|
|
1084
1134
|
"basic valid",
|
|
@@ -1087,6 +1137,10 @@ def test_authentication_exception(
|
|
|
1087
1137
|
"API key valid",
|
|
1088
1138
|
"API key invalid",
|
|
1089
1139
|
"API key missing secret",
|
|
1140
|
+
"Staff session valid",
|
|
1141
|
+
"Staff session invalid",
|
|
1142
|
+
"Patient session valid",
|
|
1143
|
+
"Patient session invalid",
|
|
1090
1144
|
],
|
|
1091
1145
|
)
|
|
1092
1146
|
def test_authentication_mixins(
|
|
@@ -2,6 +2,8 @@ import logging
|
|
|
2
2
|
import os
|
|
3
3
|
from typing import Any
|
|
4
4
|
|
|
5
|
+
import redis
|
|
6
|
+
|
|
5
7
|
from pubsub.pubsub import Publisher
|
|
6
8
|
|
|
7
9
|
|
|
@@ -15,7 +17,11 @@ class PubSubLogHandler(logging.Handler):
|
|
|
15
17
|
def emit(self, record: Any) -> None:
|
|
16
18
|
"""Publishes the log message to the pub/sub channel."""
|
|
17
19
|
message = self.format(record)
|
|
18
|
-
|
|
20
|
+
|
|
21
|
+
try:
|
|
22
|
+
self.publisher.publish(message)
|
|
23
|
+
except redis.ConnectionError as e:
|
|
24
|
+
print(f"PubSubLogHandler: failed to log message due to redis error: {e}")
|
|
19
25
|
|
|
20
26
|
|
|
21
27
|
class PluginLogger:
|
|
@@ -34,6 +34,7 @@ from plugin_runner.installation import install_plugins
|
|
|
34
34
|
from plugin_runner.sandbox import Sandbox
|
|
35
35
|
from settings import (
|
|
36
36
|
CHANNEL_NAME,
|
|
37
|
+
CUSTOMER_IDENTIFIER,
|
|
37
38
|
IS_TESTING,
|
|
38
39
|
MANIFEST_FILE_NAME,
|
|
39
40
|
PLUGIN_DIRECTORY,
|
|
@@ -49,6 +50,11 @@ sys.path.append(PLUGIN_DIRECTORY)
|
|
|
49
50
|
# TODO: create typings here for the subkeys
|
|
50
51
|
LOADED_PLUGINS: dict = {}
|
|
51
52
|
|
|
53
|
+
# a global dictionary of values made available to all plugins
|
|
54
|
+
ENVIRONMENT: dict = {
|
|
55
|
+
"CUSTOMER_IDENTIFIER": CUSTOMER_IDENTIFIER,
|
|
56
|
+
}
|
|
57
|
+
|
|
52
58
|
# a global dictionary of events to handler class names
|
|
53
59
|
EVENT_HANDLER_MAP: dict[str, list] = defaultdict(list)
|
|
54
60
|
|
|
@@ -174,7 +180,7 @@ class PluginRunner(PluginRunnerServicer):
|
|
|
174
180
|
)
|
|
175
181
|
|
|
176
182
|
try:
|
|
177
|
-
handler = handler_class(event, secrets)
|
|
183
|
+
handler = handler_class(event, secrets, ENVIRONMENT)
|
|
178
184
|
|
|
179
185
|
if not handler.accept_event():
|
|
180
186
|
continue
|
|
@@ -267,38 +273,48 @@ async def synchronize_plugins(run_once: bool = False) -> None:
|
|
|
267
273
|
log.info(f'synchronize_plugins: listening for messages on pubsub channel "{CHANNEL_NAME}"')
|
|
268
274
|
|
|
269
275
|
_, pubsub = get_client()
|
|
276
|
+
|
|
270
277
|
await pubsub.psubscribe(CHANNEL_NAME)
|
|
271
278
|
|
|
272
279
|
while True:
|
|
273
|
-
message = await pubsub.get_message(ignore_subscribe_messages=True, timeout=
|
|
280
|
+
message = await pubsub.get_message(ignore_subscribe_messages=True, timeout=5.0)
|
|
274
281
|
|
|
275
|
-
if message is
|
|
276
|
-
|
|
282
|
+
if message is None:
|
|
283
|
+
continue
|
|
277
284
|
|
|
278
|
-
|
|
285
|
+
log.info(f'synchronize_plugins: received message from pubsub channel "{CHANNEL_NAME}"')
|
|
279
286
|
|
|
280
|
-
|
|
281
|
-
continue
|
|
287
|
+
message_type = message.get("type", "")
|
|
282
288
|
|
|
283
|
-
|
|
289
|
+
if message_type != "pmessage":
|
|
290
|
+
continue
|
|
284
291
|
|
|
285
|
-
|
|
286
|
-
|
|
292
|
+
data = pickle.loads(message.get("data", pickle.dumps({})))
|
|
293
|
+
|
|
294
|
+
if "action" not in data:
|
|
295
|
+
continue
|
|
296
|
+
|
|
297
|
+
if data["action"] == "reload":
|
|
298
|
+
log.info("synchronize_plugins: installing and reloading plugins for action=reload")
|
|
299
|
+
|
|
300
|
+
try:
|
|
301
|
+
install_plugins()
|
|
302
|
+
except Exception as e:
|
|
303
|
+
# TODO capture_exception when Sentry is installed
|
|
304
|
+
log.error(f"synchronize_plugins: install_plugins failed: {e}")
|
|
305
|
+
|
|
306
|
+
try:
|
|
307
|
+
load_plugins()
|
|
308
|
+
except Exception as e:
|
|
309
|
+
# TODO capture_exception when Sentry is installed
|
|
310
|
+
log.error(f"synchronize_plugins: load_plugins failed: {e}")
|
|
287
311
|
|
|
288
|
-
|
|
289
|
-
log.info("synchronize_plugins: installing and reloading plugins for action=reload")
|
|
312
|
+
await pubsub.check_health()
|
|
290
313
|
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
# TODO capture_exception when Sentry is installed
|
|
295
|
-
log.error(f"synchronize_plugins: install_plugins failed: {e}")
|
|
314
|
+
if not pubsub.connection.is_connected: # type: ignore
|
|
315
|
+
log.info("synchronize_plugins: reconnecting to Redis")
|
|
316
|
+
await pubsub.connection.connect() # type: ignore
|
|
296
317
|
|
|
297
|
-
try:
|
|
298
|
-
load_plugins()
|
|
299
|
-
except Exception as e:
|
|
300
|
-
# TODO capture_exception when Sentry is installed
|
|
301
|
-
log.error(f"synchronize_plugins: load_plugins failed: {e}")
|
|
302
318
|
if run_once:
|
|
303
319
|
break
|
|
304
320
|
|
|
@@ -307,13 +323,13 @@ async def synchronize_plugins_and_report_errors() -> None:
|
|
|
307
323
|
"""
|
|
308
324
|
Run synchronize_plugins() in perpetuity and report any encountered errors.
|
|
309
325
|
"""
|
|
310
|
-
log.info("
|
|
326
|
+
log.info("synchronize_plugins: starting loop...")
|
|
311
327
|
|
|
312
328
|
while True:
|
|
313
329
|
try:
|
|
314
330
|
await synchronize_plugins()
|
|
315
331
|
except Exception as e:
|
|
316
|
-
log.error(f"synchronize_plugins error: {e}")
|
|
332
|
+
log.error(f"synchronize_plugins: error: {e}")
|
|
317
333
|
|
|
318
334
|
# don't crush redis if we're retrying in a tight loop
|
|
319
335
|
await asyncio.sleep(0.5)
|
|
@@ -580,13 +596,13 @@ def run_server(specified_plugin_paths: list[str] | None = None) -> None:
|
|
|
580
596
|
asyncio.set_event_loop(loop)
|
|
581
597
|
|
|
582
598
|
try:
|
|
583
|
-
|
|
599
|
+
coroutines = [serve(specified_plugin_paths)]
|
|
584
600
|
|
|
585
601
|
# Only start the synchronizer if the plugin runner was not started from the CLI
|
|
586
602
|
if specified_plugin_paths is None:
|
|
587
|
-
|
|
603
|
+
coroutines.append(synchronize_plugins_and_report_errors())
|
|
588
604
|
|
|
589
|
-
loop.run_until_complete(asyncio.gather(*
|
|
605
|
+
loop.run_until_complete(asyncio.gather(*coroutines))
|
|
590
606
|
except KeyboardInterrupt:
|
|
591
607
|
pass
|
|
592
608
|
finally:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/APPOINTMENT_CANCELED.ndjson
RENAMED
|
File without changes
|
{canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/APPOINTMENT_CHECKED_IN.ndjson
RENAMED
|
File without changes
|
{canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/APPOINTMENT_CREATED.ndjson
RENAMED
|
File without changes
|
{canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/APPOINTMENT_NO_SHOWED.ndjson
RENAMED
|
File without changes
|
{canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/APPOINTMENT_RESCHEDULED.ndjson
RENAMED
|
File without changes
|
{canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/APPOINTMENT_RESTORED.ndjson
RENAMED
|
File without changes
|
{canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/APPOINTMENT_UPDATED.ndjson
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/BILLING_LINE_ITEM_CREATED.ndjson
RENAMED
|
File without changes
|
{canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/BILLING_LINE_ITEM_UPDATED.ndjson
RENAMED
|
File without changes
|
{canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/CONDITION_ASSESSED.ndjson
RENAMED
|
File without changes
|
{canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/CONDITION_CREATED.ndjson
RENAMED
|
File without changes
|
{canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/CONDITION_UPDATED.ndjson
RENAMED
|
File without changes
|
|
File without changes
|
{canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/ENCOUNTER_CREATED.ndjson
RENAMED
|
File without changes
|
{canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/ENCOUNTER_UPDATED.ndjson
RENAMED
|
File without changes
|
{canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/IMMUNIZATION_CREATED.ndjson
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/IMMUNIZATION_UPDATED.ndjson
RENAMED
|
File without changes
|
{canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/INTERVIEW_CREATED.ndjson
RENAMED
|
File without changes
|
{canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/INTERVIEW_UPDATED.ndjson
RENAMED
|
File without changes
|
{canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/LAB_ORDER_CREATED.ndjson
RENAMED
|
File without changes
|
{canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/LAB_ORDER_UPDATED.ndjson
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/SIMPLE_API_REQUEST.ndjson
RENAMED
|
File without changes
|
{canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/TASK_COMMENT_CREATED.ndjson
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/VITAL_SIGN_CREATED.ndjson
RENAMED
|
File without changes
|
{canvas-0.29.1 → canvas-0.31.0}/canvas_cli/apps/emit/event_fixtures/VITAL_SIGN_UPDATED.ndjson
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|