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,268 @@
|
|
|
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_relative '../metadata'
|
|
8
|
+
require_relative 'metadata'
|
|
9
|
+
|
|
10
|
+
module GoodData
|
|
11
|
+
class Report < GoodData::MdObject
|
|
12
|
+
include Mixin::Lockable
|
|
13
|
+
|
|
14
|
+
class << self
|
|
15
|
+
# Method intended to get all objects of that type in a specified project
|
|
16
|
+
#
|
|
17
|
+
# @param options [Hash] the options hash
|
|
18
|
+
# @option options [Boolean] :full if passed true the subclass can decide
|
|
19
|
+
# to pull in full objects. This is desirable from the usability POV
|
|
20
|
+
# but unfortunately has negative impact on performance so it is not
|
|
21
|
+
# the default.
|
|
22
|
+
# @return [Array<GoodData::MdObject> | Array<Hash>] Return the appropriate metadata objects or their representation
|
|
23
|
+
def all(options = { :client => GoodData.connection, :project => GoodData.project })
|
|
24
|
+
query('report', Report, options)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def create(options = { :client => GoodData.connection, :project => GoodData.project })
|
|
28
|
+
client, project = GoodData.get_client_and_project(options)
|
|
29
|
+
|
|
30
|
+
title = options[:title]
|
|
31
|
+
fail 'Report needs a title specified' unless title
|
|
32
|
+
summary = options[:summary] || ''
|
|
33
|
+
|
|
34
|
+
options_rd = options.dup
|
|
35
|
+
options_rd.delete(:identifier)
|
|
36
|
+
|
|
37
|
+
rd = options[:rd] || ReportDefinition.create(options_rd)
|
|
38
|
+
rd.save
|
|
39
|
+
|
|
40
|
+
report = {
|
|
41
|
+
'report' => {
|
|
42
|
+
'content' => {
|
|
43
|
+
'domains' => [],
|
|
44
|
+
'definitions' => [rd.uri]
|
|
45
|
+
},
|
|
46
|
+
'meta' => {
|
|
47
|
+
'tags' => '',
|
|
48
|
+
'deprecated' => '0',
|
|
49
|
+
'summary' => summary,
|
|
50
|
+
'title' => title
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
# TODO: write test for report definitions with explicit identifiers
|
|
55
|
+
report['report']['meta']['identifier'] = options[:identifier] if options[:identifier]
|
|
56
|
+
client.create(Report, report, :project => project)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def data_result(result, options = {})
|
|
60
|
+
client = options[:client]
|
|
61
|
+
data_result_uri = result['execResult']['dataResult']
|
|
62
|
+
begin
|
|
63
|
+
result = client.poll_on_response(data_result_uri, options) do |body|
|
|
64
|
+
body && body['taskState'] && body['taskState']['status'] == 'WAIT'
|
|
65
|
+
end
|
|
66
|
+
rescue RestClient::BadRequest => e
|
|
67
|
+
resp = JSON.parse(e.response)
|
|
68
|
+
if GoodData::Helpers.get_path(resp, %w(error component)) == 'MD::DataResult'
|
|
69
|
+
raise GoodData::UncomputableReport
|
|
70
|
+
else
|
|
71
|
+
raise e
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
if result.to_s.empty?
|
|
76
|
+
ReportDataResult.new(data: [], top: 0, left: 0)
|
|
77
|
+
else
|
|
78
|
+
ReportDataResult.from_xtab(result)
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Add a report definition to a report. This will show on a UI as a new version.
|
|
84
|
+
#
|
|
85
|
+
# @param report_definition [GoodData::ReportDefinition | String] Report definition to add. Either it can be a URI of a report definition or an actual report definition object.
|
|
86
|
+
# @return [GoodData::Report] Return self
|
|
87
|
+
def add_definition(report_definition)
|
|
88
|
+
rep_def = project.report_definitions(report_definition)
|
|
89
|
+
content['definitions'] = definition_uris << rep_def.uri
|
|
90
|
+
self
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# Add a report definition to a report. This will show on a UI as a new version.
|
|
94
|
+
#
|
|
95
|
+
# @param report_definition [GoodData::ReportDefinition | String] Report definition to add. Either it can be a URI of a report definition or an actual report definition object.
|
|
96
|
+
# @return [GoodData::Report] Return self
|
|
97
|
+
def add_definition!(report_definition)
|
|
98
|
+
res = add_definition(report_definition)
|
|
99
|
+
res.save
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# Returns the newest (current version) report definition as an object
|
|
103
|
+
#
|
|
104
|
+
# @return [GoodData::ReportDefinition] Returns the newest report defintion
|
|
105
|
+
def definition
|
|
106
|
+
project.report_definitions(latest_report_definition_uri)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
alias_method :latest_report_definition, :definition
|
|
110
|
+
|
|
111
|
+
# Returns the newest (current version) report definition uri
|
|
112
|
+
#
|
|
113
|
+
# @return [String] Returns uri of the newest report defintion
|
|
114
|
+
def definition_uri
|
|
115
|
+
definition_uris.last
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
alias_method :latest_report_definition_uri, :definition_uri
|
|
119
|
+
|
|
120
|
+
# Gets a report definitions (versions) of this report as objects.
|
|
121
|
+
#
|
|
122
|
+
# @return [Array<GoodData::ReportDefinition>] Returns list of report definitions. Oldest comes first
|
|
123
|
+
def definitions
|
|
124
|
+
content['definitions'].pmap { |uri| project.report_definitions(uri) }
|
|
125
|
+
end
|
|
126
|
+
alias_method :report_definitions, :definitions
|
|
127
|
+
|
|
128
|
+
# Gets list of uris of report definitions (versions) of this report.
|
|
129
|
+
#
|
|
130
|
+
# @return [Array<String>] Returns list of report definitions' uris. Oldest comes first
|
|
131
|
+
def definition_uris
|
|
132
|
+
content['definitions']
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
# Deletes report along with its report definitions.
|
|
136
|
+
#
|
|
137
|
+
# @return [GoodData::Report] Returns self
|
|
138
|
+
def delete
|
|
139
|
+
defs = definitions
|
|
140
|
+
super
|
|
141
|
+
defs.peach(&:delete)
|
|
142
|
+
self
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
# Computes the report and returns the result. If it is not computable returns nil.
|
|
146
|
+
#
|
|
147
|
+
# @option options [Time] :time Force the platform to simutale the result at this time
|
|
148
|
+
# @return [GoodData::DataResult] Returns the result
|
|
149
|
+
def execute(options = {})
|
|
150
|
+
time = options[:time]
|
|
151
|
+
|
|
152
|
+
report_req = { 'report' => uri }
|
|
153
|
+
report_req['timestamp'] = time.to_i if time
|
|
154
|
+
|
|
155
|
+
fail 'You have to save the report before executing. If you do not want to do that please use GoodData::ReportDefinition' unless saved?
|
|
156
|
+
result = client.post "/gdc/projects/#{project.pid}/execute", 'report_req' => report_req
|
|
157
|
+
GoodData::Report.data_result(result, options.merge(client: client))
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
# Returns true if you can export and object
|
|
161
|
+
#
|
|
162
|
+
# @return [Boolean] Returns whether the report is exportable
|
|
163
|
+
def exportable?
|
|
164
|
+
true
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
# Returns binary data of the exported report in a given format. The format can be
|
|
168
|
+
# either 'csv', 'xls', 'xlsx' or 'pdf'.
|
|
169
|
+
#
|
|
170
|
+
# @return [String] Returns data
|
|
171
|
+
def export(format, options = {})
|
|
172
|
+
result = client.post("/gdc/projects/#{project.pid}/execute", 'report_req' => { 'report' => uri })
|
|
173
|
+
result1 = client.post('/gdc/exporter/executor', :result_req => { :format => format, :result => result })
|
|
174
|
+
client.poll_on_code(result1['uri'], options.merge(process: false))
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
# Exports a report too large to be computed on the UI. It executes in raw form.
|
|
178
|
+
# Saves the result into file.
|
|
179
|
+
#
|
|
180
|
+
# @param filename [String] Filename to save into
|
|
181
|
+
# @return [Net::HTTPResponse] Returns HTTP status
|
|
182
|
+
def export_raw(filename)
|
|
183
|
+
result = client.post("/gdc/app/projects/#{project.pid}/execute/raw", 'report_req' => { 'report' => uri })
|
|
184
|
+
client.download(result['uri'], filename, url_encode: false)
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
# Returns the newest (current version) report definition uri
|
|
188
|
+
#
|
|
189
|
+
# @return [String] Returns uri of the newest report defintion
|
|
190
|
+
def purge_report_of_unused_definitions!
|
|
191
|
+
full_list = definition_uris
|
|
192
|
+
remove_definition_but_latest
|
|
193
|
+
purged_list = definition_uris
|
|
194
|
+
to_remove = full_list - purged_list
|
|
195
|
+
save
|
|
196
|
+
to_remove.each { |uri| client.delete(uri) }
|
|
197
|
+
self
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
# Removes definition from the report. The definition to remove can be passed in any form that is accepted by
|
|
201
|
+
# GoodData::ReportDefintion[]
|
|
202
|
+
#
|
|
203
|
+
# @param definition [String | GoodData::ReportDefinition] Report defintion to remove
|
|
204
|
+
# @return [GoodData::Report] Returns report with removed definition
|
|
205
|
+
def remove_definition(definition)
|
|
206
|
+
a_def = GoodData::ReportDefinition[definition, project: project, client: client]
|
|
207
|
+
def_uri = a_def.uri
|
|
208
|
+
content['definitions'] = definition_uris.reject { |x| x == def_uri }
|
|
209
|
+
self
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
# TODO: Cover with test. You would probably need something that will be able to create a report easily from a definition
|
|
213
|
+
# Removes all definitions but the latest from the report. This is useful for cleaning up before you create
|
|
214
|
+
# a template out of a project.
|
|
215
|
+
#
|
|
216
|
+
# @return [GoodData::Report] Returns report with removed definitions
|
|
217
|
+
def remove_definition_but_latest
|
|
218
|
+
to_remove = definition_uris - [latest_report_definition_uri]
|
|
219
|
+
to_remove.each do |uri|
|
|
220
|
+
remove_definition(uri)
|
|
221
|
+
end
|
|
222
|
+
self
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
# Method used for replacing values in their state according to mapping.
|
|
226
|
+
# Can be used to replace any values but it is typically used to replace
|
|
227
|
+
# the URIs. Returns a new object of the same type.
|
|
228
|
+
#
|
|
229
|
+
# @param [Array<Array>]Mapping specifying what should be exchanged for what. As mapping should be used output of GoodData::Helpers.prepare_mapping.
|
|
230
|
+
# @return [GoodData::Report]
|
|
231
|
+
def replace(mapping)
|
|
232
|
+
new_defs = definitions.map do |rep_def|
|
|
233
|
+
rep_def.replace(mapping)
|
|
234
|
+
end
|
|
235
|
+
new_defs.pmap(&:save)
|
|
236
|
+
self
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
## Update report definition and reflect the change in report
|
|
240
|
+
#
|
|
241
|
+
# @param [Hash] opts Options
|
|
242
|
+
# @option opts [Boolean] :new_definition (true) If true then new definition will be created
|
|
243
|
+
# @return [GoodData::ReportDefinition] Updated and saved report definition
|
|
244
|
+
def update_definition(opts = { :new_definition => true }, &block)
|
|
245
|
+
# TODO: Cache the latest report definition somehow
|
|
246
|
+
repdef = definition.dup
|
|
247
|
+
|
|
248
|
+
block.call(repdef, self) if block_given?
|
|
249
|
+
|
|
250
|
+
if opts[:new_definition]
|
|
251
|
+
new_def = GoodData::ReportDefinition.create(:client => client, :project => project)
|
|
252
|
+
|
|
253
|
+
rd = repdef.json['reportDefinition']
|
|
254
|
+
rd.delete('links')
|
|
255
|
+
%w(author uri created identifier updated contributor).each { |k| rd['meta'].delete(k) }
|
|
256
|
+
new_def.json['reportDefinition'] = rd
|
|
257
|
+
new_def.save
|
|
258
|
+
|
|
259
|
+
add_definition!(new_def)
|
|
260
|
+
return new_def
|
|
261
|
+
else
|
|
262
|
+
repdef.save
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
repdef
|
|
266
|
+
end
|
|
267
|
+
end
|
|
268
|
+
end
|
|
@@ -0,0 +1,272 @@
|
|
|
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_relative '../metadata'
|
|
8
|
+
require_relative 'metadata'
|
|
9
|
+
|
|
10
|
+
# GoodData Module
|
|
11
|
+
module GoodData
|
|
12
|
+
# Report Definition
|
|
13
|
+
# TODO: Add more doc ...
|
|
14
|
+
class ReportDefinition < GoodData::MdObject
|
|
15
|
+
class << self
|
|
16
|
+
# Method intended to get all objects of that type in a specified project
|
|
17
|
+
#
|
|
18
|
+
# @param options [Hash] the options hash
|
|
19
|
+
# @option options [Boolean] :full if passed true the subclass can decide
|
|
20
|
+
# to pull in full objects. This is desirable from the usability POV
|
|
21
|
+
# but unfortunately has negative impact on performance so it is not
|
|
22
|
+
# the default.
|
|
23
|
+
# @return [Array<GoodData::MdObject> | Array<Hash>] Return the appropriate metadata objects or their representation
|
|
24
|
+
def all(options = { :client => GoodData.connection, :project => GoodData.project })
|
|
25
|
+
query('reportDefinition', ReportDefinition, options)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def create_metrics_part(left, top)
|
|
29
|
+
stuff = Array(left) + Array(top)
|
|
30
|
+
stuff.select { |item| item.respond_to?(:metric?) && item.metric? }.map do |metric|
|
|
31
|
+
create_metric_part(metric)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
alias_method :create_measures_part, :create_metrics_part
|
|
36
|
+
|
|
37
|
+
def create_metric_part(metric)
|
|
38
|
+
{
|
|
39
|
+
'alias' => metric.title,
|
|
40
|
+
'uri' => metric.uri
|
|
41
|
+
}
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
alias_method :create_measure_part, :create_metric_part
|
|
45
|
+
|
|
46
|
+
def create_attribute_part(attrib)
|
|
47
|
+
{
|
|
48
|
+
'attribute' => {
|
|
49
|
+
'alias' => '',
|
|
50
|
+
'totals' => [],
|
|
51
|
+
'uri' => attrib.uri
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Method creates the list of filter representaion suitable for posting on
|
|
57
|
+
# the api. It can currently recognize 2 types of filters. Variable filters
|
|
58
|
+
# and attribute filters. Method for internal usage.
|
|
59
|
+
#
|
|
60
|
+
# @param filters [GoodData::Variable|Array<Array>]
|
|
61
|
+
# @param options [Hash] the options hash
|
|
62
|
+
# @return [Array<Hash>] Returns the structure that is stored internally in the report definition and later psted on the API
|
|
63
|
+
def create_filters_part(filters, options = {})
|
|
64
|
+
project = options[:project]
|
|
65
|
+
vars = filters.select { |f| f.is_a?(GoodData::Variable) }.map { |v| { expression: "[#{v.uri}]" } }
|
|
66
|
+
category = filters.select { |f| f.is_a?(Array) }.map { |v| GoodData::SmallGoodZilla.create_category_filter(v, project) }
|
|
67
|
+
vars + category
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def create_part(stuff)
|
|
71
|
+
stuff = Array(stuff)
|
|
72
|
+
parts = stuff.reduce([]) do |memo, item|
|
|
73
|
+
if item.respond_to?(:metric?) && item.metric?
|
|
74
|
+
memo
|
|
75
|
+
else
|
|
76
|
+
memo << create_attribute_part(item)
|
|
77
|
+
end
|
|
78
|
+
memo
|
|
79
|
+
end
|
|
80
|
+
if stuff.any? { |item| item.respond_to?(:metric?) && item.metric? }
|
|
81
|
+
parts << 'metricGroup'
|
|
82
|
+
end
|
|
83
|
+
parts
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def find(stuff, opts = { :client => GoodData.connection, :project => GoodData.project })
|
|
87
|
+
_client, project = GoodData.get_client_and_project(opts)
|
|
88
|
+
|
|
89
|
+
stuff.map do |item|
|
|
90
|
+
obj = if item.is_a?(String)
|
|
91
|
+
begin
|
|
92
|
+
project.objects(item)
|
|
93
|
+
rescue RestClient::ResourceNotFound
|
|
94
|
+
raise "Object given by id \"#{item}\" could not be found"
|
|
95
|
+
end
|
|
96
|
+
elsif item.is_a?(Hash) && item.keys.include?(:title)
|
|
97
|
+
case item[:type].to_s
|
|
98
|
+
when 'metric'
|
|
99
|
+
GoodData::Metric.find_first_by_title(item[:title], opts)
|
|
100
|
+
when 'attribute'
|
|
101
|
+
GoodData::Attribute.find_first_by_title(item[:title], opts)
|
|
102
|
+
end
|
|
103
|
+
elsif item.is_a?(Hash) && (item.keys.include?(:id) || item.keys.include?(:identifier))
|
|
104
|
+
id = item[:id] || item[:identifier]
|
|
105
|
+
case item[:type].to_s
|
|
106
|
+
when 'metric'
|
|
107
|
+
project.metrics(id)
|
|
108
|
+
when 'attribute'
|
|
109
|
+
project.attributes(id)
|
|
110
|
+
when 'label'
|
|
111
|
+
projects.labels(id)
|
|
112
|
+
end
|
|
113
|
+
else
|
|
114
|
+
item
|
|
115
|
+
end
|
|
116
|
+
if obj.respond_to?(:attribute?) && obj.attribute?
|
|
117
|
+
obj.display_forms.first
|
|
118
|
+
else
|
|
119
|
+
obj
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def execute(options = {})
|
|
125
|
+
left = Array(options[:left])
|
|
126
|
+
top = Array(options[:top])
|
|
127
|
+
|
|
128
|
+
metrics = (left + top).select { |item| item.respond_to?(:metric?) && item.metric? }
|
|
129
|
+
|
|
130
|
+
unsaved_metrics = metrics.reject(&:saved?)
|
|
131
|
+
unsaved_metrics.each { |m| m.title = 'Untitled metric' unless m.title }
|
|
132
|
+
|
|
133
|
+
begin
|
|
134
|
+
unsaved_metrics.each(&:save)
|
|
135
|
+
GoodData::ReportDefinition.create(options).execute
|
|
136
|
+
ensure
|
|
137
|
+
unsaved_metrics.each { |m| m.delete if m && m.saved? }
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def create(options = { :client => GoodData.connection, :project => GoodData.project })
|
|
142
|
+
client, project = GoodData.get_client_and_project(options)
|
|
143
|
+
|
|
144
|
+
left = Array(options[:left])
|
|
145
|
+
top = Array(options[:top])
|
|
146
|
+
filters = options[:filters] || []
|
|
147
|
+
|
|
148
|
+
left = ReportDefinition.find(left, options)
|
|
149
|
+
top = ReportDefinition.find(top, options)
|
|
150
|
+
|
|
151
|
+
# TODO: Put somewhere for i18n
|
|
152
|
+
fail_msg = 'All metrics in report definition must be saved'
|
|
153
|
+
fail fail_msg unless (left + top).all?(&:saved?)
|
|
154
|
+
|
|
155
|
+
pars = {
|
|
156
|
+
'reportDefinition' => {
|
|
157
|
+
'content' => {
|
|
158
|
+
'grid' => {
|
|
159
|
+
'sort' => {
|
|
160
|
+
'columns' => [],
|
|
161
|
+
'rows' => []
|
|
162
|
+
},
|
|
163
|
+
'columnWidths' => [],
|
|
164
|
+
'columns' => ReportDefinition.create_part(top),
|
|
165
|
+
'metrics' => ReportDefinition.create_metrics_part(left, top),
|
|
166
|
+
'rows' => ReportDefinition.create_part(left)
|
|
167
|
+
},
|
|
168
|
+
'format' => 'grid',
|
|
169
|
+
'filters' => ReportDefinition.create_filters_part(filters, :project => project)
|
|
170
|
+
},
|
|
171
|
+
'meta' => {
|
|
172
|
+
'tags' => '',
|
|
173
|
+
'summary' => '',
|
|
174
|
+
'title' => 'Untitled report definition'
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
# TODO: write test for report definitions with explicit identifiers
|
|
179
|
+
pars['reportDefinition']['meta']['identifier'] = options[:identifier] if options[:identifier]
|
|
180
|
+
|
|
181
|
+
client.create(ReportDefinition, pars, :project => project)
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
def attribute_parts
|
|
186
|
+
cols = content['grid']['columns'] || []
|
|
187
|
+
rows = content['grid']['rows'] || []
|
|
188
|
+
items = cols + rows
|
|
189
|
+
items.select { |item| item.is_a?(Hash) && item.keys.first == 'attribute' }
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
def attributes
|
|
193
|
+
labels.map(&:attribute)
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
# Removes the color mapping from report definition
|
|
197
|
+
#
|
|
198
|
+
# @return [GoodData::ReportDefinition] Returns self
|
|
199
|
+
def reset_color_mapping!
|
|
200
|
+
global_chart_options = GoodData::Helpers.get_path(content, %w(chart styles global))
|
|
201
|
+
global_chart_options['colorMapping'] = [] if global_chart_options
|
|
202
|
+
self
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
# Return true if the report definition is a chart
|
|
206
|
+
#
|
|
207
|
+
# @return [Boolean] Return true if report definition is a chart
|
|
208
|
+
def chart?
|
|
209
|
+
!table?
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
def labels
|
|
213
|
+
attribute_parts.map { |part| project.labels(part['attribute']['uri']) }
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
def metric_parts
|
|
217
|
+
content['grid']['metrics']
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
alias_method :measure_parts, :metric_parts
|
|
221
|
+
|
|
222
|
+
def metrics
|
|
223
|
+
metric_parts.map { |i| project.metrics(i['uri']) }
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
def execute(opts = {})
|
|
227
|
+
result = if saved?
|
|
228
|
+
pars = {
|
|
229
|
+
'report_req' => { 'reportDefinition' => uri }
|
|
230
|
+
}
|
|
231
|
+
client.post "/gdc/projects/#{project.pid}/execute", pars
|
|
232
|
+
else
|
|
233
|
+
data = {
|
|
234
|
+
report_req: {
|
|
235
|
+
definitionContent: {
|
|
236
|
+
content: to_hash,
|
|
237
|
+
projectMetadata: project.links['metadata']
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
uri = "/gdc/projects/#{project.pid}/execute"
|
|
242
|
+
client.post(uri, data)
|
|
243
|
+
end
|
|
244
|
+
GoodData::Report.data_result(result, opts.merge(client: client))
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
def filters
|
|
248
|
+
content['filters'].map { |f| f['expression'] }
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
# Method used for replacing values in their state according to mapping.
|
|
252
|
+
# Can be used to replace any values but it is typically used to replace
|
|
253
|
+
# the URIs. Returns a new object of the same type.
|
|
254
|
+
#
|
|
255
|
+
# @param [Array<Array>]Mapping specifying what should be exchanged for what. As mapping should be used output of GoodData::Helpers.prepare_mapping.
|
|
256
|
+
# @return [GoodData::ReportDefinition]
|
|
257
|
+
def replace(mapping)
|
|
258
|
+
x = GoodData::MdObject.replace_quoted(self, mapping)
|
|
259
|
+
x = GoodData::MdObject.replace_bracketed(x, mapping)
|
|
260
|
+
vals = GoodData::MdObject.find_replaceable_values(self, mapping)
|
|
261
|
+
x = GoodData::MdObject.replace_quoted(x, vals)
|
|
262
|
+
GoodData::MdObject.replace_bracketed(x, vals)
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
# Return true if the report definition is a table
|
|
266
|
+
#
|
|
267
|
+
# @return [Boolean] Return true if report definition is a table
|
|
268
|
+
def table?
|
|
269
|
+
content['format'] == 'grid'
|
|
270
|
+
end
|
|
271
|
+
end
|
|
272
|
+
end
|