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,130 @@
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::Project do
10
+ before(:all) do
11
+ @client = ConnectionHelper.create_default_connection
12
+ @p = GoodData::Project.create_object(title: 'a', client: @client)
13
+ @domain = @client.domain('dummy_domain')
14
+ @roles = [
15
+ GoodData::ProjectRole.create_object(title: 'Test Role',
16
+ summary: 'Test role summary',
17
+ identifier: 'test_role',
18
+ uri: '/roles/1',
19
+ permissions: {
20
+ "canManageFact" => "1",
21
+ "canListInvitationsInProject" => "1"
22
+ }),
23
+ GoodData::ProjectRole.create_object(title: 'Test Role 2',
24
+ summary: 'Test role 2 summary',
25
+ identifier: 'test_role_2',
26
+ uri: '/roles/2',
27
+ permissions: {
28
+ "canManageFact" => "1"
29
+ })
30
+ ]
31
+ @domain_members = [
32
+ GoodData::Profile.create_object(login: 'john.doe+in_domain@gooddata.com', uri: '/uri/john_domain')
33
+ ]
34
+ @members = [
35
+ GoodData::Membership.create(login: 'john.doe@goodadta.com', uri: '/uri/john'),
36
+ GoodData::Membership.create(login: 'jane.doe@goodadta.com', uri: '/uri/jane')
37
+ ]
38
+ end
39
+
40
+ describe 'resolve_roles' do
41
+ it 'Can handle case with user login when user is in the project' do
42
+ # we have to provide users from project to be able to do this by login
43
+ a, b = @p.resolve_roles('john.doe@goodadta.com', 'test_role', project_users: @members, roles: @roles)
44
+ expect(a).to eq "/gdc/account/profile/john.doe@goodadta.com"
45
+ expect(b).to eq ["/roles/1"]
46
+ end
47
+
48
+ it 'Can handle case with user uri when user is in the project' do
49
+ # we have to provide users from project to be able to do this by login
50
+ a, b = @p.resolve_roles('/uri/john', 'test_role', project_users: @members, roles: @roles)
51
+ expect(a).to eq "/uri/john"
52
+ expect(b).to eq ["/roles/1"]
53
+ end
54
+
55
+ it 'can handle case with info with uri when user is in the project' do
56
+ # we have to provide users from project to be able to do this by login
57
+ a, b = @p.resolve_roles({ uri: '/uri/john', first_name: 'John' }, 'test_role', project_users: @members, roles: @roles)
58
+ expect(a).to eq "/uri/john"
59
+ expect(b).to eq ["/roles/1"]
60
+ end
61
+
62
+ it 'can handle case with info with login when he is in the project' do
63
+ # we have to provide users from project to be able to do this by login
64
+ a, b = @p.resolve_roles({ login: 'john.doe@goodadta.com', first_name: 'John' }, 'test_role', project_users: @members, roles: @roles)
65
+ expect(a).to eq "/gdc/account/profile/john.doe@goodadta.com"
66
+ expect(b).to eq ["/roles/1"]
67
+ end
68
+
69
+ it 'can handle case with member when he is in the project' do
70
+ # we have to provide users from project to be able to do this by login
71
+ a, b = @p.resolve_roles(@members.first, 'test_role_2', project_users: @members, roles: @roles)
72
+ expect(a).to eq "/uri/john"
73
+ expect(b).to eq ["/roles/2"]
74
+ end
75
+
76
+ it 'can handle case with profile when the user is in the project' do
77
+ # we have to provide users from project to be able to do this by login
78
+ a, b = @p.resolve_roles(@domain_members.first, 'test_role_2', project_users: @members, roles: @roles)
79
+ expect(a).to eq "/uri/john_domain"
80
+ expect(b).to eq ["/roles/2"]
81
+ end
82
+
83
+ it 'Can handle case with user login when user is in the domain' do
84
+ # we have to provide users from project to be able to do this by login
85
+ a, b = @p.resolve_roles('john.doe+in_domain@gooddata.com', 'test_role', project_users: [], domain_users: @domain_members, roles: @roles, domain: @domain)
86
+ expect(a).to eq "/gdc/account/profile/john.doe+in_domain@gooddata.com"
87
+ expect(b).to eq ["/roles/1"]
88
+ end
89
+
90
+ it 'Can handle case with user uri when user is in the domain' do
91
+ # we have to provide users from project to be able to do this by login
92
+ a, b = @p.resolve_roles('/uri/john_domain', 'test_role', project_users: [], domain_users: @domain_members, roles: @roles, domain: @domain)
93
+ expect(a).to eq "/uri/john_domain"
94
+ expect(b).to eq ["/roles/1"]
95
+ end
96
+
97
+ it 'can handle case with info with uri when user is in the domain' do
98
+ # we have to provide users from project to be able to do this by login
99
+ a, b = @p.resolve_roles({ uri: '/uri/john_domain', first_name: 'John' }, 'test_role', project_users: [], domain_users: @domain_members, roles: @roles, domain: @domain)
100
+ expect(a).to eq "/uri/john_domain"
101
+ expect(b).to eq ["/roles/1"]
102
+ end
103
+
104
+ it 'can handle case with info with login when he is in the domain' do
105
+ # we have to provide users from project to be able to do this by login
106
+ login = { login: 'john.doe+in_domain@gooddata.com', first_name: 'John' }
107
+ a, b = @p.resolve_roles(login, 'test_role',
108
+ project_users: [],
109
+ domain_users: @domain_members,
110
+ roles: @roles,
111
+ domain: @domain)
112
+ expect(a).to eq "/gdc/account/profile/john.doe+in_domain@gooddata.com"
113
+ expect(b).to eq ["/roles/1"]
114
+ end
115
+
116
+ it 'can handle case with member when he is in the domain' do
117
+ # we have to provide users from project to be able to do this by login
118
+ a, b = @p.resolve_roles(@domain_members.first, 'test_role_2', project_users: [], domain_users: @domain_members, roles: @roles, domain: @domain)
119
+ expect(a).to eq "/uri/john_domain"
120
+ expect(b).to eq ["/roles/2"]
121
+ end
122
+
123
+ it 'can handle case with profile when the user is in the domain' do
124
+ # we have to provide users from project to be able to do this by login
125
+ a, b = @p.resolve_roles(@domain_members.first, 'test_role_2', project_users: [], domain_users: @domain_members, roles: @roles)
126
+ expect(a).to eq "/uri/john_domain"
127
+ expect(b).to eq ["/roles/2"]
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,98 @@
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 "Over-To data permissions implementation", :constraint => 'slow' do
10
+ before(:all) do
11
+ @spec = JSON.parse(File.read("./spec/data/blueprints/m_n_model.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
+ @label = @project.attributes('attr.permission.id').label_by_name('label.permission.id.email')
17
+
18
+ data = [
19
+ ['label.commits.id', 'fact.commits.lines_changed', 'dataset.users'],
20
+ [1, 1, 1],
21
+ [2, 3, 2],
22
+ [3, 5, 3]
23
+ ]
24
+ @project.upload(data, @blueprint, 'dataset.commits')
25
+
26
+ data = [
27
+ ["label.users.id", "label.users.id.email"],
28
+ [1, "tomas@gooddata.com"],
29
+ [2, "petr@gooddata.com"],
30
+ [3, "jirka@gooddata.com"]
31
+ ]
32
+ @project.upload(data, @blueprint, 'dataset.users')
33
+
34
+ data = [
35
+ ["label.permission.id", "label.permission.id.email"],
36
+ [1, "tomas@gooddata.com"],
37
+ [2, "petr@gooddata.com"],
38
+ [3, "jirka@gooddata.com"]
39
+ ]
40
+ @project.upload(data, @blueprint, 'dataset.permission_users')
41
+
42
+ data = [
43
+ ['label.visibility.id', 'dataset.permission_users', 'dataset.commits'],
44
+ [1, 1, 1],
45
+ [3, 1, 3]
46
+ ]
47
+ @project.upload(data, @blueprint, 'dataset.visibility')
48
+
49
+ @variable = @project.create_variable(title: 'uaaa', attribute: @label.attribute).save
50
+
51
+ @attr1 = @project.attributes('attr.visibility.id')
52
+ @attr2 = @project.attributes('attr.commits.id')
53
+
54
+ @filters = [
55
+ {
56
+ login: ConnectionHelper::DEFAULT_USERNAME,
57
+ filters: [
58
+ { label: @label.uri, values: ["tomas@gooddata.com"], over: @attr1.uri, to: @attr2.uri }
59
+ ]
60
+ }
61
+ ]
62
+ end
63
+
64
+ after(:all) do
65
+ @project.delete if @project
66
+ end
67
+
68
+ after(:each) do
69
+ @project.data_permissions.pmap(&:delete)
70
+ end
71
+
72
+ it "should fail if you are specifying OVER TO filter and variables. Variables do not support OVER TO" do
73
+ expect do
74
+ @project.add_variable_permissions(@filters, @variable)
75
+ end.to raise_exception
76
+ end
77
+
78
+ it "should create an over to filter transparently" do
79
+ metric = @project.create_metric("SELECT SUM(#\"Fact.Commits.Lines Changed\")", :title => 'x')
80
+ expect(metric.execute).to eq 9
81
+ @project.add_data_permissions(@filters)
82
+ expect(metric.execute).to eq 6
83
+
84
+ r = @project.compute_report(left: [metric], top: ['label.users.id.email'])
85
+ expect(r.include_column?(['tomas@gooddata.com', 1])).to eq true
86
+ expect(r.include_column?(['jirka@gooddata.com', 5])).to eq true
87
+ expect(r.include_column?(['petr@gooddata.com', 3])).to eq false
88
+
89
+ data = [['label.visibility.id', 'dataset.permission_users', 'dataset.commits'], [1, 1, 1]]
90
+ @project.upload(data, @blueprint, 'dataset.visibility')
91
+
92
+ expect(metric.execute).to eq 1
93
+ r = @project.compute_report(left: [metric], top: ['label.users.id.email'])
94
+ expect(r.include_column?(['tomas@gooddata.com', 1])).to eq true
95
+ expect(r.include_column?(['jirka@gooddata.com', 5])).to eq false
96
+ expect(r.include_column?(['petr@gooddata.com', 3])).to eq false
97
+ end
98
+ end
@@ -0,0 +1,41 @@
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 "Object export between projects", :constraint => 'slow' do
10
+ before(:all) do
11
+ @client = ConnectionHelper.create_default_connection
12
+
13
+ spec = MultiJson.load(File.read("./spec/data/blueprints/test_project_model_spec.json"), :symbolize_keys => true)
14
+
15
+ @source_project = @client.create_project_from_blueprint(spec, token: ConnectionHelper::GD_PROJECT_TOKEN, environment: ProjectHelper::ENVIRONMENT)
16
+ @target_project = @client.create_project_from_blueprint(spec, token: ConnectionHelper::GD_PROJECT_TOKEN, environment: ProjectHelper::ENVIRONMENT)
17
+ end
18
+
19
+ after(:all) do
20
+ @source_project.delete unless @source_project.nil?
21
+ @target_project.delete unless @target_project.nil?
22
+
23
+ @client.disconnect
24
+ end
25
+
26
+ it "should transfer a metric" do
27
+ f = GoodData::Fact.find_first_by_title('Lines Changed', :client => @client, :project => @source_project)
28
+ metric_title = "Testing metric to be exported"
29
+ metric = @source_project.create_metric("SELECT SUM(#\"#{f.title}\")", :title => metric_title)
30
+ metric.save
31
+
32
+ expect(@target_project.metrics.count).to eq 0
33
+
34
+ @source_project.partial_md_export(metric, :project => @target_project)
35
+
36
+ expect(@target_project.metrics.count).to eq 1
37
+ metric = GoodData::Metric.find_first_by_title(metric_title, :client => @client, :project => @target_project)
38
+ expect(metric).not_to be_nil
39
+ expect(metric.title).to eq metric_title
40
+ end
41
+ end
@@ -0,0 +1,381 @@
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 'pmap'
8
+ require 'gooddata'
9
+
10
+ describe GoodData::Project, :constraint => 'slow' do
11
+ before(:all) do
12
+ @client = ConnectionHelper.create_default_connection
13
+ @project = @client.create_project(title: ProjectHelper::PROJECT_TITLE, auth_token: ConnectionHelper::GD_PROJECT_TOKEN, environment: ProjectHelper::ENVIRONMENT)
14
+ @domain = @client.domain(ConnectionHelper::DEFAULT_DOMAIN)
15
+ end
16
+
17
+ after(:all) do
18
+ @project && @project.delete
19
+ @client.disconnect
20
+ end
21
+
22
+ describe '#add_user' do
23
+ it 'Adding user without domain should fail if it is not in the domain' do
24
+ user = ProjectHelper.create_random_user(@client)
25
+ expect do
26
+ @project.add_user(user, 'Admin')
27
+ end.to raise_exception(ArgumentError)
28
+ end
29
+
30
+ it 'Adding user with domain should be added to a project' do
31
+ user = ProjectHelper.create_random_user(@client)
32
+ @domain.create_users([user])
33
+ res = @project.add_user(user, 'Admin', domain: @domain)
34
+ login = GoodData::Helpers.last_uri_part(res['projectUsersUpdateResult']['successful'].first)
35
+ expect(@project.member?(login)).to be_truthy
36
+ end
37
+ end
38
+
39
+ describe '#add_users' do
40
+ it 'Adding user without domain should fail if it is not in the project' do
41
+ users = (1..5).to_a.map do
42
+ {
43
+ user: ProjectHelper.create_random_user(@client),
44
+ role: 'Admin'
45
+ }
46
+ end
47
+
48
+ res = @project.add_users(users)
49
+ expect(res.select { |r| r[:type] == :failed }.count).to eq users.length
50
+ end
51
+
52
+ it 'Adding users with domain should pass and users should be added to domain' do
53
+ users = (1..5).to_a.map do
54
+ {
55
+ user: ProjectHelper.create_random_user(@client),
56
+ role: 'Admin'
57
+ }
58
+ end
59
+ @domain.create_users(users.map { |u| u[:user] })
60
+ res = @project.add_users(users, domain: @domain)
61
+ links = res.select { |r| r[:type] == :successful }.map { |i| GoodData::Helpers.last_uri_part(i[:user]) }
62
+ expect(@project.members?(links).all?).to be_truthy
63
+ end
64
+ end
65
+
66
+ describe '#import_users' do
67
+ it 'should add user which login contains a part of whitelists' do
68
+ users = [ProjectHelper.create_random_user(@client, login: "#{rand(1e7)}+rubydev+admin@gooddata.com")]
69
+ @domain.create_users(users)
70
+ @project.import_users(users, domain: @domain, whitelists: ['rubydev+admin@gooddata.com'])
71
+ expect(@domain.members?(users)).to be_truthy
72
+ expect(@project.members?(users)).to be_truthy
73
+ expect(@project.members.count).to eq 2
74
+ end
75
+
76
+ it "Updates user's name and surname and removes the users" do
77
+ users = (1..2).to_a.map { ProjectHelper.create_random_user(@client) }
78
+ @domain.create_users(users)
79
+ @project.import_users(users, domain: @domain, whitelists: [/admin@gooddata.com/])
80
+ expect(@domain.members?(users)).to be_truthy
81
+ expect(@project.members?(users)).to be_truthy
82
+ expect(@project.members.count).to eq 4
83
+ # update some user stuff
84
+ bill = users[0]
85
+ bill.first_name = 'buffalo'
86
+ bill.last_name = 'bill'
87
+ # import
88
+ @domain.create_users(users, domain: @domain, whitelists: [/admin@gooddata.com/])
89
+ @project.import_users(users, domain: @domain, whitelists: [/admin@gooddata.com/])
90
+ # it should be updated
91
+ bill_changed = @domain.get_user(bill)
92
+ expect(bill_changed.first_name).to eq 'buffalo'
93
+ expect(bill_changed.last_name).to eq 'bill'
94
+ expect(@project.members?(users)).to be_truthy
95
+ expect(@project.members.count).to eq 4
96
+ expect(@project.member?(bill_changed)).to be_truthy
97
+
98
+ # remove everybody but buffalo bill.
99
+ @project.import_users([bill], domain: @domain, whitelists: [/admin@gooddata.com/])
100
+ expect(@project.members.count).to eq 3
101
+ expect(@project.member?(bill)).to be_truthy
102
+ disabled_users = users - [bill]
103
+ expect(@project.members?(disabled_users).any?).to be_falsey
104
+ disabled_users.each do |user|
105
+ expect(@project.users(disabled: true).find { |member| member.login.downcase == user.login.downcase }).not_to be_nil
106
+ end
107
+
108
+ # remove completely everybody but buffalo bill.
109
+ @project.import_users([bill], domain: @domain, whitelists: [/admin@gooddata.com/], remove_users_from_project: true)
110
+ expect(@project.members.count).to eq 3
111
+ expect(@project.member?(bill)).to be_truthy
112
+ expect(@project.members?(disabled_users).any?).to be_falsey
113
+ disabled_users.each do |user|
114
+ expect(@project.users(disabled: true).find { |member| member.login.downcase == user.login.downcase }).to be_nil
115
+ end
116
+
117
+ # Add additional user while changing Buffalos surname and role.
118
+ bill.last_name = 'Billie'
119
+ other_guy = ProjectHelper.create_random_user(@client)
120
+ additional_batch = [bill, other_guy]
121
+
122
+ @domain.create_users(additional_batch, domain: @domain)
123
+ @project.import_users(additional_batch.map { |u| { user: u, role: u.role } }, domain: @domain, whitelists: [/admin@gooddata.com/])
124
+
125
+ expect(@project.members.count).to eq 4
126
+ expect(@project.member?(bill)).to be_truthy
127
+ expect(@project.members?(users - additional_batch).any?).to be_falsey
128
+ end
129
+
130
+ it "Updates user's role in a project" do
131
+ users = (1..5).to_a.map { ProjectHelper.create_random_user(@client).to_hash }
132
+ @domain.create_users(users, domain: @domain)
133
+ @project.import_users(users, domain: @domain, whitelists: [/admin@gooddata.com/])
134
+
135
+ expect(@project.members?(users)).to be_truthy
136
+ user_role_changed = users[1]
137
+ users_unchanged = users - [user_role_changed]
138
+ new_role = users[1][:role] = users[1][:role] == "admin" ? "editor" : "admin"
139
+ @project.import_users(users, domain: @domain, whitelists: [/admin@gooddata.com/])
140
+ expect(@project.get_user(user_role_changed).role.identifier).to eq "#{new_role}Role"
141
+ expect(users_unchanged.map { |u| @project.get_user(u) }.map(&:role).map(&:title).uniq).to eq ['Editor']
142
+ end
143
+
144
+ it "ignores user from both project and end state batch when whitelisted" do
145
+ u = @project.get_user(ConnectionHelper::DEFAULT_USERNAME)
146
+ uh = u.to_hash
147
+ uh[:role] = 'editor'
148
+
149
+ users = (1..5).to_a.map { ProjectHelper.create_random_user(@client).to_hash } + [uh]
150
+ @domain.create_users(users, domain: @domain)
151
+ expect(@project.member?(u)).to be_truthy
152
+ expect(u.role.title).to eq 'Admin'
153
+ @project.import_users(users, domain: @domain, whitelists: [/admin@gooddata.com/])
154
+ expect(@project.member?(u)).to be_truthy
155
+ expect(@project.members?(users).all?).to be_truthy
156
+ expect(@project.get_user(ConnectionHelper::DEFAULT_USERNAME).role.title).to eq 'Admin'
157
+ end
158
+
159
+ it 'should downcase login' do
160
+ users = [ProjectHelper.create_random_user(@client, login: "#{rand(1e7)}+TMA-445+RubyDev+Admin@gooddata.com")]
161
+ @domain.create_users(users)
162
+ @project.import_users(users, domain: @domain, whitelists: ['rubydev+admin@gooddata.com'])
163
+ expect(@project.members?(users.map(&:to_hash).map { |u| u[:login].downcase! })).to be_truthy
164
+ end
165
+ end
166
+
167
+ describe '#set_user_roles' do
168
+ it 'Properly updates user roles as needed' do
169
+ users_to_import = @domain.users.drop(rand(100)).take(5).map { |u| { user: u, role: 'admin' } }
170
+ @project.import_users(users_to_import, domain: @domain, whitelists: [/admin@gooddata.com/])
171
+ users_without_owner = @project.users.reject { |u| u.login == ConnectionHelper::DEFAULT_USERNAME }.pselect { |u| u.role.title == 'Admin' }
172
+
173
+ user_to_change = users_without_owner.sample
174
+ @project.set_user_roles(user_to_change, 'editor')
175
+ expect(user_to_change.role.title).to eq 'Editor'
176
+ @project.set_user_roles(user_to_change, 'admin')
177
+ expect(user_to_change.role.title).to eq 'Admin'
178
+
179
+ # Try different notation
180
+ @project.set_users_roles([user: user_to_change, role: 'editor'])
181
+ expect(user_to_change.role.title).to eq 'Editor'
182
+ @project.set_users_roles([user: user_to_change, role: 'admin'])
183
+ expect(user_to_change.role.title).to eq 'Admin'
184
+ end
185
+
186
+ it 'Properly updates user roles when user specified by email and :roles specified as array of string with role names' do
187
+ # pick non deleted users that are not owner and have other roles than admin or editor
188
+ users = @project.users
189
+ users_without_owner = users
190
+ .reject { |u| u.login == ConnectionHelper::DEFAULT_USERNAME }
191
+ .reject { |u| u.login =~ /^deleted/ }
192
+ .pselect { |u| u.role.title =~ /^(Admin|Editor)/ }
193
+
194
+ # take 10 users that we will exercise
195
+ users_to_change = users_without_owner.sample(10)
196
+
197
+ # alternate roles and prepare structure
198
+ logins = users_to_change.map(&:login)
199
+ roles = users_to_change.map { |u| u.role.title == 'Admin' ? ['Editor'] : ['Admin'] }
200
+
201
+ list = users_to_change.map do |u|
202
+ {
203
+ :user => u.login,
204
+ :roles => u.role.title == 'Admin' ? ['Editor'] : ['Admin']
205
+ }
206
+ end
207
+
208
+ # set the roles
209
+ res = @project.set_users_roles(list)
210
+ expect(res.select { |r| r[:type] == :successful }.length).to equal(list.length)
211
+ expect(logins.map { |l| users.find { |u| u.login == l } }.pmap { |u| u.role.title }).to eq roles.flatten
212
+ end
213
+
214
+ it 'Properly updates user roles when user specified by email and :roles specified as string with role name' do
215
+ users = @project.users
216
+ users_without_owner = users
217
+ .reject { |u| u.login == ConnectionHelper::DEFAULT_USERNAME }
218
+ .reject(&:deleted?)
219
+ .pselect { |u| u.role.title =~ /^(Admin|Editor)/ }
220
+
221
+ users_to_change = users_without_owner.sample(10)
222
+
223
+ logins = users_to_change.map(&:login)
224
+ roles = users_to_change.map { |u| u.role.title == 'Admin' ? 'Editor' : 'Admin' }
225
+
226
+ list = users_to_change.map do |u|
227
+ {
228
+ :user => u.login,
229
+ :roles => u.role.title == 'Admin' ? 'Editor' : 'Admin'
230
+ }
231
+ end
232
+
233
+ res = @project.set_users_roles(list)
234
+ expect(res.select { |r| r[:type] == :successful }.length).to equal(list.length)
235
+ expect(logins.map { |l| users.find { |u| u.login == l } }.pmap { |u| u.role.title }).to eq roles.flatten
236
+ end
237
+
238
+ it 'can work with groups as well. Groups have to be set up. It can only eat hashes on input in this case' do
239
+ users = (1..5).to_a.map { ProjectHelper.create_random_user(@client).to_hash }
240
+ group_names = %w(group_1 group_2)
241
+ groups = group_names.map { |g| @project.create_group(name: g) }
242
+ users_with_groups = users.map do |u|
243
+ u[:user_group] = groups.take(rand(2) + 1).map(&:name)
244
+ u
245
+ end
246
+ @domain.create_users(users_with_groups, domain: @domain)
247
+ @project.import_users(users_with_groups, domain: @domain, whitelists: [/admin@gooddata.com/])
248
+ expect(users_with_groups.flat_map { |u| u[:user_group].map { |g| [u[:login], g] } }.all? do |u, g|
249
+ begin
250
+ @project.user_groups(g).member?(@project.member(u).uri)
251
+ rescue
252
+ false
253
+ end
254
+ end).to be_truthy
255
+
256
+ users_with_group = users.map do |u|
257
+ u[:user_group] = ['group_1']
258
+ u
259
+ end
260
+ to_whitelist = @project.user_groups('group_2').members.to_a.sample
261
+ @project.import_users(users_with_group, domain: @domain, whitelists: [to_whitelist.login, /admin@gooddata.com/])
262
+ expect(@project.user_groups('group_2').members.map(&:login)).to eq [to_whitelist.login]
263
+ expect(users_with_group.flat_map { |u| u[:user_group].map { |g| [u[:login], g] } }.all? do |u, g|
264
+ begin
265
+ @project.user_groups(g).member?(@project.member(u).uri)
266
+ rescue
267
+ false
268
+ end
269
+ end).to be_truthy
270
+ end
271
+
272
+ it 'can auto create groups and work with them' do
273
+ new_group = 'new_group'
274
+ u = @project.get_user(ConnectionHelper::DEFAULT_USERNAME)
275
+ uh = u.to_hash
276
+ uh[:user_group] = [new_group]
277
+
278
+ expect(@project.user_groups(new_group)).to be_nil
279
+ expect do
280
+ @project.import_users([uh], domain: @domain, whitelists: [/admin@gooddata.com/])
281
+ end.to raise_exception
282
+
283
+ @project.import_users([uh], domain: @domain, whitelists: [/admin@gooddata.com/], create_non_existing_user_groups: true)
284
+ expect(@project.user_groups(new_group)).not_to be_nil
285
+ expect(@project.user_groups(new_group).member?(u.uri)).to be_truthy
286
+ end
287
+ end
288
+
289
+ describe '#summary' do
290
+ it 'Properly gets summary of project' do
291
+ res = @project.summary
292
+ expect(res).to include(ProjectHelper::PROJECT_SUMMARY)
293
+ end
294
+ end
295
+
296
+ describe '#title' do
297
+ it 'Properly gets title of project' do
298
+ res = @project.title
299
+ expect(res).to include(ProjectHelper::PROJECT_TITLE)
300
+ end
301
+ end
302
+
303
+ describe 'enabling and disabling users' do
304
+ it 'should be able to enable and disable a user' do
305
+ users_without_owner = @project.users
306
+ .reject { |u| u.login == ConnectionHelper::DEFAULT_USERNAME }
307
+ .reject(&:deleted?)
308
+ .select(&:enabled?)
309
+ user = users_without_owner.sample
310
+ expect(user.enabled?).to be_truthy
311
+ expect(user.disabled?).to be_falsey
312
+ user.disable
313
+ expect(user.disabled?).to be_truthy
314
+ expect(user.enabled?).to be_falsey
315
+ user.enable
316
+ expect(user.enabled?).to be_truthy
317
+ expect(user.disabled?).to be_falsey
318
+ expect(user.project).not_to be_nil
319
+ end
320
+ end
321
+
322
+ describe 'color palette' do
323
+ it 'should return empty when project is not set color' do
324
+ expect(@project.current_color_palette.colors).to eq []
325
+ end
326
+
327
+ it 'should be able to set custom color' do
328
+ colors = [
329
+ {
330
+ guid: 'first',
331
+ fill: {
332
+ r: 155,
333
+ g: 255,
334
+ b: 0
335
+ }
336
+ }
337
+ ]
338
+ @project.create_custom_color_palette(colors)
339
+ expect(@project.current_color_palette.colors).to eq colors.map { |color| GoodData::Helpers.stringify_keys(color) }
340
+ end
341
+
342
+ it 'should be able to reset custom color' do
343
+ colors = [
344
+ {
345
+ guid: 'first',
346
+ fill: {
347
+ r: 155,
348
+ g: 255,
349
+ b: 0
350
+ }
351
+ }
352
+ ]
353
+ @project.create_custom_color_palette(colors)
354
+ @project.reset_color_palette
355
+ expect(@project.current_color_palette.colors).to eq []
356
+ end
357
+
358
+ it 'should not contains duplicate color' do
359
+ colors = [
360
+ {
361
+ guid: 'first',
362
+ fill: {
363
+ r: 155,
364
+ g: 255,
365
+ b: 0
366
+ }
367
+ },
368
+ {
369
+ guid: 'first',
370
+ fill: {
371
+ r: 155,
372
+ g: 255,
373
+ b: 0
374
+ }
375
+ }
376
+ ]
377
+ @project.create_custom_color_palette(colors)
378
+ expect(@project.current_color_palette.colors).to eq [{ "guid" => "first", "fill" => { "r" => 155, "g" => 255, "b" => 0 } }]
379
+ end
380
+ end
381
+ end