mobility 0.8.13 → 1.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.
Files changed (114) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +2 -2
  3. data.tar.gz.sig +0 -0
  4. data/CHANGELOG.md +63 -0
  5. data/Gemfile +5 -2
  6. data/Gemfile.lock +39 -20
  7. data/README.md +183 -93
  8. data/lib/mobility.rb +101 -169
  9. data/lib/mobility/backend.rb +27 -51
  10. data/lib/mobility/backends.rb +20 -0
  11. data/lib/mobility/backends/active_record.rb +4 -0
  12. data/lib/mobility/backends/active_record/column.rb +3 -1
  13. data/lib/mobility/backends/active_record/container.rb +10 -11
  14. data/lib/mobility/backends/active_record/hstore.rb +6 -4
  15. data/lib/mobility/backends/active_record/json.rb +5 -3
  16. data/lib/mobility/backends/active_record/jsonb.rb +5 -3
  17. data/lib/mobility/backends/active_record/key_value.rb +31 -13
  18. data/lib/mobility/backends/active_record/pg_hash.rb +1 -1
  19. data/lib/mobility/backends/active_record/serialized.rb +6 -0
  20. data/lib/mobility/backends/active_record/table.rb +17 -10
  21. data/lib/mobility/backends/column.rb +0 -6
  22. data/lib/mobility/backends/container.rb +10 -1
  23. data/lib/mobility/backends/hash.rb +39 -0
  24. data/lib/mobility/backends/hash_valued.rb +4 -0
  25. data/lib/mobility/backends/hstore.rb +0 -1
  26. data/lib/mobility/backends/json.rb +0 -1
  27. data/lib/mobility/backends/jsonb.rb +1 -2
  28. data/lib/mobility/backends/key_value.rb +31 -26
  29. data/lib/mobility/backends/null.rb +2 -0
  30. data/lib/mobility/backends/sequel.rb +37 -2
  31. data/lib/mobility/backends/sequel/column.rb +2 -0
  32. data/lib/mobility/backends/sequel/container.rb +11 -9
  33. data/lib/mobility/backends/sequel/hstore.rb +3 -1
  34. data/lib/mobility/backends/sequel/json.rb +3 -0
  35. data/lib/mobility/backends/sequel/jsonb.rb +3 -1
  36. data/lib/mobility/backends/sequel/key_value.rb +87 -18
  37. data/lib/mobility/backends/sequel/pg_hash.rb +6 -6
  38. data/lib/mobility/backends/sequel/serialized.rb +6 -0
  39. data/lib/mobility/backends/sequel/table.rb +22 -9
  40. data/lib/mobility/backends/serialized.rb +1 -3
  41. data/lib/mobility/backends/table.rb +39 -31
  42. data/lib/mobility/pluggable.rb +56 -0
  43. data/lib/mobility/plugin.rb +260 -0
  44. data/lib/mobility/plugins.rb +27 -24
  45. data/lib/mobility/plugins/active_model.rb +17 -0
  46. data/lib/mobility/plugins/active_model/cache.rb +26 -0
  47. data/lib/mobility/plugins/active_model/dirty.rb +119 -78
  48. data/lib/mobility/plugins/active_record.rb +37 -0
  49. data/lib/mobility/plugins/active_record/backend.rb +27 -0
  50. data/lib/mobility/plugins/active_record/cache.rb +28 -0
  51. data/lib/mobility/plugins/active_record/dirty.rb +34 -17
  52. data/lib/mobility/plugins/active_record/query.rb +43 -31
  53. data/lib/mobility/plugins/active_record/uniqueness_validation.rb +64 -0
  54. data/lib/mobility/plugins/arel.rb +125 -0
  55. data/lib/mobility/plugins/arel/nodes.rb +15 -0
  56. data/lib/mobility/plugins/arel/nodes/pg_ops.rb +134 -0
  57. data/lib/mobility/plugins/attribute_methods.rb +29 -20
  58. data/lib/mobility/plugins/attributes.rb +72 -0
  59. data/lib/mobility/plugins/backend.rb +161 -0
  60. data/lib/mobility/plugins/backend_reader.rb +34 -0
  61. data/lib/mobility/plugins/cache.rb +68 -26
  62. data/lib/mobility/plugins/default.rb +22 -17
  63. data/lib/mobility/plugins/dirty.rb +12 -33
  64. data/lib/mobility/plugins/fallbacks.rb +52 -44
  65. data/lib/mobility/plugins/fallthrough_accessors.rb +19 -23
  66. data/lib/mobility/plugins/locale_accessors.rb +22 -35
  67. data/lib/mobility/plugins/presence.rb +28 -21
  68. data/lib/mobility/plugins/query.rb +8 -17
  69. data/lib/mobility/plugins/reader.rb +50 -0
  70. data/lib/mobility/plugins/sequel.rb +34 -0
  71. data/lib/mobility/plugins/sequel/backend.rb +25 -0
  72. data/lib/mobility/plugins/sequel/cache.rb +24 -0
  73. data/lib/mobility/plugins/sequel/dirty.rb +34 -23
  74. data/lib/mobility/plugins/sequel/query.rb +21 -6
  75. data/lib/mobility/plugins/writer.rb +44 -0
  76. data/lib/mobility/translations.rb +95 -0
  77. data/lib/mobility/version.rb +12 -1
  78. data/lib/rails/generators/mobility/templates/create_string_translations.rb +0 -1
  79. data/lib/rails/generators/mobility/templates/create_text_translations.rb +0 -1
  80. data/lib/rails/generators/mobility/templates/initializer.rb +104 -78
  81. metadata +35 -40
  82. metadata.gz.sig +0 -0
  83. data/lib/mobility/active_model.rb +0 -4
  84. data/lib/mobility/active_model/backend_resetter.rb +0 -26
  85. data/lib/mobility/active_record.rb +0 -23
  86. data/lib/mobility/active_record/backend_resetter.rb +0 -26
  87. data/lib/mobility/active_record/model_translation.rb +0 -14
  88. data/lib/mobility/active_record/string_translation.rb +0 -10
  89. data/lib/mobility/active_record/text_translation.rb +0 -10
  90. data/lib/mobility/active_record/translation.rb +0 -14
  91. data/lib/mobility/active_record/uniqueness_validator.rb +0 -60
  92. data/lib/mobility/arel.rb +0 -49
  93. data/lib/mobility/arel/nodes.rb +0 -13
  94. data/lib/mobility/arel/nodes/pg_ops.rb +0 -132
  95. data/lib/mobility/arel/visitor.rb +0 -61
  96. data/lib/mobility/attributes.rb +0 -324
  97. data/lib/mobility/backend/orm_delegator.rb +0 -44
  98. data/lib/mobility/backend_resetter.rb +0 -50
  99. data/lib/mobility/configuration.rb +0 -138
  100. data/lib/mobility/fallbacks.rb +0 -28
  101. data/lib/mobility/interface.rb +0 -0
  102. data/lib/mobility/loaded.rb +0 -4
  103. data/lib/mobility/plugins/active_record/attribute_methods.rb +0 -38
  104. data/lib/mobility/plugins/cache/translation_cacher.rb +0 -40
  105. data/lib/mobility/sequel.rb +0 -9
  106. data/lib/mobility/sequel/backend_resetter.rb +0 -23
  107. data/lib/mobility/sequel/column_changes.rb +0 -28
  108. data/lib/mobility/sequel/hash_initializer.rb +0 -21
  109. data/lib/mobility/sequel/model_translation.rb +0 -20
  110. data/lib/mobility/sequel/sql.rb +0 -16
  111. data/lib/mobility/sequel/string_translation.rb +0 -10
  112. data/lib/mobility/sequel/text_translation.rb +0 -10
  113. data/lib/mobility/sequel/translation.rb +0 -53
  114. data/lib/mobility/translates.rb +0 -73
@@ -1,16 +0,0 @@
1
- module Mobility
2
- module Sequel
3
- module SQL
4
- class QualifiedIdentifier < ::Sequel::SQL::QualifiedIdentifier
5
- attr_reader :backend_class, :locale, :attribute_name
6
-
7
- def initialize(table, column, locale, backend_class, attribute_name: nil)
8
- @backend_class = backend_class
9
- @locale = locale
10
- @attribute_name = attribute_name || column
11
- super(table, column)
12
- end
13
- end
14
- end
15
- end
16
- end
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
- require "mobility/sequel/translation"
3
-
4
- module Mobility
5
- module Sequel
6
- class StringTranslation < ::Sequel::Model(:mobility_string_translations)
7
- include Translation
8
- end
9
- end
10
- end
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
- require "mobility/sequel/translation"
3
-
4
- module Mobility
5
- module Sequel
6
- class TextTranslation < ::Sequel::Model(:mobility_text_translations)
7
- include Translation
8
- end
9
- end
10
- end
@@ -1,53 +0,0 @@
1
- module Mobility
2
- module Sequel
3
- module Translation
4
- def self.included(base)
5
- base.class_eval do
6
- plugin :validation_helpers
7
-
8
- # Paraphased from sequel_polymorphic gem
9
- #
10
- model = underscore(self.to_s)
11
- plural_model = pluralize(model)
12
- many_to_one :translatable,
13
- reciprocal: plural_model.to_sym,
14
- reciprocal_type: :many_to_one,
15
- setter: (proc do |able_instance|
16
- self[:translatable_id] = (able_instance.pk if able_instance)
17
- self[:translatable_type] = (able_instance.class.name if able_instance)
18
- end),
19
- dataset: (proc do
20
- translatable_type = send :translatable_type
21
- translatable_id = send :translatable_id
22
- return if translatable_type.nil? || translatable_id.nil?
23
- klass = self.class.send(:constantize, translatable_type)
24
- klass.where(klass.primary_key => translatable_id)
25
- end),
26
- eager_loader: (proc do |eo|
27
- id_map = {}
28
- eo[:rows].each do |model|
29
- model_able_type = model.send :translatable_type
30
- model_able_id = model.send :translatable_id
31
- model.associations[:translatable] = nil
32
- ((id_map[model_able_type] ||= {})[model_able_id] ||= []) << model if !model_able_type.nil? && !model_able_id.nil?
33
- end
34
- id_map.each do |klass_name, id_map|
35
- klass = constantize(camelize(klass_name))
36
- klass.where(klass.primary_key=>id_map.keys).all do |related_obj|
37
- id_map[related_obj.pk].each do |model|
38
- model.associations[:translatable] = related_obj
39
- end
40
- end
41
- end
42
- end)
43
-
44
- def validate
45
- super
46
- validates_presence [:locale, :key, :translatable_id, :translatable_type]
47
- validates_unique [:locale, :key, :translatable_id, :translatable_type]
48
- end
49
- end
50
- end
51
- end
52
- end
53
- end
@@ -1,73 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Mobility
4
- =begin
5
-
6
- Defines methods for attaching backends to a class. A block can optionally be
7
- passed to accessors to configure backend (see example below).
8
-
9
- @example Defining backend on a class
10
- class MyClass
11
- extend Translates
12
- mobility_accessor :foo, option: :value
13
- end
14
-
15
- @example Passing backend to a block
16
- class MyClass
17
- extend Translates
18
- mobility_accessor :foo, option: :value do
19
- # add custom code to backend class for this attribute only
20
- end
21
- end
22
-
23
- @example Defining only a backend reader and presence method
24
- class MyClass
25
- extend Translates
26
- mobility_reader :foo
27
- end
28
-
29
- instance = MyClass.new
30
- instance.foo #=> (some value)
31
- instance.foo? #=> true
32
- instance.foo = "foo" #=> NoMethodError
33
-
34
- @example Defining only a backend writer
35
- class MyClass
36
- extend Translates
37
- mobility_writer :foo
38
- end
39
-
40
- instance = MyClass.new
41
- instance.foo #=> NoMethodError
42
- instance.foo? #=> NoMethodError
43
- instance.foo = "foo" #=> (sets attribute to value "foo")
44
- =end
45
- module Translates
46
- # Defines mobility accessor on model class.
47
- # @!method mobility_accessor(*attributes, **options)
48
- # @param [Array<String>] attributes
49
- # @param [Hash] options
50
- # @yield Yields to block with backend as context
51
-
52
- # Defines mobility reader and presence method on model class.
53
- # @!method mobility_reader(*attributes, **options)
54
- # @param [Array<String>] attributes
55
- # @param [Hash] options
56
- # @yield Yields to block with backend as context
57
-
58
- # Defines mobility writer on model class.
59
- # @!method mobility_writer(*attributes, **options)
60
- # @param [Array<String>] attributes
61
- # @param [Hash] options
62
- # @yield Yields to block with backend as context
63
- %w[accessor reader writer].each do |method|
64
- class_eval <<-EOM, __FILE__, __LINE__ + 1
65
- def mobility_#{method}(*args, **options, &block)
66
- attributes = Attributes.new(*args, method: :#{method}, **options)
67
- attributes.backend.instance_eval(&block) if block_given?
68
- include attributes
69
- end
70
- EOM
71
- end
72
- end
73
- end