webmachine 1.2.0 → 1.2.2

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -11,7 +11,7 @@ tmtags
11
11
  .\#*
12
12
 
13
13
  ## VIM
14
- *.swp
14
+ *.sw[^f]
15
15
 
16
16
  ## PROJECT::GENERAL
17
17
  coverage
data/CHANGELOG.md ADDED
@@ -0,0 +1,218 @@
1
+ ### 1.2.2 January 8, 2014
2
+
3
+ 1.2.2 is a bugfix/patch release that expands functionality with some edge
4
+ cases, and fixes a couple of bugs. Thank you to the new contributors:
5
+ Judson Lester, John Bachir, and @bethesque!
6
+
7
+ * Added Date header to responses, it's mandatory.
8
+ * Updated RSpec options to never load DRb, since it breaks the test suite.
9
+ * Updated FSM to respond with 404 if no route matches.
10
+ * Added support for key-only extensions in content negotiation.
11
+ * Improved the README file.
12
+ * Fixed insignificance of `handle_exception` callback's return value.
13
+ * Fixed CI setup with regards to Rubinius and JRuby.
14
+ * Several smaller code cleanups.
15
+
16
+ ### 1.2.1 September 28, 2013
17
+
18
+ 1.2.1 is a bugfix/patch release but does introduce potentially
19
+ breaking changes in the Reel adapter. With this release, Webmachine no
20
+ longer explicitly supports Ruby 1.8.
21
+
22
+ * Updated Reel compatibility to 0.4.
23
+ * Updated Hatetepe compatibility to 0.5.2.
24
+ * Cleaned up the gemspec so bundler scripts are not included.
25
+ * Added license information to the gemspec.
26
+ * Added a link to jruby-http-kit in the README.
27
+ * Moved adapter_lint to lib/webmachine/spec so other libraries can
28
+ test adapters that are not in the Webmachine gem.
29
+
30
+ ### 1.2.0 September 7, 2013
31
+
32
+ 1.2.0 is a major feature release that adds the Events instrumentation
33
+ framework, support for Websockets in Reel adapter and a bunch of bugfixes.
34
+ Added Justin McPherson and Hendrik Beskow as contributors. Thank you
35
+ for your contributions!
36
+
37
+ * Websockets support in Reel adapter.
38
+ * Added `Events` framework implementing ActiveSupport::Notifications
39
+ instrumentation API.
40
+ * Linked mailing list and related library in README.
41
+ * Fixed operator precedence in `IOEncoder#each`.
42
+ * Fixed typo in Max-Age cookie attribute.
43
+ * Allowed attributes to be set in a `Cookie`.
44
+ * Fixed streaming in Rack adapter from Fiber that is expected
45
+ to block
46
+ * Added a more comprehensive adapter test suite and fixed various bugs
47
+ in the existing adapters.
48
+ * Webmachine::LazyRequestBody no longer double-buffers the request
49
+ body and cannot be rewound.
50
+
51
+ ### 1.1.0 January 12, 2013
52
+
53
+ 1.1.0 is a major feature release that adds the Reel and Hatetepe
54
+ adapters, support for "weak" entity tags, streaming IO response
55
+ bodies, better error handling, a shortcut for spinning up specific
56
+ resources, and a bunch of bugfixes. Added Tony Arcieri, Sebastian
57
+ Edwards, Russell Garner, Justin McPherson, Paweł Pacana, and Nicholas
58
+ Young as contributors. Thank you for your contributions!
59
+
60
+ * Added Reel adapter.
61
+ * The trace resource now opens static files in binary mode to ensure
62
+ compatibility on Windows.
63
+ * The trace resource uses absolute URIs for its traces.
64
+ * Added Hatetepe adapter.
65
+ * Added direct weak entity tag support.
66
+ * Related libraries are linked from the README.
67
+ * Removed some circular requires.
68
+ * Fixed documentation for the `valid_content_headers?` callback.
69
+ * Fixed `Headers` initialization by downcasing incoming header names.
70
+ * Added a `Headers#fetch` method.
71
+ * Conventionally "truthy" and "falsey" values (non-nil, non-false) can
72
+ now be returned from callbacks that expect a boolean return value.
73
+ * Updated to the latest RSpec.
74
+ * Added support for IO response bodies (minimal).
75
+ * Moved streaming encoders to their own module for clarity.
76
+ * Added `Resource#run` that starts up a web server with default
77
+ configuration options and the catch-all route to the resource.
78
+ * The exception handling flow was improved, clarifying the
79
+ `handle_exception` and `finish_request` callbacks.
80
+ * Fix incompatibilities with Rack.
81
+ * The request URI will not be initialized with parts that are not
82
+ present in the HTTP request.
83
+ * The tracing will now commit to storage after the response has been
84
+ traced.
85
+
86
+ ### 1.0.0 July 7, 2012
87
+
88
+ 1.0.0 is a major feature release that finally includes the visual
89
+ debugger, some nice cookie support, and some new extension
90
+ points. Added Peter Johanson and Armin Joellenbeck as
91
+ contributors. Thank you for your contributions!
92
+
93
+ * A cookie parsing and manipulation API was added.
94
+ * Conneg headers now accept any amount of whitespace around commas,
95
+ including none.
96
+ * `Callbacks#handle_exception` was added so that resources can handle
97
+ exceptions that they generate and produce more friendly responses.
98
+ * Chunked and non-chunked response bodies in the Rack adapter were
99
+ fixed.
100
+ * The WEBrick example was updated to use the new API.
101
+ * `Dispatcher` was refactored so that you can modify how resources
102
+ are initialized before dispatching occurs.
103
+ * `Route` now includes the `Translation` module so that exception
104
+ messages are properly rendered.
105
+ * The visual debugger was added (more details in the README).
106
+ * The `Content-Length` header will always be set inside Webmachine and
107
+ is no longer reliant on the adapter to set it.
108
+
109
+ ### 0.4.2 March 22, 2012
110
+
111
+ 0.4.2 is a bugfix release that corrects a few minor issues. Added Lars
112
+ Gierth and Rob Gleeson as contributors. Thank you for your
113
+ contributions!
114
+
115
+ * I always intended for Webmachine-Ruby to be Apache licensed, but now
116
+ that is explicit.
117
+ * When the `#process_post` callback returns an invalid value, that
118
+ will now be `inspect`ed in the raised exception's message.
119
+ * Route bindings are now applied to the `Request` object before the
120
+ `Resource` class is instantiated. This means you can inspect them
121
+ inside the `#initialize` method of your resource.
122
+ * Some `NameError` exceptions and scope problems in the Mongrel
123
+ adapter were resolved.
124
+ * URL-encoded `=` characters in the query string decoded in the proper
125
+ order.
126
+
127
+ ### 0.4.1 February 8, 2012
128
+
129
+ 0.4.1 is a bugfix release that corrects a few minor issues. Added Sam
130
+ Goldman as a contributor. Thank you for your contributions!
131
+
132
+ * Updated README with `Webmachine::Application` examples.
133
+ * The CGI env vars `CONTENT_LENGTH` and `CONTENT_TYPE` are now being
134
+ correctly converted into their Webmachine equivalents.
135
+ * The request body given via the Rack and Mongrel adapters now
136
+ responds to `#to_s` and `#each` so it can be treated like a `String`
137
+ or `Enumerable` that yields chunks.
138
+
139
+ ### 0.4.0 February 5, 2012
140
+
141
+ 0.4.0 includes some important refactorings, isolating the idea of
142
+ global state into an Application object with its own Dispatcher and
143
+ configuration, and making Adapters into real classes with a consistent
144
+ interface. It also adds some query methods on the Request object for
145
+ the HTTP method and scheme and Route guards (matching predicates).
146
+ Added Michael Maltese, Emmanuel Gomez, and Bernerd Schaefer as
147
+ committers. Thank you for your contributions!
148
+
149
+ * Fixed `Request#query` to handle nil values for the URI query accessor.
150
+ * `Webmachine::Dispatcher` is a real class rather than a module with
151
+ state.
152
+ * `Webmachine::Application` is a class that includes its own
153
+ dispatcher and configuration. The default instance is accessible via
154
+ `Webmachine.application`.
155
+ * `Webmachine::Adapter` is now the superclass of all implemented
156
+ adapters so that they have a uniform interface.
157
+ * The Mongrel spec is skipped on JRuby since version 1.2 (pre-release)
158
+ doesn't work. Direct Mongrel support may be removed in a later
159
+ release.
160
+ * `Webmachine::Dispatcher::Route` now accepts guards, which may be
161
+ expressed as lambdas/procs or any object responding to `call`
162
+ preceding the `Resource` class in the route definition, or as a
163
+ trailing block. All guards will be passed the `Request` object when
164
+ matching the route and should return a truthy or falsey value
165
+ (without side-effects).
166
+
167
+ ### 0.3.0 November 9, 2011
168
+
169
+ 0.3.0 introduces some new features, refactorings, and now has 100%
170
+ documentation coverage! Among the new features are minimal Rack
171
+ compatibility, streaming responses via Fibers and a friendlier route
172
+ definition syntax. Added Jamis Buck as a committer. Thank you for your
173
+ contributions!
174
+
175
+ * Chunked bodies are now wrapped in a way that works on webservers
176
+ that don't automatically produce them.
177
+ * HTTP Basic Authentication is easy to add to resources, just include
178
+ `Webmachine::Resource::Authentication`.
179
+ * Routes are a little less painful to add, you can now specify them
180
+ with `Webmachine.routes` which will be evaled into the `Dispatcher`.
181
+ * The new default port is 8080.
182
+ * Rack is minimally supported as a host server. _Don't put middleware
183
+ above Webmachine!_
184
+ * Fibers can be used as streamed response bodies.
185
+ * `Dispatcher#add_route` will now return the added `Route` instance.
186
+ * The header-conversion code for CGI-style servers has been extracted
187
+ into `Webmachine::Headers`.
188
+ * `Route#path_spec` is now public so that applications can inspect
189
+ existing routes, perhaps for URL generation.
190
+ * `Request#query` now uses `CGI.unescape` so '+' characters are
191
+ correctly parsed.
192
+ * YARD documentation has 100% coverage.
193
+
194
+ ### 0.2.0 September 11, 2011
195
+
196
+ 0.2.0 includes an adapter for Mongrel and a central place for
197
+ configuration as well as numerous bugfixes. Added Ian Plosker and
198
+ Bernd Ahlers as committers. Thank you for your contributions!
199
+
200
+ * Acceptable media types are matched less strictly, which has
201
+ implications on both responses and PUT requests. See the
202
+ [discussion on the commit](https://github.com/seancribbs/webmachine-ruby/commit/3686d0d9ff77fc98aff59f89478e9c6c18844ca1).
203
+ * Resources now receive a callback after the language has been
204
+ negotiated, so they can decide what to do with it.
205
+ * Added `Webmachine::Configuration` so we can more easily support more
206
+ than one host server/adapter.
207
+ * Added Mongrel adapter, supporting 1.2pre+.
208
+ * Media type headers are more lax about whitespace following
209
+ semicolons.
210
+ * Fix some problems with callable response bodies.
211
+ * Make sure String response bodies get a Content-Length header added
212
+ and streaming responses get chunked encoding.
213
+ * Numerous refactorings, including extracting `MediaType` into its own
214
+ top-level class.
215
+
216
+ ### 0.1.0 August 25, 2011
217
+
218
+ This is the initial release. Most things work, but only WEBrick is supported.
data/Gemfile CHANGED
@@ -8,12 +8,8 @@ gem 'bundler'
8
8
 
9
9
  group :webservers do
10
10
  gem 'mongrel', '~> 1.2.beta', :platform => [:mri, :rbx]
11
-
12
- if RUBY_VERSION >= '1.9'
13
- gem 'reel', '~> 0.3.0', :platform => [:ruby_19, :ruby_20, :jruby]
14
- end
15
-
16
- gem 'hatetepe', '~> 0.5'
11
+ gem 'reel', '~> 0.4.0.pre5'
12
+ gem 'hatetepe', '~> 0.5.2'
17
13
  end
18
14
 
19
15
  group :guard do
@@ -38,3 +34,8 @@ end
38
34
  platforms :jruby do
39
35
  gem 'jruby-openssl'
40
36
  end
37
+
38
+ platform :rbx do
39
+ gem 'rubysl'
40
+ gem 'racc'
41
+ end
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # webmachine for Ruby [![travis](https://secure.travis-ci.org/seancribbs/webmachine-ruby.png)](http://travis-ci.org/seancribbs/webmachine-ruby)
1
+ # webmachine for Ruby [![travis](https://travis-ci.org/seancribbs/webmachine-ruby.png?branch=master)](http://travis-ci.org/seancribbs/webmachine-ruby)
2
2
 
3
3
  webmachine-ruby is a port of
4
4
  [Webmachine](https://github.com/basho/webmachine), which is written in
@@ -11,97 +11,118 @@ toolkit for building HTTP-friendly applications. For example, it does
11
11
  not provide a templating engine or a persistence layer; those choices
12
12
  are up to you.
13
13
 
14
+ ## Features
15
+
16
+ * Handles the hard parts of content negotiation, conditional
17
+ requests, and response codes for you.
18
+ * Most callbacks can interrupt the decision flow by returning an
19
+ integer response code. You generally only want to do this when new
20
+ information comes to light, requiring a modification of the response.
21
+ * Supports WEBrick and Mongrel (1.2pre+), and a Rack shim. Other host
22
+ servers are being investigated.
23
+ * Streaming/chunked response bodies are permitted as Enumerables,
24
+ Procs, or Fibers!
25
+ * Unlike the Erlang original, it does real Language negotiation.
26
+ * Includes the visual debugger so you can look through the decision
27
+ graph to determine how your resources are behaving.
28
+
29
+ ## Documentation & Finding Help
30
+
31
+ * [API documentation](http://rubydoc.info/gems/webmachine/frames/file/README.md)
32
+ * [Mailing list](mailto:webmachine.rb@librelist.com)
33
+ * IRC channel #webmachine on freenode
34
+
14
35
  ## A Note about Rack
15
36
 
16
- Webmachine has a Rack adapter -- thanks to Jamis Buck -- but when
17
- using it, we recommend you ensure that NO middleware is used. The
18
- behaviors that are encapsulated in Webmachine could be broken by
19
- middlewares that sit above it, and there is no way to detect them at
20
- runtime. _Caveat implementor_. That said, Webmachine should behave properly
21
- when given a clear stack.
37
+ In order to be compatible with popular deployment stacks,
38
+ Webmachine has a [Rack](https://github.com/rack/rack) adapter (thanks to Jamis Buck).
39
+ **n.b.:** We recommend that NO middleware is used. The
40
+ behaviors that are encapsulated in Webmachine assume that no modifications
41
+ are done to requests or response outside of Webmachine.
22
42
 
23
- ## Getting Started
43
+ ## A Note about MRI 1.9
24
44
 
25
- Webmachine is very young, but it's still easy to construct an
26
- application for it!
45
+ The [Reel](https://github.com/celluloid/reel) and [Hatetepe](https://github.com/lgierth/hatetepe)
46
+ adapters might crash with a `SystemStackError` on MRI 1.9 due to its
47
+ limited fiber stack size. If your application is affected by this, the
48
+ only known solution is to switch to JRuby, Rubinius or MRI 2.0.
27
49
 
28
- ```ruby
29
- require 'webmachine'
30
- # Require any of the files that contain your resources here
31
- require 'my_resource'
32
50
 
33
- # Create an application which encompasses routes and configruation
34
- MyApp = Webmachine::Application.new do |app|
35
- app.routes do
36
- # Point all URIs at the MyResource class
37
- add ['*'], MyResource
38
- end
39
- end
51
+ ## Getting Started
40
52
 
41
- # Start the server, binds to port 8080 using WEBrick
42
- MyApp.run
43
- ```
53
+ [GiddyUp](https://github.com/basho/giddyup) is an actively
54
+ developed webmachine-ruby app that is in production. You
55
+ can look there for an example of how to write and structure a
56
+ webmachine-ruby app (although it is hacky in places).
57
+
58
+ Below we go through some examples of how to do basic things
59
+ with webmachine-ruby.
44
60
 
45
- Your resource will look something like this:
61
+ The first example defines a simple resource that doesn't demo the
62
+ true power of Webmachine but perhaps gives a feel for how a
63
+ Webmachine resource might look. `Webmachine::Resource.run` is available
64
+ to provide for quick prototyping and development. In a real application
65
+ you will want to configure what path a resource is served from.
66
+ See the __Router__ section in the README for more details on how to
67
+ do that.
68
+
69
+ There are many other HTTP features exposed to a resource through
70
+ {Webmachine::Resource::Callbacks}. A callback can alter the outcome
71
+ of the decision tree Webmachine implements, and the decision tree
72
+ is what makes Webmachine unique and powerful.
46
73
 
47
74
  ```ruby
75
+ require 'webmachine'
48
76
  class MyResource < Webmachine::Resource
49
77
  def to_html
50
78
  "<html><body>Hello, world!</body></html>"
51
79
  end
52
80
  end
81
+
82
+ # Start a web server to serve requests via localhost
83
+ MyResource.run
53
84
  ```
54
85
 
55
- Run the first file and your application is up. That's all there is to
56
- it! If you want to customize your resource more, look at the available
57
- callbacks in lib/webmachine/resource/callbacks.rb. For example, you
58
- might want to enable "gzip" compression on your resource, for which
59
- you can simply add an `encodings_provided` callback method:
86
+ ### Router
60
87
 
61
- ```ruby
62
- class MyResource < Webmachine::Resource
63
- def encodings_provided
64
- {"gzip" => :encode_gzip, "identity" => :encode_identity}
65
- end
88
+ The router is used to map a resource to a given path. To map the class `MyResource` to
89
+ the path `/myresource` you would write something along the lines of:
66
90
 
67
- def to_html
68
- "<html><body>Hello, world!</body></html>"
69
- end
91
+ ```ruby
92
+ Webmachine.application.routes do
93
+ add ['myresource'], MyResource
70
94
  end
71
- ```
72
95
 
73
- There are many other HTTP features exposed to your resource through
74
- {Webmachine::Resource::Callbacks}. Give them a try!
96
+ # Start a web server to serve requests via localhost
97
+ Webmachine.application.run
98
+ ```
75
99
 
76
100
  ### Application/Configurator
77
101
 
78
- There's a configurator that allows you to set the ip address and port
79
- bindings as well as a different webserver adapter. You can also add
80
- your routes in a block (as shown above). Both of these call return the
81
- `Webmachine::Application` instance, so you could chain them if you
82
- like. If you don't want to create your own separate application
83
- object, `Webmachine.application` will return a global one.
102
+ There's a configurator that allows you to set what IP address and port
103
+ a web server should bind to as well as what web server should serve a
104
+ webmachine resource.
105
+
106
+ A call to `Webmachine::Application#configure` returns a `Webmachine::Application` instance,
107
+ so you could chain other method calls if you like. If you don't want to create your own separate
108
+ application object `Webmachine.application` will return a global one.
84
109
 
85
110
  ```ruby
86
111
  require 'webmachine'
87
112
  require 'my_resource'
88
113
 
89
- Webmachine.application.routes do
90
- add ['*'], MyResource
91
- end
92
-
93
114
  Webmachine.application.configure do |config|
94
115
  config.ip = '127.0.0.1'
95
116
  config.port = 3000
96
117
  config.adapter = :Mongrel
97
118
  end
98
119
 
99
- # Start the server.
120
+ # Start a web server to serve requests via localhost
100
121
  Webmachine.application.run
101
122
  ```
102
123
 
103
124
  Webmachine includes adapters for [Webrick][webrick], [Mongrel][mongrel],
104
- [Reel][reel], and [Hatetepe]. Additionally, the [Rack][rack] adapter lets it
125
+ [Reel][reel], and [Hatetepe][hatetepe]. Additionally, the [Rack][rack] adapter lets it
105
126
  run on any webserver that provides a Rack interface. It also lets it run on
106
127
  [Shotgun][shotgun] ([example][shotgun_example]).
107
128
 
@@ -151,37 +172,9 @@ can use to lookup the trace. It might look something like this:
151
172
  ![preview calls at decision](http://seancribbs-skitch.s3.amazonaws.com/Webmachine_Trace_2156885920-20120625-100153.png)
152
173
 
153
174
  Refer to
154
- [examples/debugger.rb](/seancribbs/webmachine-ruby/blob/master/examples/debugger.rb)
175
+ [examples/debugger.rb](/examples/debugger.rb)
155
176
  for an example of how to enable the debugger.
156
177
 
157
- ## Features
158
-
159
- * Handles the hard parts of content negotiation, conditional
160
- requests, and response codes for you.
161
- * Most callbacks can interrupt the decision flow by returning an
162
- integer response code. You generally only want to do this when new
163
- information comes to light, requiring a modification of the response.
164
- * Supports WEBrick and Mongrel (1.2pre+), and a Rack shim. Other host
165
- servers are being investigated.
166
- * Streaming/chunked response bodies are permitted as Enumerables,
167
- Procs, or Fibers!
168
- * Unlike the Erlang original, it does real Language negotiation.
169
- * Includes the visual debugger so you can look through the decision
170
- graph to determine how your resources are behaving.
171
-
172
- ## Caveats
173
-
174
- * The [Reel](https://github.com/celluloid/reel) adapter might fail with a
175
- `SystemStackError` on MRI (< 2.0) due to its limited fiber stack size.
176
- The only known solution is to switch to JRuby, Rubinius or MRI 2.0.
177
-
178
-
179
- ## Documentation & Finding Help
180
-
181
- * [API documentation](http://rubydoc.info/gems/webmachine/frames/file/README.md)
182
- * [Mailing list](mailto:webmachine.rb@librelist.com)
183
- * IRC channel #webmachine on freenode
184
-
185
178
  ## Related libraries
186
179
 
187
180
  * [irwebmachine](https://github.com/robgleeson/irwebmachine) - IRB/Pry debugging of Webmachine applications
@@ -189,6 +182,7 @@ for an example of how to enable the debugger.
189
182
  * [webmachine-linking](https://github.com/petejohanson/webmachine-linking) - Helpers for linking between Resources, and Web Linking
190
183
  * [webmachine-sprockets](https://github.com/lgierth/webmachine-sprockets) - Integration with Sprockets assets packaging system
191
184
  * [webmachine-actionview](https://github.com/rgarner/webmachine-actionview) - Integration of some Rails-style view conventions into Webmachine
185
+ * [jruby-http-kit](https://github.com/nLight/jruby-http-kit) - Includes an adapter for the Clojure-based Ring library/server
192
186
 
193
187
  ## LICENSE
194
188
 
@@ -196,194 +190,3 @@ webmachine-ruby is licensed under the
196
190
  [Apache v2.0 license](http://www.apache.org/licenses/LICENSE-2.0). See
197
191
  LICENSE for details.
198
192
 
199
- ## Changelog
200
-
201
- ### 1.2.0
202
-
203
- 1.2.0 is a major feature release that adds the Events instrumentation
204
- framework, support for Websockets in Reel adapter and a bunch of bugfixes.
205
- Added Justin McPherson and Hendrik Beskow as contributors. Thank you
206
- for your contributions!
207
-
208
- * Websockets support in Reel adapter.
209
- * Added `Events` framework implementing ActiveSupport::Notifications
210
- instrumentation API.
211
- * Linked mailing list and related library in README.
212
- * Fixed operator precedence in `IOEncoder#each`.
213
- * Fixed typo in Max-Age cookie attribute.
214
- * Allowed attributes to be set in a `Cookie`.
215
- * Fixed streaming in Rack adapter from Fiber that is expected
216
- to block
217
- * Added a more comprehensive adapter test suite and fixed various bugs
218
- in the existing adapters.
219
- * Webmachine::LazyRequestBody no longer double-buffers the request
220
- body and cannot be rewound.
221
-
222
- ### 1.1.0 January 12, 2013
223
-
224
- 1.1.0 is a major feature release that adds the Reel and Hatetepe
225
- adapters, support for "weak" entity tags, streaming IO response
226
- bodies, better error handling, a shortcut for spinning up specific
227
- resources, and a bunch of bugfixes. Added Tony Arcieri, Sebastian
228
- Edwards, Russell Garner, Justin McPherson, Paweł Pacana, and Nicholas
229
- Young as contributors. Thank you for your contributions!
230
-
231
- * Added Reel adapter.
232
- * The trace resource now opens static files in binary mode to ensure
233
- compatibility on Windows.
234
- * The trace resource uses absolute URIs for its traces.
235
- * Added Hatetepe adapter.
236
- * Added direct weak entity tag support.
237
- * Related libraries are linked from the README.
238
- * Removed some circular requires.
239
- * Fixed documentation for the `valid_content_headers?` callback.
240
- * Fixed `Headers` initialization by downcasing incoming header names.
241
- * Added a `Headers#fetch` method.
242
- * Conventionally "truthy" and "falsey" values (non-nil, non-false) can
243
- now be returned from callbacks that expect a boolean return value.
244
- * Updated to the latest RSpec.
245
- * Added support for IO response bodies (minimal).
246
- * Moved streaming encoders to their own module for clarity.
247
- * Added `Resource#run` that starts up a web server with default
248
- configuration options and the catch-all route to the resource.
249
- * The exception handling flow was improved, clarifying the
250
- `handle_exception` and `finish_request` callbacks.
251
- * Fix incompatibilities with Rack.
252
- * The request URI will not be initialized with parts that are not
253
- present in the HTTP request.
254
- * The tracing will now commit to storage after the response has been
255
- traced.
256
-
257
- ### 1.0.0 July 7, 2012
258
-
259
- 1.0.0 is a major feature release that finally includes the visual
260
- debugger, some nice cookie support, and some new extension
261
- points. Added Peter Johanson and Armin Joellenbeck as
262
- contributors. Thank you for your contributions!
263
-
264
- * A cookie parsing and manipulation API was added.
265
- * Conneg headers now accept any amount of whitespace around commas,
266
- including none.
267
- * `Callbacks#handle_exception` was added so that resources can handle
268
- exceptions that they generate and produce more friendly responses.
269
- * Chunked and non-chunked response bodies in the Rack adapter were
270
- fixed.
271
- * The WEBrick example was updated to use the new API.
272
- * `Dispatcher` was refactored so that you can modify how resources
273
- are initialized before dispatching occurs.
274
- * `Route` now includes the `Translation` module so that exception
275
- messages are properly rendered.
276
- * The visual debugger was added (more details in the README).
277
- * The `Content-Length` header will always be set inside Webmachine and
278
- is no longer reliant on the adapter to set it.
279
-
280
- ### 0.4.2 March 22, 2012
281
-
282
- 0.4.2 is a bugfix release that corrects a few minor issues. Added Lars
283
- Gierth and Rob Gleeson as contributors. Thank you for your
284
- contributions!
285
-
286
- * I always intended for Webmachine-Ruby to be Apache licensed, but now
287
- that is explicit.
288
- * When the `#process_post` callback returns an invalid value, that
289
- will now be `inspect`ed in the raised exception's message.
290
- * Route bindings are now applied to the `Request` object before the
291
- `Resource` class is instantiated. This means you can inspect them
292
- inside the `#initialize` method of your resource.
293
- * Some `NameError` exceptions and scope problems in the Mongrel
294
- adapter were resolved.
295
- * URL-encoded `=` characters in the query string decoded in the proper
296
- order.
297
-
298
- ### 0.4.1 February 8, 2012
299
-
300
- 0.4.1 is a bugfix release that corrects a few minor issues. Added Sam
301
- Goldman as a contributor. Thank you for your contributions!
302
-
303
- * Updated README with `Webmachine::Application` examples.
304
- * The CGI env vars `CONTENT_LENGTH` and `CONTENT_TYPE` are now being
305
- correctly converted into their Webmachine equivalents.
306
- * The request body given via the Rack and Mongrel adapters now
307
- responds to `#to_s` and `#each` so it can be treated like a `String`
308
- or `Enumerable` that yields chunks.
309
-
310
- ### 0.4.0 February 5, 2012
311
-
312
- 0.4.0 includes some important refactorings, isolating the idea of
313
- global state into an Application object with its own Dispatcher and
314
- configuration, and making Adapters into real classes with a consistent
315
- interface. It also adds some query methods on the Request object for
316
- the HTTP method and scheme and Route guards (matching predicates).
317
- Added Michael Maltese, Emmanuel Gomez, and Bernerd Schaefer as
318
- committers. Thank you for your contributions!
319
-
320
- * Fixed `Request#query` to handle nil values for the URI query accessor.
321
- * `Webmachine::Dispatcher` is a real class rather than a module with
322
- state.
323
- * `Webmachine::Application` is a class that includes its own
324
- dispatcher and configuration. The default instance is accessible via
325
- `Webmachine.application`.
326
- * `Webmachine::Adapter` is now the superclass of all implemented
327
- adapters so that they have a uniform interface.
328
- * The Mongrel spec is skipped on JRuby since version 1.2 (pre-release)
329
- doesn't work. Direct Mongrel support may be removed in a later
330
- release.
331
- * `Webmachine::Dispatcher::Route` now accepts guards, which may be
332
- expressed as lambdas/procs or any object responding to `call`
333
- preceding the `Resource` class in the route definition, or as a
334
- trailing block. All guards will be passed the `Request` object when
335
- matching the route and should return a truthy or falsey value
336
- (without side-effects).
337
-
338
- ### 0.3.0 November 9, 2011
339
-
340
- 0.3.0 introduces some new features, refactorings, and now has 100%
341
- documentation coverage! Among the new features are minimal Rack
342
- compatibility, streaming responses via Fibers and a friendlier route
343
- definition syntax. Added Jamis Buck as a committer. Thank you for your
344
- contributions!
345
-
346
- * Chunked bodies are now wrapped in a way that works on webservers
347
- that don't automatically produce them.
348
- * HTTP Basic Authentication is easy to add to resources, just include
349
- `Webmachine::Resource::Authentication`.
350
- * Routes are a little less painful to add, you can now specify them
351
- with `Webmachine.routes` which will be evaled into the `Dispatcher`.
352
- * The new default port is 8080.
353
- * Rack is minimally supported as a host server. _Don't put middleware
354
- above Webmachine!_
355
- * Fibers can be used as streamed response bodies.
356
- * `Dispatcher#add_route` will now return the added `Route` instance.
357
- * The header-conversion code for CGI-style servers has been extracted
358
- into `Webmachine::Headers`.
359
- * `Route#path_spec` is now public so that applications can inspect
360
- existing routes, perhaps for URL generation.
361
- * `Request#query` now uses `CGI.unescape` so '+' characters are
362
- correctly parsed.
363
- * YARD documentation has 100% coverage.
364
-
365
- ### 0.2.0 September 11, 2011
366
-
367
- 0.2.0 includes an adapter for Mongrel and a central place for
368
- configuration as well as numerous bugfixes. Added Ian Plosker and
369
- Bernd Ahlers as committers. Thank you for your contributions!
370
-
371
- * Acceptable media types are matched less strictly, which has
372
- implications on both responses and PUT requests. See the
373
- [discussion on the commit](https://github.com/seancribbs/webmachine-ruby/commit/3686d0d9ff77fc98aff59f89478e9c6c18844ca1).
374
- * Resources now receive a callback after the language has been
375
- negotiated, so they can decide what to do with it.
376
- * Added `Webmachine::Configuration` so we can more easily support more
377
- than one host server/adapter.
378
- * Added Mongrel adapter, supporting 1.2pre+.
379
- * Media type headers are more lax about whitespace following
380
- semicolons.
381
- * Fix some problems with callable response bodies.
382
- * Make sure String response bodies get a Content-Length header added
383
- and streaming responses get chunked encoding.
384
- * Numerous refactorings, including extracting `MediaType` into its own
385
- top-level class.
386
-
387
- ### 0.1.0 August 25, 2011
388
-
389
- This is the initial release. Most things work, but only WEBrick is supported.
@@ -4,17 +4,19 @@ require 'webmachine/headers'
4
4
  require 'webmachine/request'
5
5
  require 'webmachine/response'
6
6
  require 'webmachine/dispatcher'
7
- require 'webmachine/adapters/lazy_request_body'
8
7
  require 'set'
9
8
 
10
9
  module Webmachine
11
10
  module Adapters
12
11
  class Reel < Adapter
12
+ # Used to override default Reel server options (useful in testing)
13
+ DEFAULT_OPTIONS = {}
14
+
13
15
  def run
14
- @options = {
16
+ @options = DEFAULT_OPTIONS.merge({
15
17
  :port => configuration.port,
16
18
  :host => configuration.ip
17
- }.merge(configuration.adapter_options)
19
+ }).merge(configuration.adapter_options)
18
20
 
19
21
  if extra_verbs = configuration.adapter_options[:extra_verbs]
20
22
  @extra_verbs = Set.new(extra_verbs.map(&:to_s).map(&:upcase))
@@ -34,11 +36,11 @@ module Webmachine
34
36
  end
35
37
 
36
38
  def process(connection)
37
- while request = connection.request
39
+ connection.each_request do |request|
38
40
  # Users of the adapter can configure a custom WebSocket handler
39
- if request.is_a? ::Reel::WebSocket
41
+ if request.websocket?
40
42
  if handler = @options[:websocket_handler]
41
- handler.call(request)
43
+ handler.call(request.websocket)
42
44
  else
43
45
  # Pretend we don't know anything about the WebSocket protocol
44
46
  # FIXME: This isn't strictly what RFC 6455 would have us do
@@ -61,8 +63,7 @@ module Webmachine
61
63
  end
62
64
 
63
65
  wm_headers = Webmachine::Headers[request.headers.dup]
64
- wm_request = Webmachine::Request.new(method, uri, wm_headers,
65
- LazyRequestBody.new(request))
66
+ wm_request = Webmachine::Request.new(method, uri, wm_headers, request.body)
66
67
  wm_response = Webmachine::Response.new
67
68
  @dispatcher.dispatch(wm_request, wm_response)
68
69
 
@@ -14,7 +14,7 @@ module Webmachine
14
14
  #
15
15
  # This module is included into {FSM}, which drives the processing
16
16
  # of the chart.
17
- # @see http://webmachine.basho.com/images/http-headers-status-v3.png
17
+ # @see https://raw.github.com/wiki/basho/webmachine/images/http-headers-status-v3.png
18
18
  module Flow
19
19
  # Version of the flow diagram
20
20
  VERSION = 3
@@ -49,8 +49,8 @@ module Webmachine
49
49
  Webmachine.render_error(400, request, response, :message => e.message)
50
50
  400
51
51
  rescue Exception => e
52
- code = resource.handle_exception(e)
53
- (100...600).include?(code) ? (code) : (500)
52
+ resource.handle_exception(e)
53
+ 500
54
54
  end
55
55
 
56
56
  def respond(code, headers={})
@@ -70,6 +70,7 @@ module Webmachine
70
70
  end
71
71
 
72
72
  ensure_content_length
73
+ ensure_date_header
73
74
  end
74
75
 
75
76
  # When tracing is disabled, this does nothing.
@@ -1,4 +1,5 @@
1
1
  require 'stringio'
2
+ require 'time'
2
3
  require 'webmachine/streaming'
3
4
  require 'webmachine/media_type'
4
5
  require 'webmachine/quoted_string'
@@ -102,6 +103,13 @@ module Webmachine
102
103
  end
103
104
  end
104
105
 
106
+ # Ensures that responses have an appropriate Date header
107
+ def ensure_date_header
108
+ if (200..499).include?(response.code)
109
+ response.headers['Date'] ||= Time.now.httpdate
110
+ end
111
+ end
112
+
105
113
  # Sets the Content-Length header on the response
106
114
  def set_content_length
107
115
  if response.body.respond_to?(:bytesize)
@@ -1,6 +1,7 @@
1
1
  require 'forwardable'
2
2
  require 'webmachine/decision'
3
3
  require 'webmachine/dispatcher/route'
4
+ require 'webmachine/dispatcher/not_found_resource'
4
5
 
5
6
  module Webmachine
6
7
  # Handles dispatching incoming requests to the proper registered
@@ -39,16 +40,12 @@ module Webmachine
39
40
  # @param [Request] request the request object
40
41
  # @param [Response] response the response object
41
42
  def dispatch(request, response)
42
- if resource = find_resource(request, response)
43
- Webmachine::Events.instrument('wm.dispatch') do |payload|
44
- Webmachine::Decision::FSM.new(resource, request, response).run
45
-
46
- payload[:resource] = resource.class.name
47
- payload[:request] = request.dup
48
- payload[:code] = response.code
49
- end
50
- else
51
- Webmachine.render_error(404, request, response)
43
+ resource = find_resource(request, response)
44
+ Webmachine::Events.instrument('wm.dispatch') do |payload|
45
+ Webmachine::Decision::FSM.new(resource, request, response).run
46
+ payload[:resource] = resource.class.name
47
+ payload[:request] = request.dup
48
+ payload[:code] = response.code
52
49
  end
53
50
  end
54
51
 
@@ -64,6 +61,8 @@ module Webmachine
64
61
  def find_resource(request, response)
65
62
  if route = find_route(request)
66
63
  prepare_resource(route, request, response)
64
+ else
65
+ NotFoundResource.new(request, response)
67
66
  end
68
67
  end
69
68
 
@@ -0,0 +1,5 @@
1
+ class Webmachine::Dispatcher::NotFoundResource < Webmachine::Resource
2
+ def resource_exists?
3
+ false
4
+ end
5
+ end
@@ -8,7 +8,7 @@ module Webmachine
8
8
  MEDIA_TYPE_REGEX = /^\s*([^;\s]+)\s*((?:;\s*\S+\s*)*)\s*$/
9
9
 
10
10
  # Matches sub-type parameters
11
- PARAMS_REGEX = /;\s*([^=]+)=([^;=\s]+)/
11
+ PARAMS_REGEX = /;\s*([^=]+)(=([^;=\s]*))?/
12
12
 
13
13
  # Creates a new MediaType by parsing an alternate representation.
14
14
  # @param [MediaType, String, Array<String,Hash>] obj the raw type
@@ -21,7 +21,7 @@ module Webmachine
21
21
  obj
22
22
  when MEDIA_TYPE_REGEX
23
23
  type, raw_params = $1, $2
24
- params = Hash[raw_params.scan(PARAMS_REGEX)]
24
+ params = Hash[raw_params.scan(PARAMS_REGEX).map { |m| [m[0], m[2].to_s] }]
25
25
  new(type, params)
26
26
  else
27
27
  unless Array === obj && String === obj[0] && Hash === obj[1]
@@ -1,4 +1,4 @@
1
- require "support/test_resource"
1
+ require "webmachine/spec/test_resource"
2
2
  require "net/http"
3
3
 
4
4
  shared_examples_for :adapter_lint do
@@ -1,6 +1,6 @@
1
1
  module Webmachine
2
2
  # Library version
3
- VERSION = "1.2.0"
3
+ VERSION = "1.2.2"
4
4
 
5
5
  # String for use in "Server" HTTP response header, which includes
6
6
  # the {VERSION}.
@@ -58,7 +58,3 @@ examples = proc do
58
58
  enum.to_enum.to_a.join
59
59
  end
60
60
  end
61
-
62
- if RUBY_VERSION >= "1.9"
63
- describe Webmachine::Adapters::Hatetepe, &examples
64
- end
@@ -1,5 +1,5 @@
1
1
  require "spec_helper"
2
- require "support/adapter_lint"
2
+ require "webmachine/spec/adapter_lint"
3
3
 
4
4
  begin
5
5
  describe Webmachine::Adapters::Mongrel do
@@ -1,7 +1,7 @@
1
1
  require 'webmachine/adapter'
2
2
  require 'webmachine/adapters/rack'
3
3
  require 'spec_helper'
4
- require 'support/adapter_lint'
4
+ require 'webmachine/spec/adapter_lint'
5
5
 
6
6
  describe Webmachine::Adapters::Rack do
7
7
  it_should_behave_like :adapter_lint do
@@ -1,75 +1,72 @@
1
1
  require 'spec_helper'
2
- require 'support/adapter_lint'
2
+ require 'webmachine/spec/adapter_lint'
3
+ describe Webmachine::Adapters::Reel do
4
+ it_should_behave_like :adapter_lint
3
5
 
4
- if RUBY_VERSION >= "1.9"
5
- describe Webmachine::Adapters::Reel do
6
- it_should_behave_like :adapter_lint
6
+ let(:configuration) { Webmachine::Configuration.default }
7
+ let(:dispatcher) { Webmachine::Dispatcher.new }
8
+ let(:adapter) do
9
+ described_class.new(configuration, dispatcher)
10
+ end
7
11
 
8
- let(:configuration) { Webmachine::Configuration.default }
9
- let(:dispatcher) { Webmachine::Dispatcher.new }
10
- let(:adapter) do
11
- described_class.new(configuration, dispatcher)
12
+ context 'websockets' do
13
+ let(:example_host) { "www.example.com" }
14
+ let(:example_path) { "/example"}
15
+ let(:example_url) { "ws://#{example_host}#{example_path}" }
16
+ let :handshake_headers do
17
+ {
18
+ "Host" => example_host,
19
+ "Upgrade" => "websocket",
20
+ "Connection" => "Upgrade",
21
+ "Sec-WebSocket-Key" => "dGhlIHNhbXBsZSBub25jZQ==",
22
+ "Origin" => "http://example.com",
23
+ "Sec-WebSocket-Protocol" => "chat, superchat",
24
+ "Sec-WebSocket-Version" => "13"
25
+ }
12
26
  end
27
+ let(:client_message) { "Hi server!" }
28
+ let(:server_message) { "Hi client!" }
13
29
 
14
- context 'websockets' do
15
- let(:example_host) { "www.example.com" }
16
- let(:example_path) { "/example"}
17
- let(:example_url) { "ws://#{example_host}#{example_path}" }
18
- let :handshake_headers do
19
- {
20
- "Host" => example_host,
21
- "Upgrade" => "websocket",
22
- "Connection" => "Upgrade",
23
- "Sec-WebSocket-Key" => "dGhlIHNhbXBsZSBub25jZQ==",
24
- "Origin" => "http://example.com",
25
- "Sec-WebSocket-Protocol" => "chat, superchat",
26
- "Sec-WebSocket-Version" => "13"
27
- }
30
+ it 'supports websockets' do
31
+ configuration.adapter_options[:websocket_handler] = proc do |socket|
32
+ socket.read.should eq client_message
33
+ socket << server_message
28
34
  end
29
- let(:client_message) { "Hi server!" }
30
- let(:server_message) { "Hi client!" }
31
-
32
- it 'supports websockets' do
33
- configuration.adapter_options[:websocket_handler] = proc do |socket|
34
- socket.read.should eq client_message
35
- socket << server_message
36
- end
37
35
 
38
- reel_server(adapter) do |client|
39
- client << WebSocket::ClientHandshake.new(:get, example_url, handshake_headers).to_data
36
+ reel_server(adapter) do |client|
37
+ client << WebSocket::ClientHandshake.new(:get, example_url, handshake_headers).to_data
40
38
 
41
- # Discard handshake response
42
- # FIXME: hax
43
- client.readpartial(4096)
39
+ # Discard handshake response
40
+ # FIXME: hax
41
+ client.readpartial(4096)
44
42
 
45
- client << WebSocket::Message.new(client_message).to_data
46
- parser = WebSocket::Parser.new
47
- parser.append client.readpartial(4096) until message = parser.next_message
43
+ client << WebSocket::Message.new(client_message).to_data
44
+ parser = WebSocket::Parser.new
45
+ parser.append client.readpartial(4096) until message = parser.next_message
48
46
 
49
- message.should eq server_message
50
- end
47
+ message.should eq server_message
51
48
  end
52
49
  end
50
+ end
53
51
 
54
- def reel_server(adptr = adapter)
55
- thread = Thread.new { adptr.run }
56
- begin
57
- timeout(5) do
52
+ def reel_server(adptr = adapter)
53
+ thread = Thread.new { adptr.run }
54
+ begin
55
+ timeout(5) do
56
+ begin
57
+ sock = TCPSocket.new(adptr.configuration.ip, adptr.configuration.port)
58
58
  begin
59
- sock = TCPSocket.new(adptr.configuration.ip, adptr.configuration.port)
60
- begin
61
- yield(sock)
62
- ensure
63
- sock.close
64
- end
65
- rescue Errno::ECONNREFUSED
66
- Thread.pass
67
- retry
59
+ yield(sock)
60
+ ensure
61
+ sock.close
68
62
  end
63
+ rescue Errno::ECONNREFUSED
64
+ Thread.pass
65
+ retry
69
66
  end
70
- ensure
71
- adptr.shutdown
72
67
  end
68
+ ensure
69
+ adptr.shutdown
73
70
  end
74
71
  end
75
72
  end
@@ -1,5 +1,5 @@
1
1
  require "spec_helper"
2
- require "support/adapter_lint"
2
+ require "webmachine/spec/adapter_lint"
3
3
 
4
4
  describe Webmachine::Adapters::WEBrick do
5
5
  it_should_behave_like :adapter_lint do
@@ -11,6 +11,15 @@ describe Webmachine::Decision::Flow do
11
11
  let(:default_resource) { resource_with }
12
12
  let(:missing_resource) { missing_resource_with }
13
13
 
14
+ # http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.18:
15
+ # Origin servers MUST include a Date header field in all responses
16
+ # ... [except 1xx or 5xx]
17
+ after(:each) do
18
+ unless response.code < 200 || response.code >= 500
19
+ response.headers.should have_key('Date')
20
+ end
21
+ end
22
+
14
23
  def resource_with(&block)
15
24
  klass = Class.new(Webmachine::Resource) do
16
25
  def to_html; "test resource"; end
@@ -944,7 +953,7 @@ describe Webmachine::Decision::Flow do
944
953
  true
945
954
  end
946
955
  def delete_completed?; true; end
947
- def allowed_methods; %{GET HEAD PUT POST DELETE}; end
956
+ def allowed_methods; %W{GET HEAD PUT POST DELETE}; end
948
957
  def resource_exists?; @exist; end
949
958
  def allow_missing_post?; true; end
950
959
  def content_types_accepted; [[request.content_type, :accept_all]]; end
@@ -1067,7 +1076,6 @@ describe Webmachine::Decision::Flow do
1067
1076
  resource_with do
1068
1077
  def handle_exception(e)
1069
1078
  response.body = "error"
1070
- 501
1071
1079
  end
1072
1080
 
1073
1081
  def to_html
@@ -1081,12 +1089,10 @@ describe Webmachine::Decision::Flow do
1081
1089
  response.body.should == "error"
1082
1090
  end
1083
1091
 
1084
- it "uses the return value as a response code." do
1092
+ it "sets the response code to 500" do
1085
1093
  subject.run
1086
- response.code.should == 501
1094
+ response.code.should == 500
1087
1095
  end
1088
1096
  end
1089
1097
  end
1090
-
1091
-
1092
1098
  end
@@ -69,4 +69,11 @@ describe Webmachine::Dispatcher do
69
69
  fsm.should_receive(:run)
70
70
  dispatcher.dispatch(request, response)
71
71
  end
72
+
73
+ it "should respond with valid resource missing response for request to non-existing route" do
74
+ dispatcher.dispatch(request, response)
75
+ response.code.should eq(404)
76
+ response.body.should_not be_empty
77
+ response.headers.should have_key('Content-Length')
78
+ end
72
79
  end
@@ -47,6 +47,13 @@ describe Webmachine::MediaType do
47
47
  type.params.should == {"boundary" => "----------------------------2c46a7bec2b9", "charset" => "UTF-8"}
48
48
  end
49
49
 
50
+ it "should parse a type/params pair where type has single-token params" do
51
+ type = described_class.parse(["text/html;q=1;rdfa", {"charset" => "UTF-8"}])
52
+ type.should be_kind_of(described_class)
53
+ type.type.should == "text/html"
54
+ type.params.should == {"q" => "1", "rdfa" => "", "charset" => "UTF-8"}
55
+ end
56
+
50
57
  it "should raise an error when given an invalid type/params pair" do
51
58
  expect {
52
59
  described_class.parse([false, "blah"])
data/webmachine.gemspec CHANGED
@@ -13,6 +13,7 @@ Gem::Specification.new do |gem|
13
13
  gem.homepage = "http://github.com/seancribbs/webmachine-ruby"
14
14
  gem.authors = ["Sean Cribbs"]
15
15
  gem.email = ["sean@basho.com"]
16
+ gem.license = "Apache 2.0"
16
17
 
17
18
  gem.add_runtime_dependency(%q<i18n>, [">= 0.4.0"])
18
19
  gem.add_runtime_dependency(%q<multi_json>)
@@ -25,6 +26,4 @@ Gem::Specification.new do |gem|
25
26
  ignores = File.read(".gitignore").split(/\r?\n/).reject{ |f| f =~ /^(#.+|\s*)$/ }.map {|f| Dir[f] }.flatten
26
27
  gem.files = (Dir['**/*','.gitignore'] - ignores).reject {|f| !File.file?(f) }
27
28
  gem.test_files = (Dir['spec/**/*','features/**/*','.gitignore'] - ignores).reject {|f| !File.file?(f) }
28
- gem.executables = Dir['bin/*'].map { |f| File.basename(f) }
29
- gem.require_paths = ['lib']
30
29
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: webmachine
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.2.2
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: 2013-09-07 00:00:00.000000000 Z
12
+ date: 2014-01-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: i18n
@@ -129,25 +129,7 @@ description: ! ' webmachine is a toolkit for building HTTP applications in a dec
129
129
  its opinionated nature about HTTP. '
130
130
  email:
131
131
  - sean@basho.com
132
- executables:
133
- - autospec
134
- - coderay
135
- - gpgen
136
- - guard
137
- - hatetepe
138
- - htmldiff
139
- - ldiff
140
- - mongrel_rails
141
- - pry
142
- - rackup
143
- - rake
144
- - redcarpet
145
- - reel
146
- - rspec
147
- - thor
148
- - yard
149
- - yardoc
150
- - yri
132
+ executables: []
151
133
  extensions: []
152
134
  extra_rdoc_files: []
153
135
  files:
@@ -169,6 +151,7 @@ files:
169
151
  - bin/yard
170
152
  - bin/yardoc
171
153
  - bin/yri
154
+ - CHANGELOG.md
172
155
  - doc/_index.html
173
156
  - doc/class_list.html
174
157
  - doc/css/common.css
@@ -270,6 +253,7 @@ files:
270
253
  - lib/webmachine/decision/fsm.rb
271
254
  - lib/webmachine/decision/helpers.rb
272
255
  - lib/webmachine/decision.rb
256
+ - lib/webmachine/dispatcher/not_found_resource.rb
273
257
  - lib/webmachine/dispatcher/route.rb
274
258
  - lib/webmachine/dispatcher.rb
275
259
  - lib/webmachine/errors.rb
@@ -289,6 +273,8 @@ files:
289
273
  - lib/webmachine/resource/tracing.rb
290
274
  - lib/webmachine/resource.rb
291
275
  - lib/webmachine/response.rb
276
+ - lib/webmachine/spec/adapter_lint.rb
277
+ - lib/webmachine/spec/test_resource.rb
292
278
  - lib/webmachine/streaming/callable_encoder.rb
293
279
  - lib/webmachine/streaming/encoder.rb
294
280
  - lib/webmachine/streaming/enumerable_encoder.rb
@@ -313,8 +299,6 @@ files:
313
299
  - Rakefile
314
300
  - README.md
315
301
  - spec/spec_helper.rb
316
- - spec/support/adapter_lint.rb
317
- - spec/support/test_resource.rb
318
302
  - spec/webmachine/adapter_spec.rb
319
303
  - spec/webmachine/adapters/hatetepe_spec.rb
320
304
  - spec/webmachine/adapters/mongrel_spec.rb
@@ -347,7 +331,8 @@ files:
347
331
  - webmachine.gemspec
348
332
  - .gitignore
349
333
  homepage: http://github.com/seancribbs/webmachine-ruby
350
- licenses: []
334
+ licenses:
335
+ - Apache 2.0
351
336
  post_install_message:
352
337
  rdoc_options: []
353
338
  require_paths:
@@ -372,8 +357,6 @@ specification_version: 3
372
357
  summary: webmachine is a toolkit for building HTTP applications,
373
358
  test_files:
374
359
  - spec/spec_helper.rb
375
- - spec/support/adapter_lint.rb
376
- - spec/support/test_resource.rb
377
360
  - spec/webmachine/adapter_spec.rb
378
361
  - spec/webmachine/adapters/hatetepe_spec.rb
379
362
  - spec/webmachine/adapters/mongrel_spec.rb