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,441 @@
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 'multi_json'
8
+ require 'pmap'
9
+
10
+ require_relative 'project'
11
+ require_relative 'project_role'
12
+ require_relative 'user_group'
13
+
14
+ require_relative '../rest/object'
15
+
16
+ module GoodData
17
+ class Membership < Rest::Resource
18
+ attr_reader :json
19
+
20
+ ASSIGNABLE_MEMBERS = [
21
+ :email,
22
+ :first_name,
23
+ :last_name,
24
+ :login,
25
+ :phone,
26
+ :status,
27
+ :title
28
+ ]
29
+
30
+ class << self
31
+ # Apply changes to object.
32
+ #
33
+ # @param obj [GoodData::User] Object to be modified
34
+ # @param changes [Hash] Hash with modifications
35
+ # @return [GoodData::User] Modified object
36
+ # def apply(obj, changes)
37
+ # changes.each do |param, val|
38
+ # next unless ASSIGNABLE_MEMBERS.include? param
39
+ # obj.send("#{param}=", val)
40
+ # end
41
+ # obj
42
+ # end
43
+ def create(data, options = { client: GoodData.connection })
44
+ c = client(options)
45
+ json = {
46
+ 'user' => {
47
+ 'content' => {
48
+ 'email' => data[:email] || data[:login],
49
+ 'login' => data[:login],
50
+ 'firstname' => data[:first_name],
51
+ 'lastname' => data[:last_name],
52
+ 'userRoles' => ['editor'],
53
+ 'password' => data[:password],
54
+ 'domain' => data[:domain],
55
+ # And following lines are even much more ugly hack
56
+ # 'authentication_modes' => ['sso', 'password']
57
+ },
58
+ 'links' => {},
59
+ 'meta' => {}
60
+ }
61
+ }
62
+ json['user']['links']['self'] = data[:uri] if data[:uri]
63
+ c.create(self, json)
64
+ end
65
+
66
+ def diff_list(list1, list2)
67
+ GoodData::Helpers.diff(list1, list2, key: :login)
68
+ end
69
+ end
70
+
71
+ def initialize(json)
72
+ @json = json
73
+ end
74
+
75
+ # Checks objects for equality
76
+ #
77
+ # @param right [GoodData::User] Project to compare with
78
+ # @return [Boolean] True if same else false
79
+ def ==(other)
80
+ return false unless other.respond_to?(:to_hash)
81
+ to_hash == other.to_hash
82
+ # res = true
83
+ # ASSIGNABLE_MEMBERS.each do |k|
84
+ # l_val = send("#{k}")
85
+ # r_val = other.send("#{k}")
86
+ # res = false if l_val != r_val
87
+ # end
88
+ # res
89
+ end
90
+
91
+ # Checks objects for non-equality
92
+ #
93
+ # @param right [GoodData::User] Project to compare with
94
+ # @return [Boolean] True if different else false
95
+ def !=(other)
96
+ !(self == other)
97
+ end
98
+
99
+ # Apply changes to object.
100
+ #
101
+ # @param changes [Hash] Hash with modifications
102
+ # @return [GoodData::User] Modified object
103
+ # def apply(changes)
104
+ # GoodData::User.apply(self, changes)
105
+ # end
106
+
107
+ # Gets the contributor
108
+ #
109
+ # @return [String] Contributor
110
+ def contributor
111
+ url = @json['user']['meta']['contributor']
112
+ data = client.get url
113
+ client.create(GoodData::Membership, data)
114
+ end
115
+
116
+ # Gets date when created
117
+ #
118
+ # @return [DateTime] Created date
119
+ def created
120
+ Time.parse(@json['user']['meta']['created'])
121
+ end
122
+
123
+ # Is the member deleted?
124
+ #
125
+ # @return [Boolean] true if he is deleted
126
+ def deleted?
127
+ !(login =~ /^deleted-/).nil?
128
+ end
129
+
130
+ # Gets hash representing diff of users
131
+ #
132
+ # @param user [GoodData::User] Another profile to compare with
133
+ # @return [Hash] Hash representing diff
134
+ def diff(user)
135
+ GoodData::User.diff(self, user)
136
+ end
137
+
138
+ # Gets the email
139
+ #
140
+ # @return [String] Email address
141
+ def email
142
+ @json['user']['content']['email'] || ''
143
+ end
144
+
145
+ # Sets the email
146
+ #
147
+ # @param new_email [String] New email to be assigned
148
+ def email=(new_email)
149
+ @json['user']['content']['email'] = new_email
150
+ end
151
+
152
+ # Gets the first name
153
+ #
154
+ # @return [String] First name
155
+ def first_name
156
+ @json['user']['content']['firstname'] || ''
157
+ end
158
+
159
+ # Sets the first name
160
+ #
161
+ # @param new_first_name [String] New first name to be assigned
162
+ def first_name=(new_first_name)
163
+ @json['user']['content']['firstname'] = new_first_name
164
+ end
165
+
166
+ # Get full name
167
+ #
168
+ # @return String Full Name
169
+ # NOTE: This can be tricky to implement correctly for i18n
170
+ def full_name
171
+ "#{first_name} #{last_name}"
172
+ end
173
+
174
+ # Gets the invitations
175
+ #
176
+ # @return [Array<GoodData::Invitation>] List of invitations
177
+ def invitations
178
+ res = []
179
+
180
+ tmp = client.get @json['user']['links']['invitations']
181
+ tmp['invitations'].each do |_invitation|
182
+ # TODO: Something is missing here
183
+ end
184
+
185
+ res
186
+ end
187
+
188
+ # Gets the last name
189
+ #
190
+ # @return [String] Last name
191
+ def last_name
192
+ @json['user']['content']['lastname'] || ''
193
+ end
194
+
195
+ # Sets the last name
196
+ #
197
+ # @param new_last_name [String] New last name to be assigned
198
+ def last_name=(new_last_name)
199
+ @json['user']['content']['lastname'] = new_last_name
200
+ end
201
+
202
+ # Gets the login
203
+ #
204
+ # @return [String] Login
205
+ def login
206
+ @json['user']['content']['login'] || ''
207
+ end
208
+
209
+ # Sets the last name
210
+ #
211
+ # @param new_login [String] New login to be assigned
212
+ def login=(new_login)
213
+ @json['user']['content']['login'] = new_login
214
+ end
215
+
216
+ # Gets user raw object ID
217
+ #
218
+ # @return [String] Raw Object ID
219
+ def obj_id
220
+ uri.split('/').last
221
+ end
222
+
223
+ # Gets the permissions
224
+ #
225
+ # @return [Hash] Hash with permissions
226
+ def permissions
227
+ res = {}
228
+
229
+ tmp = client.get @json['user']['links']['permissions']
230
+ tmp['associatedPermissions']['permissions'].each do |permission_name, permission_value|
231
+ res[permission_name] = permission_value
232
+ end
233
+
234
+ res
235
+ end
236
+
237
+ # Gets the phone number
238
+ #
239
+ # @return [String] Phone number
240
+ def phone
241
+ @json['user']['content']['phonenumber'] || ''
242
+ end
243
+
244
+ # Sets the phone number
245
+ #
246
+ # @param new_phone_number [String] New phone number to be assigned
247
+ def phone=(new_phone_number)
248
+ @json['user']['content']['phonenumber'] = new_phone_number
249
+ end
250
+
251
+ # Gets profile of this membership
252
+ def profile
253
+ raw = client.get @json['user']['links']['self']
254
+ client.create(GoodData::Profile, raw)
255
+ end
256
+
257
+ # Gets URL of profile membership
258
+ def profile_url
259
+ @json['user']['links']['self']
260
+ end
261
+
262
+ # # Gets project which this membership relates to
263
+ # def project
264
+ # raw = client.get project_url
265
+ # client.create(GoodData::Project, raw)
266
+ # end
267
+
268
+ # Gets project id
269
+ def project_id
270
+ @json['user']['links']['roles'].split('/')[3]
271
+ end
272
+
273
+ # Gets project url
274
+ def project_url
275
+ @json['user']['links']['roles'].split('/')[0..3].join('/')
276
+ end
277
+
278
+ # Gets the projects of user
279
+ #
280
+ # @return [Array<GoodData::Project>] Array of projets
281
+ def projects
282
+ tmp = client.get @json['user']['links']['projects']
283
+ tmp['projects'].map do |project_meta|
284
+ project_uri = project_meta['project']['links']['self']
285
+ project = client.get project_uri
286
+ client.create(GoodData::Project, project)
287
+ end
288
+ end
289
+
290
+ # Gets first role
291
+ #
292
+ # @return [GoodData::ProjectRole] Array of project roles
293
+ def role
294
+ roles && roles.first
295
+ end
296
+
297
+ # Gets the project roles of user
298
+ #
299
+ # @return [Array<GoodData::ProjectRole>] Array of project roles
300
+ def roles
301
+ # TODO: Implement getting roles in project and cache them there
302
+ # See: https://jira.intgdc.com/browse/TMA-112
303
+ roles_link = GoodData::Helpers.get_path(@json, %w(user links roles))
304
+ return unless roles_link
305
+ tmp = client.get roles_link
306
+ tmp['associatedRoles']['roles'].pmap do |role_uri|
307
+ role = client.get role_uri
308
+ client.create(GoodData::ProjectRole, role)
309
+ end
310
+ end
311
+
312
+ # Gets the status
313
+ #
314
+ # @return [String] Status
315
+ def status
316
+ @json['user']['content']['status'] || ''
317
+ end
318
+
319
+ # Gets the title
320
+ #
321
+ # @return [String] User title
322
+ def title
323
+ @json['user']['meta']['title'] || ''
324
+ end
325
+
326
+ # Sets the title
327
+ #
328
+ # @param new_title [String] New title to be assigned
329
+ def title=(new_title)
330
+ @json['user']['content']['title'] = new_title
331
+ end
332
+
333
+ # Gets the date when updated
334
+ #
335
+ # @return [DateTime] Date of last update
336
+ def updated
337
+ DateTime.parse(@json['user']['meta']['updated'])
338
+ end
339
+
340
+ # Gets the object URI
341
+ #
342
+ # @return [String] Object URI
343
+ def uri
344
+ links['self']
345
+ end
346
+
347
+ # Enables membership
348
+ #
349
+ # @return [GoodData::Membership] returns self
350
+ def enable
351
+ self.status = 'ENABLED'
352
+ self
353
+ end
354
+
355
+ # Is the member enabled?
356
+ #
357
+ # @return [Boolean] true if it is enabled
358
+ def enabled?
359
+ status == 'ENABLED'
360
+ end
361
+
362
+ # Disables membership
363
+ #
364
+ # @return [GoodData::Membership] returns self
365
+ def disable
366
+ self.status = 'DISABLED'
367
+ self
368
+ end
369
+
370
+ # Is the member enabled?
371
+ #
372
+ # @return [Boolean] true if it is disabled
373
+ def disabled?
374
+ !enabled?
375
+ end
376
+
377
+ def data
378
+ data = @json || {}
379
+ data['user'] || {}
380
+ end
381
+
382
+ def name
383
+ (first_name || '') + (last_name || '')
384
+ end
385
+
386
+ def meta
387
+ data['meta'] || {}
388
+ end
389
+
390
+ def links
391
+ data['links'] || {}
392
+ end
393
+
394
+ def content
395
+ data['content'] || {}
396
+ end
397
+
398
+ def to_hash
399
+ tmp = GoodData::Helpers.symbolize_keys(content.merge(meta).merge('uri' => uri))
400
+ [
401
+ [:userRoles, :role],
402
+ [:companyName, :company_name],
403
+ [:phoneNumber, :phone_number],
404
+ [:firstname, :first_name],
405
+ [:lastname, :last_name],
406
+ [:authenticationModes, :authentication_modes]
407
+ ].each do |vals|
408
+ wire, rb = vals
409
+ tmp[rb] = tmp[wire]
410
+ tmp.delete(wire)
411
+ end
412
+ tmp
413
+ end
414
+
415
+ def user_groups
416
+ project.user_groups(:all, user: obj_id)
417
+ end
418
+
419
+ private
420
+
421
+ # Sets status to 'ENABLED' or 'DISABLED'
422
+ def status=(new_status)
423
+ payload = {
424
+ 'user' => {
425
+ 'content' => {
426
+ 'status' => new_status.to_s.upcase,
427
+ 'userRoles' => @json['user']['content']['userRoles']
428
+ },
429
+ 'links' => {
430
+ 'self' => uri
431
+ }
432
+ }
433
+ }
434
+
435
+ res = client.post("/gdc/projects/#{project_id}/users", payload)
436
+ fail 'Update failed' unless res['projectUsersUpdateResult']['failed'].empty?
437
+ @json['user']['content']['status'] = new_status.to_s.upcase
438
+ self
439
+ end
440
+ end
441
+ end
@@ -0,0 +1,324 @@
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 'multi_json'
8
+
9
+ require_relative '../core/project'
10
+
11
+ require_relative '../mixins/mixins'
12
+ require_relative '../rest/object'
13
+
14
+ module GoodData
15
+ class MdObject < Rest::Resource
16
+ MD_OBJ_CTG = 'obj'
17
+ IDENTIFIERS_CFG = 'instance-identifiers'
18
+
19
+ extend Mixin::MdIdToUri
20
+ extend Mixin::MdObjectIndexer
21
+ extend Mixin::MdObjectQuery
22
+
23
+ extend Mixin::MdFinders
24
+ extend Mixin::MdObjId
25
+
26
+ include Mixin::Links
27
+ include Mixin::ObjId
28
+ include Mixin::MdRelations
29
+ include Mixin::MdGrantees
30
+
31
+ class << self
32
+ # Method used for replacing objects like Attribute, Fact or Metric.
33
+ # It takes the object. Scans its JSON representation and returns
34
+ # a new one with object references changed according to mapping.
35
+ # The references an be found either in the object structure or in
36
+ # the MAQL in bracketed form. This implementation takes care only
37
+ # of those in bracketed form.
38
+ #
39
+ # @param obj [GoodData::MdObject] what Object that should be replaced
40
+ # @param mapping [Array[Array]] Array of mapping pairs.
41
+ # @return [GoodData::MdObject]
42
+ def replace_bracketed(obj, mapping)
43
+ replace(obj, mapping) { |e, a, b| e.gsub("[#{a}]", "[#{b}]") }
44
+ end
45
+
46
+ # Method used for replacing objects like Attribute, Fact or Metric.
47
+ # It takes the object. Scans its JSON representation and returns
48
+ # a new one with object references changed according to mapping.
49
+ # The references an be found either in the object structure or in the MAQL
50
+ # in bracketed form. This implementation takes care only of those
51
+ # in object structure where they are as a string in JSON.
52
+ #
53
+ # @param obj [GoodData::MdObject] Object that should be replaced
54
+ # @param mapping [Array[Array]] Array of mapping pairs.
55
+ # @return [GoodData::MdObject]
56
+ def replace_quoted(obj, mapping)
57
+ replace(obj, mapping) do |e, a, b|
58
+ e.gsub("\"#{a}\"", "\"#{b}\"")
59
+ end
60
+ end
61
+
62
+ # Helper method used for replacing objects like Attribute, Fact or Metric. It takes the object. Scans its JSON
63
+ # representation yields for a client to perform replacement for each mapping pair and returns a new one
64
+ # with object of the same type as obj.
65
+ #
66
+ # @param obj [GoodData::MdObject] Object that should be replaced
67
+ # @param mapping [Array[Array]] Array of mapping pairs.
68
+ # @param block [Proc] Block that receives the object state as a JSON string and mapping pair and expects a new object state as a JSON string back
69
+ # @return [GoodData::MdObject]
70
+ def replace(obj, mapping, &block)
71
+ json = mapping.reduce(obj.to_json) do |a, e|
72
+ obj_a, obj_b = e
73
+ uri_what = obj_a.respond_to?(:uri) ? obj_a.uri : obj_a
74
+ uri_for_what = obj_b.respond_to?(:uri) ? obj_b.uri : obj_b
75
+ block.call(a, uri_what, uri_for_what)
76
+ end
77
+ client = obj.client
78
+ client.create(obj.class, MultiJson.load(json), :project => obj.project)
79
+ end
80
+
81
+ # Helper method used for finding attribute elements that are interesting becuase they can be possibly
82
+ # replaced according to mapping specification. This walks through all the attribute elemets. Picks only those
83
+ # whose attribute is mentioned in the mapping. Walks through all the labels of that particular attribute and
84
+ # tries to find a value from one to be translated into a label in second. Obviously this is not guaranteed to
85
+ # find any results or in some cases can yield to incorrect results.
86
+ #
87
+ # @param obj [GoodData::MdObject] Object that should be replaced
88
+ # @param mapping [Array[Array]] Array of mapping pairs.
89
+ # @param block [Proc] Block that receives the object state as a JSON string and mapping pair and expects a new object state as a JSON string back
90
+ # @return [GoodData::MdObject]
91
+ def find_replaceable_values(obj, mapping)
92
+ values_to_replace = GoodData::SmallGoodZilla.extract_element_uri_pairs(MultiJson.dump(obj.to_json))
93
+ values_from_mapping = values_to_replace.select { |i| mapping.map { |a, _| a.uri }.include?(i.first) }
94
+ replaceable_vals = values_from_mapping.map do |a_uri, id|
95
+ from_attribute, to_attribute = mapping.find { |k, _| k.uri == a_uri }
96
+ vals = from_attribute.values_for(id)
97
+ labels = to_attribute.labels
98
+
99
+ result = nil
100
+ catch :found_value do
101
+ labels.each do |l|
102
+ vals.each do |v|
103
+ throw :found_value if result
104
+ result = begin
105
+ l.find_value_uri(v)
106
+ rescue
107
+ nil
108
+ end
109
+ end
110
+ end
111
+ end
112
+ fail "Unable to find replacement for #{a_uri}" unless result
113
+ [a_uri, id, result]
114
+ end
115
+ replaceable_vals.map { |a, id, r| ["#{a}/elements?id=#{id}", r] }
116
+ end
117
+ end
118
+
119
+ metadata_property_reader :uri, :identifier, :title, :summary, :tags, :category
120
+ metadata_property_writer :tags, :summary, :title, :identifier
121
+
122
+ def initialize(data)
123
+ @json = data.to_hash
124
+ end
125
+
126
+ def add_tag(a_tag)
127
+ self.tags = tag_set.add(a_tag).to_a.join(' ')
128
+ self
129
+ end
130
+
131
+ def delete
132
+ if saved? # rubocop:disable Style/GuardClause
133
+ client.delete(uri)
134
+ meta.delete('uri')
135
+ end
136
+ end
137
+
138
+ def reload!
139
+ @json = client.get(uri) if saved?
140
+ self
141
+ end
142
+
143
+ alias_method :refresh, :reload!
144
+
145
+ def browser_uri
146
+ client.connection.server_url + meta['uri']
147
+ end
148
+
149
+ def deprecated
150
+ meta['deprecated'] == '1' || get_flag?('deprecated')
151
+ end
152
+ alias_method :deprecated?, :deprecated
153
+
154
+ def deprecated=(flag)
155
+ if flag == '1' || flag == 1 || flag == true
156
+ meta['deprecated'] = '1'
157
+ elsif flag == '0' || flag == 0 || flag == false # rubocop:disable Style/NumericPredicate
158
+ meta['deprecated'] = '0'
159
+ else
160
+ fail 'You have to provide flag as either 1 or "1" or 0 or "0" or true/false'
161
+ end
162
+
163
+ set_flag('deprecated', flag)
164
+ end
165
+
166
+ def production
167
+ meta['isProduction'] == '1' || get_flag?('production')
168
+ end
169
+ alias_method :production?, :production
170
+
171
+ def production=(flag)
172
+ if flag
173
+ meta['isProduction'] = '1'
174
+ else
175
+ meta['isProduction'] == '0'
176
+ end
177
+
178
+ set_flag('production', flag)
179
+ end
180
+
181
+ def restricted
182
+ get_flag?('restricted')
183
+ end
184
+ alias_method :restricted?, :restricted
185
+
186
+ def restricted=(flag)
187
+ set_flag('restricted', flag)
188
+ end
189
+
190
+ def project
191
+ @project ||= Project[uri.gsub(%r{\/obj\/\d+$}, ''), :client => client]
192
+ end
193
+
194
+ # Method used for replacing objects like Attribute, Fact or Metric. Returns new object of the same type.
195
+ #
196
+ # @param [GoodData::MdObject] what Object that should be replaced
197
+ # @param [GoodData::MdObject] for_what Object it is replaced with
198
+ # @return [GoodData::Metric]
199
+ def replace(mapping)
200
+ GoodData::MdObject.replace_quoted(self, mapping)
201
+ end
202
+
203
+ # Method used for replacing objects like Attribute, Fact or Metric. Returns itself mutated.
204
+ # @param [GoodData::MdObject] what Object that should be replaced
205
+ # @param [GoodData::MdObject] for_what Object it is replaced with
206
+ # @return [GoodData::Metric]
207
+ def replace!(mapping)
208
+ x = replace(mapping)
209
+ @json = x.json
210
+ self
211
+ end
212
+
213
+ def remove_tag(a_tag)
214
+ self.tags = tag_set.delete(a_tag).to_a.join(' ')
215
+ self
216
+ end
217
+
218
+ def save
219
+ fail('Validation failed') unless validate
220
+
221
+ opts = {
222
+ :client => client,
223
+ :project => project
224
+ }
225
+
226
+ if saved?
227
+ client.put(uri, to_json)
228
+ else
229
+ explicit_identifier = meta['identifier']
230
+ # Pre-check to provide a user-friendly error rather than
231
+ # failing later
232
+ klass = self.class
233
+ if explicit_identifier && klass[explicit_identifier, opts]
234
+ fail "Identifier '#{explicit_identifier}' already in use"
235
+ end
236
+
237
+ req_uri = project.md['obj']
238
+ result = client.post(req_uri, to_json)
239
+ saved_object = self.class[result['uri'], opts]
240
+ # TODO: add test for explicitly provided identifier
241
+
242
+ @json = saved_object.json
243
+ if explicit_identifier
244
+ # Object creation API discards the identifier. If an identifier
245
+ # was explicitely provided in the origina object, we need to set
246
+ # it explicitly with an extra PUT call.
247
+ meta['identifier'] = explicit_identifier
248
+ begin
249
+ client.put(uri, to_json)
250
+ rescue => e
251
+ # Cannot change the identifier (perhaps because it's in use
252
+ # already?), cleaning up.
253
+ client.delete(uri)
254
+ raise e
255
+ end
256
+ end
257
+ end
258
+ self
259
+ end
260
+
261
+ # Saves an object with a different name
262
+ #
263
+ # @param new_title [String] New title. If not provided one is provided
264
+ # @return [GoodData::MdObject] MdObject that has been saved as
265
+ def save_as(new_title = nil)
266
+ new_title = "Clone of #{title}" if new_title.nil?
267
+ # rubocop:disable Security/MarshalLoad
268
+ dupped = Marshal.load(Marshal.dump(json))
269
+ # rubocop:enable Security/MarshalLoad
270
+ dupped[root_key]['meta'].delete('uri')
271
+ dupped[root_key]['meta'].delete('identifier')
272
+ dupped[root_key]['meta']['title'] = new_title
273
+ x = client.create(self.class, dupped, :project => project)
274
+ x.save
275
+ end
276
+
277
+ def tag_set
278
+ tags.split.to_set
279
+ end
280
+
281
+ def ==(other)
282
+ other.respond_to?(:uri) && other.uri == uri && other.respond_to?(:to_hash) && other.to_hash == to_hash
283
+ end
284
+
285
+ def listed?
286
+ !unlisted?
287
+ end
288
+
289
+ def unlisted
290
+ meta['unlisted'] == '1'
291
+ end
292
+ alias_method :unlisted?, :unlisted
293
+
294
+ def unlisted=(flag)
295
+ if flag == true
296
+ meta['unlisted'] = '1'
297
+ elsif flag == false
298
+ meta['unlisted'] = '0'
299
+ else
300
+ fail 'You have to provide flag as either true or false'
301
+ end
302
+ end
303
+
304
+ def validate
305
+ true
306
+ end
307
+
308
+ def get_flag?(flag)
309
+ meta['flags'] && meta['flags'].include?(flag)
310
+ end
311
+ alias_method :has_flag?, :get_flag?
312
+
313
+ def set_flag(flag, value)
314
+ meta['flags'] = [] unless meta['flags']
315
+
316
+ if (value == '1' || value == 1 || value == true) && !has_flag?(flag)
317
+ meta['flags'].push(flag)
318
+ meta['flags'].sort!
319
+ elsif !value && has_flag?(flag)
320
+ meta['flags'].delete(flag)
321
+ end
322
+ end
323
+ end
324
+ end