text_helpers 0.4.2 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b830f91668677103c3ef206b9921ee1b22002f38
4
- data.tar.gz: b8083debf8108e5a2aabbb006a3a714d8ccd7326
3
+ metadata.gz: 5996591783903a77aa42bf6661456c457408b437
4
+ data.tar.gz: 290c4f04de2c35b257dfeabcf7a3fa3044b106ad
5
5
  SHA512:
6
- metadata.gz: 775485ba26237b01b0b037517fd2a684d4c409a197bb7e30a87e2c760d40ac390e9810f241c7cc546487326bbefc7cceff3c10932bdefc767f9499a873c8ea8d
7
- data.tar.gz: 3c3d7e67185f1f54e3a6a8afc6281f1c492214a739fda44e6a3d9e6f51efde7d3cccd291709e535aa3fd6a9cce05207338b59d0e1ce698e6e385858156f4fd2a
6
+ metadata.gz: 33242fb49efb10f6c229d2acc44e361e371ae548d61a017030c40a7085822b1613e1693cabadadedc01813cdbf2a116456acbde9287728056b7b179920d2a785
7
+ data.tar.gz: 6b6f8d31bf1b5b04cee1ddb5b0498d8c62c26caade7ac35f0e5e3e5992eb67be6fa8d54751807308585e68a7b6da39efcea22c40d76fefcc3ef26dff780face1
data/.gitignore CHANGED
@@ -18,4 +18,5 @@ rdoc
18
18
  spec/reports
19
19
  test/tmp
20
20
  test/version_tmp
21
+ log
21
22
  tmp
data/README.md CHANGED
@@ -90,3 +90,40 @@ specs by adding `view: true` to the spec metadata.
90
90
 
91
91
  The controller text helpers described above can be accessed in controller
92
92
  specs by adding `controller: true` to your spec metadata.
93
+
94
+ ## Configuration & Initialization
95
+
96
+ ### Initialization
97
+
98
+ `TextHelpers` performs some setup during your application's initialization. Four
99
+ initializers are installed:
100
+
101
+ #### `text_helpers.action_view.extend_base`
102
+
103
+ This initializer includes the `TextHelpers::Translation` module into
104
+ `ActionView::Base` and adds an appropriate `#translation_scope` method.
105
+
106
+ #### `text_helpers.action_mailer.extend_base`
107
+
108
+ This initializer includes the `TextHelpers::Translation` module into
109
+ `ActionMailer::Base` and adds an appropriate `#translation_scope` method.
110
+
111
+ #### `text_helpers.action_controller.extend_base`
112
+
113
+ This initializer includes the `TextHelpers::Translation` module into
114
+ `ActionController::Base` and adds an appropriate `#translation_scope` method.
115
+
116
+ #### `text_helpers.setup_exception_handling`
117
+
118
+ This initializer configures exception handling so that exceptions are raised
119
+ if `config.text_helpers.raise_on_missing_translations` is set to `true`, which
120
+ it is by default in the `test` or `development` environments.
121
+
122
+ ### Configuration
123
+
124
+ #### `config.text_helpers.raise_on_missing_translations`
125
+
126
+ This configuration value defaults to `true` in `test` or `development`
127
+ environments. If set to `false`, your own exception handling can be configured
128
+ by setting `config.action_view.raise_on_missing_translations` and
129
+ `I18n.exception_handler` as appropriate.
data/Rakefile CHANGED
@@ -5,3 +5,5 @@ require 'rake/testtask'
5
5
  Rake::TestTask.new do |t|
6
6
  t.pattern = "test/**/*_test.rb"
7
7
  end
8
+
9
+ task default: :test
@@ -1,15 +1,13 @@
1
1
  module TextHelpers
2
-
3
2
  class Railtie < Rails::Railtie
3
+ config.text_helpers = ActiveSupport::OrderedOptions.new
4
+ config.text_helpers.raise_on_missing_translations = Rails.env.test? || Rails.env.development?
4
5
 
5
- initializer "text_helpers.configure_rails_initialization" do
6
-
7
- class ActionView::Base
6
+ initializer "text_helpers.action_view.extend_base" do
7
+ ActionView::Base.class_eval do
8
8
  include TextHelpers::Translation
9
9
 
10
- protected
11
-
12
- # Protected: Derive a translation scope from the current view template.
10
+ # Public: Derive a translation scope from the current view template.
13
11
  #
14
12
  # Determines an I18n-friendly scope for the current view file when possible,
15
13
  # or falls back to "views.<controller>.<action>"
@@ -27,13 +25,13 @@ module TextHelpers
27
25
  end
28
26
  end
29
27
  end
28
+ end
30
29
 
31
- class ActionMailer::Base
30
+ initializer "text_helpers.action_mailer.extend_base" do
31
+ ActionMailer::Base.class_eval do
32
32
  include TextHelpers::Translation
33
33
 
34
- protected
35
-
36
- # Protected: Provides a scope for I18n lookups.
34
+ # Public: Provides a scope for I18n lookups.
37
35
  #
38
36
  # Should look like `mailers.<mailer>.<action>`
39
37
  #
@@ -42,13 +40,13 @@ module TextHelpers
42
40
  "mailers.#{mailer_name.tr("/", ".").sub("_mailer", "")}.#{action_name}"
43
41
  end
44
42
  end
43
+ end
45
44
 
46
- class ActionController::Base
45
+ initializer "text_helpers.action_controller.extend_base" do
46
+ ActionController::Base.class_eval do
47
47
  include TextHelpers::Translation
48
48
 
49
- protected
50
-
51
- # Protected: Provides a scope for I18n lookups.
49
+ # Public: Provides a scope for I18n lookups.
52
50
  #
53
51
  # Should look like `controllers.<controller_name>`.
54
52
  #
@@ -58,5 +56,15 @@ module TextHelpers
58
56
  end
59
57
  end
60
58
  end
59
+
60
+ initializer "text_helpers.setup_exception_handling", after: 'after_initialize' do
61
+ next unless config.text_helpers.raise_on_missing_translations
62
+
63
+ if config.respond_to?(:action_view)
64
+ config.action_view.raise_on_missing_translations = true
65
+ end
66
+
67
+ TextHelpers.install_i18n_exception_handler
68
+ end
61
69
  end
62
70
  end
@@ -1,3 +1,3 @@
1
1
  module TextHelpers
2
- VERSION = "0.4.2"
2
+ VERSION = "0.5.0"
3
3
  end
data/lib/text_helpers.rb CHANGED
@@ -2,4 +2,29 @@ require "text_helpers/version"
2
2
  require "text_helpers/translation"
3
3
  require "text_helpers/railtie" if defined?(Rails)
4
4
 
