sansom 0.1.0 → 0.1.1

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.
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