helmet 0.0.6 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,37 +1,30 @@
1
1
  require 'goliath/api'
2
2
 
3
- require 'helmet/templates'
3
+ require 'helmet/handler'
4
4
 
5
5
  module Helmet
6
6
  class API < Goliath::API
7
-
8
- # Handle application routes
9
- @@routes = {}
10
-
11
- # Handle before filters
12
- @@before_filters = []
13
7
 
14
8
  class << self
15
- include Templates
16
-
17
- def public_folder=(folder)
18
- @@public_folder = folder
9
+
10
+ def set(key, value)
11
+ @config[key.to_sym] = value
19
12
  end
20
13
 
21
- def public_folder
22
- @@public_folder
14
+ def config(key)
15
+ @config[key.to_sym]
23
16
  end
24
-
25
- def views_folder=(folder)
26
- @@views_folder = folder
17
+
18
+ def before(route, &block)
19
+ @before_filters << [route, block]
27
20
  end
28
-
29
- def views_folder
30
- @@views_folder
21
+
22
+ def routes
23
+ @routes
31
24
  end
32
25
 
33
- def before(route, &block)
34
- @@before_filters << [route, block]
26
+ def before_filters
27
+ @before_filters
35
28
  end
36
29
 
37
30
  def get(route, &block)
@@ -45,27 +38,39 @@ module Helmet
45
38
 
46
39
  def register_route(method, route, &block)
47
40
  sig = API.signature(method, route)
48
- @@routes[sig] = block
41
+ @routes[sig] = block
49
42
  end
50
-
43
+
51
44
  def signature(method, route)
52
45
  "#{method}#{route}"
53
46
  end
54
47
 
55
48
  def inherited(klass)
49
+ klass.init
50
+
56
51
  # setup basic middlewares
57
52
  setup_middlewares klass
58
53
 
59
54
  # compute public/ views folder
60
- base = File.dirname(caller.first[/^[^:]*/])
61
- self.public_folder = File.join(base, 'public')
62
- self.views_folder = File.join(base, 'views')
55
+ base = File.expand_path(File.dirname(caller.first[/^[^:]*/]))
56
+ klass.set :public_folder, File.join(base, 'public')
57
+ klass.set :views_folder, File.join(base, 'views')
63
58
 
64
59
  super # update Goliath::Application.app_class
65
60
  end
66
61
 
67
- private
62
+ def init
63
+ # Handle application routes
64
+ @routes = {}
65
+
66
+ # Handle before filters
67
+ @before_filters = []
68
68
 
69
+ @config = {}
70
+ end
71
+
72
+ private
73
+
69
74
  def setup_middlewares(klass)
70
75
  # support for session
71
76
  klass.use Rack::Session::Cookie
@@ -75,29 +80,35 @@ module Helmet
75
80
  end
76
81
 
77
82
  def response(env)
78
- path = env['REQUEST_PATH']
83
+ # request path
84
+ path = env['REQUEST_PATH']
85
+
86
+ # request handler
87
+ handler = Handler.new(env)
79
88
 
80
- # evaluate filters
81
- resp = catch(:halt) do
82
- @@before_filters.each do |route|
89
+ catch(:halt) do
90
+ # evaluate filters
91
+ self.class.before_filters.each do |route|
83
92
  case route.first
84
93
  when String
85
- route[1].call(env) if route.first == path
94
+ handler.handle! &route[1] if route.first == path
86
95
  when Regexp
87
- route[1].call(env) if route.first =~ path
96
+ handler.handle! &route[1] if route.first =~ path
97
+ end
98
+ end
99
+
100
+ sig = API.signature(env['REQUEST_METHOD'], path)
101
+ block = self.class.routes[sig]
102
+ if block
103
+ handler.handle!(&block)
104
+ else
105
+ handler.handle! do
106
+ status 404
107
+ 'not found!'
88
108
  end
89
109
  end
90
- nil
91
- end
92
- return resp if resp
93
-
94
- sig = API.signature(env['REQUEST_METHOD'], path)
95
- block = @@routes[sig]
96
- if block
97
- block.call env
98
- else
99
- [404, {}, 'not found!']
100
110
  end
111
+ handler.response.format_response
101
112
  end
102
113
  end
103
114
  end
@@ -0,0 +1,68 @@
1
+ require 'helmet/templates'
2
+ require 'helmet/response'
3
+
4
+ module Helmet
5
+
6
+ # Handle each request and provide usefull methods for request handling
7
+ class Handler
8
+ include Templates
9
+
10
+ # Request environment
11
+ attr_reader :env
12
+
13
+ attr_reader :response
14
+
15
+ def initialize(env)
16
+ @env = env
17
+ @response = Response.new(env)
18
+ end
19
+
20
+ # @return (Response) request response
21
+ def handle!(&block)
22
+ @response.body = instance_exec(&block)
23
+ @response.format_response
24
+ end
25
+
26
+ # @return (Rack::Session) the current session data
27
+ def session
28
+ @env['rack.session']
29
+ end
30
+
31
+ # Creates a redirect HTTP response
32
+ def redirect(uri)
33
+ @response.status = 302
34
+ @response.header['Location'] = uri
35
+ @response.body = ''
36
+ halt
37
+ end
38
+
39
+ # halt the execution
40
+ def halt(body=nil)
41
+ @response.body = body if body
42
+ throw :halt
43
+ end
44
+
45
+ # @return (Integer) response status code
46
+ def status
47
+ @response.status
48
+ end
49
+
50
+ # set response status code
51
+ def status(code)
52
+ @response.status = code
53
+ end
54
+
55
+ # @return (Hash) response header
56
+ def header
57
+ @response.header
58
+ end
59
+
60
+ # @return (String) response body
61
+ def body
62
+ @response.body
63
+ end
64
+
65
+ def content_type(type)
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,28 @@
1
+ module Helmet
2
+
3
+ class Response
4
+ # Request environment
5
+ attr_reader :env
6
+
7
+ # HTTP response status
8
+ attr_accessor :status
9
+
10
+ # HTTP response header
11
+ attr_accessor :header
12
+
13
+ # HTTP response body
14
+ attr_accessor :body
15
+
16
+ def initialize(env)
17
+ @env = env
18
+ @status = 200 # Default OK!
19
+ @header = {}
20
+ @body = ''
21
+ end
22
+
23
+ # @return (Array) HTTP response tuple [status, header, body]
24
+ def format_response
25
+ [@status, @header, @body]
26
+ end
27
+ end
28
+ end
@@ -6,7 +6,7 @@ module Helmet
6
6
  @@template_cache = Tilt::Cache.new
7
7
 
8
8
  def erb(template, options = {}, locals = {})
9
- render :erb, template, options, locals
9
+ render(:erb, template, options, locals)
10
10
  end
11
11
 
12
12
  def render(engine, data, options = {}, locals = {}, &block)
@@ -15,8 +15,8 @@ module Helmet
15
15
  @@template_cache.clear unless Goliath.env == :production
16
16
  compiled_template = @@template_cache.fetch(data, options) do
17
17
  template = Tilt.new(find_template(engine, data), nil, options)
18
- end
19
- output = compiled_template.render nil, locals, &block
18
+ end
19
+ output = compiled_template.render(self, locals, &block)
20
20
  if layout
21
21
  return render(engine, layout, options, locals) {output}
22
22
  end
@@ -27,7 +27,7 @@ module Helmet
27
27
 
28
28
  def find_template(engine, template)
29
29
  filename = "#{template.to_s}.#{engine.to_s}"
30
- File.join(views_folder, filename)
30
+ File.join(@klass.config(:views_folder), filename)
31
31
  end
32
32
  end
33
33
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: helmet
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.6
5
+ version: 0.1.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Thiago Lewin
@@ -44,6 +44,8 @@ extra_rdoc_files: []
44
44
 
45
45
  files:
46
46
  - lib/helmet/api.rb
47
+ - lib/helmet/handler.rb
48
+ - lib/helmet/response.rb
47
49
  - lib/helmet/templates.rb
48
50
  - lib/helmet.rb
49
51
  homepage: https://github.com/tlewin/helmet