relax 0.0.7 → 0.1.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/LICENSE +1 -1
- data/README +137 -114
- data/Rakefile +54 -0
- data/VERSION.yml +4 -0
- data/lib/relax/action.rb +39 -0
- data/lib/relax/context.rb +40 -0
- data/lib/relax/contextable.rb +15 -0
- data/lib/relax/endpoint.rb +21 -0
- data/lib/relax/instance.rb +23 -0
- data/lib/relax/parameter.rb +19 -0
- data/lib/relax/performer.rb +32 -0
- data/lib/relax/service.rb +19 -88
- data/lib/relax.rb +15 -10
- data/spec/relax/endpoint_spec.rb +69 -0
- data/spec/relax/integration_spec.rb +63 -0
- data/spec/relax/service_spec.rb +21 -0
- data/spec/services/flickr.rb +78 -0
- data/spec/spec_helper.rb +12 -0
- metadata +71 -30
- data/lib/relax/parsers/base.rb +0 -30
- data/lib/relax/parsers/factory.rb +0 -29
- data/lib/relax/parsers/hpricot.rb +0 -133
- data/lib/relax/parsers/rexml.rb +0 -147
- data/lib/relax/parsers.rb +0 -13
- data/lib/relax/query.rb +0 -46
- data/lib/relax/request.rb +0 -107
- data/lib/relax/response.rb +0 -82
- data/lib/relax/symbolic_hash.rb +0 -79
- data/spec/parsers/factory_spec.rb +0 -29
- data/spec/parsers/hpricot_spec.rb +0 -31
- data/spec/parsers/rexml_spec.rb +0 -36
- data/spec/query_spec.rb +0 -60
- data/spec/request_spec.rb +0 -114
- data/spec/response_spec.rb +0 -98
- data/spec/symbolic_hash_spec.rb +0 -67
data/spec/query_spec.rb
DELETED
@@ -1,60 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
-
|
3
|
-
require 'relax/query'
|
4
|
-
|
5
|
-
describe 'a query' do
|
6
|
-
before(:each) do
|
7
|
-
@uri = URI::parse('http://example.com/?action=search&query=keyword')
|
8
|
-
@query = Relax::Query.new
|
9
|
-
end
|
10
|
-
|
11
|
-
it 'should convert to a query string' do
|
12
|
-
@query[:action] = 'Search'
|
13
|
-
@query[:query] = 'strings'
|
14
|
-
@query.to_s.should eql('action=Search&query=strings')
|
15
|
-
end
|
16
|
-
|
17
|
-
it 'should convert its values to strings' do
|
18
|
-
date = Date.today
|
19
|
-
@query[:date] = date
|
20
|
-
@query.to_s.should eql("date=#{date.to_s}")
|
21
|
-
end
|
22
|
-
|
23
|
-
it 'should escape its values using "+" instead of "%20"' do
|
24
|
-
Relax::Query.send(:escape_value, 'two words').should == 'two+words'
|
25
|
-
end
|
26
|
-
|
27
|
-
it 'should sort its parameters' do
|
28
|
-
@query[:charlie] = 3
|
29
|
-
@query[:alpha] = 1
|
30
|
-
@query[:bravo] = 2
|
31
|
-
@query.to_s.should eql('alpha=1&bravo=2&charlie=3')
|
32
|
-
end
|
33
|
-
|
34
|
-
it 'should encode its parameter values' do
|
35
|
-
@query[:spaces] = 'two words'
|
36
|
-
@query[:url] = 'http://example.com/'
|
37
|
-
@query.to_s.should eql('spaces=two+words&url=http%3A%2F%2Fexample.com%2F')
|
38
|
-
end
|
39
|
-
|
40
|
-
it 'should be able to parse query strings' do
|
41
|
-
parsed_query = Relax::Query.parse(@uri)
|
42
|
-
parsed_query[:action].should eql('search')
|
43
|
-
parsed_query[:query].should eql('keyword')
|
44
|
-
end
|
45
|
-
|
46
|
-
it 'should parse key value pairs into only two parts' do
|
47
|
-
parsed_query = Relax::Query.parse(URI.parse("http://example.com/?action=test=&foo=bar"))
|
48
|
-
parsed_query[:action].should eql('test=')
|
49
|
-
end
|
50
|
-
|
51
|
-
it 'should unescape query string key-value pair keys' do
|
52
|
-
parsed_query = Relax::Query.parse(URI.parse("http://example.com/?action%20helper=test"))
|
53
|
-
parsed_query[:"action helper"].should eql('test')
|
54
|
-
end
|
55
|
-
|
56
|
-
it 'should unescape query string key-value pair values' do
|
57
|
-
parsed_query = Relax::Query.parse(URI.parse("http://example.com/?action=test%20action"))
|
58
|
-
parsed_query[:action].should eql('test action')
|
59
|
-
end
|
60
|
-
end
|
data/spec/request_spec.rb
DELETED
@@ -1,114 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
-
|
3
|
-
require 'relax/request'
|
4
|
-
|
5
|
-
class Amount < Relax::Request
|
6
|
-
parameter :amount
|
7
|
-
parameter :currency
|
8
|
-
end
|
9
|
-
|
10
|
-
class TestRequest < Relax::Request
|
11
|
-
parameter :action, :required => true
|
12
|
-
parameter :token_id
|
13
|
-
parameter :user_id
|
14
|
-
parameter :amount, :type => Amount
|
15
|
-
end
|
16
|
-
|
17
|
-
class ChildRequest < TestRequest
|
18
|
-
parameter :child_id
|
19
|
-
end
|
20
|
-
|
21
|
-
describe 'an option initialized request', :shared => true do
|
22
|
-
it 'should have its values set by the options hash' do
|
23
|
-
request = TestRequest.new(:action => 'FetchAll', :token_id => 123)
|
24
|
-
request.action.should eql('FetchAll')
|
25
|
-
request.token_id.should eql(123)
|
26
|
-
request.user_id.should be_nil
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
describe 'a request that converts to a query', :shared => true do
|
31
|
-
before(:each) do
|
32
|
-
@query = TestRequest.new(:action => 'Search', :token_id => 123).to_query
|
33
|
-
end
|
34
|
-
|
35
|
-
it 'should include its parameters in the query' do
|
36
|
-
@query[:action].should eql('Search')
|
37
|
-
@query[:token_id].should eql('123')
|
38
|
-
@query[:user_id].should be_nil
|
39
|
-
@query[:amount].should be_nil
|
40
|
-
end
|
41
|
-
|
42
|
-
it 'should only include parameters in the query if they are set' do
|
43
|
-
@query.key?(:action).should be_true
|
44
|
-
@query.key?(:token_id).should be_true
|
45
|
-
@query.key?(:user_id).should be_false
|
46
|
-
@query.key?(:amount).should be_false
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
describe 'a normal request' do
|
51
|
-
it_should_behave_like 'a request that converts to a query'
|
52
|
-
it_should_behave_like 'an option initialized request'
|
53
|
-
|
54
|
-
it 'should raise an exception if a required parameter is missing' do
|
55
|
-
lambda {
|
56
|
-
TestRequest.new(:token_id => 123).valid?
|
57
|
-
}.should raise_error(Relax::MissingParameter)
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
describe 'a template request' do
|
62
|
-
it_should_behave_like 'a request that converts to a query'
|
63
|
-
it_should_behave_like 'an option initialized request'
|
64
|
-
|
65
|
-
before(:each) do
|
66
|
-
# this syntax may need to go away unless we can find a way to make it work
|
67
|
-
TestRequest[:api_key] = '123456'
|
68
|
-
TestRequest[:secret] = 'shhh!'
|
69
|
-
end
|
70
|
-
|
71
|
-
it 'should always have the template values in its query' do
|
72
|
-
request = TestRequest.new
|
73
|
-
request.api_key.should eql('123456')
|
74
|
-
request.secret.should eql('shhh!')
|
75
|
-
end
|
76
|
-
|
77
|
-
it 'should allow its template variables to be overridden' do
|
78
|
-
request = TestRequest.new(:secret => 'abracadabra')
|
79
|
-
request.api_key.should eql('123456')
|
80
|
-
request.secret.should eql('abracadabra')
|
81
|
-
end
|
82
|
-
|
83
|
-
it 'should pass its template on to its children' do
|
84
|
-
request = ChildRequest.new
|
85
|
-
request.api_key.should eql('123456')
|
86
|
-
request.secret.should eql('shhh!')
|
87
|
-
end
|
88
|
-
|
89
|
-
it 'should allow template parameters on its children that are additive' do
|
90
|
-
ChildRequest[:query] = '1a2b3c'
|
91
|
-
child = ChildRequest.new
|
92
|
-
child.api_key.should eql('123456')
|
93
|
-
child.secret.should eql('shhh!')
|
94
|
-
child.query.should eql('1a2b3c')
|
95
|
-
|
96
|
-
parent = TestRequest.new
|
97
|
-
parent.api_key.should eql('123456')
|
98
|
-
parent.secret.should eql('shhh!')
|
99
|
-
parent.respond_to?(:query).should be_false
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
describe 'a request with a custom type' do
|
104
|
-
before(:each) do
|
105
|
-
request = TestRequest.new(:action => 'Pay', :token_id => 123)
|
106
|
-
request.amount = Amount.new(:amount => 3.50, :currency => 'USD')
|
107
|
-
@query = request.to_query
|
108
|
-
end
|
109
|
-
|
110
|
-
it 'should add the type parameters to the query' do
|
111
|
-
@query.key?(:"amount.amount").should be_true
|
112
|
-
@query.key?(:"amount.currency").should be_true
|
113
|
-
end
|
114
|
-
end
|
data/spec/response_spec.rb
DELETED
@@ -1,98 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
-
|
3
|
-
|
4
|
-
class BaseResponse < Relax::Response
|
5
|
-
parameter :status, :required => true
|
6
|
-
parameter :request_id, :element => :requestid, :type => :integer
|
7
|
-
end
|
8
|
-
|
9
|
-
class TestResponse < BaseResponse
|
10
|
-
class Token < Relax::Response
|
11
|
-
parameter :token_id, :element => :tokenid
|
12
|
-
parameter :status
|
13
|
-
end
|
14
|
-
|
15
|
-
class Error < Relax::Response
|
16
|
-
parser :hpricot
|
17
|
-
parameter :code, :type => :integer
|
18
|
-
parameter :message
|
19
|
-
end
|
20
|
-
|
21
|
-
parameter :valid_request, :element => :requestid, :attribute => :valid
|
22
|
-
parameter :tokens, :collection => Token
|
23
|
-
parameter :error, :type => Error
|
24
|
-
end
|
25
|
-
|
26
|
-
|
27
|
-
describe 'a response' do
|
28
|
-
before(:each) do
|
29
|
-
@response = Relax::Response.new(XML)
|
30
|
-
end
|
31
|
-
|
32
|
-
it 'should allow access to the root' do
|
33
|
-
root = @response.root
|
34
|
-
root.should be_an_instance_of(Hpricot::Elem)
|
35
|
-
root.name.should eql('RESTResponse')
|
36
|
-
end
|
37
|
-
|
38
|
-
it 'should be checkable by the name of its root' do
|
39
|
-
@response.is?(:RESTResponse).should be_true
|
40
|
-
end
|
41
|
-
|
42
|
-
it 'should allow access to an element by its name' do
|
43
|
-
@response.element(:RequestId).should be_an_instance_of(Hpricot::Elem)
|
44
|
-
end
|
45
|
-
|
46
|
-
it 'should allow access to an element\'s elements by its name' do
|
47
|
-
tokens = @response.elements(:Tokens)
|
48
|
-
tokens.should be_an_instance_of(Hpricot::Elements)
|
49
|
-
tokens.should_not be_empty
|
50
|
-
end
|
51
|
-
|
52
|
-
it 'should allow access to an element\'s value by its name' do
|
53
|
-
token = Relax::Response.new(@response.elements(:Tokens).first)
|
54
|
-
token.element(:TokenId).inner_text.should eql('JPMQARDVJK')
|
55
|
-
token.element(:Status).inner_text.should eql('Active')
|
56
|
-
end
|
57
|
-
|
58
|
-
it 'should have a means of checking for the existence of a node' do
|
59
|
-
@response.has?(:Status).should_not be_nil
|
60
|
-
@response.has?(:Errors).should be_nil
|
61
|
-
end
|
62
|
-
|
63
|
-
it 'should be able to define children of Response without modifying parent' do
|
64
|
-
Relax::Response.new(XML).respond_to?(:status).should be_false
|
65
|
-
TestResponse.new(XML).respond_to?(:status).should be_true
|
66
|
-
end
|
67
|
-
|
68
|
-
it 'should automatically pull parameters from the XML' do
|
69
|
-
response = TestResponse.new(XML)
|
70
|
-
response.valid_request.should eql('true')
|
71
|
-
response.tokens.length.should eql(2)
|
72
|
-
response.tokens.first.status.should eql('Active')
|
73
|
-
response.error.code.should eql(1)
|
74
|
-
response.error.message.should eql('Failed')
|
75
|
-
end
|
76
|
-
|
77
|
-
it "should automatically pull its parent's parameters from the XML" do
|
78
|
-
response = TestResponse.new(XML)
|
79
|
-
response.status.should eql('Success')
|
80
|
-
response.request_id.should eql(44287)
|
81
|
-
end
|
82
|
-
|
83
|
-
it 'should be relationally equivalent to its children' do
|
84
|
-
(Relax::Response === TestResponse).should be_true
|
85
|
-
end
|
86
|
-
|
87
|
-
it 'should raise MissingParameter if required parameters are missing' do
|
88
|
-
proc { TestResponse.new('') }.should raise_error(Relax::MissingParameter)
|
89
|
-
end
|
90
|
-
|
91
|
-
it 'should use the default parser when undefined' do
|
92
|
-
TestResponse::Token.new('').parser_name.should ==:default
|
93
|
-
end
|
94
|
-
|
95
|
-
it 'should use the defined parser when given' do
|
96
|
-
TestResponse::Error.new('').parser_name.should ==:hpricot
|
97
|
-
end
|
98
|
-
end
|
data/spec/symbolic_hash_spec.rb
DELETED
@@ -1,67 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
-
|
3
|
-
require 'relax/symbolic_hash'
|
4
|
-
|
5
|
-
describe 'a symbolic hash' do
|
6
|
-
before(:each) do
|
7
|
-
@url = 'http://example.com/'
|
8
|
-
@query = Relax::SymbolicHash.new
|
9
|
-
end
|
10
|
-
|
11
|
-
it 'should be accessible via string or symbol keys' do
|
12
|
-
@query[:amount] = 10
|
13
|
-
@query[:amount].should == 10
|
14
|
-
@query['amount'].should == 10
|
15
|
-
end
|
16
|
-
|
17
|
-
it 'should convert keys to symbols' do
|
18
|
-
@query['symbol'] = 'aleph'
|
19
|
-
@query[:symbol].should == 'aleph'
|
20
|
-
end
|
21
|
-
|
22
|
-
it 'should convert keys to symbols' do
|
23
|
-
@query['symbol'] = 'aleph'
|
24
|
-
@query[:symbol].should == 'aleph'
|
25
|
-
end
|
26
|
-
|
27
|
-
it 'should test for keys by symbol' do
|
28
|
-
@query[:symbol] = 'aleph'
|
29
|
-
@query.key?('symbol').should be_true
|
30
|
-
end
|
31
|
-
|
32
|
-
it 'should delete values with a symbolic key' do
|
33
|
-
@query[:symbol] = 'aleph'
|
34
|
-
@query.delete('symbol')
|
35
|
-
@query.key?(:symbol).should be_false
|
36
|
-
end
|
37
|
-
|
38
|
-
it 'should be mergeable' do
|
39
|
-
@query[:one] = 2
|
40
|
-
merged_query = @query.merge({ :one => 1, :two => 2 })
|
41
|
-
merged_query[:one].should == 1
|
42
|
-
merged_query[:two].should == 2
|
43
|
-
end
|
44
|
-
|
45
|
-
it 'should be able to duplicate itself' do
|
46
|
-
@query[:one] = 'uno'
|
47
|
-
@query[:two] = 'dos'
|
48
|
-
new_query = @query.dup
|
49
|
-
new_query[:one].should == 'uno'
|
50
|
-
new_query[:two].should == 'dos'
|
51
|
-
|
52
|
-
@query[:three] == 'tres'
|
53
|
-
new_query.key?(:three).should be_false
|
54
|
-
end
|
55
|
-
|
56
|
-
it 'should be able to get multiple values by symbol' do
|
57
|
-
@query[:one] = 1
|
58
|
-
@query[:two] = 2
|
59
|
-
@query.values_at(:one, :two).should == [1, 2]
|
60
|
-
end
|
61
|
-
|
62
|
-
it 'should be instantiable with a hash' do
|
63
|
-
query = Relax::SymbolicHash.new({ :one => 1, :two => 2 })
|
64
|
-
query[:one].should == 1
|
65
|
-
query[:two].should == 2
|
66
|
-
end
|
67
|
-
end
|