gooddata-edge 0.6.27.edge

Sign up to get free protection for your applications and to get access to all the features.
Files changed (364) hide show
  1. checksums.yaml +7 -0
  2. data/.document +5 -0
  3. data/.gitignore +36 -0
  4. data/.rspec +3 -0
  5. data/.rubocop.yml +89 -0
  6. data/.yardopts +22 -0
  7. data/CHANGELOG.md +196 -0
  8. data/CLI.md +439 -0
  9. data/DEPENDENCIES.md +817 -0
  10. data/Gemfile +4 -0
  11. data/Guardfile +5 -0
  12. data/LICENSE +22 -0
  13. data/LICENSE.rb +5 -0
  14. data/README.md +75 -0
  15. data/Rakefile +179 -0
  16. data/TODO.md +32 -0
  17. data/authors.sh +4 -0
  18. data/bin/gooddata +7 -0
  19. data/dependency_decisions.yml +104 -0
  20. data/gooddata +9 -0
  21. data/gooddata.gemspec +63 -0
  22. data/lib/gooddata.rb +31 -0
  23. data/lib/gooddata/app/app.rb +16 -0
  24. data/lib/gooddata/bricks/base_downloader.rb +86 -0
  25. data/lib/gooddata/bricks/brick.rb +38 -0
  26. data/lib/gooddata/bricks/bricks.rb +15 -0
  27. data/lib/gooddata/bricks/middleware/aws_middleware.rb +29 -0
  28. data/lib/gooddata/bricks/middleware/base_middleware.rb +56 -0
  29. data/lib/gooddata/bricks/middleware/bench_middleware.rb +24 -0
  30. data/lib/gooddata/bricks/middleware/bulk_salesforce_middleware.rb +37 -0
  31. data/lib/gooddata/bricks/middleware/decode_params_middleware.rb +20 -0
  32. data/lib/gooddata/bricks/middleware/fs_download_middleware.rb +48 -0
  33. data/lib/gooddata/bricks/middleware/fs_upload_middleware.rb +36 -0
  34. data/lib/gooddata/bricks/middleware/gooddata_middleware.rb +39 -0
  35. data/lib/gooddata/bricks/middleware/logger_middleware.rb +29 -0
  36. data/lib/gooddata/bricks/middleware/middleware.rb +12 -0
  37. data/lib/gooddata/bricks/middleware/restforce_middleware.rb +61 -0
  38. data/lib/gooddata/bricks/middleware/stdout_middleware.rb +23 -0
  39. data/lib/gooddata/bricks/middleware/twitter_middleware.rb +29 -0
  40. data/lib/gooddata/bricks/middleware/undot_params_middleware.rb +37 -0
  41. data/lib/gooddata/bricks/pipeline.rb +32 -0
  42. data/lib/gooddata/bricks/utils.rb +18 -0
  43. data/lib/gooddata/cli/cli.rb +27 -0
  44. data/lib/gooddata/cli/commands/auth_cmd.rb +29 -0
  45. data/lib/gooddata/cli/commands/domain_cmd.rb +28 -0
  46. data/lib/gooddata/cli/commands/project_cmd.rb +45 -0
  47. data/lib/gooddata/cli/hooks.rb +57 -0
  48. data/lib/gooddata/cli/shared.rb +61 -0
  49. data/lib/gooddata/cli/terminal.rb +20 -0
  50. data/lib/gooddata/client.rb +67 -0
  51. data/lib/gooddata/commands/api.rb +64 -0
  52. data/lib/gooddata/commands/auth.rb +107 -0
  53. data/lib/gooddata/commands/base.rb +12 -0
  54. data/lib/gooddata/commands/commands.rb +12 -0
  55. data/lib/gooddata/commands/datasets.rb +148 -0
  56. data/lib/gooddata/commands/datawarehouse.rb +20 -0
  57. data/lib/gooddata/commands/domain.rb +40 -0
  58. data/lib/gooddata/commands/process.rb +67 -0
  59. data/lib/gooddata/commands/project.rb +175 -0
  60. data/lib/gooddata/commands/projects.rb +20 -0
  61. data/lib/gooddata/commands/role.rb +36 -0
  62. data/lib/gooddata/commands/runners.rb +47 -0
  63. data/lib/gooddata/commands/scaffold.rb +69 -0
  64. data/lib/gooddata/commands/user.rb +39 -0
  65. data/lib/gooddata/connection.rb +127 -0
  66. data/lib/gooddata/core/core.rb +12 -0
  67. data/lib/gooddata/core/logging.rb +105 -0
  68. data/lib/gooddata/core/nil_logger.rb +23 -0
  69. data/lib/gooddata/core/project.rb +74 -0
  70. data/lib/gooddata/core/rest.rb +149 -0
  71. data/lib/gooddata/core/user.rb +20 -0
  72. data/lib/gooddata/data/data.rb +12 -0
  73. data/lib/gooddata/data/guesser.rb +122 -0
  74. data/lib/gooddata/exceptions/attr_element_not_found.rb +16 -0
  75. data/lib/gooddata/exceptions/command_failed.rb +11 -0
  76. data/lib/gooddata/exceptions/exceptions.rb +12 -0
  77. data/lib/gooddata/exceptions/execution_limit_exceeded.rb +13 -0
  78. data/lib/gooddata/exceptions/filter_maqlization.rb +16 -0
  79. data/lib/gooddata/exceptions/malformed_user.rb +15 -0
  80. data/lib/gooddata/exceptions/no_project_error.rb +15 -0
  81. data/lib/gooddata/exceptions/object_migration.rb +32 -0
  82. data/lib/gooddata/exceptions/project_not_found.rb +13 -0
  83. data/lib/gooddata/exceptions/segment_not_empty.rb +18 -0
  84. data/lib/gooddata/exceptions/uncomputable_report.rb +13 -0
  85. data/lib/gooddata/exceptions/user_in_different_domain.rb +15 -0
  86. data/lib/gooddata/exceptions/validation_error.rb +16 -0
  87. data/lib/gooddata/extensions/big_decimal.rb +17 -0
  88. data/lib/gooddata/extensions/enumerable.rb +39 -0
  89. data/lib/gooddata/extensions/extensions.rb +10 -0
  90. data/lib/gooddata/extensions/false.rb +15 -0
  91. data/lib/gooddata/extensions/hash.rb +38 -0
  92. data/lib/gooddata/extensions/nil.rb +15 -0
  93. data/lib/gooddata/extensions/numeric.rb +15 -0
  94. data/lib/gooddata/extensions/object.rb +27 -0
  95. data/lib/gooddata/extensions/symbol.rb +15 -0
  96. data/lib/gooddata/extensions/true.rb +15 -0
  97. data/lib/gooddata/extract.rb +21 -0
  98. data/lib/gooddata/goodzilla/goodzilla.rb +159 -0
  99. data/lib/gooddata/helpers/auth_helpers.rb +75 -0
  100. data/lib/gooddata/helpers/csv_helper.rb +61 -0
  101. data/lib/gooddata/helpers/data_helper.rb +116 -0
  102. data/lib/gooddata/helpers/global_helpers.rb +331 -0
  103. data/lib/gooddata/helpers/global_helpers_params.rb +172 -0
  104. data/lib/gooddata/helpers/helpers.rb +10 -0
  105. data/lib/gooddata/mixins/author.rb +26 -0
  106. data/lib/gooddata/mixins/content_getter.rb +15 -0
  107. data/lib/gooddata/mixins/content_property_reader.rb +17 -0
  108. data/lib/gooddata/mixins/content_property_writer.rb +17 -0
  109. data/lib/gooddata/mixins/contributor.rb +20 -0
  110. data/lib/gooddata/mixins/data_getter.rb +15 -0
  111. data/lib/gooddata/mixins/data_property_reader.rb +19 -0
  112. data/lib/gooddata/mixins/data_property_writer.rb +19 -0
  113. data/lib/gooddata/mixins/inspector.rb +53 -0
  114. data/lib/gooddata/mixins/is_attribute.rb +17 -0
  115. data/lib/gooddata/mixins/is_dimension.rb +17 -0
  116. data/lib/gooddata/mixins/is_fact.rb +17 -0
  117. data/lib/gooddata/mixins/is_label.rb +19 -0
  118. data/lib/gooddata/mixins/links.rb +15 -0
  119. data/lib/gooddata/mixins/md_finders.rb +77 -0
  120. data/lib/gooddata/mixins/md_grantees.rb +42 -0
  121. data/lib/gooddata/mixins/md_id_to_uri.rb +34 -0
  122. data/lib/gooddata/mixins/md_json.rb +15 -0
  123. data/lib/gooddata/mixins/md_lock.rb +87 -0
  124. data/lib/gooddata/mixins/md_object_id.rb +15 -0
  125. data/lib/gooddata/mixins/md_object_indexer.rb +64 -0
  126. data/lib/gooddata/mixins/md_object_query.rb +128 -0
  127. data/lib/gooddata/mixins/md_relations.rb +43 -0
  128. data/lib/gooddata/mixins/meta_getter.rb +17 -0
  129. data/lib/gooddata/mixins/meta_property_reader.rb +19 -0
  130. data/lib/gooddata/mixins/meta_property_writer.rb +19 -0
  131. data/lib/gooddata/mixins/mixins.rb +19 -0
  132. data/lib/gooddata/mixins/not_attribute.rb +17 -0
  133. data/lib/gooddata/mixins/not_exportable.rb +15 -0
  134. data/lib/gooddata/mixins/not_fact.rb +17 -0
  135. data/lib/gooddata/mixins/not_group.rb +17 -0
  136. data/lib/gooddata/mixins/not_label.rb +19 -0
  137. data/lib/gooddata/mixins/not_metric.rb +19 -0
  138. data/lib/gooddata/mixins/obj_id.rb +15 -0
  139. data/lib/gooddata/mixins/rest_getters.rb +17 -0
  140. data/lib/gooddata/mixins/rest_resource.rb +47 -0
  141. data/lib/gooddata/mixins/root_key_getter.rb +15 -0
  142. data/lib/gooddata/mixins/root_key_setter.rb +15 -0
  143. data/lib/gooddata/mixins/timestamps.rb +19 -0
  144. data/lib/gooddata/mixins/to_json.rb +11 -0
  145. data/lib/gooddata/mixins/uri_getter.rb +9 -0
  146. data/lib/gooddata/models/blueprint/anchor_field.rb +64 -0
  147. data/lib/gooddata/models/blueprint/attribute_field.rb +29 -0
  148. data/lib/gooddata/models/blueprint/blueprint.rb +11 -0
  149. data/lib/gooddata/models/blueprint/blueprint_field.rb +70 -0
  150. data/lib/gooddata/models/blueprint/dashboard_builder.rb +30 -0
  151. data/lib/gooddata/models/blueprint/dataset_blueprint.rb +449 -0
  152. data/lib/gooddata/models/blueprint/date_dimension.rb +14 -0
  153. data/lib/gooddata/models/blueprint/fact_field.rb +20 -0
  154. data/lib/gooddata/models/blueprint/label_field.rb +43 -0
  155. data/lib/gooddata/models/blueprint/project_blueprint.rb +746 -0
  156. data/lib/gooddata/models/blueprint/project_builder.rb +83 -0
  157. data/lib/gooddata/models/blueprint/reference_field.rb +43 -0
  158. data/lib/gooddata/models/blueprint/schema_blueprint.rb +160 -0
  159. data/lib/gooddata/models/blueprint/schema_builder.rb +89 -0
  160. data/lib/gooddata/models/blueprint/to_manifest.rb +181 -0
  161. data/lib/gooddata/models/blueprint/to_wire.rb +154 -0
  162. data/lib/gooddata/models/client.rb +182 -0
  163. data/lib/gooddata/models/client_synchronization_result.rb +31 -0
  164. data/lib/gooddata/models/client_synchronization_result_details.rb +41 -0
  165. data/lib/gooddata/models/datawarehouse.rb +92 -0
  166. data/lib/gooddata/models/domain.rb +479 -0
  167. data/lib/gooddata/models/execution.rb +115 -0
  168. data/lib/gooddata/models/execution_detail.rb +81 -0
  169. data/lib/gooddata/models/from_wire.rb +160 -0
  170. data/lib/gooddata/models/invitation.rb +75 -0
  171. data/lib/gooddata/models/links.rb +50 -0
  172. data/lib/gooddata/models/membership.rb +441 -0
  173. data/lib/gooddata/models/metadata.rb +272 -0
  174. data/lib/gooddata/models/metadata/attribute.rb +134 -0
  175. data/lib/gooddata/models/metadata/dashboard.rb +108 -0
  176. data/lib/gooddata/models/metadata/dashboard/dashboard_item.rb +76 -0
  177. data/lib/gooddata/models/metadata/dashboard/filter_apply_item.rb +37 -0
  178. data/lib/gooddata/models/metadata/dashboard/filter_item.rb +64 -0
  179. data/lib/gooddata/models/metadata/dashboard/geo_chart_item.rb +56 -0
  180. data/lib/gooddata/models/metadata/dashboard/headline_item.rb +56 -0
  181. data/lib/gooddata/models/metadata/dashboard/iframe_item.rb +46 -0
  182. data/lib/gooddata/models/metadata/dashboard/report_item.rb +92 -0
  183. data/lib/gooddata/models/metadata/dashboard/text_item.rb +55 -0
  184. data/lib/gooddata/models/metadata/dashboard_tab.rb +141 -0
  185. data/lib/gooddata/models/metadata/dataset.rb +64 -0
  186. data/lib/gooddata/models/metadata/dimension.rb +54 -0
  187. data/lib/gooddata/models/metadata/fact.rb +44 -0
  188. data/lib/gooddata/models/metadata/label.rb +128 -0
  189. data/lib/gooddata/models/metadata/metadata.rb +12 -0
  190. data/lib/gooddata/models/metadata/metric.rb +198 -0
  191. data/lib/gooddata/models/metadata/report.rb +247 -0
  192. data/lib/gooddata/models/metadata/report_definition.rb +264 -0
  193. data/lib/gooddata/models/metadata/scheduled_mail.rb +274 -0
  194. data/lib/gooddata/models/metadata/scheduled_mail/dashboard_attachment.rb +62 -0
  195. data/lib/gooddata/models/metadata/scheduled_mail/report_attachment.rb +64 -0
  196. data/lib/gooddata/models/metadata/variable.rb +91 -0
  197. data/lib/gooddata/models/model.rb +282 -0
  198. data/lib/gooddata/models/models.rb +12 -0
  199. data/lib/gooddata/models/module_constants.rb +31 -0
  200. data/lib/gooddata/models/process.rb +316 -0
  201. data/lib/gooddata/models/profile.rb +426 -0
  202. data/lib/gooddata/models/project.rb +1514 -0
  203. data/lib/gooddata/models/project_creator.rb +126 -0
  204. data/lib/gooddata/models/project_metadata.rb +67 -0
  205. data/lib/gooddata/models/project_role.rb +79 -0
  206. data/lib/gooddata/models/report_data_result.rb +266 -0
  207. data/lib/gooddata/models/schedule.rb +518 -0
  208. data/lib/gooddata/models/segment.rb +201 -0
  209. data/lib/gooddata/models/tab_builder.rb +27 -0
  210. data/lib/gooddata/models/user_filters/mandatory_user_filter.rb +76 -0
  211. data/lib/gooddata/models/user_filters/user_filter.rb +100 -0
  212. data/lib/gooddata/models/user_filters/user_filter_builder.rb +512 -0
  213. data/lib/gooddata/models/user_filters/user_filters.rb +13 -0
  214. data/lib/gooddata/models/user_filters/variable_user_filter.rb +31 -0
  215. data/lib/gooddata/models/user_group.rb +241 -0
  216. data/lib/gooddata/rest/README.md +37 -0
  217. data/lib/gooddata/rest/client.rb +389 -0
  218. data/lib/gooddata/rest/connection.rb +765 -0
  219. data/lib/gooddata/rest/object.rb +69 -0
  220. data/lib/gooddata/rest/object_factory.rb +76 -0
  221. data/lib/gooddata/rest/resource.rb +27 -0
  222. data/lib/gooddata/rest/rest.rb +24 -0
  223. data/lib/gooddata/version.rb +23 -0
  224. data/lib/templates/bricks/brick.rb.erb +7 -0
  225. data/lib/templates/bricks/main.rb.erb +5 -0
  226. data/lib/templates/project/Goodfile.erb +4 -0
  227. data/lib/templates/project/data/commits.csv +4 -0
  228. data/lib/templates/project/data/devs.csv +4 -0
  229. data/lib/templates/project/data/repos.csv +3 -0
  230. data/lib/templates/project/model/model.rb.erb +20 -0
  231. data/spec/bricks/bricks_spec.rb +112 -0
  232. data/spec/bricks/default-config.json +8 -0
  233. data/spec/data/.gooddata +4 -0
  234. data/spec/data/blueprints/additional_dataset_module.json +32 -0
  235. data/spec/data/blueprints/big_blueprint_not_pruned.json +2079 -0
  236. data/spec/data/blueprints/invalid_blueprint.json +103 -0
  237. data/spec/data/blueprints/m_n_model.json +104 -0
  238. data/spec/data/blueprints/model_module.json +25 -0
  239. data/spec/data/blueprints/test_blueprint.json +38 -0
  240. data/spec/data/blueprints/test_project_model_spec.json +106 -0
  241. data/spec/data/cc/data/source/commits.csv +4 -0
  242. data/spec/data/cc/data/source/devs.csv +4 -0
  243. data/spec/data/cc/data/source/repos.csv +3 -0
  244. data/spec/data/cc/devel.prm +0 -0
  245. data/spec/data/cc/graph/graph.grf +11 -0
  246. data/spec/data/cc/workspace.prm +19 -0
  247. data/spec/data/column_based_permissions.csv +7 -0
  248. data/spec/data/column_based_permissions2.csv +6 -0
  249. data/spec/data/gd_gse_data_blueprint.json +1371 -0
  250. data/spec/data/gd_gse_data_manifest.json +1424 -0
  251. data/spec/data/gd_gse_data_model.json +1772 -0
  252. data/spec/data/gooddata_version_process/gooddata_version.rb +9 -0
  253. data/spec/data/gooddata_version_process/gooddata_version.zip +0 -0
  254. data/spec/data/hello_world_process/hello_world.rb +9 -0
  255. data/spec/data/hello_world_process/hello_world.zip +0 -0
  256. data/spec/data/line_based_permissions.csv +3 -0
  257. data/spec/data/manifests/test_blueprint.json +32 -0
  258. data/spec/data/manifests/test_project.json +107 -0
  259. data/spec/data/reports/left_attr_report.json +108 -0
  260. data/spec/data/reports/metric_only_one_line.json +83 -0
  261. data/spec/data/reports/report_1.json +197 -0
  262. data/spec/data/reports/top_attr_report.json +108 -0
  263. data/spec/data/ruby_params_process/ruby_params.rb +9 -0
  264. data/spec/data/ruby_process/deep_files/deep_stuff.txt +1 -0
  265. data/spec/data/ruby_process/process.rb +8 -0
  266. data/spec/data/ruby_process/stuff.txt +1 -0
  267. data/spec/data/superfluous_titles_view.json +81 -0
  268. data/spec/data/test-ci-data.csv +2 -0
  269. data/spec/data/users.csv +12 -0
  270. data/spec/data/wire_models/model_view.json +1775 -0
  271. data/spec/data/wire_models/nu_model.json +3046 -0
  272. data/spec/data/wire_models/test_blueprint.json +63 -0
  273. data/spec/data/wire_test_project.json +150 -0
  274. data/spec/environment/default.rb +41 -0
  275. data/spec/environment/develop.rb +31 -0
  276. data/spec/environment/environment.rb +18 -0
  277. data/spec/environment/hotfix.rb +21 -0
  278. data/spec/environment/production.rb +35 -0
  279. data/spec/environment/release.rb +21 -0
  280. data/spec/environment/staging.rb +30 -0
  281. data/spec/environment/staging_3.rb +36 -0
  282. data/spec/helpers/blueprint_helper.rb +26 -0
  283. data/spec/helpers/cli_helper.rb +36 -0
  284. data/spec/helpers/connection_helper.rb +41 -0
  285. data/spec/helpers/crypto_helper.rb +17 -0
  286. data/spec/helpers/csv_helper.rb +18 -0
  287. data/spec/helpers/process_helper.rb +33 -0
  288. data/spec/helpers/project_helper.rb +59 -0
  289. data/spec/helpers/schedule_helper.rb +31 -0
  290. data/spec/helpers/spec_helper.rb +15 -0
  291. data/spec/integration/blueprint_updates_spec.rb +101 -0
  292. data/spec/integration/blueprint_with_grain_spec.rb +72 -0
  293. data/spec/integration/clients_spec.rb +134 -0
  294. data/spec/integration/command_datawarehouse_spec.rb +39 -0
  295. data/spec/integration/command_projects_spec.rb +32 -0
  296. data/spec/integration/create_from_template_spec.rb +22 -0
  297. data/spec/integration/create_project_spec.rb +24 -0
  298. data/spec/integration/date_dim_switch_spec.rb +142 -0
  299. data/spec/integration/deprecated_load_spec.rb +58 -0
  300. data/spec/integration/full_process_schedule_spec.rb +298 -0
  301. data/spec/integration/full_project_spec.rb +569 -0
  302. data/spec/integration/over_to_user_filters_spec.rb +94 -0
  303. data/spec/integration/partial_md_export_import_spec.rb +42 -0
  304. data/spec/integration/project_spec.rb +264 -0
  305. data/spec/integration/rest_spec.rb +213 -0
  306. data/spec/integration/schedule_spec.rb +626 -0
  307. data/spec/integration/segments_spec.rb +141 -0
  308. data/spec/integration/user_filters_spec.rb +290 -0
  309. data/spec/integration/user_group_spec.rb +127 -0
  310. data/spec/integration/variables_spec.rb +188 -0
  311. data/spec/logging_in_logging_out_spec.rb +93 -0
  312. data/spec/spec_helper.rb +95 -0
  313. data/spec/unit/bricks/bricks_spec.rb +35 -0
  314. data/spec/unit/bricks/middleware/aws_middelware_spec.rb +51 -0
  315. data/spec/unit/bricks/middleware/bench_middleware_spec.rb +15 -0
  316. data/spec/unit/bricks/middleware/bulk_salesforce_middleware_spec.rb +15 -0
  317. data/spec/unit/bricks/middleware/gooddata_middleware_spec.rb +15 -0
  318. data/spec/unit/bricks/middleware/logger_middleware_spec.rb +15 -0
  319. data/spec/unit/bricks/middleware/restforce_middleware_spec.rb +15 -0
  320. data/spec/unit/bricks/middleware/stdout_middleware_spec.rb +15 -0
  321. data/spec/unit/bricks/middleware/twitter_middleware_spec.rb +15 -0
  322. data/spec/unit/cli/cli_spec.rb +17 -0
  323. data/spec/unit/cli/commands/cmd_auth_spec.rb +17 -0
  324. data/spec/unit/commands/command_projects_spec.rb +22 -0
  325. data/spec/unit/core/connection_spec.rb +57 -0
  326. data/spec/unit/core/logging_spec.rb +133 -0
  327. data/spec/unit/core/nil_logger_spec.rb +13 -0
  328. data/spec/unit/core/project_spec.rb +54 -0
  329. data/spec/unit/extensions/hash_spec.rb +23 -0
  330. data/spec/unit/godzilla/goodzilla_spec.rb +78 -0
  331. data/spec/unit/helpers/csv_helper_spec.rb +22 -0
  332. data/spec/unit/helpers/data_helper_spec.rb +61 -0
  333. data/spec/unit/helpers/global_helpers_spec.rb +111 -0
  334. data/spec/unit/helpers_spec.rb +86 -0
  335. data/spec/unit/models/blueprint/attributes_spec.rb +29 -0
  336. data/spec/unit/models/blueprint/dataset_spec.rb +121 -0
  337. data/spec/unit/models/blueprint/labels_spec.rb +44 -0
  338. data/spec/unit/models/blueprint/project_blueprint_spec.rb +648 -0
  339. data/spec/unit/models/blueprint/reference_spec.rb +29 -0
  340. data/spec/unit/models/blueprint/schema_builder_spec.rb +38 -0
  341. data/spec/unit/models/blueprint/to_wire_spec.rb +174 -0
  342. data/spec/unit/models/domain_spec.rb +144 -0
  343. data/spec/unit/models/execution_spec.rb +108 -0
  344. data/spec/unit/models/from_wire_spec.rb +296 -0
  345. data/spec/unit/models/invitation_spec.rb +17 -0
  346. data/spec/unit/models/membership_spec.rb +132 -0
  347. data/spec/unit/models/metadata_spec.rb +104 -0
  348. data/spec/unit/models/metric_spec.rb +117 -0
  349. data/spec/unit/models/model_spec.rb +82 -0
  350. data/spec/unit/models/params_spec.rb +118 -0
  351. data/spec/unit/models/profile_spec.rb +215 -0
  352. data/spec/unit/models/project_creator_spec.rb +127 -0
  353. data/spec/unit/models/project_role_spec.rb +94 -0
  354. data/spec/unit/models/project_spec.rb +162 -0
  355. data/spec/unit/models/report_result_data_spec.rb +199 -0
  356. data/spec/unit/models/schedule_spec.rb +418 -0
  357. data/spec/unit/models/to_manifest_spec.rb +63 -0
  358. data/spec/unit/models/unit_project_spec.rb +125 -0
  359. data/spec/unit/models/user_filters_spec.rb +95 -0
  360. data/spec/unit/models/variable_spec.rb +265 -0
  361. data/spec/unit/rest/polling_spec.rb +89 -0
  362. data/spec/unit/rest/resource_spec.rb +10 -0
  363. data/yard-server.sh +3 -0
  364. metadata +1125 -0
