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,518 @@
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 '../rest/resource'
8
+ require_relative '../extensions/hash'
9
+ require_relative '../mixins/rest_resource'
10
+ require_relative '../helpers/global_helpers'
11
+
12
+ require_relative 'execution'
13
+
14
+ module GoodData
15
+ class Schedule < Rest::Resource
16
+ attr_reader :dirty, :json
17
+
18
+ SCHEDULE_TEMPLATE = {
19
+ :schedule => {
20
+ :type => nil,
21
+ :timezone => nil,
22
+ :params => {},
23
+ :hiddenParams => {},
24
+ # :reschedule => nil
25
+ }
26
+ }
27
+
28
+ class << self
29
+ # Looks for schedule
30
+ # @param id [String] URL, ID of schedule or :all
31
+ # @return [GoodData::Schedule|Array<GoodData::Schedule>] List of schedules
32
+ def [](id, opts = { :client => GoodData.connection, :project => GoodData.project })
33
+ c, project = GoodData.get_client_and_project(opts)
34
+
35
+ if id == :all
36
+ GoodData::Schedule.all(opts)
37
+ else
38
+ if id =~ %r{\/gdc\/projects\/[a-zA-Z\d]+\/schedules\/?[a-zA-Z\d]*}
39
+ url = id
40
+ tmp = c.get url
41
+ return c.create(GoodData::Schedule, tmp)
42
+ end
43
+
44
+ tmp = c.get "/gdc/projects/#{project.pid}/schedules/#{id}"
45
+ c.create(GoodData::Schedule, tmp, project: project)
46
+ end
47
+ end
48
+
49
+ # Returns list of all schedules for active project
50
+ # @return [Array<GoodData::Schedule>] List of schedules
51
+ def all(opts = { :client => GoodData.connection, :project => GoodData.project })
52
+ c, project = GoodData.get_client_and_project(opts)
53
+
54
+ tmp = c.get "/gdc/projects/#{project.pid}/schedules"
55
+ tmp['schedules']['items'].map { |schedule| c.create(GoodData::Schedule, schedule, project: project) }
56
+ end
57
+
58
+ # Creates new schedules from parameters passed
59
+ #
60
+ # @param process_id [String] Process ID
61
+ # @param trigger [String|GoodData::Schedule] Trigger of schedule. Can be cron string or reference to another schedule.
62
+ # @param executable [String] Execution executable
63
+ # @param options [Hash] Optional options
64
+ # @return [GoodData::Schedule] New GoodData::Schedule instance
65
+ def create(process_id, trigger, executable, options = {})
66
+ c, project = GoodData.get_client_and_project(options)
67
+
68
+ fail 'Process ID has to be provided' if process_id.blank?
69
+ fail 'Executable has to be provided' if executable.blank?
70
+ fail 'Trigger schedule has to be provided' if trigger.blank?
71
+
72
+ schedule = c.create(GoodData::Schedule, GoodData::Helpers.deep_stringify_keys(GoodData::Helpers.deep_dup(SCHEDULE_TEMPLATE)), client: c, project: project)
73
+
74
+ default_opts = {
75
+ :type => 'MSETL',
76
+ :timezone => 'UTC',
77
+ :state => 'ENABLED',
78
+ :params => {
79
+ 'PROCESS_ID' => process_id,
80
+ 'EXECUTABLE' => executable
81
+ },
82
+ # :reschedule => nil
83
+ }
84
+
85
+ schedule.name = options[:name]
86
+ schedule.set_trigger(trigger)
87
+ schedule.params = default_opts[:params].merge(options[:params] || {})
88
+ schedule.hidden_params = options[:hidden_params] || {}
89
+ schedule.timezone = options[:timezone] || default_opts[:timezone]
90
+ schedule.state = options[:state] || default_opts[:state]
91
+ schedule.schedule_type = options[:type] || default_opts[:type]
92
+ schedule.reschedule = options[:reschedule] if options[:reschedule]
93
+ schedule
94
+ end
95
+ end
96
+
97
+ # Initializes object from raw json
98
+ #
99
+ # @param json [Object] Raw JSON
100
+ # @return [GoodData::Schedule] New GoodData::Schedule instance
101
+ def initialize(json)
102
+ json = GoodData::Helpers.deep_stringify_keys(json)
103
+ super
104
+ @json = json
105
+ self.params = GoodData::Helpers.decode_params(json['schedule']['params'] || {})
106
+ self.hidden_params = GoodData::Helpers.decode_params(json['schedule']['hiddenParams'] || {})
107
+ end
108
+
109
+ def after
110
+ project.schedules(trigger_id)
111
+ end
112
+
113
+ def after=(schedule)
114
+ fail 'After trigger has to be a schedule object' unless schedule.is_a?(Schedule)
115
+ json['schedule']['triggerScheduleId'] = schedule.obj_id
116
+ @json['schedule']['cron'] = nil
117
+ @dirty = true
118
+ end
119
+
120
+ # Deletes schedule
121
+ def delete
122
+ saved? ? client.delete(uri) : nil
123
+ end
124
+
125
+ # Is schedule enabled?
126
+ #
127
+ # @return [GoodData::Schedule]
128
+ def disable
129
+ @json['schedule']['state'] = 'DISABLED'
130
+ @dirty = true
131
+ self
132
+ end
133
+
134
+ # Is schedule enabled?
135
+ #
136
+ # @return [Boolean]
137
+ def disable!
138
+ disable
139
+ save
140
+ end
141
+
142
+ # Is schedule disabled?
143
+ #
144
+ # @return [Boolean]
145
+ def disabled?
146
+ state == 'DISABLED'
147
+ end
148
+
149
+ # Is schedule enabled?
150
+ #
151
+ # @return [Boolean]
152
+ def enabled?
153
+ !disabled?
154
+ end
155
+
156
+ # Enables the schedule
157
+ #
158
+ # @return [GoodData::Schedule]
159
+ def enable
160
+ @json['schedule']['state'] = 'ENABLED'
161
+ @dirty = true
162
+ self
163
+ end
164
+
165
+ # Enables and saves the schedule
166
+ #
167
+ # @return [GoodData::Schedule]
168
+ def enable!
169
+ enable
170
+ save
171
+ end
172
+
173
+ # Executes schedule
174
+ #
175
+ # @param [Hash] opts execution options.
176
+ # @option opts [Boolean] :wait Wait for execution result
177
+ # @return [Object] Raw Response
178
+ def execute(opts = {})
179
+ return nil unless saved?
180
+ opts = { :wait => true }.merge(opts)
181
+ data = {
182
+ :execution => {}
183
+ }
184
+ res = client.post(execution_url, data)
185
+ execution = client.create(GoodData::Execution, res, client: client, project: project)
186
+
187
+ return execution unless opts[:wait]
188
+ execution.wait_for_result(opts)
189
+ end
190
+
191
+ # Returns execution URL
192
+ #
193
+ # @return [String] Executions URL
194
+ def execution_url
195
+ saved? ? @json['schedule']['links']['executions'] : nil
196
+ end
197
+
198
+ # Returns execution state
199
+ #
200
+ # @return [String] Execution state
201
+ def state
202
+ @json['schedule']['state']
203
+ end
204
+
205
+ def state=(a_state)
206
+ @json['schedule']['state'] = a_state
207
+ end
208
+
209
+ # Returns execution timezone
210
+ #
211
+ # @return [String] Execution timezone
212
+ def timezone
213
+ @json['schedule']['timezone']
214
+ end
215
+
216
+ # Assigns execution timezone
217
+ #
218
+ # @param new_timezone [String] Timezone to be set
219
+ def timezone=(new_timezone)
220
+ @json['schedule']['timezone'] = new_timezone
221
+ @dirty = true
222
+ end
223
+
224
+ # Returns execution type
225
+ #
226
+ # @return [String] Execution type
227
+ def type
228
+ @json['schedule']['type']
229
+ end
230
+
231
+ # Assigns execution type
232
+ #
233
+ # @param new_type [String] Execution type to be set
234
+ def type=(new_type)
235
+ @json['schedule']['type'] = new_type
236
+ @dirty = true
237
+ end
238
+
239
+ # Returns execution cron settings
240
+ #
241
+ # @return [String] Cron settings
242
+ def cron
243
+ @json['schedule']['cron']
244
+ end
245
+
246
+ # Assigns execution cron settings
247
+ #
248
+ # @param new_cron [String] Cron settings to be set
249
+ def cron=(new_cron)
250
+ @json['schedule']['cron'] = new_cron
251
+ @json['schedule']['triggerScheduleId'] = nil
252
+ @dirty = true
253
+ end
254
+
255
+ # Returns reschedule settings
256
+ #
257
+ # @return [Integer] Reschedule settings
258
+ def reschedule
259
+ @json['schedule']['reschedule']
260
+ end
261
+
262
+ # Assigns execution reschedule settings
263
+ #
264
+ # @param new_reschedule [Integer] Reschedule settings to be set
265
+ def reschedule=(new_reschedule)
266
+ @json['schedule']['reschedule'] = new_reschedule
267
+ @dirty = true
268
+ end
269
+
270
+ # Returns execution process related to this schedule
271
+ #
272
+ # @return [GoodData::Process] Process ID
273
+ def process
274
+ project.processes(process_id)
275
+ end
276
+
277
+ # Returns execution process ID
278
+ #
279
+ # @return [String] Process ID
280
+ def process_id
281
+ @json['schedule']['params']['PROCESS_ID']
282
+ end
283
+
284
+ def process_id=(new_project_id)
285
+ @json['schedule']['params']['PROCESS_ID'] = new_project_id
286
+ @dirty = true
287
+ end
288
+
289
+ # Returns execution executable
290
+ #
291
+ # @return [String] Executable (graph) name
292
+ def executable
293
+ @json['schedule']['params']['EXECUTABLE']
294
+ end
295
+
296
+ # Assigns execution executable
297
+ #
298
+ # @param new_executable [String] Executable to be set.
299
+ def executable=(new_executable)
300
+ @json['schedule']['params']['EXECUTABLE'] = new_executable
301
+ @dirty = true
302
+ end
303
+
304
+ # Returns enumerator of executions
305
+ #
306
+ # @return [Array] Raw Executions JSON
307
+ def executions
308
+ return nil unless @json
309
+ url = @json['schedule']['links']['executions']
310
+ Enumerator.new do |y|
311
+ loop do
312
+ res = client.get url
313
+ res['executions']['paging']['next']
314
+ res['executions']['items'].each do |execution|
315
+ y << client.create(Execution, execution, :project => project)
316
+ end
317
+ url = res['executions']['paging']['next']
318
+ break unless url
319
+ end
320
+ end
321
+ end
322
+
323
+ # Returns hidden_params as Hash
324
+ #
325
+ # @return [Hash] Hidden Parameters
326
+ def hidden_params
327
+ @json['schedule']['hiddenParams']
328
+ end
329
+
330
+ # Updates params by merging the current params with new ones
331
+ #
332
+ # @param params_to_merge [Hash] params
333
+ # @return [GoodData::Schedule] Returns self
334
+ def update_params(params_to_merge)
335
+ params_to_merge.each do |k, v|
336
+ set_parameter(k, v)
337
+ end
338
+ @dirty = true
339
+ self
340
+ end
341
+
342
+ # Updates hidden params by merging the current params with new ones
343
+ #
344
+ # @param params_to_merge [Hash] params
345
+ # @return [GoodData::Schedule] Returns self
346
+ def update_hidden_params(params_to_merge)
347
+ params_to_merge.each do |k, v|
348
+ set_hidden_parameter(k, v)
349
+ end
350
+ @dirty = true
351
+ self
352
+ end
353
+
354
+ # Assigns hidden parameters
355
+ #
356
+ # @param new_hidden_param [String] Hidden parameters to be set
357
+ def hidden_params=(new_hidden_params = {})
358
+ @json['schedule']['hiddenParams'] = new_hidden_params
359
+ @dirty = true
360
+ self
361
+ end
362
+
363
+ # Returns params as Hash
364
+ #
365
+ # @return [Hash] Parameters
366
+ def params
367
+ @json['schedule']['params']
368
+ end
369
+
370
+ # Assigns execution parameters
371
+ #
372
+ # @param params [String] Params to be set
373
+ def params=(new_params = {})
374
+ default_params = {
375
+ 'PROCESS_ID' => process_id,
376
+ 'EXECUTABLE' => executable
377
+ }
378
+ @json['schedule']['params'] = default_params.merge(new_params)
379
+ @dirty = true
380
+ self
381
+ end
382
+
383
+ # Saves object if dirty
384
+ #
385
+ # @return [Boolean] True if saved
386
+ def save
387
+ fail 'trigger schedule has to be provided' if cron.blank? && trigger_id.blank?
388
+ fail 'A timezone has to be provided' if timezone.blank?
389
+ fail 'Schedule type has to be provided' if schedule_type.blank?
390
+ if @dirty
391
+ if saved?
392
+ res = client.put(uri, to_update_payload)
393
+ @json = Schedule.new(res).json
394
+ else
395
+ res = client.post "/gdc/projects/#{project.pid}/schedules", to_update_payload
396
+ fail 'Unable to create new schedule' if res.nil?
397
+ new_obj_json = client.get res['schedule']['links']['self']
398
+ @json = Schedule.new(new_obj_json).json
399
+ end
400
+ @dirty = false
401
+ end
402
+ self
403
+ end
404
+
405
+ # Updates params at key k with val v
406
+ #
407
+ # @param k [String] key
408
+ # @param v [Object] value
409
+ # @return [GoodData::Schedule] Returns self
410
+ def set_parameter(k, v)
411
+ params[k] = v
412
+ @dirty = true
413
+ self
414
+ end
415
+
416
+ # Updates hidden params at key k with val v
417
+ #
418
+ # @param k [String] key
419
+ # @param v [Object] value
420
+ # @return [GoodData::Schedule] Returns self
421
+ def set_hidden_parameter(k, v)
422
+ hidden_params[k] = v
423
+ @dirty = true
424
+ self
425
+ end
426
+
427
+ def schedule_type
428
+ json['schedule']['type']
429
+ end
430
+
431
+ def schedule_type=(type)
432
+ json['schedule']['type'] = type
433
+ @dirty = true
434
+ self
435
+ end
436
+
437
+ def time_based?
438
+ cron != nil
439
+ end
440
+
441
+ def to_hash
442
+ {
443
+ name: name,
444
+ type: type,
445
+ state: state,
446
+ params: params,
447
+ hidden_params: hidden_params,
448
+ cron: cron,
449
+ trigger_id: trigger_id,
450
+ timezone: timezone,
451
+ uri: uri,
452
+ reschedule: reschedule,
453
+ executable: executable,
454
+ process_id: process_id
455
+ }
456
+ end
457
+
458
+ def trigger_id
459
+ json['schedule']['triggerScheduleId']
460
+ end
461
+
462
+ def trigger_id=(a_trigger)
463
+ json['schedule']['triggerScheduleId'] = a_trigger
464
+ @dirty = true
465
+ self
466
+ end
467
+
468
+ def name
469
+ json['schedule']['name']
470
+ end
471
+
472
+ def name=(name)
473
+ json['schedule']['name'] = name
474
+ @dirty = true
475
+ self
476
+ end
477
+
478
+ def set_trigger(trigger) # rubocop:disable Style/AccessorMethodName
479
+ if trigger.is_a?(String) && trigger =~ /[a-fA-Z0-9]{24}/
480
+ self.trigger_id = trigger
481
+ elsif trigger.is_a?(GoodData::Schedule)
482
+ self.trigger_id = trigger.obj_id
483
+ else
484
+ self.cron = trigger
485
+ end
486
+ end
487
+
488
+ # Returns URL
489
+ #
490
+ # @return [String] Schedule URL
491
+ def uri
492
+ @json['schedule']['links']['self'] if @json && @json['schedule'] && @json['schedule']['links']
493
+ end
494
+
495
+ def ==(other)
496
+ other.respond_to?(:uri) && other.uri == uri && other.respond_to?(:to_hash) && other.to_hash == to_hash
497
+ end
498
+
499
+ def to_update_payload
500
+ res = {
501
+ 'schedule' => {
502
+ 'name' => name,
503
+ 'type' => type,
504
+ 'state' => state,
505
+ 'timezone' => timezone,
506
+ 'cron' => cron,
507
+ 'triggerScheduleId' => trigger_id,
508
+ 'params' => GoodData::Helpers.encode_public_params(params),
509
+ 'hiddenParams' => GoodData::Helpers.encode_hidden_params(hidden_params)
510
+ }
511
+ }
512
+
513
+ res['schedule']['reschedule'] = reschedule if reschedule
514
+
515
+ res
516
+ end
517
+ end
518
+ end