groovy 0.5.1 → 0.6.1
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/Gemfile +1 -1
- data/groovy.gemspec +1 -1
- data/lib/groovy/model.rb +26 -7
- data/lib/groovy/query.rb +17 -1
- data/lib/groovy/schema.rb +5 -3
- data/lib/groovy/vector.rb +4 -0
- data/lib/groovy/version.rb +1 -1
- data/lib/groovy.rb +3 -3
- data/spec/groovy_spec.rb +12 -0
- data/spec/query_spec.rb +2 -2
- data/spec/vector_spec.rb +56 -0
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bf0e3aa6e2c0d1e3d9e0245062e1b778e4da15e9130cc672d07eb1e474e25d0f
|
4
|
+
data.tar.gz: add6fe670e018efb4f5706b02d05154bdf525d5f2bb3f8ce378e60bb92471f59
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '0228c03673a0d86e3072c3f7a952a152c3799125f3c3a2998a219d6015a0c6ccea54bd10972996f17dab52b47298fdc3424fe9bff5de3343a3803748d22bbef1'
|
7
|
+
data.tar.gz: 8302d8af1e7940a878643f123760e5ae482b786c6c6857cf69306f8b2bb0e79a7364f05035659611102966a7b199aae7ce1eab869cdc9f2ab8055551cb5cdc42
|
data/Gemfile
CHANGED
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", "= 12.1.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
@@ -26,7 +26,7 @@ module Groovy
|
|
26
26
|
# end
|
27
27
|
|
28
28
|
def self.model_from_table(table_name)
|
29
|
-
|
29
|
+
get_class(table_name.to_s.sub(/ies$/, 'y').sub(/s$/, ''))
|
30
30
|
end
|
31
31
|
|
32
32
|
def self.included(base)
|
@@ -35,6 +35,11 @@ module Groovy
|
|
35
35
|
base.table_name = base.name.sub(/y$/, 'ie') + 's'
|
36
36
|
end
|
37
37
|
|
38
|
+
def self.get_class(table_name)
|
39
|
+
classified = table_name.gsub(/([A-Z])/, '_\1').split('_').collect! { |w| w.capitalize }.join
|
40
|
+
Kernel.const_get(classified)
|
41
|
+
end
|
42
|
+
|
38
43
|
module ClassMethods
|
39
44
|
extend Forwardable
|
40
45
|
attr_accessor :context_name, :table_name
|
@@ -86,6 +91,12 @@ module Groovy
|
|
86
91
|
add_accessors_for(name)
|
87
92
|
end
|
88
93
|
|
94
|
+
def add_reference(name, table_name, options = {})
|
95
|
+
schema.reference(name, table_name, options)
|
96
|
+
schema.sync
|
97
|
+
add_accessors_for(name)
|
98
|
+
end
|
99
|
+
|
89
100
|
def add_accessors_for(col, s = schema)
|
90
101
|
if s.attribute_columns.include?(col)
|
91
102
|
add_attr_accessors(col)
|
@@ -202,9 +213,13 @@ module Groovy
|
|
202
213
|
end
|
203
214
|
end
|
204
215
|
|
205
|
-
|
206
|
-
|
207
|
-
|
216
|
+
def where(*args, &block)
|
217
|
+
query.where(*args, &block)
|
218
|
+
end
|
219
|
+
|
220
|
+
[:first, :last, :select, :find_by, :search, :not, :sort_by, :in_batches, :limit, :offset, :paginate].each do |scope_method|
|
221
|
+
define_method scope_method do |**args, &block|
|
222
|
+
query.public_send(scope_method, **args, &block)
|
208
223
|
end
|
209
224
|
end
|
210
225
|
|
@@ -231,7 +246,7 @@ module Groovy
|
|
231
246
|
end
|
232
247
|
|
233
248
|
def set_timestamp(obj, key_name)
|
234
|
-
obj[key_name] = Time.now if attribute_names.include?(key_name.to_sym)
|
249
|
+
obj[key_name] = Time.now.utc if attribute_names.include?(key_name.to_sym)
|
235
250
|
end
|
236
251
|
|
237
252
|
def callbacks
|
@@ -256,7 +271,7 @@ module Groovy
|
|
256
271
|
end
|
257
272
|
|
258
273
|
def db_context
|
259
|
-
Groovy.contexts[context_name
|
274
|
+
Groovy.contexts[context_name&.to_sym] \
|
260
275
|
or raise "Context not defined: #{context_name} Please call Groovy.open('./db/path') first."
|
261
276
|
end
|
262
277
|
|
@@ -374,7 +389,11 @@ module Groovy
|
|
374
389
|
|
375
390
|
def save(options = {})
|
376
391
|
return false if respond_to?(:invalid?) and invalid?
|
377
|
-
new_record?
|
392
|
+
if new_record?
|
393
|
+
create && true
|
394
|
+
else
|
395
|
+
update
|
396
|
+
end
|
378
397
|
end
|
379
398
|
|
380
399
|
def save!(options = {})
|
data/lib/groovy/query.rb
CHANGED
@@ -75,7 +75,7 @@ module Groovy
|
|
75
75
|
def where(conditions = nil)
|
76
76
|
case conditions
|
77
77
|
when String # "foo:bar"
|
78
|
-
add_param(AND + "(#{map_operator(conditions)})")
|
78
|
+
add_param(AND + "(#{map_operator(handle_timestamps(conditions))})")
|
79
79
|
when Hash # { foo: 'bar' } or { views: 1..100 }
|
80
80
|
conditions.each do |key, val|
|
81
81
|
if val.is_a?(Range)
|
@@ -91,6 +91,15 @@ module Groovy
|
|
91
91
|
str = "#{key}:#{val.join(" OR #{key}:")}"
|
92
92
|
add_param(AND + str)
|
93
93
|
|
94
|
+
elsif val.is_a?(Time)
|
95
|
+
# The second, specify the timestamp as string in following format:
|
96
|
+
# “(YEAR)/(MONTH)/(DAY) (HOUR):(MINUTE):(SECOND)”
|
97
|
+
|
98
|
+
# date_str = val.utc.strftime("%Y/%m/%d %H\:%M\:%S")
|
99
|
+
date_str = val.strftime("%Y/%m/%d %H\:%M\:%S")
|
100
|
+
str = "#{key}:#{date_str}"
|
101
|
+
add_param(AND + str)
|
102
|
+
|
94
103
|
else
|
95
104
|
str = val.nil? || val === false || val.to_s.strip == '' ? "\"\"" : escape_val(val)
|
96
105
|
add_param(AND + [key, str].join(':'))
|
@@ -229,6 +238,7 @@ module Groovy
|
|
229
238
|
end
|
230
239
|
|
231
240
|
def in_batches(of: 1000, from: nil, &block)
|
241
|
+
puts "of: #{of}"
|
232
242
|
sorting[:limit] = of
|
233
243
|
sorting[:offset] = from || 0
|
234
244
|
|
@@ -305,6 +315,12 @@ module Groovy
|
|
305
315
|
.sub(' >= ', ':>=')
|
306
316
|
end
|
307
317
|
|
318
|
+
# remove timezones from timestamps, otherwise we get a 'failed to cast to <Time>' error
|
319
|
+
def handle_timestamps(str)
|
320
|
+
# 2023-11-21 10:38:17 -0300 -> 2023/11/21 10:38:17
|
321
|
+
str.sub(/(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+) (.+)/, '\1/\2/\3 \4:\5:\6')
|
322
|
+
end
|
323
|
+
|
308
324
|
def sort_key_and_order
|
309
325
|
sorting[:by] or [{ key: @default_sort_key, order: :asc }]
|
310
326
|
end
|
data/lib/groovy/schema.rb
CHANGED
@@ -108,9 +108,11 @@ module Groovy
|
|
108
108
|
|
109
109
|
ensure_created!
|
110
110
|
remove_columns_not_in(@spec.keys)
|
111
|
+
|
111
112
|
@spec.each do |col, spec|
|
112
113
|
check_and_add_column(col, spec[:type], spec[:args])
|
113
114
|
end
|
115
|
+
|
114
116
|
@index_columns.each do |col|
|
115
117
|
add_index_on(col)
|
116
118
|
end
|
@@ -187,12 +189,12 @@ module Groovy
|
|
187
189
|
end
|
188
190
|
|
189
191
|
def create_table!
|
190
|
-
log "Creating table!"
|
192
|
+
log "Creating table #{table_name}!"
|
191
193
|
Groonga::Schema.create_table(table_name, context: context)
|
192
194
|
end
|
193
195
|
|
194
196
|
def remove_table!
|
195
|
-
log "Removing table!"
|
197
|
+
log "Removing table #{table_name}!"
|
196
198
|
Groonga::Schema.remove_table(table_name, context: context)
|
197
199
|
@table = nil
|
198
200
|
end
|
@@ -202,7 +204,7 @@ module Groovy
|
|
202
204
|
end
|
203
205
|
|
204
206
|
def log(str)
|
205
|
-
puts "[#{table_name}] #{str}" if ENV['DEBUG']
|
207
|
+
puts "[#{table_name}] #{str}" # if ENV['DEBUG']
|
206
208
|
end
|
207
209
|
end
|
208
210
|
end
|
data/lib/groovy/vector.rb
CHANGED
data/lib/groovy/version.rb
CHANGED
data/lib/groovy.rb
CHANGED
@@ -41,7 +41,7 @@ module Groovy
|
|
41
41
|
contexts[name.to_sym] = if name == :default
|
42
42
|
Groonga::Context.default.tap { |ctx| open_or_create_db(ctx, db_path) }
|
43
43
|
else
|
44
|
-
init_context(db_path
|
44
|
+
init_context(db_path)
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
@@ -63,8 +63,8 @@ module Groovy
|
|
63
63
|
|
64
64
|
private
|
65
65
|
|
66
|
-
def init_context(db_path
|
67
|
-
Groonga::Context.new
|
66
|
+
def init_context(db_path)
|
67
|
+
Groonga::Context.new.tap do |ctx|
|
68
68
|
open_or_create_db(ctx, db_path)
|
69
69
|
end
|
70
70
|
end
|
data/spec/groovy_spec.rb
CHANGED
@@ -5,6 +5,18 @@ describe Groovy do
|
|
5
5
|
Groonga::Context.default = nil
|
6
6
|
end
|
7
7
|
|
8
|
+
it 'explodes if opening a scheme without opening first' do
|
9
|
+
expect do
|
10
|
+
class Foobar; end
|
11
|
+
Foobar.class_eval do
|
12
|
+
include Groovy::Model
|
13
|
+
schema do |t|
|
14
|
+
t.string :foobar
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end.to raise_error("Context not defined: Please call Groovy.open('./db/path') first.")
|
18
|
+
end
|
19
|
+
|
8
20
|
describe '.open' do
|
9
21
|
it 'explodes if called with no params' do
|
10
22
|
expect do
|
data/spec/query_spec.rb
CHANGED
@@ -95,10 +95,10 @@ describe Groovy::Query do
|
|
95
95
|
res = TestProduct.where(created_at: @one_week_ago)
|
96
96
|
expect(res.map(&:id)).to eq([@p3.id])
|
97
97
|
|
98
|
-
res = TestProduct.where("created_at > #{@one_week_ago
|
98
|
+
res = TestProduct.where("created_at > #{@one_week_ago}")
|
99
99
|
expect(res.map(&:id)).to eq([@p1.id, @p2.id, @p4.id, @p5.id])
|
100
100
|
|
101
|
-
res = TestProduct.where("created_at < #{Time.now
|
101
|
+
res = TestProduct.where("created_at < #{Time.now}")
|
102
102
|
expect(res.map(&:id)).to eq([@p3.id])
|
103
103
|
|
104
104
|
eight_days = Time.at(@one_week_ago.to_i - 3600 * 24)
|
data/spec/vector_spec.rb
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
require_relative './spec_helper'
|
2
|
+
|
3
|
+
describe Groovy::Model do
|
4
|
+
|
5
|
+
before :all do
|
6
|
+
Groovy.open('tmp/vector', 'vector_spec')
|
7
|
+
load_schema! 'vector_spec'
|
8
|
+
end
|
9
|
+
|
10
|
+
after :all do
|
11
|
+
Groovy.close('vector_spec')
|
12
|
+
end
|
13
|
+
|
14
|
+
def load_vector_schema!
|
15
|
+
klass = Class.new
|
16
|
+
Object.const_set("Comment", klass)
|
17
|
+
Comment.class_eval do
|
18
|
+
include Groovy::Model
|
19
|
+
schema(context: 'vector_spec') do |t|
|
20
|
+
t.string :content
|
21
|
+
t.timestamps
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
klass = Class.new;
|
26
|
+
Object.const_set("User", klass)
|
27
|
+
User.class_eval do
|
28
|
+
include Groovy::Model
|
29
|
+
schema(context: 'vector_spec') do |t|
|
30
|
+
t.string :name
|
31
|
+
t.timestamps
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
Comment.add_reference :author, "Users"
|
36
|
+
User.add_reference :comments, "Comments", type: :vector
|
37
|
+
end
|
38
|
+
|
39
|
+
describe 'relations' do
|
40
|
+
|
41
|
+
before do
|
42
|
+
load_vector_schema!
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'loads records and keeps relations' do
|
46
|
+
user = User.new(name: 'John')
|
47
|
+
expect(user.save).to eq(true)
|
48
|
+
comment = Comment.new(author: user, content: 'Hello there!')
|
49
|
+
expect(comment.save).to eq(true)
|
50
|
+
user.comments << comment
|
51
|
+
expect(user.reload.comments).to eq([comment])
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
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.
|
4
|
+
version: 0.6.1
|
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:
|
11
|
+
date: 2023-11-29 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: 12.1.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: 12.1.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -102,6 +102,7 @@ files:
|
|
102
102
|
- spec/query_spec.rb
|
103
103
|
- spec/search_spec.rb
|
104
104
|
- spec/spec_helper.rb
|
105
|
+
- spec/vector_spec.rb
|
105
106
|
homepage: https://github.com/tomas/groovy
|
106
107
|
licenses: []
|
107
108
|
metadata: {}
|
@@ -120,8 +121,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
120
121
|
- !ruby/object:Gem::Version
|
121
122
|
version: '0'
|
122
123
|
requirements: []
|
123
|
-
|
124
|
-
rubygems_version: 2.7.3
|
124
|
+
rubygems_version: 3.4.10
|
125
125
|
signing_key:
|
126
126
|
specification_version: 4
|
127
127
|
summary: A wrapper around Groonga/Rroonga
|