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,83 @@
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 'dashboard_builder'
8
+ require_relative 'schema_builder'
9
+
10
+ module GoodData
11
+ module Model
12
+ class ProjectBuilder
13
+ attr_accessor :data
14
+
15
+ class << self
16
+ def create_from_data(blueprint, title = 'Title')
17
+ pb = ProjectBuilder.new(title)
18
+ pb.data = blueprint.to_hash
19
+ pb
20
+ end
21
+
22
+ def create(title, _options = {}, &block)
23
+ pb = ProjectBuilder.new(title)
24
+ block.call(pb)
25
+ pb
26
+ end
27
+ end
28
+
29
+ def initialize(title, options = {})
30
+ @data = {}
31
+ @data[:title] = title
32
+ @data[:datasets] = []
33
+ @data[:date_dimensions] = []
34
+ @data.merge(options)
35
+ end
36
+
37
+ def add_date_dimension(id, options = {})
38
+ dimension = {
39
+ type: :date_dimension,
40
+ urn: options[:urn],
41
+ id: id,
42
+ title: options[:title]
43
+ }
44
+
45
+ data[:date_dimensions] << dimension
46
+ end
47
+
48
+ def add_dataset(id, options = {}, &block)
49
+ builder = GoodData::Model::SchemaBuilder.new(id, options)
50
+ block.call(builder) if block
51
+ fail 'Dataset has to have id defined' if id.blank?
52
+ datasets = data[:datasets]
53
+ if datasets.any? { |item| item[:id] == id }
54
+ ds = datasets.find { |item| item[:id] == id }
55
+ index = datasets.index(ds)
56
+ stuff = GoodData::Model.merge_dataset_columns(ds, builder.to_hash)
57
+ datasets.delete_at(index)
58
+ datasets.insert(index, stuff)
59
+ else
60
+ datasets << builder.to_hash
61
+ end
62
+ end
63
+
64
+ def to_json(options = {})
65
+ eliminate_empty = options[:eliminate_empty] || false
66
+
67
+ if eliminate_empty
68
+ JSON.pretty_generate(to_hash.reject { |_k, v| v.is_a?(Enumerable) && v.empty? })
69
+ else
70
+ JSON.pretty_generate(to_hash)
71
+ end
72
+ end
73
+
74
+ def to_blueprint
75
+ GoodData::Model::ProjectBlueprint.new(to_hash)
76
+ end
77
+
78
+ def to_hash
79
+ data
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,43 @@
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 'blueprint_field'
8
+
9
+ module GoodData
10
+ module Model
11
+ class ReferenceBlueprintField < BlueprintField
12
+ # Returns the schema that is referenced by this ref
13
+ #
14
+ # @return [GoodData::Model::SchemaBlueprint] the referencesd schema
15
+ def dataset
16
+ dataset_blueprint.find_dataset(reference, include_date_dimensions: true)
17
+ end
18
+
19
+ # Returns the string reference of the ref which is string Id of dataset that is referenced.
20
+ #
21
+ # @return [String] Id of the referenced dataset
22
+ def reference
23
+ data[:dataset]
24
+ end
25
+
26
+ # Validates the fields in the ref
27
+ #
28
+ # @return [Array] returns list of the errors represented by hash structures
29
+ def validate
30
+ validate_presence_of(:dataset).map do |e|
31
+ { type: :error, message: "Field \"#{e}\" is not defined or empty for reference \"#{data}\"" }
32
+ end
33
+ end
34
+
35
+ # Returns the md object in associated project or throws error if not present
36
+ #
37
+ # @return [GoodData::MdObject] md object that is represented in the blueprint
38
+ def in_project(_project)
39
+ fail NotImplementedError, 'Reference does not have representation as an object in datamart'
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,160 @@
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
+ module Model
9
+ class SchemaBlueprint
10
+ attr_accessor :data, :project_blueprint
11
+
12
+ def initialize(dim, blueprint)
13
+ @data = dim
14
+ @project_blueprint = blueprint
15
+ end
16
+
17
+ # Returns true if anchor is present. Currently returns always true. Probably good to remove
18
+ #
19
+ # @return [Boolean] is anchor on schema?l70
20
+ def anchor?
21
+ true
22
+ end
23
+
24
+ # Returns anchor
25
+ #
26
+ # @return [GoodData::Model::AnchorBlueprintField] anchor on schema
27
+ def anchor
28
+ nil
29
+ end
30
+
31
+ # Returns list of all references defined on the schema.
32
+ #
33
+ # @return [Array<GoodData::Model::ReferenceBlueprintField>] refs on schema
34
+ def references
35
+ []
36
+ end
37
+
38
+ # Returns list of all facts defined on the schema.
39
+ #
40
+ # @return [Array<GoodData::Model::FactBlueprintField>] facts on schema
41
+ def facts(_id = :all, _options = {})
42
+ []
43
+ end
44
+
45
+ # Returns list of all attributes defined on the schema.
46
+ #
47
+ # @return [Array<GoodData::Model::AttributeBlueprintField>] attributes on schema
48
+ def attributes(_id = :all, _options = {})
49
+ []
50
+ end
51
+
52
+ # Returns list of all labels defined on the schema.
53
+ #
54
+ # @return [Array<GoodData::Model::LabelBlueprintField>] labels on schema
55
+ def labels(_id = :all, _options = {})
56
+ []
57
+ end
58
+
59
+ # Returns list of all fields defined on the schema.
60
+ #
61
+ # @return [Array<GoodData::Model::BlueprintField>] all fields on schema
62
+ def fields
63
+ []
64
+ end
65
+
66
+ # Returns list of attributes and anchor.
67
+ #
68
+ # @return [Array<GoodData::Model::AnchorBlueprintField | GoodData::Model::AttributeBlueprintField>]
69
+ def attributes_and_anchors
70
+ []
71
+ end
72
+
73
+ # Returns list of attributes that can break facts in a given dataset.
74
+ # This basically means that it is giving you all attributes from this
75
+ # dataset and datasets that are referenced by given dataset transitively.
76
+ # Includes only anchors that have labels.
77
+ #
78
+ # @return [Array<GoodData::Model::BlueprintField>]
79
+ def broken_by
80
+ attrs = attributes_and_anchors.reject { |a| a.labels.empty? }
81
+ attrs + references.map(&:dataset).flat_map(&:broken_by)
82
+ end
83
+
84
+ # Returns list of attributes that are broken by attributes in this dataset. This means
85
+ # all anchors and attributes from this dataset and the ones that are referenced by any
86
+ # dataset. It works transitively. Includes only anchors that have labels.
87
+ #
88
+ # @return [Array<GoodData::Model::AnchorBlueprintField | GoodData::Model::AttributeBlueprintField>]
89
+ def breaks
90
+ attrs = attributes_and_anchors.reject { |a| a.labels.empty? }
91
+ referenced_by.empty? ? attrs : attrs + referenced_by.flat_map(&:breaks)
92
+ end
93
+
94
+ # Relays request on finding a dataset in the associated project blueprint. Used by reference fields
95
+ #
96
+ # @param dataset [String] Name of a dataset
97
+ # @param options [Hash] additional options. See ProjectBlueprint form more
98
+ # @return [GoodData::Model::DatasetBlueprint] returns matching dataset or throws an error
99
+ def find_dataset(dataset, options = {})
100
+ project_blueprint.find_dataset(dataset, options)
101
+ end
102
+
103
+ # Returns id of the schema
104
+ #
105
+ # @return [String] returns id
106
+ def id
107
+ data[:id]
108
+ end
109
+
110
+ # Returns dataset that are referencing this dataset (directly through references not transitively).
111
+ #
112
+ # @return [Array<GoodData::Model::SchemaBlueprint>] returns id
113
+ def referenced_by
114
+ @project_blueprint.referencing(self)
115
+ end
116
+
117
+ # Returns dataset that are referenced by this dataset (directly through references not transitively).
118
+ #
119
+ # @return [Array<GoodData::Model::SchemaBlueprint>] returns id
120
+ def referencing
121
+ references.map(&:dataset)
122
+ end
123
+
124
+ # Returns title of the dataset. If it is not set up. It is generated for you
125
+ # based on the name which is titleized
126
+ #
127
+ # @return [String]
128
+ def title
129
+ data[:title] || GoodData::Helpers.titleize(data[:id])
130
+ end
131
+
132
+ # Validates the blueprint and returns true if model is valid. False otherwise.
133
+ #
134
+ # @return [Boolean] is model valid?
135
+ def valid?
136
+ validate.empty?
137
+ end
138
+
139
+ # Validates the blueprint and returns array of errors.
140
+ #
141
+ # @return [Array<Hash>] returns array of errors or empty array
142
+ def validate
143
+ fields.flat_map(&:validate)
144
+ end
145
+
146
+ # Compares two blueprints. This is done by comapring the hash represenatation.
147
+ # It has to be exacty identical including the order of the columns
148
+ #
149
+ # @param name [GoodData::Model::DatasetBlueprint] Name of a field
150
+ # @return [Boolean] matching fields
151
+ def ==(other)
152
+ to_hash == other.to_hash
153
+ end
154
+
155
+ def to_hash
156
+ @data
157
+ end
158
+ end
159
+ end
160
+ end
@@ -0,0 +1,89 @@
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
+ module Model
9
+ class SchemaBuilder
10
+ attr_accessor :data
11
+
12
+ class << self
13
+ def create_from_data(blueprint)
14
+ sc = SchemaBuilder.new
15
+ sc.data = blueprint.to_hash
16
+ sc
17
+ end
18
+
19
+ def create(id, options = {}, &block)
20
+ pb = SchemaBuilder.new(id, options)
21
+ block.call(pb)
22
+ pb
23
+ end
24
+ end
25
+
26
+ def initialize(id = nil, options = {})
27
+ @data = {
28
+ id: id,
29
+ type: :dataset,
30
+ columns: []
31
+ }.merge(options)
32
+ end
33
+
34
+ def name
35
+ data[:name]
36
+ end
37
+
38
+ def columns
39
+ data[:columns]
40
+ end
41
+
42
+ def add_column(column_def)
43
+ columns.push(column_def)
44
+ self
45
+ end
46
+
47
+ def add_anchor(id, options = {})
48
+ add_column({ type: :anchor, id: id }.merge(options))
49
+ self
50
+ end
51
+
52
+ def add_attribute(id, options = {})
53
+ add_column({ type: :attribute, id: id }.merge(options))
54
+ self
55
+ end
56
+
57
+ def add_fact(id, options = {})
58
+ data = { type: :fact, id: id }.merge(options)
59
+ add_column(data)
60
+ self
61
+ end
62
+
63
+ def add_label(id, options = {})
64
+ add_column({ type: :label, id: id }.merge(options))
65
+ self
66
+ end
67
+
68
+ def add_date(dataset_id, options = {})
69
+ add_column({ type: :date, dataset: dataset_id, format: GoodData::Model::DEFAULT_DATE_FORMAT }.merge(options))
70
+ end
71
+
72
+ def add_reference(dataset, options = {})
73
+ add_column({ type: :reference, dataset: dataset }.merge(options))
74
+ end
75
+
76
+ def to_json
77
+ JSON.pretty_generate(to_hash)
78
+ end
79
+
80
+ def to_hash
81
+ data
82
+ end
83
+
84
+ def to_blueprint
85
+ GoodData::Model::ProjectBlueprint.new(datasets: [to_hash])
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,181 @@
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
+ module Model
9
+ module ToManifest
10
+ # Converts attribute or anchor to manifest
11
+ #
12
+ # @param project [GoodData::Model::ProjectBlueprint] Project blueprint
13
+ # @param dataset [GoodData::Model::SchemaBlueprint] Dataset blueprint
14
+ # @param attribute [Hash] Attribute or Anchor
15
+ # @param mode [String] Mode of the load. Either FULL or INCREMENTAL
16
+ # @return [Hash] Manifest for a particular reference
17
+ def self.attribute_to_manifest(_project, dataset, a, mode)
18
+ labels = DatasetBlueprint.labels_for_attribute(dataset, a)
19
+ [{
20
+ 'referenceKey' => 1,
21
+ 'populates' => [labels.first[:id]],
22
+ 'mode' => mode,
23
+ 'columnName' => labels.first[:column_name] || labels.first[:id]
24
+ }]
25
+ end
26
+
27
+ # Sets the active project
28
+ #
29
+ # @param project A project identifier
30
+ #
31
+ # ### Examples
32
+ #
33
+ # The following calls are equivalent
34
+ #
35
+ def self.column_to_manifest(project, dataset, c, mode)
36
+ case c[:type].to_sym
37
+ when :label
38
+ label_to_manifest(project, dataset, c, mode)
39
+ when :fact
40
+ fact_to_manifest(project, dataset, c, mode)
41
+ when :date_fact
42
+ fact_to_manifest(project, dataset, c, mode)
43
+ when :reference
44
+ reference_to_manifest(project, dataset, c, mode)
45
+ when :date
46
+ date_ref_to_manifest(project, dataset, c, mode)
47
+ else
48
+ []
49
+ end
50
+ end
51
+
52
+ # Converts dataset into manifest. Since for manifest of a dataset you need to
53
+ # have access to the whole project blueprint it requires both project and
54
+ # dataset blueprints. It generates the manifest for blueprint and then selects
55
+ # only the one for particular dataset
56
+ #
57
+ # @param project [GoodData::Model::ProjectBlueprint] Project blueprint
58
+ # @param dataset [GoodData::Model::SchemaBlueprint] Dataset blueprint
59
+ # @param mode [String] Mode of the load. Either FULL or INCREMENTAL
60
+ # @return [Hash] Manifest for a particular dataset
61
+ def self.dataset_to_manifest(project, dataset, mode = 'FULL')
62
+ dataset = dataset.is_a?(String) ? Model::ProjectBlueprint.find_dataset(project, dataset) : dataset
63
+ dataset = dataset.to_hash
64
+ res = Model::ProjectBlueprint.datasets(project).zip(to_manifest(project, mode)).find do |ds|
65
+ ds.first == dataset
66
+ end
67
+ res[1]
68
+ end
69
+
70
+ # Converts data reference to manifest
71
+ #
72
+ # @param project [GoodData::Model::ProjectBlueprint] Project blueprint
73
+ # @param dataset [GoodData::Model::SchemaBlueprint] Dataset blueprint
74
+ # @param reference [Hash] Reference
75
+ # @param mode [String] Mode of the load. Either FULL or INCREMENTAL
76
+ # @return [Hash] Manifest for a particular date reference
77
+ def self.date_ref_to_manifest(project, _dataset, reference, mode)
78
+ referenced_dataset = ProjectBlueprint.find_date_dimension(project, reference[:dataset])
79
+ ref = "#{referenced_dataset[:id]}.date.mdyy"
80
+ format = reference[:format] || GoodData::Model::DEFAULT_DATE_FORMAT
81
+ GoodData.logger.info("Using date format \"#{format}\" for referencing attribute \"#{ref}\" of date dimension \"#{referenced_dataset[:id]}\"")
82
+ [{
83
+ 'populates' => [ref],
84
+ 'mode' => mode,
85
+ 'constraints' => { 'date' => format },
86
+ 'columnName' => reference[:column_name] || reference[:dataset],
87
+ 'referenceKey' => 1
88
+ }]
89
+ end
90
+
91
+ # Converts fact to manifest
92
+ #
93
+ # @param project [GoodData::Model::ProjectBlueprint] Project blueprint
94
+ # @param dataset [GoodData::Model::SchemaBlueprint] Dataset blueprint
95
+ # @param fact [Hash] Fact
96
+ # @param mode [String] Mode of the load. Either FULL or INCREMENTAL
97
+ # @return [Hash] Manifest for a particular fact
98
+ def self.fact_to_manifest(_project, _dataset, fact, mode)
99
+ [{
100
+ 'populates' => [fact[:id]],
101
+ 'mode' => mode,
102
+ 'columnName' => fact[:column_name] || fact[:id]
103
+ }]
104
+ end
105
+
106
+ # Generates safe name for upload
107
+ # @param dataset_path [String] Input name
108
+ # @return [String] Generated upload filename
109
+ def self.generate_upload_filename(dataset_path)
110
+ sanitized_name = dataset_path.gsub(/[^0-9a-z]/i, '_')
111
+ # ts = DateTime.now.strftime('%Y%m%d%H%M%S%6N')
112
+ # "#{sanitized_name}-#{ts}.csv"
113
+ "#{sanitized_name}.csv"
114
+ end
115
+
116
+ # Converts label to manifest
117
+ #
118
+ # @param project [GoodData::Model::ProjectBlueprint] Project blueprint
119
+ # @param dataset [GoodData::Model::SchemaBlueprint] Dataset blueprint
120
+ # @param label [Hash] Label
121
+ # @param mode [String] Mode of the load. Either FULL or INCREMENTAL
122
+ # @return [Hash] Manifest for a particular label
123
+ def self.label_to_manifest(_project, dataset, label, mode)
124
+ a = DatasetBlueprint.attribute_for_label(dataset, label)
125
+ labels = DatasetBlueprint.labels_for_attribute(dataset, a)
126
+
127
+ label = {}.tap do |l|
128
+ l['referenceKey'] = 1 if labels.first == label
129
+ l['populates'] = [label[:id]]
130
+ l['mode'] = mode
131
+ l['columnName'] = label[:column_name] || label[:id]
132
+ end
133
+ [label]
134
+ end
135
+
136
+ # The entry function of the module. Converts the ProjectBlueprint to manifest
137
+ # to be used with SLI (GD loading interface).
138
+ #
139
+ # @param project [GoodData::Model::ProjectBlueprint] Project blueprint
140
+ # @param mode [String] Mode of the load. Either FULL or INCREMENTAL
141
+ # @return [Hash] Manifest for a particular project
142
+ def self.to_manifest(project, mode = 'FULL')
143
+ ProjectBlueprint.datasets(project.to_hash).map do |dataset|
144
+ columns = GoodData::Model::DatasetBlueprint.columns(dataset)
145
+ {
146
+ 'dataSetSLIManifest' => {
147
+ 'parts' => columns.mapcat { |c| column_to_manifest(project, dataset, c, mode) },
148
+ 'dataSet' => dataset[:id],
149
+ 'file' => ToManifest.generate_upload_filename(dataset[:id]), # should be configurable
150
+ 'csvParams' => {
151
+ 'quoteChar' => '"',
152
+ 'escapeChar' => '"',
153
+ 'separatorChar' => ',',
154
+ 'endOfLine' => "\n"
155
+ }
156
+ }
157
+ }
158
+ end
159
+ end
160
+
161
+ # Converts reference to manifest
162
+ #
163
+ # @param project [GoodData::Model::ProjectBlueprint] Project blueprint
164
+ # @param dataset [GoodData::Model::SchemaBlueprint] Dataset blueprint
165
+ # @param reference [Hash] Reference
166
+ # @param mode [String] Mode of the load. Either FULL or INCREMENTAL
167
+ # @return [Hash] Manifest for a particular reference
168
+ def self.reference_to_manifest(project, _dataset, reference, mode)
169
+ referenced_dataset = ProjectBlueprint.find_dataset(project, reference[:dataset])
170
+ anchor = DatasetBlueprint.anchor(referenced_dataset)
171
+ label = DatasetBlueprint.labels_for_attribute(referenced_dataset, anchor).first
172
+ [{
173
+ 'populates' => [label[:id]],
174
+ 'mode' => mode,
175
+ 'columnName' => reference[:column_name] || reference[:dataset],
176
+ 'referenceKey' => 1
177
+ }]
178
+ end
179
+ end
180
+ end
181
+ end