hanami-view 0.6.1 → 0.7.0

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: 2814a76015d67720fc54b6aab3acb54cce7f65a4
4
- data.tar.gz: db8a5cb5b152d93e837d7a3bddd7e755d85db277
3
+ metadata.gz: b6a48a9095b6dda0e7238dd8f80aedb4b0aaa8df
4
+ data.tar.gz: b36841002e5ed8e5145a1dbd23adb32b0612fecf
5
5
  SHA512:
6
- metadata.gz: 2132c9ae9e477ee2f99bdd71e7596946bb4fa69d1d6dde525b325df11e2859bfe0186f5b972a0942c21acb5f4e1d7e64b2c7d84ca761600f2af29e78db7490d1
7
- data.tar.gz: b9de16d5e18f760165b367b042b69a0a21a079d61d9b894512295f9fd5192cd65a5df9c4d243242a59352267fa818f04005d52f76c5cf918200c943740fde20c
6
+ metadata.gz: 57e9f5bc86fa2416826ae4a705ae0367d70b635f62ab1382e085f04cc3273d184212e45810aad3b53a5dcd82c1381f040e552ea97f06f48b6e6c6acd8b18e84a
7
+ data.tar.gz: b8973574e56dfe4380d55bca46db9542b7bd559f2bd2e5591c8cb1a79b6b3dceb778ebb9f0d72c0b0a92f8ad1090392af421b40ae1536acb87a3152395b634d7
data/CHANGELOG.md CHANGED
@@ -1,6 +1,19 @@
1
1
  # Hanami::View
2
2
  View layer for Hanami
3
3
 
4
+ ## v0.7.0 - 2016-07-22
5
+ ### Added
6
+ - [Luca Guidi] Introduced `#local` for views, layouts and templates. It allows to safely access locals without raising errors in case the referenced local is missing.
7
+
8
+ ### Fixed
9
+ - [nessur] Find the correct partial in case of deeply nested templates.
10
+ - [Marcello Rocha] Ensure `Hanami::Presenter` to respect method visibility of wrapped object.
11
+ - [Luca Guidi] Ensure to use new registry when loading the framework
12
+
13
+ ### Changed
14
+ – [Luca Guidi] Drop support for Ruby 2.0 and 2.1. Official support for JRuby 9.0.5.0+.
15
+ – [Luca Guidi] Deprecate `#content` in favor of `#local`.
16
+
4
17
  ## v0.6.1 - 2016-02-05
5
18
  ### Changed
6
19
  - [Steve Hook] Preload partial templates in order to boost performances for partials rendering (2x faster)
data/README.md CHANGED
@@ -472,10 +472,12 @@ As per convention, layout templates are located under `Hanami::View.root` or `Ap
472
472
 
473
473
  ### Optional Content
474
474
 
475
- If we want to render optional contents such as sidebar links or page specific javascripts, we can use `#content`
475
+ #### Optional View Methods
476
+
477
+ If we want to render optional contents such as sidebar links or page specific javascripts, we can use `#local`
476
478
  It accepts a key that represents a method that should be available within the rendering context.
477
479
  That context is made of the locals, and the methods that view and layout respond to.
478
- If the context can't dispatch that method, it returns `nil`.
480
+ If the context can't dispatch that method, it returns returns a null object (`Hanami::View::Rendering::NullLocal`).
479
481
 
480
482
  Given the following layout template.
481
483
 
@@ -485,14 +487,14 @@ Given the following layout template.
485
487
  <!-- ... -->
486
488
  <body>
487
489
  <!-- ... -->
488
- <%= content :footer %>
490
+ <%= local :footer %>
489
491
  </body>
490
492
  </html>
491
493
  ```
492
494
 
493
495
  We have two views, one responds to `#footer` (`Products::Show`) and the other doesn't (`Products::Index`).
494
- When the first is rendered, `content` gives back the returning value of `#footer`.
495
- In the other case, `content` returns `nil`.
496
+ When the first is rendered, `local` gives back the returning value of `#footer`.
497
+ In the other case, `local` returns a null object (`Hanami::View::Rendering::NullLocal`).
496
498
 
497
499
  ```ruby
498
500
  module Products
@@ -510,6 +512,20 @@ module Products
510
512
  end
511
513
  ```
512
514
 
515
+ #### Optional Locals
516
+
517
+ If we want to show announcements to our customers, but we want only load them from the database if there is something to show.
518
+ This is an optional local.
519
+
520
+ ```erb
521
+ <% if local(:announcement).show? %>
522
+ <h2><%= announcement.message %></h2>
523
+ <% end %>
524
+ ```
525
+
526
+ The first line is safely evaluated in all the cases: if announcement is present or not.
527
+ In case we enter the `if` statement, we're sure we can safely reference that object.
528
+
513
529
  ### Presenters
514
530
 
515
531
  The goal of a presenter is to wrap and reuse presentational logic for an object.
data/hanami-view.gemspec CHANGED
@@ -17,12 +17,12 @@ Gem::Specification.new do |spec|
17
17
  spec.executables = []
18
18
  spec.test_files = spec.files.grep(%r{^(test)/})
19
19
  spec.require_paths = ['lib']
20
- spec.required_ruby_version = '>= 2.0.0'
20
+ spec.required_ruby_version = '>= 2.2.0'
21
21
 
22
22
  spec.add_runtime_dependency 'tilt', '~> 2.0', '>= 2.0.1'
23
- spec.add_runtime_dependency 'hanami-utils', '~> 0.7'
23
+ spec.add_runtime_dependency 'hanami-utils', '~> 0.8'
24
24
 
25
25
  spec.add_development_dependency 'bundler', '~> 1.5'
26
26
  spec.add_development_dependency 'minitest', '~> 5'
27
- spec.add_development_dependency 'rake', '~> 10'
27
+ spec.add_development_dependency 'rake', '~> 11'
28
28
  end
data/lib/hanami/layout.rb CHANGED
@@ -93,6 +93,7 @@ module Hanami
93
93
  end
94
94
 
95
95
  protected
96
+
96
97
  # Loading mechanism hook.
97
98
  #
98
99
  # @api private
@@ -100,9 +101,16 @@ module Hanami
100
101
  #
101
102
  # @see Hanami::View.load!
102
103
  def load!
103
- registry.freeze
104
+ load_registry!
104
105
  configuration.freeze
105
106
  end
107
+
108
+ private
109
+
110
+ def load_registry!
111
+ @registry = nil
112
+ registry.freeze
113
+ end
106
114
  end
107
115
 
108
116
  # Initialize a layout
@@ -90,37 +90,9 @@ module Hanami
90
90
  #
91
91
  # @see Hanami::View::Escape
92
92
  def self.included(base)
93
- base.extend ::Hanami::View::Escape
94
- end
95
-
96
- # Initialize the presenter
97
- #
98
- # @param object [Object] the object to present
99
- #
100
- # @since 0.1.0
101
- def initialize(object)
102
- @object = object
103
- end
104
-
105
- protected
106
- # Override Ruby's method_missing
107
- #
108
- # @api private
109
- # @since 0.1.0
110
- def method_missing(m, *args, &blk)
111
- if @object.respond_to?(m)
112
- ::Hanami::View::Escape.html(@object.__send__(m, *args, &blk))
113
- else
114
- super
93
+ base.class_eval do
94
+ include ::Hanami::View::Escape::Presentable
115
95
  end
116
96
  end
117
-
118
- # Override Ruby's respond_to_missing? in order to support proper delegation
119
- #
120
- # @api private
121
- # @since 0.3.0
122
- def respond_to_missing?(m, include_private = false)
123
- @object.respond_to?(m, include_private)
124
- end
125
97
  end
126
98
  end
@@ -427,7 +427,7 @@ module Hanami
427
427
  # Load partials for each partial template file found under the
428
428
  # given load paths
429
429
  #
430
- # @since x.x.x
430
+ # @since 0.7.0
431
431
  # @api private
432
432
  def load_partials!
433
433
  Hanami::View::Rendering::PartialTemplatesFinder.new(self).find.each do |partial|
@@ -438,7 +438,7 @@ module Hanami
438
438
  # Load partials for each partial template file found under the
439
439
  # given load paths
440
440
  #
441
- # @since x.x.x
441
+ # @since 0.7.0
442
442
  # @api private
443
443
  def find_partial(relative_partial_path, template_name, format)
444
444
  partials_for_view = partials.has_key?(relative_partial_path) ? partials[relative_partial_path] : partials[template_name]
@@ -447,7 +447,7 @@ module Hanami
447
447
 
448
448
  # Add a partial to the registry
449
449
  #
450
- # @since x.x.x
450
+ # @since 0.7.0
451
451
  # @api private
452
452
  def add_partial(partial)
453
453
  @partials[partial.key][partial.format.to_sym] = partial.template
@@ -76,7 +76,7 @@ module Hanami
76
76
  # Articles::JsonShow.format # => :json
77
77
  def format(value = nil)
78
78
  if value.nil?
79
- @format
79
+ @format ||= nil
80
80
  else
81
81
  @format = value
82
82
  end
@@ -314,6 +314,7 @@ module Hanami
314
314
  # Articles::Show.layout # => Hanami::View::Rendering::NullLayout
315
315
  def layout(value = nil)
316
316
  if value.nil?
317
+ @layout ||= nil
317
318
  @_layout ||= Rendering::LayoutFinder.find(@layout || configuration.layout, configuration.namespace)
318
319
  elsif !value
319
320
  @layout = Hanami::View::Rendering::NullLayout
@@ -1,5 +1,4 @@
1
1
  require 'hanami/utils/escape'
2
- require 'hanami/presenter'
3
2
 
4
3
  module Hanami
5
4
  module View
@@ -9,6 +8,7 @@ module Hanami
9
8
  module Escape
10
9
  module InstanceMethods
11
10
  private
11
+
12
12
  # Mark the given string as safe to render.
13
13
  #
14
14
  # !!! ATTENTION !!! This may open your application to XSS attacks.
@@ -119,6 +119,49 @@ module Hanami
119
119
  end
120
120
  end
121
121
 
122
+ module Presentable
123
+ # Inject escape logic into the given class.
124
+ #
125
+ # @since 0.7.0
126
+ # @api private
127
+ #
128
+ # @see Hanami::View::Escape
129
+ def self.included(base)
130
+ base.extend ::Hanami::View::Escape
131
+ end
132
+
133
+ # Initialize the presenter
134
+ #
135
+ # @param object [Object] the object to present
136
+ #
137
+ # @since 0.7.0
138
+ def initialize(object)
139
+ @object = object
140
+ end
141
+
142
+ protected
143
+
144
+ # Override Ruby's method_missing
145
+ #
146
+ # @api private
147
+ # @since 0.7.0
148
+ def method_missing(m, *args, &blk)
149
+ if @object.respond_to?(m)
150
+ ::Hanami::View::Escape.html(@object.__send__(m, *args, &blk))
151
+ else
152
+ super
153
+ end
154
+ end
155
+
156
+ # Override Ruby's respond_to_missing? in order to support proper delegation
157
+ #
158
+ # @api private
159
+ # @since 0.3.0
160
+ def respond_to_missing?(m, include_private = false)
161
+ @object.respond_to?(m, include_private)
162
+ end
163
+ end
164
+
122
165
  # Auto escape presenter
123
166
  #
124
167
  # @since 0.4.0
@@ -126,7 +169,7 @@ module Hanami
126
169
  #
127
170
  # @see Hanami::View::Escape::InstanceMethods#_escape
128
171
  class Presenter
129
- include ::Hanami::Presenter
172
+ include Presentable
130
173
  end
131
174
 
132
175
  # Escape the given input if it's a string, otherwise return the oject as it is.
@@ -165,10 +208,14 @@ module Hanami
165
208
  # @since 0.4.0
166
209
  # @api private
167
210
  def method_added(method_name)
211
+ visibility = :public
212
+ visibility = :private if private_method_defined? method_name
213
+ visibility = :protected if protected_method_defined? method_name
214
+
168
215
  unless autoescape_methods[method_name]
169
216
  prepend Module.new {
170
217
  module_eval %{
171
- def #{ method_name }(*args, &blk); ::Hanami::View::Escape.html super; end
218
+ #{ visibility } def #{ method_name }(*args, &blk); ::Hanami::View::Escape.html super; end
172
219
  }
173
220
  }
174
221
 
@@ -1,5 +1,6 @@
1
1
  require 'hanami/view/rendering/registry'
2
2
  require 'hanami/view/rendering/scope'
3
+ require 'hanami/view/rendering/null_local'
3
4
 
4
5
  module Hanami
5
6
  module View
@@ -104,6 +105,25 @@ module Hanami
104
105
  layout.render
