sansom 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. checksums.yaml +4 -4
  2. data/changelog.md +6 -1
  3. data/lib/sansom.rb +39 -27
  4. data/sansom.gemspec +1 -1
  5. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9fe8ba21c0cab848b10f8484f8f38a0454d2f549
4
- data.tar.gz: dccfd78c121e2b6f6bc5c01f42bce52f8809ea93
3
+ metadata.gz: aaef12414047fe120425a2b7d60774ff95bb7e6f
4
+ data.tar.gz: fa9631815362d92010c669d521334aba3b7dacbe
5
5
  SHA512:
6
- metadata.gz: 773fded808375146ea57bf266e68feb8ad2c27ee584590e568d98d9517401f24b07a52f6f8dabab5da0e34114617fcce3b610a5683a77c02c17a10f33b59d93b
7
- data.tar.gz: f004a23139c2dd2b1664868507815e1f149064f0511d35a5804efe818f16eabbb1e199d7afd90aa24f9a4162c090891200d24ff4cb60499a1edda90dea3bdc86
6
+ metadata.gz: bb88783579d57e97451d616a5dc974fd1a1d6cfd90d03b82000b65aa3bea44ddd60e17dae4f3f29f2ffbd531784569409fcff1b467e57311170d1ffbceb098f9
7
+ data.tar.gz: 299ac437e310dd9fa8355923bfcfdc4aa84dd5f7c295be28e482e86bab88dac728fd575cde02b825f4321718a679e74d8d3f4f82b83f12df206446280131665b
@@ -52,4 +52,9 @@ Here's an example
52
52
 
53
53
  - PUBLIC RELEASE!
54
54
  - After block added
55
- - Improved routing behavior & speed
55
+ - Improved routing behavior & speed
56
+
57
+ 0.1.1
58
+
59
+ - Fix bad bug in method_missing
60
+ - Added better error handling (per-error handling and a generic block that gets called if no specific handler is present)
@@ -7,6 +7,7 @@ require_relative "./rack/fastlint.rb"
7
7
  module Sansomable
8
8
  InvalidRouteError = Class.new StandardError
9
9
  HTTP_VERBS = [:get,:head, :post, :put, :delete, :patch, :options, :link, :unlink, :trace].freeze
10
+ ROUTE_METHODS = HTTP_VERBS+[:map]
10
11
  RACK_HANDLERS = ["puma", "unicorn", "thin", "webrick"].freeze
11
12
  NOT_FOUND = [404, {}, ["Not found."]].freeze
12
13
 
@@ -20,40 +21,46 @@ module Sansomable
20
21
 
21
22
  def call env
22
23
  return NOT_FOUND if tree.leaf? && tree.root?
23
-
24
+
24
25
  r = Rack::Request.new env
25
26
  m = tree.match r.path_info, r.request_method
26
-
27
+
27
28
  return NOT_FOUND if m.nil?
28
29
 
29
- if @before_block && @before_block.arity == 1
30
- bres = @before_block.call r
31
- return bres if Rack::Fastlint.response bres
32
- end
30
+ begin
31
+ if @before_block && @before_block.arity == 1
32
+ bres = @before_block.call r
33
+ return bres if Rack::Fastlint.response bres
34
+ end
33
35
 
34
- if m.url_params.count > 0
35
- q = r.params.merge m.url_params
36
- s = q.map { |p| p.join '=' }.join '&'
37
- r.env["rack.request.query_hash"] = q
38
- r.env["rack.request.query_string"] = s
39
- r.env["QUERY_STRING"] = s
40
- r.instance_variable_set "@params", r.POST.merge(q)
41
- end
36
+ if m.url_params.count > 0
37
+ q = r.params.merge m.url_params
38
+ s = q.map { |p| p.join '=' }.join '&'
39
+ r.env["rack.request.query_hash"] = q
40
+ r.env["rack.request.query_string"] = s
41
+ r.env["QUERY_STRING"] = s
42
+ r.instance_variable_set "@params", r.POST.merge(q)
43
+ end
42
44
 
43
- case m.item
44
- when Proc then res = m.item.call r
45
- else
46
- raise InvalidRouteError, "Route handlers must be blocks or valid rack apps." unless m.item.respond_to? :call
47
- r.env["PATH_INFO"] = m.remaining_path
48
- res = m.item.call r.env
49
- end
45
+ case m.item
46
+ when Proc then res = m.item.call r
47
+ else
48
+ raise InvalidRouteError, "Route handlers must be blocks or valid rack apps." unless m.item.respond_to? :call
49
+ r.env["PATH_INFO"] = m.remaining_path
50
+ res = m.item.call r.env
51
+ end
50
52
 
51
- if @after_block && @after_block.arity == 2
52
- ares = @after_block.call r, res
53
- return ares if Rack::Fastlint.response ares
54
- end
53
+ if @after_block && @after_block.arity == 2
54
+ ares = @after_block.call r, res
55
+ return ares if Rack::Fastlint.response ares
56
+ end
55
57
 
56
- res
58
+ res
59
+ rescue StandardError => e
60
+ b = (@error_blocks[e.class] || @error_blocks[:default]) rescue nil
61
+ raise e if b.nil?
62
+ b.call e, r
63
+ end
57
64
  end
58
65
 
59
66
  def start port=3001
@@ -61,6 +68,11 @@ module Sansomable
61
68
  Rack::Handler.pick(RACK_HANDLERS).run self, :Port => port
62
69
  end
63
70
 
71
+ def error error_key=:default, &block
72
+ @error_blocks ||= {}
73
+ @error_blocks[error_key] = block
74
+ end
75
+
64
76
  def before &block
65
77
  @before_block = block
66
78
  end
@@ -73,7 +85,7 @@ module Sansomable
73
85
  path, item = *args.dup.push(block)
74
86
  return super unless path && item
75
87
  return super unless item != self
76
- return super unless (HTTP_VERBS+[:map]).include?(meth)
88
+ return super unless ROUTE_METHODS.include? meth
77
89
  tree.map_path path, item, meth
78
90
  end
79
91
  end
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |s|
6
6
  s.name = "sansom"
7
- s.version = "0.1.0"
7
+ s.version = "0.1.1"
8
8
  s.authors = ["Nathaniel Symer"]
9
9
  s.email = ["nate@natesymer.com"]
10
10
  s.summary = "Scientific, philosophical, abstract web 'picowork' named after Sansom street in Philly, near where it was made."
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sansom
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nathaniel Symer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-03 00:00:00.000000000 Z
11
+ date: 2014-08-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler