gooddata 0.6.20 → 0.6.22
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +29 -1
- data/DEPENDENCIES.md +816 -0
- data/LICENSE +1 -1
- data/LICENSE.rb +5 -0
- data/Rakefile +74 -22
- data/dependency_decisions.yml +102 -0
- data/gooddata.gemspec +39 -38
- data/lib/gooddata.rb +4 -0
- data/lib/gooddata/app/app.rb +4 -0
- data/lib/gooddata/bricks/base_downloader.rb +5 -1
- data/lib/gooddata/bricks/brick.rb +4 -0
- data/lib/gooddata/bricks/bricks.rb +5 -0
- data/lib/gooddata/bricks/middleware/aws_middleware.rb +5 -0
- data/lib/gooddata/bricks/middleware/base_middleware.rb +5 -0
- data/lib/gooddata/bricks/middleware/bench_middleware.rb +5 -0
- data/lib/gooddata/bricks/middleware/bulk_salesforce_middleware.rb +5 -0
- data/lib/gooddata/bricks/middleware/decode_params_middleware.rb +6 -0
- data/lib/gooddata/bricks/middleware/fs_download_middleware.rb +6 -0
- data/lib/gooddata/bricks/middleware/fs_upload_middleware.rb +6 -0
- data/lib/gooddata/bricks/middleware/gooddata_middleware.rb +6 -0
- data/lib/gooddata/bricks/middleware/logger_middleware.rb +5 -0
- data/lib/gooddata/bricks/middleware/middleware.rb +5 -0
- data/lib/gooddata/bricks/middleware/restforce_middleware.rb +4 -0
- data/lib/gooddata/bricks/middleware/stdout_middleware.rb +5 -0
- data/lib/gooddata/bricks/middleware/twitter_middleware.rb +5 -0
- data/lib/gooddata/bricks/middleware/undot_params_middleware.rb +4 -0
- data/lib/gooddata/bricks/pipeline.rb +4 -0
- data/lib/gooddata/bricks/utils.rb +4 -0
- data/lib/gooddata/cli/cli.rb +4 -0
- data/lib/gooddata/cli/commands/api_cmd.rb +4 -0
- data/lib/gooddata/cli/commands/auth_cmd.rb +4 -0
- data/lib/gooddata/cli/commands/console_cmd.rb +4 -0
- data/lib/gooddata/cli/commands/domain_cmd.rb +4 -0
- data/lib/gooddata/cli/commands/process_cmd.rb +4 -0
- data/lib/gooddata/cli/commands/project_cmd.rb +4 -0
- data/lib/gooddata/cli/commands/projects_cmd.rb +4 -0
- data/lib/gooddata/cli/commands/run_ruby_cmd.rb +4 -0
- data/lib/gooddata/cli/commands/scaffold_cmd.rb +4 -0
- data/lib/gooddata/cli/commands/user_cmd.rb +4 -0
- data/lib/gooddata/cli/hooks.rb +4 -0
- data/lib/gooddata/cli/shared.rb +4 -0
- data/lib/gooddata/cli/terminal.rb +4 -0
- data/lib/gooddata/client.rb +4 -0
- data/lib/gooddata/commands/api.rb +4 -0
- data/lib/gooddata/commands/auth.rb +4 -0
- data/lib/gooddata/commands/base.rb +4 -0
- data/lib/gooddata/commands/commands.rb +5 -0
- data/lib/gooddata/commands/datasets.rb +5 -1
- data/lib/gooddata/commands/datawarehouse.rb +4 -0
- data/lib/gooddata/commands/domain.rb +4 -0
- data/lib/gooddata/commands/process.rb +4 -0
- data/lib/gooddata/commands/project.rb +7 -9
- data/lib/gooddata/commands/projects.rb +4 -0
- data/lib/gooddata/commands/role.rb +4 -0
- data/lib/gooddata/commands/runners.rb +4 -0
- data/lib/gooddata/commands/scaffold.rb +4 -0
- data/lib/gooddata/commands/user.rb +4 -0
- data/lib/gooddata/connection.rb +83 -0
- data/lib/gooddata/core/core.rb +4 -0
- data/lib/gooddata/core/logging.rb +4 -0
- data/lib/gooddata/core/nil_logger.rb +4 -0
- data/lib/gooddata/core/project.rb +4 -0
- data/lib/gooddata/core/rest.rb +14 -16
- data/lib/gooddata/core/user.rb +4 -0
- data/lib/gooddata/data/data.rb +4 -0
- data/lib/gooddata/data/guesser.rb +4 -0
- data/lib/gooddata/exceptions/attr_element_not_found.rb +4 -0
- data/lib/gooddata/exceptions/command_failed.rb +4 -0
- data/lib/gooddata/exceptions/exceptions.rb +4 -0
- data/lib/gooddata/exceptions/execution_limit_exceeded.rb +4 -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 +4 -0
- data/lib/gooddata/exceptions/object_migration.rb +28 -0
- data/lib/gooddata/exceptions/project_not_found.rb +5 -0
- data/lib/gooddata/exceptions/uncomputable_report.rb +5 -0
- data/lib/gooddata/exceptions/user_in_different_domain.rb +4 -0
- data/lib/gooddata/exceptions/validation_error.rb +4 -0
- data/lib/gooddata/extensions/big_decimal.rb +4 -0
- data/lib/gooddata/extensions/enumerable.rb +4 -0
- data/lib/gooddata/extensions/extensions.rb +4 -0
- data/lib/gooddata/extensions/false.rb +4 -0
- data/lib/gooddata/extensions/hash.rb +4 -0
- data/lib/gooddata/extensions/nil.rb +4 -0
- data/lib/gooddata/extensions/numeric.rb +4 -0
- data/lib/gooddata/extensions/object.rb +4 -0
- data/lib/gooddata/extensions/symbol.rb +4 -0
- data/lib/gooddata/extensions/true.rb +4 -0
- data/lib/gooddata/extract.rb +4 -0
- data/lib/gooddata/goodzilla/goodzilla.rb +87 -77
- data/lib/gooddata/helpers/auth_helpers.rb +6 -2
- data/lib/gooddata/helpers/csv_helper.rb +4 -0
- data/lib/gooddata/helpers/data_helper.rb +4 -0
- data/lib/gooddata/helpers/global_helpers.rb +35 -6
- data/lib/gooddata/helpers/global_helpers_params.rb +34 -7
- data/lib/gooddata/helpers/helpers.rb +4 -0
- data/lib/gooddata/mixins/author.rb +4 -0
- data/lib/gooddata/mixins/content_getter.rb +4 -0
- data/lib/gooddata/mixins/content_property_reader.rb +4 -0
- data/lib/gooddata/mixins/content_property_writer.rb +4 -0
- data/lib/gooddata/mixins/contributor.rb +4 -0
- data/lib/gooddata/mixins/data_getter.rb +4 -0
- data/lib/gooddata/mixins/data_property_reader.rb +4 -0
- data/lib/gooddata/mixins/data_property_writer.rb +4 -0
- data/lib/gooddata/mixins/inspector.rb +4 -0
- data/lib/gooddata/mixins/is_attribute.rb +4 -0
- data/lib/gooddata/mixins/is_dimension.rb +4 -0
- data/lib/gooddata/mixins/is_fact.rb +4 -0
- data/lib/gooddata/mixins/is_label.rb +4 -0
- data/lib/gooddata/mixins/links.rb +4 -0
- data/lib/gooddata/mixins/md_finders.rb +4 -0
- data/lib/gooddata/mixins/md_id_to_uri.rb +4 -0
- data/lib/gooddata/mixins/md_json.rb +4 -0
- data/lib/gooddata/mixins/md_lock.rb +4 -0
- data/lib/gooddata/mixins/md_object_id.rb +5 -1
- data/lib/gooddata/mixins/md_object_indexer.rb +4 -0
- data/lib/gooddata/mixins/md_object_query.rb +4 -0
- data/lib/gooddata/mixins/md_relations.rb +4 -0
- data/lib/gooddata/mixins/meta_getter.rb +4 -0
- data/lib/gooddata/mixins/meta_property_reader.rb +4 -0
- data/lib/gooddata/mixins/meta_property_writer.rb +4 -0
- data/lib/gooddata/mixins/mixins.rb +4 -0
- data/lib/gooddata/mixins/not_attribute.rb +4 -0
- data/lib/gooddata/mixins/not_exportable.rb +4 -0
- data/lib/gooddata/mixins/not_fact.rb +4 -0
- data/lib/gooddata/mixins/not_label.rb +4 -0
- data/lib/gooddata/mixins/not_metric.rb +6 -0
- data/lib/gooddata/mixins/obj_id.rb +4 -0
- data/lib/gooddata/mixins/rest_getters.rb +4 -0
- data/lib/gooddata/mixins/rest_resource.rb +4 -0
- data/lib/gooddata/mixins/root_key_getter.rb +4 -0
- data/lib/gooddata/mixins/root_key_setter.rb +4 -0
- data/lib/gooddata/mixins/timestamps.rb +4 -0
- data/lib/gooddata/models/blueprint/anchor_field.rb +4 -0
- data/lib/gooddata/models/blueprint/attribute_field.rb +4 -0
- data/lib/gooddata/models/blueprint/blueprint.rb +4 -0
- data/lib/gooddata/models/blueprint/blueprint_field.rb +4 -0
- data/lib/gooddata/models/blueprint/dashboard_builder.rb +4 -0
- data/lib/gooddata/models/blueprint/dataset_blueprint.rb +6 -0
- data/lib/gooddata/models/blueprint/date_dimension.rb +4 -0
- data/lib/gooddata/models/blueprint/fact_field.rb +4 -0
- data/lib/gooddata/models/blueprint/label_field.rb +4 -0
- data/lib/gooddata/models/blueprint/project_blueprint.rb +6 -0
- data/lib/gooddata/models/blueprint/project_builder.rb +4 -0
- data/lib/gooddata/models/blueprint/reference_field.rb +4 -0
- data/lib/gooddata/models/blueprint/schema_blueprint.rb +4 -0
- data/lib/gooddata/models/blueprint/schema_builder.rb +4 -0
- data/lib/gooddata/models/blueprint/to_manifest.rb +17 -1
- data/lib/gooddata/models/blueprint/to_wire.rb +4 -0
- data/lib/gooddata/models/datawarehouse.rb +5 -0
- data/lib/gooddata/models/domain.rb +25 -7
- data/lib/gooddata/models/execution.rb +4 -0
- data/lib/gooddata/models/execution_detail.rb +4 -0
- data/lib/gooddata/models/from_wire.rb +4 -0
- data/lib/gooddata/models/invitation.rb +4 -0
- data/lib/gooddata/models/links.rb +4 -0
- data/lib/gooddata/models/membership.rb +4 -0
- data/lib/gooddata/models/metadata.rb +37 -10
- data/lib/gooddata/models/metadata/attribute.rb +6 -0
- data/lib/gooddata/models/metadata/dashboard.rb +54 -16
- data/lib/gooddata/models/metadata/dashboard/dashboard_item.rb +60 -0
- data/lib/gooddata/models/metadata/dashboard/filter_item.rb +15 -0
- data/lib/gooddata/models/metadata/dashboard/report_item.rb +51 -0
- data/lib/gooddata/models/metadata/dashboard_tab.rb +88 -0
- data/lib/gooddata/models/metadata/dataset.rb +4 -0
- data/lib/gooddata/models/metadata/dimension.rb +4 -0
- data/lib/gooddata/models/metadata/fact.rb +6 -0
- data/lib/gooddata/models/metadata/label.rb +15 -0
- data/lib/gooddata/models/metadata/metadata.rb +4 -0
- data/lib/gooddata/models/metadata/metric.rb +5 -4
- data/lib/gooddata/models/metadata/report.rb +62 -16
- data/lib/gooddata/models/metadata/report_definition.rb +44 -47
- data/lib/gooddata/models/metadata/variable.rb +4 -0
- data/lib/gooddata/models/model.rb +85 -36
- data/lib/gooddata/models/models.rb +4 -0
- data/lib/gooddata/models/module_constants.rb +4 -0
- data/lib/gooddata/models/process.rb +4 -0
- data/lib/gooddata/models/profile.rb +13 -0
- data/lib/gooddata/models/project.rb +173 -92
- data/lib/gooddata/models/project_creator.rb +18 -10
- data/lib/gooddata/models/project_metadata.rb +4 -0
- data/lib/gooddata/models/project_role.rb +4 -0
- data/lib/gooddata/models/report_data_result.rb +217 -125
- data/lib/gooddata/models/schedule.rb +140 -65
- data/lib/gooddata/models/tab_builder.rb +4 -0
- data/lib/gooddata/models/user_filters/mandatory_user_filter.rb +4 -0
- data/lib/gooddata/models/user_filters/user_filter.rb +4 -0
- data/lib/gooddata/models/user_filters/user_filter_builder.rb +98 -56
- data/lib/gooddata/models/user_filters/user_filters.rb +4 -0
- data/lib/gooddata/models/user_filters/variable_user_filter.rb +4 -0
- data/lib/gooddata/rest/client.rb +41 -38
- data/lib/gooddata/rest/connection.rb +91 -20
- data/lib/gooddata/rest/connections/rest_client_connection.rb +5 -1
- data/lib/gooddata/rest/object.rb +9 -1
- data/lib/gooddata/rest/object_factory.rb +5 -1
- data/lib/gooddata/rest/resource.rb +5 -1
- data/lib/gooddata/rest/rest.rb +4 -0
- data/lib/gooddata/version.rb +5 -1
- data/spec/bricks/bricks_spec.rb +4 -0
- data/spec/data/blueprints/test_project_model_spec.json +2 -2
- data/spec/data/gooddata_version_process/gooddata_version.rb +6 -0
- data/spec/data/hello_world_process/hello_world.rb +6 -0
- data/spec/data/manifests/test_project.json +5 -5
- 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 +6 -0
- data/spec/data/ruby_process/process.rb +6 -0
- data/spec/environment/default.rb +5 -0
- data/spec/environment/develop.rb +10 -5
- data/spec/environment/environment.rb +4 -0
- data/spec/environment/hotfix.rb +5 -1
- data/spec/environment/production.rb +4 -0
- data/spec/environment/release.rb +4 -0
- data/spec/environment/staging.rb +30 -0
- data/spec/environment/staging_3.rb +37 -0
- data/spec/helpers/blueprint_helper.rb +4 -0
- data/spec/helpers/cli_helper.rb +4 -0
- data/spec/helpers/connection_helper.rb +24 -17
- data/spec/helpers/crypto_helper.rb +6 -0
- data/spec/helpers/csv_helper.rb +4 -0
- data/spec/helpers/process_helper.rb +5 -1
- data/spec/helpers/project_helper.rb +34 -29
- data/spec/helpers/schedule_helper.rb +4 -0
- data/spec/helpers/spec_helper.rb +4 -0
- data/spec/integration/blueprint_updates_spec.rb +28 -20
- data/spec/integration/command_datawarehouse_spec.rb +6 -0
- data/spec/integration/command_projects_spec.rb +6 -4
- data/spec/integration/create_from_template_spec.rb +6 -0
- data/spec/integration/create_project_spec.rb +6 -0
- data/spec/integration/deprecated_load_spec.rb +58 -0
- data/spec/integration/full_process_schedule_spec.rb +9 -0
- data/spec/integration/full_project_spec.rb +63 -9
- data/spec/integration/over_to_user_filters_spec.rb +7 -2
- data/spec/integration/partial_md_export_import_spec.rb +6 -0
- data/spec/integration/project_spec.rb +12 -6
- data/spec/integration/rest_spec.rb +6 -2
- data/spec/integration/schedule_spec.rb +627 -0
- data/spec/integration/user_filters_spec.rb +122 -21
- data/spec/integration/variables_spec.rb +8 -15
- data/spec/logging_in_logging_out_spec.rb +58 -0
- data/spec/spec_helper.rb +10 -5
- data/spec/unit/bricks/bricks_spec.rb +4 -0
- data/spec/unit/bricks/middleware/aws_middelware_spec.rb +4 -0
- data/spec/unit/bricks/middleware/bench_middleware_spec.rb +4 -0
- data/spec/unit/bricks/middleware/bulk_salesforce_middleware_spec.rb +4 -0
- data/spec/unit/bricks/middleware/gooddata_middleware_spec.rb +4 -0
- data/spec/unit/bricks/middleware/logger_middleware_spec.rb +4 -0
- data/spec/unit/bricks/middleware/restforce_middleware_spec.rb +4 -0
- data/spec/unit/bricks/middleware/stdout_middleware_spec.rb +4 -0
- data/spec/unit/bricks/middleware/twitter_middleware_spec.rb +4 -0
- data/spec/unit/cli/cli_spec.rb +4 -0
- data/spec/unit/cli/commands/cmd_api_spec.rb +4 -0
- data/spec/unit/cli/commands/cmd_auth_spec.rb +4 -0
- data/spec/unit/cli/commands/cmd_domain_spec.rb +4 -0
- data/spec/unit/cli/commands/cmd_process_spec.rb +4 -0
- data/spec/unit/cli/commands/cmd_project_spec.rb +4 -0
- data/spec/unit/cli/commands/cmd_role_spec.rb +4 -0
- data/spec/unit/cli/commands/cmd_run_ruby_spec.rb +4 -0
- data/spec/unit/cli/commands/cmd_scaffold_spec.rb +6 -0
- data/spec/unit/cli/commands/cmd_user_spec.rb +6 -0
- data/spec/unit/commands/command_api_spec.rb +6 -0
- data/spec/unit/commands/command_auth_spec.rb +6 -0
- data/spec/unit/commands/command_dataset_spec.rb +10 -4
- data/spec/unit/commands/command_process_spec.rb +6 -0
- data/spec/unit/commands/command_projects_spec.rb +6 -0
- data/spec/unit/commands/command_scaffold_spec.rb +6 -0
- data/spec/unit/commands/command_user_spec.rb +6 -0
- data/spec/unit/core/connection_spec.rb +6 -0
- data/spec/unit/core/logging_spec.rb +4 -0
- data/spec/unit/core/nil_logger_spec.rb +4 -0
- data/spec/unit/core/project_spec.rb +4 -0
- data/spec/unit/data/guesser_spec.rb +6 -2
- data/spec/unit/extensions/hash_spec.rb +4 -0
- data/spec/unit/godzilla/goodzilla_spec.rb +4 -0
- data/spec/unit/helpers/csv_helper_spec.rb +4 -0
- data/spec/unit/helpers/data_helper_spec.rb +4 -0
- data/spec/unit/helpers/global_helpers_spec.rb +54 -0
- data/spec/unit/helpers_spec.rb +6 -1
- data/spec/unit/models/blueprint/attributes_spec.rb +5 -0
- data/spec/unit/models/blueprint/dataset_spec.rb +5 -0
- data/spec/unit/models/blueprint/labels_spec.rb +5 -0
- data/spec/unit/models/blueprint/project_blueprint_spec.rb +5 -0
- data/spec/unit/models/blueprint/reference_spec.rb +5 -0
- data/spec/unit/models/blueprint/schema_builder_spec.rb +4 -0
- data/spec/unit/models/blueprint/to_wire_spec.rb +5 -0
- data/spec/unit/models/domain_spec.rb +9 -7
- data/spec/unit/models/execution_spec.rb +6 -0
- data/spec/unit/models/from_wire_spec.rb +4 -0
- data/spec/unit/models/invitation_spec.rb +4 -0
- data/spec/unit/models/membership_spec.rb +4 -0
- data/spec/unit/models/metadata_spec.rb +46 -0
- data/spec/unit/models/metric_spec.rb +4 -0
- data/spec/unit/models/model_spec.rb +4 -0
- data/spec/unit/models/params_spec.rb +4 -0
- data/spec/unit/models/profile_spec.rb +4 -0
- data/spec/unit/models/project_creator_spec.rb +127 -0
- data/spec/unit/models/project_role_spec.rb +4 -0
- data/spec/unit/models/project_spec.rb +4 -0
- data/spec/unit/models/report_result_data_spec.rb +193 -0
- data/spec/unit/models/schedule_spec.rb +241 -386
- data/spec/unit/models/to_manifest_spec.rb +21 -0
- data/spec/unit/models/{unit_project.rb → unit_project_spec.rb} +21 -18
- data/spec/unit/models/user_filters_spec.rb +7 -1
- data/spec/unit/models/variable_spec.rb +6 -0
- data/spec/unit/rest/polling_spec.rb +8 -5
- data/spec/unit/rest/resource_spec.rb +4 -0
- metadata +190 -129
- data/.autotest +0 -2
- data/.travis.yml +0 -22
- data/examples.rb +0 -69
- data/lib/gooddata/models/data_result.rb +0 -38
- data/lib/gooddata/models/empty_result.rb +0 -57
- data/spec/unit/models/project_creator.rb +0 -73
@@ -1,4 +1,8 @@
|
|
1
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.
|
2
6
|
|
3
7
|
require_relative '../rest/resource'
|
4
8
|
require_relative '../extensions/hash'
|
@@ -23,7 +27,7 @@ module GoodData
|
|
23
27
|
:timezone => nil,
|
24
28
|
:params => {},
|
25
29
|
:hiddenParams => {},
|
26
|
-
:reschedule => nil
|
30
|
+
# :reschedule => nil
|
27
31
|
}
|
28
32
|
}
|
29
33
|
|
@@ -90,27 +94,30 @@ module GoodData
|
|
90
94
|
|
91
95
|
fail 'Process ID has to be provided' if process_id.blank?
|
92
96
|
fail 'Executable has to be provided' if executable.blank?
|
97
|
+
fail 'Trigger schedule has to be provided' if trigger.blank?
|
98
|
+
|
99
|
+
schedule = c.create(GoodData::Schedule, GoodData::Helpers.deep_stringify_keys(GoodData::Helpers.deep_dup(SCHEDULE_TEMPLATE)), client: c, project: p)
|
93
100
|
|
94
101
|
default_opts = {
|
95
102
|
:type => 'MSETL',
|
96
103
|
:timezone => 'UTC',
|
104
|
+
:state => 'ENABLED',
|
97
105
|
:params => {
|
98
106
|
'PROCESS_ID' => process_id,
|
99
107
|
'EXECUTABLE' => executable
|
100
108
|
},
|
101
|
-
:reschedule =>
|
109
|
+
# :reschedule => nil
|
102
110
|
}
|
103
111
|
|
104
|
-
schedule = c.create(GoodData::Schedule, GoodData::Helpers.deep_stringify_keys(GoodData::Helpers.deep_dup(SCHEDULE_TEMPLATE)), client: c, project: p)
|
105
|
-
|
106
112
|
schedule.name = options[:name]
|
107
|
-
schedule.hidden_params = options[:hidden_params]
|
108
113
|
schedule.set_trigger(trigger)
|
109
114
|
schedule.params = default_opts[:params].merge(options[:params] || {})
|
115
|
+
schedule.hidden_params = options[:hidden_params] || {}
|
110
116
|
schedule.timezone = options[:timezone] || default_opts[:timezone]
|
117
|
+
schedule.state = options[:state] || default_opts[:state]
|
111
118
|
schedule.schedule_type = options[:type] || default_opts[:type]
|
112
|
-
schedule.reschedule = options[:reschedule]
|
113
|
-
schedule
|
119
|
+
schedule.reschedule = options[:reschedule] if options[:reschedule]
|
120
|
+
schedule
|
114
121
|
end
|
115
122
|
end
|
116
123
|
|
@@ -121,13 +128,13 @@ module GoodData
|
|
121
128
|
def initialize(json)
|
122
129
|
json = GoodData::Helpers.deep_stringify_keys(json)
|
123
130
|
super
|
124
|
-
GoodData::Helpers.decode_params(json['schedule']['params'] || {})
|
125
|
-
GoodData::Helpers.decode_params(json['schedule']['hiddenParams'] || {})
|
126
131
|
@json = json
|
132
|
+
self.params = GoodData::Helpers.decode_params(json['schedule']['params'] || {})
|
133
|
+
self.hidden_params = GoodData::Helpers.decode_params(json['schedule']['hiddenParams'] || {})
|
127
134
|
end
|
128
135
|
|
129
136
|
def after
|
130
|
-
schedules
|
137
|
+
project.schedules(trigger_id)
|
131
138
|
end
|
132
139
|
|
133
140
|
def after=(schedule)
|
@@ -139,7 +146,7 @@ module GoodData
|
|
139
146
|
|
140
147
|
# Deletes schedule
|
141
148
|
def delete
|
142
|
-
client.delete
|
149
|
+
saved? ? client.delete(uri) : nil
|
143
150
|
end
|
144
151
|
|
145
152
|
# Is schedule enabled?
|
@@ -180,7 +187,8 @@ module GoodData
|
|
180
187
|
# @option opts [Boolean] :wait Wait for execution result
|
181
188
|
# @return [Object] Raw Response
|
182
189
|
def execute(opts = {})
|
183
|
-
|
190
|
+
return nil unless saved?
|
191
|
+
opts = { :wait => true }.merge(opts)
|
184
192
|
data = {
|
185
193
|
:execution => {}
|
186
194
|
}
|
@@ -195,7 +203,7 @@ module GoodData
|
|
195
203
|
#
|
196
204
|
# @return [String] Executions URL
|
197
205
|
def execution_url
|
198
|
-
@json['schedule']['links']['executions']
|
206
|
+
saved? ? @json['schedule']['links']['executions'] : nil
|
199
207
|
end
|
200
208
|
|
201
209
|
# Returns execution state
|
@@ -205,6 +213,10 @@ module GoodData
|
|
205
213
|
@json['schedule']['state']
|
206
214
|
end
|
207
215
|
|
216
|
+
def state=(a_state)
|
217
|
+
@json['schedule']['state'] = a_state
|
218
|
+
end
|
219
|
+
|
208
220
|
# Returns execution timezone
|
209
221
|
#
|
210
222
|
# @return [String] Execution timezone
|
@@ -300,19 +312,65 @@ module GoodData
|
|
300
312
|
@dirty = true
|
301
313
|
end
|
302
314
|
|
303
|
-
# Returns
|
315
|
+
# Returns enumerator of executions
|
304
316
|
#
|
305
317
|
# @return [Array] Raw Executions JSON
|
306
318
|
def executions
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
client.
|
319
|
+
return nil unless @json
|
320
|
+
url = @json['schedule']['links']['executions']
|
321
|
+
Enumerator.new do |y|
|
322
|
+
loop do
|
323
|
+
res = client.get url
|
324
|
+
res['executions']['paging']['next']
|
325
|
+
res['executions']['items'].each do |execution|
|
326
|
+
y << client.create(Execution, execution, :project => project)
|
327
|
+
end
|
328
|
+
url = res['executions']['paging']['next']
|
329
|
+
break unless url
|
312
330
|
end
|
313
331
|
end
|
314
332
|
end
|
315
333
|
|
334
|
+
# Returns hidden_params as Hash
|
335
|
+
#
|
336
|
+
# @return [Hash] Hidden Parameters
|
337
|
+
def hidden_params
|
338
|
+
@json['schedule']['hiddenParams']
|
339
|
+
end
|
340
|
+
|
341
|
+
# Updates params by merging the current params with new ones
|
342
|
+
#
|
343
|
+
# @param params_to_merge [Hash] params
|
344
|
+
# @return [GoodData::Schedule] Returns self
|
345
|
+
def update_params(params_to_merge)
|
346
|
+
params_to_merge.each do |k, v|
|
347
|
+
set_parameter(k, v)
|
348
|
+
end
|
349
|
+
@dirty = true
|
350
|
+
self
|
351
|
+
end
|
352
|
+
|
353
|
+
# Updates hidden params by merging the current params with new ones
|
354
|
+
#
|
355
|
+
# @param params_to_merge [Hash] params
|
356
|
+
# @return [GoodData::Schedule] Returns self
|
357
|
+
def update_hidden_params(params_to_merge)
|
358
|
+
params_to_merge.each do |k, v|
|
359
|
+
set_hidden_parameter(k, v)
|
360
|
+
end
|
361
|
+
@dirty = true
|
362
|
+
self
|
363
|
+
end
|
364
|
+
|
365
|
+
# Assigns hidden parameters
|
366
|
+
#
|
367
|
+
# @param new_hidden_param [String] Hidden parameters to be set
|
368
|
+
def hidden_params=(new_hidden_params = {})
|
369
|
+
@json['schedule']['hiddenParams'] = new_hidden_params
|
370
|
+
@dirty = true
|
371
|
+
self
|
372
|
+
end
|
373
|
+
|
316
374
|
# Returns params as Hash
|
317
375
|
#
|
318
376
|
# @return [Hash] Parameters
|
@@ -328,23 +386,9 @@ module GoodData
|
|
328
386
|
'PROCESS_ID' => process_id,
|
329
387
|
'EXECUTABLE' => executable
|
330
388
|
}
|
331
|
-
@json['schedule']['params'] = default_params.merge(new_params
|
332
|
-
@dirty = true
|
333
|
-
end
|
334
|
-
|
335
|
-
# Returns hidden_params as Hash
|
336
|
-
#
|
337
|
-
# @return [Hash] Hidden Parameters
|
338
|
-
def hidden_params
|
339
|
-
@json['schedule']['hiddenParams'] || {}
|
340
|
-
end
|
341
|
-
|
342
|
-
# Assigns hidden parameters
|
343
|
-
#
|
344
|
-
# @param new_hidden_param [String] Hidden parameters to be set
|
345
|
-
def hidden_params=(new_hidden_params = {})
|
346
|
-
@json['schedule']['hiddenParams'] = new_hidden_params || {}
|
389
|
+
@json['schedule']['params'] = default_params.merge(new_params)
|
347
390
|
@dirty = true
|
391
|
+
self
|
348
392
|
end
|
349
393
|
|
350
394
|
# Saves object if dirty
|
@@ -355,33 +399,52 @@ module GoodData
|
|
355
399
|
fail 'A timezone has to be provided' if timezone.blank?
|
356
400
|
fail 'Schedule type has to be provided' if schedule_type.blank?
|
357
401
|
if @dirty
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
'type' => @json['schedule']['type'],
|
362
|
-
'state' => @json['schedule']['state'],
|
363
|
-
'timezone' => @json['schedule']['timezone'],
|
364
|
-
'reschedule' => @json['schedule']['reschedule'],
|
365
|
-
'cron' => @json['schedule']['cron'],
|
366
|
-
'triggerScheduleId' => trigger_id,
|
367
|
-
'params' => GoodData::Helpers.encode_params(params, false),
|
368
|
-
'hiddenParams' => GoodData::Helpers.encode_params(hidden_params, true)
|
369
|
-
}.compact
|
370
|
-
}
|
371
|
-
if uri
|
372
|
-
res = client.put(uri, update_json)
|
373
|
-
@json = res
|
402
|
+
if saved?
|
403
|
+
res = client.put(uri, to_update_payload)
|
404
|
+
@json = Schedule.new(res).json
|
374
405
|
else
|
375
|
-
res = client.post "/gdc/projects/#{project.pid}/schedules",
|
406
|
+
res = client.post "/gdc/projects/#{project.pid}/schedules", to_update_payload
|
376
407
|
fail 'Unable to create new schedule' if res.nil?
|
377
408
|
new_obj_json = client.get res['schedule']['links']['self']
|
378
|
-
@json = new_obj_json
|
409
|
+
@json = Schedule.new(new_obj_json).json
|
379
410
|
end
|
380
411
|
@dirty = false
|
381
412
|
end
|
382
413
|
self
|
383
414
|
end
|
384
415
|
|
416
|
+
# Updates params at key k with val v
|
417
|
+
#
|
418
|
+
# @param k [String] key
|
419
|
+
# @param v [Object] value
|
420
|
+
# @return [GoodData::Schedule] Returns self
|
421
|
+
def set_parameter(k, v)
|
422
|
+
params[k] = v
|
423
|
+
@dirty = true
|
424
|
+
self
|
425
|
+
end
|
426
|
+
|
427
|
+
# Updates hidden params at key k with val v
|
428
|
+
#
|
429
|
+
# @param k [String] key
|
430
|
+
# @param v [Object] value
|
431
|
+
# @return [GoodData::Schedule] Returns self
|
432
|
+
def set_hidden_parameter(k, v)
|
433
|
+
hidden_params[k] = v
|
434
|
+
@dirty = true
|
435
|
+
self
|
436
|
+
end
|
437
|
+
|
438
|
+
def schedule_type
|
439
|
+
json['schedule']['type']
|
440
|
+
end
|
441
|
+
|
442
|
+
def schedule_type=(type)
|
443
|
+
json['schedule']['type'] = type
|
444
|
+
@dirty = true
|
445
|
+
self
|
446
|
+
end
|
447
|
+
|
385
448
|
def time_based?
|
386
449
|
cron != nil
|
387
450
|
end
|
@@ -396,18 +459,11 @@ module GoodData
|
|
396
459
|
cron: cron,
|
397
460
|
trigger_id: trigger_id,
|
398
461
|
timezone: timezone,
|
399
|
-
uri: uri
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
json['schedule']['type']
|
405
|
-
end
|
406
|
-
|
407
|
-
def schedule_type=(type)
|
408
|
-
json['schedule']['type'] = type
|
409
|
-
@dirty = true
|
410
|
-
self
|
462
|
+
uri: uri,
|
463
|
+
reschedule: reschedule,
|
464
|
+
executable: executable,
|
465
|
+
process_id: process_id
|
466
|
+
}
|
411
467
|
end
|
412
468
|
|
413
469
|
def trigger_id
|
@@ -450,5 +506,24 @@ module GoodData
|
|
450
506
|
def ==(other)
|
451
507
|
other.respond_to?(:uri) && other.uri == uri && other.respond_to?(:to_hash) && other.to_hash == to_hash
|
452
508
|
end
|
509
|
+
|
510
|
+
def to_update_payload
|
511
|
+
res = {
|
512
|
+
'schedule' => {
|
513
|
+
'name' => name,
|
514
|
+
'type' => type,
|
515
|
+
'state' => state,
|
516
|
+
'timezone' => timezone,
|
517
|
+
'cron' => cron,
|
518
|
+
'triggerScheduleId' => trigger_id,
|
519
|
+
'params' => GoodData::Helpers.encode_public_params(params),
|
520
|
+
'hiddenParams' => GoodData::Helpers.encode_hidden_params(hidden_params)
|
521
|
+
}
|
522
|
+
}
|
523
|
+
|
524
|
+
res['schedule']['reschedule'] = reschedule if reschedule
|
525
|
+
|
526
|
+
res
|
527
|
+
end
|
453
528
|
end
|
454
529
|
end
|
@@ -1,4 +1,8 @@
|
|
1
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.
|
2
6
|
|
3
7
|
module GoodData
|
4
8
|
class UserFilter < GoodData::MdObject
|
@@ -1,4 +1,8 @@
|
|
1
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.
|
2
6
|
|
3
7
|
module GoodData
|
4
8
|
module UserFilterBuilder
|
@@ -224,7 +228,11 @@ module GoodData
|
|
224
228
|
else
|
225
229
|
"[#{label.attribute_uri}] IN (#{element_uris.compact.sort.map { |e| '[' + e + ']' }.join(', ')})"
|
226
230
|
end
|
227
|
-
[
|
231
|
+
if options[:ignore_missing_values]
|
232
|
+
[expression, []]
|
233
|
+
else
|
234
|
+
[expression, errors]
|
235
|
+
end
|
228
236
|
end
|
229
237
|
|
230
238
|
# Encapuslates the creation of filter
|
@@ -248,28 +256,48 @@ module GoodData
|
|
248
256
|
# @param filters [Array<Hash>] Filters definition
|
249
257
|
# @return [Array] first is list of MAQL statements
|
250
258
|
def self.maqlify_filters(filters, options = {})
|
251
|
-
|
252
|
-
users_cache = options[:users_cache]
|
259
|
+
fail_early = options[:fail_early] == false ? false : true
|
260
|
+
users_cache = options[:users_cache]
|
253
261
|
labels_cache = create_label_cache(filters, options)
|
254
262
|
small_labels = get_small_labels(labels_cache)
|
255
263
|
lookups_cache = create_lookups_cache(small_labels)
|
256
264
|
attrs_cache = create_attrs_cache(filters, options)
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
265
|
+
create_filter_proc = proc do |login, f|
|
266
|
+
expression, errors = create_expression(f, labels_cache, lookups_cache, attrs_cache, options)
|
267
|
+
profiles_uri = if options[:type] == :muf
|
268
|
+
'/gdc/account/profile/' + login
|
269
|
+
elsif options[:type] == :variable
|
270
|
+
(users_cache[login] && users_cache[login].uri)
|
271
|
+
else
|
272
|
+
fail 'Unsuported type in maqlify_filters.'
|
273
|
+
end
|
274
|
+
|
275
|
+
if profiles_uri && expression
|
276
|
+
[create_user_filter(expression, profiles_uri)] + errors
|
277
|
+
else
|
278
|
+
[] + errors
|
268
279
|
end
|
269
280
|
end
|
270
|
-
|
271
|
-
|
272
|
-
|
281
|
+
|
282
|
+
# if fail early process until first error
|
283
|
+
results = if fail_early
|
284
|
+
x = filters.inject([true, []]) do |(enough, a), e|
|
285
|
+
login = e[:login]
|
286
|
+
if enough
|
287
|
+
y = e[:filters].pmapcat { |f| create_filter_proc.call(login, f) }
|
288
|
+
[!y.any? { |r| r[:type] == :error }, a.concat(y)]
|
289
|
+
else
|
290
|
+
[false, a]
|
291
|
+
end
|
292
|
+
end
|
293
|
+
x.last
|
294
|
+
else
|
295
|
+
filters.flat_map do |filter|
|
296
|
+
login = filter[:login]
|
297
|
+
filter[:filters].pmapcat { |f| create_filter_proc.call(login, f) }
|
298
|
+
end
|
299
|
+
end
|
300
|
+
results.group_by { |i| i[:type] }.values_at(:filter, :error).map { |i| i || [] }
|
273
301
|
end
|
274
302
|
|
275
303
|
def self.resolve_user_filter(user = [], project = [])
|
@@ -325,19 +353,26 @@ module GoodData
|
|
325
353
|
[to_create, to_delete]
|
326
354
|
end
|
327
355
|
|
328
|
-
def self.execute_mufs(
|
356
|
+
def self.execute_mufs(user_filters, options = {})
|
329
357
|
client = options[:client]
|
330
358
|
project = options[:project]
|
331
|
-
|
359
|
+
ignore_missing_values = options[:ignore_missing_values]
|
360
|
+
users_must_exist = options[:users_must_exist] == false ? false : true
|
332
361
|
dry_run = options[:dry_run]
|
333
|
-
|
362
|
+
|
363
|
+
filters = normalize_filters(user_filters)
|
364
|
+
user_filters, errors = maqlify_filters(filters, options.merge(users_must_exist: users_must_exist, type: :muf))
|
365
|
+
|
366
|
+
fail GoodData::FilterMaqlizationError, errors if !ignore_missing_values && !errors.empty?
|
367
|
+
filters = user_filters.map { |data| client.create(MandatoryUserFilter, data, project: project) }
|
368
|
+
to_create, to_delete = resolve_user_filters(filters, project.data_permissions)
|
369
|
+
|
334
370
|
GoodData.logger.warn("Data permissions computed: #{to_create.count} to create and #{to_delete.count} to delete")
|
335
|
-
return
|
371
|
+
return { created: to_create, deleted: to_delete } if dry_run
|
336
372
|
|
337
|
-
to_create.each_slice(100).flat_map do |batch|
|
338
|
-
batch.
|
373
|
+
create_results = to_create.each_slice(100).flat_map do |batch|
|
374
|
+
batch.pmapcat do |related_uri, group|
|
339
375
|
group.each(&:save)
|
340
|
-
|
341
376
|
res = client.get("/gdc/md/#{project.pid}/userfilters?users=#{related_uri}")
|
342
377
|
items = res['userFilters']['items'].empty? ? [] : res['userFilters']['items'].first['userFilters']
|
343
378
|
|
@@ -349,32 +384,40 @@ module GoodData
|
|
349
384
|
}]
|
350
385
|
}
|
351
386
|
}
|
352
|
-
client.post("/gdc/md/#{project.pid}/userfilters", payload)
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
to_delete.each_slice(100).flat_map do |batch|
|
357
|
-
batch.peach do |related_uri, group|
|
358
|
-
if related_uri
|
359
|
-
res = client.get("/gdc/md/#{project.pid}/userfilters?users=#{related_uri}")
|
360
|
-
items = res['userFilters']['items'].empty? ? [] : res['userFilters']['items'].first['userFilters']
|
361
|
-
payload = {
|
362
|
-
'userFilters' => {
|
363
|
-
'items' => [
|
364
|
-
{
|
365
|
-
'user' => related_uri,
|
366
|
-
'userFilters' => items - group.map(&:uri)
|
367
|
-
}
|
368
|
-
]
|
369
|
-
}
|
370
|
-
}
|
371
|
-
client.post("/gdc/md/#{project.pid}/userfilters", payload)
|
372
|
-
end
|
373
|
-
group.peach(&:delete)
|
374
|
-
end
|
387
|
+
res = client.post("/gdc/md/#{project.pid}/userfilters", payload)
|
388
|
+
|
389
|
+
# turn the errors from hashes into array of hashes
|
390
|
+
res['userFiltersUpdateResult'].flat_map { |k, v| v.map { |r| { status: k.to_sym, user: r, type: :create } } }.map { |result| result[:status] == :failed ? result.merge(GoodData::Helpers.symbolize_keys(result[:user])) : result }
|
375
391
|
end
|
376
392
|
end
|
377
|
-
[
|
393
|
+
delete_results = unless options[:do_not_touch_filters_that_are_not_mentioned]
|
394
|
+
to_delete.each_slice(100).flat_map do |batch|
|
395
|
+
batch.flat_map do |related_uri, group|
|
396
|
+
results = []
|
397
|
+
if related_uri
|
398
|
+
res = client.get("/gdc/md/#{project.pid}/userfilters?users=#{related_uri}")
|
399
|
+
items = res['userFilters']['items'].empty? ? [] : res['userFilters']['items'].first['userFilters']
|
400
|
+
payload = {
|
401
|
+
'userFilters' => {
|
402
|
+
'items' => [
|
403
|
+
{
|
404
|
+
'user' => related_uri,
|
405
|
+
'userFilters' => items - group.map(&:uri)
|
406
|
+
}
|
407
|
+
]
|
408
|
+
}
|
409
|
+
}
|
410
|
+
res = client.post("/gdc/md/#{project.pid}/userfilters", payload)
|
411
|
+
results.concat(res['userFiltersUpdateResult']
|
412
|
+
.flat_map { |k, v| v.map { |r| { status: k.to_sym, user: r, type: :delete } } }
|
413
|
+
.map { |result| result[:status] == :failed ? result.merge(GoodData::Helpers.symbolize_keys(result[:user])) : result })
|
414
|
+
end
|
415
|
+
group.peach(&:delete)
|
416
|
+
results
|
417
|
+
end
|
418
|
+
end
|
419
|
+
end
|
420
|
+
{ created: to_create, deleted: to_delete, results: create_results + (delete_results || []) }
|
378
421
|
end
|
379
422
|
|
380
423
|
private
|
@@ -421,25 +464,24 @@ module GoodData
|
|
421
464
|
ignore_missing_values = options[:ignore_missing_values]
|
422
465
|
users_must_exist = options[:users_must_exist] == false ? false : true
|
423
466
|
filters = normalize_filters(user_filters)
|
424
|
-
domain = options[:domain]
|
425
|
-
users = project.users
|
467
|
+
# domain = options[:domain]
|
426
468
|
# users = domain ? project.users : project.users
|
469
|
+
users = project.users
|
427
470
|
users_cache = create_cache(users, :login)
|
428
471
|
missing_users = get_missing_users(filters, options.merge(users_cache: users_cache))
|
429
472
|
user_filters, errors = if missing_users.empty?
|
430
473
|
verify_existing_users(filters, project: project, users_must_exist: users_must_exist, users_cache: users_cache)
|
431
474
|
maqlify_filters(filters, options.merge(users_cache: users_cache, users_must_exist: users_must_exist))
|
432
475
|
elsif missing_users.count < 100
|
433
|
-
verify_existing_users(filters, project: project, users_must_exist: users_must_exist, users_cache: users_cache
|
434
|
-
maqlify_filters(filters, options.merge(users_cache: users_cache, users_must_exist: users_must_exist
|
476
|
+
verify_existing_users(filters, project: project, users_must_exist: users_must_exist, users_cache: users_cache)
|
477
|
+
maqlify_filters(filters, options.merge(users_cache: users_cache, users_must_exist: users_must_exist))
|
435
478
|
else
|
436
|
-
users += domain.users
|
437
479
|
users_cache = create_cache(users, :login)
|
438
|
-
verify_existing_users(filters, project: project, users_must_exist: users_must_exist, users_cache: users_cache
|
439
|
-
maqlify_filters(filters, options.merge(users_cache: users_cache, users_must_exist: users_must_exist
|
480
|
+
verify_existing_users(filters, project: project, users_must_exist: users_must_exist, users_cache: users_cache)
|
481
|
+
maqlify_filters(filters, options.merge(users_cache: users_cache, users_must_exist: users_must_exist))
|
440
482
|
end
|
441
483
|
|
442
|
-
fail
|
484
|
+
fail GoodData::FilterMaqlizationError, errors if !ignore_missing_values && !errors.empty?
|
443
485
|
filters = user_filters.map { |data| client.create(klass, data, project: project) }
|
444
486
|
resolve_user_filters(filters, project_filters)
|
445
487
|
end
|