i18n-tasks 0.0.2 → 0.0.3
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/README.md +1 -1
- data/i18n-tasks.gemspec +1 -0
- data/lib/i18n/tasks/missing.rb +27 -2
- data/lib/i18n/tasks/task_helpers.rb +18 -0
- data/lib/i18n/tasks/unused.rb +3 -4
- data/lib/i18n/tasks/version.rb +1 -1
- data/spec/i18n_tasks_spec.rb +2 -1
- data/spec/spec_helper.rb +2 -1
- data/spec/support/i18n_tasks_output_matcher.rb +10 -1
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e4a2353a4fb77dc7513547b875f9e22959bf0e65
|
4
|
+
data.tar.gz: 327f3a171a0991b71aba09799d7e508967f88a63
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cc558aa7656a508ce7fa49a49e3b842bb4922625c6387edef62242b9d40f22fdc1052e2ec06429246ca66e85d583f26afb4fe1ac51c6b01409ad1e9f18fe9af7
|
7
|
+
data.tar.gz: e2a120d28f080bb114b9fe31749a881224b654e6beeac8fb60494a6c982a8928cf480cc19a9f98d4a21ea56347bb6795d7cbb6763c89d0db99500ccdfcab77bb
|
data/README.md
CHANGED
data/i18n-tasks.gemspec
CHANGED
@@ -20,6 +20,7 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.add_dependency 'rails'
|
22
22
|
spec.add_dependency 'rake'
|
23
|
+
spec.add_dependency 'term-ansicolor'
|
23
24
|
spec.add_development_dependency 'bundler', '~> 1.3'
|
24
25
|
spec.add_development_dependency 'rake'
|
25
26
|
spec.add_development_dependency 'rspec-rails'
|
data/lib/i18n/tasks/missing.rb
CHANGED
@@ -3,17 +3,42 @@ require 'i18n/tasks/base_task'
|
|
3
3
|
module I18n
|
4
4
|
module Tasks
|
5
5
|
class Missing < BaseTask
|
6
|
+
DESC = 'find all missing keys and missing translations'
|
6
7
|
def perform
|
8
|
+
$stderr.puts DESC
|
9
|
+
# missing keys (in the code but not in base locale data)
|
10
|
+
pattern_prefixes = find_source_pattern_prefixes
|
11
|
+
find_source_keys.each do |key|
|
12
|
+
if t(base[base_locale], key).blank? && !pattern_prefixes.any? { |pp| key.start_with?(pp) }
|
13
|
+
puts "#{red print_locale base_locale} #{red "✗ #{bold 'none'}"}\t #{print_key key}"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# missing translations (present in base locale, but untranslated in another locale )
|
7
18
|
(I18n.available_locales.map(&:to_s) - [base_locale]).each do |locale|
|
8
19
|
trn = get_locale_data(locale)[locale]
|
9
20
|
traverse base[base_locale] do |key, base_value|
|
10
21
|
translated = t(trn, key)
|
11
|
-
|
12
|
-
|
22
|
+
data = "\t #{print_key key} #{cyan base_value}"
|
23
|
+
s = if translated.blank?
|
24
|
+
"#{yellow bold '∅ blank'}#{data}"
|
25
|
+
elsif translated == base_value
|
26
|
+
"#{yellow bold "= #{base_locale}" }#{data}"
|
13
27
|
end
|
28
|
+
puts "#{print_locale locale} #{s}" if s
|
14
29
|
end
|
15
30
|
end
|
16
31
|
end
|
32
|
+
|
33
|
+
private
|
34
|
+
def print_locale(locale)
|
35
|
+
' ' + bold(locale.ljust(5))
|
36
|
+
end
|
37
|
+
|
38
|
+
def print_key(key)
|
39
|
+
magenta(key).ljust(50)
|
40
|
+
end
|
41
|
+
|
17
42
|
end
|
18
43
|
end
|
19
44
|
end
|
@@ -1,8 +1,10 @@
|
|
1
1
|
require 'open3'
|
2
|
+
require 'term/ansicolor'
|
2
3
|
|
3
4
|
module I18n
|
4
5
|
module Tasks
|
5
6
|
module TaskHelpers
|
7
|
+
include Term::ANSIColor
|
6
8
|
def run_command(*args)
|
7
9
|
_in, out, _err = Open3.popen3(*args)
|
8
10
|
out.gets nil
|
@@ -19,6 +21,22 @@ module I18n
|
|
19
21
|
"config/locales/#{locale}.yml"
|
20
22
|
end
|
21
23
|
|
24
|
+
# find all keys in the source
|
25
|
+
def find_source_keys
|
26
|
+
@source_keys ||= begin
|
27
|
+
grep_out = run_command 'grep', '-horI', %q{\\bt(\\?\\s*['"]\\([^'"]*\\)['"]}, 'app/'
|
28
|
+
used_keys = grep_out.split("\n").map { |r| r.match(/['"](.*?)['"]/)[1] }.uniq.to_set
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def find_source_pattern_keys
|
33
|
+
find_source_keys.select { |k| k =~ /\#{.*?}/ || k.ends_with?('.') }
|
34
|
+
end
|
35
|
+
|
36
|
+
def find_source_pattern_prefixes
|
37
|
+
find_source_pattern_keys.map { |k| k.split(/\.?#/)[0] }
|
38
|
+
end
|
39
|
+
|
22
40
|
# traverse hash, yielding with full key and value
|
23
41
|
def traverse(path = '', hash, &block)
|
24
42
|
hash.each do |k, v|
|
data/lib/i18n/tasks/unused.rb
CHANGED
@@ -4,12 +4,11 @@ module I18n
|
|
4
4
|
module Tasks
|
5
5
|
class Unused < BaseTask
|
6
6
|
def perform
|
7
|
-
|
8
|
-
|
9
|
-
pattern_prefixes = used_keys.select { |k| k =~ /\#{.*?}/ || k.ends_with?('.') }.map { |k| k.split(/\.?#/)[0] }
|
7
|
+
used_keys = find_source_keys
|
8
|
+
pattern_prefixes = find_source_pattern_prefixes
|
10
9
|
traverse base[base_locale] do |key, value|
|
11
10
|
if !used_keys.include?(key) && !pattern_prefixes.any? { |pp| key.start_with?(pp) }
|
12
|
-
puts "#{key}
|
11
|
+
puts "#{yellow 'unused'.ljust(10)}#{magenta(key).ljust(60)}\t#{cyan value}"
|
13
12
|
end
|
14
13
|
end
|
15
14
|
end
|
data/lib/i18n/tasks/version.rb
CHANGED
data/spec/i18n_tasks_spec.rb
CHANGED
@@ -3,7 +3,7 @@ require 'spec_helper'
|
|
3
3
|
describe 'rake i18n' do
|
4
4
|
describe 'missing' do
|
5
5
|
it 'detects missing or identical' do
|
6
|
-
TestCodebase.rake_result('i18n:missing').should be_i18n_keys %w(es.missing_in_es.a es.blank_in_es.a es.same_in_es.a)
|
6
|
+
TestCodebase.rake_result('i18n:missing').should be_i18n_keys %w(en.used_but_missing.a es.missing_in_es.a es.blank_in_es.a es.same_in_es.a)
|
7
7
|
end
|
8
8
|
end
|
9
9
|
|
@@ -48,6 +48,7 @@ describe 'rake i18n' do
|
|
48
48
|
p \#{t('ca.a')} \#{t 'ca.b'} \#{t "ca.c"}
|
49
49
|
p \#{t 'ca.d'} \#{t 'ca.f', i: 'world'} \#{t 'ca.e', i: 'world'}
|
50
50
|
p \#{t 'missing_in_es.a'} \#{t 'same_in_es.a'} \#{t 'blank_in_es.a'}
|
51
|
+
p = t 'used_but_missing.a'
|
51
52
|
SLIM
|
52
53
|
'app/controllers/events_controller.slim' => <<-RUBY,
|
53
54
|
class EventsController < ApplicationController
|
data/spec/spec_helper.rb
CHANGED
@@ -5,9 +5,10 @@ require 'i18n/tasks'
|
|
5
5
|
require 'rake'
|
6
6
|
Rake.load_rakefile 'tasks/i18n-tasks.rake'
|
7
7
|
Rake.load_rakefile 'support/test_codebase_env.rake'
|
8
|
+
require 'term/ansicolor'
|
9
|
+
Term::ANSIColor::coloring = false
|
8
10
|
Dir['spec/support/**/*.rb'].each { |f| require "./#{f}" }
|
9
11
|
|
10
12
|
RSpec.configure do |config|
|
11
|
-
|
12
13
|
end
|
13
14
|
|
@@ -1,5 +1,14 @@
|
|
1
1
|
RSpec::Matchers.define :be_i18n_keys do |expected|
|
2
2
|
match do |actual|
|
3
|
-
actual.split("\n").map { |x|
|
3
|
+
r = actual.split("\n").map { |x|
|
4
|
+
x.strip!
|
5
|
+
key = x.gsub(/\s+/, ' ').split(' ').reverse.detect { |p| p && p.include?('.') }
|
6
|
+
if x =~ /^\w{2}\b/
|
7
|
+
x.split(' ', 2)[0] + '.' + key
|
8
|
+
else
|
9
|
+
key
|
10
|
+
end
|
11
|
+
}
|
12
|
+
r.sort == expected.sort
|
4
13
|
end
|
5
14
|
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.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- glebm
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-06-
|
11
|
+
date: 2013-06-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - '>='
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: term-ansicolor
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: bundler
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|