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,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_relative file
|
12
|
+
end
|
@@ -0,0 +1,31 @@
|
|
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 Model
|
9
|
+
# GoodData REST API categories
|
10
|
+
LDM_CTG = 'ldm'
|
11
|
+
LDM_MANAGE_CTG = 'ldm-manage2'
|
12
|
+
|
13
|
+
# Model naming conventions
|
14
|
+
FIELD_PK = 'id'
|
15
|
+
FK_SUFFIX = '_id'
|
16
|
+
FACT_COLUMN_PREFIX = 'f_'
|
17
|
+
DATE_COLUMN_PREFIX = 'dt_'
|
18
|
+
TIME_COLUMN_PREFIX = 'tm_'
|
19
|
+
LABEL_COLUMN_PREFIX = 'nm_'
|
20
|
+
ATTRIBUTE_FOLDER_PREFIX = 'dim'
|
21
|
+
ATTRIBUTE_PREFIX = 'attr'
|
22
|
+
LABEL_PREFIX = 'label'
|
23
|
+
FACT_PREFIX = 'fact'
|
24
|
+
DATE_FACT_PREFIX = 'dt'
|
25
|
+
DATE_ATTRIBUTE = 'date'
|
26
|
+
DATE_ATTRIBUTE_DEFAULT_DISPLAY_FORM = 'mdyy'
|
27
|
+
TIME_FACT_PREFIX = 'tm.dt'
|
28
|
+
TIME_ATTRIBUTE_PREFIX = 'attr.time'
|
29
|
+
FACT_FOLDER_PREFIX = 'ffld'
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,316 @@
|
|
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 'pry'
|
8
|
+
require 'zip'
|
9
|
+
require 'uri'
|
10
|
+
|
11
|
+
require_relative '../helpers/global_helpers'
|
12
|
+
require_relative '../rest/resource'
|
13
|
+
|
14
|
+
require_relative 'execution_detail'
|
15
|
+
require_relative 'schedule'
|
16
|
+
|
17
|
+
APP_STORE_URL ||= 'https://github.com/gooddata/app_store'
|
18
|
+
|
19
|
+
module GoodData
|
20
|
+
class Process < Rest::Resource
|
21
|
+
attr_reader :data
|
22
|
+
|
23
|
+
alias_method :raw_data, :data
|
24
|
+
alias_method :json, :data
|
25
|
+
alias_method :to_hash, :data
|
26
|
+
|
27
|
+
class << self
|
28
|
+
def [](id, options = {})
|
29
|
+
project = options[:project]
|
30
|
+
c = client(options)
|
31
|
+
|
32
|
+
if id == :all && project
|
33
|
+
uri = "/gdc/projects/#{project.pid}/dataload/processes"
|
34
|
+
data = c.get(uri)
|
35
|
+
data['processes']['items'].map do |process_data|
|
36
|
+
c.create(Process, process_data, project: project)
|
37
|
+
end
|
38
|
+
elsif id == :all
|
39
|
+
uri = "/gdc/account/profile/#{c.user.obj_id}/dataload/processes"
|
40
|
+
data = c.get(uri)
|
41
|
+
pids = data['processes']['items'].map { |process_data| process_data['process']['links']['self'].match(%r{/gdc/projects/(\w*)/})[1] }.uniq
|
42
|
+
projects_lookup = pids.pmap { |pid| c.projects(pid) }.reduce({}) do |a, e|
|
43
|
+
a[e.pid] = e
|
44
|
+
a
|
45
|
+
end
|
46
|
+
|
47
|
+
data['processes']['items'].map do |process_data|
|
48
|
+
pid = process_data['process']['links']['self'].match(%r{/gdc/projects/(\w*)/})[1]
|
49
|
+
c.create(Process, process_data, project: projects_lookup[pid])
|
50
|
+
end
|
51
|
+
else
|
52
|
+
uri = "/gdc/projects/#{project.pid}/dataload/processes/#{id}"
|
53
|
+
c.create(Process, c.get(uri), project: project)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def all
|
58
|
+
Process[:all]
|
59
|
+
end
|
60
|
+
|
61
|
+
def with_deploy(dir, options = {}, &block)
|
62
|
+
_client, project = GoodData.get_client_and_project(options)
|
63
|
+
|
64
|
+
GoodData.with_project(project) do
|
65
|
+
params = options[:params].nil? ? [] : [options[:params]]
|
66
|
+
if block
|
67
|
+
begin
|
68
|
+
res = GoodData::Process.deploy(dir, options.merge(:files_to_exclude => params))
|
69
|
+
block.call(res)
|
70
|
+
rescue => e
|
71
|
+
puts e.inspect
|
72
|
+
ensure
|
73
|
+
res.delete if res
|
74
|
+
end
|
75
|
+
else
|
76
|
+
GoodData::Process.deploy(dir, options.merge(:files_to_exclude => params))
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def upload_package(path, files_to_exclude, opts = { :client => GoodData.connection })
|
82
|
+
GoodData.get_client_and_project(opts)
|
83
|
+
zip_and_upload(path, files_to_exclude, opts)
|
84
|
+
end
|
85
|
+
|
86
|
+
# Deploy a new process or redeploy existing one.
|
87
|
+
#
|
88
|
+
# @param path [String] Path to ZIP archive or to a directory containing files that should be ZIPed
|
89
|
+
# @option options [String] :files_to_exclude
|
90
|
+
# @option options [String] :type ('GRAPH') Type of process - GRAPH or RUBY
|
91
|
+
# @option options [String] :name Readable name of the process
|
92
|
+
# @option options [String] :process_id ID of a process to be redeployed (do not set if you want to create a new process)
|
93
|
+
# @option options [Boolean] :verbose (false) Switch on verbose mode for detailed logging
|
94
|
+
def deploy(path, options = { :client => GoodData.client, :project => GoodData.project })
|
95
|
+
client, project = GoodData.get_client_and_project(options)
|
96
|
+
|
97
|
+
return deploy_brick(path, options) if path.to_s.start_with?(APP_STORE_URL)
|
98
|
+
|
99
|
+
path = Pathname(path) || fail('Path is not specified')
|
100
|
+
files_to_exclude = options[:files_to_exclude].nil? ? [] : options[:files_to_exclude].map { |pname| Pathname(pname) }
|
101
|
+
process_id = options[:process_id]
|
102
|
+
|
103
|
+
type = options[:type] || 'GRAPH'
|
104
|
+
deploy_name = options[:name]
|
105
|
+
fail ArgumentError, 'options[:name] can not be nil or empty!' if deploy_name.nil? || deploy_name.empty?
|
106
|
+
|
107
|
+
verbose = options[:verbose] || false
|
108
|
+
puts HighLine.color("Deploying #{path}", HighLine::BOLD) if verbose
|
109
|
+
|
110
|
+
deployed_path = Process.upload_package(path, files_to_exclude, client: client, project: project)
|
111
|
+
data = {
|
112
|
+
:process => {
|
113
|
+
:name => deploy_name,
|
114
|
+
:path => "/uploads/#{File.basename(deployed_path)}",
|
115
|
+
:type => type
|
116
|
+
}
|
117
|
+
}
|
118
|
+
|
119
|
+
res = if process_id.nil?
|
120
|
+
client.post("/gdc/projects/#{project.pid}/dataload/processes", data)
|
121
|
+
else
|
122
|
+
client.put("/gdc/projects/#{project.pid}/dataload/processes/#{process_id}", data)
|
123
|
+
end
|
124
|
+
|
125
|
+
process = client.create(Process, res, project: project)
|
126
|
+
puts HighLine.color("Deploy DONE #{path}", HighLine::GREEN) if verbose
|
127
|
+
process
|
128
|
+
end
|
129
|
+
|
130
|
+
def deploy_brick(path, options = { :client => GoodData.client, :project => GoodData.project })
|
131
|
+
client, project = GoodData.get_client_and_project(options)
|
132
|
+
|
133
|
+
brick_uri_parts = URI(path).path.split('/')
|
134
|
+
ref = brick_uri_parts[4]
|
135
|
+
brick_name = brick_uri_parts.last
|
136
|
+
brick_path = brick_uri_parts[5..-1].join('/')
|
137
|
+
|
138
|
+
Dir.mktmpdir do |dir|
|
139
|
+
Dir.chdir(dir) do
|
140
|
+
`git clone #{APP_STORE_URL}`
|
141
|
+
end
|
142
|
+
|
143
|
+
Dir.chdir(File.join(dir, 'app_store')) do
|
144
|
+
if ref
|
145
|
+
`git checkout #{ref}`
|
146
|
+
|
147
|
+
fail 'Wrong branch or tag specified!' if $CHILD_STATUS.to_i != 0
|
148
|
+
end
|
149
|
+
|
150
|
+
opts = {
|
151
|
+
:client => client,
|
152
|
+
:project => project,
|
153
|
+
:name => brick_name,
|
154
|
+
:type => 'RUBY'
|
155
|
+
}
|
156
|
+
|
157
|
+
full_brick_path = File.join(dir, 'app_store', brick_path)
|
158
|
+
|
159
|
+
unless File.exist?(full_brick_path)
|
160
|
+
fail "Invalid brick name specified - '#{brick_name}'"
|
161
|
+
end
|
162
|
+
|
163
|
+
return deploy(full_brick_path, opts)
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
# ----------------------------- Private Stuff
|
169
|
+
|
170
|
+
private
|
171
|
+
|
172
|
+
def with_zip(opts = {})
|
173
|
+
Tempfile.open('deploy-graph-archive') do |temp|
|
174
|
+
zip_filename = temp.path
|
175
|
+
File.open(zip_filename, 'w') do |zip|
|
176
|
+
Zip::File.open(zip.path, Zip::File::CREATE) do |zipfile|
|
177
|
+
yield zipfile
|
178
|
+
end
|
179
|
+
end
|
180
|
+
client.upload_to_user_webdav(temp.path, opts)
|
181
|
+
temp.path
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
def zip_and_upload(path, files_to_exclude, opts = {})
|
186
|
+
puts 'Creating package for upload'
|
187
|
+
if !path.directory? && (path.extname == '.grf' || path.extname == '.rb')
|
188
|
+
with_zip(opts) do |zipfile|
|
189
|
+
zipfile.add(File.basename(path), path)
|
190
|
+
end
|
191
|
+
elsif !path.directory?
|
192
|
+
# this branch expects a zipped file. Since the filename on webdav is by default
|
193
|
+
# equal to the filename of a local file. I happened often that the name clashed
|
194
|
+
# if ran in parallel. Create a randomized name to mitigate that
|
195
|
+
randomized_filename = (0...16).map { (65 + rand(26)).chr }.join
|
196
|
+
client.upload_to_user_webdav(path, { filename: randomized_filename }.merge(opts))
|
197
|
+
randomized_filename
|
198
|
+
else
|
199
|
+
with_zip(opts) do |zipfile|
|
200
|
+
files_to_upload = Dir[File.join(path, '**', '**')].reject { |f| files_to_exclude.include?(Pathname(path) + f) }
|
201
|
+
puts "Uploading #{files_to_upload.count} files."
|
202
|
+
files_to_upload.each do |file|
|
203
|
+
file_pathname = Pathname.new(file)
|
204
|
+
file_relative_pathname = file_pathname.relative_path_from(Pathname.new(path))
|
205
|
+
zipfile.add(file_relative_pathname, file)
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|
210
|
+
# -----------------------------
|
211
|
+
end
|
212
|
+
|
213
|
+
def initialize(data)
|
214
|
+
@data = data
|
215
|
+
end
|
216
|
+
|
217
|
+
def delete
|
218
|
+
client.delete(uri)
|
219
|
+
end
|
220
|
+
|
221
|
+
# Redeploy existing process.
|
222
|
+
#
|
223
|
+
# @param path [String] Path to ZIP archive or to a directory containing files that should be ZIPed
|
224
|
+
# @option options [String] :files_to_exclude
|
225
|
+
# @option options [String] :process_id ('nobody') From address
|
226
|
+
# @option options [String] :type ('GRAPH') Type of process - GRAPH or RUBY
|
227
|
+
# @option options [String] :name Readable name of the process
|
228
|
+
# @option options [Boolean] :verbose (false) Switch on verbose mode for detailed logging
|
229
|
+
def deploy(path, options = {})
|
230
|
+
Process.deploy(path, { client: client, process_id: process_id, :project => project, :name => name, :type => type }.merge(options))
|
231
|
+
end
|
232
|
+
|
233
|
+
# Downloads the process from S3 in a zipped form.
|
234
|
+
#
|
235
|
+
# @return [IO] The stream of data that represents a zipped deployed process.
|
236
|
+
def download
|
237
|
+
link = links['source']
|
238
|
+
client.connection.refresh_token
|
239
|
+
client.get(link, process: false) { |_, _, result| RestClient.get(result.to_hash['location'].first) }
|
240
|
+
end
|
241
|
+
|
242
|
+
def process
|
243
|
+
data['process']
|
244
|
+
end
|
245
|
+
|
246
|
+
def name
|
247
|
+
process['name']
|
248
|
+
end
|
249
|
+
|
250
|
+
def type
|
251
|
+
process['type'].downcase.to_sym
|
252
|
+
end
|
253
|
+
|
254
|
+
def links
|
255
|
+
process['links']
|
256
|
+
end
|
257
|
+
|
258
|
+
def link
|
259
|
+
links['self']
|
260
|
+
end
|
261
|
+
|
262
|
+
alias_method :uri, :link
|
263
|
+
|
264
|
+
def obj_id
|
265
|
+
uri.split('/').last
|
266
|
+
end
|
267
|
+
|
268
|
+
alias_method :process_id, :obj_id
|
269
|
+
|
270
|
+
def executions_link
|
271
|
+
links['executions']
|
272
|
+
end
|
273
|
+
|
274
|
+
def graphs
|
275
|
+
process['graphs']
|
276
|
+
end
|
277
|
+
|
278
|
+
def executables
|
279
|
+
process['executables']
|
280
|
+
end
|
281
|
+
|
282
|
+
def schedules
|
283
|
+
project.schedules.select { |schedule| schedule.process_id == obj_id }
|
284
|
+
end
|
285
|
+
|
286
|
+
def create_schedule(cron, executable, options = {})
|
287
|
+
project.create_schedule(process_id, cron, executable, options.merge(client: client, project: project))
|
288
|
+
end
|
289
|
+
|
290
|
+
def execute(executable, options = {})
|
291
|
+
result = start_execution(executable, options)
|
292
|
+
begin
|
293
|
+
client.poll_on_code(result['executionTask']['links']['poll'], options)
|
294
|
+
rescue RestClient::RequestFailed => e
|
295
|
+
raise(e)
|
296
|
+
ensure
|
297
|
+
result = client.get(result['executionTask']['links']['detail'])
|
298
|
+
if result['executionDetail']['status'] == 'ERROR'
|
299
|
+
fail "Runing process failed. You can look at a log here #{result['executionDetail']['logFileName']}"
|
300
|
+
end
|
301
|
+
end
|
302
|
+
client.create(GoodData::ExecutionDetail, result, client: client, project: project)
|
303
|
+
end
|
304
|
+
|
305
|
+
def start_execution(executable, options = {})
|
306
|
+
params = options[:params] || {}
|
307
|
+
hidden_params = options[:hidden_params] || {}
|
308
|
+
client.post(executions_link,
|
309
|
+
:execution => {
|
310
|
+
:graph => executable.to_s,
|
311
|
+
:params => GoodData::Helpers.encode_public_params(params),
|
312
|
+
:hiddenParams => GoodData::Helpers.encode_hidden_params(hidden_params)
|
313
|
+
})
|
314
|
+
end
|
315
|
+
end
|
316
|
+
end
|
@@ -0,0 +1,426 @@
|
|
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 'pmap'
|
8
|
+
|
9
|
+
require_relative '../rest/object'
|
10
|
+
|
11
|
+
require_relative 'project'
|
12
|
+
|
13
|
+
module GoodData
|
14
|
+
class Profile < Rest::Resource
|
15
|
+
attr_reader :user, :json
|
16
|
+
|
17
|
+
EMPTY_OBJECT = {
|
18
|
+
'accountSetting' => {
|
19
|
+
'companyName' => nil,
|
20
|
+
'country' => nil,
|
21
|
+
'created' => nil,
|
22
|
+
'firstName' => nil,
|
23
|
+
'lastName' => nil,
|
24
|
+
'login' => nil,
|
25
|
+
'phoneNumber' => nil,
|
26
|
+
'position' => nil,
|
27
|
+
'timezone' => nil,
|
28
|
+
'updated' => nil,
|
29
|
+
'links' => {
|
30
|
+
'projects' => nil,
|
31
|
+
'self' => nil
|
32
|
+
},
|
33
|
+
'email' => nil,
|
34
|
+
'authenticationModes' => []
|
35
|
+
}
|
36
|
+
}
|
37
|
+
|
38
|
+
ASSIGNABLE_MEMBERS = [
|
39
|
+
:company,
|
40
|
+
:country,
|
41
|
+
:email,
|
42
|
+
:login,
|
43
|
+
:first_name,
|
44
|
+
:last_name,
|
45
|
+
:phone,
|
46
|
+
:position,
|
47
|
+
:timezone
|
48
|
+
]
|
49
|
+
|
50
|
+
PROFILE_PATH = '/gdc/account/profile/%s'
|
51
|
+
|
52
|
+
class << self
|
53
|
+
# Get profile by ID or URI
|
54
|
+
#
|
55
|
+
# @param id ID or URI of user to be found
|
56
|
+
# @param [Hash] opts Additional optional options
|
57
|
+
# @option opts [GoodData::Rest::Client] :client Client used for communication with server
|
58
|
+
# @return GoodData::Profile User Profile
|
59
|
+
def [](id, opts = { client: GoodData.connection })
|
60
|
+
return id if id.instance_of?(GoodData::Profile) || id.respond_to?(:profile?) && id.profile?
|
61
|
+
|
62
|
+
if id.to_s !~ %r{^(\/gdc\/account\/profile\/)?[a-zA-Z\d]+$}
|
63
|
+
fail(ArgumentError, 'wrong type of argument. Should be either project ID or path')
|
64
|
+
end
|
65
|
+
|
66
|
+
id = id.match(/[a-zA-Z\d]+$/)[0] if id =~ %r{/}
|
67
|
+
|
68
|
+
c = client(opts)
|
69
|
+
fail ArgumentError, 'No :client specified' if c.nil?
|
70
|
+
|
71
|
+
response = c.get(PROFILE_PATH % id)
|
72
|
+
c.factory.create(Profile, response)
|
73
|
+
end
|
74
|
+
|
75
|
+
# Creates new instance from hash with attributes
|
76
|
+
#
|
77
|
+
# @param attributes [Hash] Hash with initial attributes
|
78
|
+
# @return [GoodData::Profile] New profile instance
|
79
|
+
def create(attributes)
|
80
|
+
res = create_object(attributes)
|
81
|
+
res.save!
|
82
|
+
res
|
83
|
+
end
|
84
|
+
|
85
|
+
def create_object(attributes)
|
86
|
+
json = GoodData::Helpers.deep_dup(EMPTY_OBJECT)
|
87
|
+
json['accountSetting']['links']['self'] = attributes[:uri] if attributes[:uri]
|
88
|
+
res = client.create(GoodData::Profile, json)
|
89
|
+
|
90
|
+
attributes.each do |k, v|
|
91
|
+
res.send("#{k}=", v) if ASSIGNABLE_MEMBERS.include? k
|
92
|
+
end
|
93
|
+
res
|
94
|
+
end
|
95
|
+
|
96
|
+
def diff(item_1, item_2)
|
97
|
+
x = diff_list([item_1], [item_2])
|
98
|
+
return {} if x[:changed].empty?
|
99
|
+
x[:changed].first[:diff]
|
100
|
+
end
|
101
|
+
|
102
|
+
def diff_list(list_1, list_2)
|
103
|
+
GoodData::Helpers.diff(list_1, list_2, key: :login)
|
104
|
+
end
|
105
|
+
|
106
|
+
# Gets user currently logged in
|
107
|
+
# @return [GoodData::Profile] User currently logged-in
|
108
|
+
def current
|
109
|
+
client.user
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
# Creates new instance
|
114
|
+
#
|
115
|
+
# @return [Profile] New Profile instance
|
116
|
+
def initialize(json)
|
117
|
+
@json = json
|
118
|
+
@dirty = false
|
119
|
+
end
|
120
|
+
|
121
|
+
# Checks objects for equality
|
122
|
+
#
|
123
|
+
# @param right [GoodData::Profile] Project to compare with
|
124
|
+
# @return [Boolean] True if same else false
|
125
|
+
def ==(other)
|
126
|
+
return false unless other.respond_to?(:to_hash)
|
127
|
+
to_hash == other.to_hash
|
128
|
+
end
|
129
|
+
|
130
|
+
# Checks objects for non-equality
|
131
|
+
#
|
132
|
+
# @param right [GoodData::Profile] Project to compare with
|
133
|
+
# @return [Boolean] True if different else false
|
134
|
+
def !=(other)
|
135
|
+
!(self == other)
|
136
|
+
end
|
137
|
+
|
138
|
+
# Apply changes to object.
|
139
|
+
#
|
140
|
+
# @param changes [Hash] Hash with modifications
|
141
|
+
# @return [GoodData::Profile] Modified object
|
142
|
+
# def apply(changes)
|
143
|
+
# GoodData::Profile.apply(self, changes)
|
144
|
+
# end
|
145
|
+
|
146
|
+
# Gets the company name
|
147
|
+
#
|
148
|
+
# @return [String] Company name
|
149
|
+
def company
|
150
|
+
@json['accountSetting']['companyName'] || ''
|
151
|
+
end
|
152
|
+
|
153
|
+
# Set the company name
|
154
|
+
#
|
155
|
+
# @param val [String] Company name to be set
|
156
|
+
def company=(val)
|
157
|
+
@dirty ||= company != val
|
158
|
+
@json['accountSetting']['companyName'] = val
|
159
|
+
end
|
160
|
+
|
161
|
+
# Gets the country
|
162
|
+
#
|
163
|
+
# @return [String] Country
|
164
|
+
def country
|
165
|
+
@json['accountSetting']['country'] || ''
|
166
|
+
end
|
167
|
+
|
168
|
+
# Set the country
|
169
|
+
#
|
170
|
+
# @param val [String] Country to be set
|
171
|
+
def country=(val)
|
172
|
+
@dirty ||= country != val
|
173
|
+
@json['accountSetting']['country'] = val
|
174
|
+
end
|
175
|
+
|
176
|
+
# Gets date when created
|
177
|
+
#
|
178
|
+
# @return [DateTime] Created date
|
179
|
+
def created
|
180
|
+
DateTime.parse(@json['accountSetting']['created'])
|
181
|
+
end
|
182
|
+
|
183
|
+
# Deletes this account settings
|
184
|
+
def delete
|
185
|
+
client.delete uri
|
186
|
+
end
|
187
|
+
|
188
|
+
# Gets hash representing diff of profiles
|
189
|
+
#
|
190
|
+
# @param user [GoodData::Profile] Another profile to compare with
|
191
|
+
# @return [Hash] Hash representing diff
|
192
|
+
def diff(user)
|
193
|
+
GoodData::Profile.diff(self, user)
|
194
|
+
end
|
195
|
+
|
196
|
+
# Gets the email
|
197
|
+
#
|
198
|
+
# @return [String] Email address
|
199
|
+
def email
|
200
|
+
@json['accountSetting']['email'] || ''
|
201
|
+
end
|
202
|
+
|
203
|
+
# Set the email
|
204
|
+
#
|
205
|
+
# @param val [String] Email to be set
|
206
|
+
def email=(val)
|
207
|
+
@dirty ||= email != val
|
208
|
+
@json['accountSetting']['email'] = val
|
209
|
+
end
|
210
|
+
|
211
|
+
# Gets the first name
|
212
|
+
#
|
213
|
+
# @return [String] First name
|
214
|
+
def first_name
|
215
|
+
@json['accountSetting']['firstName'] || ''
|
216
|
+
end
|
217
|
+
|
218
|
+
# Set the first name
|
219
|
+
#
|
220
|
+
# @param val [String] First name to be set
|
221
|
+
def first_name=(val)
|
222
|
+
@dirty ||= first_name != val
|
223
|
+
@json['accountSetting']['firstName'] = val
|
224
|
+
end
|
225
|
+
|
226
|
+
# Get full name
|
227
|
+
#
|
228
|
+
# @return String Full Name
|
229
|
+
# NOTE: This can be tricky to implement correctly for i18n
|
230
|
+
def full_name
|
231
|
+
"#{first_name} #{last_name}"
|
232
|
+
end
|
233
|
+
|
234
|
+
alias_method :title, :full_name
|
235
|
+
|
236
|
+
# Gets the last name
|
237
|
+
#
|
238
|
+
# @return [String] Last name
|
239
|
+
def last_name
|
240
|
+
@json['accountSetting']['lastName'] || ''
|
241
|
+
end
|
242
|
+
|
243
|
+
# Set the last name
|
244
|
+
#
|
245
|
+
# @param val [String] Last name to be set
|
246
|
+
def last_name=(val)
|
247
|
+
@dirty ||= last_name != val
|
248
|
+
@json['accountSetting']['lastName'] = val
|
249
|
+
end
|
250
|
+
|
251
|
+
# Gets the login
|
252
|
+
#
|
253
|
+
# @return [String] Login
|
254
|
+
def login
|
255
|
+
@json['accountSetting']['login'] || ''
|
256
|
+
end
|
257
|
+
|
258
|
+
# Set the login
|
259
|
+
#
|
260
|
+
# @param val [String] Login to be set
|
261
|
+
def login=(val)
|
262
|
+
@dirty ||= login != val
|
263
|
+
@json['accountSetting']['login'] = val
|
264
|
+
end
|
265
|
+
|
266
|
+
# Gets the resource identifier
|
267
|
+
#
|
268
|
+
# @return [String] Resource identifier
|
269
|
+
def obj_id
|
270
|
+
uri.split('/').last
|
271
|
+
end
|
272
|
+
|
273
|
+
alias_method :account_setting_id, :obj_id
|
274
|
+
|
275
|
+
# Gets the phone
|
276
|
+
#
|
277
|
+
# @return [String] Phone
|
278
|
+
def phone
|
279
|
+
@json['accountSetting']['phoneNumber'] || ''
|
280
|
+
end
|
281
|
+
|
282
|
+
alias_method :phone_number, :phone
|
283
|
+
|
284
|
+
# Set the phone
|
285
|
+
#
|
286
|
+
# @param val [String] Phone to be set
|
287
|
+
def phone=(val)
|
288
|
+
@dirty ||= phone != val
|
289
|
+
@json['accountSetting']['phoneNumber'] = val
|
290
|
+
end
|
291
|
+
|
292
|
+
alias_method :phone_number=, :phone=
|
293
|
+
|
294
|
+
# Gets the position in company
|
295
|
+
#
|
296
|
+
# @return [String] Position in company
|
297
|
+
def position
|
298
|
+
@json['accountSetting']['position'] || ''
|
299
|
+
end
|
300
|
+
|
301
|
+
# Set the position
|
302
|
+
#
|
303
|
+
# @param val [String] Position to be set
|
304
|
+
def position=(val)
|
305
|
+
@dirty ||= position != val
|
306
|
+
@json['accountSetting']['position'] = val
|
307
|
+
end
|
308
|
+
|
309
|
+
# Gets the array of projects
|
310
|
+
#
|
311
|
+
# @return [Array<GoodData::Project>] Array of project where account settings belongs to
|
312
|
+
def projects
|
313
|
+
projects = client.get @json['accountSetting']['links']['projects']
|
314
|
+
projects['projects'].map do |project|
|
315
|
+
client.create(GoodData::Project, project)
|
316
|
+
end
|
317
|
+
end
|
318
|
+
|
319
|
+
# Saves object if dirty, clears dirty flag
|
320
|
+
def save!
|
321
|
+
if @dirty
|
322
|
+
raw = @json.dup
|
323
|
+
raw['accountSetting'].delete('login')
|
324
|
+
|
325
|
+
if uri && !uri.empty?
|
326
|
+
url = "/gdc/account/profile/#{obj_id}"
|
327
|
+
@json = client.put url, raw
|
328
|
+
@dirty = false
|
329
|
+
end
|
330
|
+
end
|
331
|
+
self
|
332
|
+
end
|
333
|
+
|
334
|
+
# Gets the preferred timezone
|
335
|
+
#
|
336
|
+
# @return [String] Preferred timezone
|
337
|
+
def timezone
|
338
|
+
@json['accountSetting']['timezone'] || ''
|
339
|
+
end
|
340
|
+
|
341
|
+
# Set the timezone
|
342
|
+
#
|
343
|
+
# @param val [String] Timezone to be set
|
344
|
+
def timezone=(val)
|
345
|
+
@dirty ||= timezone != val
|
346
|
+
@json['accountSetting']['timezone'] = val
|
347
|
+
end
|
348
|
+
|
349
|
+
# Gets the date when updated
|
350
|
+
#
|
351
|
+
# @return [DateTime] Updated date
|
352
|
+
def updated
|
353
|
+
DateTime.parse(@json['accountSetting']['updated'])
|
354
|
+
end
|
355
|
+
|
356
|
+
# Gets the resource REST URI
|
357
|
+
#
|
358
|
+
# @return [String] Resource URI
|
359
|
+
def uri
|
360
|
+
GoodData::Helpers.get_path(@json, %w(accountSetting links self))
|
361
|
+
end
|
362
|
+
|
363
|
+
def data
|
364
|
+
data = @json || {}
|
365
|
+
data['accountSetting'] || {}
|
366
|
+
end
|
367
|
+
|
368
|
+
def links
|
369
|
+
data['links'] || {}
|
370
|
+
end
|
371
|
+
|
372
|
+
def content
|
373
|
+
keys = (data.keys - ['links'])
|
374
|
+
data.slice(*keys)
|
375
|
+
end
|
376
|
+
|
377
|
+
def name
|
378
|
+
(first_name || '') + (last_name || '')
|
379
|
+
end
|
380
|
+
|
381
|
+
def password
|
382
|
+
@json['accountSetting']['password']
|
383
|
+
end
|
384
|
+
|
385
|
+
def password=(a_password)
|
386
|
+
@dirty = true
|
387
|
+
@json['accountSetting']['password'] = a_password
|
388
|
+
end
|
389
|
+
|
390
|
+
def sso_provider
|
391
|
+
@json['accountSetting']['ssoProvider']
|
392
|
+
end
|
393
|
+
|
394
|
+
def sso_provider=(an_sso_provider)
|
395
|
+
@dirty = true
|
396
|
+
@json['accountSetting']['ssoProvider'] = an_sso_provider
|
397
|
+
end
|
398
|
+
|
399
|
+
def authentication_modes
|
400
|
+
@json['accountSetting']['authenticationModes'].map { |x| x.downcase.to_sym }
|
401
|
+
end
|
402
|
+
|
403
|
+
def authentication_modes=(modes)
|
404
|
+
modes = Array(modes)
|
405
|
+
@dirty = true
|
406
|
+
@json['accountSetting']['authenticationModes'] = modes.map { |x| x.to_s.upcase }
|
407
|
+
end
|
408
|
+
|
409
|
+
def to_hash
|
410
|
+
tmp = GoodData::Helpers.symbolize_keys(content.merge(uri: uri))
|
411
|
+
[
|
412
|
+
[:companyName, :company],
|
413
|
+
[:phoneNumber, :phone],
|
414
|
+
[:firstName, :first_name],
|
415
|
+
[:lastName, :last_name],
|
416
|
+
[:authenticationModes, :authentication_modes],
|
417
|
+
[:ssoProvider, :sso_provider]
|
418
|
+
].each do |vals|
|
419
|
+
wire, rb = vals
|
420
|
+
tmp[rb] = tmp[wire]
|
421
|
+
tmp.delete(wire)
|
422
|
+
end
|
423
|
+
tmp
|
424
|
+
end
|
425
|
+
end
|
426
|
+
end
|