105
106
  end
106
107
 
108
+ # It tries to invoke a method for the view or a local for the given key.
109
+ # If the lookup fails, it returns a null object.
110
+ #
111
+ # @return [Objeect,Hanami::View::Rendering::NullLocal] the returning value
112
+ #
113
+ # @since 0.7.0
114
+ #
115
+ # @example
116
+ # <% if local(:plan).overdue? %>
117
+ # <h2>Your plan is overdue.</h2>
118
+ # <% end %>
119
+ def local(key)
120
+ if respond_to?(key)
121
+ __send__(key)
122
+ else
123
+ locals.fetch(key) { NullLocal.new(key) }
124
+ end
125
+ end
126
+
107
127
  protected
108
128
  # The output of the template rendering process.
109
129
  #
@@ -246,7 +266,7 @@ module Hanami
246
266
  # @see Hanami::View.load!
247
267
  def load!
248
268
  super
249
- registry.freeze
269
+ load_registry!
250
270
  end
251
271
 
252
272
  private
@@ -260,6 +280,11 @@ module Hanami
260
280
  def registry
261
281
  @registry ||= Registry.new(self)
262
282
  end
283
+
284
+ def load_registry!
285
+ @registry = nil
286
+ registry.freeze
287
+ end
263
288
  end
264
289
  end
265
290
  end
@@ -1,4 +1,6 @@
1
+ require 'hanami/view/rendering/null_local'
1
2
  require 'hanami/utils/escape'
3
+ require 'hanami/utils/deprecation'
2
4
 
3
5
  module Hanami
4
6
  module View
@@ -16,7 +18,10 @@ module Hanami
16
18
  # @api private
17
19
  # @since 0.1.0
18
20
  def initialize(layout, scope)
19
- @layout, @scope = layout, scope
21
+ @layout = layout
22
+ @scope = scope
23
+ @view = nil
24
+ @locals = nil
20
25
  end
21
26
 
22
27
  # Returns the classname as string
@@ -122,6 +127,7 @@ module Hanami
122
127
  # @return [String,NilClass] returning content if scope respond to the
123
128
  # requested method
124
129
  #
130
+ # @deprecated Use {#local} instead
125
131
  # @since 0.4.1
126
132
  #
127
133
  # @example
@@ -157,9 +163,62 @@ module Hanami
157
163
  # end
158
164
  # end
159
165
  def content(key)
166
+ Utils::Deprecation.new("#content is deprecated, please use #local")
160
167
  __send__(key) if respond_to?(key)
161
168
  end
162
169
 
170
+ # It tries to invoke a method for the view or a local for the given key.
171
+ # If the lookup fails, it returns a null object.
172
+ #
173
+ # @return [Objeect,Hanami::View::Rendering::NullLocal] the returning value
174
+ #
175
+ # @since 0.7.0
176
+ #
177
+ # @example Safe method navigation
178
+ # <% if local(:plan).overdue? %>
179
+ # <h2>Your plan is overdue.</h2>
180
+ # <% end %>
181
+ #
182
+ # @example Optional Contents
183
+ # # Given the following layout template
184
+ #
185
+ # <!doctype HTML>
186
+ # <html>
187
+ # <!-- ... -->
188
+ # <body>
189
+ # <!-- ... -->
190
+ # <%= local :footer %>
191
+ # </body>
192
+ # </html>
193
+ #
194
+ # # Case 1:
195
+ # # Products::Index doesn't respond to #footer, local will return nil
196
+ # #
197
+ # # Case 2:
198
+ # # Products::Show responds to #footer, local will send back
199
+ # # #footer returning value
200
+ #
201
+ # module Products
202
+ # class Index
203
+ # include Hanami::View
204
+ # end
205
+ #
206
+ # class Show
207
+ # include Hanami::View
208
+ #
209
+ # def footer
210
+ # "contents for footer"
211
+ # end
212
+ # end
213
+ # end
214
+ def local(key)
215
+ if respond_to?(key)
216
+ __send__(key)
217
+ else
218
+ locals.fetch(key) { NullLocal.new(key) }
219
+ end
220
+ end
221
+
163
222
  # Implements "respond to" logic
164
223
  #
165
224
  # @return [TrueClass,FalseClass]
