i18n-tasks 1.0.9 → 1.0.10

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7a1868afde19604950a807791f25669ec0faffda4c510cf80157ba457509396d
4
- data.tar.gz: 83c7d124be22ace376b06ce11afb4e38db5eb3abbb395e688696bc04984e54c4
3
+ metadata.gz: c1ae937151395c0958e2cab91b89bca5b4b97fb12d307940a9e75bb005f41e2e
4
+ data.tar.gz: 7dd9cbac5bc49401c15df858adae478c63d49f69e91c3a34b8ee7732793efb4c
5
5
  SHA512:
6
- metadata.gz: b62fa2e8af521bf6e17e1d5e2fefbfbf928549d36176ced92f0d6e2692bb940b9f24900a95301ad8a51efc20fd917d049eafb52cec62b4fe1bfcd62bdfb53b10
7
- data.tar.gz: 1c817158eb91249bc9c19adae843a020fc89f886258b46656e76b973c4e249c449e7a19452c9f5ece011982a959dccef2238714f4b995db93a1a6b21d5fe5a22
6
+ metadata.gz: 3b918580b7971a2843bf170277195e9bb59019b2040d2a8403f400ef41e718b25d5545b29a2b8b34f050db753d2f9067bc9a8b892c3b2c491403d80ecf0dfab6
7
+ data.tar.gz: 254c3e547b8d06b684900f1dc3551ed1f52079a6623e5f572fb9bf9ec31c4eaa30b43eb9b2e0aeecd5287b69643a0ed23976bdd8886b42c5b7625bf879fb62ab
data/README.md CHANGED
@@ -24,7 +24,7 @@ i18n-tasks can be used with any project using the ruby [i18n gem][i18n-gem] (def
24
24
  Add i18n-tasks to the Gemfile:
25
25
 
26
26
  ```ruby
27
- gem 'i18n-tasks', '~> 1.0.9'
27
+ gem 'i18n-tasks', '~> 1.0.10'
28
28
  ```
29
29
 
30
30
  Copy the default [configuration file](#configuration):
@@ -436,6 +436,18 @@ See [i18n-tasks wiki: CSV import and export tasks](https://github.com/glebm/i18n
436
436
  Tasks that come with the gem are defined in [lib/i18n/tasks/command/commands](lib/i18n/tasks/command/commands).
437
437
  Custom tasks can be added easily, see the examples [on the wiki](https://github.com/glebm/i18n-tasks/wiki#custom-tasks).
438
438
 
439
+ # Development
440
+
441
+ - Install dependencies using `bundle install`
442
+ - Run tests using `bundle exec rspec`
443
+ - Install [Overcommit](overcommit) by running `overcommit --install`
444
+
445
+ ## Skip Overcommit-hooks
446
+
447
+ - `SKIP=RuboCop git commit`
448
+ - `OVERCOMMIT_DISABLE=1 git commit`
449
+
450
+
439
451
  [MIT license]: /LICENSE.txt
440
452
  [ci]: https://github.com/glebm/i18n-tasks/actions/workflows/tests.yml
441
453
  [badge-ci]: https://github.com/glebm/i18n-tasks/actions/workflows/tests.yml/badge.svg
@@ -448,3 +460,4 @@ Custom tasks can be added easily, see the examples [on the wiki](https://github.
448
460
  [screenshot-find]: https://i.imgur.com/VxBrSfY.png "i18n-tasks find output screenshot"
449
461
  [adapter-example]: https://github.com/glebm/i18n-tasks/blob/main/lib/i18n/tasks/data/file_system_base.rb
450
462
  [custom-scanner-docs]: https://github.com/glebm/i18n-tasks/wiki/A-custom-scanner-example
463
+ [overcommit]: https://github.com/sds/overcommit#installation
data/i18n-tasks.gemspec CHANGED
@@ -24,8 +24,11 @@ Gem::Specification.new do |s| # rubocop:disable Metrics/BlockLength
24
24
  cp $(bundle exec i18n-tasks gem-path)/templates/rspec/i18n_spec.rb spec/
25
25
  TEXT
26
26
  s.homepage = 'https://github.com/glebm/i18n-tasks'
27
- s.metadata = { 'issue_tracker' => 'https://github.com/glebm/i18n-tasks' } if s.respond_to?(:metadata=)
28
- s.required_ruby_version = '>= 2.6', '< 4.0' if s.respond_to?(:required_ruby_version=)
27
+ s.metadata = {
28
+ 'issue_tracker' => 'https://github.com/glebm/i18n-tasks',
29
+ 'rubygems_mfa_required' => 'true'
30
+ }
31
+ s.required_ruby_version = '>= 2.6', '< 4.0'
29
32
 
30
33
  s.files = `git ls-files`.split($/)
31
34
  s.files -= s.files.grep(%r{^(doc/|\.|spec/)}) + %w[CHANGES.md config/i18n-tasks.yml Gemfile]
@@ -43,11 +46,11 @@ Gem::Specification.new do |s| # rubocop:disable Metrics/BlockLength
43
46
  s.add_dependency 'rails-i18n'
44
47
  s.add_dependency 'rainbow', '>= 2.2.2', '< 4.0'
45
48
  s.add_dependency 'terminal-table', '>= 1.5.1'
46
- s.add_development_dependency 'axlsx', '~> 2.0'
47
49
  s.add_development_dependency 'bundler', '~> 2.0', '>= 2.0.1'
50
+ s.add_development_dependency 'overcommit', '~> 0.58.0'
48
51
  s.add_development_dependency 'rake'
49
52
  s.add_development_dependency 'rspec', '~> 3.3'
50
- s.add_development_dependency 'rubocop', '~> 1.6.1'
53
+ s.add_development_dependency 'rubocop', '~> 1.27.0'
51
54
  s.add_development_dependency 'simplecov'
52
55
  s.add_development_dependency 'yard'
53
56
 
@@ -35,12 +35,12 @@ class I18n::Tasks::CLI
35
35
 
36
36
  def run(argv)
37
37
  argv.each_with_index do |arg, i|
38
- if ["--config", "-c"].include?(arg)
39
- if File.exist?(argv[i+1])
40
- @config_file = argv[i+1]
38
+ if ['--config', '-c'].include?(arg)
39
+ if File.exist?(argv[i + 1])
40
+ @config_file = argv[i + 1]
41
41
  break
42
42
  else
43
- error "Config file doesn't exist: #{argv[i+1]}", 128
43
+ error "Config file doesn't exist: #{argv[i + 1]}", 128
44
44
  end
45
45
  end
46
46
  end
@@ -33,7 +33,6 @@ module I18n::Tasks
33
33
  '--config FILE',
34
34
  t('i18n_tasks.cmd.args.desc.config')
35
35
 
36
-
37
36
  def arg_or_pos!(key, opts)
38
37
  opts[key] ||= opts[:arguments].try(:shift)
39
38
  end
@@ -86,7 +86,7 @@ module I18n::Tasks
86
86
  when 'keys'
87
87
  puts forest.key_names(root: true)
88
88
  when 'key-values'
89
- puts forest.key_values(root: true).map { |kv| kv.join("\t") }
89
+ puts(forest.key_values(root: true).map { |kv| kv.join("\t") })
90
90
  when *DATA_FORMATS
91
91
  puts i18n.data.adapter_dump forest.to_hash(true), format
92
92
  end
@@ -30,6 +30,13 @@ module I18n::Tasks::Configuration # rubocop:disable Metrics/ModuleLength
30
30
  warn_deprecated 'Please move relative_roots under search in config/i18n-tasks.yml.'
31
31
  c[:search][:relative_roots] = c.delete(:relative_roots)
32
32
  end
33
+
34
+ if c.dig(:search, :exclude_method_name_paths)
35
+ warn_deprecated(
36
+ 'Please rename exclude_method_name_paths to relative_exclude_method_name_paths in config/i18n-tasks.yml.'
37
+ )
38
+ c[:search][:relative_exclude_method_name_paths] = c[:search].delete(:exclude_method_name_paths)
39
+ end
33
40
  end
34
41
  else
35
42
  {}.with_indifferent_access
@@ -44,12 +51,10 @@ module I18n::Tasks::Configuration # rubocop:disable Metrics/ModuleLength
44
51
  # data config
45
52
  # @return [Hash<adapter: String, options: Hash>]
46
53
  def data_config
47
- @config_sections[:data] ||= begin
48
- {
49
- adapter: data.class.name,
50
- config: data.config
51
- }
52
- end
54
+ @config_sections[:data] ||= {
55
+ adapter: data.class.name,
56
+ config: data.config
57
+ }
53
58
  end
54
59
 
55
60
  # translation config
@@ -5,7 +5,7 @@ module I18n::Tasks
5
5
  module Data
6
6
  module Adapter
7
7
  module YamlAdapter
8
- EMOJI_REGEX = /\\u[\da-f]{8}/i
8
+ EMOJI_REGEX = /\\u[\da-f]{8}/i.freeze
9
9
 
10
10
  class << self
11
11
  # @return [Hash] locale tree
@@ -25,7 +25,7 @@ module I18n::Tasks
25
25
 
26
26
  # @return [String]
27
27
  def restore_emojis(yaml)
28
- yaml.gsub(EMOJI_REGEX) { |m| [m[-8..].to_i(16)].pack("U") }
28
+ yaml.gsub(EMOJI_REGEX) { |m| [m[-8..].to_i(16)].pack('U') }
29
29
  end
30
30
  end
31
31
  end
@@ -55,7 +55,7 @@ module I18n
55
55
  return if File.file?(path) && content == read_file(path)
56
56
 
57
57
  ::FileUtils.mkpath(File.dirname(path))
58
- ::File.open(path, 'w') { |f| f.write content }
58
+ ::File.write(path, content)
59
59
  end
60
60
 
61
61
  def normalized?(path, tree)
@@ -38,7 +38,7 @@ module I18n::Tasks
38
38
  if pattern
39
39
  key_match = $~
40
40
  path = format(path, locale: locale)
41
- path.gsub!(/\\\d+/) { |m| key_match[m[1..-1].to_i] }
41
+ path.gsub!(/\\\d+/) { |m| key_match[m[1..].to_i] }
42
42
  (out[path] ||= Set.new) << "#{locale}.#{key}"
43
43
  else
44
44
  fail CommandError, "Cannot route key #{key}. Routes are #{@routes_config.inspect}"
@@ -168,7 +168,7 @@ module I18n::Tasks::Data::Tree
168
168
  label = if key.nil?
169
169
  Rainbow('∅').faint
170
170
  else
171
- [Rainbow(key).color(1 + level % 15),
171
+ [Rainbow(key).color(1 + (level % 15)),
172
172
  (": #{format_value_for_inspect(value)}" if leaf?),
173
173
  (" #{data}" if data?)].compact.join
174
174
  end
@@ -31,13 +31,11 @@ module I18n::Tasks::Data::Tree
31
31
  end
32
32
 
33
33
  def to_hash(sort = false)
34
- (@hash ||= {})[sort] ||= begin
35
- if sort
36
- sort_by(&:key)
37
- else
38
- self
39
- end.map { |node| node.to_hash(sort) }.reduce({}, :deep_merge!)
40
- end
34
+ (@hash ||= {})[sort] ||= if sort
35
+ sort_by(&:key)
36
+ else
37
+ self
38
+ end.map { |node| node.to_hash(sort) }.reduce({}, :deep_merge!)
41
39
  end
42
40
 
43
41
  delegate :to_json, to: :to_hash
@@ -50,7 +50,7 @@ module I18n::Tasks::Data::Tree
50
50
  next
51
51
  end
52
52
  match = $~
53
- new_key = to_pattern.gsub(/\\\d+/) { |m| match[m[1..-1].to_i] }
53
+ new_key = to_pattern.gsub(/\\\d+/) { |m| match[m[1..].to_i] }
54
54
  old_key_to_new_key[full_key] = new_key
55
55
  moved_forest.merge!(Siblings.new.tap do |forest|
56
56
  forest[[(node.root.try(:key) unless root), new_key].compact.join('.')] =
@@ -7,8 +7,8 @@ module I18n::Tasks
7
7
 
8
8
  def html_key?(full_key, locale)
9
9
  !!(full_key =~ HTML_KEY_PATTERN ||
10
- full_key =~ MAYBE_PLURAL_HTML_KEY_PATTERN &&
11
- depluralize_key(split_key(full_key, 2)[1], locale) =~ HTML_KEY_PATTERN)
10
+ (full_key =~ MAYBE_PLURAL_HTML_KEY_PATTERN &&
11
+ depluralize_key(split_key(full_key, 2)[1], locale) =~ HTML_KEY_PATTERN))
12
12
  end
13
13
  end
14
14
  end
@@ -91,8 +91,8 @@ module I18n::Tasks
91
91
  if node.value != other.value
92
92
  log_warn(
93
93
  'Conflicting references: '\
94
- "#{node.full_key(root: false)} ⮕ #{node.value} in #{node.data[:locale]},"\
95
- " but ⮕ #{other.value} in #{other.data[:locale]}"
94
+ "#{node.full_key(root: false)} ⮕ #{node.value} in #{node.data[:locale]},"\
95
+ " but ⮕ #{other.value} in #{other.data[:locale]}"
96
96
  )
97
97
  end
98
98
  end
@@ -37,7 +37,7 @@ module I18n::Tasks::Reports
37
37
  def used_title(keys_nodes, filter)
38
38
  used_n = keys_nodes.map { |_k, node| node.data[:occurrences].size }.reduce(:+).to_i
39
39
  "#{keys_nodes.size} key#{'s' if keys_nodes.size != 1}#{" matching '#{filter}'" if filter}"\
40
- "#{" (#{used_n} usage#{'s' if used_n != 1})" if used_n.positive?}"
40
+ "#{" (#{used_n} usage#{'s' if used_n != 1})" if used_n.positive?}"
41
41
  end
42
42
 
43
43
  # Sort keys by their attributes in order
@@ -121,9 +121,9 @@ module I18n
121
121
  if data[:ref_info]
122
122
  from, to = data[:ref_info]
123
123
  resolved = key[0...to.length]
124
- after = key[to.length..-1]
124
+ after = key[to.length..]
125
125
  " #{Rainbow(from).yellow}#{Rainbow(after).cyan}\n" \
126
- "#{Rainbow('⮕').yellow.bright} #{Rainbow(resolved).yellow.bright}"
126
+ "#{Rainbow('⮕').yellow.bright} #{Rainbow(resolved).yellow.bright}"
127
127
  else
128
128
  Rainbow(key).cyan
129
129
  end
@@ -6,8 +6,8 @@ module I18n::Tasks::Scanners::AstMatchers
6
6
  @scanner = scanner
7
7
  end
8
8
 
9
- def convert_to_key_occurrences(send_node, method_name, location: send_node.loc)
10
- raise("Not implemented")
9
+ def convert_to_key_occurrences(send_node, _method_name, location: send_node.loc)
10
+ fail('Not implemented')
11
11
  end
12
12
 
13
13
  protected
@@ -24,7 +24,7 @@ module I18n::Tasks::Scanners::AstMatchers
24
24
  # No effect unless `array_join_with` is set.
25
25
  # @return [String, nil] `nil` is returned only when a dynamic value is encountered in strict mode
26
26
  # or the node type is not supported.
27
- def extract_string(node, array_join_with: nil, array_flatten: false, array_reject_blank: false)
27
+ def extract_string(node, array_join_with: nil, array_flatten: false, array_reject_blank: false) # rubocop:disable Metrics/AbcSize, Metrics/PerceivedComplexity
28
28
  return if node.nil?
29
29
 
30
30
  if %i[sym str int].include?(node.type)
@@ -35,7 +35,7 @@ module I18n::Tasks::Scanners
35
35
  result = []
36
36
  text.scan(pattern) do |_|
37
37
  match = Regexp.last_match
38
- matches = Hash[match.names.map(&:to_sym).zip(match.captures)]
38
+ matches = match.names.map(&:to_sym).zip(match.captures).to_h
39
39
  if matches.key?(:key)
40
40
  matches[:key] = strip_literal(matches[:key])
41
41
  next unless valid_key?(matches[:key])
@@ -66,7 +66,7 @@ module I18n::Tasks::Scanners
66
66
  end
67
67
 
68
68
  def exclude_line?(line, path)
69
- re = @ignore_lines_res[File.extname(path)[1..-1]]
69
+ re = @ignore_lines_res[File.extname(path)[1..]]
70
70
  re && re =~ line
71
71
  end
72
72
 
@@ -10,7 +10,7 @@ module I18n
10
10
  # @param calling_method [#call, Symbol, String, false, nil]
11
11
  # @return [String] absolute version of the key
12
12
  def absolute_key(key, path, roots: config[:relative_roots],
13
- exclude_method_name_paths: config[:exclude_method_name_paths],
13
+ exclude_method_name_paths: config[:relative_exclude_method_name_paths],
14
14
  calling_method: nil)
15
15
  return key unless key.start_with?(DOT)
16
16
  fail 'roots argument is required' unless roots.present?
@@ -18,7 +18,7 @@ module I18n
18
18
  normalized_path = File.expand_path(path)
19
19
  (root = path_root(normalized_path, roots)) ||
20
20
  fail(CommandError, "Cannot resolve relative key \"#{key}\".\n" \
21
- "Set search.relative_roots in config/i18n-tasks.yml (currently #{roots.inspect})")
21
+ "Set search.relative_roots in config/i18n-tasks.yml (currently #{roots.inspect})")
22
22
  normalized_path.sub!(root, '')
23
23
 
24
24
  if (exclude_method_name_paths || []).map { |p| expand_path(p) }.include?(root)
@@ -48,7 +48,7 @@ module I18n::Tasks
48
48
  # rubocop:enable Metrics/ParameterLists
49
49
 
50
50
  def inspect
51
- "Occurrence(#{@path}:#{@line_num}, line_pos: #{@line_pos}, pos: #{@pos}, raw_key: #{@raw_key}, default_arg: #{@default_arg}, line: #{@line})"
51
+ "Occurrence(#{@path}:#{@line_num}, line_pos: #{@line_pos}, pos: #{@pos}, raw_key: #{@raw_key}, default_arg: #{@default_arg}, line: #{@line})" # rubocop:disable Layout/LineLength
52
52
  end
53
53
 
54
54
  def ==(other)
@@ -68,8 +68,7 @@ module I18n::Tasks::Scanners
68
68
  def comments_to_occurences(path, ast, comments)
69
69
  magic_comments = comments.select { |comment| comment.text =~ MAGIC_COMMENT_PREFIX }
70
70
  comment_to_node = Parser::Source::Comment.associate_locations(ast, magic_comments).tap do |h|
71
- # transform_values is only available in ActiveSupport 4.2+
72
- h.each { |k, v| h[k] = v.first }
71
+ h.transform_values!(&:first)
73
72
  end.invert
74
73
 
75
74
  magic_comments.flat_map do |comment|
@@ -15,12 +15,12 @@ module I18n::Tasks::Scanners
15
15
  # @param literal [String] e.g: "key", 'key', or :key.
16
16
  # @return [String] key
17
17
  def strip_literal(literal)
18
- literal = literal[1..-1] if literal[0] == ':'
18
+ literal = literal[1..] if literal[0] == ':'
19
19
  literal = literal[1..-2] if literal[0] == "'" || literal[0] == '"'
20
20
  literal
21
21
  end
22
22
 
23
- VALID_KEY_CHARS = /(?:[[:word:]]|[-.?!:;À-ž\/])/.freeze
23
+ VALID_KEY_CHARS = %r{(?:[[:word:]]|[-.?!:;À-ž/])}.freeze
24
24
  VALID_KEY_RE = /^#{VALID_KEY_CHARS}+$/.freeze
25
25
 
26
26
  def valid_key?(key)
@@ -20,7 +20,7 @@ module I18n
20
20
  parts << part
21
21
  pos += part.length + 1
22
22
  if parts.length + 1 >= max
23
- parts << key[pos..-1] unless pos == key.length
23
+ parts << key[pos..] unless pos == key.length
24
24
  break
25
25
  end
26
26
  end
@@ -114,7 +114,7 @@ module I18n::Tasks
114
114
 
115
115
  values = untranslated.scan(INTERPOLATION_KEY_RE)
116
116
  translated.gsub(/#{Regexp.escape(UNTRANSLATABLE_STRING)}\d+/i) do |m|
117
- values[m[UNTRANSLATABLE_STRING.length..-1].to_i]
117
+ values[m[UNTRANSLATABLE_STRING.length..].to_i]
118
118
  end
119
119
  rescue StandardError => e
120
120
  raise_interpolation_error(untranslated, translated, e)
@@ -71,11 +71,11 @@ module I18n::Tasks::Translators
71
71
  version = @i18n_tasks.translation_config[:deepl_version]
72
72
  fail ::I18n::Tasks::CommandError, I18n.t('i18n_tasks.deepl_translate.errors.no_api_key') if api_key.blank?
73
73
 
74
- DeepL.configure { |config|
74
+ DeepL.configure do |config|
75
75
  config.auth_key = api_key
76
76
  config.host = host unless host.blank?
77
77
  config.version = version unless version.blank?
78
- }
78
+ end
79
79
  end
80
80
  end
81
81
  end
@@ -178,7 +178,7 @@ module I18n::Tasks
178
178
  braces << '{'
179
179
  end
180
180
  end
181
- result << key[scanner.pos..-1] unless scanner.eos?
181
+ result << key[scanner.pos..] unless scanner.eos?
182
182
  result.join
183
183
  end
184
184
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module I18n
4
4
  module Tasks
5
- VERSION = '1.0.9'
5
+ VERSION = '1.0.10'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: i18n-tasks
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.9
4
+ version: 1.0.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - glebm
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-04-10 00:00:00.000000000 Z
11
+ date: 2022-05-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -157,12 +157,15 @@ dependencies:
157
157
  - !ruby/object:Gem::Version
158
158
  version: 1.5.1
159
159
  - !ruby/object:Gem::Dependency
160
- name: axlsx
160
+ name: bundler
161
161
  requirement: !ruby/object:Gem::Requirement
162
162
  requirements:
163
163
  - - "~>"
164
164
  - !ruby/object:Gem::Version
165
165
  version: '2.0'
166
+ - - ">="
167
+ - !ruby/object:Gem::Version
168
+ version: 2.0.1
166
169
  type: :development
167
170
  prerelease: false
168
171
  version_requirements: !ruby/object:Gem::Requirement
@@ -170,26 +173,23 @@ dependencies:
170
173
  - - "~>"
171
174
  - !ruby/object:Gem::Version
172
175
  version: '2.0'
176
+ - - ">="
177
+ - !ruby/object:Gem::Version
178
+ version: 2.0.1
173
179
  - !ruby/object:Gem::Dependency
174
- name: bundler
180
+ name: overcommit
175
181
  requirement: !ruby/object:Gem::Requirement
176
182
  requirements:
177
183
  - - "~>"
178
184
  - !ruby/object:Gem::Version
179
- version: '2.0'
180
- - - ">="
181
- - !ruby/object:Gem::Version
182
- version: 2.0.1
185
+ version: 0.58.0
183
186
  type: :development
184
187
  prerelease: false
185
188
  version_requirements: !ruby/object:Gem::Requirement
186
189
  requirements:
187
190
  - - "~>"
188
191
  - !ruby/object:Gem::Version
189
- version: '2.0'
190
- - - ">="
191
- - !ruby/object:Gem::Version
192
- version: 2.0.1
192
+ version: 0.58.0
193
193
  - !ruby/object:Gem::Dependency
194
194
  name: rake
195
195
  requirement: !ruby/object:Gem::Requirement
@@ -224,14 +224,14 @@ dependencies:
224
224
  requirements:
225
225
  - - "~>"
226
226
  - !ruby/object:Gem::Version
227
- version: 1.6.1
227
+ version: 1.27.0
228
228
  type: :development
229
229
  prerelease: false
230
230
  version_requirements: !ruby/object:Gem::Requirement
231
231
  requirements:
232
232
  - - "~>"
233
233
  - !ruby/object:Gem::Version
234
- version: 1.6.1
234
+ version: 1.27.0
235
235
  - !ruby/object:Gem::Dependency
236
236
  name: simplecov
237
237
  requirement: !ruby/object:Gem::Requirement
@@ -414,6 +414,7 @@ licenses:
414
414
  - MIT
415
415
  metadata:
416
416
  issue_tracker: https://github.com/glebm/i18n-tasks
417
+ rubygems_mfa_required: 'true'
417
418
  post_install_message: |
418
419
  # Install default configuration:
419
420
  cp $(bundle exec i18n-tasks gem-path)/templates/config/i18n-tasks.yml config/