cumulusci-plus 5.0.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 cumulusci-plus might be problematic. Click here for more details.
- cumulusci/__about__.py +1 -0
- cumulusci/__init__.py +22 -0
- cumulusci/__main__.py +3 -0
- cumulusci/cli/__init__.py +0 -0
- cumulusci/cli/cci.py +244 -0
- cumulusci/cli/error.py +125 -0
- cumulusci/cli/flow.py +185 -0
- cumulusci/cli/logger.py +72 -0
- cumulusci/cli/org.py +692 -0
- cumulusci/cli/plan.py +181 -0
- cumulusci/cli/project.py +391 -0
- cumulusci/cli/robot.py +116 -0
- cumulusci/cli/runtime.py +190 -0
- cumulusci/cli/service.py +521 -0
- cumulusci/cli/task.py +295 -0
- cumulusci/cli/tests/__init__.py +0 -0
- cumulusci/cli/tests/test_cci.py +545 -0
- cumulusci/cli/tests/test_error.py +170 -0
- cumulusci/cli/tests/test_flow.py +276 -0
- cumulusci/cli/tests/test_logger.py +25 -0
- cumulusci/cli/tests/test_org.py +1438 -0
- cumulusci/cli/tests/test_plan.py +245 -0
- cumulusci/cli/tests/test_project.py +235 -0
- cumulusci/cli/tests/test_robot.py +177 -0
- cumulusci/cli/tests/test_runtime.py +197 -0
- cumulusci/cli/tests/test_service.py +853 -0
- cumulusci/cli/tests/test_task.py +266 -0
- cumulusci/cli/tests/test_ui.py +310 -0
- cumulusci/cli/tests/test_utils.py +122 -0
- cumulusci/cli/tests/utils.py +52 -0
- cumulusci/cli/ui.py +234 -0
- cumulusci/cli/utils.py +150 -0
- cumulusci/conftest.py +181 -0
- cumulusci/core/__init__.py +0 -0
- cumulusci/core/config/BaseConfig.py +5 -0
- cumulusci/core/config/BaseTaskFlowConfig.py +5 -0
- cumulusci/core/config/OrgConfig.py +5 -0
- cumulusci/core/config/ScratchOrgConfig.py +5 -0
- cumulusci/core/config/__init__.py +125 -0
- cumulusci/core/config/base_config.py +111 -0
- cumulusci/core/config/base_task_flow_config.py +82 -0
- cumulusci/core/config/marketing_cloud_service_config.py +83 -0
- cumulusci/core/config/oauth2_service_config.py +17 -0
- cumulusci/core/config/org_config.py +604 -0
- cumulusci/core/config/project_config.py +782 -0
- cumulusci/core/config/scratch_org_config.py +251 -0
- cumulusci/core/config/sfdx_org_config.py +220 -0
- cumulusci/core/config/tests/_test_config_backwards_compatibility.py +33 -0
- cumulusci/core/config/tests/test_config.py +1895 -0
- cumulusci/core/config/tests/test_config_expensive.py +839 -0
- cumulusci/core/config/tests/test_config_util.py +91 -0
- cumulusci/core/config/universal_config.py +88 -0
- cumulusci/core/config/util.py +18 -0
- cumulusci/core/datasets.py +303 -0
- cumulusci/core/debug.py +33 -0
- cumulusci/core/dependencies/__init__.py +55 -0
- cumulusci/core/dependencies/base.py +561 -0
- cumulusci/core/dependencies/dependencies.py +273 -0
- cumulusci/core/dependencies/github.py +177 -0
- cumulusci/core/dependencies/github_resolvers.py +244 -0
- cumulusci/core/dependencies/resolvers.py +580 -0
- cumulusci/core/dependencies/tests/__init__.py +0 -0
- cumulusci/core/dependencies/tests/conftest.py +385 -0
- cumulusci/core/dependencies/tests/test_dependencies.py +950 -0
- cumulusci/core/dependencies/tests/test_github.py +83 -0
- cumulusci/core/dependencies/tests/test_resolvers.py +1027 -0
- cumulusci/core/dependencies/utils.py +13 -0
- cumulusci/core/enums.py +11 -0
- cumulusci/core/exceptions.py +311 -0
- cumulusci/core/flowrunner.py +888 -0
- cumulusci/core/github.py +665 -0
- cumulusci/core/keychain/__init__.py +24 -0
- cumulusci/core/keychain/base_project_keychain.py +441 -0
- cumulusci/core/keychain/encrypted_file_project_keychain.py +945 -0
- cumulusci/core/keychain/environment_project_keychain.py +7 -0
- cumulusci/core/keychain/serialization.py +152 -0
- cumulusci/core/keychain/subprocess_keychain.py +24 -0
- cumulusci/core/keychain/tests/conftest.py +50 -0
- cumulusci/core/keychain/tests/test_base_project_keychain.py +299 -0
- cumulusci/core/keychain/tests/test_encrypted_file_project_keychain.py +1228 -0
- cumulusci/core/metadeploy/__init__.py +0 -0
- cumulusci/core/metadeploy/api.py +88 -0
- cumulusci/core/metadeploy/plans.py +25 -0
- cumulusci/core/metadeploy/tests/test_api.py +276 -0
- cumulusci/core/runtime.py +115 -0
- cumulusci/core/sfdx.py +162 -0
- cumulusci/core/source/__init__.py +16 -0
- cumulusci/core/source/github.py +50 -0
- cumulusci/core/source/local_folder.py +35 -0
- cumulusci/core/source_transforms/__init__.py +0 -0
- cumulusci/core/source_transforms/tests/test_transforms.py +1091 -0
- cumulusci/core/source_transforms/transforms.py +532 -0
- cumulusci/core/tasks.py +404 -0
- cumulusci/core/template_utils.py +59 -0
- cumulusci/core/tests/__init__.py +0 -0
- cumulusci/core/tests/cassettes/TestDatasetsE2E.test_datasets_e2e.yaml +215 -0
- cumulusci/core/tests/cassettes/TestDatasetsE2E.test_datasets_extract_standard_objects.yaml +199 -0
- cumulusci/core/tests/cassettes/TestDatasetsE2E.test_datasets_read_explicit_extract_declaration.yaml +3 -0
- cumulusci/core/tests/fake_remote_repo/cumulusci.yml +32 -0
- cumulusci/core/tests/fake_remote_repo/tasks/directory/example_2.py +6 -0
- cumulusci/core/tests/fake_remote_repo/tasks/example.py +43 -0
- cumulusci/core/tests/fake_remote_repo_2/cumulusci.yml +11 -0
- cumulusci/core/tests/fake_remote_repo_2/tasks/example_3.py +6 -0
- cumulusci/core/tests/test_datasets_e2e.py +386 -0
- cumulusci/core/tests/test_exceptions.py +11 -0
- cumulusci/core/tests/test_flowrunner.py +836 -0
- cumulusci/core/tests/test_github.py +942 -0
- cumulusci/core/tests/test_sfdx.py +138 -0
- cumulusci/core/tests/test_source.py +678 -0
- cumulusci/core/tests/test_tasks.py +262 -0
- cumulusci/core/tests/test_utils.py +141 -0
- cumulusci/core/tests/test_utils_merge_config.py +276 -0
- cumulusci/core/tests/test_versions.py +76 -0
- cumulusci/core/tests/untrusted_repo_child/cumulusci.yml +7 -0
- cumulusci/core/tests/untrusted_repo_child/tasks/untrusted_child.py +6 -0
- cumulusci/core/tests/untrusted_repo_parent/cumulusci.yml +26 -0
- cumulusci/core/tests/untrusted_repo_parent/tasks/untrusted_parent.py +6 -0
- cumulusci/core/tests/utils.py +116 -0
- cumulusci/core/tests/yaml/global.yaml +0 -0
- cumulusci/core/utils.py +402 -0
- cumulusci/core/versions.py +149 -0
- cumulusci/cumulusci.yml +1621 -0
- cumulusci/files/admin_profile.xml +20 -0
- cumulusci/files/delete_excludes.txt +424 -0
- cumulusci/files/templates/project/README.md +12 -0
- cumulusci/files/templates/project/cumulusci.yml +63 -0
- cumulusci/files/templates/project/dot-gitignore +60 -0
- cumulusci/files/templates/project/mapping.yml +45 -0
- cumulusci/files/templates/project/scratch_def.json +25 -0
- cumulusci/oauth/__init__.py +0 -0
- cumulusci/oauth/client.py +400 -0
- cumulusci/oauth/exceptions.py +9 -0
- cumulusci/oauth/salesforce.py +95 -0
- cumulusci/oauth/tests/__init__.py +0 -0
- cumulusci/oauth/tests/cassettes/test_get_device_code.yaml +22 -0
- cumulusci/oauth/tests/cassettes/test_get_device_oauth_token.yaml +74 -0
- cumulusci/oauth/tests/test_client.py +308 -0
- cumulusci/oauth/tests/test_salesforce.py +46 -0
- cumulusci/plugins/__init__.py +3 -0
- cumulusci/plugins/plugin_base.py +93 -0
- cumulusci/plugins/plugin_loader.py +59 -0
- cumulusci/robotframework/CumulusCI.py +340 -0
- cumulusci/robotframework/CumulusCI.robot +7 -0
- cumulusci/robotframework/Performance.py +165 -0
- cumulusci/robotframework/Salesforce.py +936 -0
- cumulusci/robotframework/Salesforce.robot +192 -0
- cumulusci/robotframework/SalesforceAPI.py +416 -0
- cumulusci/robotframework/SalesforcePlaywright.py +220 -0
- cumulusci/robotframework/SalesforcePlaywright.robot +40 -0
- cumulusci/robotframework/__init__.py +2 -0
- cumulusci/robotframework/base_library.py +39 -0
- cumulusci/robotframework/faker_mixin.py +89 -0
- cumulusci/robotframework/form_handlers.py +222 -0
- cumulusci/robotframework/javascript/cci_init.js +34 -0
- cumulusci/robotframework/javascript/cumulusci.js +4 -0
- cumulusci/robotframework/locator_manager.py +197 -0
- cumulusci/robotframework/locators_56.py +88 -0
- cumulusci/robotframework/locators_57.py +5 -0
- cumulusci/robotframework/pageobjects/BasePageObjects.py +433 -0
- cumulusci/robotframework/pageobjects/ObjectManagerPageObject.py +246 -0
- cumulusci/robotframework/pageobjects/PageObjectLibrary.py +45 -0
- cumulusci/robotframework/pageobjects/PageObjects.py +351 -0
- cumulusci/robotframework/pageobjects/__init__.py +12 -0
- cumulusci/robotframework/pageobjects/baseobjects.py +120 -0
- cumulusci/robotframework/perftests/short/collection_perf.robot +105 -0
- cumulusci/robotframework/tests/CustomObjectTestPage.py +10 -0
- cumulusci/robotframework/tests/FooTestPage.py +8 -0
- cumulusci/robotframework/tests/cumulusci/base.robot +40 -0
- cumulusci/robotframework/tests/cumulusci/bulkdata.robot +38 -0
- cumulusci/robotframework/tests/cumulusci/communities.robot +57 -0
- cumulusci/robotframework/tests/cumulusci/datagen.robot +84 -0
- cumulusci/robotframework/tests/salesforce/TestLibraryA.py +24 -0
- cumulusci/robotframework/tests/salesforce/TestLibraryB.py +20 -0
- cumulusci/robotframework/tests/salesforce/TestListener.py +93 -0
- cumulusci/robotframework/tests/salesforce/api.robot +178 -0
- cumulusci/robotframework/tests/salesforce/browsers.robot +143 -0
- cumulusci/robotframework/tests/salesforce/classic.robot +51 -0
- cumulusci/robotframework/tests/salesforce/create_contact.robot +59 -0
- cumulusci/robotframework/tests/salesforce/faker.robot +68 -0
- cumulusci/robotframework/tests/salesforce/forms.robot +172 -0
- cumulusci/robotframework/tests/salesforce/label_locator.robot +244 -0
- cumulusci/robotframework/tests/salesforce/labels.html +33 -0
- cumulusci/robotframework/tests/salesforce/locators.robot +149 -0
- cumulusci/robotframework/tests/salesforce/pageobjects/base_pageobjects.robot +100 -0
- cumulusci/robotframework/tests/salesforce/pageobjects/example_page_object.py +25 -0
- cumulusci/robotframework/tests/salesforce/pageobjects/listing_page.robot +115 -0
- cumulusci/robotframework/tests/salesforce/pageobjects/objectmanager.robot +74 -0
- cumulusci/robotframework/tests/salesforce/pageobjects/pageobjects.robot +171 -0
- cumulusci/robotframework/tests/salesforce/performance.robot +109 -0
- cumulusci/robotframework/tests/salesforce/playwright/javascript_keywords.robot +33 -0
- cumulusci/robotframework/tests/salesforce/playwright/open_test_browser.robot +48 -0
- cumulusci/robotframework/tests/salesforce/playwright/playwright.robot +24 -0
- cumulusci/robotframework/tests/salesforce/playwright/ui.robot +32 -0
- cumulusci/robotframework/tests/salesforce/populate.robot +89 -0
- cumulusci/robotframework/tests/salesforce/test_testlistener.py +37 -0
- cumulusci/robotframework/tests/salesforce/ui.robot +361 -0
- cumulusci/robotframework/tests/test_cumulusci_library.py +304 -0
- cumulusci/robotframework/tests/test_locator_manager.py +158 -0
- cumulusci/robotframework/tests/test_pageobjects.py +291 -0
- cumulusci/robotframework/tests/test_performance.py +38 -0
- cumulusci/robotframework/tests/test_salesforce.py +79 -0
- cumulusci/robotframework/tests/test_salesforce_locators.py +73 -0
- cumulusci/robotframework/tests/test_template_util.py +53 -0
- cumulusci/robotframework/tests/test_utils.py +106 -0
- cumulusci/robotframework/utils.py +283 -0
- cumulusci/salesforce_api/__init__.py +0 -0
- cumulusci/salesforce_api/exceptions.py +23 -0
- cumulusci/salesforce_api/filterable_objects.py +96 -0
- cumulusci/salesforce_api/mc_soap_envelopes.py +89 -0
- cumulusci/salesforce_api/metadata.py +721 -0
- cumulusci/salesforce_api/org_schema.py +571 -0
- cumulusci/salesforce_api/org_schema_models.py +226 -0
- cumulusci/salesforce_api/package_install.py +265 -0
- cumulusci/salesforce_api/package_zip.py +301 -0
- cumulusci/salesforce_api/rest_deploy.py +148 -0
- cumulusci/salesforce_api/retrieve_profile_api.py +301 -0
- cumulusci/salesforce_api/soap_envelopes.py +177 -0
- cumulusci/salesforce_api/tests/__init__.py +0 -0
- cumulusci/salesforce_api/tests/metadata_test_strings.py +24 -0
- cumulusci/salesforce_api/tests/test_metadata.py +1015 -0
- cumulusci/salesforce_api/tests/test_package_install.py +219 -0
- cumulusci/salesforce_api/tests/test_package_zip.py +380 -0
- cumulusci/salesforce_api/tests/test_rest_deploy.py +264 -0
- cumulusci/salesforce_api/tests/test_retrieve_profile_api.py +337 -0
- cumulusci/salesforce_api/tests/test_utils.py +124 -0
- cumulusci/salesforce_api/utils.py +51 -0
- cumulusci/schema/cumulusci.jsonschema.json +782 -0
- cumulusci/tasks/__init__.py +0 -0
- cumulusci/tasks/apex/__init__.py +0 -0
- cumulusci/tasks/apex/anon.py +157 -0
- cumulusci/tasks/apex/batch.py +180 -0
- cumulusci/tasks/apex/testrunner.py +835 -0
- cumulusci/tasks/apex/tests/cassettes/ManualEditTestApexIntegrationTests.test_run_tests__integration_test.yaml +703 -0
- cumulusci/tasks/apex/tests/test_apex_tasks.py +1558 -0
- cumulusci/tasks/base_source_control_task.py +17 -0
- cumulusci/tasks/bulkdata/__init__.py +15 -0
- cumulusci/tasks/bulkdata/base_generate_data_task.py +96 -0
- cumulusci/tasks/bulkdata/dates.py +97 -0
- cumulusci/tasks/bulkdata/delete.py +156 -0
- cumulusci/tasks/bulkdata/extract.py +441 -0
- cumulusci/tasks/bulkdata/extract_dataset_utils/calculate_dependencies.py +117 -0
- cumulusci/tasks/bulkdata/extract_dataset_utils/extract_yml.py +123 -0
- cumulusci/tasks/bulkdata/extract_dataset_utils/hardcoded_default_declarations.py +49 -0
- cumulusci/tasks/bulkdata/extract_dataset_utils/synthesize_extract_declarations.py +283 -0
- cumulusci/tasks/bulkdata/extract_dataset_utils/tests/test_extract_yml.py +142 -0
- cumulusci/tasks/bulkdata/extract_dataset_utils/tests/test_synthesize_extract_declarations.py +575 -0
- cumulusci/tasks/bulkdata/factory_utils.py +134 -0
- cumulusci/tasks/bulkdata/generate.py +4 -0
- cumulusci/tasks/bulkdata/generate_and_load_data.py +232 -0
- cumulusci/tasks/bulkdata/generate_and_load_data_from_yaml.py +19 -0
- cumulusci/tasks/bulkdata/generate_from_yaml.py +183 -0
- cumulusci/tasks/bulkdata/generate_mapping.py +434 -0
- cumulusci/tasks/bulkdata/generate_mapping_utils/dependency_map.py +169 -0
- cumulusci/tasks/bulkdata/generate_mapping_utils/extract_mapping_file_generator.py +45 -0
- cumulusci/tasks/bulkdata/generate_mapping_utils/generate_mapping_from_declarations.py +121 -0
- cumulusci/tasks/bulkdata/generate_mapping_utils/load_mapping_file_generator.py +127 -0
- cumulusci/tasks/bulkdata/generate_mapping_utils/mapping_generator_post_processes.py +53 -0
- cumulusci/tasks/bulkdata/generate_mapping_utils/mapping_transforms.py +139 -0
- cumulusci/tasks/bulkdata/generate_mapping_utils/tests/test_generate_extract_mapping_from_declarations.py +135 -0
- cumulusci/tasks/bulkdata/generate_mapping_utils/tests/test_generate_load_mapping_from_declarations.py +330 -0
- cumulusci/tasks/bulkdata/generate_mapping_utils/tests/test_mapping_generator_post_processes.py +60 -0
- cumulusci/tasks/bulkdata/generate_mapping_utils/tests/test_mapping_transforms.py +188 -0
- cumulusci/tasks/bulkdata/load.py +1196 -0
- cumulusci/tasks/bulkdata/mapping_parser.py +811 -0
- cumulusci/tasks/bulkdata/query_transformers.py +264 -0
- cumulusci/tasks/bulkdata/select_utils.py +792 -0
- cumulusci/tasks/bulkdata/snowfakery.py +753 -0
- cumulusci/tasks/bulkdata/snowfakery_utils/queue_manager.py +478 -0
- cumulusci/tasks/bulkdata/snowfakery_utils/snowfakery_run_until.py +141 -0
- cumulusci/tasks/bulkdata/snowfakery_utils/snowfakery_working_directory.py +53 -0
- cumulusci/tasks/bulkdata/snowfakery_utils/subtask_configurator.py +64 -0
- cumulusci/tasks/bulkdata/step.py +1242 -0
- cumulusci/tasks/bulkdata/tests/__init__.py +0 -0
- cumulusci/tasks/bulkdata/tests/cassettes/TestSelect.test_select_random_strategy.yaml +147 -0
- cumulusci/tasks/bulkdata/tests/cassettes/TestSelect.test_select_similarity_annoy_strategy.yaml +123 -0
- cumulusci/tasks/bulkdata/tests/cassettes/TestSelect.test_select_similarity_select_and_insert_strategy.yaml +313 -0
- cumulusci/tasks/bulkdata/tests/cassettes/TestSelect.test_select_similarity_select_and_insert_strategy_bulk.yaml +550 -0
- cumulusci/tasks/bulkdata/tests/cassettes/TestSelect.test_select_similarity_strategy.yaml +175 -0
- cumulusci/tasks/bulkdata/tests/cassettes/TestSelect.test_select_standard_strategy.yaml +147 -0
- cumulusci/tasks/bulkdata/tests/cassettes/TestSnowfakery.test_run_until_records_in_org__multiple_needed.yaml +69 -0
- cumulusci/tasks/bulkdata/tests/cassettes/TestSnowfakery.test_run_until_records_in_org__none_needed.yaml +22 -0
- cumulusci/tasks/bulkdata/tests/cassettes/TestSnowfakery.test_run_until_records_in_org__one_needed.yaml +24 -0
- cumulusci/tasks/bulkdata/tests/cassettes/TestSnowfakery.test_snowfakery_query_salesforce.yaml +25 -0
- cumulusci/tasks/bulkdata/tests/cassettes/TestUpdatesIntegrationTests.test_updates_task.yaml +80 -0
- cumulusci/tasks/bulkdata/tests/cassettes/TestUpsert.test_simple_upsert__rest.yaml +270 -0
- cumulusci/tasks/bulkdata/tests/cassettes/TestUpsert.test_upsert__rest.yaml +267 -0
- cumulusci/tasks/bulkdata/tests/cassettes/TestUpsert.test_upsert_complex_external_id_field__rest.yaml +369 -0
- cumulusci/tasks/bulkdata/tests/cassettes/TestUpsert.test_upsert_complex_external_id_field_rest__duplicate_error.yaml +204 -0
- cumulusci/tasks/bulkdata/tests/cassettes/TestUpsert.test_upsert_complex_fields__bulk.yaml +675 -0
- cumulusci/tasks/bulkdata/tests/dummy_data_factory.py +36 -0
- cumulusci/tasks/bulkdata/tests/integration_test_utils.py +49 -0
- cumulusci/tasks/bulkdata/tests/mapping-oid.yml +87 -0
- cumulusci/tasks/bulkdata/tests/mapping_after.yml +38 -0
- cumulusci/tasks/bulkdata/tests/mapping_poly.yml +34 -0
- cumulusci/tasks/bulkdata/tests/mapping_poly_incomplete.yml +20 -0
- cumulusci/tasks/bulkdata/tests/mapping_poly_wrong.yml +21 -0
- cumulusci/tasks/bulkdata/tests/mapping_select.yml +20 -0
- cumulusci/tasks/bulkdata/tests/mapping_select_invalid_strategy.yml +20 -0
- cumulusci/tasks/bulkdata/tests/mapping_select_invalid_threshold__invalid_number.yml +21 -0
- cumulusci/tasks/bulkdata/tests/mapping_select_invalid_threshold__invalid_strategy.yml +21 -0
- cumulusci/tasks/bulkdata/tests/mapping_select_invalid_threshold__non_float.yml +21 -0
- cumulusci/tasks/bulkdata/tests/mapping_select_missing_priority_fields.yml +22 -0
- cumulusci/tasks/bulkdata/tests/mapping_select_no_priority_fields.yml +18 -0
- cumulusci/tasks/bulkdata/tests/mapping_simple.yml +27 -0
- cumulusci/tasks/bulkdata/tests/mapping_v1.yml +28 -0
- cumulusci/tasks/bulkdata/tests/mapping_v2.yml +21 -0
- cumulusci/tasks/bulkdata/tests/mapping_v3.yml +32 -0
- cumulusci/tasks/bulkdata/tests/mapping_vanilla_sf.yml +69 -0
- cumulusci/tasks/bulkdata/tests/mock_data_factory_without_mapping.py +12 -0
- cumulusci/tasks/bulkdata/tests/person_accounts.yml +23 -0
- cumulusci/tasks/bulkdata/tests/person_accounts_minimal.yml +15 -0
- cumulusci/tasks/bulkdata/tests/recordtypes.yml +8 -0
- cumulusci/tasks/bulkdata/tests/recordtypes_2.yml +6 -0
- cumulusci/tasks/bulkdata/tests/recordtypes_with_ispersontype.yml +8 -0
- cumulusci/tasks/bulkdata/tests/snowfakery/child/child2.yml +3 -0
- cumulusci/tasks/bulkdata/tests/snowfakery/child.yml +4 -0
- cumulusci/tasks/bulkdata/tests/snowfakery/gen_npsp_standard_objects.recipe.yml +89 -0
- cumulusci/tasks/bulkdata/tests/snowfakery/include_parent.yml +3 -0
- cumulusci/tasks/bulkdata/tests/snowfakery/npsp_standard_objects_macros.yml +34 -0
- cumulusci/tasks/bulkdata/tests/snowfakery/options.recipe.yml +6 -0
- cumulusci/tasks/bulkdata/tests/snowfakery/query_snowfakery.recipe.yml +16 -0
- cumulusci/tasks/bulkdata/tests/snowfakery/sf_standard_object_macros.yml +83 -0
- cumulusci/tasks/bulkdata/tests/snowfakery/simple_snowfakery.load.yml +2 -0
- cumulusci/tasks/bulkdata/tests/snowfakery/simple_snowfakery.recipe.yml +13 -0
- cumulusci/tasks/bulkdata/tests/snowfakery/simple_snowfakery_2.load.yml +5 -0
- cumulusci/tasks/bulkdata/tests/snowfakery/simple_snowfakery_channels.load.yml +13 -0
- cumulusci/tasks/bulkdata/tests/snowfakery/simple_snowfakery_channels.recipe.yml +12 -0
- cumulusci/tasks/bulkdata/tests/snowfakery/simple_snowfakery_channels_2.load.yml +13 -0
- cumulusci/tasks/bulkdata/tests/snowfakery/unique_values.recipe.yml +4 -0
- cumulusci/tasks/bulkdata/tests/snowfakery/upsert.recipe.yml +23 -0
- cumulusci/tasks/bulkdata/tests/snowfakery/upsert_2.recipe.yml +29 -0
- cumulusci/tasks/bulkdata/tests/snowfakery/upsert_before.yml +10 -0
- cumulusci/tasks/bulkdata/tests/test_base_generate_data_tasks.py +61 -0
- cumulusci/tasks/bulkdata/tests/test_dates.py +99 -0
- cumulusci/tasks/bulkdata/tests/test_delete.py +404 -0
- cumulusci/tasks/bulkdata/tests/test_extract.py +1311 -0
- cumulusci/tasks/bulkdata/tests/test_factory_utils.py +55 -0
- cumulusci/tasks/bulkdata/tests/test_generate_and_load.py +252 -0
- cumulusci/tasks/bulkdata/tests/test_generate_from_snowfakery_task.py +343 -0
- cumulusci/tasks/bulkdata/tests/test_generatemapping.py +1039 -0
- cumulusci/tasks/bulkdata/tests/test_load.py +3175 -0
- cumulusci/tasks/bulkdata/tests/test_mapping_parser.py +1658 -0
- cumulusci/tasks/bulkdata/tests/test_query_db__joins_self_lookups.yml +12 -0
- cumulusci/tasks/bulkdata/tests/test_query_db_joins_lookups.yml +26 -0
- cumulusci/tasks/bulkdata/tests/test_query_db_joins_lookups_select.yml +48 -0
- cumulusci/tasks/bulkdata/tests/test_select.py +171 -0
- cumulusci/tasks/bulkdata/tests/test_select_utils.py +1057 -0
- cumulusci/tasks/bulkdata/tests/test_snowfakery.py +1153 -0
- cumulusci/tasks/bulkdata/tests/test_step.py +3957 -0
- cumulusci/tasks/bulkdata/tests/test_updates.py +513 -0
- cumulusci/tasks/bulkdata/tests/test_upsert.py +1015 -0
- cumulusci/tasks/bulkdata/tests/test_utils.py +158 -0
- cumulusci/tasks/bulkdata/tests/testdata.db +0 -0
- cumulusci/tasks/bulkdata/tests/update_describe.py +50 -0
- cumulusci/tasks/bulkdata/tests/update_person_accounts.yml +23 -0
- cumulusci/tasks/bulkdata/tests/utils.py +114 -0
- cumulusci/tasks/bulkdata/update_data.py +260 -0
- cumulusci/tasks/bulkdata/upsert_utils.py +130 -0
- cumulusci/tasks/bulkdata/utils.py +249 -0
- cumulusci/tasks/command.py +178 -0
- cumulusci/tasks/connectedapp.py +186 -0
- cumulusci/tasks/create_package_version.py +778 -0
- cumulusci/tasks/datadictionary.py +745 -0
- cumulusci/tasks/dx_convert_from.py +26 -0
- cumulusci/tasks/github/__init__.py +17 -0
- cumulusci/tasks/github/base.py +16 -0
- cumulusci/tasks/github/commit_status.py +13 -0
- cumulusci/tasks/github/merge.py +11 -0
- cumulusci/tasks/github/publish.py +11 -0
- cumulusci/tasks/github/pull_request.py +11 -0
- cumulusci/tasks/github/release.py +11 -0
- cumulusci/tasks/github/release_report.py +11 -0
- cumulusci/tasks/github/tag.py +11 -0
- cumulusci/tasks/github/tests/__init__.py +0 -0
- cumulusci/tasks/github/tests/test_util.py +202 -0
- cumulusci/tasks/github/tests/test_vcs_migration.py +44 -0
- cumulusci/tasks/github/tests/util_github_api.py +666 -0
- cumulusci/tasks/github/util.py +252 -0
- cumulusci/tasks/marketing_cloud/__init__.py +0 -0
- cumulusci/tasks/marketing_cloud/api.py +188 -0
- cumulusci/tasks/marketing_cloud/base.py +38 -0
- cumulusci/tasks/marketing_cloud/deploy.py +345 -0
- cumulusci/tasks/marketing_cloud/get_user_info.py +40 -0
- cumulusci/tasks/marketing_cloud/mc_constants.py +1 -0
- cumulusci/tasks/marketing_cloud/tests/__init__.py +0 -0
- cumulusci/tasks/marketing_cloud/tests/conftest.py +46 -0
- cumulusci/tasks/marketing_cloud/tests/expected-payload.json +110 -0
- cumulusci/tasks/marketing_cloud/tests/test_api.py +97 -0
- cumulusci/tasks/marketing_cloud/tests/test_api_soap_envelopes.py +145 -0
- cumulusci/tasks/marketing_cloud/tests/test_base.py +14 -0
- cumulusci/tasks/marketing_cloud/tests/test_deploy.py +400 -0
- cumulusci/tasks/marketing_cloud/tests/test_get_user_info.py +141 -0
- cumulusci/tasks/marketing_cloud/tests/validation-response.json +39 -0
- cumulusci/tasks/metadata/__init__.py +0 -0
- cumulusci/tasks/metadata/ee_src.py +94 -0
- cumulusci/tasks/metadata/managed_src.py +100 -0
- cumulusci/tasks/metadata/metadata_map.yml +868 -0
- cumulusci/tasks/metadata/modify.py +99 -0
- cumulusci/tasks/metadata/package.py +684 -0
- cumulusci/tasks/metadata/tests/__init__.py +0 -0
- cumulusci/tasks/metadata/tests/package_metadata/namespaced_report_folder/.hidden/.keep +0 -0
- cumulusci/tasks/metadata/tests/package_metadata/namespaced_report_folder/destructiveChanges.xml +9 -0
- cumulusci/tasks/metadata/tests/package_metadata/namespaced_report_folder/package.xml +9 -0
- cumulusci/tasks/metadata/tests/package_metadata/namespaced_report_folder/package_install_uninstall.xml +11 -0
- cumulusci/tasks/metadata/tests/package_metadata/namespaced_report_folder/reports/namespace__TestFolder/TestReport.report +3 -0
- cumulusci/tasks/metadata/tests/sample_package.xml +9 -0
- cumulusci/tasks/metadata/tests/test_ee_src.py +112 -0
- cumulusci/tasks/metadata/tests/test_managed_src.py +111 -0
- cumulusci/tasks/metadata/tests/test_modify.py +123 -0
- cumulusci/tasks/metadata/tests/test_package.py +476 -0
- cumulusci/tasks/metadata_etl/__init__.py +29 -0
- cumulusci/tasks/metadata_etl/base.py +436 -0
- cumulusci/tasks/metadata_etl/duplicate_rules.py +24 -0
- cumulusci/tasks/metadata_etl/field_sets.py +70 -0
- cumulusci/tasks/metadata_etl/help_text.py +92 -0
- cumulusci/tasks/metadata_etl/layouts.py +550 -0
- cumulusci/tasks/metadata_etl/objects.py +68 -0
- cumulusci/tasks/metadata_etl/permissions.py +167 -0
- cumulusci/tasks/metadata_etl/picklists.py +221 -0
- cumulusci/tasks/metadata_etl/remote_site_settings.py +99 -0
- cumulusci/tasks/metadata_etl/sharing.py +138 -0
- cumulusci/tasks/metadata_etl/tests/test_base.py +512 -0
- cumulusci/tasks/metadata_etl/tests/test_duplicate_rules.py +22 -0
- cumulusci/tasks/metadata_etl/tests/test_field_sets.py +156 -0
- cumulusci/tasks/metadata_etl/tests/test_help_text.py +387 -0
- cumulusci/tasks/metadata_etl/tests/test_ip_ranges.py +85 -0
- cumulusci/tasks/metadata_etl/tests/test_layouts.py +858 -0
- cumulusci/tasks/metadata_etl/tests/test_objects.py +236 -0
- cumulusci/tasks/metadata_etl/tests/test_permissions.py +223 -0
- cumulusci/tasks/metadata_etl/tests/test_picklists.py +547 -0
- cumulusci/tasks/metadata_etl/tests/test_remote_site_settings.py +46 -0
- cumulusci/tasks/metadata_etl/tests/test_sharing.py +333 -0
- cumulusci/tasks/metadata_etl/tests/test_value_sets.py +298 -0
- cumulusci/tasks/metadata_etl/value_sets.py +106 -0
- cumulusci/tasks/metadeploy.py +393 -0
- cumulusci/tasks/metaxml.py +88 -0
- cumulusci/tasks/preflight/__init__.py +0 -0
- cumulusci/tasks/preflight/dataset_load.py +49 -0
- cumulusci/tasks/preflight/licenses.py +86 -0
- cumulusci/tasks/preflight/packages.py +14 -0
- cumulusci/tasks/preflight/permsets.py +23 -0
- cumulusci/tasks/preflight/recordtypes.py +16 -0
- cumulusci/tasks/preflight/retrieve_tasks.py +30 -0
- cumulusci/tasks/preflight/settings.py +77 -0
- cumulusci/tasks/preflight/sobjects.py +202 -0
- cumulusci/tasks/preflight/tests/test_dataset_load.py +85 -0
- cumulusci/tasks/preflight/tests/test_licenses.py +174 -0
- cumulusci/tasks/preflight/tests/test_packages.py +14 -0
- cumulusci/tasks/preflight/tests/test_permset_preflights.py +51 -0
- cumulusci/tasks/preflight/tests/test_recordtypes.py +30 -0
- cumulusci/tasks/preflight/tests/test_retrieve_tasks.py +62 -0
- cumulusci/tasks/preflight/tests/test_settings.py +130 -0
- cumulusci/tasks/preflight/tests/test_sobjects.py +231 -0
- cumulusci/tasks/push/README.md +59 -0
- cumulusci/tasks/push/__init__.py +0 -0
- cumulusci/tasks/push/push_api.py +659 -0
- cumulusci/tasks/push/pushfails.py +136 -0
- cumulusci/tasks/push/tasks.py +476 -0
- cumulusci/tasks/push/tests/conftest.py +263 -0
- cumulusci/tasks/push/tests/test_push_api.py +951 -0
- cumulusci/tasks/push/tests/test_push_tasks.py +659 -0
- cumulusci/tasks/release_notes/README.md +63 -0
- cumulusci/tasks/release_notes/__init__.py +0 -0
- cumulusci/tasks/release_notes/exceptions.py +5 -0
- cumulusci/tasks/release_notes/generator.py +137 -0
- cumulusci/tasks/release_notes/parser.py +232 -0
- cumulusci/tasks/release_notes/provider.py +44 -0
- cumulusci/tasks/release_notes/task.py +300 -0
- cumulusci/tasks/release_notes/tests/__init__.py +0 -0
- cumulusci/tasks/release_notes/tests/change_notes/full/example1.md +17 -0
- cumulusci/tasks/release_notes/tests/change_notes/multi/1.txt +1 -0
- cumulusci/tasks/release_notes/tests/change_notes/multi/2.txt +1 -0
- cumulusci/tasks/release_notes/tests/change_notes/multi/3.txt +1 -0
- cumulusci/tasks/release_notes/tests/change_notes/single/1.txt +1 -0
- cumulusci/tasks/release_notes/tests/test_generator.py +582 -0
- cumulusci/tasks/release_notes/tests/test_parser.py +867 -0
- cumulusci/tasks/release_notes/tests/test_provider.py +512 -0
- cumulusci/tasks/release_notes/tests/test_task.py +461 -0
- cumulusci/tasks/release_notes/tests/utils.py +153 -0
- cumulusci/tasks/robotframework/__init__.py +3 -0
- cumulusci/tasks/robotframework/debugger/DebugListener.py +100 -0
- cumulusci/tasks/robotframework/debugger/__init__.py +10 -0
- cumulusci/tasks/robotframework/debugger/model.py +87 -0
- cumulusci/tasks/robotframework/debugger/ui.py +259 -0
- cumulusci/tasks/robotframework/libdoc.py +269 -0
- cumulusci/tasks/robotframework/robotframework.py +392 -0
- cumulusci/tasks/robotframework/stylesheet.css +130 -0
- cumulusci/tasks/robotframework/template.html +109 -0
- cumulusci/tasks/robotframework/tests/TestLibrary.py +18 -0
- cumulusci/tasks/robotframework/tests/TestPageObjects.py +31 -0
- cumulusci/tasks/robotframework/tests/TestResource.robot +8 -0
- cumulusci/tasks/robotframework/tests/failing_tests.robot +16 -0
- cumulusci/tasks/robotframework/tests/performance.robot +23 -0
- cumulusci/tasks/robotframework/tests/test_browser_proxies.py +137 -0
- cumulusci/tasks/robotframework/tests/test_debugger.py +360 -0
- cumulusci/tasks/robotframework/tests/test_robot_parallel.py +141 -0
- cumulusci/tasks/robotframework/tests/test_robotframework.py +860 -0
- cumulusci/tasks/salesforce/BaseRetrieveMetadata.py +58 -0
- cumulusci/tasks/salesforce/BaseSalesforceApiTask.py +45 -0
- cumulusci/tasks/salesforce/BaseSalesforceMetadataApiTask.py +18 -0
- cumulusci/tasks/salesforce/BaseSalesforceTask.py +4 -0
- cumulusci/tasks/salesforce/BaseUninstallMetadata.py +41 -0
- cumulusci/tasks/salesforce/CreateCommunity.py +124 -0
- cumulusci/tasks/salesforce/CreatePackage.py +29 -0
- cumulusci/tasks/salesforce/Deploy.py +240 -0
- cumulusci/tasks/salesforce/DeployBundles.py +88 -0
- cumulusci/tasks/salesforce/DescribeMetadataTypes.py +26 -0
- cumulusci/tasks/salesforce/EnsureRecordTypes.py +202 -0
- cumulusci/tasks/salesforce/GetInstalledPackages.py +8 -0
- cumulusci/tasks/salesforce/ListCommunities.py +40 -0
- cumulusci/tasks/salesforce/ListCommunityTemplates.py +19 -0
- cumulusci/tasks/salesforce/PublishCommunity.py +62 -0
- cumulusci/tasks/salesforce/RetrievePackaged.py +41 -0
- cumulusci/tasks/salesforce/RetrieveReportsAndDashboards.py +82 -0
- cumulusci/tasks/salesforce/RetrieveUnpackaged.py +36 -0
- cumulusci/tasks/salesforce/SOQLQuery.py +39 -0
- cumulusci/tasks/salesforce/UninstallLocal.py +15 -0
- cumulusci/tasks/salesforce/UninstallLocalBundles.py +28 -0
- cumulusci/tasks/salesforce/UninstallLocalNamespacedBundles.py +58 -0
- cumulusci/tasks/salesforce/UninstallPackage.py +32 -0
- cumulusci/tasks/salesforce/UninstallPackaged.py +56 -0
- cumulusci/tasks/salesforce/UpdateAdminProfile.py +8 -0
- cumulusci/tasks/salesforce/__init__.py +79 -0
- cumulusci/tasks/salesforce/activate_flow.py +74 -0
- cumulusci/tasks/salesforce/check_components.py +324 -0
- cumulusci/tasks/salesforce/composite.py +142 -0
- cumulusci/tasks/salesforce/create_permission_sets.py +35 -0
- cumulusci/tasks/salesforce/custom_settings.py +134 -0
- cumulusci/tasks/salesforce/custom_settings_wait.py +132 -0
- cumulusci/tasks/salesforce/enable_prediction.py +107 -0
- cumulusci/tasks/salesforce/insert_record.py +40 -0
- cumulusci/tasks/salesforce/install_package_version.py +242 -0
- cumulusci/tasks/salesforce/license_preflights.py +8 -0
- cumulusci/tasks/salesforce/network_member_group.py +178 -0
- cumulusci/tasks/salesforce/nonsourcetracking.py +228 -0
- cumulusci/tasks/salesforce/org_settings.py +193 -0
- cumulusci/tasks/salesforce/package_upload.py +328 -0
- cumulusci/tasks/salesforce/profiles.py +74 -0
- cumulusci/tasks/salesforce/promote_package_version.py +376 -0
- cumulusci/tasks/salesforce/retrieve_profile.py +195 -0
- cumulusci/tasks/salesforce/salesforce_files.py +244 -0
- cumulusci/tasks/salesforce/sourcetracking.py +507 -0
- cumulusci/tasks/salesforce/tests/__init__.py +3 -0
- cumulusci/tasks/salesforce/tests/test_CreateCommunity.py +278 -0
- cumulusci/tasks/salesforce/tests/test_CreatePackage.py +22 -0
- cumulusci/tasks/salesforce/tests/test_Deploy.py +470 -0
- cumulusci/tasks/salesforce/tests/test_DeployBundles.py +76 -0
- cumulusci/tasks/salesforce/tests/test_EnsureRecordTypes.py +345 -0
- cumulusci/tasks/salesforce/tests/test_ListCommunities.py +84 -0
- cumulusci/tasks/salesforce/tests/test_ListCommunityTemplates.py +49 -0
- cumulusci/tasks/salesforce/tests/test_PackageUpload.py +547 -0
- cumulusci/tasks/salesforce/tests/test_ProfileGrantAllAccess.py +699 -0
- cumulusci/tasks/salesforce/tests/test_PublishCommunity.py +181 -0
- cumulusci/tasks/salesforce/tests/test_RetrievePackaged.py +24 -0
- cumulusci/tasks/salesforce/tests/test_RetrieveReportsAndDashboards.py +56 -0
- cumulusci/tasks/salesforce/tests/test_RetrieveUnpackaged.py +21 -0
- cumulusci/tasks/salesforce/tests/test_SOQLQuery.py +30 -0
- cumulusci/tasks/salesforce/tests/test_UninstallLocal.py +15 -0
- cumulusci/tasks/salesforce/tests/test_UninstallLocalBundles.py +19 -0
- cumulusci/tasks/salesforce/tests/test_UninstallLocalNamespacedBundles.py +22 -0
- cumulusci/tasks/salesforce/tests/test_UninstallPackage.py +19 -0
- cumulusci/tasks/salesforce/tests/test_UninstallPackaged.py +66 -0
- cumulusci/tasks/salesforce/tests/test_UninstallPackagedIncremental.py +127 -0
- cumulusci/tasks/salesforce/tests/test_activate_flow.py +132 -0
- cumulusci/tasks/salesforce/tests/test_base_tasks.py +110 -0
- cumulusci/tasks/salesforce/tests/test_check_components.py +445 -0
- cumulusci/tasks/salesforce/tests/test_composite.py +250 -0
- cumulusci/tasks/salesforce/tests/test_create_permission_sets.py +41 -0
- cumulusci/tasks/salesforce/tests/test_custom_settings.py +227 -0
- cumulusci/tasks/salesforce/tests/test_custom_settings_wait.py +174 -0
- cumulusci/tasks/salesforce/tests/test_describemetadatatypes.py +18 -0
- cumulusci/tasks/salesforce/tests/test_enable_prediction.py +240 -0
- cumulusci/tasks/salesforce/tests/test_insert_record.py +110 -0
- cumulusci/tasks/salesforce/tests/test_install_package_version.py +464 -0
- cumulusci/tasks/salesforce/tests/test_network_member_group.py +444 -0
- cumulusci/tasks/salesforce/tests/test_nonsourcetracking.py +235 -0
- cumulusci/tasks/salesforce/tests/test_org_settings.py +407 -0
- cumulusci/tasks/salesforce/tests/test_profiles.py +202 -0
- cumulusci/tasks/salesforce/tests/test_retrieve_profile.py +287 -0
- cumulusci/tasks/salesforce/tests/test_salesforce_files.py +228 -0
- cumulusci/tasks/salesforce/tests/test_sourcetracking.py +350 -0
- cumulusci/tasks/salesforce/tests/test_trigger_handlers.py +300 -0
- cumulusci/tasks/salesforce/tests/test_update_dependencies.py +509 -0
- cumulusci/tasks/salesforce/tests/util.py +79 -0
- cumulusci/tasks/salesforce/trigger_handlers.py +119 -0
- cumulusci/tasks/salesforce/uninstall_packaged_incremental.py +136 -0
- cumulusci/tasks/salesforce/update_dependencies.py +290 -0
- cumulusci/tasks/salesforce/update_profile.py +339 -0
- cumulusci/tasks/salesforce/users/permsets.py +227 -0
- cumulusci/tasks/salesforce/users/photos.py +162 -0
- cumulusci/tasks/salesforce/users/tests/photo.mock.txt +1 -0
- cumulusci/tasks/salesforce/users/tests/test_permsets.py +950 -0
- cumulusci/tasks/salesforce/users/tests/test_photos.py +373 -0
- cumulusci/tasks/sample_data/capture_sample_data.py +77 -0
- cumulusci/tasks/sample_data/load_sample_data.py +85 -0
- cumulusci/tasks/sample_data/test_capture_sample_data.py +117 -0
- cumulusci/tasks/sample_data/test_load_sample_data.py +121 -0
- cumulusci/tasks/sfdx.py +83 -0
- cumulusci/tasks/tests/__init__.py +1 -0
- cumulusci/tasks/tests/conftest.py +30 -0
- cumulusci/tasks/tests/test_command.py +129 -0
- cumulusci/tasks/tests/test_connectedapp.py +236 -0
- cumulusci/tasks/tests/test_create_package_version.py +847 -0
- cumulusci/tasks/tests/test_datadictionary.py +1575 -0
- cumulusci/tasks/tests/test_dx_convert_from.py +60 -0
- cumulusci/tasks/tests/test_metadeploy.py +624 -0
- cumulusci/tasks/tests/test_metaxml.py +99 -0
- cumulusci/tasks/tests/test_promote_package_version.py +488 -0
- cumulusci/tasks/tests/test_pushfails.py +96 -0
- cumulusci/tasks/tests/test_salesforce.py +72 -0
- cumulusci/tasks/tests/test_sfdx.py +105 -0
- cumulusci/tasks/tests/test_util.py +207 -0
- cumulusci/tasks/util.py +261 -0
- cumulusci/tasks/vcs/__init__.py +19 -0
- cumulusci/tasks/vcs/commit_status.py +58 -0
- cumulusci/tasks/vcs/create_commit_status.py +37 -0
- cumulusci/tasks/vcs/download_extract.py +199 -0
- cumulusci/tasks/vcs/merge.py +298 -0
- cumulusci/tasks/vcs/publish.py +207 -0
- cumulusci/tasks/vcs/pull_request.py +9 -0
- cumulusci/tasks/vcs/release.py +134 -0
- cumulusci/tasks/vcs/release_report.py +105 -0
- cumulusci/tasks/vcs/tag.py +31 -0
- cumulusci/tasks/vcs/tests/github/test_commit_status.py +196 -0
- cumulusci/tasks/vcs/tests/github/test_download_extract.py +896 -0
- cumulusci/tasks/vcs/tests/github/test_merge.py +1118 -0
- cumulusci/tasks/vcs/tests/github/test_publish.py +823 -0
- cumulusci/tasks/vcs/tests/github/test_pull_request.py +29 -0
- cumulusci/tasks/vcs/tests/github/test_release.py +390 -0
- cumulusci/tasks/vcs/tests/github/test_release_report.py +109 -0
- cumulusci/tasks/vcs/tests/github/test_tag.py +90 -0
- cumulusci/tasks/vlocity/exceptions.py +2 -0
- cumulusci/tasks/vlocity/tests/test_vlocity.py +283 -0
- cumulusci/tasks/vlocity/vlocity.py +342 -0
- cumulusci/tests/__init__.py +1 -0
- cumulusci/tests/cassettes/GET_sobjects_Account_PersonAccount_describe.yaml +18 -0
- cumulusci/tests/cassettes/TestIntegrationInfrastructure.test_integration_tests.yaml +19 -0
- cumulusci/tests/pytest_plugins/pytest_sf_orgconnect.py +307 -0
- cumulusci/tests/pytest_plugins/pytest_sf_vcr.py +275 -0
- cumulusci/tests/pytest_plugins/pytest_sf_vcr_serializer.py +160 -0
- cumulusci/tests/pytest_plugins/pytest_typeguard.py +5 -0
- cumulusci/tests/pytest_plugins/test_vcr_string_compressor.py +49 -0
- cumulusci/tests/pytest_plugins/vcr_string_compressor.py +97 -0
- cumulusci/tests/shared_cassettes/GET_sobjects_Account_describe.yaml +18 -0
- cumulusci/tests/shared_cassettes/GET_sobjects_Case_describe.yaml +18 -0
- cumulusci/tests/shared_cassettes/GET_sobjects_Contact_describe.yaml +4838 -0
- cumulusci/tests/shared_cassettes/GET_sobjects_Custom__c_describe.yaml +242 -0
- cumulusci/tests/shared_cassettes/GET_sobjects_Event_describe.yaml +19 -0
- cumulusci/tests/shared_cassettes/GET_sobjects_Global_describe.yaml +1338 -0
- cumulusci/tests/shared_cassettes/GET_sobjects_Lead_describe.yaml +18 -0
- cumulusci/tests/shared_cassettes/GET_sobjects_OpportunityContactRole_describe.yaml +34 -0
- cumulusci/tests/shared_cassettes/GET_sobjects_Opportunity_describe.yaml +1261 -0
- cumulusci/tests/shared_cassettes/GET_sobjects_Organization.yaml +49 -0
- cumulusci/tests/shared_cassettes/vcr_string_templates/batchInfoList_xml.tpl +15 -0
- cumulusci/tests/shared_cassettes/vcr_string_templates/batchInfo_xml.tpl +13 -0
- cumulusci/tests/shared_cassettes/vcr_string_templates/jobInfo_insert_xml.tpl +24 -0
- cumulusci/tests/shared_cassettes/vcr_string_templates/jobInfo_upsert_xml.tpl +25 -0
- cumulusci/tests/test_entry_points.py +20 -0
- cumulusci/tests/test_integration_infrastructure.py +131 -0
- cumulusci/tests/test_main.py +9 -0
- cumulusci/tests/test_schema.py +32 -0
- cumulusci/tests/test_utils.py +657 -0
- cumulusci/tests/test_vcr_serializer.py +134 -0
- cumulusci/tests/uncompressed_cassette.yaml +83 -0
- cumulusci/tests/util.py +344 -0
- cumulusci/utils/__init__.py +731 -0
- cumulusci/utils/classutils.py +9 -0
- cumulusci/utils/collections.py +32 -0
- cumulusci/utils/deprecation.py +11 -0
- cumulusci/utils/encryption.py +31 -0
- cumulusci/utils/fileutils.py +295 -0
- cumulusci/utils/git.py +142 -0
- cumulusci/utils/http/multi_request.py +214 -0
- cumulusci/utils/http/requests_utils.py +103 -0
- cumulusci/utils/http/tests/cassettes/ManualEditTestCompositeParallelSalesforce.test_http_headers.yaml +32 -0
- cumulusci/utils/http/tests/cassettes/TestCompositeParallelSalesforce.test_composite_parallel_salesforce.yaml +65 -0
- cumulusci/utils/http/tests/cassettes/TestCompositeParallelSalesforce.test_errors.yaml +24 -0
- cumulusci/utils/http/tests/cassettes/TestCompositeParallelSalesforce.test_reference_ids.yaml +49 -0
- cumulusci/utils/http/tests/test_multi_request.py +255 -0
- cumulusci/utils/iterators.py +21 -0
- cumulusci/utils/logging.py +128 -0
- cumulusci/utils/metaprogramming.py +10 -0
- cumulusci/utils/options.py +138 -0
- cumulusci/utils/parallel/queries_in_parallel/run_queries_in_parallel.py +29 -0
- cumulusci/utils/parallel/queries_in_parallel/tests/test_run_queries_in_parallel.py +50 -0
- cumulusci/utils/parallel/task_worker_queues/parallel_worker.py +238 -0
- cumulusci/utils/parallel/task_worker_queues/parallel_worker_queue.py +243 -0
- cumulusci/utils/parallel/task_worker_queues/tests/test_parallel_worker.py +353 -0
- cumulusci/utils/salesforce/count_sobjects.py +46 -0
- cumulusci/utils/salesforce/soql.py +17 -0
- cumulusci/utils/salesforce/tests/cassettes/ManualEdit_TestCountSObjects.test_count_sobjects__network_errors.yaml +23 -0
- cumulusci/utils/salesforce/tests/cassettes/TestCountSObjects.test_count_sobjects__errors.yaml +33 -0
- cumulusci/utils/salesforce/tests/cassettes/TestCountSObjects.test_count_sobjects_simple.yaml +29 -0
- cumulusci/utils/salesforce/tests/test_count_sobjects.py +29 -0
- cumulusci/utils/salesforce/tests/test_soql.py +30 -0
- cumulusci/utils/tests/cassettes/ManualEditTestDescribeOrg.test_minimal_schema.yaml +36 -0
- cumulusci/utils/tests/cassettes/ManualEdit_test_describe_to_sql.yaml +191 -0
- cumulusci/utils/tests/test_fileutils.py +284 -0
- cumulusci/utils/tests/test_git.py +85 -0
- cumulusci/utils/tests/test_logging.py +70 -0
- cumulusci/utils/tests/test_option_parsing.py +188 -0
- cumulusci/utils/tests/test_org_schema.py +691 -0
- cumulusci/utils/tests/test_org_schema_models.py +79 -0
- cumulusci/utils/tests/test_waiting.py +25 -0
- cumulusci/utils/version_strings.py +391 -0
- cumulusci/utils/waiting.py +42 -0
- cumulusci/utils/xml/__init__.py +91 -0
- cumulusci/utils/xml/metadata_tree.py +299 -0
- cumulusci/utils/xml/robot_xml.py +114 -0
- cumulusci/utils/xml/salesforce_encoding.py +100 -0
- cumulusci/utils/xml/test/test_metadata_tree.py +251 -0
- cumulusci/utils/xml/test/test_salesforce_encoding.py +173 -0
- cumulusci/utils/yaml/cumulusci_yml.py +401 -0
- cumulusci/utils/yaml/model_parser.py +156 -0
- cumulusci/utils/yaml/safer_loader.py +74 -0
- cumulusci/utils/yaml/tests/bad_cci.yml +5 -0
- cumulusci/utils/yaml/tests/cassettes/TestCumulusciYml.test_validate_url__with_errors.yaml +20 -0
- cumulusci/utils/yaml/tests/test_cumulusci_yml.py +286 -0
- cumulusci/utils/yaml/tests/test_model_parser.py +175 -0
- cumulusci/utils/yaml/tests/test_safer_loader.py +88 -0
- cumulusci/utils/ziputils.py +61 -0
- cumulusci/vcs/base.py +143 -0
- cumulusci/vcs/bootstrap.py +272 -0
- cumulusci/vcs/github/__init__.py +24 -0
- cumulusci/vcs/github/adapter.py +689 -0
- cumulusci/vcs/github/release_notes/generator.py +219 -0
- cumulusci/vcs/github/release_notes/parser.py +151 -0
- cumulusci/vcs/github/release_notes/provider.py +143 -0
- cumulusci/vcs/github/service.py +569 -0
- cumulusci/vcs/github/tests/test_adapter.py +138 -0
- cumulusci/vcs/github/tests/test_service.py +408 -0
- cumulusci/vcs/models.py +586 -0
- cumulusci/vcs/tests/conftest.py +41 -0
- cumulusci/vcs/tests/dummy_service.py +241 -0
- cumulusci/vcs/tests/test_vcs_base.py +687 -0
- cumulusci/vcs/tests/test_vcs_bootstrap.py +727 -0
- cumulusci/vcs/utils/__init__.py +31 -0
- cumulusci/vcs/vcs_source.py +287 -0
- cumulusci_plus-5.0.0.dist-info/METADATA +145 -0
- cumulusci_plus-5.0.0.dist-info/RECORD +744 -0
- cumulusci_plus-5.0.0.dist-info/WHEEL +4 -0
- cumulusci_plus-5.0.0.dist-info/entry_points.txt +3 -0
- cumulusci_plus-5.0.0.dist-info/licenses/AUTHORS.rst +41 -0
- cumulusci_plus-5.0.0.dist-info/licenses/LICENSE +30 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
from cumulusci.tasks.salesforce import BaseSalesforceApiTask
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class BaseUserLicenseAwareTask(BaseSalesforceApiTask):
|
|
5
|
+
def get_available_user_licenses(self, is_assignable=False):
|
|
6
|
+
"""Fetch active user licenses with availability."""
|
|
7
|
+
query = "SELECT Id, LicenseDefinitionKey, TotalLicenses, UsedLicenses FROM UserLicense WHERE Status = 'Active'"
|
|
8
|
+
return {
|
|
9
|
+
lic["Id"]: lic
|
|
10
|
+
for lic in self.sf.query(query)["records"]
|
|
11
|
+
if not is_assignable or (lic["TotalLicenses"] > lic["UsedLicenses"])
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
def _log_list(self, title, items):
|
|
15
|
+
self.logger.info(
|
|
16
|
+
f"{title} ({len(items)}):\n" + "\n".join(f"- {item}" for item in items)
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class GetAvailableLicenses(BaseUserLicenseAwareTask):
|
|
21
|
+
def _run_task(self):
|
|
22
|
+
self.return_values = [
|
|
23
|
+
result["LicenseDefinitionKey"]
|
|
24
|
+
for result in self.get_available_user_licenses().values()
|
|
25
|
+
]
|
|
26
|
+
licenses = "\n".join(self.return_values)
|
|
27
|
+
self.logger.info(f"Found licenses:\n{licenses}")
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class GetAssignableLicenses(BaseUserLicenseAwareTask):
|
|
31
|
+
def _run_task(self):
|
|
32
|
+
self.return_values = [
|
|
33
|
+
result["LicenseDefinitionKey"]
|
|
34
|
+
for result in self.get_available_user_licenses(is_assignable=True).values()
|
|
35
|
+
]
|
|
36
|
+
licenses = "\n".join(self.return_values)
|
|
37
|
+
self.logger.info(f"Found assignable licenses:\n{licenses}")
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class GetAvailablePermissionSetLicenses(BaseSalesforceApiTask):
|
|
41
|
+
def _run_task(self):
|
|
42
|
+
query = "SELECT PermissionSetLicenseKey FROM PermissionSetLicense WHERE Status = 'Active'"
|
|
43
|
+
self.return_values = [
|
|
44
|
+
result["PermissionSetLicenseKey"]
|
|
45
|
+
for result in self.sf.query(query)["records"]
|
|
46
|
+
]
|
|
47
|
+
licenses = "\n".join(self.return_values)
|
|
48
|
+
self.logger.info(f"Found permission set licenses:\n{licenses}")
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class GetPermissionLicenseSetAssignments(BaseSalesforceApiTask):
|
|
52
|
+
def _run_task(self):
|
|
53
|
+
query = f"SELECT PermissionSetLicense.DeveloperName FROM PermissionSetLicenseAssign WHERE AssigneeId = '{self.org_config.user_id}'"
|
|
54
|
+
self.return_values = [
|
|
55
|
+
result["PermissionSetLicense"]["DeveloperName"]
|
|
56
|
+
for result in self.sf.query_all(query)["records"]
|
|
57
|
+
]
|
|
58
|
+
permsets = "\n".join(self.return_values)
|
|
59
|
+
self.logger.info(f"Found permission licenses sets assigned:\n{permsets}")
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class GetAvailablePermissionSets(BaseSalesforceApiTask):
|
|
63
|
+
def _run_task(self):
|
|
64
|
+
self.return_values = [
|
|
65
|
+
result["Name"]
|
|
66
|
+
for result in self.sf.query_all("SELECT Name FROM PermissionSet")["records"]
|
|
67
|
+
]
|
|
68
|
+
permsets = "\n".join(self.return_values)
|
|
69
|
+
self.logger.info(f"Found Permission Sets:\n{permsets}")
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
class GetAssignablePermissionSets(BaseUserLicenseAwareTask):
|
|
73
|
+
def _run_task(self):
|
|
74
|
+
license_data = self.get_available_user_licenses(is_assignable=True)
|
|
75
|
+
permsets = self.sf.query_all("SELECT LicenseId, Name FROM PermissionSet")[
|
|
76
|
+
"records"
|
|
77
|
+
]
|
|
78
|
+
available_permsets = [
|
|
79
|
+
ps["Name"]
|
|
80
|
+
for ps in permsets
|
|
81
|
+
if not ps["LicenseId"] or ps["LicenseId"] in license_data
|
|
82
|
+
]
|
|
83
|
+
|
|
84
|
+
self.return_values = available_permsets
|
|
85
|
+
permsets = "\n".join(self.return_values)
|
|
86
|
+
self.logger.info(f"Found assignable permission sets:\n{permsets}")
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
from pprint import pformat
|
|
2
|
+
|
|
3
|
+
from cumulusci.salesforce_api.metadata import ApiRetrieveInstalledPackages
|
|
4
|
+
from cumulusci.tasks.salesforce import BaseSalesforceMetadataApiTask
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class GetInstalledPackages(BaseSalesforceMetadataApiTask):
|
|
8
|
+
api_class = ApiRetrieveInstalledPackages
|
|
9
|
+
name = "GetInstalledPackages"
|
|
10
|
+
|
|
11
|
+
def _run_task(self):
|
|
12
|
+
result = super()._run_task()
|
|
13
|
+
|
|
14
|
+
self.logger.info(f"{self.__class__.name} returned\n {pformat(result)}")
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
from cumulusci.tasks.salesforce import BaseSalesforceApiTask
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class GetPermissionSetAssignments(BaseSalesforceApiTask):
|
|
5
|
+
def _run_task(self):
|
|
6
|
+
query = f"SELECT PermissionSet.Name,PermissionSetGroupId FROM PermissionSetAssignment WHERE AssigneeId = '{self.org_config.user_id}'"
|
|
7
|
+
|
|
8
|
+
self.return_values = []
|
|
9
|
+
for result in self.sf.query_all(query)["records"]:
|
|
10
|
+
if result["PermissionSet"]["Name"] not in self.return_values:
|
|
11
|
+
self.return_values.append(result["PermissionSet"]["Name"])
|
|
12
|
+
if result["PermissionSetGroupId"] is not None:
|
|
13
|
+
psg_query = f"SELECT PermissionSet.Name from PermissionSetGroupComponent where PermissionSetGroupId = '{result['PermissionSetGroupId']}'"
|
|
14
|
+
for psg_result in self.sf.query_all(psg_query)["records"]:
|
|
15
|
+
if (
|
|
16
|
+
psg_result["PermissionSet"]
|
|
17
|
+
and psg_result["PermissionSet"]["Name"]
|
|
18
|
+
not in self.return_values
|
|
19
|
+
):
|
|
20
|
+
self.return_values.append(psg_result["PermissionSet"]["Name"])
|
|
21
|
+
|
|
22
|
+
permsets_str = "\n".join(self.return_values)
|
|
23
|
+
self.logger.info(f"Found permission sets assigned:\n{permsets_str}")
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
from collections import defaultdict
|
|
2
|
+
|
|
3
|
+
from cumulusci.tasks.salesforce import BaseSalesforceApiTask
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class CheckSObjectRecordTypes(BaseSalesforceApiTask):
|
|
7
|
+
def _run_task(self):
|
|
8
|
+
rts = defaultdict(list)
|
|
9
|
+
records = self.tooling.query_all(
|
|
10
|
+
"Select SobjectType, FullName FROM RecordType"
|
|
11
|
+
)["records"]
|
|
12
|
+
for r in records:
|
|
13
|
+
rts[r["SobjectType"]].append(r["FullName"].split(".")[1])
|
|
14
|
+
|
|
15
|
+
self.return_values = rts
|
|
16
|
+
self.logger.info(f"Found existing Record Types: {self.return_values}")
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
from typing import List
|
|
2
|
+
|
|
3
|
+
from cumulusci.cli.runtime import CliRuntime
|
|
4
|
+
from cumulusci.cli.utils import group_items
|
|
5
|
+
from cumulusci.core.exceptions import CumulusCIException
|
|
6
|
+
from cumulusci.core.tasks import BaseTask
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class RetrieveTasks(BaseTask):
|
|
10
|
+
task_options = {
|
|
11
|
+
"group_name": {
|
|
12
|
+
"description": "Name of the category or Group",
|
|
13
|
+
"required": True,
|
|
14
|
+
},
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
def _run_task(self):
|
|
18
|
+
runtime = CliRuntime(load_keychain=True)
|
|
19
|
+
tasks = runtime.get_available_tasks()
|
|
20
|
+
task_groups = group_items(tasks)
|
|
21
|
+
task_groups = task_groups[self.options["group_name"]]
|
|
22
|
+
self.return_values: List[str] = []
|
|
23
|
+
for task_name, description in task_groups:
|
|
24
|
+
self.return_values.append(task_name)
|
|
25
|
+
if self.return_values:
|
|
26
|
+
self.return_values.sort()
|
|
27
|
+
else:
|
|
28
|
+
raise CumulusCIException("No tasks in the specified group")
|
|
29
|
+
|
|
30
|
+
self.logger.info(self.return_values)
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
from simple_salesforce.exceptions import SalesforceMalformedRequest
|
|
2
|
+
|
|
3
|
+
from cumulusci.core.tasks import BaseSalesforceTask
|
|
4
|
+
from cumulusci.core.utils import process_bool_arg
|
|
5
|
+
from cumulusci.tasks.salesforce.BaseSalesforceApiTask import BaseSalesforceApiTask
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class CheckMyDomainActive(BaseSalesforceTask):
|
|
9
|
+
def _run_task(self):
|
|
10
|
+
self.return_values = (
|
|
11
|
+
".my." in self.org_config.instance_url
|
|
12
|
+
or ".cloudforce.com" in self.org_config.instance_url
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
self.logger.info(
|
|
16
|
+
f"Completed My Domain preflight check with result {self.return_values}"
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class CheckSettingsValue(BaseSalesforceApiTask):
|
|
21
|
+
task_options = {
|
|
22
|
+
"settings_type": {
|
|
23
|
+
"description": "The API name of the Settings entity to be checked, such as ChatterSettings.",
|
|
24
|
+
"required": True,
|
|
25
|
+
},
|
|
26
|
+
"settings_field": {
|
|
27
|
+
"description": "The API name of the field on the Settings entity to check.",
|
|
28
|
+
"required": True,
|
|
29
|
+
},
|
|
30
|
+
"value": {"description": "The value to check for", "required": True},
|
|
31
|
+
"treat_missing_as_failure": {
|
|
32
|
+
"description": "If True, treat a missing Settings entity as a preflight failure, instead of raising an exception. Defaults to False.",
|
|
33
|
+
"required": False,
|
|
34
|
+
},
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
def _run_task(self):
|
|
38
|
+
field = self.options["settings_field"]
|
|
39
|
+
entity = self.options["settings_type"]
|
|
40
|
+
try:
|
|
41
|
+
results = self.tooling.query(f"SELECT {field} FROM {entity}")["records"]
|
|
42
|
+
except SalesforceMalformedRequest as e:
|
|
43
|
+
self.logger.error(
|
|
44
|
+
f"The settings value {entity}.{field} could not be queried: {e}"
|
|
45
|
+
)
|
|
46
|
+
self.return_values = False
|
|
47
|
+
|
|
48
|
+
if not process_bool_arg(
|
|
49
|
+
self.options.get("treat_missing_as_failure", False)
|
|
50
|
+
):
|
|
51
|
+
raise e
|
|
52
|
+
|
|
53
|
+
return
|
|
54
|
+
|
|
55
|
+
if not results:
|
|
56
|
+
self.logger.info(
|
|
57
|
+
"Located no Settings records. Returning negative preflight result."
|
|
58
|
+
)
|
|
59
|
+
self.return_values = False
|
|
60
|
+
return
|
|
61
|
+
|
|
62
|
+
value = results[0].get(self.options["settings_field"])
|
|
63
|
+
# Type-sensitive compare.
|
|
64
|
+
if type(value) is bool:
|
|
65
|
+
comparand = process_bool_arg(self.options["value"])
|
|
66
|
+
elif type(value) is float:
|
|
67
|
+
comparand = float(self.options["value"])
|
|
68
|
+
elif type(value) is int:
|
|
69
|
+
comparand = int(self.options["value"])
|
|
70
|
+
else:
|
|
71
|
+
comparand = self.options["value"]
|
|
72
|
+
|
|
73
|
+
self.return_values = value == comparand
|
|
74
|
+
|
|
75
|
+
self.logger.info(
|
|
76
|
+
f"Completed Settings preflight check with result {self.return_values}"
|
|
77
|
+
)
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
from simple_salesforce.exceptions import SalesforceMalformedRequest
|
|
2
|
+
|
|
3
|
+
from cumulusci.core.exceptions import TaskOptionsError
|
|
4
|
+
from cumulusci.core.utils import process_bool_arg
|
|
5
|
+
from cumulusci.tasks.salesforce import BaseSalesforceApiTask
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class CheckSObjectsAvailable(BaseSalesforceApiTask):
|
|
9
|
+
task_docs = """As a MetaDeploy preflight check, validates that an sObject is present in the schema.
|
|
10
|
+
|
|
11
|
+
The task can be used as a preflight check thus::
|
|
12
|
+
|
|
13
|
+
3:
|
|
14
|
+
task: insert_sobject_records
|
|
15
|
+
checks:
|
|
16
|
+
- when: "'ContentNote' not in tasks.check_sobjects_available()"
|
|
17
|
+
action: error
|
|
18
|
+
message: "Enhanced Notes are not turned on."
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
def _run_task(self):
|
|
22
|
+
|
|
23
|
+
self.return_values = {entry["name"] for entry in self.sf.describe()["sobjects"]}
|
|
24
|
+
|
|
25
|
+
self.logger.info(
|
|
26
|
+
"Completed sObjects preflight check with result {}".format(
|
|
27
|
+
self.return_values
|
|
28
|
+
)
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class CheckSObjectPerms(BaseSalesforceApiTask):
|
|
33
|
+
task_docs = """As a MetaDeploy preflight check, validates that an sObject's permissions are in the expected state.
|
|
34
|
+
|
|
35
|
+
For example, specify::
|
|
36
|
+
|
|
37
|
+
check_sobject_permissions:
|
|
38
|
+
options:
|
|
39
|
+
Account:
|
|
40
|
+
createable: True
|
|
41
|
+
updateable: False
|
|
42
|
+
Contact:
|
|
43
|
+
createable: False
|
|
44
|
+
|
|
45
|
+
to validate that the Account object is createable but not updateable, and the Contact object is not createable.
|
|
46
|
+
The output is True if all sObjects and permissions are present and matching the specification.
|
|
47
|
+
|
|
48
|
+
Given the above configuration, the task can be used as a preflight check in a MetaDeploy plan::
|
|
49
|
+
|
|
50
|
+
3:
|
|
51
|
+
task: insert_sobject_records
|
|
52
|
+
checks:
|
|
53
|
+
- when: "not tasks.check_sobject_permissions()"
|
|
54
|
+
action: error
|
|
55
|
+
message: "sObject permissions are not configured correctly."
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
task_options = {
|
|
59
|
+
"permissions": {
|
|
60
|
+
"description": "The object permissions to check. Each key should be an sObject API name, whose value is a map of describe keys, "
|
|
61
|
+
"such as `queryable` and `createable`, to their desired values (True or False). The output is True if all sObjects and permissions "
|
|
62
|
+
"are present and matching the specification. See the task documentation for examples.",
|
|
63
|
+
"required": True,
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
def _init_options(self, kwargs):
|
|
68
|
+
super()._init_options(kwargs)
|
|
69
|
+
|
|
70
|
+
if type(self.options.get("permissions")) is not dict:
|
|
71
|
+
raise TaskOptionsError(
|
|
72
|
+
"Each sObject should contain a map of permissions to desired values"
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
self.permissions = {}
|
|
76
|
+
for sobject, perms in self.options["permissions"].items():
|
|
77
|
+
self.permissions[sobject] = {
|
|
78
|
+
perm: process_bool_arg(value) for perm, value in perms.items()
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
def _run_task(self):
|
|
82
|
+
describe = {s["name"]: s for s in self.sf.describe()["sobjects"]}
|
|
83
|
+
|
|
84
|
+
success = True
|
|
85
|
+
|
|
86
|
+
for sobject, perms in self.permissions.items():
|
|
87
|
+
if sobject not in describe:
|
|
88
|
+
success = False
|
|
89
|
+
self.logger.info(f"sObject {sobject} is not present in the describe.")
|
|
90
|
+
else:
|
|
91
|
+
for perm in perms:
|
|
92
|
+
if perm not in describe[sobject]:
|
|
93
|
+
success = False
|
|
94
|
+
self.logger.info(
|
|
95
|
+
f"Permission {perm} is not present for sObject {sobject}."
|
|
96
|
+
)
|
|
97
|
+
else:
|
|
98
|
+
if describe[sobject][perm] is not perms[perm]:
|
|
99
|
+
success = False
|
|
100
|
+
self.logger.info(
|
|
101
|
+
f"Permission {perm} for sObject {sobject} is {describe[sobject][perm]}, not {perms[perm]}."
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
self.return_values = success
|
|
105
|
+
self.logger.info(f"Completing preflight check with result {self.return_values}")
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
class CheckSObjectOWDs(BaseSalesforceApiTask):
|
|
109
|
+
task_docs = """As a MetaDeploy preflight check, validates that an sObject's Org-Wide Defaults are in the expected state.
|
|
110
|
+
|
|
111
|
+
For example, specify::
|
|
112
|
+
|
|
113
|
+
check_org_wide_defaults:
|
|
114
|
+
options:
|
|
115
|
+
org_wide_defaults:
|
|
116
|
+
- api_name: Account
|
|
117
|
+
internal_sharing_model: Private
|
|
118
|
+
external_sharing_model: Private
|
|
119
|
+
- api_name: Contact
|
|
120
|
+
internal_sharing_model: Private
|
|
121
|
+
|
|
122
|
+
to validate that the Account object has Private internal and external OWDs, and Contact a Private internal model.
|
|
123
|
+
The output is True if all sObjects and permissions are present and matching the specification.
|
|
124
|
+
|
|
125
|
+
Given the above configuration, the task can be used as a preflight check in a MetaDeploy plan::
|
|
126
|
+
|
|
127
|
+
3:
|
|
128
|
+
task: insert_sobject_records
|
|
129
|
+
checks:
|
|
130
|
+
- when: "not tasks.check_org_wide_defaults()"
|
|
131
|
+
action: error
|
|
132
|
+
message: "Org-Wide Defaults are not configured correctly."
|
|
133
|
+
"""
|
|
134
|
+
task_options = {
|
|
135
|
+
"org_wide_defaults": {
|
|
136
|
+
"description": "The Organization-Wide Defaults to check, "
|
|
137
|
+
"organized as a list with each element containing the keys api_name, "
|
|
138
|
+
"internal_sharing_model, and external_sharing_model. NOTE: you must have "
|
|
139
|
+
"External Sharing Model turned on in Sharing Settings to use the latter feature. "
|
|
140
|
+
"Checking External Sharing Model when it is turned off will fail the preflight.",
|
|
141
|
+
"required": True,
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
def _init_options(self, kwargs):
|
|
146
|
+
super()._init_options(kwargs)
|
|
147
|
+
|
|
148
|
+
if "org_wide_defaults" not in self.options:
|
|
149
|
+
raise TaskOptionsError("org_wide_defaults is a required option")
|
|
150
|
+
|
|
151
|
+
if not all("api_name" in entry for entry in self.options["org_wide_defaults"]):
|
|
152
|
+
raise TaskOptionsError("api_name must be included in each entry")
|
|
153
|
+
|
|
154
|
+
if not all(
|
|
155
|
+
"internal_sharing_model" in entry or "external_sharing_model" in entry
|
|
156
|
+
for entry in self.options["org_wide_defaults"]
|
|
157
|
+
):
|
|
158
|
+
raise TaskOptionsError("Each entry must include a sharing model to check.")
|
|
159
|
+
|
|
160
|
+
self.owds = {
|
|
161
|
+
entry["api_name"]: (
|
|
162
|
+
entry.get("internal_sharing_model"),
|
|
163
|
+
entry.get("external_sharing_model"),
|
|
164
|
+
)
|
|
165
|
+
for entry in self.options["org_wide_defaults"]
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
def _check_owds(self, sobject, result):
|
|
169
|
+
internal = (
|
|
170
|
+
result["InternalSharingModel"] == self.owds[sobject][0]
|
|
171
|
+
if self.owds[sobject][0]
|
|
172
|
+
else True
|
|
173
|
+
)
|
|
174
|
+
external = (
|
|
175
|
+
result["ExternalSharingModel"] == self.owds[sobject][1]
|
|
176
|
+
if self.owds[sobject][1]
|
|
177
|
+
else True
|
|
178
|
+
)
|
|
179
|
+
return internal and external
|
|
180
|
+
|
|
181
|
+
def _run_task(self):
|
|
182
|
+
try:
|
|
183
|
+
ext = (
|
|
184
|
+
", ExternalSharingModel"
|
|
185
|
+
if any(owd[1] is not None for owd in self.owds.values())
|
|
186
|
+
else ""
|
|
187
|
+
)
|
|
188
|
+
object_list = ", ".join(f"'{obj}'" for obj in self.owds.keys())
|
|
189
|
+
results = self.sf.query(
|
|
190
|
+
f"SELECT QualifiedApiName, InternalSharingModel{ext} "
|
|
191
|
+
"FROM EntityDefinition "
|
|
192
|
+
f"WHERE QualifiedApiName IN ({object_list})"
|
|
193
|
+
)["records"]
|
|
194
|
+
self.return_values = all(
|
|
195
|
+
self._check_owds(rec["QualifiedApiName"], rec) for rec in results
|
|
196
|
+
)
|
|
197
|
+
except (IndexError, KeyError, SalesforceMalformedRequest):
|
|
198
|
+
self.return_values = False
|
|
199
|
+
|
|
200
|
+
self.logger.info(
|
|
201
|
+
f"Completed Organization-Wide Default preflight with result: {self.return_values}"
|
|
202
|
+
)
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
from unittest import mock
|
|
2
|
+
|
|
3
|
+
import pytest
|
|
4
|
+
|
|
5
|
+
from cumulusci.core.exceptions import BulkDataException
|
|
6
|
+
from cumulusci.tasks.bulkdata.mapping_parser import MappingStep
|
|
7
|
+
from cumulusci.tasks.bulkdata.step import DataApi, DataOperationType
|
|
8
|
+
from cumulusci.tasks.preflight.dataset_load import LoadDataSetCheck
|
|
9
|
+
from cumulusci.tasks.salesforce.tests.util import create_task
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class TestLoadDataSetCheck:
|
|
13
|
+
@mock.patch(
|
|
14
|
+
"cumulusci.tasks.preflight.dataset_load.validate_and_inject_mapping",
|
|
15
|
+
return_value=True,
|
|
16
|
+
)
|
|
17
|
+
def test_run_task(self, validate_and_inject_mapping):
|
|
18
|
+
task = create_task(LoadDataSetCheck, {})
|
|
19
|
+
assert task()
|
|
20
|
+
assert task.options["dataset"] == "default"
|
|
21
|
+
assert task.mapping == {
|
|
22
|
+
"Account": MappingStep(
|
|
23
|
+
sf_object="Account",
|
|
24
|
+
table="Account",
|
|
25
|
+
fields={
|
|
26
|
+
"Name": "Name",
|
|
27
|
+
"Description": "Description",
|
|
28
|
+
"ShippingStreet": "ShippingStreet",
|
|
29
|
+
"ShippingCity": "ShippingCity",
|
|
30
|
+
"ShippingState": "ShippingState",
|
|
31
|
+
"ShippingPostalCode": "ShippingPostalCode",
|
|
32
|
+
"ShippingCountry": "ShippingCountry",
|
|
33
|
+
"Phone": "Phone",
|
|
34
|
+
"AccountNumber": "AccountNumber",
|
|
35
|
+
},
|
|
36
|
+
lookups={},
|
|
37
|
+
static={},
|
|
38
|
+
filters=[],
|
|
39
|
+
action=DataOperationType.INSERT,
|
|
40
|
+
api=DataApi.BULK,
|
|
41
|
+
batch_size=1,
|
|
42
|
+
oid_as_pk=False,
|
|
43
|
+
record_type=None,
|
|
44
|
+
bulk_mode=None,
|
|
45
|
+
anchor_date=None,
|
|
46
|
+
soql_filter=None,
|
|
47
|
+
update_key=(),
|
|
48
|
+
),
|
|
49
|
+
"Contact": MappingStep(
|
|
50
|
+
sf_object="Contact",
|
|
51
|
+
table="Contact",
|
|
52
|
+
fields={"FirstName": "FirstName"},
|
|
53
|
+
lookups={},
|
|
54
|
+
static={},
|
|
55
|
+
filters=[],
|
|
56
|
+
action=DataOperationType.INSERT,
|
|
57
|
+
api=DataApi.BULK,
|
|
58
|
+
batch_size=1,
|
|
59
|
+
oid_as_pk=False,
|
|
60
|
+
record_type=None,
|
|
61
|
+
bulk_mode=None,
|
|
62
|
+
anchor_date=None,
|
|
63
|
+
soql_filter=None,
|
|
64
|
+
update_key=(),
|
|
65
|
+
),
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
def test_mapping_file_not_found(self):
|
|
69
|
+
task = create_task(LoadDataSetCheck, {"dataset": "alpha"})
|
|
70
|
+
with pytest.raises(Exception) as e:
|
|
71
|
+
task()
|
|
72
|
+
assert "No such file or directory" in str(e.value)
|
|
73
|
+
assert task.options["dataset"] == "alpha"
|
|
74
|
+
|
|
75
|
+
@mock.patch(
|
|
76
|
+
"cumulusci.tasks.preflight.dataset_load.validate_and_inject_mapping",
|
|
77
|
+
side_effect=BulkDataException("An error occurred during validation"),
|
|
78
|
+
)
|
|
79
|
+
def test_run_fail(self, validate_and_inject_mapping):
|
|
80
|
+
task = create_task(LoadDataSetCheck, {})
|
|
81
|
+
task.logger = mock.Mock()
|
|
82
|
+
assert not task()
|
|
83
|
+
assert task.logger.error.asset_called_once_with(
|
|
84
|
+
"An error occurred during validation"
|
|
85
|
+
)
|