ohm-sorted 0.3.1 → 0.3.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 +9 -9
- data/CHANGELOG.md +12 -0
- data/Gemfile +1 -4
- data/Rakefile +0 -1
- data/lib/ohm/sorted.rb +35 -20
- data/ohm-sorted.gemspec +5 -1
- data/test/sorted_test.rb +44 -1
- metadata +46 -4
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
NzM0ZTQ4YmIwNjYzYjUzNTlhOTQwYjgxNGVkNWRlYzhjMzJiNTFlMQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
7
|
-
|
6
|
+
YWU4MmQ1MTU2ZjAwOGU4MTY2YTgwNmEwYmM3MDk5YmQxOTVjNmU2ZQ==
|
7
|
+
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ZTNmZDhhMzlkNGMzOWZlMmE2ZTA4M2MxYWIwNDlhOWY4YzBhYWVlMzliYzlj
|
10
|
+
ZjMwMGZiNTdjZDQ0ZjViYmQxOWQ4YmI1OWZiYmI5OTc2MTE4NGVlMzU2NzMx
|
11
|
+
Y2JmMzNmYmJkMzY0MzBlNmQ2MDgxMjU5YjJkZjFlODdmOTQ2MGM=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MjM5NTYxMGQ0MjRmMjNkOGZlZjA2ODdlMWJiMzk2MTcyMjRhYmI0NDZlZThj
|
14
|
+
NTI2MjY2YThjZThkMzdmNjQyNmM1MjEzOGMzMjIyZTQ4OTIzMzgzZDkwMGFm
|
15
|
+
NDk4MDAzZjE3MmMwOTFlNzNjNDBhOWZlYzVhNDFkYzliYWZiNWM=
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
### 0.3.2
|
2
|
+
|
3
|
+
- You can now use `SortedSet#reverse` to query in reverse order.
|
4
|
+
|
5
|
+
For instance:
|
6
|
+
|
7
|
+
```
|
8
|
+
Post.sorted_find(:created_at).reverse.between(Time.now - 10, Time.now)
|
9
|
+
```
|
10
|
+
|
11
|
+
- `SortedSet#each` now returns an Enumerator when called without a block
|
12
|
+
|
1
13
|
### 0.3.1
|
2
14
|
|
3
15
|
- Return correct set size for ranged sets
|
data/Gemfile
CHANGED
data/Rakefile
CHANGED
data/lib/ohm/sorted.rb
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
require 'ohm'
|
2
|
-
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'ohm/callbacks'
|
5
|
+
rescue LoadError
|
6
|
+
require 'ohm/contrib/callbacks'
|
7
|
+
end
|
3
8
|
|
4
9
|
module Ohm
|
5
10
|
|
@@ -13,6 +18,7 @@ module Ohm
|
|
13
18
|
@namespace = namespace
|
14
19
|
@model = model
|
15
20
|
@options = options
|
21
|
+
@range = options.fetch(:range, ["-inf", "inf"])
|
16
22
|
end
|
17
23
|
|
18
24
|
def offset
|
@@ -28,11 +34,23 @@ module Ohm
|
|
28
34
|
end
|
29
35
|
|
30
36
|
def between(first, last)
|
31
|
-
range = first.to_f
|
37
|
+
range = [first.to_f, last.to_f]
|
38
|
+
range.reverse! if reversed?
|
39
|
+
|
32
40
|
opts = @options.merge(range: range)
|
33
41
|
RangedSortedSet.new(key, namespace, model, opts)
|
34
42
|
end
|
35
43
|
|
44
|
+
def reversed?
|
45
|
+
@options.fetch(:reverse, false)
|
46
|
+
end
|
47
|
+
|
48
|
+
def reverse
|
49
|
+
opts = @options.merge(reverse: !reversed?, range: @range.reverse)
|
50
|
+
|
51
|
+
self.class.new(key, namespace, model, opts)
|
52
|
+
end
|
53
|
+
|
36
54
|
def slice(*args)
|
37
55
|
if args.count == 1
|
38
56
|
self[args.first]
|
@@ -50,7 +68,11 @@ module Ohm
|
|
50
68
|
end
|
51
69
|
|
52
70
|
def ids
|
53
|
-
|
71
|
+
if reversed?
|
72
|
+
execute { |key| db.zrevrangebyscore(key, @range.first, @range.last, limit: [offset, count]) }
|
73
|
+
else
|
74
|
+
execute { |key| db.zrangebyscore(key, @range.first, @range.last, limit: [offset, count]) }
|
75
|
+
end
|
54
76
|
end
|
55
77
|
|
56
78
|
def inspect
|
@@ -83,8 +105,12 @@ module Ohm
|
|
83
105
|
model.db
|
84
106
|
end
|
85
107
|
|
86
|
-
def each
|
87
|
-
|
108
|
+
def each
|
109
|
+
if block_given?
|
110
|
+
ids.each { |id| block.call(model.to_proc[id]) }
|
111
|
+
else
|
112
|
+
to_enum(:each)
|
113
|
+
end
|
88
114
|
end
|
89
115
|
|
90
116
|
def [](id)
|
@@ -111,16 +137,8 @@ module Ohm
|
|
111
137
|
end
|
112
138
|
|
113
139
|
class RangedSortedSet < SortedSet
|
114
|
-
def range
|
115
|
-
@options.fetch(:range)
|
116
|
-
end
|
117
|
-
|
118
|
-
def ids
|
119
|
-
execute { |key| db.zrangebyscore(key, range.begin, range.end, limit: [offset, count]) }
|
120
|
-
end
|
121
|
-
|
122
140
|
def size
|
123
|
-
execute { |key| db.zcount(key, range.
|
141
|
+
execute { |key| db.zcount(key, @range.first, @range.last) }
|
124
142
|
end
|
125
143
|
end
|
126
144
|
|
@@ -153,9 +171,8 @@ module Ohm
|
|
153
171
|
|
154
172
|
def sorted_index_key(attribute, dict={})
|
155
173
|
index_key = [key, "sorted", attribute]
|
156
|
-
if dict.
|
157
|
-
index_key
|
158
|
-
index_key << dict.values.first
|
174
|
+
if dict.size == 1
|
175
|
+
index_key.concat(dict.first)
|
159
176
|
elsif dict.keys.size > 1
|
160
177
|
raise ArgumentError
|
161
178
|
end
|
@@ -228,9 +245,7 @@ module Ohm
|
|
228
245
|
end
|
229
246
|
|
230
247
|
def update_sorted_indices
|
231
|
-
self.class.sorted_indices.each do |
|
232
|
-
attribute, options = *args
|
233
|
-
|
248
|
+
self.class.sorted_indices.each do |attribute, options|
|
234
249
|
opts = {}
|
235
250
|
if options.include?(:group_by)
|
236
251
|
group_by = options[:group_by]
|
data/ohm-sorted.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'ohm-sorted'
|
3
|
-
s.version = '0.3.
|
3
|
+
s.version = '0.3.2'
|
4
4
|
s.summary = "Sorted indices for Ohm."
|
5
5
|
s.description = "An plugin for Ohm that lets you create sorted indices."
|
6
6
|
s.author = "Federico Bond"
|
@@ -8,4 +8,8 @@ Gem::Specification.new do |s|
|
|
8
8
|
s.files = `git ls-files`.split("\n")
|
9
9
|
s.homepage = 'https://github.com/educabilia/ohm-sorted'
|
10
10
|
s.license = 'UNLICENSE'
|
11
|
+
|
12
|
+
s.add_development_dependency "appraisal"
|
13
|
+
s.add_development_dependency "ohm"
|
14
|
+
s.add_development_dependency "ohm-contrib"
|
11
15
|
end
|
data/test/sorted_test.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'test/unit'
|
2
|
-
|
2
|
+
require_relative '../lib/ohm/sorted'
|
3
3
|
|
4
4
|
class Post < Ohm::Model
|
5
5
|
include Ohm::Callbacks
|
@@ -158,4 +158,47 @@ class SortedTest < Test::Unit::TestCase
|
|
158
158
|
sorted_set = Post.sorted_find(:order)
|
159
159
|
assert !sorted_set.empty?
|
160
160
|
end
|
161
|
+
|
162
|
+
def test_sorted_find_reverse
|
163
|
+
posts = []
|
164
|
+
|
165
|
+
posts << Post.create(order: 3)
|
166
|
+
posts << Post.create(order: 2)
|
167
|
+
posts << Post.create(order: 1)
|
168
|
+
|
169
|
+
assert_equal posts, Post.sorted_find(:order).reverse.to_a
|
170
|
+
|
171
|
+
assert_equal posts[0..1], Post.sorted_find(:order).reverse.slice(0, 2).to_a
|
172
|
+
assert_equal posts[1..2], Post.sorted_find(:order).reverse.slice(1, 2).to_a
|
173
|
+
|
174
|
+
assert_equal posts.reverse, Post.sorted_find(:order).reverse.reverse.to_a
|
175
|
+
end
|
176
|
+
|
177
|
+
def test_sorted_find_reverse_range
|
178
|
+
posts = []
|
179
|
+
|
180
|
+
posts << Post.create(order: 3)
|
181
|
+
posts << Post.create(order: 2)
|
182
|
+
posts << Post.create(order: 1)
|
183
|
+
|
184
|
+
assert_equal posts, Post.sorted_find(:order).reverse.between(1, 3).to_a
|
185
|
+
|
186
|
+
assert_equal posts[0..1], Post.sorted_find(:order).reverse.between(2, 3).to_a
|
187
|
+
end
|
188
|
+
|
189
|
+
def test_sorted_find_reverse_range_conmutative
|
190
|
+
posts = []
|
191
|
+
|
192
|
+
posts << Post.create(order: 3)
|
193
|
+
posts << Post.create(order: 2)
|
194
|
+
posts << Post.create(order: 1)
|
195
|
+
|
196
|
+
assert_equal posts, Post.sorted_find(:order).between(1, 3).reverse.to_a
|
197
|
+
|
198
|
+
assert_equal posts[0..1], Post.sorted_find(:order).between(2, 3).reverse.to_a
|
199
|
+
end
|
200
|
+
|
201
|
+
def test_each_without_block_returns_enumerable
|
202
|
+
assert Post.sorted_find(:order).each.kind_of?(Enumerator)
|
203
|
+
end
|
161
204
|
end
|
metadata
CHANGED
@@ -1,15 +1,57 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ohm-sorted
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Federico Bond
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
12
|
-
dependencies:
|
11
|
+
date: 2013-10-07 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: appraisal
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ! '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ! '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: ohm
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ! '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ! '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: ohm-contrib
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ! '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
13
55
|
description: An plugin for Ohm that lets you create sorted indices.
|
14
56
|
email: federico@educabilia.com
|
15
57
|
executables: []
|
@@ -48,7 +90,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
48
90
|
version: '0'
|
49
91
|
requirements: []
|
50
92
|
rubyforge_project:
|
51
|
-
rubygems_version: 2.
|
93
|
+
rubygems_version: 2.1.5
|
52
94
|
signing_key:
|
53
95
|
specification_version: 4
|
54
96
|
summary: Sorted indices for Ohm.
|