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
@@ -0,0 +1,81 @@
1
+ {
2
+ "projectModelView": {
3
+ "model": {
4
+ "projectModel": {
5
+ "datasets": [
6
+ {
7
+ "dataset": {
8
+ "identifier": "dataset.stage_history",
9
+ "title": "stage_history",
10
+ "anchor": {
11
+ "attribute": {
12
+ "identifier": "attr.stage_history.factsof",
13
+ "title": "Records of stage_history"
14
+ }
15
+ },
16
+ "attributes": [
17
+ {
18
+ "attribute": {
19
+ "identifier": "attr.stage_history.current_status",
20
+ "title": "Current Status",
21
+ "labels": [
22
+ {
23
+ "label": {
24
+ "identifier": "label.stage_history.current_status",
25
+ "title": "Current Status",
26
+ "type": "GDC.text",
27
+ "dataType": "VARCHAR(128)"
28
+ }
29
+ }
30
+ ],
31
+ "defaultLabel": "label.stage_history.current_status"
32
+ }
33
+ }
34
+ ],
35
+ "facts": [
36
+ {
37
+ "fact": {
38
+ "identifier": "fact.stage_history.stage_velocity",
39
+ "title": "Stage Velocity",
40
+ "dataType": "DECIMAL(12,2)"
41
+ }
42
+ },
43
+ {
44
+ "fact": {
45
+ "identifier": "fact.stage_history.stage_duration",
46
+ "title": "Stage Duration",
47
+ "dataType": "DECIMAL(12,2)"
48
+ }
49
+ },
50
+ {
51
+ "fact": {
52
+ "identifier": "dt.stage_history.opp_created_date",
53
+ "title": "Opp. Created (Date) for Stage History",
54
+ "dataType": "INT"
55
+ }
56
+ },
57
+ {
58
+ "fact": {
59
+ "identifier": "dt.stage_history.opp_close_date",
60
+ "title": "Opp. Close (Date) for Stage History",
61
+ "dataType": "INT"
62
+ }
63
+ }
64
+ ],
65
+ "references": [
66
+ "dataset.account",
67
+ "dataset.product",
68
+ "dataset.stage",
69
+ "dataset.opp_owner",
70
+ "dataset.opportunity",
71
+ "dataset.bookingtype",
72
+ "oppclose",
73
+ "oppcreated"
74
+ ]
75
+ }
76
+ }
77
+ ]
78
+ }
79
+ }
80
+ }
81
+ }
@@ -2,6 +2,7 @@
2
2
  "title": "RubyGem Dev Week test",
