i18n-tasks 0.2.19 → 0.2.20
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/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:
|