mongoid_orderable 5.2.0 → 6.0.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 +5 -5
- data/CHANGELOG.md +73 -58
- data/LICENSE.txt +20 -20
- data/README.md +256 -150
- data/Rakefile +24 -21
- data/lib/config/locales/en.yml +12 -9
- data/lib/mongoid/orderable.rb +29 -20
- data/lib/mongoid/orderable/configs/field_config.rb +79 -0
- data/lib/mongoid/orderable/configs/global_config.rb +26 -0
- data/lib/mongoid/orderable/engine.rb +204 -0
- data/lib/mongoid/orderable/errors/invalid_target_position.rb +19 -15
- data/lib/mongoid/orderable/errors/transaction_failed.rb +20 -0
- data/lib/mongoid/orderable/generators/base.rb +21 -0
- data/lib/mongoid/orderable/generators/helpers.rb +29 -0
- data/lib/mongoid/orderable/generators/listable.rb +41 -0
- data/lib/mongoid/orderable/generators/lock_collection.rb +37 -0
- data/lib/mongoid/orderable/generators/movable.rb +62 -0
- data/lib/mongoid/orderable/generators/position.rb +26 -0
- data/lib/mongoid/orderable/generators/scope.rb +26 -0
- data/lib/mongoid/orderable/installer.rb +63 -0
- data/lib/mongoid/orderable/mixins/callbacks.rb +29 -0
- data/lib/mongoid/orderable/mixins/helpers.rb +39 -0
- data/lib/mongoid/orderable/mixins/listable.rb +49 -0
- data/lib/mongoid/orderable/mixins/movable.rb +60 -0
- data/lib/mongoid/orderable/version.rb +7 -0
- data/lib/mongoid_orderable.rb +29 -56
- data/spec/mongoid/orderable_spec.rb +1486 -1380
- data/spec/spec_helper.rb +21 -21
- metadata +44 -41
- data/.gitignore +0 -4
- data/.rspec +0 -2
- data/.rubocop.yml +0 -6
- data/.rubocop_todo.yml +0 -88
- data/.rvmrc +0 -1
- data/.travis.yml +0 -48
- data/CONTRIBUTING.md +0 -118
- data/Dangerfile +0 -1
- data/Gemfile +0 -26
- data/RELEASING.md +0 -68
- data/lib/mongoid/orderable/callbacks.rb +0 -79
- data/lib/mongoid/orderable/configuration.rb +0 -58
- data/lib/mongoid/orderable/errors.rb +0 -2
- data/lib/mongoid/orderable/errors/mongoid_orderable_error.rb +0 -6
- data/lib/mongoid/orderable/generator.rb +0 -33
- data/lib/mongoid/orderable/generator/helpers.rb +0 -27
- data/lib/mongoid/orderable/generator/listable.rb +0 -39
- data/lib/mongoid/orderable/generator/movable.rb +0 -60
- data/lib/mongoid/orderable/generator/position.rb +0 -24
- data/lib/mongoid/orderable/generator/scope.rb +0 -17
- data/lib/mongoid/orderable/helpers.rb +0 -49
- data/lib/mongoid/orderable/listable.rb +0 -47
- data/lib/mongoid/orderable/movable.rb +0 -56
- data/lib/mongoid/orderable/orderable_class.rb +0 -47
- data/lib/mongoid_orderable/mongoid/contextual/memory.rb +0 -15
- data/lib/mongoid_orderable/version.rb +0 -3
- data/mongoid_orderable.gemspec +0 -26
data/Dangerfile
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
danger.import_dangerfile(gem: 'mongoid-danger')
|
data/Gemfile
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
source 'http://rubygems.org'
|
2
|
-
|
3
|
-
# Specify your gem's dependencies in mongoid_orderable.gemspec
|
4
|
-
gemspec
|
5
|
-
|
6
|
-
case version = ENV['MONGOID_VERSION'] || '7'
|
7
|
-
when 'HEAD'
|
8
|
-
gem 'mongoid', github: 'mongodb/mongoid'
|
9
|
-
when /^7/
|
10
|
-
gem 'mongoid', '~> 7.0'
|
11
|
-
when /^6/
|
12
|
-
gem 'mongoid', '~> 6.0'
|
13
|
-
when /^5/
|
14
|
-
gem 'mongoid', '~> 5.0'
|
15
|
-
when /^4/
|
16
|
-
gem 'mongoid', '~> 4.0'
|
17
|
-
when /^3/
|
18
|
-
gem 'mongoid', '~> 3.1'
|
19
|
-
else
|
20
|
-
gem 'mongoid', version
|
21
|
-
end
|
22
|
-
|
23
|
-
group :test do
|
24
|
-
gem 'rubocop', '0.45.0'
|
25
|
-
gem 'mongoid-danger', '~> 0.1.0', require: false
|
26
|
-
end
|
data/RELEASING.md
DELETED
@@ -1,68 +0,0 @@
|
|
1
|
-
Releasing Mongoid::Orderable
|
2
|
-
============================
|
3
|
-
|
4
|
-
There're no particular rules about when to release mongoid_orderable. Release bug fixes frequently, features not so frequently and breaking API changes rarely.
|
5
|
-
|
6
|
-
### Release
|
7
|
-
|
8
|
-
Run tests, check that all tests succeed locally.
|
9
|
-
|
10
|
-
```
|
11
|
-
bundle install
|
12
|
-
rake
|
13
|
-
```
|
14
|
-
|
15
|
-
Check that the last build succeeded in [Travis CI](https://travis-ci.org/mongoid/mongoid_orderable) for all supported platforms.
|
16
|
-
|
17
|
-
Increment the version, modify [lib/mongoid_orderable/version.rb](lib/mongoid_orderable/version.rb).
|
18
|
-
|
19
|
-
* Increment the third number if the release has bug fixes and/or very minor features, only (eg. change `0.5.1` to `0.5.2`).
|
20
|
-
* Increment the second number if the release contains major features or breaking API changes (eg. change `0.5.1` to `0.4.0`).
|
21
|
-
|
22
|
-
Change "Next Release" in [CHANGELOG.md](CHANGELOG.md) to the new version.
|
23
|
-
|
24
|
-
```
|
25
|
-
### 0.4.0 (2014-01-27)
|
26
|
-
```
|
27
|
-
|
28
|
-
Remove the line with "Your contribution here.", since there will be no more contributions to this release.
|
29
|
-
|
30
|
-
Commit your changes.
|
31
|
-
|
32
|
-
```
|
33
|
-
git add CHANGELOG.md lib/mongoid_orderable/version.rb
|
34
|
-
git commit -m "Preparing for release, 0.4.0."
|
35
|
-
git push origin master
|
36
|
-
```
|
37
|
-
|
38
|
-
Release.
|
39
|
-
|
40
|
-
```
|
41
|
-
$ rake release
|
42
|
-
|
43
|
-
mongoid_orderable 0.4.0 built to pkg/mongoid_orderable-0.4.0.gem.
|
44
|
-
Tagged v0.4.0.
|
45
|
-
Pushed git commits and tags.
|
46
|
-
Pushed mongoid_orderable 0.4.0 to rubygems.org.
|
47
|
-
```
|
48
|
-
|
49
|
-
### Prepare for the Next Version
|
50
|
-
|
51
|
-
Add the next release to [CHANGELOG.md](CHANGELOG.md).
|
52
|
-
|
53
|
-
```
|
54
|
-
Next Release
|
55
|
-
============
|
56
|
-
|
57
|
-
* Your contribution here.
|
58
|
-
```
|
59
|
-
|
60
|
-
Increment the minor version, modify [lib/mongoid_orderable/version.rb](lib/mongoid_orderable/version.rb).
|
61
|
-
|
62
|
-
Commit your changes.
|
63
|
-
|
64
|
-
```
|
65
|
-
git add CHANGELOG.md lib/mongoid_orderable/version.rb
|
66
|
-
git commit -m "Preparing for next release, 0.4.1."
|
67
|
-
git push origin master
|
68
|
-
```
|
@@ -1,79 +0,0 @@
|
|
1
|
-
module Mongoid
|
2
|
-
module Orderable
|
3
|
-
module Callbacks
|
4
|
-
extend ActiveSupport::Concern
|
5
|
-
|
6
|
-
included do
|
7
|
-
protected
|
8
|
-
|
9
|
-
def add_to_list
|
10
|
-
orderable_keys.each do |column|
|
11
|
-
apply_position column, move_all[column]
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
def remove_from_list
|
16
|
-
orderable_keys.each do |column|
|
17
|
-
remove_position_from_list column
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def remove_position_from_list(column)
|
22
|
-
col = orderable_column(column)
|
23
|
-
pos = orderable_position(column)
|
24
|
-
MongoidOrderable.inc orderable_scoped(column).where(col.gt => pos), col, -1
|
25
|
-
end
|
26
|
-
|
27
|
-
def apply_position(column, target_position)
|
28
|
-
if persisted? && !embedded? && orderable_scope_changed?(column)
|
29
|
-
self.class.unscoped.find(_id).remove_position_from_list(column)
|
30
|
-
send("orderable_#{column}_position=", nil)
|
31
|
-
end
|
32
|
-
|
33
|
-
return if !target_position && in_list?(column)
|
34
|
-
|
35
|
-
target_position = target_position_to_position column, target_position
|
36
|
-
scope = orderable_scoped(column)
|
37
|
-
col = orderable_column(column)
|
38
|
-
pos = orderable_position(column)
|
39
|
-
|
40
|
-
if !in_list?(column)
|
41
|
-
MongoidOrderable.inc scope.where(col.gte => target_position), col, 1
|
42
|
-
elsif target_position < pos
|
43
|
-
MongoidOrderable.inc(scope.where(col.gte => target_position, col.lt => pos), col, 1)
|
44
|
-
elsif target_position > pos
|
45
|
-
MongoidOrderable.inc(scope.where(col.gt => pos, col.lte => target_position), col, -1)
|
46
|
-
end
|
47
|
-
|
48
|
-
send("orderable_#{column}_position=", target_position)
|
49
|
-
end
|
50
|
-
|
51
|
-
def target_position_to_position(column, target_position)
|
52
|
-
target_position = :bottom unless target_position
|
53
|
-
|
54
|
-
unless target_position.is_a? Numeric
|
55
|
-
target_position = case target_position.to_s
|
56
|
-
when 'top' then orderable_base(column)
|
57
|
-
when 'bottom' then bottom_orderable_position(column)
|
58
|
-
when 'higher' then orderable_position(column).pred
|
59
|
-
when 'lower' then orderable_position(column).next
|
60
|
-
when /\A\d+\Z/ then target_position.to_i
|
61
|
-
else raise Mongoid::Orderable::Errors::InvalidTargetPosition, target_position
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
target_position = orderable_base(column) if target_position < orderable_base(column)
|
66
|
-
target_position = bottom_orderable_position(column) if target_position > bottom_orderable_position(column)
|
67
|
-
target_position
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
module ClassMethods
|
72
|
-
def add_orderable_callbacks
|
73
|
-
before_save :add_to_list
|
74
|
-
after_destroy :remove_from_list
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
@@ -1,58 +0,0 @@
|
|
1
|
-
module Mongoid
|
2
|
-
module Orderable
|
3
|
-
class Configuration
|
4
|
-
CONFIG_OPTIONS = %w(column scope foreign_key inherited base index default).map(&:to_sym)
|
5
|
-
FIELD_OPTIONS = %w(as).map(&:to_sym)
|
6
|
-
VALID_OPTIONS = CONFIG_OPTIONS + FIELD_OPTIONS
|
7
|
-
|
8
|
-
attr_reader :orderable_class, :options
|
9
|
-
|
10
|
-
def initialize(parent, options = {})
|
11
|
-
@orderable_class = parent
|
12
|
-
set_options(options)
|
13
|
-
set_field_options
|
14
|
-
set_orderable_scope
|
15
|
-
end
|
16
|
-
|
17
|
-
def default_configuration
|
18
|
-
{ column: :position,
|
19
|
-
index: true,
|
20
|
-
scope: nil,
|
21
|
-
base: 1,
|
22
|
-
field_opts: { type: Integer } }
|
23
|
-
end
|
24
|
-
|
25
|
-
def self.build(parent, options = {})
|
26
|
-
new(parent, options).options
|
27
|
-
end
|
28
|
-
|
29
|
-
protected
|
30
|
-
|
31
|
-
def set_options(options)
|
32
|
-
@options = default_configuration
|
33
|
-
return unless options.is_a? Hash
|
34
|
-
@options.merge! options.symbolize_keys.slice(*VALID_OPTIONS)
|
35
|
-
end
|
36
|
-
|
37
|
-
def set_field_options
|
38
|
-
FIELD_OPTIONS.each do |key|
|
39
|
-
next unless options.key? key
|
40
|
-
@options[:field_opts][key] = options.delete(key)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
def set_orderable_scope
|
45
|
-
if options[:scope].is_a?(Symbol) && options[:scope].to_s !~ /_id$/
|
46
|
-
scope_relation = @orderable_class.relations[options[:scope].to_s]
|
47
|
-
@options[:scope] = if scope_relation
|
48
|
-
scope_relation.key.to_sym
|
49
|
-
else
|
50
|
-
"#{options[:scope]}_id".to_sym
|
51
|
-
end
|
52
|
-
elsif options[:scope].is_a?(String)
|
53
|
-
@options[:scope] = options[:scope].to_sym
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
@@ -1,33 +0,0 @@
|
|
1
|
-
module Mongoid
|
2
|
-
module Orderable
|
3
|
-
module Generator
|
4
|
-
include Mongoid::Orderable::Generator::Scope
|
5
|
-
include Mongoid::Orderable::Generator::Position
|
6
|
-
include Mongoid::Orderable::Generator::Movable
|
7
|
-
include Mongoid::Orderable::Generator::Listable
|
8
|
-
include Mongoid::Orderable::Generator::Helpers
|
9
|
-
|
10
|
-
def column_name
|
11
|
-
configuration[:field_opts][:as] || configuration[:column]
|
12
|
-
end
|
13
|
-
|
14
|
-
def order_scope
|
15
|
-
configuration[:scope]
|
16
|
-
end
|
17
|
-
|
18
|
-
def generate_all_helpers
|
19
|
-
generate_scope_helpers(column_name, order_scope)
|
20
|
-
generate_position_helpers(column_name)
|
21
|
-
generate_movable_helpers(column_name)
|
22
|
-
generate_listable_helpers(column_name)
|
23
|
-
generate_orderable_helpers
|
24
|
-
end
|
25
|
-
|
26
|
-
protected
|
27
|
-
|
28
|
-
def generate_method(name, &block)
|
29
|
-
klass.send(:define_method, name, &block)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
module Mongoid
|
2
|
-
module Orderable
|
3
|
-
module Generator
|
4
|
-
module Helpers
|
5
|
-
def generate_orderable_helpers
|
6
|
-
self_class = klass
|
7
|
-
|
8
|
-
klass.class_eval <<-eos
|
9
|
-
def orderable_base(column = nil)
|
10
|
-
column ||= default_orderable_column
|
11
|
-
#{self_class}.orderable_configurations[column][:base]
|
12
|
-
end
|
13
|
-
|
14
|
-
def orderable_column(column = nil)
|
15
|
-
column ||= default_orderable_column
|
16
|
-
#{self_class}.orderable_configurations[column][:column]
|
17
|
-
end
|
18
|
-
eos
|
19
|
-
|
20
|
-
generate_method(:orderable_inherited_class) do
|
21
|
-
self_class.orderable_configurations.any? { |_col, conf| conf[:inherited] } ? self_class : self.class
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
@@ -1,39 +0,0 @@
|
|
1
|
-
module Mongoid
|
2
|
-
module Orderable
|
3
|
-
module Generator
|
4
|
-
module Listable
|
5
|
-
def generate_listable_helpers(column_name)
|
6
|
-
generate_list_helpers(column_name)
|
7
|
-
generate_aliased_helpers(column_name)
|
8
|
-
end
|
9
|
-
|
10
|
-
protected
|
11
|
-
|
12
|
-
def generate_list_helpers(column_name)
|
13
|
-
generate_method("next_#{column_name}_item") do
|
14
|
-
next_item(column_name)
|
15
|
-
end
|
16
|
-
|
17
|
-
generate_method("next_#{column_name}_items") do
|
18
|
-
next_items(column_name)
|
19
|
-
end
|
20
|
-
|
21
|
-
generate_method("previous_#{column_name}_item") do
|
22
|
-
previous_item(column_name)
|
23
|
-
end
|
24
|
-
|
25
|
-
generate_method("previous_#{column_name}_items") do
|
26
|
-
previous_items(column_name)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
def generate_aliased_helpers(column_name)
|
31
|
-
klass.class_eval do
|
32
|
-
alias_method "prev_#{column_name}_items", "previous_#{column_name}_items"
|
33
|
-
alias_method "prev_#{column_name}_item", "previous_#{column_name}_item"
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
@@ -1,60 +0,0 @@
|
|
1
|
-
module Mongoid
|
2
|
-
module Orderable
|
3
|
-
module Generator
|
4
|
-
module Movable
|
5
|
-
def generate_movable_helpers(column_name)
|
6
|
-
generate_move_to_helpers(column_name)
|
7
|
-
generate_insert_at_helpers(column_name)
|
8
|
-
generate_shorthand_helpers(column_name)
|
9
|
-
end
|
10
|
-
|
11
|
-
protected
|
12
|
-
|
13
|
-
def generate_move_to_helpers(column_name)
|
14
|
-
generate_method("move_#{column_name}_to") do |target_position|
|
15
|
-
move_column_to target_position, column: column_name
|
16
|
-
end
|
17
|
-
|
18
|
-
generate_method("move_#{column_name}_to!") do |target_position|
|
19
|
-
move_column_to target_position, column: column_name
|
20
|
-
save
|
21
|
-
end
|
22
|
-
|
23
|
-
generate_method("move_#{column_name}_to=") do |target_position|
|
24
|
-
move_column_to target_position, column: column_name
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
def generate_insert_at_helpers(column_name)
|
29
|
-
klass.class_eval do
|
30
|
-
alias_method "insert_#{column_name}_at!", "move_#{column_name}_to!"
|
31
|
-
alias_method "insert_#{column_name}_at", "move_#{column_name}_to"
|
32
|
-
alias_method "insert_#{column_name}_at=", "move_#{column_name}_to="
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def generate_shorthand_helpers(column_name)
|
37
|
-
[:top, :bottom].each do |symbol|
|
38
|
-
generate_method "move_#{column_name}_to_#{symbol}" do
|
39
|
-
move_to symbol, column: column_name
|
40
|
-
end
|
41
|
-
|
42
|
-
generate_method "move_#{column_name}_to_#{symbol}!" do
|
43
|
-
move_to! symbol, column: column_name
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
[:higher, :lower].each do |symbol|
|
48
|
-
generate_method "move_#{column_name}_#{symbol}" do
|
49
|
-
move_to symbol, column: column_name
|
50
|
-
end
|
51
|
-
|
52
|
-
generate_method "move_#{column_name}_#{symbol}!" do
|
53
|
-
move_to! symbol, column: column_name
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
module Mongoid
|
2
|
-
module Orderable
|
3
|
-
module Generator
|
4
|
-
module Position
|
5
|
-
def generate_position_helpers(column_name)
|
6
|
-
klass.class_eval <<-eos
|
7
|
-
def orderable_position(column = nil)
|
8
|
-
column ||= default_orderable_column
|
9
|
-
send "orderable_\#{column}_position"
|
10
|
-
end
|
11
|
-
eos
|
12
|
-
|
13
|
-
generate_method("orderable_#{column_name}_position") do
|
14
|
-
send column_name
|
15
|
-
end
|
16
|
-
|
17
|
-
generate_method("orderable_#{column_name}_position=") do |value|
|
18
|
-
send "#{column_name}=", value
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
module Mongoid
|
2
|
-
module Orderable
|
3
|
-
module Generator
|
4
|
-
module Scope
|
5
|
-
def generate_scope_helpers(column_name, order_scope)
|
6
|
-
klass.class_eval do
|
7
|
-
scope "orderable_#{column_name}_scope", case order_scope
|
8
|
-
when Symbol then ->(document) { where(order_scope => document.send(order_scope)) }
|
9
|
-
when Proc then order_scope
|
10
|
-
else ->(_document) { where({}) }
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|