3
3
  "datasets": [
4
4
  {
5
+ "type": "dataset",
5
6
  "name": "repos",
6
7
  "columns": [
7
8
  {
@@ -20,6 +21,7 @@
20
21
  ]
21
22
  },
22
23
  {
24
+ "type": "dataset",
23
25
  "name": "devs",
24
26
  "columns": [
25
27
  {
@@ -29,11 +31,13 @@
29
31
  {
30
32
  "type": "label",
31
33
  "name": "email",
32
- "reference": "dev_id"
34
+ "reference": "dev_id",
35
+ "default_label" : true
33
36
  }
34
37
  ]
35
38
  },
36
39
  {
40
+ "type": "dataset",
37
41
  "name": "commits",
38
42
  "columns": [
39
43
  {
@@ -62,9 +66,8 @@
62
66
  ],
63
67
  "date_dimensions": [
64
68
  {
65
- "urn": null,
66
- "name": "committed_on",
67
- "title": null
69
+ "type": "date_dimension",
70
+ "name": "committed_on"
68
71
  }
69
72
  ]
70
73
  }
@@ -0,0 +1,143 @@
1
+ {
2
+ "diffRequest": {
3
+ "targetModel": {
4
+ "projectModel": {
5
+ "datasets": [
6
+ {
7
+ "dataset": {
8
+ "identifier": "dataset.repos",
9
+ "title": "Repos",
10
+ "anchor": {
11
+ "attribute": {
12
+ "identifier": "attr.repos.repo_id",
13
+ "title": "Repo",
14
+ "labels": [
15
+ {
16
+ "label": {
17
+ "identifier": "label.repos.repo_id",
18
+ "title": "Repo",
19
+ "type": null,
20
+ "dataType": null
21
+ }
22
+ },
23
+ {
24
+ "label": {
25
+ "identifier": "label.repos.repo_id.name",
26
+ "title": "Name",
27
+ "type": null,
28
+ "dataType": null
29
+ }
30
+ }
31
+ ],
32
+ "defaultLabel": "label.repos.repo_id"
33
+ }
34
+ },
35
+ "attributes": [
36
+ {
37
+ "attribute": {
38
+ "identifier": "attr.repos.department",
39
+ "title": "Department",
40
+ "labels": [
41
+ {
42
+ "label": {
43
+ "identifier": "label.repos.department",
44
+ "title": "Department",
45
+ "type": null,
46
+ "dataType": null
47
+ }
48
+ }
49
+ ],
50
+ "defaultLabel": "label.repos.department"
51
+ }
52
+ }
53
+ ],
54
+ "facts": [
55
+
56
+ ],
57
+ "references": [
58
+
59
+ ]
60
+ }
61
+ },
62
+ {
63
+ "dataset": {
64
+ "identifier": "dataset.devs",
65
+ "title": "Devs",
66
+ "anchor": {
67
+ "attribute": {
68
+ "identifier": "attr.devs.dev_id",
69
+ "title": "Dev",
70
+ "labels": [
71
+ {
72
+ "label": {
73
+ "identifier": "label.devs.dev_id",
74
+ "title": "Dev",
75
+ "type": null,
76
+ "dataType": null
77
+ }
78
+ },
79
+ {
80
+ "label": {
81
+ "identifier": "label.devs.dev_id.email",
82
+ "title": "Email",
83
+ "type": null,
84
+ "dataType": null
85
+ }
86
+ }
87
+ ],
88
+ "defaultLabel": "label.devs.dev_id.email"
89
+ }
90
+ },
91
+ "attributes": [
92
+
93
+ ],
94
+ "facts": [
95
+
96
+ ],
97
+ "references": [
98
+
99
+ ]
100
+ }
101
+ },
102
+ {
103
+ "dataset": {
104
+ "identifier": "dataset.commits",
105
+ "title": "Commits",
106
+ "anchor": {
107
+ "attribute": {
108
+ "identifier": "attr.commits.factsof",
109
+ "title": "Records of Commits"
110
+ }
111
+ },
112
+ "attributes": [
113
+
114
+ ],
115
+ "facts": [
116
+ {
117
+ "fact": {
118
+ "identifier": "fact.commits.lines_changed",
119
+ "title": "Lines Changed",
120
+ "dataType": "INT"
121
+ }
122
+ }
123
+ ],
124
+ "references": [
125
+ "committed_on",
126
+ "dataset.devs",
127
+ "dataset.repos"
128
+ ]
129
+ }
130
+ }
131
+ ],
132
+ "dateDimensions": [
133
+ {
134
+ "dateDimension": {
135
+ "name": "committed_on",
136
+ "title": "Committed On"
137
+ }
138
+ }
139
+ ]
140
+ }
141
+ }
142
+ }
143
+ }
@@ -0,0 +1,9 @@
1
+ require 'securerandom'
2
+
3
+ module CryptoHelper
4
+ class << self
5
+ def generate_password
6
+ SecureRandom.hex(16)
7
+ end
8
+ end
9
+ end
@@ -9,6 +9,8 @@ require 'gooddata/models/models'
9
9
  module ProjectHelper
10
10
  PROJECT_ID = 'we1vvh4il93r0927r809i3agif50d7iz'
11
11
  PROJECT_URL = "/gdc/projects/#{PROJECT_ID}"
12
+ PROJECT_TITLE = 'GoodTravis'
13
+ PROJECT_SUMMARY = 'No summary'
12
14
 
13
15
  def self.get_default_project
14
16
  GoodData::Project[PROJECT_ID]
@@ -17,9 +17,11 @@ describe GoodData::Command::Project, :constraint => 'slow' do
17
17
  it "should update the project" do
18
18
  @blueprint.merge!(@module_blueprint)
19
19
  GoodData.with_project(@project) do |p|
20
- p.datasets.count.should == 4
20
+ p.blueprint.datasets.count.should == 3
21
+ p.blueprint.datasets(:include_date_dimensions => true).count.should == 4
21
22
  GoodData::Command::Project.update({:spec => @blueprint, :project => p})
22
- p.datasets.count.should == 5
23
+ p.blueprint.datasets.count.should == 4
24
+ p.blueprint.datasets(:include_date_dimensions => true).count.should == 5
23
25
  end
24
26
  end
25
27
  end
@@ -20,13 +20,34 @@ describe "Full project implementation", :constraint => 'slow' do
20
20
 
21
21
  it "should contain datasets" do
22
22
  GoodData.with_project(@project) do |p|
23
- p.datasets.count.should == 4
23
+ p.blueprint.tap do |bp|
24
+ expect(bp.datasets.count).to eq 3
25
+ expect(bp.datasets(:include_date_dimensions => true).count).to eq 4
26
+ end
27
+ end
28
+ end
29
+
30
+ it "should be able to rename a project" do
31
+ GoodData.with_project(@project) do |p|
32
+ former_title = p.title
33
+ a_title = (0...8).map { (65 + rand(26)).chr }.join
34
+ p.title = a_title
35
+ p.save
36
+ expect(p.title).to eq a_title
37
+ p.title = former_title
38
+ p.save
39
+ end
40
+ end
41
+
42
+ it "should be able to validate a project" do
43
+ GoodData.with_project(@project) do |p|
44
+ p.validate
24
45
  end
25
46
  end
26
47
 
27
48
  it "should compute an empty metric" do
28
49
  GoodData.with_project(@project) do |p|
29
- f = GoodData::Fact.find_first_by_title('Lines changed')
50
+ f = GoodData::Fact.find_first_by_title('Lines Changed')
30
51
  metric = GoodData::Metric.xcreate("SELECT SUM(#\"#{f.title}\")")
31
52
  metric.execute.should be_nil
32
53
  end
@@ -40,20 +61,22 @@ describe "Full project implementation", :constraint => 'slow' do
40
61
  [1,"01/01/2014",1,1],
41
62
  [3,"01/02/2014",2,2],
42
63
  [5,"05/02/2014",3,1]]
43
- blueprint.find_dataset('commits').upload(commits_data)
64
+ GoodData::Model.upload_data(commits_data, blueprint, 'commits')
65
+ # blueprint.find_dataset('commits').upload(commits_data)
44
66
 
45
67
  devs_data = [
46
68
  ["dev_id", "email"],
47
69
  [1, "tomas@gooddata.com"],
48
70
  [2, "petr@gooddata.com"],
49
71
  [3, "jirka@gooddata.com"]]
50
- blueprint.find_dataset('devs').upload(devs_data)
72
+ GoodData::Model.upload_data(devs_data, blueprint, 'devs')
73
+ # blueprint.find_dataset('devs').upload(devs_data)
51
74
  end
52
75
  end
53
76
 
54
77
  it "should compute a metric" do
55
78
  GoodData.with_project(@project) do |p|
56
- f = GoodData::Fact.find_first_by_title('Lines changed')
79
+ f = GoodData::Fact.find_first_by_title('Lines Changed')
57
80
  metric = GoodData::Metric.xcreate("SELECT SUM(#\"#{f.title}\")")
58
81
  metric.execute.should == 9
59
82
  end
@@ -61,7 +84,7 @@ describe "Full project implementation", :constraint => 'slow' do
61
84
 
62
85
  it "should execute an anonymous metric twice and not fail" do
63
86
  GoodData.with_project(@project) do |p|
64
- f = GoodData::Fact.find_first_by_title('Lines changed')
87
+ f = GoodData::Fact.find_first_by_title('Lines Changed')
65
88
  metric = GoodData::Metric.xcreate("SELECT SUM(#\"#{f.title}\")")
66
89
  metric.execute.should == 9
67
90
  # Since GD platform cannot execute inline specified metric the metric has to be saved
@@ -72,7 +95,8 @@ describe "Full project implementation", :constraint => 'slow' do
72
95
 
73
96
  it "should compute a report" do
74
97
  GoodData.with_project(@project) do |p|
75
- f = GoodData::Fact.find_first_by_title('Lines changed')
98
+ f = GoodData::Fact.find_first_by_title('Lines Changed')
99
+ # TODO: Here we create metric which is not deleted and is used by another test - "should exercise the object relations and getting them in various ways"
76
100
  metric = GoodData::Metric.xcreate(:title => "My metric", :expression => "SELECT SUM(#\"#{f.title}\")")
77
101
  metric.save
78
102
  result = GoodData::ReportDefinition.execute(:title => "My report", :top => [metric], :left => ['label.devs.dev_id.email'])
@@ -144,7 +168,7 @@ describe "Full project implementation", :constraint => 'slow' do
144
168
  metric.should == metric
145
169
 
146
170
  # grab fact in several different ways
147
- fact1 = GoodData::Fact.find_first_by_title('Lines changed')
171
+ fact1 = GoodData::Fact.find_first_by_title('Lines Changed')
148
172
  fact2 = GoodData::Fact[fact1.identifier]
149
173
  fact3 = GoodData::Fact[fact2.obj_id]
150
174
  fact4 = GoodData::Fact[fact3.uri]
@@ -166,17 +190,23 @@ describe "Full project implementation", :constraint => 'slow' do
166
190
  fact1.used_by
167
191
  fact1.used_by('metric').count.should == 1
168
192
 
169
- metric.using?(fact1).should == true
170
- fact1.using?(metric).should == false
193
+ res = metric.using?(fact1)
194
+ expect(res).to be(true)
195
+
196
+ res = fact1.using?(metric)
197
+ expect(res).to be(false)
198
+
199
+ res = metric.used_by?(fact1)
200
+ expect(res).to be(false)
171
201
 
172
- metric.used_by?(fact1).should == false
173
- fact1.used_by?(metric).should == true
202
+ res = fact1.used_by?(metric)
203
+ expect(res).to be(true)
174
204
  end
175
205
  end
176
206
 
177
207
  it "should try setting and getting by tags" do
178
208
  GoodData.with_project(@project) do |p|
179
- fact = GoodData::Fact.find_first_by_title('Lines changed')
209
+ fact = GoodData::Fact.find_first_by_title('Lines Changed')
180
210
  fact.tags.should be_empty
181
211
 
182
212
  fact.tags = "tag1,tag2,tag3"
@@ -208,7 +238,7 @@ describe "Full project implementation", :constraint => 'slow' do
208
238
  res = GoodData::Metric.execute("SELECT SUM(![fact.commits.lines_changed])", :extended_notation => true)
209
239
  res.should == 9
210
240
 
211
- fact = GoodData::Fact.find_first_by_title('Lines changed')
241
+ fact = GoodData::Fact.find_first_by_title('Lines Changed')
212
242
  fact.fact?.should == true
213
243
  res = fact.create_metric(:type => :sum).execute
214
244
  res.should == 9
@@ -221,7 +251,8 @@ describe "Full project implementation", :constraint => 'slow' do
221
251
  devs_data = [
222
252
  ["dev_id", "email"],
223
253
  [4, "josh@gooddata.com"]]
224
- blueprint.find_dataset('devs').upload(devs_data, :load => 'INCREMENTAL')
254
+ GoodData::Model.upload_data(devs_data, blueprint, 'devs', mode: 'INCREMENTAL' )
255
+ # blueprint.find_dataset('devs').upload(devs_data, :load => 'INCREMENTAL')
225
256
  end
226
257
  end
227
258
 
@@ -251,13 +282,15 @@ describe "Full project implementation", :constraint => 'slow' do
251
282
  l = attribute.primary_label
252
283
  value = l.values.first[:value]
253
284
  l.find_element_value(l.find_value_uri(value)).should == value
285
+ expect(l.value?(value)).should == true
286
+ expect(l.value?("DEFINITELY NON EXISTENT VALUE HOPEFULLY")).should == false
254
287
  end
255
288
  end
256
289
 
257
- it "Should be able to compute count o different datasets" do
290
+ it "should be able to compute count of different datasets" do
258
291
  GoodData.with_project(@project) do |p|
259
292
  attribute = GoodData::Attribute['attr.devs.dev_id']
260
- dataset_attribute = GoodData::Attribute['attr.commits.id']
293
+ dataset_attribute = GoodData::Attribute['attr.commits.factsof']
261
294
  attribute.create_metric(:attribute => dataset_attribute).execute.should == 3
262
295
  end
263
296
  end
@@ -283,7 +316,7 @@ describe "Full project implementation", :constraint => 'slow' do
283
316
  metric = GoodData::Metric.xcreate("SELECT SUM([#{fact.uri}]) WHERE [#{attribute.uri}] = [#{value[:uri]}]")
284
317
  metric.replace_value(label, value[:value], different_value[:value])
285
318
  metric.contain_value?(label, value[:value]).should == false
286
- metric.pretty_expression.should == "SELECT SUM([Lines changed]) WHERE [Dev] = [josh@gooddata.com]"
319
+ metric.pretty_expression.should == "SELECT SUM([Lines Changed]) WHERE [Dev] = [josh@gooddata.com]"
287
320
  end
288
321
  end
289
322