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