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.
@@ -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.