addressive 0.1.0.alpha → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'addressive'
3
- s.version = '0.1.0.alpha'
4
- s.date = '2011-11-23'
3
+ s.version = '0.1.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 system which should help bringing different Rack applications together.'
@@ -12,8 +12,8 @@ Gem::Specification.new do |s|
12
12
 
13
13
  s.files = Dir.glob('lib/**/**/*.rb') + ['addressive.gemspec']
14
14
 
15
- s.add_dependency 'uri_template', '~> 0.1.4'
16
-
15
+ s.add_dependency 'uri_template', '>= 0.5.1'
16
+
17
17
  s.add_development_dependency 'simplecov'
18
18
  s.add_development_dependency 'rspec'
19
19
  s.add_development_dependency 'yard'
@@ -15,10 +15,11 @@
15
15
  # (c) 2011 by Hannes Georg
16
16
  #
17
17
 
18
- $LOAD_PATH << File.expand_path('../../uri_template7/lib/',File.dirname(__FILE__))
19
- require File.expand_path('../../uri_template7/lib/uri_template',File.dirname(__FILE__))
18
+ require 'uri_template'
20
19
  require 'ostruct'
21
20
 
21
+ require File.expand_path('addressive/backports', File.dirname(__FILE__))
22
+
22
23
  # Addressive is library which should make it possible for different rack-applications to live together on the same server.
23
24
  # To accomplish this, addressive supplies you with:
24
25
  # - A model for a graph in which each node is one application.
@@ -37,6 +38,8 @@ module Addressive
37
38
 
38
39
  ADDRESSIVE_ENV_KEY = 'addressive'.freeze
39
40
 
41
+ DEFAULT_ACTION = :default
42
+
40
43
  class Error < StandardError
41
44
 
42
45
  end
@@ -48,7 +51,14 @@ module Addressive
48
51
 
49
52
  def initialize(builder)
50
53
  @builder = builder
51
- super("No URISpec found for #{builder.inspect}. Only got: #{builder.node.uri_specs.keys.join(', ')}")
54
+ super([
55
+ "No URISpec found for #{builder.inspect}. Only got:",
56
+ *builder.node.uri_specs.map{|key,specs|
57
+ ["\t#{key.inspect} :",
58
+ *specs.select{|spec| spec.valid? and spec.emit != false }.map{|spec| "\t\t#{spec.template.inspect}" }
59
+ ].join("\n")
60
+ }
61
+ ].join("\n"))
52
62
  end
53
63
 
54
64
  end
@@ -83,6 +93,12 @@ module Addressive
83
93
  #
84
94
  # @example
85
95
  # node = Addressive::Node.new
96
+ # node.uri_spec << Addressive::URISpec.new( URITemplate.new('/an/uri/with/{var}') )
97
+ # bldr = Addressive::URIBuilder.new(node)
98
+ # bldr.uri('var'=>'VAR!').to_s #=> '/an/uri/with/VAR%21'
99
+ #
100
+ # @example
101
+ # node = Addressive::Node.new
86
102
  # node.uri_spec(:show) << Addressive::URISpec.new( URITemplate.new('/an/uri/with/{var}') )
87
103
  # bldr = Addressive::URIBuilder.new(node)
88
104
  # bldr.uri(:show, 'var'=>'VAR!').to_s #=> '/an/uri/with/VAR%21'
@@ -90,14 +106,20 @@ module Addressive
90
106
  # @return URIBuilder
91
107
  def uri(*args)
92
108
  return uri_builder_delegate.uri(*args) if uri_builder_delegate
93
- hashes, path = args.collect_concat{|a| a.respond_to?(:to_addressive) ? a.to_addressive : [a] }.partition{|x| x.kind_of? Hash}
109
+ argz = args.collect_concat{|a| a.respond_to?(:to_addressive) ? a.to_addressive : [a] }
110
+ hashes, path = argz.partition{|x| x.kind_of? Hash}
94
111
  node = self.node
95
112
  action = self.action
96
113
  if path.size >= 1
97
114
  node = node.traverse(*path[0..-2])
98
- action = path.last
115
+ if node.edge? path.last
116
+ node = node.traverse(path.last)
117
+ action = DEFAULT_ACTION
118
+ else
119
+ action = path.last
120
+ end
99
121
  end
100
- derive_uri_builder(action, hashes.inject(self.variables || {}, &:merge), node)
122
+ derive_uri_builder(action, hashes.map{|hsh| Hash[hsh.map{|k,v| [k.to_s,v] }] }.inject(&:merge!), node)
101
123
  end
102
124
 
103
125
  private
@@ -116,7 +138,7 @@ module Addressive
116
138
  attr_reader :origin,:node,:variables,:action
117
139
 
118
140
  # @private
119
- def initialize(origin, action=:default, vars={}, node=origin)
141
+ def initialize(origin, action=DEFAULT_ACTION, vars={}, node=origin)
120
142
  @origin = origin
121
143
  @node = node
122
144
  @action = action
@@ -153,7 +175,7 @@ module Addressive
153
175
  def uri_builder_specs
154
176
  return @specs ||= begin
155
177
  varnames = (self.variables || {} ).keys
156
- self.node.uri_spec(self.action).select{|s| s.valid? and (s.variables - varnames).none? }.sort_by{|s| (varnames - s.variables).size }
178
+ self.node.uri_spec(self.action).select{|s| s.valid? and s.emit != false and (s.variables - varnames).none? }.sort_by{|s| (varnames - s.variables).size }
157
179
  end
158
180
  end
159
181
  end
@@ -170,14 +192,32 @@ module Addressive
170
192
  def variables
171
193
  @template ? @template.variables : []
172
194
  end
173
-
195
+
196
+ def prefix!(with, op=:/)
197
+ return self unless valid?
198
+ @template = URITemplate.apply(with, op, @template )
199
+ return self
200
+ end
201
+
202
+ def set_unless(key, value)
203
+ send("#{key}=".to_sym, send(key) || value)
204
+ end
205
+
174
206
  def initialize(template, *args)
175
207
  @template = template
176
208
  super(*args)
177
209
  end
210
+
211
+ def hash
212
+ @template.hash ^ super
213
+ end
214
+
215
+ def ==(other)
216
+ @template == other.template && super
217
+ end
178
218
 
179
219
  def inspect
180
- ['#<',self.class.name,': ',template.inspect,*@table.map{|k,v| " #{k}=#{v.inspect}"},'>'].join
220
+ ( ['#<',self.class.name,': ',template.inspect ] + @table.map{|k,v| " #{k}=#{v.inspect}"} + ['>'] ).join
181
221
  end
182
222
 
183
223
  end
@@ -190,11 +230,11 @@ module Addressive
190
230
  def converter(defaults = self.all_defaults)
