rforce 0.8.1 → 0.9
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 +7 -0
- data/Manifest.txt +0 -1
- data/README.txt +1 -4
- data/Rakefile +3 -0
- data/lib/rforce/binding.rb +8 -4
- data/lib/rforce/soap_pullable.rb +15 -3
- data/lib/rforce/soap_response_hpricot.rb +20 -4
- data/lib/rforce/soap_response_nokogiri.rb +29 -9
- data/lib/rforce/version.rb +1 -1
- data/spec/rforce_spec.rb +80 -27
- data/spec/spec_helper.rb +0 -62
- metadata +94 -16
data/History.txt
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
== 0.9.0 2012-09-03
|
2
|
+
* 1 minor enhancement
|
3
|
+
* Automatically correct duplicate ID fields (Tomas Svarovsky)
|
4
|
+
* 1 bug fix
|
5
|
+
* Removed QueryOptions SOAP header when no block passed to
|
6
|
+
call_remote (clicrdv)
|
7
|
+
|
1
8
|
== 0.8.1 2012-01-29
|
2
9
|
* 1 minor enhancement
|
3
10
|
* Updated history file
|
data/Manifest.txt
CHANGED
data/README.txt
CHANGED
@@ -47,10 +47,7 @@ Rather than enforcing adherence to the sforce.com schema, RForce assumes you are
|
|
47
47
|
'find {McFakerson Co} in name fields returning account(id)'
|
48
48
|
|
49
49
|
account = answer.searchResponse.result.searchRecords.record
|
50
|
-
account = account.first if account.is_a? Array
|
51
|
-
|
52
50
|
account_id = account.Id
|
53
|
-
account_id = account_id.first if account_id.is_a? Array
|
54
51
|
|
55
52
|
=== Creating a record
|
56
53
|
|
@@ -76,7 +73,7 @@ Rather than enforcing adherence to the sforce.com schema, RForce assumes you are
|
|
76
73
|
|
77
74
|
== LICENSE:
|
78
75
|
|
79
|
-
Copyright (c) 2005-
|
76
|
+
Copyright (c) 2005-2012 Ian Dees and contributors
|
80
77
|
|
81
78
|
Permission is hereby granted, free of charge, to any person obtaining
|
82
79
|
a copy of this software and associated documentation files (the
|
data/Rakefile
CHANGED
@@ -15,6 +15,9 @@ Hoe.spec 'rforce' do
|
|
15
15
|
|
16
16
|
self.extra_dev_deps << ['rspec', '~> 2.8']
|
17
17
|
self.extra_dev_deps << ['hoe-gemspec2', '~> 1.1']
|
18
|
+
self.extra_dev_deps << ['hpricot', '~> 0.8']
|
19
|
+
self.extra_dev_deps << ['nokogiri', '~> 1.5']
|
20
|
+
self.extra_dev_deps << ['xmlparser', '~> 0.7']
|
18
21
|
|
19
22
|
self.rdoc_locations = ['undees@rforce.rubyforge.org:/var/www/gforge-projects/rforce']
|
20
23
|
self.remote_rdoc_dir = ''
|
data/lib/rforce/binding.rb
CHANGED
@@ -30,9 +30,6 @@ module RForce
|
|
30
30
|
<partner:SessionHeader soap:mustUnderstand='1'>
|
31
31
|
<partner:sessionId>%s</partner:sessionId>
|
32
32
|
</partner:SessionHeader>
|
33
|
-
<partner:QueryOptions soap:mustUnderstand='1'>
|
34
|
-
<partner:batchSize>%d</partner:batchSize>
|
35
|
-
</partner:QueryOptions>
|
36
33
|
%s
|
37
34
|
</soap:Header>
|
38
35
|
<soap:Body>
|
@@ -41,6 +38,7 @@ module RForce
|
|
41
38
|
</soap:Envelope>
|
42
39
|
HERE
|
43
40
|
|
41
|
+
QueryOptions = '<partner:QueryOptions soap:mustUnderstand=\'1\'><partner:batchSize>%d</partner:batchSize></partner:QueryOptions>'
|
44
42
|
AssignmentRuleHeaderUsingRuleId = '<partner:AssignmentRuleHeader soap:mustUnderstand="1"><partner:assignmentRuleId>%s</partner:assignmentRuleId></partner:AssignmentRuleHeader>'
|
45
43
|
AssignmentRuleHeaderUsingDefaultRule = '<partner:AssignmentRuleHeader soap:mustUnderstand="1"><partner:useDefaultRule>true</partner:useDefaultRule></partner:AssignmentRuleHeader>'
|
46
44
|
MruHeader = '<partner:MruHeader soap:mustUnderstand="1"><partner:updateMru>true</partner:updateMru></partner:MruHeader>'
|
@@ -159,6 +157,12 @@ module RForce
|
|
159
157
|
expand(@builder, {method => args}, urn)
|
160
158
|
|
161
159
|
extra_headers = ""
|
160
|
+
|
161
|
+
# QueryOptions is not valid when making an Apex Webservice SOAP call
|
162
|
+
if !block_given?
|
163
|
+
extra_headers << (QueryOptions % @batch_size)
|
164
|
+
end
|
165
|
+
|
162
166
|
extra_headers << (AssignmentRuleHeaderUsingRuleId % assignment_rule_id) if assignment_rule_id
|
163
167
|
extra_headers << AssignmentRuleHeaderUsingDefaultRule if use_default_rule
|
164
168
|
extra_headers << MruHeader if update_mru
|
@@ -176,7 +180,7 @@ module RForce
|
|
176
180
|
|
177
181
|
# Fill in the blanks of the SOAP envelope with our
|
178
182
|
# session ID and the expanded XML of our request.
|
179
|
-
request = (Envelope % [@session_id,
|
183
|
+
request = (Envelope % [@session_id, extra_headers, expanded])
|
180
184
|
|
181
185
|
# reset the batch size for the next request
|
182
186
|
@batch_size = DEFAULT_BATCH_SIZE
|
data/lib/rforce/soap_pullable.rb
CHANGED
@@ -54,7 +54,7 @@ module RForce
|
|
54
54
|
# be empty.
|
55
55
|
raise 'Parser is confused' unless working_hash.empty? || @current_value.nil?
|
56
56
|
|
57
|
-
use_value = working_hash.empty? ? @current_value : working_hash
|
57
|
+
use_value = working_hash.empty? ? convert(@current_value) : working_hash
|
58
58
|
tag_sym = tag_name.to_sym
|
59
59
|
element = @stack[index][tag_sym]
|
60
60
|
|
@@ -82,12 +82,24 @@ module RForce
|
|
82
82
|
end
|
83
83
|
else
|
84
84
|
# We are here because the name of our current element has not been
|
85
|
-
# assigned yet
|
86
|
-
@stack[index][tag_sym] = use_value
|
85
|
+
# assigned yet; anything inside 'records' should be an array
|
86
|
+
@stack[index][tag_sym] = (:records == tag_sym ? [use_value] : use_value)
|
87
87
|
end
|
88
88
|
|
89
89
|
# We are done with the current tag so reset the data for the next one
|
90
90
|
@current_value = nil
|
91
91
|
end
|
92
|
+
|
93
|
+
def convert(string)
|
94
|
+
return nil if string.nil?
|
95
|
+
s = string.strip
|
96
|
+
|
97
|
+
case s
|
98
|
+
when '' then nil
|
99
|
+
when /^\d+$/ then Integer(s)
|
100
|
+
when 'true', 'false' then ('true' == s)
|
101
|
+
else s
|
102
|
+
end
|
103
|
+
end
|
92
104
|
end
|
93
105
|
end
|
@@ -29,11 +29,11 @@ module RForce
|
|
29
29
|
end
|
30
30
|
|
31
31
|
if node.is_a?(Hpricot::Text)
|
32
|
-
return SoapResponseHpricot.unescapeXML(node.inspect[1..-2])
|
32
|
+
return convert(SoapResponseHpricot.unescapeXML(node.inspect[1..-2]))
|
33
33
|
end
|
34
34
|
|
35
35
|
if children.first.is_a?(Hpricot::Text)
|
36
|
-
return SoapResponseHpricot.unescapeXML(children.first.inspect[1..-2])
|
36
|
+
return convert(SoapResponseHpricot.unescapeXML(children.first.inspect[1..-2]))
|
37
37
|
end
|
38
38
|
|
39
39
|
# Convert nodes with children into MethodHashes.
|
@@ -52,18 +52,22 @@ module RForce
|
|
52
52
|
|
53
53
|
case elements[name]
|
54
54
|
# The most common case: unique child element tags.
|
55
|
-
when NilClass then
|
55
|
+
when NilClass then
|
56
|
+
# <records> contents are always arrays
|
57
|
+
elements[name] = :records == name ? [node_to_ruby(e)] : node_to_ruby(e)
|
56
58
|
|
57
59
|
# Non-unique child elements become arrays:
|
58
60
|
|
59
61
|
# We've already created the array: just
|
60
62
|
# add the element.
|
61
|
-
when Array then
|
63
|
+
when Array then
|
64
|
+
elements[name] << node_to_ruby(e)
|
62
65
|
|
63
66
|
# We haven't created the array yet: do so,
|
64
67
|
# then put the existing element in, followed
|
65
68
|
# by the new one.
|
66
69
|
else
|
70
|
+
next if :Id == name # avoid duplicate <Id> tags
|
67
71
|
elements[name] = [elements[name]]
|
68
72
|
elements[name] << node_to_ruby(e)
|
69
73
|
end
|
@@ -71,5 +75,17 @@ module RForce
|
|
71
75
|
|
72
76
|
return elements.empty? ? nil : elements
|
73
77
|
end
|
78
|
+
|
79
|
+
def self.convert(string)
|
80
|
+
return nil if string.nil?
|
81
|
+
s = string.strip
|
82
|
+
|
83
|
+
case s
|
84
|
+
when '' then nil
|
85
|
+
when /^\d+$/ then Integer(s)
|
86
|
+
when 'true', 'false' then ('true' == s)
|
87
|
+
else s
|
88
|
+
end
|
89
|
+
end
|
74
90
|
end
|
75
91
|
end
|
@@ -12,34 +12,54 @@ module RForce
|
|
12
12
|
to_hash(body)
|
13
13
|
end
|
14
14
|
|
15
|
-
|
15
|
+
private
|
16
|
+
|
16
17
|
def to_hash(node)
|
17
|
-
if node.text?
|
18
|
-
stripped = node.text.strip
|
19
|
-
return stripped.empty? ? nil : stripped
|
20
|
-
end
|
18
|
+
return parse_text(text) if node.text?
|
21
19
|
|
22
20
|
children = node.children.reject {|c| c.text? && c.text.strip.empty? }
|
23
21
|
|
24
22
|
return nil if children.empty?
|
25
23
|
|
26
|
-
|
24
|
+
if (child = children.first).text?
|
25
|
+
return parse_text(child.text)
|
26
|
+
end
|
27
27
|
|
28
28
|
elements = MethodHash.new
|
29
29
|
|
30
30
|
children.each do |elem|
|
31
31
|
name = elem.name.split(":").last.to_sym
|
32
|
-
|
32
|
+
|
33
33
|
if !elements[name]
|
34
|
-
|
34
|
+
# anything inside 'records' should be an array
|
35
|
+
elements[name] = elem.name == 'records' ? [to_hash(elem)] : to_hash(elem)
|
35
36
|
elsif Array === elements[name]
|
36
37
|
elements[name] << to_hash(elem)
|
37
38
|
else
|
39
|
+
next if elem.name == "Id" # Id fields are duplicated
|
38
40
|
elements[name] = [elements[name]] << to_hash(elem)
|
39
41
|
end
|
40
42
|
end
|
41
|
-
|
43
|
+
|
42
44
|
return elements.empty? ? nil : elements
|
43
45
|
end
|
46
|
+
|
47
|
+
def parse_text(text)
|
48
|
+
text.strip!
|
49
|
+
|
50
|
+
return nil if text.empty?
|
51
|
+
|
52
|
+
text = Integer(text) rescue text # parse numbers
|
53
|
+
|
54
|
+
boolean?(text) ? boolean(text) : text
|
55
|
+
end
|
56
|
+
|
57
|
+
def boolean(string)
|
58
|
+
string == "true"
|
59
|
+
end
|
60
|
+
|
61
|
+
def boolean?(string)
|
62
|
+
%w{true false}.include?(string)
|
63
|
+
end
|
44
64
|
end
|
45
65
|
end
|
data/lib/rforce/version.rb
CHANGED
data/spec/rforce_spec.rb
CHANGED
@@ -50,8 +50,8 @@ describe 'a SoapResponse implementation' do
|
|
50
50
|
@contents = File.open(fname) {|f| f.read}
|
51
51
|
|
52
52
|
[:rexml, :expat, :hpricot, :nokogiri].each do |processor|
|
53
|
-
name
|
54
|
-
variable = "@#{processor}_recs"
|
53
|
+
name = "SoapResponse#{processor.to_s.capitalize}".to_sym
|
54
|
+
variable = "@#{processor}_recs".to_sym
|
55
55
|
|
56
56
|
results = begin
|
57
57
|
klass = RForce.const_get name
|
@@ -70,33 +70,19 @@ describe 'a SoapResponse implementation' do
|
|
70
70
|
end
|
71
71
|
|
72
72
|
it 'returns the same results with expat' do
|
73
|
-
pending 'duplicate <Id> tags'
|
74
73
|
@expat_recs.should == @rexml_recs
|
75
74
|
end
|
76
75
|
|
77
76
|
it 'returns the same results with hpricot' do
|
78
|
-
pending 'duplicate <Id> tags'
|
79
77
|
@hpricot_recs.should == @rexml_recs
|
80
78
|
end
|
81
79
|
|
82
|
-
it 'returns similar results with expat' do
|
83
|
-
pending 'expat not installed' unless @expat_recs
|
84
|
-
@expat_recs.should resemble(@rexml_recs)
|
85
|
-
end
|
86
|
-
|
87
|
-
it 'returns similar results with hpricot' do
|
88
|
-
pending 'hpricot not installed' unless @hpricot_recs
|
89
|
-
@hpricot_recs.should resemble(@rexml_recs)
|
90
|
-
end
|
91
|
-
|
92
80
|
it 'understands XML entities' do
|
93
81
|
expected = "Bee's knees"
|
94
82
|
@rexml_recs.first.Description.should == expected
|
95
83
|
|
96
|
-
pending 'expat not installed' unless @expat_recs
|
97
84
|
@expat_recs.first.Description.should == expected
|
98
85
|
|
99
|
-
pending 'hpricot not installed' unless @hpricot_recs
|
100
86
|
@hpricot_recs.first.Description.should == expected
|
101
87
|
end
|
102
88
|
end
|
@@ -109,15 +95,16 @@ describe 'SoapResponseHpricot' do
|
|
109
95
|
end
|
110
96
|
end
|
111
97
|
|
112
|
-
|
113
|
-
SOAP_WRAPPER = <<-XML
|
98
|
+
SOAP_WRAPPER = <<-XML
|
114
99
|
<?xml version="1.0" encoding="UTF-8"?>
|
115
100
|
<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" xmlns:sf="urn:sobject.partner.soap.sforce.com">
|
116
101
|
<soapenv:Body>
|
117
102
|
%s
|
118
|
-
</
|
103
|
+
</soapenv:Body>
|
119
104
|
</soapenv:Envelope>
|
120
105
|
XML
|
106
|
+
|
107
|
+
shared_examples_for 'a SOAP response' do
|
121
108
|
def wrap_in_salesforce_envelope(xml)
|
122
109
|
SOAP_WRAPPER % xml
|
123
110
|
end
|
@@ -128,7 +115,7 @@ XML
|
|
128
115
|
<bar>Bin</bar>
|
129
116
|
</foo>""")
|
130
117
|
|
131
|
-
|
118
|
+
klass.new(xml).parse.should == {:foo => {:bar => "Bin"}}
|
132
119
|
end
|
133
120
|
|
134
121
|
it 'parses repeated elements into arrays' do
|
@@ -138,34 +125,100 @@ XML
|
|
138
125
|
<bar>Bash</bar>
|
139
126
|
</foo>""")
|
140
127
|
|
141
|
-
|
128
|
+
klass.new(xml).parse.should == {:foo => {:bar => ["Bin", "Bash"]}}
|
129
|
+
end
|
130
|
+
|
131
|
+
it 'parses records with single record as an array' do
|
132
|
+
xml = wrap_in_salesforce_envelope("""
|
133
|
+
<records>
|
134
|
+
<sf:type>Contact</sf:type>
|
135
|
+
</records>""")
|
136
|
+
|
137
|
+
klass.new(xml).parse.should == {:records => [{:type => "Contact"}]}
|
138
|
+
end
|
139
|
+
|
140
|
+
it 'parses records with multiple records as an array' do
|
141
|
+
xml = wrap_in_salesforce_envelope("""
|
142
|
+
<records>
|
143
|
+
<sf:type>Contact</sf:type>
|
144
|
+
</records>
|
145
|
+
<records>
|
146
|
+
<sf:type>Contact</sf:type>
|
147
|
+
</records>""")
|
148
|
+
|
149
|
+
klass.new(xml).parse.should == {:records => [{:type => "Contact"}, {:type => "Contact"}]}
|
150
|
+
end
|
151
|
+
|
152
|
+
it 'parses Id array as single string' do
|
153
|
+
xml = wrap_in_salesforce_envelope("""
|
154
|
+
<foo>
|
155
|
+
<sf:Id>some_id</sf:Id>
|
156
|
+
<sf:Id>some_id</sf:Id>
|
157
|
+
</foo>""")
|
158
|
+
|
159
|
+
klass.new(xml).parse.should == {:foo => {:Id => "some_id"}}
|
160
|
+
end
|
161
|
+
|
162
|
+
it 'parses booleans and numbers' do
|
163
|
+
xml = wrap_in_salesforce_envelope("""
|
164
|
+
<foo>
|
165
|
+
<size>20</size>
|
166
|
+
<done>true</done>
|
167
|
+
<more>false</more>
|
168
|
+
<string>normal string</string>
|
169
|
+
</foo>""")
|
170
|
+
|
171
|
+
klass.new(xml).parse.should == {:foo => {:size => 20, :done => true, :more => false, :string => "normal string"}}
|
142
172
|
end
|
143
173
|
|
144
174
|
it 'disregards namespacing when determining hash keys' do
|
145
175
|
xml = wrap_in_salesforce_envelope("""
|
146
176
|
<soapenv:foo>
|
147
177
|
<bar>Bin</bar>
|
148
|
-
<soapenv:bar>Bash</bar>
|
149
|
-
</foo>""")
|
178
|
+
<soapenv:bar>Bash</soapenv:bar>
|
179
|
+
</soapenv:foo>""")
|
150
180
|
|
151
|
-
|
181
|
+
klass.new(xml).parse.should == {:foo => {:bar => ["Bin", "Bash"]}}
|
152
182
|
end
|
153
183
|
|
154
184
|
it 'unescapes any HTML contained in text nodes' do
|
155
185
|
xml = wrap_in_salesforce_envelope("""
|
156
|
-
<
|
186
|
+
<foo>
|
157
187
|
<bar>Bin</bar>
|
158
188
|
<bar><tag attr="Bee's knees & toes"></bar>
|
159
189
|
</foo>""")
|
160
190
|
|
161
|
-
|
191
|
+
klass.new(xml).parse()[:foo][:bar].last.should == %q(<tag attr="Bee's knees & toes">)
|
162
192
|
end
|
163
193
|
|
164
194
|
it 'returns an object that can be navigated via methods in addition to keys' do
|
165
195
|
xml = wrap_in_salesforce_envelope("<foo><bar><bin>bash</bin></bar></foo>")
|
166
|
-
|
196
|
+
klass.new(xml).parse().foo.bar.bin.should == "bash"
|
167
197
|
end
|
198
|
+
end
|
168
199
|
|
200
|
+
describe 'SoapResponseNokogiri' do
|
201
|
+
it_behaves_like 'a SOAP response' do
|
202
|
+
let(:klass) { SoapResponseNokogiri }
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
describe 'SoapResponseExpat' do
|
207
|
+
it_behaves_like 'a SOAP response' do
|
208
|
+
let(:klass) { SoapResponseExpat }
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
describe 'SoapResponseRexml' do
|
213
|
+
it_behaves_like 'a SOAP response' do
|
214
|
+
let(:klass) { SoapResponseRexml }
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
describe 'SoapResponseHpricot' do
|
219
|
+
it_behaves_like 'a SOAP response' do
|
220
|
+
let(:klass) { SoapResponseHpricot }
|
221
|
+
end
|
169
222
|
end
|
170
223
|
|
171
224
|
CreateXml = <<HERE.gsub(/\n\s*/, '')
|
data/spec/spec_helper.rb
CHANGED
@@ -2,65 +2,3 @@ gem 'builder'
|
|
2
2
|
require 'rforce'
|
3
3
|
|
4
4
|
include RForce
|
5
|
-
|
6
|
-
module RForceXmlMatchers
|
7
|
-
class Resemble
|
8
|
-
def initialize(expected)
|
9
|
-
@expected = expected
|
10
|
-
end
|
11
|
-
|
12
|
-
def matches?(actual)
|
13
|
-
@actual = actual
|
14
|
-
|
15
|
-
return false if different 'size',
|
16
|
-
@actual.size,
|
17
|
-
@expected.size
|
18
|
-
|
19
|
-
@expected.each_with_index do |exp_rec, index|
|
20
|
-
act_rec = @actual[index]
|
21
|
-
|
22
|
-
# Only bother to look at the first <Id>
|
23
|
-
# tag in a (presumably) duplicated set.
|
24
|
-
act_id = first_id(act_rec[:Id])
|
25
|
-
exp_id = first_id(exp_rec[:Id])
|
26
|
-
|
27
|
-
return false if different '<Id>', act_id, exp_id
|
28
|
-
return false if different 'keys', act_rec.keys, exp_rec.keys
|
29
|
-
|
30
|
-
exp_rec.each do |key, _|
|
31
|
-
unless key == :Id
|
32
|
-
return false if different key, act_rec[key], exp_rec[key]
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
return true
|
38
|
-
end
|
39
|
-
|
40
|
-
def failure_message_for_should
|
41
|
-
%Q{expected "#{@actual.to_s[0..9]}..." } +
|
42
|
-
%Q{to resemble "#{@expected.to_s[0..9]}...":\n} +
|
43
|
-
@difference
|
44
|
-
end
|
45
|
-
|
46
|
-
private
|
47
|
-
|
48
|
-
def first_id(id)
|
49
|
-
id.is_a?(Array) ? id.first : id
|
50
|
-
end
|
51
|
-
|
52
|
-
def different(name, act, exp)
|
53
|
-
return nil if act == exp
|
54
|
-
@difference = %Q{ for #{name}, got:\n } +
|
55
|
-
%Q{#{act.inspect}\n expected:\n #{exp.inspect}}
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
def resemble(expected)
|
60
|
-
Resemble.new(expected)
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
RSpec.configure do |config|
|
65
|
-
config.include(RForceXmlMatchers)
|
66
|
-
end
|
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.9'
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-09-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: builder
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,15 @@ dependencies:
|
|
21
21
|
version: '3.0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '3.0'
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
31
|
name: oauth
|
27
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
28
33
|
none: false
|
29
34
|
requirements:
|
30
35
|
- - ~>
|
@@ -32,10 +37,15 @@ dependencies:
|
|
32
37
|
version: '0.4'
|
33
38
|
type: :runtime
|
34
39
|
prerelease: false
|
35
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0.4'
|
36
46
|
- !ruby/object:Gem::Dependency
|
37
47
|
name: rspec
|
38
|
-
requirement:
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
39
49
|
none: false
|
40
50
|
requirements:
|
41
51
|
- - ~>
|
@@ -43,10 +53,15 @@ dependencies:
|
|
43
53
|
version: '2.8'
|
44
54
|
type: :development
|
45
55
|
prerelease: false
|
46
|
-
version_requirements:
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '2.8'
|
47
62
|
- !ruby/object:Gem::Dependency
|
48
63
|
name: hoe-gemspec2
|
49
|
-
requirement:
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
50
65
|
none: false
|
51
66
|
requirements:
|
52
67
|
- - ~>
|
@@ -54,10 +69,63 @@ dependencies:
|
|
54
69
|
version: '1.1'
|
55
70
|
type: :development
|
56
71
|
prerelease: false
|
57
|
-
version_requirements:
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '1.1'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: hpricot
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ~>
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0.8'
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0.8'
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: nokogiri
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ~>
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '1.5'
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ~>
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '1.5'
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: xmlparser
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ~>
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0.7'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ~>
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0.7'
|
58
126
|
- !ruby/object:Gem::Dependency
|
59
127
|
name: rdoc
|
60
|
-
requirement:
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
61
129
|
none: false
|
62
130
|
requirements:
|
63
131
|
- - ~>
|
@@ -65,10 +133,15 @@ dependencies:
|
|
65
133
|
version: '3.10'
|
66
134
|
type: :development
|
67
135
|
prerelease: false
|
68
|
-
version_requirements:
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ~>
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: '3.10'
|
69
142
|
- !ruby/object:Gem::Dependency
|
70
143
|
name: hoe
|
71
|
-
requirement:
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
72
145
|
none: false
|
73
146
|
requirements:
|
74
147
|
- - ~>
|
@@ -76,7 +149,12 @@ dependencies:
|
|
76
149
|
version: '2.13'
|
77
150
|
type: :development
|
78
151
|
prerelease: false
|
79
|
-
version_requirements:
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
154
|
+
requirements:
|
155
|
+
- - ~>
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: '2.13'
|
80
158
|
description: RForce is a simple, usable binding to the Salesforce API.
|
81
159
|
email:
|
82
160
|
- undees@gmail.com
|
@@ -87,7 +165,6 @@ extra_rdoc_files:
|
|
87
165
|
- Manifest.txt
|
88
166
|
- README.txt
|
89
167
|
files:
|
90
|
-
- .gemtest
|
91
168
|
- History.txt
|
92
169
|
- Manifest.txt
|
93
170
|
- README.txt
|
@@ -107,6 +184,7 @@ files:
|
|
107
184
|
- spec/spec.opts
|
108
185
|
- spec/spec_helper.rb
|
109
186
|
- tasks/timing.rake
|
187
|
+
- .gemtest
|
110
188
|
homepage: http://rforce.rubyforge.org
|
111
189
|
licenses: []
|
112
190
|
post_install_message:
|
@@ -129,7 +207,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
129
207
|
version: '0'
|
130
208
|
requirements: []
|
131
209
|
rubyforge_project: rforce
|
132
|
-
rubygems_version: 1.8.
|
210
|
+
rubygems_version: 1.8.23
|
133
211
|
signing_key:
|
134
212
|
specification_version: 3
|
135
213
|
summary: RForce is a simple, usable binding to the Salesforce API.
|