impression 0.9 → 0.10

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
  SHA256:
3
- metadata.gz: 565e43b51b9cd953d870b6bddf4542eae8c88a2467c79dc251a8c1e350cb13b8
4
- data.tar.gz: ad661f50dfa8c35c96a83d5d3ad4d3f6d3ef97dc8d23a8aabde737ac925cf720
3
+ metadata.gz: 718a8a8eba181a00e5519e970d34bfc2e666ea15bacf0e72bffba450f3c9788d
4
+ data.tar.gz: fd665341a6fdcf66af4c564a269022f5fce014243a8736cf228188f9b3ca3e1f
5
5
  SHA512:
6
- metadata.gz: f522619bb82ae14ad5856b8b6374b4ac30493dabc7550956b666adf46f64f1dc6db3d650583a07d98f21243550ef4e5908400191351dad2decde4d05240ff03c
7
- data.tar.gz: 4397c5a63f0578c5be1ca0b1b8187f0de3890c5c41caf00adb7ec89b799c0576d917a704869d42b92681396a544882f87780d784d5861fb96abc691019954e4a
6
+ metadata.gz: 32ce3395a8f74e463b935e48711ae2b3fccd756b1bd3ec11912539ed2d969e0691dc044933548c5321a89749ad4faf3ddfc546958a83716d339b6fbeea0739b8
7
+ data.tar.gz: c33b519b8fd5a2a5da76e0d1a4a78854a0178dee62d90b143bf7cd8358150e69127af9d42832cb6158b41835cf6fa08cb6fc3efc09d0caa437e03b1e43722cde
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## 0.10 2022-02-10
2
+
3
+ - Add support for resource modules in Jamstack (#13)
4
+ - Add convenience methods for creating resources (#12)
5
+ - Accept block for setting default request handler in Resource.new (#11)
6
+
1
7
  ## 0.9 2022-02-05
2
8
 
3
9
  - Update Papercraft
data/Gemfile.lock CHANGED
@@ -1,12 +1,12 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- impression (0.9)
4
+ impression (0.10)
5
5
  modulation (~> 1.1)
6
6
  papercraft (~> 0.19)
7
- polyphony (~> 0.74)
8
- qeweney (~> 0.16)
9
- tipi (~> 0.47)
7
+ polyphony (~> 0.77)
8
+ qeweney (~> 0.17)
9
+ tipi (~> 0.49)
10
10
 
11
11
  GEM
12
12
  remote: https://rubygems.org/
@@ -57,8 +57,8 @@ GEM
57
57
  kramdown (~> 2.3.1)
58
58
  kramdown-parser-gfm (~> 1.1.0)
59
59
  rouge (~> 3.27.0)
60
- polyphony (0.75)
61
- qeweney (0.16)
60
+ polyphony (0.77)
61
+ qeweney (0.17)
62
62
  escape_utils (~> 1.2.1)
63
63
  rack (2.2.3)
64
64
  rake (12.3.3)
@@ -70,16 +70,16 @@ GEM
70
70
  json (>= 1.8, < 3)
71
71
  simplecov-html (~> 0.10.0)
72
72
  simplecov-html (0.10.2)
73
- tipi (0.47)
74
- acme-client (~> 2.0.8)
73
+ tipi (0.49)
74
+ acme-client (~> 2.0.9)
75
75
  ever (~> 0.1)
76
76
  extralite (~> 1.2)
77
77
  h1p (~> 0.3)
78
78
  http-2 (~> 0.11)
79
79
  localhost (~> 1.1.4)
80
80
  msgpack (~> 1.4.2)
81
- polyphony (~> 0.71)
82
- qeweney (~> 0.14)
81
+ polyphony (~> 0.77)
82
+ qeweney (~> 0.16)
83
83
  rack (>= 2.0.8, < 2.3.0)
84
84
  websocket (~> 1.2.8)
85
85
  websocket (1.2.9)
data/impression.gemspec CHANGED
@@ -20,9 +20,9 @@ Gem::Specification.new do |s|
20
20
  s.require_paths = ["lib"]
21
21
  s.required_ruby_version = '>= 2.6'
22
22
 
23
- s.add_runtime_dependency 'polyphony', '~>0.74'
24
- s.add_runtime_dependency 'tipi', '~>0.47'
25
- s.add_runtime_dependency 'qeweney', '~>0.16'
23
+ s.add_runtime_dependency 'polyphony', '~>0.77'
24
+ s.add_runtime_dependency 'tipi', '~>0.49'
25
+ s.add_runtime_dependency 'qeweney', '~>0.17'
26
26
 
27
27
  s.add_runtime_dependency 'papercraft', '~>0.19'
28
28
  s.add_runtime_dependency 'modulation', '~>1.1'
@@ -8,6 +8,8 @@ module Impression
8
8
  # `FileTree` implements a resource that maps to a static file hierarchy.
9
9
  class FileTree < Resource
10
10
 
11
+ attr_reader :directory
12
+
11
13
  # Initializes a `FileTree` resource.
12
14
  #
13
15
  # @param directory [String] static directory path
@@ -27,11 +29,11 @@ module Impression
27
29
  render_from_path_info(req, path_info)
28
30
  end
29
31
 
30
- # Renders a response from the given response kind and path.
32
+ # Renders a response from the given path info.
31
33
  #
32
34
  # @param req [Qeweney::Request] request
33
- # @param kind [Symbol] path kind (`:not_found` or `:file`)
34
- # @param path [String, nil] file path
35
+ # @param path_info [Hash] path info
36
+ # @return [void]
35
37
  def render_from_path_info(req, path_info)
36
38
  case path_info[:kind]
37
39
  when :not_found
@@ -39,7 +41,7 @@ module Impression
39
41
  when :file
40
42
  render_file(req, path_info)
41
43
  else
42
- raise "Invalid path info kind #{kind.inspect}"
44
+ raise "Invalid path info kind #{path_info[:kind].inspect}"
43
45
  end
44
46
  end
45
47
 
@@ -73,7 +75,11 @@ module Impression
73
75
  def calculate_path_info(path)
74
76
  full_path = File.join(@directory, path)
75
77
 
76
- path_info(full_path) || search_path_info_with_extension(full_path) || { kind: :not_found }
78
+ (
79
+ path_info(full_path) ||
80
+ search_path_info_with_extension(full_path) ||
81
+ { kind: :not_found }
82
+ )
77
83
  end
78
84
 
79
85
  # Returns the path info for the given path. If the path refers to a file,
@@ -57,8 +57,10 @@ module Impression
57
57
  atts, content = parse_markdown_file(path)
58
58
  info = info.merge(atts)
59
59
  info[:html_content] = Papercraft.markdown(content)
60
+ info[:kind] = :markdown
60
61
  when '.rb'
61
62
  info[:module] = import(path)
63
+ info[:kind] = :module
62
64
  end
63
65
  if (m = path.match(DATE_REGEXP))
64
66
  info[:date] ||= Date.parse(m[1])
@@ -82,29 +84,132 @@ module Impression
82
84
  relative_path == '/' ? absolute_path : File.join(absolute_path, relative_path)
83
85
  end
84
86
 
85
- # Renders a file response for the given request and the given path info.
86
- #
87
+ # Renders a response according to the given path info.
88
+ #
87
89
  # @param req [Qeweney::Request] request
88
90
  # @param path_info [Hash] path info
89
91
  # @return [void]
90
- def render_file(req, path_info)
91
- case path_info[:ext]
92
- when '.rb'
93
- render_papercraft_module(req, path_info)
94
- when '.md'
92
+ def render_from_path_info(req, path_info)
93
+ case (kind = path_info[:kind])
94
+ when :not_found
95
+ mod_path_info = up_tree_resource_module_path_info(req, path_info)
96
+ if mod_path_info
97
+ render_module(req, mod_path_info)
98
+ else
99
+ req.respond(nil, ':status' => Qeweney::Status::NOT_FOUND)
100
+ end
101
+ when :module
102
+ render_module(req, path_info)
103
+ when :markdown
95
104
  render_markdown_file(req, path_info)
105
+ when :file
106
+ render_file(req, path_info)
96
107
  else
97
- req.serve_file(path_info[:path])
108
+ raise "Invalid path info kind #{kind.inspect}"
98
109
  end
99
110
  end
100
111
 
101
- # Renders a Papercraft module. The module is loaded using Modulation.
112
+ # Returns the path info for an up-tree resource module, or false if not
113
+ # found. the :up_tree_resource_module_path_info KV can be either:
114
+ # - nil (default): up tree module search has not been performed.
115
+ # - false: no up tree module was found.
116
+ # - module path info: up tree module info (subsequent requests will be
117
+ # directly routed to the module).
102
118
  #
103
- # @param req [Qeweney::Request] reqest
119
+ # @param req [Qeweney::Request] request
120
+ # @param path_info [Hash] path info
121
+ # @return [Hash, false] up-tree resource module path info
122
+ def up_tree_resource_module_path_info(req, path_info)
123
+ if path_info[:up_tree_resource_module_path_info].nil?
124
+ if (mod_path_info = find_up_tree_resource_module(req, path_info))
125
+ path_info[:up_tree_resource_module_path_info] = mod_path_info
126
+ return mod_path_info;
127
+ else
128
+ path_info[:up_tree_resource_module_path_info] = false
129
+ return false
130
+ end
131
+ end
132
+ path_info[:up_tree_resource_module_path_info]
133
+ end
134
+
135
+ # Performs a recursive search for an up-tree resource module from the given
136
+ # path info. If a resource module is found up the tree, its path_info is
137
+ # returned, otherwise returns nil.
138
+ #
139
+ # @param req [Qeweney::Request] request
140
+ # @param path_info [Hash] path info
141
+ # @return [Hash, nil] up-tree resource module path info
142
+ def find_up_tree_resource_module(req, path_info)
143
+ relative_path = req.resource_relative_path
144
+
145
+ while relative_path != path
146
+ up_tree_path = File.expand_path('..', relative_path)
147
+ up_tree_path_info = get_path_info(up_tree_path)
148
+
149
+ case up_tree_path_info[:kind]
150
+ when :not_found
151
+ relative_path = up_tree_path
152
+ next
153
+ when :module
154
+ return up_tree_path_info
155
+ else
156
+ return nil
157
+ end
158
+ end
159
+ nil
160
+ end
161
+
162
+ # Renders a file response for the given request and the given path info,
163
+ # according to the file type.
164
+ #
165
+ # @param req [Qeweney::Request] request
166
+ # @param path_info [Hash] path info
167
+ # @return [void]
168
+ # def render_file(req, path_info)
169
+ # case path_info[:kind]
170
+ # else
171
+ # req.serve_file(path_info[:path])
172
+ # end
173
+ # end
174
+
175
+ # Renders a module. If the module is a Resource, it is mounted, and then the
176
+ # request is rerouted from the new resource and rendered. If the module is a
177
+ # Proc or a Papercraft::Template, it is rendered as such. Otherwise, an
178
+ # error is raised.
179
+ #
180
+ # @param req [Qeweney::Request] request
181
+ # @param path_info [Hash] path info
182
+ # @return [void]
183
+ def render_module(req, path_info)
184
+ # p render_module: path_info
185
+ case (mod = path_info[:module])
186
+ when Module
187
+ resource = mod.resource
188
+ resource.remount(self, path_info[:url])
189
+ # p path_info_url: path_info[:url], relative_path: req.resource_relative_path
190
+ relative_url = path_info[:url].gsub(/^#{path}/, '')
191
+ # p relative_url: relative_url
192
+ req.recalc_resource_relative_path(relative_url)
193
+ # p resource_relative_path: req.resource_relative_path
194
+ resource.route(req).call(req)
195
+ when Impression::Resource
196
+ mod.remount(self, path_info[:url])
197
+ req.recalc_resource_relative_path(path_info[:url])
198
+ mod.route(req).call(req)
199
+ when Proc, Papercraft::Template
200
+ render_papercraft_module(req, mod)
201
+ else
202
+ raise "Unsupported module type #{mod.class}"
203
+ end
204
+ end
205
+
206
+ # Renders a Papercraft module.
207
+ #
208
+ # @param mod [Module] Papercraft module
104
209
  # @param path_info [Hash] path info
105
210
  # @return [void]
106
- def render_papercraft_module(req, path_info)
107
- template = Papercraft.html(path_info[:module])
211
+ def render_papercraft_module(req, mod)
212
+ template = Papercraft.html(mod)
108
213
  body = template.render(request: req, resource: self)
109
214
  req.respond(body, 'Content-Type' => template.mime_type)
110
215
  end
@@ -31,7 +31,17 @@ module Impression
31
31
  #
32
32
  # @return [String]
33
33
  def resource_relative_path
34
- @resource_relative_path ||= path.dup
34
+ @resource_relative_path ||= path
35
+ end
36
+
37
+ # Recalculates the relative_path from the given base path
38
+ #
39
+ # @param base_path [String] base path
40
+ # @return [String] new relative path
41
+ def recalc_resource_relative_path(base_path)
42
+ @resource_relative_path = @resource_relative_path.gsub(
43
+ /^#{base_path}/, ''
44
+ )
35
45
  end
36
46
 
37
47
  private
@@ -26,18 +26,35 @@ module Impression
26
26
  # A hash mapping relative paths to child resources
27
27
  attr_reader :children
28
28
 
29
- # Initalizes a new resource instance.
29
+ # Initalizes a new resource instance. If a block is given, it is used as the
30
+ # request handler instead of the default one, which returns `404 NOT FOUND`.
30
31
  #
31
32
  # @param parent [Impression::Resource, nil] the parent resource (or nil)
32
33
  # @param path [String] the resource's relative path
34
+ # @param &block [Proc] default request handler
33
35
  # @return [void]
34
- def initialize(parent: nil, path:)
36
+ def initialize(parent: nil, path:, &block)
35
37
  @parent = parent
36
38
  @path = normalize_route_path(path)
37
39
  @route_regexp = @path == '/' ? nil : /^#{@path}(\/.*)?$/.freeze
38
40
  @children = {}
39
41
 
40
42
  @parent&.add_child(self)
43
+
44
+ if block
45
+ singleton_class.define_method(:call, &block)
46
+ end
47
+ end
48
+
49
+ # Remounts the resource on a different parent and path.
50
+ #
51
+ # @param parent [Resource, nil] new parent
52
+ # @param path [String] new path relative to new parent
53
+ # @return [void]
54
+ def remount(parent, path)
55
+ @parent&.remove_child(self)
56
+ @parent = parent
57
+ @path = normalize_route_path(path)
41
58
  end
42
59
 
43
60
  # Returns the resource's absolute path, according to its location in the
@@ -67,6 +84,15 @@ module Impression
67
84
  self
68
85
  end
69
86
 
87
+ # Removes a child reference from the children map.
88
+ #
89
+ # @param child [Impression::Resource] child resource
90
+ # @return [Impression::Resource] self
91
+ def remove_child(child)
92
+ @children.delete(child.path)
93
+ self
94
+ end
95
+
70
96
  # Responds to the given request by rendering a 404 Not found response.
71
97
  #
72
98
  # @param req [Qeweney::Request] request
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Impression
4
- VERSION = '0.9'
4
+ VERSION = '0.10'
5
5
  end
data/lib/impression.rb CHANGED
@@ -9,3 +9,34 @@ require_relative './impression/resource'
9
9
  require_relative './impression/file_tree'
10
10
  require_relative './impression/jamstack'
11
11
  require_relative './impression/app'
12
+
13
+ # The Impression module contains convenience methods for creating resources.
14
+ module Impression
15
+
16
+ # Creates a new `Impression::Resource` instance with the given parameters and
17
+ # block.
18
+ #
19
+ # @param path [String] resource path (defaults to `"/"`)
20
+ # @param **props [Hash] other resource properties
21
+ # @param &block [Proc] optional block for overriding default request handler
22
+ # @return [Impression::Resource] new resource
23
+ def self.resource(path: '/', **props, &block)
24
+ Resource.new(path: path, **props, &block)
25
+ end
26
+
27
+ # Creates a new `Impression::FileTree` instance with the given parameters.
28
+ #
29
+ # @param **props [Hash] properties
30
+ # @return [Impression::FileTree] new resource
31
+ def self.file_tree(path: '/', **props)
32
+ FileTree.new(path: path, **props)
33
+ end
34
+
35
+ # Creates a new `Impression::Jamstack` instance with the given parameters.
36
+ #
37
+ # @param **props [Hash] properties
38
+ # @return [Impression::Jamstack] new resource
39
+ def self.jamstack(path: '/', **props)
40
+ Jamstack.new(path: path, **props)
41
+ end
42
+ end
data/test/helper.rb CHANGED
@@ -41,6 +41,10 @@ module Minitest::Assertions
41
41
  end
42
42
 
43
43
  def assert_response exp_body, exp_content_type, req
44
+ status = req.response_status
45
+ msg = message(msg) { "Expected HTTP status 200 OK, but instead got #{status}" }
46
+ assert_equal 200, status, msg
47
+
44
48
  actual = req.response_body
45
49
  assert_equal exp_body.gsub("\n", ''), actual&.gsub("\n", '')
46
50
 
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ export :resource
4
+
5
+ def resource
6
+ Impression.resource { |req|
7
+ req.respond("Hello, #{req.query[:name]}!", 'Content-Type' => 'text/plain')
8
+ }
9
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ export :resource
4
+
5
+ def resource
6
+ Impression.jamstack(
7
+ directory: File.expand_path('..', __dir__)
8
+ )
9
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'helper'
4
+
5
+ class ImpressionModuleTest < MiniTest::Test
6
+ def test_resource_method
7
+ r1 = Impression.resource do |req|
8
+ req.respond('foobar', ':status' => Qeweney::Status::TEAPOT)
9
+ end
10
+
11
+ req = mock_req(':method' => 'GET', ':path' => '/')
12
+ r1.route_and_call(req)
13
+ assert_equal 'foobar', req.response_body
14
+ assert_equal Qeweney::Status::TEAPOT, req.response_status
15
+ end
16
+
17
+ def test_file_tree_method
18
+ r1 = Impression.file_tree(path: '/foo', directory: '/bar')
19
+
20
+ assert_kind_of Impression::FileTree, r1
21
+ assert_equal '/foo', r1.path
22
+ assert_equal '/bar', r1.directory
23
+ end
24
+
25
+ def test_jamstack_method
26
+ r1 = Impression.jamstack(path: '/foo', directory: '/bar')
27
+
28
+ assert_kind_of Impression::Jamstack, r1
29
+ assert_equal '/foo', r1.path
30
+ assert_equal '/bar', r1.directory
31
+ end
32
+ end
@@ -212,7 +212,7 @@ class JamstackTest < MiniTest::Test
212
212
  list = @jamstack.page_list('/')
213
213
  assert_equal [
214
214
  { kind: :file, path: File.join(JAMSTACK_PATH, 'bar.html'), ext: '.html', url: '/app/bar' },
215
- { kind: :file, path: File.join(JAMSTACK_PATH, 'index.md'), ext: '.md', url: '/app',
215
+ { kind: :markdown, path: File.join(JAMSTACK_PATH, 'index.md'), ext: '.md', url: '/app',
216
216
  title: 'Hello', foo: 'BarBar', html_content: "<h1>Index</h1>\n" },
217
217
  ], list
218
218
 
@@ -221,7 +221,7 @@ class JamstackTest < MiniTest::Test
221
221
 
222
222
  assert_equal [
223
223
  {
224
- kind: :file,
224
+ kind: :markdown,
225
225
  path: File.join(JAMSTACK_PATH, 'articles/2008-06-14-manu.md'),
226
226
  url: '/app/articles/2008-06-14-manu',
227
227
  ext: '.md',
@@ -236,7 +236,7 @@ class JamstackTest < MiniTest::Test
236
236
  date: Date.new(2008, 06, 14)
237
237
  },
238
238
  {
239
- kind: :file,
239
+ kind: :markdown,
240
240
  path: File.join(JAMSTACK_PATH, 'articles/2009-06-12-noatche.md'),
241
241
  url: '/app/articles/2009-06-12-noatche',
242
242
  ext: '.md',
@@ -246,7 +246,7 @@ class JamstackTest < MiniTest::Test
246
246
  date: Date.new(2009, 06, 12)
247
247
  },
248
248
  {
249
- kind: :file,
249
+ kind: :markdown,
250
250
  path: File.join(JAMSTACK_PATH, 'articles/a.md'),
251
251
  url: '/app/articles/a',
252
252
  ext: '.md',
@@ -283,7 +283,7 @@ class JamstackTest < MiniTest::Test
283
283
 
284
284
  def test_path_info
285
285
  assert_equal({
286
- kind: :file,
286
+ kind: :markdown,
287
287
  path: File.join(JAMSTACK_PATH, 'index.md'),
288
288
  ext: '.md',
289
289
  url: '/',
@@ -293,7 +293,7 @@ class JamstackTest < MiniTest::Test
293
293
  }, path_info('/index'))
294
294
 
295
295
  assert_equal({
296
- kind: :file,
296
+ kind: :markdown,
297
297
  path: File.join(JAMSTACK_PATH, 'index.md'),
298
298
  ext: '.md',
299
299
  url: '/',
@@ -313,4 +313,38 @@ class JamstackTest < MiniTest::Test
313
313
  kind: :not_found,
314
314
  }, path_info('/js/b.js'))
315
315
  end
316
+
317
+ def test_resource_loading
318
+ req = mock_req(':method' => 'GET', ':path' => '/resources/greeter?name=world')
319
+ route = @jamstack.route(req)
320
+ assert_equal @jamstack, route
321
+
322
+ req = mock_req(':method' => 'GET', ':path' => '/resources/greeter?name=world')
323
+ @jamstack.route_and_call(req)
324
+ assert_response 'Hello, world!', :text, req
325
+
326
+ req = mock_req(':method' => 'GET', ':path' => '/resources/recurse/resources/greeter?name=foo')
327
+ @jamstack.route_and_call(req)
328
+ assert_response 'Hello, foo!', :text, req
329
+ end
330
+
331
+ def test_recursive_resource_loading_on_non_root_jamstack
332
+ jamstack = Impression::Jamstack.new(path: '/foo/bar', directory: JAMSTACK_PATH)
333
+
334
+ req = mock_req(':method' => 'GET', ':path' => '/foo/bar/resources/greeter?name=world')
335
+ route = jamstack.route(req)
336
+ assert_equal jamstack, route
337
+
338
+ req = mock_req(':method' => 'GET', ':path' => '/foo/bar/resources/greeter?name=world')
339
+ jamstack.route_and_call(req)
340
+ assert_response 'Hello, world!', :text, req
341
+
342
+ req = mock_req(':method' => 'GET', ':path' => '/foo/bar/resources/recurse/resources/greeter?name=foo')
343
+ jamstack.route_and_call(req)
344
+ assert_response 'Hello, foo!', :text, req
345
+
346
+ # req = mock_req(':method' => 'GET', ':path' => '/foo/bar/resources/recurse/bar')
347
+ # @jamstack.route_and_call(req)
348
+ # assert_response static('bar.html'), :html, req
349
+ end
316
350
  end
@@ -198,4 +198,15 @@ class ResourceTest < MiniTest::Test
198
198
  assert_equal '{"baz":123}', req.response_body
199
199
  assert_equal 'application/json', req.response_content_type
200
200
  end
201
+
202
+ def test_resource_with_block
203
+ r1 = Impression::Resource.new(path: '/') do |req|
204
+ req.respond('foobar', ':status' => Qeweney::Status::TEAPOT)
205
+ end
206
+
207
+ req = mock_req(':method' => 'GET', ':path' => '/')
208
+ r1.route_and_call(req)
209
+ assert_equal 'foobar', req.response_body
210
+ assert_equal Qeweney::Status::TEAPOT, req.response_status
211
+ end
201
212
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: impression
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.9'
4
+ version: '0.10'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sharon Rosner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-02-05 00:00:00.000000000 Z
11
+ date: 2022-02-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: polyphony
@@ -16,42 +16,42 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0.74'
19
+ version: '0.77'
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
- version: '0.74'
26
+ version: '0.77'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: tipi
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0.47'
33
+ version: '0.49'
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
- version: '0.47'
40
+ version: '0.49'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: qeweney
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0.16'
47
+ version: '0.17'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '0.16'
54
+ version: '0.17'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: papercraft
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -168,6 +168,8 @@ files:
168
168
  - test/jamstack/foo.rb
169
169
  - test/jamstack/foobar.rb
170
170
  - test/jamstack/index.md
171
+ - test/jamstack/resources/greeter.rb
172
+ - test/jamstack/resources/recurse.rb
171
173
  - test/run.rb
172
174
  - test/static/bar/index.html
173
175
  - test/static/foo.html
@@ -176,6 +178,7 @@ files:
176
178
  - test/test_app.rb
177
179
  - test/test_file_tree.rb
178
180
  - test/test_file_watcher.rb
181
+ - test/test_impression.rb
179
182
  - test/test_jamstack.rb
180
183
  - test/test_resource.rb
181
184
  homepage: http://github.com/digital-fabric/impression