gooddata 0.6.49 → 0.6.50

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 (390) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +15 -4
  3. data/CLI.md +0 -4
  4. data/DEPENDENCIES.md +0 -8
  5. data/Dockerfile.jruby +19 -0
  6. data/Dockerfile.ruby +19 -0
  7. data/LICENSE +2 -2
  8. data/LICENSE.rb +1 -1
  9. data/Rakefile +1 -1
  10. data/gooddata.gemspec +29 -28
  11. data/lib/gooddata.rb +2 -1
  12. data/lib/gooddata/app/app.rb +1 -1
  13. data/lib/gooddata/bricks/base_downloader.rb +1 -1
  14. data/lib/gooddata/bricks/brick.rb +3 -4
  15. data/lib/gooddata/bricks/bricks.rb +3 -1
  16. data/lib/gooddata/bricks/middleware/aws_middleware.rb +6 -8
  17. data/lib/gooddata/bricks/middleware/base_middleware.rb +2 -1
  18. data/lib/gooddata/bricks/middleware/bench_middleware.rb +2 -1
  19. data/lib/gooddata/bricks/middleware/bulk_salesforce_middleware.rb +3 -3
  20. data/lib/gooddata/bricks/middleware/decode_params_middleware.rb +3 -2
  21. data/lib/gooddata/bricks/middleware/dwh_middleware.rb +28 -0
  22. data/lib/gooddata/bricks/middleware/fs_download_middleware.rb +2 -2
  23. data/lib/gooddata/bricks/middleware/fs_upload_middleware.rb +2 -2
  24. data/lib/gooddata/bricks/middleware/gooddata_middleware.rb +84 -21
  25. data/lib/gooddata/bricks/middleware/logger_middleware.rb +1 -1
  26. data/lib/gooddata/bricks/middleware/middleware.rb +1 -1
  27. data/lib/gooddata/bricks/middleware/params_inspect_middleware.rb +21 -0
  28. data/lib/gooddata/bricks/middleware/restforce_middleware.rb +26 -26
  29. data/lib/gooddata/bricks/middleware/stdout_middleware.rb +1 -1
  30. data/lib/gooddata/bricks/middleware/twitter_middleware.rb +1 -1
  31. data/lib/gooddata/bricks/middleware/undot_params_middleware.rb +1 -1
  32. data/lib/gooddata/bricks/pipeline.rb +6 -13
  33. data/lib/gooddata/bricks/utils.rb +3 -3
  34. data/lib/gooddata/cli/cli.rb +1 -1
  35. data/lib/gooddata/cli/commands/auth_cmd.rb +1 -1
  36. data/lib/gooddata/cli/commands/domain_cmd.rb +1 -1
  37. data/lib/gooddata/cli/commands/project_cmd.rb +1 -18
  38. data/lib/gooddata/cli/hooks.rb +1 -2
  39. data/lib/gooddata/cli/shared.rb +1 -1
  40. data/lib/gooddata/cli/terminal.rb +1 -1
  41. data/lib/gooddata/client.rb +1 -1
  42. data/lib/gooddata/commands/api.rb +1 -1
  43. data/lib/gooddata/commands/auth.rb +1 -1
  44. data/lib/gooddata/commands/base.rb +1 -1
  45. data/lib/gooddata/commands/commands.rb +1 -1
  46. data/lib/gooddata/commands/datasets.rb +1 -1
  47. data/lib/gooddata/commands/datawarehouse.rb +1 -1
  48. data/lib/gooddata/commands/domain.rb +1 -1
  49. data/lib/gooddata/commands/process.rb +1 -1
  50. data/lib/gooddata/commands/project.rb +2 -31
  51. data/lib/gooddata/commands/projects.rb +1 -1
  52. data/lib/gooddata/commands/role.rb +1 -1
  53. data/lib/gooddata/commands/runners.rb +1 -1
  54. data/lib/gooddata/commands/scaffold.rb +1 -1
  55. data/lib/gooddata/commands/user.rb +1 -1
  56. data/lib/gooddata/connection.rb +1 -1
  57. data/lib/gooddata/core/core.rb +1 -1
  58. data/lib/gooddata/core/logging.rb +1 -1
  59. data/lib/gooddata/core/nil_logger.rb +1 -1
  60. data/lib/gooddata/core/project.rb +1 -1
  61. data/lib/gooddata/core/rest.rb +1 -1
  62. data/lib/gooddata/core/user.rb +1 -1
  63. data/lib/gooddata/data/data.rb +1 -1
  64. data/lib/gooddata/data/guesser.rb +1 -1
  65. data/lib/gooddata/exceptions/attr_element_not_found.rb +1 -1
  66. data/lib/gooddata/exceptions/command_failed.rb +1 -1
  67. data/lib/gooddata/exceptions/exceptions.rb +1 -1
  68. data/lib/gooddata/exceptions/execution_limit_exceeded.rb +1 -1
  69. data/lib/gooddata/exceptions/export_clone.rb +4 -0
  70. data/lib/gooddata/exceptions/filter_maqlization.rb +1 -1
  71. data/lib/gooddata/exceptions/import_clone.rb +4 -0
  72. data/lib/gooddata/exceptions/malformed_user.rb +1 -1
  73. data/lib/gooddata/exceptions/maql_execution.rb +1 -1
  74. data/lib/gooddata/exceptions/no_project_error.rb +1 -1
  75. data/lib/gooddata/exceptions/object_migration.rb +1 -1
  76. data/lib/gooddata/exceptions/project_not_found.rb +1 -1
  77. data/lib/gooddata/exceptions/segment_not_empty.rb +1 -1
  78. data/lib/gooddata/exceptions/uncomputable_report.rb +1 -1
  79. data/lib/gooddata/exceptions/user_in_different_domain.rb +1 -1
  80. data/lib/gooddata/exceptions/validation_error.rb +1 -1
  81. data/lib/gooddata/extensions/big_decimal.rb +1 -1
  82. data/lib/gooddata/extensions/class.rb +11 -0
  83. data/lib/gooddata/extensions/enumerable.rb +1 -1
  84. data/lib/gooddata/extensions/extensions.rb +1 -1
  85. data/lib/gooddata/extensions/false.rb +9 -1
  86. data/lib/gooddata/extensions/hash.rb +12 -1
  87. data/lib/gooddata/extensions/integer.rb +5 -0
  88. data/lib/gooddata/extensions/nil.rb +5 -1
  89. data/lib/gooddata/extensions/numeric.rb +1 -1
  90. data/lib/gooddata/extensions/object.rb +5 -1
  91. data/lib/gooddata/extensions/symbol.rb +1 -1
  92. data/lib/gooddata/extensions/true.rb +9 -1
  93. data/lib/gooddata/extract.rb +1 -1
  94. data/lib/gooddata/goodzilla/goodzilla.rb +1 -1
  95. data/lib/gooddata/helpers/auth_helpers.rb +1 -1
  96. data/lib/gooddata/helpers/csv_helper.rb +1 -1
  97. data/lib/gooddata/helpers/data_helper.rb +19 -10
  98. data/lib/gooddata/helpers/erb_helper.rb +23 -0
  99. data/lib/gooddata/helpers/global_helpers.rb +5 -73
  100. data/lib/gooddata/helpers/global_helpers_params.rb +73 -7
  101. data/lib/gooddata/helpers/helpers.rb +1 -1
  102. data/lib/gooddata/lcm/actions/actions.rb +12 -0
  103. data/lib/gooddata/lcm/actions/associate_clients.rb +46 -0
  104. data/lib/gooddata/lcm/actions/base_action.rb +23 -0
  105. data/lib/gooddata/lcm/actions/collect_clients.rb +89 -0
  106. data/lib/gooddata/lcm/actions/collect_segment_clients.rb +103 -0
  107. data/lib/gooddata/lcm/actions/collect_segments.rb +59 -0
  108. data/lib/gooddata/lcm/actions/create_segment_masters.rb +167 -0
  109. data/lib/gooddata/lcm/actions/ensure_release_table.rb +56 -0
  110. data/lib/gooddata/lcm/actions/ensure_segments.rb +35 -0
  111. data/lib/gooddata/lcm/actions/ensure_technical_users_domain.rb +66 -0
  112. data/lib/gooddata/lcm/actions/ensure_technical_users_project.rb +68 -0
  113. data/lib/gooddata/lcm/actions/ensure_titles.rb +54 -0
  114. data/lib/gooddata/lcm/actions/hello_world.rb +44 -0
  115. data/lib/gooddata/lcm/actions/print_actions.rb +61 -0
  116. data/lib/gooddata/lcm/actions/print_modes.rb +72 -0
  117. data/lib/gooddata/lcm/actions/print_types.rb +55 -0
  118. data/lib/gooddata/lcm/actions/provision_clients.rb +80 -0
  119. data/lib/gooddata/lcm/actions/purge_clients.rb +78 -0
  120. data/lib/gooddata/lcm/actions/segments_filter.rb +50 -0
  121. data/lib/gooddata/lcm/actions/synchronize_attribute_drillpaths.rb +60 -0
  122. data/lib/gooddata/lcm/actions/synchronize_clients.rb +87 -0
  123. data/lib/gooddata/lcm/actions/synchronize_color_palette.rb +59 -0
  124. data/lib/gooddata/lcm/actions/synchronize_label_types.rb +61 -0
  125. data/lib/gooddata/lcm/actions/synchronize_ldm.rb +64 -0
  126. data/lib/gooddata/lcm/actions/synchronize_meta.rb +55 -0
  127. data/lib/gooddata/lcm/actions/synchronize_new_segments.rb +55 -0
  128. data/lib/gooddata/lcm/actions/synchronize_processes.rb +66 -0
  129. data/lib/gooddata/lcm/actions/synchronize_schedules.rb +81 -0
  130. data/lib/gooddata/lcm/actions/update_release_table.rb +80 -0
  131. data/lib/gooddata/lcm/data/create_lcm_release.sql.erb +5 -0
  132. data/lib/gooddata/lcm/data/insert_into_lcm_release.sql.erb +11 -0
  133. data/lib/gooddata/lcm/data/select_from_lcm_release.sql.erb +8 -0
  134. data/lib/gooddata/lcm/data/update_lcm_release.sql.erb +7 -0
  135. data/lib/gooddata/lcm/dsl/dsl.rb +50 -0
  136. data/lib/gooddata/lcm/dsl/params_dsl.rb +61 -0
  137. data/lib/gooddata/lcm/dsl/type_dsl.rb +61 -0
  138. data/lib/gooddata/lcm/helpers/check_helper.rb +37 -0
  139. data/lib/gooddata/lcm/helpers/helpers.rb +12 -0
  140. data/lib/gooddata/lcm/lcm.rb +161 -20
  141. data/lib/gooddata/lcm/lcm2.rb +260 -0
  142. data/lib/gooddata/lcm/types/base_type.rb +29 -0
  143. data/lib/gooddata/lcm/types/class/ads_client.rb +35 -0
  144. data/lib/gooddata/lcm/types/class/class.rb +21 -0
  145. data/lib/gooddata/lcm/types/class/gd_client.rb +35 -0
  146. data/lib/gooddata/lcm/types/class/types.rb +12 -0
  147. data/lib/gooddata/lcm/types/complex/complex.rb +33 -0
  148. data/lib/gooddata/lcm/types/complex/release_query.rb +35 -0
  149. data/lib/gooddata/lcm/types/complex/segment.rb +37 -0
  150. data/lib/gooddata/lcm/types/complex/synchronization_info.rb +32 -0
  151. data/lib/gooddata/lcm/types/complex/tokens.rb +31 -0
  152. data/lib/gooddata/lcm/types/complex/types.rb +12 -0
  153. data/lib/gooddata/lcm/types/complex/update_preference.rb +32 -0
  154. data/lib/gooddata/lcm/types/param.rb +16 -0
  155. data/lib/gooddata/lcm/types/scalar/bool.rb +22 -0
  156. data/lib/gooddata/lcm/types/scalar/hash.rb +22 -0
  157. data/lib/gooddata/lcm/types/scalar/integer.rb +22 -0
  158. data/lib/gooddata/lcm/types/scalar/object.rb +22 -0
  159. data/lib/gooddata/lcm/types/scalar/string.rb +22 -0
  160. data/lib/gooddata/lcm/types/scalar/types.rb +12 -0
  161. data/lib/gooddata/lcm/types/special/array.rb +35 -0
  162. data/lib/gooddata/lcm/types/special/enum.rb +17 -0
  163. data/lib/gooddata/lcm/types/special/types.rb +12 -0
  164. data/lib/gooddata/lcm/types/types.rb +12 -0
  165. data/lib/gooddata/mixins/author.rb +1 -1
  166. data/lib/gooddata/mixins/content_getter.rb +1 -1
  167. data/lib/gooddata/mixins/content_property_reader.rb +1 -1
  168. data/lib/gooddata/mixins/content_property_writer.rb +1 -1
  169. data/lib/gooddata/mixins/contributor.rb +1 -1
  170. data/lib/gooddata/mixins/data_getter.rb +1 -1
  171. data/lib/gooddata/mixins/data_property_reader.rb +1 -1
  172. data/lib/gooddata/mixins/data_property_writer.rb +1 -1
  173. data/lib/gooddata/mixins/inspector.rb +1 -1
  174. data/lib/gooddata/mixins/is_attribute.rb +1 -1
  175. data/lib/gooddata/mixins/is_dimension.rb +1 -1
  176. data/lib/gooddata/mixins/is_fact.rb +1 -1
  177. data/lib/gooddata/mixins/is_label.rb +1 -1
  178. data/lib/gooddata/mixins/links.rb +1 -1
  179. data/lib/gooddata/mixins/md_finders.rb +1 -1
  180. data/lib/gooddata/mixins/md_grantees.rb +1 -1
  181. data/lib/gooddata/mixins/md_id_to_uri.rb +9 -3
  182. data/lib/gooddata/mixins/md_json.rb +1 -1
  183. data/lib/gooddata/mixins/md_lock.rb +1 -1
  184. data/lib/gooddata/mixins/md_object_id.rb +1 -1
  185. data/lib/gooddata/mixins/md_object_indexer.rb +1 -1
  186. data/lib/gooddata/mixins/md_object_query.rb +1 -1
  187. data/lib/gooddata/mixins/md_relations.rb +1 -1
  188. data/lib/gooddata/mixins/meta_getter.rb +1 -1
  189. data/lib/gooddata/mixins/meta_property_reader.rb +1 -1
  190. data/lib/gooddata/mixins/meta_property_writer.rb +1 -1
  191. data/lib/gooddata/mixins/mixins.rb +1 -1
  192. data/lib/gooddata/mixins/not_attribute.rb +1 -1
  193. data/lib/gooddata/mixins/not_exportable.rb +1 -1
  194. data/lib/gooddata/mixins/not_fact.rb +1 -1
  195. data/lib/gooddata/mixins/not_group.rb +1 -1
  196. data/lib/gooddata/mixins/not_label.rb +1 -1
  197. data/lib/gooddata/mixins/not_metric.rb +1 -1
  198. data/lib/gooddata/mixins/obj_id.rb +1 -1
  199. data/lib/gooddata/mixins/rest_getters.rb +1 -1
  200. data/lib/gooddata/mixins/rest_resource.rb +1 -1
  201. data/lib/gooddata/mixins/root_key_getter.rb +1 -1
  202. data/lib/gooddata/mixins/root_key_setter.rb +1 -1
  203. data/lib/gooddata/mixins/timestamps.rb +1 -1
  204. data/lib/gooddata/models/ads_output_stage.rb +85 -0
  205. data/lib/gooddata/models/automated_data_distribution.rb +36 -0
  206. data/lib/gooddata/models/blueprint/anchor_field.rb +4 -3
  207. data/lib/gooddata/models/blueprint/attribute_field.rb +18 -2
  208. data/lib/gooddata/models/blueprint/blueprint.rb +1 -1
  209. data/lib/gooddata/models/blueprint/blueprint_field.rb +1 -1
  210. data/lib/gooddata/models/blueprint/dashboard_builder.rb +1 -1
  211. data/lib/gooddata/models/blueprint/dataset_blueprint.rb +6 -1
  212. data/lib/gooddata/models/blueprint/date_dimension.rb +1 -1
  213. data/lib/gooddata/models/blueprint/fact_field.rb +1 -1
  214. data/lib/gooddata/models/blueprint/label_field.rb +5 -1
  215. data/lib/gooddata/models/blueprint/project_blueprint.rb +1 -1
  216. data/lib/gooddata/models/blueprint/project_builder.rb +1 -1
  217. data/lib/gooddata/models/blueprint/reference_field.rb +1 -1
  218. data/lib/gooddata/models/blueprint/schema_blueprint.rb +1 -1
  219. data/lib/gooddata/models/blueprint/schema_builder.rb +1 -1
  220. data/lib/gooddata/models/blueprint/to_manifest.rb +7 -3
  221. data/lib/gooddata/models/blueprint/to_wire.rb +12 -1
  222. data/lib/gooddata/models/channel_configuration.rb +112 -0
  223. data/lib/gooddata/models/client.rb +42 -6
  224. data/lib/gooddata/models/client_synchronization_result.rb +1 -1
  225. data/lib/gooddata/models/client_synchronization_result_details.rb +1 -1
  226. data/lib/gooddata/models/datawarehouse.rb +25 -3
  227. data/lib/gooddata/models/domain.rb +29 -4
  228. data/lib/gooddata/models/execution.rb +1 -1
  229. data/lib/gooddata/models/execution_detail.rb +1 -1
  230. data/lib/gooddata/models/from_wire.rb +8 -1
  231. data/lib/gooddata/models/invitation.rb +1 -1
  232. data/lib/gooddata/models/links.rb +1 -1
  233. data/lib/gooddata/models/membership.rb +1 -1
  234. data/lib/gooddata/models/metadata.rb +3 -2
  235. data/lib/gooddata/models/metadata/attribute.rb +7 -1
  236. data/lib/gooddata/models/metadata/dashboard.rb +3 -3
  237. data/lib/gooddata/models/metadata/dashboard/dashboard_item.rb +1 -1
  238. data/lib/gooddata/models/metadata/dashboard/filter_apply_item.rb +2 -2
  239. data/lib/gooddata/models/metadata/dashboard/filter_item.rb +2 -2
  240. data/lib/gooddata/models/metadata/dashboard/geo_chart_item.rb +2 -2
  241. data/lib/gooddata/models/metadata/dashboard/headline_item.rb +2 -2
  242. data/lib/gooddata/models/metadata/dashboard/iframe_item.rb +2 -2
  243. data/lib/gooddata/models/metadata/dashboard/report_item.rb +2 -2
  244. data/lib/gooddata/models/metadata/dashboard/text_item.rb +2 -2
  245. data/lib/gooddata/models/metadata/dashboard_tab.rb +2 -2
  246. data/lib/gooddata/models/metadata/dataset.rb +1 -1
  247. data/lib/gooddata/models/metadata/dimension.rb +1 -1
  248. data/lib/gooddata/models/metadata/fact.rb +1 -1
  249. data/lib/gooddata/models/metadata/folder.rb +1 -1
  250. data/lib/gooddata/models/metadata/label.rb +1 -1
  251. data/lib/gooddata/models/metadata/metadata.rb +1 -1
  252. data/lib/gooddata/models/metadata/metric.rb +1 -1
  253. data/lib/gooddata/models/metadata/report.rb +1 -1
  254. data/lib/gooddata/models/metadata/report_definition.rb +1 -1
  255. data/lib/gooddata/models/metadata/scheduled_mail.rb +2 -2
  256. data/lib/gooddata/models/metadata/scheduled_mail/dashboard_attachment.rb +1 -1
  257. data/lib/gooddata/models/metadata/scheduled_mail/report_attachment.rb +1 -1
  258. data/lib/gooddata/models/metadata/variable.rb +1 -1
  259. data/lib/gooddata/models/model.rb +1 -1
  260. data/lib/gooddata/models/models.rb +1 -1
  261. data/lib/gooddata/models/module_constants.rb +1 -1
  262. data/lib/gooddata/models/notification_rule.rb +113 -0
  263. data/lib/gooddata/models/process.rb +10 -3
  264. data/lib/gooddata/models/profile.rb +9 -1
  265. data/lib/gooddata/models/project.rb +248 -50
  266. data/lib/gooddata/models/project_creator.rb +2 -2
  267. data/lib/gooddata/models/project_metadata.rb +1 -1
  268. data/lib/gooddata/models/project_role.rb +1 -1
  269. data/lib/gooddata/models/report_data_result.rb +1 -1
  270. data/lib/gooddata/models/schedule.rb +49 -13
  271. data/lib/gooddata/models/segment.rb +3 -3
  272. data/lib/gooddata/models/style_setting.rb +71 -0
  273. data/lib/gooddata/models/subscription.rb +181 -0
  274. data/lib/gooddata/models/tab_builder.rb +1 -1
  275. data/lib/gooddata/models/user_filters/mandatory_user_filter.rb +1 -1
  276. data/lib/gooddata/models/user_filters/user_filter.rb +1 -1
  277. data/lib/gooddata/models/user_filters/user_filter_builder.rb +11 -5
  278. data/lib/gooddata/models/user_filters/user_filters.rb +1 -1
  279. data/lib/gooddata/models/user_filters/variable_user_filter.rb +1 -1
  280. data/lib/gooddata/models/user_group.rb +19 -12
  281. data/lib/gooddata/rest/client.rb +9 -1
  282. data/lib/gooddata/rest/connection.rb +18 -9
  283. data/lib/gooddata/rest/object.rb +1 -1
  284. data/lib/gooddata/rest/object_factory.rb +1 -1
  285. data/lib/gooddata/rest/resource.rb +1 -1
  286. data/lib/gooddata/rest/rest.rb +1 -1
  287. data/lib/gooddata/version.rb +2 -2
  288. data/spec/.rubocop.yml +16 -0
  289. data/spec/bricks/bricks_spec.rb +13 -15
  290. data/spec/data/blueprints/attribute_sort_order_blueprint.json +72 -0
  291. data/spec/data/gooddata_version_process/gooddata_version.rb +1 -1
  292. data/spec/data/hello_world_process/hello_world.rb +2 -2
  293. data/spec/data/ruby_params_process/ruby_params.rb +1 -1
  294. data/spec/data/ruby_process/process.rb +2 -2
  295. data/spec/data/wire_models/attribute_sort_by_model.json +73 -0
  296. data/spec/environment/default.rb +14 -13
  297. data/spec/environment/develop.rb +26 -11
  298. data/spec/environment/environment.rb +2 -1
  299. data/spec/environment/hotfix.rb +15 -7
  300. data/spec/environment/production.rb +6 -14
  301. data/spec/environment/staging.rb +9 -10
  302. data/spec/helpers/blueprint_helper.rb +11 -10
  303. data/spec/helpers/cli_helper.rb +26 -24
  304. data/spec/helpers/connection_helper.rb +28 -26
  305. data/spec/helpers/crypto_helper.rb +8 -6
  306. data/spec/helpers/csv_helper.rb +7 -5
  307. data/spec/helpers/process_helper.rb +13 -11
  308. data/spec/helpers/project_helper.rb +36 -34
  309. data/spec/helpers/schedule_helper.rb +13 -11
  310. data/spec/helpers/spec_helper.rb +8 -6
  311. data/spec/integration/ads_output_stage_spec.rb +55 -0
  312. data/spec/integration/blueprint_updates_spec.rb +22 -16
  313. data/spec/integration/blueprint_with_grain_spec.rb +5 -3
  314. data/spec/integration/channel_configuration_spec.rb +67 -0
  315. data/spec/integration/clients_spec.rb +31 -22
  316. data/spec/integration/command_datawarehouse_spec.rb +4 -4
  317. data/spec/integration/command_projects_spec.rb +6 -6
  318. data/spec/integration/create_from_template_spec.rb +4 -3
  319. data/spec/integration/create_project_spec.rb +7 -4
  320. data/spec/integration/date_dim_switch_spec.rb +25 -28
  321. data/spec/integration/deprecated_load_spec.rb +11 -9
  322. data/spec/integration/full_process_schedule_spec.rb +82 -13
  323. data/spec/integration/full_project_spec.rb +67 -45
  324. data/spec/integration/lcm_spec.rb +41 -0
  325. data/spec/integration/over_to_user_filters_spec.rb +14 -10
  326. data/spec/integration/partial_md_export_import_spec.rb +3 -4
  327. data/spec/integration/project_spec.rb +101 -42
  328. data/spec/integration/rest_spec.rb +5 -4
  329. data/spec/integration/schedule_spec.rb +28 -39
  330. data/spec/integration/segments_spec.rb +42 -31
  331. data/spec/integration/subscription_spec.rb +63 -0
  332. data/spec/integration/user_filters_spec.rb +49 -39
  333. data/spec/integration/user_group_spec.rb +25 -5
  334. data/spec/integration/variables_spec.rb +34 -32
  335. data/spec/logging_in_logging_out_spec.rb +6 -8
  336. data/spec/spec_helper.rb +3 -3
  337. data/spec/unit/bricks/bricks_spec.rb +3 -4
  338. data/spec/unit/bricks/middleware/aws_middelware_spec.rb +8 -15
  339. data/spec/unit/bricks/middleware/bench_middleware_spec.rb +2 -2
  340. data/spec/unit/bricks/middleware/bulk_salesforce_middleware_spec.rb +2 -2
  341. data/spec/unit/bricks/middleware/gooddata_middleware_spec.rb +2 -2
  342. data/spec/unit/bricks/middleware/logger_middleware_spec.rb +2 -2
  343. data/spec/unit/bricks/middleware/restforce_middleware_spec.rb +3 -3
  344. data/spec/unit/bricks/middleware/stdout_middleware_spec.rb +3 -3
  345. data/spec/unit/bricks/middleware/twitter_middleware_spec.rb +3 -3
  346. data/spec/unit/cli/cli_spec.rb +3 -3
  347. data/spec/unit/cli/commands/cmd_auth_spec.rb +2 -2
  348. data/spec/unit/commands/command_projects_spec.rb +3 -3
  349. data/spec/unit/core/connection_spec.rb +3 -4
  350. data/spec/unit/core/logging_spec.rb +2 -5
  351. data/spec/unit/core/nil_logger_spec.rb +2 -2
  352. data/spec/unit/core/project_spec.rb +4 -4
  353. data/spec/unit/extensions/hash_spec.rb +3 -4
  354. data/spec/unit/godzilla/goodzilla_spec.rb +22 -26
  355. data/spec/unit/helpers/csv_helper_spec.rb +3 -3
  356. data/spec/unit/helpers/data_helper_spec.rb +6 -18
  357. data/spec/unit/helpers/global_helpers_spec.rb +112 -28
  358. data/spec/unit/helpers_spec.rb +139 -2
  359. data/spec/unit/models/blueprint/attribute_sort_by_spec.rb +20 -0
  360. data/spec/unit/models/blueprint/attributes_spec.rb +1 -2
  361. data/spec/unit/models/blueprint/dataset_spec.rb +2 -3
  362. data/spec/unit/models/blueprint/labels_spec.rb +1 -2
  363. data/spec/unit/models/blueprint/project_blueprint_spec.rb +34 -35
  364. data/spec/unit/models/blueprint/reference_spec.rb +1 -2
  365. data/spec/unit/models/blueprint/schema_builder_spec.rb +5 -7
  366. data/spec/unit/models/blueprint/to_wire_spec.rb +76 -55
  367. data/spec/unit/models/domain_spec.rb +4 -5
  368. data/spec/unit/models/execution_spec.rb +16 -15
  369. data/spec/unit/models/from_wire_spec.rb +24 -19
  370. data/spec/unit/models/invitation_spec.rb +1 -1
  371. data/spec/unit/models/membership_spec.rb +36 -41
  372. data/spec/unit/models/metadata_spec.rb +20 -18
  373. data/spec/unit/models/metric_spec.rb +67 -55
  374. data/spec/unit/models/model_spec.rb +32 -37
  375. data/spec/unit/models/params_spec.rb +1 -1
  376. data/spec/unit/models/profile_spec.rb +40 -45
  377. data/spec/unit/models/project_creator_spec.rb +27 -29
  378. data/spec/unit/models/project_role_spec.rb +1 -1
  379. data/spec/unit/models/project_spec.rb +65 -2
  380. data/spec/unit/models/report_result_data_spec.rb +7 -12
  381. data/spec/unit/models/schedule_spec.rb +71 -35
  382. data/spec/unit/models/to_manifest_spec.rb +69 -4
  383. data/spec/unit/models/unit_project_spec.rb +12 -12
  384. data/spec/unit/models/user_filters_spec.rb +40 -40
  385. data/spec/unit/models/variable_spec.rb +108 -93
  386. data/spec/unit/rest/polling_spec.rb +7 -7
  387. data/spec/unit/rest/resource_spec.rb +2 -2
  388. metadata +145 -228
  389. data/spec/environment/release.rb +0 -21
  390. data/spec/environment/staging_3.rb +0 -36
