gooddata 0.6.20 → 0.6.22

Sign up to get free protection for your applications and to get access to all the features.
Files changed (316) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +29 -1
  3. data/DEPENDENCIES.md +816 -0
  4. data/LICENSE +1 -1
  5. data/LICENSE.rb +5 -0
  6. data/Rakefile +74 -22
  7. data/dependency_decisions.yml +102 -0
  8. data/gooddata.gemspec +39 -38
  9. data/lib/gooddata.rb +4 -0
  10. data/lib/gooddata/app/app.rb +4 -0
  11. data/lib/gooddata/bricks/base_downloader.rb +5 -1
  12. data/lib/gooddata/bricks/brick.rb +4 -0
  13. data/lib/gooddata/bricks/bricks.rb +5 -0
  14. data/lib/gooddata/bricks/middleware/aws_middleware.rb +5 -0
  15. data/lib/gooddata/bricks/middleware/base_middleware.rb +5 -0
  16. data/lib/gooddata/bricks/middleware/bench_middleware.rb +5 -0
  17. data/lib/gooddata/bricks/middleware/bulk_salesforce_middleware.rb +5 -0
  18. data/lib/gooddata/bricks/middleware/decode_params_middleware.rb +6 -0
  19. data/lib/gooddata/bricks/middleware/fs_download_middleware.rb +6 -0
  20. data/lib/gooddata/bricks/middleware/fs_upload_middleware.rb +6 -0
  21. data/lib/gooddata/bricks/middleware/gooddata_middleware.rb +6 -0
  22. data/lib/gooddata/bricks/middleware/logger_middleware.rb +5 -0
  23. data/lib/gooddata/bricks/middleware/middleware.rb +5 -0
  24. data/lib/gooddata/bricks/middleware/restforce_middleware.rb +4 -0
  25. data/lib/gooddata/bricks/middleware/stdout_middleware.rb +5 -0
  26. data/lib/gooddata/bricks/middleware/twitter_middleware.rb +5 -0
  27. data/lib/gooddata/bricks/middleware/undot_params_middleware.rb +4 -0
  28. data/lib/gooddata/bricks/pipeline.rb +4 -0
  29. data/lib/gooddata/bricks/utils.rb +4 -0
  30. data/lib/gooddata/cli/cli.rb +4 -0
  31. data/lib/gooddata/cli/commands/api_cmd.rb +4 -0
  32. data/lib/gooddata/cli/commands/auth_cmd.rb +4 -0
  33. data/lib/gooddata/cli/commands/console_cmd.rb +4 -0
  34. data/lib/gooddata/cli/commands/domain_cmd.rb +4 -0
  35. data/lib/gooddata/cli/commands/process_cmd.rb +4 -0
  36. data/lib/gooddata/cli/commands/project_cmd.rb +4 -0
  37. data/lib/gooddata/cli/commands/projects_cmd.rb +4 -0
  38. data/lib/gooddata/cli/commands/run_ruby_cmd.rb +4 -0
  39. data/lib/gooddata/cli/commands/scaffold_cmd.rb +4 -0
  40. data/lib/gooddata/cli/commands/user_cmd.rb +4 -0
  41. data/lib/gooddata/cli/hooks.rb +4 -0
  42. data/lib/gooddata/cli/shared.rb +4 -0
  43. data/lib/gooddata/cli/terminal.rb +4 -0
  44. data/lib/gooddata/client.rb +4 -0
  45. data/lib/gooddata/commands/api.rb +4 -0
  46. data/lib/gooddata/commands/auth.rb +4 -0
  47. data/lib/gooddata/commands/base.rb +4 -0
  48. data/lib/gooddata/commands/commands.rb +5 -0
  49. data/lib/gooddata/commands/datasets.rb +5 -1
  50. data/lib/gooddata/commands/datawarehouse.rb +4 -0
  51. data/lib/gooddata/commands/domain.rb +4 -0
  52. data/lib/gooddata/commands/process.rb +4 -0
  53. data/lib/gooddata/commands/project.rb +7 -9
  54. data/lib/gooddata/commands/projects.rb +4 -0
  55. data/lib/gooddata/commands/role.rb +4 -0
  56. data/lib/gooddata/commands/runners.rb +4 -0
  57. data/lib/gooddata/commands/scaffold.rb +4 -0
  58. data/lib/gooddata/commands/user.rb +4 -0
  59. data/lib/gooddata/connection.rb +83 -0
  60. data/lib/gooddata/core/core.rb +4 -0
  61. data/lib/gooddata/core/logging.rb +4 -0
  62. data/lib/gooddata/core/nil_logger.rb +4 -0
  63. data/lib/gooddata/core/project.rb +4 -0
  64. data/lib/gooddata/core/rest.rb +14 -16
  65. data/lib/gooddata/core/user.rb +4 -0
  66. data/lib/gooddata/data/data.rb +4 -0
  67. data/lib/gooddata/data/guesser.rb +4 -0
  68. data/lib/gooddata/exceptions/attr_element_not_found.rb +4 -0
  69. data/lib/gooddata/exceptions/command_failed.rb +4 -0
  70. data/lib/gooddata/exceptions/exceptions.rb +4 -0
  71. data/lib/gooddata/exceptions/execution_limit_exceeded.rb +4 -0
  72. data/lib/gooddata/exceptions/filter_maqlization.rb +16 -0
  73. data/lib/gooddata/exceptions/malformed_user.rb +15 -0
  74. data/lib/gooddata/exceptions/no_project_error.rb +4 -0
  75. data/lib/gooddata/exceptions/object_migration.rb +28 -0
  76. data/lib/gooddata/exceptions/project_not_found.rb +5 -0
  77. data/lib/gooddata/exceptions/uncomputable_report.rb +5 -0
  78. data/lib/gooddata/exceptions/user_in_different_domain.rb +4 -0
  79. data/lib/gooddata/exceptions/validation_error.rb +4 -0
  80. data/lib/gooddata/extensions/big_decimal.rb +4 -0
  81. data/lib/gooddata/extensions/enumerable.rb +4 -0
  82. data/lib/gooddata/extensions/extensions.rb +4 -0
  83. data/lib/gooddata/extensions/false.rb +4 -0
  84. data/lib/gooddata/extensions/hash.rb +4 -0
  85. data/lib/gooddata/extensions/nil.rb +4 -0
  86. data/lib/gooddata/extensions/numeric.rb +4 -0
  87. data/lib/gooddata/extensions/object.rb +4 -0
  88. data/lib/gooddata/extensions/symbol.rb +4 -0
  89. data/lib/gooddata/extensions/true.rb +4 -0
  90. data/lib/gooddata/extract.rb +4 -0
  91. data/lib/gooddata/goodzilla/goodzilla.rb +87 -77
  92. data/lib/gooddata/helpers/auth_helpers.rb +6 -2
  93. data/lib/gooddata/helpers/csv_helper.rb +4 -0
  94. data/lib/gooddata/helpers/data_helper.rb +4 -0
  95. data/lib/gooddata/helpers/global_helpers.rb +35 -6
  96. data/lib/gooddata/helpers/global_helpers_params.rb +34 -7
  97. data/lib/gooddata/helpers/helpers.rb +4 -0
  98. data/lib/gooddata/mixins/author.rb +4 -0
  99. data/lib/gooddata/mixins/content_getter.rb +4 -0
  100. data/lib/gooddata/mixins/content_property_reader.rb +4 -0
  101. data/lib/gooddata/mixins/content_property_writer.rb +4 -0
  102. data/lib/gooddata/mixins/contributor.rb +4 -0
  103. data/lib/gooddata/mixins/data_getter.rb +4 -0
  104. data/lib/gooddata/mixins/data_property_reader.rb +4 -0
  105. data/lib/gooddata/mixins/data_property_writer.rb +4 -0
  106. data/lib/gooddata/mixins/inspector.rb +4 -0
  107. data/lib/gooddata/mixins/is_attribute.rb +4 -0
  108. data/lib/gooddata/mixins/is_dimension.rb +4 -0
  109. data/lib/gooddata/mixins/is_fact.rb +4 -0
  110. data/lib/gooddata/mixins/is_label.rb +4 -0
  111. data/lib/gooddata/mixins/links.rb +4 -0
  112. data/lib/gooddata/mixins/md_finders.rb +4 -0
  113. data/lib/gooddata/mixins/md_id_to_uri.rb +4 -0
  114. data/lib/gooddata/mixins/md_json.rb +4 -0
  115. data/lib/gooddata/mixins/md_lock.rb +4 -0
  116. data/lib/gooddata/mixins/md_object_id.rb +5 -1
  117. data/lib/gooddata/mixins/md_object_indexer.rb +4 -0
  118. data/lib/gooddata/mixins/md_object_query.rb +4 -0
  119. data/lib/gooddata/mixins/md_relations.rb +4 -0
  120. data/lib/gooddata/mixins/meta_getter.rb +4 -0
  121. data/lib/gooddata/mixins/meta_property_reader.rb +4 -0
  122. data/lib/gooddata/mixins/meta_property_writer.rb +4 -0
  123. data/lib/gooddata/mixins/mixins.rb +4 -0
  124. data/lib/gooddata/mixins/not_attribute.rb +4 -0
  125. data/lib/gooddata/mixins/not_exportable.rb +4 -0
  126. data/lib/gooddata/mixins/not_fact.rb +4 -0
  127. data/lib/gooddata/mixins/not_label.rb +4 -0
  128. data/lib/gooddata/mixins/not_metric.rb +6 -0
  129. data/lib/gooddata/mixins/obj_id.rb +4 -0
  130. data/lib/gooddata/mixins/rest_getters.rb +4 -0
  131. data/lib/gooddata/mixins/rest_resource.rb +4 -0
  132. data/lib/gooddata/mixins/root_key_getter.rb +4 -0
  133. data/lib/gooddata/mixins/root_key_setter.rb +4 -0
  134. data/lib/gooddata/mixins/timestamps.rb +4 -0
  135. data/lib/gooddata/models/blueprint/anchor_field.rb +4 -0
  136. data/lib/gooddata/models/blueprint/attribute_field.rb +4 -0
  137. data/lib/gooddata/models/blueprint/blueprint.rb +4 -0
  138. data/lib/gooddata/models/blueprint/blueprint_field.rb +4 -0
  139. data/lib/gooddata/models/blueprint/dashboard_builder.rb +4 -0
  140. data/lib/gooddata/models/blueprint/dataset_blueprint.rb +6 -0
  141. data/lib/gooddata/models/blueprint/date_dimension.rb +4 -0
  142. data/lib/gooddata/models/blueprint/fact_field.rb +4 -0
  143. data/lib/gooddata/models/blueprint/label_field.rb +4 -0
  144. data/lib/gooddata/models/blueprint/project_blueprint.rb +6 -0
  145. data/lib/gooddata/models/blueprint/project_builder.rb +4 -0
  146. data/lib/gooddata/models/blueprint/reference_field.rb +4 -0
  147. data/lib/gooddata/models/blueprint/schema_blueprint.rb +4 -0
  148. data/lib/gooddata/models/blueprint/schema_builder.rb +4 -0
  149. data/lib/gooddata/models/blueprint/to_manifest.rb +17 -1
  150. data/lib/gooddata/models/blueprint/to_wire.rb +4 -0
  151. data/lib/gooddata/models/datawarehouse.rb +5 -0
  152. data/lib/gooddata/models/domain.rb +25 -7
  153. data/lib/gooddata/models/execution.rb +4 -0
  154. data/lib/gooddata/models/execution_detail.rb +4 -0
  155. data/lib/gooddata/models/from_wire.rb +4 -0
  156. data/lib/gooddata/models/invitation.rb +4 -0
  157. data/lib/gooddata/models/links.rb +4 -0
  158. data/lib/gooddata/models/membership.rb +4 -0
  159. data/lib/gooddata/models/metadata.rb +37 -10
  160. data/lib/gooddata/models/metadata/attribute.rb +6 -0
  161. data/lib/gooddata/models/metadata/dashboard.rb +54 -16
  162. data/lib/gooddata/models/metadata/dashboard/dashboard_item.rb +60 -0
  163. data/lib/gooddata/models/metadata/dashboard/filter_item.rb +15 -0
  164. data/lib/gooddata/models/metadata/dashboard/report_item.rb +51 -0
  165. data/lib/gooddata/models/metadata/dashboard_tab.rb +88 -0
  166. data/lib/gooddata/models/metadata/dataset.rb +4 -0
  167. data/lib/gooddata/models/metadata/dimension.rb +4 -0
  168. data/lib/gooddata/models/metadata/fact.rb +6 -0
  169. data/lib/gooddata/models/metadata/label.rb +15 -0
  170. data/lib/gooddata/models/metadata/metadata.rb +4 -0
  171. data/lib/gooddata/models/metadata/metric.rb +5 -4
  172. data/lib/gooddata/models/metadata/report.rb +62 -16
  173. data/lib/gooddata/models/metadata/report_definition.rb +44 -47
  174. data/lib/gooddata/models/metadata/variable.rb +4 -0
  175. data/lib/gooddata/models/model.rb +85 -36
  176. data/lib/gooddata/models/models.rb +4 -0
  177. data/lib/gooddata/models/module_constants.rb +4 -0
  178. data/lib/gooddata/models/process.rb +4 -0
  179. data/lib/gooddata/models/profile.rb +13 -0
  180. data/lib/gooddata/models/project.rb +173 -92
  181. data/lib/gooddata/models/project_creator.rb +18 -10
  182. data/lib/gooddata/models/project_metadata.rb +4 -0
  183. data/lib/gooddata/models/project_role.rb +4 -0
  184. data/lib/gooddata/models/report_data_result.rb +217 -125
  185. data/lib/gooddata/models/schedule.rb +140 -65
  186. data/lib/gooddata/models/tab_builder.rb +4 -0
  187. data/lib/gooddata/models/user_filters/mandatory_user_filter.rb +4 -0
  188. data/lib/gooddata/models/user_filters/user_filter.rb +4 -0
  189. data/lib/gooddata/models/user_filters/user_filter_builder.rb +98 -56
  190. data/lib/gooddata/models/user_filters/user_filters.rb +4 -0
  191. data/lib/gooddata/models/user_filters/variable_user_filter.rb +4 -0
  192. data/lib/gooddata/rest/client.rb +41 -38
  193. data/lib/gooddata/rest/connection.rb +91 -20
  194. data/lib/gooddata/rest/connections/rest_client_connection.rb +5 -1
  195. data/lib/gooddata/rest/object.rb +9 -1
  196. data/lib/gooddata/rest/object_factory.rb +5 -1
  197. data/lib/gooddata/rest/resource.rb +5 -1
  198. data/lib/gooddata/rest/rest.rb +4 -0
  199. data/lib/gooddata/version.rb +5 -1
  200. data/spec/bricks/bricks_spec.rb +4 -0
  201. data/spec/data/blueprints/test_project_model_spec.json +2 -2
  202. data/spec/data/gooddata_version_process/gooddata_version.rb +6 -0
  203. data/spec/data/hello_world_process/hello_world.rb +6 -0
  204. data/spec/data/manifests/test_project.json +5 -5
  205. data/spec/data/reports/left_attr_report.json +108 -0
  206. data/spec/data/reports/metric_only_one_line.json +83 -0
  207. data/spec/data/reports/report_1.json +197 -0
  208. data/spec/data/reports/top_attr_report.json +108 -0
  209. data/spec/data/ruby_params_process/ruby_params.rb +6 -0
  210. data/spec/data/ruby_process/process.rb +6 -0
  211. data/spec/environment/default.rb +5 -0
  212. data/spec/environment/develop.rb +10 -5
  213. data/spec/environment/environment.rb +4 -0
  214. data/spec/environment/hotfix.rb +5 -1
  215. data/spec/environment/production.rb +4 -0
  216. data/spec/environment/release.rb +4 -0
  217. data/spec/environment/staging.rb +30 -0
  218. data/spec/environment/staging_3.rb +37 -0
  219. data/spec/helpers/blueprint_helper.rb +4 -0
  220. data/spec/helpers/cli_helper.rb +4 -0
  221. data/spec/helpers/connection_helper.rb +24 -17
  222. data/spec/helpers/crypto_helper.rb +6 -0
  223. data/spec/helpers/csv_helper.rb +4 -0
  224. data/spec/helpers/process_helper.rb +5 -1
  225. data/spec/helpers/project_helper.rb +34 -29
  226. data/spec/helpers/schedule_helper.rb +4 -0
  227. data/spec/helpers/spec_helper.rb +4 -0
  228. data/spec/integration/blueprint_updates_spec.rb +28 -20
  229. data/spec/integration/command_datawarehouse_spec.rb +6 -0
  230. data/spec/integration/command_projects_spec.rb +6 -4
  231. data/spec/integration/create_from_template_spec.rb +6 -0
  232. data/spec/integration/create_project_spec.rb +6 -0
  233. data/spec/integration/deprecated_load_spec.rb +58 -0
  234. data/spec/integration/full_process_schedule_spec.rb +9 -0
  235. data/spec/integration/full_project_spec.rb +63 -9
  236. data/spec/integration/over_to_user_filters_spec.rb +7 -2
  237. data/spec/integration/partial_md_export_import_spec.rb +6 -0
  238. data/spec/integration/project_spec.rb +12 -6
  239. data/spec/integration/rest_spec.rb +6 -2
  240. data/spec/integration/schedule_spec.rb +627 -0
  241. data/spec/integration/user_filters_spec.rb +122 -21
  242. data/spec/integration/variables_spec.rb +8 -15
  243. data/spec/logging_in_logging_out_spec.rb +58 -0
  244. data/spec/spec_helper.rb +10 -5
  245. data/spec/unit/bricks/bricks_spec.rb +4 -0
  246. data/spec/unit/bricks/middleware/aws_middelware_spec.rb +4 -0
  247. data/spec/unit/bricks/middleware/bench_middleware_spec.rb +4 -0
  248. data/spec/unit/bricks/middleware/bulk_salesforce_middleware_spec.rb +4 -0
  249. data/spec/unit/bricks/middleware/gooddata_middleware_spec.rb +4 -0
  250. data/spec/unit/bricks/middleware/logger_middleware_spec.rb +4 -0
  251. data/spec/unit/bricks/middleware/restforce_middleware_spec.rb +4 -0
  252. data/spec/unit/bricks/middleware/stdout_middleware_spec.rb +4 -0
  253. data/spec/unit/bricks/middleware/twitter_middleware_spec.rb +4 -0
  254. data/spec/unit/cli/cli_spec.rb +4 -0
  255. data/spec/unit/cli/commands/cmd_api_spec.rb +4 -0
  256. data/spec/unit/cli/commands/cmd_auth_spec.rb +4 -0
  257. data/spec/unit/cli/commands/cmd_domain_spec.rb +4 -0
  258. data/spec/unit/cli/commands/cmd_process_spec.rb +4 -0
  259. data/spec/unit/cli/commands/cmd_project_spec.rb +4 -0
  260. data/spec/unit/cli/commands/cmd_role_spec.rb +4 -0
  261. data/spec/unit/cli/commands/cmd_run_ruby_spec.rb +4 -0
  262. data/spec/unit/cli/commands/cmd_scaffold_spec.rb +6 -0
  263. data/spec/unit/cli/commands/cmd_user_spec.rb +6 -0
  264. data/spec/unit/commands/command_api_spec.rb +6 -0
  265. data/spec/unit/commands/command_auth_spec.rb +6 -0
  266. data/spec/unit/commands/command_dataset_spec.rb +10 -4
  267. data/spec/unit/commands/command_process_spec.rb +6 -0
  268. data/spec/unit/commands/command_projects_spec.rb +6 -0
  269. data/spec/unit/commands/command_scaffold_spec.rb +6 -0
  270. data/spec/unit/commands/command_user_spec.rb +6 -0
  271. data/spec/unit/core/connection_spec.rb +6 -0
  272. data/spec/unit/core/logging_spec.rb +4 -0
  273. data/spec/unit/core/nil_logger_spec.rb +4 -0
  274. data/spec/unit/core/project_spec.rb +4 -0
  275. data/spec/unit/data/guesser_spec.rb +6 -2
  276. data/spec/unit/extensions/hash_spec.rb +4 -0
  277. data/spec/unit/godzilla/goodzilla_spec.rb +4 -0
  278. data/spec/unit/helpers/csv_helper_spec.rb +4 -0
  279. data/spec/unit/helpers/data_helper_spec.rb +4 -0
  280. data/spec/unit/helpers/global_helpers_spec.rb +54 -0
  281. data/spec/unit/helpers_spec.rb +6 -1
  282. data/spec/unit/models/blueprint/attributes_spec.rb +5 -0
  283. data/spec/unit/models/blueprint/dataset_spec.rb +5 -0
  284. data/spec/unit/models/blueprint/labels_spec.rb +5 -0
  285. data/spec/unit/models/blueprint/project_blueprint_spec.rb +5 -0
  286. data/spec/unit/models/blueprint/reference_spec.rb +5 -0
  287. data/spec/unit/models/blueprint/schema_builder_spec.rb +4 -0
  288. data/spec/unit/models/blueprint/to_wire_spec.rb +5 -0
  289. data/spec/unit/models/domain_spec.rb +9 -7
  290. data/spec/unit/models/execution_spec.rb +6 -0
  291. data/spec/unit/models/from_wire_spec.rb +4 -0
  292. data/spec/unit/models/invitation_spec.rb +4 -0
  293. data/spec/unit/models/membership_spec.rb +4 -0
  294. data/spec/unit/models/metadata_spec.rb +46 -0
  295. data/spec/unit/models/metric_spec.rb +4 -0
  296. data/spec/unit/models/model_spec.rb +4 -0
  297. data/spec/unit/models/params_spec.rb +4 -0
  298. data/spec/unit/models/profile_spec.rb +4 -0
  299. data/spec/unit/models/project_creator_spec.rb +127 -0
  300. data/spec/unit/models/project_role_spec.rb +4 -0
  301. data/spec/unit/models/project_spec.rb +4 -0
  302. data/spec/unit/models/report_result_data_spec.rb +193 -0
  303. data/spec/unit/models/schedule_spec.rb +241 -386
  304. data/spec/unit/models/to_manifest_spec.rb +21 -0
  305. data/spec/unit/models/{unit_project.rb → unit_project_spec.rb} +21 -18
  306. data/spec/unit/models/user_filters_spec.rb +7 -1
  307. data/spec/unit/models/variable_spec.rb +6 -0
  308. data/spec/unit/rest/polling_spec.rb +8 -5
  309. data/spec/unit/rest/resource_spec.rb +4 -0
  310. metadata +190 -129
  311. data/.autotest +0 -2
  312. data/.travis.yml +0 -22
  313. data/examples.rb +0 -69
  314. data/lib/gooddata/models/data_result.rb +0 -38
  315. data/lib/gooddata/models/empty_result.rb +0 -57
  316. 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 => 0
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] || default_opts[:reschedule]
113
- schedule.save
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.find { |s| s.obj_id == trigger_id }
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 uri
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
- opts = { :wait => true }.merge(opts)
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 list of executions
315
+ # Returns enumerator of executions
304
316
  #
