silent-e-activerecord-activesalesforce-adapter 2.3.8.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. data/.gitignore +2 -0
  2. data/.project +17 -0
  3. data/README +80 -0
  4. data/Rakefile +21 -0
  5. data/VERSION +1 -0
  6. data/lib/active_record/connection_adapters/activesalesforce.rb +36 -0
  7. data/lib/active_record/connection_adapters/activesalesforce_adapter.rb +863 -0
  8. data/lib/active_record/connection_adapters/asf_active_record.rb +40 -0
  9. data/lib/active_record/connection_adapters/boxcar_command.rb +66 -0
  10. data/lib/active_record/connection_adapters/column_definition.rb +95 -0
  11. data/lib/active_record/connection_adapters/entity_definition.rb +59 -0
  12. data/lib/active_record/connection_adapters/id_resolver.rb +84 -0
  13. data/lib/active_record/connection_adapters/recording_binding.rb +90 -0
  14. data/lib/active_record/connection_adapters/relationship_definition.rb +81 -0
  15. data/lib/active_record/connection_adapters/result_array.rb +31 -0
  16. data/lib/active_record/connection_adapters/sid_authentication_filter.rb +57 -0
  17. data/lib/activerecord-activesalesforce-adapter.rb +1 -0
  18. data/lib/arel/engines/sql/compilers/activesalesforce_compiler.rb +6 -0
  19. data/lib/rforce.rb +87 -0
  20. data/lib/rforce/binding.rb +212 -0
  21. data/lib/rforce/method_keys.rb +14 -0
  22. data/lib/rforce/soap_pullable.rb +93 -0
  23. data/lib/rforce/soap_response.rb +9 -0
  24. data/lib/rforce/soap_response_expat.rb +36 -0
  25. data/lib/rforce/soap_response_hpricot.rb +75 -0
  26. data/lib/rforce/soap_response_rexml.rb +35 -0
  27. data/lib/rforce/version.rb +3 -0
  28. data/silent-e-activerecord-activesalesforce-adapter.gemspec +115 -0
  29. data/test/unit/basic_test.rb +204 -0
  30. data/test/unit/config.yml +5 -0
  31. data/test/unit/recorded_results/AsfUnitTestsBasicTest.test_add_notes_to_contact.recording +1966 -0
  32. data/test/unit/recorded_results/AsfUnitTestsBasicTest.test_assignment_rule_id.recording +1621 -0
  33. data/test/unit/recorded_results/AsfUnitTestsBasicTest.test_batch_insert.recording +1611 -0
  34. data/test/unit/recorded_results/AsfUnitTestsBasicTest.test_client_id.recording +1618 -0
  35. data/test/unit/recorded_results/AsfUnitTestsBasicTest.test_count_contacts.recording +1620 -0
  36. data/test/unit/recorded_results/AsfUnitTestsBasicTest.test_create_a_contact.recording +1611 -0
  37. data/test/unit/recorded_results/AsfUnitTestsBasicTest.test_find_a_contact.recording +1611 -0
  38. data/test/unit/recorded_results/AsfUnitTestsBasicTest.test_find_a_contact_by_first_name.recording +3468 -0
  39. data/test/unit/recorded_results/AsfUnitTestsBasicTest.test_find_a_contact_by_id.recording +1664 -0
  40. data/test/unit/recorded_results/AsfUnitTestsBasicTest.test_find_addresses.recording +1635 -0
  41. data/test/unit/recorded_results/AsfUnitTestsBasicTest.test_get_created_by_from_contact.recording +4307 -0
  42. data/test/unit/recorded_results/AsfUnitTestsBasicTest.test_master_detail.recording +1951 -0
  43. data/test/unit/recorded_results/AsfUnitTestsBasicTest.test_read_all_content_columns.recording +1611 -0
  44. data/test/unit/recorded_results/AsfUnitTestsBasicTest.test_save_a_contact.recording +1611 -0
  45. data/test/unit/recorded_results/AsfUnitTestsBasicTest.test_use_default_rule.recording +1618 -0
  46. data/test/unit/recorded_results/AsfUnitTestsBasicTest.test_use_update_mru.recording +1618 -0
  47. data/test/unit/recorded_test_case.rb +83 -0
  48. metadata +186 -0