@@ -0,0 +1,5 @@
1
+ CREATE TABLE IF NOT EXISTS "<%= table_name || 'LCM_RELEASE' %>" (
2
+ segment_id VARCHAR(255) NOT NULL,
3
+ master_project_id VARCHAR(255) NOT NULL,
4
+ version INTEGER NOT NULL
5
+ );
@@ -0,0 +1,11 @@
1
+ INSERT INTO "<%= table_name || 'LCM_RELEASE' %>"
2
+ (
3
+ segment_id,
4
+ master_project_id,
5
+ version
6
+ )
7
+ VALUES (
8
+ '<%= segment_id %>',
9
+ '<%= master_project_id %>',
10
+ <%= version %>
11
+ );
@@ -0,0 +1,8 @@
1
+ SELECT
2
+ segment_id,
3
+ master_project_id,
4
+ version
5
+ FROM "<%= table_name || 'LCM_RELEASE' %>"
6
+ WHERE
7
+ segment_id = '<%= segment_id %>'
8
+ ;
@@ -0,0 +1,7 @@
1
+ UPDATE "<%= table_name || 'LCM_RELEASE' %>"
2
+ SET
3
+ master_project_id = '<%= master_project_id %>',
4
+ version = <%= version %>
5
+ WHERE
6
+ segment_id = '<%= segment_id %>'
7
+ ;
@@ -0,0 +1,50 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Copyright (c) 2010-2017 GoodData Corporation. All rights reserved.
4
+ # This source code is licensed under the BSD-style license found in the
5
+ # LICENSE file in the root directory of this source tree.
6
+
7
+ require 'json'
8
+
9
+ require_relative 'params_dsl'
10
+ require_relative 'type_dsl'
11
+
12
+ require_relative '../../helpers/global_helpers'
13
+
14
+ module GoodData
15
+ module LCM2
16
+ module Dsl
17
+ module Dsl
18
+ DEFAULT_OPTS = {
19
+ required: false,
20
+ default: nil
21
+ }
22
+
23
+ PARAMS = {}
24
+ TYPES = {}
25
+
26
+ def process(_klass, type, _caption, &block)
27
+ dsl = type.new
28
+ dsl.instance_eval(&block)
29
+
30
+ # puts "#{caption}: #{klass.name}"
31
+ # puts JSON.pretty_generate(dsl.params)
32
+ # puts
33
+
34
+ # yield if block_given?
35
+
36
+ # Return params
37
+ dsl.params
38
+ end
39
+
40
+ def define_params(klass, &block)
41
+ PARAMS[klass] = process(klass, GoodData::LCM2::Dsl::ParamsDsl, 'PARAMS', &block)
42
+ end
43
+
44
+ def define_type(klass, &block)
45
+ TYPES[klass] = process(klass, GoodData::LCM2::Dsl::TypeDsl, 'TYPE', &block)
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,61 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Copyright (c) 2010-2017 GoodData Corporation. All rights reserved.
4
+ # This source code is licensed under the BSD-style license found in the
5
+
6
+ # LICENSE file in the root directory of this source tree.
7
+
8
+ require_relative '../types/param'
9
+
10
+ module GoodData
11
+ module LCM2
12
+ module Dsl
13
+ class ParamsDsl
14
+ def initialize
15
+ @params = {}
16
+
17
+ new_param
18
+ end
19
+
20
+ attr_reader :params
21
+
22
+ def array_of(type)
23
+ Type::ArrayType.new(type)
24
+ end
25
+
26
+ def instance_of(type)
27
+ type.new
28
+ end
29
+
30
+ def one_of(_type)
31
+ Type::EnumType.new
32
+ end
33
+
34
+ def new_param
35
+ @param = Type::Param.new
36
+ end
37
+
38
+ def description(desc)
39
+ @param.description = desc
40
+ end
41
+
42
+ def param(name, type, opts = {})
43
+ @param.name = name
44
+ @param.type = type
45
+ @param.opts = opts
46
+
47
+ @params[name] = {
48
+ name: @param.name,
49
+ type: @param.type,
50
+ opts: @param.opts,
51
+ description: @param.description,
52
+ category: @param.type.class.const_get(:CATEGORY)
53
+ }
54
+
55
+ # Create new instance of param
56
+ new_param
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,61 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Copyright (c) 2010-2017 GoodData Corporation. All rights reserved.
4
+ # This source code is licensed under the BSD-style license found in the
5
+
6
+ # LICENSE file in the root directory of this source tree.
7
+
8
+ require_relative '../types/param'
9
+
10
+ module GoodData
11
+ module LCM2
12
+ module Dsl
13
+ class TypeDsl
14
+ def initialize
15
+ @params = {}
16
+
17
+ new_param
18
+ end
19
+
20
+ attr_reader :params
21
+
22
+ def array_of(type)
23
+ Type::ArrayType.new(type)
24
+ end
25
+
26
+ def instance_of(type)
27
+ type.new
28
+ end
29
+
30
+ def one_of(_type)
31
+ Type::EnumType.new
32
+ end
33
+
34
+ def new_param
35
+ @param = Type::Param.new
36
+ end
37
+
38
+ def description(desc)
39
+ @param.description = desc
40
+ end
41
+
42
+ def param(name, type, opts = {})
43
+ @param.name = name
44
+ @param.type = type
45
+ @param.opts = opts
46
+
47
+ @params[name] = {
48
+ name: @param.name,
49
+ type: @param.type,
50
+ opts: @param.opts,
51
+ description: @param.description,
52
+ category: @param.type.class.const_get(:CATEGORY)
53
+ }
54
+
55
+ # Create new instance of param
56
+ new_param
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,37 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Copyright (c) 2010-2017 GoodData Corporation. All rights reserved.
4
+ # This source code is licensed under the BSD-style license found in the
5
+ # LICENSE file in the root directory of this source tree.
6
+
7
+ require 'json'
8
+
9
+ module GoodData
10
+ module LCM2
11
+ class Helpers
12
+ class << self
13
+ def check_params(specification, params)
14
+ specification.keys.each do |param_name|
15
+ value = params[param_name]
16
+ type = specification[param_name][:type]
17
+
18
+ if value.nil?
19
+ if specification[param_name][:opts][:required]
20
+ fail("Mandatory parameter '#{param_name}' of type '#{type}' is not specified")
21
+ end
22
+ else
23
+ if type.class.const_get(:CATEGORY) == :complex && !value.is_a?(Hash)
24
+ puts JSON.pretty_generate(params)
25
+ fail "Expected parameter '#{param_name}' to be kind of '#{type}', got '#{value.class.name}'"
26
+ end
27
+
28
+ unless type.check(value)
29
+ fail "Parameter '#{param_name}' has invalid type, expected: #{type}"
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,12 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Copyright (c) 2010-2017 GoodData Corporation. All rights reserved.
4
+ # This source code is licensed under the BSD-style license found in the
5
+ # LICENSE file in the root directory of this source tree.
6
+
7
+ require 'pathname'
8
+
9
+ base = Pathname(__FILE__).dirname.expand_path
10
+ Dir.glob(base + '*.rb').each do |file|
11
+ require file
12
+ end
@@ -1,6 +1,6 @@
1
1
  # encoding: UTF-8
