i18n-tasks 0.0.8 → 0.1.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4d271be49ca3aee877e8799c24145bc17b9d5c33
4
- data.tar.gz: df4a3e1a654c27714df1117ab5a561ef62ab762c
3
+ metadata.gz: 3695a5c801e3826fc8ec81bdf35d1ce830dae4f4
4
+ data.tar.gz: 3f0dceded74c9f668ae316dfd72ba1c1154d713b
5
5
  SHA512:
6
- metadata.gz: 50a1d85e61b5a39d649c321648596268c70123193c913918bb6ac2eeedbe11bc2bba45ce0a6106622883541e944d248f3c9b2588d977ab87f900fef70c035ea4
7
- data.tar.gz: 29f950b42403e129faf1473b4d8888fbdb61569569689adbc0fee72f237f017b80ba10d28562d213e22497d95f991ad7efe060734cd36e9ad6cf83c71f5e017a
6
+ metadata.gz: 8f93118329d8599262d2b2443a5631b6cd6bb4adb1395b8f2e467fb70432939ffafe577b943f04eef2be6304ff274facc0454e4229becceda3b07087f55c96a0
7
+ data.tar.gz: 75f103be804ab756261c00dc318ea7669a3f20d92e7f4a9cb5223ba6ae60cf3af6d0b1d5d5dfc4fe8f8d9ddf05e41321f1d0e05ef3c711f24ad7af057e46b379
data/.gitignore CHANGED
@@ -30,3 +30,5 @@ spec/reports
30
30
  test/tmp
31
31
  test/version_tmp
32
32
  tmp
33
+ .ruby-version
34
+ .ruby-gemset
@@ -1,6 +1,12 @@
1
1
  language: ruby
2
2
  rvm:
3
3
  - 2.0.0
4
- - jruby-19mode # JRuby in 1.9 mode
5
- - rbx-19mode
6
4
  - 1.9.3
5
+ - jruby
6
+ - rbx-19mode
7
+
8
+ matrix:
9
+ allow_failures:
10
+ - rvm: jruby
11
+ - rvm: rbx-19mode
12
+
data/README.md CHANGED
@@ -18,13 +18,6 @@ Use `rake -T i18n` to get the list of tasks with descriptions. There are 3 tasks
18
18
 
19
19
  Relative keys (`t '.title'`) are supported too.
20
20
 
21
- `i18n:missing` may incorrectly show framework i18n keys as missing, to work around this use `.i18nignore` file in project root:
22
-
23
- devise.errors.unauthorized # ignore this key
24
- pagination.views. # ignore the whole pattern (note the .)
25
-
26
- Keys listed in `.i18nignore` will also be excluded from `i18n:unused` report.
27
-
28
21
  For more examples see [the tests](https://github.com/glebm/i18n-tasks/blob/master/spec/i18n_tasks_spec.rb#L43-L59).
29
22
 
30
23
  Installation
@@ -32,18 +25,42 @@ Installation
32
25
 
33
26
  Simply add to Gemfile:
34
27
 
35
- gem 'i18n-tasks', '~> 0.0.8'
28
+ gem 'i18n-tasks', '~> 0.1.0'
36
29
 
37
30
  Configuration
38
31
  -------------
39
32
 
33
+
34
+ Tasks may incorrectly report framework i18n keys as missing. You can add `config/i18n-tasks.yml` to work around this:
35
+
36
+ # do not report these keys as missing (both on blank value and no key)
37
+ ignore_missing:
38
+ - devise.errors.unauthorized # ignore this key
39
+ - pagination.views. # ignore the whole pattern (note the .)
40
+
41
+ # do not report these keys when they have the same value as the base locale version
42
+ ignore_eq_base:
43
+ all:
44
+ - common.ok
45
+ es,fr:
46
+ - common.brand
47
+
48
+ # do not report these keys as unused
49
+ ignore_unused:
50
+ - category.
51
+
52
+ # do not report these keys ever
53
+ ignore:
54
+ - kaminari.
55
+
56
+
40
57
  By default reports I18n reads locale data from `config/locales/{locale_code}.yml`.
41
58
  You can customize this, e.g.:
42
59
 
43
60
  # load all config/locales/*.locale.yml and config/locales/locale.yml:
44
61
  I18n::Tasks.get_locale_data = ->(locale) {
45
62
  (["config/locales/#{locale}.yml"] + Dir["config/locales/*.#{locale}.yml"]).inject({}) { |hash, path|
46
- hash.merge! YAML.load_file(path)
63
+ hash.deep_merge! YAML.load_file(path)
47
64
  hash
48
65
  }
49
66
  }
@@ -1,5 +1,6 @@
1
1
  require 'i18n/tasks/version'
2
2
  require 'i18n/tasks/railtie'
3
+ require 'active_support/hash_with_indifferent_access'
3
4
 
4
5
  module I18n
5
6
  module Tasks
@@ -7,5 +8,16 @@ module I18n
7
8
  self.get_locale_data = lambda { |locale|
8
9
  YAML.load_file("config/locales/#{locale}.yml")
9
10
  }
11
+
12
+ CONFIG_FILE = 'config/i18n-tasks.yml'
13
+ class << self
14
+ def config
15
+ @config ||= begin
16
+ file = File.read(CONFIG_FILE) if File.exists?(CONFIG_FILE)
17
+ file = YAML.load(file) if file.present?
18
+ HashWithIndifferentAccess.new.merge(file.presence || {})
19
+ end
20
+ end
21
+ end
10
22
  end
11
23
  end
@@ -36,24 +36,10 @@ module I18n
36
36
  key
37
37
  end
38
38
  }.uniq
