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,367 @@
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 "Full process and schedule exercise", :constraint => 'slow' do
10
+ COMPLEX_PARAMS ||= {
11
+ type: 'Person',
12
+ model_version: 1,
13
+ data_version: 1.5,
14
+ some_true_flag: true,
15
+ some_false_flag: false,
16
+ empty_value: nil,
17
+ user: {
18
+ firstname: 'Joe',
19
+ lastname: 'Doe',
20
+ age: 42
21
+ },
22
+ address: {
23
+ street: '#111 Sutter St.',
24
+ city: 'San Francisco',
25
+ zip: '94133'
26
+ }
27
+ }
28
+
29
+ before(:all) do
30
+ @client = ConnectionHelper.create_default_connection
31
+ @project = @client.create_project(title: 'Project for schedule testing', auth_token: ConnectionHelper::GD_PROJECT_TOKEN, environment: ProjectHelper::ENVIRONMENT)
32
+ @process = @project.deploy_process('./spec/data/ruby_process',
33
+ type: 'RUBY',
34
+ name: 'Test ETL Process (Ruby)')
35
+
36
+ @process_cc = @project.deploy_process('./spec/data/cc',
37
+ type: 'graph',
38
+ name: 'Test ETL Process (CC)')
39
+ end
40
+
41
+ after(:all) do
42
+ ScheduleHelper.remove_old_schedules(@project)
43
+ ProcessHelper.remove_old_processes(@project)
44
+
45
+ # @process.delete if @process
46
+ @project.delete if @project
47
+ GoodData::ChannelConfiguration.all.map(&:delete)
48
+
49
+ @client.disconnect
50
+ end
51
+
52
+ it "should be able to execute a process" do
53
+ result = @process.execute(@process.executables.first)
54
+ log = result.log
55
+ expect(log.index('Hello Ruby executors')).not_to eq nil
56
+ expect(log.index('Hello Ruby from the deep')).not_to eq nil
57
+ end
58
+
59
+ it "should be able to start executing a process" do
60
+ result = @process.start_execution(@process.executables.first)
61
+ expect(result["executionTask"]).not_to be_nil
62
+ expect(result["executionTask"]['links']['detail']).not_to be_nil
63
+ end
64
+
65
+ it "should be able to grab executables" do
66
+ expect(@process.executables).to eq ['process.rb']
67
+ end
68
+
69
+ it "should have empty schedules on deploy" do
70
+ expect(@process.schedules).to eq []
71
+ end
72
+
73
+ it "should be able to create schedule triggered by another schedule" do
74
+ begin
75
+ schedule_first = @process.create_schedule('0 15 27 7 *', @process.executables.first)
76
+ schedule = @process.create_schedule(schedule_first, @process.executables.first)
77
+ res = @process.schedules
78
+ expect(res.count).to eq 2
79
+ expect(@process.schedules.map(&:uri)).to include(schedule_first.uri, schedule.uri)
80
+ ensure
81
+ schedule && schedule.delete
82
+ schedule_first && schedule_first.delete
83
+ end
84
+ end
85
+
86
+ it "should be able to create schedule triggered by another schedule specified by ID" do
87
+ begin
88
+ schedule_first = @process.create_schedule('0 15 27 7 *', @process.executables.first)
89
+ schedule = @process.create_schedule(schedule_first.obj_id, @process.executables.first)
90
+ res = @process.schedules
91
+ expect(res.count).to eq 2
92
+ expect(schedule.after).to eq schedule_first
93
+ expect(@process.schedules.map(&:uri)).to include(schedule_first.uri, schedule.uri)
94
+ ensure
95
+ schedule && schedule.delete
96
+ schedule_first && schedule_first.delete
97
+ end
98
+ end
99
+
100
+ it "should be able to delete schedule" do
101
+ begin
102
+ schedule = @process.create_schedule('0 15 27 7 *', @process.executables.first)
103
+ res = @process.schedules
104
+ expect(res.count).to eq 1
105
+ expect(@process.schedules).to eq [schedule]
106
+ ensure
107
+ schedule && schedule.delete
108
+ end
109
+ end
110
+
111
+ it "should be possible to read status of schedule" do
112
+ begin
113
+ schedule = @process.create_schedule('0 15 27 7 *', @process.executables.first)
114
+ expect(schedule.state).to eq 'ENABLED'
115
+ ensure
116
+ schedule && schedule.delete
117
+ end
118
+ end
119
+
120
+ it "should be possible to execute schedule" do
121
+ begin
122
+ schedule = @process.create_schedule('0 15 27 7 *', @process.executables.first)
123
+ executions_count = schedule.executions.count
124
+ result = schedule.execute
125
+ expect(result.status).to eq :ok
126
+ log = result.log
127
+ expect(log.index('Hello Ruby executors')).not_to eq nil
128
+ expect(log.index('Hello Ruby from the deep')).not_to eq nil
129
+ expect(executions_count + 1).to eq schedule.executions.count
130
+ ensure
131
+ schedule && schedule.delete
132
+ end
133
+ end
134
+
135
+ it "should be possible to deploy only a single file" do
136
+ process = @project.deploy_process('./spec/data/hello_world_process/hello_world.rb',
137
+ type: 'RUBY',
138
+ name: 'Test ETL one file Process')
139
+ begin
140
+ schedule = process.create_schedule('0 15 27 7 *', process.executables.first)
141
+ result = schedule.execute
142
+ expect(result.status).to eq :ok
143
+ log = result.log
144
+ expect(log.index('HELLO WORLD')).not_to eq nil
145
+ expect(schedule.enabled?).to be_truthy
146
+ schedule.disable
147
+ schedule.save
148
+ expect(schedule.enabled?).to be_falsey
149
+ expect(schedule.disabled?).to be_truthy
150
+ schedule.enable
151
+ schedule.save
152
+ expect(schedule.enabled?).to be_truthy
153
+ ensure
154
+ schedule && schedule.delete
155
+ process && process.delete
156
+ end
157
+ end
158
+
159
+ it "should be possible to deploy already zipped file" do
160
+ process = @project.deploy_process('./spec/data/hello_world_process/hello_world.zip',
161
+ type: 'RUBY',
162
+ name: 'Test ETL zipped file Process')
163
+ begin
164
+ expect(process.schedules.count).to eq 0
165
+ schedule = process.create_schedule('0 15 27 7 *', process.executables.first)
166
+ result = schedule.execute
167
+ expect(result.status).to eq :ok
168
+ log = result.log
169
+ expect(log.index('HELLO WORLD')).not_to eq nil
170
+ expect(process.schedules.count).to eq 1
171
+ ensure
172
+ schedule && schedule.delete
173
+ process && process.delete
174
+ end
175
+ end
176
+
177
+ it 'should be possible to deploy and run zipped file and print GoodData::VERSION' do
178
+ process = @project.deploy_process('./spec/data/gooddata_version_process/gooddata_version.zip',
179
+ type: 'RUBY',
180
+ name: 'Test ETL zipped file GoodData Process')
181
+ begin
182
+ expect(process.schedules.count).to eq 0
183
+ schedule = process.create_schedule('0 15 27 7 *', process.executables.first)
184
+ result = schedule.execute
185
+ expect(result.status).to eq :ok
186
+ log = result.log
187
+ expect(log.index('GoodData::VERSION - 0.6.')).not_to eq nil
188
+ expect(process.schedules.count).to eq 1
189
+ ensure
190
+ schedule && schedule.delete
191
+ process && process.delete
192
+ end
193
+ end
194
+
195
+ it 'should be possible to deploy and run directory and use nested parameters' do
196
+ process = @project.deploy_process('./spec/data/ruby_params_process',
197
+ type: 'RUBY',
198
+ name: 'Test ETL dir GoodData Process')
199
+ begin
200
+ expect(process.schedules.count).to eq 0
201
+ schedule = process.create_schedule('0 15 27 7 *', process.executables.first, params: COMPLEX_PARAMS)
202
+ result = schedule.execute
203
+ expect(result.status).to eq :ok
204
+ log = result.log
205
+ expect(log.index('Joe')).not_to eq nil
206
+ expect(log.index('San Francisco')).not_to eq nil
207
+ expect(process.schedules.count).to eq 1
208
+ ensure
209
+ schedule && schedule.delete
210
+ process && process.delete
211
+ end
212
+ end
213
+
214
+ it 'should be possible to deploy and run directory and use nested hidden parameters' do
215
+ process = @project.deploy_process('./spec/data/ruby_params_process',
216
+ type: 'RUBY',
217
+ name: 'Test ETL dir GoodData Process')
218
+ begin
219
+ expect(process.schedules.count).to eq 0
220
+ schedule = process.create_schedule('0 15 27 7 *', process.executables.first, hidden_params: COMPLEX_PARAMS)
221
+ result = schedule.execute
222
+ # expect(result.status).to eq :ok
223
+ result.log
224
+ expect(process.schedules.count).to eq 1
225
+ ensure
226
+ schedule && schedule.delete
227
+ process && process.delete
228
+ end
229
+ end
230
+
231
+ it "should be possible to download deployed process" do
232
+ size = File.size('./spec/data/hello_world_process/hello_world.zip')
233
+ process = @project.deploy_process('./spec/data/hello_world_process/hello_world.zip',
234
+ type: 'RUBY',
235
+ name: 'Test ETL zipped file Process')
236
+ begin
237
+ Tempfile.open('downloaded-process') do |temp|
238
+ temp << process.download
239
+ temp.flush
240
+ expect(File.size(temp.path)).to eq size
241
+ end
242
+ ensure
243
+ process && process.delete
244
+ end
245
+ end
246
+
247
+ it "should be able to redeploy via project" do
248
+ begin
249
+ process = @project.deploy_process('./spec/data/hello_world_process/hello_world.zip',
250
+ type: 'RUBY',
251
+ name: 'Test ETL zipped file Process',
252
+ process_id: @process.obj_id)
253
+ ensure
254
+ process && process.delete
255
+ end
256
+ end
257
+
258
+ it "should be able to redeploy directly" do
259
+ begin
260
+ process1 = @project.deploy_process(
261
+ './spec/data/hello_world_process/hello_world.zip',
262
+ type: 'RUBY',
263
+ name: 'Test ETL zipped file Process'
264
+ )
265
+
266
+ process2 = process1.deploy('./spec/data/ruby_process/process.rb')
267
+ expect(process1.executables).not_to eq process2.executables
268
+ ensure
269
+ process1 && process1.delete
270
+ end
271
+ end
272
+
273
+ it 'should be able to deploy from app_store' do
274
+ begin
275
+ process = @project.deploy_process('${PRODUCTION_APPSTORE}:branch/master:/apps/hello_world_brick', name: 'hello_world_brick')
276
+ expect(process.class).to eq GoodData::Process
277
+ ensure
278
+ process.delete if process
279
+ end
280
+ end
281
+
282
+ it 'should be able to clone with etl' do
283
+ begin
284
+ # Deploy two schedules
285
+ process = @project.processes.first
286
+ schedule_first = process.create_schedule('0 15 27 7 *', process.executables.first)
287
+ schedule_second = process.create_schedule('0 15 27 8 *', process.executables.first)
288
+ cloned_project = GoodData::Project.clone_with_etl(@project, auth_token: ConnectionHelper::GD_PROJECT_TOKEN)
289
+ a = @project.processes.flat_map { |p| p.schedules.map { |s| [p.name, s.name] } }
290
+ b = cloned_project.processes.flat_map { |p| p.schedules.map { |s| [p.name, s.name] } }
291
+ expect(a).to eq b
292
+ ensure
293
+ cloned_project && cloned_project.delete
294
+ schedule_first && schedule_first.delete
295
+ schedule_second && schedule_second.delete
296
+ end
297
+ end
298
+
299
+ it 'should have no notification when creating a new process' do
300
+ begin
301
+ process = @project.deploy_process('./spec/data/ruby_params_process', type: 'RUBY', name: 'Ruby params process')
302
+ expect(process.notification_rules).to eq []
303
+ ensure
304
+ process && process.delete
305
+ end
306
+ end
307
+
308
+ it 'should be able to add a notification rule' do
309
+ begin
310
+ process = @project.deploy_process('./spec/data/ruby_params_process', type: 'RUBY', name: 'Ruby params process')
311
+ old_notification_rules = process.notification_rules
312
+ notification_rule = process.create_notification_rule(email: ConnectionHelper::DEFAULT_USERNAME, events: GoodData::Subscription::PROCESS_SUCCESS_EVENT)
313
+ expect(notification_rule.class).to be GoodData::NotificationRule
314
+ expect(old_notification_rules).not_to include(notification_rule)
315
+ new_notification_rules = process.notification_rules
316
+ expect(new_notification_rules).to include(notification_rule)
317
+ expect(old_notification_rules.length + 1).to eq new_notification_rules.length
318
+ ensure
319
+ notification_rule && notification_rule.delete
320
+ process && process.delete
321
+ end
322
+ end
323
+
324
+ it 'should be able to remove a notification rule' do
325
+ begin
326
+ process = @project.deploy_process('./spec/data/ruby_params_process', type: 'RUBY', name: 'Ruby params process')
327
+ old_notification_rules = process.notification_rules
328
+ notification_rule = process.create_notification_rule(email: ConnectionHelper::DEFAULT_USERNAME, events: GoodData::Subscription::PROCESS_SUCCESS_EVENT)
329
+ notification_rule.delete
330
+ new_notification_rules = process.notification_rules
331
+ expect(new_notification_rules).to eq old_notification_rules
332
+ ensure
333
+ process && process.delete
334
+ end
335
+ end
336
+
337
+ it 'should be able to edit a notification rule' do
338
+ begin
339
+ process = @project.deploy_process('./spec/data/ruby_params_process', type: 'RUBY', name: 'Ruby params process')
340
+ notification_rule = process.create_notification_rule(email: ConnectionHelper::DEFAULT_USERNAME, events: GoodData::Subscription::PROCESS_SUCCESS_EVENT)
341
+ expect(notification_rule.email).to eq ConnectionHelper::DEFAULT_USERNAME
342
+ expect(notification_rule.subject).to eq 'Email subject'
343
+ expect(notification_rule.body).to eq 'Email body'
344
+ expect(notification_rule.events).to eq [GoodData::Subscription::PROCESS_SUCCESS_EVENT]
345
+
346
+ notification_rule = GoodData::NotificationRule[notification_rule.notification_rule_id, project: @project, process: process, client: @client]
347
+ notification_rule.events = [GoodData::Subscription::PROCESS_SUCCESS_EVENT, GoodData::Subscription::PROCESS_STARTED_EVENT]
348
+ notification_rule.save
349
+
350
+ expect(process.notification_rules.first.events).to eq [GoodData::Subscription::PROCESS_SUCCESS_EVENT, GoodData::Subscription::PROCESS_STARTED_EVENT]
351
+ ensure
352
+ notification_rule && notification_rule.delete
353
+ process && process.delete
354
+ end
355
+ end
356
+
357
+ it 'should be able to get all notification rules' do
358
+ begin
359
+ process = @project.deploy_process('./spec/data/ruby_params_process', type: 'RUBY', name: 'Ruby params process')
360
+ notification_rule = process.create_notification_rule(email: ConnectionHelper::DEFAULT_USERNAME, events: GoodData::Subscription::PROCESS_SUCCESS_EVENT)
361
+ expect(process.notification_rules).to eq [notification_rule]
362
+ ensure
363
+ notification_rule && notification_rule.delete
364
+ process && process.delete
365
+ end
366
+ end
367
+ end
@@ -0,0 +1,592 @@
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
+ require 'tempfile'
9
+
10
+ describe "Full project implementation", :constraint => 'slow' do
11
+ before(:all) do
12
+ @invalid_spec = JSON.parse(File.read("./spec/data/blueprints/invalid_blueprint.json"), :symbolize_names => true)
13
+ @invalid_blueprint = GoodData::Model::ProjectBlueprint.new(@invalid_spec)
14
+ @client = ConnectionHelper.create_default_connection
15
+ @project, @blueprint, @spec = ProjectHelper.load_full_project_implementation(@client)
16
+ end
17
+
18
+ after(:all) do
19
+ @project.delete unless @project.nil?
20
+
21
+ @client.disconnect
22
+ end
23
+
24
+ it "should not build an invalid model" do
25
+ expect do
26
+ @client.create_project_from_blueprint(@invalid_spec, auth_token: ConnectionHelper::GD_PROJECT_TOKEN, environment: ProjectHelper::ENVIRONMENT)
27
+ end.to raise_error(GoodData::ValidationError)
28
+ end
29
+
30
+ it "should do nothing if the project is updated with the same blueprint" do
31
+ results = GoodData::Model::ProjectCreator.migrate_datasets(@spec, project: @project, client: @client, dry_run: true)
32
+ expect(results).to eq []
33
+ end
34
+
35
+ it 'should try to rename a dataset back' do
36
+ dataset = @project.datasets('dataset.repos')
37
+ dataset.title = "Some title"
38
+ dataset.save
39
+
40
+ # Now the update of project using the original blueprint should offer update of the title. Nothing else.
41
+ results = GoodData::Model::ProjectCreator.migrate_datasets(@spec, project: @project, client: @client, dry_run: true)
42
+ expect(results.first['updateScript']['maqlDdlChunks']).to eq ["ALTER DATASET {dataset.repos} VISUAL(TITLE \"Repositories\", DESCRIPTION \"\");\n"]
43
+
44
+ # Update using a freshly gained blueprint should offer no changes.
45
+ new_blueprint = @project.blueprint
46
+ results = GoodData::Model::ProjectCreator.migrate_datasets(new_blueprint, project: @project, client: @client, dry_run: true)
47
+ expect(results).to eq []
48
+
49
+ # When we change the model using the original blueprint. Basically change the title back.
50
+ @project.update_from_blueprint(@spec)
51
+ # It should offer no changes using the original blueprint
52
+ results = GoodData::Model::ProjectCreator.migrate_datasets(@spec, project: @project, client: @client, dry_run: true)
53
+ expect(results).to eq []
54
+ end
55
+
56
+ it "should contain datasets" do
57
+ bp = @project.blueprint
58
+ expect(bp.datasets.count).to eq 3
59
+ expect(bp.datasets(:all, :include_date_dimensions => true).count).to eq 4
60
+ end
61
+
62
+ it "should contain metadata datasets" do
63
+ expect(@project.datasets.count).to eq 4
64
+ expect(@project.datasets.select(&:date_dimension?).count).to eq 1
65
+ end
66
+
67
+ it "should be able to rename a project" do
68
+ former_title = @project.title
69
+ a_title = (0...8).map { (65 + rand(26)).chr }.join
70
+ @project.title = a_title
71
+ @project.save
72
+ expect(@project.title).to eq a_title
73
+ @project.title = former_title
74
+ @project.save
75
+ end
76
+
77
+ it "should be able to validate a project" do
78
+ @project.validate
79
+ end
80
+
81
+ it "should compute an empty metric" do
82
+ f = @project.fact_by_title('Lines Changed')
83
+ metric = @project.create_metric("SELECT SUM(#\"#{f.title}\")")
84
+ expect(metric.execute).to be_nil
85
+ end
86
+
87
+ it "should compute an empty report def" do
88
+ @project.delete_all_data(force: true)
89
+ f = @project.fact_by_title('Lines Changed')
90
+ metric = @project.create_metric("SELECT SUM(#\"#{f.title}\")")
91
+ res = @project.compute_report(:left => [metric])
92
+ expect(res).to be_empty
93
+ end
94
+
95
+ it "should load the data" do
96
+ GoodData.with_project(@project) do
97
+ # blueprint = GoodData::Model::ProjectBlueprint.new(@spec)
98
+ commits_data = [
99
+ %w(lines_changed committed_on dev_id repo_id),
100
+ [1, "01/01/2014", 1, 1],
101
+ [3, "01/02/2014", 2, 2],
102
+ [5, "05/02/2014", 3, 1]
103
+ ]
104
+ @project.upload(commits_data, @blueprint, 'dataset.commits')
105
+
106
+ devs_data = [
107
+ %w(dev_id email),
108
+ [1, "tomas@gooddata.com"],
109
+ [2, "petr@gooddata.com"],
110
+ [3, "jirka@gooddata.com"]
111
+ ]
112
+ @project.upload(devs_data, @blueprint, 'dataset.devs')
113
+ end
114
+ end
115
+
116
+ it "it silently ignores extra columns" do
117
+ GoodData.with_project(@project) do
118
+ blueprint = GoodData::Model::ProjectBlueprint.new(@spec)
119
+ commits_data = [
120
+ %w(lines_changed committed_on dev_id repo_id extra_column),
121
+ [1, "01/01/2014", 1, 1, "something"],
122
+ [3, "01/02/2014", 2, 2, "something"],
123
+ [5, "05/02/2014", 3, 1, "something else"]
124
+ ]
125
+ @project.upload(commits_data, blueprint, 'dataset.commits')
126
+ end
127
+ end
128
+
129
+ context "it should give you a reasonable error message" do
130
+ it "if you omit a column" do
131
+ GoodData.with_project(@project) do
132
+ blueprint = GoodData::Model::ProjectBlueprint.new(@spec)
133
+ commits_data = [
134
+ %w(lines_changed committed_on dev_id),
135
+ [1, "01/01/2014", 1],
136
+ [3, "01/02/2014", 2],
137
+ [5, "05/02/2014", 3]
138
+ ]
139
+ expect do
140
+ @project.upload(commits_data, blueprint, 'dataset.commits')
141
+ end.to raise_error(/repo_id/)
142
+ end
143
+ end
144
+ it "if you give it a malformed CSV" do
145
+ GoodData.with_project(@project) do
146
+ blueprint = GoodData::Model::ProjectBlueprint.new(@spec)
147
+ # 4 cols in header but not in the data
148
+ commits_data = [
149
+ %w(lines_changed committed_on dev_id repo_id),
150
+ [1, "01/01/2014", 1],
151
+ [3, "01/02/2014", 2],
152
+ [5, "05/02/2014", 3]
153
+ ]
154
+ expect do
155
+ @project.upload(commits_data, blueprint, 'dataset.commits')
156
+ end.to raise_error(/Number of columns/)
157
+ end
158
+ end
159
+ it "if you give it wrong date format" do
160
+ GoodData.with_project(@project) do
161
+ blueprint = GoodData::Model::ProjectBlueprint.new(@spec)
162
+ commits_data = [
163
+ %w(lines_changed committed_on dev_id repo_id),
164
+ [1, "01/01/2014", 1, 1],
165
+ [3, "45/50/2014", 2, 2],
166
+ [5, "05/02/2014", 3, 1]
167
+ ]
168
+ expect do
169
+ @project.upload(commits_data, blueprint, 'dataset.commits')
170
+ end.to raise_error(%r{45/50/2014})
171
+ end
172
+ end
173
+ end
174
+
175
+ it "should compute a metric" do
176
+ f = @project.fact_by_title('Lines Changed')
177
+ metric = @project.create_metric("SELECT SUM(#\"#{f.title}\")")
178
+ expect(metric.execute).to eq 9
179
+ end
180
+
181
+ it "should compute a count metric from dataset" do
182
+ # works on anchor without label
183
+ expect(@blueprint.datasets('dataset.commits').count(@project)).to eq 3
184
+
185
+ # works on anchor with label
186
+ expect(@blueprint.datasets('dataset.devs').count(@project)).to eq 3
187
+ end
188
+
189
+ it "should execute an anonymous metric twice and not fail" do
190
+ f = @project.fact_by_title('Lines Changed')
191
+ metric = @project.create_metric("SELECT SUM(#\"#{f.title}\")")
192
+ expect(metric.execute).to eq 9
193
+ # Since GD platform cannot execute inline specified metric the metric has to be saved
194
+ # The code tries to resolve this as transparently as possible
195
+ # Here we are testing that you can execute the metric twice. The first execution is on unsaved metric
196
+ # We wanna make sure that when we are cleaning up we are not messing things up
197
+ expect(metric.execute).to eq 9
198
+ end
199
+
200
+ it "should compute a report def" do
201
+ f = @project.fact_by_title('Lines Changed')
202
+
203
+ # TODO: Here we create metric which is not deleted and is used by another test - "should exercise the object relations and getting them in various ways"
204
+ metric = @project.create_metric("SELECT SUM(#\"#{f.title}\")", :title => "My metric")
205
+ metric.save
206
+ result = @project.compute_report(:top => [metric], :left => ['label.devs.dev_id.email'])
207
+ expect(result[2][1]).to eq 3
208
+ expect(result.include_row?(["jirka@gooddata.com", 5])).to be true
209
+
210
+ result2 = @project.compute_report(:top => [metric], :left => ['label.devs.dev_id.email'])
211
+ expect(result2[2][1]).to eq 3
212
+ expect(result2.include_row?(["jirka@gooddata.com", 5])).to eq true
213
+ expect(result2).to eq result
214
+ end
215
+
216
+ it "should be able to lock reports and everything underneath" do
217
+ m = @project.metrics.first
218
+ r = @project.create_report(top: [m], title: 'xy')
219
+ r.save
220
+ expect(m.locked?).to eq false
221
+ expect(r.locked?).to eq false
222
+ r.lock_with_dependencies!
223
+ expect(r.locked?).to eq true
224
+ m.reload!
225
+ expect(m.locked?).to eq true
226
+ r.unlock_with_dependencies!
227
+ expect(r.locked?).to eq false
228
+ m.reload!
229
+ expect(m.locked?).to eq false
230
+ r.lock!
231
+ expect(r.locked?).to eq true
232
+ r.unlock!
233
+ expect(r.locked?).to eq false
234
+ r.delete
235
+ end
236
+
237
+ it "should be able to purge report from older revisions" do
238
+ m = @project.metrics.first
239
+ r = @project.create_report(top: [m], title: 'xy')
240
+ expect(r.definitions.count).to eq 1
241
+
242
+ rd = GoodData::ReportDefinition.create(:top => [m], :client => @client, :project => @project)
243
+ rd.save
244
+ r.add_definition(rd)
245
+ r.save
246
+ expect(r.definitions.count).to eq 2
247
+ end
248
+
249
+ it "should be able to clean colors from a chart report def" do
250
+ f = @project.fact_by_title('Lines Changed')
251
+ m = @project.create_metric("SELECT SUM(#\"#{f.title}\")", title: 'test metric').save
252
+ r = @project.create_report(top: [m], title: 'xy')
253
+ rd = r.latest_report_definition
254
+ rd.content['chart'] = { 'styles' => { 'global' => { 'colorMapping' => 1 } } }
255
+
256
+ expect(GoodData::Helpers.get_path(rd.content, %w(chart styles global))).to eq('colorMapping' => 1)
257
+ rd.reset_color_mapping!
258
+ expect(GoodData::Helpers.get_path(rd.content, %w(chart styles global))).to eq('colorMapping' => [])
259
+ r.delete
260
+ res = m.used_by
261
+ res.each do |dependency|
262
+ @client.delete dependency['link']
263
+ end
264
+ res = m.used_by
265
+ expect(res.length).to eq 0
266
+ m.delete
267
+ end
268
+
269
+ it "should be able to update report definition (update existing)" do
270
+ m = @project.metrics.first
271
+ r = @project.create_report(top: [m], title: 'xy')
272
+
273
+ latest_uri = r.definition_uri
274
+ new_def = r.update_definition do |definition|
275
+ definition.title = "Test TITLE: #{DateTime.now.strftime}"
276
+ end
277
+
278
+ expect(r.definition_uri).to eq new_def.uri
279
+ expect(r.definition_uri).to_not eq latest_uri
280
+ end
281
+
282
+ it "should be able to update report definition (create new)" do
283
+ m = @project.metrics.first
284
+ r = @project.create_report(top: [m], title: 'xy')
285
+
286
+ latest_uri = r.definition_uri
287
+ new_def = r.update_definition(:new_definition => false) do |definition|
288
+ definition.title = "Test TITLE: #{DateTime.now.strftime}"
289
+ end
290
+
291
+ expect(r.definition_uri).to eq new_def.uri
292
+ expect(r.definition_uri).to eq latest_uri
293
+ end
294
+
295
+ it "should be possible to get all metrics" do
296
+ metrics1 = @project.metrics
297
+ expect(metrics1.count).to be >= 0
298
+ end
299
+
300
+ it "should be possible to get all metrics with full objects" do
301
+ metrics = @project.metrics(:all)
302
+ expect(metrics.first.class).to be GoodData::Metric
303
+ end
304
+
305
+ it "should be able to get a metric by identifier" do
306
+ metrics = @project.metrics
307
+ metric = @project.metrics(metrics.first.identifier)
308
+ expect(metric.identifier).to eq metrics.first.identifier
309
+ expect(metrics.first).to eq metric
310
+ end
311
+
312
+ it "should be able to get a metric by uri" do
313
+ metrics = @project.metrics
314
+ metric = @project.metrics(metrics.first.uri)
315
+ expect(metric.uri).to eq metrics.first.uri
316
+ expect(metrics.first).to eq metric
317
+ end
318
+
319
+ it "should be able to get a metric by object id" do
320
+ metrics = @project.metrics
321
+ metric = @project.metrics(metrics.first.obj_id)
322
+ expect(metric.obj_id).to eq metrics.first.obj_id
323
+ expect(metrics.first).to eq metric
324
+ end
325
+
326
+ it "should exercise the object relations and getting them in various ways" do
327
+ # Find a metric by name
328
+ metric = @project.metric_by_title('My metric')
329
+ the_same_metric = @project.metrics(metric)
330
+ expect(metric).to eq the_same_metric
331
+
332
+ # grab fact in several different ways
333
+ fact1 = @project.fact_by_title('Lines Changed')
334
+ fact2 = @project.facts(fact1.identifier)
335
+ fact3 = @project.facts(fact2.obj_id)
336
+ fact4 = @project.facts(fact3.uri)
337
+ fact5 = @client.create(GoodData::Fact, fact4)
338
+
339
+ # All should be the same
340
+ expect(fact1).to eq fact2
341
+ expect(fact1).to eq fact2
342
+ expect(fact1).to eq fact3
343
+ expect(fact1).to eq fact4
344
+ expect(fact1).to eq fact5
345
+
346
+ fact3.title = "Somewhat changed title"
347
+ expect(fact1).not_to eq fact3
348
+
349
+ metric.using(nil)
350
+ res = metric.using('fact')
351
+ expect(res.count).to eq 1
352
+
353
+ fact1.used_by(nil)
354
+ res = fact1.used_by('metric')
355
+ expect(res.count).to eq 1
356
+
357
+ res = metric.using?(fact1)
358
+ expect(res).to be(true)
359
+
360
+ res = fact1.using?(metric)
361
+ expect(res).to be(false)
362
+
363
+ res = metric.used_by?(fact1)
364
+ expect(res).to be(false)
365
+
366
+ res = fact1.used_by?(metric)
367
+ expect(res).to be(true)
368
+ end
369
+
370
+ it "should try setting and getting by tags" do
371
+ fact = @project.fact_by_title('Lines Changed')
372
+ expect(fact.tags.empty?).to be_truthy
373
+
374
+ fact.tags = "tag1 tag2 tag3"
375
+ fact.save
376
+
377
+ tagged_facts = GoodData::Fact.find_by_tag('tag3', :client => @client, :project => @project)
378
+ expect(tagged_facts.count).to eq 1
379
+ end
380
+
381
+ it "should be able to interpolate metric based on" do
382
+ res = @project.compute_metric "SELECT SUM(![fact.commits.lines_changed])"
383
+ expect(res).to eq 9
384
+
385
+ res = @project.compute_metric "SELECT SUM(![fact.commits.lines_changed])"
386
+ expect(res).to eq 9
387
+
388
+ res = @project.compute_metric "SELECT SUM(![fact.commits.lines_changed])"
389
+ expect(res).to eq 9
390
+
391
+ res = @project.compute_metric "SELECT SUM(![fact.commits.lines_changed])"
392
+ expect(res).to eq 9
393
+
394
+ fact = @project.fact_by_title('Lines Changed')
395
+ expect(fact.fact?).to be true
396
+ res = fact.create_metric(:type => :sum).execute
397
+ expect(res).to eq 9
398
+ end
399
+
400
+ it "should load the data" do
401
+ devs_data = [
402
+ %w(dev_id email),
403
+ [4, "josh@gooddata.com"]
404
+ ]
405
+ @project.upload(devs_data, @blueprint, 'dataset.devs', mode: 'INCREMENTAL')
406
+ end
407
+
408
+ it "should have more users" do
409
+ attribute = @project.attributes('attr.devs.dev_id')
410
+ expect(attribute.attribute?).to be true
411
+ expect(attribute.create_metric.execute).to eq 4
412
+ end
413
+
414
+ it "should tell you whether metric contains a certain attribute" do
415
+ attribute = @project.attributes('attr.devs.dev_id')
416
+ repo_attribute = @project.attributes('attr.repos.repo_id')
417
+ metric = attribute.create_metric(:title => "My test metric")
418
+ metric.save
419
+ expect(metric.execute).to eq 4
420
+
421
+ expect(metric.contain?(attribute)).to be true
422
+ expect(metric.contain?(repo_attribute)).to be false
423
+ metric.replace!(attribute => repo_attribute)
424
+ metric.save
425
+ expect(metric.execute).not_to eq 4
426
+
427
+ l = attribute.primary_label
428
+ value = l.values.first[:value]
429
+ expect(l.find_element_value(l.find_value_uri(value))).to eq value
430
+ expect(l.value?(value)).to eq true
431
+ expect(l.value?("DEFINITELY NON EXISTENT VALUE HOPEFULLY")).to eq false
432
+ end
433
+
434
+ it "should be able to compute count of different datasets" do
435
+ attribute = @project.attributes('attr.devs.dev_id')
436
+ dataset_attribute = @project.attributes('attr.commits.factsof')
437
+ expect(attribute.create_metric(:attribute => dataset_attribute).execute).to eq 3
438
+ end
439
+
440
+ it "should be able to tell you if a value is contained in a metric" do
441
+ attribute = @project.attributes('attr.devs.dev_id')
442
+ label = attribute.primary_label
443
+ value = label.values.first
444
+ fact = @project.facts('fact.commits.lines_changed')
445
+ metric = @project.create_metric("SELECT SUM([#{fact.uri}]) WHERE [#{attribute.uri}] = [#{value[:uri]}]")
446
+ expect(metric.contain_value?(label, value[:value])).to be true
447
+ end
448
+
449
+ it "should be able to replace the values in a metric" do
450
+ attribute = @project.attributes('attr.devs.dev_id')
451
+ label = attribute.primary_label
452
+ value = label.values.first
453
+ different_value = label.values.drop(1).first
454
+ fact = @project.facts('fact.commits.lines_changed')
455
+ metric = @project.create_metric("SELECT SUM([#{fact.uri}]) WHERE [#{attribute.uri}] = [#{value[:uri]}]")
456
+ metric.replace_value(label, value[:value], different_value[:value])
457
+ expect(metric.contain_value?(label, value[:value])).to be false
458
+ expect(metric.pretty_expression).to eq "SELECT SUM([Lines Changed]) WHERE [Dev] = [josh@gooddata.com]"
459
+ end
460
+
461
+ it "should be able to lookup the attributes by regexp and return a collection" do
462
+ attrs = @project.attributes_by_title(/Date/i)
463
+ expect(attrs.count).to eq 1
464
+ end
465
+
466
+ it "should be able to give you values of the label as an array of hashes" do
467
+ attribute = @project.attributes('attr.devs.dev_id')
468
+ label = attribute.primary_label
469
+ expect(label.values.map { |v| v[:value] }).to eq [
470
+ 'jirka@gooddata.com',
471
+ 'josh@gooddata.com',
472
+ 'petr@gooddata.com',
473
+ 'tomas@gooddata.com'
474
+ ]
475
+ end
476
+
477
+ it "should be able to give you values for" do
478
+ attribute = @project.attributes('attr.devs.dev_id')
479
+ values = attribute.labels.find { |l| l.identifier == 'label.devs.dev_id.email' }.values.to_a
480
+ id = values.find { |v| v[:value] == 'tomas@gooddata.com' }[:uri][-1].to_i
481
+ expect(attribute.values_for(id)).to eq ['tomas@gooddata.com', '1']
482
+ end
483
+
484
+ it "should be able to find specific element and give you the primary label value" do
485
+ attribute = @project.attributes('attr.devs.dev_id')
486
+ values = attribute.labels.find { |l| l.identifier == 'label.devs.dev_id.email' }.values.to_a
487
+ uri = values.find { |v| v[:value] == 'tomas@gooddata.com' }[:uri]
488
+ expect(@project.find_attribute_element_value(uri)).to eq 'tomas@gooddata.com'
489
+ end
490
+
491
+ it "should be able to give you label by name" do
492
+ attribute = @project.attributes('attr.devs.dev_id')
493
+ label = attribute.label_by_name('Id')
494
+ expect(label.label?).to eq true
495
+ expect(label.title).to eq 'Id'
496
+ expect(label.identifier).to eq 'label.devs.dev_id.id'
497
+ expect(label.attribute_uri).to eq attribute.uri
498
+ expect(label.attribute).to eq attribute
499
+ end
500
+
501
+ it "should be able to return values of the attribute for inspection" do
502
+ attribute = @project.attributes('attr.devs.dev_id')
503
+ vals = attribute.values
504
+ expect(vals.count).to eq 4
505
+ expect(vals.first.count).to eq 2
506
+ expect(vals.first.first[:value]).to eq "jirka@gooddata.com"
507
+ end
508
+
509
+ it "should be able to save_as a metric" do
510
+ m = @project.metric_by_title("My test metric")
511
+ cloned = m.save_as
512
+ m_cloned = @project.metric_by_title("Clone of My test metric")
513
+ expect(m_cloned).to eq cloned
514
+ expect(m_cloned.execute).to eq cloned.execute
515
+ end
516
+
517
+ it "should be able to clone a project and transfer the data" do
518
+ title = 'My new clone project'
519
+ begin
520
+ cloned_project = @project.clone(title: title, auth_token: ConnectionHelper::GD_PROJECT_TOKEN, environment: ProjectHelper::ENVIRONMENT)
521
+ expect(cloned_project.title).to eq title
522
+ expect(cloned_project.facts.first.create_metric.execute).to eq 9
523
+ m = @project.facts.first.create_metric
524
+ m.identifier = 'metric.cloned_metric'
525
+ m.save
526
+
527
+ result = @project.transfer_objects(m, project: cloned_project)
528
+ expect(result).to be_truthy
529
+ cloned_metric = cloned_project.metrics('metric.cloned_metric')
530
+ expect(cloned_metric).not_to be_nil
531
+
532
+ cloned_metric.delete
533
+ cloned_metric = cloned_project.metrics('metric.cloned_metric')
534
+ expect(cloned_metric).to be_nil
535
+
536
+ result = @project.transfer_objects(m, project: [cloned_project], batch_size: 1)
537
+ expect(result).to eq [{ project: cloned_project, result: true }]
538
+
539
+ # should work with pids
540
+ result = @project.transfer_objects(m, project: [cloned_project.pid], batch_size: 1)
541
+ expect(result.first[:result]).to be_truthy
542
+ ensure
543
+ cloned_project.delete
544
+ end
545
+ end
546
+
547
+ it "should be able to clone a project without data" do
548
+ title = 'My new clone project'
549
+ cloned_project = @project.clone(title: title, auth_token: ConnectionHelper::GD_PROJECT_TOKEN, environment: ProjectHelper::ENVIRONMENT, data: false)
550
+ expect(cloned_project.title).to eq title
551
+ expect(cloned_project.facts.first.create_metric.execute).to eq nil
552
+ cloned_project.delete
553
+ end
554
+
555
+ it "should be able to export report" do
556
+ m = @project.metrics.first
557
+ r = @project.create_report(top: [m], title: 'Report to export')
558
+ r.save
559
+ r.export(:csv)
560
+ r.export(:pdf)
561
+ r.delete
562
+ end
563
+
564
+ it "should be able to delete report along with its definitions" do
565
+ m = @project.metrics.first
566
+ r = @project.create_report(top: [m], title: 'Report to delete')
567
+ r.save
568
+ def_uris = r.definition_uris
569
+ r.delete
570
+ expect { def_uris.each { |uri| @client.get(uri) } }.to raise_error(RestClient::ResourceNotFound)
571
+ end
572
+
573
+ it 'should be possible to delete data from a dataset' do
574
+ dataset = @project.datasets('dataset.devs')
575
+ expect(dataset.attributes.first.create_metric.execute).to be > 0
576
+ dataset.delete_data
577
+ expect(dataset.attributes.first.create_metric.execute).to be_nil
578
+ end
579
+
580
+ it 'shoule be able to create project from blueprint support attribute sort order' do
581
+ begin
582
+ attr_sort_order_spec = JSON.parse(File.read("./spec/data/blueprints/attribute_sort_order_blueprint.json"), :symbolize_names => true)
583
+ attr_sort_order_blueprint = GoodData::Model::ProjectBlueprint.new(attr_sort_order_spec)
584
+
585
+ project = @client.create_project_from_blueprint(attr_sort_order_blueprint, token: ConnectionHelper::GD_PROJECT_TOKEN, environment: ProjectHelper::ENVIRONMENT)
586
+ attribute = project.blueprint.datasets('dataset.id').attributes('attr.id.name')
587
+ expect(attribute.order_by).to eq 'label.id.name.name_label_2 - DESC'
588
+ ensure
589
+ project && project.delete
590
+ end
591
+ end
592
+ end