uri_template 0.4.0 → 0.5.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.
@@ -0,0 +1,64 @@
1
+ # -*- encoding : utf-8 -*-
2
+ # This program is free software: you can redistribute it and/or modify
3
+ # it under the terms of the Affero GNU General Public License as published by
4
+ # the Free Software Foundation, either version 3 of the License, or
5
+ # (at your option) any later version.
6
+ #
7
+ # This program is distributed in the hope that it will be useful,
8
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
9
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
+ # GNU General Public License for more details.
11
+ #
12
+ # You should have received a copy of the GNU General Public License
13
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
14
+ #
15
+ # (c) 2011 - 2012 by Hannes Georg
16
+ #
17
+
18
+ # This should make it possible to do basic analysis independently from the concrete type.
19
+ # Usually the submodules {URITemplate::Literal} and {URITemplate::Expression} are used.
20
+ #
21
+ # @abstract
22
+ module URITemplate::Token
23
+
24
+ EMPTY_ARRAY = [].freeze
25
+
26
+ # The variable names used in this token.
27
+ #
28
+ # @return [Array<String>]
29
+ def variables
30
+ EMPTY_ARRAY
31
+ end
32
+
33
+ # Number of variables in this token
34
+ def size
35
+ variables.size
36
+ end
37
+
38
+ def starts_with_slash?
39
+ false
40
+ end
41
+
42
+ def ends_with_slash?
43
+ false
44
+ end
45
+
46
+ def scheme?
47
+ false
48
+ end
49
+
50
+ def host?
51
+ false
52
+ end
53
+
54
+ # @abstract
55
+ def expand(variables)
56
+ raise "Please implement #expand(variables) on #{self.class.inspect}."
57
+ end
58
+
59
+ # @abstract
60
+ def to_s
61
+ raise "Please implement #to_s on #{self.class.inspect}."
62
+ end
63
+
64
+ end
@@ -24,17 +24,22 @@ module URITemplate
24
24
 
25
25
  include Enumerable
26
26
 
27
- def initialize(regexp)
27
+ def initialize(regexp, options = {})
28
28
  @regexp = regexp
29
+ @rest = options.fetch(:rest){ :yield }
29
30
  end
30
31
 
31
32
  def each(str)
33
+ raise ArgumentError, "RegexpEnumerator#each expects a String, but got #{str.inspect}" unless str.kind_of? String
32
34
  return Enumerator.new(self,:each,str) unless block_given?
33
35
  rest = str
34
36
  loop do
35
37
  m = @regexp.match(rest)
36
38
  if m.nil?
37
- yield rest
39
+ if rest.size > 0
40
+ yield rest if @rest == :yield
41
+ raise "Unable to match #{rest.inspect} against #{@regexp.inspect}" if @rest == :raise
42
+ end
38
43
  break
39
44
  end
40
45
  yield m.pre_match if m.pre_match.size > 0
@@ -42,7 +47,10 @@ module URITemplate
42
47
  if m[0].size == 0
43
48
  # obviously matches empty string, so post_match will equal rest
44
49
  # terminate or this will loop forever
45
- yield m.post_match
50
+ if m.post_match.size > 0
51
+ yield m.post_match if @rest == :yield
52
+ raise "#{@regexp.inspect} matched an empty string. The rest is #{m.post_match.inspect}." if @rest == :raise
53
+ end
46
54
  break
47
55
  end
48
56
  rest = m.post_match
@@ -95,6 +103,19 @@ module URITemplate
95
103
  str.encode(Encoding::UTF_8)
96
104
  end
97
105
 
106
+ # @method force_utf8(str)
107
+ # enforces UTF8 encoding
108
+ #
109
+ # @param str [String]
110
+ # @return String
111
+ # @visibility public
112
+ def force_utf8_encode(str)
113
+ return str if str.encoding == Encoding::UTF_8
114
+ str = str.dup if str.frozen?
115
+ return str.force_encoding(Encoding::UTF_8)
116
+ end
117
+
118
+
98
119
  def to_ascii_fallback(str)
99
120
  str
100
121
  end
