gooddata 1.0.0-java

Sign up to get free protection for your applications and to get access to all the features.
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