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.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES.md +5 -1
  3. data/LICENSE.txt +1 -1
  4. data/README.md +51 -39
  5. data/doc/img/i18n-usages.png +0 -0
  6. data/i18n-tasks.gemspec +1 -1
  7. data/lib/i18n/tasks.rb +7 -2
  8. data/lib/i18n/tasks/base_task.rb +2 -4
  9. data/lib/i18n/tasks/configuration.rb +2 -4
  10. data/lib/i18n/tasks/data/adapter/json_adapter.rb +22 -0
  11. data/lib/i18n/tasks/data/adapter/yaml_adapter.rb +21 -0
  12. data/lib/i18n/tasks/data/file_system.rb +13 -0
  13. data/lib/i18n/tasks/data/storage/file_storage.rb +105 -0
  14. data/lib/i18n/tasks/data/yaml.rb +6 -65
  15. data/lib/i18n/tasks/data_traversal.rb +2 -2
  16. data/lib/i18n/tasks/fill_tasks.rb +2 -11
  17. data/lib/i18n/tasks/ignore_keys.rb +3 -1
  18. data/lib/i18n/tasks/key.rb +60 -0
  19. data/lib/i18n/tasks/key_group.rb +65 -0
  20. data/lib/i18n/tasks/missing_keys.rb +51 -18
  21. data/lib/i18n/tasks/reports/base.rb +8 -4
  22. data/lib/i18n/tasks/reports/spreadsheet.rb +8 -8
  23. data/lib/i18n/tasks/reports/terminal.rb +39 -16
  24. data/lib/i18n/tasks/scanners/base_scanner.rb +36 -2
  25. data/lib/i18n/tasks/scanners/pattern_scanner.rb +9 -7
  26. data/lib/i18n/tasks/translation_data.rb +4 -1
  27. data/lib/i18n/tasks/unused_keys.rb +9 -7
  28. data/lib/i18n/tasks/{source_keys.rb → used_keys.rb} +5 -6
  29. data/lib/i18n/tasks/version.rb +1 -1
  30. data/lib/tasks/i18n-tasks.rake +24 -20
  31. data/spec/file_system_data_spec.rb +68 -0
  32. data/spec/fixtures/config/i18n-tasks.yml +2 -2
  33. data/spec/i18n_tasks_spec.rb +5 -5
  34. data/spec/key_group_spec.rb +48 -0
  35. data/spec/used_keys_spec.rb +22 -0
  36. metadata +17 -7
  37. data/lib/i18n/tasks/untranslated_keys.rb +0 -50
  38. 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 = /:?".+?"|:?'.+?'|:\w+/
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
- File.open(path, 'rb') do |f|
13
- f.read.scan(pattern) do |match|
14
- key = extract_key_from_match(match, path)
15
- keys << key if valid_key?(key)
16
- end
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
- traverse_map_if data[locale] do |key, value|
10
- next if pattern_key?(key) || ignore_key?(key, :unused)
11
- key = depluralize_key(locale, key)
12
- [key, value] unless used_key?(key)
13
- end.uniq
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
- exclude = unused_keys.map(&:first).to_set
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 exclude.include?(depluralize_key(locale, key))
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::SourceKeys
4
+ module I18n::Tasks::UsedKeys
5
5
  # find all keys in the source (relative keys are absolutized)
6
6
  # @return [Array<String>]
7
- def find_source_keys
8
- @source_keys ||= scanner.keys
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
- @used_keys ||= find_source_keys.to_set
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
- find_source_keys.select { |k| k =~ /\#{.*?}/ || k.ends_with?('.') }.map { |k| k.split(/\.?#/)[0].presence }.compact
33
+ used_keys.key_names.select { |k| k =~ /\#{.*?}/ || k.ends_with?('.') }.map { |k| k.split(/\.?#/)[0].presence }.compact
35
34
  end
36
35
  end
@@ -1,5 +1,5 @@
1
1
  module I18n
2
2
  module Tasks
3
- VERSION = '0.2.19'
3
+ VERSION = '0.2.20'
4
4
  end
5
5
  end
@@ -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.missing_translations i18n_tasks.untranslated_keys(i18n_parse_locales args[:locales])
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 :not_in_base => 'i18n:setup' do |t, args|
22
- i18n_report.missing_translations i18n_tasks.keys_not_in_base_info
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.missing_translations i18n_tasks.keys_eq_base_info(i18n_parse_locales args[:locales])
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 :blank, [:locales] => 'i18n:setup' do |t, args|
32
- i18n_report.missing_translations i18n_tasks.keys_eq_base_info(i18n_parse_locales args[:locales])
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.unused_translations
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
- i18n_tasks.add_missing! base_locale, args[:placeholder]
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]) || i18n_tasks.locales
49
- unused_keys = i18n_tasks.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.unused_translations(unused_keys)
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
- i18n_tasks.remove_unused!(locales)
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
- i18n_tasks.normalize_store! args[:locales]
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
- i18n_tasks.fill_with_blanks! i18n_parse_locales args[:locales]
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
- i18n_tasks.fill_with_google_translate! i18n_parse_locales args[:locales]
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
- i18n_tasks.fill_with_base_values! i18n_parse_locales args[:locales]
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: :i18n_tasks
105
+ delegate :base_locale, to: :i18n_task
102
106
 
103
- def i18n_tasks
104
- @i18n_tasks ||= I18n::Tasks::BaseTask.new
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 YAML adapter supports reading from and writing to YAML files
4
- adapter: yaml
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'
@@ -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.should be_i18n_keys expected_unused_keys
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).should be_present
33
- t.t(t.data[:es], key).should be_present
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).should be_nil
43
- t.t(t.data[:es], key).should be_nil
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.19
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-03 00:00:00.000000000 Z
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-rails
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/yaml_adapter_spec.rb
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/yaml_adapter_spec.rb
296
+ - spec/used_keys_spec.rb
287
297
  has_rdoc: