gooddata 0.6.20 → 0.6.22

Sign up to get free protection for your applications and to get access to all the features.
Files changed (316) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +29 -1
  3. data/DEPENDENCIES.md +816 -0
  4. data/LICENSE +1 -1
  5. data/LICENSE.rb +5 -0
  6. data/Rakefile +74 -22
  7. data/dependency_decisions.yml +102 -0
  8. data/gooddata.gemspec +39 -38
  9. data/lib/gooddata.rb +4 -0
  10. data/lib/gooddata/app/app.rb +4 -0
  11. data/lib/gooddata/bricks/base_downloader.rb +5 -1
  12. data/lib/gooddata/bricks/brick.rb +4 -0
  13. data/lib/gooddata/bricks/bricks.rb +5 -0
  14. data/lib/gooddata/bricks/middleware/aws_middleware.rb +5 -0
  15. data/lib/gooddata/bricks/middleware/base_middleware.rb +5 -0
  16. data/lib/gooddata/bricks/middleware/bench_middleware.rb +5 -0
  17. data/lib/gooddata/bricks/middleware/bulk_salesforce_middleware.rb +5 -0
  18. data/lib/gooddata/bricks/middleware/decode_params_middleware.rb +6 -0
  19. data/lib/gooddata/bricks/middleware/fs_download_middleware.rb +6 -0
  20. data/lib/gooddata/bricks/middleware/fs_upload_middleware.rb +6 -0
  21. data/lib/gooddata/bricks/middleware/gooddata_middleware.rb +6 -0
  22. data/lib/gooddata/bricks/middleware/logger_middleware.rb +5 -0
  23. data/lib/gooddata/bricks/middleware/middleware.rb +5 -0
  24. data/lib/gooddata/bricks/middleware/restforce_middleware.rb +4 -0
  25. data/lib/gooddata/bricks/middleware/stdout_middleware.rb +5 -0
  26. data/lib/gooddata/bricks/middleware/twitter_middleware.rb +5 -0
  27. data/lib/gooddata/bricks/middleware/undot_params_middleware.rb +4 -0
  28. data/lib/gooddata/bricks/pipeline.rb +4 -0
  29. data/lib/gooddata/bricks/utils.rb +4 -0
  30. data/lib/gooddata/cli/cli.rb +4 -0
  31. data/lib/gooddata/cli/commands/api_cmd.rb +4 -0
  32. data/lib/gooddata/cli/commands/auth_cmd.rb +4 -0
  33. data/lib/gooddata/cli/commands/console_cmd.rb +4 -0
  34. data/lib/gooddata/cli/commands/domain_cmd.rb +4 -0
  35. data/lib/gooddata/cli/commands/process_cmd.rb +4 -0
  36. data/lib/gooddata/cli/commands/project_cmd.rb +4 -0
  37. data/lib/gooddata/cli/commands/projects_cmd.rb +4 -0
  38. data/lib/gooddata/cli/commands/run_ruby_cmd.rb +4 -0
  39. data/lib/gooddata/cli/commands/scaffold_cmd.rb +4 -0
  40. data/lib/gooddata/cli/commands/user_cmd.rb +4 -0
  41. data/lib/gooddata/cli/hooks.rb +4 -0
  42. data/lib/gooddata/cli/shared.rb +4 -0
  43. data/lib/gooddata/cli/terminal.rb +4 -0
  44. data/lib/gooddata/client.rb +4 -0
  45. data/lib/gooddata/commands/api.rb +4 -0
  46. data/lib/gooddata/commands/auth.rb +4 -0
  47. data/lib/gooddata/commands/base.rb +4 -0
  48. data/lib/gooddata/commands/commands.rb +5 -0
  49. data/lib/gooddata/commands/datasets.rb +5 -1
  50. data/lib/gooddata/commands/datawarehouse.rb +4 -0
  51. data/lib/gooddata/commands/domain.rb +4 -0
  52. data/lib/gooddata/commands/process.rb +4 -0
  53. data/lib/gooddata/commands/project.rb +7 -9
  54. data/lib/gooddata/commands/projects.rb +4 -0
  55. data/lib/gooddata/commands/role.rb +4 -0
  56. data/lib/gooddata/commands/runners.rb +4 -0
  57. data/lib/gooddata/commands/scaffold.rb +4 -0
  58. data/lib/gooddata/commands/user.rb +4 -0
  59. data/lib/gooddata/connection.rb +83 -0
  60. data/lib/gooddata/core/core.rb +4 -0
  61. data/lib/gooddata/core/logging.rb +4 -0
  62. data/lib/gooddata/core/nil_logger.rb +4 -0
  63. data/lib/gooddata/core/project.rb +4 -0
  64. data/lib/gooddata/core/rest.rb +14 -16
  65. data/lib/gooddata/core/user.rb +4 -0
  66. data/lib/gooddata/data/data.rb +4 -0
  67. data/lib/gooddata/data/guesser.rb +4 -0
  68. data/lib/gooddata/exceptions/attr_element_not_found.rb +4 -0
  69. data/lib/gooddata/exceptions/command_failed.rb +4 -0
  70. data/lib/gooddata/exceptions/exceptions.rb +4 -0
  71. data/lib/gooddata/exceptions/execution_limit_exceeded.rb +4 -0
  72. data/lib/gooddata/exceptions/filter_maqlization.rb +16 -0
  73. data/lib/gooddata/exceptions/malformed_user.rb +15 -0
  74. data/lib/gooddata/exceptions/no_project_error.rb +4 -0
  75. data/lib/gooddata/exceptions/object_migration.rb +28 -0
  76. data/lib/gooddata/exceptions/project_not_found.rb +5 -0
  77. data/lib/gooddata/exceptions/uncomputable_report.rb +5 -0
  78. data/lib/gooddata/exceptions/user_in_different_domain.rb +4 -0
  79. data/lib/gooddata/exceptions/validation_error.rb +4 -0
  80. data/lib/gooddata/extensions/big_decimal.rb +4 -0
  81. data/lib/gooddata/extensions/enumerable.rb +4 -0
  82. data/lib/gooddata/extensions/extensions.rb +4 -0
  83. data/lib/gooddata/extensions/false.rb +4 -0
  84. data/lib/gooddata/extensions/hash.rb +4 -0
  85. data/lib/gooddata/extensions/nil.rb +4 -0
  86. data/lib/gooddata/extensions/numeric.rb +4 -0
  87. data/lib/gooddata/extensions/object.rb +4 -0
  88. data/lib/gooddata/extensions/symbol.rb +4 -0
  89. data/lib/gooddata/extensions/true.rb +4 -0
  90. data/lib/gooddata/extract.rb +4 -0
  91. data/lib/gooddata/goodzilla/goodzilla.rb +87 -77
  92. data/lib/gooddata/helpers/auth_helpers.rb +6 -2
  93. data/lib/gooddata/helpers/csv_helper.rb +4 -0
  94. data/lib/gooddata/helpers/data_helper.rb +4 -0
  95. data/lib/gooddata/helpers/global_helpers.rb +35 -6
  96. data/lib/gooddata/helpers/global_helpers_params.rb +34 -7
  97. data/lib/gooddata/helpers/helpers.rb +4 -0
  98. data/lib/gooddata/mixins/author.rb +4 -0
  99. data/lib/gooddata/mixins/content_getter.rb +4 -0
  100. data/lib/gooddata/mixins/content_property_reader.rb +4 -0
  101. data/lib/gooddata/mixins/content_property_writer.rb +4 -0
  102. data/lib/gooddata/mixins/contributor.rb +4 -0
  103. data/lib/gooddata/mixins/data_getter.rb +4 -0
  104. data/lib/gooddata/mixins/data_property_reader.rb +4 -0
  105. data/lib/gooddata/mixins/data_property_writer.rb +4 -0
  106. data/lib/gooddata/mixins/inspector.rb +4 -0
  107. data/lib/gooddata/mixins/is_attribute.rb +4 -0
  108. data/lib/gooddata/mixins/is_dimension.rb +4 -0
  109. data/lib/gooddata/mixins/is_fact.rb +4 -0
  110. data/lib/gooddata/mixins/is_label.rb +4 -0
  111. data/lib/gooddata/mixins/links.rb +4 -0
  112. data/lib/gooddata/mixins/md_finders.rb +4 -0
  113. data/lib/gooddata/mixins/md_id_to_uri.rb +4 -0
  114. data/lib/gooddata/mixins/md_json.rb +4 -0
  115. data/lib/gooddata/mixins/md_lock.rb +4 -0
  116. data/lib/gooddata/mixins/md_object_id.rb +5 -1
  117. data/lib/gooddata/mixins/md_object_indexer.rb +4 -0
  118. data/lib/gooddata/mixins/md_object_query.rb +4 -0
  119. data/lib/gooddata/mixins/md_relations.rb +4 -0
  120. data/lib/gooddata/mixins/meta_getter.rb +4 -0
  121. data/lib/gooddata/mixins/meta_property_reader.rb +4 -0
  122. data/lib/gooddata/mixins/meta_property_writer.rb +4 -0
  123. data/lib/gooddata/mixins/mixins.rb +4 -0
  124. data/lib/gooddata/mixins/not_attribute.rb +4 -0
  125. data/lib/gooddata/mixins/not_exportable.rb +4 -0
  126. data/lib/gooddata/mixins/not_fact.rb +4 -0
  127. data/lib/gooddata/mixins/not_label.rb +4 -0
  128. data/lib/gooddata/mixins/not_metric.rb +6 -0
  129. data/lib/gooddata/mixins/obj_id.rb +4 -0
  130. data/lib/gooddata/mixins/rest_getters.rb +4 -0
  131. data/lib/gooddata/mixins/rest_resource.rb +4 -0
  132. data/lib/gooddata/mixins/root_key_getter.rb +4 -0
  133. data/lib/gooddata/mixins/root_key_setter.rb +4 -0
  134. data/lib/gooddata/mixins/timestamps.rb +4 -0
  135. data/lib/gooddata/models/blueprint/anchor_field.rb +4 -0
  136. data/lib/gooddata/models/blueprint/attribute_field.rb +4 -0
  137. data/lib/gooddata/models/blueprint/blueprint.rb +4 -0
  138. data/lib/gooddata/models/blueprint/blueprint_field.rb +4 -0
  139. data/lib/gooddata/models/blueprint/dashboard_builder.rb +4 -0
  140. data/lib/gooddata/models/blueprint/dataset_blueprint.rb +6 -0
  141. data/lib/gooddata/models/blueprint/date_dimension.rb +4 -0
  142. data/lib/gooddata/models/blueprint/fact_field.rb +4 -0
  143. data/lib/gooddata/models/blueprint/label_field.rb +4 -0
  144. data/lib/gooddata/models/blueprint/project_blueprint.rb +6 -0
  145. data/lib/gooddata/models/blueprint/project_builder.rb +4 -0
  146. data/lib/gooddata/models/blueprint/reference_field.rb +4 -0
  147. data/lib/gooddata/models/blueprint/schema_blueprint.rb +4 -0
  148. data/lib/gooddata/models/blueprint/schema_builder.rb +4 -0
  149. data/lib/gooddata/models/blueprint/to_manifest.rb +17 -1
  150. data/lib/gooddata/models/blueprint/to_wire.rb +4 -0
  151. data/lib/gooddata/models/datawarehouse.rb +5 -0
  152. data/lib/gooddata/models/domain.rb +25 -7
  153. data/lib/gooddata/models/execution.rb +4 -0
  154. data/lib/gooddata/models/execution_detail.rb +4 -0
  155. data/lib/gooddata/models/from_wire.rb +4 -0
  156. data/lib/gooddata/models/invitation.rb +4 -0
  157. data/lib/gooddata/models/links.rb +4 -0
  158. data/lib/gooddata/models/membership.rb +4 -0
  159. data/lib/gooddata/models/metadata.rb +37 -10
  160. data/lib/gooddata/models/metadata/attribute.rb +6 -0
  161. data/lib/gooddata/models/metadata/dashboard.rb +54 -16
  162. data/lib/gooddata/models/metadata/dashboard/dashboard_item.rb +60 -0
  163. data/lib/gooddata/models/metadata/dashboard/filter_item.rb +15 -0
  164. data/lib/gooddata/models/metadata/dashboard/report_item.rb +51 -0
  165. data/lib/gooddata/models/metadata/dashboard_tab.rb +88 -0
  166. data/lib/gooddata/models/metadata/dataset.rb +4 -0
  167. data/lib/gooddata/models/metadata/dimension.rb +4 -0
  168. data/lib/gooddata/models/metadata/fact.rb +6 -0
  169. data/lib/gooddata/models/metadata/label.rb +15 -0
  170. data/lib/gooddata/models/metadata/metadata.rb +4 -0
  171. data/lib/gooddata/models/metadata/metric.rb +5 -4
  172. data/lib/gooddata/models/metadata/report.rb +62 -16
  173. data/lib/gooddata/models/metadata/report_definition.rb +44 -47
  174. data/lib/gooddata/models/metadata/variable.rb +4 -0
  175. data/lib/gooddata/models/model.rb +85 -36
  176. data/lib/gooddata/models/models.rb +4 -0
  177. data/lib/gooddata/models/module_constants.rb +4 -0
  178. data/lib/gooddata/models/process.rb +4 -0
  179. data/lib/gooddata/models/profile.rb +13 -0
  180. data/lib/gooddata/models/project.rb +173 -92
  181. data/lib/gooddata/models/project_creator.rb +18 -10
  182. data/lib/gooddata/models/project_metadata.rb +4 -0
  183. data/lib/gooddata/models/project_role.rb +4 -0
  184. data/lib/gooddata/models/report_data_result.rb +217 -125
  185. data/lib/gooddata/models/schedule.rb +140 -65
  186. data/lib/gooddata/models/tab_builder.rb +4 -0
  187. data/lib/gooddata/models/user_filters/mandatory_user_filter.rb +4 -0
  188. data/lib/gooddata/models/user_filters/user_filter.rb +4 -0
  189. data/lib/gooddata/models/user_filters/user_filter_builder.rb +98 -56
  190. data/lib/gooddata/models/user_filters/user_filters.rb +4 -0
  191. data/lib/gooddata/models/user_filters/variable_user_filter.rb +4 -0
  192. data/lib/gooddata/rest/client.rb +41 -38
  193. data/lib/gooddata/rest/connection.rb +91 -20
  194. data/lib/gooddata/rest/connections/rest_client_connection.rb +5 -1
  195. data/lib/gooddata/rest/object.rb +9 -1
  196. data/lib/gooddata/rest/object_factory.rb +5 -1
  197. data/lib/gooddata/rest/resource.rb +5 -1
  198. data/lib/gooddata/rest/rest.rb +4 -0
  199. data/lib/gooddata/version.rb +5 -1
  200. data/spec/bricks/bricks_spec.rb +4 -0
  201. data/spec/data/blueprints/test_project_model_spec.json +2 -2
  202. data/spec/data/gooddata_version_process/gooddata_version.rb +6 -0
  203. data/spec/data/hello_world_process/hello_world.rb +6 -0
  204. data/spec/data/manifests/test_project.json +5 -5
  205. data/spec/data/reports/left_attr_report.json +108 -0
  206. data/spec/data/reports/metric_only_one_line.json +83 -0
  207. data/spec/data/reports/report_1.json +197 -0
  208. data/spec/data/reports/top_attr_report.json +108 -0
  209. data/spec/data/ruby_params_process/ruby_params.rb +6 -0
  210. data/spec/data/ruby_process/process.rb +6 -0
  211. data/spec/environment/default.rb +5 -0
  212. data/spec/environment/develop.rb +10 -5
  213. data/spec/environment/environment.rb +4 -0
  214. data/spec/environment/hotfix.rb +5 -1
  215. data/spec/environment/production.rb +4 -0
  216. data/spec/environment/release.rb +4 -0
  217. data/spec/environment/staging.rb +30 -0
  218. data/spec/environment/staging_3.rb +37 -0
  219. data/spec/helpers/blueprint_helper.rb +4 -0
  220. data/spec/helpers/cli_helper.rb +4 -0
  221. data/spec/helpers/connection_helper.rb +24 -17
  222. data/spec/helpers/crypto_helper.rb +6 -0
  223. data/spec/helpers/csv_helper.rb +4 -0
  224. data/spec/helpers/process_helper.rb +5 -1
  225. data/spec/helpers/project_helper.rb +34 -29
  226. data/spec/helpers/schedule_helper.rb +4 -0
  227. data/spec/helpers/spec_helper.rb +4 -0
  228. data/spec/integration/blueprint_updates_spec.rb +28 -20
  229. data/spec/integration/command_datawarehouse_spec.rb +6 -0
  230. data/spec/integration/command_projects_spec.rb +6 -4
  231. data/spec/integration/create_from_template_spec.rb +6 -0
  232. data/spec/integration/create_project_spec.rb +6 -0
  233. data/spec/integration/deprecated_load_spec.rb +58 -0
  234. data/spec/integration/full_process_schedule_spec.rb +9 -0
  235. data/spec/integration/full_project_spec.rb +63 -9
  236. data/spec/integration/over_to_user_filters_spec.rb +7 -2
  237. data/spec/integration/partial_md_export_import_spec.rb +6 -0
  238. data/spec/integration/project_spec.rb +12 -6
  239. data/spec/integration/rest_spec.rb +6 -2
  240. data/spec/integration/schedule_spec.rb +627 -0
  241. data/spec/integration/user_filters_spec.rb +122 -21
  242. data/spec/integration/variables_spec.rb +8 -15
  243. data/spec/logging_in_logging_out_spec.rb +58 -0
  244. data/spec/spec_helper.rb +10 -5
  245. data/spec/unit/bricks/bricks_spec.rb +4 -0
  246. data/spec/unit/bricks/middleware/aws_middelware_spec.rb +4 -0
  247. data/spec/unit/bricks/middleware/bench_middleware_spec.rb +4 -0
  248. data/spec/unit/bricks/middleware/bulk_salesforce_middleware_spec.rb +4 -0
  249. data/spec/unit/bricks/middleware/gooddata_middleware_spec.rb +4 -0
  250. data/spec/unit/bricks/middleware/logger_middleware_spec.rb +4 -0
  251. data/spec/unit/bricks/middleware/restforce_middleware_spec.rb +4 -0
  252. data/spec/unit/bricks/middleware/stdout_middleware_spec.rb +4 -0
  253. data/spec/unit/bricks/middleware/twitter_middleware_spec.rb +4 -0
  254. data/spec/unit/cli/cli_spec.rb +4 -0
  255. data/spec/unit/cli/commands/cmd_api_spec.rb +4 -0
  256. data/spec/unit/cli/commands/cmd_auth_spec.rb +4 -0
  257. data/spec/unit/cli/commands/cmd_domain_spec.rb +4 -0
  258. data/spec/unit/cli/commands/cmd_process_spec.rb +4 -0
  259. data/spec/unit/cli/commands/cmd_project_spec.rb +4 -0
  260. data/spec/unit/cli/commands/cmd_role_spec.rb +4 -0
  261. data/spec/unit/cli/commands/cmd_run_ruby_spec.rb +4 -0
  262. data/spec/unit/cli/commands/cmd_scaffold_spec.rb +6 -0
  263. data/spec/unit/cli/commands/cmd_user_spec.rb +6 -0
  264. data/spec/unit/commands/command_api_spec.rb +6 -0
  265. data/spec/unit/commands/command_auth_spec.rb +6 -0
  266. data/spec/unit/commands/command_dataset_spec.rb +10 -4
  267. data/spec/unit/commands/command_process_spec.rb +6 -0
  268. data/spec/unit/commands/command_projects_spec.rb +6 -0
  269. data/spec/unit/commands/command_scaffold_spec.rb +6 -0
  270. data/spec/unit/commands/command_user_spec.rb +6 -0
  271. data/spec/unit/core/connection_spec.rb +6 -0
  272. data/spec/unit/core/logging_spec.rb +4 -0
  273. data/spec/unit/core/nil_logger_spec.rb +4 -0
  274. data/spec/unit/core/project_spec.rb +4 -0
  275. data/spec/unit/data/guesser_spec.rb +6 -2
  276. data/spec/unit/extensions/hash_spec.rb +4 -0
  277. data/spec/unit/godzilla/goodzilla_spec.rb +4 -0
  278. data/spec/unit/helpers/csv_helper_spec.rb +4 -0
  279. data/spec/unit/helpers/data_helper_spec.rb +4 -0
  280. data/spec/unit/helpers/global_helpers_spec.rb +54 -0
  281. data/spec/unit/helpers_spec.rb +6 -1
  282. data/spec/unit/models/blueprint/attributes_spec.rb +5 -0
  283. data/spec/unit/models/blueprint/dataset_spec.rb +5 -0
  284. data/spec/unit/models/blueprint/labels_spec.rb +5 -0
  285. data/spec/unit/models/blueprint/project_blueprint_spec.rb +5 -0
  286. data/spec/unit/models/blueprint/reference_spec.rb +5 -0
  287. data/spec/unit/models/blueprint/schema_builder_spec.rb +4 -0
  288. data/spec/unit/models/blueprint/to_wire_spec.rb +5 -0
  289. data/spec/unit/models/domain_spec.rb +9 -7
  290. data/spec/unit/models/execution_spec.rb +6 -0
  291. data/spec/unit/models/from_wire_spec.rb +4 -0
  292. data/spec/unit/models/invitation_spec.rb +4 -0
  293. data/spec/unit/models/membership_spec.rb +4 -0
  294. data/spec/unit/models/metadata_spec.rb +46 -0
  295. data/spec/unit/models/metric_spec.rb +4 -0
  296. data/spec/unit/models/model_spec.rb +4 -0
  297. data/spec/unit/models/params_spec.rb +4 -0
  298. data/spec/unit/models/profile_spec.rb +4 -0
  299. data/spec/unit/models/project_creator_spec.rb +127 -0
  300. data/spec/unit/models/project_role_spec.rb +4 -0
  301. data/spec/unit/models/project_spec.rb +4 -0
  302. data/spec/unit/models/report_result_data_spec.rb +193 -0
  303. data/spec/unit/models/schedule_spec.rb +241 -386
  304. data/spec/unit/models/to_manifest_spec.rb +21 -0
  305. data/spec/unit/models/{unit_project.rb → unit_project_spec.rb} +21 -18
  306. data/spec/unit/models/user_filters_spec.rb +7 -1
  307. data/spec/unit/models/variable_spec.rb +6 -0
  308. data/spec/unit/rest/polling_spec.rb +8 -5
  309. data/spec/unit/rest/resource_spec.rb +4 -0
  310. metadata +190 -129
  311. data/.autotest +0 -2
  312. data/.travis.yml +0 -22
  313. data/examples.rb +0 -69
  314. data/lib/gooddata/models/data_result.rb +0 -38
  315. data/lib/gooddata/models/empty_result.rb +0 -57
  316. data/spec/unit/models/project_creator.rb +0 -73
@@ -1,4 +1,8 @@
1
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.
2
6
 
3
7
  require 'pathname'
4
8
 
@@ -1,4 +1,8 @@
1
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.
2
6
 
3
7
  require_relative 'user_filter'
4
8
 
@@ -1,4 +1,8 @@
1
- # encoding: utf-8
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.
2
6
 
3
7
  require 'rest-client'
4
8
 
@@ -61,7 +65,7 @@ module GoodData
61
65
  # @param username [String] Username to be used for authentication
62
66
  # @param password [String] Password to be used for authentication
63
67
  # @return [GoodData::Rest::Client] Client
64
- def connect(username, password, opts = { verify_ssl: true })
68
+ def connect(username, password = 'aaaa', opts = {})
65
69
  if username.nil? && password.nil?
66
70
  username = ENV['GD_GEM_USER']
67
71
  password = ENV['GD_GEM_PASSWORD']
@@ -71,25 +75,35 @@ module GoodData
71
75
 
72
76
  new_opts = opts.dup
73
77
  if username.is_a?(Hash) && username.key?(:sst_token)
74
- new_opts = username
78
+ new_opts = new_opts.merge(username)
75
79
  elsif username.is_a? Hash
80
+ new_opts = new_opts.merge(username)
76
81
  new_opts[:username] = username[:login] || username[:user] || username[:username]
