mobility 1.0.0.alpha → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) 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 +54 -1
  5. data/Gemfile +5 -16
  6. data/Gemfile.lock +30 -82
  7. data/README.md +24 -29
  8. data/lib/mobility.rb +67 -9
  9. data/lib/mobility/backend.rb +8 -10
  10. data/lib/mobility/backends.rb +1 -1
  11. data/lib/mobility/backends/active_record.rb +1 -1
  12. data/lib/mobility/backends/active_record/column.rb +1 -1
  13. data/lib/mobility/backends/active_record/container.rb +6 -9
  14. data/lib/mobility/backends/active_record/hstore.rb +4 -4
  15. data/lib/mobility/backends/active_record/json.rb +3 -3
  16. data/lib/mobility/backends/active_record/jsonb.rb +3 -3
  17. data/lib/mobility/backends/active_record/key_value.rb +27 -11
  18. data/lib/mobility/backends/active_record/serialized.rb +4 -0
  19. data/lib/mobility/backends/active_record/table.rb +12 -7
  20. data/lib/mobility/backends/container.rb +10 -2
  21. data/lib/mobility/backends/hash_valued.rb +4 -0
  22. data/lib/mobility/backends/jsonb.rb +1 -1
  23. data/lib/mobility/backends/key_value.rb +12 -15
  24. data/lib/mobility/backends/sequel.rb +34 -2
  25. data/lib/mobility/backends/sequel/container.rb +8 -8
  26. data/lib/mobility/backends/sequel/hstore.rb +1 -1
  27. data/lib/mobility/backends/sequel/json.rb +1 -0
  28. data/lib/mobility/backends/sequel/key_value.rb +79 -12
  29. data/lib/mobility/backends/sequel/pg_hash.rb +6 -6
  30. data/lib/mobility/backends/sequel/serialized.rb +4 -0
  31. data/lib/mobility/backends/sequel/table.rb +18 -8
  32. data/lib/mobility/backends/table.rb +29 -29
  33. data/lib/mobility/pluggable.rb +21 -1
  34. data/lib/mobility/plugin.rb +2 -2
  35. data/lib/mobility/plugins.rb +2 -0
  36. data/lib/mobility/plugins/active_model/dirty.rb +11 -5
  37. data/lib/mobility/plugins/active_record.rb +3 -0
  38. data/lib/mobility/plugins/active_record/backend.rb +2 -0
  39. data/lib/mobility/plugins/active_record/query.rb +7 -7
  40. data/lib/mobility/plugins/active_record/uniqueness_validation.rb +5 -1
  41. data/lib/mobility/plugins/arel.rb +125 -0
  42. data/lib/mobility/plugins/arel/nodes.rb +15 -0
  43. data/lib/mobility/plugins/arel/nodes/pg_ops.rb +134 -0
  44. data/lib/mobility/plugins/attribute_methods.rb +1 -0
  45. data/lib/mobility/plugins/attributes.rb +17 -15
  46. data/lib/mobility/plugins/backend.rb +45 -22
  47. data/lib/mobility/plugins/cache.rb +12 -5
  48. data/lib/mobility/plugins/default.rb +1 -1
  49. data/lib/mobility/plugins/fallbacks.rb +4 -4
  50. data/lib/mobility/plugins/fallthrough_accessors.rb +5 -6
  51. data/lib/mobility/plugins/locale_accessors.rb +2 -5
  52. data/lib/mobility/plugins/presence.rb +1 -1
  53. data/lib/mobility/plugins/reader.rb +2 -2
  54. data/lib/mobility/plugins/sequel/dirty.rb +2 -2
  55. data/lib/mobility/plugins/writer.rb +1 -1
  56. data/lib/mobility/version.rb +2 -2
  57. data/lib/rails/generators/mobility/templates/create_string_translations.rb +0 -1
  58. data/lib/rails/generators/mobility/templates/create_text_translations.rb +0 -1
  59. data/lib/rails/generators/mobility/templates/initializer.rb +11 -3
  60. metadata +14 -20
  61. metadata.gz.sig +0 -0
  62. data/lib/mobility/active_record/model_translation.rb +0 -14
  63. data/lib/mobility/active_record/string_translation.rb +0 -10
  64. data/lib/mobility/active_record/text_translation.rb +0 -10
  65. data/lib/mobility/active_record/translation.rb +0 -14
  66. data/lib/mobility/arel.rb +0 -49
  67. data/lib/mobility/arel/nodes.rb +0 -13
  68. data/lib/mobility/arel/nodes/pg_ops.rb +0 -132
  69. data/lib/mobility/arel/visitor.rb +0 -61
  70. data/lib/mobility/sequel/column_changes.rb +0 -28
  71. data/lib/mobility/sequel/hash_initializer.rb +0 -21
  72. data/lib/mobility/sequel/model_translation.rb +0 -20
  73. data/lib/mobility/sequel/sql.rb +0 -16
  74. data/lib/mobility/sequel/string_translation.rb +0 -10
  75. data/lib/mobility/sequel/text_translation.rb +0 -10
  76. data/lib/mobility/sequel/translation.rb +0 -53
@@ -15,6 +15,7 @@ attributes only.
15
15
  extend Plugin
16
16
 
17
17
  default true
18
+ requires :attributes
18
19
 
19
20
  initialize_hook do |*names|
20
21
  include InstanceMethods
@@ -32,8 +32,15 @@ for aggregating attributes.
32
32
  end
33
33
 
34
34
  included_hook do |klass|
35
- klass.extend ClassMethods
36
- @names.each { |name| klass.register_mobility_attribute(name) }
35
+ names = @names
36
+
37
+ klass.class_eval do
38
+ extend ClassMethods
39
+ names.each { |name| mobility_attributes << name.to_s }
40
+ mobility_attributes.uniq!
41
+ rescue FrozenError
42
+ raise FrozenAttributesError, "Attempting to translate these attributes on #{klass}, which has already been subclassed: #{names.join(', ')}."
43
+ end
37
44
  end
38
45
 
39
46
  module ClassMethods
@@ -44,25 +51,20 @@ for aggregating attributes.
44
51
  mobility_attributes.include?(name.to_s)
45
52
  end
46
53
 
47
- # Register a new attribute name. Public, but treat as internal.
48
- # @param [String, Symbol] Attribute name
49
- def register_mobility_attribute(name)
50
- (self.mobility_attributes << name.to_s).uniq!
51
- end
52
-
53
- def inherited(klass)
54
- super
55
- mobility_attributes.each { |name| klass.register_mobility_attribute(name) }
56
- end
57
-
58
- protected
59
-
60
54
  # Return translated attribute names on this model.
61
55
  # @return [Array<String>] Attribute names
62
56
  def mobility_attributes
63
57
  @mobility_attributes ||= []
64
58
  end
59
+
60
+ def inherited(klass)
61
+ super
62
+ attrs = mobility_attributes.freeze # ensure attributes are not modified after being inherited
63
+ klass.class_eval { @mobility_attributes = attrs.dup }
64
+ end
65
65
  end
66
+
67
+ class FrozenAttributesError < Error; end
66
68
  end
67
69
 
68
70
  register_plugin(:attributes, Attributes)
@@ -32,18 +32,12 @@ Defines:
32
32
 
33
33
  def initialize(*args, **original_options)
34
34
  super
35
- return unless Plugins::Backend.dependencies_satisfied?(self.class)
36
35
 
37
- case options[:backend]
38
- when String, Symbol, Class
39
- @backend, @backend_options = options[:backend], options
40
- when Array
41
- @backend, @backend_options = options[:backend]
42
- @backend_options = @backend_options.merge(original_options)
43
- when NilClass
44
- @backend = @backend_options = nil
45
- else
46
- raise ArgumentError, "backend must be either a backend name, a backend class, or a two-element array"
36
+ # Validate that the default backend from config has valid keys
37
+ if (default = self.class.defaults[:backend])
38
+ name, backend_options = default
39
+ extra_keys = backend_options.keys - backend.valid_keys
40
+ raise InvalidOptionKey, "These are not valid #{name} backend keys: #{extra_keys.join(', ')}." unless extra_keys.empty?
47
41
  end
48
42
 
49
43
  include InstanceMethods
@@ -58,13 +52,15 @@ Defines:
58
52
  klass.extend ClassMethods
59
53
 
60
54
  if backend
61
- @backend_class = load_backend(backend).
62
- build_subclass(klass, backend_options)
55
+ @backend_class = backend.build_subclass(klass, backend_options)
63
56
 
64
57
  backend_class.setup_model(klass, names)
65
58
 
66
- @names.each do |name|
67
- klass.register_mobility_backend_class(name, @backend_class)
59
+ names = @names
60
+ backend_class = @backend_class
61
+
62
+ klass.class_eval do
63
+ names.each { |name| mobility_backend_classes[name.to_sym] = backend_class }
68
64
  end
69
65
 
70
66
  backend_class
@@ -83,10 +79,38 @@ Defines:
83
79
  raise e, "could not find a #{backend} backend. Did you forget to include an ORM plugin like active_record or sequel?"
84
80
  end
85
81
 
82
+ private
83
+
84
+ # Override to extract backend options from options hash.
85
+ def initialize_options(original_options)
86
+ super
87
+
88
+ case options[:backend]
89
+ when String, Symbol, Class
90
+ @backend, @backend_options = options[:backend], options
91
+ when Array
92
+ @backend, @backend_options = options[:backend]
93
+ @backend_options = @backend_options.merge(original_options)
94
+ when NilClass
95
+ @backend = @backend_options = nil
96
+ else
97
+ raise ArgumentError, "backend must be either a backend name, a backend class, or a two-element array"
98
+ end
99
+
100
+ @backend = load_backend(backend)
101
+ end
102
+
103
+ # Override default validation to exclude backend options, which may be
104
+ # mixed in with plugin options.
105
+ def validate_options(options)
106
+ return super unless backend
107
+ super(options.slice(*(options.keys - backend.valid_keys)))
108
+ end
109
+
86
110
  # Override default argument-handling in DSL to store kwargs passed along
87
111
  # with plugin name.
88
- def self.configure_default(defaults, key, *args, **kwargs)
89
- defaults[key] = [args[0], kwargs] unless args.empty?
112
+ def self.configure_default(defaults, key, backend = nil, backend_options = {})
113
+ defaults[key] = [backend, backend_options] if backend
90
114
  end
91
115
 
92
116
  module InstanceMethods
@@ -116,12 +140,9 @@ Defines:
116
140
  raise KeyError, "No backend for: #{name}"
117
141
  end
118
142
 
119
- def register_mobility_backend_class(name, backend_class)
120
- mobility_backend_classes[name.to_sym] = backend_class
121
- end
122
-
123
143
  def inherited(klass)
124
- klass.mobility_backend_classes.merge!(@mobility_backend_classes)
144
+ parent_classes = mobility_backend_classes.freeze # ensure backend classes are not modified after being inherited
145
+ klass.class_eval { @mobility_backend_classes = parent_classes.dup }
125
146
  super
126
147
  end
127
148
 
@@ -131,6 +152,8 @@ Defines:
131
152
  @mobility_backend_classes ||= {}
132
153
  end
133
154
  end
155
+
156
+ class InvalidOptionKey < Error; end
134
157
  end
135
158
 
136
159
  register_plugin(:backend, Backend)
@@ -7,8 +7,7 @@ module Mobility
7
7
  Caches values fetched from the backend so subsequent fetches can be performed
8
8
  more quickly. The cache stores cached values in a simple hash, which is not
9
9
  optimal for some storage strategies, so some backends (KeyValue, Table) use a
