gooddata 0.6.4 → 0.6.5

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 (116) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.markdown +4 -0
  3. data/README.md +1 -0
  4. data/lib/gooddata/cli/commands/project_cmd.rb +2 -7
  5. data/lib/gooddata/client.rb +0 -2
  6. data/lib/gooddata/commands/project.rb +10 -0
  7. data/lib/gooddata/core/rest.rb +12 -2
  8. data/lib/gooddata/exceptions/attr_element_not_found.rb +12 -0
  9. data/lib/gooddata/extensions/enumerable.rb +12 -0
  10. data/lib/gooddata/helpers/global_helpers.rb +20 -0
  11. data/lib/gooddata/mixins/author.rb +16 -0
  12. data/lib/gooddata/mixins/content_getter.rb +11 -0
  13. data/lib/gooddata/mixins/content_property_reader.rb +13 -0
  14. data/lib/gooddata/mixins/content_property_writer.rb +13 -0
  15. data/lib/gooddata/mixins/contributor.rb +16 -0
  16. data/lib/gooddata/mixins/data_getter.rb +11 -0
  17. data/lib/gooddata/mixins/data_property_reader.rb +13 -0
  18. data/lib/gooddata/mixins/data_property_writer.rb +13 -0
  19. data/lib/gooddata/mixins/is_attribute.rb +13 -0
  20. data/lib/gooddata/mixins/is_fact.rb +13 -0
  21. data/lib/gooddata/mixins/is_label.rb +15 -0
  22. data/lib/gooddata/mixins/links.rb +11 -0
  23. data/lib/gooddata/mixins/md_finders.rb +36 -0
  24. data/lib/gooddata/mixins/md_id_to_uri.rb +29 -0
  25. data/lib/gooddata/mixins/md_json.rb +11 -0
  26. data/lib/gooddata/mixins/md_object_id.rb +11 -0
  27. data/lib/gooddata/mixins/md_object_indexer.rb +36 -0
  28. data/lib/gooddata/mixins/md_object_query.rb +83 -0
  29. data/lib/gooddata/mixins/md_relations.rb +39 -0
  30. data/lib/gooddata/mixins/meta_getter.rb +11 -0
  31. data/lib/gooddata/mixins/meta_property_reader.rb +13 -0
  32. data/lib/gooddata/mixins/meta_property_writer.rb +13 -0
  33. data/lib/gooddata/mixins/mixins.rb +15 -0
  34. data/lib/gooddata/mixins/not_attribute.rb +13 -0
  35. data/lib/gooddata/mixins/not_exportable.rb +11 -0
  36. data/lib/gooddata/mixins/not_fact.rb +13 -0
  37. data/lib/gooddata/mixins/not_label.rb +15 -0
  38. data/lib/gooddata/mixins/not_metric.rb +13 -0
  39. data/lib/gooddata/mixins/obj_id.rb +11 -0
  40. data/lib/gooddata/mixins/rest_getters.rb +13 -0
  41. data/lib/gooddata/mixins/rest_resource.rb +19 -0
  42. data/lib/gooddata/mixins/root_key_getter.rb +11 -0
  43. data/lib/gooddata/mixins/root_key_setter.rb +11 -0
  44. data/lib/gooddata/mixins/timestamps.rb +15 -0
  45. data/lib/gooddata/models/from_wire.rb +153 -0
  46. data/lib/gooddata/models/metadata.rb +28 -230
  47. data/lib/gooddata/models/metadata/attribute.rb +4 -6
  48. data/lib/gooddata/models/metadata/fact.rb +4 -6
  49. data/lib/gooddata/models/metadata/{display_form.rb → label.rb} +17 -11
  50. data/lib/gooddata/models/metadata/metric.rb +1 -1
  51. data/lib/gooddata/models/metadata/report_definition.rb +2 -2
  52. data/lib/gooddata/models/model.rb +55 -23
  53. data/lib/gooddata/models/models.rb +0 -2
  54. data/lib/gooddata/models/module_constants.rb +0 -2
  55. data/lib/gooddata/models/process.rb +1 -1
  56. data/lib/gooddata/models/project.rb +117 -76
  57. data/lib/gooddata/models/project_blueprint.rb +322 -42
  58. data/lib/gooddata/models/project_creator.rb +5 -4
  59. data/lib/gooddata/models/project_role.rb +20 -55
  60. data/lib/gooddata/models/schema_blueprint.rb +287 -84
  61. data/lib/gooddata/models/schema_builder.rb +0 -4
  62. data/lib/gooddata/models/to_manifest.rb +160 -0
  63. data/lib/gooddata/models/to_wire.rb +150 -0
  64. data/lib/gooddata/version.rb +1 -1
  65. data/spec/data/blueprint_invalid.json +3 -1
  66. data/spec/data/gd_gse_data_blueprint.json +1370 -0
  67. data/spec/data/gd_gse_data_manifest.json +1424 -0
  68. data/spec/data/gd_gse_data_model.json +1772 -0
  69. data/spec/data/manifest_test_project.json +116 -0
  70. data/spec/data/model_view.json +1772 -0
  71. data/spec/data/superfluous_titles_view.json +81 -0
  72. data/spec/data/test_project_model_spec.json +7 -4
  73. data/spec/data/wire_test_project.json +143 -0
  74. data/spec/helpers/crypto_helper.rb +9 -0
  75. data/spec/helpers/project_helper.rb +2 -0
  76. data/spec/integration/command_projects_spec.rb +4 -2
  77. data/spec/integration/full_project_spec.rb +51 -18
  78. data/spec/integration/partial_md_export_import_spec.rb +1 -1
  79. data/spec/spec_helper.rb +2 -1
  80. data/spec/unit/models/attribute_column_spec.rb +7 -7
  81. data/spec/unit/models/domain_spec.rb +2 -2
  82. data/spec/unit/models/from_wire_spec.rb +119 -0
  83. data/spec/unit/models/metadata_spec.rb +4 -2
  84. data/spec/unit/models/project_blueprint_spec.rb +32 -16
  85. data/spec/unit/models/project_role_spec.rb +6 -4
  86. data/spec/unit/models/project_spec.rb +26 -3
  87. data/spec/unit/models/schema_builder_spec.rb +5 -6
  88. data/spec/unit/models/to_manifest_spec.rb +24 -0
  89. data/spec/unit/models/to_wire_spec.rb +63 -0
  90. metadata +53 -29
  91. data/lib/gooddata/models/attributes/anchor.rb +0 -37
  92. data/lib/gooddata/models/attributes/attributes.rb +0 -8
  93. data/lib/gooddata/models/attributes/date_attribute.rb +0 -25
  94. data/lib/gooddata/models/attributes/time_attribute.rb +0 -24
  95. data/lib/gooddata/models/columns/attribute.rb +0 -71
  96. data/lib/gooddata/models/columns/columns.rb +0 -8
  97. data/lib/gooddata/models/columns/date_column.rb +0 -63
  98. data/lib/gooddata/models/columns/fact_model.rb +0 -54
  99. data/lib/gooddata/models/columns/label.rb +0 -55
  100. data/lib/gooddata/models/columns/reference.rb +0 -57
  101. data/lib/gooddata/models/facts/facts.rb +0 -8
  102. data/lib/gooddata/models/facts/time_fact.rb +0 -20
  103. data/lib/gooddata/models/folders/attribute_folder.rb +0 -20
  104. data/lib/gooddata/models/folders/fact_folder.rb +0 -20
  105. data/lib/gooddata/models/folders/folders.rb +0 -8
  106. data/lib/gooddata/models/metadata/column.rb +0 -61
  107. data/lib/gooddata/models/metadata/data_set.rb +0 -32
  108. data/lib/gooddata/models/metadata/date_dimension.rb +0 -26
  109. data/lib/gooddata/models/metadata/schema.rb +0 -227
  110. data/lib/gooddata/models/references/date_reference.rb +0 -44
  111. data/lib/gooddata/models/references/references.rb +0 -8
  112. data/lib/gooddata/models/references/time_reference.rb +0 -13
  113. data/spec/helpers/schema_helper.rb +0 -16
  114. data/spec/unit/models/anchor_spec.rb +0 -32
  115. data/spec/unit/models/tools_spec.rb +0 -95
  116. data/test/test_upload.rb +0 -79
@@ -148,11 +148,11 @@ module GoodData
148
148
  data_result_uri = result['execResult']['dataResult']
149
149
  result = GoodData.get data_result_uri
150
150
 
151
- while result['taskState'] && result['taskState']['status'] == 'WAIT'
151
+ while result && result['taskState'] && result['taskState']['status'] == 'WAIT'
152
152
  sleep 10
153
153
  result = GoodData.get data_result_uri
154
154
  end
155
-
155
+ return nil unless result
156
156
  ReportDataResult.new(GoodData.get data_result_uri)
157
157
  end
158
158
 
@@ -3,16 +3,10 @@
3
3
  require_relative '../core/connection'
4
4
  require_relative '../core/rest'
5
5
 
6
- require_relative 'attributes/attributes'
7
- require_relative 'columns/columns'
8
- require_relative 'facts/facts'
9
- require_relative 'folders/folders'
10
6
  require_relative 'metadata/metadata'
11
- require_relative 'references/references'
12
7
 
13
8
  require_relative 'links'
14
9
  require_relative 'module_constants'
15
- require_relative 'metadata/schema'
16
10
 
17
11
  require 'fileutils'
18
12
  require 'multi_json'
@@ -25,27 +19,65 @@ require 'zip'
25
19
  #
26
20
  module GoodData