2
2
  #
3
- # Copyright (c) 2010-2016 GoodData Corporation. All rights reserved.
3
+ # Copyright (c) 2010-2017 GoodData Corporation. All rights reserved.
4
4
  # This source code is licensed under the BSD-style license found in the
5
5
  # LICENSE file in the root directory of this source tree.
6
6
 
@@ -27,7 +27,9 @@ module GoodData
27
27
  messages
28
28
  end
29
29
 
30
- def transfer_everything(client, domain, migration_spec, filter_on_segment = [], opts = {})
30
+ def transfer_everything(client, domain, migration_spec, opts = {})
31
+ filter_on_segment = migration_spec[:segments] || migration_spec['segments'] || []
32
+
31
33
  puts 'Ensuring Users - warning: works across whole domain not just provided segment(s)'
32
34
  ensure_users(domain, migration_spec, filter_on_segment)
33
35
 
@@ -38,15 +40,53 @@ module GoodData
38
40
  maql_replacements: opts[:maql_replacements] || opts['maql_replacements']
39
41
  }
40
42
 
41
- tags = opts[:production_tag] || opts['production_tag']
43
+ #########################################################
44
+ # New Architecture of Transfer Everything Functionality #
45
+ #########################################################
46
+ #
47
+ # modes = {
48
+ # release: [
49
+ # self.synchronize_ldm,
50
+ # self.synchronize_label_types,
51
+ # self.synchronize_meta, # Tag specified? If yes, transfer only tagged stuff. If not transfer all meta.
52
+ # self.synchronize_etl, # Processes, Schedules, Additional Params
53
+ # ],
54
+ # provisioning: [
55
+ # # self.ensure_titles # Handled by Provisioning Brick?
56
+ # self.ensure_users,
57
+ # self.delete_clients,
58
+ # self.provision_clients, # LCM API
59
+ # self.synchronize_label_types,
60
+ # self.synchronize_etl # Processes, Schedules, Additional Params
61
+ # ],
62
+ # rollout: [ # Works on segments only, not using collect_clients
63
+ # self.ensure_users,
64
+ # self.synchronize_ldm,
65
+ # self.synchronize_label_types,
66
+ # self.synchronize_etl, # Processes, Schedules, Additional Params
67
+ # self.synchronize_clients
68
+ # ]
69
+ # }
70
+ #
71
+ # mode_name = param['mode']
72
+ # mode_actions = modes[mode_name] || fail("Invalid mode specified: '#{mode_name}'")
73
+ # messages = mode_actions.map do |action|
74
+ # action(params)
75
+ # end
42
76
 
43
77
  domain.segments.peach do |segment|
44
78
  next if !filter_on_segment.empty? && !(filter_on_segment.include?(segment.id))
79
+
45
80
  bp = segment.master_project.blueprint
46
81
  segment.clients.each do |c|
47
82
  p = c.project
48
83
  p.update_from_blueprint(bp, bp_opts)
49
84
  end
85
+
86
+ # target_projects = segment.clients.map(&:project)
87
+
88
+ # Transfer metadata objects
89
+ # GoodData::LCM.transfer_meta(segment.master_project, target_projects)
50
90
  end
51
91
 
52
92
  puts 'Migrating Processes and Schedules'
@@ -55,12 +95,16 @@ module GoodData
55
95
  domain.clients.peach do |c|
56
96
  segment = c.segment
57
97
  next if !filter_on_segment.empty? && !(filter_on_segment.include?(segment.id))
98
+
58
99
  segment_master = segment.master_project
59
100
  project = c.project
101
+
60
102
  # set metadata
103
+ # TODO: Review this and remove if not required or duplicate
104
+ # FIXME: TMA-210
61
105
  project.set_metadata('GOODOT_CUSTOM_PROJECT_ID', c.id)
62
- # copy processes
63
106
 
107
+ # copy processes
64
108
  deployment_client_segment_master = deployment_client.projects(segment_master.pid)
