i18n-js 3.0.0.rc12 → 3.0.0.rc13

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 38feae5eaf2de86fcedd5ebaa0eaf008a1a33f8d
4
- data.tar.gz: fe63577ccdbce4f49d6f998f68fad0d58791eaf4
3
+ metadata.gz: 8d618c24aafbe01dfc9573cf7a3df0c214b9b48a
4
+ data.tar.gz: 22bbc551ae4ba0d927c4d8b61fbf54996f51de4f
5
5
  SHA512:
6
- metadata.gz: 00405a7c557557f13effc0088a9f13c56fe1fd9105d2cfd87951e8b9df1f55089f4610206a39dce7fed0b2d1780da36b1819f0fa4aed8c24d21875e538044cd2
7
- data.tar.gz: 76240818ad36435dd3dfdf99324bb336c9832de408bd0c02104e5255e399d241f941a7d65bf903f2e505b1b311b39611fb34504884ebf0eeb14ba0caf35609d9
6
+ metadata.gz: f8ada8c660b2185867aa9c5ed68627aaee251c164032e39cf1b3fd0e9f0690f161defe732055f9eb97945084665208237252174ebf60131e66e6589fdf666506
7
+ data.tar.gz: aabf496875397c179606adf78bba0bee468e5d923a7d3c6d21d36494b03aab55cc650fdf8a672eea0da410a9c57c18ea07ae7c377129aa275cea6254c260a073
data/.travis.yml CHANGED
@@ -8,6 +8,9 @@ rvm:
8
8
  - 2.0
9
9
  - 2.1
10
10
  - 2.2
11
+ # Since the Travis Build Env does not recognize `2.3` alias yet
12
+ # We need to specify the version precisely
13
+ - 2.3.0
11
14
  - ruby-head
12
15
  before_install: # Need to install something extra to test JS
13
16
  - npm install jasmine-node@1.14.2
data/CHANGELOG.md CHANGED
@@ -16,6 +16,24 @@ This project adheres to [Semantic Versioning](http://semver.org/).
16
16
 
17
17
  - Nothing
18
18
 
19
+ ## [3.0.0.rc13] - 2016-06-29
20
+
21
+ ### Added
22
+
23
+ - [Ruby] Added option `js_extend` to not generate JS code for translations with usage of `I18n.extend` ([#397](https://github.com/fnando/i18n-js/pull/397))
24
+
25
+ ### Changed
26
+
27
+ - Nothing
28
+
29
+ ### Fixed
30
+
31
+ - [JS] Initialize option `missingBehaviour` & `missingTranslationPrefix` with default values ([#398](https://github.com/fnando/i18n-js/pull/398))
32
+ - [JS] Throw an error when `I18n.strftime()` takes an invalid date ([#383](https://github.com/fnando/i18n-js/pull/383))
33
+ - [JS] Fix default error message when translation missing to consider locale passed in options
34
+ - [Ruby] Reset middleware cache on rails startup
35
+ ([#402](https://github.com/fnando/i18n-js/pull/402))
36
+
19
37
 
20
38
  ## [3.0.0.rc12] - 2015-12-30
21
39
 
@@ -158,5 +176,6 @@ This project adheres to [Semantic Versioning](http://semver.org/).
158
176
 
159
177
 
160
178
 
161
- [Unreleased]: https://github.com/fnando/i18n-js/compare/v3.0.0.rc12...HEAD
179
+ [Unreleased]: https://github.com/fnando/i18n-js/compare/v3.0.0.rc13...HEAD
180
+ [3.0.0.rc13]: https://github.com/fnando/i18n-js/compare/v3.0.0.rc12...v3.0.0.rc13
162
181
  [3.0.0.rc12]: https://github.com/fnando/i18n-js/compare/v3.0.0.rc11...v3.0.0.rc12
data/README.md CHANGED
@@ -15,6 +15,10 @@ Features:
15
15
  - Asset pipeline support
16
16
  - Lots more! :)
17
17
 
18
+ ## Version Notice
19
+ The `master` branch (including this README) is for latest `3.0.0.rc` instead of `2.x`.
20
+
21
+
18
22
  ## Usage
19
23
 
20
24
  ### Installation
@@ -252,6 +256,20 @@ translations:
252
256
  ```
253
257
 
254
258
 
259
+ #### Javscript Merge (:js_extend option)
260
+
261
+ By default, the output file Javascript will call the `I18n.extend` method to ensure that newly loaded locale
262
+ files are shallow-merged with any locale data already in memory. To disable this either globally or per-file,
263
+ set the `js_extend` option to false
264
+
265
+ ```yaml
266
+ js_extend: false # this will disable Javascript I18n.extend globally
267
+ translations:
268
+ - file: "public/javascripts/i18n/translations.js"
269
+ js_extend: false # this will disable Javascript I18n.extend for this file
270
+ ```
271
+
272
+
255
273
  #### Vanilla JavaScript
256
274
 
257
275
  Just add the `i18n.js` file to your page. You'll have to build the translations object
@@ -262,7 +280,7 @@ by hand or using your favorite programming language. More info below.
262
280
 
263
281
  Add the following line to your package.json dependencies (where version is the version you want - n.b. npm install requires it to be the gzipped tarball, see [npm install](https://www.npmjs.org/doc/cli/npm-install.html))
264
282
  ```javascript
265
- "i18n-js": "http://github.com/fnando/i18n-js/archive/v3.0.0.rc8.tar.gz"
283
+ "i18n-js": "http://github.com/fnando/i18n-js/archive/v3.0.0.rc12.tar.gz"
266
284
  ```
267
285
  Run npm install then use via
268
286
  ```javascript
@@ -191,6 +191,12 @@
191
191
 
192
192
  if (typeof(this.translations) === "undefined" && this.translations !== null)
193
193
  this.translations = DEFAULT_OPTIONS.translations;
194
+
195
+ if (typeof(this.missingBehaviour) === "undefined" && this.missingBehaviour !== null)
196
+ this.missingBehaviour = DEFAULT_OPTIONS.missingBehaviour;
197
+
198
+ if (typeof(this.missingTranslationPrefix) === "undefined" && this.missingTranslationPrefix !== null)
199
+ this.missingTranslationPrefix = DEFAULT_OPTIONS.missingTranslationPrefix;
194
200
  };
195
201
  I18n.initializeOptions();
196
202
 
@@ -536,8 +542,9 @@
536
542
  function(match, p1, p2) {return p1 + ' ' + p2.toLowerCase()} );
537
543
  }
538
544
 
545
+ var localeForTranslation = (options != null && options.locale != null) ? options.locale : this.currentLocale();
539
546
  var fullScope = this.getFullScope(scope, options);
540
- var fullScopeWithLocale = [this.currentLocale(), fullScope].join(this.defaultSeparator);
547
+ var fullScopeWithLocale = [localeForTranslation, fullScope].join(this.defaultSeparator);
541
548
 
542
549
  return '[missing "' + fullScopeWithLocale + '" translation]';
543
550
  };
@@ -772,6 +779,10 @@
772
779
 
773
780
  options = this.prepareOptions(options, DATE);
774
781
 
782
+ if (isNaN(date.getTime())) {
783
+ throw new Error('I18n.strftime() requires a valid date object, but received an invalid date.');
784
+ }
785
+
775
786
  var weekDay = date.getDay()
776
787
  , day = date.getDate()
777
788
  , year = date.getFullYear()
data/lib/i18n/js.rb CHANGED
@@ -48,13 +48,11 @@ module I18n
48
48
  only = options[:only] || '*'
49
49
  exceptions = [options[:except] || []].flatten
50
50
 
51
- segment_options = options.slice(:namespace, :pretty_print)
52
-
53
51
  result = segment_for_scope(only, exceptions)
54
52
 
55
53
  merge_with_fallbacks!(result) if fallbacks
56
54
 
57
- segments << Segment.new(file, result, segment_options) unless result.empty?
55
+ segments << Segment.new(file, result, extract_segment_options(options)) unless result.empty?
58
56
 
59
57
  segments
60
58
  end
@@ -143,7 +141,7 @@ module I18n
143
141
  results[scope.to_sym] = tmp unless tmp.nil?
144
142
  end
145
143
  return results
146
- elsif translations.respond_to?(:has_key?) && translations.has_key?(scope.to_sym)
144
+ elsif translations.respond_to?(:key?) && translations.key?(scope.to_sym)
147
145
  return {scope.to_sym => scopes.empty? ? translations[scope.to_sym] : filter(translations[scope.to_sym], scopes)}
148
146
  end
149
147
  nil
@@ -168,8 +166,15 @@ module I18n
168
166
  end
169
167
  end
170
168
 
169
+ def self.js_extend
170
+ config.fetch(:js_extend) do
171
+ # default value
172
+ true
173
+ end
174
+ end
175
+
171
176
  def self.sort_translation_keys?
172
- @sort_translation_keys ||= (config[:sort_translation_keys]) if config.has_key?(:sort_translation_keys)
177
+ @sort_translation_keys ||= (config[:sort_translation_keys]) if config.key?(:sort_translation_keys)
173
178
  @sort_translation_keys = true if @sort_translation_keys.nil?
174
179
  @sort_translation_keys
175
180
  end
@@ -178,6 +183,11 @@ module I18n
178
183
  @sort_translation_keys = !!value
179
184
  end
180
185
 
186
+ def self.extract_segment_options(options)
187
+ segment_options = {js_extend: js_extend, sort_translation_keys: sort_translation_keys?}.with_indifferent_access
188
+ segment_options.merge(options.slice(*Segment::OPTIONS))
189
+ end
190
+
181
191
  ### Export i18n.js
182
192
  begin
183
193
 
@@ -192,7 +202,7 @@ module I18n
192
202
  end
193
203
 
194
204
  def self.export_i18n_js_dir_path
195
- @export_i18n_js_dir_path ||= (config[:export_i18n_js] || :none) if config.has_key?(:export_i18n_js)
205
+ @export_i18n_js_dir_path ||= (config[:export_i18n_js] || :none) if config.key?(:export_i18n_js)
196
206
  @export_i18n_js_dir_path ||= DEFAULT_EXPORT_DIR_PATH
197
207
  @export_i18n_js_dir_path
198
208
  end
@@ -3,6 +3,7 @@ module I18n
3
3
  class Middleware
4
4
  def initialize(app)
5
5
  @app = app
6
+ clear_cache
6
7
  end
7
8
 
8
9
  def call(env)
@@ -30,6 +31,10 @@ module I18n
30
31
  end
31
32
  end
32
33
 
34
+ def clear_cache
35
+ File.delete(cache_path) if File.exist?(cache_path)
36
+ end
37
+
33
38
  def save_cache(new_cache)
34
39
  # path could be a symbolic link
35
40
  FileUtils.mkdir_p(cache_dir) unless File.exists?(cache_dir)
@@ -3,22 +3,25 @@ module I18n
3
3
 
4
4
  # Class which enscapulates a translations hash and outputs a single JSON translation file
5
5
  class Segment
6
- attr_accessor :file, :translations, :namespace, :pretty_print
7
-
6
+ OPTIONS = [:namespace, :pretty_print, :js_extend, :sort_translation_keys].freeze
8
7
  LOCALE_INTERPOLATOR = /%\{locale\}/
9
8
 
9
+ attr_reader *([:file, :translations] | OPTIONS)
10
+
10
11
  def initialize(file, translations, options = {})
11
12
  @file = file
12
13
  @translations = translations
13
14
  @namespace = options[:namespace] || 'I18n'
14
15
  @pretty_print = !!options[:pretty_print]
16
+ @js_extend = options.key?(:js_extend) ? !!options[:js_extend] : true
17
+ @sort_translation_keys = options.key?(:sort_translation_keys) ? !!options[:sort_translation_keys] : true
15
18
  end
16
19
 
17
20
  # Saves JSON file containing translations
18
21
  def save!
19
- if self.file =~ LOCALE_INTERPOLATOR
22
+ if @file =~ LOCALE_INTERPOLATOR
20
23
  I18n.available_locales.each do |locale|
21
- write_file(file_for_locale(locale), self.translations.slice(locale))
24
+ write_file(file_for_locale(locale), @translations.slice(locale))
22
25
  end
23
26
  else
24
27
  write_file
@@ -27,20 +30,37 @@ module I18n
27
30
 
28
31
  protected
29
32
 
30
- def write_file(_file = self.file, _translations = self.translations)
33
+ def write_file(_file = @file, _translations = @translations)
31
34
  FileUtils.mkdir_p File.dirname(_file)
32
35
  File.open(_file, "w+") do |f|
33
- f << %(#{self.namespace}.translations || (#{self.namespace}.translations = {});\n)
36
+ f << js_header
34
37
  _translations.each do |locale, translations_for_locale|
35
- output_translations = I18n::JS.sort_translation_keys? ? Utils.deep_key_sort(translations_for_locale) : translations_for_locale
36
- f << %(#{self.namespace}.translations["#{locale}"] = I18n.extend((#{self.namespace}.translations["#{locale}"] || {}), #{print_json(output_translations)});\n)
38
+ f << js_translations(locale, translations_for_locale)
37
39
  end
38
40
  end
39
41
  end
40
42
 
43
+ def js_header
44
+ %(#{@namespace}.translations || (#{@namespace}.translations = {});\n)
45
+ end
46
+
47
+ def js_translations(locale, translations)
48
+ translations = Utils.deep_key_sort(translations) if @sort_translation_keys
49
+ translations = print_json(translations)
50
+ js_translations_line(locale, translations)
51
+ end
52
+
53
+ def js_translations_line(locale, translations)
54
+ if @js_extend
55
+ %(#{@namespace}.translations["#{locale}"] = I18n.extend((#{@namespace}.translations["#{locale}"] || {}), #{translations});\n)
56
+ else
57
+ %(#{@namespace}.translations["#{locale}"] = #{translations};\n)
58
+ end
59
+ end
60
+
41
61
  # Outputs pretty or ugly JSON depending on :pretty_print option
42
62
  def print_json(translations)
43
- if pretty_print
63
+ if @pretty_print
44
64
  JSON.pretty_generate(translations)
45
65
  else
46
66
  translations.to_json
@@ -49,7 +69,7 @@ module I18n
49
69
 
50
70
  # interpolates filename
51
71
  def file_for_locale(locale)
52
- self.file.gsub(LOCALE_INTERPOLATOR, locale.to_s)
72
+ @file.gsub(LOCALE_INTERPOLATOR, locale.to_s)
53
73
  end
54
74
  end
55
75
  end
@@ -4,7 +4,7 @@ module I18n
4
4
  MAJOR = 3
5
5
  MINOR = 0
6
6
  PATCH = 0
7
- STRING = "#{MAJOR}.#{MINOR}.#{PATCH}.rc12"
7
+ STRING = "#{MAJOR}.#{MINOR}.#{PATCH}.rc13"
8
8
  end
9
9
  end
10
10
  end
@@ -0,0 +1,6 @@
1
+ fallbacks: false
2
+ js_extend: false
3
+
4
+ translations:
5
+ - file: "tmp/i18n-js/js_extend_parent.js"
6
+ only: "*.date.formats"
@@ -0,0 +1,6 @@
1
+ fallbacks: false
2
+
3
+ translations:
4
+ - file: "tmp/i18n-js/js_extend_segment.js"
5
+ js_extend: false
6
+ only: "*.date.formats"
@@ -255,4 +255,11 @@ describe("Dates", function(){
255
255
  date = new Date(2009, 3, 26, 7, 35, 44);
256
256
  expect(I18n.strftime(date, "%p")).toEqual("de:AM");
257
257
  });
258
+
259
+ it("fails to format invalid date", function(){
260
+ var date = new Date('foo');
261
+ expect(function() {
262
+ I18n.strftime(date, "%a");
263
+ }).toThrow('I18n.strftime() requires a valid date object, but received an invalid date.');
264
+ });
258
265
  });
@@ -24,6 +24,12 @@ describe("Translate", function(){
24
24
  expect(actual).toEqual(expected);
25
25
  });
26
26
 
27
+ it("returns missing message translation with provided locale for invalid scope", function(){
28
+ actual = I18n.t("invalid.scope", { locale: "ja" });
29
+ expected = '[missing "ja.invalid.scope" translation]';
30
+ expect(actual).toEqual(expected);
31
+ });
32
+
27
33
  it("returns guessed translation if missingBehaviour is set to guess", function(){
28
34
  I18n.missingBehaviour = 'guess'
29
35
  actual = I18n.t("invalid.thisIsAutomaticallyGeneratedTranslation");
@@ -180,6 +186,7 @@ describe("Translate", function(){
180
186
  it("escapes $ when doing substitution (IE)", function(){
181
187
  I18n.locale = "en";
182
188
 
189
+ expect(I18n.t("paid", {price: "$0"})).toEqual("You were paid $0");
183
190
  expect(I18n.t("paid", {price: "$0.12"})).toEqual("You were paid $0.12");
184
191
  expect(I18n.t("paid", {price: "$1.35"})).toEqual("You were paid $1.35");
185
192
  });
@@ -6,7 +6,12 @@ describe I18n::JS::Segment do
6
6
  let(:translations){ { en: { "test" => "Test" }, fr: { "test" => "Test2" } } }
7
7
  let(:namespace) { "MyNamespace" }
8
8
  let(:pretty_print){ nil }
9
- let(:options) { {namespace: namespace, pretty_print: pretty_print} }
9
+ let(:js_extend) { nil }
10
+ let(:sort_translation_keys){ nil }
11
+ let(:options) { { namespace: namespace,
12
+ pretty_print: pretty_print,
13
+ js_extend: js_extend,
14
+ sort_translation_keys: sort_translation_keys }.delete_if{|k,v| v.nil?} }
10
15
  subject { I18n::JS::Segment.new(file, translations, options) }
11
16
 
12
17
  describe ".new" do
@@ -89,10 +94,38 @@ MyNamespace.translations["fr"] = I18n.extend((MyNamespace.translations["fr"] ||
89
94
  end
90
95
  end
91
96
 
92
- context "when sort_translation_keys? is true" do
93
- before :each do
94
- I18n::JS.sort_translation_keys = true
97
+ context "when js_extend is true" do
98
+ let(:js_extend){ true }
99
+
100
+ let(:translations){ { en: { "b" => "Test", "a" => "Test" } } }
101
+
102
+ it 'should output the keys as sorted' do
103
+ file_should_exist "segment.js"
104
+
105
+ File.open(File.join(temp_path, "segment.js")){|f| f.read}.should eql <<-EOF
106
+ MyNamespace.translations || (MyNamespace.translations = {});
107
+ MyNamespace.translations["en"] = I18n.extend((MyNamespace.translations["en"] || {}), {"a":"Test","b":"Test"});
108
+ EOF
109
+ end
110
+ end
111
+
112
+ context "when js_extend is false" do
113
+ let(:js_extend){ false }
114
+
115
+ let(:translations){ { en: { "b" => "Test", "a" => "Test" } } }
116
+
117
+ it 'should output the keys as sorted' do
118
+ file_should_exist "segment.js"
119
+
120
+ File.open(File.join(temp_path, "segment.js")){|f| f.read}.should eql <<-EOF
121
+ MyNamespace.translations || (MyNamespace.translations = {});
122
+ MyNamespace.translations["en"] = {"a":"Test","b":"Test"};
123
+ EOF
95
124
  end
125
+ end
126
+
127
+ context "when sort_translation_keys is true" do
128
+ let(:sort_translation_keys){ true }
96
129
 
97
130
  let(:translations){ { en: { "b" => "Test", "a" => "Test" } } }
98
131
 
@@ -105,5 +138,20 @@ MyNamespace.translations["en"] = I18n.extend((MyNamespace.translations["en"] ||
105
138
  EOF
106
139
  end
107
140
  end
141
+
142
+ context "when sort_translation_keys is false" do
143
+ let(:sort_translation_keys){ false }
144
+
145
+ let(:translations){ { en: { "b" => "Test", "a" => "Test" } } }
146
+
147
+ it 'should output the keys as sorted' do
148
+ file_should_exist "segment.js"
149
+
150
+ File.open(File.join(temp_path, "segment.js")){|f| f.read}.should eql <<-EOF
151
+ MyNamespace.translations || (MyNamespace.translations = {});
152
+ MyNamespace.translations["en"] = I18n.extend((MyNamespace.translations["en"] || {}), {"b":"Test","a":"Test"});
153
+ EOF
154
+ end
155
+ end
108
156
  end
109
157
  end
@@ -30,14 +30,14 @@ describe I18n::JS do
30
30
 
31
31
  it "exports messages using custom output path" do
32
32
  set_config "custom_path.yml"
33
- I18n::JS::Segment.should_receive(:new).with("tmp/i18n-js/all.js", translations, {}).and_call_original
33
+ I18n::JS::Segment.should_receive(:new).with("tmp/i18n-js/all.js", translations, {js_extend: true, sort_translation_keys: true}).and_call_original
34
34
  I18n::JS::Segment.any_instance.should_receive(:save!).with(no_args)
35
35
  I18n::JS.export
36
36
  end
37
37
 
38
38
  it "sets default scope to * when not specified" do
39
39
  set_config "no_scope.yml"
40
- I18n::JS::Segment.should_receive(:new).with("tmp/i18n-js/no_scope.js", translations, {}).and_call_original
40
+ I18n::JS::Segment.should_receive(:new).with("tmp/i18n-js/no_scope.js", translations, {js_extend: true, sort_translation_keys: true}).and_call_original
41
41
  I18n::JS::Segment.any_instance.should_receive(:save!).with(no_args)
42
42
  I18n::JS.export
43
43
  end
@@ -587,6 +587,41 @@ EOS
587
587
  end
588
588
  end
589
589
  end
590
+ end
591
+
592
+ describe "js_extend option" do
593
+ before do
594
+ stub_const('I18n::JS::DEFAULT_EXPORT_DIR_PATH', temp_path)
595
+ end
596
+
597
+ it "exports with js_extend option at parent level" do
598
+ set_config "js_extend_parent.yml"
599
+ I18n::JS.export
600
+
601
+ file_should_exist "js_extend_parent.js"
602
+
603
+ output = File.read(File.join(I18n::JS.export_i18n_js_dir_path, "js_extend_parent.js"))
604
+ expect(output).to eq(<<EOS
605
+ I18n.translations || (I18n.translations = {});
606
+ I18n.translations[\"en\"] = {\"date\":{\"formats\":{\"default\":\"%Y-%m-%d\",\"long\":\"%B %d, %Y\",\"short\":\"%b %d\"}}};
607
+ I18n.translations[\"fr\"] = {\"date\":{\"formats\":{\"default\":\"%d/%m/%Y\",\"long\":\"%e %B %Y\",\"long_ordinal\":\"%e %B %Y\",\"only_day\":\"%e\",\"short\":\"%e %b\"}}};
608
+ EOS
609
+ )
610
+ end
611
+
612
+ it "exports with js_extend option at segment level" do
613
+ set_config "js_extend_segment.yml"
614
+ I18n::JS.export
590
615
 
616
+ file_should_exist "js_extend_segment.js"
617
+
618
+ output = File.read(File.join(I18n::JS.export_i18n_js_dir_path, "js_extend_segment.js"))
619
+ expect(output).to eq(<<EOS
620
+ I18n.translations || (I18n.translations = {});
621
+ I18n.translations[\"en\"] = {\"date\":{\"formats\":{\"default\":\"%Y-%m-%d\",\"long\":\"%B %d, %Y\",\"short\":\"%b %d\"}}};
622
+ I18n.translations[\"fr\"] = {\"date\":{\"formats\":{\"default\":\"%d/%m/%Y\",\"long\":\"%e %B %Y\",\"long_ordinal\":\"%e %B %Y\",\"only_day\":\"%e\",\"short\":\"%e %b\"}}};
623
+ EOS
624
+ )
625
+ end
591
626
  end
592
627
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: i18n-js
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0.rc12
4
+ version: 3.0.0.rc13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nando Vieira
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-12-30 00:00:00.000000000 Z
11
+ date: 2016-06-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: i18n
@@ -140,6 +140,8 @@ files:
140
140
  - spec/fixtures/except_condition.yml
141
141
  - spec/fixtures/js_export_dir_custom.yml
142
142
  - spec/fixtures/js_export_dir_none.yml
143
+ - spec/fixtures/js_extend_parent.yml
144
+ - spec/fixtures/js_extend_segment.yml
143
145
  - spec/fixtures/js_file_per_locale.yml
144
146
  - spec/fixtures/js_file_per_locale_with_fallbacks_as_default_locale_symbol.yml
145
147
  - spec/fixtures/js_file_per_locale_with_fallbacks_as_hash.yml
@@ -206,7 +208,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
206
208
  version: 1.3.1
207
209
  requirements: []
208
210
  rubyforge_project:
209
- rubygems_version: 2.5.0
211
+ rubygems_version: 2.6.4
210
212
  signing_key:
211
213
  specification_version: 4
212
214
  summary: It's a small library to provide the Rails I18n translations on the Javascript.
@@ -217,6 +219,8 @@ test_files:
217
219
  - spec/fixtures/except_condition.yml
218
220
  - spec/fixtures/js_export_dir_custom.yml
219
221
  - spec/fixtures/js_export_dir_none.yml
222
+ - spec/fixtures/js_extend_parent.yml
223
+ - spec/fixtures/js_extend_segment.yml
220
224
  - spec/fixtures/js_file_per_locale.yml
221
225
  - spec/fixtures/js_file_per_locale_with_fallbacks_as_default_locale_symbol.yml
222
226
  - spec/fixtures/js_file_per_locale_with_fallbacks_as_hash.yml