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,15 @@
|
|
|
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
|
+
class Numeric
|
|
8
|
+
# Numbers are not duplicable:
|
|
9
|
+
#
|
|
10
|
+
# 3.duplicable? # => false
|
|
11
|
+
# 3.dup # => TypeError: can't dup Fixnum
|
|
12
|
+
def duplicable?
|
|
13
|
+
false
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
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
|
+
class Object
|
|
8
|
+
class << self
|
|
9
|
+
def set_const(name, val)
|
|
10
|
+
send(:remove_const, name) if const_defined?(name)
|
|
11
|
+
send(:const_set, name, val)
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def blank?
|
|
16
|
+
respond_to?(:empty?) ? empty? : !self
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def duplicable?
|
|
20
|
+
true
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def set_const(name, val)
|
|
24
|
+
send(:remove_const, name) if const_defined?(name)
|
|
25
|
+
send(:const_set, name, val)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def to_b
|
|
29
|
+
false
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
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
|
+
class Symbol
|
|
8
|
+
# Symbols are not duplicable:
|
|
9
|
+
#
|
|
10
|
+
# :my_symbol.duplicable? # => false
|
|
11
|
+
# :my_symbol.dup # => TypeError: can't dup Symbol
|
|
12
|
+
def duplicable?
|
|
13
|
+
false
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
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
|
+
class TrueClass
|
|
8
|
+
# +true+ is not duplicable:
|
|
9
|
+
#
|
|
10
|
+
# true.duplicable? # => false
|
|
11
|
+
# true.dup # => TypeError: can't dup TrueClass
|
|
12
|
+
def duplicable?
|
|
13
|
+
false
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def to_b
|
|
17
|
+
true
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def to_i
|
|
21
|
+
1
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
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 'csv'
|
|
8
|
+
|
|
9
|
+
module GoodData
|
|
10
|
+
module Extract
|
|
11
|
+
class CsvFile
|
|
12
|
+
def initialize(file)
|
|
13
|
+
@file = file
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def read(&block)
|
|
17
|
+
CSV.open @file, 'r', &block
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,160 @@
|
|
|
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 SmallGoodZilla
|
|
9
|
+
class << self
|
|
10
|
+
# Scans the provided MAQL and returns Array pairs of [attribute, element] pairs for each element that is found in the definition
|
|
11
|
+
# @param maql Input MAQL string
|
|
12
|
+
# @return [Array<Array>] Pairs [attribute, attribute_element]
|
|
13
|
+
def extract_element_uri_pairs(maql)
|
|
14
|
+
arr = maql.scan(%r{(\/gdc\/(?:projects|md)\/[a-zA-Z\d]+\/obj\/\d+)\/elements\?id=(\d+)}).flatten
|
|
15
|
+
evens = arr.select.each_with_index { |_, i| i.even? }
|
|
16
|
+
odds = arr.select.each_with_index { |_, i| i.odd? }.map(&:to_i)
|
|
17
|
+
evens.zip(odds)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Scans the provided MAQL and returns Array of all the URIs included in the MAQL. This basically return anything that is enclosed in aquare brackets []
|
|
21
|
+
# @param maql Input MAQL string
|
|
22
|
+
# @return [Array<String>] Pairs of URIs
|
|
23
|
+
def get_uris(a_maql_string)
|
|
24
|
+
a_maql_string.scan(/\[([^\"\]]+)\]/).flatten.uniq
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Get IDs from extendedMAQL string
|
|
28
|
+
# @param a_maql_string Input MAQL string
|
|
29
|
+
# @return [Array<String>] List of IDS
|
|
30
|
+
def get_ids(a_maql_string)
|
|
31
|
+
a_maql_string.scan(/!\[([^\"\]]+)\]/).flatten.uniq
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Get Facts from extendedMAQL string
|
|
35
|
+
# @param a_maql_string Input MAQL string
|
|
36
|
+
# @return [Array<String>] List of Facts
|
|
37
|
+
def get_facts(a_maql_string)
|
|
38
|
+
a_maql_string.scan(/#\"([^\"]+)\"/).flatten
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Get Attributes from extendedMAQL string
|
|
42
|
+
# @param a_maql_string Input MAQL string
|
|
43
|
+
# @return [Array<String>] List of Attributes
|
|
44
|
+
def get_attributes(a_maql_string)
|
|
45
|
+
a_maql_string.scan(/@\"([^\"]+)\"/).flatten
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Get Metrics from extendedMAQL string
|
|
49
|
+
# @param a_maql_string Input MAQL string
|
|
50
|
+
# @return [Array<String>] List of Metrics
|
|
51
|
+
def get_metrics(a_maql_string)
|
|
52
|
+
a_maql_string.scan(/\?"([^\"]+)\"/).flatten
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
alias_method :get_measures, :get_metrics
|
|
56
|
+
|
|
57
|
+
# Method takes a specification of the attribute filter (category filter) and returns it representation that is
|
|
58
|
+
# suitable for posting on the API. The spec is expected to be an array. First object can be an attribute (id, obj_id or
|
|
59
|
+
# directly an object). Alternativel it can be an attribute (again any representation should work). In case of attribute
|
|
60
|
+
# primary label is taken. The rest of the array are expected to be String represenation of values of particular label.
|
|
61
|
+
#
|
|
62
|
+
# For example it could look like
|
|
63
|
+
# ['label.states.name', 'California', 'New Jersey', 'Kansas']
|
|
64
|
+
#
|
|
65
|
+
# @param spec [Array<Object>] Input MAQL string
|
|
66
|
+
# @return [Array<Hash>] List of Metrics
|
|
67
|
+
def create_category_filter(spec, project)
|
|
68
|
+
item = project.objects(spec.first)
|
|
69
|
+
label = item.is_a?(GoodData::Attribute) ? item.primary_label : item
|
|
70
|
+
col = spec[1..-1].flat_map do |v|
|
|
71
|
+
case v
|
|
72
|
+
when Range
|
|
73
|
+
v.to_a
|
|
74
|
+
when Symbol
|
|
75
|
+
[v]
|
|
76
|
+
else
|
|
77
|
+
[v.to_s]
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
if col.first == :not
|
|
81
|
+
values = col[1..-1].map { |v| label.find_value_uri(v) }
|
|
82
|
+
elements = values.map { |v| "[#{v}]" }.join(', ')
|
|
83
|
+
{ expression: "[#{label.attribute.uri}] NOT IN (#{elements})" }
|
|
84
|
+
else
|
|
85
|
+
values = col.map { |v| label.find_value_uri(v) }
|
|
86
|
+
elements = values.map { |v| "[#{v}]" }.join(', ')
|
|
87
|
+
{ expression: "[#{label.attribute.uri}] IN (#{elements})" }
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Pretty prints the MAQL expression. This basically means it finds out names of objects and elements and print their values instead of URIs
|
|
92
|
+
# @param expression [String] Expression to be beautified
|
|
93
|
+
# @return [String] Pretty printed MAQL expression
|
|
94
|
+
def pretty_print(expression, opts = { client: GoodData.connection, project: GoodData.project })
|
|
95
|
+
temp = expression.dup
|
|
96
|
+
pairs = get_uris(expression).pmap do |uri|
|
|
97
|
+
if uri =~ /elements/
|
|
98
|
+
begin
|
|
99
|
+
['element', uri, Attribute.find_element_value(uri, opts)]
|
|
100
|
+
rescue AttributeElementNotFound
|
|
101
|
+
['element', uri, '(empty value)']
|
|
102
|
+
end
|
|
103
|
+
else
|
|
104
|
+
['object', uri, GoodData::MdObject[uri, opts].title]
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
pairs.sort_by! { |p| p[0] }
|
|
108
|
+
pairs.each do |el|
|
|
109
|
+
uri = el[1]
|
|
110
|
+
obj = el[2]
|
|
111
|
+
temp.gsub!(uri, obj)
|
|
112
|
+
end
|
|
113
|
+
temp
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def interpolate(values, dictionaries)
|
|
117
|
+
{
|
|
118
|
+
:facts => interpolate_values(values[:facts], dictionaries[:facts]),
|
|
119
|
+
:attributes => interpolate_values(values[:attributes], dictionaries[:attributes]),
|
|
120
|
+
:metrics => interpolate_values(values[:metrics], dictionaries[:metrics])
|
|
121
|
+
}
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def interpolate_ids(options, *ids)
|
|
125
|
+
ids = ids.flatten
|
|
126
|
+
if ids.empty?
|
|
127
|
+
[]
|
|
128
|
+
else
|
|
129
|
+
res = GoodData::MdObject.identifier_to_uri(options, *ids)
|
|
130
|
+
fail 'Not all of the identifiers were resolved' if Array(res).size != ids.size
|
|
131
|
+
res
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def interpolate_values(keys, values)
|
|
136
|
+
x = values.values_at(*keys)
|
|
137
|
+
keys.zip(x)
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def interpolate_metric(metric, dictionary, options = { :client => GoodData.connection, :project => GoodData.project })
|
|
141
|
+
interpolated = interpolate({
|
|
142
|
+
:facts => GoodData::SmallGoodZilla.get_facts(metric),
|
|
143
|
+
:attributes => GoodData::SmallGoodZilla.get_attributes(metric),
|
|
144
|
+
:metrics => GoodData::SmallGoodZilla.get_metrics(metric)
|
|
145
|
+
}, dictionary)
|
|
146
|
+
|
|
147
|
+
ids = GoodData::SmallGoodZilla.get_ids(metric)
|
|
148
|
+
interpolated_ids = ids.zip(Array(interpolate_ids(options, ids)))
|
|
149
|
+
|
|
150
|
+
metric = interpolated[:facts].reduce(metric) { |acc, elem| acc.sub("#\"#{elem[0]}\"", "[#{elem[1]}]") }
|
|
151
|
+
metric = interpolated[:attributes].reduce(metric) { |acc, elem| acc.sub("@\"#{elem[0]}\"", "[#{elem[1]}]") }
|
|
152
|
+
metric = interpolated[:metrics].reduce(metric) { |acc, elem| acc.sub("?\"#{elem[0]}\"", "[#{elem[1]}]") }
|
|
153
|
+
metric = interpolated_ids.reduce(metric) { |acc, elem| acc.gsub("![#{elem[0]}]", "[#{elem[1]}]") }
|
|
154
|
+
metric
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
alias_method :interpolate_measure, :interpolate_metric
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
end
|
|
@@ -0,0 +1,75 @@
|
|
|
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 'fileutils'
|
|
8
|
+
require 'json'
|
|
9
|
+
|
|
10
|
+
require_relative 'global_helpers'
|
|
11
|
+
|
|
12
|
+
module GoodData
|
|
13
|
+
module Helpers
|
|
14
|
+
module AuthHelper
|
|
15
|
+
class << self
|
|
16
|
+
# Get path of .gooddata config
|
|
17
|
+
def credentials_file
|
|
18
|
+
"#{Helpers.home_directory}/.gooddata"
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Read credentials
|
|
22
|
+
def read_credentials(credentials_file_path = credentials_file)
|
|
23
|
+
if File.exist?(credentials_file_path)
|
|
24
|
+
config = File.read(credentials_file_path)
|
|
25
|
+
MultiJson.load(config, :symbolize_keys => true)
|
|
26
|
+
else
|
|
27
|
+
{}
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Try read environemnt
|
|
32
|
+
#
|
|
33
|
+
# Tries to read it from ~/.gooddata file or from environment variable GD_SERVER
|
|
34
|
+
# @param [String] credentials_file_path (credentials_file) Path to .gooddata file
|
|
35
|
+
# @return [String] server token from environment variable, .gooddata or nil
|
|
36
|
+
def read_environment(credentials_file_path = credentials_file)
|
|
37
|
+
goodfile = read_credentials(credentials_file_path)
|
|
38
|
+
[ENV['GD_ENVIRONMENT'], goodfile[:environment], GoodData::Project::DEFAULT_ENVIRONMENT].find { |x| !x.nil? && !x.empty? }
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Try read server
|
|
42
|
+
#
|
|
43
|
+
# Tries to read it from ~/.gooddata file or from environment variable GD_SERVER
|
|
44
|
+
# @param [String] credentials_file_path (credentials_file) Path to .gooddata file
|
|
45
|
+
# @return [String] server token from environment variable, .gooddata or DEFAULT_URL
|
|
46
|
+
def read_server(credentials_file_path = credentials_file)
|
|
47
|
+
goodfile = read_credentials(credentials_file_path)
|
|
48
|
+
[ENV['GD_SERVER'], goodfile[:server], GoodData::Rest::Connection::DEFAULT_URL].find { |x| !x.nil? && !x.empty? }
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Try read token
|
|
52
|
+
#
|
|
53
|
+
# Tries to read it from ~/.gooddata file or from environment variable GD_PROJECT_TOKEN
|
|
54
|
+
# @param [String] credentials_file_path (credentials_file) Path to .gooddata file
|
|
55
|
+
# @return [String] auth token from environment variable, .gooddata or nil
|
|
56
|
+
def read_token(credentials_file_path = credentials_file)
|
|
57
|
+
goodfile = read_credentials(credentials_file_path)
|
|
58
|
+
[ENV['GD_PROJECT_TOKEN'], goodfile[:auth_token], goodfile[:token]].find { |x| !x.nil? && !x.empty? }
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Writes credentials
|
|
62
|
+
def write_credentials(credentials, credentials_file_path = credentials_file)
|
|
63
|
+
File.open(credentials_file_path, 'w', 0o600) do |f|
|
|
64
|
+
f.puts JSON.pretty_generate(credentials)
|
|
65
|
+
end
|
|
66
|
+
credentials
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def remove_credentials_file(credentials_file_path = credentials_file)
|
|
70
|
+
FileUtils.rm_f(credentials_file_path)
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
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 'csv'
|
|
8
|
+
|
|
9
|
+
module GoodData
|
|
10
|
+
module Helpers
|
|
11
|
+
class Csv
|
|
12
|
+
class << self
|
|
13
|
+
# Read data from CSV
|
|
14
|
+
#
|
|
15
|
+
# @param [Hash] opts
|
|
16
|
+
# @option opts [String] :path File to read data from
|
|
17
|
+
# @option opts [Boolean] :header File to read data from
|
|
18
|
+
# @return Array of rows with loaded data
|
|
19
|
+
def read(opts)
|
|
20
|
+
path = opts[:path]
|
|
21
|
+
res = []
|
|
22
|
+
|
|
23
|
+
line = 0
|
|
24
|
+
|
|
25
|
+
CSV.foreach(path) do |row|
|
|
26
|
+
line += 1
|
|
27
|
+
next if opts[:header] && line == 1
|
|
28
|
+
|
|
29
|
+
if block_given?
|
|
30
|
+
data = yield row
|
|
31
|
+
else
|
|
32
|
+
data = row
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
res << data if data
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
res
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Write data to CSV
|
|
42
|
+
# @option opts [String] :path File to write data to
|
|
43
|
+
# @option opts [Array] :data Mandatory array of data to write
|
|
44
|
+
# @option opts [String] :header Optional Header row
|
|
45
|
+
def write(opts, &_block)
|
|
46
|
+
path = opts[:path]
|
|
47
|
+
header = opts[:header]
|
|
48
|
+
data = opts[:data]
|
|
49
|
+
|
|
50
|
+
CSV.open(path, 'w') do |csv|
|
|
51
|
+
csv << header unless header.nil?
|
|
52
|
+
data.each do |entry|
|
|
53
|
+
res = yield entry
|
|
54
|
+
csv << res if res
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,129 @@
|
|
|
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 'csv'
|
|
8
|
+
require 'digest'
|
|
9
|
+
require 'open-uri'
|
|
10
|
+
|
|
11
|
+
module GoodData
|
|
12
|
+
module Helpers
|
|
13
|
+
class DataSource
|
|
14
|
+
attr_reader :realized
|
|
15
|
+
|
|
16
|
+
class << self
|
|
17
|
+
def interpolate_sql_params(query, params)
|
|
18
|
+
keys = query.scan(/\$\{([^\{]+)\}/).flatten
|
|
19
|
+
keys.reduce(query) do |a, e|
|
|
20
|
+
key = e
|
|
21
|
+
raise "Param #{key} is not present in schedule params yet it is expected to be interpolated in the query" unless params.key?(key)
|
|
22
|
+
a.gsub("${#{key}}", params[key])
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def initialize(opts = {})
|
|
28
|
+
opts = opts.is_a?(String) ? { type: :staging, path: opts } : opts
|
|
29
|
+
opts = GoodData::Helpers.symbolize_keys(opts)
|
|
30
|
+
@source = opts[:type]
|
|
31
|
+
@options = opts
|
|
32
|
+
@realized = false
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def realize(params = {})
|
|
36
|
+
@realized = true
|
|
37
|
+
source = @source && @source.to_s
|
|
38
|
+
case source
|
|
39
|
+
when 'ads'
|
|
40
|
+
realize_query(params)
|
|
41
|
+
when 'staging'
|
|
42
|
+
realize_staging(params)
|
|
43
|
+
when 'web'
|
|
44
|
+
realize_link
|
|
45
|
+
when 's3'
|
|
46
|
+
realize_s3(params)
|
|
47
|
+
else
|
|
48
|
+
raise "DataSource does not support type \"#{source}\""
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def realized?
|
|
53
|
+
@realized == true
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
private
|
|
57
|
+
|
|
58
|
+
def realize_query(params)
|
|
59
|
+
query = DataSource.interpolate_sql_params(@options[:query], params)
|
|
60
|
+
dwh = params['ads_client'] || params[:ads_client] || raise("Data Source needs a client to ads to be able to query the storage but 'ads_client' is empty.")
|
|
61
|
+
filename = Digest::SHA256.new.hexdigest(query)
|
|
62
|
+
measure = Benchmark.measure do
|
|
63
|
+
CSV.open(filename, 'w') do |csv|
|
|
64
|
+
header_written = false
|
|
65
|
+
header = nil
|
|
66
|
+
dwh.execute_select(query) do |row|
|
|
67
|
+
unless header_written
|
|
68
|
+
header_written = true
|
|
69
|
+
header = row.keys
|
|
70
|
+
csv << header
|
|
71
|
+
end
|
|
72
|
+
csv << row.values_at(*header)
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
GoodData.logger.info "Realizing SQL query \"#{query}\" took #{measure.real}"
|
|
77
|
+
filename
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def realize_staging(params)
|
|
81
|
+
path = @options[:path]
|
|
82
|
+
url = URI.parse(path)
|
|
83
|
+
filename = Digest::SHA256.new.hexdigest(path)
|
|
84
|
+
if url.relative?
|
|
85
|
+
params['gdc_project'].download_file(path, filename)
|
|
86
|
+
else
|
|
87
|
+
params['GDC_GD_CLIENT'].download_file(path, filename)
|
|
88
|
+
end
|
|
89
|
+
filename
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def realize_link
|
|
93
|
+
link = @options[:url]
|
|
94
|
+
filename = Digest::SHA256.new.hexdigest(link)
|
|
95
|
+
measure = Benchmark.measure do
|
|
96
|
+
File.open(filename, 'w') do |f|
|
|
97
|
+
open(link) { |rf| f.write(rf.read) }
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
GoodData.logger.info("Realizing web download from \"#{link}\" took #{measure.real}")
|
|
101
|
+
filename
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def realize_s3(params)
|
|
105
|
+
params = GoodData::Helpers.stringify_keys(params)
|
|
106
|
+
s3_client = params['aws_client'] && params['aws_client']['s3_client']
|
|
107
|
+
raise 'AWS client not present. Perhaps S3Middleware is missing in the brick definition?' if !s3_client || !s3_client.respond_to?(:bucket)
|
|
108
|
+
bucket_name = @options[:bucket]
|
|
109
|
+
key = @options[:key]
|
|
110
|
+
raise 'Key "bucket" is missing in S3 datasource' if bucket_name.blank?
|
|
111
|
+
raise 'Key "key" is missing in S3 datasource' if key.blank?
|
|
112
|
+
GoodData.logger.info("Realizing download from S3. Bucket #{bucket_name}, object with key #{key}.")
|
|
113
|
+
filename = Digest::SHA256.new.hexdigest(@options.to_json)
|
|
114
|
+
bucket = s3_client.bucket(bucket_name)
|
|
115
|
+
obj = bucket.object(key)
|
|
116
|
+
obj.get(response_target: filename, bucket: bucket_name, key: key)
|
|
117
|
+
s3_size = obj.size
|
|
118
|
+
actual_size = File.size(filename)
|
|
119
|
+
GoodData.logger.info("File size in S3: #{s3_size}")
|
|
120
|
+
GoodData.logger.info("Downloaded file size: #{actual_size}")
|
|
121
|
+
unless s3_size == actual_size
|
|
122
|
+
fail "Error downloading file #{key}. Expected size #{s3_size}, got #{actual_size}."
|
|
123
|
+
end
|
|
124
|
+
GoodData.logger.info('Done downloading file.')
|
|
125
|
+
filename
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
end
|