tynn 0.0.4 → 1.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/lib/tynn/all_methods.rb +17 -0
  3. data/lib/tynn/environment.rb +12 -8
  4. data/lib/tynn/matchers.rb +37 -19
  5. data/lib/tynn/request.rb +4 -0
  6. data/lib/tynn/response.rb +151 -0
  7. data/lib/tynn/secure_headers.rb +28 -4
  8. data/lib/tynn/session.rb +74 -3
  9. data/lib/tynn/ssl.rb +2 -2
  10. data/lib/tynn/static.rb +26 -0
  11. data/lib/tynn/test.rb +37 -2
  12. data/lib/tynn/version.rb +7 -2
  13. data/lib/tynn.rb +88 -8
  14. data/test/all_methods_test.rb +16 -0
  15. data/test/core_test.rb +0 -86
  16. data/test/matchers_test.rb +11 -8
  17. data/test/middleware_test.rb +79 -0
  18. data/test/protection_test.rb +37 -0
  19. data/test/session_test.rb +1 -6
  20. metadata +45 -52
  21. data/.gems +0 -10
  22. data/docs/bin/build +0 -38
  23. data/docs/guides/security.md +0 -1
  24. data/docs/index.md +0 -89
  25. data/docs/layout.html +0 -61
  26. data/docs/public/.gitignore +0 -1
  27. data/docs/public/css/styles.css +0 -111
  28. data/docs/public/guides/.gitignore +0 -2
  29. data/docs/syro/syro.rb +0 -112
  30. data/examples/composition.ru +0 -40
  31. data/examples/hello.ru +0 -9
  32. data/examples/protection.ru +0 -18
  33. data/examples/render.ru +0 -13
  34. data/examples/views/home.erb +0 -1
  35. data/examples/views/layout.erb +0 -5
  36. data/lib/tynn/csrf.rb +0 -48
  37. data/lib/tynn/options.rb +0 -9
  38. data/makefile +0 -15
  39. data/test/csrf_test.rb +0 -98
  40. data/test/options_test.rb +0 -16
  41. data/test/views/custom_layout.erb +0 -1
  42. data/test/views/custom_layout.mote +0 -1
  43. data/test/views/layout.erb +0 -1
  44. data/test/views/layout.mote +0 -1
  45. data/test/views/partial.erb +0 -1
  46. data/test/views/partial.mote +0 -1
  47. data/test/views/view.erb +0 -1
  48. data/test/views/view.mote +0 -1
  49. 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
@@ -19,19 +19,22 @@ test "default" do |app|
19
19
  assert_equal "foo", app.res.body
20
20
  end
21
21
 
22
- test "param?" do |app|
22
+ test "param" do |app|
23
23
  Tynn.define do
24
- on param?(:key) do
25
- res.write(req[:key])
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 404, app.res.status
35
+ assert_equal "foo", app.res.body
32
36
 
33
- app.get("/", key: "foo")
37
+ app.get("/", foo: "bar")
34
38
 
35
- assert_equal 200, app.res.status
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
@@ -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
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-06 00:00:00.000000000 Z
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.0
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.0
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.0'
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.0'
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.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.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.0
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.0
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.3
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.3
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/csrf.rb
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
- - makefile
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: '0'
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
@@ -1,10 +0,0 @@
1
- cutest:1.2.2
2
- erubis:2.7.0
3
- hmote:1.4.0
4
- rack:1.6.4
5
- rack-test:0.6.3
6
- redcarpet:3.3.3
7
- seg:0.0.1
8
- seteable:1.1.0
9
- syro:1.0.0
10
- tilt:2.0.1
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
@@ -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>
@@ -1 +0,0 @@
1
- *.html