191
231
  lambda{|spec|
192
232
  if spec.kind_of? URISpec
193
- [ normalize( spec.dup, defaults ) ]
233
+ normalize( spec.dup, defaults )
194
234
  elsif spec.kind_of? URITemplate
195
- [ normalize( URISpec.new( spec ) , defaults) ]
235
+ normalize( URISpec.new( spec ) , defaults)
196
236
  elsif spec.kind_of? String
197
- [ normalize( URISpec.new( URITemplate.new(spec) ) , defaults) ]
237
+ normalize( URISpec.new( URITemplate.new(spec) ) , defaults)
198
238
  elsif spec.kind_of? Array
199
239
  spec.map(&self.converter(defaults))
200
240
  elsif spec.kind_of? Hash
@@ -209,13 +249,11 @@ module Addressive
209
249
  protected :converter
210
250
 
211
251
  def normalize( spec, defaults = self.all_defaults )
212
- if defaults.key? :app
213
- spec.app = defaults[:app]
252
+ defaults.each do |key,value|
253
+ spec.set_unless( key, value)
214
254
  end
215
- unless spec.template.absolute?
216
- if defaults[:prefix]
217
- spec.template = URITemplate.apply( defaults[:prefix] , :/ , spec.template)
218
- end
255
+ if defaults[:rewrite]
256
+ spec = Array( defaults[:rewrite].call(spec) )
219
257
  end
220
258
  return spec
221
259
  end
@@ -223,8 +261,9 @@ module Addressive
223
261
  attr_reader :defaults
224
262
 
225
263
  def initialize(defaults, parent = nil)
226
- @defaults = defaults
264
+ @defaults = defaults.dup
227
265
  @parent = parent
266
+ validate!
228
267
  end
229
268
 
230
269
  def convert(*args)
@@ -236,10 +275,18 @@ module Addressive
236
275
  def all_defaults
237
276
  @parent ? @parent.all_defaults.merge(defaults) : defaults
238
277
  end
239
-
278
+
240
279
  def derive(nu_defaults)
241
280
  self.class.new(nu_defaults, self)
242
281
  end
282
+
283
+ private
284
+
285
+ def validate!(defaults = self.all_defaults)
286
+ if defaults[:rewrite] && !defaults[:rewrite].respond_to?(:call)
287
+ raise ArgumentError.new("Expected option :rewrite to respond to :call ( got: #{defaults[:rewrite].inspect} ).")
288
+ end
289
+ end
243
290
 
244
291
  end
245
292
 
@@ -314,8 +361,17 @@ module Addressive
314
361
  raise NoEdgeFound.new(self, args.first)
315
362
  end
316
363
  end
317
-
318
- def uri_spec(name)
364
+
365
+ def edge?(name)
366
+ return edges.key?(name)
367
+ end
368
+
369
+ def uri_spec?(name = DEFAULT_ACTION)
370
+ @uri_specs.key? name
371
+ end
372
+
373
+
374
+ def uri_spec(name = DEFAULT_ACTION)
319
375
  @uri_specs[name]
320
376
  end
321
377
 
@@ -341,14 +397,17 @@ module Addressive
341
397
  # @example
342
398
  # node = Addressive.node do
343
399
  # edge( :another ) do
344
- # default :prefix, '/another'
345
- # uri :default ,'/'
400
+ # default :rewrite, lambda{|spec|
401
+ # spec.template = URITemplate.new('/another') / spec.template
402
+ # spec
403
+ # }
404
+ # uri '/'
346
405
  # end
347
- # uri :default ,'/'
406
+ # uri '/'
348
407
  # end
349
408
  #
350
409
  # node.uri.to_s #=> '/'
351
- # node.uri(:another,:default).to_s #=> '/another/'
410
+ # node.uri(:another).to_s #=> '/another/'
352
411
  #
353
412
  # @param name [Symbol] a name for this node
354
413
  # @yield {NodeBuilder}
@@ -12,10 +12,17 @@
12
12
  # You should have received a copy of the GNU General Public License
13
13
  # along with this program. If not, see <http://www.gnu.org/licenses/>.
14
14
  #
15
- # (c) 2011 by Hannes Georg
15
+ # (c) 2012 by Hannes Georg
16
16
  #
17
17
 
18
- module Addressive
19
-
20
- # A module to visualize
21
- module Graphviz
18
+ unless [].respond_to? :collect_concat
19
+ Enumerable.class_eval do
20
+ def collect_concat
21
+ result = []
22
+ each do |e|
23
+ result += yield e
24
+ end
25
+ return result
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,8 @@
1
+ module Addressive
2
+
3
+ class Builder < Rack::Builder
4
+
5
+
6
+ end
7
+
8
+ end
@@ -12,7 +12,7 @@
12
12
  # You should have received a copy of the GNU General Public License
13
13
  # along with this program. If not, see <http://www.gnu.org/licenses/>.
14
14
  #
15
- # (c) 2011 by Hannes Georg
15
+ # (c) 2011 - 2012 by Hannes Georg
16
16
  #
17
17
 
18
18
  module Addressive
@@ -21,27 +21,43 @@ module Addressive
21
21
  # Graphs are only used to generate nodes and their relations.
22
22
  # They will be GCed when they are done.
23
23
  class Graph
24
-
24
+
25
+ require 'addressive/graph/builds_uris'
26
+ require 'addressive/graph/middleware'
27
+
25
28
  # An app builder is used to add uris for a certain app to a node.
26
29
  class AppBuilder
27
-
30
+
31
+ include BuildsURIs
32
+
33
+ attr :spec_factory, :node, :defaults
34
+
28
35
  # @private
29
36
  def initialize(node, factory, app)
30
37
  @node = node
31
38
  @app = app
32
39
  @spec_factory = factory
40
+ @callback = nil
41
+ @defaults = {}
42
+ @middleware = Middleware::End
33
43
  end
34
-
35
- # Sets a default value for an option.
36
- def default(name, value)
37
- @spec_factory.defaults[name] = value
44
+
45
+ def spec_factory_with_options(overrides)
46
+ if overrides.key? :app
47
+ cb = @middleware.unwind(overrides[:app])
48
+ else
49
+ cb = (@callback ||= @middleware.unwind(@app))
50
+ end
51
+ super( {:callback => cb}.merge(overrides) )
38
52
  end
39
-
40
- # Adds one or more uri specs for a given name. It uses the current app as the default app for all specs.
41
- def uri(name,*args)
42
- specs = @node.uri_spec(name)
43
- specs << @spec_factory.convert(*args)
44
- return specs
53
+
54
+ def use(middleware, *args, &block)
55
+ if middleware.respond_to? :call
56
+ @middleware <<= proc{|app| proc{|env| middleware.call(env, app, *args, &block) } }
57
+ else
58
+ @middleware <<= proc{|app| middleware.new(app,*args, &block) }
59
+ end
60
+ @callback = nil
45
61
  end
46
62
 
47
63
  end
@@ -49,14 +65,17 @@ module Addressive
49
65
  # A NodeBuilder is used to build a Node inside a Graph.
50
66
  # This class should not be generated directly, it's created for you by {Builder#node}.
51
67
  class NodeBuilder
52
-
53
- attr_reader :node
54
-
68
+
69
+ include BuildsURIs
70
+
71
+ attr :spec_factory, :node, :defaults
72
+
55
73
  # @private
56
74
  def initialize(network,node)
57
75
  @network = network
58
76
  @node = node
59
- @spec_factory = network.spec_factory.derive({})
77
+ @defaults = {}
78
+ @spec_factory = network.spec_factory
60
79
  end
61
80
 
62
81
  # Adds an edge from the current node to a node with the given name.
@@ -90,17 +109,6 @@ module Addressive
90
109
 
91
110
  alias ref edge
92
111
 
93
- # Sets a default value for an option.
94
- def default(name, value)
95
- @spec_factory.defaults[name] = value
96
- end
97
-
98
- # Adds one or more uri specs for a given name.
99
- def uri(name,*args)
100
- @node.uri_spec(name) << @spec_factory.convert(args)
101
- return @node.uri_spec(name)
102
- end
103
-
104
112
  # Adds an rack-application to this node.
105
113
  #
106
114
  # @example
@@ -142,7 +150,9 @@ module Addressive
142
150
  end
143
151
  return builder
144
152
  end
145
-
153
+
154
+ alias run app
155
+
146
156
  end
147
157
 
148
158
  # A Builder is used to construct a network.
@@ -0,0 +1,47 @@
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
+ module Addressive; module Graph::BuildsURIs
19
+
20
+ # Adds one or more uri specs for a given name.
21
+ def uri(name_or_uri,*args)
22
+ if name_or_uri.kind_of? Symbol
23
+ name = name_or_uri
24
+ else
25
+ name = DEFAULT_ACTION
26
+ args.unshift( name_or_uri )
27
+ end
28
+ specs = node.uri_spec(name)
29
+ options = {}
30
+ if args.size > 1 && args.last.kind_of?(Hash)
31
+ options = args.pop
32
+ end
33
+ specs << spec_factory_with_options(options).convert(*args)
34
+ return specs
35
+ end
36
+
37
+
38
+ def spec_factory_with_options(overrides={})
39
+ return spec_factory.derive( defaults.merge(overrides) )
40
+ end
41
+
42
+ # Sets a default value for an option.
43
+ def default(name, value)
44
+ defaults[name] = value
45
+ end
46
+
47
+ end; end
@@ -0,0 +1,38 @@
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
+ module Addressive; class Graph::Middleware
19
+
20
+ def initialize(proc, rest = End)
21
+ @proc, @rest = proc, rest
22
+ end
23
+
24
+ def unwind(app)
25
+ @proc.call( @rest.unwind(app) )
26
+ end
27
+
28
+ def <<(proc)
29
+ self.class.new(proc, self)
30
+ end
31
+
32
+ End = self.new(nil,nil)
33
+
34
+ def End.unwind(app)
35
+ return app
36
+ end
37
+
38
+ end ; end
File without changes
@@ -17,6 +17,7 @@
17
17
 
18
18
  require 'rack/request'
19
19
  require 'thread'
20
+ require 'enumerator'
20
21
 
21
22
  module Addressive
22
23
 
@@ -54,7 +55,7 @@ module Addressive
54
55
  @routes = []
55
56
  end
56
57
 
57
- def preroute(path, uri)
58
+ def preroute(*_)
58
59
  return self
59
60
  end
60
61
 
@@ -72,21 +73,25 @@ module Addressive
72
73
 
73
74
  def done!
74
75
  # compile *gnihihi*
75
- code = ['def each(path,uri); routes = Enumerator.new(@routes);',
76
- *@routes.each_with_index.map{|r,i|
76
+ code = (
77
+ ['def each(proto,host,path)',
78
+ 'routes = @routes.to_enum',
79
+ 'host_path = host + path; proto_host_path = proto + host + path'] +
80
+ @routes.each_with_index.map{|r,i|
77
81
  "route = routes.next
78
- vars = route.template.extract(#{r.template.absolute? ? 'uri' : 'path'})
82
+ vars = route.template.extract(#{r.template.scheme? ? 'proto_host_path' : (r.template.host? ? 'host_path' : 'path')})
79
83
  if vars
80
- yield( route, vars, #{i} )
84
+ yield( route, vars, #{i+1} )
81
85
  end
82
86
  "
83
- } ,'; end'].join
87
+ } + [ 'end']).join("\n")
84
88
  instance_eval(code)
85
89
  end
86
90
 
87
- def each(path,uri)
91
+ def each(proto,host,path)
92
+ host_path = host + path; proto_host_path = proto + host + path
88
93
  @routes.each_with_index do |route,i|
89
- vars = route.template.extract(route.template.absolute? ? uri : path)
94
+ vars = route.template.extract(route.template.scheme? ? proto_host_path : (route.template.host? ? host_path : path) )
90
95
  if vars
91
96
  yield( route, vars, i )
92
97
  end
@@ -103,8 +108,8 @@ module Addressive
103
108
  @partitions = partitions
104
109
  end
105
110
 
106
- def preroute(path,uri)
107
- @partitions[ uri.include?(@substring) ? 0 : 1 ].preroute(uri,path)
111
+ def preroute(proto,host,path)
112
+ @partitions[ (host+path).include?(@substring) ? 0 : 1 ].preroute(proto,host,path)
108
113
  end
109
114
 
110
115
  def <<(spec)
@@ -137,8 +142,8 @@ module Addressive
137
142
  @partitions = partitions
138
143
  end
139
144
 
140
- def preroute(path,uri)
141
- @partitions[ path.start_with?(@prefix) ? 0 : 1 ].preroute(uri,path)
145
+ def preroute(proto, host, path)
146
+ @partitions[ path.start_with?(@prefix) ? 0 : 1 ].preroute(proto, host, path)
142
147
  end
143
148
 
144
149
  def <<(spec)
@@ -225,14 +230,14 @@ module Addressive
225
230
  l = env['rack.logger']
226
231
  db = l ? l.method(:debug) : DEBUG_NULL
227
232
  db.call(DEBUG_NAME) do
228
- "[ ? ] #{rr.url.inspect}"
233
+ "[ ? ] url: #{rr.url.inspect}, path: #{rr.fullpath.inspect}"
229
234
  end
230
- matches = routes_for(rr.path, rr.url)
235
+ matches = routes_for(rr.fullpath, rr.url)
231
236
  result = nil
232
237
  matches.each do |addressive|
233
238
  env[ADDRESSIVE_ENV_KEY] = addressive
234
239
  begin
235
- result = addressive.spec.app.call(env)
240
+ result = (addressive.spec.callback || addressive.spec.app).call(env)
236
241
  db.call(DEBUG_NAME) do
237
242
  "[#{result[0]}] #{addressive.spec.template.pattern} with #{addressive.variables.inspect} on #{addressive.spec.app} ( route #{addressive.data[:'routes.scanned']} / #{addressive.data[:'routes.total']} ) after #{'%.6f' % addressive.data[:duration]}"
238
243
  end
@@ -260,15 +265,15 @@ module Addressive
260
265
  include Enumerable
261
266
 
262
267
  # @private
263
- def initialize(routes,path,url,actions)
264
- @routes,@path,@url,@actions = routes, path, url, actions
268
+ def initialize(routes,proto,host,path,actions)
269
+ @routes,@proto,@host,@path,@actions = routes, proto, host,path, actions
265
270
  end
266
271
 
267
272
  # @yield {Addressive::Match}
268
273
  def each
269
274
  total = @routes.size
270
275
  scan_time = Time.now
271
- @routes.each(@path,@url) do |spec, vars, scanned|
276
+ @routes.each(@proto,@host,@path) do |spec, vars, scanned|
272
277
  node, action = @actions[spec];
273
278
  t = Time.now
274
279
  yield Match.new(node, action, vars, spec, {:'routes.scanned'=>scanned,:'routes.total'=>total,:duration => (t - scan_time)})
@@ -279,14 +284,19 @@ module Addressive
279
284
  end
280
285
 
281
286
  end
282
-
287
+
288
+ URI_SPLITTER = %r{\A([a-z]+:)(//[^/\n]+)(/[^\n]+)\z}
289
+
283
290
  #
284
291
  # @param path String the path to look for
285
292
  # @param uri String the full uri
286
293
  # @return {RouteEnumerator} an enumerator which yields the requested routes
287
- def routes_for(path, uri)
294
+ def routes_for(path=nil, uri)
295
+ _, *parts = URI_SPLITTER.match(uri).to_a
296
+ raise ArgumentError.new("Expected a valid URI but got #{uri.inspect}") if parts.size != 3
297
+ parts.map!(&:to_s)
288
298
  materialize!
289
- return RouteEnumerator.new(@tree.preroute(path,uri),path,uri,@actions)
299
+ return RouteEnumerator.new(@tree.preroute(*parts),*parts,@actions)
290
300
  end
291
301
 
292
302
  # @private
@@ -323,9 +333,9 @@ module Addressive
323
333
  return unless @immaterial
324
334
  @mutex.synchronize do
325
335
  return unless @immaterial
326
- @routes.sort_by!{|spec| spec.template.static_characters }.reverse!
336
+ routes = @routes.sort_by{|spec| [ -spec.template.static_characters, spec.variables.size ] }
327
337
  @tree.clear!
328
- @routes.each do |spec|
338
+ routes.each do |spec|
329
339
  @tree << spec
330
340
  end
331
341
  @tree.done!
@@ -31,7 +31,7 @@ module Addressive
31
31
  # # Create a file, so this won't be a 404:
32
32
  # File.new('/tmp/baz','w').close
33
33
  # router = Addressive::Router.new.add(node)
34
- # status,headers,body = router.call('rack.url_scheme'=>'http','PATH_INFO'=>'/baz','HTTP_HOST'=>'example.example')
34
+ # status,headers,body = router.call('rack.url_scheme'=>'http','PATH_INFO'=>'/baz','HTTP_HOST'=>'example.example','REQUEST_METHOD'=>'GET')
35
35
  # body.class #=> Rack::File
36
36
  # body.path #=> "/tmp/baz"
37
37
  #
metadata CHANGED
@@ -1,82 +1,111 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: addressive
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.alpha
5
- prerelease: 6
4
+ version: 0.1.0
5
+ prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - HannesG
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-11-23 00:00:00.000000000 Z
12
+ date: 2013-04-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: uri_template
16
- requirement: &7411800 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
- - - ~>
19
+ - - '>='
20
20
  - !ruby/object:Gem::Version
21
- version: 0.1.4
21
+ version: 0.5.1
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *7411800
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 0.5.1
25
30
  - !ruby/object:Gem::Dependency
26
31
  name: simplecov
27
- requirement: &7408500 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
28
33
  none: false
29
34
  requirements:
30
- - - ! '>='
35
+ - - '>='
31
36
  - !ruby/object:Gem::Version
32
37
  version: '0'
33
38
  type: :development
34
39
  prerelease: false
35
- version_requirements: *7408500
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
36
46
  - !ruby/object:Gem::Dependency
37
47
  name: rspec
38
- requirement: &7407760 !ruby/object:Gem::Requirement
48
+ requirement: !ruby/object:Gem::Requirement
39
49
  none: false
40
50
  requirements:
41
- - - ! '>='
51
+ - - '>='
42
52
  - !ruby/object:Gem::Version
43
53
  version: '0'
44
54
  type: :development
45
55
  prerelease: false
46
- version_requirements: *7407760
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
47
62
  - !ruby/object:Gem::Dependency
48
63
  name: yard
49
- requirement: &7460580 !ruby/object:Gem::Requirement
64
+ requirement: !ruby/object:Gem::Requirement
50
65
  none: false
51
66
  requirements:
52
- - - ! '>='
67
+ - - '>='
53
68
  - !ruby/object:Gem::Version
54
69
  version: '0'
55
70
  type: :development
56
71
  prerelease: false
57
- version_requirements: *7460580
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
58
78
  - !ruby/object:Gem::Dependency
59
79
  name: rack
60
- requirement: &7459920 !ruby/object:Gem::Requirement
80
+ requirement: !ruby/object:Gem::Requirement
61
81
  none: false
62
82
  requirements:
63
- - - ! '>='
83
+ - - '>='
64
84
  - !ruby/object:Gem::Version
65
85
  version: '0'
66
86
  type: :development
67
87
  prerelease: false
68
- version_requirements: *7459920
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
69
94
  description: ''
70
95
  email: hannes.georg@googlemail.com
71
96
  executables: []
72
97
  extensions: []
73
98
  extra_rdoc_files: []
74
99
  files:
75
- - lib/addressive/request.rb
76
- - lib/addressive/graphviz.rb
77
- - lib/addressive/graph.rb
100
+ - lib/addressive/rack_ext.rb
78
101
  - lib/addressive/router.rb
102
+ - lib/addressive/graph.rb
103
+ - lib/addressive/graph/middleware.rb
104
+ - lib/addressive/graph/builds_uris.rb
105
+ - lib/addressive/backports.rb
79
106
  - lib/addressive/static.rb
107
+ - lib/addressive/request.rb
108
+ - lib/addressive/builder.rb
80
109
  - lib/addressive.rb
81
110
  - addressive.gemspec
82
111
  homepage: https://github.com/hannesg/addressive
@@ -88,18 +117,18 @@ require_paths:
88
117
  required_ruby_version: !ruby/object:Gem::Requirement
89
118
  none: false
90
119
  requirements:
91
- - - ! '>='
120
+ - - '>='
92
121
  - !ruby/object:Gem::Version
93
122
  version: '0'
94
123
  required_rubygems_version: !ruby/object:Gem::Requirement
95
124
  none: false
96
125
  requirements:
97
- - - ! '>'
126
+ - - '>='
98
127
  - !ruby/object:Gem::Version
99
- version: 1.3.1
128
+ version: '0'
100
129
  requirements: []
101
130
  rubyforge_project:
102
- rubygems_version: 1.8.10
131
+ rubygems_version: 1.8.25
103
132
  signing_key:
104
133
  specification_version: 3
105
134
  summary: A system which should help bringing different Rack applications together.