activesalesforce 0.0.9 → 0.1.0
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/lib/column_definition.rb +32 -3
- data/lib/salesforce_active_record.rb +10 -6
- data/lib/salesforce_connection_adapter.rb +26 -4
- data/test/unit/account_test.rb +83 -3
- metadata +2 -2
data/lib/column_definition.rb
CHANGED
@@ -24,13 +24,13 @@
|
|
24
24
|
require 'rubygems'
|
25
25
|
require_gem 'rails', ">= 1.0.0"
|
26
26
|
|
27
|
-
|
28
|
-
|
27
|
+
require 'pp'
|
28
|
+
|
29
29
|
|
30
30
|
module ActiveRecord
|
31
31
|
module ConnectionAdapters
|
32
32
|
class SalesforceColumn < Column
|
33
|
-
attr_reader :label, :readonly
|
33
|
+
attr_reader :label, :readonly
|
34
34
|
|
35
35
|
def initialize(field)
|
36
36
|
@name = field[:name]
|
@@ -45,6 +45,8 @@ module ActiveRecord
|
|
45
45
|
|
46
46
|
if field[:type] =~ /reference/i
|
47
47
|
@reference_to = field[:referenceTo]
|
48
|
+
@one_to_many = false
|
49
|
+
@cascade_delete = false
|
48
50
|
end
|
49
51
|
end
|
50
52
|
|
@@ -78,5 +80,32 @@ module ActiveRecord
|
|
78
80
|
end
|
79
81
|
|
80
82
|
end
|
83
|
+
|
84
|
+
class SalesforceRelationship
|
85
|
+
attr_reader :name, :foreign_key, :label, :reference_to, :one_to_many, :cascade_delete
|
86
|
+
|
87
|
+
def initialize(source)
|
88
|
+
if source[:childSObject]
|
89
|
+
relationship = source
|
90
|
+
|
91
|
+
@name = relationship[:relationshipName] ? relationship[:relationshipName] : relationship[:field].chop.chop
|
92
|
+
@one_to_many = relationship[:relationshipName] != nil
|
93
|
+
@cascade_delete = relationship[:cascadeDelete] == "true"
|
94
|
+
@reference_to = relationship[:childSObject]
|
95
|
+
@label = @name
|
96
|
+
@foreign_key = relationship[:field]
|
97
|
+
else
|
98
|
+
field = source
|
99
|
+
|
100
|
+
@name = field[:name].chop.chop
|
101
|
+
@label = field[:label]
|
102
|
+
@readonly = (field[:updateable] != "true" or field[:createable] != "true")
|
103
|
+
@reference_to = field[:referenceTo]
|
104
|
+
@one_to_many = false
|
105
|
+
@cascade_delete = false
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
81
110
|
end
|
82
111
|
end
|
@@ -93,13 +93,17 @@ module ActiveRecord
|
|
93
93
|
end
|
94
94
|
|
95
95
|
# Create relationships for any reference field
|
96
|
-
connection.
|
97
|
-
|
98
|
-
|
96
|
+
connection.relationships(sfdcObjectName).each do |relationship|
|
97
|
+
referenceName = relationship.name
|
98
|
+
unless self.respond_to? referenceName.to_sym or relationship.reference_to == "Profile"
|
99
|
+
one_to_many = relationship.one_to_many
|
99
100
|
|
100
|
-
|
101
|
-
|
102
|
-
|
101
|
+
puts "Creating one-to-#{one_to_many ? 'many' : 'one' } relationship '#{referenceName}' from #{sfdcObjectName} to #{relationship.reference_to}"
|
102
|
+
|
103
|
+
if one_to_many
|
104
|
+
self.class.has_many referenceName.to_sym, :class_name => relationship.reference_to, :foreign_key => relationship.foreign_key, :dependent => false
|
105
|
+
else
|
106
|
+
self.class.belongs_to referenceName.to_sym, :class_name => relationship.reference_to, :foreign_key => relationship.name, :dependent => false
|
103
107
|
end
|
104
108
|
end
|
105
109
|
end
|
@@ -71,8 +71,6 @@ module ActiveRecord
|
|
71
71
|
super message
|
72
72
|
|
73
73
|
@fault = fault
|
74
|
-
|
75
|
-
#puts "\n\nError encountered: #{message}\n\n"
|
76
74
|
end
|
77
75
|
end
|
78
76
|
|
@@ -86,6 +84,8 @@ module ActiveRecord
|
|
86
84
|
|
87
85
|
@columns_map = {}
|
88
86
|
@columns_name_map = {}
|
87
|
+
|
88
|
+
@relationships_map = {}
|
89
89
|
end
|
90
90
|
|
91
91
|
def adapter_name #:nodoc:
|
@@ -198,15 +198,37 @@ module ActiveRecord
|
|
198
198
|
cached_columns = []
|
199
199
|
@columns_map[table_name] = cached_columns
|
200
200
|
|
201
|
+
cached_relationships = []
|
202
|
+
@relationships_map[table_name] = cached_relationships
|
203
|
+
|
201
204
|
metadata = get_result(@connection.describeSObject(:sObjectType => table_name), :describeSObject)
|
202
205
|
|
203
206
|
metadata.fields.each do |field|
|
204
|
-
|
207
|
+
column = SalesforceColumn.new(field)
|
208
|
+
cached_columns << column
|
209
|
+
|
210
|
+
cached_relationships << SalesforceRelationship.new(field) if field[:type] =~ /reference/i
|
205
211
|
end
|
206
|
-
|
212
|
+
|
213
|
+
if metadata.childRelationships
|
214
|
+
metadata.childRelationships.each do |relationship|
|
215
|
+
cached_relationships << SalesforceRelationship.new(relationship)
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
207
219
|
cached_columns
|
208
220
|
end
|
209
221
|
|
222
|
+
def relationships(table_name)
|
223
|
+
cached_relationships = @relationships_map[table_name]
|
224
|
+
return cached_relationships if cached_relationships
|
225
|
+
|
226
|
+
# This will load column and relationship metadata
|
227
|
+
columns(table_name)
|
228
|
+
|
229
|
+
@relationships_map[table_name]
|
230
|
+
end
|
231
|
+
|
210
232
|
def columns_map(table_name, name = nil)
|
211
233
|
columns_map = @columns_name_map[table_name]
|
212
234
|
return columns_map if columns_map
|
data/test/unit/account_test.rb
CHANGED
@@ -3,10 +3,90 @@ require File.dirname(__FILE__) + '/../test_helper'
|
|
3
3
|
|
4
4
|
require 'pp'
|
5
5
|
|
6
|
-
class
|
6
|
+
class AccountTest < Test::Unit::TestCase
|
7
|
+
def setup
|
8
|
+
ActiveRecord::Base.allow_concurrency = true
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
def test_get_a_case_comment
|
13
|
+
comment = CaseComment.find_by_ParentId('500300000011inJAAQ')
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
def test_one_to_many_relationship
|
18
|
+
contact = Contact.find_by_Id('0033000000B1LKrAAN')
|
19
|
+
|
20
|
+
cases = contact.Cases
|
21
|
+
|
22
|
+
cases.each do |c|
|
23
|
+
puts "Case('#{c.Id}', '#{c.Subject}')"
|
24
|
+
|
25
|
+
comments = c.CaseComments
|
26
|
+
|
27
|
+
comments.each do |comment|
|
28
|
+
puts " CaseComment('#{comment.Id}', '#{comment.CommentBody}')"
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
def test_get_account
|
36
|
+
accounts = Account.find(:all)
|
37
|
+
|
38
|
+
#accounts.each { |account| puts "#{account.Name}, #{account.Id}, #{account.LastModifiedById}" }
|
39
|
+
|
40
|
+
acme = Account.find(:first, :conditions => ["Name = 'Acme'"])
|
41
|
+
|
42
|
+
acme = Account.find_by_Id(acme.Id)
|
43
|
+
|
44
|
+
acme = Account.find_by_Name_and_LastModifiedById('salesforce.com', acme.LastModifiedById)
|
45
|
+
end
|
46
|
+
|
47
|
+
|
7
48
|
def test_update_account
|
8
|
-
|
49
|
+
acme = Account.new
|
50
|
+
acme.Name = "Acme"
|
51
|
+
acme.save
|
52
|
+
|
53
|
+
acme = Account.find_by_Name('Acme')
|
54
|
+
|
55
|
+
acme.Website = "http://www.dutchforce.com/#{Time.now}.jpg"
|
56
|
+
acme.LastModifiedDate = Time.now
|
57
|
+
|
58
|
+
acme.save
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
def test_create_account
|
63
|
+
dutchCo = Account.new
|
64
|
+
dutchCo.Name = "DutchCo"
|
65
|
+
dutchCo.Website = "www.dutchco.com"
|
66
|
+
dutchCo.save
|
67
|
+
|
68
|
+
dutchCo2 = Account.new(:Name => "DutchCo2", :Website => "www.dutchco2.com")
|
69
|
+
dutchCo2.save
|
70
|
+
|
71
|
+
dutchCo3 = Account.create(:Name => "DutchCo3", :Website => "www.dutchco3.com")
|
72
|
+
|
73
|
+
accounts = Account.create([
|
74
|
+
{ :Name => "DutchCo4", :Website => "www.dutchco4.com" },
|
75
|
+
{ :Name => "DutchCo5", :Website => "www.dutchco5.com" }])
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_destroy_account
|
79
|
+
account = Account.create(:Name => "DutchADelete", :Website => "www.dutchcodelete.com")
|
80
|
+
account = Account.find_by_Id(account.Id)
|
81
|
+
|
82
|
+
pp account.Parent
|
9
83
|
|
10
|
-
|
84
|
+
puts "Getting CreatedBy"
|
85
|
+
createdBy = account.CreatedBy
|
86
|
+
createdBy = User.find_by_Id(account.CreatedById);
|
87
|
+
puts createdBy.Email
|
88
|
+
|
89
|
+
Account.delete(account.Id)
|
11
90
|
end
|
91
|
+
|
12
92
|
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: activesalesforce
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.0
|
7
|
-
date: 2006-01-
|
6
|
+
version: 0.1.0
|
7
|
+
date: 2006-01-27 00:00:00 -05:00
|
8
8
|
summary: ActiveSalesforce is an extension to the Rails Framework that allows for the dynamic creation and management of ActiveRecord objects through the use of Salesforce meta-data and uses a Salesforce.com organization as the backing store.
|
9
9
|
require_paths:
|
10
10
|
- lib
|