gooddata-edge 0.6.27.edge

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 (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