i18nliner 0.0.1 → 0.0.2

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.
Files changed (37) hide show
  1. data/README.md +151 -104
  2. data/lib/i18nliner/base.rb +47 -0
  3. data/lib/i18nliner/call_helpers.rb +39 -13
  4. data/lib/i18nliner/commands/check.rb +20 -10
  5. data/lib/i18nliner/commands/dump.rb +17 -0
  6. data/lib/i18nliner/commands/generic_command.rb +10 -1
  7. data/lib/i18nliner/errors.rb +11 -1
  8. data/lib/i18nliner/erubis.rb +12 -0
  9. data/lib/i18nliner/extensions/controller.rb +25 -0
  10. data/lib/i18nliner/extensions/core.rb +61 -0
  11. data/lib/i18nliner/extensions/inferpolation.rb +28 -0
  12. data/lib/i18nliner/extensions/model.rb +29 -0
  13. data/lib/i18nliner/extensions/view.rb +28 -0
  14. data/lib/i18nliner/extractors/ruby_extractor.rb +15 -33
  15. data/lib/i18nliner/extractors/sexp_helper.rb +38 -0
  16. data/lib/i18nliner/extractors/translate_call.rb +9 -11
  17. data/lib/i18nliner/extractors/translation_hash.rb +6 -6
  18. data/lib/i18nliner/pre_processors/erb_pre_processor.rb +334 -0
  19. data/lib/i18nliner/processors/abstract_processor.rb +26 -5
  20. data/lib/i18nliner/processors/erb_processor.rb +19 -3
  21. data/lib/i18nliner/processors/ruby_processor.rb +16 -5
  22. data/lib/i18nliner/railtie.rb +27 -0
  23. data/lib/i18nliner/scope.rb +4 -0
  24. data/lib/i18nliner.rb +5 -29
  25. data/lib/tasks/i18nliner.rake +10 -4
  26. data/spec/commands/check_spec.rb +22 -0
  27. data/spec/commands/dump_spec.rb +27 -0
  28. data/spec/extensions/core_spec.rb +71 -0
  29. data/spec/extensions/inferpolation_spec.rb +41 -0
  30. data/spec/extensions/view_spec.rb +42 -0
  31. data/spec/extractors/ruby_extractor_spec.rb +4 -5
  32. data/spec/extractors/translate_call_spec.rb +29 -2
  33. data/spec/fixtures/app/models/invalid.rb +5 -0
  34. data/spec/fixtures/app/models/valid.rb +5 -0
  35. data/spec/pre_processors/erb_pre_processor_spec.rb +194 -0
  36. data/spec/processors/erb_processor_spec.rb +28 -0
  37. metadata +88 -5
@@ -0,0 +1,41 @@
1
+ require 'i18nliner/extensions/inferpolation'
2
+ require 'ostruct'
3
+
4
+ describe I18nliner::Extensions::Inferpolation do
5
+
6
+ let(:foo) do
7
+ foo = OpenStruct.new(:bar => OpenStruct.new(:baz => "lol"), :bar2 => "foo")
8
+ foo.instance_variable_set(:@bar, foo.bar)
9
+ foo.instance_variable_set(:@bar2, "foo")
10
+ foo.extend I18nliner::Extensions::Inferpolation
11
+ foo
12
+ end
13
+
14
+ it "should inferpolate valid instance methods and chains" do
15
+ options = {:default => "hello %{bar.baz} %{bar2}"}
16
+ foo.inferpolate(options).should == {
17
+ :default => "hello %{bar_baz} %{bar2}",
18
+ :bar_baz => foo.bar.baz,
19
+ :bar2 => foo.bar2
20
+ }
21
+ end
22
+
23
+ it "should inferpolate valid instance variables and chains" do
24
+ options = {:default => "hello %{@bar.baz} %{@bar2}"}
25
+ foo.inferpolate(options).should == {
26
+ :default => "hello %{bar_baz} %{bar2}",
27
+ :bar_baz => foo.bar.baz,
28
+ :bar2 => foo.bar2
29
+ }
30
+ end
31
+
32
+ it "should not inferpolate invalid instance methods and chains" do
33
+ options = {:default => "hello %{lol} %{bar.baz.lol}"}
34
+ foo.inferpolate(options).should == options
35
+ end
36
+
37
+ it "should not inferpolate invalid instance variables and chains" do
38
+ options = {:default => "hello %{@lol} %{@bar.baz.lol}"}
39
+ foo.inferpolate(options).should == options
40
+ end
41
+ end
@@ -0,0 +1,42 @@
1
+ # encoding: UTF-8
2
+ require 'i18nliner/extensions/view'
3
+ require 'i18nliner/call_helpers'
4
+
5
+ describe I18nliner::Extensions::View do
6
+ let(:i18n) do
7
+ Module.new do
8
+ extend(Module.new do
9
+ def translate(*args)
10
+ I18n.translate(*args)
11
+ end
12
+ end)
13
+ extend I18nliner::Extensions::View
14
+ end
15
+ end
16
+
17
+
18
+ describe "#translate" do
19
+ it "should inferpolate" do
20
+ i18n.stub(:foo).and_return("FOO")
21
+ I18nliner::CallHelpers.stub(:infer_key).and_return(:key)
22
+
23
+ expect(I18n).to receive(:translate).with(:key, :default => "hello %{foo}", :foo => "FOO")
24
+ i18n.translate("hello %{foo}")
25
+ end
26
+
27
+ it "should raise an error when given a block" do
28
+ expect {
29
+ i18n.translate(:foo) {
30
+ uhoh there was a bug with erb extraction or im doing it wrong
31
+ }
32
+ }.to raise_error I18nliner::InvalidBlockUsageError
33
+ end
34
+
35
+ it "should raise an error when given an incorrect number of arguments" do
36
+ expect {
37
+ i18n.translate
38
+ }.to raise_error /wrong number of arguments/
39
+ end
40
+ end
41
+ end
42
+
@@ -1,10 +1,7 @@
1
- require 'sexp_processor'
2
1
  require 'ruby_parser'
3
- require 'i18nliner'
4
2
  require 'i18nliner/errors'
5
3
  require 'i18nliner/scope'
6
4
  require 'i18nliner/extractors/ruby_extractor'
7
- require 'i18nliner/extractors/translate_call'
8
5
 
9
6
  describe I18nliner::Extractors::RubyExtractor do
10
7
  def extract(source, scope = I18nliner::Scope.new(nil))
@@ -27,12 +24,15 @@ describe I18nliner::Extractors::RubyExtractor do
27
24
  extract("foo 'Foo'").should == {}
28
25
  end
29
26
 
27
+ it "should ignore t! calls" do
28
+ extract("t! something").should == {}
29
+ end
30
+
30
31
  it "should not extract t calls with no default" do
31
32
  extract("t :foo").should == {}
32
33
  end
33
34
 
34
35
  it "should extract valid t calls" do
35
- if false
36
36
  extract("t 'Foo'").should ==
37
37
  {"foo_f44ad75d" => "Foo"}
38
38
  extract("t :bar, 'Baz'").should ==
@@ -45,7 +45,6 @@ describe I18nliner::Extractors::RubyExtractor do
45
45
  {"zomg_lots_a54248c9.one" => "just one", "zomg_lots_a54248c9.other" => "zomg lots"}
46
46
  extract("t 'foo2', <<-STR\nFoo\nSTR").should ==
47
47
  {'foo2' => "Foo"}
48
- end
49
48
  extract("t 'foo', 'F' + 'o' + 'o'").should ==
50
49
  {'foo' => "Foo"}
51
50
  end
@@ -1,10 +1,11 @@
1
- require 'i18nliner'
1
+ # encoding: UTF-8
2
+ require 'i18nliner/base'
2
3
  require 'i18nliner/scope'
3
4
  require 'i18nliner/extractors/translate_call'
4
5
 
5
6
  describe I18nliner::Extractors::TranslateCall do
6
7
  def call(scope, *args)
7
- I18nliner::Extractors::TranslateCall.new(scope, nil, nil, :t, args)
8
+ I18nliner::Extractors::TranslateCall.new(scope, nil, :t, args)
8
9
  end
9
10
 
10
11
  let(:no_scope) { I18nliner::Scope.new(nil) }
@@ -43,6 +44,12 @@ describe I18nliner::Extractors::TranslateCall do
43
44
  }.to raise_error(I18nliner::InvalidSignatureError)
44
45
  end
45
46
 
47
+ # for legacy calls, e.g. t :key, :default => "foo"
48
+ it "should allow the default to be specified in the options hash" do
49
+ call = call(no_scope, :key, :default => "foo")
50
+ call.default.should == "foo"
51
+ end
52
+
46
53
  it "should ensure options is a hash, if provided" do
47
54
  expect {
48
55
  call(no_scope, :key, "value", Object.new)
@@ -65,6 +72,26 @@ describe I18nliner::Extractors::TranslateCall do
65
72
  end
66
73
  end
67
74
 
75
+ it "should transliterate underscored keys according to the default locale" do
76
+ orig_locale = I18n.default_locale
77
+ I18n.backend.store_translations(:de, :i18n => {
78
+ :transliterate => {
79
+ :rule => {
80
+ "ü" => "ue",
81
+ "ö" => "oe"
82
+ }
83
+ }
84
+ })
85
+
86
+ I18nliner.inferred_key_format :underscored do
87
+ I18n.default_locale = :en
88
+ call(no_scope, "Jürgen").translations[0][0].should == "jurgen"
89
+ I18n.default_locale = :de
90
+ call(no_scope, "Jürgen").translations[0][0].should == "juergen"
91
+ end
92
+ I18n.default_locale = orig_locale
93
+ end
94
+
68
95
  it "should generate underscored + crc32 keys" do
69
96
  I18nliner.inferred_key_format :underscored_crc32 do
70
97
  call(no_scope, "zOmg key!!").translations.should ==
@@ -0,0 +1,5 @@
1
+ class User < ActiveRecord::Base
2
+ def welcome_message
3
+ t "welcome, #{name}"
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class Group < ActiveRecord::Base
2
+ def welcome_message
3
+ t "welcome, %{name}"
4
+ end
5
+ end
@@ -0,0 +1,194 @@
1
+ # encoding: UTF-8
2
+ require 'i18nliner/pre_processors/erb_pre_processor'
3
+ require 'i18nliner/errors'
4
+ require 'active_support/core_ext/string/strip.rb'
5
+
6
+ describe I18nliner::PreProcessors::ErbPreProcessor do
7
+ before do
8
+ I18nliner::PreProcessors::ErbPreProcessor::TBlock.any_instance.stub(:infer_key).and_return(:key)
9
+ end
10
+
11
+ describe ".process" do
12
+ def process(string, remove_blank_lines = true)
13
+ result = I18nliner::PreProcessors::ErbPreProcessor.process(string)
14
+ result.gsub!(/\n+%>/, " %>") if remove_blank_lines
15
+ result
16
+ end
17
+
18
+ it "should transform t block expressions" do
19
+ process("<%= t do %>hello world!<% end %>").should ==
20
+ '<%= t :key, "hello world!" %>'
21
+ end
22
+
23
+ it "should remove extraneous whitespace from the default" do
24
+ process("<%= t do %> ohai! lulz\t <% end %>").should ==
25
+ '<%= t :key, "ohai! lulz" %>'
26
+ end
27
+
28
+ # so that line numbers are close-ish when you get an error in a
29
+ # multi-line t-block... an exception from an expression might not
30
+ # match up perfectly, but it will at least point to the start of the
31
+ # t-block
32
+ it "should preserve all newlines in the generated erb" do
33
+ process(<<-SOURCE.strip_heredoc, false).
34
+ <%= t do
35
+ %>
36
+ ohai!
37
+ <%= test %>
38
+ lulz
39
+ <% end %>
40
+ SOURCE
41
+ should == <<-EXPECTED.strip_heredoc
42
+ <%= t :key, "ohai! %{test} lulz", :test => (test)
43
+
44
+
45
+
46
+
47
+ %>
48
+ EXPECTED
49
+ end
50
+
51
+ it "should not translate other block expressions" do
52
+ process(<<-SOURCE).
53
+ <%= form_for do %>
54
+ <%= t do %>Your Name<% end %>
55
+ <input>
56
+ <% end %>
57
+ SOURCE
58
+ should == <<-EXPECTED
59
+ <%= form_for do %>
60
+ <%= t :key, "Your Name" %>
61
+ <input>
62
+ <% end %>
63
+ EXPECTED
64
+ end
65
+
66
+ it "should reject malformed erb" do
67
+ expect { process("<%= t do %>") }.
68
+ to raise_error(I18nliner::MalformedErbError)
69
+ end
70
+
71
+ it "should disallow nesting non-t block expressions in a t block expression" do
72
+ expect { process("<%= t { %><%= s { %>nope<% } %><% } %>") }.
73
+ to raise_error(I18nliner::TBlockNestingError)
74
+ expect { process("<%= t { %><%= s(:some, :args) { |args, here, too| %>nope<% } %><% } %>") }.
75
+ to raise_error(I18nliner::TBlockNestingError)
76
+ end
77
+
78
+ it "should disallow statements in a t block expression" do
79
+ expect { process("<%= t { %>I am <% if happy %>happy<% else %>sad<% end %><% } %>") }.
80
+ to raise_error(I18nliner::TBlockNestingError)
81
+ end
82
+
83
+ it "should create wrappers for markup" do
84
+ process(<<-SOURCE).
85
+ <%= t do %>
86
+ <b>bold</b>, or even <a href="#"><i><img>combos</i></a> get wrapper'd
87
+ <% end %>
88
+ SOURCE
89
+ should == <<-EXPECTED
90
+ <%= t :key, "*bold*, or even **combos** get wrapper'd", :wrappers => ["<b>\\\\1</b>", "<a href=\\\"#\\\"><i><img>\\\\1</i></a>"] %>
91
+ EXPECTED
92
+ end
93
+
94
+ it "should not create wrappers for markup with multiple text nodes" do
95
+ expect { puts process("<%= t do %>this is <b><i>too</i> complicated</b><% end %>") }.
96
+ to raise_error(I18nliner::UnwrappableContentError)
97
+ end
98
+
99
+ it "should create wrappers for link_to calls with string content" do
100
+ process(<<-SOURCE).
101
+ <%= t do %>
102
+ You should <%= link_to("create a profile", "/profile") %>.
103
+ idk why <%= link_to "this " + "link", "/zomg" %> has concatention
104
+ <% end %>
105
+ SOURCE
106
+ should == <<-EXPECTED
107
+ <%= t :key, "You should *create a profile*. idk why **this link** has concatention", :wrappers => [link_to("\\\\1", "/profile"), link_to("\\\\1", "/zomg")] %>
108
+ EXPECTED
109
+ end
110
+
111
+ it "should create wrappers for link_to calls with other content" do
112
+ process(<<-SOURCE).
113
+ <%= t do %>
114
+ Your account rep is <%= link_to(@user.name, "/user/\#{@user.id}") %>
115
+ <% end %>
116
+ SOURCE
117
+ should == <<-EXPECTED
118
+ <%= t :key, "Your account rep is *%{user_name}*", :user_name => (@user.name), :wrappers => [link_to("\\\\1", "/user/\#{@user.id}")] %>
119
+ EXPECTED
120
+ end
121
+
122
+ it "should reuse identical wrappers" do
123
+ process(<<-SOURCE).
124
+ <%= t do %>
125
+ the wrappers for
126
+ <%= link_to "these", url %> <%= link_to "links", url %> are the same,
127
+ as are the ones for
128
+ <b>these</b> <b>tags</b>
129
+ <% end %>
130
+ SOURCE
131
+ should == <<-EXPECTED
132
+ <%= t :key, "the wrappers for **these** **links** are the same, as are the ones for *these* *tags*", :wrappers => ["<b>\\\\1</b>", link_to("\\\\1", url)] %>
133
+ EXPECTED
134
+ end
135
+
136
+ it "should generate placeholders for inline expressions" do
137
+ process(<<-SOURCE).
138
+ <%= t do %>
139
+ Hello, <%= name %>
140
+ <% end %>
141
+ SOURCE
142
+ should == <<-EXPECTED
143
+ <%= t :key, "Hello, %{name}", :name => (name) %>
144
+ EXPECTED
145
+ end
146
+
147
+ it "should generate placeholders for inline expressions in wrappers" do
148
+ process(<<-SOURCE).
149
+ <%= t do %>
150
+ Go to <a href="/asdf" title="<%= name %>">your account</a>
151
+ <% end %>
152
+ SOURCE
153
+ should == <<-EXPECTED
154
+ <%= t :key, "Go to *your account*", :wrappers => ["<a href=\\"/asdf\\" title=\\"\#{name}\\">\\\\1</a>"] %>
155
+ EXPECTED
156
+ end
157
+
158
+ # this is really the same as the one above, but it's good to have a
159
+ # spec for this in case the underlying implementation changes
160
+ # dramatically
161
+ it "should transform nested t block expressions in wrappers" do
162
+ process(<<-SOURCE).
163
+ <%= t do %>
164
+ Go to <a href="/asdf" title="<%= t do %>manage account stuffs, <%= name %><% end %>">your account</a>
165
+ <% end %>
166
+ SOURCE
167
+ should == <<-EXPECTED
168
+ <%= t :key, "Go to *your account*", :wrappers => ["<a href=\\"/asdf\\" title=\\"\#{t :key, \"manage account stuffs, %{name}\", :name => (name)}\\">\\\\1</a>"] %>
169
+ EXPECTED
170
+ end
171
+
172
+ it "should generate placeholders for empty markup" do
173
+ process(<<-SOURCE).
174
+ <%= t do %>
175
+ Create <input name="count"> groups
176
+ <% end %>
177
+ SOURCE
178
+ should == <<-EXPECTED
179
+ <%= t :key, "Create %{input_name_count} groups", :input_name_count => ("<input name=\\"count\\">".html_safe) %>
180
+ EXPECTED
181
+ end
182
+
183
+ it "should unescape entities" do
184
+ process(<<-SOURCE).
185
+ <%= t do %>
186
+ &copy; <%= year %> ACME Corp. All Rights Reserved. Our lawyers &gt; your lawyers
187
+ <% end %>
188
+ SOURCE
189
+ should == <<-EXPECTED
190
+ <%= t :key, "© %{year} ACME Corp. All Rights Reserved. Our lawyers > your lawyers", :year => (year) %>
191
+ EXPECTED
192
+ end
193
+ end
194
+ end
@@ -0,0 +1,28 @@
1
+ require 'i18nliner/processors/erb_processor'
2
+ require 'i18nliner/extractors/translation_hash'
3
+
4
+ describe I18nliner::Processors::ErbProcessor do
5
+ before do
6
+ @translations = I18nliner::Extractors::TranslationHash.new
7
+ @processor = I18nliner::Processors::ErbProcessor.new(@translations)
8
+ end
9
+
10
+ describe "#check_contents" do
11
+ it "should extract valid translation calls" do
12
+ @processor.check_contents(<<-SOURCE)
13
+ <%= t "Inline!" %>
14
+ <%= t do %>
15
+ Zomg a block
16
+ <a href="/nesting"
17
+ title="<%= t do %>what is this?<% end %>"
18
+ >with nesting</a>!!!
19
+ <% end %>
20
+ SOURCE
21
+ @translations.values.sort.should == [
22
+ "Inline!",
23
+ "Zomg a block *with nesting*!!!",
24
+ "what is this?"
25
+ ]
26
+ end
27
+ end
28
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: i18nliner
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
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-12-01 00:00:00.000000000 Z
12
+ date: 2014-01-29 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -59,6 +59,22 @@ dependencies:
59
59
  - - ~>
60
60
  - !ruby/object:Gem::Version
61
61
  version: 4.4.0
62
+ - !ruby/object:Gem::Dependency
63
+ name: ruby2ruby
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 2.0.6
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 2.0.6
62
78
  - !ruby/object:Gem::Dependency
63
79
  name: globby
64
80
  requirement: !ruby/object:Gem::Requirement
@@ -66,7 +82,7 @@ dependencies:
66
82
  requirements:
67
83
  - - ! '>='
68
84
  - !ruby/object:Gem::Version
69
- version: 0.1.0
85
+ version: 0.1.1
70
86
  type: :runtime
71
87
  prerelease: false
72
88
  version_requirements: !ruby/object:Gem::Requirement
@@ -74,7 +90,23 @@ dependencies:
74
90
  requirements:
75
91
  - - ! '>='
76
92
  - !ruby/object:Gem::Version
77
- version: 0.1.0
93
+ version: 0.1.1
94
+ - !ruby/object:Gem::Dependency
95
+ name: erubis
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ~>
100
+ - !ruby/object:Gem::Version
101
+ version: 2.7.0
102
+ type: :runtime
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ~>
108
+ - !ruby/object:Gem::Version
109
+ version: 2.7.0
78
110
  - !ruby/object:Gem::Dependency
79
111
  name: ya2yaml
80
112
  requirement: !ruby/object:Gem::Requirement
@@ -91,6 +123,22 @@ dependencies:
91
123
  - - '='
92
124
  - !ruby/object:Gem::Version
93
125
  version: '0.31'
126
+ - !ruby/object:Gem::Dependency
127
+ name: nokogiri
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ! '>='
132
+ - !ruby/object:Gem::Version
133
+ version: 1.5.0
134
+ type: :runtime
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: 1.5.0
94
142
  - !ruby/object:Gem::Dependency
95
143
  name: debugger
96
144
  requirement: !ruby/object:Gem::Requirement
@@ -123,9 +171,25 @@ dependencies:
123
171
  - - ~>
124
172
  - !ruby/object:Gem::Version
125
173
  version: 2.14.0
174
+ - !ruby/object:Gem::Dependency
175
+ name: rspec-mocks
176
+ requirement: !ruby/object:Gem::Requirement
177
+ none: false
178
+ requirements:
179
+ - - ~>
180
+ - !ruby/object:Gem::Version
181
+ version: 2.14.0
182
+ type: :development
183
+ prerelease: false
184
+ version_requirements: !ruby/object:Gem::Requirement
185
+ none: false
186
+ requirements:
187
+ - - ~>
188
+ - !ruby/object:Gem::Version
189
+ version: 2.14.0
126
190
  description: No .yml files. Inline defaults. Optional keys. Inferred interpolation
127
191
  values. Wrappers and blocks, so your templates look template-y and your translations
128
- HTML-free.
192
+ stay HTML-free.
129
193
  email: jenseng@gmail.com
130
194
  executables: []
131
195
  extensions: []
@@ -134,6 +198,7 @@ files:
134
198
  - LICENSE.txt
135
199
  - Rakefile
136
200
  - README.md
201
+ - lib/i18nliner/base.rb
137
202
  - lib/i18nliner/call_helpers.rb
138
203
  - lib/i18nliner/commands/basic_formatter.rb
139
204
  - lib/i18nliner/commands/check.rb
@@ -141,19 +206,37 @@ files:
141
206
  - lib/i18nliner/commands/dump.rb
142
207
  - lib/i18nliner/commands/generic_command.rb
143
208
  - lib/i18nliner/errors.rb
209
+ - lib/i18nliner/erubis.rb
210
+ - lib/i18nliner/extensions/controller.rb
211
+ - lib/i18nliner/extensions/core.rb
212
+ - lib/i18nliner/extensions/inferpolation.rb
213
+ - lib/i18nliner/extensions/model.rb
214
+ - lib/i18nliner/extensions/view.rb
144
215
  - lib/i18nliner/extractors/abstract_extractor.rb
145
216
  - lib/i18nliner/extractors/ruby_extractor.rb
217
+ - lib/i18nliner/extractors/sexp_helper.rb
146
218
  - lib/i18nliner/extractors/translate_call.rb
147
219
  - lib/i18nliner/extractors/translation_hash.rb
220
+ - lib/i18nliner/pre_processors/erb_pre_processor.rb
148
221
  - lib/i18nliner/processors/abstract_processor.rb
149
222
  - lib/i18nliner/processors/erb_processor.rb
150
223
  - lib/i18nliner/processors/ruby_processor.rb
151
224
  - lib/i18nliner/processors.rb
225
+ - lib/i18nliner/railtie.rb
152
226
  - lib/i18nliner/scope.rb
153
227
  - lib/i18nliner.rb
154
228
  - lib/tasks/i18nliner.rake
229
+ - spec/commands/check_spec.rb
230
+ - spec/commands/dump_spec.rb
231
+ - spec/extensions/core_spec.rb
232
+ - spec/extensions/inferpolation_spec.rb
233
+ - spec/extensions/view_spec.rb
155
234
  - spec/extractors/ruby_extractor_spec.rb
156
235
  - spec/extractors/translate_call_spec.rb
236
+ - spec/fixtures/app/models/invalid.rb
237
+ - spec/fixtures/app/models/valid.rb
238
+ - spec/pre_processors/erb_pre_processor_spec.rb
239
+ - spec/processors/erb_processor_spec.rb
157
240
  homepage: http://github.com/jenseng/i18nliner
158
241
  licenses: []
159
242
  post_install_message: