i18nliner 0.0.4 → 0.0.5
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.
- data/lib/i18nliner/call_helpers.rb +22 -4
- data/lib/i18nliner/commands/dump.rb +1 -1
- data/lib/i18nliner/controller_scope.rb +16 -0
- data/lib/i18nliner/erubis.rb +1 -1
- data/lib/i18nliner/extensions/controller.rb +2 -2
- data/lib/i18nliner/extensions/core.rb +12 -2
- data/lib/i18nliner/extensions/model.rb +7 -3
- data/lib/i18nliner/extensions/view.rb +2 -2
- data/lib/i18nliner/extractors/ruby_extractor.rb +16 -3
- data/lib/i18nliner/extractors/sexp_helper.rb +1 -0
- data/lib/i18nliner/extractors/translate_call.rb +5 -4
- data/lib/i18nliner/extractors/translation_hash.rb +3 -21
- data/lib/i18nliner/processors/erb_processor.rb +8 -3
- data/lib/i18nliner/processors/ruby_processor.rb +16 -2
- data/lib/i18nliner/scope.rb +12 -7
- data/spec/extensions/controller_spec.rb +38 -0
- data/spec/extensions/core_spec.rb +28 -7
- data/spec/extensions/model_spec.rb +35 -0
- data/spec/extensions/view_spec.rb +6 -1
- data/spec/processors/erb_processor_spec.rb +17 -0
- data/spec/processors/ruby_processor_spec.rb +28 -0
- metadata +8 -5
- data/lib/i18nliner/extractors/abstract_extractor.rb +0 -33
@@ -11,12 +11,29 @@ module I18nliner
|
|
11
11
|
scope.normalize_key(key.to_s)
|
12
12
|
end
|
13
13
|
|
14
|
-
def normalize_default(default, translate_options = {})
|
14
|
+
def normalize_default(default, translate_options = {}, options = {})
|
15
15
|
default = infer_pluralization_hash(default, translate_options)
|
16
|
-
default
|
16
|
+
normalize_whitespace!(default, options)
|
17
17
|
default
|
18
18
|
end
|
19
19
|
|
20
|
+
def normalize_whitespace!(default, options)
|
21
|
+
if default.is_a?(Hash)
|
22
|
+
default.each { |key, value| normalize_whitespace!(value, options) }
|
23
|
+
return
|
24
|
+
end
|
25
|
+
|
26
|
+
return unless default.is_a?(String)
|
27
|
+
|
28
|
+
if options[:remove_whitespace]
|
29
|
+
default.gsub!(/\s+/, ' ')
|
30
|
+
default.strip!
|
31
|
+
else
|
32
|
+
default.sub!(/\s*\n\z/, '')
|
33
|
+
default.lstrip!
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
20
37
|
def infer_pluralization_hash(default, translate_options)
|
21
38
|
return default unless default.is_a?(String) &&
|
22
39
|
default =~ /\A[\w\-]+\z/ &&
|
@@ -27,7 +44,7 @@ module I18nliner
|
|
27
44
|
def infer_key(default, translate_options = {})
|
28
45
|
return unless default && (default.is_a?(String) || default.is_a?(Hash))
|
29
46
|
default = default[:other].to_s if default.is_a?(Hash)
|
30
|
-
keyify(normalize_default(default, translate_options))
|
47
|
+
keyify(normalize_default(default, translate_options, :remove_whitespace => true))
|
31
48
|
end
|
32
49
|
|
33
50
|
def keyify_underscored(string)
|
@@ -73,12 +90,13 @@ module I18nliner
|
|
73
90
|
(hash.keys - ALLOWED_PLURALIZATION_KEYS).size == 0
|
74
91
|
end
|
75
92
|
|
76
|
-
def infer_arguments(args)
|
93
|
+
def infer_arguments(args, meta = {})
|
77
94
|
if args.size == 2 && args[1].is_a?(Hash) && args[1][:default]
|
78
95
|
return args
|
79
96
|
end
|
80
97
|
|
81
98
|
has_key = key_provided?(*args)
|
99
|
+
meta[:inferred_key] = !has_key
|
82
100
|
args.unshift infer_key(args[0]) unless has_key
|
83
101
|
|
84
102
|
default_or_options = args[1]
|
@@ -16,7 +16,7 @@ module I18nliner
|
|
16
16
|
def run
|
17
17
|
FileUtils.mkdir_p File.dirname(yml_file)
|
18
18
|
File.open(yml_file, "w") do |file|
|
19
|
-
file.write({I18n.default_locale.to_s => @translations
|
19
|
+
file.write({I18n.default_locale.to_s => @translations}.ya2yaml(:syck_compatible => true))
|
20
20
|
end
|
21
21
|
puts "Wrote default translations to #{yml_file}" unless @options[:silent]
|
22
22
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require "i18nliner/scope"
|
2
|
+
|
3
|
+
module I18nliner
|
4
|
+
class ControllerScope < Scope
|
5
|
+
def scope
|
6
|
+
# best guess at current action, ymmv. we only add the action at this
|
7
|
+
# point because the scope already has the controller path
|
8
|
+
# see abstract_controller/translation.rb for reference
|
9
|
+
if context.current_defn
|
10
|
+
"#{super}.#{context.current_defn}"
|
11
|
+
else
|
12
|
+
super
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/i18nliner/erubis.rb
CHANGED
@@ -7,12 +7,12 @@ module I18nliner
|
|
7
7
|
module Controller
|
8
8
|
include Inferpolation
|
9
9
|
|
10
|
-
|
11
|
-
ALLOW_RELATIVE = Rails.version >= '4'
|
10
|
+
def i18n_scope; end
|
12
11
|
|
13
12
|
def translate(*args)
|
14
13
|
key, options = CallHelpers.infer_arguments(args)
|
15
14
|
options = inferpolate(options) if I18nliner.infer_interpolation_values
|
15
|
+
options[:i18n_scope] = i18n_scope
|
16
16
|
super(key, options)
|
17
17
|
end
|
18
18
|
alias :t :translate
|
@@ -7,11 +7,20 @@ module I18nliner
|
|
7
7
|
module Core
|
8
8
|
def translate(*args)
|
9
9
|
key, options = *CallHelpers.infer_arguments(args)
|
10
|
-
|
10
|
+
|
11
|
+
scope = options.delete(:i18n_scope) || Scope.root
|
12
|
+
key = CallHelpers.normalize_key(key, scope)
|
13
|
+
|
14
|
+
if default = options[:default]
|
15
|
+
options[:default] = CallHelpers.normalize_default(default, options)
|
16
|
+
end
|
17
|
+
|
18
|
+
wrappers = options.delete(:wrappers) || options.delete(:wrapper)
|
11
19
|
result = super(key, options)
|
12
20
|
if wrappers
|
13
21
|
result = apply_wrappers(result, wrappers)
|
14
22
|
end
|
23
|
+
|
15
24
|
result
|
16
25
|
end
|
17
26
|
alias :t :translate
|
@@ -42,7 +51,8 @@ module I18nliner
|
|
42
51
|
|
43
52
|
def apply_wrappers(string, wrappers)
|
44
53
|
string = string.html_safe? ? string.dup : ERB::Util.h(string)
|
45
|
-
|
54
|
+
unless wrappers.is_a?(Hash)
|
55
|
+
wrappers = Array(wrappers)
|
46
56
|
wrappers = Hash[wrappers.each_with_index.map{ |w, i| ['*' * (1 + i), w]}]
|
47
57
|
end
|
48
58
|
wrappers.sort_by{ |k, v| -k.length }.each do |k, v|
|
@@ -7,13 +7,13 @@ module I18nliner
|
|
7
7
|
module Model
|
8
8
|
include Inferpolation
|
9
9
|
|
10
|
-
|
11
|
-
ALLOW_RELATIVE = false
|
10
|
+
def i18n_scope; end
|
12
11
|
|
13
12
|
def translate(*args)
|
14
13
|
key, options = CallHelpers.infer_arguments(args)
|
15
14
|
options = inferpolate(options) if I18nliner.infer_interpolation_values
|
16
|
-
|
15
|
+
options[:i18n_scope] = i18n_scope
|
16
|
+
I18n.translate(key, options)
|
17
17
|
end
|
18
18
|
alias :t :translate
|
19
19
|
alias :t! :translate
|
@@ -23,6 +23,10 @@ module I18nliner
|
|
23
23
|
I18n.localize(*args)
|
24
24
|
end
|
25
25
|
alias :l :localize
|
26
|
+
|
27
|
+
def self.included(klass)
|
28
|
+
klass.extend(self)
|
29
|
+
end
|
26
30
|
end
|
27
31
|
end
|
28
32
|
end
|
@@ -7,8 +7,7 @@ module I18nliner
|
|
7
7
|
module View
|
8
8
|
include Inferpolation
|
9
9
|
|
10
|
-
|
11
|
-
ALLOW_RELATIVE = true
|
10
|
+
def i18n_scope; end
|
12
11
|
|
13
12
|
def translate(*args)
|
14
13
|
# if a block gets through to here, it either means:
|
@@ -18,6 +17,7 @@ module I18nliner
|
|
18
17
|
raise ArgumentError.new("wrong number of arguments (0 for 1..3)") if args.empty? || args.size > 3
|
19
18
|
key, options = CallHelpers.infer_arguments(args)
|
20
19
|
options = inferpolate(options) if I18nliner.infer_interpolation_values
|
20
|
+
options[:i18n_scope] = i18n_scope
|
21
21
|
super(key, options)
|
22
22
|
end
|
23
23
|
alias :t :translate
|
@@ -22,10 +22,23 @@ module I18nliner
|
|
22
22
|
process(@sexps)
|
23
23
|
end
|
24
24
|
|
25
|
+
attr_reader :current_defn
|
26
|
+
def process_defn(exp)
|
27
|
+
exp.shift
|
28
|
+
@current_defn = exp.shift
|
29
|
+
process exp.shift until exp.empty?
|
30
|
+
@current_defn = nil
|
31
|
+
s()
|
32
|
+
end
|
33
|
+
|
25
34
|
def process_call(exp)
|
26
35
|
exp.shift
|
27
|
-
|
28
|
-
receiver =
|
36
|
+
receiver_exp = exp.shift
|
37
|
+
receiver = nil
|
38
|
+
if receiver_exp
|
39
|
+
receiver = receiver_exp[0] == :const ? receiver_exp.last : UnsupportedExpression
|
40
|
+
process(receiver_exp)
|
41
|
+
end
|
29
42
|
method = exp.shift
|
30
43
|
|
31
44
|
if extractable_call?(receiver, method)
|
@@ -52,7 +65,7 @@ module I18nliner
|
|
52
65
|
|
53
66
|
def process_translate_call(receiver, method, args)
|
54
67
|
scope = receiver ? Scope.root : @scope
|
55
|
-
call = TranslateCall.new(
|
68
|
+
call = TranslateCall.new(scope, @current_line, method, args, :explicit_receiver => !receiver.nil?)
|
56
69
|
call.translations.each &@block
|
57
70
|
end
|
58
71
|
|
@@ -10,10 +10,11 @@ module I18nliner
|
|
10
10
|
|
11
11
|
attr_reader :key, :default
|
12
12
|
|
13
|
-
def initialize(scope, line, method, args)
|
13
|
+
def initialize(scope, line, method, args, meta = {})
|
14
14
|
@scope = scope
|
15
15
|
@line = line
|
16
16
|
@method = method
|
17
|
+
@meta = meta
|
17
18
|
|
18
19
|
normalize_arguments(args)
|
19
20
|
|
@@ -28,8 +29,8 @@ module I18nliner
|
|
28
29
|
end
|
29
30
|
|
30
31
|
def normalize
|
31
|
-
@key = normalize_key(@key, @scope)
|
32
|
-
@default = normalize_default(@default, @options || {})
|
32
|
+
@key = normalize_key(@key, @scope) unless @meta[:inferred_key]
|
33
|
+
@default = normalize_default(@default, @options || {}, {:remove_whitespace => @scope.remove_whitespace?})
|
33
34
|
end
|
34
35
|
|
35
36
|
def translations
|
@@ -78,7 +79,7 @@ module I18nliner
|
|
78
79
|
def normalize_arguments(args)
|
79
80
|
raise InvalidSignatureError.new(@line, args) if args.empty?
|
80
81
|
|
81
|
-
@key, @options, *others = infer_arguments(args)
|
82
|
+
@key, @options, *others = infer_arguments(args, @meta)
|
82
83
|
|
83
84
|
raise InvalidSignatureError.new(@line, args) if !others.empty?
|
84
85
|
raise InvalidSignatureError.new(@line, args) unless @key.is_a?(Symbol) || @key.is_a?(String)
|
@@ -4,18 +4,10 @@ module I18nliner
|
|
4
4
|
attr_accessor :line
|
5
5
|
|
6
6
|
def self.new(hash = {})
|
7
|
-
hash.
|
8
|
-
|
9
|
-
|
10
|
-
def self.flatten(hash, result = {}, prefix = "")
|
11
|
-
hash.each do |key, value|
|
12
|
-
if value.is_a?(Hash)
|
13
|
-
flatten(value, result, "#{prefix}#{key}.")
|
14
|
-
else
|
15
|
-
result["#{prefix}#{key}"] = value
|
16
|
-
end
|
7
|
+
hash.inject(super()) do |result, (key, value)|
|
8
|
+
result.store(key.to_s, value.is_a?(Hash) ? new(value) : value)
|
9
|
+
result
|
17
10
|
end
|
18
|
-
result
|
19
11
|
end
|
20
12
|
|
21
13
|
def initialize(*args)
|
@@ -51,16 +43,6 @@ module I18nliner
|
|
51
43
|
hash.store(leaf, value)
|
52
44
|
end
|
53
45
|
end
|
54
|
-
|
55
|
-
def expand_keys
|
56
|
-
result = {}
|
57
|
-
each do |key, value|
|
58
|
-
parts = key.split(".")
|
59
|
-
last = parts.pop
|
60
|
-
parts.inject(result){ |h, k2| h[k2] ||= {}}[last] = value
|
61
|
-
end
|
62
|
-
result
|
63
|
-
end
|
64
46
|
end
|
65
47
|
end
|
66
48
|
end
|
@@ -22,10 +22,15 @@ module I18nliner
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
+
VIEW_PATH = %r{\A(.*/)?app/views/(.*?)\.(erb|html\.erb)\z}
|
25
26
|
def scope_for(path)
|
26
|
-
scope = path.
|
27
|
-
|
28
|
-
|
27
|
+
scope = path.dup
|
28
|
+
if scope.sub!(VIEW_PATH, '\2')
|
29
|
+
scope = scope.gsub(/\/_?/, '.')
|
30
|
+
Scope.new(scope, :allow_relative => true, :remove_whitespace => true, :context => self)
|
31
|
+
else
|
32
|
+
Scope.root
|
33
|
+
end
|
29
34
|
end
|
30
35
|
end
|
31
36
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'i18nliner/processors/abstract_processor'
|
2
2
|
require 'i18nliner/extractors/ruby_extractor'
|
3
3
|
require 'i18nliner/scope'
|
4
|
+
require 'i18nliner/controller_scope'
|
4
5
|
|
5
6
|
module I18nliner
|
6
7
|
module Processors
|
@@ -21,8 +22,21 @@ module I18nliner
|
|
21
22
|
File.read(file)
|
22
23
|
end
|
23
24
|
|
24
|
-
|
25
|
-
|
25
|
+
if defined?(::Rails) && ::Rails.version > '4'
|
26
|
+
CONTROLLER_PATH = %r{\A(.*/)?app/controllers/(.*)_controller\.rb\z}
|
27
|
+
def scope_for(path)
|
28
|
+
scope = path.dup
|
29
|
+
if scope.sub!(CONTROLLER_PATH, '\2')
|
30
|
+
scope = scope.gsub(/\/_?/, '.')
|
31
|
+
ControllerScope.new(scope, :allow_relative => true, :context => self)
|
32
|
+
else
|
33
|
+
Scope.root
|
34
|
+
end
|
35
|
+
end
|
36
|
+
else
|
37
|
+
def scope_for(path)
|
38
|
+
Scope.root
|
39
|
+
end
|
26
40
|
end
|
27
41
|
|
28
42
|
def pre_process(source)
|
data/lib/i18nliner/scope.rb
CHANGED
@@ -1,16 +1,17 @@
|
|
1
1
|
module I18nliner
|
2
2
|
class Scope
|
3
3
|
attr_reader :scope
|
4
|
+
attr_reader :allow_relative
|
5
|
+
attr_reader :context
|
6
|
+
alias :allow_relative? :allow_relative
|
7
|
+
attr_accessor :remove_whitespace
|
8
|
+
alias :remove_whitespace? :remove_whitespace
|
4
9
|
|
5
10
|
def initialize(scope = nil, options = {})
|
6
11
|
@scope = scope ? "#{scope}." : scope
|
7
|
-
@
|
8
|
-
|
9
|
-
|
10
|
-
end
|
11
|
-
|
12
|
-
def allow_relative?
|
13
|
-
@options[:allow_relative]
|
12
|
+
@allow_relative = options.fetch(:allow_relative, false)
|
13
|
+
@remove_whitespace = options.fetch(:remove_whitespace, false)
|
14
|
+
@context = options.fetch(:context, nil)
|
14
15
|
end
|
15
16
|
|
16
17
|
def normalize_key(key)
|
@@ -24,5 +25,9 @@ module I18nliner
|
|
24
25
|
def self.root
|
25
26
|
@root ||= new
|
26
27
|
end
|
28
|
+
|
29
|
+
def root?
|
30
|
+
scope.blank?
|
31
|
+
end
|
27
32
|
end
|
28
33
|
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
require 'i18nliner/extensions/controller'
|
3
|
+
require 'i18nliner/call_helpers'
|
4
|
+
|
5
|
+
describe I18nliner::Extensions::Controller 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
|
+
|
13
|
+
def controller_name
|
14
|
+
"foo"
|
15
|
+
end
|
16
|
+
end)
|
17
|
+
extend I18nliner::Extensions::Controller
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
describe "#translate" do
|
23
|
+
it "should inferpolate" do
|
24
|
+
i18n.stub(:foo).and_return("FOO")
|
25
|
+
I18nliner::CallHelpers.stub(:infer_key).and_return(:key)
|
26
|
+
|
27
|
+
expect(I18n).to receive(:translate).with(:key, :default => "hello %{foo}", :foo => "FOO", :i18n_scope => i18n.i18n_scope)
|
28
|
+
i18n.translate("hello %{foo}")
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should pass along its scope to I18n.t" do
|
32
|
+
expect(I18n).to receive(:translate).with(:key, :default => "foo", :i18n_scope => i18n.i18n_scope)
|
33
|
+
i18n.translate(:key, "foo")
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
|
@@ -28,15 +28,36 @@ describe I18nliner::Extensions::Core do
|
|
28
28
|
i18n.translate("Hello %{name}", :name => "bob")
|
29
29
|
end
|
30
30
|
|
31
|
-
it "should
|
32
|
-
|
33
|
-
|
34
|
-
result.should be_html_safe
|
31
|
+
it "should infer pluralization hashes" do
|
32
|
+
expect(i18n).to receive(:simple_translate).with("light_6feedaaa", :default => {:one => "1 light", :other => "%{count} lights"}, count: 1)
|
33
|
+
i18n.translate("light", :count => 1)
|
35
34
|
end
|
36
35
|
|
37
|
-
|
38
|
-
|
39
|
-
|
36
|
+
context "with wrappers" do
|
37
|
+
it "should apply a single wrapper" do
|
38
|
+
result = i18n.translate("Hello *bob*.", :wrapper => '<b>\1</b>')
|
39
|
+
result.should == "Hello <b>bob</b>."
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should be html-safe" do
|
43
|
+
result = i18n.translate("Hello *bob*.", :wrapper => '<b>\1</b>')
|
44
|
+
result.should be_html_safe
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should apply multiple wrappers" do
|
48
|
+
result = i18n.translate("Hello *bob*. Click **here**", :wrappers => ['<b>\1</b>', '<a href="/">\1</a>'])
|
49
|
+
result.should == "Hello <b>bob</b>. Click <a href=\"/\">here</a>"
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should apply multiple wrappers with arbitrary delimiters" do
|
53
|
+
result = i18n.translate("Hello !!!bob!!!. Click ???here???", :wrappers => {'!!!' => '<b>\1</b>', '???' => '<a href="/">\1</a>'})
|
54
|
+
result.should == "Hello <b>bob</b>. Click <a href=\"/\">here</a>"
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should html-escape the default when applying wrappers" do
|
58
|
+
i18n.translate("*bacon* > narwhals", :wrappers => ['<b>\1</b>']).
|
59
|
+
should == "<b>bacon</b> > narwhals"
|
60
|
+
end
|
40
61
|
end
|
41
62
|
end
|
42
63
|
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
require 'i18nliner/extensions/model'
|
3
|
+
require 'i18nliner/call_helpers'
|
4
|
+
|
5
|
+
describe I18nliner::Extensions::Model 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::Model
|
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", :i18n_scope => i18n.i18n_scope)
|
24
|
+
i18n.translate("hello %{foo}")
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should pass along its scope to I18n.t" do
|
28
|
+
expect(I18n).to receive(:translate).with(:key, :default => "foo", :i18n_scope => i18n.i18n_scope)
|
29
|
+
i18n.translate(:key, "foo")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
|
@@ -20,7 +20,7 @@ describe I18nliner::Extensions::View do
|
|
20
20
|
i18n.stub(:foo).and_return("FOO")
|
21
21
|
I18nliner::CallHelpers.stub(:infer_key).and_return(:key)
|
22
22
|
|
23
|
-
expect(I18n).to receive(:translate).with(:key, :default => "hello %{foo}", :foo => "FOO")
|
23
|
+
expect(I18n).to receive(:translate).with(:key, :default => "hello %{foo}", :foo => "FOO", :i18n_scope => i18n.i18n_scope)
|
24
24
|
i18n.translate("hello %{foo}")
|
25
25
|
end
|
26
26
|
|
@@ -37,6 +37,11 @@ describe I18nliner::Extensions::View do
|
|
37
37
|
i18n.translate
|
38
38
|
}.to raise_error /wrong number of arguments/
|
39
39
|
end
|
40
|
+
|
41
|
+
it "should pass along its scope to I18n.t" do
|
42
|
+
expect(I18n).to receive(:translate).with(:key, :default => "foo", :i18n_scope => i18n.i18n_scope)
|
43
|
+
i18n.translate(:key, "foo")
|
44
|
+
end
|
40
45
|
end
|
41
46
|
end
|
42
47
|
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'i18nliner/processors/erb_processor'
|
2
2
|
require 'i18nliner/extractors/translation_hash'
|
3
|
+
require 'i18nliner/scope'
|
3
4
|
|
4
5
|
describe I18nliner::Processors::ErbProcessor do
|
5
6
|
before do
|
@@ -7,6 +8,22 @@ describe I18nliner::Processors::ErbProcessor do
|
|
7
8
|
@processor = I18nliner::Processors::ErbProcessor.new(@translations)
|
8
9
|
end
|
9
10
|
|
11
|
+
describe "#scope_for" do
|
12
|
+
context "with an erb template" do
|
13
|
+
subject { @processor.scope_for("app/views/foos/show.html.erb") }
|
14
|
+
|
15
|
+
specify { expect(subject).to be_allow_relative }
|
16
|
+
specify { expect(subject).to be_remove_whitespace }
|
17
|
+
specify { expect(subject.scope).to eq "foos.show." }
|
18
|
+
end
|
19
|
+
|
20
|
+
context "with anything else" do
|
21
|
+
subject { @processor.scope_for("foo.erb") }
|
22
|
+
|
23
|
+
specify { expect(subject).to be I18nliner::Scope.root }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
10
27
|
describe "#check_contents" do
|
11
28
|
it "should extract valid translation calls" do
|
12
29
|
@processor.check_contents(<<-SOURCE)
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'i18nliner/processors/ruby_processor'
|
2
|
+
require 'i18nliner/extractors/translation_hash'
|
3
|
+
require 'i18nliner/scope'
|
4
|
+
|
5
|
+
describe I18nliner::Processors::RubyProcessor do
|
6
|
+
before do
|
7
|
+
@translations = I18nliner::Extractors::TranslationHash.new
|
8
|
+
@processor = I18nliner::Processors::RubyProcessor.new(@translations)
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "#scope_for" do
|
12
|
+
if defined?(::Rails) && ::Rails.version > '4'
|
13
|
+
context "with a controller" do
|
14
|
+
subject { @processor.scope_for("app/controllers/foos/bars_controller.rb") }
|
15
|
+
|
16
|
+
specify { expect(subject).to be_allow_relative }
|
17
|
+
specify { expect(subject.scope).to eq "foos.bars." }
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context "with any old ruby file" do
|
22
|
+
subject { @processor.scope_for("foo.rb") }
|
23
|
+
|
24
|
+
specify { expect(subject).to be I18nliner::Scope.root }
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
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.
|
4
|
+
version: 0.0.5
|
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: 2014-
|
12
|
+
date: 2014-10-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -66,7 +66,7 @@ dependencies:
|
|
66
66
|
requirements:
|
67
67
|
- - ~>
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version: 2.0
|
69
|
+
version: '2.0'
|
70
70
|
type: :runtime
|
71
71
|
prerelease: false
|
72
72
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -74,7 +74,7 @@ dependencies:
|
|
74
74
|
requirements:
|
75
75
|
- - ~>
|
76
76
|
- !ruby/object:Gem::Version
|
77
|
-
version: 2.0
|
77
|
+
version: '2.0'
|
78
78
|
- !ruby/object:Gem::Dependency
|
79
79
|
name: globby
|
80
80
|
requirement: !ruby/object:Gem::Requirement
|
@@ -206,6 +206,7 @@ files:
|
|
206
206
|
- lib/i18nliner/commands/dump.rb
|
207
207
|
- lib/i18nliner/commands/generic_command.rb
|
208
208
|
- lib/i18nliner/commands/import.rb
|
209
|
+
- lib/i18nliner/controller_scope.rb
|
209
210
|
- lib/i18nliner/errors.rb
|
210
211
|
- lib/i18nliner/erubis.rb
|
211
212
|
- lib/i18nliner/extensions/controller.rb
|
@@ -213,7 +214,6 @@ files:
|
|
213
214
|
- lib/i18nliner/extensions/inferpolation.rb
|
214
215
|
- lib/i18nliner/extensions/model.rb
|
215
216
|
- lib/i18nliner/extensions/view.rb
|
216
|
-
- lib/i18nliner/extractors/abstract_extractor.rb
|
217
217
|
- lib/i18nliner/extractors/ruby_extractor.rb
|
218
218
|
- lib/i18nliner/extractors/sexp_helper.rb
|
219
219
|
- lib/i18nliner/extractors/translate_call.rb
|
@@ -229,8 +229,10 @@ files:
|
|
229
229
|
- lib/tasks/i18nliner.rake
|
230
230
|
- spec/commands/check_spec.rb
|
231
231
|
- spec/commands/dump_spec.rb
|
232
|
+
- spec/extensions/controller_spec.rb
|
232
233
|
- spec/extensions/core_spec.rb
|
233
234
|
- spec/extensions/inferpolation_spec.rb
|
235
|
+
- spec/extensions/model_spec.rb
|
234
236
|
- spec/extensions/view_spec.rb
|
235
237
|
- spec/extractors/ruby_extractor_spec.rb
|
236
238
|
- spec/extractors/translate_call_spec.rb
|
@@ -239,6 +241,7 @@ files:
|
|
239
241
|
- spec/fixtures/app/models/valid.rb
|
240
242
|
- spec/pre_processors/erb_pre_processor_spec.rb
|
241
243
|
- spec/processors/erb_processor_spec.rb
|
244
|
+
- spec/processors/ruby_processor_spec.rb
|
242
245
|
homepage: http://github.com/jenseng/i18nliner
|
243
246
|
licenses: []
|
244
247
|
post_install_message:
|
@@ -1,33 +0,0 @@
|
|
1
|
-
module I18nliner
|
2
|
-
module Extractors
|
3
|
-
module AbstractExtractor
|
4
|
-
def initialize(options = {})
|
5
|
-
@scope = options[:scope] || ''
|
6
|
-
@translations = TranslationHash.new(options[:translations] || {})
|
7
|
-
@total = 0
|
8
|
-
super()
|
9
|
-
end
|
10
|
-
|
11
|
-
def look_up(key)
|
12
|
-
@translations[key]
|
13
|
-
end
|
14
|
-
|
15
|
-
def add_translation(full_key, default)
|
16
|
-
@total += 1
|
17
|
-
@translations[full_key] = default
|
18
|
-
end
|
19
|
-
|
20
|
-
def total_unique
|
21
|
-
@translations.total_size
|
22
|
-
end
|
23
|
-
|
24
|
-
def self.included(base)
|
25
|
-
base.instance_eval do
|
26
|
-
attr_reader :total
|
27
|
-
attr_accessor :translations, :scope
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|