rack-conneg 0.1.3 → 0.1.4

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 (3) hide show
  1. data/README.rdoc +5 -2
  2. data/lib/rack/conneg.rb +36 -7
  3. metadata +2 -2
data/README.rdoc CHANGED
@@ -17,12 +17,15 @@ Content negotiation for Rack applications, including a Rails-style respond_to bl
17
17
  use(Rack::Conneg) { |conneg|
18
18
  conneg.set :accept_all_extensions, false
19
19
  conneg.set :fallback, :html
20
- conneg.ignore('/public/')
20
+ conneg.ignore('/stylesheets/')
21
+ conneg.ignore_contents_of(File.join(File.dirname(__FILE__),'public'))
21
22
  conneg.provide([:json, :xml])
22
23
  }
23
24
 
24
25
  before do
25
- content_type negotiated_type
26
+ if negotiated?
27
+ content_type negotiated_type
28
+ end
26
29
  end
27
30
 
28
31
  get '/hello' do
data/lib/rack/conneg.rb CHANGED
@@ -5,7 +5,9 @@ module Rack #:nodoc:#
5
5
 
6
6
  class Conneg
7
7
 
8
- VERSION = '0.1.3'
8
+ VERSION = '0.1.4'
9
+
10
+ attr :ignores
9
11
 
10
12
  def initialize(app)
11
13
  @app = app
@@ -17,8 +19,9 @@ module Rack #:nodoc:#
17
19
  @types = []
18
20
 
19
21
  @app.class.module_eval {
20
- def negotiated_ext ; @rack_conneg_ext ; end #:nodoc:#
21
- def negotiated_type ; @rack_conneg_type ; end #:nodoc:#
22
+ def negotiated_ext ; @rack_conneg_ext ; end #:nodoc:#
23
+ def negotiated_type ; @rack_conneg_type ; end #:nodoc:#
24
+ def negotiated? ; not @rack_conneg_type.nil? ; end #:nodoc:#
22
25
  def respond_to
23
26
  wants = { '*/*' => Proc.new { raise TypeError, "No handler for #{@rack_conneg_type}" } }
24
27
  def wants.method_missing(ext, *args, &handler)
@@ -40,7 +43,7 @@ module Rack #:nodoc:#
40
43
  def call(env)
41
44
  extension = nil
42
45
  path_info = env['PATH_INFO']
43
- unless @ignores.find { |ignore| ignore.match(path_info) }
46
+ unless ignored?(path_info)
44
47
  # First, check to see if there's an explicit type requested
45
48
  # via the file extension
46
49
  mime_type = Rack::Mime.mime_type(::File.extname(path_info),nil)
@@ -81,6 +84,11 @@ module Rack #:nodoc:#
81
84
  end
82
85
  @app.call(env) unless @app.nil?
83
86
  end
87
+
88
+ # Determine if the given path matches any items in the ignore list.
89
+ def ignored?(path_info)
90
+ @ignores.find { |ignore| ignore.match(path_info) } ? true : false
91
+ end
84
92
 
85
93
  # Should content negotiation accept any file extention passed as part of the URI path,
86
94
  # even if it's not one of the registered provided types?
@@ -97,10 +105,30 @@ module Rack #:nodoc:#
97
105
  # Specifies a route prefix or Regexp that should be ignored by the content negotiator. Use
98
106
  # for static files or any other route that should be passed through unaltered.
99
107
  def ignore(route)
100
- route_re = route.kind_of?(Regexp) ? route : %r{^#{route}}
108
+ route_re = route.kind_of?(Regexp) ? route : %r{^#{Regexp.escape(route)}}
101
109
  @ignores << route_re
102
110
  end
103
111
 
112
+ # Specifies a directory whose contents should be considered static and therefore ignored.
113
+ # Use with caution, since it acts recursively and can therefore build a pretty big
114
+ # ignore list, slowing down each request. It's smart enough not to add anything that's
115
+ # already been ignored, so if you ignore('/javascripts/') before you ignore_contents_of('public'),
116
+ # public/javascripts/* won't be added. In short, do all of your general ignore()ing before
117
+ # you ignore_contents_of().
118
+ def ignore_contents_of(path, prefix = '')
119
+ dir = Dir.open(path)
120
+ dir.select { |f| f !~ /^\.\.?$/ }.each { |entry|
121
+ entry_path = "#{prefix}/#{entry}"
122
+ unless ignored?(entry_path)
123
+ if ::File.directory?(::File.join(dir.path,entry))
124
+ ignore_contents_of(::File.join(dir.path,entry),entry_path)
125
+ else
126
+ ignore(%r{^#{Regexp.escape(entry_path)}$})
127
+ end
128
+ end
129
+ }
130
+ end
131
+
104
132
  # Register one or more content types that the application offers. Can be a content type string,
105
133
  # a file extension, or a symbol (e.g., 'application/xml', '.xml', and :xml are all equivalent).
106
134
  def provide(*args)
@@ -142,8 +170,9 @@ module Rack #:nodoc:#
142
170
  end
143
171
 
144
172
  class Request
145
- def negotiated_ext ; @env['rack.conneg.ext'] ; end
146
- def negotiated_type ; @env['rack.conneg.type'] ; end
173
+ def negotiated_ext ; @env['rack.conneg.ext'] ; end
174
+ def negotiated? ; not @env['rack.conneg.type'].nil? ; end
175
+ def negotiated_type ; @env['rack.conneg.type'] ; end
147
176
  end
148
177
 
149
178
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-conneg
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael B. Klein
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-03-03 00:00:00 -08:00
12
+ date: 2010-03-11 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency