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