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,100 @@
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 'gooddata/models/segment'
8
+ require 'securerandom'
9
+
10
+ describe GoodData::Segment do
11
+ before(:all) do
12
+ @client = ConnectionHelper.create_default_connection
13
+ @domain = @client.domain(ConnectionHelper::DEFAULT_DOMAIN)
14
+ end
15
+
16
+ before(:each) do
17
+ @uuid = SecureRandom.uuid
18
+ @master_project = @client.create_project(title: "Test MASTER project for #{@uuid}", auth_token: ConnectionHelper::GD_PROJECT_TOKEN)
19
+ @segment_name = "segment-#{@uuid}"
20
+ @segment = @domain.create_segment(segment_id: @segment_name, master_project: @master_project)
21
+ end
22
+
23
+ after(:each) do
24
+ @master_project.delete if @master_project
25
+ @segment && @segment.delete(force: true)
26
+ end
27
+
28
+ after(:all) do
29
+ @client.disconnect
30
+ end
31
+
32
+ describe '#[]' do
33
+ it 'Returns all segments when :all passed' do
34
+ res = @domain.segments
35
+ expect(res).to be_an_instance_of(Array)
36
+ end
37
+
38
+ it 'Returns specific segment when segment ID passed' do
39
+ s = @domain.segments(@segment_name)
40
+ expect(@segment.uri).to eq s.uri
41
+ expect(s).to be_an_instance_of(GoodData::Segment)
42
+ expect(@segment).to be_an_instance_of(GoodData::Segment)
43
+ end
44
+ end
45
+
46
+ describe '#delete' do
47
+ it 'Deletes particular segment' do
48
+ old_count = @domain.segments.count
49
+ s = @domain.segments(@segment_name)
50
+ s.delete
51
+ expect(@domain.segments.length).to eq(old_count - 1)
52
+ # prevent delete attempt in the after hook
53
+ @segment = nil
54
+ end
55
+ end
56
+
57
+ describe '#save' do
58
+ after do
59
+ @different_master.delete if @different_master
60
+ @different_data_product.delete if @different_data_product
61
+ end
62
+
63
+ it 'can update a segment master project' do
64
+ @different_master = @client.create_project(title: 'Test project', auth_token: ConnectionHelper::GD_PROJECT_TOKEN)
65
+ @segment.master_project = @different_master
66
+ @segment.save
67
+ @segment = @domain.segments(@segment_name)
68
+ expect(@segment.master_project_uri).not_to eq @master_project.uri
69
+ expect(@segment.master_project_uri).to eq @different_master.uri
70
+ end
71
+
72
+ it 'cannot update a segment id' do
73
+ @segment.segment_id = 'different_id'
74
+ expect do
75
+ @segment.save
76
+ end.to raise_error RestClient::BadRequest
77
+ end
78
+ end
79
+
80
+ describe '#create_client' do
81
+ after do
82
+ @client_project && @client_project.delete
83
+ @segment_client && @segment_client.delete
84
+ end
85
+
86
+ it 'can create a new client in a segment' do
87
+ @client_project = @client.create_project(title: 'client_1 project', auth_token: ConnectionHelper::GD_PROJECT_TOKEN)
88
+ @segment_client = @segment.create_client(id: 'tenant_1', project: @client_project)
89
+ expect(@segment_client).to be_an_instance_of(GoodData::Client)
90
+ expect(@segment.clients.count).to eq 1
91
+ end
92
+ end
93
+
94
+ describe '#provision_client_projects' do
95
+ it 'returns an enumerable result' do
96
+ result = @segment.provision_client_projects
97
+ expect(result).to be_an_instance_of(Enumerator)
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,88 @@
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 'gooddata'
8
+
9
+ describe GoodData::Subscription, :constraint => 'slow' do
10
+ before(:all) do
11
+ @client = ConnectionHelper.create_default_connection
12
+ @channel = GoodData::ChannelConfiguration.create(client: @client)
13
+ subscriptions = GoodData::Subscription.all(project: ProjectHelper::PROJECT_ID, client: @client)
14
+ subscriptions.each(&:delete)
15
+ end
16
+
17
+ after(:all) do
18
+ @channel && @channel.delete
19
+ @client && @client.disconnect
20
+ end
21
+
22
+ it 'should be able to create a subscription' do
23
+ begin
24
+ subscription = GoodData::Subscription.create(
25
+ client: @client,
26
+ project: ProjectHelper::PROJECT_ID,
27
+ channels: @channel,
28
+ message: 'hello world',
29
+ process: ProcessHelper::PROCESS_ID,
30
+ project_events: GoodData::Subscription::PROCESS_SUCCESS_EVENT
31
+ )
32
+ expect(subscription.title).to eq ConnectionHelper::DEFAULT_USERNAME
33
+ expect(subscription.channels).to eq [@channel.uri]
34
+ expect(subscription.message).to eq 'hello world'
35
+ expect(subscription.process).to eq ProcessHelper::PROCESS_ID
36
+ expect(subscription.project_events).to eq [GoodData::Subscription::PROCESS_SUCCESS_EVENT]
37
+ ensure
38
+ subscription && subscription.delete
39
+ end
40
+ end
41
+
42
+ it 'should be able to edit a subscription' do
43
+ begin
44
+ subscription = GoodData::Subscription.create(
45
+ client: @client,
46
+ project: ProjectHelper::PROJECT_ID,
47
+ channels: @channel,
48
+ process: ProcessHelper::PROCESS_ID,
49
+ project_events: GoodData::Subscription::PROCESS_SUCCESS_EVENT
50
+ )
51
+ expect(subscription.title).to eq ConnectionHelper::DEFAULT_USERNAME
52
+
53
+ subscription.title = 'My title'
54
+ subscription.save
55
+
56
+ expect(GoodData::Subscription[subscription.subscription_id, project: ProjectHelper::PROJECT_ID, client: @client].title).to eq 'My title'
57
+ ensure
58
+ subscription && subscription.delete
59
+ end
60
+ end
61
+
62
+ it 'should be able to list all subscriptions' do
63
+ begin
64
+ expect(GoodData::Subscription.all(project: ProjectHelper::PROJECT_ID, client: @client)).to eq []
65
+ subscription = GoodData::Subscription.create(
66
+ client: @client,
67
+ project: ProjectHelper::PROJECT_ID,
68
+ channels: @channel,
69
+ process: ProcessHelper::PROCESS_ID,
70
+ project_events: GoodData::Subscription::PROCESS_SUCCESS_EVENT
71
+ )
72
+ expect(GoodData::Subscription.all(project: ProjectHelper::PROJECT_ID, client: @client)).to eq [subscription]
73
+ ensure
74
+ subscription && subscription.delete
75
+ end
76
+ end
77
+
78
+ it 'should be able to delete a subscription' do
79
+ subscription = GoodData::Subscription.create(
80
+ client: @client,
81
+ project: ProjectHelper::PROJECT_ID,
82
+ channels: @channel,
83
+ process: ProcessHelper::PROCESS_ID,
84
+ project_events: GoodData::Subscription::PROCESS_SUCCESS_EVENT
85
+ )
86
+ subscription.delete
87
+ end
88
+ end
@@ -0,0 +1,53 @@
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 'gooddata'
8
+
9
+ describe "Blueprint now support urn in date dimension", :constraint => 'slow' do
10
+ before(:all) do
11
+ @client = ConnectionHelper.create_default_connection
12
+
13
+ @blueprint = GoodData::Model::ProjectBlueprint.build("My project from blueprint") do |p|
14
+ p.add_date_dimension('created_on', urn: 'urn:pe:date')
15
+ end
16
+ end
17
+
18
+ after(:all) do
19
+ @client && @client.disconnect
20
+ end
21
+
22
+ context 'project creates from blueprint contains urn in date dimension' do
23
+ before(:all) do
24
+ @project = @client.create_project_from_blueprint(@blueprint, token: ConnectionHelper::GD_PROJECT_TOKEN, environment: ProjectHelper::ENVIRONMENT)
25
+ end
26
+
27
+ after(:all) do
28
+ @project && @project.delete
29
+ end
30
+
31
+ it 'should have urn in date dimension' do
32
+ expect(@project.datasets.find(&:date_dimension?).content['urn']).to eq 'urn:pe:date'
33
+ end
34
+
35
+ it 'blueprint contains urn in date dimension' do
36
+ expect(@project.blueprint.date_dimensions.first.urn).to eq 'urn:pe:date'
37
+ end
38
+ end
39
+
40
+ context 'merging blueprint' do
41
+ before do
42
+ @new_bp = GoodData::Model::ProjectBlueprint.build("update") do |p|
43
+ p.add_date_dimension('created_on', urn: 'urn:stonegate:date')
44
+ end
45
+
46
+ @blueprint = @blueprint.merge(@new_bp)
47
+ end
48
+
49
+ it 'update urn' do
50
+ expect(@blueprint.date_dimensions.first.urn).to eq 'urn:stonegate:date'
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,306 @@
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 'gooddata'
8
+
9
+ describe "User filters implementation", :constraint => 'slow' do
10
+ before(:all) do
11
+ @spec = JSON.parse(File.read("./spec/data/blueprints/test_project_model_spec.json"), :symbolize_names => true)
12
+ @client = ConnectionHelper.create_default_connection
13
+ blueprint = GoodData::Model::ProjectBlueprint.new(@spec)
14
+ @project = @client.create_project_from_blueprint(blueprint, :token => ConnectionHelper::GD_PROJECT_TOKEN, environment: ProjectHelper::ENVIRONMENT)
15
+ @domain = @client.domain(ConnectionHelper::DEFAULT_DOMAIN)
16
+
17
+ @label = GoodData::Attribute.find_first_by_title('Dev', client: @client, project: @project).label_by_name('email')
18
+
19
+ commits_data = [
20
+ %w(lines_changed committed_on dev_id repo_id),
21
+ [1, "01/01/2014", 1, 1],
22
+ [3, "01/02/2014", 2, 2],
23
+ [5, "05/02/2014", 3, 1],
24
+ [6, "05/02/2014", 1, 2]
25
+ ]
26
+ @project.upload(commits_data, blueprint, 'dataset.commits')
27
+
28
+ devs_data = [
29
+ %w(dev_id email),
30
+ [1, "tomas@gooddata.com"],
31
+ [2, "petr@gooddata.com"],
32
+ [3, "jirka@gooddata.com"]
33
+ ]
34
+ @project.upload(devs_data, blueprint, 'dataset.devs')
35
+
36
+ repos_data = [
37
+ %w(repo_id repo_name),
38
+ [1, "goodot"],
39
+ [2, "bam"],
40
+ [3, "infra"]
41
+ ]
42
+ @project.upload(repos_data, blueprint, 'dataset.repos')
43
+ end
44
+
45
+ after(:all) do
46
+ @project.delete if @project
47
+ end
48
+
49
+ after(:each) do
50
+ @project.data_permissions.pmap(&:delete)
51
+ end
52
+
53
+ it "should create a mandatory user filter" do
54
+ filters = [[ConnectionHelper::DEFAULT_USERNAME, @label.uri, 'tomas@gooddata.com', 'jirka@gooddata.com']]
55
+
56
+ metric = @project.create_metric("SELECT SUM(#\"Lines Changed\")", :title => 'x')
57
+ # [jirka@gooddata.com | petr@gooddata.com | tomas@gooddata.com]
58
+ # [5.0 | 3.0 | 1.0 ]
59
+
60
+ expect(metric.execute).to eq(15)
61
+ @project.add_data_permissions(filters)
62
+ expect(metric.execute).to eq(12)
63
+ r = @project.compute_report(left: [metric], top: [@label.attribute])
64
+ expect(r.include_column?(['tomas@gooddata.com', 7])).to be_truthy
65
+ expect(r.include_column?(['jirka@gooddata.com', 5])).to be_truthy
66
+ expect(r.include_column?(['petr@gooddata.com', 3])).to be_falsy
67
+
68
+ # should not re-create the same MUF for the same user
69
+ result = @project.add_data_permissions(filters, dry_run: true)
70
+ expect(result[:created].count).to eq 0
71
+ expect(result[:deleted].count).to eq 0
72
+ end
73
+
74
+ it "should return errors when asked to set a user not in project. Some filters are set up though." do
75
+ filters = [
76
+ ['nonexistent_user@gooddata.com', @label.uri, "tomas@gooddata.com"],
77
+ [ConnectionHelper::DEFAULT_USERNAME, @label.uri, "tomas@gooddata.com"]
78
+ ]
79
+ results = @project.add_data_permissions(filters)
80
+ expect(results[:results].any? { |r| r[:status] == :failed }).to be_truthy
81
+ expect(@project.data_permissions.count).to eq 2
82
+ end
83
+
84
+ it "should pass and set users that are in the projects" do
85
+ filters = [
86
+ [ConnectionHelper::DEFAULT_USERNAME, @label.uri, "tomas@gooddata.com"]
87
+ ]
88
+ @project.add_data_permissions(filters)
89
+ expect(@project.data_permissions.count).to eq 1
90
+ end
91
+
92
+ it "should pass and set only users that are in the projects if asked" do
93
+ filters = [
94
+ ['nonexistent_user@gooddata.com', @label.uri, 'tomas@gooddata.com'],
95
+ [ConnectionHelper::DEFAULT_USERNAME, @label.uri, 'tomas@gooddata.com']
96
+ ]
97
+ # note that filters will be set up even for nonexistent users but they will not be assigned
98
+ @project.add_data_permissions(filters, users_must_exist: false)
99
+ expect(@project.data_permissions.select(&:related_uri).count).to eq 1
100
+ expect(@project.data_permissions.select(&:related_uri).first.pretty_expression).to eq "[Dev] IN ([tomas@gooddata.com])"
101
+ end
102
+
103
+ it "should fail when asked to set a value not in the project" do
104
+ filters = [
105
+ [ConnectionHelper::DEFAULT_USERNAME, @label.uri, '%^&*( nonexistent value', 'tomas@gooddata.com']
106
+ ]
107
+ expect do
108
+ @project.add_data_permissions(filters)
109
+ end.to raise_error
110
+ begin
111
+ @project.add_data_permissions(filters)
112
+ rescue GoodData::FilterMaqlizationError => e
113
+ expect(e.errors.count).to eq 1
114
+ end
115
+ expect(@project.data_permissions.count).to eq 0
116
+ end
117
+
118
+ it 'should fail but return all values if specified' do
119
+ domain = @client.domain(ConnectionHelper::DEFAULT_DOMAIN)
120
+ u = domain.users.find { |user| user.login != ConnectionHelper::DEFAULT_USERNAME }
121
+ filters = [
122
+ [ConnectionHelper::DEFAULT_USERNAME, @label.uri, '%^&*( nonexistent value', 'tomas@gooddata.com'],
123
+ [u.login, @label.uri, '%^&*( other nonexistent value', 'jirka@gooddata.com']
124
+ ]
125
+ expect do
126
+ @project.add_data_permissions(filters, fail_early: false)
127
+ end.to raise_error
128
+ begin
129
+ @project.add_data_permissions(filters, fail_early: false)
130
+ rescue GoodData::FilterMaqlizationError => e
131
+ expect(e.errors.count).to eq 2
132
+ end
133
+ expect(@project.data_permissions.count).to eq 0
134
+ end
135
+
136
+ it 'should drop the filter when none of filter values is found' do
137
+ filters = [[ConnectionHelper::DEFAULT_USERNAME, @label.uri, '%^&*( nonexistent value']]
138
+ @project.add_data_permissions(filters, ignore_missing_values: true)
139
+ expect(@project.data_permissions.count).to eq 0
140
+ end
141
+
142
+ it "should add a filter with nonexistent values when asked" do
143
+ filters = [[ConnectionHelper::DEFAULT_USERNAME, @label.uri, '%^&*( nonexistent value', 'jirka@gooddata.com']]
144
+ @project.add_data_permissions(filters, ignore_missing_values: true)
145
+
146
+ expect(@project.data_permissions.pmap(&:pretty_expression)).to eq ["[Dev] IN ([jirka@gooddata.com])"]
147
+ expect(@project.data_permissions.count).to eq 1
148
+ end
149
+
150
+ it "should be able to add mandatory filter to a user not in the project if domain is provided" do
151
+ domain = @client.domain(ConnectionHelper::DEFAULT_DOMAIN)
152
+ u = domain.users.find { |user| user.login != ConnectionHelper::DEFAULT_USERNAME }
153
+
154
+ filters = [[u.login, @label.uri, "tomas@gooddata.com"]]
155
+ @project.add_data_permissions(filters)
156
+ filters = @project.data_permissions
157
+ expect(filters.first.related.login).to eq u.login
158
+ expect(filters.select(&:related_uri).count).to eq 1
159
+ expect(filters.first.pretty_expression).to eq "[Dev] IN ([tomas@gooddata.com])"
160
+ end
161
+
162
+ it "should be able to print data permissions in a human readable form" do
163
+ filters = [[ConnectionHelper::DEFAULT_USERNAME, @label.uri, "tomas@gooddata.com"]]
164
+ @project.add_data_permissions(filters)
165
+ perms = @project.data_permissions
166
+ pretty = perms.pmap { |f| [f.related.login, f.pretty_expression] }
167
+ expect(perms.first.related).to eq @client.user
168
+ expect(pretty).to eq [[ConnectionHelper::DEFAULT_USERNAME, "[Dev] IN ([tomas@gooddata.com])"]]
169
+ end
170
+
171
+ it "sets up mandatory users based on the state given as an end state by default." do
172
+ # first let's prepare some user filters
173
+ user_with_already_set_up_filter = @project.get_user(ConnectionHelper::DEFAULT_USERNAME)
174
+
175
+ filters = [
176
+ [user_with_already_set_up_filter.login, @label.uri, "tomas@gooddata.com"]
177
+ ]
178
+ @project.add_data_permissions(filters)
179
+ expect(@project.data_permissions.map { |f| [f.related.login, f.pretty_expression] })
180
+ .to eq [[ConnectionHelper::DEFAULT_USERNAME, "[Dev] IN ([tomas@gooddata.com])"]]
181
+
182
+ # Now let's add user filter to a different user. If we do not explicitely state that
183
+ # user_with_already_set_up_filter should keep his filter it will be removed
184
+ another_user = @domain.users.find { |u| u.login != ConnectionHelper::DEFAULT_USERNAME }
185
+ @project.add_user(another_user, 'Admin', domain: @domain)
186
+ new_filters = [
187
+ [another_user.login, @label.uri, "tomas@gooddata.com"]
188
+ ]
189
+ @project.add_data_permissions(new_filters)
190
+ expect(@project.data_permissions.map { |f| [f.related.login, f.pretty_expression] })
191
+ .to eq [[another_user.login, "[Dev] IN ([tomas@gooddata.com])"]]
192
+ end
193
+
194
+ it "should set up false if all values are nonexistent" do
195
+ metric = GoodData::Fact.find_first_by_title('Lines Changed', client: @client, project: @project).create_metric
196
+
197
+ filters = [[ConnectionHelper::DEFAULT_USERNAME, @label.uri, "NONEXISTENT1", "NONEXISTENT2", "NONEXISTENT3"]]
198
+ @project.add_data_permissions(filters, ignore_missing_values: true)
199
+ expect(metric.execute).to eq 15
200
+ @project.add_data_permissions(filters, ignore_missing_values: true, restrict_if_missing_all_values: true)
201
+ expect(metric.execute).to eq nil
202
+ end
203
+
204
+ it "you can switch the updates. Whatever is not mentioned will not be touched" do
205
+ # first let's prepare some user filters
206
+ user_with_already_set_up_filter = @project.get_user(ConnectionHelper::DEFAULT_USERNAME)
207
+
208
+ filters = [
209
+ [user_with_already_set_up_filter.login, @label.uri, "tomas@gooddata.com"]
210
+ ]
211
+ @project.add_data_permissions(filters)
212
+ expect(@project.data_permissions.map { |f| [f.related.login, f.pretty_expression] })
213
+ .to eq [[ConnectionHelper::DEFAULT_USERNAME, "[Dev] IN ([tomas@gooddata.com])"]]
214
+
215
+ # Now let's add user filter to a different user. If we do not explicitely state that
216
+ # user_with_already_set_up_filter should keep his filter it will be removed
217
+ another_user = @domain.users.find { |u| u.login != ConnectionHelper::DEFAULT_USERNAME }
218
+ @project.add_user(another_user, 'Admin', domain: @domain)
219
+ new_filters = [
220
+ [another_user.login, @label.uri, "tomas@gooddata.com"]
221
+ ]
222
+ @project.add_data_permissions(new_filters, do_not_touch_filters_that_are_not_mentioned: true)
223
+ expect(@project.data_permissions.map { |f| [f.related.login, f.pretty_expression] })
224
+ .to include([ConnectionHelper::DEFAULT_USERNAME, "[Dev] IN ([tomas@gooddata.com])"], [another_user.login, "[Dev] IN ([tomas@gooddata.com])"])
225
+ end
226
+
227
+ it "should be able to update the filter value", broken: true do
228
+ pending 'FIXME: We cannot swap filters yet'
229
+
230
+ filters = [[ConnectionHelper::DEFAULT_USERNAME, @label.uri, "tomas@gooddata.com", "jirka@gooddata.com"]]
231
+ @project.add_data_permissions(filters)
232
+ perm = @project.data_permissions.first
233
+ filters = [[ConnectionHelper::DEFAULT_USERNAME, @label.uri, "tomas@gooddata.com"]]
234
+ @project.add_data_permissions(filters)
235
+ expect(perm.reload!.pretty_expression).to eq '[Dev] IN ([tomas@gooddata.com, jirka@gooddata.com])'
236
+ end
237
+
238
+ it 'should not create any superfluous filters if things go well' do
239
+ # first create some filters. This will error out and some filters will stay there
240
+ filters = [
241
+ ['nonexistent_user@gooddata.com', @label.uri, "tomas@gooddata.com"],
242
+ [ConnectionHelper::DEFAULT_USERNAME, @label.uri, "tomas@gooddata.com"]
243
+ ]
244
+ @project.add_data_permissions(filters)
245
+
246
+ # now let's do a correct run
247
+ filters = [
248
+ [ConnectionHelper::DEFAULT_USERNAME, @label.uri, "tomas@gooddata.com"]
249
+ ]
250
+ results = @project.add_data_permissions(filters)
251
+ expect(results[:results].all? { |r| r[:status] == :successful }).to be_truthy
252
+ expect(results[:results].select { |r| r[:type] == :create }.count).to eq 0
253
+ expect(@project.data_permissions.count).to eq 1
254
+ end
255
+
256
+ it "should create a mandatory user filter with double filters" do
257
+ repo_label = @project.labels('some_attr_label_id')
258
+ metric = @project.create_metric("SELECT SUM(#\"Lines Changed\")")
259
+
260
+ # we want to compute stuff on different user than we are setting it on
261
+ u = @domain.users.find { |user| user.login != ConnectionHelper::DEFAULT_USERNAME }
262
+ password = 'si@gFG593fo'
263
+ u.json['accountSetting']['password'] = password
264
+ @domain.update_user(u)
265
+ @project.add_user(u, 'admin')
266
+
267
+ computation_client = GoodData.connect(u.login, password, verify_ssl: false)
268
+ computation_project = computation_client.projects(@project.pid)
269
+
270
+ # verify we are set up
271
+ r = computation_project.compute_report(left: [metric, 'some_attr_label_id'], top: [@label])
272
+ expect(r.column(4)).to eq ["tomas@gooddata.com", 6, 1]
273
+
274
+ # lets restrict tomas to goodot only
275
+ filters = [[u.login, @label.uri, 'tomas@gooddata.com'],
276
+ [u.login, repo_label.uri, 'goodot']]
277
+ @project.add_data_permissions(filters)
278
+ expect(@project.data_permissions.pmap { |f| [f.related.login, f.pretty_expression] }).to eq [
279
+ [u.login, "[Dev] IN ([tomas@gooddata.com])"],
280
+ [u.login, "[Repository Name] IN ([goodot])"]
281
+ ]
282
+
283
+ r = computation_project.compute_report(left: [metric, 'some_attr_label_id'], top: [@label])
284
+ expect(r.column(2)).to eq ["tomas@gooddata.com", 1]
285
+
286
+ # Now lets change repo to bam
287
+ filters = [[u.login, @label.uri, 'tomas@gooddata.com'],
288
+ [u.login, repo_label.uri, 'bam']]
289
+ @project.add_data_permissions(filters)
290
+
291
+ expect(@project.data_permissions.pmap { |f| [f.related.login, f.pretty_expression] }).to eq [
292
+ [u.login, "[Dev] IN ([tomas@gooddata.com])"],
293
+ [u.login, "[Repository Name] IN ([bam])"]
294
+ ]
295
+
296
+ r = computation_project.compute_report(left: [metric, 'some_attr_label_id'], top: [@label])
297
+ expect(r.column(2)).to eq ["tomas@gooddata.com", 6]
298
+
299
+ # let's remove the repo restriction
300
+ filters = [[u.login, @label.uri, 'tomas@gooddata.com']]
301
+ @project.add_data_permissions(filters)
302
+
303
+ r = computation_project.compute_report(left: [metric, 'some_attr_label_id'], top: [@label])
304
+ expect(r.column(2)).to eq ["tomas@gooddata.com", 6, 1]
305
+ end
306
+ end