10
- custom module through the {Mobility::Backend::Setup#apply_plugin} hook. For
11
- details see the documentation for these backends.
10
+ custom module by defining a method, +include_cache+, on the backend class.
12
11
 
13
12
  The cache is reset when one of a set of events happens (saving, reloading,
14
13
  etc.). See {BackendResetter} for details.
@@ -28,12 +27,20 @@ Values are added to the cache in two ways:
28
27
  # Applies cache plugin to attributes.
29
28
  included_hook do |_, backend_class|
30
29
  if options[:cache]
31
- backend_class.include(BackendMethods) unless backend_class.apply_plugin(:cache)
30
+ if backend_class.respond_to?(:include_cache)
31
+ backend_class.include_cache
32
+ else
33
+ include_cache(backend_class)
34
+ end
32
35
  end
33
36
  end
34
37
 
35
38
  private
36
39
 
40
+ def include_cache(backend_class)
41
+ backend_class.include BackendMethods
42
+ end
43
+
37
44
  # Used in ORM cache plugins
38
45
  def define_cache_hooks(klass, *reset_methods)
39
46
  mod = self
@@ -55,11 +62,11 @@ Values are added to the cache in two ways:
55
62
  # @!method read(locale, value, options = {})
56
63
  # @option options [Boolean] cache *false* to disable cache.
57
64
  def read(locale, **options)
58
- return super(locale, options) if options.delete(:cache) == false
65
+ return super(locale, **options) if options.delete(:cache) == false
59
66
  if cache.has_key?(locale)
60
67
  cache[locale]
61
68
  else
62
- cache[locale] = super(locale, options)
69
+ cache[locale] = super(locale, **options)
63
70
  end
64
71
  end
65
72
 
@@ -90,7 +90,7 @@ The proc can accept zero to three arguments (see examples below)
90
90
  # *false* to disable presence filter.
91
91
  def read(locale, accessor_options = {})
92
92
  default = accessor_options.has_key?(:default) ? accessor_options.delete(:default) : options[:default]
93
- if (value = super(locale, accessor_options)).nil?
93
+ if (value = super(locale, **accessor_options)).nil?
94
94
  Default[default, locale: locale, accessor_options: accessor_options, model: model, attribute: attribute]
95
95
  else
96
96
  value
@@ -47,7 +47,7 @@ the current locale was +nil+.
47
47
  Mobility.locale = :ja
48
48
  post.title
49
49
  #=> "foo"
50
-
50
+
51
51
  post.title = "bar"
52
52
  post.title
53
53
  #=> "bar"
@@ -144,15 +144,15 @@ the current locale was +nil+.
144
144
 
145
145
  def define_read(fallbacks)
146
146
  define_method :read do |locale, fallback: true, **options|
147
- return super(locale, options) if !fallback || options[:locale]
147
+ return super(locale, **options) if !fallback || options[:locale]
148
148
 
149
149
  locales = fallback == true ? fallbacks[locale] : [locale, *fallback]
150
150
  locales.each do |fallback_locale|
151
- value = super(fallback_locale, options)
151
+ value = super(fallback_locale, **options)
152
152
  return value if Util.present?(value)
153
153
  end
154
154
 
155
- super(locale, options)
155
+ super(locale, **options)
156
156
  end
157
157
  end
158
158
 
@@ -24,14 +24,11 @@ model class is generated.
24
24
 
25
25
  default true
26
26
 
27
- requires :reader
28
- requires :writer
29
-
30
27
  # Apply fallthrough accessors plugin to attributes.
31
28
  # @param [Translations] translations
32
29
  # @param [Boolean] option
33
30
  initialize_hook do
34
- if options[:fallthrough_accessors] && options[:reader] && options[:writer]
31
+ if options[:fallthrough_accessors]
35
32
  define_fallthrough_accessors(names)
36
33
  end
37
34
  end
@@ -47,9 +44,11 @@ model class is generated.
47
44
  locale, suffix = $2.split('_')
48
45
  locale = "#{locale}-#{suffix.upcase}" if suffix
49
46
  if $4 == '=' # writer
50
- public_send(attribute_method, args[0], **(args[1] || {}), locale: locale)
47
+ kwargs = args[1].is_a?(Hash) ? args[1] : {}
48
+ public_send(attribute_method, args[0], **kwargs, locale: locale)
51
49
  else # reader
52
- public_send(attribute_method, **(args[0] || {}), locale: locale)
50
+ kwargs = args[0].is_a?(Hash) ? args[0] : {}
51
+ public_send(attribute_method, **kwargs, locale: locale)
53
52
  end
54
53
  else
55
54
  super(method_name, *args, &block)
@@ -19,9 +19,6 @@ available locales for a Rails application) will be used by default.
19
19
 
20
20
  default true
21
21
 
22
- requires :reader
23
- requires :writer
24
-
25
22
  # Apply locale accessors plugin to attributes.
26
23
  # @param [Translations] translations
27
24
  # @param [Boolean] option
@@ -30,8 +27,8 @@ available locales for a Rails application) will be used by default.
30
27
  locales = Mobility.available_locales if locales == true
31
28
  names.each do |name|
32
29
  locales.each do |locale|
33
- define_locale_reader(name, locale) if options[:reader]
34
- define_locale_writer(name, locale) if options[:writer]
30
+ define_locale_reader(name, locale)
31
+ define_locale_writer(name, locale)
35
32
  end
36
33
  end
37
34
  end
@@ -39,7 +39,7 @@ backend.
39
39
  if options.delete(:presence) == false
40
40
  super
41
41
  else
42
- super(locale, Presence[value], options)
42
+ super(locale, Presence[value], **options)
43
43
  end
44
44
  end
45
45
  # @!endgroup
@@ -19,13 +19,13 @@ Defines attribute reader that delegates to +Mobility::Backend#read+.
19
19
  class_eval <<-EOM, __FILE__, __LINE__ + 1
20
20
  def #{name}(locale: nil, **options)
21
21
  #{Reader.setup_source}
22
- mobility_backends[:#{name}].read(locale, options)
22
+ mobility_backends[:#{name}].read(locale, **options)
23
23
  end
24
24
  EOM
25
25
  class_eval <<-EOM, __FILE__, __LINE__ + 1
26
26
  def #{name}?(locale: nil, **options)
27
27
  #{Reader.setup_source}
28
- mobility_backends[:#{name}].present?(locale, options)
28
+ mobility_backends[:#{name}].present?(locale, **options)
29
29
  end
30
30
  EOM
31
31
  end
@@ -51,12 +51,12 @@ Automatically includes dirty plugin in model class when enabled.
51
51
  # @!group Backend Accessors
52
52
  # @!macro backend_writer
53
53
  # @param [Hash] options
54
- def write(locale, value, options = {})
54
+ def write(locale, value, **options)
55
55
  locale_accessor = Mobility.normalize_locale_accessor(attribute, locale).to_sym
56
56
  if model.column_changes.has_key?(locale_accessor) && model.initial_values[locale_accessor] == value
57
57
  super
58
58
  [model.changed_columns, model.initial_values].each { |h| h.delete(locale_accessor) }
59
- elsif read(locale, options.merge(fallback: false)) != value
59
+ elsif read(locale, **options.merge(fallback: false)) != value
60
60
  model.will_change_column(locale_accessor)
61
61
  super
62
62
  end
@@ -19,7 +19,7 @@ Defines attribute writer that delegates to +Mobility::Backend#write+.
19
19
  class_eval <<-EOM, __FILE__, __LINE__ + 1
20
20
  def #{name}=(value, locale: nil, **options)
21
21
  #{Writer.setup_source}
22
- mobility_backends[:#{name}].write(locale, value, options)
22
+ mobility_backends[:#{name}].write(locale, value, **options)
23
23
  end
24
24
  EOM
25
25
  end
@@ -8,8 +8,8 @@ module Mobility
8
8
  module VERSION
9
9
  MAJOR = 1
10
10
  MINOR = 0
11
- TINY = 0
12
- PRE = "alpha"
11
+ TINY = 1
12
+ PRE = nil
13
13
 
14
14
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
15
15
  end
@@ -1,5 +1,4 @@
1
1
  class CreateStringTranslations < <%= activerecord_migration_class %>
2
-
3
2
  def change
4
3
  create_table :mobility_string_translations do |t|
5
4
  t.string :locale, null: false
@@ -1,5 +1,4 @@
1
1
  class CreateTextTranslations < <%= activerecord_migration_class %>
2
-
3
2
  def change
4
3
  create_table :mobility_text_translations do |t|
5
4
  t.string :locale, null: false
@@ -1,7 +1,6 @@
1
- Mobility.configure do |config|
2
-
1
+ Mobility.configure do
3
2
  # PLUGINS
4
- config.plugins do
3
+ plugins do
5
4
  # Backend
6
5
  #
7
6
  # Sets the default backend to use in models. This can be overridden in models
@@ -104,5 +103,14 @@ Mobility.configure do |config|
104
103
  #
105
104
  # Or define specific defaults by uncommenting line below
106
105
  # locale_accessors [:en, :ja]
106
+
107
+ # Attribute Methods
108
+ #
109
+ # Adds translated attributes to +attributes+ hash, and defines methods
110
+ # +translated_attributes+ and +untranslated_attributes+ which return hashes
111
+ # with translated and untranslated attributes, respectively. Be aware that
112
+ # this plugin can create conflicts with other gems.
113
+ #
114
+ # attribute_methods
107
115
  end
108
116
  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: 1.0.0.alpha
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Salzberg
@@ -34,7 +34,7 @@ cert_chain:
34
34
  gSQml7TqcC6dZRsZRwYqzD9kUwdAJoCqno2CBUKs2l0yQAjFT36lRrVJznb7uWwa
35
35
  xpPFnsrtyaZW6Dty8TSG3qzmeGpmpIotA8x1VA==
36
36
  -----END CERTIFICATE-----
37
- date: 2020-10-25 00:00:00.000000000 Z
37
+ date: 2020-12-21 00:00:00.000000000 Z
38
38
  dependencies:
39
39
  - !ruby/object:Gem::Dependency
40
40
  name: request_store
@@ -156,14 +156,6 @@ files:
156
156
  - README.md
157
157
  - Rakefile
158
158
  - lib/mobility.rb
159
- - lib/mobility/active_record/model_translation.rb
160
- - lib/mobility/active_record/string_translation.rb
161
- - lib/mobility/active_record/text_translation.rb
162
- - lib/mobility/active_record/translation.rb
163
- - lib/mobility/arel.rb
164
- - lib/mobility/arel/nodes.rb
165
- - lib/mobility/arel/nodes/pg_ops.rb
166
- - lib/mobility/arel/visitor.rb
167
159
  - lib/mobility/backend.rb
168
160
  - lib/mobility/backends.rb
169
161
  - lib/mobility/backends/active_record.rb
@@ -209,6 +201,9 @@ files:
209
201
  - lib/mobility/plugins/active_record/dirty.rb
210
202
  - lib/mobility/plugins/active_record/query.rb
211
203
  - lib/mobility/plugins/active_record/uniqueness_validation.rb
204
+ - lib/mobility/plugins/arel.rb
205
+ - lib/mobility/plugins/arel/nodes.rb
206
+ - lib/mobility/plugins/arel/nodes/pg_ops.rb
212
207
  - lib/mobility/plugins/attribute_methods.rb
213
208
  - lib/mobility/plugins/attributes.rb
214
209
  - lib/mobility/plugins/backend.rb
@@ -228,13 +223,6 @@ files:
228
223
  - lib/mobility/plugins/sequel/dirty.rb
229
224
  - lib/mobility/plugins/sequel/query.rb
230
225
  - lib/mobility/plugins/writer.rb
231
- - lib/mobility/sequel/column_changes.rb
232
- - lib/mobility/sequel/hash_initializer.rb
233
- - lib/mobility/sequel/model_translation.rb
234
- - lib/mobility/sequel/sql.rb
235
- - lib/mobility/sequel/string_translation.rb
236
- - lib/mobility/sequel/text_translation.rb
237
- - lib/mobility/sequel/translation.rb
238
226
  - lib/mobility/translations.rb
239
227
  - lib/mobility/util.rb
240
228
  - lib/mobility/version.rb
@@ -259,7 +247,13 @@ metadata:
259
247
  homepage_uri: https://github.com/shioyama/mobility
260
248
  source_code_uri: https://github.com/shioyama/mobility
261
249
  changelog_uri: https://github.com/shioyama/mobility/blob/master/CHANGELOG.md
262
- post_install_message:
250
+ post_install_message: |2
251
+
252
+ Warning: Mobility v1.0 includes backwards-incompatible changes (mostly around configuration).
253
+
254
+ If you are upgrading from an earlier version, please see:
255
+ - https://github.com/shioyama/mobility/releases/tag/v1.0.0
256
+ - https://github.com/shioyama/mobility/wiki/Introduction-to-Mobility-v1.0
263
257
  rdoc_options: []
264
258
  require_paths:
265
259
  - lib
@@ -270,9 +264,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
270
264
  version: '2.5'
271
265
  required_rubygems_version: !ruby/object:Gem::Requirement
272
266
  requirements:
273
- - - ">"
267
+ - - ">="
274
268
  - !ruby/object:Gem::Version
275
- version: 1.3.1
269
+ version: '0'
276
270
  requirements: []
277
271
  rubygems_version: 3.1.2
278
272
  signing_key: