sansom 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c0ed3a40529913f75db37f78542ad2a6a1dde6a0
4
- data.tar.gz: c9b93cde34acbcc3a3144170c75caa112192d72e
3
+ metadata.gz: d1548d457d044bae13692b07bcb7a8374212be88
4
+ data.tar.gz: 13e2ea4214d1b6a3c5b7c2c05421776f20dd9c92
5
5
  SHA512:
6
- metadata.gz: 38f436abd2d865c291f9c5edb4cded8eb6928374c80aa4a51b867c2e4f9dfe2e9e0e7b95363ef6e53d17088864482f4ff43e62215215c8760bb3ca710edd1063
7
- data.tar.gz: d9b5f887a2620ee55d1c9584c068c61c86a48c63a8d3babbb7106e36899798f1904f33ff03280ee3c91a6b694b68d7bff2ab375ce2e195f5a3607dee4b306749
6
+ metadata.gz: e097de2bf1ea1b34754d9fde63983bc374d72e36a9cb446d275302824b1fc04183f1282b944add46b364ce1b5c7241520ce388eb53a4c09b702886748ce8a51e
7
+ data.tar.gz: 13503646c81f33fb6ad3cb9004859fa3bd9036781ed5ac7a1b05c5797d0777303575d578b7231353e99803246736ff49ae833ba9c506d053d717b869772dc002
data/changelog.md CHANGED
@@ -37,4 +37,13 @@ Here's an example
37
37
 
38
38
  - Parameterized URLs!!! (Stuff like `/user/:id/profile`)
39
39
  * Parameterized URLs work with mounted Rack/Sansom apps
40
- - Improved matching efficiency
40
+ - Improved matching efficiency
41
+
42
+ 0.0.6
43
+
44
+ - Before block response checking
45
+
46
+ 0.0.7
47
+
48
+ - Fixed bug where a wilcard path component would be ignored if it came last in the URL
49
+ - Fixed a bug where async responses would be marked as bad by the fastlinter.
data/lib/rack/fastlint.rb CHANGED
@@ -4,32 +4,36 @@ require "rack"
4
4
 
5
5
  module Rack
6
6
  class Fastlint
7
+ LintError = Class.new StandardError
7
8
  def self.response res
8
- # Check response format
9
9
  return false unless res.kind_of?(Array) && res.count == 3
10
10
 
11
11
  status, headers, body = res
12
12
 
13
- return false unless status.to_i >= 100
14
-
13
+ return false unless status.to_i >= 100 || status.to_i == -1
15
14
  return false unless headers.respond_to? :each
16
- headers.each { |k,v|
17
- next if key =~ /^rack\..+$/
18
- return false unless k.kind_of? String
19
- return false unless v.kind_of? String
20
- return false if k.downcase == "status"
21
- return false unless k !~ /[:\n]/
22
- return false unless k !~ /[-_]\z/
23
- return false unless k =~ /\A[a-zA-Z][a-zA-Z0-9_-]*\z/
24
- }
25
-
26
15
  return false unless body.respond_to? :each
27
- body.each { |part| return false unless part.kind_of? String }
28
16
 
29
17
  if body.respond_to? :to_path
30
18
  return false unless File.exist? body.to_path
31
19
  end
32
20
 
21
+ begin
22
+ headers.each { |k,v|
23
+ next if key =~ /^rack\..+$/
24
+ throw LintError unless k.kind_of? String
25
+ throw LintError unless v.kind_of? String
26
+ throw LintError if k.downcase == "status"
27
+ throw LintError unless k !~ /[:\n]/
28
+ throw LintError unless k !~ /[-_]\z/
29
+ throw LintError unless k =~ /\A[a-zA-Z][a-zA-Z0-9_-]*\z/
30
+ }
31
+
32
+ body.each { |part| throw LintError unless part.kind_of? String }
33
+ rescue StandardError
34
+ return false
35
+ end
36
+
33
37
  true
34
38
  end
35
39
  end
data/lib/sansom/pine.rb CHANGED
@@ -3,6 +3,27 @@
3
3
  # Path routing tree
4
4
 
5
5
  module Pine
6
+ Result = Struct.new :item, :remaining_path, :url_params
7
+
8
+ class Content
9
+ attr_accessor :items, :map
10
+
11
+ def initialize
12
+ @items = []
13
+ @map = {}
14
+ end
15
+
16
+ def []= k,v
17
+ @items << v if k == :map
18
+ @map[k] = v unless k == :map
19
+ end
20
+
21
+ def [] k
22
+ @items[k] if Numeric === k
23
+ @map[k] unless Numeric === k
24
+ end
25
+ end
26
+
6
27
  class Node
7
28
  attr_reader :name, :parent
8
29
  attr_accessor :content
@@ -23,15 +44,16 @@ module Pine
23
44
  end