65
109
  deployment_client_project = deployment_client.projects(project.pid)
66
110
  GoodData::Project.transfer_processes(deployment_client_segment_master, deployment_client_project)
@@ -69,6 +113,7 @@ module GoodData
69
113
 
70
114
  # Set up unique parameters
71
115
  deployment_client_project.schedules.peach do |s|
116
+ # TODO: Review this and remove if not required or duplicate (GOODOT_CUSTOM_PROJECT_ID vs CLIENT_ID)
72
117
  s.update_params('GOODOT_CUSTOM_PROJECT_ID' => c.id)
73
118
  s.update_params('CLIENT_ID' => c.id)
74
119
  s.update_params('SEGMENT_ID' => segment.id)
@@ -77,24 +122,35 @@ module GoodData
77
122
  s.save
78
123
  end
79
124
 
80
- GoodData::Project.transfer_tagged_stuff(segment_master, project, tags) if tags
125
+ # Transfer label types
126
+ begin
127
+ GoodData::LCM.transfer_label_types(segment_master, project)
128
+ rescue => e
129
+ puts "Unable to transfer label_types, reason: #{e.message}"
130
+ end
131
+
132
+ # Transfer tagged objects
133
+ # FIXME: Make sure it is not duplicate functionality mentioned in TMA-171
134
+ tag = migration_spec[:production_tag]
135
+ GoodData::Project.transfer_tagged_stuff(segment_master, project, tag) if tag
81
136
  end
