From ce317693bef52da608d4a7ae084696e8ddc19d20 Mon Sep 17 00:00:00 2001 From: Justin Gordon Date: Sat, 4 Mar 2017 23:45:06 -1000 Subject: [PATCH] Improve i18n Integration (#748) * Better error message if the value of the i18n directory is invalid. * Added test for configuration error message. * DRY'd up code for checking if this config value is set. * Improved comments in sample react_on_rails.rb config file --- .../config/initializers/react_on_rails.rb.tt | 3 ++- lib/react_on_rails/configuration.rb | 10 ++++++++++ lib/react_on_rails/locales_to_js.rb | 4 +++- .../test_helper/ensure_assets_compiled.rb | 4 +--- lib/tasks/locale.rake | 4 +--- .../config/initializers/react_on_rails.rb | 3 ++- spec/react_on_rails/configuration_spec.rb | 19 +++++++++++++++++++ spec/react_on_rails/locales_to_js_spec.rb | 6 ++++++ 8 files changed, 44 insertions(+), 9 deletions(-) diff --git a/lib/generators/react_on_rails/templates/base/base/config/initializers/react_on_rails.rb.tt b/lib/generators/react_on_rails/templates/base/base/config/initializers/react_on_rails.rb.tt index cafd63bbe..30def168f 100644 --- a/lib/generators/react_on_rails/templates/base/base/config/initializers/react_on_rails.rb.tt +++ b/lib/generators/react_on_rails/templates/base/base/config/initializers/react_on_rails.rb.tt @@ -62,7 +62,8 @@ ReactOnRails.configure do |config| ################################################################################ # I18N OPTIONS ################################################################################ - # Replace the following line to the location where you keep translation.js & default.js. + # Replace the following line to the location where you keep translation.js & default.js for use + # by the npm packages react-intl. Be sure this directory exists! # config.i18n_dir = Rails.root.join("client", "app", "libs", "i18n") ################################################################################ diff --git a/lib/react_on_rails/configuration.rb b/lib/react_on_rails/configuration.rb index 9e8e74c80..cfe827164 100644 --- a/lib/react_on_rails/configuration.rb +++ b/lib/react_on_rails/configuration.rb @@ -11,6 +11,16 @@ def self.setup_config_values configure_generated_assets_dirs_deprecation ensure_generated_assets_dir_present ensure_server_bundle_js_file_has_no_path + check_i18n_directory_exists + end + + def self.check_i18n_directory_exists + return unless @configuration.i18n_dir.present? + return if Dir.exist?(@configuration.i18n_dir) + + raise "Error configuring /config/react_on_rails.rb: invalid value for `config.i18n_dir`. "\ + "Directory does not exist: #{@configuration.i18n_dir}. Set to value to nil or comment it "\ + "out if not using this i18n with React on Rails." end def self.ensure_generated_assets_dir_present diff --git a/lib/react_on_rails/locales_to_js.rb b/lib/react_on_rails/locales_to_js.rb index 334928961..f59be1219 100644 --- a/lib/react_on_rails/locales_to_js.rb +++ b/lib/react_on_rails/locales_to_js.rb @@ -3,6 +3,7 @@ module ReactOnRails class LocalesToJs def initialize + return unless i18n_dir.present? return unless obsolete? @translations, @defaults = generate_translations convert @@ -38,7 +39,8 @@ def js_file(name) end def locale_files - @locale_files ||= Rails.application.config.i18n.load_path + @locale_files ||= + (Rails.application && Rails.application.config.i18n.load_path).presence end def i18n_dir diff --git a/lib/react_on_rails/test_helper/ensure_assets_compiled.rb b/lib/react_on_rails/test_helper/ensure_assets_compiled.rb index 0fb65489b..faff8e073 100644 --- a/lib/react_on_rails/test_helper/ensure_assets_compiled.rb +++ b/lib/react_on_rails/test_helper/ensure_assets_compiled.rb @@ -27,9 +27,7 @@ def call # Be sure we don't do this again. self.class.has_been_run = true - if ReactOnRails.configuration.i18n_dir.present? && Rails.application.present? - ReactOnRails::LocalesToJs.new - end + ReactOnRails::LocalesToJs.new stale_gen_files = webpack_assets_status_checker.stale_generated_webpack_files diff --git a/lib/tasks/locale.rake b/lib/tasks/locale.rake index ec8b58c29..efe1c0637 100644 --- a/lib/tasks/locale.rake +++ b/lib/tasks/locale.rake @@ -7,8 +7,6 @@ This task generates javascript locale files: `translations.js` & `default.js` an the "ReactOnRails.configuration.i18n_dir". DESC task locale: :environment do - if ReactOnRails.configuration.i18n_dir.present? - ReactOnRails::LocalesToJs.new - end + ReactOnRails::LocalesToJs.new end end diff --git a/spec/dummy/config/initializers/react_on_rails.rb b/spec/dummy/config/initializers/react_on_rails.rb index 2883b63b9..f237bef7a 100644 --- a/spec/dummy/config/initializers/react_on_rails.rb +++ b/spec/dummy/config/initializers/react_on_rails.rb @@ -74,7 +74,8 @@ def self.custom_context(view_context) ################################################################################ # I18N OPTIONS ################################################################################ - # Replace the following line to the location where you keep translation.js & default.js. + # Replace the following line to the location where you keep translation.js & default.js for use + # by the npm packages react-intl. Be sure this directory exists! # config.i18n_dir = Rails.root.join("client", "app", "libs", "i18n") ################################################################################ diff --git a/spec/react_on_rails/configuration_spec.rb b/spec/react_on_rails/configuration_spec.rb index 32e31835b..6169b5a17 100644 --- a/spec/react_on_rails/configuration_spec.rb +++ b/spec/react_on_rails/configuration_spec.rb @@ -2,6 +2,25 @@ module ReactOnRails RSpec.describe Configuration do + it "raises if the i18n directory does not exist" do + junk_name = "/XXXX/junkXXXX" + expect do + ReactOnRails.configure do |config| + config.i18n_dir = junk_name + end + end.to raise_error(/#{junk_name}/) + end + + it "does not raises if the i18n directory does exist" do + dir = File.expand_path(File.dirname(__FILE__)) + expect do + ReactOnRails.configure do |config| + config.i18n_dir = dir + end + end.to_not raise_error + expect(ReactOnRails.configuration.i18n_dir).to eq(dir) + end + it "be able to config default configuration of the gem" do ReactOnRails.configure do |config| config.server_bundle_js_file = "server.js" diff --git a/spec/react_on_rails/locales_to_js_spec.rb b/spec/react_on_rails/locales_to_js_spec.rb index 40051f652..c2aee952a 100644 --- a/spec/react_on_rails/locales_to_js_spec.rb +++ b/spec/react_on_rails/locales_to_js_spec.rb @@ -16,6 +16,12 @@ module ReactOnRails end end + after do + ReactOnRails.configure do |config| + config.i18n_dir = nil + end + end + context "with obsolete js files" do before do FileUtils.touch(translations_path, mtime: Time.now - 1.year)