mobility 0.3.6 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/CHANGELOG.md +21 -0
  5. data/Gemfile +11 -9
  6. data/Gemfile.lock +9 -6
  7. data/README.md +50 -16
  8. data/lib/mobility.rb +18 -4
  9. data/lib/mobility/active_record.rb +14 -7
  10. data/lib/mobility/active_record/uniqueness_validator.rb +17 -3
  11. data/lib/mobility/attributes.rb +39 -16
  12. data/lib/mobility/backends/active_record/column/query_methods.rb +12 -11
  13. data/lib/mobility/backends/active_record/container.rb +116 -0
  14. data/lib/mobility/backends/active_record/container/query_methods.rb +31 -0
  15. data/lib/mobility/backends/active_record/hstore/query_methods.rb +7 -54
  16. data/lib/mobility/backends/active_record/jsonb/query_methods.rb +5 -55
  17. data/lib/mobility/backends/active_record/key_value.rb +13 -9
  18. data/lib/mobility/backends/active_record/key_value/query_methods.rb +6 -6
  19. data/lib/mobility/backends/active_record/pg_query_methods.rb +115 -0
  20. data/lib/mobility/backends/active_record/query_methods.rb +4 -3
  21. data/lib/mobility/backends/active_record/serialized/query_methods.rb +6 -5
  22. data/lib/mobility/backends/active_record/table.rb +18 -3
  23. data/lib/mobility/backends/active_record/table/query_methods.rb +25 -14
  24. data/lib/mobility/backends/container.rb +25 -0
  25. data/lib/mobility/backends/hash_valued.rb +2 -2
  26. data/lib/mobility/backends/null.rb +2 -2
  27. data/lib/mobility/backends/sequel/column.rb +2 -2
  28. data/lib/mobility/backends/sequel/column/query_methods.rb +2 -2
  29. data/lib/mobility/backends/sequel/container.rb +99 -0
  30. data/lib/mobility/backends/sequel/container/query_methods.rb +41 -0
  31. data/lib/mobility/backends/sequel/hstore/query_methods.rb +17 -3
  32. data/lib/mobility/backends/sequel/jsonb/query_methods.rb +17 -3
  33. data/lib/mobility/backends/sequel/key_value.rb +2 -1
  34. data/lib/mobility/backends/sequel/key_value/query_methods.rb +2 -2
  35. data/lib/mobility/backends/sequel/pg_hash.rb +4 -7
  36. data/lib/mobility/backends/sequel/pg_query_methods.rb +85 -0
  37. data/lib/mobility/backends/sequel/query_methods.rb +4 -3
  38. data/lib/mobility/backends/sequel/serialized/query_methods.rb +4 -3
  39. data/lib/mobility/backends/sequel/table.rb +1 -1
  40. data/lib/mobility/backends/sequel/table/query_methods.rb +2 -2
  41. data/lib/mobility/backends/serialized.rb +5 -7
  42. data/lib/mobility/configuration.rb +34 -4
  43. data/lib/mobility/plugins/active_record/dirty.rb +1 -1
  44. data/lib/mobility/plugins/fallbacks.rb +20 -6
  45. data/lib/mobility/sequel/column_changes.rb +2 -5
  46. data/lib/mobility/sequel/hash_initializer.rb +19 -0
  47. data/lib/mobility/util.rb +0 -2
  48. data/lib/mobility/version.rb +1 -1
  49. metadata +11 -4
  50. metadata.gz.sig +0 -0
  51. data/lib/mobility/backends/sequel/postgres_query_methods.rb +0 -41
@@ -1,4 +1,4 @@
1
- require 'mobility/backends/sequel/postgres_query_methods'
1
+ require 'mobility/backends/sequel/pg_query_methods'
2
2
  require "mobility/backends/sequel/query_methods"
3
3
 
4
4
  Sequel.extension :pg_json, :pg_json_ops
@@ -6,12 +6,12 @@ Sequel.extension :pg_json, :pg_json_ops
6
6
  module Mobility
7
7
  module Backends
8
8
  class Sequel::Jsonb::QueryMethods < Sequel::QueryMethods
9
- include PostgresQueryMethods
9
+ include Sequel::PgQueryMethods
10
10
 
11
11
  def initialize(attributes, _)
12
12
  super
13
13
 
14
- define_query_methods("pg_jsonb")
14
+ define_query_methods
15
15
 
16
16
  attributes.each do |attribute|
17
17
  define_method :"first_by_#{attribute}" do |value|
@@ -20,6 +20,20 @@ module Mobility
20
20
  end
21
21
  end
22
22
  end
23
+
24
+ private
25
+
26
+ def contains_value(key, value, locale)
27
+ build_op(key).contains({ locale => value }.to_json)
28
+ end
29
+
30
+ def has_locale(key, locale)
31
+ build_op(key).has_key?(locale)
32
+ end
33
+
34
+ def build_op(key)
35
+ ::Sequel.pg_jsonb_op(key)
36
+ end
23
37
  end
24
38
  end
25
39
  end
@@ -3,6 +3,7 @@ require "mobility/util"
3
3
  require "mobility/backends/sequel"
4
4
  require "mobility/backends/key_value"
5
5
  require "mobility/sequel/column_changes"
6
+ require "mobility/sequel/hash_initializer"
6
7
  require "mobility/sequel/string_translation"
7
8
  require "mobility/sequel/text_translation"
8
9
 
@@ -82,7 +83,7 @@ Implements the {Mobility::Backends::KeyValue} backend for Sequel models.
82
83
  end
83
84
  include callback_methods
84
85
 
85
- include Mobility::Sequel::ColumnChanges.new(attributes)
86
+ include Mobility::Sequel::ColumnChanges.new(*attributes)
86
87
 
87
88
  private
88
89
 
@@ -36,11 +36,11 @@ module Mobility
36
36
  end
37
37
 
38
38
  def define_query_methods(association_name)
39
- attributes_extractor = @attributes_extractor
39
+ q = self
40
40
 
41
41
  %w[exclude or where].each do |method_name|
42
42
  define_method method_name do |*conds, &block|
43
- if i18n_keys = attributes_extractor.call(conds.first)
43
+ if i18n_keys = q.extract_attributes(conds.first)
44
44
  cond = conds.first.dup
45
45
  i18n_nulls = i18n_keys.select { |key| cond[key].nil? }
46
46
  i18n_keys.each { |attr| cond[::Sequel[:"#{attr}_#{association_name}"][:value]] = cond.delete(attr) }
@@ -27,11 +27,7 @@ jsonb).
27
27
  end
28
28
 
29
29
  setup do |attributes|
30
- method_overrides = Module.new do
31
- define_method :initialize_set do |values|
32
- attributes.each { |attribute| self[attribute.to_sym] = {} }
33
- super(values)
34
- end
30
+ before_validation = Module.new do
35
31
  define_method :before_validation do
36
32
  attributes.each do |attribute|
37
33
  self[attribute.to_sym].delete_if { |_, v| Util.blank?(v) }
@@ -39,8 +35,9 @@ jsonb).
39
35
  super()
40
36
  end
41
37
  end
42
- include method_overrides
43
- include Mobility::Sequel::ColumnChanges.new(attributes)
38
+ include before_validation
39
+ include Mobility::Sequel::HashInitializer.new(*attributes)
40
+ include Mobility::Sequel::ColumnChanges.new(*attributes)
44
41
 
45
42
  plugin :defaults_setter
46
43
  attributes.each { |attribute| default_values[attribute.to_sym] = {} }
@@ -0,0 +1,85 @@
1
+ module Mobility
2
+ module Backends
3
+ module Sequel
4
+ =begin
5
+
6
+ Defines query methods for Postgres backends. Including class must define two
7
+ private methods:
8
+
9
+ - a private method +contains_value+ which takes a key (column name), value and
10
+ locale and returns an SQL expression, and checks that the column has the
11
+ specified value in the specified locale
12
+ - a private method +has_locale+ which takes a key (column name) and locale, and
13
+ returns an SQL expression which checks that the column has a value in the
14
+ locale
15
+
16
+ (The +contains_value+ method is implemented slightly differently for hstore and
17
+ jsonb columns.)
18
+
19
+ =end
20
+ module PgQueryMethods
21
+
22
+ # Create query for conditions and translated keys
23
+ # @note This is a destructive action, it will alter +cond+.
24
+ #
25
+ # @param [Hash] cond Hash of attribute/value pairs
26
+ # @param [Array] keys Translated attribute names
27
+ # @param [Boolean] invert Invert query, true for +exclude+, false otherwise
28
+ # @return [Sequel::SQL::Expression] Query expression
29
+ def create_query!(cond, keys, invert = false)
30
+ keys.map { |key|
31
+ values = cond.delete(key)
32
+ values = [values] unless values.is_a?(Array)
33
+ values.map { |value| create_query_op(key, value, invert) }.inject(&:|)
34
+ }.inject(invert ? :| : :&)
35
+ end
36
+
37
+ private
38
+
39
+ def define_query_methods
40
+ %w[exclude or where].each do |method_name|
41
+ define_query_method(method_name)
42
+ end
43
+ end
44
+
45
+ def define_query_method(method_name)
46
+ q = self
47
+
48
+ define_method method_name do |*cond, &block|
49
+ if i18n_keys = q.extract_attributes(cond.first)
50
+ cond = cond.first
51
+
52
+ query = q.create_query!(cond, i18n_keys, method_name == "exclude")
53
+ if method_name == "or"
54
+ query = ::Sequel.&(cond, query) unless cond.empty?
55
+ super(query, &block)
56
+ else
57
+ super(cond, &block).where(query)
58
+ end
59
+ else
60
+ super(*cond, &block)
61
+ end
62
+ end
63
+ end
64
+
65
+ def create_query_op(key, value, invert)
66
+ locale = Mobility.locale.to_s
67
+
68
+ if invert
69
+ has_locale(key, locale) & ~contains_value(key, value, locale)
70
+ else
71
+ value.nil? ? ~has_locale(key, locale) : contains_value(key, value, locale)
72
+ end
73
+ end
74
+
75
+ def contains_value(_key, _value, _locale)
76
+ raise NotImplementedError
77
+ end
78
+
79
+ def has_locale(_key, _locale)
80
+ raise NotImplementedError
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
@@ -13,9 +13,10 @@ models. For details see backend-specific subclasses.
13
13
  # @param [Array<String>] attributes Translated attributes
14
14
  def initialize(attributes, _)
15
15
  @attributes = attributes.map!(&:to_sym)
16
- @attributes_extractor = lambda do |cond|
17
- cond.is_a?(Hash) && Util.presence(cond.keys & attributes)
18
- end
16
+ end
17
+
18
+ def extract_attributes(cond)
19
+ cond.is_a?(Hash) && Util.presence(cond.keys & @attributes)
19
20
  end
20
21
  end
21
22
  end
@@ -3,13 +3,14 @@ require "mobility/backends/sequel/query_methods"
3
3
  module Mobility
4
4
  module Backends
5
5
  class Sequel::Serialized::QueryMethods < Sequel::QueryMethods
6
+ include Serialized
7
+
6
8
  def initialize(attributes, _)
7
9
  super
8
- attributes_extractor = @attributes_extractor
9
- cond_checker = Backends::Serialized.attr_checker(attributes_extractor)
10
+ q = self
10
11
 
11
12
  define_method :where do |*cond, &block|
12
- cond_checker.call(cond.first) || super(*cond, &block)
13
+ q.check_opts(cond.first) || super(*cond, &block)
13
14
  end
14
15
  end
15
16
  end
@@ -83,7 +83,7 @@ Implements the {Mobility::Backends::Table} backend for Sequel models.
83
83
  end
84
84
  include callback_methods
85
85
 
86
- include Mobility::Sequel::ColumnChanges.new(attributes)
86
+ include Mobility::Sequel::ColumnChanges.new(*attributes)
87
87
  end
88
88
 
89
89
  setup_query_methods(QueryMethods)
@@ -35,14 +35,14 @@ module Mobility
35
35
  end
36
36
 
37
37
  def define_query_methods(association_name, translation_class, **)
38
- attributes_extractor = @attributes_extractor
38
+ q = self
39
39
 
40
40
  # See note in AR Table QueryMethods class about limitations of
41
41
  # query methods on translated attributes when searching on nil values.
42
42
  #
43
43
  %w[exclude or where].each do |method_name|
44
44
  define_method method_name do |*conds, &block|
45
- if i18n_keys = attributes_extractor.call(conds.first)
45
+ if i18n_keys = q.extract_attributes(conds.first)
46
46
  cond = conds.first.dup
