relax 0.1.3 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +19 -0
- data/.rspec +2 -0
- data/CHANGELOG.md +63 -0
- data/Gemfile +3 -0
- data/LICENSE +3 -1
- data/README.md +80 -0
- data/Rakefile +2 -52
- data/examples/delicious.rb +61 -0
- data/examples/flickr.rb +66 -0
- data/examples/vimeo.rb +65 -0
- data/lib/relax.rb +6 -16
- data/lib/relax/client.rb +18 -0
- data/lib/relax/config.rb +12 -0
- data/lib/relax/delegator.rb +25 -0
- data/lib/relax/resource.rb +32 -0
- data/lib/relax/version.rb +3 -0
- data/relax.gemspec +17 -0
- data/spec/relax/client_spec.rb +39 -0
- data/spec/relax/config_spec.rb +17 -0
- data/spec/relax/delegator_spec.rb +32 -0
- data/spec/relax/resource_spec.rb +60 -0
- data/spec/spec_helper.rb +9 -13
- metadata +75 -96
- data/README.rdoc +0 -194
- data/VERSION.yml +0 -4
- data/lib/relax/action.rb +0 -49
- data/lib/relax/context.rb +0 -46
- data/lib/relax/contextable.rb +0 -15
- data/lib/relax/endpoint.rb +0 -21
- data/lib/relax/instance.rb +0 -25
- data/lib/relax/parameter.rb +0 -23
- data/lib/relax/performer.rb +0 -58
- data/lib/relax/service.rb +0 -45
- data/spec/relax/context_spec.rb +0 -18
- data/spec/relax/endpoint_spec.rb +0 -99
- data/spec/relax/integration_spec.rb +0 -63
- data/spec/relax/service_spec.rb +0 -32
- data/spec/services/blank_values_service.rb +0 -19
- data/spec/services/custom_parser_service.rb +0 -24
- data/spec/services/flickr.rb +0 -78
- data/spec/services/parameter_alias_service.rb +0 -17
data/lib/relax/service.rb
DELETED
@@ -1,45 +0,0 @@
|
|
1
|
-
module Relax
|
2
|
-
class Service
|
3
|
-
def initialize(values={}, options={})
|
4
|
-
@values = values
|
5
|
-
@options = options
|
6
|
-
end
|
7
|
-
|
8
|
-
def authenticate(*args)
|
9
|
-
@options[:credentials] = args
|
10
|
-
self
|
11
|
-
end
|
12
|
-
|
13
|
-
def proxy(url)
|
14
|
-
@options[:proxy] = url
|
15
|
-
self
|
16
|
-
end
|
17
|
-
|
18
|
-
def include_blank_values(value)
|
19
|
-
@options[:include_blank_values] = value
|
20
|
-
self
|
21
|
-
end
|
22
|
-
|
23
|
-
class << self
|
24
|
-
include Contextable
|
25
|
-
|
26
|
-
def endpoint(url, options={}, &block)
|
27
|
-
Endpoint.new(self, url, options, &block)
|
28
|
-
end
|
29
|
-
|
30
|
-
def register_action(action) # :nodoc:
|
31
|
-
@actions ||= {}
|
32
|
-
|
33
|
-
unless @actions[action.name]
|
34
|
-
@actions[action.name] = action.name
|
35
|
-
|
36
|
-
define_method(action.name) do |*args|
|
37
|
-
action.execute(@values, @options, *args)
|
38
|
-
end
|
39
|
-
else
|
40
|
-
raise ArgumentError.new("Duplicate action '#{action.name}'.")
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
data/spec/relax/context_spec.rb
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), '..', 'spec_helper')
|
2
|
-
|
3
|
-
describe Relax::Context do
|
4
|
-
it "utilizes a custom parser for Class parsers" do
|
5
|
-
service = CustomParserService.new
|
6
|
-
service.test.should == 'parsed'
|
7
|
-
end
|
8
|
-
|
9
|
-
it "allows parameters with aliases" do
|
10
|
-
service = ParameterAliasService.new
|
11
|
-
service.test(:api_key => 'secret')[:stat].should == 'ok'
|
12
|
-
end
|
13
|
-
|
14
|
-
it "allows blank parameters values" do
|
15
|
-
service = BlankValuesService.new({}, :include_blank_values => true)
|
16
|
-
service.test[:stat].should == 'ok'
|
17
|
-
end
|
18
|
-
end
|
data/spec/relax/endpoint_spec.rb
DELETED
@@ -1,99 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), '..', 'spec_helper')
|
2
|
-
|
3
|
-
describe Relax::Endpoint do
|
4
|
-
it "provides access to the URL" do
|
5
|
-
service = Class.new(Relax::Service)
|
6
|
-
endpoint = service.endpoint("http://api.example.com/") { }
|
7
|
-
endpoint.url.should == "http://api.example.com/"
|
8
|
-
end
|
9
|
-
|
10
|
-
it "allows contextual defaults to be set" do
|
11
|
-
service = Class.new(Relax::Service)
|
12
|
-
endpoint = service.endpoint("http://api.example.com/") { }
|
13
|
-
endpoint.should respond_to(:defaults)
|
14
|
-
end
|
15
|
-
|
16
|
-
describe "actions" do
|
17
|
-
it "should check for required values for service defaults" do
|
18
|
-
service = Class.new(Relax::Service) do
|
19
|
-
defaults { parameter :api_key, :required => true }
|
20
|
-
endpoint("http://api.example.com/") { action(:fetch) { } }
|
21
|
-
end
|
22
|
-
|
23
|
-
proc {
|
24
|
-
service.new.fetch
|
25
|
-
}.should raise_error(ArgumentError, /missing.*api_key/i)
|
26
|
-
end
|
27
|
-
|
28
|
-
it "should check for required values for endpoint defaults" do
|
29
|
-
service = Class.new(Relax::Service) do
|
30
|
-
endpoint("http://api.example.com/") do
|
31
|
-
defaults { parameter :operation, :required => true }
|
32
|
-
action(:fetch) { }
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
proc {
|
37
|
-
service.new.fetch
|
38
|
-
}.should raise_error(ArgumentError, /missing.*operation/i)
|
39
|
-
end
|
40
|
-
|
41
|
-
it "should check for required values for action parameters" do
|
42
|
-
service = Class.new(Relax::Service) do
|
43
|
-
endpoint("http://api.example.com/") do
|
44
|
-
action(:fetch) { parameter :id, :required => true }
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
proc {
|
49
|
-
service.new.fetch
|
50
|
-
}.should raise_error(ArgumentError, /missing.*id/i)
|
51
|
-
end
|
52
|
-
|
53
|
-
it "should create required parameters from tokens in the endpoint URL" do
|
54
|
-
service = Class.new(Relax::Service) do
|
55
|
-
endpoint("http://api.example.com/:version/") do
|
56
|
-
action(:fetch) { parameter :id }
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
proc {
|
61
|
-
service.new.fetch
|
62
|
-
}.should raise_error(ArgumentError, /missing.*version/i)
|
63
|
-
end
|
64
|
-
|
65
|
-
it "should replace parameter tokens in the endpoint URL" do
|
66
|
-
service = Class.new(Relax::Service) do
|
67
|
-
endpoint("http://api.example.com/:version/") do
|
68
|
-
action(:fetch) do
|
69
|
-
parameter :id
|
70
|
-
parser(:xml) { attribute :status }
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
FakeWeb.register_uri(:get, 'http://api.example.com/v1/', :string => <<-RESPONSE)
|
76
|
-
<?xml version="1.0" encoding="utf-8" ?>
|
77
|
-
<response status="ok" />
|
78
|
-
RESPONSE
|
79
|
-
|
80
|
-
service.new(:version => 'v1').fetch.should == { :status => 'ok' }
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
describe ".action" do
|
85
|
-
it "is callable from within an Endpoint" do
|
86
|
-
service = Class.new(Relax::Service)
|
87
|
-
endpoint = service.endpoint("http://api.example.com/") { }
|
88
|
-
endpoint.should respond_to(:action)
|
89
|
-
end
|
90
|
-
|
91
|
-
it "defines an instance method by the same name on the Service" do
|
92
|
-
service = Class.new(Relax::Service)
|
93
|
-
service.new.should_not respond_to(:fetch)
|
94
|
-
|
95
|
-
service.endpoint("http://api.example.com/") { action :fetch }
|
96
|
-
service.new.should respond_to(:fetch)
|
97
|
-
end
|
98
|
-
end
|
99
|
-
end
|
@@ -1,63 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), '..', 'spec_helper')
|
2
|
-
|
3
|
-
describe "an example service's" do
|
4
|
-
describe "get_photos action" do
|
5
|
-
it "includes :get_photos" do
|
6
|
-
Flickr.new.should respond_to(:get_photos)
|
7
|
-
end
|
8
|
-
|
9
|
-
it "requires an API key" do
|
10
|
-
proc {
|
11
|
-
Flickr.new.get_photos
|
12
|
-
}.should raise_error(ArgumentError, /missing.*api_key/i)
|
13
|
-
end
|
14
|
-
|
15
|
-
it "requires a user ID" do
|
16
|
-
proc {
|
17
|
-
Flickr.new(:api_key => 'secret').get_photos
|
18
|
-
}.should raise_error(ArgumentError, /missing.*user_id/i)
|
19
|
-
end
|
20
|
-
|
21
|
-
it "parses the response" do
|
22
|
-
flickr = Flickr.new(:api_key => 'secret')
|
23
|
-
flickr.get_photos(:user_id => '59532755@N00', :per_page => 3).should == {
|
24
|
-
:status => 'ok',
|
25
|
-
:photos => {
|
26
|
-
:total => '7830',
|
27
|
-
:photo => [
|
28
|
-
{ :ispublic => '1', :isfriend => '0', :owner => '59532755@N00', :isfamily => '0', :secret => '2ebe0307e3', :server => '3562', :farm => '4', :id => '3508500178', :title => 'Rich Kilmer'},
|
29
|
-
{:ispublic => '1', :isfriend => '0', :owner => '59532755@N00', :isfamily => '0', :secret => '10b217377b', :server => '3593', :farm => '4', :id => '3508500140', :title => 'Women In Rails'},
|
30
|
-
{:ispublic => '1', :isfriend => '0', :owner => '59532755@N00', :isfamily => '0', :secret => '83bc8fbf71', :server => '3620', :farm => '4', :id => '3507688713', :title => 'Obie Fernandez'}
|
31
|
-
],
|
32
|
-
:per_page => '3',
|
33
|
-
:pages => '2610',
|
34
|
-
:page => '1'
|
35
|
-
}
|
36
|
-
}
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
describe "get_user_by_username action" do
|
41
|
-
it "includes :get_user_by_username" do
|
42
|
-
Flickr.new.should respond_to(:get_user_by_username)
|
43
|
-
end
|
44
|
-
|
45
|
-
it "requires an API key" do
|
46
|
-
proc {
|
47
|
-
Flickr.new.get_user_by_username
|
48
|
-
}.should raise_error(ArgumentError, /missing.*api_key/i)
|
49
|
-
end
|
50
|
-
|
51
|
-
it "parses the response" do
|
52
|
-
flickr = Flickr.new(:api_key => 'secret')
|
53
|
-
flickr.get_user_by_username(:username => 'duncandavidson').should == {
|
54
|
-
:user => {
|
55
|
-
:username => 'duncandavidson',
|
56
|
-
:nsid => '59532755@N00',
|
57
|
-
:id => '59532755@N00'
|
58
|
-
},
|
59
|
-
:status => 'ok'
|
60
|
-
}
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
data/spec/relax/service_spec.rb
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), '..', 'spec_helper')
|
2
|
-
|
3
|
-
describe Relax::Service do
|
4
|
-
it "allows contextual defaults to be set" do
|
5
|
-
Relax::Service.should respond_to(:defaults)
|
6
|
-
end
|
7
|
-
|
8
|
-
describe "#authenticate" do
|
9
|
-
it "is callable from within a Service" do
|
10
|
-
Relax::Service.new.should respond_to(:authenticate)
|
11
|
-
end
|
12
|
-
|
13
|
-
it "returns the service" do
|
14
|
-
service = Relax::Service.new
|
15
|
-
service.authenticate('username', 'password').should == service
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
describe ".endpoint" do
|
20
|
-
it "is callable from within a Service" do
|
21
|
-
Relax::Service.should respond_to(:endpoint)
|
22
|
-
end
|
23
|
-
|
24
|
-
it "creates a new Endpoint" do
|
25
|
-
Relax::Endpoint.should_receive(:new)
|
26
|
-
|
27
|
-
class Service < Relax::Service
|
28
|
-
endpoint "http://api.example.com/"
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
class BlankValuesService < Relax::Service
|
2
|
-
endpoint 'http://example.com/' do
|
3
|
-
action :test do
|
4
|
-
parameter :one
|
5
|
-
parameter :two
|
6
|
-
parameter :three
|
7
|
-
|
8
|
-
parser :response do
|
9
|
-
attribute :stat
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
FakeWeb.register_uri(:get, 'http://example.com/?one=&two=&three=', :string => <<-RESPONSE)
|
16
|
-
<?xml version="1.0" encoding="utf-8" ?>
|
17
|
-
<response stat="ok">
|
18
|
-
</response>
|
19
|
-
RESPONSE
|
@@ -1,24 +0,0 @@
|
|
1
|
-
class TestCustomParser
|
2
|
-
def initialize(options = {}, &block)
|
3
|
-
end
|
4
|
-
|
5
|
-
def parse(input)
|
6
|
-
'parsed'
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
|
-
class CustomParserService < Relax::Service
|
11
|
-
endpoint "http://test.local/rest" do
|
12
|
-
action :test do
|
13
|
-
parser TestCustomParser do
|
14
|
-
element :status, :attribute => :stat
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
FakeWeb.register_uri(:get, 'http://test.local/rest', :string => <<-RESPONSE)
|
21
|
-
<?xml version="1.0" encoding="utf-8" ?>
|
22
|
-
<test stat="ok">
|
23
|
-
</test>
|
24
|
-
RESPONSE
|
data/spec/services/flickr.rb
DELETED
@@ -1,78 +0,0 @@
|
|
1
|
-
class Flickr < Relax::Service
|
2
|
-
defaults do
|
3
|
-
parameter :api_key, :required => true
|
4
|
-
end
|
5
|
-
|
6
|
-
endpoint "http://api.flickr.com/services/rest" do
|
7
|
-
defaults do
|
8
|
-
parameter :method, :required => true
|
9
|
-
end
|
10
|
-
|
11
|
-
action :get_photos do
|
12
|
-
set :method, "flickr.people.getPublicPhotos"
|
13
|
-
parameter :user_id, :required => true
|
14
|
-
parameter :safe_search
|
15
|
-
parameter :extras
|
16
|
-
parameter :per_page
|
17
|
-
parameter :page
|
18
|
-
|
19
|
-
parser :rsp do
|
20
|
-
element :status, :attribute => :stat
|
21
|
-
|
22
|
-
element :photos do
|
23
|
-
element :page, :attribute => true
|
24
|
-
element :pages, :attribute => true
|
25
|
-
element :per_page, :attribute => :perpage
|
26
|
-
element :total, :attribute => true
|
27
|
-
|
28
|
-
elements :photo do
|
29
|
-
element :id, :attribute => true
|
30
|
-
element :owner, :attribute => true
|
31
|
-
element :secret, :attribute => true
|
32
|
-
element :server, :attribute => true
|
33
|
-
element :farm, :attribute => true
|
34
|
-
element :title, :attribute => true
|
35
|
-
element :ispublic, :attribute => true
|
36
|
-
element :isfriend, :attribute => true
|
37
|
-
element :isfamily, :attribute => true
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
action :get_user_by_username do
|
44
|
-
set :method, "flickr.people.findByUsername"
|
45
|
-
parameter :username, :required => true
|
46
|
-
|
47
|
-
parser :rsp do
|
48
|
-
element :status, :attribute => :stat
|
49
|
-
|
50
|
-
element :user do
|
51
|
-
element :id, :attribute => true
|
52
|
-
element :nsid, :attribute => true
|
53
|
-
element :username
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
FakeWeb.register_uri(:get, 'http://api.flickr.com/services/rest?api_key=secret&method=flickr.people.findByUsername&username=duncandavidson', :string => <<-RESPONSE)
|
61
|
-
<?xml version="1.0" encoding="utf-8" ?>
|
62
|
-
<rsp stat="ok">
|
63
|
-
<user id="59532755@N00" nsid="59532755@N00">
|
64
|
-
<username>duncandavidson</username>
|
65
|
-
</user>
|
66
|
-
</rsp>
|
67
|
-
RESPONSE
|
68
|
-
|
69
|
-
FakeWeb.register_uri(:get, 'http://api.flickr.com/services/rest?user_id=59532755@N00&per_page=3&method=flickr.people.getPublicPhotos&api_key=secret', :string => <<-RESPONSE)
|
70
|
-
<?xml version="1.0" encoding="utf-8" ?>
|
71
|
-
<rsp stat="ok">
|
72
|
-
<photos page="1" pages="2610" perpage="3" total="7830">
|
73
|
-
<photo id="3508500178" owner="59532755@N00" secret="2ebe0307e3" server="3562" farm="4" title="Rich Kilmer" ispublic="1" isfriend="0" isfamily="0" />
|
74
|
-
<photo id="3508500140" owner="59532755@N00" secret="10b217377b" server="3593" farm="4" title="Women In Rails" ispublic="1" isfriend="0" isfamily="0" />
|
75
|
-
<photo id="3507688713" owner="59532755@N00" secret="83bc8fbf71" server="3620" farm="4" title="Obie Fernandez" ispublic="1" isfriend="0" isfamily="0" />
|
76
|
-
</photos>
|
77
|
-
</rsp>
|
78
|
-
RESPONSE
|
@@ -1,17 +0,0 @@
|
|
1
|
-
class ParameterAliasService < Relax::Service
|
2
|
-
endpoint 'http://example.com/' do
|
3
|
-
action :test do
|
4
|
-
parameter :APIKey, :as => :api_key, :required => true
|
5
|
-
|
6
|
-
parser :response do
|
7
|
-
attribute :stat
|
8
|
-
end
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
FakeWeb.register_uri(:get, 'http://example.com/?APIKey=secret', :string => <<-RESPONSE)
|
14
|
-
<?xml version="1.0" encoding="utf-8" ?>
|
15
|
-
<response stat="ok">
|
16
|
-
</response>
|
17
|
-
RESPONSE
|