i18n-tasks 0.2.19 → 0.2.20
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGES.md +5 -1
- data/LICENSE.txt +1 -1
- data/README.md +51 -39
- data/doc/img/i18n-usages.png +0 -0
- data/i18n-tasks.gemspec +1 -1
- data/lib/i18n/tasks.rb +7 -2
- data/lib/i18n/tasks/base_task.rb +2 -4
- data/lib/i18n/tasks/configuration.rb +2 -4
- data/lib/i18n/tasks/data/adapter/json_adapter.rb +22 -0
- data/lib/i18n/tasks/data/adapter/yaml_adapter.rb +21 -0
- data/lib/i18n/tasks/data/file_system.rb +13 -0
- data/lib/i18n/tasks/data/storage/file_storage.rb +105 -0
- data/lib/i18n/tasks/data/yaml.rb +6 -65
- data/lib/i18n/tasks/data_traversal.rb +2 -2
- data/lib/i18n/tasks/fill_tasks.rb +2 -11
- data/lib/i18n/tasks/ignore_keys.rb +3 -1
- data/lib/i18n/tasks/key.rb +60 -0
- data/lib/i18n/tasks/key_group.rb +65 -0
- data/lib/i18n/tasks/missing_keys.rb +51 -18
- data/lib/i18n/tasks/reports/base.rb +8 -4
- data/lib/i18n/tasks/reports/spreadsheet.rb +8 -8
- data/lib/i18n/tasks/reports/terminal.rb +39 -16
- data/lib/i18n/tasks/scanners/base_scanner.rb +36 -2
- data/lib/i18n/tasks/scanners/pattern_scanner.rb +9 -7
- data/lib/i18n/tasks/translation_data.rb +4 -1
- data/lib/i18n/tasks/unused_keys.rb +9 -7
- data/lib/i18n/tasks/{source_keys.rb → used_keys.rb} +5 -6
- data/lib/i18n/tasks/version.rb +1 -1
- data/lib/tasks/i18n-tasks.rake +24 -20
- data/spec/file_system_data_spec.rb +68 -0
- data/spec/fixtures/config/i18n-tasks.yml +2 -2
- data/spec/i18n_tasks_spec.rb +5 -5
- data/spec/key_group_spec.rb +48 -0
- data/spec/used_keys_spec.rb +22 -0
- metadata +17 -7
- data/lib/i18n/tasks/untranslated_keys.rb +0 -50
- data/spec/yaml_adapter_spec.rb +0 -33
@@ -2,23 +2,25 @@
|
|
2
2
|
require 'i18n/tasks/scanners/base_scanner'
|
3
3
|
module I18n::Tasks::Scanners
|
4
4
|
class PatternScanner < BaseScanner
|
5
|
-
LITERAL_RE
|
5
|
+
LITERAL_RE = /:?".+?"|:?'.+?'|:\w+/
|
6
6
|
DEFAULT_PATTERN = /\bt(?:ranslate)?[( ]\s*(#{LITERAL_RE})/
|
7
7
|
|
8
8
|
# Extract i18n keys from file based on the pattern. The pattern must capture key literal.
|
9
9
|
# @return [String] keys found in file
|
10
|
-
def scan_file(path)
|
10
|
+
def scan_file(path, text = read_file(path))
|
11
11
|
keys = []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
12
|
+
text.scan(pattern) do |match|
|
13
|
+
src_pos = Regexp.last_match.offset(0).first
|
14
|
+
key = extract_key_from_match(match, path)
|
15
|
+
next unless valid_key?(key)
|
16
|
+
keys << ::I18n::Tasks::Key.new(key, src: usage_context(text, src_pos))
|
17
17
|
end
|
18
18
|
keys
|
19
19
|
end
|
20
20
|
|
21
21
|
protected
|
22
|
+
|
23
|
+
|
22
24
|
def pattern
|
23
25
|
@pattern ||= config[:pattern].present? ? Regexp.new(config[:pattern]) : DEFAULT_PATTERN
|
24
26
|
end
|
@@ -1,3 +1,6 @@
|
|
1
|
+
require 'i18n/tasks/data/file_system'
|
2
|
+
|
3
|
+
# older configs may use this
|
1
4
|
require 'i18n/tasks/data/yaml'
|
2
5
|
|
3
6
|
module I18n::Tasks::TranslationData
|
@@ -36,4 +39,4 @@ module I18n::Tasks::TranslationData
|
|
36
39
|
data[target_locale] = data[target_locale]
|
37
40
|
end
|
38
41
|
end
|
39
|
-
end
|
42
|
+
end
|
@@ -6,18 +6,20 @@ module I18n
|
|
6
6
|
module UnusedKeys
|
7
7
|
# @return [Array<[String, String]>] all the unused translations as an array of [key, value] pairs
|
8
8
|
def unused_keys(locale = base_locale)
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
9
|
+
@unused_keys ||= {}
|
10
|
+
@unused_keys[locale] ||= ::I18n::Tasks::KeyGroup.new(
|
11
|
+
traverse_map_if(data[locale]) { |key, value|
|
12
|
+
next if pattern_key?(key) || ignore_key?(key, :unused)
|
13
|
+
key = depluralize_key(locale, key)
|
14
|
+
[key, value] unless used_key?(key)
|
15
|
+
}.uniq, locale: locale, type: :unused)
|
14
16
|
end
|
15
17
|
|
16
18
|
def remove_unused!(locales = self.locales)
|
17
|
-
|
19
|
+
unused = unused_keys
|
18
20
|
locales.each do |locale|
|
19
21
|
data[locale] = list_to_tree traverse_map_if(data[locale]) { |key, value|
|
20
|
-
[key, value] unless
|
22
|
+
[key, value] unless unused.include?(depluralize_key(locale, key))
|
21
23
|
}
|
22
24
|
end
|
23
25
|
end
|
@@ -1,11 +1,11 @@
|
|
1
1
|
require 'find'
|
2
2
|
require 'i18n/tasks/scanners/pattern_scanner'
|
3
3
|
|
4
|
-
module I18n::Tasks::
|
4
|
+
module I18n::Tasks::UsedKeys
|
5
5
|
# find all keys in the source (relative keys are absolutized)
|
6
6
|
# @return [Array<String>]
|
7
|
-
def
|
8
|
-
@
|
7
|
+
def used_keys
|
8
|
+
@used_keys ||= I18n::Tasks::KeyGroup.new(scanner.keys, type: :used)
|
9
9
|
end
|
10
10
|
|
11
11
|
def scanner
|
@@ -18,8 +18,7 @@ module I18n::Tasks::SourceKeys
|
|
18
18
|
|
19
19
|
# whether the key is used in the source
|
20
20
|
def used_key?(key)
|
21
|
-
|
22
|
-
@used_keys.include?(key)
|
21
|
+
used_keys.include?(key)
|
23
22
|
end
|
24
23
|
|
25
24
|
# dynamically generated keys in the source, e.g t("category.#{category_key}")
|
@@ -31,6 +30,6 @@ module I18n::Tasks::SourceKeys
|
|
31
30
|
# keys in the source that end with a ., e.g. t("category.#{cat.i18n_key}") or t("category." + category.key)
|
32
31
|
def pattern_key_prefixes
|
33
32
|
@pattern_keys_prefixes ||=
|
34
|
-
|
33
|
+
used_keys.key_names.select { |k| k =~ /\#{.*?}/ || k.ends_with?('.') }.map { |k| k.split(/\.?#/)[0].presence }.compact
|
35
34
|
end
|
36
35
|
end
|
data/lib/i18n/tasks/version.rb
CHANGED
data/lib/tasks/i18n-tasks.rake
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
require 'set'
|
2
2
|
require 'i18n/tasks'
|
3
|
-
require 'i18n/tasks/base_task'
|
4
3
|
require 'i18n/tasks/reports/terminal'
|
5
4
|
require 'active_support/core_ext/module/delegation'
|
6
5
|
require 'i18n/tasks/reports/spreadsheet'
|
@@ -13,54 +12,59 @@ namespace :i18n do
|
|
13
12
|
|
14
13
|
desc 'show missing translations'
|
15
14
|
task :missing, [:locales] => 'i18n:setup' do |t, args|
|
16
|
-
i18n_report.
|
15
|
+
i18n_report.missing_keys i18n_task.missing_keys(locales: i18n_parse_locales(args[:locales]))
|
17
16
|
end
|
18
17
|
|
19
18
|
namespace :missing do
|
20
19
|
desc 'keys present in code but not existing in base locale data'
|
21
|
-
task :
|
22
|
-
i18n_report.
|
20
|
+
task :missing_from_base => 'i18n:setup' do |t, args|
|
21
|
+
i18n_report.missing_keys i18n_task.keys_missing_from_base
|
23
22
|
end
|
24
23
|
|
25
24
|
desc 'keys present but with value same as in base locale'
|
26
25
|
task :eq_base, [:locales] => 'i18n:setup' do |t, args|
|
27
|
-
i18n_report.
|
26
|
+
i18n_report.missing_keys i18n_task.missing_keys(type: :eq_base, locales: i18n_parse_locales(args[:locales]))
|
28
27
|
end
|
29
28
|
|
30
29
|
desc 'keys that exist in base locale but are blank in passed locales'
|
31
|
-
task :
|
32
|
-
i18n_report.
|
30
|
+
task :missing_from_locale, [:locales] => 'i18n:setup' do |t, args|
|
31
|
+
i18n_report.missing_keys i18n_task.missing_keys(type: :missing_from_locale, locales: i18n_parse_locales(args[:locales]))
|
33
32
|
end
|
34
33
|
end
|
35
34
|
|
36
35
|
desc 'show unused translations'
|
37
36
|
task :unused => 'i18n:setup' do
|
38
|
-
i18n_report.
|
37
|
+
i18n_report.unused_keys
|
39
38
|
end
|
40
39
|
|
41
40
|
desc 'add placeholder for missing values to the base locale (default: key.humanize)'
|
42
41
|
task :add_missing, [:placeholder] => 'i18n:setup' do |t, args|
|
43
|
-
|
42
|
+
i18n_task.add_missing! base_locale, args[:placeholder]
|
44
43
|
end
|
45
44
|
|
46
45
|
desc 'remove unused keys'
|
47
46
|
task :remove_unused, [:locales] => 'i18n:setup' do |t, args|
|
48
|
-
locales = i18n_parse_locales(args[:locales]) ||
|
49
|
-
unused_keys =
|
47
|
+
locales = i18n_parse_locales(args[:locales]) || i18n_task.locales
|
48
|
+
unused_keys = i18n_task.unused_keys
|
50
49
|
if unused_keys.present?
|
51
|
-
i18n_report.
|
50
|
+
i18n_report.unused_keys(unused_keys)
|
52
51
|
unless ENV['CONFIRM']
|
53
52
|
exit 1 unless agree(red "All these translations will be removed in #{bold locales * ', '}#{red '.'} " + yellow('Continue? (yes/no)') + ' ')
|
54
53
|
end
|
55
|
-
|
54
|
+
i18n_task.remove_unused!(locales)
|
56
55
|
else
|
57
56
|
STDERR.puts bold green 'No unused keys to remove'
|
58
57
|
end
|
59
58
|
end
|
59
|
+
|
60
|
+
desc 'show usages'
|
61
|
+
task :usages => 'i18n:setup' do
|
62
|
+
i18n_report.used_keys
|
63
|
+
end
|
60
64
|
|
61
65
|
desc 'normalize translation data: sort and move to the right files'
|
62
66
|
task :normalize, [:locales] => 'i18n:setup' do |t, args|
|
63
|
-
|
67
|
+
i18n_task.normalize_store! args[:locales]
|
64
68
|
end
|
65
69
|
|
66
70
|
desc 'save missing and unused translations to an Excel file'
|
@@ -81,27 +85,27 @@ namespace :i18n do
|
|
81
85
|
|
82
86
|
desc 'add "" values for missing and untranslated keys to locales (default: all)'
|
83
87
|
task :blanks, [:locales] => 'i18n:setup' do |t, args|
|
84
|
-
|
88
|
+
i18n_task.fill_with_blanks! i18n_parse_locales args[:locales]
|
85
89
|
end
|
86
90
|
|
87
91
|
desc 'add Google Translated values for untranslated keys to locales (default: all non-base)'
|
88
92
|
task :google_translate, [:locales] => 'i18n:setup' do |t, args|
|
89
|
-
|
93
|
+
i18n_task.fill_with_google_translate! i18n_parse_locales args[:locales]
|
90
94
|
end
|
91
95
|
|
92
96
|
desc 'copy base locale values for all untranslated keys to locales (default: all non-base)'
|
93
97
|
task :base_value, [:locales] => 'i18n:setup' do |t, args|
|
94
|
-
|
98
|
+
i18n_task.fill_with_base_values! i18n_parse_locales args[:locales]
|
95
99
|
end
|
96
100
|
end
|
97
101
|
|
98
102
|
module ::I18n::Tasks::RakeHelpers
|
99
103
|
include Term::ANSIColor
|
100
104
|
|
101
|
-
delegate :base_locale, to: :
|
105
|
+
delegate :base_locale, to: :i18n_task
|
102
106
|
|
103
|
-
def
|
104
|
-
@
|
107
|
+
def i18n_task
|
108
|
+
@i18n_task ||= I18n::Tasks::BaseTask.new
|
105
109
|
end
|
106
110
|
|
107
111
|
def i18n_report
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'File system i18n' do
|
4
|
+
describe 'yml' do
|
5
|
+
let!(:data) { I18n::Tasks::Data::FileSystem.new }
|
6
|
+
after { TestCodebase.teardown }
|
7
|
+
|
8
|
+
it 'reads' do
|
9
|
+
data.config = {read: ['a.yml', '{b,c}.yml']}
|
10
|
+
TestCodebase.setup(
|
11
|
+
'a.yml' => {en: {a: 1}}.stringify_keys.to_yaml,
|
12
|
+
'b.yml' => {en: {b: 1}}.stringify_keys.to_yaml,
|
13
|
+
'c.yml' => {en: {c: 1}}.stringify_keys.to_yaml
|
14
|
+
)
|
15
|
+
TestCodebase.in_test_app_dir {
|
16
|
+
data[:en].symbolize_keys.should == {a: 1, b: 1, c: 1}
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'writes' do
|
21
|
+
data.config = {read: 'a.yml', write: [['{:}.*', '\1.%{locale}.yml']]}
|
22
|
+
keys = {'a' => {'b' => 'c'}, 'x' => 'y'}
|
23
|
+
locale_data = {'pizza' => keys, 'sushi' => keys}
|
24
|
+
TestCodebase.setup
|
25
|
+
TestCodebase.in_test_app_dir {
|
26
|
+
data[:en] = locale_data
|
27
|
+
files = %w(pizza.en.yml sushi.en.yml)
|
28
|
+
Dir['*.yml'].sort.should == files.sort
|
29
|
+
files.each { |f| YAML.load_file(f)['en'].should == {File.basename(f, '.en.yml') => keys} }
|
30
|
+
}
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe 'json' do
|
35
|
+
let!(:data) {
|
36
|
+
I18n::Tasks::Data::FileSystem.new(
|
37
|
+
read: ['config/locales/%{locale}.json'],
|
38
|
+
write: ['config/locales/%{locale}.json']
|
39
|
+
)
|
40
|
+
}
|
41
|
+
after { TestCodebase.teardown }
|
42
|
+
|
43
|
+
it 'reads' do
|
44
|
+
data.config = {read: ['a.json', '{b,c}.json']}
|
45
|
+
TestCodebase.setup(
|
46
|
+
'a.json' => {en: {a: 1}}.stringify_keys.to_json,
|
47
|
+
'b.json' => {en: {b: 1}}.stringify_keys.to_json,
|
48
|
+
'c.json' => {en: {c: 1}}.stringify_keys.to_json
|
49
|
+
)
|
50
|
+
TestCodebase.in_test_app_dir {
|
51
|
+
data[:en].symbolize_keys.should == {a: 1, b: 1, c: 1}
|
52
|
+
}
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'writes' do
|
56
|
+
data.config = {read: 'a.json', write: [['{:}.*', '\1.%{locale}.json']]}
|
57
|
+
keys = {'a' => {'b' => 'c'}, 'x' => 'y'}
|
58
|
+
locale_data = {'pizza' => keys, 'sushi' => keys}
|
59
|
+
TestCodebase.setup
|
60
|
+
TestCodebase.in_test_app_dir {
|
61
|
+
data[:en] = locale_data
|
62
|
+
files = %w(pizza.en.json sushi.en.json)
|
63
|
+
Dir['*.json'].sort.should == files.sort
|
64
|
+
files.each { |f| JSON.parse(File.read f)['en'].should == {File.basename(f, '.en.json') => keys} }
|
65
|
+
}
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# i18n data storage
|
2
2
|
data:
|
3
|
-
# The default
|
4
|
-
adapter:
|
3
|
+
# The default file adapter supports YAML and JSON files. You can provide a class name here.
|
4
|
+
adapter: file_system
|
5
5
|
# adapter options
|
6
6
|
read:
|
7
7
|
- 'config/locales/%{locale}.yml'
|
data/spec/i18n_tasks_spec.rb
CHANGED
@@ -20,7 +20,7 @@ describe 'rake i18n' do
|
|
20
20
|
it 'detects unused' do
|
21
21
|
TestCodebase.capture_stderr do
|
22
22
|
out = TestCodebase.rake_result('i18n:unused')
|
23
|
-
out.
|
23
|
+
expect(out).to be_i18n_keys expected_unused_keys
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
@@ -29,8 +29,8 @@ describe 'rake i18n' do
|
|
29
29
|
t = I18n::Tasks::BaseTask.new
|
30
30
|
|
31
31
|
expected_unused_keys.each do |key|
|
32
|
-
t.t(t.data[:en], key).
|
33
|
-
t.t(t.data[:es], key).
|
32
|
+
expect(t.t(t.data[:en], key)).to be_present
|
33
|
+
expect(t.t(t.data[:es], key)).to be_present
|
34
34
|
end
|
35
35
|
|
36
36
|
ENV['CONFIRM'] = '1'
|
@@ -39,8 +39,8 @@ describe 'rake i18n' do
|
|
39
39
|
t.data.reload
|
40
40
|
# or save both to an xlsx file:
|
41
41
|
expected_unused_keys.each do |key|
|
42
|
-
t.t(t.data[:en], key).
|
43
|
-
t.t(t.data[:es], key).
|
42
|
+
expect(t.t(t.data[:en], key)).to be_nil
|
43
|
+
expect(t.t(t.data[:es], key)).to be_nil
|
44
44
|
end
|
45
45
|
end
|
46
46
|
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'KeyGroup' do
|
4
|
+
def key_group(group, attr = {})
|
5
|
+
::I18n::Tasks::KeyGroup.new(group, attr)
|
6
|
+
end
|
7
|
+
|
8
|
+
let!(:kg_attr) { { a: :b, x: '0' } }
|
9
|
+
let!(:kg) { key_group %w(a b), kg_attr }
|
10
|
+
|
11
|
+
it('#attr') { expect(kg.attr).to eq kg_attr }
|
12
|
+
|
13
|
+
it '#to_a' do
|
14
|
+
expect(kg.to_a).to eq [
|
15
|
+
{key: 'a'}.merge(kg_attr),
|
16
|
+
{key: 'b'}.merge(kg_attr)
|
17
|
+
]
|
18
|
+
end
|
19
|
+
|
20
|
+
it '#merge' do
|
21
|
+
kg2_attr = {a: :b, x: '1', c: :d}
|
22
|
+
kg2 = key_group %w(c), kg2_attr
|
23
|
+
kg3 = key_group [{key: 'd', prop: true}]
|
24
|
+
expect([kg, kg2, kg3].reduce(:+).to_a).to eq [
|
25
|
+
{key: 'a'}.merge(kg_attr),
|
26
|
+
{key: 'b'}.merge(kg_attr),
|
27
|
+
{key: 'c'}.merge(kg2_attr),
|
28
|
+
{key: 'd', prop: true}
|
29
|
+
]
|
30
|
+
end
|
31
|
+
|
32
|
+
it '#merge shared attr' do
|
33
|
+
kg2 = key_group %w(c d), kg_attr
|
34
|
+
expect((kg + kg2).keys[0].own_attr).to eq kg.keys[0].own_attr
|
35
|
+
end
|
36
|
+
|
37
|
+
it '#sort!' do
|
38
|
+
kg = key_group [{key: 'a', prop: '0'}, {key: 'b', prop: '1'}]
|
39
|
+
kg.sort! { |a, b| b[:prop] <=> a[:prop] }
|
40
|
+
expect(kg.keys[0][:prop]).to eq '1'
|
41
|
+
end
|
42
|
+
|
43
|
+
it '#sort_by_attr!' do
|
44
|
+
expect(key_group(%w(a b c)).tap { |kg|
|
45
|
+
kg.sort_by_attr!(key: :desc)
|
46
|
+
}.keys.map(&:key)).to eq %w(c b a)
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'UsedKeys' do
|
4
|
+
let(:task) { I18n::Tasks::BaseTask.new }
|
5
|
+
|
6
|
+
it 'shows usages' do
|
7
|
+
task.config[:search] = {paths: ['a.html.slim']}
|
8
|
+
TestCodebase.setup('a.html.slim' => <<-SLIM)
|
9
|
+
div = t 'a'
|
10
|
+
p = t 'a'
|
11
|
+
SLIM
|
12
|
+
TestCodebase.in_test_app_dir {
|
13
|
+
used_keys = task.used_keys
|
14
|
+
expect(used_keys.size).to eq 1
|
15
|
+
usages_expected = [
|
16
|
+
{pos: 6, line_num: 1, line_pos: 7, line: "div = t 'a'", path: 'a.html.slim'},
|
17
|
+
{pos: 18, line_num: 2, line_pos: 7, line: " p = t 'a'", path: 'a.html.slim'}
|
18
|
+
]
|
19
|
+
expect(used_keys[0].attr).to eq(type: :used, key: 'a', usages: usages_expected)
|
20
|
+
}
|
21
|
+
end
|
22
|
+
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.2.
|
4
|
+
version: 0.2.20
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- glebm
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-02-
|
11
|
+
date: 2014-02-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -151,7 +151,7 @@ dependencies:
|
|
151
151
|
- !ruby/object:Gem::Version
|
152
152
|
version: '0'
|
153
153
|
- !ruby/object:Gem::Dependency
|
154
|
-
name: rspec
|
154
|
+
name: rspec
|
155
155
|
requirement: !ruby/object:Gem::Requirement
|
156
156
|
requirements:
|
157
157
|
- - '>='
|
@@ -196,15 +196,22 @@ files:
|
|
196
196
|
- LICENSE.txt
|
197
197
|
- README.md
|
198
198
|
- Rakefile
|
199
|
+
- doc/img/i18n-usages.png
|
199
200
|
- i18n-tasks.gemspec
|
200
201
|
- lib/i18n/tasks.rb
|
201
202
|
- lib/i18n/tasks/base_task.rb
|
202
203
|
- lib/i18n/tasks/configuration.rb
|
204
|
+
- lib/i18n/tasks/data/adapter/json_adapter.rb
|
205
|
+
- lib/i18n/tasks/data/adapter/yaml_adapter.rb
|
206
|
+
- lib/i18n/tasks/data/file_system.rb
|
207
|
+
- lib/i18n/tasks/data/storage/file_storage.rb
|
203
208
|
- lib/i18n/tasks/data/yaml.rb
|
204
209
|
- lib/i18n/tasks/data_traversal.rb
|
205
210
|
- lib/i18n/tasks/fill_tasks.rb
|
206
211
|
- lib/i18n/tasks/google_translation.rb
|
207
212
|
- lib/i18n/tasks/ignore_keys.rb
|
213
|
+
- lib/i18n/tasks/key.rb
|
214
|
+
- lib/i18n/tasks/key_group.rb
|
208
215
|
- lib/i18n/tasks/key_pattern_matching.rb
|
209
216
|
- lib/i18n/tasks/missing_keys.rb
|
210
217
|
- lib/i18n/tasks/plural_keys.rb
|
@@ -215,12 +222,12 @@ files:
|
|
215
222
|
- lib/i18n/tasks/reports/terminal.rb
|
216
223
|
- lib/i18n/tasks/scanners/base_scanner.rb
|
217
224
|
- lib/i18n/tasks/scanners/pattern_scanner.rb
|
218
|
-
- lib/i18n/tasks/source_keys.rb
|
219
225
|
- lib/i18n/tasks/translation_data.rb
|
220
|
-
- lib/i18n/tasks/untranslated_keys.rb
|
221
226
|
- lib/i18n/tasks/unused_keys.rb
|
227
|
+
- lib/i18n/tasks/used_keys.rb
|
222
228
|
- lib/i18n/tasks/version.rb
|
223
229
|
- lib/tasks/i18n-tasks.rake
|
230
|
+
- spec/file_system_data_spec.rb
|
224
231
|
- spec/fixtures/app/assets/javascripts/application.js
|
225
232
|
- spec/fixtures/app/controllers/events_controller.rb
|
226
233
|
- spec/fixtures/app/views/index.html.slim
|
@@ -228,6 +235,7 @@ files:
|
|
228
235
|
- spec/fixtures/config/i18n-tasks.yml
|
229
236
|
- spec/google_translate_spec.rb
|
230
237
|
- spec/i18n_tasks_spec.rb
|
238
|
+
- spec/key_group_spec.rb
|
231
239
|
- spec/key_pattern_matching_spec.rb
|
232
240
|
- spec/pattern_scanner_spec.rb
|
233
241
|
- spec/readme_spec.rb
|
@@ -238,7 +246,7 @@ files:
|
|
238
246
|
- spec/support/key_pattern_matcher.rb
|
239
247
|
- spec/support/test_codebase.rb
|
240
248
|
- spec/support/test_codebase_env.rake
|
241
|
-
- spec/
|
249
|
+
- spec/used_keys_spec.rb
|
242
250
|
homepage: https://github.com/glebm/i18n-tasks
|
243
251
|
licenses:
|
244
252
|
- MIT
|
@@ -266,6 +274,7 @@ specification_version: 4
|
|
266
274
|
summary: Tasks to manage missing and unused translations in ruby applications using
|
267
275
|
I18n.
|
268
276
|
test_files:
|
277
|
+
- spec/file_system_data_spec.rb
|
269
278
|
- spec/fixtures/app/assets/javascripts/application.js
|
270
279
|
- spec/fixtures/app/controllers/events_controller.rb
|
271
280
|
- spec/fixtures/app/views/index.html.slim
|
@@ -273,6 +282,7 @@ test_files:
|
|
273
282
|
- spec/fixtures/config/i18n-tasks.yml
|
274
283
|
- spec/google_translate_spec.rb
|
275
284
|
- spec/i18n_tasks_spec.rb
|
285
|
+
- spec/key_group_spec.rb
|
276
286
|
- spec/key_pattern_matching_spec.rb
|
277
287
|
- spec/pattern_scanner_spec.rb
|
278
288
|
- spec/readme_spec.rb
|
@@ -283,5 +293,5 @@ test_files:
|
|
283
293
|
- spec/support/key_pattern_matcher.rb
|
284
294
|
- spec/support/test_codebase.rb
|
285
295
|
- spec/support/test_codebase_env.rake
|
286
|
-
- spec/
|
296
|
+
- spec/used_keys_spec.rb
|
287
297
|
has_rdoc:
|