public
Fork of ndemonner/stone
Description: Plug-and-play data persistence created for small Ruby web applications.
Homepage: http://stone.rubyforge.org
Clone URL: git://github.com/juretta/stone.git
Search Repo:
Fixed bug with Symbol.matches => Regexp
ndemonner (author)
Sun Apr 13 16:16:14 -0700 2008
commit  f0d46c32d1a367f635c683e16a0e74c85c3beae2
tree    fe468b0b557642bb151007eb714abc1f5bde711d
parent  ac3c0620ee1bc9a190709712568179e68521c4cc
...
17
18
19
20
 
21
22
23
24
25
26
27
28
29
 
30
 
 
 
 
31
32
33
...
17
18
19
 
20
21
22
23
24
25
26
 
 
 
27
28
29
30
31
32
33
34
35
0
@@ -17,17 +17,19 @@ module Stone
0
                   when :includes
0
                     ".include?"
0
                   when :matches
0
- ".~="
0
+ ".=~"
0
                   when :equals
0
                     ".=="
0
                   end
0
     end
0
     
0
     def expression_for(arg)
0
- unless arg.is_a? String
0
- "#{self.field}#{self.op}(#{arg})"
0
- else
0
+ if arg.is_a? String
0
         "#{self.field}#{self.op}('#{arg}')"
0
+ elsif arg.is_a? Regexp
0
+ "#{self.field}#{self.op}(#{arg.inspect})"
0
+ else
0
+ "#{self.field}#{self.op}(#{arg})"
0
       end
0
     end
0
   end
...
166
167
168
169
170
171
 
172
173
174
...
181
182
183
184
185
186
 
187
188
189
...
166
167
168
 
 
 
169
170
171
172
...
179
180
181
 
 
 
182
183
184
185
0
@@ -166,9 +166,7 @@ module Stone
0
     # if no conditions are specified
0
     # === Parameters
0
     # +conditions+::
0
- # A string representing one or more Ruby expressions
0
- # === Example
0
- # <tt>Author.first("name ~= /Nick/i && email.include?('gmail.com')")</tt>
0
+ # A hash representing one or more Ruby expressions
0
     def first(conditions = nil)
0
       unless conditions
0
         return @@store.resources[self.to_s.make_key].first[1]
0
@@ -181,9 +179,7 @@ module Stone
0
     # conditions are specified
0
     # === Parameters
0
     # +conditions+::
0
- # A string representing one or more Ruby expressions
0
- # === Example
0
- # <tt>Author.all("created_at < DateTime.now")</tt>
0
+ # A hash representing one or more Ruby expressions
0
     def all(conditions = nil)
0
       objs = []
0
       unless conditions
...
166
167
168
169
170
171
 
172
173
174
...
181
182
183
184
185
186
 
187
188
189
...
166
167
168
 
 
 
169
170
171
172
...
179
180
181
 
 
 
182
183
184
185
0
@@ -166,9 +166,7 @@ module Stone
0
     # if no conditions are specified
0
     # === Parameters
0
     # +conditions+::
0
- # A string representing one or more Ruby expressions
0
- # === Example
0
- # <tt>Author.first("name ~= /Nick/i && email.include?('gmail.com')")</tt>
0
+ # A hash representing one or more Ruby expressions
0
     def first(conditions = nil)
0
       unless conditions
0
         return @@store.resources[self.to_s.make_key].first[1]
0
@@ -181,9 +179,7 @@ module Stone
0
     # conditions are specified
0
     # === Parameters
0
     # +conditions+::
0
- # A string representing one or more Ruby expressions
0
- # === Example
0
- # <tt>Author.all("created_at < DateTime.now")</tt>
0
+ # A hash representing one or more Ruby expressions
0
     def all(conditions = nil)
0
       objs = []
0
       unless conditions
...
1
2
 
3
4
5
6
7
 
8
9
10
...
1
 
2
3
4
5
6
 
7
8
9
10
0
@@ -1,10 +1,10 @@
0
 --- !ruby/object:Author
0
-created_at: 2008-04-13T13:02:17-07:00
0
+created_at: 2008-04-13T16:02:30-07:00
0
 email: nick@cladby.com
0
 errors: !ruby/object:Validatable::Errors
0
   errors: {}
0
 
0
-favorite_number: 42
0
+favorite_number: 48
0
 id: 1
0
 name: Nick DeMonner
0
 times_validated_hash:
...
1
2
 
3
4
5
6
7
 
8
9
10
...
1
 
2
3
4
5
6
 
7
8
9
10
0
@@ -1,10 +1,10 @@
0
 --- !ruby/object:Author
0
-created_at: 2008-04-13T13:02:17-07:00
0
+created_at: 2008-04-13T16:02:30-07:00
0
 email: heyo@something.com
0
 errors: !ruby/object:Validatable::Errors
0
   errors: {}
0
 
0
-favorite_number: 4
0
+favorite_number: 22
0
 id: 2
0
 name: Mike McMichaels
0
 times_validated_hash:
...
1
2
 
3
4
5
6
7
 
8
9
10
...
1
 
2
3
4
5
6
 
7
8
9
10
0
@@ -1,10 +1,10 @@
0
 --- !ruby/object:Author
0
-created_at: 2008-04-13T13:02:17-07:00
0
+created_at: 2008-04-13T16:02:30-07:00
0
 email: weyo@something.com
0
 errors: !ruby/object:Validatable::Errors
0
   errors: {}
0
 
0
-favorite_number: 39
0
+favorite_number: 11
0
 id: 3
0
 name: Mary Poppins
0
 times_validated_hash:
...
1
2
3
 
 
4
5
6
7
 
8
9
 
10
11
12
...
1
 
 
2
3
4
5
6
 
7
8
 
9
10
11
12
0
@@ -1,12 +1,12 @@
0
 --- !ruby/object:Author
0
-created_at: 2008-04-13T13:02:17-07:00
0
-email: bob@gmail.com
0
+created_at: 2008-04-13T16:02:30-07:00
0
+email: nick@gmail.com
0
 errors: !ruby/object:Validatable::Errors
0
   errors: {}
0
 
0
-favorite_number: 13
0
+favorite_number: 22
0
 id: 4
0
-name: Bob Hicklesby
0
+name: Nick Hicklesby
0
 times_validated_hash:
0
   Author/Validatable::ValidatesPresenceOf/email: 1
0
   Author/Validatable::ValidatesPresenceOf/name: 1
...
1
2
 
3
4
5
6
7
 
8
9
10
...
1
 
2
3
4
5
6
 
7
8
9
10
0
@@ -1,10 +1,10 @@
0
 --- !ruby/object:Author
0
-created_at: 2008-04-13T13:02:17-07:00
0
+created_at: 2008-04-13T16:02:30-07:00
0
 email: chariot_guy@hotmail.com
0
 errors: !ruby/object:Validatable::Errors
0
   errors: {}
0
 
0
-favorite_number: 11
0
+favorite_number: 23
0
 id: 5
0
 name: Ben Hurr
0
 times_validated_hash:
...
72
73
74
 
 
 
 
 
75
76
77
...
72
73
74
75
76
77
78
79
80
81
82
0
@@ -72,6 +72,11 @@ describe Stone::Resource do
0
     author.should be_instance_of(Author)
0
   end
0
   
0
+ it "should accept be able to find an object using a regex" do
0
+ author = Author.first(:name.matches => /nick/i)
0
+ author.should be_instance_of(Author)
0
+ end
0
+
0
   it "should raise an exception anything other than a Hash is provided for find" do
0
     lambda {Author.first("Nick")}.should raise_error
0
   end
...
153
154
155
156
 
157
158
159
160
 
 
161
162
163
...
195
196
197
198
199
 
 
200
201
202
203
204
205
206
207
 
 
 
 
 
208
209
210
211
212
213
214
215
216
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
217
218
219
...
153
154
155
 
156
157
158
 
 
159
160
161
162
163
...
195
196
197
 
 
198
199
200
201
202
 
 
 
 
 
203
204
205
206
207
208
209
210
211
 
 
 
 
 
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
0
@@ -153,11 +153,11 @@ your data gets persisted to files within <code>myapp/datastore/</code>.</p>
0
   <span class="constant">Author</span><span class="punct">.</span><span class="ident">first</span><span class="punct">(</span><span class="symbol">:name</span> <span class="punct">=&gt;</span> <span class="punct">&quot;</span><span class="string">Nick DeMonner</span><span class="punct">&quot;)</span>
0
   
0
   <span class="comment"># brings back first author whose name contains &quot;Nick&quot;</span>
0
- <span class="constant">Author</span><span class="punct">.</span><span class="ident">first</span><span class="punct">(&quot;</span><span class="string">name.include?('Nick')</span><span class="punct">&quot;)</span>
0
+ <span class="constant">Author</span><span class="punct">.</span><span class="ident">first</span><span class="punct">(</span><span class="symbol">:name</span><span class="punct">.</span><span class="ident">includes</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">Nick</span><span class="punct">')</span>
0
   
0
   <span class="comment"># brings back all authors whose email contains &quot;gmail.com&quot;, and who </span>
0
- <span class="comment"># were created before some_date_time</span>
0
- <span class="constant">Author</span><span class="punct">.</span><span class="ident">all</span><span class="punct">(&quot;</span><span class="string">email.include?('gmail.com') &amp;&amp; created_at &lt; some_date_time</span><span class="punct">&quot;)</span>
0
+ <span class="comment"># were created before today</span>
0
+ <span class="constant">Author</span><span class="punct">.</span><span class="ident">all</span><span class="punct">(</span><span class="symbol">:email</span><span class="punct">.</span><span class="ident">includes</span> <span class="punct">=&gt;</span> <span class="punct">&quot;</span><span class="string">gmail.com</span><span class="punct">&quot;,</span> <span class="symbol">:created_at</span><span class="punct">.</span><span class="ident">lt</span> <span class="punct">=&gt;</span> <span class="constant">DateTime</span><span class="punct">.</span><span class="ident">now</span><span class="punct">)</span>
0
 </pre></li>
0
   </ul>
0
 
0
@@ -195,25 +195,59 @@ your data gets persisted to files within <code>myapp/datastore/</code>.</p>
0
   <h3>A Word About Finding Stuff</h3>
0
 
0
 
0
- <p>You&#8217;ll note that Stone uses a string containing ruby expressions to find
0
-your data. Any method works here, just be careful when inserting values.</p>
0
+ <p>Stone uses a series of unique methods (à la DataMapper) to finding objects.
0
+You may use the following methods when searching:</p>
0
 
0
 
0
   <ul>
0
- <li>This&#8230;
0
-<pre class='syntax'>
0
- <span class="constant">Author</span><span class="punct">.</span><span class="ident">first</span><span class="punct">(&quot;</span><span class="string">name == <span class="expr">#{name}</span></span><span class="punct">&quot;)</span>
0
-</pre>
0
-...won&#8217;t work.</li>
0
+ <li><pre class='syntax'>
0
+ <span class="comment"># matches all objects whose &lt;code&gt;field&lt;/code&gt; is greater </span>
0
+ <span class="comment"># than &lt;code&gt;thing&lt;/code&gt;</span>
0
+ <span class="symbol">:field</span><span class="punct">.</span><span class="ident">gt</span> <span class="punct">=&gt;</span> <span class="ident">thing</span>
0
+ </pre></li>
0
   </ul>
0
 
0
 
0
   <ul>
0
- <li>Instead, use this&#8230;
0
-<pre class='syntax'>
0
- <span class="constant">Author</span><span class="punct">.</span><span class="ident">first</span><span class="punct">(&quot;</span><span class="string">name == '<span class="expr">#{name}</span>'</span><span class="punct">&quot;)</span>
0
-</pre>
0
-... and your luck will change.</li>
0
+ <li><pre class='syntax'>
0
+ <span class="comment"># matches objects whose &lt;code&gt;field&lt;/code&gt; is greater than </span>
0
+ <span class="comment"># or equal to &lt;code&gt;thing&lt;/code&gt;</span>
0
+ <span class="symbol">:field</span><span class="punct">.</span><span class="ident">gte</span> <span class="punct">=&gt;</span> <span class="ident">thing</span>
0
+ </pre></li>
0
+ </ul>
0
+
0
+
0
+ <ul>
0
+ <li><pre class='syntax'>
0
+ <span class="comment"># matches all objects whose &lt;code&gt;field&lt;/code&gt; is less </span>
0
+ <span class="comment"># than &lt;code&gt;thing&lt;/code&gt;</span>
0
+ <span class="symbol">:field</span><span class="punct">.</span><span class="ident">lt</span> <span class="punct">=&gt;</span> <span class="ident">thing</span>
0
+ </pre></li>
0
+ </ul>
0
+
0
+
0
+ <ul>
0
+ <li><pre class='syntax'>
0
+ <span class="comment"># matches all objects whose &lt;code&gt;field&lt;/code&gt; is less than</span>
0
+ <span class="comment"># or equal to &lt;code&gt;thing&lt;/code&gt;</span>
0
+ <span class="symbol">:field</span><span class="punct">.</span><span class="ident">lte</span> <span class="punct">=&gt;</span> <span class="ident">thing</span>
0
+ </pre></li>
0
+ </ul>
0
+
0
+
0
+ <ul>
0
+ <li><pre class='syntax'>
0
+ <span class="comment"># matches all objects whose &lt;code&gt;field&lt;/code&gt; contains &lt;code&gt;thing&lt;/code&gt;</span>
0
+ <span class="symbol">:field</span><span class="punct">.</span><span class="ident">includes</span> <span class="punct">=&gt;</span> <span class="ident">thing</span>
0
+ </pre></li>
0
+ </ul>
0
+
0
+
0
+ <ul>
0
+ <li><pre class='syntax'>
0
+ <span class="comment"># matches objects whose &lt;code&gt;field&lt;/code&gt; matches &lt;code&gt;pattern&lt;/code&gt;</span>
0
+ <span class="symbol">:field</span><span class="punct">.</span><span class="ident">matches</span> <span class="punct">=&gt;</span> <span class="ident">pattern</span> <span class="comment"># pattern is any RegEx</span>
0
+ </pre></li>
0
   </ul>
0
 
0
 
...
1
2
 
3
4
5
6
7
 
8
9
10
...
1
 
2
3
4
5
6
 
7
8
9
10
0
@@ -1,10 +1,10 @@
0
 --- !ruby/object:Author
0
-created_at: 2008-04-13T16:02:30-07:00
0
+created_at: 2008-04-13T16:15:41-07:00
0
 email: nick@cladby.com
0
 errors: !ruby/object:Validatable::Errors
0
   errors: {}
0
 
0
-favorite_number: 48
0
+favorite_number: 37
0
 id: 1
0
 name: Nick DeMonner
0
 times_validated_hash:
...
1
2
 
3
4
5
6
7
 
8
9
10
...
1
 
2
3
4
5
6
 
7
8
9
10
0
@@ -1,10 +1,10 @@
0
 --- !ruby/object:Author
0
-created_at: 2008-04-13T16:02:30-07:00
0
+created_at: 2008-04-13T16:15:41-07:00
0
 email: heyo@something.com
0
 errors: !ruby/object:Validatable::Errors
0
   errors: {}
0
 
0
-favorite_number: 22
0
+favorite_number: 36
0
 id: 2
0
 name: Mike McMichaels
0
 times_validated_hash:
...
1
2
 
3
4
5
6
7
 
8
9
10
...
1
 
2
3
4
5
6
 
7
8
9
10
0
@@ -1,10 +1,10 @@
0
 --- !ruby/object:Author
0
-created_at: 2008-04-13T16:02:30-07:00
0
+created_at: 2008-04-13T16:15:41-07:00
0
 email: weyo@something.com
0
 errors: !ruby/object:Validatable::Errors
0
   errors: {}
0
 
0
-favorite_number: 11
0
+favorite_number: 21
0
 id: 3
0
 name: Mary Poppins
0
 times_validated_hash:
...
1
2
 
3
4
5
6
7
 
8
9
10
...
1
 
2
3
4
5
6
 
7
8
9
10
0
@@ -1,10 +1,10 @@
0
 --- !ruby/object:Author
0
-created_at: 2008-04-13T16:02:30-07:00
0
+created_at: 2008-04-13T16:15:41-07:00
0
 email: nick@gmail.com
0
 errors: !ruby/object:Validatable::Errors
0
   errors: {}
0
 
0
-favorite_number: 22
0
+favorite_number: 13
0
 id: 4
0
 name: Nick Hicklesby
0
 times_validated_hash:
...
1
2
 
3
4
5
6
7
 
8
9
10
...
1
 
2
3
4
5
6
 
7
8
9
10
0
@@ -1,10 +1,10 @@
0
 --- !ruby/object:Author
0
-created_at: 2008-04-13T16:02:30-07:00
0
+created_at: 2008-04-13T16:15:41-07:00
0
 email: chariot_guy@hotmail.com
0
 errors: !ruby/object:Validatable::Errors
0
   errors: {}
0
 
0
-favorite_number: 23
0
+favorite_number: 6
0
 id: 5
0
 name: Ben Hurr
0
 times_validated_hash:
...
72
73
74
 
 
 
 
 
75
76
77
...
72
73
74
75
76
77
78
79
80
81
82
0
@@ -72,6 +72,11 @@ describe Stone::Resource do
0
     author.should be_instance_of(Author)
0
   end
0
   
0
+ it "should accept be able to find an object using a regex" do
0
+ author = Author.first(:name.matches => /nick/i)
0
+ author.should be_instance_of(Author)
0
+ end
0
+
0
   it "should raise an exception anything other than a Hash is provided for find" do
0
     lambda {Author.first("Nick")}.should raise_error
0
   end
...
153
154
155
156
 
157
158
159
160
 
 
161
162
163
...
195
196
197
198
199
 
 
200
201
202
203
204
205
206
207
 
 
 
 
 
208
209
210
211
212
213
214
215
216
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
217
218
219
...
153
154
155
 
156
157
158
 
 
159
160
161
162
163
...
195
196
197
 
 
198
199
200
201
202
 
 
 
 
 
203
204
205
206
207
208
209
210
211
 
 
 
 
 
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
0
@@ -153,11 +153,11 @@ your data gets persisted to files within <code>myapp/datastore/</code>.</p>
0
   <span class="constant">Author</span><span class="punct">.</span><span class="ident">first</span><span class="punct">(</span><span class="symbol">:name</span> <span class="punct">=&gt;</span> <span class="punct">&quot;</span><span class="string">Nick DeMonner</span><span class="punct">&quot;)</span>
0
   
0
   <span class="comment"># brings back first author whose name contains &quot;Nick&quot;</span>
0
- <span class="constant">Author</span><span class="punct">.</span><span class="ident">first</span><span class="punct">(&quot;</span><span class="string">name.include?('Nick')</span><span class="punct">&quot;)</span>
0
+ <span class="constant">Author</span><span class="punct">.</span><span class="ident">first</span><span class="punct">(</span><span class="symbol">:name</span><span class="punct">.</span><span class="ident">includes</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">Nick</span><span class="punct">')</span>
0
   
0
   <span class="comment"># brings back all authors whose email contains &quot;gmail.com&quot;, and who </span>
0
- <span class="comment"># were created before some_date_time</span>
0
- <span class="constant">Author</span><span class="punct">.</span><span class="ident">all</span><span class="punct">(&quot;</span><span class="string">email.include?('gmail.com') &amp;&amp; created_at &lt; some_date_time</span><span class="punct">&quot;)</span>
0
+ <span class="comment"># were created before today</span>
0
+ <span class="constant">Author</span><span class="punct">.</span><span class="ident">all</span><span class="punct">(</span><span class="symbol">:email</span><span class="punct">.</span><span class="ident">includes</span> <span class="punct">=&gt;</span> <span class="punct">&quot;</span><span class="string">gmail.com</span><span class="punct">&quot;,</span> <span class="symbol">:created_at</span><span class="punct">.</span><span class="ident">lt</span> <span class="punct">=&gt;</span> <span class="constant">DateTime</span><span class="punct">.</span><span class="ident">now</span><span class="punct">)</span>
0
 </pre></li>
0
   </ul>
0
 
0
@@ -195,25 +195,59 @@ your data gets persisted to files within <code>myapp/datastore/</code>.</p>
0
   <h3>A Word About Finding Stuff</h3>
0
 
0
 
0
- <p>You&#8217;ll note that Stone uses a string containing ruby expressions to find
0
-your data. Any method works here, just be careful when inserting values.</p>
0
+ <p>Stone uses a series of unique methods (à la DataMapper) to finding objects.
0
+You may use the following methods when searching:</p>
0
 
0
 
0
   <ul>
0
- <li>This&#8230;
0
-<pre class='syntax'>
0
- <span class="constant">Author</span><span class="punct">.</span><span class="ident">first</span><span class="punct">(&quot;</span><span class="string">name == <span class="expr">#{name}</span></span><span class="punct">&quot;)</span>
0
-</pre>
0
-...won&#8217;t work.</li>
0
+ <li><pre class='syntax'>
0
+ <span class="comment"># matches all objects whose &lt;code&gt;field&lt;/code&gt; is greater </span>
0
+ <span class="comment"># than &lt;code&gt;thing&lt;/code&gt;</span>
0
+ <span class="symbol">:field</span><span class="punct">.</span><span class="ident">gt</span> <span class="punct">=&gt;</span> <span class="ident">thing</span>
0
+ </pre></li>
0
   </ul>
0
 
0
 
0
   <ul>
0
- <li>Instead, use this&#8230;
0
-<pre class='syntax'>
0
- <span class="constant">Author</span><span class="punct">.</span><span class="ident">first</span><span class="punct">(&quot;</span><span class="string">name == '<span class="expr">#{name}</span>'</span><span class="punct">&quot;)</span>
0
-</pre>
0
-... and your luck will change.</li>
0
+ <li><pre class='syntax'>
0
+ <span class="comment"># matches objects whose &lt;code&gt;field&lt;/code&gt; is greater than </span>
0
+ <span class="comment"># or equal to &lt;code&gt;thing&lt;/code&gt;</span>
0
+ <span class="symbol">:field</span><span class="punct">.</span><span class="ident">gte</span> <span class="punct">=&gt;</span> <span class="ident">thing</span>
0
+ </pre></li>
0
+ </ul>
0
+
0
+
0
+ <ul>
0
+ <li><pre class='syntax'>
0
+ <span class="comment"># matches all objects whose &lt;code&gt;field&lt;/code&gt; is less </span>
0
+ <span class="comment"># than &lt;code&gt;thing&lt;/code&gt;</span>
0
+ <span class="symbol">:field</span><span class="punct">.</span><span class="ident">lt</span> <span class="punct">=&gt;</span> <span class="ident">thing</span>
0
+ </pre></li>
0
+ </ul>
0
+
0
+
0
+ <ul>
0
+ <li><pre class='syntax'>
0
+ <span class="comment"># matches all objects whose &lt;code&gt;field&lt;/code&gt; is less than</span>
0
+ <span class="comment"># or equal to &lt;code&gt;thing&lt;/code&gt;</span>
0
+ <span class="symbol">:field</span><span class="punct">.</span><span class="ident">lte</span> <span class="punct">=&gt;</span> <span class="ident">thing</span>
0
+ </pre></li>
0
+ </ul>
0
+
0
+
0
+ <ul>
0
+ <li><pre class='syntax'>
0
+ <span class="comment"># matches all objects whose &lt;code&gt;field&lt;/code&gt; contains &lt;code&gt;thing&lt;/code&gt;</span>
0
+ <span class="symbol">:field</span><span class="punct">.</span><span class="ident">includes</span> <span class="punct">=&gt;</span> <span class="ident">thing</span>
0
+ </pre></li>
0
+ </ul>
0
+
0
+
0
+ <ul>
0
+ <li><pre class='syntax'>
0
+ <span class="comment"># matches objects whose &lt;code&gt;field&lt;/code&gt; matches &lt;code&gt;pattern&lt;/code&gt;</span>
0
+ <span class="symbol">:field</span><span class="punct">.</span><span class="ident">matches</span> <span class="punct">=&gt;</span> <span class="ident">pattern</span> <span class="comment"># pattern is any RegEx</span>
0
+ </pre></li>
0
   </ul>
0
 
0
 

Comments

    No one has commented yet.