gooddata 0.6.20 → 0.6.22

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.
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