i18n-tasks 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: be5ef7d26c3df1ed7c2d3492c2ddbee544e561c0
4
- data.tar.gz: c294aa392797e900e990defa0fbed3c5a7d7cafa
3
+ metadata.gz: e4a2353a4fb77dc7513547b875f9e22959bf0e65
4
+ data.tar.gz: 327f3a171a0991b71aba09799d7e508967f88a63
5
5
  SHA512:
6
- metadata.gz: 783c897ba722831c9893301270e3a8dee8c7dd0775a32bb293c137a3b643f4fd50c9d05628e794891c72bbcfadce25f844da3d3846b750c495ea94bf8ee15d00
7
- data.tar.gz: df5d3744b47f1ed0366cb6305823d6f38737e4b583af2ac586808ada0a9a2a0c7a7470db592871962ad1ff3e82a5e4d76790d41207445ca3080054c666573e9a
6
+ metadata.gz: cc558aa7656a508ce7fa49a49e3b842bb4922625c6387edef62242b9d40f22fdc1052e2ec06429246ca66e85d583f26afb4fe1ac51c6b01409ad1e9f18fe9af7
7
+ data.tar.gz: e2a120d28f080bb114b9fe31749a881224b654e6beeac8fb60494a6c982a8928cf480cc19a9f98d4a21ea56347bb6795d7cbb6763c89d0db99500ccdfcab77bb
data/README.md CHANGED
@@ -21,7 +21,7 @@ Installation
21
21
 
22
22
  Simply add to Gemfile:
23
23
 
24
- gem 'i18n-tasks', '~> 0.0.1'
24
+ gem 'i18n-tasks', '~> 0.0.3'
25
25
 
26
26
  Configuration
27
27
  -------------
@@ -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'
@@ -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
- if translated.blank? || translated == base_value
12
- puts "#{locale}.#{key}: #{base_value}"
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|
@@ -4,12 +4,11 @@ module I18n
4
4
  module Tasks
5
5
  class Unused < BaseTask
6
6
  def perform
7
- grep_out = run_command 'grep', '-horI', %q{\\bt(\\?\\s*['"]\\([^'"]*\\)['"]}, 'app/'
8
- used_keys = grep_out.split("\n").map { |r| r.match(/['"](.*?)['"]/)[1] }.uniq.to_set
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}: #{value}"
11
+ puts "#{yellow 'unused'.ljust(10)}#{magenta(key).ljust(60)}\t#{cyan value}"
13
12
  end
14
13
  end
15
14
  end
@@ -1,5 +1,5 @@
1
1
  module I18n
2
2
  module Tasks
3
- VERSION = "0.0.2"
3
+ VERSION = '0.0.3'
4
4
  end
5
5
  end
@@ -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
@@ -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| x.split(':')[0] }.sort == expected.sort
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.2
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-24 00:00:00.000000000 Z
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