77
82
  new_opts[:password] = username[:password]
78
- new_opts[:verify_ssl] = username[:verify_ssl] if username[:verify_ssl] == false || !username[:verify_ssl].blank?
79
- elsif username.nil? && password.nil? && (opts.nil? || opts.empty?)
83
+ elsif username.nil? && password.nil? && opts.blank?
80
84
  new_opts = Helpers::AuthHelper.read_credentials
81
85
  else
82
86
  new_opts[:username] = username
83
87
  new_opts[:password] = password
84
88
  end
89
+
90
+ new_opts = { verify_ssl: true }.merge(new_opts)
91
+ if username.is_a?(Hash) && username[:cookies]
92
+ new_opts[:sst_token] = username[:cookies]['GDCAuthSST']
93
+ new_opts[:cookies] = username[:cookies]
94
+ end
95
+
85
96
  unless new_opts[:sst_token]
86
97
  fail ArgumentError, 'No username specified' if new_opts[:username].nil?
87
98
  fail ArgumentError, 'No password specified' if new_opts[:password].nil?
88
99
  end
100
+
89
101
  if username.is_a?(Hash) && username.key?(:server)
90
102
  new_opts[:server] = username[:server]
91
103
  end
104
+
92
105
  client = Client.new(new_opts)
106
+ GoodData.logger.info("Connected to server with webdav path #{client.user_webdav_path}")
93
107
 
