party_resource 0.0.1
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 +20 -0
- data/README.rdoc +19 -0
- data/lib/party_resource/buildable.rb +60 -0
- data/lib/party_resource/connector/base.rb +35 -0
- data/lib/party_resource/connector.rb +42 -0
- data/lib/party_resource/exceptions.rb +57 -0
- data/lib/party_resource/method_define.rb +11 -0
- data/lib/party_resource/party_resource.rb +91 -0
- data/lib/party_resource/property.rb +53 -0
- data/lib/party_resource/request.rb +36 -0
- data/lib/party_resource/route.rb +77 -0
- data/lib/party_resource.rb +8 -0
- data/spec/fixtures/other_class.rb +19 -0
- data/spec/fixtures/test_base_class.rb +17 -0
- data/spec/fixtures/test_class.rb +44 -0
- data/spec/integration/integration_spec.rb +173 -0
- data/spec/spec_helper.rb +20 -0
- data/spec/unit/connector/base_spec.rb +83 -0
- data/spec/unit/connector_spec.rb +75 -0
- data/spec/unit/exceptions_spec.rb +34 -0
- data/spec/unit/party_resource_spec.rb +227 -0
- data/spec/unit/request_spec.rb +103 -0
- data/spec/unit/route_spec.rb +118 -0
- metadata +150 -0
@@ -0,0 +1,103 @@
|
|
1
|
+
require File.expand_path(File.join(__FILE__, '..', '..', 'spec_helper'))
|
2
|
+
|
3
|
+
describe PartyResource::Request do
|
4
|
+
|
5
|
+
subject { PartyResource::Request.new(verb, path, context, args, params) }
|
6
|
+
let_mock(:context, :parameter_values => {})
|
7
|
+
let_mock(:verb)
|
8
|
+
let_mock(:value)
|
9
|
+
let(:params) { {} }
|
10
|
+
let(:path) { '/path' }
|
11
|
+
|
12
|
+
context 'with static path' do
|
13
|
+
let(:path) { 'mypath/file.json' }
|
14
|
+
let(:args) { {} }
|
15
|
+
|
16
|
+
its(:verb) { should == verb }
|
17
|
+
its(:path) { should == path }
|
18
|
+
its(:data) { should == {} }
|
19
|
+
|
20
|
+
it "should merge http_data with passed options" do
|
21
|
+
subject.http_data(:foo => :bar).should == { :foo => :bar }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'with a parameter' do
|
26
|
+
let(:path) { 'mypath/file.json' }
|
27
|
+
let(:args) { {:param => value} }
|
28
|
+
|
29
|
+
its(:verb) { should == verb }
|
30
|
+
its(:path) { should == path }
|
31
|
+
its(:data) { should == args }
|
32
|
+
end
|
33
|
+
|
34
|
+
context 'with a parameter referenced in the path' do
|
35
|
+
let(:path) { 'mypath/:param.json' }
|
36
|
+
let(:args) { {:param => 'THE_VALUE', :second => value} }
|
37
|
+
|
38
|
+
its(:verb) { should == verb }
|
39
|
+
its(:path) { should == 'mypath/THE_VALUE.json' }
|
40
|
+
its(:data) { should == {:second => value } }
|
41
|
+
end
|
42
|
+
|
43
|
+
context 'with an object variable referenced in the path' do
|
44
|
+
let_mock(:context, :parameter_values => {:var => 'THE_VALUE'})
|
45
|
+
let(:path) { 'mypath/:param/:var.json' }
|
46
|
+
let(:args) { {:param => 'PARAM_VALUE', :second => value} }
|
47
|
+
|
48
|
+
its(:verb) { should == verb }
|
49
|
+
its(:path) { should == 'mypath/PARAM_VALUE/THE_VALUE.json' }
|
50
|
+
its(:data) { should == { :second => value } }
|
51
|
+
it 'asks the context object for required data values' do
|
52
|
+
context.should_receive(:parameter_values).with([:var])
|
53
|
+
subject.path
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context 'with extra parameters' do
|
58
|
+
let(:path) { '/path/:id' }
|
59
|
+
let_mock(:p1)
|
60
|
+
let_mock(:p2)
|
61
|
+
let_mock(:a1)
|
62
|
+
let_mock(:a2)
|
63
|
+
let(:params) { {:id => mock(:id2), :param => p1, :param2 => p2} }
|
64
|
+
let(:args) { {:id => 'THE_ID', :param => a1, :arg2 => a2} }
|
65
|
+
it 'merges them into the request data' do
|
66
|
+
subject.path.should == '/path/THE_ID'
|
67
|
+
subject.data.should == {:param => a1, :param2 => p2, :arg2 => a2}
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
context 'for a GET request' do
|
72
|
+
let(:verb) { :get }
|
73
|
+
let_mock(:args)
|
74
|
+
its(:http_data) { { :query => args } }
|
75
|
+
|
76
|
+
context 'with no data' do
|
77
|
+
let(:args) { {} }
|
78
|
+
its(:http_data) { should == {} }
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
[:post, :put, :delete].each do |http_verb|
|
83
|
+
context "for a #{http_verb} request" do
|
84
|
+
let(:verb) { http_verb }
|
85
|
+
let(:args) { {:param => value} }
|
86
|
+
its(:http_data) { should == { :body => args } }
|
87
|
+
end
|
88
|
+
|
89
|
+
context 'with no data' do
|
90
|
+
let(:args) { {} }
|
91
|
+
its(:http_data) { should == {} }
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
context 'encoding the path' do
|
96
|
+
let(:args) { {} }
|
97
|
+
let(:path) { '/path needing encoding' }
|
98
|
+
it 'encodes the path' do
|
99
|
+
subject.path.should == '/path%20needing%20encoding'
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
@@ -0,0 +1,118 @@
|
|
1
|
+
require File.expand_path(File.join(__FILE__, '..', '..', 'spec_helper'))
|
2
|
+
|
3
|
+
describe PartyResource::Route do
|
4
|
+
|
5
|
+
subject { PartyResource::Route.new options }
|
6
|
+
|
7
|
+
let_mock(:path)
|
8
|
+
let_mock(:object)
|
9
|
+
let_mock(:raw_result)
|
10
|
+
let(:connector) { mock(:connector, :fetch => raw_result) }
|
11
|
+
let(:klass) { Class.new {def initialize(data); end} }
|
12
|
+
let(:options) { { :get => path, :as => klass } }
|
13
|
+
|
14
|
+
before do
|
15
|
+
PartyResource.stub(:Connector => connector)
|
16
|
+
end
|
17
|
+
|
18
|
+
describe ".call" do
|
19
|
+
|
20
|
+
[:get, :put, :post, :delete].each do |verb|
|
21
|
+
|
22
|
+
context "for a #{verb} request" do
|
23
|
+
let(:options) { { verb => path, :as => klass } }
|
24
|
+
|
25
|
+
it "performs a #{verb} request to the path with the connector" do
|
26
|
+
request = mock(:request)
|
27
|
+
PartyResource::Request.should_receive(:new).with(verb, path, object, anything, anything).and_return(request)
|
28
|
+
connector.should_receive(:fetch).with(request)
|
29
|
+
subject.call(object)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context 'with more than one verb passed' do
|
35
|
+
let(:options) { { :post => path, :get => path } }
|
36
|
+
|
37
|
+
it "raises an argument error" do
|
38
|
+
lambda{ subject.call(object) }.should raise_error(ArgumentError)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context "with no variables" do
|
43
|
+
let(:options) { { :get => path, :as => klass } }
|
44
|
+
|
45
|
+
it "builds the request path" do
|
46
|
+
PartyResource::Request.should_receive(:new).with(:get, path, object, {}, anything)
|
47
|
+
subject.call(object)
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
context "with some variables" do
|
53
|
+
let(:options) { { :get => path, :with => [:a, :b, :c], :as => klass } }
|
54
|
+
|
55
|
+
it "builds the request path" do
|
56
|
+
PartyResource::Request.should_receive(:new).with(:get, path, object, {:a => 1, :b => 2, :c => 3}, anything)
|
57
|
+
subject.call(object, 1, 2, 3)
|
58
|
+
end
|
59
|
+
|
60
|
+
it "raises an ArgumentError for the wrong number of arguments" do
|
61
|
+
lambda { subject.call(object, 1, 2, 3, 4) }.should raise_error(ArgumentError)
|
62
|
+
lambda { subject.call(object) }.should raise_error(ArgumentError)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
context 'when returning as class' do
|
67
|
+
let_mock(:result_object)
|
68
|
+
|
69
|
+
it 'builds an object from the data returned' do
|
70
|
+
klass.should_receive(:new).with(raw_result).and_return(result_object)
|
71
|
+
subject.call(object).should == result_object
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
context 'when returning as :raw' do
|
76
|
+
let(:options) { { :get => path, :as => :raw } }
|
77
|
+
it 'builds an object from the data returned' do
|
78
|
+
klass.should_not_receive(:new)
|
79
|
+
subject.call(object).should == raw_result
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
context 'when returning as class with builder method' do
|
84
|
+
let_mock(:result_object)
|
85
|
+
let(:options) { { :get => path, :as => [klass, :builder] } }
|
86
|
+
|
87
|
+
it 'builds an object from the data returned' do
|
88
|
+
klass.should_receive(:builder).with(raw_result).and_return(result_object)
|
89
|
+
subject.call(object).should == result_object
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
context 'when returning as proc' do
|
94
|
+
let_mock(:result_object)
|
95
|
+
let(:options) { { :get => path, :as => lambda {|data| data.morph } } }
|
96
|
+
|
97
|
+
it 'builds an object from the data returned' do
|
98
|
+
raw_result.should_receive(:morph).and_return(result_object)
|
99
|
+
subject.call(object).should == result_object
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
context 'when returning an array' do
|
104
|
+
let(:raw_result) { [1, 2] }
|
105
|
+
let(:options) { { :get => path, :as => lambda {|data| "X#{data}" } } }
|
106
|
+
it 'builds each value individually' do
|
107
|
+
subject.call(object).should == %w{ X1 X2 }
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
context 'with an extra params hash' do
|
112
|
+
it '' do
|
113
|
+
lambda { subject.call(object, {:params => :data}) }.should_not raise_error
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
end
|
metadata
ADDED
@@ -0,0 +1,150 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: party_resource
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
version: 0.0.1
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Tristan Harris
|
13
|
+
- Steve Tooke
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-05-26 00:00:00 +01:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: httparty
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
segments:
|
29
|
+
- 0
|
30
|
+
- 5
|
31
|
+
- 2
|
32
|
+
version: 0.5.2
|
33
|
+
type: :runtime
|
34
|
+
version_requirements: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: activesupport
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
segments:
|
43
|
+
- 2
|
44
|
+
- 3
|
45
|
+
- 5
|
46
|
+
version: 2.3.5
|
47
|
+
type: :runtime
|
48
|
+
version_requirements: *id002
|
49
|
+
- !ruby/object:Gem::Dependency
|
50
|
+
name: rspec
|
51
|
+
prerelease: false
|
52
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
segments:
|
57
|
+
- 1
|
58
|
+
- 2
|
59
|
+
- 9
|
60
|
+
version: 1.2.9
|
61
|
+
type: :development
|
62
|
+
version_requirements: *id003
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
name: yard
|
65
|
+
prerelease: false
|
66
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
segments:
|
71
|
+
- 0
|
72
|
+
version: "0"
|
73
|
+
type: :development
|
74
|
+
version_requirements: *id004
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: webmock
|
77
|
+
prerelease: false
|
78
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
segments:
|
83
|
+
- 0
|
84
|
+
version: "0"
|
85
|
+
type: :development
|
86
|
+
version_requirements: *id005
|
87
|
+
description: party_resource is a framework for building ruby objects which interact with a REST api. Built on top of HTTParty.
|
88
|
+
email: dev+party_resource@edendevelopment.co.uk
|
89
|
+
executables: []
|
90
|
+
|
91
|
+
extensions: []
|
92
|
+
|
93
|
+
extra_rdoc_files:
|
94
|
+
- LICENSE
|
95
|
+
- README.rdoc
|
96
|
+
files:
|
97
|
+
- lib/party_resource.rb
|
98
|
+
- lib/party_resource/buildable.rb
|
99
|
+
- lib/party_resource/connector.rb
|
100
|
+
- lib/party_resource/connector/base.rb
|
101
|
+
- lib/party_resource/exceptions.rb
|
102
|
+
- lib/party_resource/method_define.rb
|
103
|
+
- lib/party_resource/party_resource.rb
|
104
|
+
- lib/party_resource/property.rb
|
105
|
+
- lib/party_resource/request.rb
|
106
|
+
- lib/party_resource/route.rb
|
107
|
+
- LICENSE
|
108
|
+
- README.rdoc
|
109
|
+
has_rdoc: true
|
110
|
+
homepage: http://github.com/edendevelopment/party_resource.git
|
111
|
+
licenses: []
|
112
|
+
|
113
|
+
post_install_message:
|
114
|
+
rdoc_options:
|
115
|
+
- --charset=UTF-8
|
116
|
+
require_paths:
|
117
|
+
- lib
|
118
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
119
|
+
requirements:
|
120
|
+
- - ">="
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
segments:
|
123
|
+
- 0
|
124
|
+
version: "0"
|
125
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
126
|
+
requirements:
|
127
|
+
- - ">="
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
segments:
|
130
|
+
- 0
|
131
|
+
version: "0"
|
132
|
+
requirements: []
|
133
|
+
|
134
|
+
rubyforge_project:
|
135
|
+
rubygems_version: 1.3.6
|
136
|
+
signing_key:
|
137
|
+
specification_version: 3
|
138
|
+
summary: Simple REST interface for ruby objects.
|
139
|
+
test_files:
|
140
|
+
- spec/fixtures/other_class.rb
|
141
|
+
- spec/fixtures/test_base_class.rb
|
142
|
+
- spec/fixtures/test_class.rb
|
143
|
+
- spec/integration/integration_spec.rb
|
144
|
+
- spec/spec_helper.rb
|
145
|
+
- spec/unit/connector/base_spec.rb
|
146
|
+
- spec/unit/connector_spec.rb
|
147
|
+
- spec/unit/exceptions_spec.rb
|
148
|
+
- spec/unit/party_resource_spec.rb
|
149
|
+
- spec/unit/request_spec.rb
|
150
|
+
- spec/unit/route_spec.rb
|