roger 1.7.2 → 1.8.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 +4 -4
- data/CHANGELOG.md +11 -3
- data/doc/rogerfile.md +2 -0
- data/lib/roger/helpers/get_files.rb +19 -3
- data/lib/roger/rack/roger.rb +29 -3
- data/lib/roger/renderer.rb +5 -0
- data/lib/roger/server.rb +6 -1
- data/lib/roger/version.rb +1 -1
- data/test/project/partials/test/array.html.erb +1 -0
- data/test/unit/helpers/get_files_test.rb +35 -0
- data/test/unit/rack/roger_test.rb +19 -0
- data/test/unit/server_test.rb +21 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 16132ae1857a2fc40e046c297848b5f3683dd249
|
4
|
+
data.tar.gz: b82228479d276c41069da98f8bf473a0f5478a85
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d5f59c20f09f5cbab909ceaa865c1f6b1d6bdac61c863bf9e3e3df6c549c4d0effd212d379a9e215d09a41d32e5e83f8269ece9f423194b6e95f83c0db57a81c
|
7
|
+
data.tar.gz: 54ddecc3563773870ee17ae3c0e712e180f0f6b4969a83ff8fa5afd17055e7fd00fb1598f2723317a58291cc1a09ab3b47cde23947d7e797d3e13a479f886769
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## Version 1.8.0
|
4
|
+
* Roger Rack application now adheres to match/skip options. Pass them in the rogerfile as follows:
|
5
|
+
```
|
6
|
+
roger.server do |s|
|
7
|
+
s.application_options = { match: [], skip: [] }
|
8
|
+
end
|
9
|
+
```
|
10
|
+
|
3
11
|
## Version 1.7.2
|
4
12
|
* Return from partials instead of rendering partial content as string. This allows us to have code in ruby blocks instead of just more ERB.
|
5
13
|
|
@@ -42,7 +50,7 @@
|
|
42
50
|
|
43
51
|
## Version 1.5.0
|
44
52
|
* Roger won't be tested on Ruby 1.9.x anymore
|
45
|
-
* The way we render templates has been revamped. It is now possible to have multi-pass templates so you can do `.md.erb` which will first be processed by `erb` and then by the `md` tilt template handler.
|
53
|
+
* The way we render templates has been revamped. It is now possible to have multi-pass templates so you can do `.md.erb` which will first be processed by `erb` and then by the `md` tilt template handler.
|
46
54
|
* The way templates are searched has changed to be more predictable. You may notice the change when you have the same filenames with different extensions.
|
47
55
|
* You can now use local partials by just using an underscore as prefix. So `<%= partial('bla') %>` will look for `_bla.*` relative to the current template first and `bla.*` in the partials directory second (current behaviour).
|
48
56
|
* Template recursion will be detected and prevented instead of giving a stack overflow.
|
@@ -102,11 +110,11 @@ This is a dud. It's identical to 1.3.1. Don't use.
|
|
102
110
|
* Fix missing variables in release
|
103
111
|
|
104
112
|
## Version 1.2.1
|
105
|
-
* Fix missing env (https://github.com/DigitPaint/roger/issues/24)
|
113
|
+
* Fix missing env (https://github.com/DigitPaint/roger/issues/24)
|
106
114
|
|
107
115
|
## Version 1.2.0
|
108
116
|
* `roger.project` is now always in `env` when running as a project or as a release. Use this in favor of `env["MOCKUP_PROJECT"]`
|
109
|
-
* All Roger code now is linted by Rubocop. More tests have been added and more documentation as well. Still not everything may have been covered by the tests.
|
117
|
+
* All Roger code now is linted by Rubocop. More tests have been added and more documentation as well. Still not everything may have been covered by the tests.
|
110
118
|
|
111
119
|
|
112
120
|
## Version 1.1.3
|
data/doc/rogerfile.md
CHANGED
@@ -21,6 +21,8 @@ Sass::Plugin.options[:css_location] = "./html/stylesheets"
|
|
21
21
|
# Server is a regular Rack interface.
|
22
22
|
roger.serve do |server|
|
23
23
|
server.use :sass
|
24
|
+
|
25
|
+
server.application_options = {match: ["**/*.html.erb"]} # Config for Rack application (call is optional)
|
24
26
|
end
|
25
27
|
|
26
28
|
# Define tests
|
@@ -2,20 +2,36 @@ module Roger
|
|
2
2
|
module Helpers
|
3
3
|
# Helper to include the get_files method
|
4
4
|
module GetFiles
|
5
|
+
GLOB_OPTIONS = File::FNM_PATHNAME | File::FNM_EXTGLOB | File::FNM_DOTMATCH
|
6
|
+
|
5
7
|
# Get files from a path, skipping excludes.
|
6
8
|
#
|
7
9
|
# @param [Array] globs an array of file path globs that will be globbed
|
8
10
|
# against the project path
|
9
11
|
# @param [Array] excludes an array of regexps[!] that will be excluded
|
10
12
|
# from the result.
|
11
|
-
|
12
|
-
def get_files(globs, excludes = [], path = nil)
|
13
|
+
def get_files(globs, excludes = [])
|
13
14
|
path = Pathname.new(get_files_default_path)
|
14
|
-
files = globs.map { |g| Dir.glob(path + g) }.flatten
|
15
|
+
files = globs.map { |g| Dir.glob(path + g, GLOB_OPTIONS) }.flatten
|
15
16
|
files.reject! { |file| excludes.detect { |e| file.match(e) } } if excludes.any?
|
16
17
|
files.select { |file| File.file?(file) }
|
17
18
|
end
|
18
19
|
|
20
|
+
# See if a file matches globs/excludes
|
21
|
+
#
|
22
|
+
# @param [.to_s] path the path to match
|
23
|
+
# @param [Array] globs an array of file path globs that will be matched against path
|
24
|
+
# @param [Array] exclude an array of regexps[!] that will be matched negatively against path
|
25
|
+
#
|
26
|
+
# @return [Boolean] Did the passed path match against the globs and excludes?
|
27
|
+
def match_path(path, globs, excludes = [])
|
28
|
+
path = path.to_s
|
29
|
+
match = globs.detect { |glob| File.fnmatch?(glob, path, GLOB_OPTIONS) }
|
30
|
+
return false unless match # No need to check excludes if we don't match anyway
|
31
|
+
|
32
|
+
!excludes.find { |e| path.match(e) }
|
33
|
+
end
|
34
|
+
|
19
35
|
protected
|
20
36
|
|
21
37
|
# The default path to use when calling get_files
|
data/lib/roger/rack/roger.rb
CHANGED
@@ -9,10 +9,24 @@ module Roger
|
|
9
9
|
module Rack
|
10
10
|
# Roger middleware that processe roger templates
|
11
11
|
class Roger
|
12
|
-
|
12
|
+
include ::Roger::Helpers::GetFiles
|
13
|
+
attr_reader :project, :options
|
13
14
|
|
14
|
-
def
|
15
|
+
def default_options
|
16
|
+
{
|
17
|
+
match: ["**/*.{html,md,html.erb}"],
|
18
|
+
skip: []
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
22
|
+
# Initialize the Rack app
|
23
|
+
#
|
24
|
+
# @param [Hash] options Options to use
|
25
|
+
#
|
26
|
+
# @option options
|
27
|
+
def initialize(project, options = {})
|
15
28
|
@project = project
|
29
|
+
@options = default_options.update(options)
|
16
30
|
@docroot = project.html_path
|
17
31
|
|
18
32
|
@resolver = Resolver.new(@docroot)
|
@@ -23,7 +37,8 @@ module Roger
|
|
23
37
|
url = env["PATH_INFO"]
|
24
38
|
env["MOCKUP_PROJECT"] = env["roger.project"] || @project
|
25
39
|
|
26
|
-
|
40
|
+
template_path = @resolver.url_to_path(url)
|
41
|
+
if process_path_by_roger?(template_path)
|
27
42
|
env["rack.errors"].puts "Rendering template #{template_path.inspect} (#{url.inspect})"
|
28
43
|
build_response(template_path, env).finish
|
29
44
|
else
|
@@ -34,6 +49,16 @@ module Roger
|
|
34
49
|
|
35
50
|
protected
|
36
51
|
|
52
|
+
# Wether or not we should process this
|
53
|
+
# path by the Roger renderer.
|
54
|
+
def process_path_by_roger?(path)
|
55
|
+
return false unless path
|
56
|
+
|
57
|
+
return false unless match_path(path, @options[:match], @options[:skip])
|
58
|
+
|
59
|
+
::Roger::Renderer.will_render?(path)
|
60
|
+
end
|
61
|
+
|
37
62
|
def build_response(template_path, env)
|
38
63
|
renderer = ::Roger::Renderer.new(
|
39
64
|
env,
|
@@ -43,6 +68,7 @@ module Roger
|
|
43
68
|
mime = ::Rack::Mime.mime_type(File.extname(template_path), "text/html")
|
44
69
|
::Rack::Response.new do |res|
|
45
70
|
res.headers["Content-Type"] = mime if mime
|
71
|
+
res.headers["X-Handled-By"] = "Roger"
|
46
72
|
res.status = 200
|
47
73
|
res.write renderer.render(template_path, @project.options[:renderer] || {})
|
48
74
|
end
|
data/lib/roger/renderer.rb
CHANGED
@@ -22,6 +22,11 @@ module Roger
|
|
22
22
|
@helpers || []
|
23
23
|
end
|
24
24
|
|
25
|
+
# Will the renderer render this path to something meaningful?
|
26
|
+
def will_render?(path)
|
27
|
+
Tilt.templates_for(path.to_s).any?
|
28
|
+
end
|
29
|
+
|
25
30
|
# Try to infer the final extension of the output file.
|
26
31
|
def target_extension_for(path)
|
27
32
|
if type = MIME::Types[target_mime_type_for(path)].first
|
data/lib/roger/server.rb
CHANGED
@@ -28,6 +28,11 @@ module Roger
|
|
28
28
|
|
29
29
|
attr_accessor :port, :handler, :host, :auto_port
|
30
30
|
|
31
|
+
# @attr_accessor [Hash] Options pass to ::Roger::Rack::Roger initialization
|
32
|
+
#
|
33
|
+
# @see ::Roger::Rack:Roger
|
34
|
+
attr_accessor :application_options
|
35
|
+
|
31
36
|
def initialize(project, options = {})
|
32
37
|
@project = project
|
33
38
|
|
@@ -143,7 +148,7 @@ module Roger
|
|
143
148
|
def application
|
144
149
|
return @app if @app
|
145
150
|
|
146
|
-
@stack.run Rack::Roger.new(project)
|
151
|
+
@stack.run Rack::Roger.new(project, @application_options || {})
|
147
152
|
|
148
153
|
@app = @stack
|
149
154
|
end
|
data/lib/roger/version.rb
CHANGED
@@ -0,0 +1 @@
|
|
1
|
+
<% yield.each do |value| %><%= value %><% end %>
|
@@ -34,6 +34,7 @@ module Roger
|
|
34
34
|
files = [
|
35
35
|
"a.js",
|
36
36
|
"1.js",
|
37
|
+
"2.js",
|
37
38
|
"1.html",
|
38
39
|
"dir/2.js",
|
39
40
|
"dir/3.js",
|
@@ -55,6 +56,12 @@ module Roger
|
|
55
56
|
assert_array_contains(expect, files)
|
56
57
|
end
|
57
58
|
|
59
|
+
def test_glob_extended
|
60
|
+
files = @object.get_files(["**/{1,2}.js"])
|
61
|
+
expect = @files.grep(/[12]\.js\Z/)
|
62
|
+
assert_array_contains(expect, files)
|
63
|
+
end
|
64
|
+
|
58
65
|
def test_get_only_files
|
59
66
|
dir = @object.construct.directory "evil.js"
|
60
67
|
files = @object.get_files(["*.js"])
|
@@ -67,6 +74,34 @@ module Roger
|
|
67
74
|
assert_array_contains(expect, files)
|
68
75
|
end
|
69
76
|
|
77
|
+
def test_match_path_with_glob_in_root
|
78
|
+
path = "file.js"
|
79
|
+
assert @object.match_path(path, ["*"])
|
80
|
+
assert @object.match_path(path, ["**/*"])
|
81
|
+
assert @object.match_path(path, ["**/*.js"])
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_match_path_with_glob_in_subdir
|
85
|
+
path = "dir/subdir/4.js"
|
86
|
+
assert !@object.match_path(path, [])
|
87
|
+
assert !@object.match_path(path, ["*"])
|
88
|
+
assert @object.match_path(path, ["**/*"])
|
89
|
+
assert @object.match_path(path, ["**/*.js"])
|
90
|
+
assert !@object.match_path(path, ["**/*.html"])
|
91
|
+
assert @object.match_path(path, ["**/*.html", "**/*.js"])
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_match_path_with_extended_glob
|
95
|
+
assert @object.match_path("4.js", ["{3,4}.js"])
|
96
|
+
assert !@object.match_path("4.js", ["{5}.js"])
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_match_path_with_excludes
|
100
|
+
path = "dir/subdir/4.js"
|
101
|
+
assert @object.match_path(path, ["**/*"], [/\.html\Z/])
|
102
|
+
assert !@object.match_path(path, ["**/*"], [/\.js\Z/])
|
103
|
+
end
|
104
|
+
|
70
105
|
protected
|
71
106
|
|
72
107
|
def assert_array_contains(expect, result)
|
@@ -19,6 +19,25 @@ module Roger
|
|
19
19
|
response = request.get("/erb")
|
20
20
|
|
21
21
|
assert response.body.include?("ERB format")
|
22
|
+
assert_equal "Roger", response.headers["X-Handled-By"]
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_middleware_does_not_render_unrenderables
|
26
|
+
@project.construct.file "html/myjpeg.jpg", "JPG"
|
27
|
+
request = ::Rack::MockRequest.new(@app)
|
28
|
+
response = request.get("/myjpeg.jpg")
|
29
|
+
|
30
|
+
assert response.body.include?("JPG")
|
31
|
+
assert_equal nil, response.headers["X-Handled-By"]
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_middleware_does_not_render_unwanteds
|
35
|
+
@project.construct.file "html/mysass.scss", ".scss{}"
|
36
|
+
request = ::Rack::MockRequest.new(@app)
|
37
|
+
response = request.get("/mysass.scss")
|
38
|
+
|
39
|
+
assert response.body.include?(".scss{}")
|
40
|
+
assert_equal nil, response.headers["X-Handled-By"]
|
22
41
|
end
|
23
42
|
|
24
43
|
def test_renderer_options_are_passed
|
data/test/unit/server_test.rb
CHANGED
@@ -59,5 +59,26 @@ module Roger
|
|
59
59
|
# This is a bit of a clunky comparison but it suffices for now
|
60
60
|
assert_equal @project.object_id.to_s, request.get("/").body
|
61
61
|
end
|
62
|
+
|
63
|
+
def test_application_options
|
64
|
+
@server.application_options = { test_option: true }
|
65
|
+
|
66
|
+
test = Class.new do
|
67
|
+
def initialize(app)
|
68
|
+
@app = app
|
69
|
+
end
|
70
|
+
|
71
|
+
def call(_env)
|
72
|
+
[200, {}, [@app.options[:test_option].to_s]]
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
@server.use test
|
77
|
+
|
78
|
+
request = ::Rack::MockRequest.new(@server.send(:application))
|
79
|
+
|
80
|
+
# This is a bit of a clunky comparison but it suffices for now
|
81
|
+
assert_equal "true", request.get("/").body
|
82
|
+
end
|
62
83
|
end
|
63
84
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: roger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Flurin Egger
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2017-
|
13
|
+
date: 2017-10-18 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: thor
|
@@ -302,6 +302,7 @@ files:
|
|
302
302
|
- test/project/partials/formats/erb.html.erb
|
303
303
|
- test/project/partials/partials-test.html.erb
|
304
304
|
- test/project/partials/test/_underscored.html.erb
|
305
|
+
- test/project/partials/test/array.html.erb
|
305
306
|
- test/project/partials/test/deep_recursive.html.erb
|
306
307
|
- test/project/partials/test/erb.html.erb
|
307
308
|
- test/project/partials/test/front_matter.html.erb
|
@@ -418,6 +419,7 @@ test_files:
|
|
418
419
|
- test/project/partials/formats/erb.html.erb
|
419
420
|
- test/project/partials/partials-test.html.erb
|
420
421
|
- test/project/partials/test/_underscored.html.erb
|
422
|
+
- test/project/partials/test/array.html.erb
|
421
423
|
- test/project/partials/test/deep_recursive.html.erb
|
422
424
|
- test/project/partials/test/erb.html.erb
|
423
425
|
- test/project/partials/test/front_matter.html.erb
|