activesalesforce 0.3.8 → 0.3.9
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/README +9 -0
- data/lib/asf_adapter.rb +28 -2
- data/lib/boxcar_command.rb +1 -0
- data/lib/column_definition.rb +5 -0
- data/lib/entity_definition.rb +3 -2
- data/lib/id_resolver.rb +92 -0
- metadata +4 -3
data/README
CHANGED
@@ -25,6 +25,15 @@
|
|
25
25
|
|
26
26
|
5. proceed using standard Rails development techniques!
|
27
27
|
|
28
|
+
== Advanced Features
|
29
|
+
|
30
|
+
1. Session ID based Authentication: Add the following to /app/controllers/application.rb to enable SID auth for all controllers
|
31
|
+
|
32
|
+
class ApplicationController < ActionController::Base
|
33
|
+
before_filter ActiveSalesforce::SessionIDAuthenticationFilter
|
34
|
+
end
|
35
|
+
|
36
|
+
2. Boxcar'ing of updates, inserts, and deletes. Use <YourModel>.transaction() to demark boxcar boundaries.
|
28
37
|
|
29
38
|
== Description of contents
|
30
39
|
|
data/lib/asf_adapter.rb
CHANGED
@@ -27,6 +27,8 @@ require File.dirname(__FILE__) + '/relationship_definition'
|
|
27
27
|
require File.dirname(__FILE__) + '/boxcar_command'
|
28
28
|
require File.dirname(__FILE__) + '/entity_definition'
|
29
29
|
require File.dirname(__FILE__) + '/asf_active_record'
|
30
|
+
require File.dirname(__FILE__) + '/id_resolver'
|
31
|
+
require File.dirname(__FILE__) + '/sid_authentication_filter'
|
30
32
|
|
31
33
|
|
32
34
|
class ResultArray < Array
|
@@ -118,7 +120,7 @@ module ActiveRecord
|
|
118
120
|
MAX_BOXCAR_SIZE = 200
|
119
121
|
|
120
122
|
attr_accessor :batch_size
|
121
|
-
attr_reader :entity_def_map, :config
|
123
|
+
attr_reader :entity_def_map, :keyprefix_to_entity_def_map, :config
|
122
124
|
|
123
125
|
def initialize(connection, logger, connection_options, config)
|
124
126
|
super(connection, logger)
|
@@ -126,6 +128,7 @@ module ActiveRecord
|
|
126
128
|
@connection_options, @config = connection_options, config
|
127
129
|
|
128
130
|
@entity_def_map = {}
|
131
|
+
@keyprefix_to_entity_def_map = {}
|
129
132
|
|
130
133
|
@command_boxcar = []
|
131
134
|
@class_to_entity_map = {}
|
@@ -424,6 +427,24 @@ module ActiveRecord
|
|
424
427
|
end
|
425
428
|
|
426
429
|
|
430
|
+
def retrieve_field_values(object_type, fields, ids, name = nil)
|
431
|
+
msg = "retrieve(#{object_type}, [#{ids.to_a.join(', ')}])"
|
432
|
+
log(msg, name) {
|
433
|
+
retrieve_element = []
|
434
|
+
retrieve_element << :fieldList << fields.to_a.join(", ")
|
435
|
+
retrieve_element << 'type { :xmlns => "urn:sobject.partner.soap.sforce.com" }' << object_type
|
436
|
+
ids.to_a.each { |id| retrieve_element << :ids << id }
|
437
|
+
|
438
|
+
result = get_result(@connection.retrieve(retrieve_element), :retrieve)
|
439
|
+
|
440
|
+
result = [ result ] unless result.is_a?(Array)
|
441
|
+
|
442
|
+
# Remove unwanted :type and normalize :Id if required
|
443
|
+
result.map { |v| v.delete(:type); v[:Id] = v[:Id][0] if v[:Id].is_a? Array; v }
|
444
|
+
}
|
445
|
+
end
|
446
|
+
|
447
|
+
|
427
448
|
def get_fields(columns, names, values, access_check)
|
428
449
|
fields = {}
|
429
450
|
names.each_with_index do | name, n |
|
@@ -512,8 +533,13 @@ module ActiveRecord
|
|
512
533
|
end
|
513
534
|
end
|
514
535
|
|
515
|
-
|
536
|
+
key_prefix = metadata[:keyPrefix]
|
537
|
+
|
538
|
+
entity_def = ActiveSalesforce::EntityDefinition.new(self, entity_name,
|
539
|
+
cached_columns, cached_relationships, custom, key_prefix)
|
540
|
+
|
516
541
|
@entity_def_map[entity_name] = entity_def
|
542
|
+
@keyprefix_to_entity_def_map[key_prefix] = entity_def
|
517
543
|
|
518
544
|
configure_active_record entity_def
|
519
545
|
|
data/lib/boxcar_command.rb
CHANGED
data/lib/column_definition.rb
CHANGED
@@ -41,6 +41,7 @@ module ActiveRecord
|
|
41
41
|
@type = get_type(field[:type])
|
42
42
|
@limit = field[:length]
|
43
43
|
@label = field[:label]
|
44
|
+
@name_field = field[:nameField] == "true"
|
44
45
|
|
45
46
|
@text = [:string, :text].include? @type
|
46
47
|
@number = [:float, :integer].include? @type
|
@@ -57,6 +58,10 @@ module ActiveRecord
|
|
57
58
|
end
|
58
59
|
end
|
59
60
|
|
61
|
+
def is_name?
|
62
|
+
@name_field
|
63
|
+
end
|
64
|
+
|
60
65
|
def get_type(field_type)
|
61
66
|
case field_type
|
62
67
|
when /int/i
|
data/lib/entity_definition.rb
CHANGED
@@ -23,14 +23,15 @@ require 'pp'
|
|
23
23
|
|
24
24
|
module ActiveSalesforce
|
25
25
|
class EntityDefinition
|
26
|
-
attr_reader :name, :columns, :column_name_to_column, :api_name_to_column, :relationships
|
26
|
+
attr_reader :name, :columns, :column_name_to_column, :api_name_to_column, :relationships, :key_prefix
|
27
27
|
|
28
|
-
def initialize(connection, name, columns, relationships, custom)
|
28
|
+
def initialize(connection, name, columns, relationships, custom, key_prefix)
|
29
29
|
@connection = connection
|
30
30
|
@name = name
|
31
31
|
@columns = columns
|
32
32
|
@relationships = relationships
|
33
33
|
@custom = custom
|
34
|
+
@key_prefix = key_prefix
|
34
35
|
|
35
36
|
@column_name_to_column = {}
|
36
37
|
@columns.each { |column| @column_name_to_column[column.name] = column }
|
data/lib/id_resolver.rb
ADDED
@@ -0,0 +1,92 @@
|
|
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
|
+
require_gem 'rails', ">= 1.0.0"
|
20
|
+
|
21
|
+
require 'pp'
|
22
|
+
|
23
|
+
|
24
|
+
module ActiveSalesforce
|
25
|
+
class IdResolver
|
26
|
+
|
27
|
+
def initialize(connection)
|
28
|
+
@connection = connection
|
29
|
+
@object_type_to_ids = {}
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
def add(record, columns = nil)
|
34
|
+
if columns
|
35
|
+
columns = columns.to_a.map { |column_name| record.column_for_attribute(column_name) }
|
36
|
+
else
|
37
|
+
columns = record.class.columns
|
38
|
+
end
|
39
|
+
|
40
|
+
columns.each do |column|
|
41
|
+
reference_to = column.reference_to
|
42
|
+
next unless reference_to
|
43
|
+
|
44
|
+
value = record.send(column.name)
|
45
|
+
if value
|
46
|
+
ids = @object_type_to_ids[reference_to]
|
47
|
+
|
48
|
+
unless ids
|
49
|
+
ids = Set.new
|
50
|
+
@object_type_to_ids[reference_to] = ids
|
51
|
+
end
|
52
|
+
|
53
|
+
ids << value
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
|
59
|
+
def resolve
|
60
|
+
result = {}
|
61
|
+
|
62
|
+
@object_type_to_ids.each do |object_type, ids|
|
63
|
+
entity_def = @connection.get_entity_def(object_type)
|
64
|
+
|
65
|
+
fields = (entity_def.columns.reject { |column| not column.is_name? }).map { |column| column.api_name }
|
66
|
+
|
67
|
+
# DCHASMAN TODO Boxcar into requests of no more than 200 retrieves per request
|
68
|
+
puts "Resolving references to #{object_type}"
|
69
|
+
field_values = @connection.retrieve_field_values(object_type, fields, ids.to_a, "#{self}.resolve()")
|
70
|
+
|
71
|
+
field_values.each do |field_value|
|
72
|
+
id = field_value.delete(:Id)
|
73
|
+
result[id] = field_value
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
result
|
78
|
+
end
|
79
|
+
|
80
|
+
|
81
|
+
def serialize
|
82
|
+
YAML.dump @object_type_to_ids
|
83
|
+
end
|
84
|
+
|
85
|
+
|
86
|
+
def deserialize(source)
|
87
|
+
@object_type_to_ids = YAML.load(source)
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
|
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.3.
|
7
|
-
date: 2006-02
|
6
|
+
version: 0.3.9
|
7
|
+
date: 2006-03-02 00:00:00 -05:00
|
8
8
|
summary: 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.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -37,6 +37,7 @@ files:
|
|
37
37
|
- lib/asf_adapter.rb
|
38
38
|
- lib/sid_authentication_filter.rb
|
39
39
|
- lib/relationship_definition.rb
|
40
|
+
- lib/id_resolver.rb
|
40
41
|
- lib/asf_active_record.rb
|
41
42
|
- test/unit
|
42
43
|
- test/unit/recorded_test_case.rb
|
@@ -98,5 +99,5 @@ dependencies:
|
|
98
99
|
requirements:
|
99
100
|
- - ">="
|
100
101
|
- !ruby/object:Gem::Version
|
101
|
-
version: 0.0.
|
102
|
+
version: 0.0.9
|
102
103
|
version:
|