joshbuddy-usher 0.0.2 → 0.0.3
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.
- data/lib/usher/grapher.rb +1 -0
- data/lib/usher/node.rb +9 -6
- data/lib/usher/route/splitter.rb +9 -18
- data/lib/usher/route.rb +0 -1
- data/lib/usher.rb +6 -7
- data/spec/path_spec.rb +6 -9
- data/spec/split_spec.rb +10 -13
- data/usher.gemspec +3 -2
- metadata +11 -3
- data/lib/usher/route/separator.rb +0 -21
- data/spec/node/lookup_spec.rb +0 -53
data/lib/usher/grapher.rb
CHANGED
data/lib/usher/node.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
$:.unshift File.dirname(__FILE__)
|
2
2
|
|
3
|
-
require '
|
3
|
+
require 'fuzzy_hash'
|
4
4
|
|
5
5
|
class Usher
|
6
6
|
|
@@ -14,7 +14,7 @@ class Usher
|
|
14
14
|
def initialize(parent, value)
|
15
15
|
@parent = parent
|
16
16
|
@value = value
|
17
|
-
@lookup =
|
17
|
+
@lookup = FuzzyHash.new
|
18
18
|
@exclusive_type = nil
|
19
19
|
@has_globber = find_parent{|p| p.value && p.value.is_a?(Route::Variable)}
|
20
20
|
end
|
@@ -104,6 +104,7 @@ class Usher
|
|
104
104
|
|
105
105
|
def find(request, path = Route::Splitter.url_split(request.path), params = [])
|
106
106
|
part = path.shift unless path.size.zero?
|
107
|
+
|
107
108
|
if @exclusive_type
|
108
109
|
path.unshift part
|
109
110
|
[@lookup[request.send(@exclusive_type)], @lookup[nil]].each do |n|
|
@@ -126,19 +127,21 @@ class Usher
|
|
126
127
|
when Symbol
|
127
128
|
part = part.send(t)
|
128
129
|
end
|
129
|
-
part =
|
130
130
|
raise "#{part} does not conform to #{next_part.value.validator}" if next_part.value.validator && (not next_part.value.validator === part)
|
131
131
|
case next_part.value.type
|
132
132
|
when :*
|
133
133
|
params << [next_part.value.name, []]
|
134
|
-
params.last.last << part
|
134
|
+
params.last.last << part
|
135
135
|
when :':'
|
136
136
|
params << [next_part.value.name, part]
|
137
|
+
when:'.:'
|
138
|
+
part.slice!(0)
|
139
|
+
params << [next_part.value.name, part]
|
137
140
|
end
|
138
141
|
end
|
139
142
|
next_part.find(request, path, params)
|
140
|
-
elsif has_globber? && p = find_parent{|p|
|
141
|
-
params.last.last << part
|
143
|
+
elsif has_globber? && p = find_parent{|p| p.value.is_a?(Route::Variable) && p.value.type == :*}
|
144
|
+
params.last.last << part
|
142
145
|
find(request, path, params)
|
143
146
|
else
|
144
147
|
nil
|
data/lib/usher/route/splitter.rb
CHANGED
@@ -2,8 +2,8 @@ class Usher
|
|
2
2
|
class Route
|
3
3
|
class Splitter
|
4
4
|
|
5
|
-
ScanRegex = /([
|
6
|
-
UrlScanRegex =
|
5
|
+
ScanRegex = /((:|\*||\.:|)[0-9a-z_]+|\/|\(|\))/
|
6
|
+
UrlScanRegex = /\/|\.?\w+/
|
7
7
|
|
8
8
|
attr_reader :paths
|
9
9
|
|
@@ -13,37 +13,27 @@ class Usher
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def self.url_split(path)
|
16
|
-
parts =
|
16
|
+
parts = []
|
17
17
|
ss = StringScanner.new(path)
|
18
18
|
while !ss.eos?
|
19
|
-
part = ss.scan(UrlScanRegex)
|
20
|
-
|
21
|
-
when ?.
|
22
|
-
parts << Separator::Dot
|
23
|
-
when ?/
|
24
|
-
parts << Separator::Slash
|
25
|
-
else
|
26
|
-
parts << part
|
19
|
+
if part = ss.scan(UrlScanRegex)
|
20
|
+
parts << part unless part == '/'
|
27
21
|
end
|
28
22
|
end if path && !path.empty?
|
29
23
|
parts
|
30
24
|
end
|
31
25
|
|
32
26
|
def self.split(path, requirements = {}, transformers = {})
|
33
|
-
parts =
|
27
|
+
parts = []
|
34
28
|
ss = StringScanner.new(path)
|
35
29
|
groups = [parts]
|
36
30
|
current_group = parts
|
37
31
|
while !ss.eos?
|
38
32
|
part = ss.scan(ScanRegex)
|
39
33
|
case part[0]
|
40
|
-
when ?*,
|
41
|
-
type = part.slice!(0).chr.to_sym
|
34
|
+
when ?*, ?:, ?.
|
35
|
+
type = (part[1] == ?: ? part.slice!(0,2) : part.slice!(0).chr).to_sym
|
42
36
|
current_group << Variable.new(type, part, :validator => requirements[part.to_sym], :transformer => transformers[part.to_sym])
|
43
|
-
when ?.
|
44
|
-
current_group << Separator::Dot
|
45
|
-
when ?/
|
46
|
-
current_group << Separator::Slash
|
47
37
|
when ?(
|
48
38
|
new_group = []
|
49
39
|
groups << new_group
|
@@ -52,6 +42,7 @@ class Usher
|
|
52
42
|
when ?)
|
53
43
|
groups.pop
|
54
44
|
current_group = groups.last
|
45
|
+
when ?/
|
55
46
|
else
|
56
47
|
current_group << part
|
57
48
|
end
|
data/lib/usher/route.rb
CHANGED
data/lib/usher.rb
CHANGED
@@ -93,22 +93,21 @@ class Usher
|
|
93
93
|
Array(params)
|
94
94
|
end
|
95
95
|
|
96
|
-
generated_path =
|
96
|
+
generated_path = ''
|
97
97
|
|
98
|
-
sep_p = nil
|
99
98
|
path.parts.each do |p|
|
100
99
|
case p
|
101
100
|
when Route::Variable
|
102
101
|
case p.type
|
103
102
|
when :*
|
104
|
-
generated_path <<
|
103
|
+
generated_path << '/' << param_list.shift * '/'
|
104
|
+
when :'.:'
|
105
|
+
(dp = param_list.shift) && generated_path << '.' << dp.to_s
|
105
106
|
else
|
106
|
-
(dp = param_list.shift) && generated_path <<
|
107
|
+
(dp = param_list.shift) && generated_path << '/' << dp.to_s
|
107
108
|
end
|
108
|
-
when Route::Separator
|
109
|
-
sep_p = p
|
110
109
|
else
|
111
|
-
generated_path <<
|
110
|
+
generated_path << '/' << p.to_s
|
112
111
|
end
|
113
112
|
end
|
114
113
|
unless params_hash.blank?
|
data/spec/path_spec.rb
CHANGED
@@ -2,9 +2,6 @@ require 'lib/usher'
|
|
2
2
|
|
3
3
|
route_set = Usher.new
|
4
4
|
|
5
|
-
S = Usher::Route::Separator::Slash
|
6
|
-
D = Usher::Route::Separator::Dot
|
7
|
-
|
8
5
|
describe "Usher route adding" do
|
9
6
|
|
10
7
|
before(:each) do
|
@@ -25,12 +22,12 @@ describe "Usher route adding" do
|
|
25
22
|
it "should add every kind of optional route possible" do
|
26
23
|
route_set.add_route('/a/b(/c)(/d(/e))')
|
27
24
|
route_set.routes.first.paths.collect{|a| a.parts }.should == [
|
28
|
-
[
|
29
|
-
[
|
30
|
-
[
|
31
|
-
[
|
32
|
-
[
|
33
|
-
[
|
25
|
+
["a", "b"],
|
26
|
+
["a", "b", "c"],
|
27
|
+
["a", "b", "d"],
|
28
|
+
["a", "b", "d", "e"],
|
29
|
+
["a", "b", "c", "d"],
|
30
|
+
["a", "b", "c", "d", "e"]
|
34
31
|
]
|
35
32
|
|
36
33
|
end
|
data/spec/split_spec.rb
CHANGED
@@ -1,36 +1,33 @@
|
|
1
1
|
require 'lib/usher'
|
2
2
|
|
3
|
-
Slash = Usher::Route::Separator::Slash
|
4
|
-
Dot = Usher::Route::Separator::Dot
|
5
|
-
|
6
3
|
describe "Usher route tokenizing" do
|
7
4
|
|
8
5
|
|
9
6
|
it "should split / delimited routes" do
|
10
|
-
Usher::Route::Splitter.new('/test/this/split').paths.first.should == [
|
7
|
+
Usher::Route::Splitter.new('/test/this/split').paths.first.should == ['test', 'this', 'split']
|
11
8
|
end
|
12
9
|
|
13
10
|
it "should group optional parts with brackets" do
|
14
11
|
Usher::Route::Splitter.new('/test/this(/split)').paths.should == [
|
15
|
-
[
|
16
|
-
[
|
12
|
+
['test', 'this'],
|
13
|
+
['test', 'this', 'split']
|
17
14
|
]
|
18
15
|
end
|
19
16
|
|
20
17
|
it "should group optional parts with brackets (for non overlapping groups)" do
|
21
18
|
Usher::Route::Splitter.new('/test/this(/split)(/split2)').paths == [
|
22
|
-
[
|
23
|
-
[
|
24
|
-
[
|
25
|
-
[
|
19
|
+
["test", "this"],
|
20
|
+
["test", "this", "split"],
|
21
|
+
["test", "this", "split2"],
|
22
|
+
["test", "this", "split", "split2"]
|
26
23
|
]
|
27
24
|
end
|
28
25
|
|
29
26
|
it "should group nested-optional parts with brackets" do
|
30
27
|
Usher::Route::Splitter.new('/test/this(/split(.:format))').paths == [
|
31
|
-
[
|
32
|
-
[
|
33
|
-
[
|
28
|
+
["test", "this"],
|
29
|
+
["test", "this", "split"],
|
30
|
+
["test", "this", "split", Usher::Route::Variable.new(:'.:', :format)]
|
34
31
|
]
|
35
32
|
end
|
36
33
|
|
data/usher.gemspec
CHANGED
@@ -2,20 +2,21 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{usher}
|
5
|
-
s.version = "0.0.
|
5
|
+
s.version = "0.0.3"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Joshua HullJoshua Hull"]
|
9
9
|
s.date = %q{2009-03-01}
|
10
10
|
s.email = %q{joshbuddy@gmail.comjoshbuddy@gmail.com}
|
11
11
|
s.extra_rdoc_files = ["History.txt", "Manifest.txt"]
|
12
|
-
s.files = ["History.txt", "Manifest.txt", "README.rdoc", "Rakefile", "lib/compat.rb", "lib/usher.rb", "lib/usher/exceptions.rb", "lib/usher/grapher.rb", "lib/usher/interface.rb", "lib/usher/interface/merb_interface.rb", "lib/usher/interface/rack_interface.rb", "lib/usher/interface/rack_interface/mapper.rb", "lib/usher/interface/rack_interface/route.rb", "lib/usher/interface/rails2_interface.rb", "lib/usher/interface/rails2_interface/mapper.rb", "lib/usher/node.rb", "lib/usher/node/lookup.rb", "lib/usher/route.rb", "lib/usher/route/http.rb", "lib/usher/route/path.rb", "lib/usher/route/
|
12
|
+
s.files = ["History.txt", "Manifest.txt", "README.rdoc", "Rakefile", "lib/compat.rb", "lib/usher.rb", "lib/usher/exceptions.rb", "lib/usher/grapher.rb", "lib/usher/interface.rb", "lib/usher/interface/merb_interface.rb", "lib/usher/interface/rack_interface.rb", "lib/usher/interface/rack_interface/mapper.rb", "lib/usher/interface/rack_interface/route.rb", "lib/usher/interface/rails2_interface.rb", "lib/usher/interface/rails2_interface/mapper.rb", "lib/usher/node.rb", "lib/usher/node/lookup.rb", "lib/usher/route.rb", "lib/usher/route/http.rb", "lib/usher/route/path.rb", "lib/usher/route/splitter.rb", "lib/usher/route/variable.rb", "rails/init.rb", "spec/generate_spec.rb", "spec/path_spec.rb", "spec/rack/dispatch_spec.rb", "spec/rails/generate_spec.rb", "spec/rails/path_spec.rb", "spec/rails/recognize_spec.rb", "spec/recognize_spec.rb", "spec/spec.opts", "spec/split_spec.rb", "usher.gemspec"]
|
13
13
|
s.has_rdoc = true
|
14
14
|
s.rdoc_options = ["--main", "README.rdoc"]
|
15
15
|
s.require_paths = ["lib"]
|
16
16
|
s.rubyforge_project = %q{usher}
|
17
17
|
s.rubygems_version = %q{1.3.1}
|
18
18
|
s.summary = %q{Tree-based router}
|
19
|
+
s.add_dependency(%q<fuzzy_hash>)
|
19
20
|
|
20
21
|
if s.respond_to? :specification_version then
|
21
22
|
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: joshbuddy-usher
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joshua HullJoshua Hull
|
@@ -12,6 +12,16 @@ cert_chain: []
|
|
12
12
|
date: 2009-03-01 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: fuzzy_hash
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "0"
|
24
|
+
version:
|
15
25
|
- !ruby/object:Gem::Dependency
|
16
26
|
name: hoe
|
17
27
|
type: :development
|
@@ -52,12 +62,10 @@ files:
|
|
52
62
|
- lib/usher/route.rb
|
53
63
|
- lib/usher/route/http.rb
|
54
64
|
- lib/usher/route/path.rb
|
55
|
-
- lib/usher/route/separator.rb
|
56
65
|
- lib/usher/route/splitter.rb
|
57
66
|
- lib/usher/route/variable.rb
|
58
67
|
- rails/init.rb
|
59
68
|
- spec/generate_spec.rb
|
60
|
-
- spec/node/lookup_spec.rb
|
61
69
|
- spec/path_spec.rb
|
62
70
|
- spec/rack/dispatch_spec.rb
|
63
71
|
- spec/rails/generate_spec.rb
|
@@ -1,21 +0,0 @@
|
|
1
|
-
class Usher
|
2
|
-
class Route
|
3
|
-
|
4
|
-
class Separator
|
5
|
-
private
|
6
|
-
def initialize(sep)
|
7
|
-
@sep = sep
|
8
|
-
@sep_to_s = "#{sep}"
|
9
|
-
end
|
10
|
-
|
11
|
-
public
|
12
|
-
def to_s
|
13
|
-
@sep_to_s
|
14
|
-
end
|
15
|
-
|
16
|
-
Dot = Separator.new(:'.')
|
17
|
-
Slash = Separator.new(:/)
|
18
|
-
end
|
19
|
-
|
20
|
-
end
|
21
|
-
end
|
data/spec/node/lookup_spec.rb
DELETED
@@ -1,53 +0,0 @@
|
|
1
|
-
require 'lib/usher'
|
2
|
-
|
3
|
-
|
4
|
-
describe "String/regexp lookup table" do
|
5
|
-
|
6
|
-
it "should accept strings and retrieve based on them" do
|
7
|
-
l = Usher::Node::Lookup.new
|
8
|
-
l['asd'] = 'qwe'
|
9
|
-
l['asd'].should == 'qwe'
|
10
|
-
end
|
11
|
-
|
12
|
-
it "should accept regexs too" do
|
13
|
-
l = Usher::Node::Lookup.new
|
14
|
-
l[/asd.*/] = 'qwe'
|
15
|
-
l['asdqweasd'].should == 'qwe'
|
16
|
-
end
|
17
|
-
|
18
|
-
it "should prefer string to regex matches" do
|
19
|
-
l = Usher::Node::Lookup.new
|
20
|
-
l['asd'] = 'qwe2'
|
21
|
-
l[/asd.*/] = 'qwe'
|
22
|
-
l['asd'].should == 'qwe2'
|
23
|
-
end
|
24
|
-
|
25
|
-
it "should allow nil keys" do
|
26
|
-
l = Usher::Node::Lookup.new
|
27
|
-
l[nil] = 'qwe2'
|
28
|
-
l['asd'] = 'qwe'
|
29
|
-
l['asd'].should == 'qwe'
|
30
|
-
l[nil].should == 'qwe2'
|
31
|
-
end
|
32
|
-
|
33
|
-
it "should be able to delete by value for hash" do
|
34
|
-
l = Usher::Node::Lookup.new
|
35
|
-
l[nil] = 'qwe2'
|
36
|
-
l['asd'] = 'qwe'
|
37
|
-
l['asd'].should == 'qwe'
|
38
|
-
l[nil].should == 'qwe2'
|
39
|
-
l.delete_value('qwe2')
|
40
|
-
l[nil].should == nil
|
41
|
-
end
|
42
|
-
|
43
|
-
it "should be able to delete by value for hash" do
|
44
|
-
l = Usher::Node::Lookup.new
|
45
|
-
l[/qwe.*/] = 'qwe2'
|
46
|
-
l['asd'] = 'qwe'
|
47
|
-
l['asd'].should == 'qwe'
|
48
|
-
l['qweasd'].should == 'qwe2'
|
49
|
-
l.delete_value('qwe2')
|
50
|
-
l['qweasd'].should == nil
|
51
|
-
end
|
52
|
-
|
53
|
-
end
|