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.
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: