seg 1.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +5 -0
- data/README.md +76 -0
- data/lib/seg.rb +37 -33
- data/seg.gemspec +1 -1
- data/test/all.rb +123 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 85e4f67c3472b35609aba2853349c2f7e16ae6ce
|
4
|
+
data.tar.gz: 39190247aa987002047eee99c06951f88b09a387
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 779a171e3f11639dd25b2cd2650ebce689c266d0883fadc4112df9d03bd385276c7c0dbf5a966d26c1a75e95216c0f54bd261540422b7bff3dbdabcb83665687
|
7
|
+
data.tar.gz: 3520f9f89f45dae7eb5c80ea2cf095129f578e997e13e1858e38648185d8ced715f3347443870efea1e9973ee65976378678692d847a0ff5caaf2a61a21ccf7b
|
data/CHANGELOG
CHANGED
data/README.md
CHANGED
@@ -141,6 +141,82 @@ otherwise:
|
|
141
141
|
=> ""
|
142
142
|
```
|
143
143
|
|
144
|
+
You can also go back by using the methods `retract` and `restore`,
|
145
|
+
which are the antidote to `extract` and `consume` respectively.
|
146
|
+
|
147
|
+
Let's see how `retract` works:
|
148
|
+
|
149
|
+
```ruby
|
150
|
+
>> s = Seg.new("/users/42")
|
151
|
+
=> #<Seg ...>
|
152
|
+
|
153
|
+
>> s.prev
|
154
|
+
=> ""
|
155
|
+
|
156
|
+
>> s.curr
|
157
|
+
=> "/users/42"
|
158
|
+
|
159
|
+
>> s.extract
|
160
|
+
=> "users"
|
161
|
+
|
162
|
+
>> s.prev
|
163
|
+
=> "/users"
|
164
|
+
|
165
|
+
>> s.curr
|
166
|
+
=> "/42"
|
167
|
+
|
168
|
+
>> s.retract
|
169
|
+
=> "users"
|
170
|
+
|
171
|
+
>> s.prev
|
172
|
+
=> ""
|
173
|
+
|
174
|
+
>> s.curr
|
175
|
+
=> "/users/42"
|
176
|
+
```
|
177
|
+
|
178
|
+
And now `restore`:
|
179
|
+
|
180
|
+
```ruby
|
181
|
+
>> s = Seg.new("/users/42")
|
182
|
+
=> #<Seg ...>
|
183
|
+
|
184
|
+
>> s.prev
|
185
|
+
=> ""
|
186
|
+
|
187
|
+
>> s.curr
|
188
|
+
=> "/users/42"
|
189
|
+
|
190
|
+
>> s.extract
|
191
|
+
=> "users"
|
192
|
+
|
193
|
+
>> s.prev
|
194
|
+
=> "/users"
|
195
|
+
|
196
|
+
>> s.curr
|
197
|
+
=> "/42"
|
198
|
+
|
199
|
+
>> s.restore("foo")
|
200
|
+
=> false
|
201
|
+
|
202
|
+
>> s.restore("users")
|
203
|
+
=> true
|
204
|
+
|
205
|
+
>> s.prev
|
206
|
+
=> ""
|
207
|
+
|
208
|
+
>> s.curr
|
209
|
+
=> "/users/42"
|
210
|
+
```
|
211
|
+
|
212
|
+
See also
|
213
|
+
--------
|
214
|
+
|
215
|
+
[Syro][syro] is a routing library that uses `Seg` for matching the
|
216
|
+
request path.
|
217
|
+
|
218
|
+
[syro]: http://soveran.github.io/syro/
|
219
|
+
|
144
220
|
Installation
|
145
221
|
------------
|
146
222
|
|
data/lib/seg.rb
CHANGED
@@ -24,60 +24,64 @@ class Seg
|
|
24
24
|
SLASH = "/".freeze
|
25
25
|
|
26
26
|
def initialize(path)
|
27
|
-
@path = path
|
28
|
-
@size = path.size
|
29
|
-
@
|
27
|
+
@path = path || SLASH
|
28
|
+
@size = @path.size
|
29
|
+
@init = 0
|
30
|
+
@pos = 0
|
30
31
|
end
|
31
32
|
|
32
33
|
def curr
|
33
|
-
@path[@pos -
|
34
|
+
@path[@pos, @size - @pos]
|
34
35
|
end
|
35
36
|
|
36
37
|
def prev
|
37
|
-
@path[
|
38
|
+
@path[@init, @pos]
|
38
39
|
end
|
39
40
|
|
40
|
-
def
|
41
|
-
@
|
42
|
-
end
|
43
|
-
|
44
|
-
def subs(len)
|
45
|
-
@path[@pos, len]
|
41
|
+
def root?
|
42
|
+
@size <= @pos.succ
|
46
43
|
end
|
47
44
|
|
48
|
-
def
|
49
|
-
@
|
50
|
-
end
|
51
|
-
|
52
|
-
def root?
|
53
|
-
@pos >= @size
|
45
|
+
def init?
|
46
|
+
@init == @pos
|
54
47
|
end
|
55
48
|
|
56
49
|
def extract
|
57
50
|
return nil if root?
|
58
51
|
|
59
|
-
|
60
|
-
|
52
|
+
offs = @pos.succ
|
53
|
+
@pos = @path.index(SLASH, offs) || @size
|
54
|
+
|
55
|
+
return @path[offs, @pos - offs]
|
56
|
+
end
|
57
|
+
|
58
|
+
def retract
|
59
|
+
return nil if init?
|
61
60
|
|
62
|
-
|
61
|
+
offs = @pos.pred
|
62
|
+
@pos = @path.rindex(SLASH, offs)
|
63
63
|
|
64
|
-
|
64
|
+
return @path[@pos.succ, offs - @pos]
|
65
65
|
end
|
66
66
|
|
67
67
|
def consume(str)
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
68
|
+
orig = @pos
|
69
|
+
|
70
|
+
if str == extract
|
71
|
+
return true
|
72
|
+
else
|
73
|
+
@pos = orig
|
74
|
+
return false
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def restore(str)
|
79
|
+
orig = @pos
|
80
|
+
|
81
|
+
if str == retract
|
82
|
+
return true
|
80
83
|
else
|
84
|
+
@pos = orig
|
81
85
|
return false
|
82
86
|
end
|
83
87
|
end
|
data/seg.gemspec
CHANGED
data/test/all.rb
CHANGED
@@ -1,3 +1,89 @@
|
|
1
|
+
test "nil" do
|
2
|
+
segment = Seg.new(nil)
|
3
|
+
|
4
|
+
assert_equal segment.prev, ""
|
5
|
+
assert_equal segment.curr, "/"
|
6
|
+
assert segment.root?
|
7
|
+
end
|
8
|
+
|
9
|
+
test "root" do
|
10
|
+
segment = Seg.new("/")
|
11
|
+
|
12
|
+
assert_equal segment.prev, ""
|
13
|
+
assert_equal segment.curr, "/"
|
14
|
+
assert segment.root?
|
15
|
+
end
|
16
|
+
|
17
|
+
test "init" do
|
18
|
+
segment = Seg.new("/")
|
19
|
+
|
20
|
+
assert segment.init?
|
21
|
+
assert segment.root?
|
22
|
+
|
23
|
+
segment = Seg.new("/foo")
|
24
|
+
|
25
|
+
assert segment.init?
|
26
|
+
assert !segment.root?
|
27
|
+
|
28
|
+
assert_equal segment.extract, "foo"
|
29
|
+
|
30
|
+
assert !segment.init?
|
31
|
+
assert segment.root?
|
32
|
+
end
|
33
|
+
|
34
|
+
test "extract" do
|
35
|
+
segment = Seg.new("/foo/bar/baz")
|
36
|
+
|
37
|
+
assert_equal segment.extract, "foo"
|
38
|
+
assert_equal segment.prev, "/foo"
|
39
|
+
assert_equal segment.curr, "/bar/baz"
|
40
|
+
assert !segment.root?
|
41
|
+
|
42
|
+
assert_equal segment.extract, "bar"
|
43
|
+
assert_equal segment.prev, "/foo/bar"
|
44
|
+
assert_equal segment.curr, "/baz"
|
45
|
+
assert !segment.root?
|
46
|
+
|
47
|
+
assert_equal segment.extract, "baz"
|
48
|
+
assert_equal segment.prev, "/foo/bar/baz"
|
49
|
+
assert_equal segment.curr, ""
|
50
|
+
assert segment.root?
|
51
|
+
|
52
|
+
assert_equal segment.extract, nil
|
53
|
+
assert_equal segment.prev, "/foo/bar/baz"
|
54
|
+
assert_equal segment.curr, ""
|
55
|
+
assert segment.root?
|
56
|
+
end
|
57
|
+
|
58
|
+
test "retract" do
|
59
|
+
segment = Seg.new("/foo/bar/baz")
|
60
|
+
|
61
|
+
3.times { segment.extract }
|
62
|
+
|
63
|
+
assert_equal segment.prev, "/foo/bar/baz"
|
64
|
+
assert_equal segment.curr, ""
|
65
|
+
|
66
|
+
assert_equal segment.retract, "baz"
|
67
|
+
assert_equal segment.prev, "/foo/bar"
|
68
|
+
assert_equal segment.curr, "/baz"
|
69
|
+
assert !segment.root?
|
70
|
+
|
71
|
+
assert_equal segment.retract, "bar"
|
72
|
+
assert_equal segment.prev, "/foo"
|
73
|
+
assert_equal segment.curr, "/bar/baz"
|
74
|
+
assert !segment.root?
|
75
|
+
|
76
|
+
assert_equal segment.retract, "foo"
|
77
|
+
assert_equal segment.prev, ""
|
78
|
+
assert_equal segment.curr, "/foo/bar/baz"
|
79
|
+
assert !segment.root?
|
80
|
+
|
81
|
+
assert_equal segment.retract, nil
|
82
|
+
assert_equal segment.prev, ""
|
83
|
+
assert_equal segment.curr, "/foo/bar/baz"
|
84
|
+
assert !segment.root?
|
85
|
+
end
|
86
|
+
|
1
87
|
test "consume" do
|
2
88
|
segment = Seg.new("/foo/bar/baz")
|
3
89
|
|
@@ -21,7 +107,12 @@ test "consume" do
|
|
21
107
|
assert_equal segment.curr, "/bar/baz"
|
22
108
|
assert !segment.root?
|
23
109
|
|
24
|
-
assert_equal segment.consume("bar
|
110
|
+
assert_equal segment.consume("bar"), true
|
111
|
+
assert_equal segment.prev, "/foo/bar"
|
112
|
+
assert_equal segment.curr, "/baz"
|
113
|
+
assert !segment.root?
|
114
|
+
|
115
|
+
assert_equal segment.consume("baz"), true
|
25
116
|
assert_equal segment.prev, "/foo/bar/baz"
|
26
117
|
assert_equal segment.curr, ""
|
27
118
|
assert segment.root?
|
@@ -32,6 +123,37 @@ test "consume" do
|
|
32
123
|
assert segment.root?
|
33
124
|
end
|
34
125
|
|
126
|
+
test "restore" do
|
127
|
+
segment = Seg.new("/foo/bar/baz")
|
128
|
+
|
129
|
+
3.times { segment.extract }
|
130
|
+
|
131
|
+
assert_equal segment.restore("foo"), false
|
132
|
+
assert_equal segment.prev, "/foo/bar/baz"
|
133
|
+
assert_equal segment.curr, ""
|
134
|
+
assert segment.root?
|
135
|
+
|
136
|
+
assert_equal segment.restore("baz"), true
|
137
|
+
assert_equal segment.prev, "/foo/bar"
|
138
|
+
assert_equal segment.curr, "/baz"
|
139
|
+
assert !segment.root?
|
140
|
+
|
141
|
+
assert_equal segment.restore("bar"), true
|
142
|
+
assert_equal segment.prev, "/foo"
|
143
|
+
assert_equal segment.curr, "/bar/baz"
|
144
|
+
assert !segment.root?
|
145
|
+
|
146
|
+
assert_equal segment.restore("foo"), true
|
147
|
+
assert_equal segment.prev, ""
|
148
|
+
assert_equal segment.curr, "/foo/bar/baz"
|
149
|
+
assert !segment.root?
|
150
|
+
|
151
|
+
assert_equal segment.restore("foo"), false
|
152
|
+
assert_equal segment.prev, ""
|
153
|
+
assert_equal segment.curr, "/foo/bar/baz"
|
154
|
+
assert !segment.root?
|
155
|
+
end
|
156
|
+
|
35
157
|
test "capture" do
|
36
158
|
segment = Seg.new("/foo/bar/baz")
|
37
159
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: seg
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michel Martens
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-07-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cutest
|