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,79 @@
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 'pmap'
8
+
9
+ require_relative 'profile'
10
+
11
+ require_relative '../rest/rest'
12
+
13
+ require_relative '../mixins/rest_resource'
14
+
15
+ module GoodData
16
+ class ProjectRole < Rest::Resource
17
+ include Mixin::Author
18
+ include Mixin::Contributor
19
+ include Mixin::Timestamps
20
+
21
+ EMPTY_OBJECT = {
22
+ 'projectRole' => {
23
+ 'permissions' => {},
24
+ 'links' => {},
25
+ 'meta' => {}
26
+ }
27
+ }
28
+
29
+ def self.create_object(data)
30
+ meta_data = {}.tap do |d|
31
+ d[:created] = data[:created] || Time.now
32
+ d[:identifier] = data[:identifier]
33
+ d[:updated] = data[:updated] || d[:created] || Time.now
34
+ d[:title] = data[:title]
35
+ d[:summary] = data[:summary]
36
+ end
37
+ new_data = GoodData::Helpers.deep_dup(EMPTY_OBJECT).tap do |d|
38
+ d['projectRole']['links']['self'] = data[:uri] if data[:uri]
39
+ d['projectRole']['meta'] = d['projectRole']['meta'].merge(GoodData::Helpers.stringify_keys(meta_data))
40
+ d['projectRole']['permissions'] = d['projectRole']['permissions'].merge(GoodData::Helpers.stringify_keys(data[:permissions] || {}))
41
+ end
42
+ new(new_data)
43
+ end
44
+
45
+ def initialize(json)
46
+ @json = json
47
+ end
48
+
49
+ data_property_reader :permissions
50
+
51
+ metadata_property_reader :identifier, :title, :summary
52
+
53
+ # Gets Users with this Role
54
+ #
55
+ # @return [Array<GoodData::Profile>] List of users
56
+ def users
57
+ url = data['links']['roleUsers']
58
+ tmp = client.get url
59
+ tmp['associatedUsers']['users'].pmap do |user_url|
60
+ url = user_url
61
+ user = client.get url
62
+ client.create(GoodData::Profile, user)
63
+ end
64
+ end
65
+
66
+ # Gets Raw object URI
67
+ #
68
+ # @return [string] URI of this project role
69
+ def uri
70
+ return @json['projectRole']['links']['self'] if @json['projectRole']['links']['self']
71
+ return nil unless @json['projectRole']['links']['roleUsers']
72
+ @json['projectRole']['links']['roleUsers'].split('/')[0...-1].join('/')
73
+ end
74
+
75
+ def ==(other)
76
+ uri == other.uri
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,270 @@
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
+ class ReportDataResult < Rest::Resource
9
+ class << self
10
+ # Does all the needed parsing on the apyload coming from the API and returns an instance of ReportDataResult
11
+ #
12
+ # @param [Hash] data Data coming from the API
13
+ # @return [GoodData::ReportDataResult] Returns new report data result
14
+ def from_xtab(data)
15
+ top = top_headers(data)
16
+ left = left_headers(data)
17
+ jank = GoodData::Helpers.zeroes(rows(top), cols(left), nil)
18
+ d = data(data)
19
+ stuff = d.empty? ? GoodData::Helpers.zeroes(rows(left), cols(top), nil) : d
20
+
21
+ a = jank.zip(top).map { |x, y| x + y }
22
+ b = left.zip(stuff).map { |x, y| x + y }
23
+ result = a + b
24
+ ReportDataResult.new(data: result, top: rows(top), left: cols(left))
25
+ end
26
+
27
+ private
28
+
29
+ def line(child)
30
+ children = child['children'] || []
31
+ return (child['first']..child['last']).to_a.map { [child['id']] } if children.empty?
32
+ children.flat_map { |c| line(c) }.map do |x|
33
+ child['id'].nil? ? x : [child['id']] + x
34
+ end
35
+ end
36
+
37
+ def root_line(root)
38
+ lookups = root['lookups']
39
+ header = line(root['tree'])
40
+ header.map { |l| l.each_with_index.map { |item, index| lookups[index][item] } }
41
+ end
42
+
43
+ def top_headers(data)
44
+ root = data['xtab_data']['columns']
45
+ root_line(root).transpose
46
+ end
47
+
48
+ def left_headers(data)
49
+ root = data['xtab_data']['rows']
50
+ root_line(root)
51
+ end
52
+
53
+ def cols(stuff)
54
+ stuff.first.count
55
+ end
56
+
57
+ def rows(stuff)
58
+ stuff.count
59
+ end
60
+
61
+ def data(data)
62
+ data['xtab_data']['data'].map { |row| row.map { |i| i ? BigDecimal(i) : i } }
63
+ end
64
+ end
65
+
66
+ # Returns
67
+ #
68
+ # @param [Hash] opts Data for the report
69
+ # @option opts [Array<Array>] :data The data as a matrix. First rows then cols
70
+ # @option opts [Number] :top Number of rows that are representing the top header
71
+ # @option opts [Number] :left Number of cols that are representing the left header
72
+ # @return [GoodData::ReportDataResult] Returns new report data result
73
+ def initialize(opts)
74
+ @data = opts[:data]
75
+ @top_headers_rows_nums = opts[:top]
76
+ @left_headers_cols_nums = opts[:left]
77
+ end
78
+
79
+ # Gives you new report result with top headers removed
80
+ #
81
+ # @return [GoodData::ReportDataResult] Returns new report data result
82
+ def without_top_headers
83
+ slice(@top_headers_rows_nums, 0)
84
+ end
85
+
86
+ # Gives you new report result with left headers removed
87
+ #
88
+ # @return [GoodData::ReportDataResult] Returns new report data result
89
+ def without_left_headers
90
+ slice(0, @left_headers_cols_nums)
91
+ end
92
+
93
+ # Gives you left headers as an Array
94
+ #
95
+ # @return [Array] Return left headers as Array of Arrays. The notation is of a matrix. First rows then cols.
96
+ def left_headers
97
+ return nil if @left_headers_cols_nums.zero?
98
+ top = @left_headers_cols_nums - 1
99
+ without_top_headers.slice(0, [0, top]).to_a
100
+ end
101
+
102
+ # Gives you right headers as an Array
103
+ #
104
+ # @return [Array] Return top headers as Array of Arrays. The notation is of a matrix. First rows then cols.
105
+ def top_headers
106
+ return nil if @top_headers_rows_nums.zero?
107
+ top = @top_headers_rows_nums - 1
108
+ without_left_headers.slice([0, top], 0).to_a
109
+ end
110
+
111
+ # Gives you data as a new ReportDataResult
112
+ #
113
+ # @return [Array] Return left headers as Array of Arrays. The notation is of a matrix. First rows then cols.
114
+ def data
115
+ slice(@top_headers_rows_nums, @left_headers_cols_nums)
116
+ end
117
+
118
+ def each
119
+ to_a.each
120
+ end
121
+ alias_method :each_line, :each
122
+ alias_method :each_row, :each
123
+
124
+ def each_column
125
+ size.last.times.map do |i|
126
+ col = map { |row| row[i] }
127
+ yield(col)
128
+ end
129
+ end
130
+
131
+ # Gives you data as a new ReportDataResult
132
+ #
133
+ # @return [Array] Return left headers as Array of Arrays. The notation is of a matrix. First rows then cols.
134
+ def to_a
135
+ @data
136
+ end
137
+ alias_method :to_table, :to_a
138
+
139
+ # Gives report as a table suitable for printing out
140
+ #
141
+ # @return [String]
142
+ def to_s(options = {})
143
+ with_indices = options[:index]
144
+
145
+ a = to_table.to_a
146
+ data = a.transpose
147
+ data.unshift((1..a.length).to_a) if with_indices
148
+ processed_data = data.each_with_index.map do |col, i|
149
+ col.unshift(i.zero? ? nil : i) if with_indices # inserts row labels #
150
+ w = col.map { |cell| cell.to_s.length }.max # w = "column width" #
151
+ col.each_with_index.map do |cell, j|
152
+ j.zero? ? cell.to_s.center(w) : cell.to_s.ljust(w)
153
+ end # alligns the column #
154
+ end
155
+ processed_data.transpose.map { |row| "[#{row.join(' | ')}]" }.unshift('').join("\n")
156
+ end
157
+
158
+ # Allows to pick particular row inside the report result
159
+ #
160
+ # @return [Array] Returns a row of data
161
+ def [](index)
162
+ @data[index]
163
+ end
164
+ alias_method :row, :[]
165
+
166
+ # Allows to pick particular column inside the report result
167
+ #
168
+ # @return [Array] Returns a column of data. The column is returned transposed
169
+ def column(index)
170
+ transpose[index]
171
+ end
172
+
173
+ # Is the report without any data? This can be caused by the fact that the filters are too restrictive or data are not loaded in
174
+ #
175
+ # @return [Array] Returns true if data result is empty
176
+ def empty?
177
+ row, cols = size
178
+ row.zero? && cols.zero?
179
+ end
180
+
181
+ # Allows you to test if a report contains a row.
182
+ #
183
+ # @param [Array<String | Number>] row Row that you want to test.
184
+ # It is looking for the whole row. If the headers are getting in the way
185
+ # use #without_left_headers or #without_top_headers
186
+ # @return [Array] Returns true if data are inside a report
187
+ def include_row?(row)
188
+ @data.include?(row)
189
+ end
190
+
191
+ # Allows you to test if a report contains a column.
192
+ #
193
+ # @param [Array<String | Number>] row Row that you want to test.
194
+ # It is looking for the whole row. If the headers are getting in the way
195
+ # use #without_left_headers or #without_top_headers
196
+ # @return [Array] Returns true if data are inside a report
197
+ def include_column?(col)
198
+ transpose.include_row?(col)
199
+ end
200
+
201
+ # Returns the size of the report
202
+ #
203
+ # @return [Array<Number>] The size of the report result as an array. First element is rows second is columns
204
+ def size
205
+ [@data.size, @data.empty? ? 0 : @data.first.size]
206
+ end
207
+
208
+ # Transposes data and returns as new data result
209
+ #
210
+ # @return [GoodData::ReportDataResult] Returns new report data result with flipped columns and rows
211
+ def transpose
212
+ ReportDataResult.new(data: to_a.transpose, top: @left_headers_cols_nums, left: @top_headers_rows_nums)
213
+ end
214
+
215
+ # Gives you report result with a subset of data starting at position rows, cols
216
+ #
217
+ # @param [Number] rows Position where you want to slice your row. Currently accepts only number
218
+ # @param [Number] cols Position where you want to slice your row. Currently accepts only number
219
+ # @return [GoodData::ReportDataResult] Returns new report data result sliced data
220
+ def slice(rows, cols)
221
+ rows = rows.is_a?(Enumerable) ? rows : [rows, size.first]
222
+ cols = cols.is_a?(Enumerable) ? cols : [cols, size.last]
223
+ new_data = @data[rows.first..rows.last].map { |col| col[cols.first..cols.last] }
224
+ if client
225
+ client.create(ReportDataResult, data: new_data, top: @top_headers_rows_nums - rows.first, left: @left_headers_cols_nums - cols.first, project: project)
226
+ else
227
+ ReportDataResult.new(data: new_data, top: @top_headers_rows_nums - rows.first, left: @left_headers_cols_nums - cols.first, project: project)
228
+ end
229
+ end
230
+
231
+ # Returns the size of the the data portion of report
232
+ #
233
+ # @return [Array<Number>] The size of the report result as an array. First element is rows second is columns
234
+ def data_size
235
+ data.size
236
+ end
237
+
238
+ def ==(other)
239
+ return false if size != other.size
240
+ @data == other.to_a
241
+ end
242
+
243
+ def eq?(other)
244
+ self == other
245
+ end
246
+
247
+ # Implements subtraction. Works only on reports that have same number of columns. Gives you columns that are not in other.
248
+ #
249
+ # @param [GoodData::ReportDataResult] other The other report result
250
+ # @return [Array<Array>] Returns rows that are not contained in other
251
+ def -(other)
252
+ fail 'Seems you are not using a data result as a parameter' unless other.respond_to?(:size)
253
+ message = 'Results do not have compatible sizes. Subtracting the dataresults works row wise so you have to have the same number of columns'
254
+ fail message if size.last != other.size.last
255
+ to_a - other.to_a
256
+ end
257
+
258
+ # Implements diff. Works only on reports that have same number of columns (because it uses #- behind the scene).
259
+ #
260
+ # @param [GoodData::ReportDataResult] other The other report result
261
+ # @return [Hash] Returns a hash that gives you the differences in the report results
262
+ def diff(other)
263
+ {
264
+ added: other - self,
265
+ removed: self - other,
266
+ same: @data & other.to_a
267
+ }
268
+ end
269
+ end
270
+ end
@@ -0,0 +1,538 @@
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_relative '../rest/resource'
8
+ require_relative '../extensions/hash'
9
+ require_relative '../mixins/rest_resource'
10
+ require_relative '../helpers/global_helpers'
11
+
12
+ require_relative 'execution'
13
+
14
+ module GoodData
15
+ class Schedule < Rest::Resource
16
+ attr_reader :dirty, :json
17
+
18
+ SCHEDULE_TEMPLATE = {
19
+ :schedule => {
20
+ :type => nil,
21
+ :timezone => nil,
22
+ :params => {},
23
+ :hiddenParams => {},
24
+ # :reschedule => nil
25
+ }
26
+ }
27
+
28
+ class << self
29
+ # Looks for schedule
30
+ # @param id [String] URL, ID of schedule or :all
31
+ # @return [GoodData::Schedule|Array<GoodData::Schedule>] List of schedules
32
+ def [](id, opts = { :client => GoodData.connection, :project => GoodData.project })
33
+ c, project = GoodData.get_client_and_project(opts)
34
+
35
+ if id == :all
36
+ GoodData::Schedule.all(opts)
37
+ else
38
+ if id =~ %r{\/gdc\/projects\/[a-zA-Z\d]+\/schedules\/?[a-zA-Z\d]*}
39
+ url = id
40
+ tmp = c.get url
41
+ return c.create(GoodData::Schedule, tmp)
42
+ end
43
+
44
+ tmp = c.get "/gdc/projects/#{project.pid}/schedules/#{id}"
45
+ c.create(GoodData::Schedule, tmp, project: project)
46
+ end
47
+ end
48
+
49
+ # Returns list of all schedules for active project
50
+ # @return [Array<GoodData::Schedule>] List of schedules
51
+ def all(opts = { :client => GoodData.connection, :project => GoodData.project })
52
+ c, project = GoodData.get_client_and_project(opts)
53
+
54
+ tmp = c.get "/gdc/projects/#{project.pid}/schedules"
55
+ tmp['schedules']['items'].map { |schedule| c.create(GoodData::Schedule, schedule, project: project) }
56
+ end
57
+
58
+ # Creates new schedules from parameters passed
59
+ #
60
+ # @param process_id [String] Process ID
61
+ # @param trigger [String|GoodData::Schedule] Trigger of schedule. Can be cron string or reference to another schedule.
62
+ # @param executable [String] Execution executable
63
+ # @param options [Hash] Optional options
64
+ # @return [GoodData::Schedule] New GoodData::Schedule instance
65
+ def create(process_id, trigger, executable, options = {})
66
+ c, project = GoodData.get_client_and_project(options)
67
+
68
+ fail 'Process ID has to be provided' if process_id.blank?
69
+
70
+ is_dataload_process = Process[process_id, project: project, client: c].type == :dataload
71
+
72
+ if is_dataload_process
73
+ dataload_datasets = options[:dataload_datasets] || options['GDC_DATALOAD_DATASETS']
74
+ dataload_datasets = '[]' unless dataload_datasets
75
+
76
+ de_synchronize_all = options[:de_synchronize_all] || options['GDC_DE_SYNCHRONIZE_ALL']
77
+ else
78
+ fail 'Executable has to be provided' if executable.blank?
79
+ end
80
+ fail 'Trigger schedule has to be provided' if trigger.blank?
81
+
82
+ schedule = c.create(GoodData::Schedule, GoodData::Helpers.stringify_keys(GoodData::Helpers.deep_dup(SCHEDULE_TEMPLATE)), client: c, project: project)
83
+
84
+ params = { 'PROCESS_ID' => process_id }
85
+ if is_dataload_process
86
+ params['GDC_DATALOAD_DATASETS'] = dataload_datasets
87
+ params['GDC_DE_SYNCHRONIZE_ALL'] = de_synchronize_all if de_synchronize_all
88
+ else
89
+ params['EXECUTABLE'] = executable
90
+ end
91
+
92
+ default_opts = {
93
+ :type => 'MSETL',
94
+ :timezone => 'UTC',
95
+ :state => 'ENABLED',
96
+ :params => params,
97
+ # :reschedule => nil
98
+ }
99
+
100
+ schedule.name = options[:name]
101
+ schedule.set_trigger(trigger)
102
+ schedule.params = default_opts[:params].merge(options[:params] || {})
103
+ schedule.hidden_params = options[:hidden_params] || {}
104
+ schedule.timezone = options[:timezone] || default_opts[:timezone]
105
+ schedule.state = options[:state] || default_opts[:state]
106
+ schedule.schedule_type = options[:type] || default_opts[:type]
107
+ schedule.reschedule = options[:reschedule] if options[:reschedule]
108
+ schedule
109
+ end
110
+ end
111
+
112
+ # Initializes object from raw json
113
+ #
114
+ # @param json [Object] Raw JSON
115
+ # @return [GoodData::Schedule] New GoodData::Schedule instance
116
+ def initialize(json)
117
+ json = GoodData::Helpers.stringify_keys(json)
118
+ super
119
+ @json = json
120
+ self.params = GoodData::Helpers.decode_params(json['schedule']['params'] || {})
121
+ self.hidden_params = GoodData::Helpers.decode_params(json['schedule']['hiddenParams'] || {})
122
+ end
123
+
124
+ def after
125
+ project.schedules(trigger_id) if trigger_id
126
+ end
127
+
128
+ def after=(schedule)
129
+ fail 'After trigger has to be a schedule object' unless schedule.is_a?(Schedule)
130
+ json['schedule']['triggerScheduleId'] = schedule.obj_id
131
+ @json['schedule']['cron'] = nil
132
+ @dirty = true
133
+ end
134
+
135
+ # Deletes schedule
136
+ def delete
137
+ saved? ? client.delete(uri) : nil
138
+ end
139
+
140
+ # Disables the schedule.
141
+ #
142
+ # @return [GoodData::Schedule]
143
+ def disable
144
+ @json['schedule']['state'] = 'DISABLED'
145
+ @dirty = true
146
+ self
147
+ end
148
+
149
+ # Disables and saves the schedule.
150
+ #
151
+ # @return [Boolean]
152
+ def disable!
153
+ disable
154
+ save
155
+ end
156
+
157
+ # Is schedule disabled?
158
+ #
159
+ # @return [Boolean]
160
+ def disabled?
161
+ state == 'DISABLED'
162
+ end
163
+
164
+ # Is schedule enabled?
165
+ #
166
+ # @return [Boolean]
167
+ def enabled?
168
+ !disabled?
169
+ end
170
+
171
+ # Enables the schedule
172
+ #
173
+ # @return [GoodData::Schedule]
174
+ def enable
175
+ @json['schedule']['state'] = 'ENABLED'
176
+ @dirty = true
177
+ self
178
+ end
179
+
180
+ # Enables and saves the schedule
181
+ #
182
+ # @return [GoodData::Schedule]
183
+ def enable!
184
+ enable
185
+ save
186
+ end
187
+
188
+ # Executes schedule
189
+ #
190
+ # @param [Hash] opts execution options.
191
+ # @option opts [Boolean] :wait Wait for execution result
192
+ # @return [Object] Raw Response
193
+ def execute(opts = {})
194
+ return nil unless saved?
195
+ opts = { :wait => true }.merge(opts)
196
+ data = {
197
+ :execution => {}
198
+ }
199
+ res = client.post(execution_url, data)
200
+ execution = client.create(GoodData::Execution, res, client: client, project: project)
201
+
202
+ return execution unless opts[:wait]
203
+ execution.wait_for_result(opts)
204
+ end
205
+
206
+ # Returns execution URL
207
+ #
208
+ # @return [String] Executions URL
209
+ def execution_url
210
+ saved? ? @json['schedule']['links']['executions'] : nil
211
+ end
212
+
213
+ # Returns execution state
214
+ #
215
+ # @return [String] Execution state
216
+ def state
217
+ @json['schedule']['state']
218
+ end
219
+
220
+ def state=(a_state)
221
+ @json['schedule']['state'] = a_state
222
+ end
223
+
224
+ # Returns execution timezone
225
+ #
226
+ # @return [String] Execution timezone
227
+ def timezone
228
+ @json['schedule']['timezone']
229
+ end
230
+
231
+ # Assigns execution timezone
232
+ #
233
+ # @param new_timezone [String] Timezone to be set
234
+ def timezone=(new_timezone)
235
+ @json['schedule']['timezone'] = new_timezone
236
+ @dirty = true
237
+ end
238
+
239
+ # Returns execution type
240
+ #
241
+ # @return [String] Execution type
242
+ def type
243
+ @json['schedule']['type']
244
+ end
245
+
246
+ # Assigns execution type
247
+ #
248
+ # @param new_type [String] Execution type to be set
249
+ def type=(new_type)
250
+ @json['schedule']['type'] = new_type
251
+ @dirty = true
252
+ end
253
+
254
+ # Returns execution cron settings
255
+ #
256
+ # @return [String] Cron settings
257
+ def cron
258
+ @json['schedule']['cron']
259
+ end
260
+
261
+ # Assigns execution cron settings
262
+ #
263
+ # @param new_cron [String] Cron settings to be set
264
+ def cron=(new_cron)
265
+ @json['schedule']['cron'] = new_cron
266
+ @json['schedule']['triggerScheduleId'] = nil
267
+ @dirty = true
268
+ end
269
+
270
+ # Returns reschedule settings
271
+ #
272
+ # @return [Integer] Reschedule settings
273
+ def reschedule
274
+ @json['schedule']['reschedule']
275
+ end
276
+
277
+ # Assigns execution reschedule settings
278
+ #
279
+ # @param new_reschedule [Integer] Reschedule settings to be set
280
+ def reschedule=(new_reschedule)
281
+ @json['schedule']['reschedule'] = new_reschedule
282
+ @dirty = true
283
+ end
284
+
285
+ # Returns execution process related to this schedule
286
+ #
287
+ # @return [GoodData::Process] Process ID
288
+ def process
289
+ project.processes(process_id)
290
+ end
291
+
292
+ # Returns execution process ID
293
+ #
294
+ # @return [String] Process ID
295
+ def process_id
296
+ @json['schedule']['params']['PROCESS_ID']
297
+ end
298
+
299
+ def process_id=(new_project_id)
300
+ @json['schedule']['params']['PROCESS_ID'] = new_project_id
301
+ @dirty = true
302
+ end
303
+
304
+ # Returns execution executable
305
+ #
306
+ # @return [String] Executable (graph) name
307
+ def executable
308
+ @json['schedule']['params']['EXECUTABLE']
309
+ end
310
+
311
+ # Assigns execution executable
312
+ #
313
+ # @param new_executable [String] Executable to be set.
314
+ def executable=(new_executable)
315
+ @json['schedule']['params']['EXECUTABLE'] = new_executable
316
+ @dirty = true
317
+ end
318
+
319
+ # Returns enumerator of executions
320
+ #
321
+ # @return [Array] Raw Executions JSON
322
+ def executions
323
+ return nil unless @json
324
+ url = @json['schedule']['links']['executions']
325
+ Enumerator.new do |y|
326
+ loop do
327
+ res = client.get url
328
+ res['executions']['paging']['next']
329
+ res['executions']['items'].each do |execution|
330
+ y << client.create(Execution, execution, :project => project)
331
+ end
332
+ url = res['executions']['paging']['next']
333
+ break unless url
334
+ end
335
+ end
336
+ end
337
+
338
+ # Returns hidden_params as Hash
339
+ #
340
+ # @return [Hash] Hidden Parameters
341
+ def hidden_params
342
+ @json['schedule']['hiddenParams']
343
+ end
344
+
345
+ # Updates params by merging the current params with new ones
346
+ #
347
+ # @param params_to_merge [Hash] params
348
+ # @return [GoodData::Schedule] Returns self
349
+ def update_params(params_to_merge)
350
+ params_to_merge.each do |k, v|
351
+ set_parameter(k, v)
352
+ end
353
+ @dirty = true
354
+ self
355
+ end
356
+
357
+ # Updates hidden params by merging the current params with new ones
358
+ #
359
+ # @param params_to_merge [Hash] params
360
+ # @return [GoodData::Schedule] Returns self
361
+ def update_hidden_params(params_to_merge)
362
+ params_to_merge.each do |k, v|
363
+ set_hidden_parameter(k, v)
364
+ end
365
+ @dirty = true
366
+ self
367
+ end
368
+
369
+ # Assigns hidden parameters
370
+ #
371
+ # @param new_hidden_param [String] Hidden parameters to be set
372
+ def hidden_params=(new_hidden_params = {})
373
+ @json['schedule']['hiddenParams'] = GoodData::Helpers.stringify_values(new_hidden_params)
374
+ @dirty = true
375
+ self
376
+ end
377
+
378
+ # Returns params as Hash
379
+ #
380
+ # @return [Hash] Parameters
381
+ def params
382
+ @json['schedule']['params']
383
+ end
384
+
385
+ # Assigns execution parameters
386
+ #
387
+ # @param params [String] Params to be set
388
+ def params=(new_params = {})
389
+ default_params = {
390
+ 'PROCESS_ID' => process_id,
391
+ 'EXECUTABLE' => executable
392
+ }
393
+ @json['schedule']['params'] = default_params.merge(GoodData::Helpers.stringify_values(new_params))
394
+ @dirty = true
395
+ self
396
+ end
397
+
398
+ def rewrite_deprecated_params
399
+ params['EXECUTABLE'] = params.delete('GRAPH') if params['GRAPH']
400
+ end
401
+
402
+ # Saves object if dirty
403
+ #
404
+ # @return [Boolean] True if saved
405
+ def save
406
+ fail 'trigger schedule has to be provided' if cron.blank? && trigger_id.blank?
407
+ fail 'A timezone has to be provided' if timezone.blank?
408
+ fail 'Schedule type has to be provided' if schedule_type.blank?
409
+ rewrite_deprecated_params
410
+ if @dirty
411
+ if saved?
412
+ res = client.put(uri, to_update_payload)
413
+ @json = Schedule.new(res).json
414
+ else
415
+ res = client.post "/gdc/projects/#{project.pid}/schedules", to_update_payload
416
+ fail 'Unable to create new schedule' if res.nil?
417
+ new_obj_json = client.get res['schedule']['links']['self']
418
+ @json = Schedule.new(new_obj_json).json
419
+ end
420
+ @dirty = false
421
+ end
422
+ self
423
+ end
424
+
425
+ # Updates params at key k with val v
426
+ #
427
+ # @param k [String] key
428
+ # @param v [Object] value
429
+ # @return [GoodData::Schedule] Returns self
430
+ def set_parameter(k, v)
431
+ params[k] = v
432
+ @dirty = true
433
+ self
434
+ end
435
+
436
+ # Updates hidden params at key k with val v
437
+ #
438
+ # @param k [String] key
439
+ # @param v [Object] value
440
+ # @return [GoodData::Schedule] Returns self
441
+ def set_hidden_parameter(k, v)
442
+ hidden_params[k] = v
443
+ @dirty = true
444
+ self
445
+ end
446
+
447
+ def schedule_type
448
+ json['schedule']['type']
449
+ end
450
+
451
+ def schedule_type=(type)
452
+ json['schedule']['type'] = type
453
+ @dirty = true
454
+ self
455
+ end
456
+
457
+ def time_based?
458
+ cron != nil
459
+ end
460
+
461
+ def to_hash
462
+ {
463
+ name: name,
464
+ type: type,
465
+ state: state,
466
+ params: params,
467
+ hidden_params: hidden_params,
468
+ cron: cron,
469
+ trigger_id: trigger_id,
470
+ timezone: timezone,
471
+ uri: uri,
472
+ reschedule: reschedule,
473
+ executable: executable,
474
+ process_id: process_id
475
+ }
476
+ end
477
+
478
+ def trigger_id
479
+ json['schedule']['triggerScheduleId']
480
+ end
481
+
482
+ def trigger_id=(a_trigger)
483
+ json['schedule']['triggerScheduleId'] = a_trigger
484
+ @dirty = true
485
+ self
486
+ end
487
+
488
+ def name
489
+ json['schedule']['name']
490
+ end
491
+
492
+ def name=(name)
493
+ json['schedule']['name'] = name
494
+ @dirty = true
495
+ self
496
+ end
497
+
498
+ def set_trigger(trigger) # rubocop:disable Style/AccessorMethodName
499
+ if trigger.is_a?(String) && trigger =~ /[a-fA-Z0-9]{24}/
500
+ self.trigger_id = trigger
501
+ elsif trigger.is_a?(GoodData::Schedule)
502
+ self.trigger_id = trigger.obj_id
503
+ else
504
+ self.cron = trigger
505
+ end
506
+ end
507
+
508
+ # Returns URL
509
+ #
510
+ # @return [String] Schedule URL
511
+ def uri
512
+ @json['schedule']['links']['self'] if @json && @json['schedule'] && @json['schedule']['links']
513
+ end
514
+
515
+ def ==(other)
516
+ other.respond_to?(:uri) && other.uri == uri && other.respond_to?(:to_hash) && other.to_hash == to_hash
517
+ end
518
+
519
+ def to_update_payload
520
+ res = {
521
+ 'schedule' => {
522
+ 'name' => name,
523
+ 'type' => type,
524
+ 'state' => state,
525
+ 'timezone' => timezone,
526
+ 'cron' => cron,
527
+ 'triggerScheduleId' => trigger_id,
528
+ 'params' => GoodData::Helpers.encode_public_params(params),
529
+ 'hiddenParams' => GoodData::Helpers.encode_hidden_params(hidden_params)
530
+ }
531
+ }
532
+
533
+ res['schedule']['reschedule'] = reschedule if reschedule
534
+
535
+ res
536
+ end
537
+ end
538
+ end