mongoid_orderable 4.0.0 → 4.1.0
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 +8 -8
- data/.travis.yml +3 -7
- data/CHANGELOG.md +9 -1
- data/README.md +16 -6
- data/lib/mongoid/orderable.rb +48 -2
- data/lib/mongoid_orderable.rb +8 -0
- data/lib/mongoid_orderable/version.rb +1 -1
- data/spec/mongoid/orderable_spec.rb +103 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
YThjMDBhYzQ5YmQ4NzJlZWRjMjdhZTIyNTdmMTkwMmE0YmZlZWI5NQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ZjBmZDk1OTM1MmE1ZGNiMmFiMDU1Y2IxYTAwMzZlZTkzZWFiMjhlYQ==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NDc5NWY5NTlkMDYzNWMzZGI3OGRiNjc0MDEzNjdhYWJiMDA5MTkzOTE5OGMx
|
10
|
+
YzA4NWZmNmZmZTJmNTZmNTdlNDFjZDk2NmJkOGQyNDMyMTM2Mjg2ZjU5NGE1
|
11
|
+
MmI0YzU2MmVhODdmMWY1MGI5ZDhhZTVkNGQ0NjRlNzNlMzI4ZDU=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
NTYyN2E1ZTVlNDQ5YzZhNDY5Y2UyNDMzZWVhZWQ4YWZmMTJkNTI0ZDNhNzIy
|
14
|
+
ZDg0MTkyZjY3YWVkNzdmNWM5ZDY3ZWJiNDMxYzk2NDM0ZWUxOTFiMmMxMWEy
|
15
|
+
ZjE2MmRiZDcyY2U5NTg1MjU3ODkwOGIwMDIxMDY0NDMyMmExMzQ=
|
data/.travis.yml
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
rvm:
|
2
2
|
- 1.8.7
|
3
|
-
- 1.9.2
|
4
3
|
- 1.9.3
|
5
|
-
-
|
6
|
-
|
4
|
+
- 2.0.0
|
5
|
+
- 2.1.1
|
6
|
+
# - rbx
|
7
7
|
|
8
8
|
env:
|
9
9
|
- MONGOID_VERSION=2
|
@@ -16,9 +16,5 @@ matrix:
|
|
16
16
|
env: MONGOID_VERSION=3
|
17
17
|
- rvm: 1.8.7
|
18
18
|
env: MONGOID_VERSION=4
|
19
|
-
- rvm: 1.9.2
|
20
|
-
env: MONGOID_VERSION=3
|
21
|
-
- rvm: 1.9.2
|
22
|
-
env: MONGOID_VERSION=4
|
23
19
|
|
24
20
|
services: mongodb
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,13 @@
|
|
1
|
+
# master
|
2
|
+
|
3
|
+
# 4.1.0
|
4
|
+
|
5
|
+
* Resolving scope foreign key form passed relation name (@dsci)
|
6
|
+
* Fix: relation metadata quering (@pjkelly)
|
7
|
+
* `previous_items` and `next_items` methods (@mrjlynch)
|
8
|
+
|
1
9
|
# 4.0.0
|
2
10
|
|
3
11
|
* Semantic versioning
|
4
12
|
* Added Mongoid 4 support (@dblock)
|
5
|
-
* Fixes by @johnnyshields and @zhengjia
|
13
|
+
* Fixes by @johnnyshields and @zhengjia
|
data/README.md
CHANGED
@@ -7,8 +7,8 @@ Mongoid::Orderable is a ordered list implementation for your mongoid models.
|
|
7
7
|
# Why?
|
8
8
|
|
9
9
|
* It uses native mongo batch increment feature
|
10
|
-
* It supports
|
11
|
-
* It
|
10
|
+
* It supports mutators api
|
11
|
+
* It correctly assigns the position while moving document between scopes
|
12
12
|
* It supports mongoid 2, 3 and 4
|
13
13
|
|
14
14
|
# How?
|
@@ -25,12 +25,16 @@ class Item
|
|
25
25
|
include Mongoid::Orderable
|
26
26
|
|
27
27
|
# belongs_to :group
|
28
|
+
# belongs_to :drawer, class_name: "Office::Drawer",
|
29
|
+
# foreign_key: "legacy_drawer_key_id"
|
28
30
|
|
29
31
|
# orderable
|
30
|
-
# orderable :
|
31
|
-
# orderable :
|
32
|
-
# orderable :
|
33
|
-
# orderable :
|
32
|
+
# orderable scope: :group, column: :pos
|
33
|
+
# orderable scope: :drawer, column: :pos # resolves scope foreign key from relation
|
34
|
+
# orderable scope: 'drawer', column: :pos # but if you pass a string - it will use it as is, as the column name for scope
|
35
|
+
# orderable scope: lambda { |document| where(group_id: document.group_id) }
|
36
|
+
# orderable index: false # this one if you want specify indexes manually
|
37
|
+
# orderable base: 0 # count position from zero as the top-most value (1 is the default value)
|
34
38
|
end
|
35
39
|
```
|
36
40
|
|
@@ -52,6 +56,12 @@ item.move_to_top
|
|
52
56
|
item.move_to_bottom
|
53
57
|
item.move_higher
|
54
58
|
item.move_lower
|
59
|
+
|
60
|
+
item.next_items # return a collection of items higher on the list
|
61
|
+
item.previous_items # return a collection of items lower on the list
|
62
|
+
|
63
|
+
item.next_item # returns the next item in the list
|
64
|
+
item.previous_item # returns the previous item in the list
|
55
65
|
```
|
56
66
|
|
57
67
|
# Contributing
|
data/lib/mongoid/orderable.rb
CHANGED
@@ -11,7 +11,17 @@ module Mongoid::Orderable
|
|
11
11
|
}
|
12
12
|
|
13
13
|
configuration.merge! options if options.is_a?(Hash)
|
14
|
-
|
14
|
+
|
15
|
+
if configuration[:scope].is_a?(Symbol) && configuration[:scope].to_s !~ /_id$/
|
16
|
+
scope_relation = self.relations[configuration[:scope].to_s]
|
17
|
+
if scope_relation
|
18
|
+
configuration[:scope] = scope_relation.key.to_sym
|
19
|
+
else
|
20
|
+
configuration[:scope] = "#{configuration[:scope]}_id".to_sym
|
21
|
+
end
|
22
|
+
elsif configuration[:scope].is_a?(String)
|
23
|
+
configuration[:scope] = configuration[:scope].to_sym
|
24
|
+
end
|
15
25
|
|
16
26
|
field configuration[:column], orderable_field_opts(configuration)
|
17
27
|
if configuration[:index]
|
@@ -58,6 +68,42 @@ module Mongoid::Orderable
|
|
58
68
|
end
|
59
69
|
end
|
60
70
|
|
71
|
+
##
|
72
|
+
# Returns items above the current document.
|
73
|
+
# Items with a position lower than this document's position.
|
74
|
+
def previous_items
|
75
|
+
orderable_scoped.where(orderable_column.lt => self.position)
|
76
|
+
end
|
77
|
+
alias_method :prev_items, :previous_items
|
78
|
+
|
79
|
+
##
|
80
|
+
# Returns items below the current document.
|
81
|
+
# Items with a position greater than this document's position.
|
82
|
+
def next_items
|
83
|
+
orderable_scoped.where(orderable_column.gt => self.position)
|
84
|
+
end
|
85
|
+
|
86
|
+
# returns the previous item in the list
|
87
|
+
def previous_item
|
88
|
+
if previous_items.present?
|
89
|
+
previous_position = self.position - 1
|
90
|
+
orderable_scoped.where(:position => previous_position).first
|
91
|
+
else
|
92
|
+
nil
|
93
|
+
end
|
94
|
+
end
|
95
|
+
alias_method :prev_item, :previous_item
|
96
|
+
|
97
|
+
# returns the next item in the list
|
98
|
+
def next_item
|
99
|
+
if next_items.present?
|
100
|
+
next_position = self.position + 1
|
101
|
+
orderable_scoped.where(:position => next_position).first
|
102
|
+
else
|
103
|
+
nil
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
61
107
|
def move_to! target_position
|
62
108
|
@move_to = target_position
|
63
109
|
save
|
@@ -126,7 +172,7 @@ private
|
|
126
172
|
|
127
173
|
def orderable_scoped
|
128
174
|
if embedded?
|
129
|
-
send(metadata.inverse).send(metadata.name).orderable_scope(self)
|
175
|
+
send(MongoidOrderable.metadata(self).inverse).send(MongoidOrderable.metadata(self).name).orderable_scope(self)
|
130
176
|
else
|
131
177
|
(orderable_inherited_class || self.class).orderable_scope(self)
|
132
178
|
end
|
data/lib/mongoid_orderable.rb
CHANGED
@@ -13,6 +13,14 @@ module MongoidOrderable
|
|
13
13
|
instance.inc(attribute => value)
|
14
14
|
end
|
15
15
|
end
|
16
|
+
|
17
|
+
def self.metadata instance
|
18
|
+
if MongoidOrderable.mongoid2? || MongoidOrderable.mongoid3?
|
19
|
+
instance.metadata
|
20
|
+
else
|
21
|
+
instance.relation_metadata
|
22
|
+
end
|
23
|
+
end
|
16
24
|
end
|
17
25
|
|
18
26
|
require 'mongoid'
|
@@ -25,6 +25,15 @@ describe Mongoid::Orderable do
|
|
25
25
|
orderable :scope => :group
|
26
26
|
end
|
27
27
|
|
28
|
+
class StringScopedOrderable
|
29
|
+
include Mongoid::Document
|
30
|
+
include Mongoid::Orderable
|
31
|
+
|
32
|
+
field :some_scope, :type => Integer
|
33
|
+
|
34
|
+
orderable :scope => 'some_scope'
|
35
|
+
end
|
36
|
+
|
28
37
|
class EmbedsOrderable
|
29
38
|
include Mongoid::Document
|
30
39
|
|
@@ -74,6 +83,16 @@ describe Mongoid::Orderable do
|
|
74
83
|
class Orange < Fruit
|
75
84
|
end
|
76
85
|
|
86
|
+
class ForeignKeyDiffersOrderable
|
87
|
+
include Mongoid::Document
|
88
|
+
include Mongoid::Orderable
|
89
|
+
|
90
|
+
belongs_to :different_scope, :class_name => "ForeignKeyDiffersOrderable",
|
91
|
+
:foreign_key => "different_orderable_id"
|
92
|
+
|
93
|
+
orderable :scope => :different_scope
|
94
|
+
end
|
95
|
+
|
77
96
|
describe SimpleOrderable do
|
78
97
|
|
79
98
|
before :each do
|
@@ -200,6 +219,21 @@ describe Mongoid::Orderable do
|
|
200
219
|
record.reload.position.should == 3
|
201
220
|
end
|
202
221
|
end
|
222
|
+
|
223
|
+
describe 'utiity methods' do
|
224
|
+
|
225
|
+
it "should return a collection of items lower/higher on the list for next_items/previous_items" do
|
226
|
+
record_1 = SimpleOrderable.where(:position => 1).first
|
227
|
+
record_2 = SimpleOrderable.where(:position => 2).first
|
228
|
+
record_3 = SimpleOrderable.where(:position => 3).first
|
229
|
+
record_4 = SimpleOrderable.where(:position => 4).first
|
230
|
+
record_5 = SimpleOrderable.where(:position => 5).first
|
231
|
+
expect(record_1.next_items.to_a).to eq([record_2, record_3, record_4, record_5])
|
232
|
+
expect(record_5.previous_items.to_a).to eq([record_1, record_2, record_3, record_4])
|
233
|
+
expect(record_3.previous_items.to_a).to eq([record_1, record_2])
|
234
|
+
expect(record_3.next_items.to_a).to eq([record_4, record_5])
|
235
|
+
end
|
236
|
+
end
|
203
237
|
end
|
204
238
|
|
205
239
|
describe ScopedOrderable do
|
@@ -321,6 +355,38 @@ describe Mongoid::Orderable do
|
|
321
355
|
end
|
322
356
|
end
|
323
357
|
end
|
358
|
+
|
359
|
+
describe 'utiity methods' do
|
360
|
+
|
361
|
+
it "should return a collection of items lower/higher on the list for next_items/previous_items" do
|
362
|
+
record_1 = SimpleOrderable.where(:position => 1).first
|
363
|
+
record_2 = SimpleOrderable.where(:position => 2).first
|
364
|
+
record_3 = SimpleOrderable.where(:position => 3).first
|
365
|
+
record_4 = SimpleOrderable.where(:position => 4).first
|
366
|
+
record_5 = SimpleOrderable.where(:position => 5).first
|
367
|
+
expect(record_1.next_items.to_a).to eq([record_2, record_3, record_4, record_5])
|
368
|
+
expect(record_5.previous_items.to_a).to eq([record_1, record_2, record_3, record_4])
|
369
|
+
expect(record_3.previous_items.to_a).to eq([record_1, record_2])
|
370
|
+
expect(record_3.next_items.to_a).to eq([record_4, record_5])
|
371
|
+
# next_item & previous_item testing
|
372
|
+
expect(record_1.next_item).to eq(record_2)
|
373
|
+
expect(record_2.previous_item).to eq(record_1)
|
374
|
+
expect(record_1.previous_item).to eq(nil)
|
375
|
+
expect(record_5.next_item).to eq(nil)
|
376
|
+
end
|
377
|
+
end
|
378
|
+
end
|
379
|
+
|
380
|
+
describe StringScopedOrderable do
|
381
|
+
|
382
|
+
it 'uses the foreign key of the relationship as scope' do
|
383
|
+
orderable1 = StringScopedOrderable.create(:some_scope => 1)
|
384
|
+
orderable2 = StringScopedOrderable.create(:some_scope => 1)
|
385
|
+
orderable3 = StringScopedOrderable.create(:some_scope => 2)
|
386
|
+
expect(orderable1.position).to eq 1
|
387
|
+
expect(orderable2.position).to eq 2
|
388
|
+
expect(orderable3.position).to eq 1
|
389
|
+
end
|
324
390
|
end
|
325
391
|
|
326
392
|
describe EmbeddedOrderable do
|
@@ -492,6 +558,26 @@ describe Mongoid::Orderable do
|
|
492
558
|
record.reload.position.should == 3
|
493
559
|
end
|
494
560
|
end
|
561
|
+
|
562
|
+
describe 'utiity methods' do
|
563
|
+
|
564
|
+
it "should return a collection of items lower/higher on the list for next_items/previous_items" do
|
565
|
+
record_1 = SimpleOrderable.where(:position => 1).first
|
566
|
+
record_2 = SimpleOrderable.where(:position => 2).first
|
567
|
+
record_3 = SimpleOrderable.where(:position => 3).first
|
568
|
+
record_4 = SimpleOrderable.where(:position => 4).first
|
569
|
+
record_5 = SimpleOrderable.where(:position => 5).first
|
570
|
+
expect(record_1.next_items.to_a).to eq([record_2, record_3, record_4, record_5])
|
571
|
+
expect(record_5.previous_items.to_a).to eq([record_1, record_2, record_3, record_4])
|
572
|
+
expect(record_3.previous_items.to_a).to eq([record_1, record_2])
|
573
|
+
expect(record_3.next_items.to_a).to eq([record_4, record_5])
|
574
|
+
# next_item & previous_item testing
|
575
|
+
expect(record_1.next_item).to eq(record_2)
|
576
|
+
expect(record_2.previous_item).to eq(record_1)
|
577
|
+
expect(record_1.previous_item).to eq(nil)
|
578
|
+
expect(record_5.next_item).to eq(nil)
|
579
|
+
end
|
580
|
+
end
|
495
581
|
end
|
496
582
|
|
497
583
|
describe Fruit do
|
@@ -503,4 +589,21 @@ describe Mongoid::Orderable do
|
|
503
589
|
fruit2.position.should == 2
|
504
590
|
end
|
505
591
|
end
|
592
|
+
|
593
|
+
describe ForeignKeyDiffersOrderable do
|
594
|
+
|
595
|
+
it 'uses the foreign key of the relationship as scope' do
|
596
|
+
orderable1, orderable2, orderable3 = nil
|
597
|
+
parent_scope1 = ForeignKeyDiffersOrderable.create
|
598
|
+
parent_scope2 = ForeignKeyDiffersOrderable.create
|
599
|
+
expect do
|
600
|
+
orderable1 = ForeignKeyDiffersOrderable.create(:different_scope => parent_scope1)
|
601
|
+
orderable2 = ForeignKeyDiffersOrderable.create(:different_scope => parent_scope1)
|
602
|
+
orderable3 = ForeignKeyDiffersOrderable.create(:different_scope => parent_scope2)
|
603
|
+
end.to_not raise_error
|
604
|
+
expect(orderable1.position).to eq 1
|
605
|
+
expect(orderable2.position).to eq 2
|
606
|
+
expect(orderable3.position).to eq 1
|
607
|
+
end
|
608
|
+
end
|
506
609
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongoid_orderable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- pyromaniac
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-03-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -96,7 +96,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
96
96
|
version: '0'
|
97
97
|
requirements: []
|
98
98
|
rubyforge_project: mongoid_orderable
|
99
|
-
rubygems_version: 2.1
|
99
|
+
rubygems_version: 2.2.1
|
100
100
|
signing_key:
|
101
101
|
specification_version: 4
|
102
102
|
summary: Acts as list mongoid implementation
|