groovy 0.2.1 → 0.2.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6fe19dcb7e82fdd7b2406c612b32137d3db0ffb636f7b9b1f14933f79adf6e18
4
- data.tar.gz: '038aee1d0a2a4c97fc29d7dd462bdf27dc372f62887191ec0d0852998c787c4f'
3
+ metadata.gz: 56df8a7df15cb6444023882779e0f99db75c5fd2a2843356b4aae4e18dd62659
4
+ data.tar.gz: f8515e325de94ae8966caa271659c010c9a4a4335a3270c10f3d5360528d2faf
5
5
  SHA512:
6
- metadata.gz: 5ba1804fcda6767d13e38d7dc07c8ba81c7a865acc6a7ad153da24af9b7fec8f20737a753c61a2f3a642cc5a3e8874cbea8686b1071490fd42fe32f2fe719a0a
7
- data.tar.gz: 0de80b8fdb6b8ef09c1c4083e2b821c209abe9e117f9ca65a7373a4c25556b1155e6f77b7e1e7a496cbc33bfd2d8c9df1e01a3a05851f76f3cdba376f187d3e3
6
+ metadata.gz: c6257e0e6c769952f74099b04fc41cf81116cb4f8ed7105030c694c5af8ab4d99424a851b9bbff332fe12424f6d578dcdcfc1db4396ce07c030df105fa3e9162
7
+ data.tar.gz: 02252aa72c91778f9d464e4c4341e3bafa55f0b4fc71687b8e4e2c7520e78a860bd465bfa971a5ec0d84a2f1e83ef3e2fa46d813436a8141fc6ce9f8e20a55f7
@@ -12,8 +12,8 @@ class Product
12
12
  t.timestamps
13
13
  end
14
14
 
15
- scope :by_price, -> { sort_by(price: :asc) }
16
- scope :named, -> (name) { where(name: name) if name }
15
+ scope :by_price, -> { puts self.inspect; sort_by(price: :asc) }
16
+ scope :named, -> (name) { puts self.inspect; where(name: name) if name }
17
17
  end
18
18
 
19
19
  def populate
@@ -14,7 +14,7 @@ Gem::Specification.new do |s|
14
14
  # s.required_rubygems_version = ">= 1.3.6"
15
15
  # s.rubyforge_project = "groovy"
16
16
 
17
- s.add_runtime_dependency "rroonga", "~> 7.1"
17
+ s.add_runtime_dependency "rroonga", "~> 9.0"
18
18
 
19
19
  s.add_development_dependency "bundler", ">= 1.0.0"
20
20
  s.add_development_dependency "rspec", '~> 3.0', '>= 3.0.0'
@@ -143,16 +143,8 @@ module Groovy
143
143
  num == 1 ? arr.first : arr
144
144
  end
145
145
 
146
- def find_by(params)
147
- where(params).limit(1).first
148
- end
149
-
150
- def clear_query
151
- @query = nil
152
- end
153
-
154
146
  def query
155
- @query ||= query_class.new(self, table)
147
+ query_class.new(self, table)
156
148
  end
157
149
 
158
150
  def scope(name, obj)
@@ -162,7 +154,7 @@ module Groovy
162
154
  end
163
155
  end
164
156
 
165
- [:search, :where, :not, :sort_by, :limit, :offset, :paginate, :in_batches].each do |scope_method|
157
+ [:find_by, :search, :where, :not, :sort_by, :limit, :offset, :paginate, :in_batches].each do |scope_method|
166
158
  define_method scope_method do |*args, &block|
167
159
  query.public_send(scope_method, *args, &block)
168
160
  end
@@ -6,12 +6,14 @@ module Groovy
6
6
  AND = '+'.freeze
7
7
  NOT = '-'.freeze
8
8
  PER_PAGE = 50.freeze
9
+ VALID_QUERY_CHARS = 'a-zA-Z0-9_\.,&-'.freeze
10
+ REMOVE_INVALID_CHARS_REGEX = Regexp.new('[^\s' + VALID_QUERY_CHARS + ']').freeze
9
11
 
10
12
  attr_reader :parameters, :sorting
11
13
 
12
14
  def self.add_scope(name, obj)
13
15
  define_method(name) do |*args|
14
- res = obj.respond_to?(:call) ? obj.call(*args) : obj
16
+ res = obj.respond_to?(:call) ? instance_exec(*args, &obj) : obj
15
17
  self
16
18
  end
17
19
  end
@@ -32,10 +34,16 @@ module Groovy
32
34
  end
33
35
  end
34
36
 
35
- def inspect
36
- clear_query
37
- # "<#{self.class.name} #{parameters}>"
38
- super
37
+ # def inspect
38
+ # "<#{self.class.name} #{parameters}>"
39
+ # end
40
+
41
+ def find(id)
42
+ find_by(_id: id)
43
+ end
44
+
45
+ def find_by(conditions)
46
+ where(conditions).limit(1).first
39
47
  end
40
48
 
41
49
  # http://groonga.org/docs/reference/grn_expr/query_syntax.html
@@ -51,7 +59,7 @@ module Groovy
51
59
  add_param(AND + [key, val.max].join(':<=')) if val.max # gte
52
60
 
53
61
  elsif val.is_a?(Regexp)
54
- str = val.source.gsub(/[^a-zA-Z0-9\s_\.,-]/, '')
62
+ str = val.source.gsub(REMOVE_INVALID_CHARS_REGEX, '')
55
63
  param = val.source[0] == '^' ? ':^' : val.source[-1] == '$' ? ':$' : ':~' # starts with or regexp
56
64
  add_param(AND + [key, str.downcase].join(param)) # regex must be downcase
57
65
 
@@ -85,7 +93,7 @@ module Groovy
85
93
  add_param(AND + [key, val.max].join(':>=')) if val.max # lte, nil if range.max is -1
86
94
 
87
95
  elsif val.is_a?(Regexp)
88
- str = val.source.gsub(/[^a-zA-Z0-9\s_\.,-]/, '')
96
+ str = val.source.gsub(REMOVE_INVALID_CHARS_REGEX, '')
89
97
  param = val.source[0] == '^' ? ':^' : val.source[-1] == '$' ? ':$' : ':~' # starts with or regexp
90
98
  add_param(NOT + [key, str.downcase].join(param)) # regex must be downcase
91
99
 
@@ -194,13 +202,8 @@ module Groovy
194
202
  private
195
203
  attr_reader :model, :table, :options
196
204
 
197
- def clear_query
198
- model.clear_query # sets @query to nil
199
- end
200
-
201
205
  def add_param(param)
202
206
  if parameters.include?(param)
203
- # clear_query
204
207
  raise "Duplicate param: #{param}"
205
208
  end
206
209
 
@@ -213,8 +216,6 @@ module Groovy
213
216
  rescue Groonga::TooLargeOffset
214
217
  # puts "Offset is higher than table size!"
215
218
  []
216
- ensure
217
- clear_query
218
219
  end
219
220
 
220
221
  def execute
@@ -252,8 +253,9 @@ module Groovy
252
253
  end
253
254
 
254
255
  def prepare_query
255
- query = parameters.join(" ").split(/ or /i).map do |part|
256
- part.gsub(/\s(\w)/, '\ \1')
256
+ space_regex = Regexp.new('\s([' + VALID_QUERY_CHARS + '])')
257
+ query = parameters.join(' ').split(/ or /i).map do |part|
258
+ part.gsub(' ', ' ').gsub(space_regex, '\ \1')
257
259
  end.join(' OR ').sub(/^-/, '_id:>0 -') #.gsub(' OR -', ' -')
258
260
  end
259
261
  end
@@ -1,3 +1,3 @@
1
1
  module Groovy
2
- VERSION = '0.2.1'.freeze
2
+ VERSION = '0.2.2'.freeze
3
3
  end
@@ -11,10 +11,6 @@ describe Groovy::Model do
11
11
  Groovy.close('model_spec')
12
12
  end
13
13
 
14
- after :each do
15
- TestProduct.clear_query # otherwise next test will fail
16
- end
17
-
18
14
  describe '.schema' do
19
15
  end
20
16
 
@@ -43,9 +39,9 @@ describe Groovy::Model do
43
39
 
44
40
  it 'does not duplicate params' do