@@ -0,0 +1,74 @@
1
+ require 'hanami/utils/basic_object'
2
+
3
+ module Hanami
4
+ module View
5
+ module Rendering
6
+ # Null local
7
+ #
8
+ # @since 0.7.0
9
+ #
10
+ # @see Hanami::View::Rendering#local
11
+ class NullLocal < Utils::BasicObject
12
+ # @since 0.7.0
13
+ # @api private
14
+ TO_STR = "".freeze
15
+
16
+ # @since 0.7.0
17
+ # @api private
18
+ def initialize(local)
19
+ @local = local
20
+ end
21
+
22
+ # @since 0.7.0
23
+ def all?
24
+ false
25
+ end
26
+
27
+ # @since 0.7.0
28
+ def any?
29
+ false
30
+ end
31
+
32
+ # @since 0.7.0
33
+ def empty?
34
+ true
35
+ end
36
+
37
+ # @since 0.7.0
38
+ def nil?
39
+ true
40
+ end
41
+
42
+ # @since 0.7.0
43
+ # @api private
44
+ def to_str
45
+ TO_STR
46
+ end
47
+
48
+ # @since 0.7.0
49
+ # @api private
50
+ def method_missing(m, *)
51
+ if m.match(/\?\z/)
52
+ false
53
+ else
54
+ self.class.new("#{ @local }.#{ m }")
55
+ end
56
+ end
57
+
58
+ private
59
+
60
+ # @since 0.7.0
61
+ # @api private
62
+ def respond_to_missing?(method_name, include_all)
63
+ true
64
+ end
65
+
66
+ # @since 0.7.0
67
+ # @api private
68
+ def __inspect
69
+ " :#{ @local }"
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -1,12 +1,12 @@
1
1
  module Hanami
2
2
  module View
3
3
  module Rendering
4
- # @since x.x.x
4
+ # @since 0.7.0
5
5
  # @api private
6
6
  class PartialFile
7
7
  attr_reader :key, :format, :template
8
8
 
9
- # @since x.x.x
9
+ # @since 0.7.0
10
10
  # @api private
11
11
  def initialize(key, format, template)
12
12
  @key = key
@@ -41,7 +41,7 @@ module Hanami
41
41
 
42
42
  protected
43
43
 
44
- # @since x.x.x
44
+ # @since 0.7.0
45
45
  # @api private
46
46
  def relative_partial_path
47
47
  [view_template_dir, template_name].join(separator)
@@ -7,18 +7,18 @@ module Hanami
7
7
  # Find partial templates in the file system
8
8
  #
9
9
  # @api private
10
- # @since x.x.x
10
+ # @since 0.7.0
11
11
  #
12
12
  # @see View::Template
13
13
  class PartialTemplatesFinder
14
14
  # Search pattern for partial file names
15
15
  #
16
16
  # @api private
17
- # @since x.x.x
17
+ # @since 0.7.0
18
18
  PARTIAL_PATTERN = '_*'.freeze
19
19
 
20
20
  # @api private
21
- # @since x.x.x
21
+ # @since 0.7.0
22
22
  PARTIAL_PARTS_SEPARATOR = '.'.freeze
23
23
 
24
24
  attr_reader :configuration
@@ -27,7 +27,7 @@ module Hanami
27
27
  #
28
28
  # @param configuration [Configuration] the configuration object
29
29
  #
30
- # @since x.x.x
30
+ # @since 0.7.0
31
31
  def initialize(configuration)
32
32
  @configuration = configuration
33
33
  end
@@ -36,7 +36,7 @@ module Hanami
36
36
  #
37
37
  # @return [Array] array of PartialFinder objects
38
38
  #
39
- # @since x.x.x
39
+ # @since 0.7.0
40
40
  def find
41
41
  _find_partials(configuration.root).map do |template|
42
42
  partial_path, partial_base_name = Pathname(template).relative_path_from(configuration.root).split
@@ -58,7 +58,7 @@ module Hanami
58
58
  #
59
59
  # @return [Array] an array of strings for each matching partial template file found
60
60
  #
61
- # @since x.x.x
61
+ # @since 0.7.0
62
62
  # @api private
63
63
  def _find_partials(path)
64
64
  Dir.glob("#{ [path, TemplatesFinder::RECURSIVE, PARTIAL_PATTERN].join(::File::SEPARATOR) }.#{TemplatesFinder::FORMAT}.#{TemplatesFinder::ENGINES}")
@@ -21,7 +21,10 @@ module Hanami
21
21
  # @api private
22
22
  # @since 0.1.0
23
23
  def initialize(view, locals = {})
24
- @view, @locals, @layout = view, locals, layout
24
+ @view = view
25
+ @locals = locals
26
+ @layout = layout
27
+ @scope = nil
25
28
  end
26
29
 
27
30
  # Returns an inspect String
@@ -78,8 +78,23 @@ module Hanami
78
78
 
79
79
  # @api private
80
80
  # @since 0.4.3
81
+ #
82
+ # Searches first for files at `../templates/articles/index.*.*`
83
+ # If none are found, falls back to recursive search in `../templates/**/articles/index.*.*`
84
+ #
81
85
  def _find(lookup = search_path)
82
- Dir.glob( "#{ [root, lookup, template_name].join(separator) }.#{ format }.#{ engines }" )
86
+ base_path = templates_path(root, template_name)
87
+ if base_path.none?
88
+ templates_path(root, lookup, template_name)
89
+ else
90
+ base_path
91
+ end
92
+ end
93
+
94
+ # @api private
95
+ # @since 0.7.0
96
+ def templates_path(*parts)
97
+ Dir.glob("#{ parts.join(separator) }.#{ format }.#{ engines }")
83
98
  end
84
99
 
85
100
  # @api private
@@ -3,6 +3,6 @@ module Hanami
3
3
  # Defines the version
4
4
  #
5
5
  # @since 0.1.0
6
- VERSION = '0.6.1'.freeze
6
+ VERSION = '0.7.0'.freeze
7
7
  end
8
8
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hanami-view
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.1
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Luca Guidi
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2016-02-05 00:00:00.000000000 Z
13
+ date: 2016-07-22 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: tilt
@@ -38,14 +38,14 @@ dependencies:
38
38
  requirements:
39
39
  - - "~>"
40
40
  - !ruby/object:Gem::Version
41
- version: '0.7'
41
+ version: '0.8'
42
42
  type: :runtime
43
43
  prerelease: false
44
44
  version_requirements: !ruby/object:Gem::Requirement
45
45
  requirements:
46
46
  - - "~>"
47
47
  - !ruby/object:Gem::Version
48
- version: '0.7'
48
+ version: '0.8'
49
49
  - !ruby/object:Gem::Dependency
50
50
  name: bundler
51
51
  requirement: !ruby/object:Gem::Requirement
@@ -80,14 +80,14 @@ dependencies:
80
80
  requirements:
81
81
  - - "~>"
82
82
  - !ruby/object:Gem::Version
83
- version: '10'
83
+ version: '11'
84
84
  type: :development
85
85
  prerelease: false
86
86
  version_requirements: !ruby/object:Gem::Requirement
87
87
  requirements:
88
88
  - - "~>"
89
89
  - !ruby/object:Gem::Version
90
- version: '10'
90
+ version: '11'
91
91
  description: View layer for Hanami
92
92
  email:
93
93
  - me@lucaguidi.com
@@ -115,6 +115,7 @@ files:
115
115
  - lib/hanami/view/rendering/layout_registry.rb
116
116
  - lib/hanami/view/rendering/layout_scope.rb
117
117
  - lib/hanami/view/rendering/null_layout.rb
118
+ - lib/hanami/view/rendering/null_local.rb
118
119
  - lib/hanami/view/rendering/null_template.rb
119
120
  - lib/hanami/view/rendering/partial.rb
120
121
  - lib/hanami/view/rendering/partial_file.rb
@@ -141,7 +142,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
141
142
  requirements:
142
143
  - - ">="
143
144
  - !ruby/object:Gem::Version
144
- version: 2.0.0
145
+ version: 2.2.0
145
146
  required_rubygems_version: !ruby/object:Gem::Requirement
146
147
  requirements:
147
148
  - - ">="
@@ -149,9 +150,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
149
150
  version: '0'
150
151
  requirements: []
151
152
  rubyforge_project:
152
- rubygems_version: 2.5.1
153
+ rubygems_version: 2.6.4
153
154
  signing_key:
154
155
  specification_version: 4
155
156
  summary: View layer for Hanami, with a separation between views and templates
156
157
  test_files: []
157
- has_rdoc: