gooddata 1.0.0-java
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.
- checksums.yaml +7 -0
- data/.document +5 -0
- data/.editorconfig +12 -0
- data/.flayignore +6 -0
- data/.gitignore +38 -0
- data/.pronto.yml +3 -0
- data/.rspec +5 -0
- data/.rubocop.yml +101 -0
- data/.travis.yml +9 -0
- data/.yardopts +22 -0
- data/CHANGELOG.md +272 -0
- data/CLI.md +435 -0
- data/CONTRIBUTING.md +38 -0
- data/DEPENDENCIES.md +880 -0
- data/Dockerfile.jruby +17 -0
- data/Dockerfile.ruby +19 -0
- data/Gemfile +4 -0
- data/Guardfile +5 -0
- data/LICENSE +22 -0
- data/LICENSE.rb +5 -0
- data/README.md +78 -0
- data/Rakefile +204 -0
- data/TODO.md +32 -0
- data/authors.sh +4 -0
- data/bin/gooddata +7 -0
- data/ci.rake +47 -0
- data/dependency_decisions.yml +104 -0
- data/docker-compose.yml +34 -0
- data/gooddata +9 -0
- data/gooddata.gemspec +72 -0
- data/lib/gooddata.rb +34 -0
- data/lib/gooddata/app/app.rb +16 -0
- data/lib/gooddata/bricks/base_downloader.rb +86 -0
- data/lib/gooddata/bricks/brick.rb +37 -0
- data/lib/gooddata/bricks/bricks.rb +17 -0
- data/lib/gooddata/bricks/middleware/aws_middleware.rb +41 -0
- data/lib/gooddata/bricks/middleware/base_middleware.rb +57 -0
- data/lib/gooddata/bricks/middleware/bench_middleware.rb +25 -0
- data/lib/gooddata/bricks/middleware/bulk_salesforce_middleware.rb +37 -0
- data/lib/gooddata/bricks/middleware/decode_params_middleware.rb +21 -0
- data/lib/gooddata/bricks/middleware/dwh_middleware.rb +41 -0
- data/lib/gooddata/bricks/middleware/fs_download_middleware.rb +48 -0
- data/lib/gooddata/bricks/middleware/fs_upload_middleware.rb +36 -0
- data/lib/gooddata/bricks/middleware/gooddata_middleware.rb +112 -0
- data/lib/gooddata/bricks/middleware/logger_middleware.rb +33 -0
- data/lib/gooddata/bricks/middleware/middleware.rb +12 -0
- data/lib/gooddata/bricks/middleware/restforce_middleware.rb +58 -0
- data/lib/gooddata/bricks/middleware/stdout_middleware.rb +23 -0
- data/lib/gooddata/bricks/middleware/twitter_middleware.rb +29 -0
- data/lib/gooddata/bricks/middleware/undot_params_middleware.rb +37 -0
- data/lib/gooddata/bricks/pipeline.rb +25 -0
- data/lib/gooddata/bricks/utils.rb +18 -0
- data/lib/gooddata/cli/cli.rb +27 -0
- data/lib/gooddata/cli/commands/auth_cmd.rb +29 -0
- data/lib/gooddata/cli/commands/domain_cmd.rb +28 -0
- data/lib/gooddata/cli/commands/project_cmd.rb +28 -0
- data/lib/gooddata/cli/hooks.rb +56 -0
- data/lib/gooddata/cli/shared.rb +66 -0
- data/lib/gooddata/cli/terminal.rb +20 -0
- data/lib/gooddata/client.rb +67 -0
- data/lib/gooddata/commands/api.rb +64 -0
- data/lib/gooddata/commands/auth.rb +107 -0
- data/lib/gooddata/commands/base.rb +12 -0
- data/lib/gooddata/commands/commands.rb +12 -0
- data/lib/gooddata/commands/datasets.rb +148 -0
- data/lib/gooddata/commands/datawarehouse.rb +20 -0
- data/lib/gooddata/commands/domain.rb +40 -0
- data/lib/gooddata/commands/process.rb +67 -0
- data/lib/gooddata/commands/project.rb +144 -0
- data/lib/gooddata/commands/projects.rb +20 -0
- data/lib/gooddata/commands/role.rb +36 -0
- data/lib/gooddata/commands/runners.rb +47 -0
- data/lib/gooddata/commands/scaffold.rb +69 -0
- data/lib/gooddata/commands/user.rb +39 -0
- data/lib/gooddata/connection.rb +127 -0
- data/lib/gooddata/core/core.rb +12 -0
- data/lib/gooddata/core/logging.rb +105 -0
- data/lib/gooddata/core/nil_logger.rb +32 -0
- data/lib/gooddata/core/project.rb +74 -0
- data/lib/gooddata/core/rest.rb +149 -0
- data/lib/gooddata/core/user.rb +20 -0
- data/lib/gooddata/data/data.rb +12 -0
- data/lib/gooddata/data/guesser.rb +122 -0
- data/lib/gooddata/exceptions/attr_element_not_found.rb +16 -0
- data/lib/gooddata/exceptions/command_failed.rb +11 -0
- data/lib/gooddata/exceptions/exceptions.rb +12 -0
- data/lib/gooddata/exceptions/execution_limit_exceeded.rb +13 -0
- data/lib/gooddata/exceptions/export_clone.rb +4 -0
- data/lib/gooddata/exceptions/filter_maqlization.rb +16 -0
- data/lib/gooddata/exceptions/import_clone.rb +4 -0
- data/lib/gooddata/exceptions/malformed_user.rb +15 -0
- data/lib/gooddata/exceptions/maql_execution.rb +16 -0
- data/lib/gooddata/exceptions/no_project_error.rb +19 -0
- data/lib/gooddata/exceptions/object_migration.rb +32 -0
- data/lib/gooddata/exceptions/project_not_found.rb +13 -0
- data/lib/gooddata/exceptions/segment_not_empty.rb +18 -0
- data/lib/gooddata/exceptions/uncomputable_report.rb +13 -0
- data/lib/gooddata/exceptions/user_in_different_domain.rb +15 -0
- data/lib/gooddata/exceptions/validation_error.rb +16 -0
- data/lib/gooddata/extensions/big_decimal.rb +17 -0
- data/lib/gooddata/extensions/class.rb +11 -0
- data/lib/gooddata/extensions/enumerable.rb +39 -0
- data/lib/gooddata/extensions/extensions.rb +10 -0
- data/lib/gooddata/extensions/false.rb +23 -0
- data/lib/gooddata/extensions/hash.rb +49 -0
- data/lib/gooddata/extensions/integer.rb +5 -0
- data/lib/gooddata/extensions/nil.rb +19 -0
- data/lib/gooddata/extensions/numeric.rb +15 -0
- data/lib/gooddata/extensions/object.rb +31 -0
- data/lib/gooddata/extensions/string.rb +7 -0
- data/lib/gooddata/extensions/symbol.rb +15 -0
- data/lib/gooddata/extensions/true.rb +23 -0
- data/lib/gooddata/extract.rb +21 -0
- data/lib/gooddata/goodzilla/goodzilla.rb +160 -0
- data/lib/gooddata/helpers/auth_helpers.rb +75 -0
- data/lib/gooddata/helpers/csv_helper.rb +61 -0
- data/lib/gooddata/helpers/data_helper.rb +129 -0
- data/lib/gooddata/helpers/erb_helper.rb +23 -0
- data/lib/gooddata/helpers/global_helpers.rb +266 -0
- data/lib/gooddata/helpers/global_helpers_params.rb +292 -0
- data/lib/gooddata/helpers/helpers.rb +10 -0
- data/lib/gooddata/lcm/actions/actions.rb +12 -0
- data/lib/gooddata/lcm/actions/apply_custom_maql.rb +80 -0
- data/lib/gooddata/lcm/actions/associate_clients.rb +87 -0
- data/lib/gooddata/lcm/actions/base_action.rb +23 -0
- data/lib/gooddata/lcm/actions/collect_ca_metrics.rb +53 -0
- data/lib/gooddata/lcm/actions/collect_client_projects.rb +78 -0
- data/lib/gooddata/lcm/actions/collect_clients.rb +128 -0
- data/lib/gooddata/lcm/actions/collect_data_product.rb +57 -0
- data/lib/gooddata/lcm/actions/collect_dynamic_schedule_params.rb +62 -0
- data/lib/gooddata/lcm/actions/collect_ldm_objects.rb +56 -0
- data/lib/gooddata/lcm/actions/collect_meta.rb +88 -0
- data/lib/gooddata/lcm/actions/collect_segment_clients.rb +113 -0
- data/lib/gooddata/lcm/actions/collect_segments.rb +72 -0
- data/lib/gooddata/lcm/actions/collect_tagged_objects.rb +80 -0
- data/lib/gooddata/lcm/actions/collect_users_brick_users.rb +46 -0
- data/lib/gooddata/lcm/actions/create_segment_masters.rb +160 -0
- data/lib/gooddata/lcm/actions/ensure_data_product.rb +53 -0
- data/lib/gooddata/lcm/actions/ensure_release_table.rb +53 -0
- data/lib/gooddata/lcm/actions/ensure_segments.rb +32 -0
- data/lib/gooddata/lcm/actions/ensure_technical_users_domain.rb +70 -0
- data/lib/gooddata/lcm/actions/ensure_technical_users_project.rb +83 -0
- data/lib/gooddata/lcm/actions/execute_schedules.rb +128 -0
- data/lib/gooddata/lcm/actions/hello_world.rb +41 -0
- data/lib/gooddata/lcm/actions/import_object_collections.rb +60 -0
- data/lib/gooddata/lcm/actions/print_actions.rb +58 -0
- data/lib/gooddata/lcm/actions/print_modes.rb +69 -0
- data/lib/gooddata/lcm/actions/print_types.rb +52 -0
- data/lib/gooddata/lcm/actions/provision_clients.rb +89 -0
- data/lib/gooddata/lcm/actions/purge_clients.rb +58 -0
- data/lib/gooddata/lcm/actions/rename_existing_client_projects.rb +70 -0
- data/lib/gooddata/lcm/actions/segments_filter.rb +50 -0
- data/lib/gooddata/lcm/actions/synchronize_attribute_drillpaths.rb +64 -0
- data/lib/gooddata/lcm/actions/synchronize_cas.rb +72 -0
- data/lib/gooddata/lcm/actions/synchronize_clients.rb +94 -0
- data/lib/gooddata/lcm/actions/synchronize_color_palette.rb +67 -0
- data/lib/gooddata/lcm/actions/synchronize_etls_in_segment.rb +155 -0
- data/lib/gooddata/lcm/actions/synchronize_label_types.rb +64 -0
- data/lib/gooddata/lcm/actions/synchronize_ldm.rb +82 -0
- data/lib/gooddata/lcm/actions/synchronize_meta.rb +52 -0
- data/lib/gooddata/lcm/actions/synchronize_new_segments.rb +61 -0
- data/lib/gooddata/lcm/actions/synchronize_processes.rb +66 -0
- data/lib/gooddata/lcm/actions/synchronize_schedules.rb +91 -0
- data/lib/gooddata/lcm/actions/synchronize_tag_objects.rb +64 -0
- data/lib/gooddata/lcm/actions/synchronize_user_filters.rb +210 -0
- data/lib/gooddata/lcm/actions/synchronize_user_groups.rb +53 -0
- data/lib/gooddata/lcm/actions/synchronize_users.rb +336 -0
- data/lib/gooddata/lcm/actions/update_release_table.rb +77 -0
- data/lib/gooddata/lcm/data/create_lcm_release.sql.erb +6 -0
- data/lib/gooddata/lcm/data/insert_into_lcm_release.sql.erb +11 -0
- data/lib/gooddata/lcm/data/select_from_lcm_release.sql.erb +8 -0
- data/lib/gooddata/lcm/data/update_lcm_release.sql.erb +7 -0
- data/lib/gooddata/lcm/dsl/dsl.rb +50 -0
- data/lib/gooddata/lcm/dsl/params_dsl.rb +61 -0
- data/lib/gooddata/lcm/dsl/type_dsl.rb +62 -0
- data/lib/gooddata/lcm/helpers/check_helper.rb +41 -0
- data/lib/gooddata/lcm/helpers/helpers.rb +12 -0
- data/lib/gooddata/lcm/helpers/tags_helper.rb +36 -0
- data/lib/gooddata/lcm/lcm.rb +325 -0
- data/lib/gooddata/lcm/lcm2.rb +400 -0
- data/lib/gooddata/lcm/types/base_type.rb +29 -0
- data/lib/gooddata/lcm/types/class/ads_client.rb +35 -0
- data/lib/gooddata/lcm/types/class/class.rb +21 -0
- data/lib/gooddata/lcm/types/class/gd_client.rb +35 -0
- data/lib/gooddata/lcm/types/class/types.rb +12 -0
- data/lib/gooddata/lcm/types/complex/complex.rb +33 -0
- data/lib/gooddata/lcm/types/complex/release_query.rb +35 -0
- data/lib/gooddata/lcm/types/complex/segment.rb +40 -0
- data/lib/gooddata/lcm/types/complex/synchronization_info.rb +35 -0
- data/lib/gooddata/lcm/types/complex/tokens.rb +31 -0
- data/lib/gooddata/lcm/types/complex/types.rb +12 -0
- data/lib/gooddata/lcm/types/complex/update_preference.rb +38 -0
- data/lib/gooddata/lcm/types/complex/users_brick_config.rb +32 -0
- data/lib/gooddata/lcm/types/param.rb +16 -0
- data/lib/gooddata/lcm/types/scalar/bool.rb +22 -0
- data/lib/gooddata/lcm/types/scalar/hash.rb +22 -0
- data/lib/gooddata/lcm/types/scalar/integer.rb +22 -0
- data/lib/gooddata/lcm/types/scalar/object.rb +22 -0
- data/lib/gooddata/lcm/types/scalar/string.rb +22 -0
- data/lib/gooddata/lcm/types/scalar/types.rb +12 -0
- data/lib/gooddata/lcm/types/special/array.rb +33 -0
- data/lib/gooddata/lcm/types/special/enum.rb +15 -0
- data/lib/gooddata/lcm/types/special/types.rb +12 -0
- data/lib/gooddata/lcm/types/types.rb +12 -0
- data/lib/gooddata/lcm/user_bricks_helper.rb +32 -0
- data/lib/gooddata/mixins/author.rb +26 -0
- data/lib/gooddata/mixins/content_getter.rb +15 -0
- data/lib/gooddata/mixins/content_property_reader.rb +17 -0
- data/lib/gooddata/mixins/content_property_writer.rb +17 -0
- data/lib/gooddata/mixins/contributor.rb +20 -0
- data/lib/gooddata/mixins/data_getter.rb +15 -0
- data/lib/gooddata/mixins/data_property_reader.rb +19 -0
- data/lib/gooddata/mixins/data_property_writer.rb +19 -0
- data/lib/gooddata/mixins/inspector.rb +53 -0
- data/lib/gooddata/mixins/is_attribute.rb +17 -0
- data/lib/gooddata/mixins/is_dimension.rb +17 -0
- data/lib/gooddata/mixins/is_fact.rb +17 -0
- data/lib/gooddata/mixins/is_folder.rb +11 -0
- data/lib/gooddata/mixins/is_label.rb +19 -0
- data/lib/gooddata/mixins/links.rb +15 -0
- data/lib/gooddata/mixins/md_finders.rb +79 -0
- data/lib/gooddata/mixins/md_grantees.rb +42 -0
- data/lib/gooddata/mixins/md_id_to_uri.rb +39 -0
- data/lib/gooddata/mixins/md_json.rb +15 -0
- data/lib/gooddata/mixins/md_lock.rb +87 -0
- data/lib/gooddata/mixins/md_object_id.rb +15 -0
- data/lib/gooddata/mixins/md_object_indexer.rb +74 -0
- data/lib/gooddata/mixins/md_object_query.rb +134 -0
- data/lib/gooddata/mixins/md_relations.rb +43 -0
- data/lib/gooddata/mixins/meta_getter.rb +17 -0
- data/lib/gooddata/mixins/meta_property_reader.rb +19 -0
- data/lib/gooddata/mixins/meta_property_writer.rb +19 -0
- data/lib/gooddata/mixins/mixins.rb +19 -0
- data/lib/gooddata/mixins/not_attribute.rb +17 -0
- data/lib/gooddata/mixins/not_exportable.rb +15 -0
- data/lib/gooddata/mixins/not_fact.rb +17 -0
- data/lib/gooddata/mixins/not_group.rb +17 -0
- data/lib/gooddata/mixins/not_label.rb +19 -0
- data/lib/gooddata/mixins/not_metric.rb +19 -0
- data/lib/gooddata/mixins/obj_id.rb +15 -0
- data/lib/gooddata/mixins/rest_getters.rb +17 -0
- data/lib/gooddata/mixins/rest_resource.rb +47 -0
- data/lib/gooddata/mixins/root_key_getter.rb +15 -0
- data/lib/gooddata/mixins/root_key_setter.rb +15 -0
- data/lib/gooddata/mixins/timestamps.rb +19 -0
- data/lib/gooddata/mixins/to_json.rb +11 -0
- data/lib/gooddata/mixins/uri_getter.rb +9 -0
- data/lib/gooddata/models/ads_output_stage.rb +85 -0
- data/lib/gooddata/models/automated_data_distribution.rb +36 -0
- data/lib/gooddata/models/blueprint/anchor_field.rb +65 -0
- data/lib/gooddata/models/blueprint/attribute_field.rb +45 -0
- data/lib/gooddata/models/blueprint/blueprint.rb +11 -0
- data/lib/gooddata/models/blueprint/blueprint_field.rb +70 -0
- data/lib/gooddata/models/blueprint/dashboard_builder.rb +30 -0
- data/lib/gooddata/models/blueprint/dataset_blueprint.rb +455 -0
- data/lib/gooddata/models/blueprint/date_dimension.rb +20 -0
- data/lib/gooddata/models/blueprint/fact_field.rb +20 -0
- data/lib/gooddata/models/blueprint/label_field.rb +47 -0
- data/lib/gooddata/models/blueprint/project_blueprint.rb +791 -0
- data/lib/gooddata/models/blueprint/project_builder.rb +103 -0
- data/lib/gooddata/models/blueprint/reference_field.rb +43 -0
- data/lib/gooddata/models/blueprint/schema_blueprint.rb +160 -0
- data/lib/gooddata/models/blueprint/schema_builder.rb +89 -0
- data/lib/gooddata/models/blueprint/to_manifest.rb +185 -0
- data/lib/gooddata/models/blueprint/to_wire.rb +173 -0
- data/lib/gooddata/models/channel_configuration.rb +112 -0
- data/lib/gooddata/models/client.rb +236 -0
- data/lib/gooddata/models/client_synchronization_result.rb +31 -0
- data/lib/gooddata/models/client_synchronization_result_details.rb +41 -0
- data/lib/gooddata/models/data_product.rb +149 -0
- data/lib/gooddata/models/datawarehouse.rb +114 -0
- data/lib/gooddata/models/domain.rb +505 -0
- data/lib/gooddata/models/execution.rb +115 -0
- data/lib/gooddata/models/execution_detail.rb +81 -0
- data/lib/gooddata/models/from_wire.rb +173 -0
- data/lib/gooddata/models/invitation.rb +75 -0
- data/lib/gooddata/models/links.rb +50 -0
- data/lib/gooddata/models/membership.rb +441 -0
- data/lib/gooddata/models/metadata.rb +324 -0
- data/lib/gooddata/models/metadata/attribute.rb +155 -0
- data/lib/gooddata/models/metadata/dashboard.rb +120 -0
- data/lib/gooddata/models/metadata/dashboard/dashboard_item.rb +76 -0
- data/lib/gooddata/models/metadata/dashboard/filter_apply_item.rb +37 -0
- data/lib/gooddata/models/metadata/dashboard/filter_item.rb +64 -0
- data/lib/gooddata/models/metadata/dashboard/geo_chart_item.rb +56 -0
- data/lib/gooddata/models/metadata/dashboard/headline_item.rb +56 -0
- data/lib/gooddata/models/metadata/dashboard/iframe_item.rb +46 -0
- data/lib/gooddata/models/metadata/dashboard/report_item.rb +92 -0
- data/lib/gooddata/models/metadata/dashboard/text_item.rb +55 -0
- data/lib/gooddata/models/metadata/dashboard_tab.rb +141 -0
- data/lib/gooddata/models/metadata/dataset.rb +67 -0
- data/lib/gooddata/models/metadata/dimension.rb +57 -0
- data/lib/gooddata/models/metadata/fact.rb +51 -0
- data/lib/gooddata/models/metadata/folder.rb +49 -0
- data/lib/gooddata/models/metadata/label.rb +128 -0
- data/lib/gooddata/models/metadata/metadata.rb +12 -0
- data/lib/gooddata/models/metadata/metric.rb +206 -0
- data/lib/gooddata/models/metadata/report.rb +268 -0
- data/lib/gooddata/models/metadata/report_definition.rb +272 -0
- data/lib/gooddata/models/metadata/scheduled_mail.rb +277 -0
- data/lib/gooddata/models/metadata/scheduled_mail/dashboard_attachment.rb +62 -0
- data/lib/gooddata/models/metadata/scheduled_mail/report_attachment.rb +64 -0
- data/lib/gooddata/models/metadata/variable.rb +96 -0
- data/lib/gooddata/models/model.rb +293 -0
- data/lib/gooddata/models/models.rb +12 -0
- data/lib/gooddata/models/module_constants.rb +31 -0
- data/lib/gooddata/models/notification_rule.rb +113 -0
- data/lib/gooddata/models/process.rb +371 -0
- data/lib/gooddata/models/profile.rb +451 -0
- data/lib/gooddata/models/project.rb +2030 -0
- data/lib/gooddata/models/project_creator.rb +209 -0
- data/lib/gooddata/models/project_log_formatter.rb +204 -0
- data/lib/gooddata/models/project_metadata.rb +67 -0
- data/lib/gooddata/models/project_role.rb +79 -0
- data/lib/gooddata/models/report_data_result.rb +270 -0
- data/lib/gooddata/models/schedule.rb +538 -0
- data/lib/gooddata/models/segment.rb +274 -0
- data/lib/gooddata/models/style_setting.rb +62 -0
- data/lib/gooddata/models/subscription.rb +188 -0
- data/lib/gooddata/models/tab_builder.rb +27 -0
- data/lib/gooddata/models/user_filters/mandatory_user_filter.rb +76 -0
- data/lib/gooddata/models/user_filters/user_filter.rb +101 -0
- data/lib/gooddata/models/user_filters/user_filter_builder.rb +553 -0
- data/lib/gooddata/models/user_filters/user_filters.rb +13 -0
- data/lib/gooddata/models/user_filters/variable_user_filter.rb +33 -0
- data/lib/gooddata/models/user_group.rb +250 -0
- data/lib/gooddata/rest/README.md +37 -0
- data/lib/gooddata/rest/client.rb +396 -0
- data/lib/gooddata/rest/connection.rb +776 -0
- data/lib/gooddata/rest/object.rb +69 -0
- data/lib/gooddata/rest/object_factory.rb +51 -0
- data/lib/gooddata/rest/resource.rb +27 -0
- data/lib/gooddata/rest/rest.rb +24 -0
- data/lib/gooddata/version.rb +23 -0
- data/lib/templates/bricks/brick.rb.erb +7 -0
- data/lib/templates/bricks/main.rb.erb +5 -0
- data/lib/templates/project/Goodfile.erb +4 -0
- data/lib/templates/project/data/commits.csv +4 -0
- data/lib/templates/project/data/devs.csv +4 -0
- data/lib/templates/project/data/repos.csv +3 -0
- data/lib/templates/project/model/model.rb.erb +20 -0
- data/spec/.rubocop.yml +16 -0
- data/spec/bricks/bricks_spec.rb +110 -0
- data/spec/bricks/default-config.json +8 -0
- data/spec/data/.gooddata +4 -0
- data/spec/data/blueprints/additional_dataset_module.json +32 -0
- data/spec/data/blueprints/attribute_sort_order_blueprint.json +72 -0
- data/spec/data/blueprints/big_blueprint_not_pruned.json +2079 -0
- data/spec/data/blueprints/invalid_blueprint.json +103 -0
- data/spec/data/blueprints/m_n_model.json +104 -0
- data/spec/data/blueprints/model_module.json +25 -0
- data/spec/data/blueprints/test_blueprint.json +39 -0
- data/spec/data/blueprints/test_project_model_spec.json +106 -0
- data/spec/data/cc/data/source/commits.csv +4 -0
- data/spec/data/cc/data/source/devs.csv +4 -0
- data/spec/data/cc/data/source/repos.csv +3 -0
- data/spec/data/cc/devel.prm +0 -0
- data/spec/data/cc/graph/graph.grf +11 -0
- data/spec/data/cc/workspace.prm +19 -0
- data/spec/data/column_based_permissions.csv +7 -0
- data/spec/data/column_based_permissions2.csv +6 -0
- data/spec/data/dynamic_schedule_params_table.csv +7 -0
- data/spec/data/gd_gse_data_blueprint.json +1371 -0
- data/spec/data/gd_gse_data_manifest.json +1424 -0
- data/spec/data/gd_gse_data_model.json +1772 -0
- data/spec/data/gooddata_version_process/gooddata_version.rb +9 -0
- data/spec/data/gooddata_version_process/gooddata_version.zip +0 -0
- data/spec/data/hello_world_process/hello_world.rb +9 -0
- data/spec/data/hello_world_process/hello_world.zip +0 -0
- data/spec/data/line_based_permissions.csv +3 -0
- data/spec/data/manifests/test_blueprint.json +32 -0
- data/spec/data/manifests/test_project.json +107 -0
- data/spec/data/reports/left_attr_report.json +108 -0
- data/spec/data/reports/metric_only_one_line.json +83 -0
- data/spec/data/reports/report_1.json +197 -0
- data/spec/data/reports/top_attr_report.json +108 -0
- data/spec/data/ruby_params_process/ruby_params.rb +9 -0
- data/spec/data/ruby_process/deep_files/deep_stuff.txt +1 -0
- data/spec/data/ruby_process/process.rb +8 -0
- data/spec/data/ruby_process/stuff.txt +1 -0
- data/spec/data/superfluous_titles_view.json +81 -0
- data/spec/data/test-ci-data.csv +2 -0
- data/spec/data/users.csv +12 -0
- data/spec/data/wire_models/attribute_sort_by_model.json +73 -0
- data/spec/data/wire_models/model_view.json +1775 -0
- data/spec/data/wire_models/nu_model.json +3046 -0
- data/spec/data/wire_models/test_blueprint.json +66 -0
- data/spec/data/wire_test_project.json +150 -0
- data/spec/data/workspace_table.csv +3 -0
- data/spec/environment/default.rb +43 -0
- data/spec/environment/development.rb +32 -0
- data/spec/environment/environment.rb +38 -0
- data/spec/environment/production.rb +27 -0
- data/spec/environment/staging.rb +33 -0
- data/spec/environment/testing.rb +32 -0
- data/spec/helpers/blueprint_helper.rb +27 -0
- data/spec/helpers/cli_helper.rb +38 -0
- data/spec/helpers/connection_helper.rb +43 -0
- data/spec/helpers/crypto_helper.rb +19 -0
- data/spec/helpers/csv_helper.rb +20 -0
- data/spec/helpers/process_helper.rb +35 -0
- data/spec/helpers/project_helper.rb +74 -0
- data/spec/helpers/schedule_helper.rb +33 -0
- data/spec/helpers/spec_helper.rb +17 -0
- data/spec/integration/ads_output_stage_spec.rb +45 -0
- data/spec/integration/blueprint_updates_spec.rb +107 -0
- data/spec/integration/blueprint_with_ca_spec.rb +56 -0
- data/spec/integration/blueprint_with_grain_spec.rb +74 -0
- data/spec/integration/channel_configuration_spec.rb +67 -0
- data/spec/integration/clients_spec.rb +164 -0
- data/spec/integration/command_datawarehouse_spec.rb +45 -0
- data/spec/integration/command_projects_spec.rb +32 -0
- data/spec/integration/commands/command_projects_spec.rb +22 -0
- data/spec/integration/core/connection_spec.rb +56 -0
- data/spec/integration/core/logging_spec.rb +130 -0
- data/spec/integration/core/project_spec.rb +54 -0
- data/spec/integration/create_from_template_spec.rb +29 -0
- data/spec/integration/create_project_spec.rb +27 -0
- data/spec/integration/date_dim_switch_spec.rb +150 -0
- data/spec/integration/deprecated_load_spec.rb +60 -0
- data/spec/integration/full_process_schedule_spec.rb +367 -0
- data/spec/integration/full_project_spec.rb +592 -0
- data/spec/integration/helpers_spec.rb +16 -0
- data/spec/integration/lcm_spec.rb +54 -0
- data/spec/integration/mixins/id_to_uri_spec.rb +44 -0
- data/spec/integration/models/data_product_spec.rb +71 -0
- data/spec/integration/models/domain_spec.rb +162 -0
- data/spec/integration/models/invitation_spec.rb +17 -0
- data/spec/integration/models/membership_spec.rb +127 -0
- data/spec/integration/models/metadata/report_spec.rb +54 -0
- data/spec/integration/models/params_spec.rb +118 -0
- data/spec/integration/models/profile_spec.rb +210 -0
- data/spec/integration/models/project_role_spec.rb +94 -0
- data/spec/integration/models/project_spec.rb +225 -0
- data/spec/integration/models/schedule_spec.rb +485 -0
- data/spec/integration/models/unit_project_spec.rb +130 -0
- data/spec/integration/over_to_user_filters_spec.rb +98 -0
- data/spec/integration/partial_md_export_import_spec.rb +41 -0
- data/spec/integration/project_spec.rb +381 -0
- data/spec/integration/rest_spec.rb +214 -0
- data/spec/integration/schedule_spec.rb +613 -0
- data/spec/integration/segments_spec.rb +100 -0
- data/spec/integration/subscription_spec.rb +88 -0
- data/spec/integration/urn_date_dim_spec.rb +53 -0
- data/spec/integration/user_filters_spec.rb +306 -0
- data/spec/integration/user_group_spec.rb +147 -0
- data/spec/integration/variables_spec.rb +189 -0
- data/spec/logging_in_logging_out_spec.rb +91 -0
- data/spec/spec_helper.rb +66 -0
- data/spec/unit/actions/associate_clients_spec.rb +47 -0
- data/spec/unit/actions/collect_client_projects_spec.rb +47 -0
- data/spec/unit/actions/collect_clients_spec.rb +65 -0
- data/spec/unit/actions/collect_data_product_spec.rb +56 -0
- data/spec/unit/actions/collect_dynamic_schedule_params_spec.rb +56 -0
- data/spec/unit/actions/collect_meta_spec.rb +88 -0
- data/spec/unit/actions/collect_segment_clients_spec.rb +81 -0
- data/spec/unit/actions/collect_tagged_objects_spec.rb +126 -0
- data/spec/unit/actions/collect_users_brick_users_spec.rb +36 -0
- data/spec/unit/actions/create_segment_masters_spec.rb +64 -0
- data/spec/unit/actions/ensure_data_product_spec.rb +38 -0
- data/spec/unit/actions/ensure_technical_users_domain_spec.rb +51 -0
- data/spec/unit/actions/ensure_technical_users_project_spec.rb +72 -0
- data/spec/unit/actions/execute_schedules_spec.rb +94 -0
- data/spec/unit/actions/provision_clients_spec.rb +45 -0
- data/spec/unit/actions/purge_clients_spec.rb +47 -0
- data/spec/unit/actions/rename_existing_client_projects_spec.rb +54 -0
- data/spec/unit/actions/segments_filter_spec.rb +46 -0
- data/spec/unit/actions/shared_examples_for_user_actions.rb +26 -0
- data/spec/unit/actions/synchronize_cas_spec.rb +58 -0
- data/spec/unit/actions/synchronize_etls_in_segment_spec.rb +212 -0
- data/spec/unit/actions/synchronize_ldm_spec.rb +57 -0
- data/spec/unit/actions/synchronize_user_filters_spec.rb +146 -0
- data/spec/unit/actions/synchronize_user_groups_spec.rb +49 -0
- data/spec/unit/actions/synchronize_users_spec.rb +134 -0
- data/spec/unit/bricks/bricks_spec.rb +34 -0
- data/spec/unit/bricks/middleware/aws_middelware_spec.rb +98 -0
- data/spec/unit/bricks/middleware/bench_middleware_spec.rb +15 -0
- data/spec/unit/bricks/middleware/bulk_salesforce_middleware_spec.rb +15 -0
- data/spec/unit/bricks/middleware/gooddata_middleware_spec.rb +15 -0
- data/spec/unit/bricks/middleware/logger_middleware_spec.rb +30 -0
- data/spec/unit/bricks/middleware/restforce_middleware_spec.rb +15 -0
- data/spec/unit/bricks/middleware/stdout_middleware_spec.rb +15 -0
- data/spec/unit/bricks/middleware/twitter_middleware_spec.rb +15 -0
- data/spec/unit/cli/cli_spec.rb +17 -0
- data/spec/unit/cli/commands/cmd_auth_spec.rb +17 -0
- data/spec/unit/core/nil_logger_spec.rb +13 -0
- data/spec/unit/extensions/hash_spec.rb +22 -0
- data/spec/unit/godzilla/goodzilla_spec.rb +74 -0
- data/spec/unit/helpers/csv_helper_spec.rb +22 -0
- data/spec/unit/helpers/data_helper_spec.rb +67 -0
- data/spec/unit/helpers/global_helpers_spec.rb +264 -0
- data/spec/unit/helpers_spec.rb +254 -0
- data/spec/unit/lcm/user_bricks_helper_spec.rb +58 -0
- data/spec/unit/models/blueprint/attribute_sort_by_spec.rb +20 -0
- data/spec/unit/models/blueprint/attributes_spec.rb +28 -0
- data/spec/unit/models/blueprint/dataset_spec.rb +120 -0
- data/spec/unit/models/blueprint/labels_spec.rb +43 -0
- data/spec/unit/models/blueprint/project_blueprint_spec.rb +642 -0
- data/spec/unit/models/blueprint/reference_spec.rb +28 -0
- data/spec/unit/models/blueprint/schema_builder_spec.rb +36 -0
- data/spec/unit/models/blueprint/to_wire_spec.rb +195 -0
- data/spec/unit/models/execution_spec.rb +109 -0
- data/spec/unit/models/from_wire_spec.rb +301 -0
- data/spec/unit/models/metadata_spec.rb +140 -0
- data/spec/unit/models/metric_spec.rb +129 -0
- data/spec/unit/models/model_spec.rb +77 -0
- data/spec/unit/models/project_creator_spec.rb +90 -0
- data/spec/unit/models/project_spec.rb +94 -0
- data/spec/unit/models/report_result_data_spec.rb +194 -0
- data/spec/unit/models/to_manifest_spec.rb +136 -0
- data/spec/unit/models/user_filters/user_filter_builder_spec.rb +110 -0
- data/spec/unit/models/user_filters_spec.rb +95 -0
- data/spec/unit/models/variable_spec.rb +280 -0
- data/spec/unit/rest/polling_spec.rb +101 -0
- data/spec/unit/rest/resource_spec.rb +10 -0
- data/yard-server.sh +3 -0
- metadata +1207 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
require 'erb'
|
|
2
|
+
|
|
3
|
+
module GoodData
|
|
4
|
+
module Helpers
|
|
5
|
+
module ErbHelper
|
|
6
|
+
class << self
|
|
7
|
+
def template_string(template, params = {})
|
|
8
|
+
b = binding
|
|
9
|
+
|
|
10
|
+
params.each do |k, v|
|
|
11
|
+
b.local_variable_set(k, v)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
ERB.new(template).result(b)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def template_file(path, params)
|
|
18
|
+
template_string(File.read(path), params)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
#
|
|
3
|
+
# Copyright (c) 2010-2017 GoodData Corporation. All rights reserved.
|
|
4
|
+
# This source code is licensed under the BSD-style license found in the
|
|
5
|
+
# LICENSE file in the root directory of this source tree.
|
|
6
|
+
|
|
7
|
+
require 'base64'
|
|
8
|
+
require 'pathname'
|
|
9
|
+
require 'hashie'
|
|
10
|
+
require 'openssl'
|
|
11
|
+
|
|
12
|
+
require_relative '../extensions/object'
|
|
13
|
+
require_relative 'global_helpers_params'
|
|
14
|
+
|
|
15
|
+
module GoodData
|
|
16
|
+
module Helpers
|
|
17
|
+
extend Hashie::Extensions::StringifyKeys::ClassMethods
|
|
18
|
+
extend Hashie::Extensions::SymbolizeKeys::ClassMethods
|
|
19
|
+
|
|
20
|
+
class DeepMergeableHash < Hash
|
|
21
|
+
include Hashie::Extensions::DeepMerge
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
set_const :GD_MAX_RETRY, (ENV['GD_MAX_RETRY'] && ENV['GD_MAX_RETRY'].to_i) || 3
|
|
25
|
+
|
|
26
|
+
class << self
|
|
27
|
+
def error(msg)
|
|
28
|
+
STDERR.puts(msg)
|
|
29
|
+
exit 1
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# FIXME: Windows incompatible
|
|
33
|
+
def find_goodfile(pwd = `pwd`.strip!, options = {})
|
|
34
|
+
root = Pathname(options[:root] || '/')
|
|
35
|
+
pwd = Pathname(pwd).expand_path
|
|
36
|
+
loop do
|
|
37
|
+
gf = pwd + '.gooddata'
|
|
38
|
+
return gf if File.exist?(gf)
|
|
39
|
+
pwd = pwd.parent
|
|
40
|
+
break if root == pwd
|
|
41
|
+
end
|
|
42
|
+
nil
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# It takes what should be mapped to what and creates a mapping that is suitable for other internal methods.
|
|
46
|
+
# This means looking up the objects and returning it as array of pairs.
|
|
47
|
+
# The input can be given in several ways
|
|
48
|
+
#
|
|
49
|
+
# 1. Hash. For example it could look like
|
|
50
|
+
# {'label.states.name' => 'label.state.id'}
|
|
51
|
+
#
|
|
52
|
+
# 2 Arrays. In such case the arrays are zipped together. First item will be swapped for the first item in the second array etc.
|
|
53
|
+
# ['label.states.name'], ['label.state.id']
|
|
54
|
+
#
|
|
55
|
+
# @param what [Hash | Array] List/Hash of objects to be swapped
|
|
56
|
+
# @param for_what [Array] List of objects to be swapped
|
|
57
|
+
# @return [Array<GoodData::MdObject>] List of pairs of objects
|
|
58
|
+
def prepare_mapping(what, for_what = nil, options = {})
|
|
59
|
+
project = options[:project] || (for_what.is_a?(Hash) && for_what[:project]) || fail('Project has to be provided')
|
|
60
|
+
mapping = if what.is_a?(Hash)
|
|
61
|
+
whats = what.keys
|
|
62
|
+
to_whats = what.values
|
|
63
|
+
whats.zip(to_whats)
|
|
64
|
+
elsif what.is_a?(Array) && for_what.is_a?(Array)
|
|
65
|
+
whats.zip(to_whats)
|
|
66
|
+
else
|
|
67
|
+
[[what, for_what]]
|
|
68
|
+
end
|
|
69
|
+
mapping.pmap { |f, t| [project.objects(f), project.objects(t)] }
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def get_path(an_object, path = [], default = nil)
|
|
73
|
+
return an_object if path.empty?
|
|
74
|
+
return default if an_object.nil?
|
|
75
|
+
|
|
76
|
+
path.reduce(an_object) do |a, e|
|
|
77
|
+
a && a.key?(e) ? a[e] : default
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def last_uri_part(uri)
|
|
82
|
+
uri.split('/').last
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def home_directory
|
|
86
|
+
running_on_windows? ? ENV['USERPROFILE'] : ENV['HOME']
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def hash_dfs(thing, &block)
|
|
90
|
+
if !thing.is_a?(Hash) && !thing.is_a?(Array) # rubocop:disable Style/GuardClause
|
|
91
|
+
elsif thing.is_a?(Array)
|
|
92
|
+
thing.each do |child|
|
|
93
|
+
hash_dfs(child, &block)
|
|
94
|
+
end
|
|
95
|
+
else
|
|
96
|
+
thing.each do |key, val|
|
|
97
|
+
yield(thing, key)
|
|
98
|
+
hash_dfs(val, &block)
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def titleize(str)
|
|
104
|
+
titleized = str.gsub(/[\.|_](.)/, &:upcase)
|
|
105
|
+
titleized = titleized.tr('_', ' ')
|
|
106
|
+
titleized[0] = titleized[0].upcase
|
|
107
|
+
titleized
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def join(master, slave, on, on2, options = {})
|
|
111
|
+
full_outer = options[:full_outer]
|
|
112
|
+
inner = options[:inner]
|
|
113
|
+
|
|
114
|
+
lookup = create_lookup(slave, on2)
|
|
115
|
+
marked_lookup = {}
|
|
116
|
+
results = master.reduce([]) do |a, line|
|
|
117
|
+
matching_values = lookup[line.values_at(*on)] || []
|
|
118
|
+
marked_lookup[line.values_at(*on)] = 1
|
|
119
|
+
if matching_values.empty? && !inner
|
|
120
|
+
a << line.to_hash
|
|
121
|
+
else
|
|
122
|
+
matching_values.each do |matching_value|
|
|
123
|
+
a << matching_value.to_hash.merge(line.to_hash)
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
a
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
if full_outer
|
|
130
|
+
(lookup.keys - marked_lookup.keys).each do |key|
|
|
131
|
+
puts lookup[key]
|
|
132
|
+
results << lookup[key].first.to_hash
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
results
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def running_on_windows?
|
|
139
|
+
RUBY_PLATFORM =~ /mswin32|mingw32/
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def running_on_a_mac?
|
|
143
|
+
RUBY_PLATFORM =~ /-darwin\d/
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def underline(x)
|
|
147
|
+
'=' * x.size
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def interpolate_error_messages(errors)
|
|
151
|
+
errors.map { |e| interpolate_error_message(e) }
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
def interpolate_error_message(error)
|
|
155
|
+
return unless error && error['error'] && error['error']['message']
|
|
156
|
+
message = error['error']['message']
|
|
157
|
+
params = error['error']['parameters']
|
|
158
|
+
sprintf(message, *params)
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
def deep_dup(an_object)
|
|
162
|
+
case an_object
|
|
163
|
+
when Array
|
|
164
|
+
an_object.map { |it| GoodData::Helpers.deep_dup(it) }
|
|
165
|
+
when Hash
|
|
166
|
+
an_object.each_with_object(an_object.dup) do |(key, value), hash|
|
|
167
|
+
hash[GoodData::Helpers.deep_dup(key)] = GoodData::Helpers.deep_dup(value)
|
|
168
|
+
end
|
|
169
|
+
when Object
|
|
170
|
+
an_object.duplicable? ? an_object.dup : an_object
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
def undot(params)
|
|
175
|
+
# for each key-value config given
|
|
176
|
+
params.map do |k, v|
|
|
177
|
+
# dot notation to hash
|
|
178
|
+
k.split('__').reverse.reduce(v) do |memo, obj|
|
|
179
|
+
GoodData::Helper.DeepMergeableHash[{ obj => memo }]
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
def parse_http_exception(e)
|
|
185
|
+
JSON.parse(e.response)
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
# Creates a matrix with zeroes in all places. It is implemented as an Array of Arrays. First rows then columns.
|
|
189
|
+
#
|
|
190
|
+
# @param [Integer] m Number of rows
|
|
191
|
+
# @param [Integer] n Number of cols
|
|
192
|
+
# @param [Integer] val Alternatively can fill in positions with different values than zeroes. Defualt is zero.
|
|
193
|
+
# @return [Array<Array>] Returns a matrix of zeroes
|
|
194
|
+
def zeroes(m, n, val = 0)
|
|
195
|
+
m.times.map { n.times.map { val } }
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
# Turns a boolean or string 'true' into boolean. Useful for bricks.
|
|
199
|
+
#
|
|
200
|
+
# @param [Object] Something
|
|
201
|
+
# @return [Boolean] Returns true or false if the input is 'true' or true
|
|
202
|
+
def to_boolean(param)
|
|
203
|
+
param == 'true' || param == true ? true : false
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
# encrypts data with the given key. returns a binary data with the
|
|
207
|
+
# unhashed random iv in the first 16 bytes
|
|
208
|
+
def encrypt(data, key)
|
|
209
|
+
cipher = OpenSSL::Cipher::Cipher.new('aes-256-cbc')
|
|
210
|
+
cipher.encrypt
|
|
211
|
+
cipher.key = key = Digest::SHA256.digest(key)
|
|
212
|
+
random_iv = cipher.random_iv
|
|
213
|
+
cipher.iv = Digest::SHA256.digest(random_iv + key)[0..15]
|
|
214
|
+
encrypted = cipher.update(data)
|
|
215
|
+
encrypted << cipher.final
|
|
216
|
+
# add unhashed iv to front of encrypted data
|
|
217
|
+
|
|
218
|
+
Base64.encode64(random_iv + encrypted)
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
def decrypt(database64, key)
|
|
222
|
+
return '' if key.nil? || key.empty?
|
|
223
|
+
|
|
224
|
+
data = Base64.decode64(database64)
|
|
225
|
+
|
|
226
|
+
cipher = OpenSSL::Cipher::Cipher.new('aes-256-cbc')
|
|
227
|
+
cipher.decrypt
|
|
228
|
+
cipher.key = cipher_key = Digest::SHA256.digest(key)
|
|
229
|
+
random_iv = data[0..15] # extract iv from first 16 bytes
|
|
230
|
+
data = data[16..data.size - 1]
|
|
231
|
+
cipher.iv = Digest::SHA256.digest(random_iv + cipher_key)[0..15]
|
|
232
|
+
begin
|
|
233
|
+
decrypted = cipher.update(data)
|
|
234
|
+
decrypted << cipher.final
|
|
235
|
+
rescue
|
|
236
|
+
puts 'Error'
|
|
237
|
+
return nil
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
decrypted
|
|
241
|
+
end
|
|
242
|
+
end
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
class << self
|
|
246
|
+
def get_client(opts)
|
|
247
|
+
client = opts[:client]
|
|
248
|
+
fail ArgumentError, 'No :client specified' if client.nil?
|
|
249
|
+
|
|
250
|
+
client
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
def get_client_and_project(opts)
|
|
254
|
+
client = opts[:client]
|
|
255
|
+
fail ArgumentError, 'No :client specified' if client.nil?
|
|
256
|
+
|
|
257
|
+
p = opts[:project]
|
|
258
|
+
fail ArgumentError, 'No :project specified' if p.nil?
|
|
259
|
+
|
|
260
|
+
project = GoodData::Project[p, opts]
|
|
261
|
+
fail ArgumentError, 'Wrong :project specified' if project.nil?
|
|
262
|
+
|
|
263
|
+
[client, project]
|
|
264
|
+
end
|
|
265
|
+
end
|
|
266
|
+
end
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
#
|
|
3
|
+
# Copyright (c) 2010-2017 GoodData Corporation. All rights reserved.
|
|
4
|
+
# This source code is licensed under the BSD-style license found in the
|
|
5
|
+
# LICENSE file in the root directory of this source tree.
|
|
6
|
+
|
|
7
|
+
module GoodData
|
|
8
|
+
module Helpers
|
|
9
|
+
ENCODED_PARAMS_KEY = 'gd_encoded_params'
|
|
10
|
+
ENCODED_HIDDEN_PARAMS_KEY = 'gd_encoded_hidden_params'
|
|
11
|
+
|
|
12
|
+
class << self
|
|
13
|
+
# Encodes parameters for passing them to GD execution platform.
|
|
14
|
+
# Core types are kept and complex types (arrays, structures, etc) are
|
|
15
|
+
# JSON encoded into key hash "gd_encoded_params" or
|
|
16
|
+
# "gd_encoded_hidden_params", depending on the 'hidden' method param.
|
|
17
|
+
# The two different keys are used because the params and hidden params
|
|
18
|
+
# are merged by the platform and if we use the same key,
|
|
19
|
+
# the param would be overwritten.
|
|
20
|
+
#
|
|
21
|
+
# Core types are following:
|
|
22
|
+
# - Boolean (true, false)
|
|
23
|
+
# - Fixnum
|
|
24
|
+
# - Float
|
|
25
|
+
# - Nil
|
|
26
|
+
# - String
|
|
27
|
+
#
|
|
28
|
+
# @param [Hash] params Parameters to be encoded
|
|
29
|
+
# @return [Hash] Encoded parameters
|
|
30
|
+
def encode_params(params, data_key)
|
|
31
|
+
res = {}
|
|
32
|
+
nested = {}
|
|
33
|
+
core_types = [FalseClass, Integer, Float, NilClass, TrueClass, String]
|
|
34
|
+
params.each do |k, v|
|
|
35
|
+
if core_types.include?(v.class)
|
|
36
|
+
res[k] = v
|
|
37
|
+
else
|
|
38
|
+
nested[k] = v
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
res[data_key] = nested.to_json unless nested.empty?
|
|
42
|
+
res
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Encodes public parameters for passing them to GD execution platform.
|
|
46
|
+
# @param [Hash] params Parameters to be encoded
|
|
47
|
+
# @return [Hash] Encoded parameters
|
|
48
|
+
def encode_public_params(params)
|
|
49
|
+
encode_params(params, ENCODED_PARAMS_KEY)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Encodes hidden parameters for passing them to GD execution platform.
|
|
53
|
+
# @param [Hash] params Parameters to be encoded
|
|
54
|
+
# @return [Hash] Encoded parameters
|
|
55
|
+
def encode_hidden_params(params)
|
|
56
|
+
encode_params(params, ENCODED_HIDDEN_PARAMS_KEY)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Decodes params as they came from the platform.
|
|
60
|
+
# @params Parameter hash need to be decoded
|
|
61
|
+
# @option options [Boolean] :resolve_reference_params Resolve reference parameters in gd_encoded_params or not
|
|
62
|
+
# @return [Hash] Decoded parameters
|
|
63
|
+
def decode_params(params, options = {})
|
|
64
|
+
key = ENCODED_PARAMS_KEY.to_s
|
|
65
|
+
hidden_key = ENCODED_HIDDEN_PARAMS_KEY.to_s
|
|
66
|
+
data_params = params[key] || '{}'
|
|
67
|
+
hidden_data_params = if params.key?(hidden_key) && params[hidden_key].nil?
|
|
68
|
+
"{\"#{hidden_key}\" : null}"
|
|
69
|
+
elsif params.key?(hidden_key)
|
|
70
|
+
params[hidden_key]
|
|
71
|
+
else
|
|
72
|
+
'{}'
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
reference_values = []
|
|
76
|
+
# Replace reference parameters by the actual values. Use backslash to escape a reference parameter, e.g: \${not_a_param},
|
|
77
|
+
# the ${not_a_param} will not be replaced
|
|
78
|
+
if options[:resolve_reference_params]
|
|
79
|
+
data_params, reference_values = resolve_reference_params(data_params, params)
|
|
80
|
+
hidden_data_params, = resolve_reference_params(hidden_data_params, params)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
begin
|
|
84
|
+
parsed_data_params = data_params.is_a?(Hash) ? data_params : JSON.parse(data_params)
|
|
85
|
+
rescue JSON::ParserError => exception
|
|
86
|
+
reason = exception.message
|
|
87
|
+
reference_values.each { |secret_value| reason.gsub!("\"#{secret_value}\"", '"***"') }
|
|
88
|
+
raise exception.class, "Error reading json from '#{key}', reason: #{reason}"
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
begin
|
|
92
|
+
parsed_hidden_data_params = hidden_data_params.is_a?(Hash) ? hidden_data_params : JSON.parse(hidden_data_params)
|
|
93
|
+
rescue JSON::ParserError => exception
|
|
94
|
+
raise exception.class, "Error reading json from '#{hidden_key}'"
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# Add the nil on ENCODED_HIDDEN_PARAMS_KEY
|
|
98
|
+
# if the data was retrieved from API You will not have the actual values so encode -> decode is not losless. The nil on the key prevents the server from deleting the key
|
|
99
|
+
parsed_hidden_data_params[ENCODED_HIDDEN_PARAMS_KEY] = nil unless parsed_hidden_data_params.empty?
|
|
100
|
+
|
|
101
|
+
params.delete(key)
|
|
102
|
+
params.delete(hidden_key)
|
|
103
|
+
params = params.deep_merge(parsed_data_params).deep_merge(parsed_hidden_data_params)
|
|
104
|
+
|
|
105
|
+
if options[:convert_pipe_delimited_params]
|
|
106
|
+
convert_pipe_delimited_params = lambda do |args|
|
|
107
|
+
args = args.select { |k, _| k.include? "|" }
|
|
108
|
+
lines = args.keys.map do |k|
|
|
109
|
+
hash = {}
|
|
110
|
+
last_a = nil
|
|
111
|
+
last_e = nil
|
|
112
|
+
k.split("|").reduce(hash) do |a, e|
|
|
113
|
+
last_a = a
|
|
114
|
+
last_e = e
|
|
115
|
+
a[e] = {}
|
|
116
|
+
end
|
|
117
|
+
last_a[last_e] = args[k]
|
|
118
|
+
hash
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
lines.reduce({}) do |a, e|
|
|
122
|
+
a.deep_merge(e)
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
pipe_delimited_params = convert_pipe_delimited_params.call(params)
|
|
127
|
+
params.delete_if do |k, _|
|
|
128
|
+
k.include?('|')
|
|
129
|
+
end
|
|
130
|
+
params = params.deep_merge(pipe_delimited_params)
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
params
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
# A helper which allows you to diff two lists of objects. The objects
|
|
137
|
+
# can be arbitrary objects as long as they respond to to_hash because
|
|
138
|
+
# the diff is eventually done on hashes. It allows you to specify
|
|
139
|
+
# several options to allow you to limit on what the sameness test is done
|
|
140
|
+
#
|
|
141
|
+
# @param [Array<Object>] old_list List of objects that serves as a base for comparison
|
|
142
|
+
# @param [Array<Object>] new_list List of objects that is compared agianst the old_list
|
|
143
|
+
# @return [Hash] A structure that contains the result of the comparison. There are
|
|
144
|
+
# four keys.
|
|
145
|
+
# :added contains the list that are in new_list but were not in the old_list
|
|
146
|
+
# :added contains the list that are in old_list but were not in the new_list
|
|
147
|
+
# :same contains objects that are in both lists and they are the same
|
|
148
|
+
# :changed contains list of objects that changed along ith original, the new one
|
|
149
|
+
# and the list of changes
|
|
150
|
+
def diff(old_list, new_list, options = {})
|
|
151
|
+
old_list = old_list.map(&:to_hash)
|
|
152
|
+
new_list = new_list.map(&:to_hash)
|
|
153
|
+
|
|
154
|
+
fields = options[:fields]
|
|
155
|
+
lookup_key = options[:key]
|
|
156
|
+
|
|
157
|
+
old_lookup = Hash[old_list.map { |v| [v[lookup_key], v] }]
|
|
158
|
+
|
|
159
|
+
res = {
|
|
160
|
+
:added => [],
|
|
161
|
+
:removed => [],
|
|
162
|
+
:changed => [],
|
|
163
|
+
:same => []
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
new_list.each do |new_obj|
|
|
167
|
+
old_obj = old_lookup[new_obj[lookup_key]]
|
|
168
|
+
if old_obj.nil?
|
|
169
|
+
res[:added] << new_obj
|
|
170
|
+
next
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
if fields
|
|
174
|
+
sliced_old_obj = old_obj.slice(*fields)
|
|
175
|
+
sliced_new_obj = new_obj.slice(*fields)
|
|
176
|
+
else
|
|
177
|
+
sliced_old_obj = old_obj
|
|
178
|
+
sliced_new_obj = new_obj
|
|
179
|
+
end
|
|
180
|
+
if sliced_old_obj != sliced_new_obj
|
|
181
|
+
difference = sliced_new_obj.to_a - sliced_old_obj.to_a
|
|
182
|
+
differences = Hash[*difference.mapcat { |x| x }]
|
|
183
|
+
res[:changed] << {
|
|
184
|
+
old_obj: old_obj,
|
|
185
|
+
new_obj: new_obj,
|
|
186
|
+
diff: differences
|
|
187
|
+
}
|
|
188
|
+
else
|
|
189
|
+
res[:same] << old_obj
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
new_lookup = Hash[new_list.map { |v| [v[lookup_key], v] }]
|
|
194
|
+
old_list.each do |old_obj|
|
|
195
|
+
new_obj = new_lookup[old_obj[lookup_key]]
|
|
196
|
+
if new_obj.nil?
|
|
197
|
+
res[:removed] << old_obj
|
|
198
|
+
next
|
|
199
|
+
end
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
res
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
def create_lookup(collection, on)
|
|
206
|
+
lookup = {}
|
|
207
|
+
if on.is_a?(Array)
|
|
208
|
+
collection.each do |e|
|
|
209
|
+
key = e.values_at(*on)
|
|
210
|
+
lookup[key] = [] unless lookup.key?(key)
|
|
211
|
+
lookup[key] << e
|
|
212
|
+
end
|
|
213
|
+
else
|
|
214
|
+
collection.each do |e|
|
|
215
|
+
key = e[on]
|
|
216
|
+
lookup[key] = [] unless lookup.key?(key)
|
|
217
|
+
lookup[key] << e
|
|
218
|
+
end
|
|
219
|
+
end
|
|
220
|
+
lookup
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
def stringify_values(value)
|
|
224
|
+
case value
|
|
225
|
+
when nil
|
|
226
|
+
value
|
|
227
|
+
when Hash
|
|
228
|
+
Hash[
|
|
229
|
+
value.map do |k, v|
|
|
230
|
+
[k, stringify_values(v)]
|
|
231
|
+
end
|
|
232
|
+
]
|
|
233
|
+
when Array
|
|
234
|
+
value.map do |v|
|
|
235
|
+
stringify_values(v)
|
|
236
|
+
end
|
|
237
|
+
else
|
|
238
|
+
value.to_s
|
|
239
|
+
end
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
private
|
|
243
|
+
|
|
244
|
+
def resolve_reference_params(data_params, params)
|
|
245
|
+
reference_values = []
|
|
246
|
+
regexps = Regexp.union(/\\\\/, /\\\$/, /\$\{(\w+)\}/)
|
|
247
|
+
resolve_reference = lambda do |v|
|
|
248
|
+
if v.is_a? Hash
|
|
249
|
+
Hash[
|
|
250
|
+
v.map do |k, v2|
|
|
251
|
+
[k, resolve_reference.call(v2)]
|
|
252
|
+
end
|
|
253
|
+
]
|
|
254
|
+
elsif v.is_a? Array
|
|
255
|
+
v.map do |v2|
|
|
256
|
+
resolve_reference.call(v2)
|
|
257
|
+
end
|
|
258
|
+
elsif !v.is_a?(String)
|
|
259
|
+
v
|
|
260
|
+
else
|
|
261
|
+
v.gsub(regexps) do |match|
|
|
262
|
+
if match =~ /\\\\/
|
|
263
|
+
data_params.is_a?(Hash) ? '\\' : '\\\\' # rubocop: disable Metrics/BlockNesting
|
|
264
|
+
elsif match =~ /\\\$/
|
|
265
|
+
'$'
|
|
266
|
+
elsif match =~ /\$\{(\w+)\}/
|
|
267
|
+
val = params["#{$1}"]
|
|
268
|
+
if val
|
|
269
|
+
reference_values << val
|
|
270
|
+
val
|
|
271
|
+
else
|
|
272
|
+
GoodData.logger.warn "Reference '#{$1}' is not found!"
|
|
273
|
+
match
|
|
274
|
+
end
|
|
275
|
+
end
|
|
276
|
+
end
|
|
277
|
+
end
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
data_params = if data_params.is_a? Hash
|
|
281
|
+
Hash[data_params.map do |k, v|
|
|
282
|
+
[k, resolve_reference.call(v)]
|
|
283
|
+
end]
|
|
284
|
+
else
|
|
285
|
+
resolve_reference.call(data_params)
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
[data_params, reference_values]
|
|
289
|
+
end
|
|
290
|
+
end
|
|
291
|
+
end
|
|
292
|
+
end
|