rforce 0.3 → 0.4
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/History.txt +15 -10
- data/Manifest.txt +1 -1
- data/README.txt +1 -1
- data/Rakefile +5 -3
- data/lib/rforce.rb +2 -30
- data/lib/rforce/binding.rb +13 -3
- data/lib/rforce/soap_pullable.rb +7 -1
- data/lib/rforce/soap_response.rb +12 -0
- data/lib/rforce/soap_response_expat.rb +3 -3
- data/lib/rforce/soap_response_hpricot.rb +12 -7
- data/lib/rforce/version.rb +1 -1
- data/spec/rforce_spec.rb +20 -2
- data/spec/soap-response.xml +1 -1
- data/spec/spec_helper.rb +1 -9
- metadata +10 -8
- data/tasks/rspec.rake +0 -21
data/History.txt
CHANGED
@@ -1,19 +1,24 @@
|
|
1
|
-
== 0.
|
1
|
+
== 0.4 2010-01-21
|
2
2
|
|
3
|
-
* 1
|
4
|
-
*
|
3
|
+
* 1 minor enhancement:
|
4
|
+
* Moved RubyGems dependencies into the gemspec where they belong
|
5
5
|
|
6
|
-
== 0.
|
6
|
+
== 0.3 2009-04-16
|
7
7
|
|
8
|
-
* 1
|
9
|
-
*
|
8
|
+
* 1 minor enhancement:
|
9
|
+
* Updated for Ruby 1.9
|
10
10
|
|
11
11
|
== 0.2.1 2008-07-04
|
12
12
|
|
13
13
|
* 1 minor enhancement:
|
14
14
|
* Updated examples for SalesForce API v10
|
15
15
|
|
16
|
-
== 0.
|
17
|
-
|
18
|
-
* 1
|
19
|
-
*
|
16
|
+
== 0.2.0 2008-07-03
|
17
|
+
|
18
|
+
* 1 major enhancement:
|
19
|
+
* Incorporated fixes from ActiveSalesforce project
|
20
|
+
|
21
|
+
== 0.1.0 2005-09-02
|
22
|
+
|
23
|
+
* 1 major enhancement:
|
24
|
+
* Initial release
|
data/Manifest.txt
CHANGED
@@ -5,6 +5,7 @@ Rakefile
|
|
5
5
|
lib/rforce.rb
|
6
6
|
lib/rforce/binding.rb
|
7
7
|
lib/rforce/soap_pullable.rb
|
8
|
+
lib/rforce/soap_response.rb
|
8
9
|
lib/rforce/soap_response_expat.rb
|
9
10
|
lib/rforce/soap_response_hpricot.rb
|
10
11
|
lib/rforce/soap_response_rexml.rb
|
@@ -13,5 +14,4 @@ spec/rforce_spec.rb
|
|
13
14
|
spec/soap-response.xml
|
14
15
|
spec/spec.opts
|
15
16
|
spec/spec_helper.rb
|
16
|
-
tasks/rspec.rake
|
17
17
|
tasks/timing.rake
|
data/README.txt
CHANGED
@@ -53,7 +53,7 @@ Rather than enforcing adherence to the sforce.com schema, RForce assumes you are
|
|
53
53
|
|
54
54
|
== LICENSE:
|
55
55
|
|
56
|
-
Copyright (c) 2005-
|
56
|
+
Copyright (c) 2005-2010 Ian Dees and contributors
|
57
57
|
|
58
58
|
Permission is hereby granted, free of charge, to any person obtaining
|
59
59
|
a copy of this software and associated documentation files (the
|
data/Rakefile
CHANGED
@@ -1,15 +1,17 @@
|
|
1
1
|
# -*- ruby -*-
|
2
2
|
|
3
3
|
$:.unshift './lib'
|
4
|
+
|
4
5
|
require 'rubygems'
|
5
6
|
require 'hoe'
|
6
7
|
require 'rforce/version'
|
7
8
|
|
8
9
|
Hoe.new('rforce', RForce::VERSION) do |p|
|
9
|
-
p.developer
|
10
|
-
p.extra_deps
|
11
|
-
p.extra_dev_deps
|
10
|
+
p.developer 'Ian Dees', 'undees@gmail.com'
|
11
|
+
p.extra_deps = [['builder', '>= 2.0.0'], ['facets', '>= 2.4']]
|
12
|
+
p.extra_dev_deps = [['rspec', '>= 1.3']]
|
12
13
|
p.remote_rdoc_dir = ''
|
14
|
+
p.rspec_options = ['-rubygems', '--options', 'spec/spec.opts']
|
13
15
|
end
|
14
16
|
|
15
17
|
Dir['tasks/**/*.rake'].each { |rake| load rake }
|
data/lib/rforce.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
=begin
|
2
|
-
Copyright (c) 2005-
|
2
|
+
Copyright (c) 2005-2010 Ian Dees and contributors
|
3
3
|
|
4
4
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
5
5
|
of this software and associated documentation files (the "Software"), to deal
|
@@ -46,37 +46,10 @@ SOFTWARE.
|
|
46
46
|
# binding.create 'sObject {"xsi:type" => "Opportunity"}' => opportunity
|
47
47
|
#
|
48
48
|
|
49
|
-
|
50
|
-
require 'net/https'
|
51
|
-
require 'uri'
|
52
|
-
require 'zlib'
|
53
|
-
require 'stringio'
|
54
|
-
|
55
|
-
require 'rubygems'
|
56
|
-
|
57
|
-
gem 'builder', '>= 2.0.0'
|
58
|
-
require 'builder'
|
59
|
-
|
60
|
-
gem 'facets', '>= 2.4'
|
61
|
-
require 'facets/openhash'
|
62
|
-
|
63
49
|
require 'rforce/binding'
|
64
|
-
require 'rforce/
|
65
|
-
begin; require 'rforce/soap_response_hpricot'; rescue LoadError; end
|
66
|
-
begin; require 'rforce/soap_response_expat'; rescue LoadError; end
|
67
|
-
|
50
|
+
require 'rforce/soap_response'
|
68
51
|
|
69
52
|
module RForce
|
70
|
-
# Use the fastest XML parser available.
|
71
|
-
def self.parser(name)
|
72
|
-
RForce.const_get(name) rescue nil
|
73
|
-
end
|
74
|
-
|
75
|
-
SoapResponse =
|
76
|
-
parser(:SoapResponseExpat) ||
|
77
|
-
parser(:SoapResponseHpricot) ||
|
78
|
-
SoapResponseRexml
|
79
|
-
|
80
53
|
# Expand Ruby data structures into XML.
|
81
54
|
def expand(builder, args, xmlns = nil)
|
82
55
|
# Nest arrays: [:a, 1, :b, 2] => [[:a, 1], [:b, 2]]
|
@@ -111,5 +84,4 @@ module RForce
|
|
111
84
|
end
|
112
85
|
end
|
113
86
|
end
|
114
|
-
|
115
87
|
end
|
data/lib/rforce/binding.rb
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
require 'net/https'
|
2
|
+
require 'uri'
|
3
|
+
require 'zlib'
|
4
|
+
require 'stringio'
|
5
|
+
require 'builder'
|
6
|
+
|
7
|
+
|
1
8
|
module RForce
|
2
9
|
# Implements the connection to the SalesForce server.
|
3
10
|
class Binding
|
@@ -84,10 +91,13 @@ module RForce
|
|
84
91
|
# a hash or (if order is important) an array of alternating
|
85
92
|
# keys and values.
|
86
93
|
def call_remote(method, args)
|
94
|
+
|
95
|
+
urn, soap_url = block_given? ? yield : ["urn:partner.soap.sforce.com", @url.path]
|
96
|
+
|
87
97
|
# Create XML text from the arguments.
|
88
98
|
expanded = ''
|
89
99
|
@builder = Builder::XmlMarkup.new(:target => expanded)
|
90
|
-
expand(@builder, {method => args},
|
100
|
+
expand(@builder, {method => args}, urn)
|
91
101
|
|
92
102
|
extra_headers = ""
|
93
103
|
extra_headers << (AssignmentRuleHeaderUsingRuleId % assignment_rule_id) if assignment_rule_id
|
@@ -128,7 +138,7 @@ module RForce
|
|
128
138
|
end
|
129
139
|
|
130
140
|
# Send the request to the server and read the response.
|
131
|
-
response = @server.post2(
|
141
|
+
response = @server.post2(soap_url, request.lstrip, headers)
|
132
142
|
|
133
143
|
# decode if we have encoding
|
134
144
|
content = decode(response)
|
@@ -142,7 +152,7 @@ module RForce
|
|
142
152
|
request = encode(request)
|
143
153
|
|
144
154
|
# Send the request to the server and read the response.
|
145
|
-
response = @server.post2(
|
155
|
+
response = @server.post2(soap_url, request.lstrip, headers)
|
146
156
|
|
147
157
|
content = decode(response)
|
148
158
|
end
|
data/lib/rforce/soap_pullable.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'facets/openhash'
|
2
|
+
|
1
3
|
module RForce
|
2
4
|
module SoapPullable
|
3
5
|
SOAP_ENVELOPE = 'soapenv:Envelope'
|
@@ -21,7 +23,11 @@ module RForce
|
|
21
23
|
end
|
22
24
|
|
23
25
|
def text(data)
|
24
|
-
|
26
|
+
adding = data.strip.empty? ? nil : data
|
27
|
+
|
28
|
+
if adding
|
29
|
+
@current_value = (@current_value || '') + adding
|
30
|
+
end
|
25
31
|
end
|
26
32
|
|
27
33
|
def tag_end(name)
|
@@ -0,0 +1,12 @@
|
|
1
|
+
begin; require 'rforce/soap_response_hpricot'; rescue LoadError; end
|
2
|
+
begin; require 'rforce/soap_response_expat'; rescue LoadError; end
|
3
|
+
require 'rforce/soap_response_rexml'
|
4
|
+
|
5
|
+
|
6
|
+
module RForce
|
7
|
+
# Use the fastest XML parser available.
|
8
|
+
SoapResponse =
|
9
|
+
RForce::const_get(:SoapResponseExpat) ||
|
10
|
+
RForce::const_get(:SoapResponseHpricot) ||
|
11
|
+
SoapResponseRexml
|
12
|
+
end
|
@@ -8,8 +8,8 @@ module RForce
|
|
8
8
|
def initialize(content)
|
9
9
|
@content = content
|
10
10
|
end
|
11
|
-
|
12
|
-
def parse
|
11
|
+
|
12
|
+
def parse
|
13
13
|
@current_value = nil
|
14
14
|
@stack = []
|
15
15
|
@parsed = OpenHash.new({})
|
@@ -25,7 +25,7 @@ module RForce
|
|
25
25
|
when XML::Parser::END_ELEM then
|
26
26
|
tag_end name
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
29
|
break if @done
|
30
30
|
end
|
31
31
|
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'hpricot'
|
2
|
+
require 'cgi'
|
2
3
|
|
3
4
|
|
4
5
|
module RForce
|
@@ -14,9 +15,13 @@ module RForce
|
|
14
15
|
node = document % 'soapenv:Body'
|
15
16
|
self.class.node_to_ruby node
|
16
17
|
end
|
17
|
-
|
18
|
+
|
18
19
|
private
|
19
|
-
|
20
|
+
|
21
|
+
def self.unescapeXML(string)
|
22
|
+
CGI.unescapeHTML(string).gsub("'", "'")
|
23
|
+
end
|
24
|
+
|
20
25
|
def self.node_to_ruby(node)
|
21
26
|
# Convert text nodes into simple strings.
|
22
27
|
children = (node.children || []).reject do |c|
|
@@ -24,11 +29,11 @@ module RForce
|
|
24
29
|
end
|
25
30
|
|
26
31
|
if node.is_a?(Hpricot::Text)
|
27
|
-
return node.
|
32
|
+
return SoapResponseHpricot.unescapeXML(node.inspect[1..-2])
|
28
33
|
end
|
29
|
-
|
34
|
+
|
30
35
|
if children.first.is_a?(Hpricot::Text)
|
31
|
-
return children.first.
|
36
|
+
return SoapResponseHpricot.unescapeXML(children.first.inspect[1..-2])
|
32
37
|
end
|
33
38
|
|
34
39
|
# Convert nodes with children into MethodHashes.
|
@@ -38,11 +43,11 @@ module RForce
|
|
38
43
|
children.each do |e|
|
39
44
|
next if e.is_a?(Hpricot::Text) && e.to_s.strip.empty?
|
40
45
|
name = e.name
|
41
|
-
|
46
|
+
|
42
47
|
if name.include? ':'
|
43
48
|
name = name.split(':').last
|
44
49
|
end
|
45
|
-
|
50
|
+
|
46
51
|
name = name.to_sym
|
47
52
|
|
48
53
|
case elements[name]
|
data/lib/rforce/version.rb
CHANGED
data/spec/rforce_spec.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
describe 'expand' do
|
4
4
|
it 'turns Ruby into XML' do
|
@@ -68,6 +68,25 @@ describe 'a SoapResponse implementation' do
|
|
68
68
|
pending 'hpricot not installed' unless @hpricot_recs
|
69
69
|
@hpricot_recs.should resemble(@rexml_recs)
|
70
70
|
end
|
71
|
+
|
72
|
+
it 'understands XML entities' do
|
73
|
+
expected = "Bee's knees"
|
74
|
+
@rexml_recs.first.Description.should == expected
|
75
|
+
|
76
|
+
pending 'expat not installed' unless @expat_recs
|
77
|
+
@expat_recs.first.Description.should == expected
|
78
|
+
|
79
|
+
pending 'hpricot not installed' unless @hpricot
|
80
|
+
@hpricot_recs.first.Description.should == expected
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
describe 'SoapResponseHpricot' do
|
85
|
+
it 'parses basic XML entities' do
|
86
|
+
text = '<tag attr="Bee's knees & toes">'
|
87
|
+
SoapResponseHpricot.unescapeXML(text).should ==
|
88
|
+
%q(<tag attr="Bee's knees & toes">)
|
89
|
+
end
|
71
90
|
end
|
72
91
|
|
73
92
|
CreateXml = <<HERE.gsub(/\n\s*/, '')
|
@@ -84,4 +103,3 @@ CreateXml = <<HERE.gsub(/\n\s*/, '')
|
|
84
103
|
</partner:sObjects>
|
85
104
|
</partner:create>
|
86
105
|
HERE
|
87
|
-
|
data/spec/soap-response.xml
CHANGED
@@ -39,7 +39,7 @@
|
|
39
39
|
<sf:AssistantName xsi:nil="true"/>
|
40
40
|
<sf:LeadSource xsi:nil="true"/>
|
41
41
|
<sf:Birthdate xsi:nil="true"/>
|
42
|
-
<sf:Description
|
42
|
+
<sf:Description>Bee's knees</sf:Description>
|
43
43
|
<sf:OwnerId>0000000000ABcDEFGH</sf:OwnerId>
|
44
44
|
<sf:CreatedDate>2008-03-01T01:52:35.000Z</sf:CreatedDate>
|
45
45
|
<sf:CreatedById>0000000000ABcDEFGH</sf:CreatedById>
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rforce
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: "0.
|
4
|
+
version: "0.4"
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ian Dees
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2010-01-21 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -33,14 +33,14 @@ dependencies:
|
|
33
33
|
version: "2.4"
|
34
34
|
version:
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
|
-
name:
|
36
|
+
name: rspec
|
37
37
|
type: :development
|
38
38
|
version_requirement:
|
39
39
|
version_requirements: !ruby/object:Gem::Requirement
|
40
40
|
requirements:
|
41
41
|
- - ">="
|
42
42
|
- !ruby/object:Gem::Version
|
43
|
-
version: 1.
|
43
|
+
version: "1.3"
|
44
44
|
version:
|
45
45
|
- !ruby/object:Gem::Dependency
|
46
46
|
name: hoe
|
@@ -50,7 +50,7 @@ dependencies:
|
|
50
50
|
requirements:
|
51
51
|
- - ">="
|
52
52
|
- !ruby/object:Gem::Version
|
53
|
-
version:
|
53
|
+
version: 2.5.0
|
54
54
|
version:
|
55
55
|
description: RForce is a simple, usable binding to the SalesForce API.
|
56
56
|
email:
|
@@ -71,6 +71,7 @@ files:
|
|
71
71
|
- lib/rforce.rb
|
72
72
|
- lib/rforce/binding.rb
|
73
73
|
- lib/rforce/soap_pullable.rb
|
74
|
+
- lib/rforce/soap_response.rb
|
74
75
|
- lib/rforce/soap_response_expat.rb
|
75
76
|
- lib/rforce/soap_response_hpricot.rb
|
76
77
|
- lib/rforce/soap_response_rexml.rb
|
@@ -79,10 +80,11 @@ files:
|
|
79
80
|
- spec/soap-response.xml
|
80
81
|
- spec/spec.opts
|
81
82
|
- spec/spec_helper.rb
|
82
|
-
- tasks/rspec.rake
|
83
83
|
- tasks/timing.rake
|
84
84
|
has_rdoc: true
|
85
85
|
homepage: http://rforce.rubyforge.org
|
86
|
+
licenses: []
|
87
|
+
|
86
88
|
post_install_message:
|
87
89
|
rdoc_options:
|
88
90
|
- --main
|
@@ -104,9 +106,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
104
106
|
requirements: []
|
105
107
|
|
106
108
|
rubyforge_project: rforce
|
107
|
-
rubygems_version: 1.3.
|
109
|
+
rubygems_version: 1.3.5
|
108
110
|
signing_key:
|
109
|
-
specification_version:
|
111
|
+
specification_version: 3
|
110
112
|
summary: RForce is a simple, usable binding to the SalesForce API.
|
111
113
|
test_files: []
|
112
114
|
|
data/tasks/rspec.rake
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
begin
|
2
|
-
require 'spec'
|
3
|
-
rescue LoadError
|
4
|
-
require 'rubygems'
|
5
|
-
require 'spec'
|
6
|
-
end
|
7
|
-
begin
|
8
|
-
require 'spec/rake/spectask'
|
9
|
-
rescue LoadError
|
10
|
-
puts <<-EOS
|
11
|
-
To use rspec for testing you must install rspec gem:
|
12
|
-
gem install rspec
|
13
|
-
EOS
|
14
|
-
exit(0)
|
15
|
-
end
|
16
|
-
|
17
|
-
desc "Run the specs"
|
18
|
-
Spec::Rake::SpecTask.new do |t|
|
19
|
-
t.spec_opts = ['--options', "spec/spec.opts"]
|
20
|
-
t.spec_files = FileList['spec/**/*_spec.rb']
|
21
|
-
end
|