@@ -103,16 +124,24 @@ module URITemplate
103
124
  str
104
125
  end
105
126
 
127
+ def force_utf8_fallback(str)
128
+ str
129
+ end
130
+
106
131
  if "".respond_to?(:encode)
107
132
  # @api private
108
133
  send(:alias_method, :to_ascii, :to_ascii_encode)
109
134
  # @api private
110
135
  send(:alias_method, :to_utf8, :to_utf8_encode)
136
+ # @api private
137
+ send(:alias_method, :force_utf8, :force_utf8_encode)
111
138
  else
112
139
  # @api private
113
140
  send(:alias_method, :to_ascii, :to_ascii_fallback)
114
141
  # @api private
115
142
  send(:alias_method, :to_utf8, :to_utf8_fallback)
143
+ # @api private
144
+ send(:alias_method, :force_utf8, :force_utf8_fallback)
116
145
  end
117
146
 
118
147
  public :to_ascii
@@ -150,13 +179,13 @@ module URITemplate
150
179
  end
151
180
 
152
181
  def unescape_url(s)
153
- to_utf8( s.to_s.gsub('+',' ').gsub(PCT){
182
+ force_utf8( to_ascii(s).gsub('+',' ').gsub(PCT){
154
183
  $1.to_i(16).chr
155
184
  } )
156
185
  end
157
186
 
158
187
  def unescape_uri(s)
159
- to_utf8( s.to_s.gsub(PCT){
188
+ force_utf8( to_ascii(s).gsub(PCT){
160
189
  $1.to_i(16).chr
161
190
  })
162
191
  end
@@ -190,11 +219,11 @@ module URITemplate
190
219
  end
191
220
 
192
221
  def unescape_url(s)
193
- super(to_ascii(s))
222
+ force_utf8(super(to_ascii(s)))
194
223
  end
195
224
 
196
225
  def unescape_uri(s)
197
- super(to_ascii(s))
226
+ force_utf8(super(to_ascii(s)))
198
227
  end
199
228
 
200
229
  end
@@ -235,6 +264,14 @@ module URITemplate
235
264
  raise Unconvertable.new(object)
236
265
  end
237
266
 
267
+ # @api private
268
+ # Should we use \u.... or \x.. in regexps?
269
+ def use_unicode?
270
+ return eval('Regexp.compile("\u0020")') =~ " "
271
+ rescue SyntaxError
272
+ false
273
+ end
274
+
238
275
  # Returns true when the given value is an array and it only consists of arrays with two items.
239
276
  # This useful when using a hash is not ideal, since it doesn't allow duplicate keys.
240
277
  # @example
@@ -258,14 +295,14 @@ module URITemplate
258
295
  # URITemplate::Utils.pair_array_to_hash( [ ['a',1],['a',2],['a',3] ] ) #=> {'a'=>3}
259
296
  #
260
297
  # @example Carful vs. Ignorant
261
- # URITemplate::Utils.pair_array_to_hash( [ ['a',1],'foo','bar'], false ) #=> {'a'=>1,'foo'=>'bar'}
262
- # URITemplate::Utils.pair_array_to_hash( [ ['a',1],'foo','bar'], true ) #=> [ ['a',1],'foo','bar']
298
+ # URITemplate::Utils.pair_array_to_hash( [ ['a',1],'foo','bar'], false ) #UNDEFINED!
299
+ # URITemplate::Utils.pair_array_to_hash( [ ['a',1],'foo','bar'], true ) #=> [ ['a',1], 'foo', 'bar']
263
300
  #
264
301
  # @param x the value to convert
265
302
  # @param careful [true,false] wheter to check every array item. Use this when you expect array with subarrays which are not pairs. Setting this to false however improves runtime by ~30% even with comparetivly short arrays.
266
303
  def pair_array_to_hash(x, careful = false )
267
304
  if careful ? pair_array?(x) : (x.kind_of?(Array) and ( x.empty? or x.first.kind_of?(Array) ) )
268
- return Hash[ *x.flatten(1) ]
305
+ return Hash[ x ]
269
306
  else
270
307
  return x
271
308
  end
data/lib/uri_template.rb CHANGED
@@ -18,87 +18,27 @@
18
18
  # A base module for all implementations of a uri template.
19
19
  module URITemplate
20
20
 
21
- # @private
22
- # Should we use \u.... or \x.. in regexps?
23
- SUPPORTS_UNICODE_CHARS = begin
24
- if "string".respond_to? :encoding
25
- rx = eval('Regexp.compile("\u0020")')
26
- !!(rx =~ " ")
27
- else
28
- rx = eval('/\u0020/')
29
- !!(rx =~ " ")
30
- end
31
- rescue SyntaxError
32
- false
33
- end
34
-
35
- # This should make it possible to do basic analysis independently from the concrete type.
36
- module Token
37
-
38
- def size
39
- variables.size
40
- end
41
-
42
- end
43
-
44
- # A module which all literal tokens should include.
45
- module Literal
46
-
47
- include Token
48
-
49
- attr_reader :string
50
-
51
- def literal?
52
- true
53
- end
54
-
55
- def expression?
56
- false
57
- end
58
-
59
- def variables
60
- []
61
- end
62
-
63
- def size
64
- 0
65
- end
66
-
67
- def expand(*_)
68
- return string
69
- end
70
-
71
- end
72
-
73
- # A module which all non-literal tokens should include.
74
- module Expression
75
-
76
- include Token
77
-
78
- attr_reader :variables
79
-
80
- def literal?
81
- false
82
- end
21
+ # @api private
22
+ SCHEME_REGEX = /\A[a-z]+:/i.freeze
83
23
 
84
- def expression?
85
- true
86
- end
24
+ # @api private
25
+ HOST_REGEX = /\A(?:[a-z]+:)?\/\/[^\/]+/i.freeze
87
26
 
88
- end
27
+ # @api private
28
+ URI_SPLIT = /\A(?:([a-z]+):)?(?:\/\/)?([^\/]+)?/i.freeze
89
29
 
90
30
  autoload :Utils, 'uri_template/utils'
91
- autoload :Draft7, 'uri_template/draft7'
31
+ autoload :Token, 'uri_template/token'
32
+ autoload :Literal, 'uri_template/literal'
33
+ autoload :Expression, 'uri_template/expression'
92
34
  autoload :RFC6570, 'uri_template/rfc6570'
93
35
  autoload :Colon, 'uri_template/colon'
94
36
 
95
37
  # A hash with all available implementations.
96
- # Currently the only implementation is :draft7. But there also aliases :default and :latest available. This should make it possible to add newer specs later.
97
38
  # @see resolve_class
98
39
  VERSIONS = {
99
- :draft7 => :Draft7,
100
40
  :rfc6570 => :RFC6570,
101
- :default => :Draft7,
41
+ :default => :RFC6570,
102
42
  :colon => :Colon,
103
43
  :latest => :RFC6570
104
44
  }
@@ -107,10 +47,11 @@ module URITemplate
107
47
  # Extracts all symbols from args and looks up the first in {VERSIONS}.
108
48
  #
109
49
  # @return Array an array of the class to use and the unused parameters.
50
+ #
110
51
  # @example
111
- # URITemplate.resolve_class() #=> [ URITemplate::Draft7, [] ]
112
- # URITemplate.resolve_class(:draft7) #=> [ URITemplate::Draft7, [] ]
113
- # URITemplate.resolve_class("template",:draft7) #=> [ URITemplate::Draft7, ["template"] ]
52
+ # URITemplate.resolve_class() #=> [ URITemplate::RFC6570, [] ]
53
+ # URITemplate.resolve_class(:colon) #=> [ URITemplate::Colon, [] ]
54
+ # URITemplate.resolve_class("template",:rfc6570) #=> [ URITemplate::RFC6570, ["template"] ]
114
55
  #
115
56
  # @raise ArgumentError when no class was found.
116
57
  #
@@ -130,7 +71,7 @@ module URITemplate
130
71
  # tpl.expand('x'=>'y') #=> 'y'
131
72
  #
132
73
  # @example
133
- # tpl = URITemplate.new(:draft7,'{x}') # a new template using the draft7 implementation
74
+ # tpl = URITemplate.new(:colon,'/:x') # a new template using the colon implementation
134
75
  #
135
76
  def self.new(*args)
136
77
  klass, rest = resolve_class(*args)
@@ -167,8 +108,10 @@ module URITemplate
167
108
  # Returns an array with two {URITemplate}s and two booleans indicating which of the two were converted or raises an ArgumentError.
168
109
  #
169
110
  # @example
170
- # URITemplate.coerce( URITemplate.new(:draft7,'{x}'), '{y}' ) #=> [URITemplate.new(:draft7,'{x}'), URITemplate.new(:draft7,'{y}'), false, true]
171
- # URITemplate.coerce( '{y}', URITemplate.new(:draft7,'{x}') ) #=> [URITemplate.new(:draft7,'{y}'), URITemplate.new(:draft7,'{x}'), true, false]
111
+ # URITemplate.coerce( URITemplate.new(:rfc6570,'{x}'), '{y}' ) #=> [URITemplate.new(:rfc6570,'{x}'), URITemplate.new(:rfc6570,'{y}'), false, true]
112
+ # URITemplate.coerce( '{y}', URITemplate.new(:rfc6570,'{x}') ) #=> [URITemplate.new(:rfc6570,'{y}'), URITemplate.new(:rfc6570,'{x}'), true, false]
113
+ #
114
+ # @return [Tuple<URITemplate,URITemplate,Bool,Bool>]
172
115
  def self.coerce(a,b)
173
116
  if a.kind_of? URITemplate
174
117
  if a.class == b.class
@@ -210,6 +153,19 @@ module URITemplate
210
153
  a.send(method,b,*args)
211
154
  end
212
155
 
156
+ def self.coerce_first_arg(meth)
157
+ alias_method( (meth.to_s + '_without_coercion').to_sym , meth )
158
+ class_eval(<<-RUBY)
159
+ def #{meth}(other, *args, &block)
160
+ this, other, this_converted, _ = URITemplate.coerce( self, other )
161
+ if this_converted
162
+ return this.#{meth}(other,*args, &block)
163
+ end
164
+ return #{meth}_without_coercion(other,*args, &block)
165
+ end
166
+ RUBY
167
+ end
168
+
213
169
  # A base class for all errors which will be raised upon invalid syntax.
214
170
  module Invalid
215
171
  end
@@ -226,7 +182,9 @@ module URITemplate
226
182
  # strings in order to support the Ruby 1.9 hash syntax.
227
183
  #
228
184
  # @raise {Unconvertable} if a variable could not be converted to a string.
229
- # @param variables Hash
185
+ # @raise {InvalidValue} if a value is not suiteable for a certain variable ( e.g. a string when a list is expected ).
186
+ #
187
+ # @param variables [#map]
230
188
  # @return String
231
189
  def expand(variables = {})
232
190
  raise ArgumentError, "Expected something that returns to :map, but got: #{variables.inspect}" unless variables.respond_to? :map
@@ -241,12 +199,16 @@ module URITemplate
241
199
 
242
200
  # @abstract
243
201
  # Returns the type of this template. The type is a symbol which can be used in {.resolve_class} to resolve the type of this template.
202
+ #
203
+ # @return [Symbol]
244
204
  def type
245
205
  raise "Please implement #type on #{self.class.inspect}."
246
206
  end
247
207
 
248
208
  # @abstract
249
209
  # Returns the tokens of this templates. Tokens should include either {Literal} or {Expression}.
210
+ #
211
+ # @return [Array<URITemplate::Token>]
250
212
  def tokens
251
213
  raise "Please implement #tokens on #{self.class.inspect}."
252
214
  end
@@ -256,9 +218,9 @@ module URITemplate
256
218
  # URITemplate.new('{foo}{bar}{baz}').variables #=> ['foo','bar','baz']
257
219
  # URITemplate.new('{a}{c}{a}{b}').variables #=> ['a','c','b']
258
220
  #
259
- # @return Array
221
+ # @return [Array<String>]
260
222
  def variables
261
- @variables ||= tokens.select(&:expression?).map(&:variables).flatten.uniq
223
+ @variables ||= tokens.map(&:variables).flatten.uniq.freeze
262
224
  end
263
225
 
264
226
  # Returns the number of static characters in this template.
@@ -275,28 +237,167 @@ module URITemplate
275
237
  @static_characters ||= tokens.select(&:literal?).map{|t| t.string.size }.inject(0,:+)
276
238
  end
277
239
 
278
- # Returns whether this uri-template is absolute.
279
- # This is detected by checking for "://".
240
+ # Returns whether this uri-template includes a host name
241
+ #
242
+ # This method is usefull to check wheter this template will generate
243
+ # or match a uri with a host.
244
+ #
245
+ # @see #scheme?
280
246
  #
281
- def absolute?
282
- return @absolute unless @absolute.nil?
247
+ # @example
248
+ # URITemplate.new('/foo').host? #=> false
249
+ # URITemplate.new('//example.com/foo').host? #=> true
250
+ # URITemplate.new('//{host}/foo').host? #=> true
251
+ # URITemplate.new('http://example.com/foo').host? #=> true
252
+ # URITemplate.new('{scheme}://example.com/foo').host? #=> true
253
+ #
254
+ def host?
255
+ return scheme_and_host[1]
256
+ end
257
+
258
+ # Returns whether this uri-template includes a scheme
259
+ #
260
+ # This method is usefull to check wheter this template will generate
261
+ # or match a uri with a scheme.
262
+ #
263
+ # @see #host?
264
+ #
265
+ # @example
266
+ # URITemplate.new('/foo').scheme? #=> false
267
+ # URITemplate.new('//example.com/foo').scheme? #=> false
268
+ # URITemplate.new('http://example.com/foo').scheme? #=> true
269
+ # URITemplate.new('{scheme}://example.com/foo').scheme? #=> true
270
+ #
271
+ def scheme?
272
+ return scheme_and_host[0]
273
+ end
274
+
275
+ # Returns the pattern for this template.
276
+ #
277
+ # @return String
278
+ def pattern
279
+ @pattern ||= tokens.map(&:to_s).join
280
+ end
281
+
282
+ alias to_s pattern
283
+
284
+ # Compares two template patterns.
285
+ def eq(other)
286
+ return self.pattern == other.pattern
287
+ end
288
+
289
+ coerce_first_arg :eq
290
+
291
+ alias == eq
292
+
293
+ # Tries to concatenate two templates, as if they were path segments.
294
+ # Removes double slashes or insert one if they are missing.
295
+ #
296
+ # @example
297
+ # tpl = URITemplate::RFC6570.new('/xy/')
298
+ # (tpl / '/z/' ).pattern #=> '/xy/z/'
299
+ # (tpl / 'z/' ).pattern #=> '/xy/z/'
300
+ # (tpl / '{/z}' ).pattern #=> '/xy{/z}'
301
+ # (tpl / 'a' / 'b' ).pattern #=> '/xy/a/b'
302
+ #
303
+ # @param other [URITemplate, String, ...]
304
+ # @return URITemplate
305
+ def path_concat(other)
306
+ if other.host? or other.scheme?
307
+ raise ArgumentError, "Expected to receive a relative template but got an absoulte one: #{other.inspect}. If you think this is a bug, please report it."
308
+ end
309
+
310
+ return self if other.tokens.none?
311
+ return other if self.tokens.none?
312
+
313
+ tail = self.tokens.last
314
+ head = other.tokens.first
315
+
316
+ if tail.ends_with_slash?
317
+ if head.starts_with_slash?
318
+ return self.class.new( remove_double_slash(self.tokens, other.tokens) )
319
+ end
320
+ elsif !head.starts_with_slash?
321
+ return self.class.new( (self.tokens + ['/'] + other.tokens).join)
322
+ end
323
+ return self.class.new( (self.tokens + other.tokens).join )
324
+ end
325
+
326
+ coerce_first_arg :path_concat
327
+
328
+ alias / path_concat
329
+
330
+ # Concatenate two template with conversion.
331
+ #
332
+ # @example
333
+ # tpl = URITemplate::RFC6570.new('foo')
334
+ # (tpl + '{bar}' ).pattern #=> 'foo{bar}'
335
+ #
336
+ # @param other [URITemplate, String, ...]
337
+ # @return URITemplate
338
+ def concat(other)
339
+ if other.host? or other.scheme?
340
+ raise ArgumentError, "Expected to receive a relative template but got an absoulte one: #{other.inspect}. If you think this is a bug, please report it."
341
+ end
342
+
343
+ return self if other.tokens.none?
344
+ return other if self.tokens.none?
345
+ return self.class.new( self.to_s + other.to_s )
346
+ end
347
+
348
+ coerce_first_arg :concat
349
+
350
+ alias + concat
351
+ alias >> concat
352
+
353
+ # @api private
354
+ def remove_double_slash( first_tokens, second_tokens )
355
+ if first_tokens.last.literal?
356
+ return first_tokens[0..-2] + [ first_tokens.last.to_s[0..-2] ] + second_tokens
357
+ elsif second_tokens.first.literal?
358
+ return first_tokens + [ second_tokens.first.to_s[1..-1] ] + second_tokens[1..-1]
359
+ else
360
+ raise ArgumentError, "Cannot remove double slashes from #{first_tokens.inspect} and #{second_tokens.inspect}."
361
+ end
362
+ end
363
+
364
+ private :remove_double_slash
365
+
366
+ # @api private
367
+ def scheme_and_host
368
+ return @scheme_and_host if @scheme_and_host
283
369
  read_chars = ""
370
+ @scheme_and_host = [false,false]
284
371
  tokens.each do |token|
285
372
  if token.expression?
286
373
  read_chars << "x"
374
+ if token.scheme?
375
+ read_chars << ':'
376
+ end
377
+ if token.host?
378
+ read_chars << '//'
379
+ end
380
+ read_chars << "x"
287
381
  elsif token.literal?
288
382
  read_chars << token.string
289
383
  end
290
- if read_chars =~ /^[a-z]+:\/\//i
291
- return @absolute = true
384
+ if read_chars =~ SCHEME_REGEX
385
+ @scheme_and_host = [true, true]
386
+ break
387
+ elsif read_chars =~ HOST_REGEX
388
+ @scheme_and_host[1] = true
389
+ break
292
390
  elsif read_chars =~ /(^|[^:\/])\/(?!\/)/
293
- return @absolute = false
391
+ break
294
392
  end
295
393
  end
296
-
297
- return @absolute = false
394
+ return @scheme_and_host
298
395
  end
299
396
 
397
+ private :scheme_and_host
398
+
399
+ alias absolute? host?
400
+
300
401
  # Opposite of {#absolute?}
301
402
  def relative?
302
403
  !absolute?
data/uri_template.gemspec CHANGED
@@ -1,16 +1,16 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'uri_template'
3
- s.version = '0.4.0'
4
- s.date = '2012-07-06'
3
+ s.version = '0.5.0'
4
+ s.date = Time.now.strftime('%Y-%m-%d')
5
5
  s.authors = ["HannesG"]
6
6
  s.email = %q{hannes.georg@googlemail.com}
7
7
  s.summary = 'A templating system for URIs.'
8
8
  s.homepage = 'http://github.com/hannesg/uri_template'
9
- s.description = 'A templating system for URIs, which implements RFC 6570: http://tools.ietf.org/html/rfc6570. An implementation of an older version of that spec is known as addressable. This gem however is intended to be extended when newer specs evolve. For now only draft 7 and a simple colon based format are supported.'
9
+ s.description = 'A templating system for URIs, which implements RFC6570 and Colon based URITemplates in a clean and straight forward way.'
10
10
 
11
11
  s.require_paths = ['lib']
12
12
 
13
- s.files = Dir.glob('lib/**/**/*.rb') + ['uri_template.gemspec', 'README', 'CHANGELOG']
13
+ s.files = Dir.glob('lib/**/**/*.rb') + ['uri_template.gemspec', 'README.md', 'CHANGELOG.md']
14
14
 
15
15
  s.add_development_dependency 'multi_json'
16
16
  s.add_development_dependency 'rspec'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: uri_template
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-07-06 00:00:00.000000000 Z
12
+ date: 2012-09-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: multi_json
@@ -91,23 +91,27 @@ dependencies:
91
91
  - - ! '>='
92
92
  - !ruby/object:Gem::Version
93
93
  version: '0'
94
- description: ! 'A templating system for URIs, which implements RFC 6570: http://tools.ietf.org/html/rfc6570.
95
- An implementation of an older version of that spec is known as addressable. This
96
- gem however is intended to be extended when newer specs evolve. For now only draft
97
- 7 and a simple colon based format are supported.'
94
+ description: A templating system for URIs, which implements RFC6570 and Colon based
95
+ URITemplates in a clean and straight forward way.
98
96
  email: hannes.georg@googlemail.com
99
97
  executables: []
100
98
  extensions: []
101
99
  extra_rdoc_files: []
102
100
  files:
103
- - lib/uri_template/utils.rb
101
+ - lib/uri_template/rfc6570/expression.rb
102
+ - lib/uri_template/rfc6570/regex_builder.rb
103
+ - lib/uri_template/rfc6570/expression/named.rb
104
+ - lib/uri_template/rfc6570/expression/unnamed.rb
104
105
  - lib/uri_template/colon.rb
106
+ - lib/uri_template/literal.rb
107
+ - lib/uri_template/expression.rb
108
+ - lib/uri_template/utils.rb
105
109
  - lib/uri_template/rfc6570.rb
106
- - lib/uri_template/draft7.rb
110
+ - lib/uri_template/token.rb
107
111
  - lib/uri_template.rb
108
112
  - uri_template.gemspec
109
- - README
110
- - CHANGELOG
113
+ - README.md
114
+ - CHANGELOG.md
111
115
  homepage: http://github.com/hannesg/uri_template
112
116
  licenses: []
113
117
  post_install_message:
data/CHANGELOG DELETED
@@ -1,46 +0,0 @@
1
- # 0.4.0 - 06.07.2012
2
- + expand now accepts symbols as keys
3
- + expand now accepts arrays of pairs
4
- * fixed some testing bugs
5
-
6
- # 0.3.0 - 24.05.2012
7
- + Implemented the final version. Default implementation is now RFC 6570
8
- * BUGFIX: variables with terminal dots were allowed
9
- * BUGFIX: lists of commas were parsed incorrectly
10
-
11
- # 0.2.1 - 30.12.2011
12
- * Compatibility: Works now with MRI 1.8.7 and REE
13
-
14
- # 0.2.0 - 03.12.2011
15
- * Reworked the escaping mechanism
16
- + escape_utils can now be used to boost escape/unescape performance
17
-
18
- # 0.1.4 - 19.11.2011
19
- * Compatiblity: Works now with MRI 1.9.3, Rubinius and JRuby
20
- * Various (significant!) performance improvements
21
-
22
- # 0.1.3 - 15.11.2011
23
- * BUGFIX: Draft7./ now concatenates literals correctly
24
- * BUGFIX: Draft7.tokens is now public
25
-
26
- # 0.1.2 - 10.11.2011
27
- + added a new template-type: Colon
28
- this should allow (some day) to rails-like routing tables
29
- + made the tokens-method mandatory and added two interfaces for tokens.
30
- this allows cross-type features like variable anaylisis
31
-
32
- # 0.1.1 - 4.11.2011
33
- + added a bunch of useful helper methods
34
-
35
- # 0.1.0 - 2.11.2011
36
- - Removed Sections. They made too many headaches.
37
- + Made draft7 template concatenateable. This should replace sections.
38
- * BUGFIX: multiline uris were matched
39
- * BUGFIX: variablenames were decoded when this was not appreciated
40
-
41
- # 0.0.2 - 1.11.2011
42
- * BUGFIX: Concatenating empty sections no more leads to catch-all templates, when an emtpy template was appreciated.
43
- + The extracted variables now contains the keys :suffix and :prefix if the match didn't consume the whole uri.
44
-
45
- # 0.0.1 - 30.10.2011
46
- Initial version