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 +4 -4
- data/example/basic.rb +2 -2
- data/groovy.gemspec +1 -1
- data/lib/groovy/model.rb +2 -10
- data/lib/groovy/query.rb +18 -16
- data/lib/groovy/version.rb +1 -1
- data/spec/model_spec.rb +3 -7
- data/spec/query_spec.rb +21 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 56df8a7df15cb6444023882779e0f99db75c5fd2a2843356b4aae4e18dd62659
|
4
|
+
data.tar.gz: f8515e325de94ae8966caa271659c010c9a4a4335a3270c10f3d5360528d2faf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c6257e0e6c769952f74099b04fc41cf81116cb4f8ed7105030c694c5af8ab4d99424a851b9bbff332fe12424f6d578dcdcfc1db4396ce07c030df105fa3e9162
|
7
|
+
data.tar.gz: 02252aa72c91778f9d464e4c4341e3bafa55f0b4fc71687b8e4e2c7520e78a860bd465bfa971a5ec0d84a2f1e83ef3e2fa46d813436a8141fc6ce9f8e20a55f7
|
data/example/basic.rb
CHANGED
@@ -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
|
data/groovy.gemspec
CHANGED
@@ -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", "~>
|
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'
|
data/lib/groovy/model.rb
CHANGED
@@ -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
|
-
|
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
|
data/lib/groovy/query.rb
CHANGED
@@ -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) ?
|
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
|
-
|
37
|
-
|
38
|
-
|
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(
|
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(
|
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
|
-
|
256
|
-
|
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
|
data/lib/groovy/version.rb
CHANGED
data/spec/model_spec.rb
CHANGED
@@ -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.
|
47
|
-
expect(res.
|
48
|
-
expect(res.
|
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
|
data/spec/query_spec.rb
CHANGED
@@ -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
|
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.
|
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-
|
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: '
|
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: '
|
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.
|
122
|
+
rubygems_version: 2.7.6
|
123
123
|
signing_key:
|
124
124
|
specification_version: 4
|
125
125
|
summary: A wrapper around Groonga/Rroonga
|