webmachine 0.4.2 → 1.0.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.
- data/README.md +70 -7
- data/Rakefile +19 -0
- data/examples/debugger.rb +32 -0
- data/examples/webrick.rb +6 -2
- data/lib/webmachine.rb +2 -0
- data/lib/webmachine/adapters/rack.rb +16 -3
- data/lib/webmachine/adapters/webrick.rb +7 -1
- data/lib/webmachine/application.rb +10 -10
- data/lib/webmachine/cookie.rb +168 -0
- data/lib/webmachine/decision/conneg.rb +1 -1
- data/lib/webmachine/decision/flow.rb +1 -1
- data/lib/webmachine/decision/fsm.rb +19 -12
- data/lib/webmachine/decision/helpers.rb +25 -1
- data/lib/webmachine/dispatcher.rb +34 -5
- data/lib/webmachine/dispatcher/route.rb +2 -0
- data/lib/webmachine/media_type.rb +3 -3
- data/lib/webmachine/request.rb +11 -0
- data/lib/webmachine/resource.rb +3 -1
- data/lib/webmachine/resource/authentication.rb +1 -1
- data/lib/webmachine/resource/callbacks.rb +16 -0
- data/lib/webmachine/resource/tracing.rb +20 -0
- data/lib/webmachine/response.rb +38 -8
- data/lib/webmachine/trace.rb +74 -0
- data/lib/webmachine/trace/fsm.rb +60 -0
- data/lib/webmachine/trace/pstore_trace_store.rb +39 -0
- data/lib/webmachine/trace/resource_proxy.rb +107 -0
- data/lib/webmachine/trace/static/http-headers-status-v3.png +0 -0
- data/lib/webmachine/trace/static/trace.erb +54 -0
- data/lib/webmachine/trace/static/tracelist.erb +14 -0
- data/lib/webmachine/trace/static/wmtrace.css +123 -0
- data/lib/webmachine/trace/static/wmtrace.js +725 -0
- data/lib/webmachine/trace/trace_resource.rb +129 -0
- data/lib/webmachine/version.rb +1 -1
- data/spec/spec_helper.rb +19 -0
- data/spec/webmachine/adapters/rack_spec.rb +77 -41
- data/spec/webmachine/configuration_spec.rb +1 -1
- data/spec/webmachine/cookie_spec.rb +99 -0
- data/spec/webmachine/decision/conneg_spec.rb +9 -8
- data/spec/webmachine/decision/flow_spec.rb +52 -4
- data/spec/webmachine/decision/helpers_spec.rb +36 -6
- data/spec/webmachine/dispatcher_spec.rb +1 -1
- data/spec/webmachine/headers_spec.rb +1 -1
- data/spec/webmachine/media_type_spec.rb +1 -1
- data/spec/webmachine/request_spec.rb +10 -0
- data/spec/webmachine/resource/authentication_spec.rb +3 -3
- data/spec/webmachine/response_spec.rb +45 -0
- data/spec/webmachine/trace/fsm_spec.rb +32 -0
- data/spec/webmachine/trace/resource_proxy_spec.rb +36 -0
- data/spec/webmachine/trace/trace_store_spec.rb +29 -0
- data/spec/webmachine/trace_spec.rb +17 -0
- data/webmachine.gemspec +2 -0
- metadata +130 -15
@@ -1,13 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Webmachine::Decision::Conneg do
|
4
|
-
|
5
|
-
let(:response) { Webmachine::Response.new }
|
6
|
-
let(:resource) do
|
7
|
-
Class.new(Webmachine::Resource) do
|
8
|
-
def to_html; "hello world!"; end
|
9
|
-
end
|
10
|
-
end
|
4
|
+
include_context "default resource"
|
11
5
|
|
12
6
|
subject do
|
13
7
|
Webmachine::Decision::FSM.new(resource, request, response)
|
@@ -33,7 +27,7 @@ describe Webmachine::Decision::Conneg do
|
|
33
27
|
"text/html;charset=iso8859-1, application/xml").
|
34
28
|
should == "text/html;charset=iso8859-1"
|
35
29
|
end
|
36
|
-
|
30
|
+
|
37
31
|
it "should choose a type more specific than requested when an exact match is not present" do
|
38
32
|
subject.choose_media_type(["application/json;v=3;foo=bar", "application/json;v=2"],
|
39
33
|
"text/html, application/json").
|
@@ -74,6 +68,13 @@ describe Webmachine::Decision::Conneg do
|
|
74
68
|
response.headers['Content-Encoding'].should == 'gzip'
|
75
69
|
end
|
76
70
|
|
71
|
+
it "should choose the first acceptable encoding" \
|
72
|
+
", even when no white space after comma" do
|
73
|
+
subject.choose_encoding({"gzip" => :encode_gzip}, "identity,gzip")
|
74
|
+
subject.metadata['Content-Encoding'].should == 'gzip'
|
75
|
+
response.headers['Content-Encoding'].should == 'gzip'
|
76
|
+
end
|
77
|
+
|
77
78
|
it "should choose the preferred encoding over less-preferred encodings" do
|
78
79
|
subject.choose_encoding({"gzip" => :encode_gzip, "identity" => :encode_identity}, "gzip, identity;q=0.7")
|
79
80
|
subject.metadata['Content-Encoding'].should == 'gzip'
|
@@ -922,7 +922,7 @@ describe Webmachine::Decision::Flow do
|
|
922
922
|
# commented for now.
|
923
923
|
# describe "#n16 (POST?)" do it; end
|
924
924
|
# describe "#o16 (PUT?)" do it; end
|
925
|
-
|
925
|
+
|
926
926
|
describe "#o18 (Multiple representations?)" do
|
927
927
|
let(:resource) do
|
928
928
|
resource_with do
|
@@ -947,7 +947,7 @@ describe Webmachine::Decision::Flow do
|
|
947
947
|
end
|
948
948
|
end
|
949
949
|
end
|
950
|
-
|
950
|
+
|
951
951
|
[["GET", true],["HEAD", true],["PUT", true],["PUT", false],["POST",true],["POST",false],
|
952
952
|
["DELETE", true]].each do |m, e|
|
953
953
|
context "when the method is #{m} and the resource #{e ? 'exists' : 'does not exist' }" do
|
@@ -970,7 +970,7 @@ describe Webmachine::Decision::Flow do
|
|
970
970
|
end
|
971
971
|
end
|
972
972
|
end
|
973
|
-
|
973
|
+
|
974
974
|
describe "#o20 (Response has entity?)" do
|
975
975
|
let(:resource) do
|
976
976
|
resource_with do
|
@@ -1024,9 +1024,57 @@ describe Webmachine::Decision::Flow do
|
|
1024
1024
|
resource.exist = e
|
1025
1025
|
subject.run
|
1026
1026
|
response.code.should == 204
|
1027
|
-
response.trace.last.should == :o20
|
1028
1027
|
end
|
1029
1028
|
end
|
1030
1029
|
end
|
1031
1030
|
end
|
1031
|
+
|
1032
|
+
describe "On exception" do
|
1033
|
+
context "handle_exception is inherited." do
|
1034
|
+
let :resource do
|
1035
|
+
resource_with do
|
1036
|
+
def to_html
|
1037
|
+
raise
|
1038
|
+
end
|
1039
|
+
end
|
1040
|
+
end
|
1041
|
+
|
1042
|
+
it "calls handle_exception" do
|
1043
|
+
resource.should_receive(:handle_exception).with instance_of(RuntimeError)
|
1044
|
+
subject.run
|
1045
|
+
end
|
1046
|
+
|
1047
|
+
it "sets the response code to 500" do
|
1048
|
+
subject.run
|
1049
|
+
response.code.should == 500
|
1050
|
+
end
|
1051
|
+
end
|
1052
|
+
|
1053
|
+
context "handle_exception is defined" do
|
1054
|
+
let :resource do
|
1055
|
+
resource_with do
|
1056
|
+
def handle_exception(e)
|
1057
|
+
response.body = "error"
|
1058
|
+
501
|
1059
|
+
end
|
1060
|
+
|
1061
|
+
def to_html
|
1062
|
+
raise
|
1063
|
+
end
|
1064
|
+
end
|
1065
|
+
end
|
1066
|
+
|
1067
|
+
it "can define a response body" do
|
1068
|
+
subject.run
|
1069
|
+
response.body.should == "error"
|
1070
|
+
end
|
1071
|
+
|
1072
|
+
it "uses the return value as a response code." do
|
1073
|
+
subject.run
|
1074
|
+
response.code.should == 501
|
1075
|
+
end
|
1076
|
+
end
|
1077
|
+
end
|
1078
|
+
|
1079
|
+
|
1032
1080
|
end
|
@@ -1,13 +1,8 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Webmachine::Decision::Helpers do
|
4
|
+
include_context "default resource"
|
4
5
|
subject { Webmachine::Decision::FSM.new(resource, request, response) }
|
5
|
-
let(:method) { 'GET' }
|
6
|
-
let(:uri) { URI.parse('http://localhost/') }
|
7
|
-
let(:headers) { Webmachine::Headers.new }
|
8
|
-
let(:body) { '' }
|
9
|
-
let(:request) { Webmachine::Request.new(method, uri, headers, body) }
|
10
|
-
let(:response) { Webmachine::Response.new }
|
11
6
|
|
12
7
|
def resource_with(&block)
|
13
8
|
klass = Class.new(Webmachine::Resource) do
|
@@ -51,6 +46,41 @@ describe Webmachine::Decision::Helpers do
|
|
51
46
|
end
|
52
47
|
end
|
53
48
|
|
49
|
+
context "setting the Content-Length header when responding" do
|
50
|
+
[204, 304].each do |code|
|
51
|
+
it "removes the header for entity-less response code #{code}" do
|
52
|
+
response.headers['Content-Length'] = '0'
|
53
|
+
response.body = nil
|
54
|
+
subject.send :respond, code
|
55
|
+
response.headers.should_not include 'Content-Length'
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
(200..599).each do |code|
|
60
|
+
# 204 and 304 have no bodies, 404 is set to a default non-zero
|
61
|
+
# response by Webmachine
|
62
|
+
next if code == 204 || code == 304 || code == 404
|
63
|
+
|
64
|
+
it "adds the header for response code #{code} that should include an entity but has an empty body" do
|
65
|
+
response.code = code
|
66
|
+
response.body = nil
|
67
|
+
subject.send :respond, code
|
68
|
+
response.headers['Content-Length'].should == '0'
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
(200..599).each do |code|
|
73
|
+
next if code == 204 || code == 304
|
74
|
+
|
75
|
+
it "does not add the header when Transfer-Encoding is set on code #{code}" do
|
76
|
+
response.headers['Transfer-Encoding'] = 'chunked'
|
77
|
+
response.body = []
|
78
|
+
subject.send :respond, code
|
79
|
+
response.headers.should_not include 'Content-Length'
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
54
84
|
describe "#encode_body" do
|
55
85
|
before { subject.run }
|
56
86
|
|
@@ -48,7 +48,7 @@ describe Webmachine::Dispatcher do
|
|
48
48
|
it "should apply route to request before creating the resource" do
|
49
49
|
route = dispatcher.add_route ["*"], resource
|
50
50
|
applied = false
|
51
|
-
|
51
|
+
|
52
52
|
route.should_receive(:apply) { applied = true }
|
53
53
|
resource.should_receive(:new) do
|
54
54
|
applied.should be_true
|
@@ -13,7 +13,7 @@ describe Webmachine::Headers do
|
|
13
13
|
headers["content-length"].should == 14
|
14
14
|
end
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
context "filtering with #grep" do
|
18
18
|
subject { described_class["content-type" => "text/plain", "etag" => '"abcdef1234567890"'] }
|
19
19
|
it "should filter keys by the given pattern" do
|
@@ -62,7 +62,7 @@ describe Webmachine::MediaType do
|
|
62
62
|
it { should_not be_exact_match("text/xml") }
|
63
63
|
it { should_not be_exact_match("application/xml") }
|
64
64
|
it { should_not be_exact_match("application/xml;version=1") }
|
65
|
-
|
65
|
+
|
66
66
|
it { should be_type_matches("application/xml") }
|
67
67
|
it { should be_type_matches("application/*") }
|
68
68
|
it { should be_type_matches("*/*") }
|
@@ -14,6 +14,16 @@ describe Webmachine::Request do
|
|
14
14
|
subject["accept"].should == "*/*"
|
15
15
|
end
|
16
16
|
|
17
|
+
it "should provide access to the cookies" do
|
18
|
+
subject.headers['Cookie'] = 'name=value;name2=value2';
|
19
|
+
subject.cookies.should == { 'name' => 'value', 'name2' => 'value2' }
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should handle cookies with extra whitespace" do
|
23
|
+
subject.headers['Cookie'] = 'name = value; name2 = value2';
|
24
|
+
subject.cookies.should == { 'name' => 'value', 'name2' => 'value2' }
|
25
|
+
end
|
26
|
+
|
17
27
|
it "should provide access to the headers via underscored methods" do
|
18
28
|
subject.headers["Accept-Encoding"] = "identity"
|
19
29
|
subject.accept_encoding.should == "identity"
|
@@ -27,7 +27,7 @@ describe Webmachine::Resource::Authentication do
|
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
context "when no authorization is sent by the client" do
|
32
32
|
it "should reply with a 401 Unauthorized and a WWW-Authenticate header using Basic" do
|
33
33
|
subject.run
|
@@ -46,12 +46,12 @@ describe Webmachine::Resource::Authentication do
|
|
46
46
|
before do
|
47
47
|
headers['Authorization'] = "Basic " + ["invalid:auth"].pack('m*').chomp
|
48
48
|
end
|
49
|
-
|
49
|
+
|
50
50
|
it "should reply with a 401 Unauthorized and a WWW-Authenticate header using Basic" do
|
51
51
|
subject.run
|
52
52
|
response.code.should == 401
|
53
53
|
response.headers['WWW-Authenticate'].should == 'Basic realm="Webmachine"'
|
54
|
-
end
|
54
|
+
end
|
55
55
|
end
|
56
56
|
|
57
57
|
context "when the client sends valid authorization" do
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Webmachine::Response do
|
4
|
+
|
5
|
+
it "should have sane default values" do
|
6
|
+
subject.code.should == 200
|
7
|
+
subject.is_redirect?.should be_false
|
8
|
+
subject.headers.should be_empty
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "a redirected response" do
|
12
|
+
let(:redirect_url) { "/" }
|
13
|
+
|
14
|
+
before(:all) { subject.redirect_to redirect_url }
|
15
|
+
|
16
|
+
its(:is_redirect?) { should be_true }
|
17
|
+
|
18
|
+
it "should have a proper Location header" do
|
19
|
+
subject.headers["Location"].should == redirect_url
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe "setting a cookie" do
|
24
|
+
let(:cookie) { "monster" }
|
25
|
+
let(:cookie_value) { "mash" }
|
26
|
+
|
27
|
+
before(:all) { subject.set_cookie(cookie, cookie_value) }
|
28
|
+
|
29
|
+
it "should have a proper Set-Cookie header" do
|
30
|
+
subject.headers["Set-Cookie"].should include "monster=mash";
|
31
|
+
end
|
32
|
+
|
33
|
+
describe "setting multiple cookies" do
|
34
|
+
let(:cookie2) { "rodeo" }
|
35
|
+
let(:cookie2_value) { "clown" }
|
36
|
+
before(:all) { subject.set_cookie(cookie2, cookie2_value) }
|
37
|
+
|
38
|
+
it "should have a proper Set-Cookie header" do
|
39
|
+
subject.headers["Set-Cookie"].should be_a Array
|
40
|
+
subject.headers["Set-Cookie"].should include "rodeo=clown"
|
41
|
+
subject.headers["Set-Cookie"].should include "monster=mash"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Webmachine::Trace::FSM do
|
4
|
+
include_context "default resource"
|
5
|
+
|
6
|
+
subject { Webmachine::Decision::FSM.new(resource, request, response) }
|
7
|
+
before { Webmachine::Trace.trace_store = :memory }
|
8
|
+
|
9
|
+
context "when tracing is enabled" do
|
10
|
+
before { Webmachine::Trace.stub!(:trace?).and_return(true) }
|
11
|
+
|
12
|
+
it "proxies the resource" do
|
13
|
+
subject.resource.should be_kind_of(Webmachine::Trace::ResourceProxy)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "records a trace" do
|
17
|
+
subject.run
|
18
|
+
response.trace.should_not be_empty
|
19
|
+
Webmachine::Trace.traces.should have(1).item
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context "when tracing is disabled" do
|
24
|
+
before { Webmachine::Trace.stub!(:trace?).and_return(false) }
|
25
|
+
|
26
|
+
it "leaves no trace" do
|
27
|
+
subject.run
|
28
|
+
response.trace.should be_empty
|
29
|
+
Webmachine::Trace.traces.should be_empty
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'webmachine/trace/resource_proxy'
|
3
|
+
|
4
|
+
describe Webmachine::Trace::ResourceProxy do
|
5
|
+
include_context "default resource"
|
6
|
+
subject { described_class.new(resource) }
|
7
|
+
|
8
|
+
it "duck-types all callback methods" do
|
9
|
+
Webmachine::Resource::Callbacks.instance_methods(false).each do |m|
|
10
|
+
subject.should respond_to(m)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
it "logs invocations of callbacks" do
|
15
|
+
subject.generate_etag
|
16
|
+
response.trace.should == [{:type => :attempt, :name => "(default)#generate_etag"},
|
17
|
+
{:type => :result, :value => nil}]
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
it "logs invocations of body-producing methods" do
|
22
|
+
subject.content_types_provided.should == [["text/html", :to_html]]
|
23
|
+
subject.to_html
|
24
|
+
response.trace[-2][:type].should == :attempt
|
25
|
+
response.trace[-2][:name].should =~ /to_html$/
|
26
|
+
response.trace[-2][:source].should include("spec_helper.rb") if response.trace[-2][:source]
|
27
|
+
response.trace[-1].should == {:type => :result, :value => "<html><body>Hello, world!</body></html>"}
|
28
|
+
end
|
29
|
+
|
30
|
+
it "commits the trace to separate storage when the request has finished processing" do
|
31
|
+
Webmachine::Trace.should_receive(:record).with(subject.object_id.to_s, [{:type=>:attempt, :name=>"(default)#finish_request"},
|
32
|
+
{:type=>:result, :value=>nil}]).and_return(true)
|
33
|
+
subject.finish_request
|
34
|
+
response.headers["X-Webmachine-Trace-Id"].should == subject.object_id.to_s
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
shared_examples_for "trace storage" do
|
5
|
+
it { should respond_to(:[]=) }
|
6
|
+
it { should respond_to(:keys) }
|
7
|
+
it { should respond_to(:fetch) }
|
8
|
+
|
9
|
+
it "stores a trace" do
|
10
|
+
subject["foo"] = [:bar]
|
11
|
+
subject.fetch("foo").should == [:bar]
|
12
|
+
end
|
13
|
+
|
14
|
+
it "lists a stored trace in the keys" do
|
15
|
+
subject["foo"] = [:bar]
|
16
|
+
subject.keys.should == ["foo"]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe Webmachine::Trace::PStoreTraceStore do
|
21
|
+
subject { described_class.new("./wmtrace") }
|
22
|
+
after { FileUtils.rm_rf("./wmtrace") }
|
23
|
+
it_behaves_like "trace storage"
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "Webmachine::Trace :memory Trace Store (Hash)" do
|
27
|
+
subject { Hash.new }
|
28
|
+
it_behaves_like "trace storage"
|
29
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Webmachine::Trace do
|
4
|
+
subject { described_class }
|
5
|
+
|
6
|
+
context "determining whether the resource should be traced" do
|
7
|
+
include_context "default resource"
|
8
|
+
it "does not trace by default" do
|
9
|
+
subject.trace?(resource).should be_false
|
10
|
+
end
|
11
|
+
|
12
|
+
it "traces when the resource enables tracing" do
|
13
|
+
resource.should_receive(:trace?).and_return(true)
|
14
|
+
subject.trace?(resource).should be_true
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/webmachine.gemspec
CHANGED
@@ -15,11 +15,13 @@ Gem::Specification.new do |gem|
|
|
15
15
|
gem.email = ["sean@basho.com"]
|
16
16
|
|
17
17
|
gem.add_runtime_dependency(%q<i18n>, [">= 0.4.0"])
|
18
|
+
gem.add_runtime_dependency(%q<multi_json>)
|
18
19
|
gem.add_development_dependency(%q<rspec>, ["~> 2.8.0"])
|
19
20
|
gem.add_development_dependency(%q<yard>, ["~> 0.7.3"])
|
20
21
|
gem.add_development_dependency(%q<rake>)
|
21
22
|
gem.add_development_dependency(%q<mongrel>, ['~>1.2.beta'])
|
22
23
|
gem.add_development_dependency(%q<rack>)
|
24
|
+
gem.add_development_dependency(%q<rack-test>)
|
23
25
|
|
24
26
|
ignores = File.read(".gitignore").split(/\r?\n/).reject{ |f| f =~ /^(#.+|\s*)$/ }.map {|f| Dir[f] }.flatten
|
25
27
|
gem.files = (Dir['**/*','.gitignore'] - ignores).reject {|f| !File.file?(f) }
|
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: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-07-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: i18n
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,31 @@ dependencies:
|
|
21
21
|
version: 0.4.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.4.0
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: multi_json
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
25
46
|
- !ruby/object:Gem::Dependency
|
26
47
|
name: rspec
|
27
|
-
requirement:
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
28
49
|
none: false
|
29
50
|
requirements:
|
30
51
|
- - ~>
|
@@ -32,10 +53,15 @@ dependencies:
|
|
32
53
|
version: 2.8.0
|
33
54
|
type: :development
|
34
55
|
prerelease: false
|
35
|
-
version_requirements:
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 2.8.0
|
36
62
|
- !ruby/object:Gem::Dependency
|
37
63
|
name: yard
|
38
|
-
requirement:
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
39
65
|
none: false
|
40
66
|
requirements:
|
41
67
|
- - ~>
|
@@ -43,10 +69,15 @@ dependencies:
|
|
43
69
|
version: 0.7.3
|
44
70
|
type: :development
|
45
71
|
prerelease: false
|
46
|
-
version_requirements:
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 0.7.3
|
47
78
|
- !ruby/object:Gem::Dependency
|
48
79
|
name: rake
|
49
|
-
requirement:
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
50
81
|
none: false
|
51
82
|
requirements:
|
52
83
|
- - ! '>='
|
@@ -54,10 +85,15 @@ dependencies:
|
|
54
85
|
version: '0'
|
55
86
|
type: :development
|
56
87
|
prerelease: false
|
57
|
-
version_requirements:
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
58
94
|
- !ruby/object:Gem::Dependency
|
59
95
|
name: mongrel
|
60
|
-
requirement:
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
61
97
|
none: false
|
62
98
|
requirements:
|
63
99
|
- - ~>
|
@@ -65,10 +101,31 @@ dependencies:
|
|
65
101
|
version: 1.2.beta
|
66
102
|
type: :development
|
67
103
|
prerelease: false
|
68
|
-
version_requirements:
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ~>
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 1.2.beta
|
69
110
|
- !ruby/object:Gem::Dependency
|
70
111
|
name: rack
|
71
|
-
requirement:
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: rack-test
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
72
129
|
none: false
|
73
130
|
requirements:
|
74
131
|
- - ! '>='
|
@@ -76,7 +133,12 @@ dependencies:
|
|
76
133
|
version: '0'
|
77
134
|
type: :development
|
78
135
|
prerelease: false
|
79
|
-
version_requirements:
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ! '>='
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: '0'
|
80
142
|
description: ! ' webmachine is a toolkit for building HTTP applications in a declarative
|
81
143
|
fashion, that avoids the confusion of going through a CGI-style interface like Rack.
|
82
144
|
It is strongly influenced by the original Erlang project of the same name and shares
|
@@ -100,12 +162,30 @@ files:
|
|
100
162
|
- doc/js/full_list.js
|
101
163
|
- doc/js/jquery.js
|
102
164
|
- doc/method_list.html
|
165
|
+
- doc/top-level-namespace.html
|
103
166
|
- doc/Webmachine/Adapter.html
|
167
|
+
- doc/Webmachine/Adapters/Mongrel/Handler.html
|
168
|
+
- doc/Webmachine/Adapters/Mongrel/RequestBody.html
|
169
|
+
- doc/Webmachine/Adapters/Mongrel.html
|
170
|
+
- doc/Webmachine/Adapters/Rack/RequestBody.html
|
171
|
+
- doc/Webmachine/Adapters/Rack.html
|
172
|
+
- doc/Webmachine/Adapters/WEBrick/RequestBody.html
|
173
|
+
- doc/Webmachine/Adapters/WEBrick/Server.html
|
174
|
+
- doc/Webmachine/Adapters/WEBrick.html
|
104
175
|
- doc/Webmachine/Adapters.html
|
105
176
|
- doc/Webmachine/Application.html
|
106
177
|
- doc/Webmachine/CallableEncoder.html
|
107
178
|
- doc/Webmachine/ChunkedBody.html
|
179
|
+
- doc/Webmachine/Configuration.html
|
180
|
+
- doc/Webmachine/Cookie.html
|
181
|
+
- doc/Webmachine/Decision/Conneg/MediaTypeList.html
|
182
|
+
- doc/Webmachine/Decision/Conneg/PriorityList.html
|
183
|
+
- doc/Webmachine/Decision/Conneg.html
|
184
|
+
- doc/Webmachine/Decision/Flow.html
|
185
|
+
- doc/Webmachine/Decision/FSM.html
|
186
|
+
- doc/Webmachine/Decision/Helpers.html
|
108
187
|
- doc/Webmachine/Decision.html
|
188
|
+
- doc/Webmachine/Dispatcher/Route.html
|
109
189
|
- doc/Webmachine/Dispatcher.html
|
110
190
|
- doc/Webmachine/EnumerableEncoder.html
|
111
191
|
- doc/Webmachine/Error.html
|
@@ -115,12 +195,23 @@ files:
|
|
115
195
|
- doc/Webmachine/MalformedRequest.html
|
116
196
|
- doc/Webmachine/MediaType.html
|
117
197
|
- doc/Webmachine/Request.html
|
198
|
+
- doc/Webmachine/Resource/Authentication.html
|
199
|
+
- doc/Webmachine/Resource/Callbacks.html
|
200
|
+
- doc/Webmachine/Resource/Encodings.html
|
118
201
|
- doc/Webmachine/Resource.html
|
202
|
+
- doc/Webmachine/Response/HeaderHash.html
|
119
203
|
- doc/Webmachine/Response.html
|
120
204
|
- doc/Webmachine/StreamingEncoder.html
|
205
|
+
- doc/Webmachine/Trace/Call.html
|
206
|
+
- doc/Webmachine/Trace/PStoreTraceStore.html
|
207
|
+
- doc/Webmachine/Trace/ResourceProxy.html
|
208
|
+
- doc/Webmachine/Trace/TraceResource.html
|
209
|
+
- doc/Webmachine/Trace/Wrapper.html
|
210
|
+
- doc/Webmachine/Trace.html
|
121
211
|
- doc/Webmachine/Translation.html
|
122
212
|
- doc/Webmachine.html
|
123
213
|
- examples/application.rb
|
214
|
+
- examples/debugger.rb
|
124
215
|
- examples/webrick.rb
|
125
216
|
- Gemfile
|
126
217
|
- Guardfile
|
@@ -132,6 +223,7 @@ files:
|
|
132
223
|
- lib/webmachine/application.rb
|
133
224
|
- lib/webmachine/chunked_body.rb
|
134
225
|
- lib/webmachine/configuration.rb
|
226
|
+
- lib/webmachine/cookie.rb
|
135
227
|
- lib/webmachine/decision/conneg.rb
|
136
228
|
- lib/webmachine/decision/flow.rb
|
137
229
|
- lib/webmachine/decision/fsm.rb
|
@@ -148,9 +240,20 @@ files:
|
|
148
240
|
- lib/webmachine/resource/authentication.rb
|
149
241
|
- lib/webmachine/resource/callbacks.rb
|
150
242
|
- lib/webmachine/resource/encodings.rb
|
243
|
+
- lib/webmachine/resource/tracing.rb
|
151
244
|
- lib/webmachine/resource.rb
|
152
245
|
- lib/webmachine/response.rb
|
153
246
|
- lib/webmachine/streaming.rb
|
247
|
+
- lib/webmachine/trace/fsm.rb
|
248
|
+
- lib/webmachine/trace/pstore_trace_store.rb
|
249
|
+
- lib/webmachine/trace/resource_proxy.rb
|
250
|
+
- lib/webmachine/trace/static/http-headers-status-v3.png
|
251
|
+
- lib/webmachine/trace/static/trace.erb
|
252
|
+
- lib/webmachine/trace/static/tracelist.erb
|
253
|
+
- lib/webmachine/trace/static/wmtrace.css
|
254
|
+
- lib/webmachine/trace/static/wmtrace.js
|
255
|
+
- lib/webmachine/trace/trace_resource.rb
|
256
|
+
- lib/webmachine/trace.rb
|
154
257
|
- lib/webmachine/translation.rb
|
155
258
|
- lib/webmachine/version.rb
|
156
259
|
- lib/webmachine.rb
|
@@ -165,6 +268,7 @@ files:
|
|
165
268
|
- spec/webmachine/application_spec.rb
|
166
269
|
- spec/webmachine/chunked_body_spec.rb
|
167
270
|
- spec/webmachine/configuration_spec.rb
|
271
|
+
- spec/webmachine/cookie_spec.rb
|
168
272
|
- spec/webmachine/decision/conneg_spec.rb
|
169
273
|
- spec/webmachine/decision/flow_spec.rb
|
170
274
|
- spec/webmachine/decision/helpers_spec.rb
|
@@ -175,6 +279,11 @@ files:
|
|
175
279
|
- spec/webmachine/media_type_spec.rb
|
176
280
|
- spec/webmachine/request_spec.rb
|
177
281
|
- spec/webmachine/resource/authentication_spec.rb
|
282
|
+
- spec/webmachine/response_spec.rb
|
283
|
+
- spec/webmachine/trace/fsm_spec.rb
|
284
|
+
- spec/webmachine/trace/resource_proxy_spec.rb
|
285
|
+
- spec/webmachine/trace/trace_store_spec.rb
|
286
|
+
- spec/webmachine/trace_spec.rb
|
178
287
|
- webmachine.gemspec
|
179
288
|
- .gitignore
|
180
289
|
homepage: http://github.com/seancribbs/webmachine-ruby
|
@@ -197,7 +306,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
197
306
|
version: '0'
|
198
307
|
requirements: []
|
199
308
|
rubyforge_project:
|
200
|
-
rubygems_version: 1.8.
|
309
|
+
rubygems_version: 1.8.23
|
201
310
|
signing_key:
|
202
311
|
specification_version: 3
|
203
312
|
summary: webmachine is a toolkit for building HTTP applications,
|
@@ -210,6 +319,7 @@ test_files:
|
|
210
319
|
- spec/webmachine/application_spec.rb
|
211
320
|
- spec/webmachine/chunked_body_spec.rb
|
212
321
|
- spec/webmachine/configuration_spec.rb
|
322
|
+
- spec/webmachine/cookie_spec.rb
|
213
323
|
- spec/webmachine/decision/conneg_spec.rb
|
214
324
|
- spec/webmachine/decision/flow_spec.rb
|
215
325
|
- spec/webmachine/decision/helpers_spec.rb
|
@@ -220,4 +330,9 @@ test_files:
|
|
220
330
|
- spec/webmachine/media_type_spec.rb
|
221
331
|
- spec/webmachine/request_spec.rb
|
222
332
|
- spec/webmachine/resource/authentication_spec.rb
|
333
|
+
- spec/webmachine/response_spec.rb
|
334
|
+
- spec/webmachine/trace/fsm_spec.rb
|
335
|
+
- spec/webmachine/trace/resource_proxy_spec.rb
|
336
|
+
- spec/webmachine/trace/trace_store_spec.rb
|
337
|
+
- spec/webmachine/trace_spec.rb
|
223
338
|
- .gitignore
|