hanami-view 0.6.1 → 0.7.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: 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: