cql 1.3.0 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7723f8638c180e1ad2215a3912db8979a12b8722
4
- data.tar.gz: 93cf6e70f784983ae672ff87a73616495e115d59
3
+ metadata.gz: fe541449ce515566bd3a3483b42f2260829a03e1
4
+ data.tar.gz: 846f80e853bef0ba8d441187370ce948e6cca50b
5
5
  SHA512:
6
- metadata.gz: 588e74d98dbd1d7c5a8cf8331d45abc32ff1005ac8503c78e985f88b14f88baade72ddf6c9cdb0e70b81127e287e681e4749dc655ff3c04c973074cbd405a987
7
- data.tar.gz: 6e83c073cadd6e57bfd6f4b28ba111f262e6e1ac11563e793e8e6751dddbfdbacb2f33b62c033940c0eee01d6d1f41004db5b9b03a23d96ebf3d5f13431ad3b2
6
+ metadata.gz: 5f5bb7cb738155ad68f98b877d4889be5f57b69adec5c37804307aa47d29bde11c7819e3a883994e85ff3b903f636a542a575668b1cac9b299068244e3b08df6
7
+ data.tar.gz: ee4e8bf2dee1d7aeb0128c65fe3001c1d21c97290b6668384d044de2066880de687a2398040616f8f000eefb6d4aed1ff269a975ae2c8f51e6769ac7364063f6
data/lib/cql.rb CHANGED
@@ -37,6 +37,7 @@ module CQL
37
37
  raise(ArgumentError, "A query must specify a 'select' clause") unless @what
38
38
  raise(ArgumentError, "A query must specify a 'from' clause") unless @from
39
39
 
40
+ warn("Multiple selections made without using an 'as' clause") unless @name_transforms || (@what.count == @what.uniq.count)
40
41
 
41
42
  # Gather relevant objects from root object and filters
42
43
  @data = CQL::MapReduce.gather_objects(@data, @from, @filters)
@@ -1,3 +1,3 @@
1
1
  module CQL
2
- VERSION = '1.3.0'
2
+ VERSION = '1.4.0'
3
3
  end
@@ -59,13 +59,17 @@ Feature: 'select' clause
59
59
  | Test 2 | 7 |
60
60
 
61
61
  Scenario: Selection of the same attribute multiple times
62
+
63
+ Note: Duplicate attribute selection should be combined with an 'as' clause in order to ensure that later attribute selections do not override earlier selections of the same attribute.
64
+
62
65
  When the following query is executed:
63
66
  """
64
67
  select name, name
68
+ as name1, name2
65
69
  from scenarios
66
70
  """
67
71
  Then the following values are returned:
68
- | name | name |
72
+ | name1 | name2 |
69
73
  | Test 1 | Test 1 |
70
74
  | Test 2 | Test 2 |
71
75
 
@@ -124,30 +124,34 @@ Feature: 'transform' clause
124
124
 
125
125
  Scenario: Transforming duplicate attributes
126
126
 
127
+ Reminder: Duplicate attribute selection should be used in conjunction with the 'as' clause.
128
+
127
129
  Sometimes you may want to select the same attribute multiple times and perform multiple different transformations on it. This can be done with both set transforming and selective transforming.
128
130
 
129
131
  When the following query is executed:
130
132
  """
131
133
  select name, tags, name
134
+ as name1, tags, name2
132
135
  transform lambda { |name| name.upcase },
133
136
  lambda { |tags| 9 },
134
137
  lambda { |name| name.downcase }
135
138
  from scenarios, outlines
136
139
  """
137
140
  Then the following values are returned:
138
- | name | tags | name |
141
+ | name1 | tags | name2 |
139
142
  | TEST 1 | 9 | test 1 |
140
143
  | TEST 2 | 9 | test 2 |
141
144
  | TEST 3 | 9 | test 3 |
142
145
  When the following query is executed:
143
146
  """
144
147
  select name, source_line, name
148
+ as name1, source_line, name2
145
149
  transform name => lambda { |name| name.upcase }
146
150
  transform name => lambda { |name| name.downcase }
147
151
  from scenarios, outlines
148
152
  """
149
153
  Then the following values are returned:
150
- | name | source_line | name |
154
+ | name1 | source_line | name2 |
151
155
  | TEST 1 | 3 | test 1 |
152
156
  | TEST 2 | 7 | test 2 |
153
157
  | TEST 3 | 10 | test 3 |
@@ -43,8 +43,8 @@ Feature: 'with' clause
43
43
 
44
44
 
45
45
  Background: A sample Cucumber suite
