mongoid_orderable 6.0.5 → 6.0.7
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/CHANGELOG.md +105 -99
- data/LICENSE.txt +20 -20
- data/README.md +296 -275
- data/Rakefile +24 -24
- data/lib/config/locales/en.yml +12 -12
- data/lib/mongoid/orderable/configs/field_config.rb +81 -81
- data/lib/mongoid/orderable/configs/global_config.rb +26 -26
- data/lib/mongoid/orderable/errors/invalid_target_position.rb +19 -19
- data/lib/mongoid/orderable/errors/transaction_failed.rb +20 -20
- data/lib/mongoid/orderable/generators/base.rb +21 -21
- data/lib/mongoid/orderable/generators/helpers.rb +37 -37
- data/lib/mongoid/orderable/generators/listable.rb +41 -41
- data/lib/mongoid/orderable/generators/lock_collection.rb +39 -39
- data/lib/mongoid/orderable/generators/movable.rb +62 -62
- data/lib/mongoid/orderable/generators/position.rb +26 -26
- data/lib/mongoid/orderable/generators/scope.rb +26 -26
- data/lib/mongoid/orderable/handlers/base.rb +218 -215
- data/lib/mongoid/orderable/handlers/document.rb +32 -32
- data/lib/mongoid/orderable/handlers/document_embedded.rb +14 -14
- data/lib/mongoid/orderable/handlers/document_transactional.rb +32 -32
- data/lib/mongoid/orderable/handlers/transaction.rb +75 -75
- data/lib/mongoid/orderable/installer.rb +64 -64
- data/lib/mongoid/orderable/mixins/callbacks.rb +45 -45
- data/lib/mongoid/orderable/mixins/cascadeable.rb +15 -15
- data/lib/mongoid/orderable/mixins/helpers.rb +45 -39
- data/lib/mongoid/orderable/mixins/listable.rb +49 -49
- data/lib/mongoid/orderable/mixins/movable.rb +64 -64
- data/lib/mongoid/orderable/version.rb +7 -7
- data/lib/mongoid/orderable.rb +29 -29
- data/lib/mongoid_orderable.rb +34 -33
- metadata +3 -3
|
@@ -1,81 +1,81 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Mongoid
|
|
4
|
-
module Orderable
|
|
5
|
-
module Configs
|
|
6
|
-
class FieldConfig
|
|
7
|
-
CONFIG_OPTIONS = %i[field
|
|
8
|
-
scope
|
|
9
|
-
foreign_key
|
|
10
|
-
inherited
|
|
11
|
-
base
|
|
12
|
-
index
|
|
13
|
-
default
|
|
14
|
-
if
|
|
15
|
-
unless
|
|
16
|
-
use_transactions
|
|
17
|
-
transaction_max_retries
|
|
18
|
-
lock_collection].freeze
|
|
19
|
-
ALIASES = { column: :field }.freeze
|
|
20
|
-
FIELD_OPTIONS = %i[as].freeze
|
|
21
|
-
VALID_OPTIONS = (CONFIG_OPTIONS | FIELD_OPTIONS).freeze
|
|
22
|
-
|
|
23
|
-
attr_reader :orderable_class,
|
|
24
|
-
:options
|
|
25
|
-
|
|
26
|
-
def initialize(parent, options = {})
|
|
27
|
-
@orderable_class = parent
|
|
28
|
-
assign_options(options)
|
|
29
|
-
set_field_options
|
|
30
|
-
set_orderable_scope
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def global_config
|
|
34
|
-
cfg = Mongoid::Orderable.config
|
|
35
|
-
{ field: cfg.field,
|
|
36
|
-
as: cfg.as,
|
|
37
|
-
index: cfg.index,
|
|
38
|
-
base: cfg.base,
|
|
39
|
-
use_transactions: cfg.use_transactions,
|
|
40
|
-
transaction_max_retries: cfg.transaction_max_retries,
|
|
41
|
-
lock_collection: cfg.lock_collection }
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
private
|
|
45
|
-
|
|
46
|
-
def assign_options(options)
|
|
47
|
-
@options = global_config
|
|
48
|
-
return unless options.is_a?(Hash)
|
|
49
|
-
@options = @options.merge(options.symbolize_keys.transform_keys {|k| ALIASES[k] || k }).slice(*VALID_OPTIONS)
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
def set_field_options
|
|
53
|
-
@options[:field_options] = {}
|
|
54
|
-
FIELD_OPTIONS.each do |key|
|
|
55
|
-
next unless @options.key?(key)
|
|
56
|
-
@options[:field_options][key] = @options.delete(key)
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
def set_orderable_scope
|
|
61
|
-
return unless @options[:scope].class.in?([Array, Symbol, String])
|
|
62
|
-
|
|
63
|
-
scope = Array(@options[:scope])
|
|
64
|
-
scope.map! do |value|
|
|
65
|
-
case value
|
|
66
|
-
when Symbol
|
|
67
|
-
relation = @orderable_class.relations[@options[:scope].to_s]&.key&.to_sym
|
|
68
|
-
relation || value
|
|
69
|
-
when String
|
|
70
|
-
value.to_sym
|
|
71
|
-
else
|
|
72
|
-
raise ArgumentError.new("Orderable :scope invalid: #{@options[:scope]}")
|
|
73
|
-
end
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
@options[:scope] = scope
|
|
77
|
-
end
|
|
78
|
-
end
|
|
79
|
-
end
|
|
80
|
-
end
|
|
81
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Mongoid
|
|
4
|
+
module Orderable
|
|
5
|
+
module Configs
|
|
6
|
+
class FieldConfig
|
|
7
|
+
CONFIG_OPTIONS = %i[field
|
|
8
|
+
scope
|
|
9
|
+
foreign_key
|
|
10
|
+
inherited
|
|
11
|
+
base
|
|
12
|
+
index
|
|
13
|
+
default
|
|
14
|
+
if
|
|
15
|
+
unless
|
|
16
|
+
use_transactions
|
|
17
|
+
transaction_max_retries
|
|
18
|
+
lock_collection].freeze
|
|
19
|
+
ALIASES = { column: :field }.freeze
|
|
20
|
+
FIELD_OPTIONS = %i[as].freeze
|
|
21
|
+
VALID_OPTIONS = (CONFIG_OPTIONS | FIELD_OPTIONS).freeze
|
|
22
|
+
|
|
23
|
+
attr_reader :orderable_class,
|
|
24
|
+
:options
|
|
25
|
+
|
|
26
|
+
def initialize(parent, options = {})
|
|
27
|
+
@orderable_class = parent
|
|
28
|
+
assign_options(options)
|
|
29
|
+
set_field_options
|
|
30
|
+
set_orderable_scope
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def global_config
|
|
34
|
+
cfg = Mongoid::Orderable.config
|
|
35
|
+
{ field: cfg.field,
|
|
36
|
+
as: cfg.as,
|
|
37
|
+
index: cfg.index,
|
|
38
|
+
base: cfg.base,
|
|
39
|
+
use_transactions: cfg.use_transactions,
|
|
40
|
+
transaction_max_retries: cfg.transaction_max_retries,
|
|
41
|
+
lock_collection: cfg.lock_collection }
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
private
|
|
45
|
+
|
|
46
|
+
def assign_options(options)
|
|
47
|
+
@options = global_config
|
|
48
|
+
return unless options.is_a?(Hash)
|
|
49
|
+
@options = @options.merge(options.symbolize_keys.transform_keys {|k| ALIASES[k] || k }).slice(*VALID_OPTIONS)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def set_field_options
|
|
53
|
+
@options[:field_options] = {}
|
|
54
|
+
FIELD_OPTIONS.each do |key|
|
|
55
|
+
next unless @options.key?(key)
|
|
56
|
+
@options[:field_options][key] = @options.delete(key)
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def set_orderable_scope
|
|
61
|
+
return unless @options[:scope].class.in?([Array, Symbol, String])
|
|
62
|
+
|
|
63
|
+
scope = Array(@options[:scope])
|
|
64
|
+
scope.map! do |value|
|
|
65
|
+
case value
|
|
66
|
+
when Symbol
|
|
67
|
+
relation = @orderable_class.relations[@options[:scope].to_s]&.key&.to_sym
|
|
68
|
+
relation || value
|
|
69
|
+
when String
|
|
70
|
+
value.to_sym
|
|
71
|
+
else
|
|
72
|
+
raise ArgumentError.new("Orderable :scope invalid: #{@options[:scope]}")
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
@options[:scope] = scope
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Mongoid
|
|
4
|
-
module Orderable
|
|
5
|
-
module Configs
|
|
6
|
-
class GlobalConfig
|
|
7
|
-
attr_accessor :field,
|
|
8
|
-
:as,
|
|
9
|
-
:base,
|
|
10
|
-
:index,
|
|
11
|
-
:use_transactions,
|
|
12
|
-
:transaction_max_retries,
|
|
13
|
-
:lock_collection
|
|
14
|
-
|
|
15
|
-
def initialize
|
|
16
|
-
self.field = :position
|
|
17
|
-
self.index = true
|
|
18
|
-
self.base = 1
|
|
19
|
-
self.use_transactions = false
|
|
20
|
-
self.transaction_max_retries = 10
|
|
21
|
-
self.lock_collection = :mongoid_orderable_locks
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Mongoid
|
|
4
|
+
module Orderable
|
|
5
|
+
module Configs
|
|
6
|
+
class GlobalConfig
|
|
7
|
+
attr_accessor :field,
|
|
8
|
+
:as,
|
|
9
|
+
:base,
|
|
10
|
+
:index,
|
|
11
|
+
:use_transactions,
|
|
12
|
+
:transaction_max_retries,
|
|
13
|
+
:lock_collection
|
|
14
|
+
|
|
15
|
+
def initialize
|
|
16
|
+
self.field = :position
|
|
17
|
+
self.index = true
|
|
18
|
+
self.base = 1
|
|
19
|
+
self.use_transactions = false
|
|
20
|
+
self.transaction_max_retries = 10
|
|
21
|
+
self.lock_collection = :mongoid_orderable_locks
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Mongoid
|
|
4
|
-
module Orderable
|
|
5
|
-
module Errors
|
|
6
|
-
class InvalidTargetPosition < ::Mongoid::Errors::MongoidError
|
|
7
|
-
def initialize(value)
|
|
8
|
-
super _compose_message(value)
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
private
|
|
12
|
-
|
|
13
|
-
def _compose_message(value)
|
|
14
|
-
compose_message 'invalid_target_position', value: value.inspect
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Mongoid
|
|
4
|
+
module Orderable
|
|
5
|
+
module Errors
|
|
6
|
+
class InvalidTargetPosition < ::Mongoid::Errors::MongoidError
|
|
7
|
+
def initialize(value)
|
|
8
|
+
super _compose_message(value)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
private
|
|
12
|
+
|
|
13
|
+
def _compose_message(value)
|
|
14
|
+
compose_message 'invalid_target_position', value: value.inspect
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Mongoid
|
|
4
|
-
module Orderable
|
|
5
|
-
module Errors
|
|
6
|
-
class TransactionFailed < ::Mongoid::Errors::MongoidError
|
|
7
|
-
def initialize(error)
|
|
8
|
-
super _compose_message(error)
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
private
|
|
12
|
-
|
|
13
|
-
def _compose_message(error)
|
|
14
|
-
compose_message 'transaction_failed'
|
|
15
|
-
@summary = error.message
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Mongoid
|
|
4
|
+
module Orderable
|
|
5
|
+
module Errors
|
|
6
|
+
class TransactionFailed < ::Mongoid::Errors::MongoidError
|
|
7
|
+
def initialize(error)
|
|
8
|
+
super _compose_message(error)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
private
|
|
12
|
+
|
|
13
|
+
def _compose_message(error)
|
|
14
|
+
compose_message 'transaction_failed'
|
|
15
|
+
@summary = error.message
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Mongoid
|
|
4
|
-
module Orderable
|
|
5
|
-
module Generators
|
|
6
|
-
class Base
|
|
7
|
-
attr_reader :klass
|
|
8
|
-
|
|
9
|
-
def initialize(klass)
|
|
10
|
-
@klass = klass
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
private
|
|
14
|
-
|
|
15
|
-
def generate_method(name, &block)
|
|
16
|
-
klass.send(:define_method, name, &block)
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
end
|
|
21
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Mongoid
|
|
4
|
+
module Orderable
|
|
5
|
+
module Generators
|
|
6
|
+
class Base
|
|
7
|
+
attr_reader :klass
|
|
8
|
+
|
|
9
|
+
def initialize(klass)
|
|
10
|
+
@klass = klass
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
private
|
|
14
|
+
|
|
15
|
+
def generate_method(name, &block)
|
|
16
|
+
klass.send(:define_method, name, &block)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -1,37 +1,37 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Mongoid
|
|
4
|
-
module Orderable
|
|
5
|
-
module Generators
|
|
6
|
-
class Helpers < Base
|
|
7
|
-
def generate
|
|
8
|
-
self_class = klass
|
|
9
|
-
|
|
10
|
-
klass.class_eval <<~KLASS, __FILE__, __LINE__ + 1
|
|
11
|
-
def orderable_top(field = nil)
|
|
12
|
-
field ||= default_orderable_field
|
|
13
|
-
#{self_class}.orderable_configs[field][:base]
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
def orderable_field(field = nil)
|
|
17
|
-
field ||= default_orderable_field
|
|
18
|
-
#{self_class}.orderable_configs[field][:field]
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def orderable_if(field)
|
|
22
|
-
#{self_class}.orderable_configs[field][:if]
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def orderable_unless(field)
|
|
26
|
-
#{self_class}.orderable_configs[field][:unless]
|
|
27
|
-
end
|
|
28
|
-
KLASS
|
|
29
|
-
|
|
30
|
-
generate_method(:orderable_inherited_class) do
|
|
31
|
-
self_class.orderable_configs.any? {|_field, conf| conf[:inherited] } ? self_class : self.class
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Mongoid
|
|
4
|
+
module Orderable
|
|
5
|
+
module Generators
|
|
6
|
+
class Helpers < Base
|
|
7
|
+
def generate
|
|
8
|
+
self_class = klass
|
|
9
|
+
|
|
10
|
+
klass.class_eval <<~KLASS, __FILE__, __LINE__ + 1
|
|
11
|
+
def orderable_top(field = nil)
|
|
12
|
+
field ||= default_orderable_field
|
|
13
|
+
#{self_class}.orderable_configs[field][:base]
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def orderable_field(field = nil)
|
|
17
|
+
field ||= default_orderable_field
|
|
18
|
+
#{self_class}.orderable_configs[field][:field]
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def orderable_if(field)
|
|
22
|
+
#{self_class}.orderable_configs[field][:if]
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def orderable_unless(field)
|
|
26
|
+
#{self_class}.orderable_configs[field][:unless]
|
|
27
|
+
end
|
|
28
|
+
KLASS
|
|
29
|
+
|
|
30
|
+
generate_method(:orderable_inherited_class) do
|
|
31
|
+
self_class.orderable_configs.any? {|_field, conf| conf[:inherited] } ? self_class : self.class
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -1,41 +1,41 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Mongoid
|
|
4
|
-
module Orderable
|
|
5
|
-
module Generators
|
|
6
|
-
class Listable < Base
|
|
7
|
-
def generate(field_name)
|
|
8
|
-
generate_list_helpers(field_name)
|
|
9
|
-
generate_aliased_helpers(field_name)
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
private
|
|
13
|
-
|
|
14
|
-
def generate_list_helpers(field_name)
|
|
15
|
-
generate_method("next_#{field_name}_item") do
|
|
16
|
-
next_item(field_name)
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
generate_method("next_#{field_name}_items") do
|
|
20
|
-
next_items(field_name)
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
generate_method("previous_#{field_name}_item") do
|
|
24
|
-
previous_item(field_name)
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
generate_method("previous_#{field_name}_items") do
|
|
28
|
-
previous_items(field_name)
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
def generate_aliased_helpers(field_name)
|
|
33
|
-
klass.class_eval do
|
|
34
|
-
alias_method "prev_#{field_name}_items", "previous_#{field_name}_items"
|
|
35
|
-
alias_method "prev_#{field_name}_item", "previous_#{field_name}_item"
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
end
|
|
41
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Mongoid
|
|
4
|
+
module Orderable
|
|
5
|
+
module Generators
|
|
6
|
+
class Listable < Base
|
|
7
|
+
def generate(field_name)
|
|
8
|
+
generate_list_helpers(field_name)
|
|
9
|
+
generate_aliased_helpers(field_name)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
private
|
|
13
|
+
|
|
14
|
+
def generate_list_helpers(field_name)
|
|
15
|
+
generate_method("next_#{field_name}_item") do
|
|
16
|
+
next_item(field_name)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
generate_method("next_#{field_name}_items") do
|
|
20
|
+
next_items(field_name)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
generate_method("previous_#{field_name}_item") do
|
|
24
|
+
previous_item(field_name)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
generate_method("previous_#{field_name}_items") do
|
|
28
|
+
previous_items(field_name)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def generate_aliased_helpers(field_name)
|
|
33
|
+
klass.class_eval do
|
|
34
|
+
alias_method "prev_#{field_name}_items", "previous_#{field_name}_items"
|
|
35
|
+
alias_method "prev_#{field_name}_item", "previous_#{field_name}_item"
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -1,39 +1,39 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Mongoid
|
|
4
|
-
module Orderable
|
|
5
|
-
module Generators
|
|
6
|
-
class LockCollection
|
|
7
|
-
def generate(collection_name)
|
|
8
|
-
return unless collection_name
|
|
9
|
-
model_name = collection_name.to_s.singularize.classify
|
|
10
|
-
return if model_exists?(model_name)
|
|
11
|
-
::Mongoid::Orderable.class_eval <<~KLASS, __FILE__, __LINE__ + 1
|
|
12
|
-
module Models
|
|
13
|
-
class #{model_name}
|
|
14
|
-
include Mongoid::Document
|
|
15
|
-
include Mongoid::Timestamps::Updated::Short
|
|
16
|
-
|
|
17
|
-
store_in collection: :#{collection_name}
|
|
18
|
-
|
|
19
|
-
field :scope, type: String
|
|
20
|
-
|
|
21
|
-
index({ scope: 1 }, { unique: 1 })
|
|
22
|
-
index({ updated_at: 1 }, { expire_after_seconds: 86400 })
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
KLASS
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
private
|
|
29
|
-
|
|
30
|
-
def model_exists?(model_name)
|
|
31
|
-
base = ::Mongoid::Orderable::Models
|
|
32
|
-
!!(defined?(base) && base.const_get(model_name))
|
|
33
|
-
rescue NameError
|
|
34
|
-
false
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Mongoid
|
|
4
|
+
module Orderable
|
|
5
|
+
module Generators
|
|
6
|
+
class LockCollection
|
|
7
|
+
def generate(collection_name)
|
|
8
|
+
return unless collection_name
|
|
9
|
+
model_name = collection_name.to_s.singularize.classify
|
|
10
|
+
return if model_exists?(model_name)
|
|
11
|
+
::Mongoid::Orderable.class_eval <<~KLASS, __FILE__, __LINE__ + 1
|
|
12
|
+
module Models
|
|
13
|
+
class #{model_name}
|
|
14
|
+
include Mongoid::Document
|
|
15
|
+
include Mongoid::Timestamps::Updated::Short
|
|
16
|
+
|
|
17
|
+
store_in collection: :#{collection_name}
|
|
18
|
+
|
|
19
|
+
field :scope, type: String
|
|
20
|
+
|
|
21
|
+
index({ scope: 1 }, { unique: 1 })
|
|
22
|
+
index({ updated_at: 1 }, { expire_after_seconds: 86400 })
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
KLASS
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
private
|
|
29
|
+
|
|
30
|
+
def model_exists?(model_name)
|
|
31
|
+
base = ::Mongoid::Orderable::Models
|
|
32
|
+
!!(defined?(base) && base.const_get(model_name))
|
|
33
|
+
rescue NameError
|
|
34
|
+
false
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|