rforce 0.8.1 → 0.9

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -1,4 +1,3 @@
1
- .gemtest
2
1
  History.txt
3
2
  Manifest.txt
4
3
  README.txt
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-2011 Ian Dees and contributors
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 = ''
@@ -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, @batch_size, extra_headers, expanded])
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
@@ -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 elements[name] = node_to_ruby(e)
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 elements[name] << node_to_ruby(e)
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
- private
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
- return children.first.text.strip if children.first.text?
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
- elements[name] = to_hash(elem)
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
@@ -1,3 +1,3 @@
1
1
  module RForce
2
- VERSION = '0.8.1'
2
+ VERSION = '0.9'
3
3
  end
@@ -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 = "SoapResponse#{processor.to_s.capitalize}"
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
- describe 'SoapResponseNokogiri' do
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
- </soapnenv:Body>
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
- SoapResponseNokogiri.new(xml).parse.should == {:foo => {:bar => "Bin"}}
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
- SoapResponseNokogiri.new(xml).parse.should == {:foo => {:bar => ["Bin", "Bash"]}}
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
- SoapResponseNokogiri.new(xml).parse.should == {:foo => {:bar => ["Bin", "Bash"]}}
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
- <soapenv:foo>
186
+ <foo>
157
187
  <bar>Bin</bar>
158
188
  <bar>&lt;tag attr=&quot;Bee&apos;s knees &amp; toes&quot;&gt;</bar>
159
189
  </foo>""")
160
190
 
161
- SoapResponseNokogiri.new(xml).parse()[:foo][:bar].last.should == %q(<tag attr="Bee's knees & toes">)
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
- SoapResponseNokogiri.new(xml).parse().foo.bar.bin.should == "bash"
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*/, '')
@@ -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.8.1
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-01-29 00:00:00.000000000Z
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: &70316342047860 !ruby/object:Gem::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: *70316342047860
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: &70316342047220 !ruby/object:Gem::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: *70316342047220
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: &70316342046460 !ruby/object:Gem::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: *70316342046460
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: &70316342045700 !ruby/object:Gem::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: *70316342045700
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: &70316342044600 !ruby/object:Gem::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: *70316342044600
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: &70316342043760 !ruby/object:Gem::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: *70316342043760
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.10
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.