vocab 0.1.0 → 0.1.1

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.
@@ -20,6 +20,7 @@ module Vocab
20
20
 
21
21
  parser.banner = 'Usage: vocab [-h] command [platform] [type] [path]'
22
22
  parser.on( '-h', '--help', 'Show this usage message' ) { options.help = true }
23
+ parser.on( '-s', '--strict', 'Require matching order of interpolations' ) { options.strict = true }
23
24
  parser.separator ""
24
25
  parser.separator " vocab init"
25
26
  parser.separator " vocab extract rails"
@@ -28,10 +29,12 @@ module Vocab
28
29
  parser.separator " vocab clean rails"
29
30
  parser.separator " vocab convert rails xml2yml <infile>"
30
31
  parser.separator " vocab convert rails yml2xml <infile>"
31
- parser.separator " vocab merge rails"
32
+ parser.separator " vocab merge rails [-s]"
32
33
  parser.separator " vocab merge android"
33
34
  parser.separator " vocab validate android"
34
35
  parser.separator " vocab validate rails"
36
+ parser.separator " vocab interpolation rails <file> [-s]"
37
+ parser.separator " vocab interpolation android <file>"
35
38
  parser.separator ""
36
39
 
37
40
  commands = parser.parse( ARGV )
@@ -63,13 +66,17 @@ module Vocab
63
66
  elsif( options.command == 'extract' && options.platform == 'android' )
64
67
  Extractor::Android.extract
65
68
  elsif( options.command == 'merge' && options.platform == 'rails' )
66
- Merger::Rails.new.merge
69
+ Merger::Rails.new.merge( options.strict )
67
70
  elsif( options.command == 'merge' && options.platform == 'android' )
68
71
  Merger::Android.new.merge
69
72
  elsif( options.command == 'validate' && options.platform == 'android' )
70
73
  success = Validator::Android.new.validate
71
74
  elsif( options.command == 'validate' && options.platform == 'rails' )
72
75
  success = Validator::Rails.new.validate
76
+ elsif( options.command == 'interpolation' && options.platform == 'rails' && !options.type.nil? )
77
+ Vocab::Merger::Rails.new.check_all_interpolations( options.type, options.strict )
78
+ elsif( options.command == 'interpolation' && options.platform == 'android' && !options.type.nil? )
79
+ Vocab::Merger::Android.new.check_all_format_strings( options.type )
73
80
  else
74
81
  puts parser.help
75
82
  end
@@ -14,7 +14,7 @@ module Vocab
14
14
  end
15
15
  end
16
16
 
17
- def merge_file( path )
17
+ def merge_file( path, strict = true )
18
18
  strings = strings( path )
19
19
  plurals = plurals( path )
20
20
  Vocab::Translator::Android.write( strings, plurals, path )
@@ -63,6 +63,11 @@ module Vocab
63
63
  send( format_checker, key, new_value, path)
64
64
  end
65
65
 
66
+ def check_all_format_strings( file )
67
+ strings( file )
68
+ plurals( file )
69
+ end
70
+
66
71
  def plural_format_changed?( key, new_value, path )
67
72
  new_value.each do |inner_key,inner_value|
68
73
  if ( @english_plurals[ key ][ inner_key ].to_s.scan( FORMAT_PATTERN ) != inner_value.to_s.scan( FORMAT_PATTERN ) ) ||
@@ -4,10 +4,10 @@ module Vocab
4
4
 
5
5
  attr_accessor :locales_dir, :updates_dir
6
6
 
7
- def merge
7
+ def merge( strict = false )
8
8
  files_to_merge.each do |file|
9
9
  Vocab.ui.say( "Merging file: #{file}" )
10
- merge_file( file )
10
+ merge_file( file, strict )
11
11
  end
12
12
  end
13
13
  end
@@ -1,14 +1,14 @@
1
1
  module Vocab
2
2
  module Merger
3
3
  class Rails < Base
4
- INTERPOLATION_PATTERN = /%{(.+?)}/
4
+ INTERPOLATION_PATTERN = /%{(.*?)}/
5
5
 
6
6
  def initialize( locales_dir = nil, updates_dir = nil )
7
7
  @locales_dir = locales_dir || 'config/locales'
8
8
  @updates_dir = updates_dir || 'tmp/translations'
9
9
  end
10
10
 
11
- def merge_file( locales_path )
11
+ def merge_file( locales_path, strict = false )
12
12
  return unless translatable?( locales_path )
13
13
  create_if_missing( locales_path )
14
14
 
@@ -16,7 +16,6 @@ module Vocab
16
16
  keys = Vocab::Merger::Rails.keys_for_file( locales_path )
17
17
  english = Vocab::Merger::Rails.load_english( locales_path )
18
18
 
19
-
20
19
  # existing translations already in the file
21
20
  locales_translator = translator( locales_path )
22
21
  locales = locales_translator.flattened_translations
@@ -38,7 +37,7 @@ module Vocab
38
37
  value = updates[ key ] || locales[ key ]
39
38
  if value
40
39
  locales_translator.store( key, value )
41
- check_matching_interpolations( key, english[ key ], value, locales_path )
40
+ check_matching_interpolations( key, english[ key ], value, locales_path, strict )
42
41
  else
43
42
  Vocab.ui.warn( "No translation found for key #{key} while merging #{locales_path}" )
44
43
  end
@@ -47,10 +46,37 @@ module Vocab
47
46
  locales_translator.write_file( locales_path )
48
47
  end
49
48
 
