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.
Files changed (32) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +105 -99
  3. data/LICENSE.txt +20 -20
  4. data/README.md +296 -275
  5. data/Rakefile +24 -24
  6. data/lib/config/locales/en.yml +12 -12
  7. data/lib/mongoid/orderable/configs/field_config.rb +81 -81
  8. data/lib/mongoid/orderable/configs/global_config.rb +26 -26
  9. data/lib/mongoid/orderable/errors/invalid_target_position.rb +19 -19
  10. data/lib/mongoid/orderable/errors/transaction_failed.rb +20 -20
  11. data/lib/mongoid/orderable/generators/base.rb +21 -21
  12. data/lib/mongoid/orderable/generators/helpers.rb +37 -37
  13. data/lib/mongoid/orderable/generators/listable.rb +41 -41
  14. data/lib/mongoid/orderable/generators/lock_collection.rb +39 -39
  15. data/lib/mongoid/orderable/generators/movable.rb +62 -62
  16. data/lib/mongoid/orderable/generators/position.rb +26 -26
  17. data/lib/mongoid/orderable/generators/scope.rb +26 -26
  18. data/lib/mongoid/orderable/handlers/base.rb +218 -215
  19. data/lib/mongoid/orderable/handlers/document.rb +32 -32
  20. data/lib/mongoid/orderable/handlers/document_embedded.rb +14 -14
  21. data/lib/mongoid/orderable/handlers/document_transactional.rb +32 -32
  22. data/lib/mongoid/orderable/handlers/transaction.rb +75 -75
  23. data/lib/mongoid/orderable/installer.rb +64 -64
  24. data/lib/mongoid/orderable/mixins/callbacks.rb +45 -45
  25. data/lib/mongoid/orderable/mixins/cascadeable.rb +15 -15
  26. data/lib/mongoid/orderable/mixins/helpers.rb +45 -39
  27. data/lib/mongoid/orderable/mixins/listable.rb +49 -49
  28. data/lib/mongoid/orderable/mixins/movable.rb +64 -64
  29. data/lib/mongoid/orderable/version.rb +7 -7
  30. data/lib/mongoid/orderable.rb +29 -29
  31. data/lib/mongoid_orderable.rb +34 -33
  32. 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