tynn 0.0.4 → 1.0.0.rc1
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/lib/tynn/all_methods.rb +17 -0
- data/lib/tynn/environment.rb +12 -8
- data/lib/tynn/matchers.rb +37 -19
- data/lib/tynn/request.rb +4 -0
- data/lib/tynn/response.rb +151 -0
- data/lib/tynn/secure_headers.rb +28 -4
- data/lib/tynn/session.rb +74 -3
- data/lib/tynn/ssl.rb +2 -2
- data/lib/tynn/static.rb +26 -0
- data/lib/tynn/test.rb +37 -2
- data/lib/tynn/version.rb +7 -2
- data/lib/tynn.rb +88 -8
- data/test/all_methods_test.rb +16 -0
- data/test/core_test.rb +0 -86
- data/test/matchers_test.rb +11 -8
- data/test/middleware_test.rb +79 -0
- data/test/protection_test.rb +37 -0
- data/test/session_test.rb +1 -6
- metadata +45 -52
- data/.gems +0 -10
- data/docs/bin/build +0 -38
- data/docs/guides/security.md +0 -1
- data/docs/index.md +0 -89
- data/docs/layout.html +0 -61
- data/docs/public/.gitignore +0 -1
- data/docs/public/css/styles.css +0 -111
- data/docs/public/guides/.gitignore +0 -2
- data/docs/syro/syro.rb +0 -112
- data/examples/composition.ru +0 -40
- data/examples/hello.ru +0 -9
- data/examples/protection.ru +0 -18
- data/examples/render.ru +0 -13
- data/examples/views/home.erb +0 -1
- data/examples/views/layout.erb +0 -5
- data/lib/tynn/csrf.rb +0 -48
- data/lib/tynn/options.rb +0 -9
- data/makefile +0 -15
- data/test/csrf_test.rb +0 -98
- data/test/options_test.rb +0 -16
- data/test/views/custom_layout.erb +0 -1
- data/test/views/custom_layout.mote +0 -1
- data/test/views/layout.erb +0 -1
- data/test/views/layout.mote +0 -1
- data/test/views/partial.erb +0 -1
- data/test/views/partial.mote +0 -1
- data/test/views/view.erb +0 -1
- data/test/views/view.mote +0 -1
- data/tynn.gemspec +0 -24
data/test/core_test.rb
CHANGED
@@ -71,89 +71,3 @@ test "raise unless application handler is set" do
|
|
71
71
|
app.get("/")
|
72
72
|
end
|
73
73
|
end
|
74
|
-
|
75
|
-
scope "middleware" do
|
76
|
-
class Shrimp
|
77
|
-
def initialize(app)
|
78
|
-
@app = app
|
79
|
-
end
|
80
|
-
|
81
|
-
def call(env)
|
82
|
-
s, h, resp = @app.call(env)
|
83
|
-
|
84
|
-
return [s, h, resp.reverse]
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
setup do
|
89
|
-
Tynn.reset!
|
90
|
-
end
|
91
|
-
|
92
|
-
test "middleware in main application" do
|
93
|
-
Tynn.use(Shrimp)
|
94
|
-
|
95
|
-
Tynn.define do
|
96
|
-
get do
|
97
|
-
res.write("1")
|
98
|
-
res.write("2")
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
app = Tynn::Test.new
|
103
|
-
app.get("/")
|
104
|
-
|
105
|
-
assert_equal 200, app.res.status
|
106
|
-
assert_equal "21", app.res.body
|
107
|
-
end
|
108
|
-
|
109
|
-
test "middleware with composition" do
|
110
|
-
Tynn.use(Shrimp)
|
111
|
-
|
112
|
-
Tynn.define do
|
113
|
-
on "api" do
|
114
|
-
run(API)
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
class API < Tynn
|
119
|
-
end
|
120
|
-
|
121
|
-
API.define do
|
122
|
-
get do
|
123
|
-
res.write("1")
|
124
|
-
res.write("2")
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
|
-
app = Tynn::Test.new
|
129
|
-
app.get("/api")
|
130
|
-
|
131
|
-
assert_equal 200, app.res.status
|
132
|
-
assert_equal "21", app.res.body
|
133
|
-
end
|
134
|
-
|
135
|
-
test "middleware only in child application" do
|
136
|
-
Tynn.define do
|
137
|
-
on "api" do
|
138
|
-
run(API)
|
139
|
-
end
|
140
|
-
end
|
141
|
-
|
142
|
-
class API < Tynn
|
143
|
-
use(Shrimp)
|
144
|
-
end
|
145
|
-
|
146
|
-
API.define do
|
147
|
-
get do
|
148
|
-
res.write("1")
|
149
|
-
res.write("2")
|
150
|
-
end
|
151
|
-
end
|
152
|
-
|
153
|
-
app = Tynn::Test.new
|
154
|
-
app.get("/api")
|
155
|
-
|
156
|
-
assert_equal 200, app.res.status
|
157
|
-
assert_equal "21", app.res.body
|
158
|
-
end
|
159
|
-
end
|
data/test/matchers_test.rb
CHANGED
@@ -19,19 +19,22 @@ test "default" do |app|
|
|
19
19
|
assert_equal "foo", app.res.body
|
20
20
|
end
|
21
21
|
|
22
|
-
test "param
|
22
|
+
test "param" do |app|
|
23
23
|
Tynn.define do
|
24
|
-
|
25
|
-
res.write(
|
24
|
+
param(:foo) do |foo|
|
25
|
+
res.write(foo)
|
26
|
+
end
|
27
|
+
|
28
|
+
param("bar") do |bar|
|
29
|
+
res.write(bar)
|
26
30
|
end
|
27
31
|
end
|
28
32
|
|
29
|
-
app.get("/")
|
33
|
+
app.get("/", foo: "foo")
|
30
34
|
|
31
|
-
assert_equal
|
35
|
+
assert_equal "foo", app.res.body
|
32
36
|
|
33
|
-
app.get("/",
|
37
|
+
app.get("/", foo: "bar")
|
34
38
|
|
35
|
-
assert_equal
|
36
|
-
assert_equal "foo", app.res.body
|
39
|
+
assert_equal "bar", app.res.body
|
37
40
|
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
class Shrimp
|
2
|
+
def initialize(app)
|
3
|
+
@app = app
|
4
|
+
end
|
5
|
+
|
6
|
+
def call(env)
|
7
|
+
status, headers, body = @app.call(env)
|
8
|
+
|
9
|
+
return [status, headers, body.reverse]
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
test "middleware in main application" do
|
14
|
+
Tynn.use(Shrimp)
|
15
|
+
|
16
|
+
Tynn.define do
|
17
|
+
get do
|
18
|
+
res.write("1")
|
19
|
+
res.write("2")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
app = Tynn::Test.new
|
24
|
+
app.get("/")
|
25
|
+
|
26
|
+
assert_equal 200, app.res.status
|
27
|
+
assert_equal "21", app.res.body
|
28
|
+
end
|
29
|
+
|
30
|
+
test "middleware with composition" do
|
31
|
+
Tynn.use(Shrimp)
|
32
|
+
|
33
|
+
Tynn.define do
|
34
|
+
on "api" do
|
35
|
+
run(API)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
class API < Tynn
|
40
|
+
end
|
41
|
+
|
42
|
+
API.define do
|
43
|
+
get do
|
44
|
+
res.write("1")
|
45
|
+
res.write("2")
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
app = Tynn::Test.new
|
50
|
+
app.get("/api")
|
51
|
+
|
52
|
+
assert_equal 200, app.res.status
|
53
|
+
assert_equal "21", app.res.body
|
54
|
+
end
|
55
|
+
|
56
|
+
test "middleware only in child application" do
|
57
|
+
Tynn.define do
|
58
|
+
on "api" do
|
59
|
+
run(API)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
class API < Tynn
|
64
|
+
use(Shrimp)
|
65
|
+
end
|
66
|
+
|
67
|
+
API.define do
|
68
|
+
get do
|
69
|
+
res.write("1")
|
70
|
+
res.write("2")
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
app = Tynn::Test.new
|
75
|
+
app.get("/api")
|
76
|
+
|
77
|
+
assert_equal 200, app.res.status
|
78
|
+
assert_equal "21", app.res.body
|
79
|
+
end
|
data/test/protection_test.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require_relative "../lib/tynn/protection"
|
2
|
+
require_relative "../lib/tynn/session"
|
2
3
|
|
3
4
|
test "includes secure headers" do
|
4
5
|
Tynn.helpers(Tynn::Protection)
|
@@ -27,3 +28,39 @@ test "supports hsts options" do
|
|
27
28
|
|
28
29
|
assert_equal "max-age=100; preload", hsts
|
29
30
|
end
|
31
|
+
|
32
|
+
test "adds secure flag to session cookie" do
|
33
|
+
Tynn.helpers(Tynn::Protection, ssl: true)
|
34
|
+
Tynn.helpers(Tynn::Session, secret: "_this_must_be_random_")
|
35
|
+
|
36
|
+
Tynn.define do
|
37
|
+
root do
|
38
|
+
session[:foo] = "foo"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
app = Tynn::Test.new
|
43
|
+
app.get("/", {}, "HTTPS" => "on")
|
44
|
+
|
45
|
+
session, _ = app.res.headers["Set-Cookie"].split("\n")
|
46
|
+
|
47
|
+
assert(/;\s*secure\s*(;|$)/i === session)
|
48
|
+
end
|
49
|
+
|
50
|
+
test "if session uses secure flag" do
|
51
|
+
Tynn.helpers(Tynn::Protection, ssl: true)
|
52
|
+
Tynn.helpers(Tynn::Session, secret: "_this_must_be_random_", secure: true)
|
53
|
+
|
54
|
+
Tynn.define do
|
55
|
+
root do
|
56
|
+
session[:foo] = "foo"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
app = Tynn::Test.new
|
61
|
+
app.get("/", {}, "HTTPS" => "on")
|
62
|
+
|
63
|
+
session, _ = app.res.headers["Set-Cookie"].split("\n")
|
64
|
+
|
65
|
+
assert(/;\s*secure\s*(;|$)/i === session)
|
66
|
+
end
|
data/test/session_test.rb
CHANGED
@@ -15,11 +15,6 @@ test "session" do
|
|
15
15
|
app = Tynn::Test.new
|
16
16
|
app.get("/")
|
17
17
|
|
18
|
-
env = app.req.env
|
19
|
-
session = env["rack.session"]
|
20
|
-
session_options = env["rack.session.options"]
|
21
|
-
|
22
18
|
assert_equal "foo", app.res.body
|
23
|
-
assert_equal "foo", session["foo"]
|
24
|
-
assert_equal true, session_options[:http_only]
|
19
|
+
assert_equal "foo", app.req.env["rack.session"]["foo"]
|
25
20
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tynn
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 1.0.0.rc1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Francesco Rodríguez
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-10-
|
11
|
+
date: 2015-10-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
@@ -28,44 +28,44 @@ dependencies:
|
|
28
28
|
name: seteable
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 1.1
|
33
|
+
version: '1.1'
|
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: 1.1
|
40
|
+
version: '1.1'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: syro
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '1.
|
47
|
+
version: '1.1'
|
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: '1.
|
54
|
+
version: '1.1'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: cutest
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 1.2
|
61
|
+
version: '1.2'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 1.2
|
68
|
+
version: '1.2'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: erubis
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -84,30 +84,30 @@ dependencies:
|
|
84
84
|
name: hmote
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- -
|
87
|
+
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: 1.4
|
89
|
+
version: '1.4'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- -
|
94
|
+
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: 1.4
|
96
|
+
version: '1.4'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: rack-test
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- -
|
101
|
+
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: 0.6
|
103
|
+
version: '0.6'
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- -
|
108
|
+
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: 0.6
|
110
|
+
version: '0.6'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: tilt
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -129,25 +129,10 @@ executables: []
|
|
129
129
|
extensions: []
|
130
130
|
extra_rdoc_files: []
|
131
131
|
files:
|
132
|
-
- ".gems"
|
133
132
|
- LICENSE
|
134
133
|
- README.md
|
135
|
-
- docs/bin/build
|
136
|
-
- docs/guides/security.md
|
137
|
-
- docs/index.md
|
138
|
-
- docs/layout.html
|
139
|
-
- docs/public/.gitignore
|
140
|
-
- docs/public/css/styles.css
|
141
|
-
- docs/public/guides/.gitignore
|
142
|
-
- docs/syro/syro.rb
|
143
|
-
- examples/composition.ru
|
144
|
-
- examples/hello.ru
|
145
|
-
- examples/protection.ru
|
146
|
-
- examples/render.ru
|
147
|
-
- examples/views/home.erb
|
148
|
-
- examples/views/layout.erb
|
149
134
|
- lib/tynn.rb
|
150
|
-
- lib/tynn/
|
135
|
+
- lib/tynn/all_methods.rb
|
151
136
|
- lib/tynn/environment.rb
|
152
137
|
- lib/tynn/erubis.rb
|
153
138
|
- lib/tynn/hmote.rb
|
@@ -155,18 +140,18 @@ files:
|
|
155
140
|
- lib/tynn/json_parser.rb
|
156
141
|
- lib/tynn/matchers.rb
|
157
142
|
- lib/tynn/not_found.rb
|
158
|
-
- lib/tynn/options.rb
|
159
143
|
- lib/tynn/protection.rb
|
160
144
|
- lib/tynn/render.rb
|
145
|
+
- lib/tynn/request.rb
|
146
|
+
- lib/tynn/response.rb
|
161
147
|
- lib/tynn/secure_headers.rb
|
162
148
|
- lib/tynn/session.rb
|
163
149
|
- lib/tynn/ssl.rb
|
164
150
|
- lib/tynn/static.rb
|
165
151
|
- lib/tynn/test.rb
|
166
152
|
- lib/tynn/version.rb
|
167
|
-
-
|
153
|
+
- test/all_methods_test.rb
|
168
154
|
- test/core_test.rb
|
169
|
-
- test/csrf_test.rb
|
170
155
|
- test/environment_test.rb
|
171
156
|
- test/erubis_test.rb
|
172
157
|
- test/helper.rb
|
@@ -174,23 +159,14 @@ files:
|
|
174
159
|
- test/json_parser_test.rb
|
175
160
|
- test/json_test.rb
|
176
161
|
- test/matchers_test.rb
|
162
|
+
- test/middleware_test.rb
|
177
163
|
- test/not_found_test.rb
|
178
|
-
- test/options_test.rb
|
179
164
|
- test/protection_test.rb
|
180
165
|
- test/render_test.rb
|
181
166
|
- test/secure_headers_test.rb
|
182
167
|
- test/session_test.rb
|
183
168
|
- test/ssl_test.rb
|
184
169
|
- test/static_test.rb
|
185
|
-
- test/views/custom_layout.erb
|
186
|
-
- test/views/custom_layout.mote
|
187
|
-
- test/views/layout.erb
|
188
|
-
- test/views/layout.mote
|
189
|
-
- test/views/partial.erb
|
190
|
-
- test/views/partial.mote
|
191
|
-
- test/views/view.erb
|
192
|
-
- test/views/view.mote
|
193
|
-
- tynn.gemspec
|
194
170
|
homepage: https://github.com/harmoni/tynn
|
195
171
|
licenses:
|
196
172
|
- MIT
|
@@ -206,13 +182,30 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
206
182
|
version: '0'
|
207
183
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
208
184
|
requirements:
|
209
|
-
- - "
|
185
|
+
- - ">"
|
210
186
|
- !ruby/object:Gem::Version
|
211
|
-
version:
|
187
|
+
version: 1.3.1
|
212
188
|
requirements: []
|
213
189
|
rubyforge_project:
|
214
190
|
rubygems_version: 2.4.8
|
215
191
|
signing_key:
|
216
192
|
specification_version: 4
|
217
193
|
summary: Simple library to create Rack applications
|
218
|
-
test_files:
|
194
|
+
test_files:
|
195
|
+
- test/all_methods_test.rb
|
196
|
+
- test/core_test.rb
|
197
|
+
- test/environment_test.rb
|
198
|
+
- test/erubis_test.rb
|
199
|
+
- test/helper.rb
|
200
|
+
- test/hmote_test.rb
|
201
|
+
- test/json_parser_test.rb
|
202
|
+
- test/json_test.rb
|
203
|
+
- test/matchers_test.rb
|
204
|
+
- test/middleware_test.rb
|
205
|
+
- test/not_found_test.rb
|
206
|
+
- test/protection_test.rb
|
207
|
+
- test/render_test.rb
|
208
|
+
- test/secure_headers_test.rb
|
209
|
+
- test/session_test.rb
|
210
|
+
- test/ssl_test.rb
|
211
|
+
- test/static_test.rb
|
data/.gems
DELETED
data/docs/bin/build
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require "redcarpet"
|
4
|
-
|
5
|
-
LAYOUT = File.read("./docs/layout.html")
|
6
|
-
|
7
|
-
def markdown(text)
|
8
|
-
options = {
|
9
|
-
autolink: true,
|
10
|
-
fenced_code_blocks: true,
|
11
|
-
tables: true
|
12
|
-
}
|
13
|
-
|
14
|
-
renderer = Redcarpet::Render::HTML.new
|
15
|
-
markdown = Redcarpet::Markdown.new(renderer, options)
|
16
|
-
|
17
|
-
return markdown.render(text)
|
18
|
-
end
|
19
|
-
|
20
|
-
def title(content)
|
21
|
-
return content.match(/<h1>(.*)<\/h1>/)[1]
|
22
|
-
end
|
23
|
-
|
24
|
-
def render(content)
|
25
|
-
markdown = markdown(content)
|
26
|
-
title = title(markdown)
|
27
|
-
|
28
|
-
return sprintf(LAYOUT, content: markdown, title: title)
|
29
|
-
end
|
30
|
-
|
31
|
-
Dir["./docs/**/*.md"].each do |file|
|
32
|
-
_, name = file.split("./docs")
|
33
|
-
|
34
|
-
name = name.sub(".md", ".html")
|
35
|
-
output = File.join("./docs/public", name)
|
36
|
-
|
37
|
-
File.write(output, render(File.read(file)))
|
38
|
-
end
|
data/docs/guides/security.md
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
# Security
|
data/docs/index.md
DELETED
@@ -1,89 +0,0 @@
|
|
1
|
-
# Getting Started
|
2
|
-
|
3
|
-
## Subtitle
|
4
|
-
|
5
|
-
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
|
6
|
-
Donec magna sapien, dignissim at tellus lobortis, finibus
|
7
|
-
pulvinar nulla. Nulla non ante ut mauris accumsan
|
8
|
-
vulputate at sed tortor. Integer dignissim massa at elit
|
9
|
-
pretium dapibus. Duis pretium erat dolor, vel luctus quam
|
10
|
-
pretium eget. Fusce imperdiet est in quam semper, ac
|
11
|
-
hendrerit risus hendrerit. Praesent convallis, risus
|
12
|
-
tempor lacinia posuere, quam diam porttitor magna, eget
|
13
|
-
pharetra turpis dui id est. Suspendisse pharetra mauris
|
14
|
-
nulla, eget sagittis risus cursus eget. Donec efficitur
|
15
|
-
odio non risus luctus, nec posuere nulla fermentum.
|
16
|
-
|
17
|
-
## Subtitle
|
18
|
-
|
19
|
-
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
|
20
|
-
Donec magna sapien, dignissim at tellus lobortis, finibus
|
21
|
-
pulvinar nulla. Nulla non ante ut mauris accumsan
|
22
|
-
vulputate at sed tortor. Integer dignissim massa at elit
|
23
|
-
pretium dapibus. Duis pretium erat dolor, vel luctus quam
|
24
|
-
pretium eget. Fusce imperdiet est in quam semper, ac
|
25
|
-
hendrerit risus hendrerit. Praesent convallis, risus
|
26
|
-
tempor lacinia posuere, quam diam porttitor magna, eget
|
27
|
-
pharetra turpis dui id est. Suspendisse pharetra mauris
|
28
|
-
nulla, eget sagittis risus cursus eget. Donec efficitur
|
29
|
-
odio non risus luctus, nec posuere nulla fermentum.
|
30
|
-
|
31
|
-
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
|
32
|
-
Donec magna sapien, dignissim at tellus lobortis, finibus
|
33
|
-
pulvinar nulla. Nulla non ante ut mauris accumsan
|
34
|
-
vulputate at sed tortor. Integer dignissim massa at elit
|
35
|
-
pretium dapibus. Duis pretium erat dolor, vel luctus quam
|
36
|
-
pretium eget. Fusce imperdiet est in quam semper, ac
|
37
|
-
hendrerit risus hendrerit. Praesent convallis, risus
|
38
|
-
tempor lacinia posuere, quam diam porttitor magna, eget
|
39
|
-
pharetra turpis dui id est. Suspendisse pharetra mauris
|
40
|
-
nulla, eget sagittis risus cursus eget. Donec efficitur
|
41
|
-
odio non risus luctus, nec posuere nulla fermentum.
|
42
|
-
|
43
|
-
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
|
44
|
-
Donec magna sapien, dignissim at tellus lobortis, finibus
|
45
|
-
pulvinar nulla. Nulla non ante ut mauris accumsan
|
46
|
-
vulputate at sed tortor. Integer dignissim massa at elit
|
47
|
-
pretium dapibus. Duis pretium erat dolor, vel luctus quam
|
48
|
-
pretium eget. Fusce imperdiet est in quam semper, ac
|
49
|
-
hendrerit risus hendrerit. Praesent convallis, risus
|
50
|
-
tempor lacinia posuere, quam diam porttitor magna, eget
|
51
|
-
pharetra turpis dui id est. Suspendisse pharetra mauris
|
52
|
-
nulla, eget sagittis risus cursus eget. Donec efficitur
|
53
|
-
odio non risus luctus, nec posuere nulla fermentum.
|
54
|
-
|
55
|
-
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
|
56
|
-
Donec magna sapien, dignissim at tellus lobortis, finibus
|
57
|
-
pulvinar nulla. Nulla non ante ut mauris accumsan
|
58
|
-
vulputate at sed tortor. Integer dignissim massa at elit
|
59
|
-
pretium dapibus. Duis pretium erat dolor, vel luctus quam
|
60
|
-
pretium eget. Fusce imperdiet est in quam semper, ac
|
61
|
-
hendrerit risus hendrerit. Praesent convallis, risus
|
62
|
-
tempor lacinia posuere, quam diam porttitor magna, eget
|
63
|
-
pharetra turpis dui id est. Suspendisse pharetra mauris
|
64
|
-
nulla, eget sagittis risus cursus eget. Donec efficitur
|
65
|
-
odio non risus luctus, nec posuere nulla fermentum.
|
66
|
-
|
67
|
-
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
|
68
|
-
Donec magna sapien, dignissim at tellus lobortis, finibus
|
69
|
-
pulvinar nulla. Nulla non ante ut mauris accumsan
|
70
|
-
vulputate at sed tortor. Integer dignissim massa at elit
|
71
|
-
pretium dapibus. Duis pretium erat dolor, vel luctus quam
|
72
|
-
pretium eget. Fusce imperdiet est in quam semper, ac
|
73
|
-
hendrerit risus hendrerit. Praesent convallis, risus
|
74
|
-
tempor lacinia posuere, quam diam porttitor magna, eget
|
75
|
-
pharetra turpis dui id est. Suspendisse pharetra mauris
|
76
|
-
nulla, eget sagittis risus cursus eget. Donec efficitur
|
77
|
-
odio non risus luctus, nec posuere nulla fermentum.
|
78
|
-
|
79
|
-
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
|
80
|
-
Donec magna sapien, dignissim at tellus lobortis, finibus
|
81
|
-
pulvinar nulla. Nulla non ante ut mauris accumsan
|
82
|
-
vulputate at sed tortor. Integer dignissim massa at elit
|
83
|
-
pretium dapibus. Duis pretium erat dolor, vel luctus quam
|
84
|
-
pretium eget. Fusce imperdiet est in quam semper, ac
|
85
|
-
hendrerit risus hendrerit. Praesent convallis, risus
|
86
|
-
tempor lacinia posuere, quam diam porttitor magna, eget
|
87
|
-
pharetra turpis dui id est. Suspendisse pharetra mauris
|
88
|
-
nulla, eget sagittis risus cursus eget. Donec efficitur
|
89
|
-
odio non risus luctus, nec posuere nulla fermentum.
|
data/docs/layout.html
DELETED
@@ -1,61 +0,0 @@
|
|
1
|
-
<!DOCTYPE html>
|
2
|
-
<html lang="en">
|
3
|
-
<head>
|
4
|
-
<meta charset="UTF-8" />
|
5
|
-
<title>tynn | %{title}</title>
|
6
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
7
|
-
<link href="/css/styles.css" rel="stylesheet" media="screen">
|
8
|
-
<link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
|
9
|
-
<link href="//fonts.googleapis.com/css?family=Roboto:400,500" rel="stylesheet">
|
10
|
-
</head>
|
11
|
-
<body>
|
12
|
-
<div class="container">
|
13
|
-
<header>
|
14
|
-
<div class="wrap">
|
15
|
-
<a class="nav-home" href="/">TYNN</a>
|
16
|
-
<a class="nav-github" href="https://github.com/frodsan/tynn">
|
17
|
-
<i class="fa fa-github"></i>
|
18
|
-
</a>
|
19
|
-
</div>
|
20
|
-
</header>
|
21
|
-
|
22
|
-
<section class="content wrap">
|
23
|
-
<div class="nav-docs">
|
24
|
-
<div class="nav-docs-section">
|
25
|
-
<h3>QUICK START</h3>
|
26
|
-
<ul>
|
27
|
-
<li><a href="#">Getting Started</a></li>
|
28
|
-
<li><a href="#">Tutorial</a></li>
|
29
|
-
</ul>
|
30
|
-
</div>
|
31
|
-
<div class="nav-docs-section">
|
32
|
-
<h3>Guides</h3>
|
33
|
-
<ul>
|
34
|
-
<li><a href="#">Link To Something</a></li>
|
35
|
-
<li><a href="#">Link to Something</a>
|
36
|
-
<ul>
|
37
|
-
<li><a href="#">Sublink</a></li>
|
38
|
-
<li><a href="#">Sublink</a></li>
|
39
|
-
</ul>
|
40
|
-
</li>
|
41
|
-
<li><a href="#">Link to Something</a></li>
|
42
|
-
<li><a href="#">Link to Something</a></li>
|
43
|
-
</ul>
|
44
|
-
</div>
|
45
|
-
<div class="nav-docs-section">
|
46
|
-
<h3>Community</h3>
|
47
|
-
<ul>
|
48
|
-
<li><a href="#">Slack</a></li>
|
49
|
-
<li><a href="#">Link to Something</a></li>
|
50
|
-
<li><a href="#">Link to Something</a></li>
|
51
|
-
</ul>
|
52
|
-
</div>
|
53
|
-
</div>
|
54
|
-
|
55
|
-
<div class="inner-content">
|
56
|
-
%{content}
|
57
|
-
</div>
|
58
|
-
</section>
|
59
|
-
</div>
|
60
|
-
</body>
|
61
|
-
</html>
|
data/docs/public/.gitignore
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
*.html
|