94
108
  if client
95
109
  at_exit do
@@ -99,6 +113,10 @@ module GoodData
99
113
 
100
114
  # HACK: This line assigns class instance # if not done yet
101
115
  @@instance = client # rubocop:disable ClassVars
116
+ end
117
+
118
+ def connect_sso(sso)
119
+ client = Client.new(sso)
102
120
  client
103
121
  end
104
122
 
@@ -157,7 +175,9 @@ module GoodData
157
175
  end
158
176
 
159
177
  def project_is_accessible?(id)
160
- projects(id) && true rescue false
178
+ projects(id) && true
179
+ rescue
180
+ true
161
181
  end
162
182
 
163
183
  def projects(id = :all)
@@ -251,15 +271,14 @@ module GoodData
251
271
  url
252
272
  end
253
273
 
254
- def user_webdav_path(opts = { project: GoodData.project })
255
- p = opts[:project]
256
- fail ArgumentError, 'No :project specified' if p.nil?
257
-
258
- project = GoodData::Project[p, opts]
259
- fail ArgumentError, 'Wrong :project specified' if project.nil?
260
-
261
- u = URI(project.links['uploads'])
262
- URI.join(u.to_s.chomp(u.path.to_s), '/uploads/')
274
+ def user_webdav_path
275
+ uri = if opts[:webdav_server]
276
+ opts[:webdav_server]
277
+ else
278
+ links.find { |i| i['category'] == 'uploads' }['link']
279
+ end
280
+ res = uri.chomp('/') + '/'
281
+ res[0] == '/' ? "#{connection.server}#{res}" : res
263
282
  end
264
283
 
265
284
  # Generalizaton of poller. Since we have quite a variation of how async proceses are handled
@@ -298,9 +317,10 @@ module GoodData
298
317
  def poll_on_response(link, options = {}, &bl)
299
318
  sleep_interval = options[:sleep_interval] || DEFAULT_SLEEP_INTERVAL
300
319
  time_limit = options[:time_limit] || DEFAULT_POLL_TIME_LIMIT
320
+ process = options[:process] == false ? false : true
301
321
 
302
322
  # get the first status and start the timer
303
- response = get(link, options)
323
+ response = get(link, process: process)
304
324
  poll_start = Time.now
305
325
 
306
326
  while bl.call(response)
@@ -310,7 +330,7 @@ module GoodData
310
330
  end
311
331
  sleep sleep_interval
312
332
  GoodData::Rest::Client.retryable(:tries => 3, :refresh_token => proc { connection.refresh_token }) do
313
- response = get(link, options)
333
+ response = get(link, process: process)
314
334
  end
315
335
  end
316
336
  response
@@ -349,37 +369,20 @@ module GoodData
349
369
 
350
370
  def download_from_user_webdav(source_relative_path, target_file_path, options = { client: GoodData.client, project: project })
351
371
  download(source_relative_path, target_file_path, options.merge(:directory => options[:directory],
352
- :staging_url => get_user_webdav_url(options)))
372
+ :staging_url => user_webdav_path))
353
373
  end
354
374
 
355
375
  def upload_to_user_webdav(file, options = {})
356
376
  upload(file, options.merge(:directory => options[:directory],
357
- :staging_url => get_user_webdav_url(options)))
377
+ :staging_url => user_webdav_path))
358
378
  end
359
379
 
360
380
  def with_project(pid, &block)
361
381
  GoodData.with_project(pid, client: self, &block)
362
382
  end
363
383
 
364
- ###################### PRIVATE ######################
365
-
366
- private
367
-
368
- def get_user_webdav_url(options = {})
369
- p = options[:project]
370
- fail ArgumentError, 'No :project specified' if p.nil?
371
-
372
- project = options[:project] || GoodData::Project[p, options]
373
- fail ArgumentError, 'Wrong :project specified' if project.nil?
374
-
375
- u = URI(project.links['uploads'])
376
- us = u.to_s
377
- ws = options[:client].opts[:webdav_server]
378
- if !us.empty? && !us.downcase.start_with?('http') && !ws.empty?
379
- u = URI.join(ws, us)
380
- end
381
-
382
- URI.join(u.to_s.chomp(u.path.to_s), '/uploads/')
384
+ def links
385
+ GoodData::Helpers.get_path(get('/gdc'), %w(about links))
383
386
  end
384
387
  end
385
388
  end
@@ -1,13 +1,59 @@
1
- # encoding: utf-8
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.
2
6
 
3
7
  require 'terminal-table'
4
8
  require 'securerandom'
5
9
  require 'monitor'
6
10
  require 'thread_safe'
11
+ require 'rest-client'
7
12
 
8
13
  require_relative '../version'
9
14
  require_relative '../exceptions/exceptions'
10
15
 
16
+ module RestClient
17
+ module AbstractResponse
18
+ alias_method :old_follow_redirection, :follow_redirection
19
+ def follow_redirection(request = nil, result = nil, &block)
20
+ fail 'Using monkey patched version of RestClient::AbstractResponse#follow_redirection which is guaranteed to be compatible only with RestClient 1.8.0' if RestClient::VERSION != '1.8.0'
21
+
22
+ # @args[:cookies] = request.cookies
23
+ # old_follow_redirection(request, result, &block)
24
+
25
+ new_args = @args.dup
26
+
27
+ url = headers[:location]
28
+ url = URI.parse(request.url).merge(url).to_s if url !~ /^http/
29
+
30
+ new_args[:url] = url
31
+ if request
32
+ fail MaxRedirectsReached if request.max_redirects == 0
33
+ new_args[:password] = request.password
34
+ new_args[:user] = request.user
35
+ new_args[:headers] = request.headers
36
+ new_args[:max_redirects] = request.max_redirects - 1
37
+
38
+ # TODO: figure out what to do with original :cookie, :cookies values
39
+ new_args[:cookies] = get_redirection_cookies(request, result, new_args)
40
+ end
41
+
42
+ Request.execute(new_args, &block)
43
+ end
44
+
45
+ # Returns cookies which should be passed when following redirect
46
+ #
47
+ # @param request [RestClient::Request] Original request
48
+ # @param result [Net::HTTPResponse] Response
49
+ # @param args [Hash] Original arguments
50
+ # @return [Hash] Cookies to be passsed when following redirect
51
+ def get_redirection_cookies(request, _result, _args)
52
+ request.cookies
53
+ end
54
+ end
55
+ end
56
+
11
57
  module GoodData
12
58
  module Rest
13
59
  # Wrapper of low-level HTTP/REST client/library
@@ -19,6 +65,8 @@ module GoodData
19
65
  TOKEN_PATH = '/gdc/account/token'
20
66
  KEYS_TO_SCRUB = [:password, :verifyPassword, :authorizationToken]
21
67
 
68
+ ID_LENGTH = 16
69
+
22
70
  DEFAULT_HEADERS = {
23
71
  :content_type => :json,
24
72
  :accept => [:json, :zip],
@@ -42,7 +90,7 @@ module GoodData
42
90
  Timeout::Error
43
91
  ]
44
92
 
45
- RETRIES_ON_TOO_MANY_REQUESTS_ERROR = 10
93
+ RETRIES_ON_TOO_MANY_REQUESTS_ERROR = 12
46
94
  RETRY_TIME_INITIAL_VALUE = 1
47
95
  RETRY_TIME_COEFFICIENT = 1.5
48
96
  RETRYABLE_ERRORS << Net::ReadTimeout if Net.const_defined?(:ReadTimeout)
@@ -59,6 +107,15 @@ module GoodData
59
107
  res
60
108
  end
61
109
 
110
+ # Generate random string with URL safe base64 encoding
111
+ #
112
+ # @param [String] length Length of random string to be generated
113
+ #
114
+ # @return [String] Generated random string
115
+ def generate_string(length = ID_LENGTH)
116
+ SecureRandom.urlsafe_base64(length)
117
+ end
118
+
62
119
  # Retry block if exception thrown
63
120
  def retryable(options = {}, &_block)
64
121
  opts = { :tries => 1, :on => RETRYABLE_ERRORS }.merge(options)
@@ -125,7 +182,6 @@ module GoodData
125
182
  headers = options[:headers] || {}
126
183
 
127
184
  options = options.merge(headers)
128
-
129
185
  @server = RestClient::Resource.new server, options
130
186
 
131
187
  # Install at_exit handler first
@@ -142,17 +198,29 @@ module GoodData
142
198
  # Reset old cookies first
143
199
  if options[:sst_token]
144
200
  merge_cookies!('GDCAuthSST' => options[:sst_token])
201
+ get('/gdc/account/token', @request_params)
202
+
145
203
  @user = get(get('/gdc/app/account/bootstrap')['bootstrapResource']['accountSetting']['links']['self'])
204
+ GoodData.logger.info("Connected using SST to server #{@server.url} to profile \"#{@user['accountSetting']['login']}\"")
146
205
  @auth = {}
147
206
  refresh_token :dont_reauth => true
148
207
  else
208
+ GoodData.logger.info("Connected using username \"#{username}\" to server #{@server.url}")
149
209
  credentials = Connection.construct_login_payload(username, password)
150
210
  generate_session_id
151
- @auth = post(LOGIN_PATH, credentials)['userLogin']
211
+ @auth = post(LOGIN_PATH, credentials, :dont_reauth => true)['userLogin']
152
212
 
153
213
  refresh_token :dont_reauth => true
154
214
  @user = get(@auth['profile'])
155
215
  end
216
+ GoodData.logger.info('Connection successful')
217
+ rescue RestClient::Unauthorized => e
218
+ GoodData.logger.info('Bad Login or Password')
219
+ GoodData.logger.info('Connection failed')
220
+ raise e
221
+ rescue RestClient::Forbidden => e
222
+ GoodData.logger.info('Connection failed')
223
+ raise e
156
224
  end
157
225
 
158
226
  # Disconnect
@@ -270,7 +338,7 @@ module GoodData
270
338
  @server[uri].delete(params)
271
339
  rescue RestClient::Exception => e
272
340
  # log the error if it happens
273
- GoodData.logger.error(format_error(e, params))
341
+ log_error(e, uri, params)
274
342
  raise e
275
343
  end
276
344
  end
@@ -278,6 +346,16 @@ module GoodData
278
346
  end
279
347
  end
280
348
 
349
+ # Helper for logging error
350
+ #
351
+ # @param e [RuntimeException] Exception to log
352
+ # @param uri [String] Uri on which the request failed
353
+ # @param uri [Hash] Additional params
354
+ def log_error(e, uri, params)
355
+ return if e.response && e.response.code == 401 && !uri.include?('token') && !uri.include?('login')
356
+ GoodData.logger.error(format_error(e, params))
357
+ end
358
+
281
359
  # HTTP GET
282
360
  #
283
361
  # @param uri [String] Target URI
@@ -291,7 +369,7 @@ module GoodData
291
369
  @server[uri].get(params, &user_block)
292
370
  rescue RestClient::Exception => e
293
371
  # log the error if it happens
294
- GoodData.logger.error(format_error(e, params))
372
+ log_error(e, uri, params)
295
373
  raise e
296
374
  end
297
375
  end
@@ -313,7 +391,7 @@ module GoodData
313
391
  @server[uri].put(payload, params)
314
392
  rescue RestClient::Exception => e
315
393
  # log the error if it happens
316
- GoodData.logger.error(format_error(e, params))
394
+ log_error(e, uri, params)
317
395
  raise e
318
396
  end
319
397
  end
@@ -335,7 +413,7 @@ module GoodData
335
413
  @server[uri].post(payload, params)
336
414
  rescue RestClient::Exception => e
337
415
  # log the error if it happens
338
- GoodData.logger.error(format_error(e, params))
416
+ log_error(e, uri, params)
339
417
  raise e
340
418
  end
341
419
  end
@@ -379,7 +457,6 @@ module GoodData
379
457
  dir = options[:directory] || ''
380
458
  staging_uri = options[:staging_url].to_s
381
459
  url = dir.empty? ? staging_uri : URI.join(staging_uri, "#{dir}/").to_s
382
-
383
460
  # Make a directory, if needed
384
461
  create_webdav_dir_if_needed url unless dir.empty?
385
462
 
@@ -393,8 +470,6 @@ module GoodData
393
470
 
394
471
  private
395
472
 
396
- ID_LENGTH = 16
397
-
398
473
  def create_webdav_dir_if_needed(url)
399
474
  return if webdav_dir_exists?(url)
400
475
 
@@ -438,22 +513,18 @@ module GoodData
438
513
  "#{params[:x_gdc_request]} #{e.inspect}"
439
514
  end
440
515
 
441
- def generate_string
442
- SecureRandom.urlsafe_base64(ID_LENGTH)
443
- end
444
-
445
516
  # generate session id to be passed as the first part to
446
517
  # x_gdc_request header
447
518
  def session_id
448
- @session_id ||= generate_string
519
+ @session_id ||= Connection.generate_string
449
520
  end
450
521
 
451
522
  def call_id
452
- generate_string
523
+ Connection.generate_string
453
524
  end
454
525
 
455
526
  def generate_session_id
456
- @session_id = generate_string
527
+ @session_id = Connection.generate_string
457
528
  end
458
529
 
459
530
  def clear_session_id
@@ -481,8 +552,8 @@ module GoodData
481
552
 
482
553
  def process_response(options = {}, &block)
483
554
  retries = options[:tries] || 3
484
-
485
- response = GoodData::Rest::Connection.retryable(:tries => retries, :refresh_token => proc { refresh_token unless options[:dont_reauth] }) do
555
+ opts = { tries: retries, refresh_token: proc { refresh_token unless options[:dont_reauth] } }.merge(options)
556
+ response = GoodData::Rest::Connection.retryable(opts) do
486
557
  block.call
487
558
  end
488
559
 
@@ -1,4 +1,8 @@
1
- # encoding: utf-8
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.
2
6
 
3
7
  require_relative '../connection'
4
8
 
@@ -1,4 +1,8 @@
1
- # encoding: utf-8
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.
2
6
 
3
7
  module GoodData
4
8
  module Rest
@@ -19,6 +23,10 @@ module GoodData
19
23
  @client || GoodData::Rest::Object.client(opts)
20
24
  end
21
25
 
26
+ def saved?
27
+ !uri.blank?
28
+ end
29
+
22
30
  class << self
23
31
  def default_client
24
32
  end