activesalesforce 0.0.9 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -24,13 +24,13 @@
24
24
  require 'rubygems'
25
25
  require_gem 'rails', ">= 1.0.0"
26
26
 
27
- #require 'active_record/connection_adapters/abstract_adapter'
28
- #require 'active_record/connection_adapters/abstract/schema_definitions'
27
+ require 'pp'
28
+
29
29
 
30
30
  module ActiveRecord
31
31
  module ConnectionAdapters
32
32
  class SalesforceColumn < Column
33
- attr_reader :label, :readonly, :reference_to
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.columns(sfdcObjectName).each do |column|
97
- if column.reference_to
98
- referenceName = column.name.chop.chop
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
- unless self.respond_to? referenceName.to_sym or column.reference_to == "Profile"
101
- puts "Creating relationship from #{sfdcObjectName} to #{column.reference_to} for #{referenceName}"
102
- self.class.belongs_to referenceName.to_sym, :class_name => column.reference_to, :foreign_key => column.name, :dependent => false
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
- cached_columns << SalesforceColumn.new(field)
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
@@ -3,10 +3,90 @@ require File.dirname(__FILE__) + '/../test_helper'
3
3
 
4
4
  require 'pp'
5
5
 
6
- class ContactSControl
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
- account = Account.find_by_Name('Acme')
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
- pp account
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.9
7
- date: 2006-01-26 00:00:00 -05:00
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