seg 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (7) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +5 -0
  3. data/README.md +76 -0
  4. data/lib/seg.rb +37 -33
  5. data/seg.gemspec +1 -1
  6. data/test/all.rb +123 -1
  7. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f25f1dea8441edea70194c8fd14b65b87a36b075
4
- data.tar.gz: 5dfa12b3f90ee62f6ad0b8967aaedb5c41a573ab
3
+ metadata.gz: 85e4f67c3472b35609aba2853349c2f7e16ae6ce
4
+ data.tar.gz: 39190247aa987002047eee99c06951f88b09a387
5
5
  SHA512:
6
- metadata.gz: 3b8538b53350f6f704306626db309d8c38984ef925c18abc8ac0acc5993ebed908189165f798a05c13ccd20be65b31a8ef2d3a109edc4ddecee03a685f7612f1
7
- data.tar.gz: 6ec70617648a4be0a7251cd8534a5a835724dffaa278cbaef0292754521961ab9bb571d66deca7f44dd1c8c29c166d2b718a845ccf1499ff9c18d84b627df771
6
+ metadata.gz: 779a171e3f11639dd25b2cd2650ebce689c266d0883fadc4112df9d03bd385276c7c0dbf5a966d26c1a75e95216c0f54bd261540422b7bff3dbdabcb83665687
7
+ data.tar.gz: 3520f9f89f45dae7eb5c80ea2cf095129f578e997e13e1858e38648185d8ced715f3347443870efea1e9973ee65976378678692d847a0ff5caaf2a61a21ccf7b
data/CHANGELOG CHANGED
@@ -1,3 +1,8 @@
1
+ 1.2.0
2
+
3
+ * Add retract method
4
+ * Add restore method
5
+
1
6
  1.1.0
2
7
 
3
8
  * Add extract method
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
- @pos = 1
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 - 1, @size]
34
+ @path[@pos, @size - @pos]
34
35
  end
35
36
 
36
37
  def prev
37
- @path[0, @pos - 1]
38
+ @path[@init, @pos]
38
39
  end
39
40
 
40
- def find(index)
41
- @path[@pos + index]
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 move(offset)
49
- @pos += offset.succ
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
- len = (@path.index(SLASH, @pos) || @size) - @pos
60
- res = subs(len)
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
- move(len)
61
+ offs = @pos.pred
62
+ @pos = @path.rindex(SLASH, offs)
63
63
 
64
- res
64
+ return @path[@pos.succ, offs - @pos]
65
65
  end
66
66
 
67
67
  def consume(str)
68
- return false if root?
69
-
70
- len = str.size
71
-
72
- case find(len)
73
- when nil, SLASH
74
- if subs(len) == str
75
- move(len)
76
- return true
77
- else
78
- return false
79
- end
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
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "seg"
3
- s.version = "1.1.0"
3
+ s.version = "1.2.0"
4
4
  s.summary = %{Segment matcher for paths}
5
5
  s.description = %Q{Segment matcher for paths.}
6
6
  s.authors = ["Michel Martens"]
@@ -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/baz"), true
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.1.0
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-05-25 00:00:00.000000000 Z
11
+ date: 2016-07-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cutest