39
- used_keys = used_keys.reject { |k| k !~ /^[\w.\#{}]+$/ }
40
- exclude_patterns used_keys, ignore_patterns
39
+ used_keys.reject { |k| k !~ /^[\w.\#{}]+$/ }
41
40
  end
42
41
  end
43
42
 
44
- IGNORE_FILE = '.i18nignore'
45
-
46
- def ignore_patterns
47
- @ignored_patterns ||= begin
48
- if File.exists?(IGNORE_FILE)
49
- File.read(IGNORE_FILE).split("\n").map {|k|
50
- k.split('#')[0].try(:strip).presence
51
- }.compact.uniq
52
- else
53
- []
54
- end
55
- end
56
- end
57
43
 
58
44
  def find_source_pattern_keys
59
45
  @source_pattern_keys ||= find_source_keys.select { |k| k =~ /\#{.*?}/ || k.ends_with?('.') }
@@ -33,16 +33,18 @@ module I18n
33
33
 
34
34
 
35
35
 
36
+ # get all the missing translations as list of missing keys as hashes with:
37
+ # {:locale, :key, :type, and optionally :base_value}
38
+ # :type — :blank, :missing, or :eq_base
39
+ # :base_value — translation value in base locale if one is present
36
40
  def find_missing
37
- missing = []
38
-
39
- # missing keys (in the code but not in base locale data)
41
+ # dynamically generated keys in the source, e.g t("category.#{category_key}")
40
42
  pattern_re = compile_start_with_re find_source_pattern_prefixes
41
43
 
42
- find_source_keys.each do |key|
43
- if t(base[base_locale], key).blank? && key !~ pattern_re
44
- missing << {locale: :en, type: :none, key: key}
45
- end
44
+ # missing keys (in the code but not in base locale data)
45
+ keys = find_source_keys
46
+ missing = keys.select { |key| t(base[base_locale], key).blank? && key !~ pattern_re && key !~ ignore_pattern(:missing) }.map do |key|
47
+ {locale: base_locale, type: :none, key: key}
46
48
  end
47
49
 
48
50
  # missing translations (present in base locale, but untranslated in another locale )
@@ -50,9 +52,9 @@ module I18n
50
52
  trn = get_locale_data(locale)[locale]
51
53
  traverse base[base_locale] do |key, base_value|
52
54
  translated = t(trn, key)
53
- if translated.blank?
55
+ if translated.blank? && key !~ ignore_pattern(:missing)
54
56
  missing << {locale: locale, key: key, type: :blank, base_value: base_value}
55
- elsif translated == base_value
57
+ elsif translated == base_value && key !~ ignore_pattern(:eq_base, locale)
56
58
  missing << {locale: locale, key: key, type: :eq_base, base_value: base_value}
57
59
  end
58
60
  end
@@ -11,7 +11,11 @@ module I18n
11
11
 
12
12
  # compile prefix matching Regexp from the list of prefixes
13
13
  def compile_start_with_re(prefixes)
14
- /^(?:#{prefixes.map{|p| Regexp.escape(p) }.join('|')})/
14
+ if prefixes.blank?
15
+ /\Z\A/ # match nothing
16
+ else
17
+ /^(?:#{prefixes.map { |p| Regexp.escape(p) }.join('|')})/
18
+ end
15
19
  end
16
20
 
17
21
  # exclude @keys with prefixes matching @patterns
@@ -19,6 +23,25 @@ module I18n
19
23
  pattern_re = compile_start_with_re patterns.select { |p| p.end_with?('.') }
20
24
  (keys - patterns).reject { |k| k =~ pattern_re }
21
25
  end
26
+
27
+ # type: missing, eq_base, unused
28
+ def ignore_pattern(type, locale = nil)
29
+ ((@ignore_patterns ||= HashWithIndifferentAccess.new)[type] ||= {})[locale] = begin
30
+ global = config[:ignore] || []
31
+ type_ignore = config["ignore_#{type}"] || []
32
+ if type_ignore.is_a?(Array)
33
+ compile_start_with_re global + type_ignore
34
+ elsif type_ignore.is_a?(Hash)
35
+ p = global + (type_ignore[:all] || [])
36
+ type_ignore.each { |key, value| p += (value || []) if key.to_s =~ /\b#{locale}\b/ } if locale
37
+ compile_start_with_re p
38
+ end
39
+ end
40
+ end
41
+
42
+ def config
43
+ I18n::Tasks.config
44
+ end
22
45
  end
23
46
  end
24
47
  end
@@ -16,7 +16,7 @@ module I18n
16
16
  def find_unused
17
17
  used_keys = find_source_keys.to_set
18
18
  r = []
19
- ignore_re = compile_start_with_re ignore_patterns
19
+ ignore_re = ignore_pattern(:unused)
20
20
  pattern_re = compile_start_with_re find_source_pattern_prefixes
21
21
  traverse base[base_locale] do |key, value|
22
22
  unless used_keys.include?(key) || key =~ pattern_re || key =~ ignore_re
@@ -1,5 +1,5 @@
1
1
  module I18n
2
2
  module Tasks
3
- VERSION = '0.0.8'
3
+ VERSION = '0.1.0'
4
4
  end
5
5
  end
@@ -13,6 +13,10 @@ namespace :i18n do
13
13
 
14
14
  desc 'show keys with translation values identical to base'
15
15
  task :missing => :environment do
16
+ if File.exists?('.i18nignore')
17
+ STDERR.puts "!!!! Looks like you are using .i18ignore. It is no longer used in favour of config/i18n-tasks.yml.\n
18
+ See README.md https://github.com/glebm/i18n-tasks"
19
+ end
16
20
  I18n::Tasks::Missing.new.perform
17
21
  end
18
22
 
@@ -32,8 +32,11 @@ describe 'rake i18n' do
32
32
  'hash_pattern' => {'a' => v},
33
33
  'hash_pattern2' => {'a' => v},
34
34
  'unused' => {'a' => v},
35
+ 'ignore_unused' => {'a' => v},
35
36
  'missing_in_es' => {'a' => v},
36
37
  'same_in_es' => {'a' => v},
38
+ 'ignore_eq_base_all' => {'a' => v},
39
+ 'ignore_eq_base_es' => {'a' => v},
37
40
  'blank_in_es' => {'a' => v},
38
41
  'relative' => {'index' => {'title' => v}}
39
42
 
@@ -47,22 +50,43 @@ describe 'rake i18n' do
47
50
  es_data = gen_data.('ES_TEXT').except('missing_in_es')
48
51
  es_data['same_in_es']['a'] = 'EN_TEXT'
49
52
  es_data['blank_in_es']['a'] = ''
53
+ es_data['ignore_eq_base_all']['a'] = 'EN_TEXT'
54
+ es_data['ignore_eq_base_es']['a'] = 'EN_TEXT'
50
55
 
51
56
  fs = {
52
57
  'config/locales/en.yml' => {'en' => en_data}.to_yaml,
53
58
  'config/locales/es.yml' => {'es' => es_data}.to_yaml,
54
- '.i18nignore' => <<-TEXT,
55
- ignored_missing_key.a # one key to ignore
59
+ 'config/i18n-tasks.yml' => <<-YML,
60
+ # do not report these keys as missing:
61
+ ignore_missing:
62
+ - ignored_missing_key.a # one key to ignore
63
+ - ignored_pattern. # ignore the whole pattern
56
64
 
57
- ignored_pattern. # ignore the whole pattern
58
- TEXT
65
+ # do not report these keys when they have the same value as the base locale version
66
+ ignore_eq_base:
67
+ all:
68
+ - ignore_eq_base_all.a
69
+ es:
70
+ - ignore_eq_base_es.a
71
+
72
+ # do not report these keys as unused
73
+ ignore_unused:
74
+ - ignore_unused.a
75
+
76
+ # do not report these keys ever
77
+ ignore:
78
+ - ignore.a
79
+ YML
59
80
  'app/views/index.html.slim' => <<-SLIM,
60
81
  p \#{t('ca.a')} \#{t 'ca.b'} \#{t "ca.c"}
61
82
  p \#{t 'ca.d'} \#{t 'ca.f', i: 'world'} \#{t 'ca.e', i: 'world'}
62
83
  p \#{t 'missing_in_es.a'} \#{t 'same_in_es.a'} \#{t 'blank_in_es.a'}
63
84
  p = t 'used_but_missing.a'
64
85
  p = t 'ignored_missing_key.a'
86
+ p = t 'ignore.a'
65
87
  p = t 'ignored_pattern.some_key'
88
+ p = t 'ignore_eq_base_all.a'
89
+ p = t 'ignore_eq_base_es.a'
66
90
  SLIM
67
91
  'app/views/relative/index.html.slim' => <<-SLIM,
68
92
  p = t '.title'
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.0.8
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - glebm
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-07-19 00:00:00.000000000 Z
11
+ date: 2013-08-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -102,8 +102,6 @@ extensions: []
102
102
  extra_rdoc_files: []
103
103
  files:
104
104
  - .gitignore
105
- - .ruby-gemset
106
- - .ruby-version
107
105
  - .travis.yml
108
106
  - Gemfile
109
107
  - LICENSE.txt
@@ -146,7 +144,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
146
144
  version: '0'
147
145
  requirements: []
148
146
  rubyforge_project:
149
- rubygems_version: 2.0.3
147
+ rubygems_version: 2.0.6
150
148
  signing_key:
151
149
  specification_version: 4
152
150
  summary: Rails I18n tasks to find missing / unused translations and more
@@ -1 +0,0 @@
1
- i18n-tasks
@@ -1 +0,0 @@
1
- 2.0.0-p195