i18n_namespace 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.txt
data/Gemfile ADDED
@@ -0,0 +1,13 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem 'i18n'
4
+ gem 'yajl-ruby'
5
+ gem 'active_support', :require => false
6
+
7
+ group :development do
8
+ gem "shoulda", ">= 0"
9
+ gem "bundler", "~> 1.0.0"
10
+ gem "jeweler", "~> 1.6.4"
11
+ gem "rcov", ">= 0"
12
+ gem 'rspec'
13
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,38 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ active_support (3.0.0)
5
+ activesupport (= 3.0.0)
6
+ activesupport (3.0.0)
7
+ diff-lcs (1.1.3)
8
+ git (1.2.5)
9
+ i18n (0.6.0)
10
+ jeweler (1.6.4)
11
+ bundler (~> 1.0)
12
+ git (>= 1.2.5)
13
+ rake
14
+ rake (0.9.2.2)
15
+ rcov (0.9.11)
16
+ rspec (2.6.0)
17
+ rspec-core (~> 2.6.0)
18
+ rspec-expectations (~> 2.6.0)
19
+ rspec-mocks (~> 2.6.0)
20
+ rspec-core (2.6.4)
21
+ rspec-expectations (2.6.0)
22
+ diff-lcs (~> 1.1.2)
23
+ rspec-mocks (2.6.0)
24
+ shoulda (2.11.3)
25
+ yajl-ruby (1.1.0)
26
+
27
+ PLATFORMS
28
+ ruby
29
+
30
+ DEPENDENCIES
31
+ active_support
32
+ bundler (~> 1.0.0)
33
+ i18n
34
+ jeweler (~> 1.6.4)
35
+ rcov
36
+ rspec
37
+ shoulda
38
+ yajl-ruby
data/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2012 Matthias Zirnstein
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,15 @@
1
+ = i18n_namespace
2
+
3
+ I18n.namespace = :administrator
4
+
5
+ # with a namespace set, these are the lookup keys
6
+ # administrator.home.index.content
7
+ # home.index.content
8
+ t('home.index.content')
9
+
10
+ # your namespace can an array too
11
+ I18n.namespace = [:administrator, :special_club]
12
+
13
+ # administrator.special_club.home.index.content
14
+ # administrator.home.index.content
15
+ # home.index.content
data/Rakefile ADDED
@@ -0,0 +1,53 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+ begin
6
+ Bundler.setup(:default, :development)
7
+ rescue Bundler::BundlerError => e
8
+ $stderr.puts e.message
9
+ $stderr.puts "Run `bundle install` to install missing gems"
10
+ exit e.status_code
11
+ end
12
+ require 'rake'
13
+
14
+ require 'jeweler'
15
+ Jeweler::Tasks.new do |gem|
16
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
17
+ gem.name = "i18n_namespace"
18
+ gem.homepage = "http://github.com/avarteqgmbh/i18n_namespace"
19
+ gem.license = "MIT"
20
+ gem.summary = %Q{I18n key injection}
21
+ gem.description = %Q{I18n key injection with fallback functionality}
22
+ gem.email = "matthias.zirnstein@googlemail.com"
23
+ gem.authors = ["Matthias Zirnstein"]
24
+ # dependencies defined in Gemfile
25
+ end
26
+ Jeweler::RubygemsDotOrgTasks.new
27
+
28
+ require 'rake/testtask'
29
+ Rake::TestTask.new(:test) do |test|
30
+ test.libs << 'lib' << 'test'
31
+ test.pattern = 'test/**/test_*.rb'
32
+ test.verbose = true
33
+ end
34
+
35
+ require 'rcov/rcovtask'
36
+ Rcov::RcovTask.new do |test|
37
+ test.libs << 'test'
38
+ test.pattern = 'test/**/test_*.rb'
39
+ test.verbose = true
40
+ test.rcov_opts << '--exclude "gems/*"'
41
+ end
42
+
43
+ task :default => :test
44
+
45
+ require 'rake/rdoctask'
46
+ Rake::RDocTask.new do |rdoc|
47
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
48
+
49
+ rdoc.rdoc_dir = 'rdoc'
50
+ rdoc.title = "i18n_namespace #{version}"
51
+ rdoc.rdoc_files.include('README*')
52
+ rdoc.rdoc_files.include('lib/**/*.rb')
53
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.1
@@ -0,0 +1,77 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "i18n_namespace"
8
+ s.version = "0.0.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Matthias Zirnstein"]
12
+ s.date = "2012-01-11"
13
+ s.description = "I18n key injection with fallback functionality"
14
+ s.email = "matthias.zirnstein@googlemail.com"
15
+ s.extra_rdoc_files = [
16
+ "LICENSE.txt",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ "Gemfile",
22
+ "Gemfile.lock",
23
+ "LICENSE.txt",
24
+ "README.rdoc",
25
+ "Rakefile",
26
+ "VERSION",
27
+ "i18n_namespace.gemspec",
28
+ "lib/i18n_namespace.rb",
29
+ "lib/i18n_namespace/config.rb",
30
+ "lib/i18n_namespace/fallbacks.rb",
31
+ "lib/i18n_namespace/helper.rb",
32
+ "lib/i18n_namespace/key_value.rb",
33
+ "lib/i18n_namespace/storing.rb",
34
+ "spec/lib/i18n_namespace_spec.rb",
35
+ "test/helper.rb",
36
+ "test/test_i18n_namespace.rb"
37
+ ]
38
+ s.homepage = "http://github.com/avarteqgmbh/i18n_namespace"
39
+ s.licenses = ["MIT"]
40
+ s.require_paths = ["lib"]
41
+ s.rubygems_version = "1.8.10"
42
+ s.summary = "I18n key injection"
43
+
44
+ if s.respond_to? :specification_version then
45
+ s.specification_version = 3
46
+
47
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
48
+ s.add_runtime_dependency(%q<i18n>, [">= 0"])
49
+ s.add_runtime_dependency(%q<yajl-ruby>, [">= 0"])
50
+ s.add_runtime_dependency(%q<active_support>, [">= 0"])
51
+ s.add_development_dependency(%q<shoulda>, [">= 0"])
52
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
53
+ s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
54
+ s.add_development_dependency(%q<rcov>, [">= 0"])
55
+ s.add_development_dependency(%q<rspec>, [">= 0"])
56
+ else
57
+ s.add_dependency(%q<i18n>, [">= 0"])
58
+ s.add_dependency(%q<yajl-ruby>, [">= 0"])
59
+ s.add_dependency(%q<active_support>, [">= 0"])
60
+ s.add_dependency(%q<shoulda>, [">= 0"])
61
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
62
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
63
+ s.add_dependency(%q<rcov>, [">= 0"])
64
+ s.add_dependency(%q<rspec>, [">= 0"])
65
+ end
66
+ else
67
+ s.add_dependency(%q<i18n>, [">= 0"])
68
+ s.add_dependency(%q<yajl-ruby>, [">= 0"])
69
+ s.add_dependency(%q<active_support>, [">= 0"])
70
+ s.add_dependency(%q<shoulda>, [">= 0"])
71
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
72
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
73
+ s.add_dependency(%q<rcov>, [">= 0"])
74
+ s.add_dependency(%q<rspec>, [">= 0"])
75
+ end
76
+ end
77
+
@@ -0,0 +1,48 @@
1
+ module I18nNamespace
2
+ module I18n
3
+
4
+ def self.included(base)
5
+ base.extend ClassMethods
6
+ end
7
+
8
+ module ClassMethods
9
+ # TODO: fix this, its absolute
10
+ ::I18n::RESERVED_KEYS << :namespaced
11
+
12
+ def namespace
13
+ config.namespace
14
+ end
15
+
16
+ def namespace=(ns)
17
+ raise "Namespace contains unsupported objects. Allowed are: String, Symbol, Array[Symbol, String] or NilClass. Inspection: #{ns.inspect}" unless valid_namespace?(ns)
18
+ config.namespace = ns
19
+ end
20
+
21
+ def store_resolved_translation(locale, key, value, options = {})
22
+ raise "Key has to be a String" unless key.is_a? String
23
+ raise "Value has to be a String or NilClass" if !value.is_a?(String) && !value.is_a?(NilClass)
24
+
25
+ resolved = key.split('.').reverse.inject(value) {|a, n| {n => a}}
26
+
27
+ backend.store_translations locale, resolved, options
28
+ end
29
+
30
+ private
31
+ # TODO: fix this complicated logic :)
32
+ def valid_namespace?(ns)
33
+ return true if [String, Symbol, NilClass].include?(ns.class)
34
+ return false unless ns.is_a?(Array)
35
+
36
+ # check array for invalid objects
37
+ return false if ns.select(&:blank?).present?
38
+ return false if ns.select{|o| ![String, Symbol].include?(o.class)}.present?
39
+
40
+ return true
41
+ end
42
+ end
43
+ end
44
+
45
+ module Config
46
+ attr_accessor :namespace
47
+ end
48
+ end
@@ -0,0 +1,31 @@
1
+ module I18nNamespace
2
+
3
+ module Fallbacks
4
+ include I18nNamespace::Helper
5
+
6
+ def translate(locale, key, options = {})
7
+ namespaced = options.fetch(:namespaced, false)
8
+
9
+ return super if !namespaced || ::I18n.namespace.blank?
10
+ # TODO: accept default, look for i18n/backend/fallback for a solution
11
+ # default = extract_string_or_lambda_default!(options) if options[:default]
12
+
13
+ scope = to_a(options.delete(:scope))
14
+ namespace = to_a(::I18n.namespace)
15
+
16
+ (namespace.size + 1).times do |part|
17
+ catch(:exception) do
18
+ options[:scope] = (namespace | scope).reject(&:nil?)
19
+
20
+ result = super(locale, key, options)
21
+ return result unless result.nil?
22
+ end
23
+ namespace.pop
24
+ end
25
+
26
+ # return super(locale, nil, options.merge(:default => default)) if default
27
+ throw(:exception, ::I18n::MissingTranslation.new(locale, key, options))
28
+ end
29
+
30
+ end
31
+ end
@@ -0,0 +1,11 @@
1
+ module I18nNamespace
2
+ module Helper
3
+ private
4
+
5
+ # save converting to array, :symbol doesn't response to method to_a
6
+ def to_a(o)
7
+ return o.dup if o.is_a? Array
8
+ [o]
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,18 @@
1
+ module I18nNamespace
2
+ class KeyValue
3
+ def self.include(base)
4
+ raise "You can't include I18n::Backends::Fallbacks in this class." if base == ::I18n::Backend::Fallbacks
5
+ super
6
+ end
7
+
8
+ def self.extend(base)
9
+ raise "You can't extend this class with I18n::Backends::Fallbacks." if base == ::I18n::Backend::Fallbacks
10
+ super
11
+ end
12
+
13
+ include ::I18n::Backend::KeyValue::Implementation
14
+ include Fallbacks
15
+ include Storing
16
+
17
+ end
18
+ end
@@ -0,0 +1,16 @@
1
+ module I18nNamespace
2
+ module Storing
3
+ include I18nNamespace::Helper
4
+
5
+ def store_translations(locale, data, options = {})
6
+ # TODO: use delete instead of fetch
7
+ namespaced = options.fetch(:namespaced, false)
8
+
9
+ if namespaced && ::I18n.namespace.present?
10
+ data = to_a(::I18n.namespace).reverse.inject(data) {|a, n| {n => a}}
11
+ end
12
+
13
+ super locale, data, options
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,11 @@
1
+ require 'i18n'
2
+ require 'i18n_namespace/config'
3
+ require 'i18n_namespace/helper'
4
+ require 'i18n_namespace/storing'
5
+ require 'i18n_namespace/fallbacks'
6
+ require 'i18n_namespace/key_value'
7
+
8
+ I18n.send :include, I18nNamespace::I18n
9
+ I18n::Config.send :include, I18nNamespace::Config
10
+
11
+ raise "Please require 'yajl/json_gem' for proper use. Without causing Json decoding errors when accessing the backend." unless defined?(Yajl) && defined?(JSON)
@@ -0,0 +1,188 @@
1
+ require 'yajl/json_gem'
2
+ require 'rspec'
3
+ require 'i18n'
4
+ require 'i18n_namespace'
5
+ require 'active_support/core_ext/hash'
6
+
7
+ describe 'I18n' do
8
+ before(:all) do
9
+ @i18n_backend_saved = I18n.backend
10
+ end
11
+
12
+ after(:all) do
13
+ I18n.backend = @i18n_backend_saved
14
+ end
15
+
16
+ def set_new_backend
17
+ I18n.backend = I18nNamespace::KeyValue.new({})
18
+ end
19
+
20
+ describe 'with backend chain' do
21
+ before(:each) do
22
+ I18n.backend = I18n::Backend::Simple.new
23
+ I18n.backend.store_translations I18n.locale, {:foo => {:bar => {:title => 'foo bar'}}}, :escape => false
24
+
25
+ I18n.backend = I18n::Backend::Chain.new(I18nNamespace::KeyValue.new({}), I18n.backend)
26
+ I18n.backend.store_translations I18n.locale, {:title => 'Willkommen'}, :escape => false
27
+ end
28
+
29
+ it 'should fallback with the backend chain' do
30
+ I18n.t('foo.bar.title').should == 'foo bar'
31
+ end
32
+ end
33
+
34
+ describe 'storing' do
35
+ before(:each) do
36
+ set_new_backend
37
+ end
38
+
39
+ def t(key, options = {})
40
+ options.reverse_merge!(:namespaced => false)
41
+ I18n.t key, options
42
+ end
43
+
44
+ def s(data, options = {})
45
+ options.reverse_merge!(:namespaced => true, :escape => false)
46
+
47
+ I18n.backend.store_translations I18n.locale, data, options
48
+ end
49
+
50
+ def sr(key, value)
51
+ I18n.store_resolved_translation I18n.locale, key, value, :escape => false, :namespaced => true
52
+ end
53
+
54
+
55
+ it 'should resolve dot separated key to hash' do
56
+ sr('foo.bar.title', 'FooBar')
57
+ t('foo.bar.title').should == 'FooBar'
58
+ end
59
+
60
+ it 'should save with namespace' do
61
+ I18n.namespace = :salesman
62
+
63
+ s('title' => 'Willkommen')
64
+ t('salesman.title').should == 'Willkommen'
65
+
66
+ I18n.namespace = [ :salesman, :club ]
67
+
68
+ s('title' => 'Willkommen')
69
+ t('salesman.club.title').should == 'Willkommen'
70
+ end
71
+
72
+ it 'should not save with namespace' do
73
+ options = { :namespaced => false }
74
+
75
+ I18n.namespace = :salesman
76
+
77
+ s({'title' => 'Willkommen'}, options)
78
+ t('salesman.title').should include('translation missing')
79
+
80
+ I18n.namespace = [:salesman, :club]
81
+
82
+ s({'title' => 'Willkommen'}, options)
83
+ t('salesman.club.title').should include('translation missing')
84
+ end
85
+ end
86
+
87
+ describe 'validation' do
88
+ it 'should raise if namespace array includes none supported objects' do
89
+ lambda { I18n.namespace = [ :salesman, nil ] }.should raise_error
90
+ lambda { I18n.namespace = [ :salesman, "" ] }.should raise_error
91
+
92
+ lambda { I18n.namespace = [ :salesman, Proc.new{} ] }.should raise_error
93
+ lambda { I18n.namespace = [ :salesman, Array.new ] }.should raise_error
94
+ lambda { I18n.namespace = [ :salesman, Hash.new ] }.should raise_error
95
+ end
96
+
97
+ it 'should only accept String, Symbol, Array or NilClass' do
98
+ I18n.namespace = :symbol
99
+ I18n.namespace.should == :symbol
100
+
101
+ I18n.namespace = "string"
102
+ I18n.namespace.should == "string"
103
+
104
+ I18n.namespace = nil
105
+ I18n.namespace.should == nil
106
+
107
+ I18n.namespace = []
108
+ I18n.namespace.should == []
109
+ end
110
+ end
111
+
112
+ describe 'namespace fallbacks' do
113
+ before(:each) do
114
+ set_new_backend
115
+
116
+ @salesman_title = 'Willkommen Salesman'
117
+ @club_title = 'Willkommen im Club'
118
+ @title = 'Willkommen'
119
+
120
+ store_translations(
121
+ { :title => @title,
122
+ :salesman => { :title => @salesman_title,
123
+ :club => { :title => @club_title }
124
+ }
125
+ })
126
+ end
127
+
128
+ def store_translations(*args)
129
+ case args.count
130
+ when 1
131
+ raise "Your argument isn't a Hash" unless args.first.is_a? Hash
132
+ data = args.shift
133
+ when 2
134
+ data = { args.shift => args.shift }
135
+ end
136
+
137
+ I18n.backend.store_translations I18n.locale, data
138
+ end
139
+
140
+ def t(key, options = {})
141
+ options.reverse_merge!(:namespaced => true)
142
+
143
+ I18n.t key, options
144
+ end
145
+
146
+ describe 'with no namespace' do
147
+ before(:each) do
148
+ I18n.namespace = nil
149
+ end
150
+
151
+ it 'should return title' do
152
+ t('title').should == @title
153
+ end
154
+
155
+ it 'should show translation missing' do
156
+ t('foobar').should include('translation missing:')
157
+ end
158
+ end
159
+
160
+ describe 'with namespace' do
161
+ before(:each) do
162
+ I18n.namespace = :salesman
163
+ end
164
+
165
+ it 'should not fallback' do
166
+ I18n.namespace = :salesman
167
+ t('title').should == @salesman_title
168
+
169
+ I18n.namespace = [:salesman, :club]
170
+ t('title').should == @club_title
171
+ end
172
+
173
+ it 'should fallback' do
174
+ I18n.namespace = [:salesman, :user]
175
+ t('title').should == @salesman_title
176
+
177
+ I18n.namespace = [:community, :user, '23051949']
178
+ t('title').should == @title
179
+ end
180
+
181
+ it 'should show translation missing' do
182
+ t('foobar').should include('translation missing')
183
+ end
184
+ end
185
+
186
+ end
187
+ end
188
+
data/test/helper.rb ADDED
@@ -0,0 +1,18 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'test/unit'
11
+ require 'shoulda'
12
+
13
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
14
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
15
+ require 'i18n_namespace'
16
+
17
+ class Test::Unit::TestCase
18
+ end
@@ -0,0 +1,7 @@
1
+ require 'helper'
2
+
3
+ class TestI18nNamespace < Test::Unit::TestCase
4
+ should "probably rename this file and start testing for real" do
5
+ flunk "hey buddy, you should probably rename this file and start testing for real"
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,155 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: i18n_namespace
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Matthias Zirnstein
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-01-11 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: i18n
16
+ requirement: &70287162048300 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70287162048300
25
+ - !ruby/object:Gem::Dependency
26
+ name: yajl-ruby
27
+ requirement: &70287162046920 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *70287162046920
36
+ - !ruby/object:Gem::Dependency
37
+ name: active_support
38
+ requirement: &70287162046200 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *70287162046200
47
+ - !ruby/object:Gem::Dependency
48
+ name: shoulda
49
+ requirement: &70287162039100 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *70287162039100
58
+ - !ruby/object:Gem::Dependency
59
+ name: bundler
60
+ requirement: &70287162036740 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ~>
64
+ - !ruby/object:Gem::Version
65
+ version: 1.0.0
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *70287162036740
69
+ - !ruby/object:Gem::Dependency
70
+ name: jeweler
71
+ requirement: &70287162033180 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ~>
75
+ - !ruby/object:Gem::Version
76
+ version: 1.6.4
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: *70287162033180
80
+ - !ruby/object:Gem::Dependency
81
+ name: rcov
82
+ requirement: &70287162024740 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: *70287162024740
91
+ - !ruby/object:Gem::Dependency
92
+ name: rspec
93
+ requirement: &70287162023100 !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ type: :development
100
+ prerelease: false
101
+ version_requirements: *70287162023100
102
+ description: I18n key injection with fallback functionality
103
+ email: matthias.zirnstein@googlemail.com
104
+ executables: []
105
+ extensions: []
106
+ extra_rdoc_files:
107
+ - LICENSE.txt
108
+ - README.rdoc
109
+ files:
110
+ - .document
111
+ - Gemfile
112
+ - Gemfile.lock
113
+ - LICENSE.txt
114
+ - README.rdoc
115
+ - Rakefile
116
+ - VERSION
117
+ - i18n_namespace.gemspec
118
+ - lib/i18n_namespace.rb
119
+ - lib/i18n_namespace/config.rb
120
+ - lib/i18n_namespace/fallbacks.rb
121
+ - lib/i18n_namespace/helper.rb
122
+ - lib/i18n_namespace/key_value.rb
123
+ - lib/i18n_namespace/storing.rb
124
+ - spec/lib/i18n_namespace_spec.rb
125
+ - test/helper.rb
126
+ - test/test_i18n_namespace.rb
127
+ homepage: http://github.com/avarteqgmbh/i18n_namespace
128
+ licenses:
129
+ - MIT
130
+ post_install_message:
131
+ rdoc_options: []
132
+ require_paths:
133
+ - lib
134
+ required_ruby_version: !ruby/object:Gem::Requirement
135
+ none: false
136
+ requirements:
137
+ - - ! '>='
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ segments:
141
+ - 0
142
+ hash: 2288591149329551058
143
+ required_rubygems_version: !ruby/object:Gem::Requirement
144
+ none: false
145
+ requirements:
146
+ - - ! '>='
147
+ - !ruby/object:Gem::Version
148
+ version: '0'
149
+ requirements: []
150
+ rubyforge_project:
151
+ rubygems_version: 1.8.10
152
+ signing_key:
153
+ specification_version: 3
154
+ summary: I18n key injection
155
+ test_files: []