50
- def check_matching_interpolations( key, old_value, new_value, locales_path )
51
- if old_value.to_s.scan( INTERPOLATION_PATTERN ) != new_value.to_s.scan( INTERPOLATION_PATTERN )
52
- Vocab.ui.warn( "Interpolation mismatch for key #{key} while merging #{locales_path}. \n English: #{old_value} Translation: #{new_value}" )
49
+ def check_matching_interpolations( key, old_value, new_value, locales_path, strict = false )
50
+ old_interpolations = old_value.to_s.scan( INTERPOLATION_PATTERN )
51
+ new_interpolations = new_value.to_s.scan( INTERPOLATION_PATTERN )
52
+ unless strict
53
+ old_interpolations.sort!
54
+ new_interpolations.sort!
55
+ end
56
+
57
+ if old_interpolations != new_interpolations
58
+ Vocab.ui.warn( "Interpolation mismatch for key #{key} in #{locales_path}. \n English: #{old_value} Translation: #{new_value}" )
59
+ end
60
+ end
61
+
62
+ def check_all_interpolations( file, strict = false )
63
+ # list of keys that need to be in the translated file
64
+ keys = Vocab::Merger::Rails.keys_for_file( file )
65
+ english = Vocab::Merger::Rails.load_english( file )
66
+
67
+ # existing translations already in the file
68
+ locales_translator = translator( file )
69
+ locales = locales_translator.flattened_translations
70
+
71
+ keys.each do |key|
72
+ next if Vocab::Translator::Base.ignore_key?( key )
73
+
74
+ value = locales[ key ]
75
+ if value
76
+ check_matching_interpolations( key, english[ key ], value, file, strict )
77
+ end
53
78
  end
79
+ return nil
54
80
  end
55
81
 
56
82
  def self.keys_for_file( path )
data/lib/vocab/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Vocab
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
@@ -1,6 +1,6 @@
1
1
  en:
2
2
  marketing:
3
- banner: This product is so good
3
+ banner: This product is so good %{user}
4
4
  dashboard:
5
5
  chart: This value has changed
6
6
  details: This key/value has been added
@@ -1,6 +1,6 @@
1
1
  es:
2
2
  marketing:
3
- banner: hola
3
+ banner: hola %{user }
4
4
  dashboard:
5
5
  chart: Es muy bonita
6
6
  details: grande
@@ -91,7 +91,7 @@ describe "Vocab::Extractor::Rails" do
91
91
 
92
92
  it "creates a hash of the english translation strings currently in the config" do
93
93
  actual = Vocab::Extractor::Rails.current_strings( @locales_root )
94
- expected = {:"en.marketing.banner"=>"This product is so good",
94
+ expected = {:"en.marketing.banner"=>"This product is so good %{user}",
95
95
  :"en.dashboard.chart"=>"This value has changed",
96
96
  :"en.dashboard.details"=>"This key/value has been added",
97
97
  :"en.menu.first"=>"First menu item",
@@ -12,7 +12,7 @@ describe "Vocab::Extractor::Base" do
12
12
  files = [ 'es.yml', 'zh.yml' ]
13
13
  @merger.should_receive( :files_to_merge ).and_return( files )
14
14
  files.each do |file|
15
- @merger.should_receive( :merge_file ).with( file )
15
+ @merger.should_receive( :merge_file ).with( file, false )
16
16
  Vocab.ui.should_receive( :say ).with( "Merging file: #{file}" )
17
17
  end
18
18
  @merger.merge
@@ -149,7 +149,7 @@ describe "Vocab::Merger::Rails" do
149
149
  describe "check_matching_interpolations" do
150
150
  it 'warns about interpolation changes' do
151
151
  @merger = Vocab::Merger::Rails.new
152
- Vocab.ui.should_receive( :warn ).with( "Interpolation mismatch for key test_key while merging test.yml. \n English: %{test_name} Translation: %{best_name}" )
152
+ Vocab.ui.should_receive( :warn ).with( "Interpolation mismatch for key test_key in test.yml. \n English: %{test_name} Translation: %{best_name}" )
153
153
  @merger.check_matching_interpolations( 'test_key', "%{test_name}", "%{best_name}", "test.yml")
154
154
  end
155
155
  end
@@ -12,7 +12,7 @@ describe 'Vocab::Translator::Rails' do
12
12
  it 'loads translations from a directory of yml files' do
13
13
 
14
14
  actual = @translator.translations
15
- expected = {:marketing=>{:banner=>"This product is so good"},
15
+ expected = {:marketing=>{:banner=>"This product is so good %{user}"},
16
16
  :dashboard=>{:chart=>"This value has changed",
17
17
  :details=>"This key/value has been added"},
18
18
  :menu=>{:first=>"First menu item",
@@ -97,7 +97,7 @@ describe 'Vocab::Translator::Rails' do
97
97
  translator = Vocab::Translator::Rails.new
98
98
  translator.load_dir( "#{vocab_root}/spec/data/rails/locales" )
99
99
  actual = translator.flattened_translations
100
- expected = {:"marketing.banner"=>"This product is so good",
100
+ expected = {:"marketing.banner"=>"This product is so good %{user}",
101
101
  :"dashboard.chart"=>"This value has changed",
102
102
  :"dashboard.details"=>"This key/value has been added",
103
103
  :"menu.first"=>"First menu item",
@@ -119,7 +119,7 @@ describe 'Vocab::Translator::Rails' do
119
119
  translator.load_dir( "#{vocab_root}/spec/data/rails/locales" )
120
120
  actual = translator.flattened_translations
121
121
  expected = { :"models.product.id_125.name" =>"Lazero",
122
- :"marketing.banner" =>"hola",
122
+ :"marketing.banner" =>"hola %{user }",
123
123
  :"models.product.id_55.name" =>"Muy bonita",
124
124
  :"models.product.id_125.description"=>"Verde",
125
125
  :"models.product.id_36.name" =>"No Lazero",
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vocab
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-09-06 00:00:00.000000000 Z
12
+ date: 2012-09-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: i18n