syro-tilt 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 0c344875f1c37067ea3ede68552941eda515bf0d3e0b66e9b3335c5e5b15900f
4
+ data.tar.gz: a2d4cec3221689f8b5f7c221c9e09f2e22f5c148266aacdb73c8cf41716e245d
5
+ SHA512:
6
+ metadata.gz: 67f316b8d950eb1fcf8409883c47a000c1959c1ab208593681012d70b74642d6bce3b7df77e10bf6ff87975f121cb632da015704104c35774582a67df494e211
7
+ data.tar.gz: 03711476cdca8eb7867d3ab041e349f4d0cd57d464393753a46ab3319db766169054d97b4cefd694cca88f27a6e805b8747e8117724f987f78c27664a9ebbe7a
data/.gitignore ADDED
@@ -0,0 +1,10 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /gems.locked
8
+ /pkg/
9
+ /spec/reports/
10
+ /tmp/
data/.rubocop.yml ADDED
@@ -0,0 +1,60 @@
1
+ # http://rubocop.readthedocs.io
2
+ # https://github.com/bbatsov/rubocop/blob/master/config/enabled.yml
3
+ AllCops:
4
+ DisplayCopNames: true
5
+ DisplayStyleGuide: true
6
+ ExtraDetails: true
7
+ TargetRubyVersion: 2.5
8
+
9
+
10
+ Performance:
11
+ enabled: true
12
+
13
+ Layout/AlignParameters:
14
+ EnforcedStyle: with_fixed_indentation
15
+
16
+ Layout/EmptyLineAfterMagicComment:
17
+ Enabled: false
18
+
19
+ Layout/IndentHash:
20
+ EnforcedStyle: consistent
21
+
22
+ Layout/MultilineOperationIndentation:
23
+ EnforcedStyle: indented
24
+
25
+ Layout/SpaceInsideStringInterpolation:
26
+ EnforcedStyle: space
27
+
28
+ Metrics/AbcSize:
29
+ Enabled: false
30
+
31
+ Metrics/BlockLength:
32
+ Enabled: false
33
+
34
+ Metrics/ClassLength:
35
+ Enabled: false
36
+
37
+ Metrics/CyclomaticComplexity:
38
+ Enabled: false
39
+
40
+ Metrics/LineLength:
41
+ Enabled: false
42
+
43
+ Metrics/MethodLength:
44
+ Enabled: false
45
+
46
+ Metrics/ModuleLength:
47
+ Enabled: false
48
+
49
+ Metrics/PerceivedComplexity:
50
+ Enabled: false
51
+
52
+ Style/FormatStringToken:
53
+ Enabled: false
54
+
55
+ Style/IfUnlessModifier:
56
+ Enabled: false
57
+
58
+ Style/Next:
59
+ MinBodyLength: 8
60
+
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+ source 'https://rubygems.org'
3
+
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2019 Evan Lecklider
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,102 @@
1
+ # Syro::Tilt
2
+
3
+ Render [Tilt][tilt] templates in [Syro][syro] routes.
4
+
5
+
6
+ ## Usage
7
+
8
+ An example Syro app using Syro::Tilt would look like this:
9
+
10
+ ```erb
11
+ <%# 'html.html.erb' %>
12
+ <% greeting = 'Hey there!' %>
13
+
14
+ <p>
15
+ <%= greeting %>
16
+ </p>
17
+ ```
18
+
19
+ ```ruby
20
+ require 'syro'
21
+ require 'syro/tilt'
22
+
23
+ app = Syro.new do
24
+ get do
25
+ render 'home'
26
+ end
27
+ end
28
+ ```
29
+
30
+ Calling `render` will look for a template file (e.g. "views/home.html.erb"),
31
+ render it in the context of the route, write the content to Syro's response, and
32
+ set the `Content-Type` header based on the file extension (i.e. the ".html"
33
+ means that it's a `text/html` response).
34
+
35
+
36
+ ## API
37
+
38
+ `partial`: render a template from Tilt into a string, optionally passing in
39
+ local variables and yielding to a block.
40
+
41
+ `render`: render a Tilt template to a string (using `partial`), write the
42
+ contents to Syro's response, and set the content type.
43
+
44
+ `layout`: set (or get) a layout file to be used to wrap calls to `render`.
45
+
46
+ `templates_directory`: the default directory to look for template files in.
47
+ Overwriting this method is the recommended way to configure your template
48
+ location. For example:
49
+
50
+ ```ruby
51
+ def templates_directory
52
+ 'app/views'
53
+ end
54
+ ```
55
+
56
+ `template_options`: a hash of options passed to `Tilt.new`. The class of the
57
+ template being instantiated is passed so you can customize the options for each
58
+ template engine. Overwriting this method is the recommended way to configure
59
+ template options per engine. For example:
60
+
61
+ ```ruby
62
+ def template_options(templ)
63
+ if templ == Hamlit::Block::Engine
64
+ { escape_html: true }
65
+ elsif templ == Tilt::ErubiTemplate
66
+ { engine_class: Erubi::CaptureEndEngine, escape: true, escape_capture: false, freeze: true, yield_returns_buffer: true }
67
+ else
68
+ {}
69
+ end
70
+ end
71
+ ```
72
+
73
+ `template`: create a new `Tilt` instance from a path to a template.
74
+
75
+ `content_for`: capture content for use later.
76
+
77
+
78
+ ## Installation
79
+
80
+ Add this line to your application's Gemfile:
81
+
82
+ ```ruby
83
+ gem 'syro-tilt', require: 'syro/tilt'
84
+ ```
85
+
86
+ And then execute:
87
+
88
+ $ bundle
89
+
90
+ Or install it yourself as:
91
+
92
+ $ gem install syro-tilt
93
+
94
+
95
+ ## License
96
+
97
+ The gem is available as open source under the terms of the [MIT License][mit].
98
+
99
+
100
+ [mit]: https://opensource.org/licenses/MIT
101
+ [syro]: https://github.com/soveran/syro
102
+ [tilt]: https://github.com/rtomayko/tilt
data/Rakefile ADDED
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+ require 'bundler/gem_tasks'
3
+ require 'rake/testtask'
4
+
5
+ Rake::TestTask.new(:test) do |t|
6
+ t.libs << 'test'
7
+ t.libs << 'lib'
8
+ t.test_files = FileList['test/**/*_test.rb']
9
+ end
10
+
11
+ task default: :test
data/lib/syro/tilt.rb ADDED
@@ -0,0 +1,191 @@
1
+ # frozen_string_literal: true
2
+ require 'syro'
3
+ require 'tilt'
4
+
5
+ class Syro # :nodoc:
6
+ # Render Tilt templates in Syro routes.
7
+ module Tilt
8
+ DEFAULT_MIME_TYPE = 'text/plain'
9
+ DOT = '.'
10
+ EMPTY = ''
11
+ HTTP_ACCEPT = 'HTTP_ACCEPT'
12
+ MIME_TYPE_ANY = '*/*'
13
+
14
+ ACCEPT_CAPTURE_QUALITY = /\Aq=([\d.]+)/.freeze
15
+ ACCEPT_SPLIT_MULTIPLES = /\s*,\s*/.freeze
16
+ ACCEPT_SPLIT_PARTS = /\s*;\s*/.freeze
17
+
18
+ # A Tilt template for the file path passed in.
19
+ #
20
+ # @return [Tilt::Template]
21
+ def template(path)
22
+ ::Tilt.new(path, template_options(::Tilt.template_for(path)))
23
+ end
24
+
25
+ # Options passed to Tilt.new.
26
+ #
27
+ # @param templ [Class]
28
+ # The class of the template engine being used e.g. "Tilt::ErubiTemplate".
29
+ #
30
+ # @return [Hash]
31
+ def template_options(_templ = nil)
32
+ {}
33
+ end
34
+
35
+ # The default directory to look for templates within.
36
+ #
37
+ # @return [String]
38
+ def templates_directory
39
+ 'views'
40
+ end
41
+
42
+ # Find a template's file path based on a "fuzzy" name like "posts/show". The
43
+ # HTTP Accept header will be checked and the first template found that
44
+ # matches the MIME type of the Accept header will be used, otherwise the
45
+ # first matching template file will be used.
46
+ #
47
+ # @param path [String]
48
+ # A "fuzzy" file path like "posts/show".
49
+ # @param from [String]
50
+ # The directory to look for templates within.
51
+ #
52
+ # @return [String]
53
+ # The path to the template file.
54
+ def template_path(path, from = nil)
55
+ from ||= templates_directory
56
+ path = File.join(from, path)
57
+
58
+ accepts = env.fetch(HTTP_ACCEPT) { EMPTY }.to_s.then do |header|
59
+ # Taken from Rack::Request#parse_http_accept_header (which is a private
60
+ # method).
61
+ header.split(ACCEPT_SPLIT_MULTIPLES).map do |part|
62
+ attribute, parameters = part.split(ACCEPT_SPLIT_PARTS, 2)
63
+ quality = 1.0
64
+
65
+ if parameters && ACCEPT_CAPTURE_QUALITY.match?(parameters)
66
+ quality = ACCEPT_CAPTURE_QUALITY.match(parameters)[1].to_f
67
+ end
68
+
69
+ [attribute, quality]
70
+ end
71
+ end
72
+
73
+ # Reject "*/*" because it will always match the first thing it is compared
74
+ # to, regardless of wether there's a better match coming up.
75
+ accepts.reject! { |acc, _q| acc == MIME_TYPE_ANY }
76
+
77
+ # Find all potential templates e.g. ones with the same name but different
78
+ # template engines or MIME types.
79
+ potentials = Dir.glob(File.join(from, '**', '*')).filter do |potential|
80
+ potential.start_with?(path)
81
+ end.sort
82
+
83
+ # Select the best potential template match based on MIME type and HTTP
84
+ # Accept header.
85
+ potentials.find do |potential|
86
+ content_type = template_mime_type(potential)
87
+
88
+ accepts.any? do |acc, _quality|
89
+ Rack::Mime.match?(content_type, acc)
90
+ end
91
+ end || potentials.first
92
+ end
93
+
94
+ # Get the MIME type of a template file. The MIME type is looked up from
95
+ # Rack's MIME type list.
96
+ #
97
+ # @return [String]
98
+ def template_mime_type(path)
99
+ File.basename(path).split(DOT).reverse.map do |ext|
100
+ Rack::Mime::MIME_TYPES[".#{ ext.downcase }"]
101
+ end.compact.first || DEFAULT_MIME_TYPE
102
+ end
103
+
104
+ # Generate a string by rendering the Tilt template in the context of `self`
105
+ # with the locals that were passed in.
106
+ #
107
+ # @example
108
+ # partial('posts/show') # => "OMG look at this page!"
109
+ #
110
+ # @param path [String]
111
+ # The path to the view template you'd like to render.
112
+ # @param locals [Hash]
113
+ # The local variables to pass to the template.
114
+ # @option locals [String] :from
115
+ # The directory to look for templates within.
116
+ #
117
+ # @return [String]
118
+ def partial(path, locals = {})
119
+ template(template_path(path, locals.delete(:from))).render(self, locals) { yield if block_given? }
120
+ end
121
+
122
+ # Set or get the current layout. A layout is just another template to wrap
123
+ # other templates in. If set, it'll be used by #render.
124
+ #
125
+ # @param path [String]
126
+ # A path to a template file.
127
+ #
128
+ # @return [String, nil]
129
+ def layout(templ = nil)
130
+ inbox[:tilt_layout] = templ if templ
131
+ inbox[:tilt_layout]
132
+ end
133
+
134
+ # Render a template to Syro's #res object and write the appropriate MIME
135
+ # type based on the rendered template.
136
+ #
137
+ # @param path [String]
138
+ # The path to a view file.
139
+ # @param locals [Hash]
140
+ # Local variables that should be accessible to the view.
141
+ # @option locals [String] :from
142
+ # The directory to look for templates within.
143
+ def render(path, locals = {})
144
+ content = partial(path, locals.dup) { yield if block_given? }
145
+ content = partial(layout, locals.dup) { content } if layout
146
+
147
+ res.headers[Rack::CONTENT_TYPE] = template_mime_type(template_path(path, locals[:from]))
148
+ res.write content
149
+ end
150
+
151
+ # Capture content from a block for use later. Note that capturing the block
152
+ # is not implemented here due to the differences in varying template
153
+ # languages. Erubi::CaptureEndEngine and Hamlit::Block::Engine work well
154
+ # with this method.
155
+ #
156
+ # @param key [Symbol]
157
+ # The content key name.
158
+ #
159
+ # @return [String]
160
+ # An empty string if content is provided, otherwise the joined contents of
161
+ # the provided key.
162
+ def content_for(key)
163
+ inbox[:tilt_content_for] ||= {}
164
+ inbox[:tilt_content_for][key] ||= []
165
+
166
+ if block_given?
167
+ inbox[:tilt_content_for][key].push yield
168
+
169
+ EMPTY # Returned to prevent the result of #push from displaying.
170
+ else
171
+ inbox[:tilt_content_for].delete(key).join
172
+ end
173
+ end
174
+
175
+ # Determine if there's content to display.
176
+ #
177
+ # @param key [Symbol]
178
+ # The key to check for captured content for.
179
+ #
180
+ # @return [Boolean]
181
+ # Have we captured any content for this key?
182
+ def content_for?(key)
183
+ inbox[:tilt_content_for] ||= {}
184
+ inbox[:tilt_content_for][key] ||= []
185
+
186
+ !inbox[:tilt_content_for][key].empty?
187
+ end
188
+ end
189
+
190
+ Deck.include Tilt
191
+ end
data/syro-tilt.gemspec ADDED
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+ Gem::Specification.new do |spec|
3
+ spec.name = 'syro-tilt'
4
+ spec.version = '0.1.0'
5
+ spec.authors = ['Evan Lecklider']
6
+ spec.email = ['evan@lecklider.com']
7
+ spec.summary = 'Render Tilt templates in Syro routes.'
8
+ spec.description = 'Render Tilt templates in Syro routes.'
9
+ spec.homepage = 'https://github.com/evanleck/syro-tilt'
10
+ spec.license = 'MIT'
11
+ spec.files = `git ls-files`.split("\n")
12
+ spec.require_paths = ['lib']
13
+
14
+ spec.add_dependency 'syro', '~> 3.0'
15
+ spec.add_dependency 'tilt', '~> 2.0'
16
+
17
+ spec.add_development_dependency 'bundler', '~> 2.0'
18
+ spec.add_development_dependency 'minitest', '~> 5.0'
19
+ spec.add_development_dependency 'rake', '~> 10.0'
20
+ end
@@ -0,0 +1,149 @@
1
+ # frozen_string_literal: true
2
+ require_relative '../lib/syro/tilt'
3
+ require 'minitest/autorun'
4
+ require 'syro'
5
+
6
+ describe Syro::Tilt do
7
+ include Syro::Tilt
8
+
9
+ let(:inbox) do
10
+ {}
11
+ end
12
+
13
+ let(:templates_directory) do
14
+ 'test/views'
15
+ end
16
+
17
+ let(:env) do
18
+ {}
19
+ end
20
+
21
+ describe '#template_path' do
22
+ it 'returns the path for an existing file' do
23
+ assert_equal 'test/views/plain.txt.erb', template_path('plain.txt.erb')
24
+ end
25
+
26
+ it 'finds the first match for an ambiguous file' do
27
+ assert_equal 'test/views/plain.txt.erb', template_path('plain')
28
+ end
29
+
30
+ it "returns nil for files that don't exist" do
31
+ assert_nil template_path('nah.txt')
32
+ end
33
+ end
34
+
35
+ describe '#layout' do
36
+ it 'is nil by default' do
37
+ assert_nil layout
38
+ end
39
+
40
+ it 'can be set' do
41
+ layout('something')
42
+
43
+ assert_equal 'something', layout
44
+ end
45
+ end
46
+
47
+ describe '#partial' do
48
+ it 'returns the contents of a template' do
49
+ assert_equal "Plain text.\n", partial('plain')
50
+ end
51
+
52
+ it 'accepts local variables' do
53
+ assert_equal "Locals rule!\n", partial('locals', what: 'rule')
54
+ end
55
+
56
+ it 'accepts a block' do
57
+ assert_equal "Layout!\n\nNot so plain!\n\n", partial('layout') { partial('notsoplain') }
58
+ end
59
+
60
+ describe 'template disambiguation' do
61
+ it 'picks the first one found without clear accepts' do
62
+ assert_equal "This is the first.\n", partial('typed')
63
+ end
64
+
65
+ describe 'disambiguation by HTTP Accept' do
66
+ let(:env) do
67
+ { 'HTTP_ACCEPT' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' }
68
+ end
69
+
70
+ it "checks the environment's 'Accept' header when present" do
71
+ assert_equal "This is HTML.\n", partial('typed')
72
+ end
73
+ end
74
+
75
+ describe 'disambiguation by HTTP Accept' do
76
+ let(:env) do
77
+ { 'HTTP_ACCEPT' => 'application/json' }
78
+ end
79
+
80
+ it "checks the environment's 'Accept' header when present" do
81
+ assert_equal %({ "thisis": "json" }\n), partial('typed')
82
+ end
83
+ end
84
+ end
85
+ end
86
+
87
+ describe '#render' do
88
+ let(:res) do
89
+ Syro::Response.new
90
+ end
91
+
92
+ it 'writes plain text to the response' do
93
+ render('plain')
94
+
95
+ assert_equal 'text/plain', res.headers['Content-Type']
96
+ assert_equal ["Plain text.\n"], res.body
97
+ end
98
+
99
+ it 'writes html text to the response' do
100
+ render('notsoplain')
101
+
102
+ assert_equal 'text/html', res.headers['Content-Type']
103
+ assert_equal ["Not so plain!\n"], res.body
104
+ end
105
+
106
+ it 'accepts local variables' do
107
+ render('locals', what: 'rule')
108
+
109
+ assert_equal ["Locals rule!\n"], res.body
110
+ end
111
+
112
+ it 'uses the layout when present' do
113
+ layout('layout')
114
+ render('notsoplain')
115
+
116
+ assert_equal ["Layout!\n\nNot so plain!\n\n"], res.body
117
+ end
118
+ end
119
+
120
+ describe '#content_for' do
121
+ it 'captures content from a block' do
122
+ content_for(:capture) do
123
+ 'This is a capture.'
124
+ end
125
+
126
+ assert_equal 'This is a capture.', content_for(:capture)
127
+ end
128
+
129
+ it 'deletes content once output' do
130
+ content_for(:capture) do
131
+ 'This is a capture.'
132
+ end
133
+
134
+ assert_equal 'This is a capture.', content_for(:capture)
135
+ assert_equal '', content_for(:capture)
136
+ end
137
+ end
138
+
139
+ describe '#content_for?' do
140
+ it 'reports captured content' do
141
+ content_for(:capture) do
142
+ 'This is a capture.'
143
+ end
144
+
145
+ assert content_for?(:capture)
146
+ refute content_for?(:notthere)
147
+ end
148
+ end
149
+ end
@@ -0,0 +1,3 @@
1
+ Layout!
2
+
3
+ <%= yield %>
@@ -0,0 +1 @@
1
+ Locals <%= what %>!
@@ -0,0 +1 @@
1
+ Not so plain!
@@ -0,0 +1 @@
1
+ Plain text.
@@ -0,0 +1 @@
1
+ This is the first.
@@ -0,0 +1 @@
1
+ This is HTML.
@@ -0,0 +1 @@
1
+ { "thisis": "json" }
metadata ADDED
@@ -0,0 +1,129 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: syro-tilt
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Evan Lecklider
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-03-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: syro
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: tilt
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '2.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '5.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '5.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '10.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '10.0'
83
+ description: Render Tilt templates in Syro routes.
84
+ email:
85
+ - evan@lecklider.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - ".gitignore"
91
+ - ".rubocop.yml"
92
+ - Gemfile
93
+ - LICENSE.txt
94
+ - README.md
95
+ - Rakefile
96
+ - lib/syro/tilt.rb
97
+ - syro-tilt.gemspec
98
+ - test/syro_tilt_test.rb
99
+ - test/views/layout.erb
100
+ - test/views/locals.erb
101
+ - test/views/notsoplain.html.erb
102
+ - test/views/plain.txt.erb
103
+ - test/views/typed.anope.erb
104
+ - test/views/typed.html.erb
105
+ - test/views/typed.json.erb
106
+ homepage: https://github.com/evanleck/syro-tilt
107
+ licenses:
108
+ - MIT
109
+ metadata: {}
110
+ post_install_message:
111
+ rdoc_options: []
112
+ require_paths:
113
+ - lib
114
+ required_ruby_version: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ required_rubygems_version: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ requirements: []
125
+ rubygems_version: 3.0.3
126
+ signing_key:
127
+ specification_version: 4
128
+ summary: Render Tilt templates in Syro routes.
129
+ test_files: []