mongoid_orderable 0.0.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.
- data/.gitignore +4 -0
- data/.rspec +1 -0
- data/.rvmrc +1 -0
- data/Gemfile +4 -0
- data/README +0 -0
- data/Rakefile +1 -0
- data/lib/mongoid/orderable.rb +163 -0
- data/lib/mongoid_orderable/mongoid/contexts/enumerable.rb +17 -0
- data/lib/mongoid_orderable/mongoid/contexts/mongo.rb +18 -0
- data/lib/mongoid_orderable/mongoid/criteria.rb +4 -0
- data/lib/mongoid_orderable/version.rb +3 -0
- data/lib/mongoid_orderable.rb +11 -0
- data/mongoid_orderable.gemspec +24 -0
- data/spec/mongoid/orderable_spec.rb +254 -0
- data/spec/spec_helper.rb +27 -0
- metadata +82 -0
data/.gitignore
ADDED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--colour
|
data/.rvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm use 1.9.2@mongoid_orderable --create
|
data/Gemfile
ADDED
data/README
ADDED
File without changes
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
@@ -0,0 +1,163 @@
|
|
1
|
+
module Mongoid::Orderable
|
2
|
+
extend ActiveSupport::Concern
|
3
|
+
|
4
|
+
included do
|
5
|
+
orderable
|
6
|
+
end
|
7
|
+
|
8
|
+
module ClassMethods
|
9
|
+
def orderable options = {}
|
10
|
+
configuration = {
|
11
|
+
:column => :position,
|
12
|
+
:scope => nil
|
13
|
+
}
|
14
|
+
|
15
|
+
configuration.update options if options.is_a?(Hash)
|
16
|
+
field configuration[:column], type: Integer
|
17
|
+
index configuration[:column]
|
18
|
+
|
19
|
+
configuration[:scope] = "#{configuration[:scope]}_id".to_sym if configuration[:scope].is_a?(Symbol) && configuration[:scope].to_s !~ /_id$/
|
20
|
+
|
21
|
+
case configuration[:scope]
|
22
|
+
when Symbol then
|
23
|
+
scope :orderable_scope, lambda { |document| where(configuration[:scope] => document.send(configuration[:scope])) }
|
24
|
+
when Proc then
|
25
|
+
scope :orderable_scope, configuration[:scope]
|
26
|
+
else
|
27
|
+
scope :orderable_scope, lambda { |document| where }
|
28
|
+
end
|
29
|
+
|
30
|
+
define_method :orderable_column do
|
31
|
+
configuration[:column]
|
32
|
+
end
|
33
|
+
|
34
|
+
before_save :add_to_list
|
35
|
+
after_destroy :remove_from_list
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
module InstanceMethods
|
40
|
+
|
41
|
+
def move_to! target_position
|
42
|
+
@move_to = target_position
|
43
|
+
save
|
44
|
+
end
|
45
|
+
alias_method :insert_at!, :move_to!
|
46
|
+
|
47
|
+
def move_to target_position
|
48
|
+
@move_to = target_position
|
49
|
+
end
|
50
|
+
alias_method :insert_at, :move_to
|
51
|
+
|
52
|
+
def move_to= target_position
|
53
|
+
@move_to = target_position
|
54
|
+
end
|
55
|
+
alias_method :insert_at=, :move_to=
|
56
|
+
|
57
|
+
[:top, :bottom].each do |symbol|
|
58
|
+
define_method "move_to_#{symbol}" do
|
59
|
+
move_to symbol
|
60
|
+
end
|
61
|
+
|
62
|
+
define_method "move_to_#{symbol}!" do
|
63
|
+
move_to! symbol
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
[:higher, :lower].each do |symbol|
|
68
|
+
define_method "move_#{symbol}" do
|
69
|
+
move_to symbol
|
70
|
+
end
|
71
|
+
|
72
|
+
define_method "move_#{symbol}!" do
|
73
|
+
move_to! symbol
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def first?
|
78
|
+
in_list? && orderable_position == 1
|
79
|
+
end
|
80
|
+
|
81
|
+
def last?
|
82
|
+
in_list? && orderable_position == bottom_orderable_position
|
83
|
+
end
|
84
|
+
|
85
|
+
def in_list?
|
86
|
+
!orderable_position.nil?
|
87
|
+
end
|
88
|
+
|
89
|
+
def add_to_list
|
90
|
+
apply_position @move_to
|
91
|
+
end
|
92
|
+
|
93
|
+
def remove_from_list
|
94
|
+
orderable_scoped.where(orderable_column.gt => orderable_position).inc(orderable_column => -1)
|
95
|
+
end
|
96
|
+
|
97
|
+
private
|
98
|
+
|
99
|
+
def orderable_position
|
100
|
+
send orderable_column
|
101
|
+
end
|
102
|
+
|
103
|
+
def orderable_position= value
|
104
|
+
send "#{orderable_column}=", value
|
105
|
+
end
|
106
|
+
|
107
|
+
def orderable_scoped
|
108
|
+
if embedded?
|
109
|
+
send(metadata.inverse).send(metadata.name).orderable_scope(self)
|
110
|
+
else
|
111
|
+
self.class.orderable_scope(self)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def orderable_scope_changed?
|
116
|
+
!orderable_scoped.where(:_id => _id).exists?
|
117
|
+
end
|
118
|
+
|
119
|
+
def apply_position target_position
|
120
|
+
if persisted? && !embedded? && orderable_scope_changed?
|
121
|
+
self.class.find(_id).remove_from_list
|
122
|
+
self.orderable_position = nil
|
123
|
+
end
|
124
|
+
|
125
|
+
return if !target_position && in_list?
|
126
|
+
|
127
|
+
target_position = target_position_to_position target_position
|
128
|
+
|
129
|
+
unless in_list?
|
130
|
+
orderable_scoped.where(orderable_column.gte => target_position).inc(orderable_column => 1)
|
131
|
+
else
|
132
|
+
orderable_scoped.where(orderable_column.gte => target_position, orderable_column.lt => orderable_position).inc(orderable_column => 1) if target_position < orderable_position
|
133
|
+
orderable_scoped.where(orderable_column.gt => orderable_position, orderable_column.lte => target_position).inc(orderable_column => -1) if target_position > orderable_position
|
134
|
+
end
|
135
|
+
|
136
|
+
self.orderable_position = target_position
|
137
|
+
end
|
138
|
+
|
139
|
+
def target_position_to_position target_position
|
140
|
+
target_position = :bottom unless target_position
|
141
|
+
|
142
|
+
target_position = case target_position.to_sym
|
143
|
+
when :top then 1
|
144
|
+
when :bottom then bottom_orderable_position
|
145
|
+
when :higher then orderable_position.pred
|
146
|
+
when :lower then orderable_position.next
|
147
|
+
end unless target_position.is_a? Numeric
|
148
|
+
|
149
|
+
target_position = 1 if target_position < 1
|
150
|
+
target_position = bottom_orderable_position if target_position > bottom_orderable_position
|
151
|
+
target_position
|
152
|
+
end
|
153
|
+
|
154
|
+
def bottom_orderable_position
|
155
|
+
@bottom_orderable_position = begin
|
156
|
+
max = orderable_scoped.max(orderable_column).to_i
|
157
|
+
in_list? ? max : max.next
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
end
|
162
|
+
|
163
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module MongoidOrderable #:nodoc:
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Contexts #:nodoc:
|
4
|
+
module Enumerable #:nodoc:
|
5
|
+
def inc attributes = {}
|
6
|
+
iterate do |doc|
|
7
|
+
attributes.each do |attribute, value|
|
8
|
+
doc.inc(attribute, value)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
Mongoid::Contexts::Enumerable.send :include, MongoidOrderable::Mongoid::Contexts::Enumerable
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module MongoidOrderable #:nodoc:
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Contexts #:nodoc:
|
4
|
+
module Mongo #:nodoc:
|
5
|
+
def inc attributes = {}
|
6
|
+
klass.collection.update(
|
7
|
+
selector,
|
8
|
+
{ "$inc" => attributes },
|
9
|
+
:multi => true,
|
10
|
+
:safe => ::Mongoid.persist_in_safe_mode
|
11
|
+
)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
Mongoid::Contexts::Mongo.send :include, MongoidOrderable::Mongoid::Contexts::Mongo
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'mongoid'
|
2
|
+
require 'mongoid_orderable/version'
|
3
|
+
require 'mongoid_orderable/mongoid/contexts/mongo'
|
4
|
+
require 'mongoid_orderable/mongoid/contexts/enumerable'
|
5
|
+
require 'mongoid_orderable/mongoid/criteria'
|
6
|
+
|
7
|
+
require 'mongoid/orderable'
|
8
|
+
|
9
|
+
module MongoidOrderable
|
10
|
+
|
11
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "mongoid_orderable/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "mongoid_orderable"
|
7
|
+
s.version = MongoidOrderable::VERSION
|
8
|
+
s.authors = ["pyromaniac"]
|
9
|
+
s.email = ["kinwizard@gmail.com"]
|
10
|
+
s.homepage = ""
|
11
|
+
s.summary = %q{Acts as list mongoid implementation}
|
12
|
+
s.description = %q{Gem allows mongoid model behave as orderable list}
|
13
|
+
|
14
|
+
s.rubyforge_project = "mongoid_orderable"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
# specify any dependencies here; for example:
|
22
|
+
s.add_development_dependency "rspec"
|
23
|
+
s.add_runtime_dependency "mongoid"
|
24
|
+
end
|
@@ -0,0 +1,254 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Mongoid::Orderable do
|
4
|
+
class SimpleOrderable
|
5
|
+
include Mongoid::Document
|
6
|
+
include Mongoid::Orderable
|
7
|
+
end
|
8
|
+
|
9
|
+
class ScopedGroup
|
10
|
+
include Mongoid::Document
|
11
|
+
|
12
|
+
has_many :scoped_orderables
|
13
|
+
end
|
14
|
+
|
15
|
+
class ScopedOrderable
|
16
|
+
include Mongoid::Document
|
17
|
+
include Mongoid::Orderable
|
18
|
+
|
19
|
+
belongs_to :scoped_group
|
20
|
+
|
21
|
+
orderable :scope => :group
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
|
26
|
+
class EmbedsOrderable
|
27
|
+
include Mongoid::Document
|
28
|
+
|
29
|
+
embeds_many :embedded_orderables
|
30
|
+
end
|
31
|
+
|
32
|
+
class EmbeddedOrderable
|
33
|
+
include Mongoid::Document
|
34
|
+
include Mongoid::Orderable
|
35
|
+
|
36
|
+
embedded_in :embeds_orderable
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
describe SimpleOrderable do
|
41
|
+
before :each do
|
42
|
+
SimpleOrderable.delete_all
|
43
|
+
5.times do
|
44
|
+
SimpleOrderable.create!
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def positions
|
49
|
+
SimpleOrderable.order_by(:position, :asc).map(&:position)
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'should have proper position column' do
|
53
|
+
SimpleOrderable.fields.key?('position').should be_true
|
54
|
+
SimpleOrderable.fields['position'].options[:type].should == Integer
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'should set proper position while creation' do
|
58
|
+
positions.should == [1, 2, 3, 4, 5]
|
59
|
+
end
|
60
|
+
|
61
|
+
describe 'removement' do
|
62
|
+
|
63
|
+
it 'top' do
|
64
|
+
SimpleOrderable.where(:position => 1).destroy
|
65
|
+
positions.should == [1, 2, 3, 4]
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'bottom' do
|
69
|
+
SimpleOrderable.where(:position => 5).destroy
|
70
|
+
positions.should == [1, 2, 3, 4]
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'middle' do
|
74
|
+
SimpleOrderable.where(:position => 3).destroy
|
75
|
+
positions.should == [1, 2, 3, 4]
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
|
80
|
+
describe 'inserting' do
|
81
|
+
|
82
|
+
it 'top' do
|
83
|
+
newbie = SimpleOrderable.create! :move_to => :top
|
84
|
+
positions.should == [1, 2, 3, 4, 5, 6]
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'bottom' do
|
88
|
+
newbie = SimpleOrderable.create! :move_to => :bottom
|
89
|
+
positions.should == [1, 2, 3, 4, 5, 6]
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'middle' do
|
93
|
+
newbie = SimpleOrderable.create! :move_to => 4
|
94
|
+
positions.should == [1, 2, 3, 4, 5, 6]
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
|
99
|
+
describe 'movement' do
|
100
|
+
|
101
|
+
it 'higher from top' do
|
102
|
+
record = SimpleOrderable.where(:position => 1).first
|
103
|
+
record.update_attributes :move_to => :higher
|
104
|
+
positions.should == [1, 2, 3, 4, 5]
|
105
|
+
record.reload.position.should == 1
|
106
|
+
end
|
107
|
+
|
108
|
+
it 'higher from bottom' do
|
109
|
+
record = SimpleOrderable.where(:position => 5).first
|
110
|
+
record.update_attributes :move_to => :higher
|
111
|
+
positions.should == [1, 2, 3, 4, 5]
|
112
|
+
record.reload.position.should == 4
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'higher from middle' do
|
116
|
+
record = SimpleOrderable.where(:position => 3).first
|
117
|
+
record.update_attributes :move_to => :higher
|
118
|
+
positions.should == [1, 2, 3, 4, 5]
|
119
|
+
record.reload.position.should == 2
|
120
|
+
end
|
121
|
+
|
122
|
+
it 'lower from top' do
|
123
|
+
record = SimpleOrderable.where(:position => 1).first
|
124
|
+
record.update_attributes :move_to => :lower
|
125
|
+
positions.should == [1, 2, 3, 4, 5]
|
126
|
+
record.reload.position.should == 2
|
127
|
+
end
|
128
|
+
|
129
|
+
it 'lower from bottom' do
|
130
|
+
record = SimpleOrderable.where(:position => 5).first
|
131
|
+
record.update_attributes :move_to => :lower
|
132
|
+
positions.should == [1, 2, 3, 4, 5]
|
133
|
+
record.reload.position.should == 5
|
134
|
+
end
|
135
|
+
|
136
|
+
it 'lower from middle' do
|
137
|
+
record = SimpleOrderable.where(:position => 3).first
|
138
|
+
record.update_attributes :move_to => :lower
|
139
|
+
positions.should == [1, 2, 3, 4, 5]
|
140
|
+
record.reload.position.should == 4
|
141
|
+
end
|
142
|
+
|
143
|
+
it "does nothing if position not change" do
|
144
|
+
record = SimpleOrderable.where(:position => 3).first
|
145
|
+
record.save
|
146
|
+
positions.should == [1, 2, 3, 4, 5]
|
147
|
+
record.reload.position.should == 3
|
148
|
+
end
|
149
|
+
|
150
|
+
end
|
151
|
+
|
152
|
+
end
|
153
|
+
|
154
|
+
describe ScopedOrderable do
|
155
|
+
before :each do
|
156
|
+
ScopedOrderable.delete_all
|
157
|
+
2.times do
|
158
|
+
ScopedOrderable.create! :group_id => 1
|
159
|
+
end
|
160
|
+
3.times do
|
161
|
+
ScopedOrderable.create! :group_id => 2
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
def positions
|
166
|
+
ScopedOrderable.order_by([:group_id, :asc], [:position, :asc]).map(&:position)
|
167
|
+
end
|
168
|
+
|
169
|
+
it 'should set proper position while creation' do
|
170
|
+
positions.should == [1, 2, 1, 2, 3]
|
171
|
+
end
|
172
|
+
|
173
|
+
describe 'removement' do
|
174
|
+
|
175
|
+
it 'top' do
|
176
|
+
ScopedOrderable.where(:position => 1, :group_id => 1).destroy
|
177
|
+
positions.should == [1, 1, 2, 3]
|
178
|
+
end
|
179
|
+
|
180
|
+
it 'bottom' do
|
181
|
+
ScopedOrderable.where(:position => 3, :group_id => 2).destroy
|
182
|
+
positions.should == [1, 2, 1, 2]
|
183
|
+
end
|
184
|
+
|
185
|
+
it 'middle' do
|
186
|
+
ScopedOrderable.where(:position => 2, :group_id => 2).destroy
|
187
|
+
positions.should == [1, 2, 1, 2]
|
188
|
+
end
|
189
|
+
|
190
|
+
end
|
191
|
+
|
192
|
+
describe 'inserting' do
|
193
|
+
|
194
|
+
it 'top' do
|
195
|
+
newbie = ScopedOrderable.create! :move_to => :top, :group_id => 1
|
196
|
+
positions.should == [1, 2, 3, 1, 2, 3]
|
197
|
+
end
|
198
|
+
|
199
|
+
it 'bottom' do
|
200
|
+
newbie = ScopedOrderable.create! :move_to => :bottom, :group_id => 2
|
201
|
+
positions.should == [1, 2, 1, 2, 3, 4]
|
202
|
+
end
|
203
|
+
|
204
|
+
it 'middle' do
|
205
|
+
newbie = ScopedOrderable.create! :move_to => 2, :group_id => 2
|
206
|
+
positions.should == [1, 2, 1, 2, 3, 4]
|
207
|
+
end
|
208
|
+
|
209
|
+
end
|
210
|
+
|
211
|
+
describe "scope movement" do
|
212
|
+
|
213
|
+
it "without point on position" do
|
214
|
+
record = ScopedOrderable.where(:group_id => 2, :position => 2).first
|
215
|
+
record.update_attributes :group_id => 1
|
216
|
+
positions.should == [1, 2, 3, 1, 2]
|
217
|
+
record.reload.position.should == 3
|
218
|
+
end
|
219
|
+
|
220
|
+
it "with point on position" do
|
221
|
+
record = ScopedOrderable.where(:group_id => 2, :position => 2).first
|
222
|
+
record.update_attributes :group_id => 1, :move_to => :top
|
223
|
+
positions.should == [1, 2, 3, 1, 2]
|
224
|
+
record.reload.position.should == 1
|
225
|
+
end
|
226
|
+
|
227
|
+
end
|
228
|
+
|
229
|
+
end
|
230
|
+
|
231
|
+
describe EmbeddedOrderable do
|
232
|
+
before :each do
|
233
|
+
EmbedsOrderable.delete_all
|
234
|
+
eo = EmbedsOrderable.create!
|
235
|
+
2.times do
|
236
|
+
eo.embedded_orderables.create!
|
237
|
+
end
|
238
|
+
eo = EmbedsOrderable.create!
|
239
|
+
3.times do
|
240
|
+
eo.embedded_orderables.create!
|
241
|
+
end
|
242
|
+
end
|
243
|
+
|
244
|
+
def positions
|
245
|
+
EmbedsOrderable.order_by(:position).all.map { |eo| eo.embedded_orderables.order_by(:position).map(&:position) }
|
246
|
+
end
|
247
|
+
|
248
|
+
it 'should set proper position while creation' do
|
249
|
+
positions.should == [[1, 2], [1, 2, 3]]
|
250
|
+
end
|
251
|
+
|
252
|
+
end
|
253
|
+
|
254
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'bundler'
|
2
|
+
Bundler.require
|
3
|
+
|
4
|
+
DATABASE_ID = Process.pid
|
5
|
+
|
6
|
+
Mongoid.configure do |config|
|
7
|
+
database = Mongo::Connection.new.db("mongoid_#{DATABASE_ID}")
|
8
|
+
database.add_user("mongoid", "test")
|
9
|
+
config.master = database
|
10
|
+
config.logger = nil
|
11
|
+
end
|
12
|
+
|
13
|
+
RSpec.configure do |config|
|
14
|
+
config.mock_with :rspec
|
15
|
+
|
16
|
+
config.before :suite do
|
17
|
+
#DatabaseCleaner[:mongoid].strategy = :truncation
|
18
|
+
end
|
19
|
+
|
20
|
+
config.after :each do
|
21
|
+
#DatabaseCleaner[:mongoid].clean
|
22
|
+
end
|
23
|
+
|
24
|
+
config.after(:suite) do
|
25
|
+
Mongoid.master.connection.drop_database("mongoid_#{DATABASE_ID}")
|
26
|
+
end
|
27
|
+
end
|
metadata
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mongoid_orderable
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- pyromaniac
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-11-11 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rspec
|
16
|
+
requirement: &23255180 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *23255180
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: mongoid
|
27
|
+
requirement: &23303440 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *23303440
|
36
|
+
description: Gem allows mongoid model behave as orderable list
|
37
|
+
email:
|
38
|
+
- kinwizard@gmail.com
|
39
|
+
executables: []
|
40
|
+
extensions: []
|
41
|
+
extra_rdoc_files: []
|
42
|
+
files:
|
43
|
+
- .gitignore
|
44
|
+
- .rspec
|
45
|
+
- .rvmrc
|
46
|
+
- Gemfile
|
47
|
+
- README
|
48
|
+
- Rakefile
|
49
|
+
- lib/mongoid/orderable.rb
|
50
|
+
- lib/mongoid_orderable.rb
|
51
|
+
- lib/mongoid_orderable/mongoid/contexts/enumerable.rb
|
52
|
+
- lib/mongoid_orderable/mongoid/contexts/mongo.rb
|
53
|
+
- lib/mongoid_orderable/mongoid/criteria.rb
|
54
|
+
- lib/mongoid_orderable/version.rb
|
55
|
+
- mongoid_orderable.gemspec
|
56
|
+
- spec/mongoid/orderable_spec.rb
|
57
|
+
- spec/spec_helper.rb
|
58
|
+
homepage: ''
|
59
|
+
licenses: []
|
60
|
+
post_install_message:
|
61
|
+
rdoc_options: []
|
62
|
+
require_paths:
|
63
|
+
- lib
|
64
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
71
|
+
none: false
|
72
|
+
requirements:
|
73
|
+
- - ! '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
requirements: []
|
77
|
+
rubyforge_project: mongoid_orderable
|
78
|
+
rubygems_version: 1.8.6
|
79
|
+
signing_key:
|
80
|
+
specification_version: 3
|
81
|
+
summary: Acts as list mongoid implementation
|
82
|
+
test_files: []
|