missing_t 0.3.2 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -3,3 +3,5 @@ doc
3
3
  Manifest
4
4
  .bundle/*
5
5
  tmp/*
6
+ .rbenv-version
7
+
data/CHANGELOG.md ADDED
@@ -0,0 +1,31 @@
1
+ 0.4.0 (2013-04-06)
2
+ ------------------
3
+ * No positional command-line arguments
4
+
5
+ 0.3.2 (2013-03-22)
6
+ ------------------
7
+ * Add support for haml files
8
+
9
+ 0.3.1 (2013-02-21)
10
+ ------------------
11
+ * Make output suitable for copy-pasting into translation files
12
+
13
+ 0.3.0 (2013-02-07)
14
+ ------------------
15
+ * Use Bundler for gemspeccing
16
+
17
+ 0.2.0 (2010-09-11)
18
+ -----------------
19
+ * Use Jeweler for gemspeccing
20
+
21
+ 0.1.2
22
+ -----
23
+ * Fix extraction of I18n messages with dynamic key segments
24
+
25
+ 0.1.1
26
+ -----
27
+ * Remove dependencies to ruby-debug and pp.
28
+
29
+ 0.1.0
30
+ -----
31
+ * I am alive!
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- missing_t (0.3.2)
4
+ missing_t (0.4.0)
5
5
 
6
6
  GEM
7
7
  remote: http://rubygems.org/
@@ -18,10 +18,7 @@ GEM
18
18
  rspec (~> 2.11)
19
19
  listen (0.7.2)
20
20
  lumberjack (1.0.2)
21
- metaclass (0.0.1)
22
21
  method_source (0.8.1)
23
- mocha (0.13.3)
24
- metaclass (~> 0.0.1)
25
22
  pry (0.9.11.4)
26
23
  coderay (~> 1.0.5)
27
24
  method_source (~> 0.8)
@@ -46,7 +43,6 @@ DEPENDENCIES
46
43
  guard (~> 1.5.4)
47
44
  guard-rspec (~> 2.3.1)
48
45
  missing_t!
49
- mocha (~> 0.13.3)
50
46
  rake (~> 10.0.3)
51
47
  rb-fsevent (~> 0.9.1)
52
48
  rspec (~> 2.12.0)
data/bin/missing_t CHANGED
@@ -1,35 +1,36 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- $LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + "/../lib"))
3
+ require 'optparse'
4
+ require_relative '../lib/missing_t'
4
5
 
5
- require 'missing_t'
6
-
7
- def hashify(strings)
8
- strings.map { |s| s.split('.') }.each_with_object({}) do |segmented_string, h|
9
- segmented_string.each do |segment|
10
- h[segment] ||= {}
11
- h = h[segment]
6
+ def parse_options(args)
7
+ options = {}
8
+ opts = OptionParser.new do |opts|
9
+ opts.on("-f", "--file FILE_OR_DIR",
10
+ "Look for missing translations in files under FILE_OR_DIR",
11
+ "(if a file is given, only look in that file)") do |path|
12
+ options[:path] = path
13
+ end
14
+ opts.on("-l", "--languages LANGUAGES",
15
+ "Find missing translations for the given languages",
16
+ "(languages should be given as comma-separated two-char codes)") do |languages|
17
+ options[:languages] = languages.split(',')
12
18
  end
13
19
  end
14
- end
15
20
 
16
- def print_hash(h, level)
17
- h.each_pair do |k,v|
18
- puts %(#{" " * (level*2)}#{k}:)
19
- print_hash(v, level+1)
21
+ opts.on_tail("-h", "--help", "Show this message") do
22
+ puts opts
23
+ exit
20
24
  end
21
- end
22
25
 
23
- missing_t = MissingT.new(MissingT::FileReader.new)
24
- missing_t.parse_options(ARGV)
25
- missing_message_strings = missing_t.find_missing_translations(ARGV.first).values.map { |ms| hashify(ms) }
26
+ opts.on_tail("--version", "Show version") do
27
+ puts MissingT::VERSION
28
+ exit
29
+ end
26
30
 
27
- missing = missing_message_strings.each_with_object({}) do |h, all_message_strings|
28
- all_message_strings.deep_safe_merge!(h)
31
+ opts.parse!(args)
32
+ options
29
33
  end
30
34
 
31
- missing.each do |language, missing_for_language|
32
- puts
33
- puts "#{language}:"
34
- print_hash(missing_for_language, 1)
35
- end
35
+ options = parse_options(ARGV)
36
+ missing_translations = MissingT.new(options).run
data/lib/missing_t.rb CHANGED
@@ -1,7 +1,21 @@
1
1
  require "yaml"
2
- require "optparse"
3
- require "ostruct"
4
- require "forwardable"
2
+
3
+ #TODO: Should I feel about these 'global' helper functions?
4
+ def hashify(strings)
5
+ strings.map { |s| s.split('.') }.each_with_object({}) do |segmented_string, h|
6
+ segmented_string.each do |segment|
7
+ h[segment] ||= {}
8
+ h = h[segment]
9
+ end
10
+ end
11
+ end
12
+
13
+ def print_hash(h, level)
14
+ h.each_pair do |k,v|
15
+ puts %(#{" " * (level*2)}#{k}:)
16
+ print_hash(v, level+1)
17
+ end
18
+ end
5
19
 
6
20
  class Hash
7
21
  # idea snatched from deep_merge in Rails source code
@@ -9,8 +23,8 @@ class Hash
9
23
  self.merge(other_hash) do |key, oldval, newval|
10
24
  oldval = oldval.to_hash if oldval.respond_to?(:to_hash)
11
25
  newval = newval.to_hash if newval.respond_to?(:to_hash)
12
- if oldval.class.to_s == 'Hash'
13
- if newval.class.to_s == 'Hash'
26
+ if oldval === Hash
27
+ if newval === Hash
14
28
  oldval.deep_safe_merge(newval)
15
29
  else
16
30
  oldval
@@ -27,20 +41,6 @@ class Hash
27
41
 
28
42
  end
29
43
 
30
- module Helpers
31
- # snatched from rspec source
32
- def colour(text, colour_code)
33
- "#{colour_code}#{text}\e[0m"
34
- end
35
-
36
- def green(text); colour(text, "\e[32m"); end
37
- def red(text); colour(text, "\e[31m"); end
38
- def magenta(text); colour(text, "\e[35m"); end
39
- def yellow(text); colour(text, "\e[33m"); end
40
- def blue(text); colour(text, "\e[34m"); end
41
-
42
- end
43
-
44
44
  class MissingT
45
45
 
46
46
  class FileReader
@@ -51,36 +51,44 @@ class MissingT
51
51
  end
52
52
  end
53
53
 
54
- VERSION = "0.3.2"
55
-
56
- include Helpers
54
+ VERSION = "0.4.0"
57
55
 
58
- def initialize(reader)
59
- @reader = reader
56
+ def initialize(options={})
57
+ @reader = options.fetch(:reader, FileReader.new)
58
+ @languages = options[:languages]
59
+ @path = options[:path]
60
60
  end
61
61
 
62
- def parse_options(args)
63
- @options = OpenStruct.new
64
- @options.prefix = nil
65
- opts = OptionParser.new do |opts|
66
- opts.on("-f", "--file FILE_OR_DIR",
67
- "look for missing translations in files under FILE_OR_DIR",
68
- "(if a file is given, only look in that file)") do |path|
69
- @options.path = path
70
- end
71
- end
62
+ def run
63
+ missing_translations = collect
64
+ missing_message_strings = missing_translations.values.map { |ms| hashify(ms) }
72
65
 
73
- opts.on_tail("-h", "--help", "Show this message") do
74
- puts opts
75
- exit
66
+ missing = missing_message_strings.each_with_object({}) do |h, all_message_strings|
67
+ all_message_strings.deep_safe_merge!(h)
76
68
  end
77
69
 
78
- opts.on_tail("--version", "Show version") do
79
- puts VERSION
80
- exit
70
+ missing.each do |language, missing_for_language|
71
+ puts
72
+ puts "#{language}:"
73
+ print_hash(missing_for_language, 1)
81
74
  end
75
+ end
82
76
 
83
- opts.parse!(args)
77
+ def collect
78
+ ts = translation_keys
79
+ #TODO: If no translation keys were found and the languages were not given explicitly
80
+ # issue a warning and bail out
81
+ languages = @languages ? @languages : ts.keys
82
+ get_missing_translations(translation_keys, translation_queries, languages)
83
+ end
84
+
85
+ def get_missing_translations(keys, queries, languages)
86
+ languages.each_with_object({}) do |lang, missing|
87
+ get_missing_translations_for_lang(keys, queries, lang).each do |file, queries|
88
+ missing[file] ||= []
89
+ missing[file].concat(queries).uniq!
90
+ end
91
+ end
84
92
  end
85
93
 
86
94
  def translation_keys
@@ -93,14 +101,37 @@ class MissingT
93
101
  end
94
102
  end
95
103
 
104
+ def translation_queries
105
+ files_with_i18n_queries.each_with_object({}) do |file, queries|
106
+ queries_in_file = extract_i18n_queries(file)
107
+ if queries_in_file.any?
108
+ queries[file] = queries_in_file
109
+ end
110
+ end
111
+ #TODO: remove duplicate queries across files
112
+ end
113
+
114
+ def has_translation?(keys, lang, query)
115
+ i18n_label(lang, query).split('.').each do |segment|
116
+ return false unless segment =~ /#\{.*\}/ or (keys.respond_to?(:key?) and keys.key?(segment))
117
+ keys = keys[segment]
118
+ end
119
+ true
120
+ end
121
+
96
122
  def files_with_i18n_queries
97
- if path = @options.path
98
- path = path[0...-1] if path[-1..-1] == '/'
99
- [
100
- Dir.glob("#{path}/**/*.erb"),
101
- Dir.glob("#{path}/**/*.haml"),
102
- Dir.glob("#{path}/**/*.rb")
103
- ]
123
+ if @path
124
+ path = File.expand_path(@path)
125
+ if File.file?(path)
126
+ [@path]
127
+ else
128
+ path.chomp!('/')
129
+ [
130
+ Dir.glob("#{path}/**/*.erb"),
131
+ Dir.glob("#{path}/**/*.haml"),
132
+ Dir.glob("#{path}/**/*.rb")
133
+ ]
134
+ end
104
135
  else
105
136
  [
106
137
  Dir.glob("app/**/*.erb"),
@@ -116,61 +147,27 @@ class MissingT
116
147
  i18n_query_pattern = /[^\w]+(?:I18n\.translate|I18n\.t|translate|t)\s*\((.*?)[,\)]/
117
148
  i18n_query_no_parens_pattern = /[^\w]+(?:I18n\.translate|I18n\.t|translate|t)\s+(['"])(.*?)\1/
118
149
 
119
- @reader.read(file) do |content|
150
+ @reader.read(File.expand_path(file)) do |content|
120
151
  ([]).tap do |i18n_message_strings|
121
- i18n_message_strings << content.scan(i18n_query_pattern).map { |match| match[0].gsub(/['"\s]/, '') }
122
- i18n_message_strings << content.scan(i18n_query_no_parens_pattern).map { |match| match[1].gsub(/['"\s]/, '') }
123
- end.flatten
124
- end
125
- end
126
-
127
- def translation_queries
128
- files_with_i18n_queries.each_with_object({}) do |file, queries|
129
- queries_in_file = extract_i18n_queries(file)
130
- if queries_in_file.any?
131
- queries[file] = queries_in_file
152
+ i18n_message_strings.concat content.scan(i18n_query_pattern).map { |match| match[0].gsub(/['"\s]/, '') }
153
+ i18n_message_strings.concat content.scan(i18n_query_no_parens_pattern).map { |match| match[1].gsub(/['"\s]/, '') }
132
154
  end
133
155
  end
134
- #TODO: remove duplicate queries across files
135
156
  end
136
157
 
137
- def has_translation?(keys, lang, query)
138
- i18n_label(lang, query).split('.').each do |segment|
139
- return false unless segment =~ /#\{.*\}/ or (keys.respond_to?(:key?) and keys.key?(segment))
140
- keys = keys[segment]
141
- end
142
- true
143
- end
158
+ private
144
159
 
145
- def get_missing_translations(keys, queries, languages)
146
- languages.each_with_object({}) do |lang, missing|
147
- get_missing_translations_for_lang(keys, queries, lang).each do |file, queries|
148
- missing[file] ||= []
149
- missing[file].concat(queries).uniq!
160
+ def get_missing_translations_for_lang(keys, queries, lang)
161
+ queries.map do |file, queries_in_file|
162
+ queries_with_no_translation = queries_in_file.reject { |q| has_translation?(keys, lang, q) }
163
+ if queries_with_no_translation.any?
164
+ [file, queries_with_no_translation.map { |q| i18n_label(lang, q) }]
150
165
  end
151
- end
166
+ end.compact
152
167
  end
153
168
 
154
- def find_missing_translations(lang=nil)
155
- ts = translation_keys
156
- get_missing_translations(translation_keys, translation_queries, lang ? [lang] : ts.keys)
169
+ def i18n_label(lang, query)
170
+ "#{lang}.#{query}"
157
171
  end
158
172
 
159
- private
160
- def get_missing_translations_for_lang(keys, queries, lang)
161
- queries.map do |file, queries_in_file|
162
- queries_with_no_translation = queries_in_file.select { |q| !has_translation?(keys, lang, q) }
163
- if queries_with_no_translation.empty?
164
- nil
165
- else
166
- [file, queries_with_no_translation.map { |q| i18n_label(lang, q) }]
167
- end
168
- end.compact
169
-
170
- end
171
-
172
- def i18n_label(lang, query)
173
- "#{lang}.#{query}"
174
- end
175
-
176
173
  end
data/missing_t.gemspec CHANGED
@@ -23,5 +23,4 @@ Gem::Specification.new do |gem|
23
23
  gem.add_development_dependency 'guard', ['~> 1.5.4']
24
24
  gem.add_development_dependency 'guard-rspec', ['~> 2.3.1']
25
25
  gem.add_development_dependency 'rb-fsevent', ['~> 0.9.1']
26
- gem.add_development_dependency 'mocha', ['~> 0.13.3']
27
26
  end
@@ -0,0 +1,12 @@
1
+ require_relative '../spec_helper'
2
+
3
+ describe "MissingT" do
4
+ describe "correctly finds all missing translations" do
5
+ m = MissingT.new({ languages: ["en"], path: "spec/support/new.html.erb" })
6
+ m.collect['spec/support/new.html.erb'].should =~ [
7
+ "en.flights.new.new_flight", "en.flights.new.name", "en.flights.new.capacity",
8
+ "en.flights.new.duration", "en.flights.new.from", "en.flights.new.to",
9
+ "en.flights.new.create", "en.flights.new.back"
10
+ ]
11
+ end
12
+ end
@@ -1,11 +1,5 @@
1
1
  require 'spec_helper'
2
2
 
3
- # use mocha for mocking instead of
4
- # Rspec's own mock framework
5
- RSpec.configure do |config|
6
- config.mock_with :mocha
7
- end
8
-
9
3
  class ContentReader
10
4
  def read(content)
11
5
  yield content
@@ -14,7 +8,7 @@ end
14
8
 
15
9
  describe "MissingT" do
16
10
  before do
17
- @missing_t = MissingT.new(ContentReader.new)
11
+ @missing_t = MissingT.new(reader: ContentReader.new)
18
12
  @es_translations = {"es"=>
19
13
  {"zoo"=>{"elephant"=>"elefante", "bear"=>"oso", "lion"=>"leon", "bee" => "abeja"},
20
14
  "lamp"=>"lampa",
@@ -33,34 +27,54 @@ describe "MissingT" do
33
27
  end
34
28
 
35
29
  describe "the i18n query extracion" do
36
- it "should correctly extract the I18n.t type of messages" do
37
- content = <<-EOS
38
- <div class="title_gray"><span><%= I18n.t("anetcom.member.projects.new.page_title") %></span></div>
39
- EOS
40
- @missing_t.extract_i18n_queries(content).should == ["anetcom.member.projects.new.page_title"]
41
- end
42
-
43
- it "should correctly extract the I18n.t type of messages not right after the <%= mark" do
44
- content = <<-EOS
45
- <%= submit_tag I18n.t('anetcom.member.projects.new.create_project'), :class => 'button' %>
46
- EOS
47
- @missing_t.extract_i18n_queries(content).should == ["anetcom.member.projects.new.create_project"]
48
- end
49
-
50
- it "should correctly extract the I18n.t type of messages from a link_to" do
51
- # honestly, I am not sure anymore why this qualifies as a sep. test case
52
- # but I am sure there was something special about this one :)
53
- content = <<-EOS
54
- <%= link_to I18n.t("tog_headlines.admin.publish"), publish_admin_headlines_story_path(story), :class => 'button' %>
55
- EOS
56
- @missing_t.extract_i18n_queries(content).should == ["tog_headlines.admin.publish"]
30
+ describe "when the translation function is called as I18n.t" do
31
+ it "should correctly extract the key" do
32
+ content = <<-EOS
33
+ <div class="title_gray"><span><%= I18n.t("anetcom.member.projects.new.page_title") %></span></div>
34
+ EOS
35
+ @missing_t.extract_i18n_queries(content).should == ["anetcom.member.projects.new.page_title"]
36
+ end
37
+ it "should correctly extract the key not right after the <%= mark" do
38
+ content = <<-EOS
39
+ <%= submit_tag I18n.t('anetcom.member.projects.new.create_project'), :class => 'button' %>
40
+ EOS
41
+ @missing_t.extract_i18n_queries(content).should == ["anetcom.member.projects.new.create_project"]
42
+ end
43
+
44
+ it "should correctly extract the key when there is an argument in the call" do
45
+ content = <<-EOS
46
+ :html => {:title => I18n.t("tog_social.sharing.share_with", :name => shared.name)}
47
+ EOS
48
+ @missing_t.extract_i18n_queries(content).should == ["tog_social.sharing.share_with"]
49
+ end
50
+
51
+ it "should find and correctly extract a dynamic key translation message" do
52
+ content = %q(<div class="title_gray"><span><%= I18n.t("mycompany.welcome.#{key}") %></span></div>)
53
+ @missing_t.extract_i18n_queries(content).should == [%q(mycompany.welcome.#{key})]
54
+ end
57
55
  end
58
56
 
59
- it "should correctly extract the I18n.t type of messages with an argument in the message" do
60
- content = <<-EOS
61
- :html => {:title => I18n.t("tog_social.sharing.share_with", :name => shared.name)}
62
- EOS
63
- @missing_t.extract_i18n_queries(content).should == ["tog_social.sharing.share_with"]
57
+ describe "when the translation function is called as t" do
58
+ it "should correctly extract the key" do
59
+ content = <<-EOS
60
+ <div class="title_gray"><span><%= t("anetcom.member.projects.new.page_title") %></span></div>
61
+ EOS
62
+ @missing_t.extract_i18n_queries(content).should == ["anetcom.member.projects.new.page_title"]
63
+ end
64
+
65
+ it "should find several messages on the same line" do
66
+ content = <<-EOS
67
+ <div class="title_gray"><span><%= t("anetcom.member.projects.new.page_title") %></span><span>t("anetcom.member.projects.new.page_size")</span></div>
68
+ EOS
69
+ @missing_t.extract_i18n_queries(content).should == ["anetcom.member.projects.new.page_title", "anetcom.member.projects.new.page_size"]
70
+ end
71
+
72
+ it "should find messages with a parens-less call" do
73
+ content = <<-EOS
74
+ <div class="title_gray"><span><%= t "anetcom.member.projects.new.page_title" %></span></div>
75
+ EOS
76
+ @missing_t.extract_i18n_queries(content).should == ["anetcom.member.projects.new.page_title"]
77
+ end
64
78
  end
65
79
 
66
80
  it "should correctly extract the I18n.translate type of messages" do
@@ -70,27 +84,6 @@ describe "MissingT" do
70
84
  @missing_t.extract_i18n_queries(content).should == ["anetcom.member.projects.new.page_title"]
71
85
  end
72
86
 
73
- it "should correctly extract the t type of messages" do
74
- content = <<-EOS
75
- <div class="title_gray"><span><%= t("anetcom.member.projects.new.page_title") %></span></div>
76
- EOS
77
- @missing_t.extract_i18n_queries(content).should == ["anetcom.member.projects.new.page_title"]
78
- end
79
-
80
- it "should find several messages on the same line" do
81
- content = <<-EOS
82
- <div class="title_gray"><span><%= t("anetcom.member.projects.new.page_title") %></span><span>t("anetcom.member.projects.new.page_size")</span></div>
83
- EOS
84
- @missing_t.extract_i18n_queries(content).should == ["anetcom.member.projects.new.page_title", "anetcom.member.projects.new.page_size"]
85
- end
86
-
87
- it "should find messages with a parens-less call" do
88
- content = <<-EOS
89
- <div class="title_gray"><span><%= t "anetcom.member.projects.new.page_title" %></span></div>
90
- EOS
91
- @missing_t.extract_i18n_queries(content).should == ["anetcom.member.projects.new.page_title"]
92
- end
93
-
94
87
  it "should not extract a function call that just ends in t" do
95
88
  content = <<-EOS
96
89
  <div class="title_gray"><span><%= at(3) %></span></div>
@@ -98,33 +91,5 @@ describe "MissingT" do
98
91
  @missing_t.extract_i18n_queries(content).should == []
99
92
  end
100
93
 
101
- it "should find and correctly extract a dynamic key translation message" do
102
- content = %q(<div class="title_gray"><span><%= I18n.t("mycompany.welcome.#{key}") %></span></div>)
103
- @missing_t.extract_i18n_queries(content).should == [%q(mycompany.welcome.#{key})]
104
- end
105
-
106
94
  end
107
-
108
- describe "finding missing translations" do
109
- before do
110
- @t_queries = { :fake_file => ["mother", "zoo.bee", "zoo.wasp", "pen"] }
111
- @missing_t.stubs(:translation_keys).returns(@fr_translations.merge(@es_translations))
112
- @missing_t.stubs(:translation_queries).returns(@t_queries)
113
- end
114
-
115
- it "should correctly get missing translations for a specific language" do
116
- miss_entries = @missing_t.find_missing_translations("fr").map{ |e| e[1] }.flatten
117
- miss_entries.should include("fr.pen")
118
- miss_entries.should include("fr.zoo.bee")
119
- end
120
-
121
- it "should correctly get missing translations" do
122
- miss_entries = @missing_t.find_missing_translations.map{ |e| e[1] }.flatten
123
- miss_entries.should include("fr.zoo.bee")
124
- miss_entries.should include("fr.pen")
125
- miss_entries.should include("es.zoo.wasp")
126
- miss_entries.should include("es.mother")
127
- end
128
- end
129
-
130
95
  end
@@ -0,0 +1,31 @@
1
+ <h1><%= I18n.t("flights.new.new_flight", :default => "New flight") %></h1>
2
+
3
+ <% form_for(@flight) do |f| %>
4
+ <%= f.error_messages %>
5
+
6
+ <p>
7
+ <%= f.label I18n.t("flights.new.name", :default => "name") %><br />
8
+ <%= f.text_field :name %>
9
+ </p>
10
+ <p>
11
+ <%= f.label I18n.t("flights.new.capacity", :default => "capacity") %><br />
12
+ <%= f.text_field :capacity %>
13
+ </p>
14
+ <p>
15
+ <%= f.label I18n.t("flights.new.duration", :default => "duration") %><br />
16
+ <%= f.text_field :duration %>
17
+ </p>
18
+ <p>
19
+ <%= f.label :from_id, I18n.t("flights.new.from", :default => "From") %><br />
20
+ <%= f.select :from_id, @airport_options %>
21
+ </p>
22
+ <p>
23
+ <%= f.label :to_id, I18n.t("flights.new.to", :default => "To") %><br />
24
+ <%= f.select :to_id, @airport_options %>
25
+ </p>
26
+ <p>
27
+ <%= f.submit I18n.t("flights.new.create", :default => 'Create') %>
28
+ </p>
29
+ <% end %>
30
+
31
+ <%= link_to I18n.t("flights.new.back", :default => 'Back'), flights_path %>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: missing_t
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.4.0
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: 2013-03-22 00:00:00.000000000 Z
12
+ date: 2013-04-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -91,22 +91,6 @@ dependencies:
91
91
  - - ~>
92
92
  - !ruby/object:Gem::Version
93
93
  version: 0.9.1
94
- - !ruby/object:Gem::Dependency
95
- name: mocha
96
- requirement: !ruby/object:Gem::Requirement
97
- none: false
98
- requirements:
99
- - - ~>
100
- - !ruby/object:Gem::Version
101
- version: 0.13.3
102
- type: :development
103
- prerelease: false
104
- version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
- requirements:
107
- - - ~>
108
- - !ruby/object:Gem::Version
109
- version: 0.13.3
110
94
  description: Finds all the missing i18n translations in your Rails project
111
95
  email:
112
96
  - balint.erdi@gmail.com
@@ -119,7 +103,7 @@ files:
119
103
  - !binary |-
120
104
  LmdpdGlnbm9yZQ==
121
105
  - !binary |-
122
- Q0hBTkdFTE9H
106
+ Q0hBTkdFTE9HLm1k
123
107
  - !binary |-
124
108
  R2VtZmlsZQ==
125
109
  - !binary |-
@@ -142,10 +126,14 @@ files:
142
126
  bGliL21pc3NpbmdfdC5yYg==
143
127
  - !binary |-
144
128
  bWlzc2luZ190LmdlbXNwZWM=
129
+ - !binary |-
130
+ c3BlYy9hY2NlcHRhbmNlL21pc3NpbmdfdF9zcGVjLnJi
145
131
  - !binary |-
146
132
  c3BlYy9taXNzaW5nX3Rfc3BlYy5yYg==
147
133
  - !binary |-
148
134
  c3BlYy9zcGVjX2hlbHBlci5yYg==
135
+ - !binary |-
136
+ c3BlYy9zdXBwb3J0L25ldy5odG1sLmVyYg==
149
137
  - !binary |-
150
138
  dGFza3MvbWlzc2luZ190LnJha2U=
151
139
  - !binary |-
@@ -164,7 +152,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
164
152
  version: '0'
165
153
  segments:
166
154
  - 0
167
- hash: -840801129156003864
155
+ hash: 1881571199484440278
168
156
  required_rubygems_version: !ruby/object:Gem::Requirement
169
157
  none: false
170
158
  requirements:
@@ -173,7 +161,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
173
161
  version: '0'
174
162
  segments:
175
163
  - 0
176
- hash: -840801129156003864
164
+ hash: 1881571199484440278
177
165
  requirements: []
178
166
  rubyforge_project:
179
167
  rubygems_version: 1.8.23
@@ -181,7 +169,11 @@ signing_key:
181
169
  specification_version: 3
182
170
  summary: Finds all the missing i18n translations in your Rails project
183
171
  test_files:
172
+ - !binary |-
173
+ c3BlYy9hY2NlcHRhbmNlL21pc3NpbmdfdF9zcGVjLnJi
184
174
  - !binary |-
185
175
  c3BlYy9taXNzaW5nX3Rfc3BlYy5yYg==
186
176
  - !binary |-
187
177
  c3BlYy9zcGVjX2hlbHBlci5yYg==
178
+ - !binary |-
179
+ c3BlYy9zdXBwb3J0L25ldy5odG1sLmVyYg==
data/CHANGELOG DELETED
@@ -1,5 +0,0 @@
1
- v0.1.2 Extraction of I18n messages became better (will now correctly extract messages with dynamic keys, like "myapp.title.#{key}"). Added colorization of output.
2
-
3
- v0.1.1 Remove dependencies to ruby-debug and pp.
4
-
5
- v0.1.0 I am alive!