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.
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