305
317
  # @return [Array] Raw Executions JSON
306
318
  def executions
307
- if @json # rubocop:disable Style/GuardClause
308
- url = @json['schedule']['links']['executions']
309
- res = client.get url
310
- res['executions']['items'].map do |e|
311
- client.create(Execution, e, :project => project)
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
- update_json = {
359
- 'schedule' => {
360
- 'name' => @json['schedule']['name'],
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", update_json
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
- }.compact
401
- end
402
-
403
- def schedule_type
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
  module Model
@@ -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 'user_filter'
4
8
 
@@ -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
- [expression, errors]
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
- # project = options[:project]
252
- users_cache = options[:users_cache] # || create_cache(project.users, :login)
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
- results = filters.flat_map do |filter|
259
- login = filter[:login]
260
- filter[:filters].pmapcat do |f|
261
- expression, errors = create_expression(f, labels_cache, lookups_cache, attrs_cache, options)
262
- profiles_uri = (users_cache[login] && users_cache[login].uri)
263
- if profiles_uri && expression
264
- [create_user_filter(expression, profiles_uri)] + errors
265
- else
266
- [] + errors
267
- end
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
- results.group_by { |i| i[:type] }
271
- .values_at(:filter, :error)
272
- .map { |i| i || [] }
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(filters, options = {})
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
- to_create, to_delete = execute(filters, project.data_permissions, MandatoryUserFilter, options.merge(type: :muf))
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 [to_create, to_delete] if dry_run
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.peach do |related_uri, group|
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
- end
354
- end
355
- unless options[:do_not_touch_filters_that_are_not_mentioned]
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
- [to_create, to_delete]
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, domain: domain)
434
- maqlify_filters(filters, options.merge(users_cache: users_cache, users_must_exist: users_must_exist, domain: domain))
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, domain: domain)
439
- maqlify_filters(filters, options.merge(users_cache: users_cache, users_must_exist: users_must_exist, domain: domain))
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 "Validation failed #{errors}" if !ignore_missing_values && !errors.empty?
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