27
21
  module Model
22
+ GD_TYPES = %w(GDC.link GDC.text GDC.geo GDC.time)
23
+ GD_DATA_TYPES = %w(INT VARCHAR DECIMAL)
24
+
25
+ DEFAULT_FACT_DATATYPE = 'INT'
26
+
28
27
  class << self
29
- # def add_dataset(name, columns, project = nil)
30
- # Schema.new('columns' => columns, 'name' => name)
31
- # add_schema(schema, project)
32
- # end
33
-
34
- # def add_schema(schema, project = nil)
35
- # unless schema.respond_to?(:to_maql_create) || schema.is_a?(String)
36
- # fail(ArgumentError, "Schema object or schema file path expected, got '#{schema}'")
37
- # end
38
- # schema = Schema.load(schema) unless schema.respond_to?(:to_maql_create)
39
- # project = GoodData.project unless project
40
- # ldm_links = GoodData.get project.md[LDM_CTG]
41
- # ldm_uri = Links.new(ldm_links)[LDM_MANAGE_CTG]
42
- # GoodData.post ldm_uri, 'manage' => { 'maql' => schema.to_maql_create }
43
- # end
28
+ def title(item)
29
+ item[:title] || item[:name].titleize
30
+ end
31
+
32
+ def identifier_for(dataset, column = nil, column2 = nil)
33
+ return "dataset.#{dataset[:name]}" if column.nil?
34
+ column = DatasetBlueprint.find_column_by_name(dataset, column) if column.is_a?(String)
35
+ case column[:type].to_sym
36
+ when :anchor_no_label
37
+ "attr.#{dataset[:name]}.factsof"
38
+ when :attribute
39
+ "attr.#{dataset[:name]}.#{column[:name]}"
40
+ when :anchor
41
+ "attr.#{dataset[:name]}.#{column[:name]}"
42
+ when :date_fact
43
+ "dt.#{dataset[:name]}.#{column[:name]}"
44
+ when :fact
45
+ "fact.#{dataset[:name]}.#{column[:name]}"
46
+ when :primary_label
47
+ "label.#{dataset[:name]}.#{column[:name]}"
48
+ when :label
49
+ "label.#{dataset[:name]}.#{column2[:name]}.#{column[:name]}"
50
+ when :date_ref
51
+ "#{dataset[:name]}.date.mdyy"
52
+ when :dataset
53
+ "dataset.#{dataset[:name]}"
54
+ else
55
+ fail "Unknown type #{column[:type].to_sym}"
56
+ end
57
+ end
58
+
59
+ def check_gd_datatype(value)
60
+ GD_TYPES.any? { |v| v == value }
61
+ end
44
62
 
45
63
  # Load given file into a data set described by the given schema
46
- def upload_data(path, manifest, options = {})
64
+ def upload_data(path, project_blueprint, dataset, options = {})
65
+ # path = if path =~ URI.regexp
66
+ # Tempfile.open('remote_file') do |temp|
67
+ # temp << open(path).read
68
+ # temp.flush
69
+ # # GoodData::Model.upload_data(path, to_manifest(mode))
70
+ # end
71
+ #
72
+ # else
73
+ # # GoodData::Model.upload_data(path, to_manifest(mode))
74
+ # # upload_data(path, mode)
75
+ # end
76
+
77
+ mode = options[:mode] || 'FULL'
78
+ manifest = GoodData::Model::ToManifest.dataset_to_manifest(project_blueprint, dataset, mode)
47
79
  project = options[:project] || GoodData.project
48
- # mode = options[:mode] || "FULL"
80
+
49
81
  path = path.path if path.respond_to? :path
50
82
  inline_data = path.is_a?(String) ? false : true
51
83
 
@@ -2,8 +2,6 @@
2
2
 
3
3
  require 'pathname'
4
4
 
5
- require_relative 'attributes/attributes'
6
-
7
5
  base = Pathname(__FILE__).dirname.expand_path
8
6
  Dir.glob(base + '*.rb').each do |file|
9
7
  require_relative file
@@ -23,7 +23,5 @@ module GoodData
23
23
  TIME_FACT_PREFIX = 'tm.dt'
24
24
  TIME_ATTRIBUTE_PREFIX = 'attr.time'
25
25
  FACT_FOLDER_PREFIX = 'ffld'
26
-
27
- SKIP_FIELD = false
28
26
  end
29
27
  end
@@ -125,7 +125,7 @@ module GoodData
125
125
  end
126
126
 
127
127
  def process
128
- raw_data['process']
128
+ json['process']
129
129
  end
130
130
 
131
131
  def name
@@ -6,6 +6,9 @@ require 'fileutils'
6
6
 
7
7
  require_relative 'process'
8
8
  require_relative '../exceptions/no_project_error'
9
+
10
+ require_relative '../mixins/mixins'
11
+
9
12
  require_relative 'project_role'
10
13
 
11
14
  module GoodData
@@ -18,7 +21,19 @@ module GoodData
18
21
 
19
22
  attr_accessor :connection, :json
20
23
 
24
+ alias_method :to_json, :json
25
+ alias_method :raw_data, :json
26
+
27
+ include GoodData::Mixin::MetaGetter
28
+ include GoodData::Mixin::DataGetter
29
+
21
30
  class << self
31
+ include GoodData::Mixin::RootKeySetter
32
+
33
+ include GoodData::Mixin::MetaPropertyReader
34
+
35
+ include GoodData::Mixin::MetaPropertyWriter
36
+
22
37
  # Returns an array of all projects accessible by
23
38
  # current user
24
39
  def all
@@ -47,6 +62,14 @@ module GoodData
47
62
  end
48
63
  end
49
64
 