@@ -0,0 +1,9 @@
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 = RForce::const_get(:SoapResponseHpricot)
9
+ end
@@ -0,0 +1,36 @@
1
+ require 'xml/parser'
2
+ require 'rforce/soap_pullable'
3
+
4
+ module RForce
5
+ class SoapResponseExpat
6
+ include SoapPullable
7
+ include MethodKeys
8
+
9
+ def initialize(content)
10
+ @content = content
11
+ end
12
+
13
+ def parse
14
+ @current_value = nil
15
+ @stack = []
16
+ @parsed = {}
17
+ @done = false
18
+ @namespaces = []
19
+
20
+ XML::Parser.new.parse(@content) do |type, name, data|
21
+ case type
22
+ when XML::Parser::START_ELEM then
23
+ tag_start name, data
24
+ when XML::Parser::CDATA then
25
+ text data
26
+ when XML::Parser::END_ELEM then
27
+ tag_end name
28
+ end
29
+
30
+ break if @done
31
+ end
32
+
33
+ @parsed
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,75 @@
1
+ require 'hpricot'
2
+ require 'cgi'
3
+
4
+
5
+ module RForce
6
+ class SoapResponseHpricot
7
+ # Parses an XML string into structured data.
8
+ def initialize(content)
9
+ @content = content
10
+ end
11
+
12
+ # Digests an XML DOM node into nested Ruby types.
13
+ def parse
14
+ document = Hpricot.XML(@content)
15
+ node = document % 'soapenv:Body'
16
+ self.class.node_to_ruby node
17
+ end
18
+
19
+ private
20
+
21
+ def self.unescapeXML(string)
22
+ CGI.unescapeHTML(string).gsub("'", "'")
23
+ end
24
+
25
+ def self.node_to_ruby(node)
26
+ # Convert text nodes into simple strings.
27
+ children = (node.children || []).reject do |c|
28
+ c.is_a?(Hpricot::Text) && c.to_s.strip.empty?
29
+ end
30
+
31
+ if node.is_a?(Hpricot::Text)
32
+ return SoapResponseHpricot.unescapeXML(node.inspect[1..-2])
33
+ end
34
+
35
+ if children.first.is_a?(Hpricot::Text)
36
+ return SoapResponseHpricot.unescapeXML(children.first.inspect[1..-2])
37
+ end
38
+
39
+ # Convert nodes with children into MethodHashes.
40
+ elements = MethodHash.new
41
+
42
+ # Add all the element's children to the hash.
43
+ children.each do |e|
44
+ next if e.is_a?(Hpricot::Text) && e.to_s.strip.empty?
45
+ name = e.name
46
+
47
+ if name.include? ':'
48
+ name = name.split(':').last
49
+ end
50
+
51
+ name = name.to_sym
52
+
53
+ case elements[name]
54
+ # The most common case: unique child element tags.
55
+ when NilClass then elements[name] = node_to_ruby(e)
56
+
57
+ # Non-unique child elements become arrays:
58
+
59
+ # We've already created the array: just
60
+ # add the element.
61
+ when Array then elements[name] << node_to_ruby(e)
62
+
63
+ # We haven't created the array yet: do so,
64
+ # then put the existing element in, followed
65
+ # by the new one.
66
+ else
67
+ elements[name] = [elements[name]]
68
+ elements[name] << node_to_ruby(e)
69
+ end
70
+ end
71
+
72
+ return elements.empty? ? nil : elements
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,35 @@
1
+ require 'rexml/document'
2
+ require 'rexml/xpath'
3
+ require 'rforce/soap_pullable'
4
+
5
+
6
+ module RForce
7
+ # Turns an XML response from the server into a Ruby
8
+ # object whose methods correspond to nested XML elements.
9
+ class SoapResponseRexml
10
+ include SoapPullable
11
+ include MethodKeys
12
+
13
+ %w(attlistdecl cdata comment doctype doctype_end elementdecl
14
+ entity entitydecl instruction notationdecl xmldecl).each do |unused|
15
+ define_method(unused) {|*args|}
16
+ end
17
+
18
+ def initialize(content)
19
+ @content = content
20
+ end
21
+
22
+ # Parses an XML string into structured data.
23
+ def parse
24
+ @current_value = nil
25
+ @stack = []
26
+ @parsed = {}
27
+ @done = false
28
+ @namespaces = []
29
+
30
+ REXML::Document.parse_stream @content, self
31
+
32
+ @parsed
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,3 @@
1
+ module RForce
2
+ VERSION = '0.4'
3
+ end
@@ -0,0 +1,115 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{silent-e-activerecord-activesalesforce-adapter}
8
+ s.version = "2.3.8.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Doug Chasman", "Luigi Montanez", "Senthil Nayagam", "Justin Ball", "Jesse Hallett", "Andrew Freeberg", "Blaine Schanfeldt", "Matte Edens"]
12
+ s.date = %q{2010-10-13}
13
+ s.description = %q{}
14
+ s.email = %q{matte@silent-e.com}
15
+ s.extra_rdoc_files = [
16
+ "README"
17
+ ]
18
+ s.files = [
19
+ ".gitignore",
20
+ ".project",
21
+ "README",
22
+ "Rakefile",
23
+ "VERSION",
24
+ "lib/active_record/connection_adapters/activesalesforce.rb",
25
+ "lib/active_record/connection_adapters/activesalesforce_adapter.rb",
26
+ "lib/active_record/connection_adapters/asf_active_record.rb",
27
+ "lib/active_record/connection_adapters/boxcar_command.rb",
28
+ "lib/active_record/connection_adapters/column_definition.rb",
29
+ "lib/active_record/connection_adapters/entity_definition.rb",
30
+ "lib/active_record/connection_adapters/id_resolver.rb",
31
+ "lib/active_record/connection_adapters/recording_binding.rb",
32
+ "lib/active_record/connection_adapters/relationship_definition.rb",
33
+ "lib/active_record/connection_adapters/result_array.rb",
34
+ "lib/active_record/connection_adapters/sid_authentication_filter.rb",
35
+ "lib/activerecord-activesalesforce-adapter.rb",
36
+ "lib/arel/engines/sql/compilers/activesalesforce_compiler.rb",
37
+ "lib/rforce.rb",
38
+ "lib/rforce/binding.rb",
39
+ "lib/rforce/method_keys.rb",
40
+ "lib/rforce/soap_pullable.rb",
41
+ "lib/rforce/soap_response.rb",
42
+ "lib/rforce/soap_response_expat.rb",
43
+ "lib/rforce/soap_response_hpricot.rb",
44
+ "lib/rforce/soap_response_rexml.rb",
45
+ "lib/rforce/version.rb",
46
+ "silent-e-activerecord-activesalesforce-adapter.gemspec",
47
+ "test/unit/basic_test.rb",
48
+ "test/unit/config.yml",
49
+ "test/unit/recorded_results/AsfUnitTestsBasicTest.test_add_notes_to_contact.recording",
50
+ "test/unit/recorded_results/AsfUnitTestsBasicTest.test_assignment_rule_id.recording",
51
+ "test/unit/recorded_results/AsfUnitTestsBasicTest.test_batch_insert.recording",
52
+ "test/unit/recorded_results/AsfUnitTestsBasicTest.test_client_id.recording",
53
+ "test/unit/recorded_results/AsfUnitTestsBasicTest.test_count_contacts.recording",
54
+ "test/unit/recorded_results/AsfUnitTestsBasicTest.test_create_a_contact.recording",
55
+ "test/unit/recorded_results/AsfUnitTestsBasicTest.test_find_a_contact.recording",
56
+ "test/unit/recorded_results/AsfUnitTestsBasicTest.test_find_a_contact_by_first_name.recording",
57
+ "test/unit/recorded_results/AsfUnitTestsBasicTest.test_find_a_contact_by_id.recording",
58
+ "test/unit/recorded_results/AsfUnitTestsBasicTest.test_find_addresses.recording",
59
+ "test/unit/recorded_results/AsfUnitTestsBasicTest.test_get_created_by_from_contact.recording",
60
+ "test/unit/recorded_results/AsfUnitTestsBasicTest.test_master_detail.recording",
61
+ "test/unit/recorded_results/AsfUnitTestsBasicTest.test_read_all_content_columns.recording",
62
+ "test/unit/recorded_results/AsfUnitTestsBasicTest.test_save_a_contact.recording",
63
+ "test/unit/recorded_results/AsfUnitTestsBasicTest.test_use_default_rule.recording",
64
+ "test/unit/recorded_results/AsfUnitTestsBasicTest.test_use_update_mru.recording",
65
+ "test/unit/recorded_test_case.rb"
66
+ ]
67
+ s.homepage = %q{http://github.com/silent-e/activerecord-activesalesforce-adapter}
68
+ s.rdoc_options = ["--charset=UTF-8"]
69
+ s.require_paths = ["lib"]
70
+ s.rubygems_version = %q{1.3.7}
71
+ s.summary = %q{ActiveSalesforce (ASF) is a Rails connection adapter that provides direct access to Salesforce.com hosted data and metadata via the ActiveRecord model layer. Objects, fields, and relationships are all auto surfaced as active record attributes and rels.}
72
+ s.test_files = [
73
+ "test/unit",
74
+ "test/unit/basic_test.rb",
75
+ "test/unit/config.yml",
76
+ "test/unit/recorded_results",
77
+ "test/unit/recorded_results/AsfUnitTestsBasicTest.test_add_notes_to_contact.recording",
78
+ "test/unit/recorded_results/AsfUnitTestsBasicTest.test_assignment_rule_id.recording",
79
+ "test/unit/recorded_results/AsfUnitTestsBasicTest.test_batch_insert.recording",
80
+ "test/unit/recorded_results/AsfUnitTestsBasicTest.test_client_id.recording",
81
+ "test/unit/recorded_results/AsfUnitTestsBasicTest.test_count_contacts.recording",
82
+ "test/unit/recorded_results/AsfUnitTestsBasicTest.test_create_a_contact.recording",
83
+ "test/unit/recorded_results/AsfUnitTestsBasicTest.test_find_a_contact.recording",
84
+ "test/unit/recorded_results/AsfUnitTestsBasicTest.test_find_a_contact_by_first_name.recording",
85
+ "test/unit/recorded_results/AsfUnitTestsBasicTest.test_find_a_contact_by_id.recording",
86
+ "test/unit/recorded_results/AsfUnitTestsBasicTest.test_find_addresses.recording",
87
+ "test/unit/recorded_results/AsfUnitTestsBasicTest.test_get_created_by_from_contact.recording",
88
+ "test/unit/recorded_results/AsfUnitTestsBasicTest.test_master_detail.recording",
89
+ "test/unit/recorded_results/AsfUnitTestsBasicTest.test_read_all_content_columns.recording",
90
+ "test/unit/recorded_results/AsfUnitTestsBasicTest.test_save_a_contact.recording",
91
+ "test/unit/recorded_results/AsfUnitTestsBasicTest.test_use_default_rule.recording",
92
+ "test/unit/recorded_results/AsfUnitTestsBasicTest.test_use_update_mru.recording",
93
+ "test/unit/recorded_test_case.rb"
94
+ ]
95
+
96
+ if s.respond_to? :specification_version then
97
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
98
+ s.specification_version = 3
99
+
100
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
101
+ s.add_runtime_dependency(%q<rails>, [">= 2.3.3"])
102
+ s.add_runtime_dependency(%q<builder>, [">= 1.2.4"])
103
+ s.add_runtime_dependency(%q<hpricot>, [">= 0.8.2"])
104
+ else
105
+ s.add_dependency(%q<rails>, [">= 2.3.3"])
106
+ s.add_dependency(%q<builder>, [">= 1.2.4"])
107
+ s.add_dependency(%q<hpricot>, [">= 0.8.2"])
108
+ end
109
+ else
110
+ s.add_dependency(%q<rails>, [">= 2.3.3"])
111
+ s.add_dependency(%q<builder>, [">= 1.2.4"])
112
+ s.add_dependency(%q<hpricot>, [">= 0.8.2"])
113
+ end
114
+ end
115
+
@@ -0,0 +1,204 @@
1
+ =begin
2
+ ActiveSalesforce
3
+ Copyright 2006 Doug Chasman
4
+
5
+ Licensed under the Apache License, Version 2.0 (the "License");
6
+ you may not use this file except in compliance with the License.
7
+ You may obtain a copy of the License at
8
+
9
+ http://www.apache.org/licenses/LICENSE-2.0
10
+
11
+ Unless required by applicable law or agreed to in writing, software
12
+ distributed under the License is distributed on an "AS IS" BASIS,
13
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ See the License for the specific language governing permissions and
15
+ limitations under the License.
16
+ =end
17
+
18
+ require 'rubygems'
19
+
20
+ #require_gem 'activesalesforce'
21
+ require File.dirname(__FILE__) + '/../../lib/active_record/connection_adapters/activesalesforce_adapter'
22
+
23
+ require File.dirname(__FILE__) + '/recorded_test_case'
24
+ require 'pp'
25
+
26
+ module Salesforce
27
+ class Contact < ActiveRecord::Base
28
+ end
29
+
30
+ class Department < ActiveRecord::Base
31
+ end
32
+
33
+ class Address < ActiveRecord::Base
34
+ end
35
+ end
36
+
37
+
38
+ module Asf
39
+ module UnitTests
40
+
41
+ class BasicTest < Test::Unit::TestCase
42
+ include RecordedTestCase
43
+
44
+ attr_reader :contact
45
+
46
+ def initialize(test_method_name)
47
+ super(test_method_name)
48
+
49
+ #force_recording :test_create_a_contact
50
+ end
51
+
52
+ def setup
53
+ puts "\nStarting test '#{self.class.name.gsub('::', '')}.#{method_name}'"
54
+
55
+ super
56
+
57
+ @contact = Salesforce::Contact.new
58
+
59
+ reset_header_options
60
+
61
+ contact.first_name = 'DutchTestFirstName'
62
+ contact.last_name = 'DutchTestLastName'
63
+ contact.home_phone = '555-555-1212'
64
+ contact.save
65
+
66
+ contact.reload
67
+ end
68
+
69
+ def teardown
70
+ reset_header_options
71
+
72
+ contact.destroy if contact
73
+
74
+ super
75
+ end
76
+
77
+ def reset_header_options
78
+ binding = Salesforce::Contact.connection.binding
79
+ binding.assignment_rule_id = nil
80
+ binding.use_default_rule = false
81
+ binding.update_mru = false
82
+ binding.trigger_user_email = false
83
+ end
84
+
85
+
86
+ def test_create_a_contact
87
+ contact.id
88
+ end
89
+
90
+ def test_count_contacts
91
+ assert Salesforce::Contact.count > 0
92
+ end
93
+
94
+ def test_save_a_contact
95
+ contact.id
96
+ end
97
+
98
+ def test_find_a_contact
99
+ c = Salesforce::Contact.find(contact.id)
100
+ assert_equal contact.id, c.id
101
+ end
102
+
103
+ def test_find_a_contact_by_id
104
+ c = Salesforce::Contact.find_by_id(contact.id)
105
+ assert_equal contact.id, c.id
106
+ end
107
+
108
+ def test_find_a_contact_by_first_name
109
+ c = Salesforce::Contact.find_by_first_name('DutchTestFirstName')
110
+ assert_equal contact.id, c.id
111
+ end
112
+
113
+ def test_read_all_content_columns
114
+ Salesforce::Contact.content_columns.each { |column| contact.send(column.name) }
115
+ end
116
+
117
+ def test_get_created_by_from_contact
118
+ user = contact.created_by
119
+ assert_equal contact.created_by_id, user.id
120
+ end
121
+
122
+ def test_use_update_mru
123
+ Salesforce::Contact.connection.binding.update_mru = true
124
+ contact.save
125
+ end
126
+
127
+ def test_use_default_rule
128
+ Salesforce::Contact.connection.binding.use_default_rule = true
129
+ contact.save
130
+ end
131
+
132
+ def test_assignment_rule_id
133
+ Salesforce::Contact.connection.binding.assignment_rule_id = "1234567890"
134
+ contact.save
135
+ end
136
+
137
+ def test_client_id
138
+ Salesforce::Contact.connection.binding.client_id = "testClient"
139
+ contact.save
140
+ end
141
+
142
+
143
+ def test_add_notes_to_contact
144
+ n1 = Salesforce::Note.new(:title => "My Title", :body => "My Body")
145
+ n2 = Salesforce::Note.new(:title => "My Title 2", :body => "My Body 2")
146
+
147
+ contact.notes << n1
148
+ contact.notes << n2
149
+
150
+ n1.save
151
+ n2.save
152
+ end
153
+
154
+ def test_master_detail
155
+ department = Salesforce::Department.new(:department_description__c => 'DutchTestDepartment description')
156
+ department.save
157
+ department.reload
158
+
159
+ job = Job.new(:name => "DutchJob")
160
+
161
+ department.jobs__c << job
162
+
163
+ department.destroy
164
+ end
165
+
166
+
167
+ def test_batch_insert
168
+ c1 = Salesforce::Contact.new(:first_name => 'FN1', :last_name => 'LN1')
169
+ c2 = Salesforce::Contact.new(:first_name => 'FN2', :last_name => 'LN2')
170
+ c3 = Salesforce::Contact.new(:first_name => 'FN3', :last_name => 'LN3')
171
+
172
+ Salesforce::Contact.transaction(c1, c2) do
173
+ c1.save
174
+ c2.save
175
+ end
176
+
177
+ c3.save
178
+
179
+ c1.first_name << '_2'
180
+ c2.first_name << '_2'
181
+ c3.first_name << '_2'
182
+
183
+ Salesforce::Contact.transaction(c1, c2) do
184
+ c1.save
185
+ c2.save
186
+ end
187
+
188
+ Salesforce::Contact.transaction(c1, c2) do
189
+ c3.save
190
+
191
+ c3.destroy
192
+ c2.destroy
193
+ c1.destroy
194
+ end
195
+ end
196
+
197
+ def test_find_addresses
198
+ adresses = Salesforce::Address.find(:all)
199
+ end
200
+
201
+ end
202
+
203
+ end
204
+ end