45
41
  res = TestProduct.with_name('foo').by_price_asc.cheapest
46
- res.query
47
- expect(res.query.parameters).to eq(["+name:foo"])
48
- expect(res.query.sorting).to eq(:by=>[{:key=>"price", :order=>:asc}], :limit=>-1, :offset=>0)
42
+ expect(res).to be_a(Groovy::Query)
43
+ expect(res.parameters).to eq(["+name:foo"])
44
+ expect(res.sorting).to eq(:by=>[{:key=>"price", :order=>:asc}], :limit=>-1, :offset=>0)
49
45
  end
50
46
 
51
47
  end
@@ -5,7 +5,7 @@ describe Groovy::Query do
5
5
  before :all do
6
6
  Groovy.open('tmp/querying', 'query_spec')
7
7
  load_schema! 'query_spec'
8
- @p1 = TestProduct.create!(name: "Product 1", visible: true, price: 10, tag_list: 'one, number two, and three')
8
+ @p1 = TestProduct.create!(name: "Product 1", visible: true, price: 10, tag_list: 'one, number two & three')
9
9
  @p2 = TestProduct.create!(name: "Product 2", visible: false, price: 20, tag_list: 'number two, three')
10
10
  @p3 = TestProduct.create!(name: "Product 3", visible: true, price: 30, tag_list: nil)
11
11
  @p4 = TestProduct.create!(name: "Product 4", visible: false, price: 40, tag_list: 'one, number two')
@@ -48,6 +48,11 @@ describe Groovy::Query do
48
48
  res = TestProduct.where(name: 'Product 2')
49
49
  expect(res.map(&:id)).to eq([@p2.id])
50
50
  end
51
+
52
+ it 'works with symbols' do
53
+ res = TestProduct.where(tag_list: 'one, number two & three')
54
+ expect(res.map(&:id)).to eq([@p1.id])
55
+ end
51
56
  end
52
57
 
53
58
  context 'basic regex' do
@@ -60,6 +65,11 @@ describe Groovy::Query do
60
65
  res = TestProduct.where(tag_list: /TWO/)
61
66
  expect(res.map(&:id)).to eq([@p1.id, @p2.id, @p4.id])
62
67
  end
68
+
69
+ it 'works with symbols' do
70
+ res = TestProduct.where(tag_list: /two & three/)
71
+ expect(res.map(&:id)).to eq([@p1.id])
72
+ end
63
73
  end
64
74
 
65
75
  describe 'starts with regex' do
@@ -138,6 +148,11 @@ describe Groovy::Query do
138
148
  res = TestProduct.not(name: 'Product 2')
139
149
  expect(res.map(&:id)).to eq([@p1.id, @p3.id, @p4.id, @p5.id])
140
150
  end
151
+
152
+ it 'works with symbols' do
153
+ res = TestProduct.not(tag_list: 'one, number two & three')
154
+ expect(res.map(&:id)).to eq([@p2.id, @p3.id, @p4.id, @p5.id])
155
+ end
141
156
  end
142
157
 
143
158
  context 'basic regex' do
@@ -150,6 +165,11 @@ describe Groovy::Query do
150
165
  res = TestProduct.not(tag_list: /TWO/)
151
166
  expect(res.map(&:id)).to eq([@p3.id, @p5.id])
152
167
  end
168
+
169
+ it 'works with symbols' do
170
+ res = TestProduct.not(tag_list: /two & three/)
171
+ expect(res.map(&:id)).to eq([@p2.id, @p3.id, @p4.id, @p5.id])
172
+ end
153
173
  end
154
174
 
155
175
  describe 'starts with regex' do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: groovy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tomás Pollak
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-05-15 00:00:00.000000000 Z
11
+ date: 2019-05-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rroonga
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '7.1'
19
+ version: '9.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '7.1'
26
+ version: '9.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -119,7 +119,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
119
119
  version: '0'
120
120
  requirements: []
121
121
  rubyforge_project:
122
- rubygems_version: 2.7.3
122
+ rubygems_version: 2.7.6
123
123
  signing_key:
124
124
  specification_version: 4
125
125
  summary: A wrapper around Groonga/Rroonga