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,15 @@
|
|
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
|
+
class FalseClass
|
8
|
+
# +false+ is not duplicable:
|
9
|
+
#
|
10
|
+
# false.duplicable? # => false
|
11
|
+
# false.dup # => TypeError: can't dup FalseClass
|
12
|
+
def duplicable?
|
13
|
+
false
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,38 @@
|
|
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
|
+
class Hash
|
8
|
+
# Return a hash that includes everything but the given keys. This is useful for
|
9
|
+
# limiting a set of parameters to everything but a few known toggles:
|
10
|
+
#
|
11
|
+
# @person.update_attributes(params[:person].except(:admin))
|
12
|
+
#
|
13
|
+
# If the receiver responds to +convert_key+, the method is called on each of the
|
14
|
+
# arguments. This allows +except+ to play nice with hashes with indifferent access
|
15
|
+
# for instance:
|
16
|
+
#
|
17
|
+
# {:a => 1}.with_indifferent_access.except(:a) # => {}
|
18
|
+
# {:a => 1}.with_indifferent_access.except("a") # => {}
|
19
|
+
#
|
20
|
+
def except(*keys)
|
21
|
+
dup.except!(*keys)
|
22
|
+
end
|
23
|
+
|
24
|
+
# Replaces the hash without the given keys.
|
25
|
+
def except!(*keys)
|
26
|
+
keys.each { |key| delete(key) }
|
27
|
+
self
|
28
|
+
end
|
29
|
+
|
30
|
+
def slice(*keys)
|
31
|
+
keys.map! { |key| convert_key(key) } if respond_to?(:convert_key, true)
|
32
|
+
keys.each_with_object(self.class.new) { |k, hash| hash[k] = self[k] if key?(k) }
|
33
|
+
end
|
34
|
+
|
35
|
+
def compact
|
36
|
+
select { |_, value| !value.nil? }
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,15 @@
|
|
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
|
+
class NilClass
|
8
|
+
# +nil+ is not duplicable:
|
9
|
+
#
|
10
|
+
# nil.duplicable? # => false
|
11
|
+
# nil.dup # => TypeError: can't dup NilClass
|
12
|
+
def duplicable?
|
13
|
+
false
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
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
|
+
class Numeric
|
8
|
+
# Numbers are not duplicable:
|
9
|
+
#
|
10
|
+
# 3.duplicable? # => false
|
11
|
+
# 3.dup # => TypeError: can't dup Fixnum
|
12
|
+
def duplicable?
|
13
|
+
false
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,27 @@
|
|
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
|
+
class Object
|
8
|
+
class << self
|
9
|
+
def set_const(name, val)
|
10
|
+
send(:remove_const, name) if const_defined?(name)
|
11
|
+
send(:const_set, name, val)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def blank?
|
16
|
+
respond_to?(:empty?) ? empty? : !self
|
17
|
+
end
|
18
|
+
|
19
|
+
def duplicable?
|
20
|
+
true
|
21
|
+
end
|
22
|
+
|
23
|
+
def set_const(name, val)
|
24
|
+
send(:remove_const, name) if const_defined?(name)
|
25
|
+
send(:const_set, name, val)
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,15 @@
|
|
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
|
+
class Symbol
|
8
|
+
# Symbols are not duplicable:
|
9
|
+
#
|
10
|
+
# :my_symbol.duplicable? # => false
|
11
|
+
# :my_symbol.dup # => TypeError: can't dup Symbol
|
12
|
+
def duplicable?
|
13
|
+
false
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
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
|
+
class TrueClass
|
8
|
+
# +true+ is not duplicable:
|
9
|
+
#
|
10
|
+
# true.duplicable? # => false
|
11
|
+
# true.dup # => TypeError: can't dup TrueClass
|
12
|
+
def duplicable?
|
13
|
+
false
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,21 @@
|
|
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 'csv'
|
8
|
+
|
9
|
+
module GoodData
|
10
|
+
module Extract
|
11
|
+
class CsvFile
|
12
|
+
def initialize(file)
|
13
|
+
@file = file
|
14
|
+
end
|
15
|
+
|
16
|
+
def read(&block)
|
17
|
+
CSV.open @file, 'r', &block
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,159 @@
|
|
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
|
+
module GoodData
|
8
|
+
module SmallGoodZilla
|
9
|
+
class << self
|
10
|
+
# Scans the provided MAQL and returns Array pairs of [attribute, element] pairs for each element that is found in the definition
|
11
|
+
# @param maql Input MAQL string
|
12
|
+
# @return [Array<Array>] Pairs [attribute, attribute_element]
|
13
|
+
def extract_element_uri_pairs(maql)
|
14
|
+
arr = maql.scan(%r{\[([^\[\]]*)\/elements\?id=(\d+)\]}).flatten
|
15
|
+
evens = arr.select.each_with_index { |_, i| i.even? }
|
16
|
+
odds = arr.select.each_with_index { |_, i| i.odd? }.map(&:to_i)
|
17
|
+
evens.zip(odds)
|
18
|
+
end
|
19
|
+
|
20
|
+
# Scans the provided MAQL and returns Array of all the URIs included in the MAQL. This basically return anything that is enclosed in aquare brackets []
|
21
|
+
# @param maql Input MAQL string
|
22
|
+
# @return [Array<String>] Pairs of URIs
|
23
|
+
def get_uris(a_maql_string)
|
24
|
+
a_maql_string.scan(/\[([^\"\]]+)\]/).flatten.uniq
|
25
|
+
end
|
26
|
+
|
27
|
+
# Get IDs from extendedMAQL string
|
28
|
+
# @param a_maql_string Input MAQL string
|
29
|
+
# @return [Array<String>] List of IDS
|
30
|
+
def get_ids(a_maql_string)
|
31
|
+
a_maql_string.scan(/!\[([^\"\]]+)\]/).flatten.uniq
|
32
|
+
end
|
33
|
+
|
34
|
+
# Get Facts from extendedMAQL string
|
35
|
+
# @param a_maql_string Input MAQL string
|
36
|
+
# @return [Array<String>] List of Facts
|
37
|
+
def get_facts(a_maql_string)
|
38
|
+
a_maql_string.scan(/#\"([^\"]+)\"/).flatten
|
39
|
+
end
|
40
|
+
|
41
|
+
# Get Attributes from extendedMAQL string
|
42
|
+
# @param a_maql_string Input MAQL string
|
43
|
+
# @return [Array<String>] List of Attributes
|
44
|
+
def get_attributes(a_maql_string)
|
45
|
+
a_maql_string.scan(/@\"([^\"]+)\"/).flatten
|
46
|
+
end
|
47
|
+
|
48
|
+
# Get Metrics from extendedMAQL string
|
49
|
+
# @param a_maql_string Input MAQL string
|
50
|
+
# @return [Array<String>] List of Metrics
|
51
|
+
def get_metrics(a_maql_string)
|
52
|
+
a_maql_string.scan(/\?"([^\"]+)\"/).flatten
|
53
|
+
end
|
54
|
+
|
55
|
+
alias_method :get_measures, :get_metrics
|
56
|
+
|
57
|
+
# Method takes a specification of the attribute filter (category filter) and returns it representation that is
|
58
|
+
# suitable for posting on the API. The spec is expected to be an array. First object can be an attribute (id, obj_id or
|
59
|
+
# directly an object). Alternativel it can be an attribute (again any representation should work). In case of attribute
|
60
|
+
# primary label is taken. The rest of the array are expected to be String represenation of values of particular label.
|
61
|
+
#
|
62
|
+
# For example it could look like
|
63
|
+
# ['label.states.name', 'California', 'New Jersey', 'Kansas']
|
64
|
+
#
|
65
|
+
# @param spec [Array<Object>] Input MAQL string
|
66
|
+
# @return [Array<Hash>] List of Metrics
|
67
|
+
def create_category_filter(spec, project)
|
68
|
+
item = project.objects(spec.first)
|
69
|
+
label = item.is_a?(GoodData::Attribute) ? item.primary_label : item
|
70
|
+
col = spec[1..-1].flat_map do |v|
|
71
|
+
case v
|
72
|
+
when Range
|
73
|
+
v.to_a
|
74
|
+
when Symbol
|
75
|
+
[v]
|
76
|
+
else
|
77
|
+
[v.to_s]
|
78
|
+
end
|
79
|
+
end
|
80
|
+
if col.first == :not
|
81
|
+
values = col[1..-1].map { |v| label.find_value_uri(v) }
|
82
|
+
elements = values.map { |v| "[#{v}]" }.join(', ')
|
83
|
+
{ expression: "[#{label.attribute.uri}] NOT IN (#{elements})" }
|
84
|
+
else
|
85
|
+
values = col.map { |v| label.find_value_uri(v) }
|
86
|
+
elements = values.map { |v| "[#{v}]" }.join(', ')
|
87
|
+
{ expression: "[#{label.attribute.uri}] IN (#{elements})" }
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
# Pretty prints the MAQL expression. This basically means it finds out names of objects and elements and print their values instead of URIs
|
92
|
+
# @param expression [String] Expression to be beautified
|
93
|
+
# @return [String] Pretty printed MAQL expression
|
94
|
+
def pretty_print(expression, opts = { client: GoodData.connection, project: GoodData.project })
|
95
|
+
temp = expression.dup
|
96
|
+
pairs = get_uris(expression).pmap do |uri|
|
97
|
+
if uri =~ /elements/
|
98
|
+
begin
|
99
|
+
[uri, Attribute.find_element_value(uri, opts)]
|
100
|
+
rescue AttributeElementNotFound
|
101
|
+
[uri, '(empty value)']
|
102
|
+
end
|
103
|
+
else
|
104
|
+
[uri, GoodData::MdObject[uri, opts].title]
|
105
|
+
end
|
106
|
+
end
|
107
|
+
pairs.each do |el|
|
108
|
+
uri = el[0]
|
109
|
+
obj = el[1]
|
110
|
+
temp.sub!(uri, obj)
|
111
|
+
end
|
112
|
+
temp
|
113
|
+
end
|
114
|
+
|
115
|
+
def interpolate(values, dictionaries)
|
116
|
+
{
|
117
|
+
:facts => interpolate_values(values[:facts], dictionaries[:facts]),
|
118
|
+
:attributes => interpolate_values(values[:attributes], dictionaries[:attributes]),
|
119
|
+
:metrics => interpolate_values(values[:metrics], dictionaries[:metrics])
|
120
|
+
}
|
121
|
+
end
|
122
|
+
|
123
|
+
def interpolate_ids(options, *ids)
|
124
|
+
ids = ids.flatten
|
125
|
+
if ids.empty?
|
126
|
+
[]
|
127
|
+
else
|
128
|
+
res = GoodData::MdObject.identifier_to_uri(options, *ids)
|
129
|
+
fail 'Not all of the identifiers were resolved' if Array(res).size != ids.size
|
130
|
+
res
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
def interpolate_values(keys, values)
|
135
|
+
x = values.values_at(*keys)
|
136
|
+
keys.zip(x)
|
137
|
+
end
|
138
|
+
|
139
|
+
def interpolate_metric(metric, dictionary, options = { :client => GoodData.connection, :project => GoodData.project })
|
140
|
+
interpolated = interpolate({
|
141
|
+
:facts => GoodData::SmallGoodZilla.get_facts(metric),
|
142
|
+
:attributes => GoodData::SmallGoodZilla.get_attributes(metric),
|
143
|
+
:metrics => GoodData::SmallGoodZilla.get_metrics(metric)
|
144
|
+
}, dictionary)
|
145
|
+
|
146
|
+
ids = GoodData::SmallGoodZilla.get_ids(metric)
|
147
|
+
interpolated_ids = ids.zip(Array(interpolate_ids(options, ids)))
|
148
|
+
|
149
|
+
metric = interpolated[:facts].reduce(metric) { |a, e| a.sub("#\"#{e[0]}\"", "[#{e[1]}]") }
|
150
|
+
metric = interpolated[:attributes].reduce(metric) { |a, e| a.sub("@\"#{e[0]}\"", "[#{e[1]}]") }
|
151
|
+
metric = interpolated[:metrics].reduce(metric) { |a, e| a.sub("?\"#{e[0]}\"", "[#{e[1]}]") }
|
152
|
+
metric = interpolated_ids.reduce(metric) { |a, e| a.gsub("![#{e[0]}]", "[#{e[1]}]") }
|
153
|
+
metric
|
154
|
+
end
|
155
|
+
|
156
|
+
alias_method :interpolate_measure, :interpolate_metric
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
@@ -0,0 +1,75 @@
|
|
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 'fileutils'
|
8
|
+
require 'json'
|
9
|
+
|
10
|
+
require_relative 'global_helpers'
|
11
|
+
|
12
|
+
module GoodData
|
13
|
+
module Helpers
|
14
|
+
module AuthHelper
|
15
|
+
class << self
|
16
|
+
# Get path of .gooddata config
|
17
|
+
def credentials_file
|
18
|
+
"#{Helpers.home_directory}/.gooddata"
|
19
|
+
end
|
20
|
+
|
21
|
+
# Read credentials
|
22
|
+
def read_credentials(credentials_file_path = credentials_file)
|
23
|
+
if File.exist?(credentials_file_path)
|
24
|
+
config = File.read(credentials_file_path)
|
25
|
+
MultiJson.load(config, :symbolize_keys => true)
|
26
|
+
else
|
27
|
+
{}
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# Try read environemnt
|
32
|
+
#
|
33
|
+
# Tries to read it from ~/.gooddata file or from environment variable GD_SERVER
|
34
|
+
# @param [String] credentials_file_path (credentials_file) Path to .gooddata file
|
35
|
+
# @return [String] server token from environment variable, .gooddata or nil
|
36
|
+
def read_environment(credentials_file_path = credentials_file)
|
37
|
+
goodfile = read_credentials(credentials_file_path)
|
38
|
+
[ENV['GD_ENVIRONMENT'], goodfile[:environment], GoodData::Project::DEFAULT_ENVIRONMENT].find { |x| !x.nil? && !x.empty? }
|
39
|
+
end
|
40
|
+
|
41
|
+
# Try read server
|
42
|
+
#
|
43
|
+
# Tries to read it from ~/.gooddata file or from environment variable GD_SERVER
|
44
|
+
# @param [String] credentials_file_path (credentials_file) Path to .gooddata file
|
45
|
+
# @return [String] server token from environment variable, .gooddata or DEFAULT_URL
|
46
|
+
def read_server(credentials_file_path = credentials_file)
|
47
|
+
goodfile = read_credentials(credentials_file_path)
|
48
|
+
[ENV['GD_SERVER'], goodfile[:server], GoodData::Rest::Connection::DEFAULT_URL].find { |x| !x.nil? && !x.empty? }
|
49
|
+
end
|
50
|
+
|
51
|
+
# Try read token
|
52
|
+
#
|
53
|
+
# Tries to read it from ~/.gooddata file or from environment variable GD_PROJECT_TOKEN
|
54
|
+
# @param [String] credentials_file_path (credentials_file) Path to .gooddata file
|
55
|
+
# @return [String] auth token from environment variable, .gooddata or nil
|
56
|
+
def read_token(credentials_file_path = credentials_file)
|
57
|
+
goodfile = read_credentials(credentials_file_path)
|
58
|
+
[ENV['GD_PROJECT_TOKEN'], goodfile[:auth_token], goodfile[:token]].find { |x| !x.nil? && !x.empty? }
|
59
|
+
end
|
60
|
+
|
61
|
+
# Writes credentials
|
62
|
+
def write_credentials(credentials, credentials_file_path = credentials_file)
|
63
|
+
File.open(credentials_file_path, 'w', 0600) do |f|
|
64
|
+
f.puts JSON.pretty_generate(credentials)
|
65
|
+
end
|
66
|
+
credentials
|
67
|
+
end
|
68
|
+
|
69
|
+
def remove_credentials_file(credentials_file_path = credentials_file)
|
70
|
+
FileUtils.rm_f(credentials_file_path)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
#
|
3
|
+
# Copyright (c) 2010-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 'csv'
|
8
|
+
|
9
|
+
module GoodData
|
10
|
+
module Helpers
|
11
|
+
class Csv
|
12
|
+
class << self
|
13
|
+
# Read data from CSV
|
14
|
+
#
|
15
|
+
# @param [Hash] opts
|
16
|
+
# @option opts [String] :path File to read data from
|
17
|
+
# @option opts [Boolean] :header File to read data from
|
18
|
+
# @return Array of rows with loaded data
|
19
|
+
def read(opts)
|
20
|
+
path = opts[:path]
|
21
|
+
res = []
|
22
|
+
|
23
|
+
line = 0
|
24
|
+
|
25
|
+
CSV.foreach(path) do |row|
|
26
|
+
line += 1
|
27
|
+
next if opts[:header] && line == 1
|
28
|
+
|
29
|
+
if block_given?
|
30
|
+
data = yield row
|
31
|
+
else
|
32
|
+
data = row
|
33
|
+
end
|
34
|
+
|
35
|
+
res << data if data
|
36
|
+
end
|
37
|
+
|
38
|
+
res
|
39
|
+
end
|
40
|
+
|
41
|
+
# Write data to CSV
|
42
|
+
# @option opts [String] :path File to write data to
|
43
|
+
# @option opts [Array] :data Mandatory array of data to write
|
44
|
+
# @option opts [String] :header Optional Header row
|
45
|
+
def write(opts, &_block)
|
46
|
+
path = opts[:path]
|
47
|
+
header = opts[:header]
|
48
|
+
data = opts[:data]
|
49
|
+
|
50
|
+
CSV.open(path, 'w') do |csv|
|
51
|
+
csv << header unless header.nil?
|
52
|
+
data.each do |entry|
|
53
|
+
res = yield entry
|
54
|
+
csv << res if res
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|