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