metaforce 0.5.1 → 0.5.2
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 +4 -1
- data/lib/metaforce/config.rb +0 -1
- data/lib/metaforce/services/client.rb +31 -15
- data/lib/metaforce/version.rb +1 -1
- data/spec/fixtures/requests/describe_layout/invalid_session.xml +15 -0
- data/spec/fixtures/requests/describe_layout/success.xml +15 -0
- data/spec/lib/services/client_spec.rb +16 -0
- data/spec/spec_helper.rb +3 -1
- metadata +22 -18
data/README.md
CHANGED
@@ -61,7 +61,10 @@ feature on a new branch, then send me a pull request with a detailed
|
|
61
61
|
description. Please provide applicable rspec specs.
|
62
62
|
|
63
63
|
## Version History
|
64
|
-
**
|
64
|
+
**0.5.2**
|
65
|
+
* The services client now reauthentications on Savon::SOAP::Fault.
|
66
|
+
|
67
|
+
**0.5.1**
|
65
68
|
|
66
69
|
* Add thor integration.
|
67
70
|
|
data/lib/metaforce/config.rb
CHANGED
@@ -11,37 +11,33 @@ module Metaforce
|
|
11
11
|
# is nil, it will get the username, password and security token from the
|
12
12
|
# configuration.
|
13
13
|
def initialize(options=nil)
|
14
|
+
@options = options
|
14
15
|
# Convert string keys to hashes
|
15
|
-
options.dup.each { |key, value| options[key.to_sym] = value } if options.is_a?(Hash)
|
16
|
+
@options.dup.each { |key, value| options[key.to_sym] = value } if options.is_a?(Hash)
|
16
17
|
|
17
|
-
options = {
|
18
|
+
@options = {
|
18
19
|
:username => Metaforce.configuration.username,
|
19
20
|
:password => Metaforce.configuration.password,
|
20
21
|
:security_token => Metaforce.configuration.security_token
|
21
|
-
} if options.nil?
|
22
|
-
@session = self.login(options[:username], options[:password], options[:security_token])
|
22
|
+
} if @options.nil?
|
23
|
+
@session = self.login(@options[:username], @options[:password], @options[:security_token])
|
23
24
|
|
24
25
|
@client = Savon::Client.new File.expand_path("../../../../wsdl/#{Metaforce.configuration.api_version}/partner.xml", __FILE__) do |wsdl|
|
25
26
|
wsdl.endpoint = @session[:services_url]
|
26
27
|
end
|
27
28
|
@client.http.auth.ssl.verify_mode = :none
|
28
|
-
@header = {
|
29
|
-
"ins0:SessionHeader" => {
|
30
|
-
"ins0:sessionId" => @session[:session_id]
|
31
|
-
}
|
32
|
-
}
|
33
29
|
end
|
34
30
|
|
35
|
-
# Performs a login and
|
31
|
+
# Performs a login and retrurns the session
|
36
32
|
def login(username, password, security_token=nil)
|
37
33
|
password = "#{password}#{security_token}" unless security_token.nil?
|
38
|
-
|
34
|
+
client = Savon::Client.new File.expand_path("../../../../wsdl/#{Metaforce.configuration.api_version}/partner.xml", __FILE__) do |wsdl|
|
39
35
|
wsdl.endpoint = wsdl.endpoint.to_s.sub(/login/, 'test') if Metaforce.configuration.test
|
40
36
|
Metaforce.log("Logging in via #{wsdl.endpoint.to_s}")
|
41
37
|
end
|
42
|
-
|
38
|
+
client.http.auth.ssl.verify_mode = :none
|
43
39
|
|
44
|
-
response =
|
40
|
+
response = client.request(:login) do
|
45
41
|
soap.body = {
|
46
42
|
:username => username,
|
47
43
|
:password => password
|
@@ -75,12 +71,32 @@ module Metaforce
|
|
75
71
|
'sObjectType' => sobject
|
76
72
|
}
|
77
73
|
body['recordTypeID'] = record_type_id if record_type_id
|
78
|
-
response =
|
79
|
-
soap.header =
|
74
|
+
response = request(:describe_layout) do |soap|
|
75
|
+
soap.header = header
|
80
76
|
soap.body = body
|
81
77
|
end
|
82
78
|
response.body[:describe_layout_response][:result]
|
83
79
|
end
|
80
|
+
|
81
|
+
private
|
82
|
+
|
83
|
+
def header
|
84
|
+
{
|
85
|
+
"ins0:SessionHeader" => {
|
86
|
+
"ins0:sessionId" => @session[:session_id]
|
87
|
+
}
|
88
|
+
}
|
89
|
+
end
|
90
|
+
|
91
|
+
def request(*args, &block)
|
92
|
+
begin
|
93
|
+
@client.request(*args, &block)
|
94
|
+
rescue Savon::SOAP::Fault => e
|
95
|
+
@session = self.login(@options[:username], @options[:password], @options[:security_token])
|
96
|
+
@client.request(*args, &block)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
84
100
|
end
|
85
101
|
end
|
86
102
|
end
|
data/lib/metaforce/version.rb
CHANGED
@@ -0,0 +1,15 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sf="urn:fault.partner.soap.sforce.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
3
|
+
<soapenv:Body>
|
4
|
+
<soapenv:Fault>
|
5
|
+
<faultcode>sf:INVALID_SESSION_ID</faultcode>
|
6
|
+
<faultstring>INVALID_SESSION_ID: Invalid Session ID found in SessionHeader: Illegal Session</faultstring>
|
7
|
+
<detail>
|
8
|
+
<sf:UnexpectedErrorFault xsi:type="sf:UnexpectedErrorFault">
|
9
|
+
<sf:exceptionCode>INVALID_SESSION_ID</sf:exceptionCode>
|
10
|
+
<sf:exceptionMessage>Invalid Session ID found in SessionHeader: Illegal Session</sf:exceptionMessage>
|
11
|
+
</sf:UnexpectedErrorFault>
|
12
|
+
</detail>
|
13
|
+
</soapenv:Fault>
|
14
|
+
</soapenv:Body>
|
15
|
+
</soapenv:Envelope>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="urn:partner.soap.sforce.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
3
|
+
<soapenv:Body>
|
4
|
+
<describeLayoutResponse>
|
5
|
+
<result>
|
6
|
+
<layouts>
|
7
|
+
</layouts>
|
8
|
+
<recordTypeMappings>
|
9
|
+
</recordTypeMappings>
|
10
|
+
<recordTypeSelectorRequired>true</recordTypeSelectorRequired>
|
11
|
+
</result>
|
12
|
+
</describeLayoutResponse>
|
13
|
+
</soapenv:Body>
|
14
|
+
</soapenv:Envelope>
|
15
|
+
|
@@ -31,4 +31,20 @@ describe Metaforce::Services::Client do
|
|
31
31
|
end
|
32
32
|
end
|
33
33
|
end
|
34
|
+
|
35
|
+
describe "reauthentication" do
|
36
|
+
let(:client) do
|
37
|
+
savon.expects(:login).with(:username => 'valid', :password => 'password').returns(:success)
|
38
|
+
client = Metaforce::Services::Client.new("username" => 'valid', "password" => 'password')
|
39
|
+
end
|
40
|
+
|
41
|
+
context "when the session expires" do
|
42
|
+
it "reauthenticates the user" do
|
43
|
+
# savon.expects(:describe_layout).with('sObjectType' => 'Account').returns(:invalid_session)
|
44
|
+
# savon.expects(:login).with(:username => 'valid', :password => 'password').returns(:success)
|
45
|
+
# savon.expects(:describe_layout).with('sObjectType' => 'Account').returns(:success)
|
46
|
+
# client.describe_layout('Account').should be_a(Hash)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
34
50
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: metaforce
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,11 +10,11 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-06-
|
13
|
+
date: 2012-06-08 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: nokogiri
|
17
|
-
requirement: &
|
17
|
+
requirement: &70344279101640 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ~>
|
@@ -22,10 +22,10 @@ dependencies:
|
|
22
22
|
version: 1.5.0
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
|
-
version_requirements: *
|
25
|
+
version_requirements: *70344279101640
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: savon
|
28
|
-
requirement: &
|
28
|
+
requirement: &70344279100900 !ruby/object:Gem::Requirement
|
29
29
|
none: false
|
30
30
|
requirements:
|
31
31
|
- - ~>
|
@@ -33,10 +33,10 @@ dependencies:
|
|
33
33
|
version: 0.9.7
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
|
-
version_requirements: *
|
36
|
+
version_requirements: *70344279100900
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: rubyzip
|
39
|
-
requirement: &
|
39
|
+
requirement: &70344279100200 !ruby/object:Gem::Requirement
|
40
40
|
none: false
|
41
41
|
requirements:
|
42
42
|
- - ~>
|
@@ -44,10 +44,10 @@ dependencies:
|
|
44
44
|
version: 0.9.5
|
45
45
|
type: :runtime
|
46
46
|
prerelease: false
|
47
|
-
version_requirements: *
|
47
|
+
version_requirements: *70344279100200
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: term-ansicolor
|
50
|
-
requirement: &
|
50
|
+
requirement: &70344279099600 !ruby/object:Gem::Requirement
|
51
51
|
none: false
|
52
52
|
requirements:
|
53
53
|
- - ! '>='
|
@@ -55,10 +55,10 @@ dependencies:
|
|
55
55
|
version: '0'
|
56
56
|
type: :runtime
|
57
57
|
prerelease: false
|
58
|
-
version_requirements: *
|
58
|
+
version_requirements: *70344279099600
|
59
59
|
- !ruby/object:Gem::Dependency
|
60
60
|
name: rake
|
61
|
-
requirement: &
|
61
|
+
requirement: &70344279099060 !ruby/object:Gem::Requirement
|
62
62
|
none: false
|
63
63
|
requirements:
|
64
64
|
- - ! '>='
|
@@ -66,10 +66,10 @@ dependencies:
|
|
66
66
|
version: '0'
|
67
67
|
type: :development
|
68
68
|
prerelease: false
|
69
|
-
version_requirements: *
|
69
|
+
version_requirements: *70344279099060
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: rspec
|
72
|
-
requirement: &
|
72
|
+
requirement: &70344279098620 !ruby/object:Gem::Requirement
|
73
73
|
none: false
|
74
74
|
requirements:
|
75
75
|
- - ! '>='
|
@@ -77,10 +77,10 @@ dependencies:
|
|
77
77
|
version: '0'
|
78
78
|
type: :development
|
79
79
|
prerelease: false
|
80
|
-
version_requirements: *
|
80
|
+
version_requirements: *70344279098620
|
81
81
|
- !ruby/object:Gem::Dependency
|
82
82
|
name: mocha
|
83
|
-
requirement: &
|
83
|
+
requirement: &70344279098200 !ruby/object:Gem::Requirement
|
84
84
|
none: false
|
85
85
|
requirements:
|
86
86
|
- - ! '>='
|
@@ -88,10 +88,10 @@ dependencies:
|
|
88
88
|
version: '0'
|
89
89
|
type: :development
|
90
90
|
prerelease: false
|
91
|
-
version_requirements: *
|
91
|
+
version_requirements: *70344279098200
|
92
92
|
- !ruby/object:Gem::Dependency
|
93
93
|
name: savon_spec
|
94
|
-
requirement: &
|
94
|
+
requirement: &70344279097680 !ruby/object:Gem::Requirement
|
95
95
|
none: false
|
96
96
|
requirements:
|
97
97
|
- - ~>
|
@@ -99,7 +99,7 @@ dependencies:
|
|
99
99
|
version: 0.1.6
|
100
100
|
type: :development
|
101
101
|
prerelease: false
|
102
|
-
version_requirements: *
|
102
|
+
version_requirements: *70344279097680
|
103
103
|
description: A Ruby gem for interacting with the Salesforce Metadata API
|
104
104
|
email:
|
105
105
|
- eric@ejholmes.net
|
@@ -151,6 +151,8 @@ files:
|
|
151
151
|
- spec/fixtures/requests/create/in_progress.xml
|
152
152
|
- spec/fixtures/requests/delete/in_progress.xml
|
153
153
|
- spec/fixtures/requests/deploy/in_progress.xml
|
154
|
+
- spec/fixtures/requests/describe_layout/invalid_session.xml
|
155
|
+
- spec/fixtures/requests/describe_layout/success.xml
|
154
156
|
- spec/fixtures/requests/describe_metadata/success.xml
|
155
157
|
- spec/fixtures/requests/list_metadata/no_result.xml
|
156
158
|
- spec/fixtures/requests/list_metadata/objects.xml
|
@@ -208,6 +210,8 @@ test_files:
|
|
208
210
|
- spec/fixtures/requests/create/in_progress.xml
|
209
211
|
- spec/fixtures/requests/delete/in_progress.xml
|
210
212
|
- spec/fixtures/requests/deploy/in_progress.xml
|
213
|
+
- spec/fixtures/requests/describe_layout/invalid_session.xml
|
214
|
+
- spec/fixtures/requests/describe_layout/success.xml
|
211
215
|
- spec/fixtures/requests/describe_metadata/success.xml
|
212
216
|
- spec/fixtures/requests/list_metadata/no_result.xml
|
213
217
|
- spec/fixtures/requests/list_metadata/objects.xml
|