gooddata 1.0.0-java

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 (517) hide show
  1. checksums.yaml +7 -0
  2. data/.document +5 -0
  3. data/.editorconfig +12 -0
  4. data/.flayignore +6 -0
  5. data/.gitignore +38 -0
  6. data/.pronto.yml +3 -0
  7. data/.rspec +5 -0
  8. data/.rubocop.yml +101 -0
  9. data/.travis.yml +9 -0
  10. data/.yardopts +22 -0
  11. data/CHANGELOG.md +272 -0
  12. data/CLI.md +435 -0
  13. data/CONTRIBUTING.md +38 -0
  14. data/DEPENDENCIES.md +880 -0
  15. data/Dockerfile.jruby +17 -0
  16. data/Dockerfile.ruby +19 -0
  17. data/Gemfile +4 -0
  18. data/Guardfile +5 -0
  19. data/LICENSE +22 -0
  20. data/LICENSE.rb +5 -0
  21. data/README.md +78 -0
  22. data/Rakefile +204 -0
  23. data/TODO.md +32 -0
  24. data/authors.sh +4 -0
  25. data/bin/gooddata +7 -0
  26. data/ci.rake +47 -0
  27. data/dependency_decisions.yml +104 -0
  28. data/docker-compose.yml +34 -0
  29. data/gooddata +9 -0
  30. data/gooddata.gemspec +72 -0
  31. data/lib/gooddata.rb +34 -0
  32. data/lib/gooddata/app/app.rb +16 -0
  33. data/lib/gooddata/bricks/base_downloader.rb +86 -0
  34. data/lib/gooddata/bricks/brick.rb +37 -0
  35. data/lib/gooddata/bricks/bricks.rb +17 -0
  36. data/lib/gooddata/bricks/middleware/aws_middleware.rb +41 -0
  37. data/lib/gooddata/bricks/middleware/base_middleware.rb +57 -0
  38. data/lib/gooddata/bricks/middleware/bench_middleware.rb +25 -0
  39. data/lib/gooddata/bricks/middleware/bulk_salesforce_middleware.rb +37 -0
  40. data/lib/gooddata/bricks/middleware/decode_params_middleware.rb +21 -0
  41. data/lib/gooddata/bricks/middleware/dwh_middleware.rb +41 -0
  42. data/lib/gooddata/bricks/middleware/fs_download_middleware.rb +48 -0
  43. data/lib/gooddata/bricks/middleware/fs_upload_middleware.rb +36 -0
  44. data/lib/gooddata/bricks/middleware/gooddata_middleware.rb +112 -0
  45. data/lib/gooddata/bricks/middleware/logger_middleware.rb +33 -0
  46. data/lib/gooddata/bricks/middleware/middleware.rb +12 -0
  47. data/lib/gooddata/bricks/middleware/restforce_middleware.rb +58 -0
  48. data/lib/gooddata/bricks/middleware/stdout_middleware.rb +23 -0
  49. data/lib/gooddata/bricks/middleware/twitter_middleware.rb +29 -0
  50. data/lib/gooddata/bricks/middleware/undot_params_middleware.rb +37 -0
  51. data/lib/gooddata/bricks/pipeline.rb +25 -0
  52. data/lib/gooddata/bricks/utils.rb +18 -0
  53. data/lib/gooddata/cli/cli.rb +27 -0
  54. data/lib/gooddata/cli/commands/auth_cmd.rb +29 -0
  55. data/lib/gooddata/cli/commands/domain_cmd.rb +28 -0
  56. data/lib/gooddata/cli/commands/project_cmd.rb +28 -0
  57. data/lib/gooddata/cli/hooks.rb +56 -0
  58. data/lib/gooddata/cli/shared.rb +66 -0
  59. data/lib/gooddata/cli/terminal.rb +20 -0
  60. data/lib/gooddata/client.rb +67 -0
  61. data/lib/gooddata/commands/api.rb +64 -0
  62. data/lib/gooddata/commands/auth.rb +107 -0
  63. data/lib/gooddata/commands/base.rb +12 -0
  64. data/lib/gooddata/commands/commands.rb +12 -0
  65. data/lib/gooddata/commands/datasets.rb +148 -0
  66. data/lib/gooddata/commands/datawarehouse.rb +20 -0
  67. data/lib/gooddata/commands/domain.rb +40 -0
  68. data/lib/gooddata/commands/process.rb +67 -0
  69. data/lib/gooddata/commands/project.rb +144 -0
  70. data/lib/gooddata/commands/projects.rb +20 -0
  71. data/lib/gooddata/commands/role.rb +36 -0
  72. data/lib/gooddata/commands/runners.rb +47 -0
  73. data/lib/gooddata/commands/scaffold.rb +69 -0
  74. data/lib/gooddata/commands/user.rb +39 -0
  75. data/lib/gooddata/connection.rb +127 -0
  76. data/lib/gooddata/core/core.rb +12 -0
  77. data/lib/gooddata/core/logging.rb +105 -0
  78. data/lib/gooddata/core/nil_logger.rb +32 -0
  79. data/lib/gooddata/core/project.rb +74 -0
  80. data/lib/gooddata/core/rest.rb +149 -0
  81. data/lib/gooddata/core/user.rb +20 -0
  82. data/lib/gooddata/data/data.rb +12 -0
  83. data/lib/gooddata/data/guesser.rb +122 -0
  84. data/lib/gooddata/exceptions/attr_element_not_found.rb +16 -0
  85. data/lib/gooddata/exceptions/command_failed.rb +11 -0
  86. data/lib/gooddata/exceptions/exceptions.rb +12 -0
  87. data/lib/gooddata/exceptions/execution_limit_exceeded.rb +13 -0
  88. data/lib/gooddata/exceptions/export_clone.rb +4 -0
  89. data/lib/gooddata/exceptions/filter_maqlization.rb +16 -0
  90. data/lib/gooddata/exceptions/import_clone.rb +4 -0
  91. data/lib/gooddata/exceptions/malformed_user.rb +15 -0
  92. data/lib/gooddata/exceptions/maql_execution.rb +16 -0
  93. data/lib/gooddata/exceptions/no_project_error.rb +19 -0
  94. data/lib/gooddata/exceptions/object_migration.rb +32 -0
  95. data/lib/gooddata/exceptions/project_not_found.rb +13 -0
  96. data/lib/gooddata/exceptions/segment_not_empty.rb +18 -0
  97. data/lib/gooddata/exceptions/uncomputable_report.rb +13 -0
  98. data/lib/gooddata/exceptions/user_in_different_domain.rb +15 -0
  99. data/lib/gooddata/exceptions/validation_error.rb +16 -0
  100. data/lib/gooddata/extensions/big_decimal.rb +17 -0
  101. data/lib/gooddata/extensions/class.rb +11 -0
  102. data/lib/gooddata/extensions/enumerable.rb +39 -0
  103. data/lib/gooddata/extensions/extensions.rb +10 -0
  104. data/lib/gooddata/extensions/false.rb +23 -0
  105. data/lib/gooddata/extensions/hash.rb +49 -0
  106. data/lib/gooddata/extensions/integer.rb +5 -0
  107. data/lib/gooddata/extensions/nil.rb +19 -0
  108. data/lib/gooddata/extensions/numeric.rb +15 -0
  109. data/lib/gooddata/extensions/object.rb +31 -0
  110. data/lib/gooddata/extensions/string.rb +7 -0
  111. data/lib/gooddata/extensions/symbol.rb +15 -0
  112. data/lib/gooddata/extensions/true.rb +23 -0
  113. data/lib/gooddata/extract.rb +21 -0
  114. data/lib/gooddata/goodzilla/goodzilla.rb +160 -0
  115. data/lib/gooddata/helpers/auth_helpers.rb +75 -0
  116. data/lib/gooddata/helpers/csv_helper.rb +61 -0
  117. data/lib/gooddata/helpers/data_helper.rb +129 -0
  118. data/lib/gooddata/helpers/erb_helper.rb +23 -0
  119. data/lib/gooddata/helpers/global_helpers.rb +266 -0
  120. data/lib/gooddata/helpers/global_helpers_params.rb +292 -0
  121. data/lib/gooddata/helpers/helpers.rb +10 -0
  122. data/lib/gooddata/lcm/actions/actions.rb +12 -0
  123. data/lib/gooddata/lcm/actions/apply_custom_maql.rb +80 -0
  124. data/lib/gooddata/lcm/actions/associate_clients.rb +87 -0
  125. data/lib/gooddata/lcm/actions/base_action.rb +23 -0
  126. data/lib/gooddata/lcm/actions/collect_ca_metrics.rb +53 -0
  127. data/lib/gooddata/lcm/actions/collect_client_projects.rb +78 -0
  128. data/lib/gooddata/lcm/actions/collect_clients.rb +128 -0
  129. data/lib/gooddata/lcm/actions/collect_data_product.rb +57 -0
  130. data/lib/gooddata/lcm/actions/collect_dynamic_schedule_params.rb +62 -0
  131. data/lib/gooddata/lcm/actions/collect_ldm_objects.rb +56 -0
  132. data/lib/gooddata/lcm/actions/collect_meta.rb +88 -0
  133. data/lib/gooddata/lcm/actions/collect_segment_clients.rb +113 -0
  134. data/lib/gooddata/lcm/actions/collect_segments.rb +72 -0
  135. data/lib/gooddata/lcm/actions/collect_tagged_objects.rb +80 -0
  136. data/lib/gooddata/lcm/actions/collect_users_brick_users.rb +46 -0
  137. data/lib/gooddata/lcm/actions/create_segment_masters.rb +160 -0
  138. data/lib/gooddata/lcm/actions/ensure_data_product.rb +53 -0
  139. data/lib/gooddata/lcm/actions/ensure_release_table.rb +53 -0
  140. data/lib/gooddata/lcm/actions/ensure_segments.rb +32 -0
  141. data/lib/gooddata/lcm/actions/ensure_technical_users_domain.rb +70 -0
  142. data/lib/gooddata/lcm/actions/ensure_technical_users_project.rb +83 -0
  143. data/lib/gooddata/lcm/actions/execute_schedules.rb +128 -0
  144. data/lib/gooddata/lcm/actions/hello_world.rb +41 -0
  145. data/lib/gooddata/lcm/actions/import_object_collections.rb +60 -0
  146. data/lib/gooddata/lcm/actions/print_actions.rb +58 -0
  147. data/lib/gooddata/lcm/actions/print_modes.rb +69 -0
  148. data/lib/gooddata/lcm/actions/print_types.rb +52 -0
  149. data/lib/gooddata/lcm/actions/provision_clients.rb +89 -0
  150. data/lib/gooddata/lcm/actions/purge_clients.rb +58 -0
  151. data/lib/gooddata/lcm/actions/rename_existing_client_projects.rb +70 -0
  152. data/lib/gooddata/lcm/actions/segments_filter.rb +50 -0
  153. data/lib/gooddata/lcm/actions/synchronize_attribute_drillpaths.rb +64 -0
  154. data/lib/gooddata/lcm/actions/synchronize_cas.rb +72 -0
  155. data/lib/gooddata/lcm/actions/synchronize_clients.rb +94 -0
  156. data/lib/gooddata/lcm/actions/synchronize_color_palette.rb +67 -0
  157. data/lib/gooddata/lcm/actions/synchronize_etls_in_segment.rb +155 -0
  158. data/lib/gooddata/lcm/actions/synchronize_label_types.rb +64 -0
  159. data/lib/gooddata/lcm/actions/synchronize_ldm.rb +82 -0
  160. data/lib/gooddata/lcm/actions/synchronize_meta.rb +52 -0
  161. data/lib/gooddata/lcm/actions/synchronize_new_segments.rb +61 -0
  162. data/lib/gooddata/lcm/actions/synchronize_processes.rb +66 -0
  163. data/lib/gooddata/lcm/actions/synchronize_schedules.rb +91 -0
  164. data/lib/gooddata/lcm/actions/synchronize_tag_objects.rb +64 -0
  165. data/lib/gooddata/lcm/actions/synchronize_user_filters.rb +210 -0
  166. data/lib/gooddata/lcm/actions/synchronize_user_groups.rb +53 -0
  167. data/lib/gooddata/lcm/actions/synchronize_users.rb +336 -0
  168. data/lib/gooddata/lcm/actions/update_release_table.rb +77 -0
  169. data/lib/gooddata/lcm/data/create_lcm_release.sql.erb +6 -0
  170. data/lib/gooddata/lcm/data/insert_into_lcm_release.sql.erb +11 -0
  171. data/lib/gooddata/lcm/data/select_from_lcm_release.sql.erb +8 -0
  172. data/lib/gooddata/lcm/data/update_lcm_release.sql.erb +7 -0
  173. data/lib/gooddata/lcm/dsl/dsl.rb +50 -0
  174. data/lib/gooddata/lcm/dsl/params_dsl.rb +61 -0
  175. data/lib/gooddata/lcm/dsl/type_dsl.rb +62 -0
  176. data/lib/gooddata/lcm/helpers/check_helper.rb +41 -0
  177. data/lib/gooddata/lcm/helpers/helpers.rb +12 -0
  178. data/lib/gooddata/lcm/helpers/tags_helper.rb +36 -0
  179. data/lib/gooddata/lcm/lcm.rb +325 -0
  180. data/lib/gooddata/lcm/lcm2.rb +400 -0
  181. data/lib/gooddata/lcm/types/base_type.rb +29 -0
  182. data/lib/gooddata/lcm/types/class/ads_client.rb +35 -0
  183. data/lib/gooddata/lcm/types/class/class.rb +21 -0
  184. data/lib/gooddata/lcm/types/class/gd_client.rb +35 -0
  185. data/lib/gooddata/lcm/types/class/types.rb +12 -0
  186. data/lib/gooddata/lcm/types/complex/complex.rb +33 -0
  187. data/lib/gooddata/lcm/types/complex/release_query.rb +35 -0
  188. data/lib/gooddata/lcm/types/complex/segment.rb +40 -0
  189. data/lib/gooddata/lcm/types/complex/synchronization_info.rb +35 -0
  190. data/lib/gooddata/lcm/types/complex/tokens.rb +31 -0
  191. data/lib/gooddata/lcm/types/complex/types.rb +12 -0
  192. data/lib/gooddata/lcm/types/complex/update_preference.rb +38 -0
  193. data/lib/gooddata/lcm/types/complex/users_brick_config.rb +32 -0
  194. data/lib/gooddata/lcm/types/param.rb +16 -0
  195. data/lib/gooddata/lcm/types/scalar/bool.rb +22 -0
  196. data/lib/gooddata/lcm/types/scalar/hash.rb +22 -0
  197. data/lib/gooddata/lcm/types/scalar/integer.rb +22 -0
  198. data/lib/gooddata/lcm/types/scalar/object.rb +22 -0
  199. data/lib/gooddata/lcm/types/scalar/string.rb +22 -0
  200. data/lib/gooddata/lcm/types/scalar/types.rb +12 -0
  201. data/lib/gooddata/lcm/types/special/array.rb +33 -0
  202. data/lib/gooddata/lcm/types/special/enum.rb +15 -0
  203. data/lib/gooddata/lcm/types/special/types.rb +12 -0
  204. data/lib/gooddata/lcm/types/types.rb +12 -0
  205. data/lib/gooddata/lcm/user_bricks_helper.rb +32 -0
  206. data/lib/gooddata/mixins/author.rb +26 -0
  207. data/lib/gooddata/mixins/content_getter.rb +15 -0
  208. data/lib/gooddata/mixins/content_property_reader.rb +17 -0
  209. data/lib/gooddata/mixins/content_property_writer.rb +17 -0
  210. data/lib/gooddata/mixins/contributor.rb +20 -0
  211. data/lib/gooddata/mixins/data_getter.rb +15 -0
  212. data/lib/gooddata/mixins/data_property_reader.rb +19 -0
  213. data/lib/gooddata/mixins/data_property_writer.rb +19 -0
  214. data/lib/gooddata/mixins/inspector.rb +53 -0
  215. data/lib/gooddata/mixins/is_attribute.rb +17 -0
  216. data/lib/gooddata/mixins/is_dimension.rb +17 -0
  217. data/lib/gooddata/mixins/is_fact.rb +17 -0
  218. data/lib/gooddata/mixins/is_folder.rb +11 -0
  219. data/lib/gooddata/mixins/is_label.rb +19 -0
  220. data/lib/gooddata/mixins/links.rb +15 -0
  221. data/lib/gooddata/mixins/md_finders.rb +79 -0
  222. data/lib/gooddata/mixins/md_grantees.rb +42 -0
  223. data/lib/gooddata/mixins/md_id_to_uri.rb +39 -0
  224. data/lib/gooddata/mixins/md_json.rb +15 -0
  225. data/lib/gooddata/mixins/md_lock.rb +87 -0
  226. data/lib/gooddata/mixins/md_object_id.rb +15 -0
  227. data/lib/gooddata/mixins/md_object_indexer.rb +74 -0
  228. data/lib/gooddata/mixins/md_object_query.rb +134 -0
  229. data/lib/gooddata/mixins/md_relations.rb +43 -0
  230. data/lib/gooddata/mixins/meta_getter.rb +17 -0
  231. data/lib/gooddata/mixins/meta_property_reader.rb +19 -0
  232. data/lib/gooddata/mixins/meta_property_writer.rb +19 -0
  233. data/lib/gooddata/mixins/mixins.rb +19 -0
  234. data/lib/gooddata/mixins/not_attribute.rb +17 -0
  235. data/lib/gooddata/mixins/not_exportable.rb +15 -0
  236. data/lib/gooddata/mixins/not_fact.rb +17 -0
  237. data/lib/gooddata/mixins/not_group.rb +17 -0
  238. data/lib/gooddata/mixins/not_label.rb +19 -0
  239. data/lib/gooddata/mixins/not_metric.rb +19 -0
  240. data/lib/gooddata/mixins/obj_id.rb +15 -0
  241. data/lib/gooddata/mixins/rest_getters.rb +17 -0
  242. data/lib/gooddata/mixins/rest_resource.rb +47 -0
  243. data/lib/gooddata/mixins/root_key_getter.rb +15 -0
  244. data/lib/gooddata/mixins/root_key_setter.rb +15 -0
  245. data/lib/gooddata/mixins/timestamps.rb +19 -0
  246. data/lib/gooddata/mixins/to_json.rb +11 -0
  247. data/lib/gooddata/mixins/uri_getter.rb +9 -0
  248. data/lib/gooddata/models/ads_output_stage.rb +85 -0
  249. data/lib/gooddata/models/automated_data_distribution.rb +36 -0
  250. data/lib/gooddata/models/blueprint/anchor_field.rb +65 -0
  251. data/lib/gooddata/models/blueprint/attribute_field.rb +45 -0
  252. data/lib/gooddata/models/blueprint/blueprint.rb +11 -0
  253. data/lib/gooddata/models/blueprint/blueprint_field.rb +70 -0
  254. data/lib/gooddata/models/blueprint/dashboard_builder.rb +30 -0
  255. data/lib/gooddata/models/blueprint/dataset_blueprint.rb +455 -0
  256. data/lib/gooddata/models/blueprint/date_dimension.rb +20 -0
  257. data/lib/gooddata/models/blueprint/fact_field.rb +20 -0
  258. data/lib/gooddata/models/blueprint/label_field.rb +47 -0
  259. data/lib/gooddata/models/blueprint/project_blueprint.rb +791 -0
  260. data/lib/gooddata/models/blueprint/project_builder.rb +103 -0
  261. data/lib/gooddata/models/blueprint/reference_field.rb +43 -0
  262. data/lib/gooddata/models/blueprint/schema_blueprint.rb +160 -0
  263. data/lib/gooddata/models/blueprint/schema_builder.rb +89 -0
  264. data/lib/gooddata/models/blueprint/to_manifest.rb +185 -0
  265. data/lib/gooddata/models/blueprint/to_wire.rb +173 -0
  266. data/lib/gooddata/models/channel_configuration.rb +112 -0
  267. data/lib/gooddata/models/client.rb +236 -0
  268. data/lib/gooddata/models/client_synchronization_result.rb +31 -0
  269. data/lib/gooddata/models/client_synchronization_result_details.rb +41 -0
  270. data/lib/gooddata/models/data_product.rb +149 -0
  271. data/lib/gooddata/models/datawarehouse.rb +114 -0
  272. data/lib/gooddata/models/domain.rb +505 -0
  273. data/lib/gooddata/models/execution.rb +115 -0
  274. data/lib/gooddata/models/execution_detail.rb +81 -0
  275. data/lib/gooddata/models/from_wire.rb +173 -0
  276. data/lib/gooddata/models/invitation.rb +75 -0
  277. data/lib/gooddata/models/links.rb +50 -0
  278. data/lib/gooddata/models/membership.rb +441 -0
  279. data/lib/gooddata/models/metadata.rb +324 -0
  280. data/lib/gooddata/models/metadata/attribute.rb +155 -0
  281. data/lib/gooddata/models/metadata/dashboard.rb +120 -0
  282. data/lib/gooddata/models/metadata/dashboard/dashboard_item.rb +76 -0
  283. data/lib/gooddata/models/metadata/dashboard/filter_apply_item.rb +37 -0
  284. data/lib/gooddata/models/metadata/dashboard/filter_item.rb +64 -0
  285. data/lib/gooddata/models/metadata/dashboard/geo_chart_item.rb +56 -0
  286. data/lib/gooddata/models/metadata/dashboard/headline_item.rb +56 -0
  287. data/lib/gooddata/models/metadata/dashboard/iframe_item.rb +46 -0
  288. data/lib/gooddata/models/metadata/dashboard/report_item.rb +92 -0
  289. data/lib/gooddata/models/metadata/dashboard/text_item.rb +55 -0
  290. data/lib/gooddata/models/metadata/dashboard_tab.rb +141 -0
  291. data/lib/gooddata/models/metadata/dataset.rb +67 -0
  292. data/lib/gooddata/models/metadata/dimension.rb +57 -0
  293. data/lib/gooddata/models/metadata/fact.rb +51 -0
  294. data/lib/gooddata/models/metadata/folder.rb +49 -0
  295. data/lib/gooddata/models/metadata/label.rb +128 -0
  296. data/lib/gooddata/models/metadata/metadata.rb +12 -0
  297. data/lib/gooddata/models/metadata/metric.rb +206 -0
  298. data/lib/gooddata/models/metadata/report.rb +268 -0
  299. data/lib/gooddata/models/metadata/report_definition.rb +272 -0
  300. data/lib/gooddata/models/metadata/scheduled_mail.rb +277 -0
  301. data/lib/gooddata/models/metadata/scheduled_mail/dashboard_attachment.rb +62 -0
  302. data/lib/gooddata/models/metadata/scheduled_mail/report_attachment.rb +64 -0
  303. data/lib/gooddata/models/metadata/variable.rb +96 -0
  304. data/lib/gooddata/models/model.rb +293 -0
  305. data/lib/gooddata/models/models.rb +12 -0
  306. data/lib/gooddata/models/module_constants.rb +31 -0
  307. data/lib/gooddata/models/notification_rule.rb +113 -0
  308. data/lib/gooddata/models/process.rb +371 -0
  309. data/lib/gooddata/models/profile.rb +451 -0
  310. data/lib/gooddata/models/project.rb +2030 -0
  311. data/lib/gooddata/models/project_creator.rb +209 -0
  312. data/lib/gooddata/models/project_log_formatter.rb +204 -0
  313. data/lib/gooddata/models/project_metadata.rb +67 -0
  314. data/lib/gooddata/models/project_role.rb +79 -0
  315. data/lib/gooddata/models/report_data_result.rb +270 -0
  316. data/lib/gooddata/models/schedule.rb +538 -0
  317. data/lib/gooddata/models/segment.rb +274 -0
  318. data/lib/gooddata/models/style_setting.rb +62 -0
  319. data/lib/gooddata/models/subscription.rb +188 -0
  320. data/lib/gooddata/models/tab_builder.rb +27 -0
  321. data/lib/gooddata/models/user_filters/mandatory_user_filter.rb +76 -0
  322. data/lib/gooddata/models/user_filters/user_filter.rb +101 -0
  323. data/lib/gooddata/models/user_filters/user_filter_builder.rb +553 -0
  324. data/lib/gooddata/models/user_filters/user_filters.rb +13 -0
  325. data/lib/gooddata/models/user_filters/variable_user_filter.rb +33 -0
  326. data/lib/gooddata/models/user_group.rb +250 -0
  327. data/lib/gooddata/rest/README.md +37 -0
  328. data/lib/gooddata/rest/client.rb +396 -0
  329. data/lib/gooddata/rest/connection.rb +776 -0
  330. data/lib/gooddata/rest/object.rb +69 -0
  331. data/lib/gooddata/rest/object_factory.rb +51 -0
  332. data/lib/gooddata/rest/resource.rb +27 -0
  333. data/lib/gooddata/rest/rest.rb +24 -0
  334. data/lib/gooddata/version.rb +23 -0
  335. data/lib/templates/bricks/brick.rb.erb +7 -0
  336. data/lib/templates/bricks/main.rb.erb +5 -0
  337. data/lib/templates/project/Goodfile.erb +4 -0
  338. data/lib/templates/project/data/commits.csv +4 -0
  339. data/lib/templates/project/data/devs.csv +4 -0
  340. data/lib/templates/project/data/repos.csv +3 -0
  341. data/lib/templates/project/model/model.rb.erb +20 -0
  342. data/spec/.rubocop.yml +16 -0
  343. data/spec/bricks/bricks_spec.rb +110 -0
  344. data/spec/bricks/default-config.json +8 -0
  345. data/spec/data/.gooddata +4 -0
  346. data/spec/data/blueprints/additional_dataset_module.json +32 -0
  347. data/spec/data/blueprints/attribute_sort_order_blueprint.json +72 -0
  348. data/spec/data/blueprints/big_blueprint_not_pruned.json +2079 -0
  349. data/spec/data/blueprints/invalid_blueprint.json +103 -0
  350. data/spec/data/blueprints/m_n_model.json +104 -0
  351. data/spec/data/blueprints/model_module.json +25 -0
  352. data/spec/data/blueprints/test_blueprint.json +39 -0
  353. data/spec/data/blueprints/test_project_model_spec.json +106 -0
  354. data/spec/data/cc/data/source/commits.csv +4 -0
  355. data/spec/data/cc/data/source/devs.csv +4 -0
  356. data/spec/data/cc/data/source/repos.csv +3 -0
  357. data/spec/data/cc/devel.prm +0 -0
  358. data/spec/data/cc/graph/graph.grf +11 -0
  359. data/spec/data/cc/workspace.prm +19 -0
  360. data/spec/data/column_based_permissions.csv +7 -0
  361. data/spec/data/column_based_permissions2.csv +6 -0
  362. data/spec/data/dynamic_schedule_params_table.csv +7 -0
  363. data/spec/data/gd_gse_data_blueprint.json +1371 -0
  364. data/spec/data/gd_gse_data_manifest.json +1424 -0
  365. data/spec/data/gd_gse_data_model.json +1772 -0
  366. data/spec/data/gooddata_version_process/gooddata_version.rb +9 -0
  367. data/spec/data/gooddata_version_process/gooddata_version.zip +0 -0
  368. data/spec/data/hello_world_process/hello_world.rb +9 -0
  369. data/spec/data/hello_world_process/hello_world.zip +0 -0
  370. data/spec/data/line_based_permissions.csv +3 -0
  371. data/spec/data/manifests/test_blueprint.json +32 -0
  372. data/spec/data/manifests/test_project.json +107 -0
  373. data/spec/data/reports/left_attr_report.json +108 -0
  374. data/spec/data/reports/metric_only_one_line.json +83 -0
  375. data/spec/data/reports/report_1.json +197 -0
  376. data/spec/data/reports/top_attr_report.json +108 -0
  377. data/spec/data/ruby_params_process/ruby_params.rb +9 -0
  378. data/spec/data/ruby_process/deep_files/deep_stuff.txt +1 -0
  379. data/spec/data/ruby_process/process.rb +8 -0
  380. data/spec/data/ruby_process/stuff.txt +1 -0
  381. data/spec/data/superfluous_titles_view.json +81 -0
  382. data/spec/data/test-ci-data.csv +2 -0
  383. data/spec/data/users.csv +12 -0
  384. data/spec/data/wire_models/attribute_sort_by_model.json +73 -0
  385. data/spec/data/wire_models/model_view.json +1775 -0
  386. data/spec/data/wire_models/nu_model.json +3046 -0
  387. data/spec/data/wire_models/test_blueprint.json +66 -0
  388. data/spec/data/wire_test_project.json +150 -0
  389. data/spec/data/workspace_table.csv +3 -0
  390. data/spec/environment/default.rb +43 -0
  391. data/spec/environment/development.rb +32 -0
  392. data/spec/environment/environment.rb +38 -0
  393. data/spec/environment/production.rb +27 -0
  394. data/spec/environment/staging.rb +33 -0
  395. data/spec/environment/testing.rb +32 -0
  396. data/spec/helpers/blueprint_helper.rb +27 -0
  397. data/spec/helpers/cli_helper.rb +38 -0
  398. data/spec/helpers/connection_helper.rb +43 -0
  399. data/spec/helpers/crypto_helper.rb +19 -0
  400. data/spec/helpers/csv_helper.rb +20 -0
  401. data/spec/helpers/process_helper.rb +35 -0
  402. data/spec/helpers/project_helper.rb +74 -0
  403. data/spec/helpers/schedule_helper.rb +33 -0
  404. data/spec/helpers/spec_helper.rb +17 -0
  405. data/spec/integration/ads_output_stage_spec.rb +45 -0
  406. data/spec/integration/blueprint_updates_spec.rb +107 -0
  407. data/spec/integration/blueprint_with_ca_spec.rb +56 -0
  408. data/spec/integration/blueprint_with_grain_spec.rb +74 -0
  409. data/spec/integration/channel_configuration_spec.rb +67 -0
  410. data/spec/integration/clients_spec.rb +164 -0
  411. data/spec/integration/command_datawarehouse_spec.rb +45 -0
  412. data/spec/integration/command_projects_spec.rb +32 -0
  413. data/spec/integration/commands/command_projects_spec.rb +22 -0
  414. data/spec/integration/core/connection_spec.rb +56 -0
  415. data/spec/integration/core/logging_spec.rb +130 -0
  416. data/spec/integration/core/project_spec.rb +54 -0
  417. data/spec/integration/create_from_template_spec.rb +29 -0
  418. data/spec/integration/create_project_spec.rb +27 -0
  419. data/spec/integration/date_dim_switch_spec.rb +150 -0
  420. data/spec/integration/deprecated_load_spec.rb +60 -0
  421. data/spec/integration/full_process_schedule_spec.rb +367 -0
  422. data/spec/integration/full_project_spec.rb +592 -0
  423. data/spec/integration/helpers_spec.rb +16 -0
  424. data/spec/integration/lcm_spec.rb +54 -0
  425. data/spec/integration/mixins/id_to_uri_spec.rb +44 -0
  426. data/spec/integration/models/data_product_spec.rb +71 -0
  427. data/spec/integration/models/domain_spec.rb +162 -0
  428. data/spec/integration/models/invitation_spec.rb +17 -0
  429. data/spec/integration/models/membership_spec.rb +127 -0
  430. data/spec/integration/models/metadata/report_spec.rb +54 -0
  431. data/spec/integration/models/params_spec.rb +118 -0
  432. data/spec/integration/models/profile_spec.rb +210 -0
  433. data/spec/integration/models/project_role_spec.rb +94 -0
  434. data/spec/integration/models/project_spec.rb +225 -0
  435. data/spec/integration/models/schedule_spec.rb +485 -0
  436. data/spec/integration/models/unit_project_spec.rb +130 -0
  437. data/spec/integration/over_to_user_filters_spec.rb +98 -0
  438. data/spec/integration/partial_md_export_import_spec.rb +41 -0
  439. data/spec/integration/project_spec.rb +381 -0
  440. data/spec/integration/rest_spec.rb +214 -0
  441. data/spec/integration/schedule_spec.rb +613 -0
  442. data/spec/integration/segments_spec.rb +100 -0
  443. data/spec/integration/subscription_spec.rb +88 -0
  444. data/spec/integration/urn_date_dim_spec.rb +53 -0
  445. data/spec/integration/user_filters_spec.rb +306 -0
  446. data/spec/integration/user_group_spec.rb +147 -0
  447. data/spec/integration/variables_spec.rb +189 -0
  448. data/spec/logging_in_logging_out_spec.rb +91 -0
  449. data/spec/spec_helper.rb +66 -0
  450. data/spec/unit/actions/associate_clients_spec.rb +47 -0
  451. data/spec/unit/actions/collect_client_projects_spec.rb +47 -0
  452. data/spec/unit/actions/collect_clients_spec.rb +65 -0
  453. data/spec/unit/actions/collect_data_product_spec.rb +56 -0
  454. data/spec/unit/actions/collect_dynamic_schedule_params_spec.rb +56 -0
  455. data/spec/unit/actions/collect_meta_spec.rb +88 -0
  456. data/spec/unit/actions/collect_segment_clients_spec.rb +81 -0
  457. data/spec/unit/actions/collect_tagged_objects_spec.rb +126 -0
  458. data/spec/unit/actions/collect_users_brick_users_spec.rb +36 -0
  459. data/spec/unit/actions/create_segment_masters_spec.rb +64 -0
  460. data/spec/unit/actions/ensure_data_product_spec.rb +38 -0
  461. data/spec/unit/actions/ensure_technical_users_domain_spec.rb +51 -0
  462. data/spec/unit/actions/ensure_technical_users_project_spec.rb +72 -0
  463. data/spec/unit/actions/execute_schedules_spec.rb +94 -0
  464. data/spec/unit/actions/provision_clients_spec.rb +45 -0
  465. data/spec/unit/actions/purge_clients_spec.rb +47 -0
  466. data/spec/unit/actions/rename_existing_client_projects_spec.rb +54 -0
  467. data/spec/unit/actions/segments_filter_spec.rb +46 -0
  468. data/spec/unit/actions/shared_examples_for_user_actions.rb +26 -0
  469. data/spec/unit/actions/synchronize_cas_spec.rb +58 -0
  470. data/spec/unit/actions/synchronize_etls_in_segment_spec.rb +212 -0
  471. data/spec/unit/actions/synchronize_ldm_spec.rb +57 -0
  472. data/spec/unit/actions/synchronize_user_filters_spec.rb +146 -0
  473. data/spec/unit/actions/synchronize_user_groups_spec.rb +49 -0
  474. data/spec/unit/actions/synchronize_users_spec.rb +134 -0
  475. data/spec/unit/bricks/bricks_spec.rb +34 -0
  476. data/spec/unit/bricks/middleware/aws_middelware_spec.rb +98 -0
  477. data/spec/unit/bricks/middleware/bench_middleware_spec.rb +15 -0
  478. data/spec/unit/bricks/middleware/bulk_salesforce_middleware_spec.rb +15 -0
  479. data/spec/unit/bricks/middleware/gooddata_middleware_spec.rb +15 -0
  480. data/spec/unit/bricks/middleware/logger_middleware_spec.rb +30 -0
  481. data/spec/unit/bricks/middleware/restforce_middleware_spec.rb +15 -0
  482. data/spec/unit/bricks/middleware/stdout_middleware_spec.rb +15 -0
  483. data/spec/unit/bricks/middleware/twitter_middleware_spec.rb +15 -0
  484. data/spec/unit/cli/cli_spec.rb +17 -0
  485. data/spec/unit/cli/commands/cmd_auth_spec.rb +17 -0
  486. data/spec/unit/core/nil_logger_spec.rb +13 -0
  487. data/spec/unit/extensions/hash_spec.rb +22 -0
  488. data/spec/unit/godzilla/goodzilla_spec.rb +74 -0
  489. data/spec/unit/helpers/csv_helper_spec.rb +22 -0
  490. data/spec/unit/helpers/data_helper_spec.rb +67 -0
  491. data/spec/unit/helpers/global_helpers_spec.rb +264 -0
  492. data/spec/unit/helpers_spec.rb +254 -0
  493. data/spec/unit/lcm/user_bricks_helper_spec.rb +58 -0
  494. data/spec/unit/models/blueprint/attribute_sort_by_spec.rb +20 -0
  495. data/spec/unit/models/blueprint/attributes_spec.rb +28 -0
  496. data/spec/unit/models/blueprint/dataset_spec.rb +120 -0
  497. data/spec/unit/models/blueprint/labels_spec.rb +43 -0
  498. data/spec/unit/models/blueprint/project_blueprint_spec.rb +642 -0
  499. data/spec/unit/models/blueprint/reference_spec.rb +28 -0
  500. data/spec/unit/models/blueprint/schema_builder_spec.rb +36 -0
  501. data/spec/unit/models/blueprint/to_wire_spec.rb +195 -0
  502. data/spec/unit/models/execution_spec.rb +109 -0
  503. data/spec/unit/models/from_wire_spec.rb +301 -0
  504. data/spec/unit/models/metadata_spec.rb +140 -0
  505. data/spec/unit/models/metric_spec.rb +129 -0
  506. data/spec/unit/models/model_spec.rb +77 -0
  507. data/spec/unit/models/project_creator_spec.rb +90 -0
  508. data/spec/unit/models/project_spec.rb +94 -0
  509. data/spec/unit/models/report_result_data_spec.rb +194 -0
  510. data/spec/unit/models/to_manifest_spec.rb +136 -0
  511. data/spec/unit/models/user_filters/user_filter_builder_spec.rb +110 -0
  512. data/spec/unit/models/user_filters_spec.rb +95 -0
  513. data/spec/unit/models/variable_spec.rb +280 -0
  514. data/spec/unit/rest/polling_spec.rb +101 -0
  515. data/spec/unit/rest/resource_spec.rb +10 -0
  516. data/yard-server.sh +3 -0
  517. metadata +1207 -0
@@ -0,0 +1,23 @@
1
+ require 'erb'
2
+
3
+ module GoodData
4
+ module Helpers
5
+ module ErbHelper
6
+ class << self
7
+ def template_string(template, params = {})
8
+ b = binding
9
+
10
+ params.each do |k, v|
11
+ b.local_variable_set(k, v)
12
+ end
13
+
14
+ ERB.new(template).result(b)
15
+ end
16
+
17
+ def template_file(path, params)
18
+ template_string(File.read(path), params)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,266 @@
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 'base64'
8
+ require 'pathname'
9
+ require 'hashie'
10
+ require 'openssl'
11
+
12
+ require_relative '../extensions/object'
13
+ require_relative 'global_helpers_params'
14
+
15
+ module GoodData
16
+ module Helpers
17
+ extend Hashie::Extensions::StringifyKeys::ClassMethods
18
+ extend Hashie::Extensions::SymbolizeKeys::ClassMethods
19
+
20
+ class DeepMergeableHash < Hash
21
+ include Hashie::Extensions::DeepMerge
22
+ end
23
+
24
+ set_const :GD_MAX_RETRY, (ENV['GD_MAX_RETRY'] && ENV['GD_MAX_RETRY'].to_i) || 3
25
+
26
+ class << self
27
+ def error(msg)
28
+ STDERR.puts(msg)
29
+ exit 1
30
+ end
31
+
32
+ # FIXME: Windows incompatible
33
+ def find_goodfile(pwd = `pwd`.strip!, options = {})
34
+ root = Pathname(options[:root] || '/')
35
+ pwd = Pathname(pwd).expand_path
36
+ loop do
37
+ gf = pwd + '.gooddata'
38
+ return gf if File.exist?(gf)
39
+ pwd = pwd.parent
40
+ break if root == pwd
41
+ end
42
+ nil
43
+ end
44
+
45
+ # It takes what should be mapped to what and creates a mapping that is suitable for other internal methods.
46
+ # This means looking up the objects and returning it as array of pairs.
47
+ # The input can be given in several ways
48
+ #
49
+ # 1. Hash. For example it could look like
50
+ # {'label.states.name' => 'label.state.id'}
51
+ #
52
+ # 2 Arrays. In such case the arrays are zipped together. First item will be swapped for the first item in the second array etc.
53
+ # ['label.states.name'], ['label.state.id']
54
+ #
55
+ # @param what [Hash | Array] List/Hash of objects to be swapped
56
+ # @param for_what [Array] List of objects to be swapped
57
+ # @return [Array<GoodData::MdObject>] List of pairs of objects
58
+ def prepare_mapping(what, for_what = nil, options = {})
59
+ project = options[:project] || (for_what.is_a?(Hash) && for_what[:project]) || fail('Project has to be provided')
60
+ mapping = if what.is_a?(Hash)
61
+ whats = what.keys
62
+ to_whats = what.values
63
+ whats.zip(to_whats)
64
+ elsif what.is_a?(Array) && for_what.is_a?(Array)
65
+ whats.zip(to_whats)
66
+ else
67
+ [[what, for_what]]
68
+ end
69
+ mapping.pmap { |f, t| [project.objects(f), project.objects(t)] }
70
+ end
71
+
72
+ def get_path(an_object, path = [], default = nil)
73
+ return an_object if path.empty?
74
+ return default if an_object.nil?
75
+
76
+ path.reduce(an_object) do |a, e|
77
+ a && a.key?(e) ? a[e] : default
78
+ end
79
+ end
80
+
81
+ def last_uri_part(uri)
82
+ uri.split('/').last
83
+ end
84
+
85
+ def home_directory
86
+ running_on_windows? ? ENV['USERPROFILE'] : ENV['HOME']
87
+ end
88
+
89
+ def hash_dfs(thing, &block)
90
+ if !thing.is_a?(Hash) && !thing.is_a?(Array) # rubocop:disable Style/GuardClause
91
+ elsif thing.is_a?(Array)
92
+ thing.each do |child|
93
+ hash_dfs(child, &block)
94
+ end
95
+ else
96
+ thing.each do |key, val|
97
+ yield(thing, key)
98
+ hash_dfs(val, &block)
99
+ end
100
+ end
101
+ end
102
+
103
+ def titleize(str)
104
+ titleized = str.gsub(/[\.|_](.)/, &:upcase)
105
+ titleized = titleized.tr('_', ' ')
106
+ titleized[0] = titleized[0].upcase
107
+ titleized
108
+ end
109
+
110
+ def join(master, slave, on, on2, options = {})
111
+ full_outer = options[:full_outer]
112
+ inner = options[:inner]
113
+
114
+ lookup = create_lookup(slave, on2)
115
+ marked_lookup = {}
116
+ results = master.reduce([]) do |a, line|
117
+ matching_values = lookup[line.values_at(*on)] || []
118
+ marked_lookup[line.values_at(*on)] = 1
119
+ if matching_values.empty? && !inner
120
+ a << line.to_hash
121
+ else
122
+ matching_values.each do |matching_value|
123
+ a << matching_value.to_hash.merge(line.to_hash)
124
+ end
125
+ end
126
+ a
127
+ end
128
+
129
+ if full_outer
130
+ (lookup.keys - marked_lookup.keys).each do |key|
131
+ puts lookup[key]
132
+ results << lookup[key].first.to_hash
133
+ end
134
+ end
135
+ results
136
+ end
137
+
138
+ def running_on_windows?
139
+ RUBY_PLATFORM =~ /mswin32|mingw32/
140
+ end
141
+
142
+ def running_on_a_mac?
143
+ RUBY_PLATFORM =~ /-darwin\d/
144
+ end
145
+
146
+ def underline(x)
147
+ '=' * x.size
148
+ end
149
+
150
+ def interpolate_error_messages(errors)
151
+ errors.map { |e| interpolate_error_message(e) }
152
+ end
153
+
154
+ def interpolate_error_message(error)
155
+ return unless error && error['error'] && error['error']['message']
156
+ message = error['error']['message']
157
+ params = error['error']['parameters']
158
+ sprintf(message, *params)
159
+ end
160
+
161
+ def deep_dup(an_object)
162
+ case an_object
163
+ when Array
164
+ an_object.map { |it| GoodData::Helpers.deep_dup(it) }
165
+ when Hash
166
+ an_object.each_with_object(an_object.dup) do |(key, value), hash|
167
+ hash[GoodData::Helpers.deep_dup(key)] = GoodData::Helpers.deep_dup(value)
168
+ end
169
+ when Object
170
+ an_object.duplicable? ? an_object.dup : an_object
171
+ end
172
+ end
173
+
174
+ def undot(params)
175
+ # for each key-value config given
176
+ params.map do |k, v|
177
+ # dot notation to hash
178
+ k.split('__').reverse.reduce(v) do |memo, obj|
179
+ GoodData::Helper.DeepMergeableHash[{ obj => memo }]
180
+ end
181
+ end
182
+ end
183
+
184
+ def parse_http_exception(e)
185
+ JSON.parse(e.response)
186
+ end
187
+
188
+ # Creates a matrix with zeroes in all places. It is implemented as an Array of Arrays. First rows then columns.
189
+ #
190
+ # @param [Integer] m Number of rows
191
+ # @param [Integer] n Number of cols
192
+ # @param [Integer] val Alternatively can fill in positions with different values than zeroes. Defualt is zero.
193
+ # @return [Array<Array>] Returns a matrix of zeroes
194
+ def zeroes(m, n, val = 0)
195
+ m.times.map { n.times.map { val } }
196
+ end
197
+
198
+ # Turns a boolean or string 'true' into boolean. Useful for bricks.
199
+ #
200
+ # @param [Object] Something
201
+ # @return [Boolean] Returns true or false if the input is 'true' or true
202
+ def to_boolean(param)
203
+ param == 'true' || param == true ? true : false
204
+ end
205
+
206
+ # encrypts data with the given key. returns a binary data with the
207
+ # unhashed random iv in the first 16 bytes
208
+ def encrypt(data, key)
209
+ cipher = OpenSSL::Cipher::Cipher.new('aes-256-cbc')
210
+ cipher.encrypt
211
+ cipher.key = key = Digest::SHA256.digest(key)
212
+ random_iv = cipher.random_iv
213
+ cipher.iv = Digest::SHA256.digest(random_iv + key)[0..15]
214
+ encrypted = cipher.update(data)
215
+ encrypted << cipher.final
216
+ # add unhashed iv to front of encrypted data
217
+
218
+ Base64.encode64(random_iv + encrypted)
219
+ end
220
+
221
+ def decrypt(database64, key)
222
+ return '' if key.nil? || key.empty?
223
+
224
+ data = Base64.decode64(database64)
225
+
226
+ cipher = OpenSSL::Cipher::Cipher.new('aes-256-cbc')
227
+ cipher.decrypt
228
+ cipher.key = cipher_key = Digest::SHA256.digest(key)
229
+ random_iv = data[0..15] # extract iv from first 16 bytes
230
+ data = data[16..data.size - 1]
231
+ cipher.iv = Digest::SHA256.digest(random_iv + cipher_key)[0..15]
232
+ begin
233
+ decrypted = cipher.update(data)
234
+ decrypted << cipher.final
235
+ rescue
236
+ puts 'Error'
237
+ return nil
238
+ end
239
+
240
+ decrypted
241
+ end
242
+ end
243
+ end
244
+
245
+ class << self
246
+ def get_client(opts)
247
+ client = opts[:client]
248
+ fail ArgumentError, 'No :client specified' if client.nil?
249
+
250
+ client
251
+ end
252
+
253
+ def get_client_and_project(opts)
254
+ client = opts[:client]
255
+ fail ArgumentError, 'No :client specified' if client.nil?
256
+
257
+ p = opts[:project]
258
+ fail ArgumentError, 'No :project specified' if p.nil?
259
+
260
+ project = GoodData::Project[p, opts]
261
+ fail ArgumentError, 'Wrong :project specified' if project.nil?
262
+
263
+ [client, project]
264
+ end
265
+ end
266
+ end
@@ -0,0 +1,292 @@
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
+ module GoodData
8
+ module Helpers
9
+ ENCODED_PARAMS_KEY = 'gd_encoded_params'
10
+ ENCODED_HIDDEN_PARAMS_KEY = 'gd_encoded_hidden_params'
11
+
12
+ class << self
13
+ # Encodes parameters for passing them to GD execution platform.
14
+ # Core types are kept and complex types (arrays, structures, etc) are
15
+ # JSON encoded into key hash "gd_encoded_params" or
16
+ # "gd_encoded_hidden_params", depending on the 'hidden' method param.
17
+ # The two different keys are used because the params and hidden params
18
+ # are merged by the platform and if we use the same key,
19
+ # the param would be overwritten.
20
+ #
21
+ # Core types are following:
22
+ # - Boolean (true, false)
23
+ # - Fixnum
24
+ # - Float
25
+ # - Nil
26
+ # - String
27
+ #
28
+ # @param [Hash] params Parameters to be encoded
29
+ # @return [Hash] Encoded parameters
30
+ def encode_params(params, data_key)
31
+ res = {}
32
+ nested = {}
33
+ core_types = [FalseClass, Integer, Float, NilClass, TrueClass, String]
34
+ params.each do |k, v|
35
+ if core_types.include?(v.class)
36
+ res[k] = v
37
+ else
38
+ nested[k] = v
39
+ end
40
+ end
41
+ res[data_key] = nested.to_json unless nested.empty?
42
+ res
43
+ end
44
+
45
+ # Encodes public parameters for passing them to GD execution platform.
46
+ # @param [Hash] params Parameters to be encoded
47
+ # @return [Hash] Encoded parameters
48
+ def encode_public_params(params)
49
+ encode_params(params, ENCODED_PARAMS_KEY)
50
+ end
51
+
52
+ # Encodes hidden parameters for passing them to GD execution platform.
53
+ # @param [Hash] params Parameters to be encoded
54
+ # @return [Hash] Encoded parameters
55
+ def encode_hidden_params(params)
56
+ encode_params(params, ENCODED_HIDDEN_PARAMS_KEY)
57
+ end
58
+
59
+ # Decodes params as they came from the platform.
60
+ # @params Parameter hash need to be decoded
61
+ # @option options [Boolean] :resolve_reference_params Resolve reference parameters in gd_encoded_params or not
62
+ # @return [Hash] Decoded parameters
63
+ def decode_params(params, options = {})
64
+ key = ENCODED_PARAMS_KEY.to_s
65
+ hidden_key = ENCODED_HIDDEN_PARAMS_KEY.to_s
66
+ data_params = params[key] || '{}'
67
+ hidden_data_params = if params.key?(hidden_key) && params[hidden_key].nil?
68
+ "{\"#{hidden_key}\" : null}"
69
+ elsif params.key?(hidden_key)
70
+ params[hidden_key]
71
+ else
72
+ '{}'
73
+ end
74
+
75
+ reference_values = []
76
+ # Replace reference parameters by the actual values. Use backslash to escape a reference parameter, e.g: \${not_a_param},
77
+ # the ${not_a_param} will not be replaced
78
+ if options[:resolve_reference_params]
79
+ data_params, reference_values = resolve_reference_params(data_params, params)
80
+ hidden_data_params, = resolve_reference_params(hidden_data_params, params)
81
+ end
82
+
83
+ begin
84
+ parsed_data_params = data_params.is_a?(Hash) ? data_params : JSON.parse(data_params)
85
+ rescue JSON::ParserError => exception
86
+ reason = exception.message
87
+ reference_values.each { |secret_value| reason.gsub!("\"#{secret_value}\"", '"***"') }
88
+ raise exception.class, "Error reading json from '#{key}', reason: #{reason}"
89
+ end
90
+
91
+ begin
92
+ parsed_hidden_data_params = hidden_data_params.is_a?(Hash) ? hidden_data_params : JSON.parse(hidden_data_params)
93
+ rescue JSON::ParserError => exception
94
+ raise exception.class, "Error reading json from '#{hidden_key}'"
95
+ end
96
+
97
+ # Add the nil on ENCODED_HIDDEN_PARAMS_KEY
98
+ # if the data was retrieved from API You will not have the actual values so encode -> decode is not losless. The nil on the key prevents the server from deleting the key
99
+ parsed_hidden_data_params[ENCODED_HIDDEN_PARAMS_KEY] = nil unless parsed_hidden_data_params.empty?
100
+
101
+ params.delete(key)
102
+ params.delete(hidden_key)
103
+ params = params.deep_merge(parsed_data_params).deep_merge(parsed_hidden_data_params)
104
+
105
+ if options[:convert_pipe_delimited_params]
106
+ convert_pipe_delimited_params = lambda do |args|
107
+ args = args.select { |k, _| k.include? "|" }
108
+ lines = args.keys.map do |k|
109
+ hash = {}
110
+ last_a = nil
111
+ last_e = nil
112
+ k.split("|").reduce(hash) do |a, e|
113
+ last_a = a
114
+ last_e = e
115
+ a[e] = {}
116
+ end
117
+ last_a[last_e] = args[k]
118
+ hash
119
+ end
120
+
121
+ lines.reduce({}) do |a, e|
122
+ a.deep_merge(e)
123
+ end
124
+ end
125
+
126
+ pipe_delimited_params = convert_pipe_delimited_params.call(params)
127
+ params.delete_if do |k, _|
128
+ k.include?('|')
129
+ end
130
+ params = params.deep_merge(pipe_delimited_params)
131
+ end
132
+
133
+ params
134
+ end
135
+
136
+ # A helper which allows you to diff two lists of objects. The objects
137
+ # can be arbitrary objects as long as they respond to to_hash because
138
+ # the diff is eventually done on hashes. It allows you to specify
139
+ # several options to allow you to limit on what the sameness test is done
140
+ #
141
+ # @param [Array<Object>] old_list List of objects that serves as a base for comparison
142
+ # @param [Array<Object>] new_list List of objects that is compared agianst the old_list
143
+ # @return [Hash] A structure that contains the result of the comparison. There are
144
+ # four keys.
145
+ # :added contains the list that are in new_list but were not in the old_list
146
+ # :added contains the list that are in old_list but were not in the new_list
147
+ # :same contains objects that are in both lists and they are the same
148
+ # :changed contains list of objects that changed along ith original, the new one
149
+ # and the list of changes
150
+ def diff(old_list, new_list, options = {})
151
+ old_list = old_list.map(&:to_hash)
152
+ new_list = new_list.map(&:to_hash)
153
+
154
+ fields = options[:fields]
155
+ lookup_key = options[:key]
156
+
157
+ old_lookup = Hash[old_list.map { |v| [v[lookup_key], v] }]
158
+
159
+ res = {
160
+ :added => [],
161
+ :removed => [],
162
+ :changed => [],
163
+ :same => []
164
+ }
165
+
166
+ new_list.each do |new_obj|
167
+ old_obj = old_lookup[new_obj[lookup_key]]
168
+ if old_obj.nil?
169
+ res[:added] << new_obj
170
+ next
171
+ end
172
+
173
+ if fields
174
+ sliced_old_obj = old_obj.slice(*fields)
175
+ sliced_new_obj = new_obj.slice(*fields)
176
+ else
177
+ sliced_old_obj = old_obj
178
+ sliced_new_obj = new_obj
179
+ end
180
+ if sliced_old_obj != sliced_new_obj
181
+ difference = sliced_new_obj.to_a - sliced_old_obj.to_a
182
+ differences = Hash[*difference.mapcat { |x| x }]
183
+ res[:changed] << {
184
+ old_obj: old_obj,
185
+ new_obj: new_obj,
186
+ diff: differences
187
+ }
188
+ else
189
+ res[:same] << old_obj
190
+ end
191
+ end
192
+
193
+ new_lookup = Hash[new_list.map { |v| [v[lookup_key], v] }]
194
+ old_list.each do |old_obj|
195
+ new_obj = new_lookup[old_obj[lookup_key]]
196
+ if new_obj.nil?
197
+ res[:removed] << old_obj
198
+ next
199
+ end
200
+ end
201
+
202
+ res
203
+ end
204
+
205
+ def create_lookup(collection, on)
206
+ lookup = {}
207
+ if on.is_a?(Array)
208
+ collection.each do |e|
209
+ key = e.values_at(*on)
210
+ lookup[key] = [] unless lookup.key?(key)
211
+ lookup[key] << e
212
+ end
213
+ else
214
+ collection.each do |e|
215
+ key = e[on]
216
+ lookup[key] = [] unless lookup.key?(key)
217
+ lookup[key] << e
218
+ end
219
+ end
220
+ lookup
221
+ end
222
+
223
+ def stringify_values(value)
224
+ case value
225
+ when nil
226
+ value
227
+ when Hash
228
+ Hash[
229
+ value.map do |k, v|
230
+ [k, stringify_values(v)]
231
+ end
232
+ ]
233
+ when Array
234
+ value.map do |v|
235
+ stringify_values(v)
236
+ end
237
+ else
238
+ value.to_s
239
+ end
240
+ end
241
+
242
+ private
243
+
244
+ def resolve_reference_params(data_params, params)
245
+ reference_values = []
246
+ regexps = Regexp.union(/\\\\/, /\\\$/, /\$\{(\w+)\}/)
247
+ resolve_reference = lambda do |v|
248
+ if v.is_a? Hash
249
+ Hash[
250
+ v.map do |k, v2|
251
+ [k, resolve_reference.call(v2)]
252
+ end
253
+ ]
254
+ elsif v.is_a? Array
255
+ v.map do |v2|
256
+ resolve_reference.call(v2)
257
+ end
258
+ elsif !v.is_a?(String)
259
+ v
260
+ else
261
+ v.gsub(regexps) do |match|
262
+ if match =~ /\\\\/
263
+ data_params.is_a?(Hash) ? '\\' : '\\\\' # rubocop: disable Metrics/BlockNesting
264
+ elsif match =~ /\\\$/
265
+ '$'
266
+ elsif match =~ /\$\{(\w+)\}/
267
+ val = params["#{$1}"]
268
+ if val
269
+ reference_values << val
270
+ val
271
+ else
272
+ GoodData.logger.warn "Reference '#{$1}' is not found!"
273
+ match
274
+ end
275
+ end
276
+ end
277
+ end
278
+ end
279
+
280
+ data_params = if data_params.is_a? Hash
281
+ Hash[data_params.map do |k, v|
282
+ [k, resolve_reference.call(v)]
283
+ end]
284
+ else
285
+ resolve_reference.call(data_params)
286
+ end
287
+
288
+ [data_params, reference_values]
289
+ end
290
+ end
291
+ end
292
+ end