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,173 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Copyright (c) 2010-2017 GoodData Corporation. All rights reserved.
4
+ # This source code is licensed under the BSD-style license found in the
5
+ # LICENSE file in the root directory of this source tree.
6
+
7
+ module GoodData
8
+ module Model
9
+ module ToWire
10
+ # Converts anchor to wire format. There is difference between datsets that
11
+ # do not have anchor and those that do. Even if there is no acnhor you
12
+ # stil have to generate. If there is anchor it behaves exactly like am
13
+ # attribute
14
+ #
15
+ # @param project [Hash] Project blueprint hash represenation
16
+ # @param dataset [Hash] Dataset blueprint hash represenation
17
+ # @return [Hash] Manifest for a particular reference
18
+ def self.anchor_to_wire(_project, dataset)
19
+ attribute_to_wire(dataset, DatasetBlueprint.anchor(dataset))
20
+ end
21
+
22
+ # Converts atttribute to wire format.
23
+ #
24
+ # @param project [Hash] Project blueprint hash represenation
25
+ # @param dataset [Hash] Dataset blueprint hash represenation
26
+ # @return [Hash] Manifest for a particular reference
27
+ def self.attributes_to_wire(_project, dataset)
28
+ DatasetBlueprint.attributes(dataset).map do |a|
29
+ attribute_to_wire(dataset, a)
30
+ end
31
+ end
32
+
33
+ # Converts atttribute to wire format.
34
+ #
35
+ # @param dataset [Hash] Dataset blueprint hash represenation
36
+ # @param attribute [Hash] Attribute
37
+ # @return [Hash] Manifest for a particular reference
38
+ def self.attribute_to_wire(dataset, attribute)
39
+ ls = DatasetBlueprint.labels_for_attribute(dataset, attribute)
40
+ labels = ls.map do |l|
41
+ {
42
+ label: {
43
+ identifier: l[:id],
44
+ title: GoodData::Model.title(l),
45
+ type: l[:gd_type] || Model::DEFAULT_TYPE,
46
+ dataType: GoodData::Model.normalize_gd_data_type(l[:gd_data_type]) || Model::DEFAULT_ATTRIBUTE_DATATYPE
47
+ }
48
+ }
49
+ end
50
+ {}.tap do |a|
51
+ a[:attribute] = {}
52
+ a[:attribute][:identifier] = attribute[:id]
53
+ a[:attribute][:title] = Model.title(attribute)
54
+ a[:attribute][:folder] = attribute[:folder] || dataset[:folder] || GoodData::Model.title(dataset)
55
+ a[:attribute][:labels] = labels unless labels.empty?
56
+ a[:attribute][:description] = GoodData::Model.description(attribute) if GoodData::Model.description(attribute)
57
+
58
+ if attribute[:order_by]
59
+ label, direction = attribute[:order_by].split(' - ')
60
+ a[:attribute][:sortOrder] = {
61
+ attributeSortOrder: {
62
+ label: label,
63
+ direction: direction
64
+ }
65
+ }
66
+ end
67
+
68
+ if attribute[:grain]
69
+ a[:attribute][:grain] = attribute[:grain].map do |g|
70
+ case g.keys.first
71
+ when :date
72
+ { dateDimension: g.values.first }
73
+ else
74
+ g
75
+ end
76
+ end
77
+ end
78
+
79
+ if attribute[:relations]
80
+ a[:attribute][:relations] = attribute[:relations]
81
+ end
82
+
83
+ default = ls.find { |l| l[:default_label] }
84
+ a[:attribute][:defaultLabel] = (default && default[:id]) || ls.first[:id] unless ls.empty?
85
+ end
86
+ end
87
+
88
+ # Converts dataset to wire format.
89
+ #
90
+ # @param project [Hash] Project blueprint hash represenation
91
+ # @param dataset [Hash] Dataset blueprint hash represenation
92
+ # @return [Hash] Manifest for a particular reference
93
+ def self.dataset_to_wire(project, dataset)
94
+ {
95
+ dataset: {
96
+ identifier: dataset[:id],
97
+ title: GoodData::Model.title(dataset),
98
+ anchor: anchor_to_wire(project, dataset),
99
+ attributes: attributes_to_wire(project, dataset),
100
+ facts: DatasetBlueprint.facts(dataset).map { |f| fact_to_wire(dataset, f) },
101
+ references: references_to_wire(project, dataset)
102
+ }
103
+ }
104
+ end
105
+
106
+ # Converts date dimension to wire format.
107
+ #
108
+ # @param project [Hash] Project blueprint hash represenation
109
+ # @param dataset [Hash] Dataset blueprint hash represenation
110
+ # @return [Hash] Manifest for a particular reference
111
+ def self.date_dimension_to_wire(_project, dataset)
112
+ payload = {}.tap do |dd|
113
+ dd[:name] = dataset[:id]
114
+ dd[:urn] = dataset[:urn] if dataset[:urn]
115
+ dd[:title] = GoodData::Model.title(dataset)
116
+ dd[:identifierPrefix] = dataset[:identifier_prefix] if dataset[:identifier_prefix]
117
+ end
118
+ { dateDimension: payload }
119
+ end
120
+
121
+ # Converts fact to wire format.
122
+ #
123
+ # @param dataset [Hash] Dataset blueprint hash represenation
124
+ # @param fact [Hash] Fact blueprint
125
+ # @return [Hash] Manifest for a particular reference
126
+ def self.fact_to_wire(dataset, fact)
127
+ payload = {
128
+ fact: {
129
+ identifier: fact[:id],
130
+ title: GoodData::Model.title(fact),
131
+ folder: fact[:folder] || dataset[:folder] || GoodData::Model.title(dataset),
132
+ dataType: GoodData::Model.normalize_gd_data_type(fact[:gd_data_type]) || DEFAULT_FACT_DATATYPE
133
+ }
134
+ }
135
+ payload.tap do |p|
136
+ p[:fact][:description] = GoodData::Model.description(fact) if GoodData::Model.description(fact)
137
+ p[:fact][:restricted] = fact[:restricted] if fact[:restricted]
138
+ end
139
+ end
140
+
141
+ # Converts references to wire format.
142
+ #
143
+ # @param fact [Hash] Project blueprint hash represenation
144
+ # @param dataset [Hash] Dataset blueprint hash represenation
145
+ # @return [Hash] Manifest for a particular reference
146
+ def self.references_to_wire(_project, dataset)
147
+ DatasetBlueprint.references(dataset).map do |r|
148
+ r[:dataset]
149
+ end
150
+ end
151
+
152
+ # Entry method. Converts ProjectBlueprint representation into wire format
153
+ # which is understood by the API
154
+ #
155
+ # @param fact [Hash] Project blueprint represenation
156
+ # @param dataset [Hash] Dataset blueprint hash represenation
157
+ # @return [Hash] Manifest for a particular reference
158
+ def self.to_wire(what)
159
+ {
160
+ diffRequest: {
161
+ targetModel: {
162
+ projectModel: {
163
+ modelMetadata: { containCA: what[:include_ca] },
164
+ datasets: (what[:datasets] || []).map { |d| dataset_to_wire(what, d) },
165
+ dateDimensions: (what[:date_dimensions] || []).map { |d| date_dimension_to_wire(what, d) }
166
+ }
167
+ }
168
+ }
169
+ }
170
+ end
171
+ end
172
+ end
173
+ end
@@ -0,0 +1,112 @@
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
+
9
+ module GoodData
10
+ class ChannelConfiguration < Rest::Resource
11
+ CHANNEL_CONFIGURATION_PATH = '/gdc/account/profile/%s/channelConfigurations'
12
+
13
+ EMPTY_OBJECT = {
14
+ 'channelConfiguration' => {
15
+ 'configuration' => {
16
+ 'emailConfiguration' => {
17
+ 'to' => ''
18
+ }
19
+ },
20
+ 'meta' => {
21
+ 'title' => ''
22
+ }
23
+ }
24
+ }
25
+
26
+ attr_accessor :title, :to
27
+
28
+ class << self
29
+ def [](id = :all, opts = { client: GoodData.connection })
30
+ c = GoodData.get_client(opts)
31
+
32
+ uri = CHANNEL_CONFIGURATION_PATH % c.user.account_setting_id
33
+ if id == :all
34
+ data = c.get uri
35
+ data['channelConfigurations']['items'].map { |channel_data| c.create(ChannelConfiguration, channel_data) }
36
+ else
37
+ c.create(ChannelConfiguration, c.get("#{uri}/#{id}"))
38
+ end
39
+ end
40
+
41
+ def all(opts = { client: GoodData.connection })
42
+ ChannelConfiguration[:all, opts]
43
+ end
44
+
45
+ def create(opts = { client: GoodData.connection })
46
+ c = GoodData.get_client(opts)
47
+
48
+ options = { to: c.user.email, title: c.user.email }.merge(opts)
49
+ existing_channel = all.find { |channel| channel.to == options[:to] }
50
+ return existing_channel if existing_channel
51
+
52
+ channel = create_object(options)
53
+ channel.save
54
+ channel
55
+ end
56
+
57
+ def create_object(data = {})
58
+ c = GoodData.get_client(data)
59
+
60
+ new_data = GoodData::Helpers.deep_dup(EMPTY_OBJECT).tap do |d|
61
+ d['channelConfiguration']['configuration']['emailConfiguration']['to'] = data[:to]
62
+ d['channelConfiguration']['meta']['title'] = data[:title]
63
+ end
64
+
65
+ c.create(ChannelConfiguration, new_data)
66
+ end
67
+ end
68
+
69
+ # Initializes object instance from raw wire JSON
70
+ #
71
+ # @param json Json used for initialization
72
+ def initialize(json)
73
+ super
74
+ @json = json
75
+ @to = data['configuration']['emailConfiguration']['to']
76
+ @title = data['meta']['title']
77
+ end
78
+
79
+ def save
80
+ response = if uri
81
+ data_to_send = GoodData::Helpers.deep_dup(raw_data).tap do |d|
82
+ d['channelConfiguration']['configuration']['emailConfiguration']['to'] = to
83
+ d['channelConfiguration']['meta']['title'] = title
84
+ end
85
+ client.put(uri, data_to_send)
86
+ else
87
+ client.post(CHANNEL_CONFIGURATION_PATH % client.user.account_setting_id, raw_data)
88
+ end
89
+ @json = client.get response['channelConfiguration']['meta']['uri']
90
+ self
91
+ end
92
+
93
+ def delete
94
+ client.delete uri
95
+ end
96
+
97
+ def uri
98
+ data['meta']['uri'] if data && data['meta'] && data['meta']['uri']
99
+ end
100
+
101
+ def obj_id
102
+ uri.split('/').last
103
+ end
104
+
105
+ alias_method :channel_id, :obj_id
106
+
107
+ def ==(other)
108
+ return false unless [:to, :title].all? { |m| other.respond_to?(m) }
109
+ @to == other.to && @title == other.title
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,236 @@
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
+
9
+ require_relative '../mixins/data_property_reader'
10
+ require_relative '../mixins/links'
11
+ require_relative '../mixins/rest_resource'
12
+ require_relative '../mixins/uri_getter'
13
+
14
+ module GoodData
15
+ class Client < Rest::Resource
16
+ data_property_reader 'id'
17
+
18
+ attr_accessor :domain
19
+
20
+ include Mixin::Links
21
+ include Mixin::UriGetter
22
+
23
+ CLIENT_TEMPLATE = {
24
+ client: {
25
+ id: nil,
26
+ segment: nil,
27
+ project: nil
28
+ }
29
+ }
30
+
31
+ class << self
32
+ def [](id, opts = {})
33
+ domain = opts[:domain]
34
+ segment = opts[:segment]
35
+ fail ArgumentError, 'No :domain specified' if domain.nil?
36
+ client = domain.client
37
+ fail ArgumentError, 'No client specified' if client.nil?
38
+ data_product = opts[:data_product] || (segment ? segment.data_product : nil)
39
+
40
+ if id == :all
41
+ tenants_uri = base_uri(domain, data_product)
42
+ tenants_uri += "?segment=#{CGI.escape(segment.segment_id)}" if segment
43
+ Enumerator.new do |y|
44
+ loop do
45
+ res = client.get tenants_uri
46
+ res['clients']['paging']['next']
47
+ res['clients']['items'].each do |i|
48
+ p = i['client']['project']
49
+ tenant = client.create(GoodData::Client, i.merge('domain' => domain))
50
+ tenant.project = p
51
+ y << tenant
52
+ end
53
+ url = res['clients']['paging']['next']
54
+ break unless url
55
+ end
56
+ end
57
+ else
58
+ id = id.respond_to?(:client_id) ? id.client_id : id
59
+ tenant_uri = base_uri(domain, data_product)
60
+ data = client.get(tenant_uri + "/#{CGI.escape(id)}")
61
+ client.create(GoodData::Client, data.merge('domain' => domain))
62
+ end
63
+ end
64
+
65
+ # Creates new client from parameters passed.
66
+ #
67
+ # Should not be called directly. Use GoodData::Segment#create_client.
68
+ #
69
+ # @param data [Hash] Data required to create the client
70
+ # @option data id [String]
71
+ # @option data project [GoodData::Project]
72
+ # @param options [Hash] Options
73
+ # @option options segment [GoodData::Segment]
74
+ # @option options client [GoodData::Rest::Client]
75
+ # @return [GoodData::Client] New GoodData::Client instance
76
+ def create(data, options)
77
+ segment = options[:segment]
78
+ domain = segment.domain
79
+ tenant = client.create(GoodData::Client, GoodData::Helpers.stringify_keys(CLIENT_TEMPLATE.merge(domain: domain)), domain: domain)
80
+ tenant.tap do |s|
81
+ s.project = data[:project]
82
+ s.client_id = data[:id]
83
+ s.segment = segment.uri
84
+ end
85
+ end
86
+ alias_method :associate, :create
87
+
88
+ def update_setting(name, value, opts = {})
89
+ return nil unless value
90
+ domain = opts[:domain]
91
+ client_id = opts[:client_id]
92
+ data_product_id = opts[:data_product_id]
93
+ uri = data_product_id ? GoodData::DataProduct::ONE_DATA_PRODUCT_PATH % { domain_name: domain.name, id: data_product_id } : domain.segments_uri
94
+ body = {
95
+ setting: {
96
+ name: "#{name}",
97
+ value: "#{value}"
98
+ }
99
+ }
100
+ domain.client.put(uri + "/clients/#{client_id}/settings/#{name}", body)
101
+ nil
102
+ end
103
+ alias_method :add_setting, :update_setting
104
+
105
+ def base_uri(domain, data_product)
106
+ if data_product
107
+ uri = GoodData::DataProduct::ONE_DATA_PRODUCT_PATH % { domain_name: domain.name, id: data_product.data_product_id }
108
+ else
109
+ uri = domain.segments_uri
110
+ end
111
+ uri + '/clients'
112
+ end
113
+ end
114
+
115
+ def initialize(data)
116
+ super(data)
117
+ @domain = data.delete('domain')
118
+ @json = data
119
+ end
120
+
121
+ # Segment id getter for the Segment. Called segment_id since id is a reserved word in ruby world
122
+ #
123
+ # @return [String] Segment id
124
+ def client_id
125
+ data['id']
126
+ end
127
+
128
+ def client_id=(a_name)
129
+ data['id'] = a_name
130
+ self
131
+ end
132
+
133
+ # Setter for the project this client has set
134
+ #
135
+ # @param a_project [String|GoodData::Project] Id or an instance of a project
136
+ # @return [GoodData::Cliet] Returns the instance of the client
137
+ def project=(a_project)
138
+ data['project'] = a_project.respond_to?(:uri) ? a_project.uri : a_project
139
+ self
140
+ end
141
+
142
+ # Project URI this client has set
143
+ #
144
+ # @return [String] Returns the URI of the project this client has set
145
+ def project_uri
146
+ data['project']
147
+ end
148
+
149
+ # Project this client has set
150
+ #
151
+ # @return [GoodData::Project] Returns the instance of the client's project
152
+ def project
153
+ client.projects(project_uri) if project?
154
+ end
155
+
156
+ # Returns boolean if client has a project provisioned
157
+ #
158
+ # @return [Boolean] Returns true if client has a project provisioned. False otherwise
159
+ def project?
160
+ project_uri != nil
161
+ end
162
+
163
+ # Reloads the client from the URI
164
+ #
165
+ # @return [GoodData::Client] Returns the updated client object
166
+ def reload!
167
+ res = client.get(uri)
168
+ @json = res
169
+ self
170
+ end
171
+
172
+ # Segment id setter which this client is connected to.
173
+ #
174
+ # @param a_segment [String] Id of the segment.
175
+ # @return [GoodData::Client] Returns the instance of the client
176
+ def segment=(a_segment)
177
+ data['segment'] = a_segment.respond_to?(:uri) ? a_segment.uri : a_segment
178
+ self
179
+ end
180
+
181
+ # Segment this client is connected to.
182
+ #
183
+ # @return [GoodData::Segment] Segment
184
+ def segment
185
+ segment_res = client.get(data['segment'])
186
+ client.create(GoodData::Segment, segment_res)
187
+ end
188
+
189
+ # Segment URI this client is connected to.
190
+ #
191
+ # @return [String] Segment URI
192
+ def segment_uri
193
+ data['segment']
194
+ end
195
+
196
+ # Creates or updates a client instance on the API.
197
+ #
198
+ # @return [GoodData::Client] Client instance
199
+ def save
200
+ if uri
201
+ client.put(uri, json)
202
+ else
203
+ data_product = segment.data_product
204
+ res = client.post(self.class.base_uri(domain, data_product), json)
205
+ @json = res
206
+ end
207
+ self
208
+ end
209
+
210
+ # Deletes a client instance on the API.
211
+ #
212
+ # @return [GoodData::Client] Segment instance
213
+ def delete
214
+ project.delete if project && !project.deleted?
215
+ dissociate
216
+ end
217
+
218
+ # Deletes a client but maintain their project
219
+ def dissociate
220
+ client.delete(uri) if uri
221
+ end
222
+
223
+ def settings
224
+ data_product = segment.data_product
225
+ res = client.get(self.class.base_uri(domain, data_product) + "/#{client_id}/settings")
226
+ settings = GoodData::Helpers.get_path(res, %w(settingsList items))
227
+ settings.map do |setting|
228
+ setting = setting['setting']
229
+ {
230
+ name: setting['name'],
231
+ value: setting['value']
232
+ }
233
+ end
234
+ end
235
+ end
236
+ end