gooddata-edge 0.6.27.edge
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/.gitignore +36 -0
- data/.rspec +3 -0
- data/.rubocop.yml +89 -0
- data/.yardopts +22 -0
- data/CHANGELOG.md +196 -0
- data/CLI.md +439 -0
- data/DEPENDENCIES.md +817 -0
- data/Gemfile +4 -0
- data/Guardfile +5 -0
- data/LICENSE +22 -0
- data/LICENSE.rb +5 -0
- data/README.md +75 -0
- data/Rakefile +179 -0
- data/TODO.md +32 -0
- data/authors.sh +4 -0
- data/bin/gooddata +7 -0
- data/dependency_decisions.yml +104 -0
- data/gooddata +9 -0
- data/gooddata.gemspec +63 -0
- data/lib/gooddata.rb +31 -0
- data/lib/gooddata/app/app.rb +16 -0
- data/lib/gooddata/bricks/base_downloader.rb +86 -0
- data/lib/gooddata/bricks/brick.rb +38 -0
- data/lib/gooddata/bricks/bricks.rb +15 -0
- data/lib/gooddata/bricks/middleware/aws_middleware.rb +29 -0
- data/lib/gooddata/bricks/middleware/base_middleware.rb +56 -0
- data/lib/gooddata/bricks/middleware/bench_middleware.rb +24 -0
- data/lib/gooddata/bricks/middleware/bulk_salesforce_middleware.rb +37 -0
- data/lib/gooddata/bricks/middleware/decode_params_middleware.rb +20 -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 +39 -0
- data/lib/gooddata/bricks/middleware/logger_middleware.rb +29 -0
- data/lib/gooddata/bricks/middleware/middleware.rb +12 -0
- data/lib/gooddata/bricks/middleware/restforce_middleware.rb +61 -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 +32 -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 +45 -0
- data/lib/gooddata/cli/hooks.rb +57 -0
- data/lib/gooddata/cli/shared.rb +61 -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 +175 -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 +23 -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/filter_maqlization.rb +16 -0
- data/lib/gooddata/exceptions/malformed_user.rb +15 -0
- data/lib/gooddata/exceptions/no_project_error.rb +15 -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/enumerable.rb +39 -0
- data/lib/gooddata/extensions/extensions.rb +10 -0
- data/lib/gooddata/extensions/false.rb +15 -0
- data/lib/gooddata/extensions/hash.rb +38 -0
- data/lib/gooddata/extensions/nil.rb +15 -0
- data/lib/gooddata/extensions/numeric.rb +15 -0
- data/lib/gooddata/extensions/object.rb +27 -0
- data/lib/gooddata/extensions/symbol.rb +15 -0
- data/lib/gooddata/extensions/true.rb +15 -0
- data/lib/gooddata/extract.rb +21 -0
- data/lib/gooddata/goodzilla/goodzilla.rb +159 -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 +116 -0
- data/lib/gooddata/helpers/global_helpers.rb +331 -0
- data/lib/gooddata/helpers/global_helpers_params.rb +172 -0
- data/lib/gooddata/helpers/helpers.rb +10 -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_label.rb +19 -0
- data/lib/gooddata/mixins/links.rb +15 -0
- data/lib/gooddata/mixins/md_finders.rb +77 -0
- data/lib/gooddata/mixins/md_grantees.rb +42 -0
- data/lib/gooddata/mixins/md_id_to_uri.rb +34 -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 +64 -0
- data/lib/gooddata/mixins/md_object_query.rb +128 -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/blueprint/anchor_field.rb +64 -0
- data/lib/gooddata/models/blueprint/attribute_field.rb +29 -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 +449 -0
- data/lib/gooddata/models/blueprint/date_dimension.rb +14 -0
- data/lib/gooddata/models/blueprint/fact_field.rb +20 -0
- data/lib/gooddata/models/blueprint/label_field.rb +43 -0
- data/lib/gooddata/models/blueprint/project_blueprint.rb +746 -0
- data/lib/gooddata/models/blueprint/project_builder.rb +83 -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 +181 -0
- data/lib/gooddata/models/blueprint/to_wire.rb +154 -0
- data/lib/gooddata/models/client.rb +182 -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/datawarehouse.rb +92 -0
- data/lib/gooddata/models/domain.rb +479 -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 +160 -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 +272 -0
- data/lib/gooddata/models/metadata/attribute.rb +134 -0
- data/lib/gooddata/models/metadata/dashboard.rb +108 -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 +64 -0
- data/lib/gooddata/models/metadata/dimension.rb +54 -0
- data/lib/gooddata/models/metadata/fact.rb +44 -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 +198 -0
- data/lib/gooddata/models/metadata/report.rb +247 -0
- data/lib/gooddata/models/metadata/report_definition.rb +264 -0
- data/lib/gooddata/models/metadata/scheduled_mail.rb +274 -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 +91 -0
- data/lib/gooddata/models/model.rb +282 -0
- data/lib/gooddata/models/models.rb +12 -0
- data/lib/gooddata/models/module_constants.rb +31 -0
- data/lib/gooddata/models/process.rb +316 -0
- data/lib/gooddata/models/profile.rb +426 -0
- data/lib/gooddata/models/project.rb +1514 -0
- data/lib/gooddata/models/project_creator.rb +126 -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 +266 -0
- data/lib/gooddata/models/schedule.rb +518 -0
- data/lib/gooddata/models/segment.rb +201 -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 +100 -0
- data/lib/gooddata/models/user_filters/user_filter_builder.rb +512 -0
- data/lib/gooddata/models/user_filters/user_filters.rb +13 -0
- data/lib/gooddata/models/user_filters/variable_user_filter.rb +31 -0
- data/lib/gooddata/models/user_group.rb +241 -0
- data/lib/gooddata/rest/README.md +37 -0
- data/lib/gooddata/rest/client.rb +389 -0
- data/lib/gooddata/rest/connection.rb +765 -0
- data/lib/gooddata/rest/object.rb +69 -0
- data/lib/gooddata/rest/object_factory.rb +76 -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/bricks/bricks_spec.rb +112 -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/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 +38 -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/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/model_view.json +1775 -0
- data/spec/data/wire_models/nu_model.json +3046 -0
- data/spec/data/wire_models/test_blueprint.json +63 -0
- data/spec/data/wire_test_project.json +150 -0
- data/spec/environment/default.rb +41 -0
- data/spec/environment/develop.rb +31 -0
- data/spec/environment/environment.rb +18 -0
- data/spec/environment/hotfix.rb +21 -0
- data/spec/environment/production.rb +35 -0
- data/spec/environment/release.rb +21 -0
- data/spec/environment/staging.rb +30 -0
- data/spec/environment/staging_3.rb +36 -0
- data/spec/helpers/blueprint_helper.rb +26 -0
- data/spec/helpers/cli_helper.rb +36 -0
- data/spec/helpers/connection_helper.rb +41 -0
- data/spec/helpers/crypto_helper.rb +17 -0
- data/spec/helpers/csv_helper.rb +18 -0
- data/spec/helpers/process_helper.rb +33 -0
- data/spec/helpers/project_helper.rb +59 -0
- data/spec/helpers/schedule_helper.rb +31 -0
- data/spec/helpers/spec_helper.rb +15 -0
- data/spec/integration/blueprint_updates_spec.rb +101 -0
- data/spec/integration/blueprint_with_grain_spec.rb +72 -0
- data/spec/integration/clients_spec.rb +134 -0
- data/spec/integration/command_datawarehouse_spec.rb +39 -0
- data/spec/integration/command_projects_spec.rb +32 -0
- data/spec/integration/create_from_template_spec.rb +22 -0
- data/spec/integration/create_project_spec.rb +24 -0
- data/spec/integration/date_dim_switch_spec.rb +142 -0
- data/spec/integration/deprecated_load_spec.rb +58 -0
- data/spec/integration/full_process_schedule_spec.rb +298 -0
- data/spec/integration/full_project_spec.rb +569 -0
- data/spec/integration/over_to_user_filters_spec.rb +94 -0
- data/spec/integration/partial_md_export_import_spec.rb +42 -0
- data/spec/integration/project_spec.rb +264 -0
- data/spec/integration/rest_spec.rb +213 -0
- data/spec/integration/schedule_spec.rb +626 -0
- data/spec/integration/segments_spec.rb +141 -0
- data/spec/integration/user_filters_spec.rb +290 -0
- data/spec/integration/user_group_spec.rb +127 -0
- data/spec/integration/variables_spec.rb +188 -0
- data/spec/logging_in_logging_out_spec.rb +93 -0
- data/spec/spec_helper.rb +95 -0
- data/spec/unit/bricks/bricks_spec.rb +35 -0
- data/spec/unit/bricks/middleware/aws_middelware_spec.rb +51 -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 +15 -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/commands/command_projects_spec.rb +22 -0
- data/spec/unit/core/connection_spec.rb +57 -0
- data/spec/unit/core/logging_spec.rb +133 -0
- data/spec/unit/core/nil_logger_spec.rb +13 -0
- data/spec/unit/core/project_spec.rb +54 -0
- data/spec/unit/extensions/hash_spec.rb +23 -0
- data/spec/unit/godzilla/goodzilla_spec.rb +78 -0
- data/spec/unit/helpers/csv_helper_spec.rb +22 -0
- data/spec/unit/helpers/data_helper_spec.rb +61 -0
- data/spec/unit/helpers/global_helpers_spec.rb +111 -0
- data/spec/unit/helpers_spec.rb +86 -0
- data/spec/unit/models/blueprint/attributes_spec.rb +29 -0
- data/spec/unit/models/blueprint/dataset_spec.rb +121 -0
- data/spec/unit/models/blueprint/labels_spec.rb +44 -0
- data/spec/unit/models/blueprint/project_blueprint_spec.rb +648 -0
- data/spec/unit/models/blueprint/reference_spec.rb +29 -0
- data/spec/unit/models/blueprint/schema_builder_spec.rb +38 -0
- data/spec/unit/models/blueprint/to_wire_spec.rb +174 -0
- data/spec/unit/models/domain_spec.rb +144 -0
- data/spec/unit/models/execution_spec.rb +108 -0
- data/spec/unit/models/from_wire_spec.rb +296 -0
- data/spec/unit/models/invitation_spec.rb +17 -0
- data/spec/unit/models/membership_spec.rb +132 -0
- data/spec/unit/models/metadata_spec.rb +104 -0
- data/spec/unit/models/metric_spec.rb +117 -0
- data/spec/unit/models/model_spec.rb +82 -0
- data/spec/unit/models/params_spec.rb +118 -0
- data/spec/unit/models/profile_spec.rb +215 -0
- data/spec/unit/models/project_creator_spec.rb +127 -0
- data/spec/unit/models/project_role_spec.rb +94 -0
- data/spec/unit/models/project_spec.rb +162 -0
- data/spec/unit/models/report_result_data_spec.rb +199 -0
- data/spec/unit/models/schedule_spec.rb +418 -0
- data/spec/unit/models/to_manifest_spec.rb +63 -0
- data/spec/unit/models/unit_project_spec.rb +125 -0
- data/spec/unit/models/user_filters_spec.rb +95 -0
- data/spec/unit/models/variable_spec.rb +265 -0
- data/spec/unit/rest/polling_spec.rb +89 -0
- data/spec/unit/rest/resource_spec.rb +10 -0
- data/yard-server.sh +3 -0
- metadata +1125 -0
@@ -0,0 +1,298 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
#
|
3
|
+
# Copyright (c) 2010-2015 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 'gooddata'
|
8
|
+
|
9
|
+
describe "Full process and schedule exercise", :constraint => 'slow' do
|
10
|
+
COMPLEX_PARAMS ||= {
|
11
|
+
type: 'Person',
|
12
|
+
model_version: 1,
|
13
|
+
data_version: 1.5,
|
14
|
+
some_true_flag: true,
|
15
|
+
some_false_flag: false,
|
16
|
+
empty_value: nil,
|
17
|
+
user: {
|
18
|
+
firstname: 'Joe',
|
19
|
+
lastname: 'Doe',
|
20
|
+
age: 42
|
21
|
+
},
|
22
|
+
address: {
|
23
|
+
street: '#111 Sutter St.',
|
24
|
+
city: 'San Francisco',
|
25
|
+
zip: '94133'
|
26
|
+
}
|
27
|
+
}
|
28
|
+
|
29
|
+
before(:all) do
|
30
|
+
@client = ConnectionHelper::create_default_connection
|
31
|
+
@project = @client.create_project(title: 'Project for schedule testing', auth_token: ConnectionHelper::GD_PROJECT_TOKEN, environment: ProjectHelper::ENVIRONMENT)
|
32
|
+
@process = @project.deploy_process('./spec/data/ruby_process',
|
33
|
+
type: 'RUBY',
|
34
|
+
name: 'Test ETL Process (Ruby)')
|
35
|
+
|
36
|
+
@process_cc = @project.deploy_process('./spec/data/cc',
|
37
|
+
type: 'graph',
|
38
|
+
name: 'Test ETL Process (CC)')
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
after(:all) do
|
43
|
+
ScheduleHelper.remove_old_schedules(@project)
|
44
|
+
ProcessHelper.remove_old_processes(@project)
|
45
|
+
|
46
|
+
# @process.delete if @process
|
47
|
+
# @project.delete if @project
|
48
|
+
|
49
|
+
@client.disconnect
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should be able to execute a process" do
|
53
|
+
result = @process.execute(@process.executables.first)
|
54
|
+
log = result.log
|
55
|
+
expect(log.index('Hello Ruby executors')).not_to eq nil
|
56
|
+
expect(log.index('Hello Ruby from the deep')).not_to eq nil
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should be able to start executing a process" do
|
60
|
+
result = @process.start_execution(@process.executables.first)
|
61
|
+
expect(result["executionTask"]).not_to be_nil
|
62
|
+
expect(result["executionTask"]['links']['detail']).not_to be_nil
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should be able to grab executables" do
|
66
|
+
|
67
|
+
expect(@process.executables).to eq ['process.rb']
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should have empty schedules on deploy" do
|
71
|
+
expect(@process.schedules).to eq []
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should be able to create schedule triggered by another schedule" do
|
75
|
+
begin
|
76
|
+
schedule_first = @process.create_schedule('0 15 27 7 *', @process.executables.first)
|
77
|
+
schedule = @process.create_schedule(schedule_first, @process.executables.first)
|
78
|
+
res = @process.schedules
|
79
|
+
expect(res.count).to eq 2
|
80
|
+
expect(@process.schedules.map(&:uri)).to include(schedule_first.uri, schedule.uri)
|
81
|
+
ensure
|
82
|
+
schedule && schedule.delete
|
83
|
+
schedule_first && schedule_first.delete
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should be able to create schedule triggered by another schedule specified by ID" do
|
88
|
+
begin
|
89
|
+
schedule_first = @process.create_schedule('0 15 27 7 *', @process.executables.first)
|
90
|
+
schedule = @process.create_schedule(schedule_first.obj_id, @process.executables.first)
|
91
|
+
res = @process.schedules
|
92
|
+
expect(res.count).to eq 2
|
93
|
+
expect(schedule.after).to eq schedule_first
|
94
|
+
expect(@process.schedules.map(&:uri)).to include(schedule_first.uri, schedule.uri)
|
95
|
+
ensure
|
96
|
+
schedule && schedule.delete
|
97
|
+
schedule_first && schedule_first.delete
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
it "should be able to delete schedule" do
|
102
|
+
begin
|
103
|
+
schedule = @process.create_schedule('0 15 27 7 *', @process.executables.first)
|
104
|
+
res = @process.schedules
|
105
|
+
expect(res.count).to eq 1
|
106
|
+
expect(@process.schedules).to eq [schedule]
|
107
|
+
ensure
|
108
|
+
schedule && schedule.delete
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
it "should be possible to read status of schedule" do
|
113
|
+
begin
|
114
|
+
schedule = @process.create_schedule('0 15 27 7 *', @process.executables.first)
|
115
|
+
expect(schedule.state).to eq 'ENABLED'
|
116
|
+
ensure
|
117
|
+
schedule && schedule.delete
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
it "should be possible to execute schedule" do
|
122
|
+
begin
|
123
|
+
schedule = @process.create_schedule('0 15 27 7 *', @process.executables.first)
|
124
|
+
executions_count = schedule.executions.count
|
125
|
+
result = schedule.execute
|
126
|
+
expect(result.status).to eq :ok
|
127
|
+
log = result.log
|
128
|
+
expect(log.index('Hello Ruby executors')).not_to eq nil
|
129
|
+
expect(log.index('Hello Ruby from the deep')).not_to eq nil
|
130
|
+
expect(executions_count + 1).to eq schedule.executions.count
|
131
|
+
ensure
|
132
|
+
schedule && schedule.delete
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
it "should be possible to deploy only a single file" do
|
137
|
+
process = @project.deploy_process('./spec/data/hello_world_process/hello_world.rb',
|
138
|
+
type: 'RUBY',
|
139
|
+
name: 'Test ETL one file Process')
|
140
|
+
begin
|
141
|
+
schedule = process.create_schedule('0 15 27 7 *', process.executables.first)
|
142
|
+
result = schedule.execute
|
143
|
+
expect(result.status).to eq :ok
|
144
|
+
log = result.log
|
145
|
+
expect(log.index('HELLO WORLD')).not_to eq nil
|
146
|
+
expect(schedule.enabled?).to be_truthy
|
147
|
+
schedule.disable
|
148
|
+
schedule.save
|
149
|
+
expect(schedule.enabled?).to be_falsey
|
150
|
+
expect(schedule.disabled?).to be_truthy
|
151
|
+
schedule.enable
|
152
|
+
schedule.save
|
153
|
+
expect(schedule.enabled?).to be_truthy
|
154
|
+
ensure
|
155
|
+
schedule && schedule.delete
|
156
|
+
process && process.delete
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
it "should be possible to deploy already zipped file" do
|
161
|
+
process = @project.deploy_process('./spec/data/hello_world_process/hello_world.zip',
|
162
|
+
type: 'RUBY',
|
163
|
+
name: 'Test ETL zipped file Process')
|
164
|
+
begin
|
165
|
+
expect(process.schedules.count).to eq 0
|
166
|
+
schedule = process.create_schedule('0 15 27 7 *', process.executables.first)
|
167
|
+
result = schedule.execute
|
168
|
+
expect(result.status).to eq :ok
|
169
|
+
log = result.log
|
170
|
+
expect(log.index('HELLO WORLD')).not_to eq nil
|
171
|
+
expect(process.schedules.count).to eq 1
|
172
|
+
ensure
|
173
|
+
schedule && schedule.delete
|
174
|
+
process && process.delete
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
it 'should be possible to deploy and run zipped file and print GoodData::VERSION' do
|
179
|
+
process = @project.deploy_process('./spec/data/gooddata_version_process/gooddata_version.zip',
|
180
|
+
type: 'RUBY',
|
181
|
+
name: 'Test ETL zipped file GoodData Process')
|
182
|
+
begin
|
183
|
+
expect(process.schedules.count).to eq 0
|
184
|
+
schedule = process.create_schedule('0 15 27 7 *', process.executables.first)
|
185
|
+
result = schedule.execute
|
186
|
+
expect(result.status).to eq :ok
|
187
|
+
log = result.log
|
188
|
+
expect(log.index('GoodData::VERSION - 0.6.')).not_to eq nil
|
189
|
+
expect(process.schedules.count).to eq 1
|
190
|
+
ensure
|
191
|
+
schedule && schedule.delete
|
192
|
+
process && process.delete
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
it 'should be possible to deploy and run directory and use nested parameters' do
|
197
|
+
process = @project.deploy_process('./spec/data/ruby_params_process',
|
198
|
+
type: 'RUBY',
|
199
|
+
name: 'Test ETL dir GoodData Process')
|
200
|
+
begin
|
201
|
+
expect(process.schedules.count).to eq 0
|
202
|
+
schedule = process.create_schedule('0 15 27 7 *', process.executables.first, params: COMPLEX_PARAMS)
|
203
|
+
result = schedule.execute
|
204
|
+
expect(result.status).to eq :ok
|
205
|
+
log = result.log
|
206
|
+
expect(log.index('Joe')).not_to eq nil
|
207
|
+
expect(log.index('San Francisco')).not_to eq nil
|
208
|
+
expect(process.schedules.count).to eq 1
|
209
|
+
ensure
|
210
|
+
schedule && schedule.delete
|
211
|
+
process && process.delete
|
212
|
+
end
|
213
|
+
end
|
214
|
+
|
215
|
+
it 'should be possible to deploy and run directory and use nested hidden parameters' do
|
216
|
+
process = @project.deploy_process('./spec/data/ruby_params_process',
|
217
|
+
type: 'RUBY',
|
218
|
+
name: 'Test ETL dir GoodData Process')
|
219
|
+
begin
|
220
|
+
expect(process.schedules.count).to eq 0
|
221
|
+
schedule = process.create_schedule('0 15 27 7 *', process.executables.first, hidden_params: COMPLEX_PARAMS)
|
222
|
+
result = schedule.execute
|
223
|
+
# expect(result.status).to eq :ok
|
224
|
+
log = result.log
|
225
|
+
expect(process.schedules.count).to eq 1
|
226
|
+
ensure
|
227
|
+
schedule && schedule.delete
|
228
|
+
process && process.delete
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
232
|
+
it "should be possible to download deployed process" do
|
233
|
+
size = File.size('./spec/data/hello_world_process/hello_world.zip')
|
234
|
+
process = @project.deploy_process('./spec/data/hello_world_process/hello_world.zip',
|
235
|
+
type: 'RUBY',
|
236
|
+
name: 'Test ETL zipped file Process')
|
237
|
+
begin
|
238
|
+
Tempfile.open('downloaded-process') do |temp|
|
239
|
+
temp << process.download
|
240
|
+
temp.flush
|
241
|
+
expect(File.size(temp.path)).to eq size
|
242
|
+
end
|
243
|
+
ensure
|
244
|
+
process && process.delete
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
248
|
+
it "should be able to redeploy via project" do
|
249
|
+
begin
|
250
|
+
process = @project.deploy_process('./spec/data/hello_world_process/hello_world.zip',
|
251
|
+
type: 'RUBY',
|
252
|
+
name: 'Test ETL zipped file Process',
|
253
|
+
process_id: @process.obj_id)
|
254
|
+
ensure
|
255
|
+
process && process.delete
|
256
|
+
end
|
257
|
+
end
|
258
|
+
|
259
|
+
it "should be able to redeploy directly" do
|
260
|
+
begin
|
261
|
+
process1 = @project.deploy_process('./spec/data/hello_world_process/hello_world.zip',
|
262
|
+
type: 'RUBY',
|
263
|
+
name: 'Test ETL zipped file Process')
|
264
|
+
|
265
|
+
process2 = process1.deploy('./spec/data/ruby_process/process.rb')
|
266
|
+
expect(process1.executables).not_to eq process2.executables
|
267
|
+
ensure
|
268
|
+
process1 && process1.delete
|
269
|
+
end
|
270
|
+
end
|
271
|
+
|
272
|
+
it 'should be able to deploy from app_store' do
|
273
|
+
begin
|
274
|
+
process = @project.deploy_process('https://github.com/gooddata/app_store/tree/sfdc_downloader_brick-v0.0.4/apps/ads_integrator_brick')
|
275
|
+
expect(process.class).to eq GoodData::Process
|
276
|
+
ensure
|
277
|
+
process.delete
|
278
|
+
end
|
279
|
+
end
|
280
|
+
|
281
|
+
|
282
|
+
it 'should be able to clone with etl' do
|
283
|
+
begin
|
284
|
+
# Deploy two schedules
|
285
|
+
process = @project.processes.first
|
286
|
+
schedule_first = process.create_schedule('0 15 27 7 *', process.executables.first)
|
287
|
+
schedule_second = process.create_schedule('0 15 27 8 *', process.executables.first)
|
288
|
+
cloned_project = GoodData::Project.clone_with_etl(@project)
|
289
|
+
a = @project.processes.flat_map {|p| p.schedules.map {|s| [p.name, s.name]}}
|
290
|
+
b = cloned_project.processes.flat_map {|p| p.schedules.map {|s| [p.name, s.name]}}
|
291
|
+
expect(a).to eq b
|
292
|
+
ensure
|
293
|
+
cloned_project && cloned_project.delete
|
294
|
+
schedule_first && schedule_first.delete
|
295
|
+
schedule_second && schedule_second.delete
|
296
|
+
end
|
297
|
+
end
|
298
|
+
end
|
@@ -0,0 +1,569 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
#
|
3
|
+
# Copyright (c) 2010-2015 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 'gooddata'
|
8
|
+
|
9
|
+
describe "Full project implementation", :constraint => 'slow' do
|
10
|
+
before(:all) do
|
11
|
+
@spec = JSON.parse(File.read("./spec/data/blueprints/test_project_model_spec.json"), :symbolize_names => true)
|
12
|
+
@invalid_spec = JSON.parse(File.read("./spec/data/blueprints/invalid_blueprint.json"), :symbolize_names => true)
|
13
|
+
@client = ConnectionHelper::create_default_connection
|
14
|
+
@blueprint = GoodData::Model::ProjectBlueprint.new(@spec)
|
15
|
+
@invalid_blueprint = GoodData::Model::ProjectBlueprint.new(@invalid_spec)
|
16
|
+
|
17
|
+
@project = @client.create_project_from_blueprint(@blueprint, token: ConnectionHelper::GD_PROJECT_TOKEN, environment: ProjectHelper::ENVIRONMENT)
|
18
|
+
end
|
19
|
+
|
20
|
+
after(:all) do
|
21
|
+
@project.delete unless @project.nil?
|
22
|
+
|
23
|
+
@client.disconnect
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should not build an invalid model" do
|
27
|
+
expect {
|
28
|
+
@client.create_project_from_blueprint(@invalid_spec, auth_token: ConnectionHelper::GD_PROJECT_TOKEN, environment: ProjectHelper::ENVIRONMENT)
|
29
|
+
}.to raise_error(GoodData::ValidationError)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should do nothing if the project is updated with the same blueprint" do
|
33
|
+
results = GoodData::Model::ProjectCreator.migrate_datasets(@spec, project: @project, client: @client, dry_run: true)
|
34
|
+
expect(results).to be_nil
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should try to rename a dataset back' do
|
38
|
+
dataset = @project.datasets('dataset.repos')
|
39
|
+
dataset.title = "Some title"
|
40
|
+
dataset.save
|
41
|
+
|
42
|
+
# Now the update of project using the original blueprint should offer update of the title. Nothing else.
|
43
|
+
results = GoodData::Model::ProjectCreator.migrate_datasets(@blueprint, project: @project, client: @client, dry_run: true)
|
44
|
+
results = GoodData::Model::ProjectCreator.migrate_datasets(@spec, project: @project, client: @client, dry_run: true)
|
45
|
+
expect(results['updateScript']['maqlDdl']).to eq "ALTER DATASET {dataset.repos} VISUAL(TITLE \"Repositories\", DESCRIPTION \"\");\n"
|
46
|
+
|
47
|
+
# Update using a freshly gained blueprint should offer no changes.
|
48
|
+
new_blueprint = @project.blueprint
|
49
|
+
results = GoodData::Model::ProjectCreator.migrate_datasets(new_blueprint, project: @project, client: @client, dry_run: true)
|
50
|
+
expect(results).to be_nil
|
51
|
+
|
52
|
+
# When we change the model using the original blueprint. Basically change the title back.
|
53
|
+
results = @project.update_from_blueprint(@spec)
|
54
|
+
# It should offer no changes using the original blueprint
|
55
|
+
results = GoodData::Model::ProjectCreator.migrate_datasets(@spec, project: @project, client: @client, dry_run: true)
|
56
|
+
expect(results).to be_nil
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should contain datasets" do
|
60
|
+
bp = @project.blueprint
|
61
|
+
expect(bp.datasets.count).to eq 3
|
62
|
+
expect(bp.datasets(:all, :include_date_dimensions => true).count).to eq 4
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should contain metadata datasets" do
|
66
|
+
expect(@project.datasets.count).to eq 4
|
67
|
+
expect(@project.datasets.select(&:date_dimension?).count).to eq 1
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should be able to rename a project" do
|
71
|
+
former_title = @project.title
|
72
|
+
a_title = (0...8).map { (65 + rand(26)).chr }.join
|
73
|
+
@project.title = a_title
|
74
|
+
@project.save
|
75
|
+
expect(@project.title).to eq a_title
|
76
|
+
@project.title = former_title
|
77
|
+
@project.save
|
78
|
+
end
|
79
|
+
|
80
|
+
it "should be able to validate a project" do
|
81
|
+
@project.validate
|
82
|
+
end
|
83
|
+
|
84
|
+
it "should compute an empty metric" do
|
85
|
+
f = @project.fact_by_title('Lines Changed')
|
86
|
+
metric = @project.create_metric("SELECT SUM(#\"#{f.title}\")")
|
87
|
+
expect(metric.execute).to be_nil
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should compute an empty report def" do
|
91
|
+
@project.delete_all_data(force: true)
|
92
|
+
f = @project.fact_by_title('Lines Changed')
|
93
|
+
metric = @project.create_metric("SELECT SUM(#\"#{f.title}\")")
|
94
|
+
res = @project.compute_report(:left => [metric])
|
95
|
+
expect(res).to be_empty
|
96
|
+
end
|
97
|
+
|
98
|
+
it "should load the data" do
|
99
|
+
GoodData.with_project(@project) do |p|
|
100
|
+
# blueprint = GoodData::Model::ProjectBlueprint.new(@spec)
|
101
|
+
commits_data = [
|
102
|
+
["lines_changed","committed_on","dev_id","repo_id"],
|
103
|
+
[1,"01/01/2014",1,1],
|
104
|
+
[3,"01/02/2014",2,2],
|
105
|
+
[5,"05/02/2014",3,1]]
|
106
|
+
@project.upload(commits_data, @blueprint, 'dataset.commits')
|
107
|
+
|
108
|
+
devs_data = [
|
109
|
+
["dev_id", "email"],
|
110
|
+
[1, "tomas@gooddata.com"],
|
111
|
+
[2, "petr@gooddata.com"],
|
112
|
+
[3, "jirka@gooddata.com"]]
|
113
|
+
@project.upload(devs_data, @blueprint, 'dataset.devs')
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
it "it silently ignores extra columns" do
|
118
|
+
GoodData.with_project(@project) do |p|
|
119
|
+
blueprint = GoodData::Model::ProjectBlueprint.new(@spec)
|
120
|
+
commits_data = [
|
121
|
+
["lines_changed","committed_on","dev_id","repo_id", "extra_column"],
|
122
|
+
[1,"01/01/2014",1,1,"something"],
|
123
|
+
[3,"01/02/2014",2,2,"something"],
|
124
|
+
[5,"05/02/2014",3,1,"something else"]
|
125
|
+
]
|
126
|
+
@project.upload(commits_data, blueprint, 'dataset.commits')
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
context "it should give you a reasonable error message" do
|
131
|
+
it "if you omit a column" do
|
132
|
+
GoodData.with_project(@project) do |p|
|
133
|
+
blueprint = GoodData::Model::ProjectBlueprint.new(@spec)
|
134
|
+
commits_data = [
|
135
|
+
["lines_changed","committed_on","dev_id"],
|
136
|
+
[1,"01/01/2014",1],
|
137
|
+
[3,"01/02/2014",2],
|
138
|
+
[5,"05/02/2014",3]
|
139
|
+
]
|
140
|
+
expect {@project.upload(commits_data, blueprint, 'dataset.commits')}.to raise_error(/repo_id/)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
it "if you give it a malformed CSV" do
|
144
|
+
GoodData.with_project(@project) do |p|
|
145
|
+
blueprint = GoodData::Model::ProjectBlueprint.new(@spec)
|
146
|
+
# 4 cols in header but not in the data
|
147
|
+
commits_data = [
|
148
|
+
["lines_changed","committed_on","dev_id","repo_id"],
|
149
|
+
[1,"01/01/2014",1],
|
150
|
+
[3,"01/02/2014",2],
|
151
|
+
[5,"05/02/2014",3]
|
152
|
+
]
|
153
|
+
expect {@project.upload(commits_data, blueprint, 'dataset.commits')}.to raise_error(/Number of columns/)
|
154
|
+
end
|
155
|
+
end
|
156
|
+
it "if you give it wrong date format" do
|
157
|
+
GoodData.with_project(@project) do |p|
|
158
|
+
blueprint = GoodData::Model::ProjectBlueprint.new(@spec)
|
159
|
+
commits_data = [
|
160
|
+
["lines_changed","committed_on","dev_id","repo_id"],
|
161
|
+
[1,"01/01/2014",1,1],
|
162
|
+
[3,"45/50/2014",2,2],
|
163
|
+
[5,"05/02/2014",3,1]
|
164
|
+
]
|
165
|
+
expect {@project.upload(commits_data, blueprint, 'dataset.commits')}.to raise_error(%r{45/50/2014})
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
it "should compute a metric" do
|
171
|
+
f = @project.fact_by_title('Lines Changed')
|
172
|
+
metric = @project.create_metric("SELECT SUM(#\"#{f.title}\")")
|
173
|
+
expect(metric.execute).to eq 9
|
174
|
+
end
|
175
|
+
|
176
|
+
it "should compute a count metric from dataset" do
|
177
|
+
# works on anchor without label
|
178
|
+
expect(@blueprint.datasets('dataset.commits').count(@project)).to eq 3
|
179
|
+
|
180
|
+
# works on anchor with label
|
181
|
+
expect(@blueprint.datasets('dataset.devs').count(@project)).to eq 3
|
182
|
+
end
|
183
|
+
|
184
|
+
it "should execute an anonymous metric twice and not fail" do
|
185
|
+
f = @project.fact_by_title('Lines Changed')
|
186
|
+
metric = @project.create_metric("SELECT SUM(#\"#{f.title}\")")
|
187
|
+
expect(metric.execute).to eq 9
|
188
|
+
# Since GD platform cannot execute inline specified metric the metric has to be saved
|
189
|
+
# The code tries to resolve this as transparently as possible
|
190
|
+
# Here we are testing that you can execute the metric twice. The first execution is on unsaved metric
|
191
|
+
# We wanna make sure that when we are cleaning up we are not messing things up
|
192
|
+
expect(metric.execute).to eq 9
|
193
|
+
end
|
194
|
+
|
195
|
+
it "should compute a report def" do
|
196
|
+
f = @project.fact_by_title('Lines Changed')
|
197
|
+
|
198
|
+
# TODO: Here we create metric which is not deleted and is used by another test - "should exercise the object relations and getting them in various ways"
|
199
|
+
metric = @project.create_metric("SELECT SUM(#\"#{f.title}\")", :title => "My metric")
|
200
|
+
metric.save
|
201
|
+
result = @project.compute_report(:top => [metric], :left => ['label.devs.dev_id.email'])
|
202
|
+
expect(result[2][1]).to eq 3
|
203
|
+
expect(result.include_row?(["jirka@gooddata.com", 5])).to be true
|
204
|
+
|
205
|
+
result2 = @project.compute_report(:top => [metric], :left => ['label.devs.dev_id.email'])
|
206
|
+
expect(result2[2][1]).to eq 3
|
207
|
+
expect(result2.include_row?(["jirka@gooddata.com", 5])).to eq true
|
208
|
+
expect(result2).to eq result
|
209
|
+
end
|
210
|
+
|
211
|
+
it "should be able to lock reports and everything underneath" do
|
212
|
+
m = @project.metrics.first
|
213
|
+
r = @project.create_report(top: [m], title: 'xy')
|
214
|
+
r.save
|
215
|
+
expect(m.locked?).to eq false
|
216
|
+
expect(r.locked?).to eq false
|
217
|
+
r.lock_with_dependencies!
|
218
|
+
expect(r.locked?).to eq true
|
219
|
+
m.reload!
|
220
|
+
expect(m.locked?).to eq true
|
221
|
+
r.unlock_with_dependencies!
|
222
|
+
expect(r.locked?).to eq false
|
223
|
+
m.reload!
|
224
|
+
expect(m.locked?).to eq false
|
225
|
+
r.lock!
|
226
|
+
expect(r.locked?).to eq true
|
227
|
+
r.unlock!
|
228
|
+
expect(r.locked?).to eq false
|
229
|
+
r.delete
|
230
|
+
end
|
231
|
+
|
232
|
+
it "should be able to purge report from older revisions" do
|
233
|
+
m = @project.metrics.first
|
234
|
+
r = @project.create_report(top: [m], title: 'xy')
|
235
|
+
expect(r.definitions.count).to eq 1
|
236
|
+
|
237
|
+
rd = GoodData::ReportDefinition.create(:top => [m], :client => @client, :project => @project)
|
238
|
+
rd.save
|
239
|
+
r.add_definition(rd)
|
240
|
+
r.save
|
241
|
+
expect(r.definitions.count).to eq 2
|
242
|
+
end
|
243
|
+
|
244
|
+
it "should be able to clean colors from a chart report def" do
|
245
|
+
f = @project.fact_by_title('Lines Changed')
|
246
|
+
m = @project.create_metric("SELECT SUM(#\"#{f.title}\")", title: 'test metric').save
|
247
|
+
r = @project.create_report(top: [m], title: 'xy')
|
248
|
+
rd = r.latest_report_definition
|
249
|
+
rd.content['chart'] = { 'styles' => { 'global' => { 'colorMapping' => 1 } } }
|
250
|
+
|
251
|
+
expect(GoodData::Helpers.get_path(rd.content, %w(chart styles global))).to eq ({ 'colorMapping' => 1 })
|
252
|
+
rd.reset_color_mapping!
|
253
|
+
expect(GoodData::Helpers.get_path(rd.content, %w(chart styles global))).to eq ({ 'colorMapping' => [] })
|
254
|
+
r.delete
|
255
|
+
res = m.used_by
|
256
|
+
res.each do |dependency|
|
257
|
+
@client.delete dependency['link']
|
258
|
+
end
|
259
|
+
res = m.used_by
|
260
|
+
expect(res.length).to eq 0
|
261
|
+
m.delete
|
262
|
+
end
|
263
|
+
|
264
|
+
it "should be able to update report definition (update existing)" do
|
265
|
+
m = @project.metrics.first
|
266
|
+
r = @project.create_report(top: [m], title: 'xy')
|
267
|
+
|
268
|
+
latest_uri = r.definition_uri
|
269
|
+
new_def = r.update_definition do |definition|
|
270
|
+
definition.title = "Test TITLE: #{DateTime.now.strftime}"
|
271
|
+
end
|
272
|
+
|
273
|
+
expect(r.definition_uri).to eq new_def.uri
|
274
|
+
expect(r.definition_uri).to_not eq latest_uri
|
275
|
+
end
|
276
|
+
|
277
|
+
it "should be able to update report definition (create new)" do
|
278
|
+
m = @project.metrics.first
|
279
|
+
r = @project.create_report(top: [m], title: 'xy')
|
280
|
+
|
281
|
+
latest_uri = r.definition_uri
|
282
|
+
new_def = r.update_definition(:new_definition => false) do |definition|
|
283
|
+
definition.title = "Test TITLE: #{DateTime.now.strftime}"
|
284
|
+
end
|
285
|
+
|
286
|
+
expect(r.definition_uri).to eq new_def.uri
|
287
|
+
expect(r.definition_uri).to eq latest_uri
|
288
|
+
end
|
289
|
+
|
290
|
+
it "should be possible to get all metrics" do
|
291
|
+
metrics1 = @project.metrics
|
292
|
+
expect(metrics1.count).to be >= 0
|
293
|
+
end
|
294
|
+
|
295
|
+
it "should be possible to get all metrics with full objects" do
|
296
|
+
metrics = @project.metrics(:all)
|
297
|
+
expect(metrics.first.class).to be GoodData::Metric
|
298
|
+
end
|
299
|
+
|
300
|
+
it "should be able to get a metric by identifier" do
|
301
|
+
metrics = @project.metrics
|
302
|
+
metric = @project.metrics(metrics.first.identifier)
|
303
|
+
expect(metric.identifier).to eq metrics.first.identifier
|
304
|
+
expect(metrics.first).to eq metric
|
305
|
+
end
|
306
|
+
|
307
|
+
it "should be able to get a metric by uri" do
|
308
|
+
metrics = @project.metrics
|
309
|
+
metric = @project.metrics(metrics.first.uri)
|
310
|
+
expect(metric.uri).to eq metrics.first.uri
|
311
|
+
expect(metrics.first).to eq metric
|
312
|
+
end
|
313
|
+
|
314
|
+
it "should be able to get a metric by object id" do
|
315
|
+
metrics = @project.metrics
|
316
|
+
metric = @project.metrics(metrics.first.obj_id)
|
317
|
+
expect(metric.obj_id).to eq metrics.first.obj_id
|
318
|
+
expect(metrics.first).to eq metric
|
319
|
+
end
|
320
|
+
|
321
|
+
it "should exercise the object relations and getting them in various ways" do
|
322
|
+
# Find a metric by name
|
323
|
+
metric = @project.metric_by_title('My metric')
|
324
|
+
the_same_metric = @project.metrics(metric)
|
325
|
+
expect(metric).to eq the_same_metric
|
326
|
+
|
327
|
+
# grab fact in several different ways
|
328
|
+
fact1 = @project.fact_by_title('Lines Changed')
|
329
|
+
fact2 = @project.facts(fact1.identifier)
|
330
|
+
fact3 = @project.facts(fact2.obj_id)
|
331
|
+
fact4 = @project.facts(fact3.uri)
|
332
|
+
fact5 = @client.create(GoodData::Fact, fact4)
|
333
|
+
|
334
|
+
# All should be the same
|
335
|
+
expect(fact1).to eq fact2
|
336
|
+
expect(fact1).to eq fact2
|
337
|
+
expect(fact1).to eq fact3
|
338
|
+
expect(fact1).to eq fact4
|
339
|
+
expect(fact1).to eq fact5
|
340
|
+
|
341
|
+
fact3.title = "Somewhat changed title"
|
342
|
+
expect(fact1).not_to eq fact3
|
343
|
+
|
344
|
+
metric.using(nil)
|
345
|
+
res = metric.using('fact')
|
346
|
+
expect(res.count).to eq 1
|
347
|
+
|
348
|
+
fact1.used_by(nil)
|
349
|
+
res = fact1.used_by('metric')
|
350
|
+
expect(res.count).to eq 1
|
351
|
+
|
352
|
+
res = metric.using?(fact1)
|
353
|
+
expect(res).to be(true)
|
354
|
+
|
355
|
+
res = fact1.using?(metric)
|
356
|
+
expect(res).to be(false)
|
357
|
+
|
358
|
+
res = metric.used_by?(fact1)
|
359
|
+
expect(res).to be(false)
|
360
|
+
|
361
|
+
res = fact1.used_by?(metric)
|
362
|
+
expect(res).to be(true)
|
363
|
+
end
|
364
|
+
|
365
|
+
it "should try setting and getting by tags" do
|
366
|
+
fact = @project.fact_by_title('Lines Changed')
|
367
|
+
expect(fact.tags.empty?).to be_truthy
|
368
|
+
|
369
|
+
fact.tags = "tag1 tag2 tag3"
|
370
|
+
fact.save
|
371
|
+
|
372
|
+
tagged_facts = GoodData::Fact.find_by_tag('tag3', :client => @client, :project => @project)
|
373
|
+
expect(tagged_facts.count).to eq 1
|
374
|
+
end
|
375
|
+
|
376
|
+
it "should be able to interpolate metric based on" do
|
377
|
+
res = @project.compute_metric "SELECT SUM(![fact.commits.lines_changed])"
|
378
|
+
expect(res).to eq 9
|
379
|
+
|
380
|
+
res = @project.compute_metric "SELECT SUM(![fact.commits.lines_changed])"
|
381
|
+
expect(res).to eq 9
|
382
|
+
|
383
|
+
res = @project.compute_metric "SELECT SUM(![fact.commits.lines_changed])"
|
384
|
+
expect(res).to eq 9
|
385
|
+
|
386
|
+
res = @project.compute_metric "SELECT SUM(![fact.commits.lines_changed])"
|
387
|
+
expect(res).to eq 9
|
388
|
+
|
389
|
+
fact = @project.fact_by_title('Lines Changed')
|
390
|
+
expect(fact.fact?).to be true
|
391
|
+
res = fact.create_metric(:type => :sum).execute
|
392
|
+
expect(res).to eq 9
|
393
|
+
end
|
394
|
+
|
395
|
+
it "should load the data" do
|
396
|
+
devs_data = [
|
397
|
+
["dev_id", "email"],
|
398
|
+
[4, "josh@gooddata.com"]]
|
399
|
+
@project.upload(devs_data, @blueprint, 'dataset.devs', mode: 'INCREMENTAL')
|
400
|
+
end
|
401
|
+
|
402
|
+
it "should have more users" do
|
403
|
+
attribute = @project.attributes('attr.devs.dev_id')
|
404
|
+
expect(attribute.attribute?).to be true
|
405
|
+
expect(attribute.create_metric.execute).to eq 4
|
406
|
+
end
|
407
|
+
|
408
|
+
it "should tell you whether metric contains a certain attribute" do
|
409
|
+
attribute = @project.attributes('attr.devs.dev_id')
|
410
|
+
repo_attribute = @project.attributes('attr.repos.repo_id')
|
411
|
+
metric = attribute.create_metric(:title => "My test metric")
|
412
|
+
metric.save
|
413
|
+
expect(metric.execute).to eq 4
|
414
|
+
|
415
|
+
expect(metric.contain?(attribute)).to be true
|
416
|
+
expect(metric.contain?(repo_attribute)).to be false
|
417
|
+
metric.replace!(attribute => repo_attribute)
|
418
|
+
metric.save
|
419
|
+
expect(metric.execute).not_to eq 4
|
420
|
+
|
421
|
+
l = attribute.primary_label
|
422
|
+
value = l.values.first[:value]
|
423
|
+
expect(l.find_element_value(l.find_value_uri(value))).to eq value
|
424
|
+
expect(l.value?(value)).to eq true
|
425
|
+
expect(l.value?("DEFINITELY NON EXISTENT VALUE HOPEFULLY")).to eq false
|
426
|
+
end
|
427
|
+
|
428
|
+
it "should be able to compute count of different datasets" do
|
429
|
+
attribute = @project.attributes('attr.devs.dev_id')
|
430
|
+
dataset_attribute = @project.attributes('attr.commits.factsof')
|
431
|
+
expect(attribute.create_metric(:attribute => dataset_attribute).execute).to eq 3
|
432
|
+
end
|
433
|
+
|
434
|
+
it "should be able to tell you if a value is contained in a metric" do
|
435
|
+
attribute = @project.attributes('attr.devs.dev_id')
|
436
|
+
label = attribute.primary_label
|
437
|
+
value = label.values.first
|
438
|
+
fact = @project.facts('fact.commits.lines_changed')
|
439
|
+
metric = @project.create_metric("SELECT SUM([#{fact.uri}]) WHERE [#{attribute.uri}] = [#{value[:uri]}]")
|
440
|
+
expect(metric.contain_value?(label, value[:value])).to be true
|
441
|
+
end
|
442
|
+
|
443
|
+
it "should be able to replace the values in a metric" do
|
444
|
+
attribute = @project.attributes('attr.devs.dev_id')
|
445
|
+
label = attribute.primary_label
|
446
|
+
value = label.values.first
|
447
|
+
different_value = label.values.drop(1).first
|
448
|
+
fact = @project.facts('fact.commits.lines_changed')
|
449
|
+
metric = @project.create_metric("SELECT SUM([#{fact.uri}]) WHERE [#{attribute.uri}] = [#{value[:uri]}]")
|
450
|
+
metric.replace_value(label, value[:value], different_value[:value])
|
451
|
+
expect(metric.contain_value?(label, value[:value])).to be false
|
452
|
+
expect(metric.pretty_expression).to eq "SELECT SUM([Lines Changed]) WHERE [Dev] = [josh@gooddata.com]"
|
453
|
+
end
|
454
|
+
|
455
|
+
it "should be able to lookup the attributes by regexp and return a collection" do
|
456
|
+
attrs = @project.attributes_by_title(/Date/i)
|
457
|
+
expect(attrs.count).to eq 1
|
458
|
+
end
|
459
|
+
|
460
|
+
it "should be able to give you values of the label as an array of hashes" do
|
461
|
+
attribute = @project.attributes('attr.devs.dev_id')
|
462
|
+
label = attribute.primary_label
|
463
|
+
expect(label.values.map { |v| v[:value] }).to eq [
|
464
|
+
'jirka@gooddata.com',
|
465
|
+
'josh@gooddata.com',
|
466
|
+
'petr@gooddata.com',
|
467
|
+
'tomas@gooddata.com'
|
468
|
+
]
|
469
|
+
end
|
470
|
+
|
471
|
+
it "should be able to give you values for" do
|
472
|
+
attribute = @project.attributes('attr.devs.dev_id')
|
473
|
+
expect(attribute.values_for(2)).to eq ["tomas@gooddata.com", "1"]
|
474
|
+
end
|
475
|
+
|
476
|
+
it "should be able to find specific element and give you the primary label value" do
|
477
|
+
attribute = @project.attributes('attr.devs.dev_id')
|
478
|
+
expect(@project.find_attribute_element_value("#{attribute.uri}/elements?id=2")).to eq 'tomas@gooddata.com'
|
479
|
+
end
|
480
|
+
|
481
|
+
it "should be able to give you label by name" do
|
482
|
+
attribute = @project.attributes('attr.devs.dev_id')
|
483
|
+
label = attribute.label_by_name('Id')
|
484
|
+
expect(label.label?).to eq true
|
485
|
+
expect(label.title).to eq 'Id'
|
486
|
+
expect(label.identifier).to eq 'label.devs.dev_id.id'
|
487
|
+
expect(label.attribute_uri).to eq attribute.uri
|
488
|
+
expect(label.attribute).to eq attribute
|
489
|
+
end
|
490
|
+
|
491
|
+
it "should be able to return values of the attribute for inspection" do
|
492
|
+
attribute = @project.attributes('attr.devs.dev_id')
|
493
|
+
vals = attribute.values
|
494
|
+
expect(vals.count).to eq 4
|
495
|
+
expect(vals.first.count).to eq 2
|
496
|
+
expect(vals.first.first[:value]).to eq "jirka@gooddata.com"
|
497
|
+
end
|
498
|
+
|
499
|
+
it "should be able to save_as a metric" do
|
500
|
+
m = @project.metric_by_title("My test metric")
|
501
|
+
cloned = m.save_as
|
502
|
+
m_cloned = @project.metric_by_title("Clone of My test metric")
|
503
|
+
expect(m_cloned).to eq cloned
|
504
|
+
expect(m_cloned.execute).to eq cloned.execute
|
505
|
+
end
|
506
|
+
|
507
|
+
it "should be able to clone a project and transfer the data" do
|
508
|
+
title = 'My new clone project'
|
509
|
+
begin
|
510
|
+
cloned_project = @project.clone(title: title, auth_token: ConnectionHelper::GD_PROJECT_TOKEN, environment: ProjectHelper::ENVIRONMENT)
|
511
|
+
expect(cloned_project.title).to eq title
|
512
|
+
expect(cloned_project.facts.first.create_metric.execute).to eq 9
|
513
|
+
m = @project.facts.first.create_metric
|
514
|
+
m.identifier = 'metric.cloned_metric'
|
515
|
+
m.save
|
516
|
+
|
517
|
+
result = @project.transfer_objects(m, project: cloned_project)
|
518
|
+
expect(result).to be_truthy
|
519
|
+
cloned_metric = cloned_project.metrics('metric.cloned_metric')
|
520
|
+
expect(cloned_metric).not_to be_nil
|
521
|
+
|
522
|
+
cloned_metric.delete
|
523
|
+
cloned_metric = cloned_project.metrics('metric.cloned_metric')
|
524
|
+
expect(cloned_metric).to be_nil
|
525
|
+
|
526
|
+
result = @project.transfer_objects(m, project: [cloned_project], batch_size: 1)
|
527
|
+
expect(result).to eq [{project: cloned_project, result: true}]
|
528
|
+
|
529
|
+
# should work with pids
|
530
|
+
result = @project.transfer_objects(m, project: [cloned_project.pid], batch_size: 1)
|
531
|
+
expect(result.first[:result]).to be_truthy
|
532
|
+
ensure
|
533
|
+
cloned_project.delete
|
534
|
+
end
|
535
|
+
end
|
536
|
+
|
537
|
+
it "should be able to clone a project without data" do
|
538
|
+
title = 'My new clone project'
|
539
|
+
cloned_project = @project.clone(title: title, auth_token: ConnectionHelper::GD_PROJECT_TOKEN, environment: ProjectHelper::ENVIRONMENT, data: false)
|
540
|
+
expect(cloned_project.title).to eq title
|
541
|
+
expect(cloned_project.facts.first.create_metric.execute).to eq nil
|
542
|
+
cloned_project.delete
|
543
|
+
end
|
544
|
+
|
545
|
+
it "should be able to export report" do
|
546
|
+
m = @project.metrics.first
|
547
|
+
r = @project.create_report(top: [m], title: 'Report to export')
|
548
|
+
r.save
|
549
|
+
r.export(:csv)
|
550
|
+
r.export(:pdf)
|
551
|
+
r.delete
|
552
|
+
end
|
553
|
+
|
554
|
+
it "should be able to delete report along with its definitions" do
|
555
|
+
m = @project.metrics.first
|
556
|
+
r = @project.create_report(top: [m], title: 'Report to delete')
|
557
|
+
r.save
|
558
|
+
def_uris = r.definition_uris
|
559
|
+
r.delete
|
560
|
+
expect { def_uris.each {|uri| @client.get(uri)} }.to raise_error(RestClient::ResourceNotFound)
|
561
|
+
end
|
562
|
+
|
563
|
+
it 'should be possible to delete data from a dataset' do
|
564
|
+
dataset = @project.datasets('dataset.devs')
|
565
|
+
expect(dataset.attributes.first.create_metric.execute).to be > 0
|
566
|
+
dataset.delete_data
|
567
|
+
expect(dataset.attributes.first.create_metric.execute).to be_nil
|
568
|
+
end
|
569
|
+
end
|