47
47
  outer_join = method_name == "or" || i18n_keys.all? { |key| cond[key].nil? }
48
48
  i18n_keys.each { |attr| cond[::Sequel[translation_class.table_name][attr]] = cond.delete(attr) }
@@ -60,14 +60,12 @@ Format for serialization. Either +:yaml+ (default) or +:json+.
60
60
  lambda { |v| JSON.parse(v, symbolize_names: true) }
61
61
  end
62
62
  end
63
+ end
63
64
 
64
- def attr_checker(attributes_extractor)
65
- lambda do |cond|
66
- if keys = attributes_extractor.call(cond)
67
- raise ArgumentError,
68
- "You cannot query on mobility attributes translated with the Serialized backend (#{keys.join(", ")})."
69
- end
70
- end
65
+ def check_opts(opts)
66
+ if keys = extract_attributes(opts)
67
+ raise ArgumentError,
68
+ "You cannot query on mobility attributes translated with the Serialized backend (#{keys.join(", ")})."
71
69
  end
72
70
  end
73
71
  end
@@ -45,12 +45,42 @@ Set each option on the default_options hash instead, like this:
45
45
  # @return [Array<Symbol>]
46
46
  attr_accessor :plugins
47
47
 
48
- # Default fallbacks instance
48
+ # Generate new fallbacks instance
49
+ # @note This method will call the proc defined in the variable set by the
50
+ # +fallbacks_generator=+ setter, passing the first argument to its `call`
51
+ # method. By default the generator returns an instance of
52
+ # +I18n::Locale::Fallbacks+.
53
+ # @param fallbacks [Hash] Fallbacks hash passed to generator
49
54
  # @return [I18n::Locale::Fallbacks]
55
+ def new_fallbacks(fallbacks = {})
56
+ @fallbacks_generator.call(fallbacks)
57
+ end
58
+
59
+ # Assign proc which, passed a set of fallbacks, returns a default fallbacks
60
+ # instance. By default this is a proc which takes fallbacks and returns an
61
+ # instance of +I18n::Locale::Fallbacks+.
62
+ # @param [Proc] fallbacks generator
63
+ attr_writer :fallbacks_generator
64
+
65
+ # @deprecated Use {#new_fallbacks} instead.
50
66
  def default_fallbacks(fallbacks = {})
51
- @default_fallbacks.call(fallbacks)
67
+ warn %{
68
+ WARNING: The default_fallbacks configuration getter has been renamed
69
+ new_fallbacks to avoid confusion. The original method default_fallbacks will be
70
+ removed in the next major version of Mobility.
71
+ }
72
+ new_fallbacks(fallbacks)
73
+ end
74
+
75
+ # @deprecated Use {#fallbacks_generator=} instead.
76
+ def default_fallbacks=(fallbacks)
77
+ warn %{
78
+ WARNING: The default_fallbacks= configuration setter has been renamed
79
+ fallbacks_generator= to avoid confusion. The original method
80
+ default_fallbacks= will be removed in the next major version of Mobility.
81
+ }
82
+ self.fallbacks_generator = fallbacks
52
83
  end
53
- attr_writer :default_fallbacks
54
84
 
55
85
  # Default backend to use (can be symbol or actual backend class)
56
86
  # @return [Symbol,Class]
@@ -71,7 +101,7 @@ Set each option on the default_options hash instead, like this:
71
101
  def initialize
72
102
  @accessor_method = :translates
73
103
  @query_method = :i18n
74
- @default_fallbacks = lambda { |fallbacks| I18n::Locale::Fallbacks.new(fallbacks) }
104
+ @fallbacks_generator = lambda { |fallbacks| I18n::Locale::Fallbacks.new(fallbacks) }
75
105
  @default_accessor_locales = lambda { I18n.available_locales }
