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,12 @@
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 'pathname'
8
+
9
+ base = Pathname(__FILE__).dirname.expand_path
10
+ Dir.glob(base + '*.rb').each do |file|
11
+ require_relative file
12
+ end
@@ -0,0 +1,31 @@
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
+ # GoodData REST API categories
10
+ LDM_CTG = 'ldm'
11
+ LDM_MANAGE_CTG = 'ldm-manage2'
12
+
13
+ # Model naming conventions
14
+ FIELD_PK = 'id'
15
+ FK_SUFFIX = '_id'
16
+ FACT_COLUMN_PREFIX = 'f_'
17
+ DATE_COLUMN_PREFIX = 'dt_'
18
+ TIME_COLUMN_PREFIX = 'tm_'
19
+ LABEL_COLUMN_PREFIX = 'nm_'
20
+ ATTRIBUTE_FOLDER_PREFIX = 'dim'
21
+ ATTRIBUTE_PREFIX = 'attr'
22
+ LABEL_PREFIX = 'label'
23
+ FACT_PREFIX = 'fact'
24
+ DATE_FACT_PREFIX = 'dt'
25
+ DATE_ATTRIBUTE = 'date'
26
+ DATE_ATTRIBUTE_DEFAULT_DISPLAY_FORM = 'mdyy'
27
+ TIME_FACT_PREFIX = 'tm.dt'
28
+ TIME_ATTRIBUTE_PREFIX = 'attr.time'
29
+ FACT_FOLDER_PREFIX = 'ffld'
30
+ end
31
+ end
@@ -0,0 +1,316 @@
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 'pry'
8
+ require 'zip'
9
+ require 'uri'
10
+
11
+ require_relative '../helpers/global_helpers'
12
+ require_relative '../rest/resource'
13
+
14
+ require_relative 'execution_detail'
15
+ require_relative 'schedule'
16
+
17
+ APP_STORE_URL ||= 'https://github.com/gooddata/app_store'
18
+
19
+ module GoodData
20
+ class Process < Rest::Resource
21
+ attr_reader :data
22
+
23
+ alias_method :raw_data, :data
24
+ alias_method :json, :data
25
+ alias_method :to_hash, :data
26
+
27
+ class << self
28
+ def [](id, options = {})
29
+ project = options[:project]
30
+ c = client(options)
31
+
32
+ if id == :all && project
33
+ uri = "/gdc/projects/#{project.pid}/dataload/processes"
34
+ data = c.get(uri)
35
+ data['processes']['items'].map do |process_data|
36
+ c.create(Process, process_data, project: project)
37
+ end
38
+ elsif id == :all
39
+ uri = "/gdc/account/profile/#{c.user.obj_id}/dataload/processes"
40
+ data = c.get(uri)
41
+ pids = data['processes']['items'].map { |process_data| process_data['process']['links']['self'].match(%r{/gdc/projects/(\w*)/})[1] }.uniq
42
+ projects_lookup = pids.pmap { |pid| c.projects(pid) }.reduce({}) do |a, e|
43
+ a[e.pid] = e
44
+ a
45
+ end
46
+
47
+ data['processes']['items'].map do |process_data|
48
+ pid = process_data['process']['links']['self'].match(%r{/gdc/projects/(\w*)/})[1]
49
+ c.create(Process, process_data, project: projects_lookup[pid])
50
+ end
51
+ else
52
+ uri = "/gdc/projects/#{project.pid}/dataload/processes/#{id}"
53
+ c.create(Process, c.get(uri), project: project)
54
+ end
55
+ end
56
+
57
+ def all
58
+ Process[:all]
59
+ end
60
+
61
+ def with_deploy(dir, options = {}, &block)
62
+ _client, project = GoodData.get_client_and_project(options)
63
+
64
+ GoodData.with_project(project) do
65
+ params = options[:params].nil? ? [] : [options[:params]]
66
+ if block
67
+ begin
68
+ res = GoodData::Process.deploy(dir, options.merge(:files_to_exclude => params))
69
+ block.call(res)
70
+ rescue => e
71
+ puts e.inspect
72
+ ensure
73
+ res.delete if res
74
+ end
75
+ else
76
+ GoodData::Process.deploy(dir, options.merge(:files_to_exclude => params))
77
+ end
78
+ end
79
+ end
80
+
81
+ def upload_package(path, files_to_exclude, opts = { :client => GoodData.connection })
82
+ GoodData.get_client_and_project(opts)
83
+ zip_and_upload(path, files_to_exclude, opts)
84
+ end
85
+
86
+ # Deploy a new process or redeploy existing one.
87
+ #
88
+ # @param path [String] Path to ZIP archive or to a directory containing files that should be ZIPed
89
+ # @option options [String] :files_to_exclude
90
+ # @option options [String] :type ('GRAPH') Type of process - GRAPH or RUBY
91
+ # @option options [String] :name Readable name of the process
92
+ # @option options [String] :process_id ID of a process to be redeployed (do not set if you want to create a new process)
93
+ # @option options [Boolean] :verbose (false) Switch on verbose mode for detailed logging
94
+ def deploy(path, options = { :client => GoodData.client, :project => GoodData.project })
95
+ client, project = GoodData.get_client_and_project(options)
96
+
97
+ return deploy_brick(path, options) if path.to_s.start_with?(APP_STORE_URL)
98
+
99
+ path = Pathname(path) || fail('Path is not specified')
100
+ files_to_exclude = options[:files_to_exclude].nil? ? [] : options[:files_to_exclude].map { |pname| Pathname(pname) }
101
+ process_id = options[:process_id]
102
+
103
+ type = options[:type] || 'GRAPH'
104
+ deploy_name = options[:name]
105
+ fail ArgumentError, 'options[:name] can not be nil or empty!' if deploy_name.nil? || deploy_name.empty?
106
+
107
+ verbose = options[:verbose] || false
108
+ puts HighLine.color("Deploying #{path}", HighLine::BOLD) if verbose
109
+
110
+ deployed_path = Process.upload_package(path, files_to_exclude, client: client, project: project)
111
+ data = {
112
+ :process => {
113
+ :name => deploy_name,
114
+ :path => "/uploads/#{File.basename(deployed_path)}",
115
+ :type => type
116
+ }
117
+ }
118
+
119
+ res = if process_id.nil?
120
+ client.post("/gdc/projects/#{project.pid}/dataload/processes", data)
121
+ else
122
+ client.put("/gdc/projects/#{project.pid}/dataload/processes/#{process_id}", data)
123
+ end
124
+
125
+ process = client.create(Process, res, project: project)
126
+ puts HighLine.color("Deploy DONE #{path}", HighLine::GREEN) if verbose
127
+ process
128
+ end
129
+
130
+ def deploy_brick(path, options = { :client => GoodData.client, :project => GoodData.project })
131
+ client, project = GoodData.get_client_and_project(options)
132
+
133
+ brick_uri_parts = URI(path).path.split('/')
134
+ ref = brick_uri_parts[4]
135
+ brick_name = brick_uri_parts.last
136
+ brick_path = brick_uri_parts[5..-1].join('/')
137
+
138
+ Dir.mktmpdir do |dir|
139
+ Dir.chdir(dir) do
140
+ `git clone #{APP_STORE_URL}`
141
+ end
142
+
143
+ Dir.chdir(File.join(dir, 'app_store')) do
144
+ if ref
145
+ `git checkout #{ref}`
146
+
147
+ fail 'Wrong branch or tag specified!' if $CHILD_STATUS.to_i != 0
148
+ end
149
+
150
+ opts = {
151
+ :client => client,
152
+ :project => project,
153
+ :name => brick_name,
154
+ :type => 'RUBY'
155
+ }
156
+
157
+ full_brick_path = File.join(dir, 'app_store', brick_path)
158
+
159
+ unless File.exist?(full_brick_path)
160
+ fail "Invalid brick name specified - '#{brick_name}'"
161
+ end
162
+
163
+ return deploy(full_brick_path, opts)
164
+ end
165
+ end
166
+ end
167
+
168
+ # ----------------------------- Private Stuff
169
+
170
+ private
171
+
172
+ def with_zip(opts = {})
173
+ Tempfile.open('deploy-graph-archive') do |temp|
174
+ zip_filename = temp.path
175
+ File.open(zip_filename, 'w') do |zip|
176
+ Zip::File.open(zip.path, Zip::File::CREATE) do |zipfile|
177
+ yield zipfile
178
+ end
179
+ end
180
+ client.upload_to_user_webdav(temp.path, opts)
181
+ temp.path
182
+ end
183
+ end
184
+
185
+ def zip_and_upload(path, files_to_exclude, opts = {})
186
+ puts 'Creating package for upload'
187
+ if !path.directory? && (path.extname == '.grf' || path.extname == '.rb')
188
+ with_zip(opts) do |zipfile|
189
+ zipfile.add(File.basename(path), path)
190
+ end
191
+ elsif !path.directory?
192
+ # this branch expects a zipped file. Since the filename on webdav is by default
193
+ # equal to the filename of a local file. I happened often that the name clashed
194
+ # if ran in parallel. Create a randomized name to mitigate that
195
+ randomized_filename = (0...16).map { (65 + rand(26)).chr }.join
196
+ client.upload_to_user_webdav(path, { filename: randomized_filename }.merge(opts))
197
+ randomized_filename
198
+ else
199
+ with_zip(opts) do |zipfile|
200
+ files_to_upload = Dir[File.join(path, '**', '**')].reject { |f| files_to_exclude.include?(Pathname(path) + f) }
201
+ puts "Uploading #{files_to_upload.count} files."
202
+ files_to_upload.each do |file|
203
+ file_pathname = Pathname.new(file)
204
+ file_relative_pathname = file_pathname.relative_path_from(Pathname.new(path))
205
+ zipfile.add(file_relative_pathname, file)
206
+ end
207
+ end
208
+ end
209
+ end
210
+ # -----------------------------
211
+ end
212
+
213
+ def initialize(data)
214
+ @data = data
215
+ end
216
+
217
+ def delete
218
+ client.delete(uri)
219
+ end
220
+
221
+ # Redeploy existing process.
222
+ #
223
+ # @param path [String] Path to ZIP archive or to a directory containing files that should be ZIPed
224
+ # @option options [String] :files_to_exclude
225
+ # @option options [String] :process_id ('nobody') From address
226
+ # @option options [String] :type ('GRAPH') Type of process - GRAPH or RUBY
227
+ # @option options [String] :name Readable name of the process
228
+ # @option options [Boolean] :verbose (false) Switch on verbose mode for detailed logging
229
+ def deploy(path, options = {})
230
+ Process.deploy(path, { client: client, process_id: process_id, :project => project, :name => name, :type => type }.merge(options))
231
+ end
232
+
233
+ # Downloads the process from S3 in a zipped form.
234
+ #
235
+ # @return [IO] The stream of data that represents a zipped deployed process.
236
+ def download
237
+ link = links['source']
238
+ client.connection.refresh_token
239
+ client.get(link, process: false) { |_, _, result| RestClient.get(result.to_hash['location'].first) }
240
+ end
241
+
242
+ def process
243
+ data['process']
244
+ end
245
+
246
+ def name
247
+ process['name']
248
+ end
249
+
250
+ def type
251
+ process['type'].downcase.to_sym
252
+ end
253
+
254
+ def links
255
+ process['links']
256
+ end
257
+
258
+ def link
259
+ links['self']
260
+ end
261
+
262
+ alias_method :uri, :link
263
+
264
+ def obj_id
265
+ uri.split('/').last
266
+ end
267
+
268
+ alias_method :process_id, :obj_id
269
+
270
+ def executions_link
271
+ links['executions']
272
+ end
273
+
274
+ def graphs
275
+ process['graphs']
276
+ end
277
+
278
+ def executables
279
+ process['executables']
280
+ end
281
+
282
+ def schedules
283
+ project.schedules.select { |schedule| schedule.process_id == obj_id }
284
+ end
285
+
286
+ def create_schedule(cron, executable, options = {})
287
+ project.create_schedule(process_id, cron, executable, options.merge(client: client, project: project))
288
+ end
289
+
290
+ def execute(executable, options = {})
291
+ result = start_execution(executable, options)
292
+ begin
293
+ client.poll_on_code(result['executionTask']['links']['poll'], options)
294
+ rescue RestClient::RequestFailed => e
295
+ raise(e)
296
+ ensure
297
+ result = client.get(result['executionTask']['links']['detail'])
298
+ if result['executionDetail']['status'] == 'ERROR'
299
+ fail "Runing process failed. You can look at a log here #{result['executionDetail']['logFileName']}"
300
+ end
301
+ end
302
+ client.create(GoodData::ExecutionDetail, result, client: client, project: project)
303
+ end
304
+
305
+ def start_execution(executable, options = {})
306
+ params = options[:params] || {}
307
+ hidden_params = options[:hidden_params] || {}
308
+ client.post(executions_link,
309
+ :execution => {
310
+ :graph => executable.to_s,
311
+ :params => GoodData::Helpers.encode_public_params(params),
312
+ :hiddenParams => GoodData::Helpers.encode_hidden_params(hidden_params)
313
+ })
314
+ end
315
+ end
316
+ end
@@ -0,0 +1,426 @@
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 'pmap'
8
+
9
+ require_relative '../rest/object'
10
+
11
+ require_relative 'project'
12
+
13
+ module GoodData
14
+ class Profile < Rest::Resource
15
+ attr_reader :user, :json
16
+
17
+ EMPTY_OBJECT = {
18
+ 'accountSetting' => {
19
+ 'companyName' => nil,
20
+ 'country' => nil,
21
+ 'created' => nil,
22
+ 'firstName' => nil,
23
+ 'lastName' => nil,
24
+ 'login' => nil,
25
+ 'phoneNumber' => nil,
26
+ 'position' => nil,
27
+ 'timezone' => nil,
28
+ 'updated' => nil,
29
+ 'links' => {
30
+ 'projects' => nil,
31
+ 'self' => nil
32
+ },
33
+ 'email' => nil,
34
+ 'authenticationModes' => []
35
+ }
36
+ }
37
+
38
+ ASSIGNABLE_MEMBERS = [
39
+ :company,
40
+ :country,
41
+ :email,
42
+ :login,
43
+ :first_name,
44
+ :last_name,
45
+ :phone,
46
+ :position,
47
+ :timezone
48
+ ]
49
+
50
+ PROFILE_PATH = '/gdc/account/profile/%s'
51
+
52
+ class << self
53
+ # Get profile by ID or URI
54
+ #
55
+ # @param id ID or URI of user to be found
56
+ # @param [Hash] opts Additional optional options
57
+ # @option opts [GoodData::Rest::Client] :client Client used for communication with server
58
+ # @return GoodData::Profile User Profile
59
+ def [](id, opts = { client: GoodData.connection })
60
+ return id if id.instance_of?(GoodData::Profile) || id.respond_to?(:profile?) && id.profile?
61
+
62
+ if id.to_s !~ %r{^(\/gdc\/account\/profile\/)?[a-zA-Z\d]+$}
63
+ fail(ArgumentError, 'wrong type of argument. Should be either project ID or path')
64
+ end
65
+
66
+ id = id.match(/[a-zA-Z\d]+$/)[0] if id =~ %r{/}
67
+
68
+ c = client(opts)
69
+ fail ArgumentError, 'No :client specified' if c.nil?
70
+
71
+ response = c.get(PROFILE_PATH % id)
72
+ c.factory.create(Profile, response)
73
+ end
74
+
75
+ # Creates new instance from hash with attributes
76
+ #
77
+ # @param attributes [Hash] Hash with initial attributes
78
+ # @return [GoodData::Profile] New profile instance
79
+ def create(attributes)
80
+ res = create_object(attributes)
81
+ res.save!
82
+ res
83
+ end
84
+
85
+ def create_object(attributes)
86
+ json = GoodData::Helpers.deep_dup(EMPTY_OBJECT)
87
+ json['accountSetting']['links']['self'] = attributes[:uri] if attributes[:uri]
88
+ res = client.create(GoodData::Profile, json)
89
+
90
+ attributes.each do |k, v|
91
+ res.send("#{k}=", v) if ASSIGNABLE_MEMBERS.include? k
92
+ end
93
+ res
94
+ end
95
+
96
+ def diff(item_1, item_2)
97
+ x = diff_list([item_1], [item_2])
98
+ return {} if x[:changed].empty?
99
+ x[:changed].first[:diff]
100
+ end
101
+
102
+ def diff_list(list_1, list_2)
103
+ GoodData::Helpers.diff(list_1, list_2, key: :login)
104
+ end
105
+
106
+ # Gets user currently logged in
107
+ # @return [GoodData::Profile] User currently logged-in
108
+ def current
109
+ client.user
110
+ end
111
+ end
112
+
113
+ # Creates new instance
114
+ #
115
+ # @return [Profile] New Profile instance
116
+ def initialize(json)
117
+ @json = json
118
+ @dirty = false
119
+ end
120
+
121
+ # Checks objects for equality
122
+ #
123
+ # @param right [GoodData::Profile] Project to compare with
124
+ # @return [Boolean] True if same else false
125
+ def ==(other)
126
+ return false unless other.respond_to?(:to_hash)
127
+ to_hash == other.to_hash
128
+ end
129
+
130
+ # Checks objects for non-equality
131
+ #
132
+ # @param right [GoodData::Profile] Project to compare with
133
+ # @return [Boolean] True if different else false
134
+ def !=(other)
135
+ !(self == other)
136
+ end
137
+
138
+ # Apply changes to object.
139
+ #
140
+ # @param changes [Hash] Hash with modifications
141
+ # @return [GoodData::Profile] Modified object
142
+ # def apply(changes)
143
+ # GoodData::Profile.apply(self, changes)
144
+ # end
145
+
146
+ # Gets the company name
147
+ #
148
+ # @return [String] Company name
149
+ def company
150
+ @json['accountSetting']['companyName'] || ''
151
+ end
152
+
153
+ # Set the company name
154
+ #
155
+ # @param val [String] Company name to be set
156
+ def company=(val)
157
+ @dirty ||= company != val
158
+ @json['accountSetting']['companyName'] = val
159
+ end
160
+
161
+ # Gets the country
162
+ #
163
+ # @return [String] Country
164
+ def country
165
+ @json['accountSetting']['country'] || ''
166
+ end
167
+
168
+ # Set the country
169
+ #
170
+ # @param val [String] Country to be set
171
+ def country=(val)
172
+ @dirty ||= country != val
173
+ @json['accountSetting']['country'] = val
174
+ end
175
+
176
+ # Gets date when created
177
+ #
178
+ # @return [DateTime] Created date
179
+ def created
180
+ DateTime.parse(@json['accountSetting']['created'])
181
+ end
182
+
183
+ # Deletes this account settings
184
+ def delete
185
+ client.delete uri
186
+ end
187
+
188
+ # Gets hash representing diff of profiles
189
+ #
190
+ # @param user [GoodData::Profile] Another profile to compare with
191
+ # @return [Hash] Hash representing diff
192
+ def diff(user)
193
+ GoodData::Profile.diff(self, user)
194
+ end
195
+
196
+ # Gets the email
197
+ #
198
+ # @return [String] Email address
199
+ def email
200
+ @json['accountSetting']['email'] || ''
201
+ end
202
+
203
+ # Set the email
204
+ #
205
+ # @param val [String] Email to be set
206
+ def email=(val)
207
+ @dirty ||= email != val
208
+ @json['accountSetting']['email'] = val
209
+ end
210
+
211
+ # Gets the first name
212
+ #
213
+ # @return [String] First name
214
+ def first_name
215
+ @json['accountSetting']['firstName'] || ''
216
+ end
217
+
218
+ # Set the first name
219
+ #
220
+ # @param val [String] First name to be set
221
+ def first_name=(val)
222
+ @dirty ||= first_name != val
223
+ @json['accountSetting']['firstName'] = val
224
+ end
225
+
226
+ # Get full name
227
+ #
228
+ # @return String Full Name
229
+ # NOTE: This can be tricky to implement correctly for i18n
230
+ def full_name
231
+ "#{first_name} #{last_name}"
232
+ end
233
+
234
+ alias_method :title, :full_name
235
+
236
+ # Gets the last name
237
+ #
238
+ # @return [String] Last name
239
+ def last_name
240
+ @json['accountSetting']['lastName'] || ''
241
+ end
242
+
243
+ # Set the last name
244
+ #
245
+ # @param val [String] Last name to be set
246
+ def last_name=(val)
247
+ @dirty ||= last_name != val
248
+ @json['accountSetting']['lastName'] = val
249
+ end
250
+
251
+ # Gets the login
252
+ #
253
+ # @return [String] Login
254
+ def login
255
+ @json['accountSetting']['login'] || ''
256
+ end
257
+
258
+ # Set the login
259
+ #
260
+ # @param val [String] Login to be set
261
+ def login=(val)
262
+ @dirty ||= login != val
263
+ @json['accountSetting']['login'] = val
264
+ end
265
+
266
+ # Gets the resource identifier
267
+ #
268
+ # @return [String] Resource identifier
269
+ def obj_id
270
+ uri.split('/').last
271
+ end
272
+
273
+ alias_method :account_setting_id, :obj_id
274
+
275
+ # Gets the phone
276
+ #
277
+ # @return [String] Phone
278
+ def phone
279
+ @json['accountSetting']['phoneNumber'] || ''
280
+ end
281
+
282
+ alias_method :phone_number, :phone
283
+
284
+ # Set the phone
285
+ #
286
+ # @param val [String] Phone to be set
287
+ def phone=(val)
288
+ @dirty ||= phone != val
289
+ @json['accountSetting']['phoneNumber'] = val
290
+ end
291
+
292
+ alias_method :phone_number=, :phone=
293
+
294
+ # Gets the position in company
295
+ #
296
+ # @return [String] Position in company
297
+ def position
298
+ @json['accountSetting']['position'] || ''
299
+ end
300
+
301
+ # Set the position
302
+ #
303
+ # @param val [String] Position to be set
304
+ def position=(val)
305
+ @dirty ||= position != val
306
+ @json['accountSetting']['position'] = val
307
+ end
308
+
309
+ # Gets the array of projects
310
+ #
311
+ # @return [Array<GoodData::Project>] Array of project where account settings belongs to
312
+ def projects
313
+ projects = client.get @json['accountSetting']['links']['projects']
314
+ projects['projects'].map do |project|
315
+ client.create(GoodData::Project, project)
316
+ end
317
+ end
318
+
319
+ # Saves object if dirty, clears dirty flag
320
+ def save!
321
+ if @dirty
322
+ raw = @json.dup
323
+ raw['accountSetting'].delete('login')
324
+
325
+ if uri && !uri.empty?
326
+ url = "/gdc/account/profile/#{obj_id}"
327
+ @json = client.put url, raw
328
+ @dirty = false
329
+ end
330
+ end
331
+ self
332
+ end
333
+
334
+ # Gets the preferred timezone
335
+ #
336
+ # @return [String] Preferred timezone
337
+ def timezone
338
+ @json['accountSetting']['timezone'] || ''
339
+ end
340
+
341
+ # Set the timezone
342
+ #
343
+ # @param val [String] Timezone to be set
344
+ def timezone=(val)
345
+ @dirty ||= timezone != val
346
+ @json['accountSetting']['timezone'] = val
347
+ end
348
+
349
+ # Gets the date when updated
350
+ #
351
+ # @return [DateTime] Updated date
352
+ def updated
353
+ DateTime.parse(@json['accountSetting']['updated'])
354
+ end
355
+
356
+ # Gets the resource REST URI
357
+ #
358
+ # @return [String] Resource URI
359
+ def uri
360
+ GoodData::Helpers.get_path(@json, %w(accountSetting links self))
361
+ end
362
+
363
+ def data
364
+ data = @json || {}
365
+ data['accountSetting'] || {}
366
+ end
367
+
368
+ def links
369
+ data['links'] || {}
370
+ end
371
+
372
+ def content
373
+ keys = (data.keys - ['links'])
374
+ data.slice(*keys)
375
+ end
376
+
377
+ def name
378
+ (first_name || '') + (last_name || '')
379
+ end
380
+
381
+ def password
382
+ @json['accountSetting']['password']
383
+ end
384
+
385
+ def password=(a_password)
386
+ @dirty = true
387
+ @json['accountSetting']['password'] = a_password
388
+ end
389
+
390
+ def sso_provider
391
+ @json['accountSetting']['ssoProvider']
392
+ end
393
+
394
+ def sso_provider=(an_sso_provider)
395
+ @dirty = true
396
+ @json['accountSetting']['ssoProvider'] = an_sso_provider
397
+ end
398
+
399
+ def authentication_modes
400
+ @json['accountSetting']['authenticationModes'].map { |x| x.downcase.to_sym }
401
+ end
402
+
403
+ def authentication_modes=(modes)
404
+ modes = Array(modes)
405
+ @dirty = true
406
+ @json['accountSetting']['authenticationModes'] = modes.map { |x| x.to_s.upcase }
407
+ end
408
+
409
+ def to_hash
410
+ tmp = GoodData::Helpers.symbolize_keys(content.merge(uri: uri))
411
+ [
412
+ [:companyName, :company],
413
+ [:phoneNumber, :phone],
414
+ [:firstName, :first_name],
415
+ [:lastName, :last_name],
416
+ [:authenticationModes, :authentication_modes],
417
+ [:ssoProvider, :sso_provider]
418
+ ].each do |vals|
419
+ wire, rb = vals
420
+ tmp[rb] = tmp[wire]
421
+ tmp.delete(wire)
422
+ end
423
+ tmp
424
+ end
425
+ end
426
+ end