tynn 0.0.3 → 0.0.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d0c2e697419542ac01be6106e60a3bd2a6221d3b
4
- data.tar.gz: 917cac7cbbd5a4123c1f70ca431dd818aa17efcc
3
+ metadata.gz: 4782dd0580d83defcbda873cd5cd6286e9471dff
4
+ data.tar.gz: 4084f3b30cec83e6147b1e2afdde38a381285fe2
5
5
  SHA512:
6
- metadata.gz: 70b7c35be68be33da92b5b95808b4e241081912c588b0d4e29a2f07a87413e5b5907f3adbe02ebc1aabee06d0d61071768cf471f05bb2e59e8f4fe132fd2a45a
7
- data.tar.gz: 765f7512ccae32a7b6e92db62f2acc1a1b6370bcd05d0e14c6d1dd6da2cbe765dc9808baa269b1067e564b1beed0496082e6eb1859478455657303f89b15e7c6
6
+ metadata.gz: 99d8b65373259f09d6c340ea148c4da3f1c33c55bdd7686b4ac278a5ed609955bed273f31371842b6521e74580e29def9c6c155e26ab8cdda9da2702edba2d65
7
+ data.tar.gz: e6571863d347e2c749582fa4db18abdf79938727e47cc4b8f1d912b650c26a8464c690995385e6f4fe1a34dd1c22e2add4720c4f7ec248c7b7aeff9acdf085a2
data/.gems CHANGED
@@ -3,6 +3,8 @@ erubis:2.7.0
3
3
  hmote:1.4.0
4
4
  rack:1.6.4
5
5
  rack-test:0.6.3
6
- seteable:1.0.0
7
- syro:0.0.8
6
+ redcarpet:3.3.3
7
+ seg:0.0.1
8
+ seteable:1.1.0
9
+ syro:1.0.0
8
10
  tilt:2.0.1
data/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2015 Francesco Rodríguez
3
+ Copyright (c) 2015 Francesco Rodríguez and contributors
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- tynn
1
+ tynn [![Gem Version](https://badge.fury.io/rb/tynn.svg)](https://rubygems.org/gems/tynn)
2
2
  ====
3
3
 
4
4
  Simple library to create [Rack][rack] applications.
@@ -45,6 +45,11 @@ Contributing
45
45
  - Use `make test` to run the test suite.
46
46
  - Create a pull request with your changes.
47
47
 
48
+ You can install the gems globally, but we recommend [gs][gs] (or
49
+ [gst][gst] if you're using chruby) to keep things isolated.
50
+
48
51
  [cuba]: https://github.com/soveran/cuba
49
52
  [rack]: https://github.com/rack/rack
50
53
  [syro]: https://github.com/soveran/syro
54
+ [gs]: https://github.com/soveran/gs
55
+ [gst]: https://github.com/tonchis/gst
@@ -0,0 +1,38 @@
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
@@ -0,0 +1 @@
1
+ # Security
@@ -0,0 +1,89 @@
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.
@@ -0,0 +1,61 @@
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>
@@ -0,0 +1 @@
1
+ *.html
@@ -0,0 +1,111 @@
1
+ html {
2
+ font-family: "Roboto";
3
+ }
4
+
5
+ body {
6
+ color: rgba(0, 0, 0, 0.87);
7
+ font-size: 16px;
8
+ font-weight: 400;
9
+ margin: 0;
10
+ padding: 0;
11
+ }
12
+
13
+ .container {
14
+ padding-top: 64px;
15
+ min-width: 960px;
16
+ }
17
+
18
+ header {
19
+ background: #2196F3;
20
+ box-shadow: 0 0 5px rgba(0, 0, 0, 0.5);
21
+ height: 64px;
22
+ position: fixed;
23
+ top: 0;
24
+ width: 100%;
25
+ text-align: right;
26
+ }
27
+
28
+ h1 {
29
+ color: rgba(0, 0, 0, 0.54);
30
+ font-size: 34px;
31
+ font-weight: 400;
32
+ }
33
+
34
+ h2 {
35
+ font-size: 24px;
36
+ font-weight: 400;
37
+ }
38
+
39
+ h3 {
40
+ font-size: 16px;
41
+ font-weight: 500;
42
+ }
43
+
44
+ .wrap {
45
+ width: 960px;
46
+ margin-left: auto;
47
+ margin-right: auto;
48
+ padding-left: 20px;
49
+ padding-right: 20px;
50
+ }
51
+
52
+ header a {
53
+ color: white;
54
+ line-height: 64px;
55
+ text-decoration: none;
56
+ }
57
+
58
+ .nav-home {
59
+ float: left;
60
+ font-size: 24px;
61
+ letter-spacing: 2px;
62
+ }
63
+
64
+ .nav-github {
65
+ font-size: 32px;
66
+ }
67
+
68
+ .content {
69
+ padding-top: 20px;
70
+ }
71
+
72
+ .nav-docs {
73
+ float: left;
74
+ width: 21.875%;
75
+ }
76
+
77
+ .nav-docs-section {
78
+ border-top: 1px solid rgba(0, 0, 0, 0.12);
79
+ padding: 12px 0;
80
+ }
81
+
82
+ .nav-docs-section:first-child {
83
+ padding-top: 0;
84
+ border-top: 0;
85
+ }
86
+
87
+ .nav-docs ul {
88
+ list-style: none;
89
+ padding: 0;
90
+ }
91
+
92
+ .nav-docs ul a {
93
+ color: rgba(0, 0, 0, 0.87);
94
+ font-size: 14px;
95
+ line-height: 24px;
96
+ text-decoration: none;
97
+ }
98
+
99
+ .nav-docs ul a:hover {
100
+ color: #FF4081;
101
+ }
102
+
103
+ .nav-docs ul ul {
104
+ padding-left: 20px;
105
+ }
106
+
107
+ .inner-content {
108
+ float: right;
109
+ line-height: 24px;
110
+ width: 67.7083%;
111
+ }
@@ -0,0 +1,2 @@
1
+ *
2
+ !.gitignore
@@ -0,0 +1,112 @@
1
+ class Syro::Response
2
+ ##
3
+ # :method: []
4
+ #
5
+ # Returns the response header corresponding to `key`.
6
+ #
7
+ # res["Content-Type"] # => "text/html"
8
+ # res["Content-Length"] # => "42"
9
+
10
+ ##
11
+ # :method: []=
12
+ # :call-seq: []=(value)
13
+ #
14
+ # Sets the given `value` with the header corresponding to `key`.
15
+ #
16
+ # res["Content-Type"] = "application/json"
17
+ # res["Content-Type"] # => "application/json"
18
+
19
+ ##
20
+ # :method: body
21
+ #
22
+ # Returns the body of the response.
23
+ #
24
+ # res.body
25
+ # # => []
26
+ #
27
+ # res.write("there is")
28
+ # res.write("no try")
29
+ #
30
+ # res.body
31
+ # # => ["there is", "no try"]
32
+
33
+ ##
34
+ # :method: finish
35
+ #
36
+ # Returns an array with three elements: the status, headers and body.
37
+ # If the status is not set, the status is set to 404 if empty body,
38
+ # otherwise the status is set to 200 and updates the `Content-Type`
39
+ # header to `text/html`.
40
+ #
41
+ # res.status = 200
42
+ # res.finish
43
+ # # => [200, {}, []]
44
+ #
45
+ # res.status = nil
46
+ # res.finish
47
+ # # => [404, {}, []]
48
+ #
49
+ # res.status = nil
50
+ # res.write("yo!")
51
+ # res.finish
52
+ # # => [200, { "Content-Type" => "text/html" }, ["yo!"]]
53
+
54
+ ##
55
+ # :method: headers
56
+ #
57
+ # Returns a hash with the response headers.
58
+ #
59
+ # res.headers
60
+ # # => { "Content-Type" => "text/html", "Content-Length" => "42" }
61
+
62
+ ##
63
+ # :method: redirect
64
+ # :call-seq: redirect(path, 302)
65
+ #
66
+ # Sets the `Location` header to `path` and updates the status to
67
+ # `status`. By default, `status` is `302`.
68
+ #
69
+ # res.redirect("/path")
70
+ #
71
+ # res["Location"] # => "/path"
72
+ # res.status # => 302
73
+ #
74
+ # res.redirect("http://tynn.ru", 303)
75
+ #
76
+ # res["Location"] # => "http://tynn.ru"
77
+ # res.status # => 303
78
+
79
+ ##
80
+ # :method: status
81
+ #
82
+ # Returns the status of the response.
83
+ #
84
+ # res.status # => 200
85
+ #
86
+
87
+ ##
88
+ # :method: status=
89
+ # :call-seq: status=(status)
90
+ #
91
+ # Sets the status of the response.
92
+ #
93
+ # res.status = 200
94
+ #
95
+
96
+ ##
97
+ # :method: write
98
+ # :call-seq: write(str)
99
+ #
100
+ # Appends `str` to `body` and updates the `Content-Length` header.
101
+ #
102
+ # res.body # => []
103
+ #
104
+ # res.write("foo")
105
+ # res.write("bar")
106
+ #
107
+ # res.body
108
+ # # => ["foo", "bar"]
109
+ #
110
+ # res["Content-Length"]
111
+ # # => 6
112
+ end
@@ -4,9 +4,7 @@ class Users < Tynn
4
4
  end
5
5
 
6
6
  Users.define do
7
- on(:id) do
8
- id = inbox[:id]
9
-
7
+ on(:id) do |id|
10
8
  get do
11
9
  res.write("GET /users/#{ id }")
12
10
  end
@@ -9,19 +9,7 @@ class Tynn < Syro::Deck
9
9
  end
10
10
 
11
11
  def self.use(_middleware, *args, &block)
12
- middleware << (Proc.new { |app| _middleware.new(app, *args, &block) })
13
- end
14
-
15
- def self.helpers(helper, *args)
16
- self.include(helper)
17
-
18
- if defined?(helper::ClassMethods)
19
- self.extend(helper::ClassMethods)
20
- end
21
-
22
- if helper.respond_to?(:setup)
23
- helper.setup(self, *args)
24
- end
12
+ middleware << proc { |app| _middleware.new(app, *args, &block) }
25
13
  end
26
14
 
27
15
  def self.call(env) # :nodoc:
@@ -46,6 +34,18 @@ class Tynn < Syro::Deck
46
34
  @syro = nil
47
35
  @middleware = []
48
36
  end
37
+
38
+ def self.helpers(helper, *args, &block)
39
+ self.include(helper)
40
+
41
+ if defined?(helper::ClassMethods)
42
+ self.extend(helper::ClassMethods)
43
+ end
44
+
45
+ if helper.respond_to?(:setup)
46
+ helper.setup(self, *args, &block)
47
+ end
48
+ end
49
49
  end
50
50
 
51
51
  require_relative "tynn/version"
@@ -1,10 +1,8 @@
1
1
  module Tynn::NotFound
2
- def call(env, inbox) # :nodoc:
3
- result = super(env, inbox)
2
+ def call(*) # :nodoc:
3
+ result = super
4
4
 
5
- status, _, body = result
6
-
7
- if status == 404 && body.empty?
5
+ if result[0] == 404 && result[2].empty?
8
6
  not_found
9
7
 
10
8
  return res.finish
@@ -0,0 +1,9 @@
1
+ module Tynn::Options
2
+ def options
3
+ if root? && req.options?
4
+ yield
5
+
6
+ halt(res.finish)
7
+ end
8
+ end
9
+ end
@@ -13,10 +13,7 @@ module Tynn::SecureHeaders
13
13
  "X-XSS-Protection" => "1; mode=block"
14
14
  } # :nodoc:
15
15
 
16
- def call(env, inbox) # :nodoc:
17
- result = super(env, inbox)
18
- result[1].merge!(HEADERS)
19
-
20
- return result
16
+ def default_headers
17
+ return super.merge(HEADERS)
21
18
  end
22
19
  end
@@ -1,3 +1,3 @@
1
1
  class Tynn
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
data/makefile CHANGED
@@ -1,11 +1,14 @@
1
1
  default: test
2
2
 
3
3
  docs:
4
- @rdoc --markup markdown ./lib/
4
+ @./docs/bin/build
5
5
 
6
6
  install:
7
7
  @cat .gems | xargs gem install
8
8
 
9
+ server:
10
+ ruby -run -e httpd ./docs/public -p 4000
11
+
9
12
  test:
10
13
  @cutest -r ./test/helper.rb ./test/*_test.rb
11
14
 
@@ -12,11 +12,24 @@ test "hello" do
12
12
  assert_equal "hello", app.res.body
13
13
  end
14
14
 
15
+ test "methods" do
16
+ [:get, :post, :put, :patch, :delete].each do |method|
17
+ Tynn.define do
18
+ send(method) { res.write "" }
19
+ end
20
+
21
+ app = Tynn::Test.new
22
+ app.send(method, "/")
23
+
24
+ assert_equal 200, app.res.status
25
+ end
26
+ end
27
+
15
28
  test "captures" do
16
29
  Tynn.define do
17
- on :foo do
18
- on :bar do
19
- res.write(sprintf("%s:%s", inbox[:foo], inbox[:bar]))
30
+ on :foo do |foo|
31
+ on :bar do |bar|
32
+ res.write(sprintf("%s:%s", foo, bar))
20
33
  end
21
34
  end
22
35
  end
@@ -51,21 +64,6 @@ test "composition" do
51
64
  assert_equal "42", app.res.body
52
65
  end
53
66
 
54
- test "settings" do
55
- Tynn.settings[:message] = "hello"
56
-
57
- Tynn.define do
58
- get do
59
- res.write(settings[:message])
60
- end
61
- end
62
-
63
- app = Tynn::Test.new
64
- app.get("/")
65
-
66
- assert_equal "hello", app.res.body
67
- end
68
-
69
67
  test "raise unless application handler is set" do
70
68
  app = Tynn::Test.new
71
69
 
@@ -159,74 +157,3 @@ scope "middleware" do
159
157
  assert_equal "21", app.res.body
160
158
  end
161
159
  end
162
-
163
- scope "helpers" do
164
- module Helper
165
- def clean(str)
166
- return str.strip
167
- end
168
-
169
- module Number
170
- def self.setup(app, number)
171
- app.settings[:number] = number
172
- end
173
-
174
- def number
175
- return settings[:number]
176
- end
177
- end
178
-
179
- def self.setup(app, number = 1)
180
- app.helpers(Number, number)
181
- end
182
-
183
- module ClassMethods
184
- def foo
185
- "foo"
186
- end
187
- end
188
- end
189
-
190
- setup do
191
- Tynn::Test.new
192
- end
193
-
194
- test "helpers" do |app|
195
- Tynn.helpers(Helper)
196
-
197
- Tynn.define do
198
- get do
199
- res.write(clean(" foo "))
200
- end
201
- end
202
-
203
- app.get("/")
204
-
205
- assert_equal "foo", app.res.body
206
- assert_equal "foo", Tynn.foo
207
- end
208
-
209
- test "setup" do |app|
210
- Tynn.helpers(Helper)
211
-
212
- Tynn.define do
213
- res.write(number)
214
- end
215
-
216
- app.get("/")
217
-
218
- assert_equal "1", app.res.body
219
- end
220
-
221
- test "setup with arguments" do |app|
222
- Tynn.helpers(Helper, 2)
223
-
224
- Tynn.define do
225
- res.write(number)
226
- end
227
-
228
- app.get("/")
229
-
230
- assert_equal "2", app.res.body
231
- end
232
- end
@@ -0,0 +1,16 @@
1
+ require_relative "../lib/tynn/options"
2
+
3
+ test "options" do
4
+ Tynn.helpers(Tynn::Options)
5
+
6
+ Tynn.define do
7
+ options do
8
+ res.write ""
9
+ end
10
+ end
11
+
12
+ app = Tynn::Test.new
13
+ app.options("/")
14
+
15
+ assert_equal 200, app.res.status
16
+ end
@@ -13,10 +13,11 @@ Gem::Specification.new do |s|
13
13
  s.files = `git ls-files`.split("\n")
14
14
 
15
15
  s.add_dependency "rack", "~> 1.6"
16
- s.add_dependency "seteable", "1.0.0"
17
- s.add_dependency "syro", "~> 0.0.8"
16
+ s.add_dependency "seteable", "1.1.0"
17
+ s.add_dependency "syro", "~> 1.0"
18
18
 
19
19
  s.add_development_dependency "cutest", "1.2.2"
20
+ s.add_development_dependency "erubis", "~> 2.7"
20
21
  s.add_development_dependency "hmote", "1.4.0"
21
22
  s.add_development_dependency "rack-test", "0.6.3"
22
23
  s.add_development_dependency "tilt", "~> 2.0"
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.3
4
+ version: 0.0.4
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-03 00:00:00.000000000 Z
11
+ date: 2015-10-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -30,28 +30,28 @@ dependencies:
30
30
  requirements:
31
31
  - - '='
32
32
  - !ruby/object:Gem::Version
33
- version: 1.0.0
33
+ version: 1.1.0
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.0.0
40
+ version: 1.1.0
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: 0.0.8
47
+ version: '1.0'
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: 0.0.8
54
+ version: '1.0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: cutest
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - '='
67
67
  - !ruby/object:Gem::Version
68
68
  version: 1.2.2
69
+ - !ruby/object:Gem::Dependency
70
+ name: erubis
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '2.7'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '2.7'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: hmote
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -116,9 +130,16 @@ extensions: []
116
130
  extra_rdoc_files: []
117
131
  files:
118
132
  - ".gems"
119
- - ".gitignore"
120
133
  - LICENSE
121
134
  - 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
122
143
  - examples/composition.ru
123
144
  - examples/hello.ru
124
145
  - examples/protection.ru
@@ -134,10 +155,10 @@ files:
134
155
  - lib/tynn/json_parser.rb
135
156
  - lib/tynn/matchers.rb
136
157
  - lib/tynn/not_found.rb
158
+ - lib/tynn/options.rb
137
159
  - lib/tynn/protection.rb
138
160
  - lib/tynn/render.rb
139
161
  - lib/tynn/secure_headers.rb
140
- - lib/tynn/send_file.rb
141
162
  - lib/tynn/session.rb
142
163
  - lib/tynn/ssl.rb
143
164
  - lib/tynn/static.rb
@@ -154,10 +175,10 @@ files:
154
175
  - test/json_test.rb
155
176
  - test/matchers_test.rb
156
177
  - test/not_found_test.rb
178
+ - test/options_test.rb
157
179
  - test/protection_test.rb
158
180
  - test/render_test.rb
159
181
  - test/secure_headers_test.rb
160
- - test/send_file_test.rb
161
182
  - test/session_test.rb
162
183
  - test/ssl_test.rb
163
184
  - test/static_test.rb
data/.gitignore DELETED
@@ -1 +0,0 @@
1
- doc/
@@ -1,12 +0,0 @@
1
- require "rack/file"
2
-
3
- module Tynn::SendFile
4
- def send_file(path)
5
- file = Rack::File.new(nil)
6
- file.path = path
7
-
8
- halt(file.serving(env))
9
- rescue Errno::ENOENT
10
- res.status = 404
11
- end
12
- end
@@ -1,31 +0,0 @@
1
- require_relative "../lib/tynn/send_file"
2
-
3
- test "file send" do
4
- Tynn.helpers(Tynn::SendFile)
5
-
6
- Tynn.define do
7
- root do
8
- send_file(__FILE__)
9
- end
10
- end
11
-
12
- app = Tynn::Test.new
13
- app.get("/")
14
-
15
- assert_equal File.read(__FILE__), app.res.body
16
- end
17
-
18
- test "file not exists" do
19
- Tynn.helpers(Tynn::SendFile)
20
-
21
- Tynn.define do
22
- root do
23
- send_file("notexists")
24
- end
25
- end
26
-
27
- app = Tynn::Test.new
28
- app.get("/")
29
-
30
- assert_equal 404, app.res.status
31
- end