helmet 0.0.6 → 0.1.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.
@@ -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