46
- Given a directory "test_directory"
47
- And a file "test_directory/test_file_1.feature":
46
+ Given a repository to query
47
+ And the following feature has been modeled in the repository:
48
48
  """
49
49
  Feature: A test feature
50
50
 
@@ -67,7 +67,7 @@ Feature: 'with' clause
67
67
  | param |
68
68
  | value |
69
69
  """
70
- And a file "test_directory/test_file_2.feature":
70
+ And the following feature has been modeled in the repository:
71
71
  """
72
72
  Feature: A feature with lots of scenarios
73
73
 
@@ -80,7 +80,7 @@ Feature: 'with' clause
80
80
  Scenario: 3
81
81
  * different steps
82
82
  """
83
- And a file "test_directory/test_file_3.feature":
83
+ And the following feature has been modeled in the repository:
84
84
  """
85
85
  Feature: A feature with lots of outlines
86
86
 
@@ -102,7 +102,7 @@ Feature: 'with' clause
102
102
  | param |
103
103
  | value |
104
104
  """
105
- And a file "test_directory/test_file_4.feature":
105
+ And the following feature has been modeled in the repository:
106
106
  """
107
107
  Feature: A feature with a mix of tests
108
108
 
@@ -115,7 +115,6 @@ Feature: 'with' clause
115
115
  | param |
116
116
  | value |
117
117
  """
118
- And a repository is made from "test_directory"
119
118
 
120
119
 
121
120
  Scenario: Using 'with' to limit the objects from which to return attributes
@@ -165,10 +164,10 @@ Feature: 'with' clause
165
164
  Then the following values are returned:
166
165
  | name |
167
166
  | A test feature |
167
+ | Test 1 |
168
168
  | A feature with lots of scenarios |
169
169
  | A feature with lots of outlines |
170
170
  | A feature with a mix of tests |
171
- | Test 1 |
172
171
 
173
172
  Scenario: Using the 'with' clause multiple times
174
173
  When the following query is executed:
@@ -23,3 +23,21 @@ Given(/^the models provided by CukeModeler$/) do
23
23
  end
24
24
  end
25
25
  end
26
+
27
+ Given(/^a repository to query$/) do
28
+ @root_directory_model = CukeModeler::Directory.new
29
+ @repository = CQL::Repository.new(@root_directory_model)
30
+ end
31
+
32
+ And(/^the following feature has been modeled in the repository:$/) do |text|
33
+ file_model = CukeModeler::FeatureFile.new
34
+
35
+ # CukeModeler::FeatureFile had a different interface in 0.x
36
+ if file_model.respond_to?(:feature=)
37
+ file_model.feature = CukeModeler::Feature.new(text)
38
+ else
39
+ file_model.features << CukeModeler::Feature.new(text)
40
+ end
41
+
42
+ @root_directory_model.feature_files << file_model
43
+ end
@@ -1,15 +1,17 @@
1
1
  Then(/^the following values are returned:$/) do |values|
2
+ expected_keys = values.raw.first
2
3
  expected_results = values.hashes
3
- expected_results.each { |result| result['source_line'] = result['source_line'].to_i if result['source_line'] }
4
- expected_results.each { |result| result['scenario_line'] = result['scenario_line'].to_i if result['scenario_line'] }
5
- expected_results.each { |result| result['tags'] = eval(result['tags']) if result['tags'] }
6
- expected_results.each { |result| result['scenario_tags'] = eval(result['scenario_tags']) if result['scenario_tags'] }
7
4
 
8
5
  expected_results.each do |result|
9
- result.each_pair { |key, value| result[key] = value.sub('path/to', @default_file_directory) if value =~ /path\/to/ }
6
+ result.each_pair { |key, value| result[key] = value.to_i if value =~ /^\d+$/ }
10
7
  end
11
8
 
12
- expect(@query_results).to match_array(expected_results)
9
+
10
+ @query_results.each_with_index do |result, index|
11
+ # Key order doesn't matter and Ruby 1.8.7 does not retain hash key ordering, so sorting them for consistency
12
+ expect(result.keys.sort).to eq(expected_keys.sort)
13
+ expect(result).to eq(expected_results[index])
14
+ end
13
15
  end
14
16
 
15
17
  # Then(/^all of them can be queried for additional information$/) do
@@ -45,8 +47,10 @@ Then(/^the following code executes without error:$/) do |code_text|
45
47
  end
46
48
 
47
49
  Then(/^all of them can be queried$/) do |code_text|
50
+ original_text = code_text
51
+
48
52
  @available_model_classes.each do |clazz|
49
- code_text.gsub!('<model_class>', clazz.to_s)
53
+ code_text = original_text.gsub('<model_class>', clazz.to_s)
50
54
 
51
55
  expect(clazz.new).to respond_to(:query)
52
56
 
@@ -20,6 +20,10 @@ if RUBY_VERSION =~ /^1\./
20
20
  gem 'tins', '< 1.7' # The 'tins' gem requires Ruby 2.x on/after this version
21
21
  gem 'json', '< 2.0' # The 'json' gem drops pre-Ruby 2.x support on/after this version
22
22
  gem 'term-ansicolor', '< 1.4' # The 'term-ansicolor' gem requires Ruby 2.x on/after this version
23
+
24
+ if RbConfig::CONFIG['host_os'].downcase =~ /mswin|msys|mingw32/
25
+ gem 'ffi', '< 1.9.15' # The 'ffi' gem, for Windows, requires Ruby 2.x on/after this version
26
+ end
23
27
  end
24
28
 
25
29
  if RUBY_VERSION =~ /^2\.[23456789]/
@@ -20,6 +20,10 @@ if RUBY_VERSION =~ /^1\./
20
20
  gem 'tins', '< 1.7' # The 'tins' gem requires Ruby 2.x on/after this version
21
21
  gem 'json', '< 2.0' # The 'json' gem drops pre-Ruby 2.x support on/after this version
22
22
  gem 'term-ansicolor', '< 1.4' # The 'term-ansicolor' gem requires Ruby 2.x on/after this version
23
+
24
+ if RbConfig::CONFIG['host_os'].downcase =~ /mswin|msys|mingw32/
25
+ gem 'ffi', '< 1.9.15' # The 'ffi' gem, for Windows, requires Ruby 2.x on/after this version
26
+ end
23
27
  end
24
28
 
25
29
  if RUBY_VERSION =~ /^2\.[23456789]/
@@ -183,6 +183,7 @@ describe 'an object that uses the DSL' do
183
183
  select :self
184
184
  select name
185
185
  select :self
186
+ as 'foo', 'bar', 'baz'
186
187
  from scenarios
187
188
  end
188
189
 
@@ -192,12 +193,45 @@ describe 'an object that uses the DSL' do
192
193
  select
193
194
  select name
194
195
  select
196
+ as 'foo', 'bar', 'baz'
195
197
  from scenarios
196
198
  end
197
199
  ).to eq(base_result)
198
200
  end
199
201
 
200
202
  end
203
+
204
+
205
+ describe 'duplicate selections' do
206
+
207
+ let(:warning_message) { "Multiple selections made without using an 'as' clause\n" }
208
+
209
+ it "warns if the same attribute is selected more than once without an 'as' clause being used" do
210
+ gs = CQL::Repository.new("#{@feature_fixtures_directory}/scenario/simple")
211
+
212
+ expect {
213
+ gs.query do
214
+ select :model, :model, :model
215
+ from :all
216
+ end
217
+ }.to output(warning_message).to_stderr
218
+ end
219
+
220
+ it "does not warn if the same attribute is selected more than once and an 'as' clause is used" do
221
+ gs = CQL::Repository.new("#{@feature_fixtures_directory}/scenario/simple")
222
+
223
+ expect {
224
+ gs.query do
225
+ select :model, :model, :model
226
+ # Usage of the clause is sufficient. Not going to try and count the mappings or anything like that.
227
+ as foo
228
+ from :all
229
+ end
230
+ }.to_not output(warning_message).to_stderr
231
+ end
232
+
233
+ end
234
+
201
235
  end
202
236
 
203
237
  describe "from" do
@@ -44,7 +44,7 @@ shared_examples_for 'a line filterable target set' do |target_type, test_data|
44
44
  select name
45
45
  from scenarios
46
46
  with line 7
47
- end }.to raise_error(ArgumentError, "Can only match a String or Regexp. Got Fixnum.")
47
+ end }.to raise_error(ArgumentError, /^Can only match a String or Regexp. Got (?:Fixnum|Integer)\.$/)
48
48
 
49
49
  end
50
50
 
@@ -44,7 +44,7 @@ shared_examples_for 'a name filterable target set' do |target_type, test_data|
44
44
  select name
45
45
  from scenarios
46
46
  with name 7
47
- end }.to raise_error(ArgumentError, "Can only match a String or Regexp. Got Fixnum.")
47
+ end }.to raise_error(ArgumentError, /^Can only match a String or Regexp. Got (?:Fixnum|Integer)\.$/)
48
48
 
49
49
  end
50
50
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cql
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric Kessler
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-10-15 00:00:00.000000000 Z
12
+ date: 2017-04-10 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: cuke_modeler
@@ -263,7 +263,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
263
263
  version: '0'
264
264
  requirements: []
265
265
  rubyforge_project:
266
- rubygems_version: 2.6.7
266
+ rubygems_version: 2.5.2
267
267
  signing_key:
268
268
  specification_version: 4
269
269
  summary: A gem providing functionality to query a Cucumber test suite.