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