gooddata 1.0.0-java

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 (517) hide show
  1. checksums.yaml +7 -0
  2. data/.document +5 -0
  3. data/.editorconfig +12 -0
  4. data/.flayignore +6 -0
  5. data/.gitignore +38 -0
  6. data/.pronto.yml +3 -0
  7. data/.rspec +5 -0
  8. data/.rubocop.yml +101 -0
  9. data/.travis.yml +9 -0
  10. data/.yardopts +22 -0
  11. data/CHANGELOG.md +272 -0
  12. data/CLI.md +435 -0
  13. data/CONTRIBUTING.md +38 -0
  14. data/DEPENDENCIES.md +880 -0
  15. data/Dockerfile.jruby +17 -0
  16. data/Dockerfile.ruby +19 -0
  17. data/Gemfile +4 -0
  18. data/Guardfile +5 -0
  19. data/LICENSE +22 -0
  20. data/LICENSE.rb +5 -0
  21. data/README.md +78 -0
  22. data/Rakefile +204 -0
  23. data/TODO.md +32 -0
  24. data/authors.sh +4 -0
  25. data/bin/gooddata +7 -0
  26. data/ci.rake +47 -0
  27. data/dependency_decisions.yml +104 -0
  28. data/docker-compose.yml +34 -0
  29. data/gooddata +9 -0
  30. data/gooddata.gemspec +72 -0
  31. data/lib/gooddata.rb +34 -0
  32. data/lib/gooddata/app/app.rb +16 -0
  33. data/lib/gooddata/bricks/base_downloader.rb +86 -0
  34. data/lib/gooddata/bricks/brick.rb +37 -0
  35. data/lib/gooddata/bricks/bricks.rb +17 -0
  36. data/lib/gooddata/bricks/middleware/aws_middleware.rb +41 -0
  37. data/lib/gooddata/bricks/middleware/base_middleware.rb +57 -0
  38. data/lib/gooddata/bricks/middleware/bench_middleware.rb +25 -0
  39. data/lib/gooddata/bricks/middleware/bulk_salesforce_middleware.rb +37 -0
  40. data/lib/gooddata/bricks/middleware/decode_params_middleware.rb +21 -0
  41. data/lib/gooddata/bricks/middleware/dwh_middleware.rb +41 -0
  42. data/lib/gooddata/bricks/middleware/fs_download_middleware.rb +48 -0
  43. data/lib/gooddata/bricks/middleware/fs_upload_middleware.rb +36 -0
  44. data/lib/gooddata/bricks/middleware/gooddata_middleware.rb +112 -0
  45. data/lib/gooddata/bricks/middleware/logger_middleware.rb +33 -0
  46. data/lib/gooddata/bricks/middleware/middleware.rb +12 -0
  47. data/lib/gooddata/bricks/middleware/restforce_middleware.rb +58 -0
  48. data/lib/gooddata/bricks/middleware/stdout_middleware.rb +23 -0
  49. data/lib/gooddata/bricks/middleware/twitter_middleware.rb +29 -0
  50. data/lib/gooddata/bricks/middleware/undot_params_middleware.rb +37 -0
  51. data/lib/gooddata/bricks/pipeline.rb +25 -0
  52. data/lib/gooddata/bricks/utils.rb +18 -0
  53. data/lib/gooddata/cli/cli.rb +27 -0
  54. data/lib/gooddata/cli/commands/auth_cmd.rb +29 -0
  55. data/lib/gooddata/cli/commands/domain_cmd.rb +28 -0
  56. data/lib/gooddata/cli/commands/project_cmd.rb +28 -0
  57. data/lib/gooddata/cli/hooks.rb +56 -0
  58. data/lib/gooddata/cli/shared.rb +66 -0
  59. data/lib/gooddata/cli/terminal.rb +20 -0
  60. data/lib/gooddata/client.rb +67 -0
  61. data/lib/gooddata/commands/api.rb +64 -0
  62. data/lib/gooddata/commands/auth.rb +107 -0
  63. data/lib/gooddata/commands/base.rb +12 -0
  64. data/lib/gooddata/commands/commands.rb +12 -0
  65. data/lib/gooddata/commands/datasets.rb +148 -0
  66. data/lib/gooddata/commands/datawarehouse.rb +20 -0
  67. data/lib/gooddata/commands/domain.rb +40 -0
  68. data/lib/gooddata/commands/process.rb +67 -0
  69. data/lib/gooddata/commands/project.rb +144 -0
  70. data/lib/gooddata/commands/projects.rb +20 -0
  71. data/lib/gooddata/commands/role.rb +36 -0
  72. data/lib/gooddata/commands/runners.rb +47 -0
  73. data/lib/gooddata/commands/scaffold.rb +69 -0
  74. data/lib/gooddata/commands/user.rb +39 -0
  75. data/lib/gooddata/connection.rb +127 -0
  76. data/lib/gooddata/core/core.rb +12 -0
  77. data/lib/gooddata/core/logging.rb +105 -0
  78. data/lib/gooddata/core/nil_logger.rb +32 -0
  79. data/lib/gooddata/core/project.rb +74 -0
  80. data/lib/gooddata/core/rest.rb +149 -0
  81. data/lib/gooddata/core/user.rb +20 -0
  82. data/lib/gooddata/data/data.rb +12 -0
  83. data/lib/gooddata/data/guesser.rb +122 -0
  84. data/lib/gooddata/exceptions/attr_element_not_found.rb +16 -0
  85. data/lib/gooddata/exceptions/command_failed.rb +11 -0
  86. data/lib/gooddata/exceptions/exceptions.rb +12 -0
  87. data/lib/gooddata/exceptions/execution_limit_exceeded.rb +13 -0
  88. data/lib/gooddata/exceptions/export_clone.rb +4 -0
  89. data/lib/gooddata/exceptions/filter_maqlization.rb +16 -0
  90. data/lib/gooddata/exceptions/import_clone.rb +4 -0
  91. data/lib/gooddata/exceptions/malformed_user.rb +15 -0
  92. data/lib/gooddata/exceptions/maql_execution.rb +16 -0
  93. data/lib/gooddata/exceptions/no_project_error.rb +19 -0
  94. data/lib/gooddata/exceptions/object_migration.rb +32 -0
  95. data/lib/gooddata/exceptions/project_not_found.rb +13 -0
  96. data/lib/gooddata/exceptions/segment_not_empty.rb +18 -0
  97. data/lib/gooddata/exceptions/uncomputable_report.rb +13 -0
  98. data/lib/gooddata/exceptions/user_in_different_domain.rb +15 -0
  99. data/lib/gooddata/exceptions/validation_error.rb +16 -0
  100. data/lib/gooddata/extensions/big_decimal.rb +17 -0
  101. data/lib/gooddata/extensions/class.rb +11 -0
  102. data/lib/gooddata/extensions/enumerable.rb +39 -0
  103. data/lib/gooddata/extensions/extensions.rb +10 -0
  104. data/lib/gooddata/extensions/false.rb +23 -0
  105. data/lib/gooddata/extensions/hash.rb +49 -0
  106. data/lib/gooddata/extensions/integer.rb +5 -0
  107. data/lib/gooddata/extensions/nil.rb +19 -0
  108. data/lib/gooddata/extensions/numeric.rb +15 -0
  109. data/lib/gooddata/extensions/object.rb +31 -0
  110. data/lib/gooddata/extensions/string.rb +7 -0
  111. data/lib/gooddata/extensions/symbol.rb +15 -0
  112. data/lib/gooddata/extensions/true.rb +23 -0
  113. data/lib/gooddata/extract.rb +21 -0
  114. data/lib/gooddata/goodzilla/goodzilla.rb +160 -0
  115. data/lib/gooddata/helpers/auth_helpers.rb +75 -0
  116. data/lib/gooddata/helpers/csv_helper.rb +61 -0
  117. data/lib/gooddata/helpers/data_helper.rb +129 -0
  118. data/lib/gooddata/helpers/erb_helper.rb +23 -0
  119. data/lib/gooddata/helpers/global_helpers.rb +266 -0
  120. data/lib/gooddata/helpers/global_helpers_params.rb +292 -0
  121. data/lib/gooddata/helpers/helpers.rb +10 -0
  122. data/lib/gooddata/lcm/actions/actions.rb +12 -0
  123. data/lib/gooddata/lcm/actions/apply_custom_maql.rb +80 -0
  124. data/lib/gooddata/lcm/actions/associate_clients.rb +87 -0
  125. data/lib/gooddata/lcm/actions/base_action.rb +23 -0
  126. data/lib/gooddata/lcm/actions/collect_ca_metrics.rb +53 -0
  127. data/lib/gooddata/lcm/actions/collect_client_projects.rb +78 -0
  128. data/lib/gooddata/lcm/actions/collect_clients.rb +128 -0
  129. data/lib/gooddata/lcm/actions/collect_data_product.rb +57 -0
  130. data/lib/gooddata/lcm/actions/collect_dynamic_schedule_params.rb +62 -0
  131. data/lib/gooddata/lcm/actions/collect_ldm_objects.rb +56 -0
  132. data/lib/gooddata/lcm/actions/collect_meta.rb +88 -0
  133. data/lib/gooddata/lcm/actions/collect_segment_clients.rb +113 -0
  134. data/lib/gooddata/lcm/actions/collect_segments.rb +72 -0
  135. data/lib/gooddata/lcm/actions/collect_tagged_objects.rb +80 -0
  136. data/lib/gooddata/lcm/actions/collect_users_brick_users.rb +46 -0
  137. data/lib/gooddata/lcm/actions/create_segment_masters.rb +160 -0
  138. data/lib/gooddata/lcm/actions/ensure_data_product.rb +53 -0
  139. data/lib/gooddata/lcm/actions/ensure_release_table.rb +53 -0
  140. data/lib/gooddata/lcm/actions/ensure_segments.rb +32 -0
  141. data/lib/gooddata/lcm/actions/ensure_technical_users_domain.rb +70 -0
  142. data/lib/gooddata/lcm/actions/ensure_technical_users_project.rb +83 -0
  143. data/lib/gooddata/lcm/actions/execute_schedules.rb +128 -0
  144. data/lib/gooddata/lcm/actions/hello_world.rb +41 -0
  145. data/lib/gooddata/lcm/actions/import_object_collections.rb +60 -0
  146. data/lib/gooddata/lcm/actions/print_actions.rb +58 -0
  147. data/lib/gooddata/lcm/actions/print_modes.rb +69 -0
  148. data/lib/gooddata/lcm/actions/print_types.rb +52 -0
  149. data/lib/gooddata/lcm/actions/provision_clients.rb +89 -0
  150. data/lib/gooddata/lcm/actions/purge_clients.rb +58 -0
  151. data/lib/gooddata/lcm/actions/rename_existing_client_projects.rb +70 -0
  152. data/lib/gooddata/lcm/actions/segments_filter.rb +50 -0
  153. data/lib/gooddata/lcm/actions/synchronize_attribute_drillpaths.rb +64 -0
  154. data/lib/gooddata/lcm/actions/synchronize_cas.rb +72 -0
  155. data/lib/gooddata/lcm/actions/synchronize_clients.rb +94 -0
  156. data/lib/gooddata/lcm/actions/synchronize_color_palette.rb +67 -0
  157. data/lib/gooddata/lcm/actions/synchronize_etls_in_segment.rb +155 -0
  158. data/lib/gooddata/lcm/actions/synchronize_label_types.rb +64 -0
  159. data/lib/gooddata/lcm/actions/synchronize_ldm.rb +82 -0
  160. data/lib/gooddata/lcm/actions/synchronize_meta.rb +52 -0
  161. data/lib/gooddata/lcm/actions/synchronize_new_segments.rb +61 -0
  162. data/lib/gooddata/lcm/actions/synchronize_processes.rb +66 -0
  163. data/lib/gooddata/lcm/actions/synchronize_schedules.rb +91 -0
  164. data/lib/gooddata/lcm/actions/synchronize_tag_objects.rb +64 -0
  165. data/lib/gooddata/lcm/actions/synchronize_user_filters.rb +210 -0
  166. data/lib/gooddata/lcm/actions/synchronize_user_groups.rb +53 -0
  167. data/lib/gooddata/lcm/actions/synchronize_users.rb +336 -0
  168. data/lib/gooddata/lcm/actions/update_release_table.rb +77 -0
  169. data/lib/gooddata/lcm/data/create_lcm_release.sql.erb +6 -0
  170. data/lib/gooddata/lcm/data/insert_into_lcm_release.sql.erb +11 -0
  171. data/lib/gooddata/lcm/data/select_from_lcm_release.sql.erb +8 -0
  172. data/lib/gooddata/lcm/data/update_lcm_release.sql.erb +7 -0
  173. data/lib/gooddata/lcm/dsl/dsl.rb +50 -0
  174. data/lib/gooddata/lcm/dsl/params_dsl.rb +61 -0
  175. data/lib/gooddata/lcm/dsl/type_dsl.rb +62 -0
  176. data/lib/gooddata/lcm/helpers/check_helper.rb +41 -0
  177. data/lib/gooddata/lcm/helpers/helpers.rb +12 -0
  178. data/lib/gooddata/lcm/helpers/tags_helper.rb +36 -0
  179. data/lib/gooddata/lcm/lcm.rb +325 -0
  180. data/lib/gooddata/lcm/lcm2.rb +400 -0
  181. data/lib/gooddata/lcm/types/base_type.rb +29 -0
  182. data/lib/gooddata/lcm/types/class/ads_client.rb +35 -0
  183. data/lib/gooddata/lcm/types/class/class.rb +21 -0
  184. data/lib/gooddata/lcm/types/class/gd_client.rb +35 -0
  185. data/lib/gooddata/lcm/types/class/types.rb +12 -0
  186. data/lib/gooddata/lcm/types/complex/complex.rb +33 -0
  187. data/lib/gooddata/lcm/types/complex/release_query.rb +35 -0
  188. data/lib/gooddata/lcm/types/complex/segment.rb +40 -0
  189. data/lib/gooddata/lcm/types/complex/synchronization_info.rb +35 -0
  190. data/lib/gooddata/lcm/types/complex/tokens.rb +31 -0
  191. data/lib/gooddata/lcm/types/complex/types.rb +12 -0
  192. data/lib/gooddata/lcm/types/complex/update_preference.rb +38 -0
  193. data/lib/gooddata/lcm/types/complex/users_brick_config.rb +32 -0
  194. data/lib/gooddata/lcm/types/param.rb +16 -0
  195. data/lib/gooddata/lcm/types/scalar/bool.rb +22 -0
  196. data/lib/gooddata/lcm/types/scalar/hash.rb +22 -0
  197. data/lib/gooddata/lcm/types/scalar/integer.rb +22 -0
  198. data/lib/gooddata/lcm/types/scalar/object.rb +22 -0
  199. data/lib/gooddata/lcm/types/scalar/string.rb +22 -0
  200. data/lib/gooddata/lcm/types/scalar/types.rb +12 -0
  201. data/lib/gooddata/lcm/types/special/array.rb +33 -0
  202. data/lib/gooddata/lcm/types/special/enum.rb +15 -0
  203. data/lib/gooddata/lcm/types/special/types.rb +12 -0
  204. data/lib/gooddata/lcm/types/types.rb +12 -0
  205. data/lib/gooddata/lcm/user_bricks_helper.rb +32 -0
  206. data/lib/gooddata/mixins/author.rb +26 -0
  207. data/lib/gooddata/mixins/content_getter.rb +15 -0
  208. data/lib/gooddata/mixins/content_property_reader.rb +17 -0
  209. data/lib/gooddata/mixins/content_property_writer.rb +17 -0
  210. data/lib/gooddata/mixins/contributor.rb +20 -0
  211. data/lib/gooddata/mixins/data_getter.rb +15 -0
  212. data/lib/gooddata/mixins/data_property_reader.rb +19 -0
  213. data/lib/gooddata/mixins/data_property_writer.rb +19 -0
  214. data/lib/gooddata/mixins/inspector.rb +53 -0
  215. data/lib/gooddata/mixins/is_attribute.rb +17 -0
  216. data/lib/gooddata/mixins/is_dimension.rb +17 -0
  217. data/lib/gooddata/mixins/is_fact.rb +17 -0
  218. data/lib/gooddata/mixins/is_folder.rb +11 -0
  219. data/lib/gooddata/mixins/is_label.rb +19 -0
  220. data/lib/gooddata/mixins/links.rb +15 -0
  221. data/lib/gooddata/mixins/md_finders.rb +79 -0
  222. data/lib/gooddata/mixins/md_grantees.rb +42 -0
  223. data/lib/gooddata/mixins/md_id_to_uri.rb +39 -0
  224. data/lib/gooddata/mixins/md_json.rb +15 -0
  225. data/lib/gooddata/mixins/md_lock.rb +87 -0
  226. data/lib/gooddata/mixins/md_object_id.rb +15 -0
  227. data/lib/gooddata/mixins/md_object_indexer.rb +74 -0
  228. data/lib/gooddata/mixins/md_object_query.rb +134 -0
  229. data/lib/gooddata/mixins/md_relations.rb +43 -0
  230. data/lib/gooddata/mixins/meta_getter.rb +17 -0
  231. data/lib/gooddata/mixins/meta_property_reader.rb +19 -0
  232. data/lib/gooddata/mixins/meta_property_writer.rb +19 -0
  233. data/lib/gooddata/mixins/mixins.rb +19 -0
  234. data/lib/gooddata/mixins/not_attribute.rb +17 -0
  235. data/lib/gooddata/mixins/not_exportable.rb +15 -0
  236. data/lib/gooddata/mixins/not_fact.rb +17 -0
  237. data/lib/gooddata/mixins/not_group.rb +17 -0
  238. data/lib/gooddata/mixins/not_label.rb +19 -0
  239. data/lib/gooddata/mixins/not_metric.rb +19 -0
  240. data/lib/gooddata/mixins/obj_id.rb +15 -0
  241. data/lib/gooddata/mixins/rest_getters.rb +17 -0
  242. data/lib/gooddata/mixins/rest_resource.rb +47 -0
  243. data/lib/gooddata/mixins/root_key_getter.rb +15 -0
  244. data/lib/gooddata/mixins/root_key_setter.rb +15 -0
  245. data/lib/gooddata/mixins/timestamps.rb +19 -0
  246. data/lib/gooddata/mixins/to_json.rb +11 -0
  247. data/lib/gooddata/mixins/uri_getter.rb +9 -0
  248. data/lib/gooddata/models/ads_output_stage.rb +85 -0
  249. data/lib/gooddata/models/automated_data_distribution.rb +36 -0
  250. data/lib/gooddata/models/blueprint/anchor_field.rb +65 -0
  251. data/lib/gooddata/models/blueprint/attribute_field.rb +45 -0
  252. data/lib/gooddata/models/blueprint/blueprint.rb +11 -0
  253. data/lib/gooddata/models/blueprint/blueprint_field.rb +70 -0
  254. data/lib/gooddata/models/blueprint/dashboard_builder.rb +30 -0
  255. data/lib/gooddata/models/blueprint/dataset_blueprint.rb +455 -0
  256. data/lib/gooddata/models/blueprint/date_dimension.rb +20 -0
  257. data/lib/gooddata/models/blueprint/fact_field.rb +20 -0
  258. data/lib/gooddata/models/blueprint/label_field.rb +47 -0
  259. data/lib/gooddata/models/blueprint/project_blueprint.rb +791 -0
  260. data/lib/gooddata/models/blueprint/project_builder.rb +103 -0
  261. data/lib/gooddata/models/blueprint/reference_field.rb +43 -0
  262. data/lib/gooddata/models/blueprint/schema_blueprint.rb +160 -0
  263. data/lib/gooddata/models/blueprint/schema_builder.rb +89 -0
  264. data/lib/gooddata/models/blueprint/to_manifest.rb +185 -0
  265. data/lib/gooddata/models/blueprint/to_wire.rb +173 -0
  266. data/lib/gooddata/models/channel_configuration.rb +112 -0
  267. data/lib/gooddata/models/client.rb +236 -0
  268. data/lib/gooddata/models/client_synchronization_result.rb +31 -0
  269. data/lib/gooddata/models/client_synchronization_result_details.rb +41 -0
  270. data/lib/gooddata/models/data_product.rb +149 -0
  271. data/lib/gooddata/models/datawarehouse.rb +114 -0
  272. data/lib/gooddata/models/domain.rb +505 -0
  273. data/lib/gooddata/models/execution.rb +115 -0
  274. data/lib/gooddata/models/execution_detail.rb +81 -0
  275. data/lib/gooddata/models/from_wire.rb +173 -0
  276. data/lib/gooddata/models/invitation.rb +75 -0
  277. data/lib/gooddata/models/links.rb +50 -0
  278. data/lib/gooddata/models/membership.rb +441 -0
  279. data/lib/gooddata/models/metadata.rb +324 -0
  280. data/lib/gooddata/models/metadata/attribute.rb +155 -0
  281. data/lib/gooddata/models/metadata/dashboard.rb +120 -0
  282. data/lib/gooddata/models/metadata/dashboard/dashboard_item.rb +76 -0
  283. data/lib/gooddata/models/metadata/dashboard/filter_apply_item.rb +37 -0
  284. data/lib/gooddata/models/metadata/dashboard/filter_item.rb +64 -0
  285. data/lib/gooddata/models/metadata/dashboard/geo_chart_item.rb +56 -0
  286. data/lib/gooddata/models/metadata/dashboard/headline_item.rb +56 -0
  287. data/lib/gooddata/models/metadata/dashboard/iframe_item.rb +46 -0
  288. data/lib/gooddata/models/metadata/dashboard/report_item.rb +92 -0
  289. data/lib/gooddata/models/metadata/dashboard/text_item.rb +55 -0
  290. data/lib/gooddata/models/metadata/dashboard_tab.rb +141 -0
  291. data/lib/gooddata/models/metadata/dataset.rb +67 -0
  292. data/lib/gooddata/models/metadata/dimension.rb +57 -0
  293. data/lib/gooddata/models/metadata/fact.rb +51 -0
  294. data/lib/gooddata/models/metadata/folder.rb +49 -0
  295. data/lib/gooddata/models/metadata/label.rb +128 -0
  296. data/lib/gooddata/models/metadata/metadata.rb +12 -0
  297. data/lib/gooddata/models/metadata/metric.rb +206 -0
  298. data/lib/gooddata/models/metadata/report.rb +268 -0
  299. data/lib/gooddata/models/metadata/report_definition.rb +272 -0
  300. data/lib/gooddata/models/metadata/scheduled_mail.rb +277 -0
  301. data/lib/gooddata/models/metadata/scheduled_mail/dashboard_attachment.rb +62 -0
  302. data/lib/gooddata/models/metadata/scheduled_mail/report_attachment.rb +64 -0
  303. data/lib/gooddata/models/metadata/variable.rb +96 -0
  304. data/lib/gooddata/models/model.rb +293 -0
  305. data/lib/gooddata/models/models.rb +12 -0
  306. data/lib/gooddata/models/module_constants.rb +31 -0
  307. data/lib/gooddata/models/notification_rule.rb +113 -0
  308. data/lib/gooddata/models/process.rb +371 -0
  309. data/lib/gooddata/models/profile.rb +451 -0
  310. data/lib/gooddata/models/project.rb +2030 -0
  311. data/lib/gooddata/models/project_creator.rb +209 -0
  312. data/lib/gooddata/models/project_log_formatter.rb +204 -0
  313. data/lib/gooddata/models/project_metadata.rb +67 -0
  314. data/lib/gooddata/models/project_role.rb +79 -0
  315. data/lib/gooddata/models/report_data_result.rb +270 -0
  316. data/lib/gooddata/models/schedule.rb +538 -0
  317. data/lib/gooddata/models/segment.rb +274 -0
  318. data/lib/gooddata/models/style_setting.rb +62 -0
  319. data/lib/gooddata/models/subscription.rb +188 -0
  320. data/lib/gooddata/models/tab_builder.rb +27 -0
  321. data/lib/gooddata/models/user_filters/mandatory_user_filter.rb +76 -0
  322. data/lib/gooddata/models/user_filters/user_filter.rb +101 -0
  323. data/lib/gooddata/models/user_filters/user_filter_builder.rb +553 -0
  324. data/lib/gooddata/models/user_filters/user_filters.rb +13 -0
  325. data/lib/gooddata/models/user_filters/variable_user_filter.rb +33 -0
  326. data/lib/gooddata/models/user_group.rb +250 -0
  327. data/lib/gooddata/rest/README.md +37 -0
  328. data/lib/gooddata/rest/client.rb +396 -0
  329. data/lib/gooddata/rest/connection.rb +776 -0
  330. data/lib/gooddata/rest/object.rb +69 -0
  331. data/lib/gooddata/rest/object_factory.rb +51 -0
  332. data/lib/gooddata/rest/resource.rb +27 -0
  333. data/lib/gooddata/rest/rest.rb +24 -0
  334. data/lib/gooddata/version.rb +23 -0
  335. data/lib/templates/bricks/brick.rb.erb +7 -0
  336. data/lib/templates/bricks/main.rb.erb +5 -0
  337. data/lib/templates/project/Goodfile.erb +4 -0
  338. data/lib/templates/project/data/commits.csv +4 -0
  339. data/lib/templates/project/data/devs.csv +4 -0
  340. data/lib/templates/project/data/repos.csv +3 -0
  341. data/lib/templates/project/model/model.rb.erb +20 -0
  342. data/spec/.rubocop.yml +16 -0
  343. data/spec/bricks/bricks_spec.rb +110 -0
  344. data/spec/bricks/default-config.json +8 -0
  345. data/spec/data/.gooddata +4 -0
  346. data/spec/data/blueprints/additional_dataset_module.json +32 -0
  347. data/spec/data/blueprints/attribute_sort_order_blueprint.json +72 -0
  348. data/spec/data/blueprints/big_blueprint_not_pruned.json +2079 -0
  349. data/spec/data/blueprints/invalid_blueprint.json +103 -0
  350. data/spec/data/blueprints/m_n_model.json +104 -0
  351. data/spec/data/blueprints/model_module.json +25 -0
  352. data/spec/data/blueprints/test_blueprint.json +39 -0
  353. data/spec/data/blueprints/test_project_model_spec.json +106 -0
  354. data/spec/data/cc/data/source/commits.csv +4 -0
  355. data/spec/data/cc/data/source/devs.csv +4 -0
  356. data/spec/data/cc/data/source/repos.csv +3 -0
  357. data/spec/data/cc/devel.prm +0 -0
  358. data/spec/data/cc/graph/graph.grf +11 -0
  359. data/spec/data/cc/workspace.prm +19 -0
  360. data/spec/data/column_based_permissions.csv +7 -0
  361. data/spec/data/column_based_permissions2.csv +6 -0
  362. data/spec/data/dynamic_schedule_params_table.csv +7 -0
  363. data/spec/data/gd_gse_data_blueprint.json +1371 -0
  364. data/spec/data/gd_gse_data_manifest.json +1424 -0
  365. data/spec/data/gd_gse_data_model.json +1772 -0
  366. data/spec/data/gooddata_version_process/gooddata_version.rb +9 -0
  367. data/spec/data/gooddata_version_process/gooddata_version.zip +0 -0
  368. data/spec/data/hello_world_process/hello_world.rb +9 -0
  369. data/spec/data/hello_world_process/hello_world.zip +0 -0
  370. data/spec/data/line_based_permissions.csv +3 -0
  371. data/spec/data/manifests/test_blueprint.json +32 -0
  372. data/spec/data/manifests/test_project.json +107 -0
  373. data/spec/data/reports/left_attr_report.json +108 -0
  374. data/spec/data/reports/metric_only_one_line.json +83 -0
  375. data/spec/data/reports/report_1.json +197 -0
  376. data/spec/data/reports/top_attr_report.json +108 -0
  377. data/spec/data/ruby_params_process/ruby_params.rb +9 -0
  378. data/spec/data/ruby_process/deep_files/deep_stuff.txt +1 -0
  379. data/spec/data/ruby_process/process.rb +8 -0
  380. data/spec/data/ruby_process/stuff.txt +1 -0
  381. data/spec/data/superfluous_titles_view.json +81 -0
  382. data/spec/data/test-ci-data.csv +2 -0
  383. data/spec/data/users.csv +12 -0
  384. data/spec/data/wire_models/attribute_sort_by_model.json +73 -0
  385. data/spec/data/wire_models/model_view.json +1775 -0
  386. data/spec/data/wire_models/nu_model.json +3046 -0
  387. data/spec/data/wire_models/test_blueprint.json +66 -0
  388. data/spec/data/wire_test_project.json +150 -0
  389. data/spec/data/workspace_table.csv +3 -0
  390. data/spec/environment/default.rb +43 -0
  391. data/spec/environment/development.rb +32 -0
  392. data/spec/environment/environment.rb +38 -0
  393. data/spec/environment/production.rb +27 -0
  394. data/spec/environment/staging.rb +33 -0
  395. data/spec/environment/testing.rb +32 -0
  396. data/spec/helpers/blueprint_helper.rb +27 -0
  397. data/spec/helpers/cli_helper.rb +38 -0
  398. data/spec/helpers/connection_helper.rb +43 -0
  399. data/spec/helpers/crypto_helper.rb +19 -0
  400. data/spec/helpers/csv_helper.rb +20 -0
  401. data/spec/helpers/process_helper.rb +35 -0
  402. data/spec/helpers/project_helper.rb +74 -0
  403. data/spec/helpers/schedule_helper.rb +33 -0
  404. data/spec/helpers/spec_helper.rb +17 -0
  405. data/spec/integration/ads_output_stage_spec.rb +45 -0
  406. data/spec/integration/blueprint_updates_spec.rb +107 -0
  407. data/spec/integration/blueprint_with_ca_spec.rb +56 -0
  408. data/spec/integration/blueprint_with_grain_spec.rb +74 -0
  409. data/spec/integration/channel_configuration_spec.rb +67 -0
  410. data/spec/integration/clients_spec.rb +164 -0
  411. data/spec/integration/command_datawarehouse_spec.rb +45 -0
  412. data/spec/integration/command_projects_spec.rb +32 -0
  413. data/spec/integration/commands/command_projects_spec.rb +22 -0
  414. data/spec/integration/core/connection_spec.rb +56 -0
  415. data/spec/integration/core/logging_spec.rb +130 -0
  416. data/spec/integration/core/project_spec.rb +54 -0
  417. data/spec/integration/create_from_template_spec.rb +29 -0
  418. data/spec/integration/create_project_spec.rb +27 -0
  419. data/spec/integration/date_dim_switch_spec.rb +150 -0
  420. data/spec/integration/deprecated_load_spec.rb +60 -0
  421. data/spec/integration/full_process_schedule_spec.rb +367 -0
  422. data/spec/integration/full_project_spec.rb +592 -0
  423. data/spec/integration/helpers_spec.rb +16 -0
  424. data/spec/integration/lcm_spec.rb +54 -0
  425. data/spec/integration/mixins/id_to_uri_spec.rb +44 -0
  426. data/spec/integration/models/data_product_spec.rb +71 -0
  427. data/spec/integration/models/domain_spec.rb +162 -0
  428. data/spec/integration/models/invitation_spec.rb +17 -0
  429. data/spec/integration/models/membership_spec.rb +127 -0
  430. data/spec/integration/models/metadata/report_spec.rb +54 -0
  431. data/spec/integration/models/params_spec.rb +118 -0
  432. data/spec/integration/models/profile_spec.rb +210 -0
  433. data/spec/integration/models/project_role_spec.rb +94 -0
  434. data/spec/integration/models/project_spec.rb +225 -0
  435. data/spec/integration/models/schedule_spec.rb +485 -0
  436. data/spec/integration/models/unit_project_spec.rb +130 -0
  437. data/spec/integration/over_to_user_filters_spec.rb +98 -0
  438. data/spec/integration/partial_md_export_import_spec.rb +41 -0
  439. data/spec/integration/project_spec.rb +381 -0
  440. data/spec/integration/rest_spec.rb +214 -0
  441. data/spec/integration/schedule_spec.rb +613 -0
  442. data/spec/integration/segments_spec.rb +100 -0
  443. data/spec/integration/subscription_spec.rb +88 -0
  444. data/spec/integration/urn_date_dim_spec.rb +53 -0
  445. data/spec/integration/user_filters_spec.rb +306 -0
  446. data/spec/integration/user_group_spec.rb +147 -0
  447. data/spec/integration/variables_spec.rb +189 -0
  448. data/spec/logging_in_logging_out_spec.rb +91 -0
  449. data/spec/spec_helper.rb +66 -0
  450. data/spec/unit/actions/associate_clients_spec.rb +47 -0
  451. data/spec/unit/actions/collect_client_projects_spec.rb +47 -0
  452. data/spec/unit/actions/collect_clients_spec.rb +65 -0
  453. data/spec/unit/actions/collect_data_product_spec.rb +56 -0
  454. data/spec/unit/actions/collect_dynamic_schedule_params_spec.rb +56 -0
  455. data/spec/unit/actions/collect_meta_spec.rb +88 -0
  456. data/spec/unit/actions/collect_segment_clients_spec.rb +81 -0
  457. data/spec/unit/actions/collect_tagged_objects_spec.rb +126 -0
  458. data/spec/unit/actions/collect_users_brick_users_spec.rb +36 -0
  459. data/spec/unit/actions/create_segment_masters_spec.rb +64 -0
  460. data/spec/unit/actions/ensure_data_product_spec.rb +38 -0
  461. data/spec/unit/actions/ensure_technical_users_domain_spec.rb +51 -0
  462. data/spec/unit/actions/ensure_technical_users_project_spec.rb +72 -0
  463. data/spec/unit/actions/execute_schedules_spec.rb +94 -0
  464. data/spec/unit/actions/provision_clients_spec.rb +45 -0
  465. data/spec/unit/actions/purge_clients_spec.rb +47 -0
  466. data/spec/unit/actions/rename_existing_client_projects_spec.rb +54 -0
  467. data/spec/unit/actions/segments_filter_spec.rb +46 -0
  468. data/spec/unit/actions/shared_examples_for_user_actions.rb +26 -0
  469. data/spec/unit/actions/synchronize_cas_spec.rb +58 -0
  470. data/spec/unit/actions/synchronize_etls_in_segment_spec.rb +212 -0
  471. data/spec/unit/actions/synchronize_ldm_spec.rb +57 -0
  472. data/spec/unit/actions/synchronize_user_filters_spec.rb +146 -0
  473. data/spec/unit/actions/synchronize_user_groups_spec.rb +49 -0
  474. data/spec/unit/actions/synchronize_users_spec.rb +134 -0
  475. data/spec/unit/bricks/bricks_spec.rb +34 -0
  476. data/spec/unit/bricks/middleware/aws_middelware_spec.rb +98 -0
  477. data/spec/unit/bricks/middleware/bench_middleware_spec.rb +15 -0
  478. data/spec/unit/bricks/middleware/bulk_salesforce_middleware_spec.rb +15 -0
  479. data/spec/unit/bricks/middleware/gooddata_middleware_spec.rb +15 -0
  480. data/spec/unit/bricks/middleware/logger_middleware_spec.rb +30 -0
  481. data/spec/unit/bricks/middleware/restforce_middleware_spec.rb +15 -0
  482. data/spec/unit/bricks/middleware/stdout_middleware_spec.rb +15 -0
  483. data/spec/unit/bricks/middleware/twitter_middleware_spec.rb +15 -0
  484. data/spec/unit/cli/cli_spec.rb +17 -0
  485. data/spec/unit/cli/commands/cmd_auth_spec.rb +17 -0
  486. data/spec/unit/core/nil_logger_spec.rb +13 -0
  487. data/spec/unit/extensions/hash_spec.rb +22 -0
  488. data/spec/unit/godzilla/goodzilla_spec.rb +74 -0
  489. data/spec/unit/helpers/csv_helper_spec.rb +22 -0
  490. data/spec/unit/helpers/data_helper_spec.rb +67 -0
  491. data/spec/unit/helpers/global_helpers_spec.rb +264 -0
  492. data/spec/unit/helpers_spec.rb +254 -0
  493. data/spec/unit/lcm/user_bricks_helper_spec.rb +58 -0
  494. data/spec/unit/models/blueprint/attribute_sort_by_spec.rb +20 -0
  495. data/spec/unit/models/blueprint/attributes_spec.rb +28 -0
  496. data/spec/unit/models/blueprint/dataset_spec.rb +120 -0
  497. data/spec/unit/models/blueprint/labels_spec.rb +43 -0
  498. data/spec/unit/models/blueprint/project_blueprint_spec.rb +642 -0
  499. data/spec/unit/models/blueprint/reference_spec.rb +28 -0
  500. data/spec/unit/models/blueprint/schema_builder_spec.rb +36 -0
  501. data/spec/unit/models/blueprint/to_wire_spec.rb +195 -0
  502. data/spec/unit/models/execution_spec.rb +109 -0
  503. data/spec/unit/models/from_wire_spec.rb +301 -0
  504. data/spec/unit/models/metadata_spec.rb +140 -0
  505. data/spec/unit/models/metric_spec.rb +129 -0
  506. data/spec/unit/models/model_spec.rb +77 -0
  507. data/spec/unit/models/project_creator_spec.rb +90 -0
  508. data/spec/unit/models/project_spec.rb +94 -0
  509. data/spec/unit/models/report_result_data_spec.rb +194 -0
  510. data/spec/unit/models/to_manifest_spec.rb +136 -0
  511. data/spec/unit/models/user_filters/user_filter_builder_spec.rb +110 -0
  512. data/spec/unit/models/user_filters_spec.rb +95 -0
  513. data/spec/unit/models/variable_spec.rb +280 -0
  514. data/spec/unit/rest/polling_spec.rb +101 -0
  515. data/spec/unit/rest/resource_spec.rb +10 -0
  516. data/yard-server.sh +3 -0
  517. metadata +1207 -0
@@ -0,0 +1,36 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Copyright (c) 2010-2017 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 AutomatedDataDistribution < Rest::Resource
9
+ attr_writer :output_stage
10
+
11
+ def output_stage
12
+ return @output_stage if @output_stage
13
+
14
+ @output_stage = GoodData::AdsOutputStage[project: project, client: project.client]
15
+ end
16
+
17
+ def initialize(project)
18
+ self.project = project
19
+ end
20
+
21
+ def process
22
+ GoodData::Process[:all, project: project, client: project.client].find do |p|
23
+ p.type == :dataload
24
+ end
25
+ end
26
+
27
+ def create_output_stage(ads, opts = {})
28
+ data = {
29
+ ads: ads,
30
+ project: project,
31
+ client: project.client
32
+ }
33
+ @output_stage = GoodData::AdsOutputStage.create(data.merge(opts))
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,65 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Copyright (c) 2010-2017 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 'attribute_field'
8
+
9
+ module GoodData
10
+ module Model
11
+ class AnchorBlueprintField < AttributeBlueprintField
12
+ # Returns true if it is an anchor
13
+ #
14
+ # @return [Boolean] returns true
15
+ def anchor?
16
+ true
17
+ end
18
+
19
+ # Returns true if grain is defined
20
+ #
21
+ # @return [Boolean] Returns true if grain is defined on the anchor
22
+ def grain?
23
+ !data[:grain].nil?
24
+ end
25
+
26
+ # Returns grain definition if the anchor has it. Nil otherwise
27
+ #
28
+ # @return [Array<Hash>] Returns grain definitions
29
+ def grain
30
+ data[:grain]
31
+ end
32
+
33
+ # Removes all the labels from the anchor. This is a typical operation that people want to perform
34
+ #
35
+ # @return [GoodData::Model::ProjectBlueprint] Returns changed blueprint
36
+ def strip!
37
+ dataset_blueprint.strip_anchor!
38
+ end
39
+
40
+ # Alias for strip!. Removes all the labels from the anchor. This is a typical operation that people want to perform
41
+ #
42
+ # @return [GoodData::Model::ProjectBlueprint] Returns changed blueprint
43
+ def remove!
44
+ strip!
45
+ end
46
+
47
+ # Returns labels for anchor or empty array if there are none
48
+ #
49
+ # @return [Array<GoodData::Model::LabelBlueprintField>] Returns list of labels
50
+ def labels
51
+ dataset_blueprint.labels_for_attribute(self)
52
+ end
53
+
54
+ # Validates the field for presence of mandatory fields
55
+ #
56
+ # @return [Array<Hash>] Returns list of errors as hashes
57
+ def validate
58
+ errors = super
59
+ errors.concat(validate_presence_of(:id).map do |e|
60
+ { type: :error, message: "Field \"#{e}\" is not defined or empty for anchor \"#{id}\"" }
61
+ end)
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,45 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Copyright (c) 2010-2017 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 AttributeBlueprintField < BlueprintField
12
+ # Returns label that is considered referencing. It is either first one or the one marked
13
+ # with reference_label: true in blueprint
14
+ #
15
+ # @return [Array<GoodData::Model::LabelBlueprintField>] Returns list of labels
16
+ def reference_label
17
+ reference_label = labels.find { |label| label.respond_to?(:reference_label) && label.reference_label == true }
18
+ reference_label || labels.first
19
+ end
20
+
21
+ # Returns list of labels on the attribute. There has to be always at least one attribute
22
+ #
23
+ # @return [Array] returns list of the errors represented by hash structures
24
+ def labels
25
+ @dataset_blueprint.labels_for_attribute(self)
26
+ end
27
+
28
+ # Validates the fields in the attribute
29
+ #
30
+ # @return [Array] returns list of the errors represented by hash structures
31
+ def validate
32
+ errors = validate_presence_of(:id).map do |e|
33
+ { type: :error, message: "Field \"#{e}\" is not defined or empty for attribute \"#{id}\"" }
34
+ end
35
+ if labels.select(&:reference_label?).count > 1
36
+ errors << {
37
+ type: :error,
38
+ message: "Anchor \"#{id}\" can have only one label with reference_label field set to true"
39
+ }
40
+ end
41
+ errors
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,11 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Copyright (c) 2010-2017 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 'pathname'
8
+ base = Pathname(__FILE__).dirname.expand_path
9
+ Dir.glob(base + '*.rb').each do |file|
10
+ require file
11
+ end
@@ -0,0 +1,70 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Copyright (c) 2010-2017 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 BlueprintField
10
+ attr_reader :dataset_blueprint, :data
11
+
12
+ def id
13
+ @data[:id]
14
+ end
15
+
16
+ def initialize(data, dataset)
17
+ @data = GoodData::Helpers.symbolize_keys(data)
18
+ @data[:type] = @data[:type].to_sym
19
+ @dataset_blueprint = dataset
20
+ end
21
+
22
+ # Returns the md object in associated project or throws error if not present
23
+ #
24
+ # @return [GoodData::MdObject] md object that is represented in the blueprint
25
+ def in_project(project)
26
+ GoodData::MdObject[id, project: project, client: project.client]
27
+ end
28
+
29
+ def method_missing(method_sym, *arguments, &block)
30
+ if @data.key?(method_sym)
31
+ @data[method_sym]
32
+ else
33
+ super
34
+ end
35
+ end
36
+
37
+ def respond_to_missing?(method_name, include_private = false)
38
+ if @data.key?(method_name)
39
+ true
40
+ else
41
+ super
42
+ end
43
+ end
44
+
45
+ def title
46
+ @data[:title] || GoodData::Helpers.titleize(@data[:id])
47
+ end
48
+
49
+ # Validates the fields in the field
50
+ #
51
+ # @return [Array] returns list of the errors represented by hash structures
52
+ def validate
53
+ []
54
+ end
55
+
56
+ def ==(other)
57
+ return false unless other.respond_to?(:data)
58
+ @data == other.data
59
+ end
60
+
61
+ private
62
+
63
+ def validate_presence_of(*fields)
64
+ fields.reduce([]) do |a, e|
65
+ data.key?(e) && !data[e].blank? ? a : a + [e]
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,30 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Copyright (c) 2010-2017 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 DashboardBuilder
10
+ def initialize(title)
11
+ @title = title
12
+ @tabs = []
13
+ end
14
+
15
+ def add_tab(tab, &block)
16
+ tb = TabBuilder.new(tab)
17
+ block.call(tb)
18
+ @tabs << tb
19
+ tb
20
+ end
21
+
22
+ def to_hash
23
+ {
24
+ :name => @name,
25
+ :tabs => @tabs.map(&:to_hash)
26
+ }
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,455 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Copyright (c) 2010-2017 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 'schema_builder'
8
+ require_relative 'schema_blueprint'
9
+
10
+ module GoodData
11
+ module Model
12
+ class DatasetBlueprint < SchemaBlueprint
13
+ # Checks if a dataset has an anchor.
14
+ #
15
+ # @param dataset [Hash] Dataset blueprint
16
+ # @return [Boolean] returns true if dataset has an anchor
17
+ def self.anchor?(dataset)
18
+ columns(dataset).any? { |c| c[:type].to_s == 'anchor' }
19
+ end
20
+
21
+ # Returns anchor of a dataset
22
+ #
23
+ # @param dataset [Hash] Dataset blueprint
24
+ # @return [Hash] returns the anchor or nil
25
+ def self.anchor(dataset)
26
+ find_column_by_type(dataset, :anchor)
27
+ end
28
+
29
+ # Returns attributes of a dataset
30
+ #
31
+ # @param dataset [Hash] Dataset blueprint
32
+ # @return [Array<Hash>] returns the attribute or an empty array
33
+ def self.attributes(dataset)
34
+ find_columns_by_type(dataset, :attribute, :all)
35
+ end
36
+
37
+ # Returns attributes and anchor defined on a dataset
38
+ #
39
+ # @param dataset [Hash] Dataset blueprint
40
+ # @return [Array<Hash>] returns the attributes
41
+ def self.attributes_and_anchors(dataset)
42
+ [anchor(dataset)] + attributes(dataset)
43
+ end
44
+
45
+ # Returns all labels that is referenced by a label
46
+ #
47
+ # @param dataset [Hash] Dataset blueprint
48
+ # @return [Array<Hash>] returns the labels or an empty array
49
+ def self.attribute_for_label(dataset, label)
50
+ find_columns_by_type(dataset, :attribute, :anchor).find { |a| label[:reference] == a[:id] }
51
+ end
52
+
53
+ # Returns all the fields of a dataset. This means facts, attributes, references
54
+ #
55
+ # @param ds [Hash] Dataset blueprint
56
+ # @return [Boolean]
57
+ def self.columns(ds)
58
+ (ds.to_hash[:columns] || [])
59
+ end
60
+ singleton_class.send(:alias_method, :fields, :columns)
61
+
62
+ # Tells you if the object is a dataset. It consumes both Hash represenation
63
+ # or the GoodData::Model::DatasetBlueprint
64
+ #
65
+ # @param ds [Object] Value to be tested
66
+ # @return [Boolean]
67
+ def self.dataset_blueprint?(ds)
68
+ if ds.is_a?(DatasetBlueprint)
69
+ true
70
+ elsif ds.respond_to?(:[]) && ds.is_a?(Hash) && ds[:type].to_sym == :dataset
71
+ true
72
+ else
73
+ false
74
+ end
75
+ end
76
+
77
+ # Returns date facts of a dataset
78
+ #
79
+ # @param dataset [Hash] Dataset blueprint
80
+ # @return [Array<Hash>] returns the attribute or an empty array
81
+ def self.date_facts(dataset)
82
+ find_column_by_type(dataset, :date_fact)
83
+ end
84
+
85
+ # Returns label that is marked as default for a particular attribtue.
86
+ # This does not necessarily need to be the first one. This is a default label
87
+ # in terms of what is displayed on the UI
88
+ #
89
+ # @param dataset [Hash] Dataset blueprint
90
+ # @return [Array<Hash>] returns the labels or an empty array
91
+ def self.default_label_for_attribute(dataset, attribute)
92
+ default_label = labels_for_attribute(dataset, attribute).find { |l| l[:default_label] == true }
93
+ default_label
94
+ end
95
+
96
+ # Returns facts of a dataset
97
+ #
98
+ # @param dataset [Hash] Dataset blueprint
99
+ # @return [Array<Hash>] returns the attribute or an empty array
100
+ def self.facts(dataset)
101
+ find_columns_by_type(dataset, :fact, :date_fact)
102
+ end
103
+
104
+ # Finds a specific column given a name
105
+ #
106
+ # @param dataset [Hash] Dataset blueprint
107
+ # @param name [String] Name of a field
108
+ # @param all [Symbol] if :all is passed all mathching objects are returned
109
+ # Otherwise only the first one is
110
+ # @return [Array<Hash>] matching fields
111
+ def self.find_column_by_id(dataset, name, all = nil)
112
+ if all == :all
113
+ columns(dataset).select { |c| c[:id].to_s == name }
114
+ else
115
+ columns(dataset).find { |c| c[:id].to_s == name }
116
+ end
117
+ end
118
+
119
+ # Returns first field of a specified type.
120
+ #
121
+ # @param dataset [Hash | GoodData::Model::ProjectBlueprint] Dataset blueprint
122
+ # @param types [String | Symbol | Array[Symbol] | Array[String]] Type or types you would like to get
123
+ # as third parameter it return all object otherwise it returns the first one
124
+ # @return [Array<Hash>] matching fields
125
+ def self.find_column_by_type(dataset, *types)
126
+ columns(dataset).find { |c| types.any? { |t| t.to_s == c[:type].to_s } }
127
+ end
128
+
129
+ # Returns all the fields of a specified type. You can specify more types
130
+ # if you need more than one type.
131
+ #
132
+ # @param dataset [Hash | GoodData::Model::ProjectBlueprint] Dataset blueprint
133
+ # @param types [String | Symbol | Array[Symmbol] | Array[String]] Type or types you would like to get
134
+ # @return [Array<Hash>] matching fields
135
+ def self.find_columns_by_type(dataset, *types)
136
+ columns(dataset).select { |c| types.any? { |t| t.to_s == c[:type].to_s } }
137
+ end
138
+
139
+ # Returns labels facts of a dataset
140
+ #
141
+ # @param dataset [Hash] Dataset blueprint
142
+ # @return [Array<Hash>] returns the label or an empty array
143
+ def self.labels(dataset)
144
+ find_columns_by_type(dataset, :label)
145
+ end
146
+
147
+ def self.reference_label_for_attribtue(dataset, attribute)
148
+ labels = labels_for_attribute(dataset, attribute)
149
+ labels.find { |label| label[:reference_label] == true } || labels.first
150
+ end
151
+
152
+ # Returns labels for a particular attribute
153
+ #
154
+ # @param dataset [Hash] Dataset blueprint
155
+ # @param attribute [Hash] Attribute
156
+ # @return [Array<Hash>] returns the labels or an empty array
157
+ def self.labels_for_attribute(dataset, attribute)
158
+ labels(dataset).select { |l| l[:reference] == attribute[:id] }
159
+ end
160
+
161
+ # Returns references of a dataset
162
+ #
163
+ # @param dataset [Hash] Dataset blueprint
164
+ # @return [Array<Hash>] returns the references or an empty array
165
+ def self.references(dataset)
166
+ find_columns_by_type(dataset, :reference, :date)
167
+ end
168
+
169
+ # Returns anchor of a dataset
170
+ #
171
+ # @return [Hash] returns the anchor or nil
172
+ def anchor
173
+ find_column_by_type(:anchor)
174
+ end
175
+
176
+ # Checks if a dataset has an anchor.
177
+ #
178
+ # @return [Boolean] returns true if dataset has an anchor
179
+ def anchor?
180
+ columns.any? { |c| c.type == :anchor }
181
+ end
182
+
183
+ # Returns attributes of a dataset
184
+ #
185
+ # @return [Array<Hash>] returns the attribute or an empty array
186
+ def attributes(id = :all)
187
+ return id if id.is_a?(AttributeBlueprintField)
188
+ ats = find_columns_by_type(:attribute)
189
+ id == :all ? ats : ats.find { |a| a.id == id }
190
+ end
191
+
192
+ # Returns attributes and anchor defined on a dataset
193
+ #
194
+ # @return [Array<GoodData::Model::DatasetBlueprint>] returns the attributes
195
+ def attributes_and_anchors
196
+ attributes + [anchor]
197
+ end
198
+
199
+ # Changes the dataset through a builder. You provide a block and an istance of
200
+ # GoodData::Model::SchemaBuilder is passed in as the only parameter
201
+ #
202
+ # @return [GoodData::Model::SchemaBlueprint] returns changed dataset blueprint
203
+ def change(&block)
204
+ builder = SchemaBuilder.create_from_data(self)
205
+ block.call(builder)
206
+ @data = builder.to_hash
207
+ self
208
+ end
209
+
210
+ # Returns all the fields of a dataset. This means anchor, facts, attributes, references
211
+ # This method will cast them to correct types
212
+ #
213
+ # @return [Boolean]
214
+ def columns
215
+ DatasetBlueprint.columns(to_hash).map do |c|
216
+ case c[:type].to_sym
217
+ when :anchor
218
+ GoodData::Model::AnchorBlueprintField.new(c, self)
219
+ when :attribute
220
+ GoodData::Model::AttributeBlueprintField.new(c, self)
221
+ when :fact
222
+ GoodData::Model::FactBlueprintField.new(c, self)
223
+ when :label
224
+ GoodData::Model::LabelBlueprintField.new(c, self)
225
+ when :reference
226
+ GoodData::Model::ReferenceBlueprintField.new(c, self)
227
+ when :date
228
+ GoodData::Model::ReferenceBlueprintField.new(c, self)
229
+ else
230
+ GoodData::Model::BlueprintField.new(c, self)
231
+ end
232
+ end
233
+ end
234
+ alias_method :fields, :columns
235
+
236
+ # Creates a metric which counts numnber of lines in dataset. Works for both
237
+ # datasets with or without anchor
238
+ #
239
+ # @return [Boolean]
240
+ def count(project)
241
+ anchor.in_project(project).create_metric.execute
242
+ end
243
+
244
+ # Returns date facts of a dataset
245
+ #
246
+ # @return [Array<Hash>] returns the attribute or an empty array
247
+ def date_facts
248
+ find_columns_by_type(:date_fact)
249
+ end
250
+
251
+ # Duplicates the DatasetBlueprint. It is done as a deep duplicate
252
+ #
253
+ # @return [GoodData::Model::DatasetBlueprint] matching fields
254
+ def dup
255
+ DatasetBlueprint.new(GoodData::Helpers.deep_dup(data), project_blueprint)
256
+ end
257
+
258
+ # Returns facts of a dataset
259
+ #
260
+ # @return [Array<Hash>] returns the attribute or an empty array
261
+ def facts(id = :all)
262
+ return id if id.is_a?(FactBlueprintField)
263
+ fs = find_columns_by_type(:fact)
264
+ id == :all ? fs : fs.find { |a| a.id == id }
265
+ end
266
+
267
+ # Finds a specific column given a col
268
+ #
269
+ # @param col [GoodData::Model::BlueprintField | Hash] Field
270
+ # @return [GoodData::Model::BlueprintField] matching fields
271
+ def find_column(col)
272
+ columns.find { |c| c == col }
273
+ end
274
+
275
+ # Finds a specific column given an id
276
+ #
277
+ # @param id [String] Id of a field
278
+ # @param all [Symbol] if :all is passed all mathching objects are returned
279
+ # Otherwise only the first one is
280
+ # @return [Array<Hash>] matching fields
281
+ def find_column_by_id(id)
282
+ id = id.respond_to?(:id) ? id.id : id
283
+ columns.find { |c| c.id == id }
284
+ end
285
+
286
+ # Returns first field of a specified type.
287
+ #
288
+ # @param type [String | Symbol | Array[Symmbol] | Array[String]] Type or types you would like to get
289
+ # @return [GoodData::Model::BlueprintField] returns matching field
290
+ def find_column_by_type(*types)
291
+ columns.find { |c| types.any? { |t| t.downcase.to_sym == c.type } }
292
+ end
293
+
294
+ # Returns all the fields of a specified type. You can specify more types
295
+ # as an array if you need more than one type.
296
+ #
297
+ # @param type [String | Symbol | Array[Symmbol] | Array[String]] Type or types you would like to get
298
+ # as third parameter it return all object otherwise it returns the first one
299
+ # @return [Array<GoodData::Model::BlueprintField>] matching fields
300
+ def find_columns_by_type(*types)
301
+ columns.select { |c| types.any? { |t| t.downcase.to_sym == c.type } }
302
+ end
303
+
304
+ # Creates a DatasetBlueprint
305
+ #
306
+ # @param dataset [Hash] Dataset blueprint
307
+ # @return [DatasetBlueprint] returns the labels or an empty array
308
+ def initialize(init_data, blueprint)
309
+ super
310
+ @data[:type] = @data.key?('type') ? @data['type'].to_sym : @data[:type]
311
+ @data[:columns].each do |c|
312
+ c[:type] = c[:type].to_sym
313
+ end
314
+ end
315
+
316
+ # Returns labels facts of a dataset
317
+ #
318
+ # @param dataset [Hash] Dataset blueprint
319
+ # @return [Array<Hash>] returns the label or an empty array
320
+ def labels(id = :all)
321
+ return id if id.is_a?(LabelBlueprintField)
322
+ labs = find_columns_by_type(:label)
323
+ id == :all ? labs : labs.find { |l| l.id == id }
324
+ end
325
+
326
+ def attribute_for_label(label)
327
+ l = labels(label)
328
+ attributes_and_anchors.find { |a| a.id == l.reference }
329
+ end
330
+
331
+ def labels_for_attribute(attribute)
332
+ a = attributes(attribute)
333
+ labels.select { |l| l.reference == a.id }
334
+ end
335
+
336
+ # Merges two schemas together. This method changes the blueprint
337
+ # in place. If you would prefer the method that generates a new blueprint
338
+ # use merge method
339
+ #
340
+ # @param a_blueprint [GoodData::Model::DatasetBlueprint] Dataset blueprint to be merged
341
+ # @return [GoodData::Model::DatasetBlueprint] returns itself changed
342
+ def merge!(a_blueprint)
343
+ new_blueprint = GoodData::Model.merge_dataset_columns(self, a_blueprint)
344
+ @data = new_blueprint
345
+ self
346
+ end
347
+
348
+ # Returns references of a dataset
349
+ #
350
+ # @return [Array<Hash>] returns the references or an empty array
351
+ def references
352
+ find_columns_by_type(:reference, :date)
353
+ end
354
+
355
+ # Removes column from from the blueprint
356
+ #
357
+ # @param id [String] Id of the column to be removed
358
+ # @return [GoodData::Model::ProjectBlueprint] Returns changed blueprint
359
+ def remove_column!(id)
360
+ @project_blueprint.remove_column!(self, id)
361
+ end
362
+
363
+ # Removes all the labels from the anchor. This is a typical operation that people want to perform
364
+ #
365
+ # @return [GoodData::Model::ProjectBlueprint] Returns changed blueprint
366
+ def strip_anchor!
367
+ @project_blueprint.strip_anchor!(self)
368
+ end
369
+
370
+ # Method for suggest a couple of metrics that might get you started
371
+ # Idea is that we will provide couple of strategies. Currently the metrics
372
+ # are created in the random way but they should work.
373
+ #
374
+ # @return [Array<GoodData::Metric>] matching fields
375
+ def suggest_metrics
376
+ identifiers = facts.map { |f| identifier_for(f) }
377
+ identifiers.zip(facts).map do |id, fact|
378
+ Metric.xcreate(
379
+ :title => GoodData::Helpers.titleize(fact[:name]),
380
+ :expression => "SELECT SUM(![#{id}])"
381
+ )
382
+ end
383
+ end
384
+
385
+ alias_method :suggest_measures, :suggest_metrics
386
+
387
+ def to_blueprint
388
+ GoodData::Model::ProjectBlueprint.new(datasets: [to_hash])
389
+ end
390
+
391
+ # Validate the blueprint return array of errors that are found.
392
+ #
393
+ # @return [Array] array of errors
394
+ def validate
395
+ errors = []
396
+ errors.concat(validate_more_anchors)
397
+ errors.concat(validate_some_anchors)
398
+ errors.concat(validate_label_references)
399
+ errors.concat(validate_gd_data_type_errors)
400
+ errors.concat(fields.flat_map(&:validate))
401
+ errors.concat(validate_attribute_has_one_label)
402
+ errors
403
+ end
404
+
405
+ # Validate if the dataset has more than zero anchors defined.
406
+ #
407
+ # @return [Array] array of errors
408
+ def validate_some_anchors
409
+ find_columns_by_type(:anchor).count.zero? ? [{ type: :no_anchor, dataset: id }] : []
410
+ end
411
+
412
+ # Validate if the dataset does not have more than one anchor defined.
413
+ #
414
+ # @return [Array] array of errors
415
+ def validate_more_anchors
416
+ find_columns_by_type(:anchor).count > 1 ? [{ type: :more_than_on_anchor, dataset: id }] : []
417
+ end
418
+
419
+ # Validate if the attribute does have at least one label
420
+ #
421
+ # @return [Array] array of errors
422
+ def validate_attribute_has_one_label
423
+ find_columns_by_type(:attribute)
424
+ .select { |a| a.labels.empty? }
425
+ .map { |e| { type: :attribute_without_label, attribute: e.id } }
426
+ end
427
+
428
+ # Validate the that any labels are pointing to the existing attribute. If not returns the list of errors. Currently just violating labels.
429
+ #
430
+ # @return [Array] array of errors
431
+ def validate_label_references
432
+ labels.select { |r| r.attribute.nil? }
433
+ .map { |er_ref| { type: :wrong_label_reference, label: er_ref.id, wrong_reference: er_ref.data[:reference] } }
434
+ end
435
+
436
+ # Validate the the used gd_data_types are one of the allowed types. The data types are checked on lables and facts.
437
+ #
438
+ # @return [Array] array of errors
439
+ def validate_gd_data_type_errors
440
+ (labels + facts)
441
+ .select { |x| x.gd_data_type && !GoodData::Model.check_gd_data_type(x.gd_data_type) }
442
+ .map { |e| { :error => :invalid_gd_data_type_specified, :column => e.id } }
443
+ end
444
+
445
+ # Helper methods to decide wheather the dataset is considered wide.
446
+ # Currently the wider datasets have both performance and usability
447
+ # penalty
448
+ #
449
+ # @return [Boolean] matching fields
450
+ def wide?
451
+ fields.count > 32
452
+ end
453
+ end
454
+ end
455
+ end