rforce 0.8.1 → 0.9
Sign up to get free protection for your applications and to get access to all the features.
- 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.
|