5
- module TextHelpers; end
5
+ module TextHelpers
6
+ # RaiseExceptionHandler just raises all exceptions, rather than swallowing
7
+ # MissingTranslation ones. It's cribbed almost verbatim from
8
+ # http://edgeguides.rubyonrails.org/i18n.html#customize-your-i18n-setup.
9
+ class RaiseExceptionHandler < I18n::ExceptionHandler
10
+ def call(exception, locale, key, options)
11
+ if exception.is_a?(I18n::MissingTranslation)
12
+ raise exception.to_exception
13
+ else
14
+ super
15
+ end
16
+ end
17
+ end
18
+
19
+ # Public: Install an instance of TextHelpers::RaiseExceptionHandler as the
20
+ # default I18n exception handler.
21
+ #
22
+ # Returns the handler instance.
23
+ def self.install_i18n_exception_handler
24
+ if I18n.exception_handler
25
+ Rails.logger.warn("Overwriting existing I18n exception handler")
26
+ end
27
+
28
+ I18n.exception_handler = RaiseExceptionHandler.new
29
+ end
30
+ end
@@ -0,0 +1,117 @@
1
+ require_relative '../../test_helper'
2
+
3
+ require 'active_support'
4
+ require 'rails'
5
+ require 'rails/railtie'
6
+ require 'rails/application'
7
+ require 'text_helpers/railtie'
8
+
9
+ describe TextHelpers::Railtie do
10
+ include StubHelpers
11
+
12
+ let(:railtie) { TextHelpers::Railtie }
13
+ let(:action_view_base) { Class.new }
14
+ let(:action_mailer_base) { Class.new }
15
+ let(:action_controller_base) { Class.new }
16
+
17
+ let(:app) do
18
+ Class.new(Rails::Application) do
19
+ config.eager_load = false
20
+
21
+ self
22
+ end
23
+ end
24
+
25
+ let(:stub_resets) do
26
+ []
27
+ end
28
+
29
+ before do
30
+ stub_resets << stub_nested_const(TextHelpers::Railtie, "ActionView::Base", action_view_base)
31
+ stub_resets << stub_nested_const(TextHelpers::Railtie, "ActionMailer::Base", action_mailer_base)
32
+ stub_resets << stub_nested_const(TextHelpers::Railtie, "ActionController::Base", action_controller_base)
33
+
34
+ app.initialize!
35
+ end
36
+
37
+ after do
38
+ stub_resets.reverse.map(&:call)
39
+ end
40
+
41
+ describe "ActionView::Base extensions" do
42
+ it "includes TextHelpers::Translation" do
43
+ assert_includes(action_view_base.included_modules, TextHelpers::Translation)
44
+ end
45
+
46
+ describe "#translation_scope" do
47
+ let(:action_view_base) do
48
+ Class.new do
49
+ attr_accessor :virtual_path, :params
50
+ end
51
+ end
52
+
53
+ let(:view_instance) { action_view_base.new }
54
+
55
+ it "is based on the view virtual path if a matching path is present" do
56
+ view_instance.virtual_path = 'foo/bar/_some_view.html.haml'
57
+ assert_equal('views.foo.bar.some_view', view_instance.translation_scope)
58
+ end
59
+
60
+ it "is based on the controller and action name with a non-matching virtual path" do
61
+ view_instance.virtual_path = 'this-wont-match-at-all'
62
+ view_instance.params = {controller: "a_controller", action: "an_action"}
63
+ assert_equal('views.a_controller.an_action', view_instance.translation_scope)
64
+ end
65
+
66
+ it "is based on the controller and action name with no virtual path" do
67
+ view_instance.virtual_path = nil
68
+ view_instance.params = {controller: "a_controller", action: "an_action"}
69
+ assert_equal('views.a_controller.an_action', view_instance.translation_scope)
70
+ end
71
+ end
72
+ end
73
+
74
+ describe "ActionMailer::Base extensions" do
75
+ it "includes TextHelpers::Translation" do
76
+ assert_includes(action_mailer_base.included_modules, TextHelpers::Translation)
77
+ end
78
+
79
+ describe "#translation_scope" do
80
+ let(:action_mailer_base) do
81
+ Class.new do
82
+ attr_accessor :mailer_name, :action_name
83
+ end
84
+ end
85
+
86
+ let(:mailer_instance) { action_mailer_base.new }
87
+
88
+ it "is based on the mailer name and action" do
89
+ mailer_instance.mailer_name = "foo/bar/baz_mailer"
90
+ mailer_instance.action_name = "notification_message"
91
+ assert_equal('mailers.foo.bar.baz.notification_message', mailer_instance.translation_scope)
92
+ end
93
+ end
94
+ end
95
+
96
+ describe "ActionController::Base extensions" do
97
+ it "includes TextHelpers::Translation" do
98
+ assert_includes(action_mailer_base.included_modules, TextHelpers::Translation)
99
+ end
100
+
101
+ describe "#translation_scope" do
102
+ let(:action_mailer_base) do
103
+ Class.new do
104
+ attr_accessor :mailer_name, :action_name
105
+ end
106
+ end
107
+
108
+ let(:mailer_instance) { action_mailer_base.new }
109
+
110
+ it "is based on the mailer name and action" do
111
+ mailer_instance.mailer_name = "foo/bar/baz_mailer"
112
+ mailer_instance.action_name = "notification_message"
113
+ assert_equal('mailers.foo.bar.baz.notification_message', mailer_instance.translation_scope)
114
+ end
115
+ end
116
+ end
117
+ end
data/test/test_helper.rb CHANGED
@@ -1,4 +1,59 @@
1
1
  require 'minitest/autorun'
2
2
  require File.expand_path('../../lib/text_helpers.rb', __FILE__)
3
3
 
4
+ module StubHelpers
5
+
6
+ # Public: Stub a constant down a nested module path.
7
+ #
8
+ # target - A target Class or Module to stub a constant on.
9
+ # module_path - A path to a constant, like "Foo::Bar::Baz".
10
+ # stub - The stub value to return.
11
+ #
12
+ # Yields a block during which the stub is in place.
13
+ # Returns a Proc that can be called to reset the stub, if no block was given.
14
+ def stub_nested_const(target, module_path, stub)
15
+ module_names = module_path.split("::")[0..-1]
16
+
17
+ # Save original values
18
+ _, *original_values = module_names.inject([target]) do |collected, module_name|
19
+ last_module = collected.last
20
+ break(collected) unless last_module.const_defined?(module_name, false)
21
+
22
+ collected.push(last_module.const_get(module_name, false))
23
+ end
24
+
25
+ # Stub new values
26
+ *chain, last = module_names
27
+
28
+ last_stubbed = chain.inject(target) do |t, module_name|
29
+ module_value = if t.const_defined?(module_name, false)
30
+ t.const_get(module_name, false)
31
+ else
32
+ Module.new
33
+ end
34
+
35
+ t.const_set(module_name, module_value)
36
+ end
37
+
38
+ last_stubbed.const_set(last, stub)
39
+
40
+ # Reset values
41
+ reset_block = lambda do
42
+ unset_last = original_values.length != module_names.length
43
+
44
+ last_target = original_values.zip(module_names).inject(target) do |t, (value, name)|
45
+ t.const_set(name, value)
46
+ end
47
+
48
+ if unset_last
49
+ last_target.send(:remove_const, module_names[original_values.length])
50
+ end
51
+ end
52
+
53
+ block_given? ? yield : reset_block
54
+ ensure
55
+ reset_block.call if block_given?
56
+ end
57
+ end
58
+
4
59
  I18n.enforce_available_locales = false
data/text_helpers.gemspec CHANGED
@@ -25,4 +25,7 @@ Gem::Specification.new do |gem|
25
25
  gem.add_dependency("activesupport")
26
26
  gem.add_dependency("i18n", ">=0.6.8")
27
27
  gem.add_dependency("redcarpet")
28
+
29
+ gem.add_development_dependency("rake")
30
+ gem.add_development_dependency("railties")
28
31
  end
metadata CHANGED
@@ -1,55 +1,83 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: text_helpers
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.2
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Horner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-07 00:00:00.000000000 Z
11
+ date: 2015-01-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: i18n
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: 0.6.8
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: 0.6.8
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: redcarpet
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '>='
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: railties
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
53
81
  - !ruby/object:Gem::Version
54
82
  version: '0'
55
83
  description: Easily fetch text and static content from your locales
@@ -59,7 +87,7 @@ executables: []
59
87
  extensions: []
60
88
  extra_rdoc_files: []
61
89
  files:
62
- - .gitignore
90
+ - ".gitignore"
63
91
  - Gemfile
64
92
  - LICENSE
65
93
  - README.md
@@ -69,6 +97,7 @@ files:
69
97
  - lib/text_helpers/railtie.rb
70
98
  - lib/text_helpers/translation.rb
71
99
  - lib/text_helpers/version.rb
100
+ - test/lib/text_helpers/railtie_test.rb
72
101
  - test/lib/text_helpers/translation_test.rb
73
102
  - test/lib/text_helpers/version_test.rb
74
103
  - test/test_helper.rb
@@ -83,23 +112,24 @@ require_paths:
83
112
  - lib
84
113
  required_ruby_version: !ruby/object:Gem::Requirement
85
114
  requirements:
86
- - - '>='
115
+ - - ">="
87
116
  - !ruby/object:Gem::Version
88
117
  version: '0'
89
118
  required_rubygems_version: !ruby/object:Gem::Requirement
90
119
  requirements:
91
- - - '>='
120
+ - - ">="
92
121
  - !ruby/object:Gem::Version
93
122
  version: '0'
94
123
  requirements: []
95
124
  rubyforge_project:
96
- rubygems_version: 2.2.2
125
+ rubygems_version: 2.4.2
97
126
  signing_key:
98
127
  specification_version: 4
99
128
  summary: TextHelpers is a gem which supplies some basic utilities for text localization
100
129
  in Rails projects. The library is intended to make it simple to keep your application's
101
130
  static and semi-static text content independent of the view structure.
102
131
  test_files:
132
+ - test/lib/text_helpers/railtie_test.rb
103
133
  - test/lib/text_helpers/translation_test.rb
104
134
  - test/lib/text_helpers/version_test.rb
105
135
  - test/test_helper.rb