24
45
 
25
46
  def wildcard?
26
- @wildcard
47
+ @name.start_with? ":"
27
48
  end
28
49
 
29
50
  def [] k
30
- return @children[k] || @children.values.first
31
- # child = @children[k] || @child.values.first
32
- # return child unless child.nil?
33
-
34
- # @children[k] || @children.values.first.wildcard? ? @children.values.first : nil
51
+ child = @children[k]
52
+ return child unless child.nil?
53
+ child = @children.values.first
54
+ return child if child.wildcard?
55
+ nil
56
+ # return @children[k] || @children.values.first
35
57
  end
36
58
 
37
59
  def create_and_save comp
@@ -41,9 +63,8 @@ module Pine
41
63
  child
42
64
  end
43
65
 
44
- def << comp
66
+ def << comp
45
67
  if comp.start_with? ":"
46
- @wildcard = true
47
68
  @children.clear
48
69
  create_and_save comp
49
70
  else
@@ -53,9 +74,13 @@ module Pine
53
74
  end
54
75
  end
55
76
 
56
- def parse_path path
77
+ def parse_path path, include_root=true
57
78
  c = path.split "/"
58
- c[0] = '/'
79
+ if include_root
80
+ c[0] = '/'
81
+ else
82
+ c.delete_at(0) if c[0].empty?
83
+ end
59
84
  c.delete_at(-1) if c[-1].empty?
60
85
  c
61
86
  end
@@ -70,14 +95,15 @@ module Pine
70
95
  matched_params = {}
71
96
 
72
97
  walk = parse_path(path).inject self do |node, comp|
73
- break node if node.leaf?
74
- matched_comps << comp unless comp == "/"
98
+ next node[comp] if node.name == "ROOT"
99
+ matched_comps << comp unless node.leaf?
75
100
  child = node[comp]
76
- matched_params[child.name[1..-1]] = comp if node.wildcard?
101
+ matched_params[child.name[1..-1]] = comp if child.wildcard?
77
102
  child
78
103
  end
79
104
 
80
- return nil if walk.root? rescue true
105
+ return nil if walk.nil?
106
+ return nil if walk.root? #rescue true
81
107
 
82
108
  c = walk.content
83
109
  subpath = path.sub "/#{matched_comps.join("/")}", ""
@@ -95,25 +121,4 @@ module Pine
95
121
  obj.singleton_class.include? Sansomable
96
122
  end
97
123
  end
98
-
99
- Result = Struct.new :item, :remaining_path, :url_params
100
-
101
- class Content
102
- attr_accessor :items, :map
103
-
104
- def initialize
105
- @items = []
106
- @map = {}
107
- end
108
-
109
- def []= k,v
110
- @items << v if k == :map
111
- @map[k] = v unless k == :map
112
- end
113
-
114
- def [] k
115
- @items[k] if Numeric === k
116
- @map[k] unless Numeric === k
117
- end
118
- end
119
124
  end
data/lib/sansom.rb CHANGED
@@ -21,7 +21,7 @@ module Sansomable
21
21
  def call env
22
22
  return NOT_FOUND if tree.leaf?
23
23
 
24
- r = Rack::Request.new env.dup
24
+ r = Rack::Request.new env
25
25
 
26
26
  if @before_block
27
27
  res = @before_block.call r
@@ -29,25 +29,27 @@ module Sansomable
29
29
  end
30
30
 
31
31
  m = tree.match r.path_info, r.request_method
32
-
33
- if m.url_params.count > 0
34
- q = r.params.merge(m.url_params)
35
- s = q.map { |p| p.join '=' }.join("&")
36
- r.env["rack.request.query_hash"] = q
37
- r.env["rack.request.query_string"] = s
38
- r.env["QUERY_STRING"] = s
39
- r.instance_variable_set "@params", r.POST.merge(q)
40
- end
41
32
 
42
- if !m
33
+ if m.nil?
43
34
  NOT_FOUND
44
- elsif m.item.is_a? Proc
45
- m.item.call r
46
- elsif m.item.respond_to? :call
47
- r.env["PATH_INFO"] = m.remaining_path
48
- m.item.call r.env
49
- else
50
- raise InvalidRouteError, "Route handlers must be blocks or valid rack apps."
35
+ else
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
44
+
45
+ if m.item.is_a? Proc
46
+ m.item.call r
47
+ elsif m.item.respond_to? :call
48
+ r.env["PATH_INFO"] = m.remaining_path
49
+ m.item.call r.env
50
+ else
51
+ raise InvalidRouteError, "Route handlers must be blocks or valid rack apps."
52
+ end
51
53
  end
52
54
  end
53
55
 
data/sansom.gemspec CHANGED
@@ -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.0.6"
7
+ s.version = "0.0.7"
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,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sansom
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nathaniel Symer