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,39 @@
|
|
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 'highline/import'
|
8
|
+
require 'multi_json'
|
9
|
+
|
10
|
+
require_relative '../core/core'
|
11
|
+
|
12
|
+
module GoodData
|
13
|
+
module Command
|
14
|
+
class User
|
15
|
+
class << self
|
16
|
+
def roles(pid)
|
17
|
+
roles_response = GoodData.get("/gdc/projects/#{pid}/roles")
|
18
|
+
|
19
|
+
roles = {}
|
20
|
+
roles_response['projectRoles']['roles'].each do |role_uri|
|
21
|
+
r = GoodData.get(role_uri)
|
22
|
+
identifier = r['projectRole']['meta']['identifier']
|
23
|
+
roles[identifier] = {
|
24
|
+
:user_uri => r['projectRole']['links']['roleUsers'],
|
25
|
+
:uri => role_uri
|
26
|
+
}
|
27
|
+
end
|
28
|
+
roles
|
29
|
+
end
|
30
|
+
|
31
|
+
def show(opts = { client: GoodData.connection })
|
32
|
+
client = opts[:client]
|
33
|
+
fail ArgumentError, 'No :client specified' if client.nil?
|
34
|
+
pp client.user.json
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,127 @@
|
|
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 'uri'
|
8
|
+
|
9
|
+
require_relative 'core/logging'
|
10
|
+
|
11
|
+
require_relative 'rest/rest'
|
12
|
+
|
13
|
+
module GoodData
|
14
|
+
class << self
|
15
|
+
DEFAULT_SSO_OPTIONS = {
|
16
|
+
:url => '/gdc/app/account/bootstrap',
|
17
|
+
:valid => 24 * 60 * 60
|
18
|
+
}
|
19
|
+
|
20
|
+
# Returns the active GoodData connection earlier initialized via GoodData.connect call
|
21
|
+
#
|
22
|
+
# @see GoodData.connect
|
23
|
+
def connection
|
24
|
+
# TODO: Remove this after successful rest-factory transition
|
25
|
+
Rest::Client.connection # || fail('Please authenticate with GoodData.connect first')
|
26
|
+
end
|
27
|
+
|
28
|
+
alias_method :client, :connection
|
29
|
+
|
30
|
+
# Connect to the GoodData API
|
31
|
+
#
|
32
|
+
# @param options
|
33
|
+
# @param second_options
|
34
|
+
# @param third_options
|
35
|
+
#
|
36
|
+
def connect(options = nil, second_options = nil, third_options = {})
|
37
|
+
Rest::Client.connect(options, second_options, third_options)
|
38
|
+
end
|
39
|
+
|
40
|
+
# Disconnect (logout) if logged in
|
41
|
+
def disconnect
|
42
|
+
Rest::Client.disconnect
|
43
|
+
end
|
44
|
+
|
45
|
+
def with_connection(options = nil, second_options = nil, third_options = {}, &bl)
|
46
|
+
connection = connect(options, second_options, third_options)
|
47
|
+
bl.call(connection)
|
48
|
+
rescue Exception => e # rubocop:disable RescueException
|
49
|
+
puts e.message
|
50
|
+
raise e
|
51
|
+
ensure
|
52
|
+
disconnect
|
53
|
+
end
|
54
|
+
|
55
|
+
# Generates SSO URL
|
56
|
+
#
|
57
|
+
# This SSO implementation is custom implementation provided by GoodData
|
58
|
+
# that allows your application to sign in an existing GoodData user.
|
59
|
+
# The authentication is done not by username and password but by generating a session
|
60
|
+
# specific token using pair of PGP keys.
|
61
|
+
#
|
62
|
+
# @see https://developer.gooddata.com/article/single-sign-on
|
63
|
+
#
|
64
|
+
# @param [String] login Email address used for logging into gooddata
|
65
|
+
# @param [String] provider Name of SSO provider
|
66
|
+
# @param [Hash] opts Additional options
|
67
|
+
# @option opts [Fixnum] :validity Validity in seconds from 'now'
|
68
|
+
# @return [String] URL which can be used for SSO logging in
|
69
|
+
def sso_url(login, provider, opts = DEFAULT_SSO_OPTIONS)
|
70
|
+
opts = DEFAULT_SSO_OPTIONS.merge(opts)
|
71
|
+
|
72
|
+
ts = DateTime.now.strftime('%s').to_i + opts[:valid]
|
73
|
+
obj = {
|
74
|
+
'email' => login,
|
75
|
+
'validity' => ts
|
76
|
+
}
|
77
|
+
|
78
|
+
json_data = JSON.pretty_generate(obj) + "\n"
|
79
|
+
|
80
|
+
file_json = Tempfile.new('gooddata-sso-json')
|
81
|
+
file_json.write(json_data)
|
82
|
+
|
83
|
+
file_json.rewind
|
84
|
+
file_signed = Tempfile.new('gooddata-sso-signed')
|
85
|
+
|
86
|
+
cmd = "gpg --no-tty --armor --yes -u #{login} --output #{file_signed.path} --sign #{file_json.path}"
|
87
|
+
res = system(cmd)
|
88
|
+
fail 'Unable to sign json' unless res
|
89
|
+
|
90
|
+
file_signed.rewind
|
91
|
+
file_final = Tempfile.new('gooddata-sso-final')
|
92
|
+
|
93
|
+
cmd = "gpg --yes --no-tty --trust-model always --armor --output #{file_final.path} --encrypt --recipient security@gooddata.com #{file_signed.path}"
|
94
|
+
res = system(cmd)
|
95
|
+
fail 'Unable to encrypt json' unless res
|
96
|
+
|
97
|
+
file_final.rewind
|
98
|
+
final = file_final.read
|
99
|
+
|
100
|
+
"#{GoodData::Helpers::AuthHelper.read_server}/gdc/account/customerlogin?sessionId=#{CGI.escape(final)}&serverURL=#{CGI.escape(provider)}&targetURL=#{CGI.escape(opts[:url])}"
|
101
|
+
end
|
102
|
+
|
103
|
+
# Connect to GoodData using SSO
|
104
|
+
#
|
105
|
+
# This SSO implementation is custom implementation provided by GoodData
|
106
|
+
# that allows your application to sign in an existing GoodData user.
|
107
|
+
# The authentication is done not by username and password but by generating a session
|
108
|
+
# specific token using pair of PGP keys.
|
109
|
+
#
|
110
|
+
# @see https://developer.gooddata.com/article/single-sign-on
|
111
|
+
#
|
112
|
+
# @param [String] login Email address used for logging into gooddata
|
113
|
+
# @param [String] provider Name of SSO provider
|
114
|
+
# @return [GoodData::Rest::Client] Instance of REST client
|
115
|
+
def connect_sso(login, provider)
|
116
|
+
url = sso_url(login, provider)
|
117
|
+
|
118
|
+
params = {
|
119
|
+
:x_gdc_request => "#{GoodData::Rest::Connection.generate_string}:#{GoodData::Rest::Connection.generate_string}"
|
120
|
+
}
|
121
|
+
|
122
|
+
RestClient.get url, params do |response, _request, _result|
|
123
|
+
Rest::Client.connect_sso(:sst_token => URI.decode(response.cookies['GDCAuthSST']))
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
@@ -0,0 +1,12 @@
|
|
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 'pathname'
|
8
|
+
|
9
|
+
base = Pathname(__FILE__).dirname.expand_path
|
10
|
+
Dir.glob(base + '*.rb').each do |file|
|
11
|
+
require file
|
12
|
+
end
|
@@ -0,0 +1,105 @@
|
|
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 'rest-client'
|
8
|
+
|
9
|
+
require_relative 'nil_logger'
|
10
|
+
|
11
|
+
module GoodData
|
12
|
+
DEFAULT_LOG_LEVEL = Logger::INFO
|
13
|
+
DEFAULT_LOG_OUTPUT = STDOUT
|
14
|
+
DEFAULT_LOGGER_CLASS = Logger
|
15
|
+
|
16
|
+
DEFAULT_RESTLOG_LEVEL = Logger::INFO
|
17
|
+
DEFAULT_RESTLOG_OUTPUT = STDOUT
|
18
|
+
DEFAULT_RESTLOGGER_CLASS = Logger
|
19
|
+
|
20
|
+
class << self
|
21
|
+
attr_accessor :logger, :rest_logger
|
22
|
+
attr_writer :stats
|
23
|
+
|
24
|
+
# Turn logging on
|
25
|
+
#
|
26
|
+
# ### Example
|
27
|
+
#
|
28
|
+
# # Turn of default logging
|
29
|
+
# GoodData.logging_on
|
30
|
+
#
|
31
|
+
# # Log only WARN and higher
|
32
|
+
# GoodData.logging_on(Logger::WARN)
|
33
|
+
#
|
34
|
+
# # Log DEBUG and above to file
|
35
|
+
# GoodData.logging_on(Logger::DEBUG, 'log.txt')
|
36
|
+
#
|
37
|
+
def logging_on(level = DEFAULT_LOG_LEVEL, output = DEFAULT_LOG_OUTPUT, klass = DEFAULT_LOGGER_CLASS)
|
38
|
+
@logger = klass.new(output)
|
39
|
+
@logger.level = level
|
40
|
+
@logger
|
41
|
+
end
|
42
|
+
|
43
|
+
# Turn logging on
|
44
|
+
#
|
45
|
+
# ### Example
|
46
|
+
#
|
47
|
+
# GoodData.logging_off
|
48
|
+
#
|
49
|
+
def logging_off
|
50
|
+
@logger = NilLogger.new
|
51
|
+
end
|
52
|
+
|
53
|
+
def logging_on?
|
54
|
+
!@logger.instance_of?(NilLogger)
|
55
|
+
end
|
56
|
+
|
57
|
+
# Turn logging on with HTTP included
|
58
|
+
#
|
59
|
+
# ### Example
|
60
|
+
#
|
61
|
+
# GoodData.logging_http_on
|
62
|
+
#
|
63
|
+
def logging_http_on(level = DEFAULT_RESTLOG_LEVEL, output = DEFAULT_RESTLOG_OUTPUT, klass = DEFAULT_RESTLOGGER_CLASS)
|
64
|
+
@logger = klass.new(output)
|
65
|
+
@logger.level = level
|
66
|
+
@logger
|
67
|
+
end
|
68
|
+
|
69
|
+
# Turn logging on
|
70
|
+
#
|
71
|
+
# ### Example
|
72
|
+
#
|
73
|
+
# GoodData.logging_http_off
|
74
|
+
#
|
75
|
+
def logging_http_off
|
76
|
+
@rest_client = NilLogger.new
|
77
|
+
end
|
78
|
+
|
79
|
+
def logging_http_on?
|
80
|
+
!@rest_client.instance_of?(NilLogger)
|
81
|
+
end
|
82
|
+
|
83
|
+
def stats_on
|
84
|
+
@stats = true
|
85
|
+
end
|
86
|
+
|
87
|
+
def stats_on?
|
88
|
+
@stats
|
89
|
+
end
|
90
|
+
|
91
|
+
def stats_off
|
92
|
+
@stats = false
|
93
|
+
end
|
94
|
+
|
95
|
+
# Initial setup of logger
|
96
|
+
GoodData.logger = GoodData.logging_on
|
97
|
+
|
98
|
+
# Initial setup of rest logger
|
99
|
+
GoodData.rest_logger = GoodData.logging_http_on(
|
100
|
+
nil,
|
101
|
+
DEFAULT_RESTLOG_OUTPUT,
|
102
|
+
NilLogger
|
103
|
+
)
|
104
|
+
end
|
105
|
+
end
|
@@ -0,0 +1,23 @@
|
|
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
|
+
# Dummy implementation of logger
|
9
|
+
class NilLogger
|
10
|
+
attr_accessor :level
|
11
|
+
|
12
|
+
def initialize(*_args)
|
13
|
+
@level = nil
|
14
|
+
end
|
15
|
+
|
16
|
+
def debug(*_args)
|
17
|
+
end
|
18
|
+
|
19
|
+
alias_method :info, :debug
|
20
|
+
alias_method :warn, :debug
|
21
|
+
alias_method :error, :debug
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,74 @@
|
|
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
|
+
@project = nil
|
9
|
+
|
10
|
+
class << self
|
11
|
+
# Sets the active project
|
12
|
+
#
|
13
|
+
# @param project A project identifier
|
14
|
+
#
|
15
|
+
# ### Examples
|
16
|
+
#
|
17
|
+
# The following calls are equivalent
|
18
|
+
#
|
19
|
+
# # Assign project ID
|
20
|
+
# GoodData.project = 'afawtv356b6usdfsdf34vt'
|
21
|
+
#
|
22
|
+
# # Use project ID
|
23
|
+
# GoodData.use 'afawtv356b6usdfsdf34vt'
|
24
|
+
#
|
25
|
+
# # Use project URL
|
26
|
+
# GoodData.use '/gdc/projects/afawtv356b6usdfsdf34vt'
|
27
|
+
#
|
28
|
+
# # Select project using indexer on GoodData::Project class
|
29
|
+
# GoodData.project = Project['afawtv356b6usdfsdf34vt']
|
30
|
+
# Assigns global/default GoodData project
|
31
|
+
def project=(project, opts = { :client => GoodData.connection })
|
32
|
+
if project.is_a? Project
|
33
|
+
@project = project
|
34
|
+
elsif project.nil?
|
35
|
+
@project = nil
|
36
|
+
else
|
37
|
+
@project = Project[project, opts]
|
38
|
+
end
|
39
|
+
@project
|
40
|
+
end
|
41
|
+
|
42
|
+
alias_method :use, :project=
|
43
|
+
|
44
|
+
attr_reader :project
|
45
|
+
|
46
|
+
# Returns the active project
|
47
|
+
#
|
48
|
+
# def project
|
49
|
+
# threaded[:project]
|
50
|
+
# end
|
51
|
+
|
52
|
+
# Perform block in context of another project than currently set
|
53
|
+
#
|
54
|
+
# @param project Project to use
|
55
|
+
# @param bl Block to be performed
|
56
|
+
def with_project(project, opts = { :client => GoodData.connection }, &bl)
|
57
|
+
fail 'You have to specify a project when using with_project' if project.nil? || (project.is_a?(String) && project.empty?)
|
58
|
+
fail 'You have to specify block' unless bl
|
59
|
+
old_project = GoodData.project
|
60
|
+
|
61
|
+
begin
|
62
|
+
GoodData.use(project, opts)
|
63
|
+
res = bl.call(GoodData.project)
|
64
|
+
rescue RestClient::ResourceNotFound
|
65
|
+
GoodData.project = old_project
|
66
|
+
raise(GoodData::ProjectNotFound, 'Project was not found')
|
67
|
+
end
|
68
|
+
|
69
|
+
GoodData.project = old_project
|
70
|
+
|
71
|
+
res
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,149 @@
|
|
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
|
+
class << self
|
9
|
+
# Performs a HTTP GET request.
|
10
|
+
#
|
11
|
+
# Retuns the JSON response formatted as a Hash object.
|
12
|
+
#
|
13
|
+
# @param path The HTTP path on the GoodData server (must be prefixed with a forward slash)
|
14
|
+
#
|
15
|
+
# ### Examples
|
16
|
+
#
|
17
|
+
# GoodData.get '/gdc/projects'
|
18
|
+
#
|
19
|
+
def get(path, options = {})
|
20
|
+
connection.get(path, options)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Performs a HTTP POST request.
|
24
|
+
#
|
25
|
+
# Retuns the JSON response formatted as a Hash object.
|
26
|
+
#
|
27
|
+
# @param path The HTTP path on the GoodData server (must be prefixed with a forward slash)
|
28
|
+
# @param data The payload data in the format of a Hash object
|
29
|
+
#
|
30
|
+
# ### Examples
|
31
|
+
#
|
32
|
+
# client.post '/gdc/projects', { ... }
|
33
|
+
#
|
34
|
+
def post(path, data = {}, options = {})
|
35
|
+
connection.post path, data, options
|
36
|
+
end
|
37
|
+
|
38
|
+
# Performs a HTTP PUT request.
|
39
|
+
#
|
40
|
+
# Retuns the JSON response formatted as a Hash object.
|
41
|
+
#
|
42
|
+
# ### Parameters
|
43
|
+
#
|
44
|
+
# @param path The HTTP path on the GoodData server (must be prefixed with a forward slash)
|
45
|
+
# @param data The payload data in the format of a Hash object
|
46
|
+
#
|
47
|
+
# ### Examples
|
48
|
+
#
|
49
|
+
# client.put '/gdc/projects', { ... }
|
50
|
+
#
|
51
|
+
def put(path, data, options = {})
|
52
|
+
connection.put path, data, options
|
53
|
+
end
|
54
|
+
|
55
|
+
# Performs a HTTP DELETE request.
|
56
|
+
#
|
57
|
+
# Retuns the JSON response formatted as a Hash object.
|
58
|
+
#
|
59
|
+
# @param path The HTTP path on the GoodData server (must be prefixed with a forward slash)
|
60
|
+
#
|
61
|
+
# ### Examples
|
62
|
+
#
|
63
|
+
# GoodData.delete '/gdc/project/1'
|
64
|
+
#
|
65
|
+
def delete(path, options = {})
|
66
|
+
connection.delete path, options
|
67
|
+
end
|
68
|
+
|
69
|
+
# Upload to user directory
|
70
|
+
# @return [String]
|
71
|
+
def upload_to_user_webdav(file, options = {})
|
72
|
+
url = user_webdav_path({ :client => GoodData.client }.merge(options))
|
73
|
+
connection.upload(file, options.merge(staging_url: url))
|
74
|
+
end
|
75
|
+
|
76
|
+
# Get WebDav directory for project data
|
77
|
+
# @return [String]
|
78
|
+
def project_webdav_path(options = {})
|
79
|
+
options = merge_options(options)
|
80
|
+
project = options[:project]
|
81
|
+
project.project_webdav_path
|
82
|
+
end
|
83
|
+
|
84
|
+
# Upload to project directory
|
85
|
+
def upload_to_project_webdav(file, options = {})
|
86
|
+
options = merge_options(options)
|
87
|
+
url = project_webdav_path(options)
|
88
|
+
connection.upload(file, options.merge(:staging_url => url))
|
89
|
+
end
|
90
|
+
|
91
|
+
# Download from project directory
|
92
|
+
def download_from_project_webdav(file, where, options = {})
|
93
|
+
options = merge_options(options)
|
94
|
+
url = project_webdav_path(options)
|
95
|
+
connection.download(file, where, options.merge(:staging_url => url))
|
96
|
+
end
|
97
|
+
|
98
|
+
# Get WebDav directory for user data
|
99
|
+
# @return [String]
|
100
|
+
def user_webdav_path(options = {})
|
101
|
+
client = GoodData::Rest::Object.client({ :client => GoodData.client }.merge(options))
|
102
|
+
client.user_webdav_path
|
103
|
+
end
|
104
|
+
|
105
|
+
# Download from user directory
|
106
|
+
def download_from_user_webdav(file, where, options = {})
|
107
|
+
url = user_webdav_path({ :client => GoodData.client }.merge(options))
|
108
|
+
connection.download(file, where, options.merge(:staging_url => url))
|
109
|
+
end
|
110
|
+
|
111
|
+
# Generalizaton of poller. Since we have quite a variation of how async proceses are handled
|
112
|
+
# this is a helper that should help you with resources where the information about "Are we done"
|
113
|
+
# is the http code of response. By default we repeat as long as the code == 202. You can
|
114
|
+
# change the code if necessary. It expects the URI as an input where it can poll. It returns the
|
115
|
+
# value of last poll. In majority of cases these are the data that you need.
|
116
|
+
#
|
117
|
+
# @param link [String] Link for polling
|
118
|
+
# @param options [Hash] Options
|
119
|
+
# @return [Hash] Result of polling
|
120
|
+
def poll_on_code(link, options = {})
|
121
|
+
client = options[:client]
|
122
|
+
fail ArgumentError, 'No :client specified' if client.nil?
|
123
|
+
client.poll_on_code(link, options)
|
124
|
+
end
|
125
|
+
|
126
|
+
# Generalizaton of poller. Since we have quite a variation of how async proceses are handled
|
127
|
+
# this is a helper that should help you with resources where the information about "Are we done"
|
128
|
+
# is inside the response. It expects the URI as an input where it can poll and a block that should
|
129
|
+
# return either false -> 'meaning we are done' or true -> meaning sleep and repeat. It returns the
|
130
|
+
# value of last poll. In majority of cases these are the data that you need
|
131
|
+
#
|
132
|
+
# @param link [String] Link for polling
|
133
|
+
# @param options [Hash] Options
|
134
|
+
# @return [Hash] Result of polling
|
135
|
+
def poll_on_response(link, options = {}, &bl)
|
136
|
+
client = options[:client]
|
137
|
+
fail ArgumentError, 'No :client specified' if client.nil?
|
138
|
+
client.poll_on_response(link, options, &bl)
|
139
|
+
end
|
140
|
+
|
141
|
+
private
|
142
|
+
|
143
|
+
def merge_options(opts)
|
144
|
+
{
|
145
|
+
:project => GoodData.project
|
146
|
+
}.merge(opts)
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|