@@ -0,0 +1,298 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Copyright (c) 2010-2015 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
+
40
+ end
41
+
42
+ after(:all) do
43
+ ScheduleHelper.remove_old_schedules(@project)
44
+ ProcessHelper.remove_old_processes(@project)
45
+
46
+ # @process.delete if @process
47
+ # @project.delete if @project
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
+
67
+ expect(@process.executables).to eq ['process.rb']
68
+ end
69
+
70
+ it "should have empty schedules on deploy" do
71
+ expect(@process.schedules).to eq []
72
+ end
73
+
74
+ it "should be able to create schedule triggered by another schedule" do
75
+ begin
76
+ schedule_first = @process.create_schedule('0 15 27 7 *', @process.executables.first)
77
+ schedule = @process.create_schedule(schedule_first, @process.executables.first)
78
+ res = @process.schedules
79
+ expect(res.count).to eq 2
80
+ expect(@process.schedules.map(&:uri)).to include(schedule_first.uri, schedule.uri)
81
+ ensure
82
+ schedule && schedule.delete
83
+ schedule_first && schedule_first.delete
84
+ end
85
+ end
86
+
87
+ it "should be able to create schedule triggered by another schedule specified by ID" do
88
+ begin
89
+ schedule_first = @process.create_schedule('0 15 27 7 *', @process.executables.first)
90
+ schedule = @process.create_schedule(schedule_first.obj_id, @process.executables.first)
91
+ res = @process.schedules
92
+ expect(res.count).to eq 2
93
+ expect(schedule.after).to eq schedule_first
94
+ expect(@process.schedules.map(&:uri)).to include(schedule_first.uri, schedule.uri)
95
+ ensure
96
+ schedule && schedule.delete
97
+ schedule_first && schedule_first.delete
98
+ end
99
+ end
100
+
101
+ it "should be able to delete schedule" do
102
+ begin
103
+ schedule = @process.create_schedule('0 15 27 7 *', @process.executables.first)
104
+ res = @process.schedules
105
+ expect(res.count).to eq 1
106
+ expect(@process.schedules).to eq [schedule]
107
+ ensure
108
+ schedule && schedule.delete
109
+ end
110
+ end
111
+
112
+ it "should be possible to read status of schedule" do
113
+ begin
114
+ schedule = @process.create_schedule('0 15 27 7 *', @process.executables.first)
115
+ expect(schedule.state).to eq 'ENABLED'
116
+ ensure
117
+ schedule && schedule.delete
118
+ end
119
+ end
120
+
121
+ it "should be possible to execute schedule" do
122
+ begin
123
+ schedule = @process.create_schedule('0 15 27 7 *', @process.executables.first)
124
+ executions_count = schedule.executions.count
125
+ result = schedule.execute
126
+ expect(result.status).to eq :ok
127
+ log = result.log
128
+ expect(log.index('Hello Ruby executors')).not_to eq nil
129
+ expect(log.index('Hello Ruby from the deep')).not_to eq nil
130
+ expect(executions_count + 1).to eq schedule.executions.count
131
+ ensure
132
+ schedule && schedule.delete
133
+ end
134
+ end
135
+
136
+ it "should be possible to deploy only a single file" do
137
+ process = @project.deploy_process('./spec/data/hello_world_process/hello_world.rb',
138
+ type: 'RUBY',
139
+ name: 'Test ETL one file Process')
140
+ begin
141
+ schedule = process.create_schedule('0 15 27 7 *', process.executables.first)
142
+ result = schedule.execute
143
+ expect(result.status).to eq :ok
144
+ log = result.log
145
+ expect(log.index('HELLO WORLD')).not_to eq nil
146
+ expect(schedule.enabled?).to be_truthy
147
+ schedule.disable
148
+ schedule.save
149
+ expect(schedule.enabled?).to be_falsey
150
+ expect(schedule.disabled?).to be_truthy
151
+ schedule.enable
152
+ schedule.save
153
+ expect(schedule.enabled?).to be_truthy
154
+ ensure
155
+ schedule && schedule.delete
156
+ process && process.delete
157
+ end
158
+ end
159
+
160
+ it "should be possible to deploy already zipped file" do
161
+ process = @project.deploy_process('./spec/data/hello_world_process/hello_world.zip',
162
+ type: 'RUBY',
163
+ name: 'Test ETL zipped file Process')
164
+ begin
165
+ expect(process.schedules.count).to eq 0
166
+ schedule = process.create_schedule('0 15 27 7 *', process.executables.first)
167
+ result = schedule.execute
168
+ expect(result.status).to eq :ok
169
+ log = result.log
170
+ expect(log.index('HELLO WORLD')).not_to eq nil
171
+ expect(process.schedules.count).to eq 1
172
+ ensure
173
+ schedule && schedule.delete
174
+ process && process.delete
175
+ end
176
+ end
177
+
178
+ it 'should be possible to deploy and run zipped file and print GoodData::VERSION' do
179
+ process = @project.deploy_process('./spec/data/gooddata_version_process/gooddata_version.zip',
180
+ type: 'RUBY',
181
+ name: 'Test ETL zipped file GoodData Process')
182
+ begin
183
+ expect(process.schedules.count).to eq 0
184
+ schedule = process.create_schedule('0 15 27 7 *', process.executables.first)
185
+ result = schedule.execute
186
+ expect(result.status).to eq :ok
187
+ log = result.log
188
+ expect(log.index('GoodData::VERSION - 0.6.')).not_to eq nil
189
+ expect(process.schedules.count).to eq 1
190
+ ensure
191
+ schedule && schedule.delete
192
+ process && process.delete
193
+ end
194
+ end
195
+
196
+ it 'should be possible to deploy and run directory and use nested parameters' do
197
+ process = @project.deploy_process('./spec/data/ruby_params_process',
198
+ type: 'RUBY',
199
+ name: 'Test ETL dir GoodData Process')
200
+ begin
201
+ expect(process.schedules.count).to eq 0
202
+ schedule = process.create_schedule('0 15 27 7 *', process.executables.first, params: COMPLEX_PARAMS)
203
+ result = schedule.execute
204
+ expect(result.status).to eq :ok
205
+ log = result.log
206
+ expect(log.index('Joe')).not_to eq nil
207
+ expect(log.index('San Francisco')).not_to eq nil
208
+ expect(process.schedules.count).to eq 1
209
+ ensure
210
+ schedule && schedule.delete
211
+ process && process.delete
212
+ end
213
+ end
214
+
215
+ it 'should be possible to deploy and run directory and use nested hidden parameters' do
216
+ process = @project.deploy_process('./spec/data/ruby_params_process',
217
+ type: 'RUBY',
218
+ name: 'Test ETL dir GoodData Process')
219
+ begin
220
+ expect(process.schedules.count).to eq 0
221
+ schedule = process.create_schedule('0 15 27 7 *', process.executables.first, hidden_params: COMPLEX_PARAMS)
222
+ result = schedule.execute
223
+ # expect(result.status).to eq :ok
224
+ log = result.log
225
+ expect(process.schedules.count).to eq 1
226
+ ensure
227
+ schedule && schedule.delete
228
+ process && process.delete
229
+ end
230
+ end
231
+
232
+ it "should be possible to download deployed process" do
233
+ size = File.size('./spec/data/hello_world_process/hello_world.zip')
234
+ process = @project.deploy_process('./spec/data/hello_world_process/hello_world.zip',
235
+ type: 'RUBY',
236
+ name: 'Test ETL zipped file Process')
237
+ begin
238
+ Tempfile.open('downloaded-process') do |temp|
239
+ temp << process.download
240
+ temp.flush
241
+ expect(File.size(temp.path)).to eq size
242
+ end
243
+ ensure
244
+ process && process.delete
245
+ end
246
+ end
247
+
248
+ it "should be able to redeploy via project" do
249
+ begin
250
+ process = @project.deploy_process('./spec/data/hello_world_process/hello_world.zip',
251
+ type: 'RUBY',
252
+ name: 'Test ETL zipped file Process',
253
+ process_id: @process.obj_id)
254
+ ensure
255
+ process && process.delete
256
+ end
257
+ end
258
+
259
+ it "should be able to redeploy directly" do
260
+ begin
261
+ process1 = @project.deploy_process('./spec/data/hello_world_process/hello_world.zip',
262
+ type: 'RUBY',
263
+ name: 'Test ETL zipped file Process')
264
+
265
+ process2 = process1.deploy('./spec/data/ruby_process/process.rb')
266
+ expect(process1.executables).not_to eq process2.executables
267
+ ensure
268
+ process1 && process1.delete
269
+ end
270
+ end
271
+
272
+ it 'should be able to deploy from app_store' do
273
+ begin
274
+ process = @project.deploy_process('https://github.com/gooddata/app_store/tree/sfdc_downloader_brick-v0.0.4/apps/ads_integrator_brick')
275
+ expect(process.class).to eq GoodData::Process
276
+ ensure
277
+ process.delete
278
+ end
279
+ end
280
+
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)
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
+ end
@@ -0,0 +1,569 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Copyright (c) 2010-2015 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 project implementation", :constraint => 'slow' do
10
+ before(:all) do
11
+ @spec = JSON.parse(File.read("./spec/data/blueprints/test_project_model_spec.json"), :symbolize_names => true)
12
+ @invalid_spec = JSON.parse(File.read("./spec/data/blueprints/invalid_blueprint.json"), :symbolize_names => true)
13
+ @client = ConnectionHelper::create_default_connection
14
+ @blueprint = GoodData::Model::ProjectBlueprint.new(@spec)
15
+ @invalid_blueprint = GoodData::Model::ProjectBlueprint.new(@invalid_spec)
16
+
17
+ @project = @client.create_project_from_blueprint(@blueprint, token: ConnectionHelper::GD_PROJECT_TOKEN, environment: ProjectHelper::ENVIRONMENT)
18
+ end
19
+
20
+ after(:all) do
21
+ @project.delete unless @project.nil?
22
+
23
+ @client.disconnect
24
+ end
25
+
26
+ it "should not build an invalid model" do
27
+ expect {
28
+ @client.create_project_from_blueprint(@invalid_spec, auth_token: ConnectionHelper::GD_PROJECT_TOKEN, environment: ProjectHelper::ENVIRONMENT)
29
+ }.to raise_error(GoodData::ValidationError)
30
+ end
31
+
32
+ it "should do nothing if the project is updated with the same blueprint" do
33
+ results = GoodData::Model::ProjectCreator.migrate_datasets(@spec, project: @project, client: @client, dry_run: true)
34
+ expect(results).to be_nil
35
+ end
36
+
37
+ it 'should try to rename a dataset back' do
38
+ dataset = @project.datasets('dataset.repos')
39
+ dataset.title = "Some title"
40
+ dataset.save
41
+
42
+ # Now the update of project using the original blueprint should offer update of the title. Nothing else.
43
+ results = GoodData::Model::ProjectCreator.migrate_datasets(@blueprint, project: @project, client: @client, dry_run: true)
44
+ results = GoodData::Model::ProjectCreator.migrate_datasets(@spec, project: @project, client: @client, dry_run: true)
45
+ expect(results['updateScript']['maqlDdl']).to eq "ALTER DATASET {dataset.repos} VISUAL(TITLE \"Repositories\", DESCRIPTION \"\");\n"
46
+
47
+ # Update using a freshly gained blueprint should offer no changes.
48
+ new_blueprint = @project.blueprint
49
+ results = GoodData::Model::ProjectCreator.migrate_datasets(new_blueprint, project: @project, client: @client, dry_run: true)
50
+ expect(results).to be_nil
51
+
52
+ # When we change the model using the original blueprint. Basically change the title back.
53
+ results = @project.update_from_blueprint(@spec)
54
+ # It should offer no changes using the original blueprint
55
+ results = GoodData::Model::ProjectCreator.migrate_datasets(@spec, project: @project, client: @client, dry_run: true)
56
+ expect(results).to be_nil
57
+ end
58
+
59
+ it "should contain datasets" do
60
+ bp = @project.blueprint
61
+ expect(bp.datasets.count).to eq 3
62
+ expect(bp.datasets(:all, :include_date_dimensions => true).count).to eq 4
63
+ end
64
+
65
+ it "should contain metadata datasets" do
66
+ expect(@project.datasets.count).to eq 4
67
+ expect(@project.datasets.select(&:date_dimension?).count).to eq 1
68
+ end
69
+
70
+ it "should be able to rename a project" do
71
+ former_title = @project.title
72
+ a_title = (0...8).map { (65 + rand(26)).chr }.join
73
+ @project.title = a_title
74
+ @project.save
75
+ expect(@project.title).to eq a_title
76
+ @project.title = former_title
77
+ @project.save
78
+ end
79
+
80
+ it "should be able to validate a project" do
81
+ @project.validate
82
+ end
83
+
84
+ it "should compute an empty metric" do
85
+ f = @project.fact_by_title('Lines Changed')
86
+ metric = @project.create_metric("SELECT SUM(#\"#{f.title}\")")
87
+ expect(metric.execute).to be_nil
88
+ end
89
+
90
+ it "should compute an empty report def" do
91
+ @project.delete_all_data(force: true)
92
+ f = @project.fact_by_title('Lines Changed')
93
+ metric = @project.create_metric("SELECT SUM(#\"#{f.title}\")")
94
+ res = @project.compute_report(:left => [metric])
95
+ expect(res).to be_empty
96
+ end
97
+
98
+ it "should load the data" do
99
+ GoodData.with_project(@project) do |p|
100
+ # blueprint = GoodData::Model::ProjectBlueprint.new(@spec)
101
+ commits_data = [
102
+ ["lines_changed","committed_on","dev_id","repo_id"],
103
+ [1,"01/01/2014",1,1],
104
+ [3,"01/02/2014",2,2],
105
+ [5,"05/02/2014",3,1]]
106
+ @project.upload(commits_data, @blueprint, 'dataset.commits')
107
+
108
+ devs_data = [
109
+ ["dev_id", "email"],
110
+ [1, "tomas@gooddata.com"],
111
+ [2, "petr@gooddata.com"],
112
+ [3, "jirka@gooddata.com"]]
113
+ @project.upload(devs_data, @blueprint, 'dataset.devs')
114
+ end
115
+ end
116
+
117
+ it "it silently ignores extra columns" do
118
+ GoodData.with_project(@project) do |p|
119
+ blueprint = GoodData::Model::ProjectBlueprint.new(@spec)
120
+ commits_data = [
121
+ ["lines_changed","committed_on","dev_id","repo_id", "extra_column"],
122
+ [1,"01/01/2014",1,1,"something"],
123
+ [3,"01/02/2014",2,2,"something"],
124
+ [5,"05/02/2014",3,1,"something else"]
125
+ ]
126
+ @project.upload(commits_data, blueprint, 'dataset.commits')
127
+ end
128
+ end
129
+
130
+ context "it should give you a reasonable error message" do
131
+ it "if you omit a column" do
132
+ GoodData.with_project(@project) do |p|
133
+ blueprint = GoodData::Model::ProjectBlueprint.new(@spec)
134
+ commits_data = [
135
+ ["lines_changed","committed_on","dev_id"],
136
+ [1,"01/01/2014",1],
137
+ [3,"01/02/2014",2],
138
+ [5,"05/02/2014",3]
139
+ ]
140
+ expect {@project.upload(commits_data, blueprint, 'dataset.commits')}.to raise_error(/repo_id/)
141
+ end
142
+ end
143
+ it "if you give it a malformed CSV" do
144
+ GoodData.with_project(@project) do |p|
145
+ blueprint = GoodData::Model::ProjectBlueprint.new(@spec)
146
+ # 4 cols in header but not in the data
147
+ commits_data = [
148
+ ["lines_changed","committed_on","dev_id","repo_id"],
149
+ [1,"01/01/2014",1],
150
+ [3,"01/02/2014",2],
151
+ [5,"05/02/2014",3]
152
+ ]
153
+ expect {@project.upload(commits_data, blueprint, 'dataset.commits')}.to raise_error(/Number of columns/)
154
+ end
155
+ end
156
+ it "if you give it wrong date format" do
157
+ GoodData.with_project(@project) do |p|
158
+ blueprint = GoodData::Model::ProjectBlueprint.new(@spec)
159
+ commits_data = [
160
+ ["lines_changed","committed_on","dev_id","repo_id"],
161
+ [1,"01/01/2014",1,1],
162
+ [3,"45/50/2014",2,2],
163
+ [5,"05/02/2014",3,1]
164
+ ]
165
+ expect {@project.upload(commits_data, blueprint, 'dataset.commits')}.to raise_error(%r{45/50/2014})
166
+ end
167
+ end
168
+ end
169
+
170
+ it "should compute a metric" do
171
+ f = @project.fact_by_title('Lines Changed')
172
+ metric = @project.create_metric("SELECT SUM(#\"#{f.title}\")")
173
+ expect(metric.execute).to eq 9
174
+ end
175
+
176
+ it "should compute a count metric from dataset" do
177
+ # works on anchor without label
178
+ expect(@blueprint.datasets('dataset.commits').count(@project)).to eq 3
179
+
180
+ # works on anchor with label
181
+ expect(@blueprint.datasets('dataset.devs').count(@project)).to eq 3
182
+ end
183
+
184
+ it "should execute an anonymous metric twice and not fail" do
185
+ f = @project.fact_by_title('Lines Changed')
186
+ metric = @project.create_metric("SELECT SUM(#\"#{f.title}\")")
187
+ expect(metric.execute).to eq 9
188
+ # Since GD platform cannot execute inline specified metric the metric has to be saved
189
+ # The code tries to resolve this as transparently as possible
190
+ # Here we are testing that you can execute the metric twice. The first execution is on unsaved metric
191
+ # We wanna make sure that when we are cleaning up we are not messing things up
192
+ expect(metric.execute).to eq 9
193
+ end
194
+
195
+ it "should compute a report def" do
196
+ f = @project.fact_by_title('Lines Changed')
197
+
198
+ # 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"
199
+ metric = @project.create_metric("SELECT SUM(#\"#{f.title}\")", :title => "My metric")
200
+ metric.save
201
+ result = @project.compute_report(:top => [metric], :left => ['label.devs.dev_id.email'])
202
+ expect(result[2][1]).to eq 3
203
+ expect(result.include_row?(["jirka@gooddata.com", 5])).to be true
204
+
205
+ result2 = @project.compute_report(:top => [metric], :left => ['label.devs.dev_id.email'])
206
+ expect(result2[2][1]).to eq 3
207
+ expect(result2.include_row?(["jirka@gooddata.com", 5])).to eq true
208
+ expect(result2).to eq result
209
+ end
210
+
211
+ it "should be able to lock reports and everything underneath" do
212
+ m = @project.metrics.first
213
+ r = @project.create_report(top: [m], title: 'xy')
214
+ r.save
215
+ expect(m.locked?).to eq false
216
+ expect(r.locked?).to eq false
217
+ r.lock_with_dependencies!
218
+ expect(r.locked?).to eq true
219
+ m.reload!
220
+ expect(m.locked?).to eq true
221
+ r.unlock_with_dependencies!
222
+ expect(r.locked?).to eq false
223
+ m.reload!
224
+ expect(m.locked?).to eq false
225
+ r.lock!
226
+ expect(r.locked?).to eq true
227
+ r.unlock!
228
+ expect(r.locked?).to eq false
229
+ r.delete
230
+ end
231
+
232
+ it "should be able to purge report from older revisions" do
233
+ m = @project.metrics.first
234
+ r = @project.create_report(top: [m], title: 'xy')
235
+ expect(r.definitions.count).to eq 1
236
+
237
+ rd = GoodData::ReportDefinition.create(:top => [m], :client => @client, :project => @project)
238
+ rd.save
239
+ r.add_definition(rd)
240
+ r.save
241
+ expect(r.definitions.count).to eq 2
242
+ end
243
+
244
+ it "should be able to clean colors from a chart report def" do
245
+ f = @project.fact_by_title('Lines Changed')
246
+ m = @project.create_metric("SELECT SUM(#\"#{f.title}\")", title: 'test metric').save
247
+ r = @project.create_report(top: [m], title: 'xy')
248
+ rd = r.latest_report_definition
249
+ rd.content['chart'] = { 'styles' => { 'global' => { 'colorMapping' => 1 } } }
250
+
251
+ expect(GoodData::Helpers.get_path(rd.content, %w(chart styles global))).to eq ({ 'colorMapping' => 1 })
252
+ rd.reset_color_mapping!
253
+ expect(GoodData::Helpers.get_path(rd.content, %w(chart styles global))).to eq ({ 'colorMapping' => [] })
254
+ r.delete
255
+ res = m.used_by
256
+ res.each do |dependency|
257
+ @client.delete dependency['link']
258
+ end
259
+ res = m.used_by
260
+ expect(res.length).to eq 0
261
+ m.delete
262
+ end
263
+
264
+ it "should be able to update report definition (update existing)" do
265
+ m = @project.metrics.first
266
+ r = @project.create_report(top: [m], title: 'xy')
267
+
268
+ latest_uri = r.definition_uri
269
+ new_def = r.update_definition do |definition|
270
+ definition.title = "Test TITLE: #{DateTime.now.strftime}"
271
+ end
272
+
273
+ expect(r.definition_uri).to eq new_def.uri
274
+ expect(r.definition_uri).to_not eq latest_uri
275
+ end
276
+
277
+ it "should be able to update report definition (create new)" do
278
+ m = @project.metrics.first
279
+ r = @project.create_report(top: [m], title: 'xy')
280
+
281
+ latest_uri = r.definition_uri
282
+ new_def = r.update_definition(:new_definition => false) do |definition|
283
+ definition.title = "Test TITLE: #{DateTime.now.strftime}"
284
+ end
285
+
286
+ expect(r.definition_uri).to eq new_def.uri
287
+ expect(r.definition_uri).to eq latest_uri
288
+ end
289
+
290
+ it "should be possible to get all metrics" do
291
+ metrics1 = @project.metrics
292
+ expect(metrics1.count).to be >= 0
293
+ end
294
+
295
+ it "should be possible to get all metrics with full objects" do
296
+ metrics = @project.metrics(:all)
297
+ expect(metrics.first.class).to be GoodData::Metric
298
+ end
299
+
300
+ it "should be able to get a metric by identifier" do
301
+ metrics = @project.metrics
302
+ metric = @project.metrics(metrics.first.identifier)
303
+ expect(metric.identifier).to eq metrics.first.identifier
304
+ expect(metrics.first).to eq metric
305
+ end
306
+
307
+ it "should be able to get a metric by uri" do
308
+ metrics = @project.metrics
309
+ metric = @project.metrics(metrics.first.uri)
310
+ expect(metric.uri).to eq metrics.first.uri
311
+ expect(metrics.first).to eq metric
312
+ end
313
+
314
+ it "should be able to get a metric by object id" do
315
+ metrics = @project.metrics
316
+ metric = @project.metrics(metrics.first.obj_id)
317
+ expect(metric.obj_id).to eq metrics.first.obj_id
318
+ expect(metrics.first).to eq metric
319
+ end
320
+
321
+ it "should exercise the object relations and getting them in various ways" do
322
+ # Find a metric by name
323
+ metric = @project.metric_by_title('My metric')
324
+ the_same_metric = @project.metrics(metric)
325
+ expect(metric).to eq the_same_metric
326
+
327
+ # grab fact in several different ways
328
+ fact1 = @project.fact_by_title('Lines Changed')
329
+ fact2 = @project.facts(fact1.identifier)
330
+ fact3 = @project.facts(fact2.obj_id)
331
+ fact4 = @project.facts(fact3.uri)
332
+ fact5 = @client.create(GoodData::Fact, fact4)
333
+
334
+ # All should be the same
335
+ expect(fact1).to eq fact2
336
+ expect(fact1).to eq fact2
337
+ expect(fact1).to eq fact3
338
+ expect(fact1).to eq fact4
339
+ expect(fact1).to eq fact5
340
+
341
+ fact3.title = "Somewhat changed title"
342
+ expect(fact1).not_to eq fact3
343
+
344
+ metric.using(nil)
345
+ res = metric.using('fact')
346
+ expect(res.count).to eq 1
347
+
348
+ fact1.used_by(nil)
349
+ res = fact1.used_by('metric')
350
+ expect(res.count).to eq 1
351
+
352
+ res = metric.using?(fact1)
353
+ expect(res).to be(true)
354
+
355
+ res = fact1.using?(metric)
356
+ expect(res).to be(false)
357
+
358
+ res = metric.used_by?(fact1)
359
+ expect(res).to be(false)
360
+
361
+ res = fact1.used_by?(metric)
362
+ expect(res).to be(true)
363
+ end
364
+
365
+ it "should try setting and getting by tags" do
366
+ fact = @project.fact_by_title('Lines Changed')
367
+ expect(fact.tags.empty?).to be_truthy
368
+
369
+ fact.tags = "tag1 tag2 tag3"
370
+ fact.save
371
+
372
+ tagged_facts = GoodData::Fact.find_by_tag('tag3', :client => @client, :project => @project)
373
+ expect(tagged_facts.count).to eq 1
374
+ end
375
+
376
+ it "should be able to interpolate metric based on" do
377
+ res = @project.compute_metric "SELECT SUM(![fact.commits.lines_changed])"
378
+ expect(res).to eq 9
379
+
380
+ res = @project.compute_metric "SELECT SUM(![fact.commits.lines_changed])"
381
+ expect(res).to eq 9
382
+
383
+ res = @project.compute_metric "SELECT SUM(![fact.commits.lines_changed])"
384
+ expect(res).to eq 9
385
+
386
+ res = @project.compute_metric "SELECT SUM(![fact.commits.lines_changed])"
387
+ expect(res).to eq 9
388
+
389
+ fact = @project.fact_by_title('Lines Changed')
390
+ expect(fact.fact?).to be true
391
+ res = fact.create_metric(:type => :sum).execute
392
+ expect(res).to eq 9
393
+ end
394
+
395
+ it "should load the data" do
396
+ devs_data = [
397
+ ["dev_id", "email"],
398
+ [4, "josh@gooddata.com"]]
399
+ @project.upload(devs_data, @blueprint, 'dataset.devs', mode: 'INCREMENTAL')
400
+ end
401
+
402
+ it "should have more users" do
403
+ attribute = @project.attributes('attr.devs.dev_id')
404
+ expect(attribute.attribute?).to be true
405
+ expect(attribute.create_metric.execute).to eq 4
406
+ end
407
+
408
+ it "should tell you whether metric contains a certain attribute" do
409
+ attribute = @project.attributes('attr.devs.dev_id')
410
+ repo_attribute = @project.attributes('attr.repos.repo_id')
411
+ metric = attribute.create_metric(:title => "My test metric")
412
+ metric.save
413
+ expect(metric.execute).to eq 4
414
+
415
+ expect(metric.contain?(attribute)).to be true
416
+ expect(metric.contain?(repo_attribute)).to be false
417
+ metric.replace!(attribute => repo_attribute)
418
+ metric.save
419
+ expect(metric.execute).not_to eq 4
420
+
421
+ l = attribute.primary_label
422
+ value = l.values.first[:value]
423
+ expect(l.find_element_value(l.find_value_uri(value))).to eq value
424
+ expect(l.value?(value)).to eq true
425
+ expect(l.value?("DEFINITELY NON EXISTENT VALUE HOPEFULLY")).to eq false
426
+ end
427
+
428
+ it "should be able to compute count of different datasets" do
429
+ attribute = @project.attributes('attr.devs.dev_id')
430
+ dataset_attribute = @project.attributes('attr.commits.factsof')
431
+ expect(attribute.create_metric(:attribute => dataset_attribute).execute).to eq 3
432
+ end
433
+
434
+ it "should be able to tell you if a value is contained in a metric" do
435
+ attribute = @project.attributes('attr.devs.dev_id')
436
+ label = attribute.primary_label
437
+ value = label.values.first
438
+ fact = @project.facts('fact.commits.lines_changed')
439
+ metric = @project.create_metric("SELECT SUM([#{fact.uri}]) WHERE [#{attribute.uri}] = [#{value[:uri]}]")
440
+ expect(metric.contain_value?(label, value[:value])).to be true
441
+ end
442
+
443
+ it "should be able to replace the values in a metric" do
444
+ attribute = @project.attributes('attr.devs.dev_id')
445
+ label = attribute.primary_label
446
+ value = label.values.first
447
+ different_value = label.values.drop(1).first
448
+ fact = @project.facts('fact.commits.lines_changed')
449
+ metric = @project.create_metric("SELECT SUM([#{fact.uri}]) WHERE [#{attribute.uri}] = [#{value[:uri]}]")
450
+ metric.replace_value(label, value[:value], different_value[:value])
451
+ expect(metric.contain_value?(label, value[:value])).to be false
452
+ expect(metric.pretty_expression).to eq "SELECT SUM([Lines Changed]) WHERE [Dev] = [josh@gooddata.com]"
453
+ end
454
+
455
+ it "should be able to lookup the attributes by regexp and return a collection" do
456
+ attrs = @project.attributes_by_title(/Date/i)
457
+ expect(attrs.count).to eq 1
458
+ end
459
+
460
+ it "should be able to give you values of the label as an array of hashes" do
461
+ attribute = @project.attributes('attr.devs.dev_id')
462
+ label = attribute.primary_label
463
+ expect(label.values.map { |v| v[:value] }).to eq [
464
+ 'jirka@gooddata.com',
465
+ 'josh@gooddata.com',
466
+ 'petr@gooddata.com',
467
+ 'tomas@gooddata.com'
468
+ ]
469
+ end
470
+
471
+ it "should be able to give you values for" do
472
+ attribute = @project.attributes('attr.devs.dev_id')
473
+ expect(attribute.values_for(2)).to eq ["tomas@gooddata.com", "1"]
474
+ end
475
+
476
+ it "should be able to find specific element and give you the primary label value" do
477
+ attribute = @project.attributes('attr.devs.dev_id')
478
+ expect(@project.find_attribute_element_value("#{attribute.uri}/elements?id=2")).to eq 'tomas@gooddata.com'
479
+ end
480
+
481
+ it "should be able to give you label by name" do
482
+ attribute = @project.attributes('attr.devs.dev_id')
483
+ label = attribute.label_by_name('Id')
484
+ expect(label.label?).to eq true
485
+ expect(label.title).to eq 'Id'
486
+ expect(label.identifier).to eq 'label.devs.dev_id.id'
487
+ expect(label.attribute_uri).to eq attribute.uri
488
+ expect(label.attribute).to eq attribute
489
+ end
490
+
491
+ it "should be able to return values of the attribute for inspection" do
492
+ attribute = @project.attributes('attr.devs.dev_id')
493
+ vals = attribute.values
494
+ expect(vals.count).to eq 4
495
+ expect(vals.first.count).to eq 2
496
+ expect(vals.first.first[:value]).to eq "jirka@gooddata.com"
497
+ end
498
+
499
+ it "should be able to save_as a metric" do
500
+ m = @project.metric_by_title("My test metric")
501
+ cloned = m.save_as
502
+ m_cloned = @project.metric_by_title("Clone of My test metric")
503
+ expect(m_cloned).to eq cloned
504
+ expect(m_cloned.execute).to eq cloned.execute
505
+ end
506
+
507
+ it "should be able to clone a project and transfer the data" do
508
+ title = 'My new clone project'
509
+ begin
510
+ cloned_project = @project.clone(title: title, auth_token: ConnectionHelper::GD_PROJECT_TOKEN, environment: ProjectHelper::ENVIRONMENT)
511
+ expect(cloned_project.title).to eq title
512
+ expect(cloned_project.facts.first.create_metric.execute).to eq 9
513
+ m = @project.facts.first.create_metric
514
+ m.identifier = 'metric.cloned_metric'
515
+ m.save
516
+
517
+ result = @project.transfer_objects(m, project: cloned_project)
518
+ expect(result).to be_truthy
519
+ cloned_metric = cloned_project.metrics('metric.cloned_metric')
520
+ expect(cloned_metric).not_to be_nil
521
+
522
+ cloned_metric.delete
523
+ cloned_metric = cloned_project.metrics('metric.cloned_metric')
524
+ expect(cloned_metric).to be_nil
525
+
526
+ result = @project.transfer_objects(m, project: [cloned_project], batch_size: 1)
527
+ expect(result).to eq [{project: cloned_project, result: true}]
528
+
529
+ # should work with pids
530
+ result = @project.transfer_objects(m, project: [cloned_project.pid], batch_size: 1)
531
+ expect(result.first[:result]).to be_truthy
532
+ ensure
533
+ cloned_project.delete
534
+ end
535
+ end
536
+
537
+ it "should be able to clone a project without data" do
538
+ title = 'My new clone project'
539
+ cloned_project = @project.clone(title: title, auth_token: ConnectionHelper::GD_PROJECT_TOKEN, environment: ProjectHelper::ENVIRONMENT, data: false)
540
+ expect(cloned_project.title).to eq title
541
+ expect(cloned_project.facts.first.create_metric.execute).to eq nil
542
+ cloned_project.delete
543
+ end
544
+
545
+ it "should be able to export report" do
546
+ m = @project.metrics.first
547
+ r = @project.create_report(top: [m], title: 'Report to export')
548
+ r.save
549
+ r.export(:csv)
550
+ r.export(:pdf)
551
+ r.delete
552
+ end
553
+
554
+ it "should be able to delete report along with its definitions" do
555
+ m = @project.metrics.first
556
+ r = @project.create_report(top: [m], title: 'Report to delete')
557
+ r.save
558
+ def_uris = r.definition_uris
559
+ r.delete
560
+ expect { def_uris.each {|uri| @client.get(uri)} }.to raise_error(RestClient::ResourceNotFound)
561
+ end
562
+
563
+ it 'should be possible to delete data from a dataset' do
564
+ dataset = @project.datasets('dataset.devs')
565
+ expect(dataset.attributes.first.create_metric.execute).to be > 0
566
+ dataset.delete_data
567
+ expect(dataset.attributes.first.create_metric.execute).to be_nil
568
+ end
569
+ end