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,62 @@
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
+ module GoodData
8
+ class DashboardAttachment
9
+ include GoodData::Mixin::RootKeyGetter
10
+ include GoodData::Mixin::DataGetter
11
+
12
+ attr_reader :scheduled_email
13
+ attr_accessor :json
14
+
15
+ DEFAULT_OPTS = {
16
+ :allTabs => 1,
17
+ :tabs => []
18
+ }
19
+
20
+ def initialize(scheduled_email, json)
21
+ @scheduled_email = scheduled_email
22
+ @json = json
23
+ end
24
+
25
+ # Get all tabs flag
26
+ #
27
+ # @return [Fixnum] All dashboard tabs?
28
+ def all_tabs
29
+ data['allTabs']
30
+ end
31
+
32
+ # Set all tabs flag
33
+ #
34
+ # @param [String | Fixnum] new_all_tabs New value of all_tabs flag to be set
35
+ # @return [Fixnum] New value of all_tabs flag
36
+ def all_tabs=(new_all_tabs)
37
+ data['allTabs'] = new_all_tabs.to_i
38
+ end
39
+
40
+ # Get selected tabs
41
+ #
42
+ # @return [Array<String>] List of selected tabs
43
+ def tabs
44
+ data['tabs']
45
+ end
46
+
47
+ # Set selected tabs
48
+ #
49
+ # @param [Array<String>] new_tabs New list of selected tabs to be set
50
+ # @return [Array<String>] New list of selected tabs
51
+ def tabs=(new_tabs)
52
+ data['tabs'] = new_tabs
53
+ end
54
+
55
+ # Get attachment URI
56
+ #
57
+ # @return [String] Attachment URI
58
+ def uri
59
+ data['uri']
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,64 @@
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
+ module GoodData
8
+ class ReportAttachment
9
+ include GoodData::Mixin::RootKeyGetter
10
+ include GoodData::Mixin::DataGetter
11
+
12
+ attr_reader :scheduled_email
13
+ attr_accessor :json
14
+
15
+ DEFAULT_OPTS = {
16
+ :formats => %w(pdf xls),
17
+ :exportOptions => {
18
+ :pageOrientation => 'landscape'
19
+ }
20
+ }
21
+
22
+ def initialize(scheduled_email, json)
23
+ @scheduled_email = scheduled_email
24
+ @json = json
25
+ end
26
+
27
+ # Get export options settings
28
+ #
29
+ # @return [Hash] Export options settings
30
+ def export_options
31
+ data['exportOptions']
32
+ end
33
+
34
+ # Set export options settings
35
+ #
36
+ # @param [Hash] new_export_options New export options settings to be set
37
+ # @return [Hash] New export options settings
38
+ def export_options=(new_export_options)
39
+ data['exportOptions'] = new_export_options
40
+ end
41
+
42
+ # Get formats
43
+ #
44
+ # @return [Array<String>] List of selected formats
45
+ def formats
46
+ data['formats']
47
+ end
48
+
49
+ # Set formats
50
+ #
51
+ # @param [String | Array<String>] new_formats New list of selected formats to be set
52
+ # @return [Array<String>] New list of selected formats
53
+ def formats=(new_formats)
54
+ data['formats'] = new_formats.is_a?(Array) ? new_formats : [new_formats]
55
+ end
56
+
57
+ # Get attachment URI
58
+ #
59
+ # @return [String] Attachment URI
60
+ def uri
61
+ data['uri']
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,91 @@
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_relative '../metadata'
8
+
9
+ require_relative 'metadata'
10
+
11
+ module GoodData
12
+ class Variable < MdObject
13
+ class << self
14
+ # Method intended to get all objects of that type in a specified project
15
+ #
16
+ # @param options [Hash] the options hash
17
+ # @option options [Boolean] :full if passed true the subclass can decide to pull in full objects. This is desirable from the usability POV but unfortunately has negative impact on performance so it is not the default
18
+ # @return [Array<GoodData::MdObject> | Array<Hash>] Return the appropriate metadata objects or their representation
19
+ def all(options = { :client => GoodData.connection, :project => GoodData.project })
20
+ query('prompt', Variable, options)
21
+ end
22
+
23
+ def create(data, options = { :client => GoodData.connection, :project => GoodData.project })
24
+ title = data[:title]
25
+ project = options[:project]
26
+ c = client(options)
27
+ attribute = project.attributes(data[:attribute])
28
+
29
+ payload = {
30
+ 'prompt' => {
31
+ 'content' => {
32
+ 'attribute' => attribute.uri,
33
+ 'type' => 'filter'
34
+ },
35
+ 'meta' => {
36
+ 'tags' => '',
37
+ 'deprecated' => '0',
38
+ 'summary' => '',
39
+ 'title' => title,
40
+ 'category' => 'prompt'
41
+ }
42
+ }
43
+ }
44
+ c.create(self, payload, project: project)
45
+ end
46
+ end
47
+
48
+ # Retrieves variable values
49
+ #
50
+ # @return [Array<GoodData::VariableUserFilter>] Values of variable
51
+ def values
52
+ payload = {
53
+ variablesSearch: {
54
+ variables: [
55
+ uri
56
+ ],
57
+ context: []
58
+ }
59
+ }
60
+ client.post("/gdc/md/#{project.pid}/variables/search", payload)['variables'].map { |f| client.create(GoodData::VariableUserFilter, f, project: project) }
61
+ end
62
+
63
+ # Retrieves variable values and returns only those related to user
64
+ #
65
+ # @return [Array<GoodData::VariableUserFilter>] Values of variable related to user
66
+ def user_values
67
+ values.select { |x| x.level == :user }
68
+ end
69
+
70
+ # Method used for replacing values in their state according to mapping. Can be used to replace any values but it is typically used to replace the URIs. Returns a new object of the same type.
71
+ #
72
+ # @param [Array<Array>]Mapping specifying what should be exchanged for what. As mapping should be used output of GoodData::Helpers.prepare_mapping.
73
+ # @return [GoodData::Variable]
74
+ def replace(mapping)
75
+ GoodData::MdObject.replace_quoted(self, mapping)
76
+ end
77
+
78
+ # Retrieves variable values and returns only those related to project
79
+ #
80
+ # @return [Array<GoodData::VariableUserFilter>] Values of variable related to project
81
+ def project_values
82
+ values.select { |x| x.level == :project }
83
+ end
84
+
85
+ # Deletes all the values and eventually the variable itself
86
+ def delete
87
+ values.pmap(&:delete)
88
+ super
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,282 @@
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_relative '../core/rest'
8
+
9
+ require_relative 'metadata/metadata'
10
+
11
+ require_relative 'links'
12
+ require_relative 'module_constants'
13
+ require_relative 'user_filters/user_filters'
14
+ require_relative 'blueprint/blueprint'
15
+
16
+ require 'fileutils'
17
+ require 'multi_json'
18
+ require 'open-uri'
19
+ require 'zip'
20
+
21
+ ##
22
+ # Module containing classes that counter-part GoodData server-side meta-data
23
+ # elements, including the server-side data model.
24
+ #
25
+ module GoodData
26
+ module Model
27
+ # See https://confluence.intgdc.com/display/plat/Catalog+of+Attribute+Types
28
+ GD_TYPES = [
29
+ # Common Types
30
+ 'GDC.link',
31
+ 'GDC.text',
32
+ 'GDC.time',
33
+
34
+ # Common Date Attribute Types
35
+ 'GDC.time.year',
36
+ 'GDC.time.quarter',
37
+ 'GDC.time.month',
38
+ 'GDC.time.week',
39
+ 'GDC.time.date',
40
+
41
+ # Specific Date Attribute Types
42
+ 'GDC.time.day_in_euweek',
43
+ 'GDC.time.day_in_week',
44
+ 'GDC.time.day_in_month',
45
+ 'GDC.time.day_in_quarter',
46
+ 'GDC.time.day_in_year',
47
+ 'GDC.time.euweek_in_quarter',
48
+ 'GDC.time.week_in_quarter',
49
+ 'GDC.time.euweek_in_year',
50
+ 'GDC.time.week_in_year',
51
+ 'GDC.time.month_in_quarter',
52
+ 'GDC.time.month_in_year',
53
+ 'GDC.time.quarter_in_year',
54
+
55
+ # Legacy Date Attribute Types - Possibly Obsolete
56
+ 'GDC.time.dayOfWeek',
57
+ 'GDC.time.dayOfMonth',
58
+ 'GDC.time.dayOfQuarter',
59
+ 'GDC.time.dayOfYear',
60
+ 'GDC.time.weekOfYear',
61
+ 'GDC.time.monthOfYear',
62
+ 'GDC.time.quarterOfYear',
63
+
64
+ # Types for Geo
65
+ 'GDC.geo.pin', # Geo pushpin
66
+ 'GDC.geo.ausstates.name', # Australia States (Name)
67
+ 'GDC.geo.ausstates.code', # Australia States (ISO code)
68
+ 'GDC.geo.usstates.name', # US States (Name)
69
+ 'GDC.geo.usstates.geo_id', # US States (US Census ID)
70
+ 'GDC.geo.usstates.code', # US States (2-letter code)
71
+ 'GDC.geo.uscounties.geo_id', # US Counties (US Census ID)
72
+ 'GDC.geo.worldcountries.name', # World countries (Name)
73
+ 'GDC.geo.worldcountries.iso2', # World countries (ISO a2)
74
+ 'GDC.geo.worldcountries.iso3', # World countries (ISO a3)
75
+ 'GDC.geo.czdistricts.name', # Czech Districts (Name)
76
+ 'GDC.geo.czdistricts.name_no_diacritics', # Czech Districts
77
+ 'GDC.geo.czdistricts.nuts4', # Czech Districts (NUTS 4)
78
+ 'GDC.geo.czdistricts.knok', # Czech Districts (KNOK)
79
+
80
+ # Day Display Forms
81
+ 'GDC.time.day', # yyyy-MM-dd
82
+ 'GDC.time.day_us', # MM/dd/yyyy
83
+ 'GDC.time.day_eu', # dd/MM/yyyy
84
+ 'GDC.time.day_iso', # dd-MM-yyyy
85
+ 'GDC.time.day_us_long', # EEE, MMM d, yyyy
86
+ 'GDC.time.day_us_noleading', # M/d/yy
87
+ ]
88
+
89
+ GD_DATA_TYPES = ['BIGINT', 'DOUBLE', 'INTEGER', 'INT', /^VARCHAR\(\d{1,3}\)$/i, /^DECIMAL\(\d{1,3},\s*\d{1,3}\)$/i]
90
+
91
+ DEFAULT_FACT_DATATYPE = 'DECIMAL(12,2)'
92
+ DEFAULT_ATTRIBUTE_DATATYPE = 'VARCHAR(128)'
93
+
94
+ DEFAULT_TYPE = 'GDC.text'
95
+
96
+ DEFAULT_DATE_FORMAT = 'MM/dd/yyyy'
97
+
98
+ class << self
99
+ def title(item)
100
+ item[:title] || GoodData::Helpers.titleize(item[:id])
101
+ end
102
+
103
+ def column_name(item)
104
+ item[:column_name] || item[:id]
105
+ end
106
+
107
+ def description(item)
108
+ item[:description]
109
+ end
110
+
111
+ def check_gd_type(value)
112
+ GD_TYPES.any? { |v| v == value }
113
+ end
114
+
115
+ def check_gd_data_type(value)
116
+ GD_DATA_TYPES.any? do |v|
117
+ case v
118
+ when Regexp
119
+ v =~ value
120
+ when String
121
+ v == (value && value.upcase)
122
+ else
123
+ fail 'Unkown predicate'
124
+ end
125
+ end
126
+ end
127
+
128
+ def normalize_gd_data_type(type)
129
+ if type && type.upcase == 'INTEGER'
130
+ 'INT'
131
+ else
132
+ type
133
+ end
134
+ end
135
+
136
+ # Load given file into a data set described by the given schema
137
+ def upload_data(path, project_blueprint, dataset, options = { :client => GoodData.connection, :project => GoodData.project })
138
+ data = [
139
+ {
140
+ data: path,
141
+ dataset: dataset,
142
+ options: options
143
+ }
144
+ ]
145
+ GoodData::Model.upload_multiple_data(data, project_blueprint, options)
146
+ end
147
+
148
+ # Uploads multiple data sets using batch upload interface
149
+ # @param data [String|Array] Input data
150
+ # @param project_blueprint [ProjectBlueprint] Project blueprint
151
+ # @param options [Hash] Additional options
152
+ # @return [Hash] Batch upload result
153
+ def upload_multiple_data(data, project_blueprint, options = { :client => GoodData.connection, :project => GoodData.project })
154
+ client, project = GoodData.get_client_and_project(options)
155
+
156
+ project ||= GoodData.project
157
+
158
+ manifest = {
159
+
160
+ 'dataSetSLIManifestList' => data.map do |d|
161
+ mode = d[:options] && d[:options][:mode] ? d[:options][:mode] : options[:mode] || 'FULL'
162
+ GoodData::Model::ToManifest.dataset_to_manifest(project_blueprint, d[:dataset], mode)
163
+ end
164
+ }
165
+
166
+ csv_headers = []
167
+
168
+ # create a temporary zip file
169
+ dir = Dir.mktmpdir
170
+ begin
171
+ Zip::File.open("#{dir}/upload.zip", Zip::File::CREATE) do |zip|
172
+ # TODO: make sure schema columns match CSV column names
173
+ zip.get_output_stream('upload_info.json') { |f| f.puts JSON.pretty_generate(manifest) }
174
+
175
+ data.zip(manifest['dataSetSLIManifestList']).each do |item|
176
+ path = item[0][:data]
177
+ path = item[0][:data].path if item[0][:data].respond_to? :path
178
+ inline_data = !path.is_a?(String)
179
+ csv_header = nil
180
+
181
+ filename = item[1]['dataSetSLIManifest']['file']
182
+
183
+ if inline_data
184
+ csv_header = path.first
185
+ zip.get_output_stream(filename) do |f|
186
+ path.each do |row|
187
+ f.puts row.to_csv
188
+ end
189
+ end
190
+ else
191
+ csv_header = File.open(path, &:gets).split(',')
192
+ zip.add(filename, path)
193
+ end
194
+
195
+ csv_headers << csv_header
196
+ end
197
+ end
198
+
199
+ # upload it
200
+ client.upload_to_user_webdav("#{dir}/upload.zip", :directory => File.basename(dir), :client => options[:client], :project => options[:project])
201
+ ensure
202
+ FileUtils.rm_rf dir
203
+ end
204
+ csv_headers.flatten!
205
+
206
+ # kick the load
207
+ pull = { 'pullIntegration' => File.basename(dir) }
208
+ link = project.md.links('etl')['pull2']
209
+
210
+ # TODO: List uploaded datasets
211
+ task = client.post(link, pull, :info_message => 'Starting the data load from user storage to dataset.')
212
+
213
+ res = client.poll_on_response(task['pull2Task']['links']['poll'], :info_message => 'Getting status of the dataload task.') do |body|
214
+ body['wTaskStatus']['status'] == 'RUNNING' || body['wTaskStatus']['status'] == 'PREPARED'
215
+ end
216
+
217
+ if res['wTaskStatus']['status'] == 'ERROR'
218
+ s = StringIO.new
219
+
220
+ messages = res['wTaskStatus']['messages'] || []
221
+ messages.each do |msg|
222
+ GoodData.logger.error(JSON.pretty_generate(msg))
223
+ end
224
+
225
+ begin
226
+ client.download_from_user_webdav(File.basename(dir) + '/upload_status.json', s, :client => client, :project => project)
227
+ rescue => e
228
+ raise "Unable to download upload_status.json from remote server, reason: #{e.message}"
229
+ end
230
+
231
+ js = MultiJson.load(s.string)
232
+ manifests = manifest['dataSetSLIManifestList'].map do |m|
233
+ m['dataSetSLIManifest']
234
+ end
235
+
236
+ parts = manifests.map do |m|
237
+ m['parts']
238
+ end
239
+
240
+ manifest_cols = parts.flatten.map { |c| c['columnName'] }
241
+
242
+ # extract some human readable error message from the webdav file
243
+ manifest_extra = manifest_cols - csv_headers
244
+ csv_extra = csv_headers - manifest_cols
245
+
246
+ error_message = begin
247
+ js['error']['message'] % js['error']['parameters']
248
+ rescue NoMethodError, ArgumentError
249
+ ''
250
+ end
251
+ m = "Load failed with error '#{error_message}'.\n"
252
+ m += "Columns that should be there (manifest) but aren't in uploaded csv: #{manifest_extra}\n" unless manifest_extra.empty?
253
+ m += "Columns that are in csv but shouldn't be there (manifest): #{csv_extra}\n" unless csv_extra.empty?
254
+ m += "Columns in the uploaded csv: #{csv_headers}\n"
255
+ m += "Columns in the manifest: #{manifest_cols}\n"
256
+ m += "Original message:\n#{JSON.pretty_generate(js)}\n"
257
+ m += "Manifest used for uploading:\n#{JSON.pretty_generate(manifest)}"
258
+ fail m
259
+ end
260
+
261
+ res
262
+ end
263
+
264
+ def merge_dataset_columns(a_schema_blueprint, b_schema_blueprint)
265
+ a_schema_blueprint = a_schema_blueprint.to_hash
266
+ b_schema_blueprint = b_schema_blueprint.to_hash
267
+ d = GoodData::Helpers.deep_dup(a_schema_blueprint)
268
+ d[:columns] = d[:columns] + b_schema_blueprint[:columns]
269
+ d[:columns].uniq!
270
+ columns_that_failed_to_merge = d[:columns].group_by { |x| [:reference, :date].include?(x[:type]) ? x[:dataset] : x[:id] }.map { |k, v| [k, v.count, v] }.select { |x| x[1] > 1 }
271
+ unless columns_that_failed_to_merge.empty?
272
+ columns_that_failed_to_merge.each do |error|
273
+ GoodData.logger.error "Columns #{error[0]} failed to merge. There are #{error[1]} conflicting columns. When merging columns with the same name they have to be identical."
274
+ GoodData.logger.error error[2]
275
+ end
276
+ fail "Columns #{columns_that_failed_to_merge.first} failed to merge. There are #{columns_that_failed_to_merge[1]} conflicting columns. #{columns_that_failed_to_merge[2]} When merging columns with the same name they have to be identical." unless columns_that_failed_to_merge.empty?
277
+ end
278
+ d
279
+ end
280
+ end
281
+ end
282
+ end