tansu 0.1.0 → 0.2.0
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 +2 -0
- data/lib/tansu/application.rb +6 -14
- data/lib/tansu/configuration.rb +27 -0
- data/lib/tansu/context.rb +7 -2
- data/lib/tansu/environment.rb +33 -4
- data/lib/tansu/render.rb +52 -0
- data/lib/tansu/response.rb +47 -0
- data/lib/tansu/version.rb +1 -1
- data/lib/tansu.rb +8 -0
- data/tansu.gemspec +2 -0
- metadata +33 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fd67f1e2c6100222b3b22315e166451be9ae789e
|
4
|
+
data.tar.gz: 5805a8800e971efc0b277e71e15d10bd766fc1bf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a0f706c3bfabf11d502018c54e7ff795aa527b2239d825aa4b485ea2d6907cf9f8013bf05728b7f7c36cda099aa15b586b77f414a5065eb2e5bd8cb7e55711bc
|
7
|
+
data.tar.gz: 5db1cdb46be41625f410c1ad851e046fe2ef915c75cbd8f9bedc05afe55edd4d54d25ef3b16aa42bdac516ddb901131e0f689271c4315dac8a053f94c5018cce
|
data/README.md
CHANGED
data/lib/tansu/application.rb
CHANGED
@@ -1,15 +1,13 @@
|
|
1
1
|
module Tansu
|
2
2
|
class Application
|
3
|
-
|
4
|
-
attr_accessor :before, :after
|
5
|
-
end
|
3
|
+
extend Tansu::Configuration
|
6
4
|
|
7
5
|
def call(env)
|
8
|
-
Application
|
6
|
+
Application[:before].() if Application[:before]
|
9
7
|
|
10
8
|
response = action(env)
|
11
9
|
|
12
|
-
Application
|
10
|
+
Application[:after].() if Application[:after]
|
13
11
|
|
14
12
|
response
|
15
13
|
end
|
@@ -18,26 +16,20 @@ module Tansu
|
|
18
16
|
|
19
17
|
def action(env)
|
20
18
|
request = Rack::Request.new(env)
|
21
|
-
environment = Environment.new(request,
|
19
|
+
environment = Environment.new(request, Response.new)
|
22
20
|
|
23
|
-
path =
|
21
|
+
path = environment.path.empty? ? [:*] : environment.path
|
24
22
|
router = path.inject(Tansu.root) { |a, e| a[e] }[request.request_method]
|
25
23
|
|
26
24
|
if Minicontext::Router::Just === router
|
27
25
|
response = router.value.(environment).response
|
28
26
|
|
29
|
-
|
27
|
+
Response === response ? response.finish : internal_server_error
|
30
28
|
else
|
31
29
|
not_found
|
32
30
|
end
|
33
31
|
end
|
34
32
|
|
35
|
-
def parse(path)
|
36
|
-
ret = (path[1..-1] || '').split('/').map(&:to_sym)
|
37
|
-
|
38
|
-
ret.empty? ? [:*] : ret
|
39
|
-
end
|
40
|
-
|
41
33
|
def internal_server_error
|
42
34
|
['500', { 'Context-Type' => 'text/html' }, ['internal server error.']]
|
43
35
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Tansu
|
2
|
+
module Configuration
|
3
|
+
def self.extended(klass)
|
4
|
+
klass.instance_variable_set(:"@vars", {})
|
5
|
+
end
|
6
|
+
|
7
|
+
def set(name, val)
|
8
|
+
self[name]= val
|
9
|
+
end
|
10
|
+
|
11
|
+
def get(name)
|
12
|
+
self[name]
|
13
|
+
end
|
14
|
+
|
15
|
+
def []=(name, val)
|
16
|
+
@vars[name] = val
|
17
|
+
end
|
18
|
+
|
19
|
+
def [](name)
|
20
|
+
@vars[name]
|
21
|
+
end
|
22
|
+
|
23
|
+
def configure(&block)
|
24
|
+
instance_eval &block
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/tansu/context.rb
CHANGED
@@ -1,9 +1,14 @@
|
|
1
1
|
module Tansu
|
2
2
|
class Context < Minicontext::Context
|
3
|
-
METHODS = %w(GET POST PATCH PUT DELETE)
|
3
|
+
METHODS = %w(GET HEAD POST PATCH PUT DELETE)
|
4
4
|
KEYWORD = Minicontext::Context::KEYWORD + METHODS
|
5
5
|
|
6
|
-
|
6
|
+
def get(name, &block)
|
7
|
+
context(name) { task 'GET', &block }
|
8
|
+
head(name, &block)
|
9
|
+
end
|
10
|
+
|
11
|
+
(METHODS - ['GET']).each do |method|
|
7
12
|
define_method(method.downcase.to_sym) do |name, &block|
|
8
13
|
context(name) { task method, &block }
|
9
14
|
end
|
data/lib/tansu/environment.rb
CHANGED
@@ -1,17 +1,30 @@
|
|
1
1
|
module Tansu
|
2
2
|
class Environment < Minicontext::Environment
|
3
|
+
include Tansu::Render
|
4
|
+
|
5
|
+
attr_reader :path
|
6
|
+
|
7
|
+
IS_RESPOND_TO_EACH = -> (v) { v.respond_to?(:each) }
|
8
|
+
|
9
|
+
def initialize(request, response = nil)
|
10
|
+
@path = parse(request.path_info)
|
11
|
+
|
12
|
+
super request, response
|
13
|
+
end
|
14
|
+
|
3
15
|
def bind(val)
|
4
|
-
res =
|
16
|
+
res = case val
|
17
|
+
when Response, Minicontext::Halt
|
5
18
|
val
|
6
|
-
|
19
|
+
when IS_RESPOND_TO_EACH
|
7
20
|
response.body = val
|
8
21
|
|
9
22
|
response
|
10
|
-
|
23
|
+
when Fixnum
|
11
24
|
response.status = val
|
12
25
|
|
13
26
|
response
|
14
|
-
|
27
|
+
when String
|
15
28
|
response.body = [val]
|
16
29
|
|
17
30
|
response
|
@@ -22,8 +35,24 @@ module Tansu
|
|
22
35
|
super res
|
23
36
|
end
|
24
37
|
|
38
|
+
def headers(hash = nil)
|
39
|
+
response.headers.merge!(hash) if hash
|
40
|
+
|
41
|
+
response.headers
|
42
|
+
end
|
43
|
+
|
44
|
+
def session
|
45
|
+
request.session
|
46
|
+
end
|
47
|
+
|
25
48
|
def redirect(uri, status = 302)
|
26
49
|
response.redirect(uri, status)
|
27
50
|
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def parse(path)
|
55
|
+
(path[1..-1] || '').split('/').map(&:to_sym)
|
56
|
+
end
|
28
57
|
end
|
29
58
|
end
|
data/lib/tansu/render.rb
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
module Tansu
|
2
|
+
module Render
|
3
|
+
class NoRendererError < StandardError; end
|
4
|
+
class LayoutMissingError < StandardError; end
|
5
|
+
|
6
|
+
%i(erb haml).each do |ext|
|
7
|
+
define_method(ext) do |name, locals = {}, options = {}, &block|
|
8
|
+
render(ext, name, locals, options, &block)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def render(ext, name, locals = {}, options = {}, &block)
|
15
|
+
options = options.merge(renderer_options(ext)) { |k, a, b| a }
|
16
|
+
options = options.merge(application_options) { |k, a, b| a }
|
17
|
+
template = renderer(ext, name, options)
|
18
|
+
ret = template.render(self, locals, &block)
|
19
|
+
|
20
|
+
if options[:layout]
|
21
|
+
layout = options.delete(:layout)
|
22
|
+
layout = :layout if layout == true
|
23
|
+
|
24
|
+
render(ext, layout, locals, options) { ret }
|
25
|
+
else
|
26
|
+
ret
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def renderer(ext, name, options)
|
31
|
+
basename = "#{name}.#{ext}"
|
32
|
+
filename = File.join options[:views], basename
|
33
|
+
|
34
|
+
raise NoRendererError, ext unless template = Tilt[ext]
|
35
|
+
raise LayoutMissingError, filename unless File.exist?(filename)
|
36
|
+
|
37
|
+
templates_cache.fetch(filename) { template.new(filename, options) }
|
38
|
+
end
|
39
|
+
|
40
|
+
def renderer_options(ext)
|
41
|
+
Application[ext] || {}
|
42
|
+
end
|
43
|
+
|
44
|
+
def application_options
|
45
|
+
{ views: Application[:templates] }
|
46
|
+
end
|
47
|
+
|
48
|
+
def templates_cache
|
49
|
+
Application[:templates_cache] ||= Tilt::Cache.new
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Tansu
|
2
|
+
class Response < Rack::Response
|
3
|
+
def initialize(body = [], status = 200, header = {})
|
4
|
+
super body, status, header
|
5
|
+
|
6
|
+
headers['Content-Type'] ||= 'text/html'
|
7
|
+
end
|
8
|
+
|
9
|
+
def finish
|
10
|
+
drop_content_info if drop_content_info?
|
11
|
+
|
12
|
+
ret = drop_body? ? drop_body : body
|
13
|
+
|
14
|
+
headers['Content-Length'] = content_length.to_s if need_content_length?
|
15
|
+
|
16
|
+
[status.to_i, headers, ret]
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def drop_content_info
|
22
|
+
headers.delete 'Content-Type'
|
23
|
+
headers.delete 'Content-Length'
|
24
|
+
end
|
25
|
+
|
26
|
+
def drop_body
|
27
|
+
close
|
28
|
+
[]
|
29
|
+
end
|
30
|
+
|
31
|
+
def content_length
|
32
|
+
body.inject(0) { |a, e| a + Rack::Utils.bytesize(e) }
|
33
|
+
end
|
34
|
+
|
35
|
+
def need_content_length?
|
36
|
+
headers['Content-Type'] && !headers['Content-Length'] && Array === body
|
37
|
+
end
|
38
|
+
|
39
|
+
def drop_content_info?
|
40
|
+
status.to_i / 100 == 1 or drop_body?
|
41
|
+
end
|
42
|
+
|
43
|
+
def drop_body?
|
44
|
+
[204, 205, 304].include?(status.to_i)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/lib/tansu/version.rb
CHANGED
data/lib/tansu.rb
CHANGED
@@ -1,6 +1,14 @@
|
|
1
|
+
require "rack"
|
2
|
+
require "minicontext"
|
3
|
+
require "tilt"
|
4
|
+
require "rack/protection"
|
5
|
+
|
1
6
|
require "tansu/version"
|
2
7
|
require "tansu/context"
|
8
|
+
require "tansu/response"
|
9
|
+
require "tansu/render"
|
3
10
|
require "tansu/environment"
|
11
|
+
require "tansu/configuration"
|
4
12
|
require "tansu/application"
|
5
13
|
|
6
14
|
module Tansu
|
data/tansu.gemspec
CHANGED
@@ -21,6 +21,8 @@ Gem::Specification.new do |spec|
|
|
21
21
|
|
22
22
|
spec.add_dependency "rack"
|
23
23
|
spec.add_dependency "minicontext"
|
24
|
+
spec.add_dependency "tilt"
|
25
|
+
spec.add_dependency "rack-protection"
|
24
26
|
|
25
27
|
spec.add_development_dependency "bundler", "~> 1.10"
|
26
28
|
spec.add_development_dependency "rake", "~> 10.0"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tansu
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- daisuko
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-11-
|
11
|
+
date: 2015-11-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
@@ -38,6 +38,34 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: tilt
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rack-protection
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
41
69
|
- !ruby/object:Gem::Dependency
|
42
70
|
name: bundler
|
43
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -114,8 +142,11 @@ files:
|
|
114
142
|
- bin/setup
|
115
143
|
- lib/tansu.rb
|
116
144
|
- lib/tansu/application.rb
|
145
|
+
- lib/tansu/configuration.rb
|
117
146
|
- lib/tansu/context.rb
|
118
147
|
- lib/tansu/environment.rb
|
148
|
+
- lib/tansu/render.rb
|
149
|
+
- lib/tansu/response.rb
|
119
150
|
- lib/tansu/version.rb
|
120
151
|
- tansu.gemspec
|
121
152
|
homepage: https://github.com/daisuko/tansu
|