seg 1.1.0 → 1.2.0
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.
- 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
|