i18n-tasks 0.9.13 → 0.9.14
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 +1 -1
- data/i18n-tasks.gemspec +2 -2
- data/lib/i18n/tasks/cli.rb +1 -1
- data/lib/i18n/tasks/command/commands/data.rb +5 -5
- data/lib/i18n/tasks/command/commands/eq_base.rb +1 -1
- data/lib/i18n/tasks/command/commands/health.rb +1 -1
- data/lib/i18n/tasks/command/commands/missing.rb +1 -1
- data/lib/i18n/tasks/command/commands/tree.rb +4 -4
- data/lib/i18n/tasks/command/commands/usages.rb +3 -3
- data/lib/i18n/tasks/command/option_parsers/enum.rb +1 -1
- data/lib/i18n/tasks/command/option_parsers/locale.rb +1 -1
- data/lib/i18n/tasks/command/options/data.rb +1 -1
- data/lib/i18n/tasks/configuration.rb +2 -2
- data/lib/i18n/tasks/data/file_system_base.rb +1 -1
- data/lib/i18n/tasks/plural_keys.rb +1 -1
- data/lib/i18n/tasks/scanners/files/file_finder.rb +1 -1
- data/lib/i18n/tasks/scanners/ruby_ast_call_finder.rb +10 -10
- data/lib/i18n/tasks/scanners/ruby_ast_scanner.rb +10 -9
- data/lib/i18n/tasks/used_keys.rb +7 -7
- data/lib/i18n/tasks/version.rb +1 -1
- data/templates/config/i18n-tasks.yml +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4f6dc7facc584ec90bee3fd89b5222c645c0207d
|
4
|
+
data.tar.gz: 0c09aea76d0b9c8494f6544c99e7b698374887dc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b1f5f755ef3f26541331ecf6aaee38bf68958018b28bd22d94b8aa2b6e930277789d36186debb785fb7a139ec68fdf1024df8e18d5145a263a99d8c4d91f8237
|
7
|
+
data.tar.gz: 976c51c8ad42d3c538713d353172b7db8bc0b519fc50cf37e613b03e665b9a19d535352138fd484aa9534a9c51e65a1a18091440b32fbc03cf21f1cbbe053553
|
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', '~> 0.9.
|
27
|
+
gem 'i18n-tasks', '~> 0.9.14'
|
28
28
|
```
|
29
29
|
|
30
30
|
Copy the default [configuration file](#configuration):
|
data/i18n-tasks.gemspec
CHANGED
@@ -30,8 +30,8 @@ TEXT
|
|
30
30
|
s.required_ruby_version = '~> 2.1' if s.respond_to?(:required_ruby_version=)
|
31
31
|
|
32
32
|
s.files = `git ls-files`.split($/)
|
33
|
-
s.files -= s.files.grep(%r{^(doc/|\.|spec/)}) + %w
|
34
|
-
s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) } - %w
|
33
|
+
s.files -= s.files.grep(%r{^(doc/|\.|spec/)}) + %w[CHANGES.md config/i18n-tasks.yml Gemfile]
|
34
|
+
s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) } - %w[i18n-tasks.cmd]
|
35
35
|
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
36
36
|
s.require_paths = ['lib']
|
37
37
|
|
data/lib/i18n/tasks/cli.rb
CHANGED
@@ -101,7 +101,7 @@ class I18n::Tasks::CLI
|
|
101
101
|
|
102
102
|
def allow_help_arg_first!(argv)
|
103
103
|
# allow `i18n-tasks --help command` in addition to `i18n-tasks command --help`
|
104
|
-
if %w
|
104
|
+
if %w[-h --help].include?(argv[0]) && argv[1] && !argv[1].start_with?('-')
|
105
105
|
argv[0], argv[1] = argv[1], argv[0]
|
106
106
|
end
|
107
107
|
end
|
@@ -14,7 +14,7 @@ module I18n::Tasks
|
|
14
14
|
cmd :normalize,
|
15
15
|
pos: '[locale ...]',
|
16
16
|
desc: t('i18n_tasks.cmd.desc.normalize'),
|
17
|
-
args: %i
|
17
|
+
args: %i[locales pattern_router]
|
18
18
|
|
19
19
|
def normalize(opt = {})
|
20
20
|
i18n.normalize_store! opt[:locales], opt[:pattern_router]
|
@@ -49,7 +49,7 @@ module I18n::Tasks
|
|
49
49
|
cmd :data,
|
50
50
|
pos: '[locale ...]',
|
51
51
|
desc: t('i18n_tasks.cmd.desc.data'),
|
52
|
-
args: %i
|
52
|
+
args: %i[locales out_format]
|
53
53
|
|
54
54
|
def data(opt = {})
|
55
55
|
print_forest i18n.data_forest(opt[:locales]), opt
|
@@ -58,7 +58,7 @@ module I18n::Tasks
|
|
58
58
|
cmd :data_merge,
|
59
59
|
pos: '[tree ...]',
|
60
60
|
desc: t('i18n_tasks.cmd.desc.data_merge'),
|
61
|
-
args: %i
|
61
|
+
args: %i[data_format nostdin]
|
62
62
|
|
63
63
|
def data_merge(opt = {})
|
64
64
|
forest = merge_forests_stdin_and_pos!(opt)
|
@@ -69,7 +69,7 @@ module I18n::Tasks
|
|
69
69
|
cmd :data_write,
|
70
70
|
pos: '[tree]',
|
71
71
|
desc: t('i18n_tasks.cmd.desc.data_write'),
|
72
|
-
args: %i
|
72
|
+
args: %i[data_format nostdin]
|
73
73
|
|
74
74
|
def data_write(opt = {})
|
75
75
|
forest = forest_pos_or_stdin!(opt)
|
@@ -80,7 +80,7 @@ module I18n::Tasks
|
|
80
80
|
cmd :data_remove,
|
81
81
|
pos: '[tree]',
|
82
82
|
desc: t('i18n_tasks.cmd.desc.data_remove'),
|
83
|
-
args: %i
|
83
|
+
args: %i[data_format nostdin]
|
84
84
|
|
85
85
|
def data_remove(opt = {})
|
86
86
|
removed = i18n.data.remove_by_key!(forest_pos_or_stdin!(opt))
|
@@ -25,7 +25,7 @@ module I18n::Tasks
|
|
25
25
|
cmd :missing,
|
26
26
|
pos: '[locale ...]',
|
27
27
|
desc: t('i18n_tasks.cmd.desc.missing'),
|
28
|
-
args: %i
|
28
|
+
args: %i[locales out_format missing_types]
|
29
29
|
|
30
30
|
def missing(opt = {})
|
31
31
|
forest = i18n.missing_keys(opt.slice(:locales, :base_locale, :missing_types))
|
@@ -20,7 +20,7 @@ module I18n::Tasks
|
|
20
20
|
cmd :tree_merge,
|
21
21
|
pos: '[[tree] [tree] ... (or stdin)]',
|
22
22
|
desc: t('i18n_tasks.cmd.desc.tree_merge'),
|
23
|
-
args: %i
|
23
|
+
args: %i[data_format nostdin]
|
24
24
|
|
25
25
|
def tree_merge(opts = {})
|
26
26
|
print_forest merge_forests_stdin_and_pos!(opts), opts
|
@@ -29,7 +29,7 @@ module I18n::Tasks
|
|
29
29
|
cmd :tree_filter,
|
30
30
|
pos: '[pattern] [tree (or stdin)]',
|
31
31
|
desc: t('i18n_tasks.cmd.desc.tree_filter'),
|
32
|
-
args: %i
|
32
|
+
args: %i[data_format pattern]
|
33
33
|
|
34
34
|
def tree_filter(opts = {})
|
35
35
|
pattern = arg_or_pos! :pattern, opts
|
@@ -75,7 +75,7 @@ module I18n::Tasks
|
|
75
75
|
cmd :tree_subtract,
|
76
76
|
pos: '[[tree] [tree] ... (or stdin)]',
|
77
77
|
desc: t('i18n_tasks.cmd.desc.tree_subtract'),
|
78
|
-
args: %i
|
78
|
+
args: %i[data_format nostdin]
|
79
79
|
|
80
80
|
def tree_subtract(opt = {})
|
81
81
|
forests = forests_stdin_and_pos! opt, 2
|
@@ -86,7 +86,7 @@ module I18n::Tasks
|
|
86
86
|
cmd :tree_set_value,
|
87
87
|
pos: '[VALUE] [tree (or stdin)]',
|
88
88
|
desc: t('i18n_tasks.cmd.desc.tree_set_value'),
|
89
|
-
args: %i
|
89
|
+
args: %i[value data_format nostdin pattern]
|
90
90
|
|
91
91
|
def tree_set_value(opt = {})
|
92
92
|
value = arg_or_pos! :value, opt
|
@@ -13,7 +13,7 @@ module I18n::Tasks
|
|
13
13
|
cmd :find,
|
14
14
|
pos: '[pattern]',
|
15
15
|
desc: t('i18n_tasks.cmd.desc.find'),
|
16
|
-
args: %i
|
16
|
+
args: %i[out_format pattern strict]
|
17
17
|
|
18
18
|
def find(opt = {})
|
19
19
|
opt[:filter] ||= opt.delete(:pattern) || opt[:arguments].try(:first)
|
@@ -24,7 +24,7 @@ module I18n::Tasks
|
|
24
24
|
cmd :unused,
|
25
25
|
pos: '[locale ...]',
|
26
26
|
desc: t('i18n_tasks.cmd.desc.unused'),
|
27
|
-
args: %i
|
27
|
+
args: %i[locales out_format strict]
|
28
28
|
|
29
29
|
def unused(opt = {})
|
30
30
|
forest = i18n.unused_keys(opt.slice(:locales, :strict))
|
@@ -35,7 +35,7 @@ module I18n::Tasks
|
|
35
35
|
cmd :remove_unused,
|
36
36
|
pos: '[locale ...]',
|
37
37
|
desc: t('i18n_tasks.cmd.desc.remove_unused'),
|
38
|
-
args: %i
|
38
|
+
args: %i[locales out_format strict confirm]
|
39
39
|
|
40
40
|
def remove_unused(opt = {})
|
41
41
|
unused_keys = i18n.unused_keys(opt.slice(:locales, :strict))
|
@@ -37,7 +37,7 @@ module I18n::Tasks
|
|
37
37
|
|
38
38
|
# @param [#base_locale,#locales] context
|
39
39
|
def call(vals, context)
|
40
|
-
if vals == %w
|
40
|
+
if vals == %w[all] || vals.blank?
|
41
41
|
context.locales
|
42
42
|
else
|
43
43
|
move_base_locale_to_front!(vals.map { |v| v == 'base' ? context.base_locale : v }, context.base_locale)
|
@@ -14,10 +14,10 @@ module I18n::Tasks::Configuration # rubocop:disable Metrics/ModuleLength
|
|
14
14
|
@config || (self.config = {})
|
15
15
|
end
|
16
16
|
|
17
|
-
CONFIG_FILES = %w
|
17
|
+
CONFIG_FILES = %w[
|
18
18
|
config/i18n-tasks.yml config/i18n-tasks.yml.erb
|
19
19
|
i18n-tasks.yml i18n-tasks.yml.erb
|
20
|
-
|
20
|
+
].freeze
|
21
21
|
|
22
22
|
def file_config
|
23
23
|
file = CONFIG_FILES.detect { |f| File.exist?(f) }
|
@@ -160,7 +160,7 @@ Skipping a nil key found in #{path.inspect}:
|
|
160
160
|
value: #{value.inspect}
|
161
161
|
Nil keys are not supported by i18n.
|
162
162
|
The following unquoted YAML keys result in a nil key:
|
163
|
-
#{%w
|
163
|
+
#{%w[null Null NULL ~].join(', ')}
|
164
164
|
See http://yaml.org/type/null.html
|
165
165
|
TEXT
|
166
166
|
elsif value.is_a?(Hash)
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'set'
|
4
4
|
module I18n::Tasks::PluralKeys
|
5
|
-
PLURAL_KEY_SUFFIXES = Set.new %w
|
5
|
+
PLURAL_KEY_SUFFIXES = Set.new %w[zero one two few many other]
|
6
6
|
PLURAL_KEY_RE = /\.(?:#{PLURAL_KEY_SUFFIXES.to_a * '|'})$/
|
7
7
|
|
8
8
|
def collapse_plural_nodes!(tree)
|
@@ -36,7 +36,7 @@ module I18n::Tasks::Scanners::Files
|
|
36
36
|
log_warn "None of the search.paths exist #{@paths.inspect}" if paths.empty?
|
37
37
|
Find.find(*paths) do |path|
|
38
38
|
is_dir = File.directory?(path)
|
39
|
-
hidden = File.basename(path).start_with?('.') && !%w
|
39
|
+
hidden = File.basename(path).start_with?('.') && !%w[. ./].include?(path)
|
40
40
|
not_incl = @include && !path_fnmatch_any?(path, @include)
|
41
41
|
excl = path_fnmatch_any?(path, @exclude)
|
42
42
|
if is_dir || hidden || not_incl || excl
|
@@ -6,12 +6,12 @@ module I18n::Tasks::Scanners
|
|
6
6
|
class RubyAstCallFinder
|
7
7
|
include AST::Processor::Mixin
|
8
8
|
|
9
|
-
# @param
|
10
|
-
|
11
|
-
def initialize(messages:, receivers:)
|
9
|
+
# @param receiver_messages [Set<Pair<[nil, AST::Node>, Symbol>>] The receiver-message pairs to look for.
|
10
|
+
def initialize(receiver_messages:)
|
12
11
|
super()
|
13
|
-
@
|
14
|
-
|
12
|
+
@message_receivers = receiver_messages.each_with_object({}) do |(receiver, message), t|
|
13
|
+
(t[message] ||= []) << receiver
|
14
|
+
end
|
15
15
|
end
|
16
16
|
|
17
17
|
# @param root_node [Parser::AST:Node]
|
@@ -46,13 +46,13 @@ module I18n::Tasks::Scanners
|
|
46
46
|
def on_send(send_node)
|
47
47
|
receiver = send_node.children[0]
|
48
48
|
message = send_node.children[1]
|
49
|
-
|
50
|
-
|
51
|
-
|
49
|
+
valid_receivers = @message_receivers[message]
|
50
|
+
# use `any?` because `include?` checks type equality, but the receiver is a Parser::AST::Node != AST::Node.
|
51
|
+
if valid_receivers && valid_receivers.any? { |r| r == receiver }
|
52
52
|
@callback.call(send_node, @method_name)
|
53
|
-
else
|
54
|
-
handler_missing send_node
|
55
53
|
end
|
54
|
+
# always invoke handler_missing to get nested translations in children
|
55
|
+
handler_missing send_node
|
56
56
|
nil
|
57
57
|
end
|
58
58
|
|
@@ -15,12 +15,13 @@ module I18n::Tasks::Scanners
|
|
15
15
|
include AST::Sexp
|
16
16
|
|
17
17
|
MAGIC_COMMENT_PREFIX = /\A.\s*i18n-tasks-use\s+/
|
18
|
+
RECEIVER_MESSAGES = [nil, AST::Node.new(:const, [nil, :I18n])].product(%i[t translate])
|
18
19
|
|
19
|
-
def initialize(
|
20
|
+
def initialize(receiver_messages: RECEIVER_MESSAGES, **args)
|
20
21
|
super(args)
|
21
22
|
@parser = ::Parser::CurrentRuby.new
|
22
23
|
@magic_comment_parser = ::Parser::CurrentRuby.new
|
23
|
-
@call_finder = RubyAstCallFinder.new(
|
24
|
+
@call_finder = RubyAstCallFinder.new(receiver_messages: receiver_messages)
|
24
25
|
end
|
25
26
|
|
26
27
|
protected
|
@@ -93,7 +94,7 @@ module I18n::Tasks::Scanners
|
|
93
94
|
node.children.detect do |child|
|
94
95
|
next unless child.type == :pair
|
95
96
|
key_node = child.children[0]
|
96
|
-
%i
|
97
|
+
%i[sym str].include?(key_node.type) && key_node.children[0].to_s == key
|
97
98
|
end
|
98
99
|
end
|
99
100
|
|
@@ -110,9 +111,9 @@ module I18n::Tasks::Scanners
|
|
110
111
|
# @return [String, nil] `nil` is returned only when a dynamic value is encountered in strict mode
|
111
112
|
# or the node type is not supported.
|
112
113
|
def extract_string(node, array_join_with: nil, array_flatten: false, array_reject_blank: false)
|
113
|
-
if %i
|
114
|
+
if %i[sym str int].include?(node.type)
|
114
115
|
node.children[0].to_s
|
115
|
-
elsif %i
|
116
|
+
elsif %i[true false].include?(node.type)
|
116
117
|
node.type.to_s
|
117
118
|
elsif :nil == node.type
|
118
119
|
''
|
@@ -126,9 +127,9 @@ module I18n::Tasks::Scanners
|
|
126
127
|
# `nil` is returned when a dynamic value is encountered in strict mode. Propagate:
|
127
128
|
return nil if str.nil?
|
128
129
|
end
|
129
|
-
elsif !config[:strict] && %i
|
130
|
+
elsif !config[:strict] && %i[dsym dstr].include?(node.type)
|
130
131
|
node.children.map do |child|
|
131
|
-
if %i
|
132
|
+
if %i[sym str].include?(child.type)
|
132
133
|
child.children[0].to_s
|
133
134
|
else
|
134
135
|
child.loc.expression.source
|
@@ -146,12 +147,12 @@ module I18n::Tasks::Scanners
|
|
146
147
|
# @return [String, nil] `nil` is returned only when a dynamic value is encountered in strict mode.
|
147
148
|
def extract_array_as_string(node, array_join_with:, array_flatten: false, array_reject_blank: false)
|
148
149
|
children_strings = node.children.map do |child|
|
149
|
-
if %i
|
150
|
+
if %i[sym str int true false].include?(child.type)
|
150
151
|
extract_string child
|
151
152
|
else
|
152
153
|
# ignore dynamic argument in strict mode
|
153
154
|
return nil if config[:strict]
|
154
|
-
if %i
|
155
|
+
if %i[dsym dstr].include?(child.type) || (:array == child.type && array_flatten)
|
155
156
|
extract_string(child, array_join_with: array_join_with)
|
156
157
|
else
|
157
158
|
"\#{#{child.loc.expression.source}}"
|
data/lib/i18n/tasks/used_keys.rb
CHANGED
@@ -15,9 +15,9 @@ require 'i18n/tasks/scanners/pattern_mapper'
|
|
15
15
|
module I18n::Tasks
|
16
16
|
module UsedKeys # rubocop:disable Metrics/ModuleLength
|
17
17
|
SEARCH_DEFAULTS = {
|
18
|
-
paths: %w
|
19
|
-
relative_roots: %w
|
20
|
-
scanners: [['::I18n::Tasks::Scanners::RubyAstScanner', only: %w
|
18
|
+
paths: %w[app/].freeze,
|
19
|
+
relative_roots: %w[app/controllers app/helpers app/mailers app/presenters app/views].freeze,
|
20
|
+
scanners: [['::I18n::Tasks::Scanners::RubyAstScanner', only: %w[*.rb]]],
|
21
21
|
strict: true
|
22
22
|
}.tap do |defaults|
|
23
23
|
defaults[:scanners] << ['::I18n::Tasks::Scanners::PatternWithScopeScanner',
|
@@ -29,8 +29,8 @@ module I18n::Tasks
|
|
29
29
|
'erb' => %q(^\s*<%\s*#(?!\si18n-tasks-use)) }.freeze]
|
30
30
|
end
|
31
31
|
|
32
|
-
ALWAYS_EXCLUDE = %w
|
33
|
-
*.yml *.json *.zip *.tar.gz
|
32
|
+
ALWAYS_EXCLUDE = %w[*.jpg *.png *.gif *.svg *.ico *.eot *.otf *.ttf *.woff *.woff2 *.pdf *.css *.sass *.scss *.less
|
33
|
+
*.yml *.json *.zip *.tar.gz *.swf *.flv].freeze
|
34
34
|
|
35
35
|
# Find all keys in the source and return a forest with the keys in absolute form and their occurrences.
|
36
36
|
#
|
@@ -109,10 +109,10 @@ module I18n::Tasks
|
|
109
109
|
|
110
110
|
def merge_scanner_configs(a, b)
|
111
111
|
a.deep_merge(b).tap do |c|
|
112
|
-
%i
|
112
|
+
%i[scanners paths relative_roots].each do |key|
|
113
113
|
c[key] = a[key] if b[key].blank?
|
114
114
|
end
|
115
|
-
%i
|
115
|
+
%i[exclude].each do |key|
|
116
116
|
merged = Array(a[key]) + Array(b[key])
|
117
117
|
c[key] = merged unless merged.empty?
|
118
118
|
end
|
data/lib/i18n/tasks/version.rb
CHANGED
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.14
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- glebm
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-05-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|