76
106
  @default_options = Options[{
77
107
  cache: true,
@@ -9,7 +9,7 @@ module Mobility
9
9
  Dirty tracking for AR models. See {Mobility::Plugins::ActiveModel::Dirty} for
10
10
  details on usage.
11
11
 
12
- In addition to methods added by {Mobility::Plugins::ActiveModel::Diryt}, the
12
+ In addition to methods added by {Mobility::Plugins::ActiveModel::Dirty}, the
13
13
  AR::Dirty plugin adds support for the following persistence-specific methods
14
14
  (for a model with a translated attribute +title+):
15
15
  - +saved_changes+
@@ -8,12 +8,14 @@ Falls back to one or more alternative locales in case no value is defined for a
8
8
  given locale.
9
9
 
10
10
  For +fallbacks: true+, Mobility will use the value of
11
- {Mobility::Configuration#default_fallbacks} for the fallbacks instance. This
12
- defaults to an instance of +I18n::Locale::Fallbacks+, but can be configured
13
- (see {Mobility::Configuration}).
11
+ {Mobility::Configuration#new_fallbacks} for the fallbacks instance. This
12
+ defaults to an instance of +I18n::Locale::Fallbacks+, but can be
13
+ configured (see {Mobility::Configuration}).
14
14
 
15
15
  If a hash is passed to the +fallbacks+ option, a new fallbacks instance will be
16
- created for the model with the hash defining additional fallbacks.
16
+ created for the model with the hash defining additional fallbacks. To set a
17
+ default value for this hash, use set the value of `default_options[:fallbacks]`
18
+ in your Mobility configuration (see below).
17
19
 
18
20
  In addition, fallbacks are disabled in certain situation. To explicitly disable
19
21
  fallbacks when reading and writing, you can pass the <tt>fallback: false</tt>
@@ -102,6 +104,18 @@ the current locale was +nil+.
102
104
  post.title_fr
103
105
  #=> nil
104
106
 
107
+ @example Setting default fallbacks across all models
108
+ Mobility.configure do |config|
109
+ # ...
110
+ config.default_options[:fallbacks] = { :'fr' => 'en' }
111
+ # ...
112
+ end
113
+
114
+ class Post
115
+ # Post will fallback from French to English by default
116
+ translates :title, fallbacks: true
117
+ end
118
+
105
119
  =end
106
120
  class Fallbacks < Module
107
121
  # Applies fallbacks plugin to attributes.
@@ -133,9 +147,9 @@ the current locale was +nil+.
133
147
 
134
148
  def convert_option_to_fallbacks(option)
135
149
  if option.is_a?(Hash)
136
- Mobility.default_fallbacks(option)
150
+ Mobility.new_fallbacks(option)
137
151
  elsif option == true
138
- Mobility.default_fallbacks
152
+ Mobility.new_fallbacks
139
153
  else
140
154
  Hash.new { [] }
141
155
  end
@@ -8,17 +8,14 @@ setter method is called.
8
8
  =end
9
9
  class ColumnChanges < Module
10
10
  # @param [Array<String>] attributes Backend attributes
11
- def initialize(attributes)
12
- @attributes = attributes
13
-
11
+ def initialize(*attributes)
14
12
  attributes.each do |attribute|
15
13
  define_method "#{attribute}=".freeze do |value, **options|
16
14
  if !options[:super] && send(attribute) != value
17
15
  locale = options[:locale] || Mobility.locale
18
16
  column = attribute.to_sym
19
17
  column_with_locale = :"#{attribute}_#{Mobility.normalize_locale(locale)}"
20
- @changed_columns << column_with_locale if !changed_columns.include?(column_with_locale)
21
- @changed_columns << column if !changed_columns.include?(column)
18
+ @changed_columns = changed_columns | [column, column_with_locale]
22
19
  end
23
20
  super(value, **options)
24
21
  end
@@ -0,0 +1,19 @@
1
+ module Mobility
2
+ module Sequel
3
+ =begin
4
+
5
+ Internal class used to initialize column value(s) by default to a hash.
6
+
7
+ =end
8
+ class HashInitializer < Module
9
+ def initialize(*columns)
10
+ class_eval <<-EOM, __FILE__, __LINE__ + 1
11
+ def initialize_set(values)
12
+ #{columns.map { |c| "self[:#{c}] = {}" }.join(';')}
13
+ super
14
+ end
15
+ EOM
16
+ end
17
+ end
18
+ end
19
+ end
data/lib/mobility/util.rb CHANGED
@@ -1,5 +1,3 @@
1
- require "singleton"
2
-
3
1
  module Mobility
4
2
  =begin
5
3
 
@@ -1,3 +1,3 @@
1
1
  module Mobility
2
- VERSION = "0.3.6"
2
+ VERSION = "0.4.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mobility
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.6
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Salzberg
@@ -30,7 +30,7 @@ cert_chain:
30
30
  eGDROPZoL5RXwiOnRbexxa7dcAxMrDfGB/hpiunIPWPsi4n5P7K/6OO/sGVMl9xv
31
31
  SZBPXjzrHdyOFLBYXB+PG7s3F/4=
32
32
  -----END CERTIFICATE-----
33
- date: 2017-12-25 00:00:00.000000000 Z
33
+ date: 2018-01-24 00:00:00.000000000 Z
34
34
  dependencies:
35
35
  - !ruby/object:Gem::Dependency
36
36
  name: request_store
@@ -184,6 +184,8 @@ files:
184
184
  - lib/mobility/backends/active_record.rb
185
185
  - lib/mobility/backends/active_record/column.rb
186
186
  - lib/mobility/backends/active_record/column/query_methods.rb
187
+ - lib/mobility/backends/active_record/container.rb
188
+ - lib/mobility/backends/active_record/container/query_methods.rb
187
189
  - lib/mobility/backends/active_record/hstore.rb
188
190
  - lib/mobility/backends/active_record/hstore/query_methods.rb
189
191
  - lib/mobility/backends/active_record/jsonb.rb
@@ -191,12 +193,14 @@ files:
191
193
  - lib/mobility/backends/active_record/key_value.rb
192
194
  - lib/mobility/backends/active_record/key_value/query_methods.rb
193
195
  - lib/mobility/backends/active_record/pg_hash.rb
196
+ - lib/mobility/backends/active_record/pg_query_methods.rb
194
197
  - lib/mobility/backends/active_record/query_methods.rb
195
198
  - lib/mobility/backends/active_record/serialized.rb
196
199
  - lib/mobility/backends/active_record/serialized/query_methods.rb
197
200
  - lib/mobility/backends/active_record/table.rb
198
201
  - lib/mobility/backends/active_record/table/query_methods.rb
199
202
  - lib/mobility/backends/column.rb
203
+ - lib/mobility/backends/container.rb
200
204
  - lib/mobility/backends/hash_valued.rb
201
205
  - lib/mobility/backends/hstore.rb
202
206
  - lib/mobility/backends/jsonb.rb
@@ -205,6 +209,8 @@ files:
205
209
  - lib/mobility/backends/sequel.rb
206
210
  - lib/mobility/backends/sequel/column.rb
207
211
  - lib/mobility/backends/sequel/column/query_methods.rb
212
+ - lib/mobility/backends/sequel/container.rb
213
+ - lib/mobility/backends/sequel/container/query_methods.rb
208
214
  - lib/mobility/backends/sequel/hstore.rb
209
215
  - lib/mobility/backends/sequel/hstore/query_methods.rb
210
216
  - lib/mobility/backends/sequel/jsonb.rb
@@ -212,7 +218,7 @@ files:
212
218
  - lib/mobility/backends/sequel/key_value.rb
213
219
  - lib/mobility/backends/sequel/key_value/query_methods.rb
214
220
  - lib/mobility/backends/sequel/pg_hash.rb
215
- - lib/mobility/backends/sequel/postgres_query_methods.rb
221
+ - lib/mobility/backends/sequel/pg_query_methods.rb
216
222
  - lib/mobility/backends/sequel/query_methods.rb
217
223
  - lib/mobility/backends/sequel/serialized.rb
218
224
  - lib/mobility/backends/sequel/serialized/query_methods.rb
@@ -242,6 +248,7 @@ files:
242
248
  - lib/mobility/sequel.rb
243
249
  - lib/mobility/sequel/backend_resetter.rb
244
250
  - lib/mobility/sequel/column_changes.rb
251
+ - lib/mobility/sequel/hash_initializer.rb
245
252
  - lib/mobility/sequel/model_translation.rb
246
253
  - lib/mobility/sequel/string_translation.rb
247
254
  - lib/mobility/sequel/text_translation.rb
@@ -276,7 +283,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
276
283
  requirements:
277
284
  - - ">="
278
285
  - !ruby/object:Gem::Version
279
- version: 2.2.7
286
+ version: 2.2.9
280
287
  required_rubygems_version: !ruby/object:Gem::Requirement
281
288
  requirements:
282
289
  - - ">="