82
137
 
83
- puts 'Migrating Dashboards'
84
- if filter_on_segment.empty?
85
- domain.synchronize_clients
86
- else
87
- filter_on_segment.map { |s| domain.segments(s).synchronize_clients }
138
+ do_not_synchronize_clients = migration_spec[:do_not_synchronize_clients]
139
+ if do_not_synchronize_clients.nil? || !do_not_synchronize_clients
140
+ puts 'Migrating Dashboards'
141
+ if filter_on_segment.empty?
142
+ domain.synchronize_clients
143
+ else
144
+ filter_on_segment.map do |s|
145
+ domain.segments(s).synchronize_clients
146
+ end
147
+ end
88
148
  end
89
149
  end
90
150
 
91
151
  def transfer_label_types(source_project, targets)
92
152
  semaphore = Mutex.new
93
153
 
94
- synchronized_puts = proc do |*args|
95
- semaphore.synchronize { puts args }
96
- end
97
-
98
154
  # Convert to array
99
155
  targets = [targets] unless targets.is_a?(Array)
100
156
 
@@ -118,8 +174,8 @@ module GoodData
118
174
  transfer = {}
119
175
  display_forms.each { |display_form| transfer[display_form['meta']['identifier']] = display_form['content']['type'] }
120
176
 
121
- puts 'Transferring label types'
122
- puts JSON.pretty_generate(transfer)
177
+ GoodData.logger.info 'Transferring label types'
178
+ GoodData.logger.info JSON.pretty_generate(transfer)
123
179
 
