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,268 @@
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 '../metadata'
8
+ require_relative 'metadata'
9
+
10
+ module GoodData
11
+ class Report < GoodData::MdObject
12
+ include Mixin::Lockable
13
+
14
+ class << self
15
+ # Method intended to get all objects of that type in a specified project
16
+ #
17
+ # @param options [Hash] the options hash
18
+ # @option options [Boolean] :full if passed true the subclass can decide
19
+ # to pull in full objects. This is desirable from the usability POV
20
+ # but unfortunately has negative impact on performance so it is not
21
+ # the default.
22
+ # @return [Array<GoodData::MdObject> | Array<Hash>] Return the appropriate metadata objects or their representation
23
+ def all(options = { :client => GoodData.connection, :project => GoodData.project })
24
+ query('report', Report, options)
25
+ end
26
+
27
+ def create(options = { :client => GoodData.connection, :project => GoodData.project })
28
+ client, project = GoodData.get_client_and_project(options)
29
+
30
+ title = options[:title]
31
+ fail 'Report needs a title specified' unless title
32
+ summary = options[:summary] || ''
33
+
34
+ options_rd = options.dup
35
+ options_rd.delete(:identifier)
36
+
37
+ rd = options[:rd] || ReportDefinition.create(options_rd)
38
+ rd.save
39
+
40
+ report = {
41
+ 'report' => {
42
+ 'content' => {
43
+ 'domains' => [],
44
+ 'definitions' => [rd.uri]
45
+ },
46
+ 'meta' => {
47
+ 'tags' => '',
48
+ 'deprecated' => '0',
49
+ 'summary' => summary,
50
+ 'title' => title
51
+ }
52
+ }
53
+ }
54
+ # TODO: write test for report definitions with explicit identifiers
55
+ report['report']['meta']['identifier'] = options[:identifier] if options[:identifier]
56
+ client.create(Report, report, :project => project)
57
+ end
58
+
59
+ def data_result(result, options = {})
60
+ client = options[:client]
61
+ data_result_uri = result['execResult']['dataResult']
62
+ begin
63
+ result = client.poll_on_response(data_result_uri, options) do |body|
64
+ body && body['taskState'] && body['taskState']['status'] == 'WAIT'
65
+ end
66
+ rescue RestClient::BadRequest => e
67
+ resp = JSON.parse(e.response)
68
+ if GoodData::Helpers.get_path(resp, %w(error component)) == 'MD::DataResult'
69
+ raise GoodData::UncomputableReport
70
+ else
71
+ raise e
72
+ end
73
+ end
74
+
75
+ if result.to_s.empty?
76
+ ReportDataResult.new(data: [], top: 0, left: 0)
77
+ else
78
+ ReportDataResult.from_xtab(result)
79
+ end
80
+ end
81
+ end
82
+
83
+ # Add a report definition to a report. This will show on a UI as a new version.
84
+ #
85
+ # @param report_definition [GoodData::ReportDefinition | String] Report definition to add. Either it can be a URI of a report definition or an actual report definition object.
86
+ # @return [GoodData::Report] Return self
87
+ def add_definition(report_definition)
88
+ rep_def = project.report_definitions(report_definition)
89
+ content['definitions'] = definition_uris << rep_def.uri
90
+ self
91
+ end
92
+
93
+ # Add a report definition to a report. This will show on a UI as a new version.
94
+ #
95
+ # @param report_definition [GoodData::ReportDefinition | String] Report definition to add. Either it can be a URI of a report definition or an actual report definition object.
96
+ # @return [GoodData::Report] Return self
97
+ def add_definition!(report_definition)
98
+ res = add_definition(report_definition)
99
+ res.save
100
+ end
101
+
102
+ # Returns the newest (current version) report definition as an object
103
+ #
104
+ # @return [GoodData::ReportDefinition] Returns the newest report defintion
105
+ def definition
106
+ project.report_definitions(latest_report_definition_uri)
107
+ end
108
+
109
+ alias_method :latest_report_definition, :definition
110
+
111
+ # Returns the newest (current version) report definition uri
112
+ #
113
+ # @return [String] Returns uri of the newest report defintion
114
+ def definition_uri
115
+ definition_uris.last
116
+ end
117
+
118
+ alias_method :latest_report_definition_uri, :definition_uri
119
+
120
+ # Gets a report definitions (versions) of this report as objects.
121
+ #
122
+ # @return [Array<GoodData::ReportDefinition>] Returns list of report definitions. Oldest comes first
123
+ def definitions
124
+ content['definitions'].pmap { |uri| project.report_definitions(uri) }
125
+ end
126
+ alias_method :report_definitions, :definitions
127
+
128
+ # Gets list of uris of report definitions (versions) of this report.
129
+ #
130
+ # @return [Array<String>] Returns list of report definitions' uris. Oldest comes first
131
+ def definition_uris
132
+ content['definitions']
133
+ end
134
+
135
+ # Deletes report along with its report definitions.
136
+ #
137
+ # @return [GoodData::Report] Returns self
138
+ def delete
139
+ defs = definitions
140
+ super
141
+ defs.peach(&:delete)
142
+ self
143
+ end
144
+
145
+ # Computes the report and returns the result. If it is not computable returns nil.
146
+ #
147
+ # @option options [Time] :time Force the platform to simutale the result at this time
148
+ # @return [GoodData::DataResult] Returns the result
149
+ def execute(options = {})
150
+ time = options[:time]
151
+
152
+ report_req = { 'report' => uri }
153
+ report_req['timestamp'] = time.to_i if time
154
+
155
+ fail 'You have to save the report before executing. If you do not want to do that please use GoodData::ReportDefinition' unless saved?
156
+ result = client.post "/gdc/projects/#{project.pid}/execute", 'report_req' => report_req
157
+ GoodData::Report.data_result(result, options.merge(client: client))
158
+ end
159
+
160
+ # Returns true if you can export and object
161
+ #
162
+ # @return [Boolean] Returns whether the report is exportable
163
+ def exportable?
164
+ true
165
+ end
166
+
167
+ # Returns binary data of the exported report in a given format. The format can be
168
+ # either 'csv', 'xls', 'xlsx' or 'pdf'.
169
+ #
170
+ # @return [String] Returns data
171
+ def export(format, options = {})
172
+ result = client.post("/gdc/projects/#{project.pid}/execute", 'report_req' => { 'report' => uri })
173
+ result1 = client.post('/gdc/exporter/executor', :result_req => { :format => format, :result => result })
174
+ client.poll_on_code(result1['uri'], options.merge(process: false))
175
+ end
176
+
177
+ # Exports a report too large to be computed on the UI. It executes in raw form.
178
+ # Saves the result into file.
179
+ #
180
+ # @param filename [String] Filename to save into
181
+ # @return [Net::HTTPResponse] Returns HTTP status
182
+ def export_raw(filename)
183
+ result = client.post("/gdc/app/projects/#{project.pid}/execute/raw", 'report_req' => { 'report' => uri })
184
+ client.download(result['uri'], filename, url_encode: false)
185
+ end
186
+
187
+ # Returns the newest (current version) report definition uri
188
+ #
189
+ # @return [String] Returns uri of the newest report defintion
190
+ def purge_report_of_unused_definitions!
191
+ full_list = definition_uris
192
+ remove_definition_but_latest
193
+ purged_list = definition_uris
194
+ to_remove = full_list - purged_list
195
+ save
196
+ to_remove.each { |uri| client.delete(uri) }
197
+ self
198
+ end
199
+
200
+ # Removes definition from the report. The definition to remove can be passed in any form that is accepted by
201
+ # GoodData::ReportDefintion[]
202
+ #
203
+ # @param definition [String | GoodData::ReportDefinition] Report defintion to remove
204
+ # @return [GoodData::Report] Returns report with removed definition
205
+ def remove_definition(definition)
206
+ a_def = GoodData::ReportDefinition[definition, project: project, client: client]
207
+ def_uri = a_def.uri
208
+ content['definitions'] = definition_uris.reject { |x| x == def_uri }
209
+ self
210
+ end
211
+
212
+ # TODO: Cover with test. You would probably need something that will be able to create a report easily from a definition
213
+ # Removes all definitions but the latest from the report. This is useful for cleaning up before you create
214
+ # a template out of a project.
215
+ #
216
+ # @return [GoodData::Report] Returns report with removed definitions
217
+ def remove_definition_but_latest
218
+ to_remove = definition_uris - [latest_report_definition_uri]
219
+ to_remove.each do |uri|
220
+ remove_definition(uri)
221
+ end
222
+ self
223
+ end
224
+
225
+ # Method used for replacing values in their state according to mapping.
226
+ # Can be used to replace any values but it is typically used to replace
227
+ # the URIs. Returns a new object of the same type.
228
+ #
229
+ # @param [Array<Array>]Mapping specifying what should be exchanged for what. As mapping should be used output of GoodData::Helpers.prepare_mapping.
230
+ # @return [GoodData::Report]
231
+ def replace(mapping)
232
+ new_defs = definitions.map do |rep_def|
233
+ rep_def.replace(mapping)
234
+ end
235
+ new_defs.pmap(&:save)
236
+ self
237
+ end
238
+
239
+ ## Update report definition and reflect the change in report
240
+ #
241
+ # @param [Hash] opts Options
242
+ # @option opts [Boolean] :new_definition (true) If true then new definition will be created
243
+ # @return [GoodData::ReportDefinition] Updated and saved report definition
244
+ def update_definition(opts = { :new_definition => true }, &block)
245
+ # TODO: Cache the latest report definition somehow
246
+ repdef = definition.dup
247
+
248
+ block.call(repdef, self) if block_given?
249
+
250
+ if opts[:new_definition]
251
+ new_def = GoodData::ReportDefinition.create(:client => client, :project => project)
252
+
253
+ rd = repdef.json['reportDefinition']
254
+ rd.delete('links')
255
+ %w(author uri created identifier updated contributor).each { |k| rd['meta'].delete(k) }
256
+ new_def.json['reportDefinition'] = rd
257
+ new_def.save
258
+
259
+ add_definition!(new_def)
260
+ return new_def
261
+ else
262
+ repdef.save
263
+ end
264
+
265
+ repdef
266
+ end
267
+ end
268
+ end
@@ -0,0 +1,272 @@
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 '../metadata'
8
+ require_relative 'metadata'
9
+
10
+ # GoodData Module
11
+ module GoodData
12
+ # Report Definition
13
+ # TODO: Add more doc ...
14
+ class ReportDefinition < GoodData::MdObject
15
+ class << self
16
+ # Method intended to get all objects of that type in a specified project
17
+ #
18
+ # @param options [Hash] the options hash
19
+ # @option options [Boolean] :full if passed true the subclass can decide
20
+ # to pull in full objects. This is desirable from the usability POV
21
+ # but unfortunately has negative impact on performance so it is not
22
+ # the default.
23
+ # @return [Array<GoodData::MdObject> | Array<Hash>] Return the appropriate metadata objects or their representation
24
+ def all(options = { :client => GoodData.connection, :project => GoodData.project })
25
+ query('reportDefinition', ReportDefinition, options)
26
+ end
27
+
28
+ def create_metrics_part(left, top)
29
+ stuff = Array(left) + Array(top)
30
+ stuff.select { |item| item.respond_to?(:metric?) && item.metric? }.map do |metric|
31
+ create_metric_part(metric)
32
+ end
33
+ end
34
+
35
+ alias_method :create_measures_part, :create_metrics_part
36
+
37
+ def create_metric_part(metric)
38
+ {
39
+ 'alias' => metric.title,
40
+ 'uri' => metric.uri
41
+ }
42
+ end
43
+
44
+ alias_method :create_measure_part, :create_metric_part
45
+
46
+ def create_attribute_part(attrib)
47
+ {
48
+ 'attribute' => {
49
+ 'alias' => '',
50
+ 'totals' => [],
51
+ 'uri' => attrib.uri
52
+ }
53
+ }
54
+ end
55
+
56
+ # Method creates the list of filter representaion suitable for posting on
57
+ # the api. It can currently recognize 2 types of filters. Variable filters
58
+ # and attribute filters. Method for internal usage.
59
+ #
60
+ # @param filters [GoodData::Variable|Array<Array>]
61
+ # @param options [Hash] the options hash
62
+ # @return [Array<Hash>] Returns the structure that is stored internally in the report definition and later psted on the API
63
+ def create_filters_part(filters, options = {})
64
+ project = options[:project]
65
+ vars = filters.select { |f| f.is_a?(GoodData::Variable) }.map { |v| { expression: "[#{v.uri}]" } }
66
+ category = filters.select { |f| f.is_a?(Array) }.map { |v| GoodData::SmallGoodZilla.create_category_filter(v, project) }
67
+ vars + category
68
+ end
69
+
70
+ def create_part(stuff)
71
+ stuff = Array(stuff)
72
+ parts = stuff.reduce([]) do |memo, item|
73
+ if item.respond_to?(:metric?) && item.metric?
74
+ memo
75
+ else
76
+ memo << create_attribute_part(item)
77
+ end
78
+ memo
79
+ end
80
+ if stuff.any? { |item| item.respond_to?(:metric?) && item.metric? }
81
+ parts << 'metricGroup'
82
+ end
83
+ parts
84
+ end
85
+
86
+ def find(stuff, opts = { :client => GoodData.connection, :project => GoodData.project })
87
+ _client, project = GoodData.get_client_and_project(opts)
88
+
89
+ stuff.map do |item|
90
+ obj = if item.is_a?(String)
91
+ begin
92
+ project.objects(item)
93
+ rescue RestClient::ResourceNotFound
94
+ raise "Object given by id \"#{item}\" could not be found"
95
+ end
96
+ elsif item.is_a?(Hash) && item.keys.include?(:title)
97
+ case item[:type].to_s
98
+ when 'metric'
99
+ GoodData::Metric.find_first_by_title(item[:title], opts)
100
+ when 'attribute'
101
+ GoodData::Attribute.find_first_by_title(item[:title], opts)
102
+ end
103
+ elsif item.is_a?(Hash) && (item.keys.include?(:id) || item.keys.include?(:identifier))
104
+ id = item[:id] || item[:identifier]
105
+ case item[:type].to_s
106
+ when 'metric'
107
+ project.metrics(id)
108
+ when 'attribute'
109
+ project.attributes(id)
110
+ when 'label'
111
+ projects.labels(id)
112
+ end
113
+ else
114
+ item
115
+ end
116
+ if obj.respond_to?(:attribute?) && obj.attribute?
117
+ obj.display_forms.first
118
+ else
119
+ obj
120
+ end
121
+ end
122
+ end
123
+
124
+ def execute(options = {})
125
+ left = Array(options[:left])
126
+ top = Array(options[:top])
127
+
128
+ metrics = (left + top).select { |item| item.respond_to?(:metric?) && item.metric? }
129
+
130
+ unsaved_metrics = metrics.reject(&:saved?)
131
+ unsaved_metrics.each { |m| m.title = 'Untitled metric' unless m.title }
132
+
133
+ begin
134
+ unsaved_metrics.each(&:save)
135
+ GoodData::ReportDefinition.create(options).execute
136
+ ensure
137
+ unsaved_metrics.each { |m| m.delete if m && m.saved? }
138
+ end
139
+ end
140
+
141
+ def create(options = { :client => GoodData.connection, :project => GoodData.project })
142
+ client, project = GoodData.get_client_and_project(options)
143
+
144
+ left = Array(options[:left])
145
+ top = Array(options[:top])
146
+ filters = options[:filters] || []
147
+
148
+ left = ReportDefinition.find(left, options)
149
+ top = ReportDefinition.find(top, options)
150
+
151
+ # TODO: Put somewhere for i18n
152
+ fail_msg = 'All metrics in report definition must be saved'
153
+ fail fail_msg unless (left + top).all?(&:saved?)
154
+
155
+ pars = {
156
+ 'reportDefinition' => {
157
+ 'content' => {
158
+ 'grid' => {
159
+ 'sort' => {
160
+ 'columns' => [],
161
+ 'rows' => []
162
+ },
163
+ 'columnWidths' => [],
164
+ 'columns' => ReportDefinition.create_part(top),
165
+ 'metrics' => ReportDefinition.create_metrics_part(left, top),
166
+ 'rows' => ReportDefinition.create_part(left)
167
+ },
168
+ 'format' => 'grid',
169
+ 'filters' => ReportDefinition.create_filters_part(filters, :project => project)
170
+ },
171
+ 'meta' => {
172
+ 'tags' => '',
173
+ 'summary' => '',
174
+ 'title' => 'Untitled report definition'
175
+ }
176
+ }
177
+ }
178
+ # TODO: write test for report definitions with explicit identifiers
179
+ pars['reportDefinition']['meta']['identifier'] = options[:identifier] if options[:identifier]
180
+
181
+ client.create(ReportDefinition, pars, :project => project)
182
+ end
183
+ end
184
+
185
+ def attribute_parts
186
+ cols = content['grid']['columns'] || []
187
+ rows = content['grid']['rows'] || []
188
+ items = cols + rows
189
+ items.select { |item| item.is_a?(Hash) && item.keys.first == 'attribute' }
190
+ end
191
+
192
+ def attributes
193
+ labels.map(&:attribute)
194
+ end
195
+
196
+ # Removes the color mapping from report definition
197
+ #
198
+ # @return [GoodData::ReportDefinition] Returns self
199
+ def reset_color_mapping!
200
+ global_chart_options = GoodData::Helpers.get_path(content, %w(chart styles global))
201
+ global_chart_options['colorMapping'] = [] if global_chart_options
202
+ self
203
+ end
204
+
205
+ # Return true if the report definition is a chart
206
+ #
207
+ # @return [Boolean] Return true if report definition is a chart
208
+ def chart?
209
+ !table?
210
+ end
211
+
212
+ def labels
213
+ attribute_parts.map { |part| project.labels(part['attribute']['uri']) }
214
+ end
215
+
216
+ def metric_parts
217
+ content['grid']['metrics']
218
+ end
219
+
220
+ alias_method :measure_parts, :metric_parts
221
+
222
+ def metrics
223
+ metric_parts.map { |i| project.metrics(i['uri']) }
224
+ end
225
+
226
+ def execute(opts = {})
227
+ result = if saved?
228
+ pars = {
229
+ 'report_req' => { 'reportDefinition' => uri }
230
+ }
231
+ client.post "/gdc/projects/#{project.pid}/execute", pars
232
+ else
233
+ data = {
234
+ report_req: {
235
+ definitionContent: {
236
+ content: to_hash,
237
+ projectMetadata: project.links['metadata']
238
+ }
239
+ }
240
+ }
241
+ uri = "/gdc/projects/#{project.pid}/execute"
242
+ client.post(uri, data)
243
+ end
244
+ GoodData::Report.data_result(result, opts.merge(client: client))
245
+ end
246
+
247
+ def filters
248
+ content['filters'].map { |f| f['expression'] }
249
+ end
250
+
251
+ # Method used for replacing values in their state according to mapping.
252
+ # Can be used to replace any values but it is typically used to replace
253
+ # the URIs. Returns a new object of the same type.
254
+ #
255
+ # @param [Array<Array>]Mapping specifying what should be exchanged for what. As mapping should be used output of GoodData::Helpers.prepare_mapping.
256
+ # @return [GoodData::ReportDefinition]
257
+ def replace(mapping)
258
+ x = GoodData::MdObject.replace_quoted(self, mapping)
259
+ x = GoodData::MdObject.replace_bracketed(x, mapping)
260
+ vals = GoodData::MdObject.find_replaceable_values(self, mapping)
261
+ x = GoodData::MdObject.replace_quoted(x, vals)
262
+ GoodData::MdObject.replace_bracketed(x, vals)
263
+ end
264
+
265
+ # Return true if the report definition is a table
266
+ #
267
+ # @return [Boolean] Return true if report definition is a table
268
+ def table?
269
+ content['format'] == 'grid'
270
+ end
271
+ end
272
+ end