i18n-tasks 0.9.28 → 0.9.29
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.
- checksums.yaml +4 -4
- data/README.md +12 -2
- data/i18n-tasks.gemspec +3 -3
- data/lib/i18n/tasks.rb +0 -5
- data/lib/i18n/tasks/command/commands/usages.rb +8 -2
- data/lib/i18n/tasks/data/tree/siblings.rb +11 -3
- data/lib/i18n/tasks/missing_keys.rb +19 -2
- data/lib/i18n/tasks/plural_keys.rb +4 -2
- data/lib/i18n/tasks/scanners/pattern_scanner.rb +6 -4
- data/lib/i18n/tasks/used_keys.rb +1 -1
- data/lib/i18n/tasks/version.rb +1 -1
- data/templates/minitest/i18n_test.rb +8 -1
- metadata +13 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 955b0b27ee0885fa2860b00848054c1367098e38905fce60ece6f67f35051f78
|
4
|
+
data.tar.gz: f2e2cd7f950bad6420f831e598a2004f280cf214caf8eab4f046963df47a1ab0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 71b276f4b5f20d6c111d1a3078d793d61a22bb4695362c1efbda80c4cb92f93fc59a221e6d5ee6fe48d1601b9eebbf74bc94e66bc8f84dd0549dc92af37ac16e
|
7
|
+
data.tar.gz: 5a17f8014105c81d9dfe858c5d7f64735e00617455d339cccfbd9fe3a28eca71c2fb527c9117794563be89252260d365b9e4bb09a1f1dde591b00cefca60d849
|
data/README.md
CHANGED
@@ -22,7 +22,7 @@ i18n-tasks can be used with any project using the ruby [i18n gem][i18n-gem] (def
|
|
22
22
|
Add i18n-tasks to the Gemfile:
|
23
23
|
|
24
24
|
```ruby
|
25
|
-
gem 'i18n-tasks', '~> 0.9.
|
25
|
+
gem 'i18n-tasks', '~> 0.9.29'
|
26
26
|
```
|
27
27
|
|
28
28
|
Copy the default [configuration file](#configuration):
|
@@ -45,7 +45,7 @@ $ cp $(i18n-tasks gem-path)/templates/minitest/i18n_test.rb test/
|
|
45
45
|
|
46
46
|
## Usage
|
47
47
|
|
48
|
-
Run `i18n-tasks` to get the list of all the tasks with short descriptions.
|
48
|
+
Run `bundle exec i18n-tasks` to get the list of all the tasks with short descriptions.
|
49
49
|
|
50
50
|
### Check health
|
51
51
|
|
@@ -324,6 +324,16 @@ A special syntax similar to file glob patterns is used throughout i18n-tasks to
|
|
324
324
|
| `:` | matches a single key |
|
325
325
|
| `{a, b.c}` | match any in set, can use `:` and `*`, match is captured |
|
326
326
|
|
327
|
+
Example of usage:
|
328
|
+
|
329
|
+
```sh
|
330
|
+
$ bundle exec i18n-tasks mv "{:}.contents.{*}_body" "\1.attributes.\2.body"
|
331
|
+
|
332
|
+
car.contents.name_body ⮕ car.attributes.name.body
|
333
|
+
car.contents.description_body ⮕ car.attributes.description.body
|
334
|
+
truck.contents.name_body ⮕ truck.attributes.name.body
|
335
|
+
truck.contents.description_body ⮕ truck.attributes.description.body
|
336
|
+
```
|
327
337
|
|
328
338
|
#### Custom adapters
|
329
339
|
|
data/i18n-tasks.gemspec
CHANGED
@@ -19,9 +19,9 @@ Gem::Specification.new do |s| # rubocop:disable Metrics/BlockLength
|
|
19
19
|
TEXT
|
20
20
|
s.post_install_message = <<~TEXT
|
21
21
|
# Install default configuration:
|
22
|
-
cp $(i18n-tasks gem-path)/templates/config/i18n-tasks.yml config/
|
22
|
+
cp $(bundle exec i18n-tasks gem-path)/templates/config/i18n-tasks.yml config/
|
23
23
|
# Add an RSpec for missing and unused keys:
|
24
|
-
cp $(i18n-tasks gem-path)/templates/rspec/i18n_spec.rb spec/
|
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
27
|
s.metadata = { 'issue_tracker' => 'https://github.com/glebm/i18n-tasks' } if s.respond_to?(:metadata=)
|
@@ -43,7 +43,7 @@ TEXT
|
|
43
43
|
s.add_dependency 'rainbow', '>= 2.2.2', '< 4.0'
|
44
44
|
s.add_dependency 'terminal-table', '>= 1.5.1'
|
45
45
|
s.add_development_dependency 'axlsx', '~> 2.0'
|
46
|
-
s.add_development_dependency 'bundler', '~>
|
46
|
+
s.add_development_dependency 'bundler', '~> 2.0', '>= 2.0.1'
|
47
47
|
s.add_development_dependency 'deepl-rb', '>= 2.1.0'
|
48
48
|
s.add_development_dependency 'easy_translate', '>= 0.5.1'
|
49
49
|
s.add_development_dependency 'rake'
|
data/lib/i18n/tasks.rb
CHANGED
@@ -68,8 +68,3 @@ require 'i18n'
|
|
68
68
|
Dir[File.join(I18n::Tasks.gem_path, 'config', 'locales', '*.yml')].each do |locale_file|
|
69
69
|
I18n.config.load_path << locale_file
|
70
70
|
end
|
71
|
-
|
72
|
-
# Load pluralization data
|
73
|
-
require 'rails-i18n'
|
74
|
-
I18n.enforce_available_locales = false
|
75
|
-
RailsI18n::Railtie.add('rails/pluralization/*.rb')
|
@@ -40,10 +40,16 @@ module I18n::Tasks
|
|
40
40
|
cmd :remove_unused,
|
41
41
|
pos: '[locale ...]',
|
42
42
|
desc: t('i18n_tasks.cmd.desc.remove_unused'),
|
43
|
-
args: %i[locales out_format strict keep_order confirm]
|
43
|
+
args: %i[locales out_format strict keep_order confirm pattern]
|
44
44
|
|
45
|
-
def remove_unused(opt = {})
|
45
|
+
def remove_unused(opt = {}) # rubocop:disable Metrics/AbcSize
|
46
46
|
unused_keys = i18n.unused_keys(opt.slice(:locales, :strict))
|
47
|
+
|
48
|
+
if opt[:pattern]
|
49
|
+
pattern_re = i18n.compile_key_pattern(opt[:pattern])
|
50
|
+
unused_keys = unused_keys.select_keys { |full_key, _node| full_key =~ pattern_re }
|
51
|
+
end
|
52
|
+
|
47
53
|
if unused_keys.present?
|
48
54
|
terminal_report.unused_keys(unused_keys)
|
49
55
|
confirm_remove_unused!(unused_keys, opt)
|
@@ -11,6 +11,7 @@ module I18n::Tasks::Data::Tree
|
|
11
11
|
# siblings' keys are unique
|
12
12
|
class Siblings < Nodes # rubocop:disable Metrics/ClassLength
|
13
13
|
include ::I18n::Tasks::SplitKey
|
14
|
+
include ::I18n::Tasks::PluralKeys
|
14
15
|
|
15
16
|
attr_reader :parent, :key_to_node
|
16
17
|
|
@@ -100,12 +101,12 @@ module I18n::Tasks::Data::Tree
|
|
100
101
|
key: key_part,
|
101
102
|
parent: parent,
|
102
103
|
children: [],
|
103
|
-
warn_about_add_children_to_leaf: @
|
104
|
+
warn_about_add_children_to_leaf: @warn_about_add_children_to_leaf
|
104
105
|
)
|
105
106
|
append! child
|
106
107
|
end
|
107
108
|
unless child.children
|
108
|
-
|
109
|
+
conditionally_warn_add_children_to_leaf(child, [])
|
109
110
|
child.children = []
|
110
111
|
end
|
111
112
|
child.children.set rest, node
|
@@ -187,7 +188,7 @@ module I18n::Tasks::Data::Tree
|
|
187
188
|
if our.children
|
188
189
|
our.children.merge!(node.children)
|
189
190
|
else
|
190
|
-
|
191
|
+
conditionally_warn_add_children_to_leaf(our, node.children)
|
191
192
|
our.children = node.children
|
192
193
|
end
|
193
194
|
elsif on_leaves_merge
|
@@ -228,6 +229,13 @@ module I18n::Tasks::Data::Tree
|
|
228
229
|
end
|
229
230
|
end
|
230
231
|
|
232
|
+
def conditionally_warn_add_children_to_leaf(node, children)
|
233
|
+
return unless @warn_about_add_children_to_leaf
|
234
|
+
return if plural_forms?(children)
|
235
|
+
|
236
|
+
warn_add_children_to_leaf(node)
|
237
|
+
end
|
238
|
+
|
231
239
|
def warn_add_children_to_leaf(node)
|
232
240
|
::I18n::Tasks::Logging.log_warn "'#{node.full_key}' was a leaf, now has children (value <- scope conflict)"
|
233
241
|
end
|
@@ -58,8 +58,8 @@ module I18n::Tasks
|
|
58
58
|
|
59
59
|
def missing_plural_forest(locales, _base = base_locale)
|
60
60
|
locales.each_with_object(empty_forest) do |locale, forest|
|
61
|
-
|
62
|
-
|
61
|
+
required_keys = required_plural_keys_for_locale(locale)
|
62
|
+
next if required_keys.empty?
|
63
63
|
tree = empty_forest
|
64
64
|
plural_nodes data[locale] do |node|
|
65
65
|
children = node.children
|
@@ -76,6 +76,23 @@ module I18n::Tasks
|
|
76
76
|
end
|
77
77
|
end
|
78
78
|
|
79
|
+
def required_plural_keys_for_locale(locale)
|
80
|
+
@plural_keys_for_locale ||= {}
|
81
|
+
return @plural_keys_for_locale[locale] if @plural_keys_for_locale.key?(locale)
|
82
|
+
@plural_keys_for_locale[locale] =
|
83
|
+
begin
|
84
|
+
Set.new(load_rails_i18n_pluralization!(locale)[locale.to_sym][:i18n][:plural][:keys])
|
85
|
+
rescue SystemCallError, IOError
|
86
|
+
Set.new
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
# Loads rails-i18n pluralization config for the given locale.
|
91
|
+
def load_rails_i18n_pluralization!(locale)
|
92
|
+
path = File.join(Gem::Specification.find_by_name('rails-i18n').gem_dir, 'rails', 'pluralization', "#{locale}.rb")
|
93
|
+
eval(File.read(path), binding, path) # rubocop:disable Security/Eval
|
94
|
+
end
|
95
|
+
|
79
96
|
# keys present in compared_to, but not in locale
|
80
97
|
def missing_diff_tree(locale, compared_to = base_locale)
|
81
98
|
data[compared_to].select_keys do |key, _node|
|
@@ -2,8 +2,10 @@
|
|
2
2
|
|
3
3
|
require 'set'
|
4
4
|
module I18n::Tasks::PluralKeys
|
5
|
-
|
6
|
-
|
5
|
+
# Ref: http://cldr.unicode.org/index/cldr-spec/plural-rules
|
6
|
+
CLDR_CATEGORY_KEYS = %w[zero one two few many other].freeze
|
7
|
+
PLURAL_KEY_SUFFIXES = Set.new CLDR_CATEGORY_KEYS
|
8
|
+
PLURAL_KEY_RE = /\.(?:#{CLDR_CATEGORY_KEYS * '|'})$/
|
7
9
|
|
8
10
|
def collapse_plural_nodes!(tree)
|
9
11
|
tree.leaves.map(&:parent).compact.uniq.each do |node|
|
@@ -14,11 +14,13 @@ module I18n::Tasks::Scanners
|
|
14
14
|
|
15
15
|
TRANSLATE_CALL_RE = /(?<=^|[^\w'\-.]|[^\w'\-]I18n\.|I18n\.)t(?:ranslate)?/
|
16
16
|
IGNORE_LINES = {
|
17
|
-
'opal' => /^\s*#(?!\si18n-tasks-use)/,
|
18
|
-
'haml' => /^\s*-\s*#(?!\si18n-tasks-use)/,
|
19
|
-
'slim' => %r{^\s*(?:-#|/)(?!\si18n-tasks-use)},
|
20
17
|
'coffee' => /^\s*#(?!\si18n-tasks-use)/,
|
21
|
-
'erb' => /^\s*<%\s*#(?!\si18n-tasks-use)
|
18
|
+
'erb' => /^\s*<%\s*#(?!\si18n-tasks-use)/,
|
19
|
+
'es6' => %r{^\s*//(?!\si18n-tasks-use)},
|
20
|
+
'haml' => /^\s*-\s*#(?!\si18n-tasks-use)/,
|
21
|
+
'js' => %r{^\s*//(?!\si18n-tasks-use)},
|
22
|
+
'opal' => /^\s*#(?!\si18n-tasks-use)/,
|
23
|
+
'slim' => %r{^\s*(?:-#|/)(?!\si18n-tasks-use)}
|
22
24
|
}.freeze
|
23
25
|
|
24
26
|
def initialize(**args)
|
data/lib/i18n/tasks/used_keys.rb
CHANGED
@@ -25,7 +25,7 @@ module I18n::Tasks
|
|
25
25
|
}.freeze
|
26
26
|
|
27
27
|
ALWAYS_EXCLUDE = %w[*.jpg *.png *.gif *.svg *.ico *.eot *.otf *.ttf *.woff *.woff2 *.pdf *.css *.sass *.scss *.less
|
28
|
-
*.yml *.json *.zip *.tar.gz *.swf *.flv].freeze
|
28
|
+
*.yml *.json *.zip *.tar.gz *.swf *.flv *.mp3 *.wav *.flac *.webm *.mp4 *.ogg *.opus].freeze
|
29
29
|
|
30
30
|
# Find all keys in the source and return a forest with the keys in absolute form and their occurrences.
|
31
31
|
#
|
data/lib/i18n/tasks/version.rb
CHANGED
@@ -23,7 +23,14 @@ class I18nTest < ActiveSupport::TestCase
|
|
23
23
|
non_normalized = @i18n.non_normalized_paths
|
24
24
|
error_message = "The following files need to be normalized:\n" \
|
25
25
|
"#{non_normalized.map { |path| " #{path}" }.join("\n")}\n" \
|
26
|
-
|
26
|
+
"Please run `i18n-tasks normalize' to fix"
|
27
27
|
assert_empty non_normalized, error_message
|
28
28
|
end
|
29
|
+
|
30
|
+
def test_no_inconsistent_interpolations
|
31
|
+
inconsistent_interpolations = @i18n.inconsistent_interpolations
|
32
|
+
error_message = "#{inconsistent_interpolations.leaves.count} i18n keys have inconsistent interpolations.\n" \
|
33
|
+
"Please run `i18n-tasks check-consistent-interpolations' to show them"
|
34
|
+
assert_empty inconsistent_interpolations, error_message
|
35
|
+
end
|
29
36
|
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: 0.9.
|
4
|
+
version: 0.9.29
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- glebm
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-03-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -162,14 +162,20 @@ dependencies:
|
|
162
162
|
requirements:
|
163
163
|
- - "~>"
|
164
164
|
- !ruby/object:Gem::Version
|
165
|
-
version: '
|
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
|
169
172
|
requirements:
|
170
173
|
- - "~>"
|
171
174
|
- !ruby/object:Gem::Version
|
172
|
-
version: '
|
175
|
+
version: '2.0'
|
176
|
+
- - ">="
|
177
|
+
- !ruby/object:Gem::Version
|
178
|
+
version: 2.0.1
|
173
179
|
- !ruby/object:Gem::Dependency
|
174
180
|
name: deepl-rb
|
175
181
|
requirement: !ruby/object:Gem::Requirement
|
@@ -376,9 +382,9 @@ metadata:
|
|
376
382
|
issue_tracker: https://github.com/glebm/i18n-tasks
|
377
383
|
post_install_message: |
|
378
384
|
# Install default configuration:
|
379
|
-
cp $(i18n-tasks gem-path)/templates/config/i18n-tasks.yml config/
|
385
|
+
cp $(bundle exec i18n-tasks gem-path)/templates/config/i18n-tasks.yml config/
|
380
386
|
# Add an RSpec for missing and unused keys:
|
381
|
-
cp $(i18n-tasks gem-path)/templates/rspec/i18n_spec.rb spec/
|
387
|
+
cp $(bundle exec i18n-tasks gem-path)/templates/rspec/i18n_spec.rb spec/
|
382
388
|
rdoc_options: []
|
383
389
|
require_paths:
|
384
390
|
- lib
|
@@ -393,8 +399,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
393
399
|
- !ruby/object:Gem::Version
|
394
400
|
version: '0'
|
395
401
|
requirements: []
|
396
|
-
|
397
|
-
rubygems_version: 2.7.7
|
402
|
+
rubygems_version: 3.0.2
|
398
403
|
signing_key:
|
399
404
|
specification_version: 4
|
400
405
|
summary: Manage localization and translation with the awesome power of static analysis
|