65
+ Project.root_key :project
66
+
67
+ include GoodData::Mixin::RootKeyGetter
68
+ include GoodData::Mixin::DataGetter
69
+ include GoodData::Mixin::Author
70
+ include GoodData::Mixin::Contributor
71
+ include GoodData::Mixin::Timestamps
72
+
50
73
  # Create a project from a given attributes
51
74
  # Expected keys:
52
75
  # - :title (mandatory)
@@ -77,7 +100,6 @@ module GoodData
77
100
  json['project']['meta']['projectTemplate'] = attributes[:template] if attributes[:template] && !attributes[:template].empty?
78
101
  project = Project.new json
79
102
  project.save
80
-
81
103
  # until it is enabled or deleted, recur. This should still end if there is a exception thrown out from RESTClient. This sometimes happens from WebApp when request is too long
82
104
  while project.state.to_s != 'enabled'
83
105
  if project.state.to_s == 'deleted'
@@ -115,26 +137,6 @@ module GoodData
115
137
  end
116
138
  end
117
139
 
118
- # Creates a data set within the project
119
- #
120
- # == Usage
121
- # p.add_dataset 'Test', [ { 'name' => 'a1', 'type' => 'ATTRIBUTE' ... } ... ]
122
- # p.add_dataset 'title' => 'Test', 'columns' => [ { 'name' => 'a1', 'type' => 'ATTRIBUTE' ... } ... ]
123
- #
124
- def add_dataset(schema_def, columns = nil, &block)
125
- schema = if block
126
- builder = block.call(Model::SchemaBuilder.new(schema_def))
127
- builder.to_schema
128
- else
129
- sch = { :title => schema_def, :columns => columns } if columns
130
- sch = Model::Schema.new schema_def if schema_def.is_a? Hash
131
- sch = schema_def if schema_def.is_a?(Model::Schema)
132
- fail(ArgumentError, 'Required either schema object or title plus columns array') unless schema_def.is_a? Model::Schema
133
- sch
134
- end
135
- Model.add_schema(schema, self)
136
- end
137
-
138
140
  def add_metric(options = {})
139
141
  options[:expression] || fail('Metric has to have its expression defined')
140
142
  m1 = GoodData::Metric.create(options)
@@ -146,12 +148,20 @@ module GoodData
146
148
  rep.save
147
149
  end
148
150
 
149
- # Gets author of project
151
+ # Returns an indication whether current user is admin in this project
150
152
  #
151
- # @return [String] Project author
152
- def author
153
- # TODO: Return object instead
154
- @json['project']['meta']['author']
153
+ # @return [Boolean] True if user has admin role in the project, false otherwise.
154
+ def am_i_admin?
155
+ user_has_role?(GoodData.user, 'admin')
156
+ end
157
+
158
+ # Gets project blueprint from the server
159
+ #
160
+ # @return [GoodData::ProjectRole] Project role if found
161
+ def blueprint
162
+ result = GoodData.get("/gdc/projects/#{pid}/model/view")
163
+ model = GoodData.poll_on_root(result, 'asyncTask') { |r| r['asyncTask']['link']['poll'] }
164
+ GoodData::Model::FromWire.from_wire(model)
155
165
  end
156
166
 
157
167
  # Returns web interface URI of project
@@ -173,10 +183,10 @@ module GoodData
173
183
  # TODO: Refactor so if export or import fails the new_project will be cleaned
174
184
  with_data = options[:data] || true
175
185
  with_users = options[:users] || false
176
- title = options[:title] || "Clone of #{title}"
186
+ a_title = options[:title] || "Clone of #{title}"
177
187
 
178
188
  # Create the project first so we know that it is passing. What most likely is wrong is the tokena and the export actaully takes majoiryt of the time
179
- new_project = GoodData::Project.create(options.merge(:title => title))
189
+ new_project = GoodData::Project.create(options.merge(:title => a_title))
180
190
 
181
191
  export = {
182
192
  :exportProject => {
@@ -213,28 +223,8 @@ module GoodData
213
223
  new_project
214
224
  end
215
225
 
216
- # Project contributor
217
- #
218
- # @return [String] Project contributor
219
- # TODO: Return as object
220
- def contributor
221
- # TODO: Return object instead
222
- @json['project']['meta']['contributor']
223
- end
224
-
225
- # Gets the date when created
226
- #
227
- # @return [DateTime] Date time when created
228
- def created
229
- DateTime.parse(@json['project']['meta']['created'])
230
- end
231
-
232
- # Gets ruby wrapped raw project JSON data
233
- def data
234
- raw_data['project']
235
- end
236
-
237
226
  def datasets
227
+ blueprint.datasets
238
228
  datasets_uri = "#{md['data']}/sets"
239
229
  response = GoodData.get datasets_uri
240
230
  response['dataSetsInfo']['sets'].map do |ds|
@@ -260,6 +250,24 @@ module GoodData
260
250
  Dashboard.all.map { |data| Dashboard[data['link']] }.each { |d| d.delete }
261
251
  end
262
252
 
253
+ # Executes DML expression. See (https://developer.gooddata.com/article/deleting-records-from-datasets)
254
+ # for some examples and explanations
255
+ #
256
+ # @param dml [String] DML expression
257
+ def execute_dml(dml)
258
+ uri = "/gdc/md/#{pid}/dml/manage"
259
+ result = GoodData.post(uri,
260
+ manage: {
261
+ maql: dml
262
+ })
263
+ polling_uri = result['uri']
264
+ result = GoodData.get(polling_uri)
265
+ while result['taskState'] && result['taskState']['status'] == 'WAIT'
266
+ sleep 10
267
+ result = GoodData.get polling_uri
268
+ end
269
+ end
270
+
263
271
  # Gets project role by its identifier
264
272
  #
265
273
  # @param [String] role_name Title of role to look for
@@ -320,6 +328,7 @@ module GoodData
320
328
  # @return [GoodDta::Membership] User
321
329
  def get_user(name, user_list = users)
322
330
  return name if name.instance_of?(GoodData::Membership)
331
+ return member(name) if name.instance_of?(GoodData::Profile)
323
332
  name.downcase!
324
333
  user_list.each do |user|
325
334
  return user if user.uri.downcase == name ||
@@ -329,6 +338,19 @@ module GoodData
329
338
  nil
330
339
  end
331
340
 
341
+ # Checks whether user has particular role in given proejct
342
+ #
343
+ # @param user [GoodData::Profile | GoodData::Membership | String] User in question. Can be passed by login (String), profile or membershi objects
344
+ # @param role_name [String || GoodData::ProjectRole] Project role cna be given by either string or GoodData::ProjectRole object
345
+ # @return [Boolean] Tru if user has role_name
346
+ def user_has_role?(user, role_name)
347
+ member = get_user(user)
348
+ role = get_role(role_name)
349
+ member.roles.include?(role)
350
+ rescue
351
+ false
352
+ end
353
+
332
354
  # Initializes object instance from raw wire JSON
333
355
  #
334
356
  # @param json Json used for initialization
@@ -395,6 +417,10 @@ module GoodData
395
417
  data['links']
396
418
  end
397
419
 
420
+ def lint
421
+ blueprint.lint
422
+ end
423
+
398
424
  def md
399
425
  @md ||= Links.new GoodData.get(data['links']['metadata'])
400
426
  end
@@ -478,6 +504,28 @@ module GoodData
478
504
  true
479
505
  end
480
506
 
507
+ def info
508
+ results = blueprint.datasets.map do |ds|
509
+ [ds, ds.count]
510
+ end
511
+ puts title
512
+ puts GoodData::Helpers.underline(title)
513
+ puts
514
+ puts "Datasets - #{results.count}"
515
+ puts
516
+ results.each do |x|
517
+ dataset, count = x
518
+ dataset.title.tap do |t|
519
+ puts t
520
+ puts GoodData::Helpers.underline(t)
521
+ puts "Size - #{count} rows"
522
+ puts "#{dataset.attributes_and_anchors.count} attributes, #{dataset.facts.count} facts, #{dataset.references.count} references"
523
+ puts
524
+ end
525
+ end
526
+ nil
527
+ end
528
+
481
529
  # Forces project to reload
482
530
  def reload!
483
531
  if saved?
@@ -501,11 +549,19 @@ module GoodData
501
549
 
502
550
  # Saves project
503
551
  def save
504
- response = GoodData.post PROJECTS_PATH, raw_data
505
- if uri.nil?
506
- response = GoodData.get response['uri']
507
- @json = response
508
- end
552
+ data_to_send = raw_data.deep_dup
553
+ data_to_send['project']['content'].delete('cluster')
554
+ data_to_send['project']['content'].delete('isPublic')
555
+ data_to_send['project']['content'].delete('state')
556
+ response = if uri
557
+ GoodData.post(PROJECT_PATH % pid, data_to_send)
558
+ GoodData.get uri
559
+ else
560
+ result = GoodData.post(PROJECTS_PATH, data_to_send)
561
+ GoodData.get result['uri']
562
+ end
563
+ @json = response
564
+ self
509
565
  end
510
566
 
511
567
  # Checks if is project saved
@@ -534,7 +590,7 @@ module GoodData
534
590
  def slis
535
591
  link = "#{data['links']['metadata']}#{SLIS_PATH}"
536
592
 
537
- # TODO: Review what to do with passed extra argument
593
+ # FIXME: Review what to do with passed extra argument
538
594
  Metadata.new GoodData.get(link)
539
595
  end
540
596
 
@@ -545,33 +601,21 @@ module GoodData
545
601
  data['content']['state'].downcase.to_sym if data['content'] && data['content']['state']
546
602
  end
547
603
 
548
- # Gets project summary
549
- #
550
- # @return [String] Project summary
551
- def summary
552
- data['meta']['summary'] if data['meta']
553
- end
604
+ Project.metadata_property_reader :summary, :title
554
605
 
555
606
  # Gets project title
556
607
  #
557
608
  # @return [String] Project title
558
- def title
559
- data['meta']['title'] if data['meta']
560
- end
561
-
562
- # Gets project update date
563
- #
564
- # @return [DateTime] Date time of last update
565
- def updated
566
- DateTime.parse(@json['project']['meta']['updated'])
609
+ def title=(a_title)
610
+ data['meta']['title'] = a_title if data['meta']
567
611
  end
568
612
 
569
613
  # Uploads file to project
570
614
  #
571
615
  # @param file File to be uploaded
572
616
  # @param schema Schema to be used
573
- def upload(file, schema, mode = 'FULL')
574
- schema.upload file, self, mode
617
+ def upload(file, dataset_blueprint, mode = 'FULL')
618
+ dataset_blueprint.upload file, self, mode
575
619
  end
576
620
 
577
621
  def uri
@@ -744,7 +788,7 @@ module GoodData
744
788
  # metric_filter - Checks metadata for inconsistent metric filters.
745
789
  # invalid_objects - Checks metadata for invalid/corrupted objects.
746
790
  # asyncTask response
747
- def validate(filters = %w(ldm, pdm, metric_filter, invalid_objects))
791
+ def validate(filters = %w(ldm pdm metric_filter invalid_objects))
748
792
  response = GoodData.post "#{GoodData.project.md['validate-project']}", 'validateProject' => filters
749
793
  polling_link = response['asyncTask']['link']['poll']
750
794
  polling_result = GoodData.get(polling_link)
@@ -754,8 +798,5 @@ module GoodData
754
798
  end
755
799
  polling_result
756
800
  end
757
-
758
- alias_method :to_json, :json
759
- alias_method :raw_data, :json
760
801
  end
761
802
  end