tynn 1.0.0.rc1 → 1.0.0.rc2
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/README.md +1 -1
- data/lib/tynn.rb +49 -15
- data/lib/tynn/all_methods.rb +12 -10
- data/lib/tynn/environment.rb +39 -37
- data/lib/tynn/erubis.rb +10 -8
- data/lib/tynn/json.rb +36 -5
- data/lib/tynn/matchers.rb +49 -47
- data/lib/tynn/not_found.rb +12 -10
- data/lib/tynn/protection.rb +35 -6
- data/lib/tynn/render.rb +34 -42
- data/lib/tynn/request.rb +2 -0
- data/lib/tynn/response.rb +36 -2
- data/lib/tynn/secure_headers.rb +42 -40
- data/lib/tynn/session.rb +80 -78
- data/lib/tynn/ssl.rb +52 -50
- data/lib/tynn/static.rb +34 -32
- data/lib/tynn/test.rb +42 -40
- data/lib/tynn/version.rb +2 -2
- data/test/core_test.rb +0 -8
- data/test/middleware_test.rb +4 -4
- data/test/render_test.rb +1 -1
- metadata +5 -11
- data/lib/tynn/hmote.rb +0 -40
- data/lib/tynn/json_parser.rb +0 -36
- data/test/hmote_test.rb +0 -78
- data/test/json_parser_test.rb +0 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5991d5053c18550ff9e4640a0fb6ce8877e2e8d9
|
4
|
+
data.tar.gz: 546da7cc32f33b70f95abb79557fb05a1045bc01
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 73682ff6496225b2fee11bdf76bf262ded91308c5db2b7c4bd4442a5b152247b5a8ea5a23d57b7f96acc96f67e180eca4165518a38f5bb7b2feb9f84481e0b1a
|
7
|
+
data.tar.gz: 0a4b872f14749623d88aaac9e6ade93a787a67ac1ee5eb93350028845ba5d55f217923dd8f5d62aed61b2bfd4b40c29d238763659dec36cb4778570a20495d3f
|
data/README.md
CHANGED
data/lib/tynn.rb
CHANGED
@@ -28,7 +28,7 @@ class Tynn
|
|
28
28
|
# ```
|
29
29
|
#
|
30
30
|
def self.define(&block)
|
31
|
-
|
31
|
+
build_app(Syro.new(self, &block))
|
32
32
|
end
|
33
33
|
|
34
34
|
# Adds given Rack `middleware` to the stack.
|
@@ -46,16 +46,14 @@ class Tynn
|
|
46
46
|
end
|
47
47
|
|
48
48
|
def self.call(env) # :nodoc:
|
49
|
-
return
|
49
|
+
return @app.call(env)
|
50
50
|
end
|
51
51
|
|
52
|
-
def self.
|
53
|
-
fail("Missing application handler. Try #{ self }.define") unless @syro
|
54
|
-
|
52
|
+
def self.build_app(syro) # :nodoc:
|
55
53
|
if __middleware.empty?
|
56
|
-
|
54
|
+
@app = syro
|
57
55
|
else
|
58
|
-
|
56
|
+
@app = __middleware.reverse.inject(syro) { |a, m| m.call(a) }
|
59
57
|
end
|
60
58
|
end
|
61
59
|
|
@@ -64,7 +62,7 @@ class Tynn
|
|
64
62
|
end
|
65
63
|
|
66
64
|
def self.reset! # :nodoc:
|
67
|
-
@
|
65
|
+
@app = nil
|
68
66
|
@middleware = []
|
69
67
|
end
|
70
68
|
|
@@ -73,7 +71,7 @@ class Tynn
|
|
73
71
|
# ```
|
74
72
|
# module AppName
|
75
73
|
# def self.setup(app, name)
|
76
|
-
# app.
|
74
|
+
# app.set(:app_name, name)
|
77
75
|
# end
|
78
76
|
#
|
79
77
|
# def app_name
|
@@ -81,10 +79,6 @@ class Tynn
|
|
81
79
|
# end
|
82
80
|
#
|
83
81
|
# module ClassMethods
|
84
|
-
# def app_name=(new_name)
|
85
|
-
# settings[:app_name] = new_name
|
86
|
-
# end
|
87
|
-
#
|
88
82
|
# def app_name
|
89
83
|
# return settings[:app_name]
|
90
84
|
# end
|
@@ -95,7 +89,7 @@ class Tynn
|
|
95
89
|
#
|
96
90
|
# Tynn.app_name # => "MyApplication"
|
97
91
|
#
|
98
|
-
# Tynn.app_name
|
92
|
+
# Tynn.set(:app_name, "MyGreatestApp")
|
99
93
|
# Tynn.app_name # => "MyGreatestApp"
|
100
94
|
#
|
101
95
|
# Tynn.define do
|
@@ -107,7 +101,7 @@ class Tynn
|
|
107
101
|
#
|
108
102
|
# Check the [helpers][examples] that come with tynn for more examples.
|
109
103
|
#
|
110
|
-
# [examples]: https://github.com/
|
104
|
+
# [examples]: https://github.com/frodsan/tynn/tree/master/lib/tynn
|
111
105
|
#
|
112
106
|
def self.helpers(helper, *args, &block)
|
113
107
|
self.include(helper)
|
@@ -121,6 +115,10 @@ class Tynn
|
|
121
115
|
end
|
122
116
|
end
|
123
117
|
|
118
|
+
def self.set(key, value)
|
119
|
+
settings[key] = value
|
120
|
+
end
|
121
|
+
|
124
122
|
def request_class # :nodoc:
|
125
123
|
return Tynn::Request
|
126
124
|
end
|
@@ -128,4 +126,40 @@ class Tynn
|
|
128
126
|
def response_class # :nodoc:
|
129
127
|
return Tynn::Response
|
130
128
|
end
|
129
|
+
|
130
|
+
##
|
131
|
+
# :method: halt(response)
|
132
|
+
#
|
133
|
+
# Immediately stops the request and returns `response` as per
|
134
|
+
# Rack's specification.
|
135
|
+
#
|
136
|
+
# ```
|
137
|
+
# halt([200, { "Content-Type" => "text/html" }, ["hello"]])
|
138
|
+
# halt([res.status, res.headers, res.body])
|
139
|
+
# halt(res.finish)
|
140
|
+
# ```
|
141
|
+
|
142
|
+
##
|
143
|
+
# :method: req
|
144
|
+
#
|
145
|
+
# Returns the incoming request object. This object is an instance
|
146
|
+
# of Tynn::Request.
|
147
|
+
#
|
148
|
+
# ```
|
149
|
+
# req.post? # => true
|
150
|
+
# req.params # => { "username" => "bob", "password" => "secret" }
|
151
|
+
# req[:username] # => "bob"
|
152
|
+
# ```
|
153
|
+
|
154
|
+
##
|
155
|
+
# :method: res
|
156
|
+
#
|
157
|
+
# Returns the current response object. This object is an instance
|
158
|
+
# of Tynn::Response.
|
159
|
+
#
|
160
|
+
# ```
|
161
|
+
# res.status = 200
|
162
|
+
# res["Content-Type"] = "text/html"
|
163
|
+
# res.write("<h1>Welcome back!</h1>")
|
164
|
+
# ```
|
131
165
|
end
|
data/lib/tynn/all_methods.rb
CHANGED
@@ -1,17 +1,19 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
class Tynn
|
2
|
+
module AllMethods
|
3
|
+
def head
|
4
|
+
if root? && req.head?
|
5
|
+
yield
|
5
6
|
|
6
|
-
|
7
|
+
halt(res.finish)
|
8
|
+
end
|
7
9
|
end
|
8
|
-
end
|
9
10
|
|
10
|
-
|
11
|
-
|
12
|
-
|
11
|
+
def options
|
12
|
+
if root? && req.options?
|
13
|
+
yield
|
13
14
|
|
14
|
-
|
15
|
+
halt(res.finish)
|
16
|
+
end
|
15
17
|
end
|
16
18
|
end
|
17
19
|
end
|
data/lib/tynn/environment.rb
CHANGED
@@ -1,44 +1,46 @@
|
|
1
|
-
|
2
|
-
#
|
3
|
-
#
|
4
|
-
#
|
5
|
-
# require "tynn
|
6
|
-
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
|
10
|
-
#
|
11
|
-
#
|
12
|
-
# Tynn.
|
13
|
-
# Tynn.
|
14
|
-
#
|
15
|
-
#
|
16
|
-
#
|
17
|
-
#
|
18
|
-
#
|
19
|
-
#
|
20
|
-
#
|
21
|
-
#
|
22
|
-
|
23
|
-
|
24
|
-
app
|
25
|
-
|
26
|
-
|
27
|
-
module ClassMethods # :nodoc:
|
28
|
-
def environment
|
29
|
-
return settings[:environment]
|
1
|
+
class Tynn
|
2
|
+
# Adds helper methods to get and check the current environment.
|
3
|
+
#
|
4
|
+
# ```
|
5
|
+
# require "tynn"
|
6
|
+
# require "tynn/environment"
|
7
|
+
#
|
8
|
+
# Tynn.helpers(Tynn::Environment)
|
9
|
+
#
|
10
|
+
# Tynn.environment # => :development
|
11
|
+
#
|
12
|
+
# Tynn.development? # => true
|
13
|
+
# Tynn.production? # => false
|
14
|
+
# Tynn.test? # => false
|
15
|
+
# ```
|
16
|
+
#
|
17
|
+
# By default, the environment is based on `ENV["RACK_ENV"]`.
|
18
|
+
#
|
19
|
+
# ```
|
20
|
+
# Tynn.helpers(Tynn::Environment, env: ENV["RACK_ENV"])
|
21
|
+
# ```
|
22
|
+
#
|
23
|
+
module Environment
|
24
|
+
def self.setup(app, env: ENV["RACK_ENV"]) # :nodoc:
|
25
|
+
app.set(:environment, (env || :development).to_sym)
|
30
26
|
end
|
31
27
|
|
32
|
-
|
33
|
-
|
34
|
-
|
28
|
+
module ClassMethods # :nodoc:
|
29
|
+
def environment
|
30
|
+
return settings[:environment]
|
31
|
+
end
|
35
32
|
|
36
|
-
|
37
|
-
|
38
|
-
|
33
|
+
def development?
|
34
|
+
return environment == :development
|
35
|
+
end
|
36
|
+
|
37
|
+
def test?
|
38
|
+
return environment == :test
|
39
|
+
end
|
39
40
|
|
40
|
-
|
41
|
-
|
41
|
+
def production?
|
42
|
+
return environment == :production
|
43
|
+
end
|
42
44
|
end
|
43
45
|
end
|
44
46
|
end
|
data/lib/tynn/erubis.rb
CHANGED
@@ -1,15 +1,17 @@
|
|
1
1
|
require "erubis"
|
2
2
|
require_relative "render"
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
options =
|
4
|
+
class Tynn
|
5
|
+
module Erubis
|
6
|
+
def self.setup(app, options = {}) # :nodoc:
|
7
|
+
options = options.dup
|
7
8
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
options[:options] ||= {}
|
10
|
+
options[:options] = {
|
11
|
+
escape_html: true
|
12
|
+
}.merge!(options[:options])
|
12
13
|
|
13
|
-
|
14
|
+
app.helpers(Tynn::Render, options)
|
15
|
+
end
|
14
16
|
end
|
15
17
|
end
|
data/lib/tynn/json.rb
CHANGED
@@ -1,11 +1,42 @@
|
|
1
1
|
require "json"
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
class Tynn
|
4
|
+
# Adds helper methods for json generation.
|
5
|
+
#
|
6
|
+
# ```
|
7
|
+
# require "tynn"
|
8
|
+
# require "tynn/json"
|
9
|
+
#
|
10
|
+
# Tynn.helpers(Tynn::JSON)
|
11
|
+
# ```
|
12
|
+
#
|
13
|
+
module JSON
|
14
|
+
JSON_CONTENT_TYPE = "application/json".freeze # :nodoc:
|
5
15
|
|
6
|
-
|
7
|
-
|
16
|
+
# Calls `to_json` on `data` and writes the generated \JSON object into
|
17
|
+
# the response body. Also, It automatically sets the `Content-Type`
|
18
|
+
# header to `application/json`.
|
19
|
+
#
|
20
|
+
# ```
|
21
|
+
# Tynn.define do
|
22
|
+
# on("hash") do
|
23
|
+
# json(foo: "bar")
|
24
|
+
# end
|
25
|
+
#
|
26
|
+
# on("array") do
|
27
|
+
# json([1, 2, 3])
|
28
|
+
# end
|
29
|
+
#
|
30
|
+
# on("to_json") do
|
31
|
+
# json(Model.first)
|
32
|
+
# end
|
33
|
+
# end
|
34
|
+
# ```
|
35
|
+
#
|
36
|
+
def json(data)
|
37
|
+
res.headers[Rack::CONTENT_TYPE] = JSON_CONTENT_TYPE
|
8
38
|
|
9
|
-
|
39
|
+
res.write(data.to_json)
|
40
|
+
end
|
10
41
|
end
|
11
42
|
end
|
data/lib/tynn/matchers.rb
CHANGED
@@ -1,58 +1,60 @@
|
|
1
|
-
|
2
|
-
#
|
3
|
-
# ```
|
4
|
-
# require "tynn"
|
5
|
-
# require "tynn/matchers"
|
6
|
-
#
|
7
|
-
# Tynn.helpers(Tynn::Matchers)
|
8
|
-
# ```
|
9
|
-
#
|
10
|
-
module Tynn::Matchers
|
11
|
-
# A catch-all matcher.
|
1
|
+
class Tynn
|
2
|
+
# Adds extra matchers to Tynn.
|
12
3
|
#
|
13
4
|
# ```
|
14
|
-
#
|
15
|
-
#
|
16
|
-
# # ...
|
17
|
-
# end
|
5
|
+
# require "tynn"
|
6
|
+
# require "tynn/matchers"
|
18
7
|
#
|
19
|
-
#
|
20
|
-
# # ...
|
21
|
-
# end
|
22
|
-
# end
|
8
|
+
# Tynn.helpers(Tynn::Matchers)
|
23
9
|
# ```
|
24
10
|
#
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
11
|
+
module Matchers
|
12
|
+
# A catch-all matcher.
|
13
|
+
#
|
14
|
+
# ```
|
15
|
+
# Tynn.define do
|
16
|
+
# authenticated? do
|
17
|
+
# # ...
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
# default do # on true
|
21
|
+
# # ...
|
22
|
+
# end
|
23
|
+
# end
|
24
|
+
# ```
|
25
|
+
#
|
26
|
+
# :call-seq: default(&block)
|
27
|
+
#
|
28
|
+
def default
|
29
|
+
yield
|
29
30
|
|
30
|
-
|
31
|
-
|
31
|
+
halt(res.finish)
|
32
|
+
end
|
32
33
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
34
|
+
# Match if the given `key` is present in `req.params`.
|
35
|
+
#
|
36
|
+
# ```
|
37
|
+
# Tynn.define do
|
38
|
+
# param(:user) do |params|
|
39
|
+
# user = User.create(params)
|
40
|
+
#
|
41
|
+
# # ...
|
42
|
+
# end
|
43
|
+
#
|
44
|
+
# default do
|
45
|
+
# res.write("missing user param")
|
46
|
+
# end
|
47
|
+
# end
|
48
|
+
# ```
|
49
|
+
#
|
50
|
+
# :call-seq: param(key, &block)
|
51
|
+
#
|
52
|
+
def param(key)
|
53
|
+
if (v = req[key]) && !v.empty?
|
54
|
+
yield(v)
|
54
55
|
|
55
|
-
|
56
|
+
halt(res.finish)
|
57
|
+
end
|
56
58
|
end
|
57
59
|
end
|
58
60
|
end
|
data/lib/tynn/not_found.rb
CHANGED
@@ -1,16 +1,18 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
class Tynn
|
2
|
+
module NotFound
|
3
|
+
def call(*) # :nodoc:
|
4
|
+
result = super
|
4
5
|
|
5
|
-
|
6
|
-
|
6
|
+
if result[0] == 404 && result[2].empty?
|
7
|
+
not_found
|
7
8
|
|
8
|
-
|
9
|
-
|
10
|
-
|
9
|
+
return res.finish
|
10
|
+
else
|
11
|
+
return result
|
12
|
+
end
|
11
13
|
end
|
12
|
-
end
|
13
14
|
|
14
|
-
|
15
|
+
def not_found # :nodoc:
|
16
|
+
end
|
15
17
|
end
|
16
18
|
end
|