hanami-view 1.1.0 → 1.1.1

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
- SHA1:
3
- metadata.gz: 5c2f65b1df90c3753ad9b1dc9832c1bbf560f920
4
- data.tar.gz: bfea50f6d49c147ff741f6fe9f590c4965696a17
2
+ SHA256:
3
+ metadata.gz: 975282c7d30e5a6826be9afccdebf3f8265f9407eb872849316141ffa6c1ef07
4
+ data.tar.gz: b8136cee7472c868d96ab6082a66410b53ef32b1f35bedcfd293c3fe1af12f3c
5
5
  SHA512:
6
- metadata.gz: 7474ed87aca12b0e21b3d142dca41117c142763683eb65665d6a044cf848585668a21767a2c156475801e293866d68464a057eacffaa69336f2383cc0fde801d
7
- data.tar.gz: c14ae0df06d44dd9163cfea9cfa79632044b200f03bbe85cabce5f6bd2aa0d400eb3ae4ee039137dcce94157aacc67e61ee5a98fdf4c8a974d0ca79c90ea3328
6
+ metadata.gz: b8cc401697f3e7cfcdb8f2b37d9ec8cdfdbb3413a274dd7e5e3eb471ebb2a1ca630bae7eab8fce3dd6c429fc922fff35983b6e158ff6069d279257de1c80eb39
7
+ data.tar.gz: 623f66b95073220a3a21d9569973cc749618345d4703917e3decae0b245ff8f8f232c4110cfc6bc6a4895bee63a964b282835cd7de0c8136f7bd4208b1983473
data/CHANGELOG.md CHANGED
@@ -1,6 +1,13 @@
1
1
  # Hanami::View
2
2
  View layer for Hanami
3
3
 
4
+ ## v1.1.1 - 2018-02-27
5
+ ### Added
6
+ - [Luca Guidi] Official support for Ruby: MRI 2.5
7
+
8
+ ### Fixed
9
+ - [Alfonso Uceda] Ensure that `exposures` are properly overwritten for partials when `locals:` option is used
10
+
4
11
  ## v1.1.0 - 2017-10-25
5
12
 
6
13
  ## v1.1.0.rc1 - 2017-10-16
@@ -1,5 +1,6 @@
1
1
  require 'hanami/view/rendering/registry'
2
2
  require 'hanami/view/rendering/scope'
3
+ require 'hanami/view/rendering/subscope'
3
4
  require 'hanami/view/rendering/null_local'
4
5
 
5
6
  module Hanami
@@ -1,4 +1,5 @@
1
1
  require 'hanami/view/rendering/null_local'
2
+ require 'hanami/view/rendering/options'
2
3
  require 'hanami/utils/escape'
3
4
 
4
5
  module Hanami
@@ -125,7 +126,7 @@ module Hanami
125
126
  #
126
127
  # @since 0.1.0
127
128
  def locals
128
- @locals || @scope.locals
129
+ Utils::Hash.deep_dup(@locals || @scope.locals)
129
130
  end
130
131
 
131
132
  # It tries to invoke a method for the view or a local for the given key.
@@ -206,6 +207,7 @@ module Hanami
206
207
  end
207
208
 
208
209
  protected
210
+
209
211
  # Forward all the missing methods to the view scope or to the layout.
210
212
  #
211
213
  # @api private
@@ -228,9 +230,11 @@ module Hanami
228
230
  # that we want to be frozen in the future
229
231
  #
230
232
  # See https://github.com/hanami/view/issues/130#issuecomment-319326236
231
- if @scope.respond_to?(m, true)
233
+ if @scope.respond_to?(m, true) && @scope.locals.has_key?(m) && layout.respond_to?(m, true)
234
+ layout.__send__(m, *args, &blk)
235
+ elsif @scope.respond_to?(m, true)
232
236
  @scope.__send__(m, *args, &blk)
233
- elsif layout.respond_to?(m)
237
+ elsif layout.respond_to?(m, true)
234
238
  layout.__send__(m, *args, &blk)
235
239
  else
236
240
  ::Hanami::View::Escape.html(super)
@@ -249,13 +253,14 @@ module Hanami
249
253
  end
250
254
 
251
255
  private
256
+
252
257
  # @api private
253
258
  def _options(options)
254
- options.dup.tap do |opts|
255
- opts.merge!(format: format)
256
- opts[:locals] = locals
257
- opts[:locals].merge!(options.fetch(:locals){ ::Hash.new })
259
+ current_locals = locals.reject do |key, _|
260
+ @scope.respond_to?(key, true) &&
261
+ (layout.respond_to?(key, true) || @scope.view.respond_to?(:name, true))
258
262
  end
263
+ Options.build(options, current_locals, format)
259
264
  end
260
265
 
261
266
  # @since 0.4.2
@@ -7,7 +7,7 @@ module Hanami
7
7
  #
8
8
  # A common scenario is for non-html requests.
9
9
  # Usually we have a template for the application layout
10
- # (eg `templates/application.html.erb`), but we don't use to have the a
10
+ # (eg `templates/application.html.erb`), but we don't use to have the
11
11
  # template for JSON requests (eg `templates/application.json.erb`).
12
12
  # Because most of the times, we only return the output of the view.
13
13
  #
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "hanami/utils/hash"
4
+
5
+ module Hanami
6
+ module View
7
+ module Rendering
8
+ # Rendering options
9
+ #
10
+ # @since 1.1.1
11
+ # @api private
12
+ class Options
13
+ # @since 1.1.1
14
+ # @api private
15
+ def self.build(options, locals, format)
16
+ Utils::Hash.deep_dup(options).tap do |opts|
17
+ opts[:format] = format
18
+ opts[:locals] = locals
19
+ opts[:locals].merge!(options.fetch(:locals) { ::Hash.new }).merge!(format: format)
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -47,12 +47,6 @@ module Hanami
47
47
  [view_template_dir, template_name].join(separator)
48
48
  end
49
49
 
50
- # @since 0.4.3
51
- # @api private
52
- def partial_template_under_view_path
53
- _find(view_template_dir).first
54
- end
55
-
56
50
  # @since 0.4.3
57
51
  # @api private
58
52
  def view_template_dir
@@ -6,7 +6,7 @@ require 'hanami/view/rendering/partial'
6
6
  module Hanami
7
7
  module View
8
8
  module Rendering
9
- # Rendering scope
9
+ # Rendering view scope
10
10
  #
11
11
  # @since 0.1.0
12
12
  #
@@ -66,6 +66,7 @@ module Hanami
66
66
  end
67
67
 
68
68
  protected
69
+
69
70
  # @api private
70
71
  def method_missing(m, *args, &block)
71
72
  ::Hanami::View::Escape.html(
@@ -85,6 +86,13 @@ module Hanami
85
86
 
86
87
  private
87
88
 
89
+ # @since 1.1.1
90
+ # @api private
91
+ def _options(options)
92
+ current_locals = locals.reject { |key, _| @view.respond_to?(key) }
93
+ Options.build(options, current_locals, format)
94
+ end
95
+
88
96
  # @since 0.4.2
89
97
  # @api private
90
98
  def layout
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "hanami/view/rendering/scope"
4
+ require "hanami/view/rendering/options"
5
+
6
+ module Hanami
7
+ module View
8
+ module Rendering
9
+ # Rendering subscope
10
+ #
11
+ # @since 1.1.1
12
+ # @api private
13
+ #
14
+ # @see Hanami::View::Rendering::Scope
15
+ class Subscope < Scope
16
+ # Implements "respond to" logic
17
+ #
18
+ # @return [TrueClass,FalseClass]
19
+ #
20
+ # @since 1.1.1
21
+ # @api private
22
+ #
23
+ # @see http://ruby-doc.org/core/Object.html#method-i-respond_to_missing-3F
24
+ def respond_to_missing?(m, _include_all)
25
+ @locals.key?(m)
26
+ end
27
+
28
+ protected
29
+
30
+ # @since 1.1.1
31
+ # @api private
32
+ def method_missing(m, *args, &block)
33
+ ::Hanami::View::Escape.html(
34
+ # FIXME: this isn't compatible with Hanami 2.0, as it extends a view
35
+ # that we want to be frozen in the future
36
+ #
37
+ # See https://github.com/hanami/view/issues/130#issuecomment-319326236
38
+ if @locals.key?(m)
39
+ @locals[m]
40
+ else
41
+ super
42
+ end
43
+ )
44
+ end
45
+
46
+ private
47
+
48
+ # @since 1.1.1
49
+ # @api private
50
+ def _options(options)
51
+ Options.build(options, locals, format)
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -52,7 +52,7 @@ module Hanami
52
52
 
53
53
  # @api private
54
54
  def scope
55
- Scope.new(@view, @options[:locals])
55
+ Subscope.new(@view, @options[:locals])
56
56
  end
57
57
 
58
58
  # @since 0.5.0
@@ -3,6 +3,6 @@ module Hanami
3
3
  # Defines the version
4
4
  #
5
5
  # @since 0.1.0
6
- VERSION = '1.1.0'.freeze
6
+ VERSION = '1.1.1'.freeze
7
7
  end
8
8
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hanami-view
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Luca Guidi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-10-25 00:00:00.000000000 Z
11
+ date: 2018-02-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: tilt
@@ -113,12 +113,14 @@ files:
113
113
  - lib/hanami/view/rendering/null_layout.rb
114
114
  - lib/hanami/view/rendering/null_local.rb
115
115
  - lib/hanami/view/rendering/null_template.rb
116
+ - lib/hanami/view/rendering/options.rb
116
117
  - lib/hanami/view/rendering/partial.rb
117
118
  - lib/hanami/view/rendering/partial_file.rb
118
119
  - lib/hanami/view/rendering/partial_finder.rb
119
120
  - lib/hanami/view/rendering/partial_templates_finder.rb
120
121
  - lib/hanami/view/rendering/registry.rb
121
122
  - lib/hanami/view/rendering/scope.rb
123
+ - lib/hanami/view/rendering/subscope.rb
122
124
  - lib/hanami/view/rendering/template.rb
123
125
  - lib/hanami/view/rendering/template_finder.rb
124
126
  - lib/hanami/view/rendering/template_name.rb
@@ -146,7 +148,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
146
148
  version: '0'
147
149
  requirements: []
148
150
  rubyforge_project:
149
- rubygems_version: 2.6.13
151
+ rubygems_version: 2.7.5
150
152
  signing_key:
151
153
  specification_version: 4
152
154
  summary: View layer for Hanami, with a separation between views and templates