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_relative '../metadata'
4
8
  require_relative 'metadata'
@@ -65,6 +69,33 @@ module GoodData
65
69
  self
66
70
  end
67
71
 
72
+ # Add a report definition to a report. This will show on a UI as a new version.
73
+ #
74
+ # @param report_definition [GoodData::ReportDefinition | String] Report definition to add. Either it can be a URI of a report definition or an actual report definition object.
75
+ # @return [GoodData::Report] Return self
76
+ def add_definition!(report_definition)
77
+ res = add_definition(report_definition)
78
+ res.save
79
+ end
80
+
81
+ # Returns the newest (current version) report definition as an object
82
+ #
83
+ # @return [GoodData::ReportDefinition] Returns the newest report defintion
84
+ def definition
85
+ project.report_definitions(latest_report_definition_uri)
86
+ end
87
+
88
+ alias_method :latest_report_definition, :definition
89
+
90
+ # Returns the newest (current version) report definition uri
91
+ #
92
+ # @return [String] Returns uri of the newest report defintion
93
+ def definition_uri
94
+ definition_uris.last
95
+ end
96
+
97
+ alias_method :latest_report_definition_uri, :definition_uri
98
+
68
99
  # Gets a report definitions (versions) of this report as objects.
69
100
  #
70
101
  # @return [Array<GoodData::ReportDefinition>] Returns list of report definitions. Oldest comes first
@@ -103,9 +134,9 @@ module GoodData
103
134
  end
104
135
 
105
136
  if result.empty?
106
- client.create(EmptyResult, result)
137
+ client.create(ReportDataResult, data: [], top: 0, left: 0, project: project)
107
138
  else
108
- client.create(ReportDataResult, result)
139
+ ReportDataResult.from_xtab(result, client: client, project: project)
109
140
  end
110
141
  end
111
142
 
@@ -126,20 +157,6 @@ module GoodData
126
157
  client.poll_on_code(result1['uri'], options.merge(process: false))
127
158
  end
128
159
 
129
- # Returns the newest (current version) report definition uri
130
- #
131
- # @return [String] Returns uri of the newest report defintion
132
- def latest_report_definition_uri
133
- definition_uris.last
134
- end
135
-
136
- # Returns the newest (current version) report definition as an object
137
- #
138
- # @return [GoodData::ReportDefinition] Returns the newest report defintion
139
- def latest_report_definition
140
- project.report_definitions(latest_report_definition_uri)
141
- end
142
-
143
160
  # Returns the newest (current version) report definition uri
144
161
  #
145
162
  # @return [String] Returns uri of the newest report defintion
@@ -191,5 +208,34 @@ module GoodData
191
208
  new_defs.pmap(&:save)
192
209
  self
193
210
  end
211
+
212
+ ## Update report definition and reflect the change in report
213
+ #
214
+ # @param [Hash] opts Options
215
+ # @option opts [Boolean] :new_definition (true) If true then new definition will be created
216
+ # @return [GoodData::ReportDefinition] Updated and saved report definition
217
+ def update_definition(opts = { :new_definition => true }, &block)
218
+ # TODO: Cache the latest report definition somehow
219
+ repdef = definition.dup
220
+
221
+ block.call(repdef, self) if block_given?
222
+
223
+ if opts[:new_definition]
224
+ new_def = GoodData::ReportDefinition.create(:client => client, :project => project)
225
+
226
+ rd = repdef.json['reportDefinition']
227
+ rd.delete('links')
228
+ %w(author uri created identifier updated contributor).each { |k| rd['meta'].delete(k) }
229
+ new_def.json['reportDefinition'] = rd
230
+ new_def.save
231
+
232
+ add_definition!(new_def)
233
+ return new_def
234
+ else
235
+ repdef.save
236
+ end
237
+
238
+ repdef
239
+ end
194
240
  end
195
241
  end
@@ -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 '../metadata'
4
8
  require_relative 'metadata'
@@ -27,6 +31,8 @@ module GoodData
27
31
  end
28
32
  end
29
33
 
34
+ alias_method :create_measures_part, :create_metrics_part
35
+
30
36
  def create_metric_part(metric)
31
37
  {
32
38
  'alias' => metric.title,
@@ -34,6 +40,8 @@ module GoodData
34
40
  }
35
41
  end
36
42
 
43
+ alias_method :create_measure_part, :create_metric_part
44
+
37
45
  def create_attribute_part(attrib)
38
46
  {
39
47
  'attribute' => {
@@ -68,54 +76,41 @@ module GoodData
68
76
 
69
77
  def find(stuff, opts = { :client => GoodData.connection, :project => GoodData.project })
70
78
  client = opts[:client]
79
+ project = opts[:project]
71
80
  fail ArgumentError, 'No :client specified' if client.nil?
81
+ fail ArgumentError, 'No :project specified' if project.nil?
72
82
 
73
83
  stuff.map do |item|
74
- if item.respond_to?(:attribute?) && item.attribute?
75
- item.display_forms.first
76
- elsif item.is_a?(String)
77
- x = GoodData::MdObject.get_by_id(item, opts)
78
- fail "Object given by id \"#{item}\" could not be found" if x.nil?
79
- case x.raw_data.keys.first.to_s
80
- when 'attribute'
81
- attr = GoodData::Attribute.new(x.json)
82
- attr.client = client
83
- attr.project = opts[:project]
84
- attr.display_forms.first
85
- when 'attributeDisplayForm'
86
- GoodData::Label.new(x.json)
87
- when 'metric'
88
- GoodData::Metric.new(x.json)
89
- end
90
- elsif item.is_a?(Hash) && item.keys.include?(:title)
91
- case item[:type].to_s
92
- when 'metric'
93
- GoodData::Metric.find_first_by_title(item[:title])
94
- when 'attribute'
95
- result = GoodData::Attribute.find_first_by_title(item[:title])
96
- result.display_forms.first
97
- end
98
- elsif item.is_a?(Hash) && (item.keys.include?(:id))
99
- case item[:type].to_s
100
- when 'metric'
101
- GoodData::Metric.get_by_id(item[:id])
102
- when 'attribute'
103
- GoodData::Attribute.get_by_id(item[:id]).display_forms.first
104
- when 'label'
105
- GoodData::Label.get_by_id(item[:id])
106
- end
107
- elsif item.is_a?(Hash) && (item.keys.include?(:identifier))
108
- case item[:type].to_s
109
- when 'metric'
110
- GoodData::Metric.get_by_id(item[:identifier])
111
- when 'attribute'
112
- result = GoodData::Attribute.get_by_id(item[:identifier])
113
- result.display_forms.first
114
- when 'label'
115
- GoodData::Label.get_by_id(item[:identifier])
116
- end
84
+ obj = if item.is_a?(String)
85
+ begin
86
+ project.objects(item)
87
+ rescue RestClient::ResourceNotFound
88
+ raise "Object given by id \"#{item}\" could not be found"
89
+ end
90
+ elsif item.is_a?(Hash) && item.keys.include?(:title)
91
+ case item[:type].to_s
92
+ when 'metric'
93
+ GoodData::Metric.find_first_by_title(item[:title], opts)
94
+ when 'attribute'
95
+ GoodData::Attribute.find_first_by_title(item[:title], opts)
96
+ end
97
+ elsif item.is_a?(Hash) && (item.keys.include?(:id) || item.keys.include?(:identifier))
98
+ id = item[:id] || item[:identifier]
99
+ case item[:type].to_s
100
+ when 'metric'
101
+ project.metrics(id)
102
+ when 'attribute'
103
+ project.attributes(id)
104
+ when 'label'
105
+ projects.labels(id)
106
+ end
107
+ else
108
+ item
109
+ end
110
+ if obj.respond_to?(:attribute?) && obj.attribute?
111
+ obj.display_forms.first
117
112
  else
118
- item
113
+ obj
119
114
  end
120
115
  end
121
116
  end
@@ -223,6 +218,8 @@ module GoodData
223
218
  content['grid']['metrics']
224
219
  end
225
220
 
221
+ alias_method :measure_parts, :metric_parts
222
+
226
223
  def metrics
227
224
  metric_parts.map { |i| project.metrics(i['uri']) }
228
225
  end
@@ -307,7 +304,7 @@ module GoodData
307
304
  content['grid']['columnWidths'] = widths.map do |item|
308
305
  if item.is_a?(Hash)
309
306
  GoodData::Helpers.deep_dup(item).tap do |i|
310
- if i['locator'][0].key?('attributeHeaderLocator')
307
+ if i['locator'].length > 0 && ['locator'][0].key?('attributeHeaderLocator')
311
308
  i['locator'][0]['attributeHeaderLocator']['uri'].gsub!("[#{uri_what}]", "[#{uri_for_what}]")
312
309
  end
313
310
  end
@@ -374,9 +371,9 @@ module GoodData
374
371
  end
375
372
 
376
373
  if result.empty?
377
- client.create(EmptyResult, result)
374
+ client.create(ReportDataResult, data: [], top: 0, left: 0, project: project)
378
375
  else
379
- client.create(ReportDataResult, result)
376
+ ReportDataResult.from_xtab(result, client: client, project: project)
380
377
  end
381
378
  end
382
379
  end
@@ -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 '../metadata'
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 '../core/rest'
4
8
 
@@ -131,6 +135,22 @@ module GoodData
131
135
 
132
136
  # Load given file into a data set described by the given schema
133
137
  def upload_data(path, project_blueprint, dataset, options = { :client => GoodData.connection, :project => GoodData.project })
138
+ data = [
139
+ {
140
+ data: path,
141
+ dataset: dataset,
142
+ options: options
143
+ }
144
+ ]
145
+ GoodData::Model.upload_multiple_data(data, project_blueprint, options)
146
+ end
147
+
148
+ # Uploads multiple data sets using batch upload interface
149
+ # @param data [String|Array] Input data
150
+ # @param project_blueprint [ProjectBlueprint] Project blueprint
151
+ # @param options [Hash] Additional options
152
+ # @return [Hash] Batch upload result
153
+ def upload_multiple_data(data, project_blueprint, options = { :client => GoodData.connection, :project => GoodData.project })
134
154
  client = options[:client]
135
155
  fail ArgumentError, 'No :client specified' if client.nil?
136
156
 
@@ -139,25 +159,18 @@ module GoodData
139
159
 
140
160
  project = GoodData::Project[p, options]
141
161
  fail ArgumentError, 'Wrong :project specified' if project.nil?
142
- # path = if path =~ URI.regexp
143
- # Tempfile.open('remote_file') do |temp|
144
- # temp << open(path).read
145
- # temp.flush
146
- # # GoodData::Model.upload_data(path, to_manifest(mode))
147
- # end
148
- #
149
- # else
150
- # # GoodData::Model.upload_data(path, to_manifest(mode))
151
- # # upload_data(path, mode)
152
- # end
153
-
154
- mode = options[:mode] || 'FULL'
155
- manifest = GoodData::Model::ToManifest.dataset_to_manifest(project_blueprint, dataset, mode)
162
+
156
163
  project = options[:project] || GoodData.project
157
164
 
158
- path = path.path if path.respond_to? :path
159
- inline_data = path.is_a?(String) ? false : true
160
- csv_header = nil
165
+ manifest = {
166
+
167
+ 'dataSetSLIManifestList' => data.map do |d|
168
+ mode = d[:options] && d[:options][:mode] ? d[:options][:mode] : options[:mode] || 'FULL'
169
+ GoodData::Model::ToManifest.dataset_to_manifest(project_blueprint, d[:dataset], mode)
170
+ end
171
+ }
172
+
173
+ csv_headers = []
161
174
 
162
175
  # create a temporary zip file
163
176
  dir = Dir.mktmpdir
@@ -165,16 +178,28 @@ module GoodData
165
178
  Zip::File.open("#{dir}/upload.zip", Zip::File::CREATE) do |zip|
166
179
  # TODO: make sure schema columns match CSV column names
167
180
  zip.get_output_stream('upload_info.json') { |f| f.puts JSON.pretty_generate(manifest) }
168
- if inline_data
169
- csv_header = path.first
170
- zip.get_output_stream('data.csv') do |f|
171
- path.each do |row|
172
- f.puts row.to_csv
181
+
182
+ data.zip(manifest['dataSetSLIManifestList']).each do |item|
183
+ path = item[0][:data]
184
+ path = item[0][:data].path if item[0][:data].respond_to? :path
185
+ inline_data = path.is_a?(String) ? false : true
186
+ csv_header = nil
187
+
188
+ filename = item[1]['dataSetSLIManifest']['file']
189
+
190
+ if inline_data
191
+ csv_header = path.first
192
+ zip.get_output_stream(filename) do |f|
193
+ path.each do |row|
194
+ f.puts row.to_csv
195
+ end
173
196
  end
197
+ else
198
+ csv_header = File.open(path, &:gets).split(',')
199
+ zip.add(filename, path)
174
200
  end
175
- else
176
- csv_header = File.open(path, &:gets).split(',')
177
- zip.add('data.csv', path)
201
+
202
+ csv_headers << csv_header
178
203
  end
179
204
  end
180
205
 
@@ -183,40 +208,64 @@ module GoodData
183
208
  ensure
184
209
  FileUtils.rm_rf dir
185
210
  end
211
+ csv_headers.flatten!
186
212
 
187
213
  # kick the load
188
214
  pull = { 'pullIntegration' => File.basename(dir) }
189
215
  link = project.md.links('etl')['pull2']
190
- task = client.post(link, pull, :info_message => "Starting the data load from user storage to dataset '#{dataset}'.")
216
+
217
+ # TODO: List uploaded datasets
218
+ task = client.post(link, pull, :info_message => 'Starting the data load from user storage to dataset.')
191
219
 
192
220
  res = client.poll_on_response(task['pull2Task']['links']['poll'], :info_message => 'Getting status of the dataload task.') do |body|
193
221
  body['wTaskStatus']['status'] == 'RUNNING' || body['wTaskStatus']['status'] == 'PREPARED'
194
222
  end
195
223
 
196
- if res['wTaskStatus']['status'] == 'ERROR' # rubocop:disable Style/GuardClause
224
+ if res['wTaskStatus']['status'] == 'ERROR'
197
225
  s = StringIO.new
198
- client.download_from_user_webdav(File.basename(dir) + '/upload_status.json', s, :client => client, :project => project)
226
+
227
+ messages = res['wTaskStatus']['messages'] || []
228
+ messages.each do |msg|
229
+ GoodData.logger.error(JSON.pretty_generate(msg))
230
+ end
231
+
232
+ begin
233
+ client.download_from_user_webdav(File.basename(dir) + '/upload_status.json', s, :client => client, :project => project)
234
+ rescue => e
235
+ raise "Unable to download upload_status.json from remote server, reason: #{e.message}"
236
+ end
237
+
199
238
  js = MultiJson.load(s.string)
200
- manifest_cols = manifest['dataSetSLIManifest']['parts'].map { |c| c['columnName'] }
239
+ manifests = manifest['dataSetSLIManifestList'].map do |m|
240
+ m['dataSetSLIManifest']
241
+ end
242
+
243
+ parts = manifests.map do |m|
244
+ m['parts']
245
+ end
246
+
247
+ manifest_cols = parts.flatten.map { |c| c['columnName'] }
201
248
 
202
249
  # extract some human readable error message from the webdav file
203
- manifest_extra = manifest_cols - csv_header
204
- csv_extra = csv_header - manifest_cols
250
+ manifest_extra = manifest_cols - csv_headers
251
+ csv_extra = csv_headers - manifest_cols
205
252
 
206
253
  error_message = begin
207
- js['error']['message'] % js['error']['parameters']
208
- rescue NoMethodError, ArgumentError
209
- ''
210
- end
254
+ js['error']['message'] % js['error']['parameters']
255
+ rescue NoMethodError, ArgumentError
256
+ ''
257
+ end
211
258
  m = "Load failed with error '#{error_message}'.\n"
212
259
  m += "Columns that should be there (manifest) but aren't in uploaded csv: #{manifest_extra}\n" unless manifest_extra.empty?
213
260
  m += "Columns that are in csv but shouldn't be there (manifest): #{csv_extra}\n" unless csv_extra.empty?
214
- m += "Columns in the uploaded csv: #{csv_header}\n"
261
+ m += "Columns in the uploaded csv: #{csv_headers}\n"
215
262
  m += "Columns in the manifest: #{manifest_cols}\n"
216
263
  m += "Original message:\n#{JSON.pretty_generate(js)}\n"
217
264
  m += "Manifest used for uploading:\n#{JSON.pretty_generate(manifest)}"
218
265
  fail m
219
266
  end
267
+
268
+ res
220
269
  end
221
270
 
222
271
  def merge_dataset_columns(a_schema_blueprint, b_schema_blueprint)
@@ -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
  module GoodData
4
8
  module Model