124
180
  # Transfer to target projects
125
181
  targets.peach do |target|
@@ -131,16 +187,101 @@ module GoodData
131
187
 
132
188
  if obj
133
189
  if obj.content['type'] != type
134
- synchronized_puts.call "Updating #{identifier} -> #{type} in '#{target.title}'"
190
+ semaphore.synchronize do
191
+ GoodData.logger.info "Updating #{identifier} -> #{type} in '#{target.title}'"
192
+ end
193
+
135
194
  obj.content['type'] = type
136
195
  obj.save
137
- else
138
- synchronized_puts.call "Identifier #{identifier} in '#{target.title}' already has desired type - #{type}"
139
196
  end
140
197
  else
141
- synchronized_puts.call "Unable to find #{identifier} in '#{target.title}'"
198
+ semaphore.synchronize do
199
+ GoodData.logger.warn "Unable to find #{identifier} in '#{target.title}'"
200
+ end
201
+ end
202
+
203
+ nil
204
+ end
205
+
206
+ nil
207
+ end
208
+ end
209
+
210
+ # Synchronizes the dashboards tagged with the +$PRODUCTION_TAG+ from development project to master projects
211
+ # Params:
212
+ # +source_workspace+:: workspace with the tagged dashboards that are going to be synchronized to the target workspaces
213
+ # +target_workspaces+:: array of target workspaces where the tagged dashboards are going be synchronized to
214
+ def transfer_meta(source_workspace, target_workspaces, tag = nil)
215
+ objects = get_dashboards(source_workspace, tag)
216
+ begin
217
+ token = source_workspace.objects_export(objects)
218
+ GoodData.logger.info "Export token: '#{token}'"
219
+ rescue => e
220
+ GoodData.logger.error "Export failed, reason: #{e.message}"
221
+ end
222
+ target_workspaces.each do |target_workspace|
223
+ begin
224
+ target_workspace.objects_import(token)
225
+ rescue => e
226
+ GoodData.logger.error "Import failed, reason: #{e.message}"
227
+ end
228
+ end
229
+ end
230
+
231
+ # Retrieves all dashboards tagged with the +$PRODUCTION_TAG+ from the +workspace+
232
+ # Params:
233
+ # +workspace+:: workspace with the tagged dashboards
234
+ # Returns enumeration of the tagged dashboards URIs
235
+ def get_dashboards(workspace, tag = nil)
236
+ if tag
237
+ GoodData::Dashboard.find_by_tag(tag, project: workspace, client: workspace.client).map(&:uri)
238
+ else
239
+ GoodData::Dashboard.all(project: workspace, client: workspace.client).map(&:uri)
240
+ end
241
+ end
242
+
243
+ def transfer_attribute_drillpaths(source_project, targets)
244
+ semaphore = Mutex.new
245
+
246
+ # Convert to array
247
+ targets = [targets] unless targets.is_a?(Array)
248
+
249
+ # Get attributes from source project
250
+ attributes = source_project.attributes
251
+
252
+ # Generate transfer table
253
+ drill_paths = attributes.map do |attribute|
254
+ [attribute.meta['identifier'], attribute.content['drillDownStepAttributeDF']]
255
+ end
256
+ transfer = Hash[*drill_paths.flatten].compact
257
+
258
+ # Transfer to target projects
259
+ targets.peach do |target|
260
+ transfer.peach do |identifier, drill_path|
261
+ uri = GoodData::MdObject.identifier_to_uri({ project: target, client: target.client }, identifier)
262
+ next unless uri
263
+
264
+ obj = GoodData::MdObject[uri, { project: target, client: target.client }]
265
+
266
+ if obj
267
+ if !obj.content['drillDownStepAttributeDF'] || obj.content['drillDownStepAttributeDF'] != drill_path
268
+ semaphore.synchronize do
269
+ GoodData.logger.info "Updating drill path of #{identifier} -> #{drill_path} in '#{target.title}'"
270
+ end
271
+
272
+ obj.content['drillDownStepAttributeDF'] = drill_path
273
+ obj.save
274
+ end
275
+ else
276
+ semaphore.synchronize do
277
+ GoodData.logger.warn "Unable to find #{identifier} in '#{target.title}'"
278
+ end
142
279
  end
280
+
281
+ nil
143
282
  end
283
+
284
+ nil
144
285
  end
145
286
  end
146
287
  end