impression 0.11 → 0.12
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/Gemfile +0 -5
- data/Gemfile.lock +7 -7
- data/README.md +78 -8
- data/impression.gemspec +2 -2
- data/lib/impression/app.rb +271 -3
- data/lib/impression/file_tree.rb +4 -2
- data/lib/impression/rack_app.rb +27 -0
- data/lib/impression/version.rb +1 -1
- data/lib/impression.rb +23 -11
- data/test/{jamstack → app}/_layouts/article.rb +0 -0
- data/test/{jamstack → app}/_layouts/default.rb +0 -0
- data/test/{jamstack → app}/articles/2008-06-14-manu.md +0 -0
- data/test/{jamstack → app}/articles/2009-06-12-noatche.md +0 -0
- data/test/{jamstack → app}/articles/a.md +0 -0
- data/test/{jamstack → app}/assets/js/a.js +0 -0
- data/test/{jamstack → app}/bar.html +0 -0
- data/test/{jamstack → app}/baz/index.md +0 -0
- data/test/{jamstack → app}/foo.rb +0 -0
- data/test/{jamstack → app}/foobar.rb +0 -0
- data/test/{jamstack → app}/index.md +0 -0
- data/test/{jamstack → app}/resources/greeter.rb +0 -0
- data/test/{jamstack → app}/resources/recurse.rb +1 -1
- data/test/test_app.rb +349 -6
- data/test/test_file_tree.rb +18 -0
- data/test/test_impression.rb +3 -3
- data/test/test_rack_app.rb +48 -0
- metadata +21 -21
- data/lib/impression/jamstack.rb +0 -276
- data/test/test_jamstack.rb +0 -350
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e9b79a3bb3823fad2c5c7ad2ed7f187c2c398dea84c62d9d0fdbd481238f499a
|
4
|
+
data.tar.gz: 6cd1d41db73b992ee6f2027220440871d6512811f23b810ba064733a0538e7d4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 734ab33bb5056e06076403fc774a13851953edec042b915826577aaa810c8e9d39c1a242b95836b5b6dcb61404d0fd1e8ab3afaf0cd095105a14d5ccd1bab9ea
|
7
|
+
data.tar.gz: df49438b49021b4d42de855f72b2342ecfe9416a2ea118feb8d09580d8ac4c0bb3f10b87d25edc020cdf37be8a91a5d0d4f85119b3a7bf3e3d3186b917477594
|
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
impression (0.
|
4
|
+
impression (0.12)
|
5
5
|
modulation (~> 1.1)
|
6
|
-
papercraft (~> 0.
|
6
|
+
papercraft (~> 0.23)
|
7
7
|
polyphony (~> 0.77)
|
8
|
-
qeweney (~> 0.
|
8
|
+
qeweney (~> 0.18)
|
9
9
|
tipi (~> 0.50)
|
10
10
|
|
11
11
|
GEM
|
@@ -16,7 +16,7 @@ GEM
|
|
16
16
|
docile (1.4.0)
|
17
17
|
escape_utils (1.2.1)
|
18
18
|
ever (0.1)
|
19
|
-
extralite (1.
|
19
|
+
extralite (1.12)
|
20
20
|
faraday (1.9.3)
|
21
21
|
faraday-em_http (~> 1.0)
|
22
22
|
faraday-em_synchrony (~> 1.0)
|
@@ -50,15 +50,15 @@ GEM
|
|
50
50
|
localhost (1.1.9)
|
51
51
|
minitest (5.11.3)
|
52
52
|
modulation (1.1)
|
53
|
-
msgpack (1.4.
|
53
|
+
msgpack (1.4.5)
|
54
54
|
multipart-post (2.1.1)
|
55
|
-
papercraft (0.
|
55
|
+
papercraft (0.23)
|
56
56
|
escape_utils (~> 1.2.1)
|
57
57
|
kramdown (~> 2.3.1)
|
58
58
|
kramdown-parser-gfm (~> 1.1.0)
|
59
59
|
rouge (~> 3.27.0)
|
60
60
|
polyphony (0.77)
|
61
|
-
qeweney (0.
|
61
|
+
qeweney (0.18)
|
62
62
|
escape_utils (~> 1.2.1)
|
63
63
|
rack (2.2.3)
|
64
64
|
rake (12.3.3)
|
data/README.md
CHANGED
@@ -19,20 +19,90 @@
|
|
19
19
|
## What is Impression
|
20
20
|
|
21
21
|
> Impression is still in a very early stage of development. Things might not
|
22
|
-
> correctly
|
22
|
+
> work correctly.
|
23
23
|
|
24
24
|
Impression is a modern web framework for Ruby. Unlike other web framework,
|
25
25
|
Impression does not impose any rigid structure or paradigm, but instead provides
|
26
|
-
a set of tools letting you build any kind of web app, by freely
|
27
|
-
kinds of web resources, be they static files, structured
|
28
|
-
sites, or dynamic APIs.
|
26
|
+
a minimalistic set of tools, letting you build any kind of web app, by freely
|
27
|
+
mixing different kinds of web resources, be they static files, structured
|
28
|
+
templates, Jamstack sites, or dynamic APIs.
|
29
29
|
|
30
|
-
|
31
|
-
|
30
|
+
## Resources
|
31
|
+
|
32
|
+
The main abstraction in Impression is the resource - which represents an web
|
33
|
+
endpoint that is mounted at a specific location in the URL namespace, and
|
34
|
+
responds to requests. Resources can be nested in order to create arbitrarily
|
35
|
+
complex routing trees. Impression provides multiple resource types, each
|
36
|
+
customized for a specific use case, be it a JSON API, a set of MVC-style
|
37
|
+
controllers, or a Markdown-based blog with static content.
|
38
|
+
|
39
|
+
Finally, any kind of resource can be used as an Impression app. Routing is
|
40
|
+
performed automatically according to the resource tree, starting from the root
|
41
|
+
resource.
|
42
|
+
|
43
|
+
## The request-response cycle
|
44
|
+
|
45
|
+
The handling of incoming HTTP requests is done in two stages. First the request
|
46
|
+
is routed to the corresponding resource, which then handles the request by
|
47
|
+
generating a response.
|
48
|
+
|
49
|
+
HTTP requests and responses use the
|
50
|
+
[Qeweney](https://github.com/digital-fabric/qeweney) API.
|
51
|
+
|
52
|
+
## Resource types
|
53
|
+
|
54
|
+
Impression provides the following resources:
|
55
|
+
|
56
|
+
- `Resource` - a generic resource.
|
57
|
+
- `FileTree` - a resource serving static files from the given directory.
|
58
|
+
- `App` - a resource serving static files, markdown files with layouts and Ruby
|
59
|
+
modules from the given directory.
|
60
|
+
- `RackApp` - a resource serving the given Rack app.
|
61
|
+
|
62
|
+
## Setting up a basic resource
|
63
|
+
|
64
|
+
To setup a generic resource, call `Impression.resource` and provide a request
|
65
|
+
handler:
|
66
|
+
|
67
|
+
```
|
68
|
+
app = Impression.resource { |req| req.respond('Hello, world!') }
|
69
|
+
```
|
70
|
+
|
71
|
+
## Running your app with Tipi
|
32
72
|
|
33
73
|
Impression is made for running on top of
|
34
|
-
[Tipi](https://github.com/digital-fabric/tipi)
|
35
|
-
|
74
|
+
[Tipi](https://github.com/digital-fabric/tipi). Your Tipi app file would like
|
75
|
+
something like the following:
|
76
|
+
|
77
|
+
```ruby
|
78
|
+
# app.rb
|
79
|
+
app = Impression.resource { |req| req.respond('Hello, world!') }
|
80
|
+
Tipi.run(&app)
|
81
|
+
```
|
82
|
+
|
83
|
+
You can then start Tipi by running `tipi run app.rb`.
|
84
|
+
|
85
|
+
## Running your app with a Rack app server
|
86
|
+
|
87
|
+
You can also run your app on any Rack app server, using something like the
|
88
|
+
following:
|
89
|
+
|
90
|
+
```ruby
|
91
|
+
app = Impression.resource { |req| req.respond('Hello, world!') }
|
92
|
+
run Qeweney.rack(&app)
|
93
|
+
```
|
94
|
+
|
95
|
+
## Creating a routing map with resources
|
96
|
+
|
97
|
+
A resource can be mounted at any point in the app's URL space. Resources can be
|
98
|
+
nested within other resources by passing a `parent:` argument when creating a
|
99
|
+
resource:
|
100
|
+
|
101
|
+
```ruby
|
102
|
+
app = Impression.app { |req| req.respond('Homepage') }
|
103
|
+
greeter = Impression.resource(parent: app, path: 'greeter')
|
104
|
+
static = Impression.file_tree(parent: app, path: 'static', directory: __dir__)
|
105
|
+
```
|
36
106
|
|
37
107
|
## I want to know more
|
38
108
|
|
data/impression.gemspec
CHANGED
@@ -22,9 +22,9 @@ Gem::Specification.new do |s|
|
|
22
22
|
|
23
23
|
s.add_runtime_dependency 'polyphony', '~>0.77'
|
24
24
|
s.add_runtime_dependency 'tipi', '~>0.50'
|
25
|
-
s.add_runtime_dependency 'qeweney', '~>0.
|
25
|
+
s.add_runtime_dependency 'qeweney', '~>0.18'
|
26
26
|
|
27
|
-
s.add_runtime_dependency 'papercraft', '~>0.
|
27
|
+
s.add_runtime_dependency 'papercraft', '~>0.23'
|
28
28
|
s.add_runtime_dependency 'modulation', '~>1.1'
|
29
29
|
|
30
30
|
|
data/lib/impression/app.rb
CHANGED
@@ -1,9 +1,277 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'fileutils'
|
4
|
+
require 'date'
|
5
|
+
require 'yaml'
|
6
|
+
require 'modulation'
|
7
|
+
require 'papercraft'
|
8
|
+
|
9
|
+
require_relative './resource'
|
10
|
+
require_relative './file_tree'
|
11
|
+
|
3
12
|
module Impression
|
4
|
-
|
5
|
-
|
6
|
-
|
13
|
+
|
14
|
+
# `App` implements a resource that maps to a generic app directory.
|
15
|
+
class App < FileTree
|
16
|
+
def initialize(**props)
|
17
|
+
super
|
18
|
+
@layouts = {}
|
19
|
+
end
|
20
|
+
|
21
|
+
# Returns a list of pages found in the given directory (relative to the base
|
22
|
+
# directory). Each entry containins the absolute file path, the pretty URL,
|
23
|
+
# the possible date parsed from the file name, and any other front matter
|
24
|
+
# attributes (for .md files). This method will detect only pages with the
|
25
|
+
# extensions .html, .md, .rb. The returned entries are sorted by file path.
|
26
|
+
#
|
27
|
+
# @param dir [String] relative directory
|
28
|
+
# @return [Array<Hash>] array of page entries
|
29
|
+
def page_list(dir)
|
30
|
+
base = File.join(@directory, dir)
|
31
|
+
Dir.glob('*.{html,md}', base: base)
|
32
|
+
.map { |fn| get_path_info(File.join(dir, fn)) }# page_entry(fn, dir) }
|
33
|
+
.sort_by { |i| i[:path] }
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
DATE_REGEXP = /(\d{4}\-\d{2}\-\d{2})/.freeze
|
39
|
+
FRONT_MATTER_REGEXP = /\A(---\s*\n.*?\n?)^((---|\.\.\.)\s*$\n?)/m.freeze
|
40
|
+
MD_EXT_REGEXP = /\.md$/.freeze
|
41
|
+
PAGE_EXT_REGEXP = /^(.+)\.(md|html|rb)$/.freeze
|
42
|
+
INDEX_PAGE_REGEXP = /^(.+)?\/index$/.freeze
|
43
|
+
|
44
|
+
YAML_OPTS = {
|
45
|
+
permitted_classes: [Date],
|
46
|
+
symbolize_names: true
|
47
|
+
}.freeze
|
48
|
+
|
49
|
+
# Returns the path info for the given file path.
|
50
|
+
#
|
51
|
+
# @param path [String] file path
|
52
|
+
# @return [Hash] path info
|
53
|
+
def file_info(path)
|
54
|
+
info = super
|
55
|
+
case info[:ext]
|
56
|
+
when '.md'
|
57
|
+
atts, content = parse_markdown_file(path)
|
58
|
+
info = info.merge(atts)
|
59
|
+
info[:html_content] = Papercraft.markdown(content)
|
60
|
+
info[:kind] = :markdown
|
61
|
+
when '.rb'
|
62
|
+
info[:module] = import(path)
|
63
|
+
info[:kind] = :module
|
64
|
+
end
|
65
|
+
if (m = path.match(DATE_REGEXP))
|
66
|
+
info[:date] ||= Date.parse(m[1])
|
67
|
+
end
|
68
|
+
|
69
|
+
info
|
70
|
+
end
|
71
|
+
|
72
|
+
# Returns the pretty URL for the given relative path. For pages, the
|
73
|
+
# extension is removed. For index pages, the index suffix is removed.
|
74
|
+
#
|
75
|
+
# @param relative_path [String] relative path
|
76
|
+
# @return [String] pretty URL
|
77
|
+
def pretty_url(relative_path)
|
78
|
+
if (m = relative_path.match(PAGE_EXT_REGEXP))
|
79
|
+
relative_path = m[1]
|
80
|
+
end
|
81
|
+
if (m = relative_path.match(INDEX_PAGE_REGEXP))
|
82
|
+
relative_path = m[1] || '/'
|
83
|
+
end
|
84
|
+
relative_path == '/' ? absolute_path : File.join(absolute_path, relative_path)
|
85
|
+
end
|
86
|
+
|
87
|
+
# Renders a response according to the given path info.
|
88
|
+
#
|
89
|
+
# @param req [Qeweney::Request] request
|
90
|
+
# @param path_info [Hash] path info
|
91
|
+
# @return [void]
|
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
|
104
|
+
render_markdown_file(req, path_info)
|
105
|
+
when :file
|
106
|
+
render_file(req, path_info)
|
107
|
+
else
|
108
|
+
raise "Invalid path info kind #{kind.inspect}"
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
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).
|
118
|
+
#
|
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
|
+
return nil if up_tree_path == relative_path
|
148
|
+
|
149
|
+
up_tree_path_info = get_path_info(up_tree_path)
|
150
|
+
case up_tree_path_info[:kind]
|
151
|
+
when :not_found
|
152
|
+
relative_path = up_tree_path
|
153
|
+
next
|
154
|
+
when :module
|
155
|
+
return up_tree_path_info
|
156
|
+
else
|
157
|
+
return nil
|
158
|
+
end
|
159
|
+
end
|
160
|
+
nil
|
161
|
+
end
|
162
|
+
|
163
|
+
# Renders a file response for the given request and the given path info,
|
164
|
+
# according to the file type.
|
165
|
+
#
|
166
|
+
# @param req [Qeweney::Request] request
|
167
|
+
# @param path_info [Hash] path info
|
168
|
+
# @return [void]
|
169
|
+
# def render_file(req, path_info)
|
170
|
+
# case path_info[:kind]
|
171
|
+
# else
|
172
|
+
# req.serve_file(path_info[:path])
|
173
|
+
# end
|
174
|
+
# end
|
175
|
+
|
176
|
+
# Renders a module. If the module is a Resource, it is mounted, and then the
|
177
|
+
# request is rerouted from the new resource and rendered. If the module is a
|
178
|
+
# Proc or a Papercraft::Template, it is rendered as such. Otherwise, an
|
179
|
+
# error is raised.
|
180
|
+
#
|
181
|
+
# @param req [Qeweney::Request] request
|
182
|
+
# @param path_info [Hash] path info
|
183
|
+
# @return [void]
|
184
|
+
def render_module(req, path_info)
|
185
|
+
# p render_module: path_info
|
186
|
+
case (mod = path_info[:module])
|
187
|
+
when Module
|
188
|
+
resource = mod.resource
|
189
|
+
resource.remount(self, path_info[:url])
|
190
|
+
# p path_info_url: path_info[:url], relative_path: req.resource_relative_path
|
191
|
+
relative_url = path_info[:url].gsub(/^#{path}/, '')
|
192
|
+
# p relative_url: relative_url
|
193
|
+
req.recalc_resource_relative_path(relative_url)
|
194
|
+
# p resource_relative_path: req.resource_relative_path
|
195
|
+
resource.route(req).call(req)
|
196
|
+
when Impression::Resource
|
197
|
+
mod.remount(self, path_info[:url])
|
198
|
+
req.recalc_resource_relative_path(path_info[:url])
|
199
|
+
mod.route(req).call(req)
|
200
|
+
when Proc, Papercraft::Template
|
201
|
+
render_papercraft_module(req, mod)
|
202
|
+
else
|
203
|
+
raise "Unsupported module type #{mod.class}"
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
207
|
+
# Renders a Papercraft module.
|
208
|
+
#
|
209
|
+
# @param mod [Module] Papercraft module
|
210
|
+
# @param path_info [Hash] path info
|
211
|
+
# @return [void]
|
212
|
+
def render_papercraft_module(req, mod)
|
213
|
+
template = Papercraft.html(mod)
|
214
|
+
body = template.render(request: req, resource: self)
|
215
|
+
req.respond(body, 'Content-Type' => template.mime_type)
|
216
|
+
end
|
217
|
+
|
218
|
+
# Renders a markdown file using a layout.
|
219
|
+
#
|
220
|
+
# @param req [Qeweney::Request] reqest
|
221
|
+
# @param path_info [Hash] path info
|
222
|
+
# @return [void]
|
223
|
+
def render_markdown_file(req, path_info)
|
224
|
+
layout = get_layout(path_info[:layout])
|
225
|
+
|
226
|
+
html = layout.render(request: req, resource: self, **path_info) {
|
227
|
+
emit path_info[:html_content]
|
228
|
+
}
|
229
|
+
req.respond(html, 'Content-Type' => layout.mime_type)
|
230
|
+
end
|
231
|
+
|
232
|
+
# Returns a layout component based on the given name. The given name
|
233
|
+
# defaults to 'default' if nil.
|
234
|
+
#
|
235
|
+
# @param layout [String, nil] layout name
|
236
|
+
# @return [Papercraft::Template] layout component
|
237
|
+
def get_layout(layout)
|
238
|
+
layout ||= 'default'
|
239
|
+
path = File.join(@directory, "_layouts/#{layout}.rb")
|
240
|
+
raise "Layout not found #{path}" unless File.file?(path)
|
241
|
+
|
242
|
+
import path
|
243
|
+
end
|
244
|
+
|
245
|
+
# Parses the markdown file at the given path.
|
246
|
+
#
|
247
|
+
# @param path [String] file path
|
248
|
+
# @return [Array] an tuple containing properties<Hash>, contents<String>
|
249
|
+
def parse_markdown_file(path)
|
250
|
+
content = IO.read(path) || ''
|
251
|
+
atts = {}
|
252
|
+
|
253
|
+
# Parse date from file name
|
254
|
+
if (m = path.match(DATE_REGEXP))
|
255
|
+
atts[:date] ||= Date.parse(m[1])
|
256
|
+
end
|
257
|
+
|
258
|
+
if (m = content.match(FRONT_MATTER_REGEXP))
|
259
|
+
front_matter = m[1]
|
260
|
+
content = m.post_match
|
261
|
+
|
262
|
+
yaml = YAML.safe_load(front_matter, **YAML_OPTS)
|
263
|
+
atts = atts.merge(yaml)
|
264
|
+
end
|
265
|
+
|
266
|
+
[atts, content]
|
267
|
+
end
|
268
|
+
|
269
|
+
# Returns the supported path extensions used for searching for files based
|
270
|
+
# on pretty URLs.
|
271
|
+
#
|
272
|
+
# @return [Array] list of supported path extensions
|
273
|
+
def supported_path_extensions
|
274
|
+
[:html, :rb, :md]
|
7
275
|
end
|
8
276
|
end
|
9
277
|
end
|
data/lib/impression/file_tree.rb
CHANGED
@@ -14,8 +14,8 @@ module Impression
|
|
14
14
|
#
|
15
15
|
# @param directory [String] static directory path
|
16
16
|
# @return [void]
|
17
|
-
def initialize(directory
|
18
|
-
super(**props)
|
17
|
+
def initialize(directory: nil, **props, &block)
|
18
|
+
super(**props, &block)
|
19
19
|
@directory = directory
|
20
20
|
@path_info_cache = {}
|
21
21
|
end
|
@@ -25,6 +25,8 @@ module Impression
|
|
25
25
|
# @param req [Qeweney::Request] request
|
26
26
|
# @return [void]
|
27
27
|
def call(req)
|
28
|
+
return super if @directory.nil?
|
29
|
+
|
28
30
|
path_info = get_path_info(req.resource_relative_path)
|
29
31
|
render_from_path_info(req, path_info)
|
30
32
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'fileutils'
|
4
|
+
require 'tipi'
|
5
|
+
require_relative './resource'
|
6
|
+
|
7
|
+
module Impression
|
8
|
+
|
9
|
+
# The `RackApp` class represents Rack apps as resources.
|
10
|
+
class RackApp < Resource
|
11
|
+
def initialize(app: nil, **props, &block)
|
12
|
+
raise "No Rack app given" unless app || block
|
13
|
+
|
14
|
+
# We pass nil as the block, otherwise the block will pass to
|
15
|
+
# Resource#initialize, which will cause #call to be overidden.
|
16
|
+
super(**props, &nil)
|
17
|
+
@handler = Tipi::RackAdapter.run(app || block)
|
18
|
+
end
|
19
|
+
|
20
|
+
def call(req)
|
21
|
+
if @path != '/'
|
22
|
+
req.rewrite!(@path, '/')
|
23
|
+
end
|
24
|
+
@handler.(req)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/impression/version.rb
CHANGED
data/lib/impression.rb
CHANGED
@@ -3,12 +3,10 @@
|
|
3
3
|
require 'polyphony'
|
4
4
|
|
5
5
|
require_relative './impression/request_extensions'
|
6
|
-
# require_relative './impression/file_watcher'
|
7
|
-
|
8
6
|
require_relative './impression/resource'
|
9
7
|
require_relative './impression/file_tree'
|
10
|
-
require_relative './impression/jamstack'
|
11
8
|
require_relative './impression/app'
|
9
|
+
require_relative './impression/rack_app'
|
12
10
|
|
13
11
|
# The Impression module contains convenience methods for creating resources.
|
14
12
|
module Impression
|
@@ -26,17 +24,31 @@ module Impression
|
|
26
24
|
|
27
25
|
# Creates a new `Impression::FileTree` instance with the given parameters.
|
28
26
|
#
|
29
|
-
# @param
|
27
|
+
# @param path [String] resource path (defaults to `"/"`)
|
28
|
+
# @param **props [Hash] other resource properties
|
29
|
+
# @param &block [Proc] optional block for overriding default request handler
|
30
30
|
# @return [Impression::FileTree] new resource
|
31
|
-
def self.file_tree(path: '/', **props)
|
32
|
-
FileTree.new(path: path, **props)
|
31
|
+
def self.file_tree(path: '/', **props, &block)
|
32
|
+
FileTree.new(path: path, **props, &block)
|
33
|
+
end
|
34
|
+
|
35
|
+
# Creates a new `Impression::App` instance with the given parameters.
|
36
|
+
#
|
37
|
+
# @param path [String] resource path (defaults to `"/"`)
|
38
|
+
# @param **props [Hash] other resource properties
|
39
|
+
# @param &block [Proc] optional block for overriding default request handler
|
40
|
+
# @return [Impression::App] new resource
|
41
|
+
def self.app(path: '/', **props, &block)
|
42
|
+
App.new(path: path, **props, &block)
|
33
43
|
end
|
34
44
|
|
35
|
-
# Creates a new `Impression::
|
45
|
+
# Creates a new `Impression::RackApp` instance with the given parameters.
|
36
46
|
#
|
37
|
-
# @param
|
38
|
-
# @
|
39
|
-
|
40
|
-
|
47
|
+
# @param path [String] resource path (defaults to `"/"`)
|
48
|
+
# @param **props [Hash] other resource properties
|
49
|
+
# @param &block [Proc] Rack app proc (can also be passed using the `app:` parameter)
|
50
|
+
# @return [Impression::RackApp] new resource
|
51
|
+
def self.rack_app(path: '/', **props, &block)
|
52
|
+
RackApp.new(path: path, **props, &block)
|
41
53
|
end
|
42
54
|
end
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|