SFDO-API 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a59da5f72e29a615e9772927feba92ec2fa811b0
4
- data.tar.gz: 3285cb4a58ceb3d7b303b7b40e76c998a08f2ebf
3
+ metadata.gz: a889210734dd667c332c1a2b6cc9c2e614f7b96e
4
+ data.tar.gz: bc0172a50528c4c7aa20ec670d8336227868640f
5
5
  SHA512:
6
- metadata.gz: 2169619919809de7efa02ea7fb9283686530fc47ea02baf41d85d2ed07f6a168ba02ce795f72257a31053e66c504c166ab3e3746474b5607a9d73cb96000742e
7
- data.tar.gz: 991a116695161d5335461188e948cb99f332523621eeae1bb8becc9e9b2bce3f7b4b0227905be8e8b9dd621de72aa8366db298e88c34aa892d4c1cdb9d76d61d
6
+ metadata.gz: 6fc1612e504e920b02d7a65a1b1456b1efccf524c3e63048791a1c04a06be25cc1a48ebc643242f114a204d286ddff53adf84a73bc0bc2307f4663bbc346e1c1
7
+ data.tar.gz: 5ef960b4d79bd44d37384955516412c85fd92d6d03e63d53a4c806ec6d2d48b4cd2e833ed250bca5f795ed4957bfd9ad0e6a1e271110526e26417ce658122a84
data/README.md CHANGED
@@ -1,7 +1,10 @@
1
1
  # SFDO::API
2
2
 
3
- SFDO-API is a convenient way to manipulate valid Salesforce objects in a target environment. It accepts commands from
4
- the calling script, and then lets the restforce Ruby gem deal directly with the Salesforce API.
3
+ SFDO-API is a convenient way to use the Salesforce API to manipulate objects in a target org. SFDO-API was intended orginally to
4
+ facilitate the sharing of common API calls across multiple source repositories, but the project is evolving to provide powerful
5
+ tools for handiling SF objects, like support for managed and unmanaged namespaces, multiple namespaces in an org, etc.
6
+
7
+ SFDO-API accepts commands from the calling script, and then lets the restforce Ruby gem deal directly with the Salesforce API.
5
8
 
6
9
  ## Installation
7
10
 
@@ -21,13 +24,18 @@ Or install it yourself as:
21
24
 
22
25
  ## Usage
23
26
 
27
+ ### All examples below are calling code, not SFDO-API code
28
+
24
29
  To create a simple Account and get the ID for that Account:
30
+
25
31
  ```ruby
26
32
  def create_account_via_api(client_name)
27
33
  @account_id = create 'Account', Name: client_name
28
34
  end
29
35
  ```
36
+
30
37
  You can also address the Restforce API client directly if you want, for example to issue a 'select' query:
38
+
31
39
  ```ruby
32
40
  def create_contact_via_api(client_name, street = '', city = '', state = '', country = '', zip = '')
33
41
  @contact_id = create 'Contact', LastName: client_name,
@@ -41,6 +49,71 @@ You can also address the Restforce API client directly if you want, for example
41
49
  @account_id_for_contact = my_account_object.AccountId
42
50
  end
43
51
  ```
52
+
53
+ To delete a single instance of an object for which you have the Id value
54
+ ```ruby
55
+ def delete_account_via_api
56
+ delete_one_account(@account_id)
57
+ end
58
+ ```
59
+
60
+ ```ruby
61
+ def delete_contacts_via_api
62
+ api_client do
63
+ @array_of_contacts.each do |contact_id|
64
+ delete_one_contact(contact_id)
65
+ end
66
+ end
67
+ end
68
+ ```
69
+
70
+ To delete all instances of an object
71
+
72
+ ```ruby
73
+ def delete_household_accounts
74
+ api_client do
75
+ hh_accs = @api_client.query("select Id from Account where Type = 'Household'")
76
+ delete_all_household_account(hh_accs)
77
+ end
78
+ end
79
+ ```
80
+
81
+ To create instances of custom objects that may have managed or unmanaged namespace use true_object_name.
82
+
83
+ NOTE: in the future we will remove the need to use true_object_name() from calling code, but for now this is how it works.
84
+
85
+ ```ruby
86
+ def create_gau_via_api(gau_name)
87
+ @gau_id = create "#{true_object_name('General_Accounting_Unit__c')}", Name: gau_name
88
+ end
89
+ ```
90
+
91
+ Note that when using delete_one_foo or delete_all_foo do not use any namespace value, SFDO-API does that for you
92
+
93
+ ```ruby
94
+ def delete_gaus_via_api
95
+ api_client do
96
+ gaus = @api_client.query("select Id from #{true_object_name('General_Accounting_Unit__c')}")
97
+ puts gaus.inspect
98
+ delete_all_General_Accounting_Unit__c(gaus)
99
+ end
100
+ end
101
+ ```
102
+
103
+ Note that ISVs may override required fields and these may be needed for SFDO-API to work properly
104
+
105
+ ```ruby
106
+ # NPSP will automatically create certain fields on certain objects based on required input values for those records.
107
+ # There is no way to know in advance from the API which these are, so we find them empirically and note them here
108
+ # before calling the create() method in SfdoAPI
109
+ @fields_acceptibly_nil = { 'Contact': ['Name'],
110
+ 'Opportunity': ['ForecastCategory'] }
111
+ ```
112
+
113
+
114
+
115
+
116
+
44
117
  ## Development
45
118
 
46
119
  After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
data/lib/SFDO/API.rb CHANGED
@@ -22,7 +22,6 @@ module SfdoAPI
22
22
 
23
23
  def is_valid_obj_hash?(object_name, obj_hash, fields_acceptibly_nil)
24
24
  required_fields = get_object_describe(object_name).map(&:fieldName)
25
- # [name, id, required_field_1__c, etc]
26
25
  valid = true
27
26
  required_fields.each do |f|
28
27
 
@@ -36,15 +35,32 @@ module SfdoAPI
36
35
  valid
37
36
  end
38
37
 
39
- def get_org_objects()
40
- #binding.pry
41
- @org_objects ||= api_client do
38
+ def org_describe()
39
+ @org_describe ||= api_client do
42
40
  @api_client.describe
43
41
  end
44
42
  end
45
43
 
44
+
45
+ def npsp_managed_obj_names()
46
+ # GOAL: Delete NPSP objects whether managed or unmanaged
47
+ # Managed will start with np*__
48
+ # Unmanaged will have no prefix but end with __c
49
+ @npsp_managed_obj_names ||= @org_describe.select{|x| x.name =~ /^np.*__.*__c/i}.map{|y| y.name}
50
+ end
51
+
52
+ def true_object_name(obj_name)
53
+ potentials = npsp_managed_obj_names().select{|x| x =~ /#{obj_name}/i}
54
+ if potentials.size > 0
55
+ return potentials.first #.split("__.").first + "__."
56
+ elsif org_describe().select{|x| x.name =~ /^#{obj_name}/i}.map{|y| y.name}.size > 0
57
+ return obj_name
58
+ end
59
+ end
60
+
46
61
  def get_object_describe(object_name)
47
62
  api_client do
63
+ org_describe
48
64
  @description = @api_client.get("/services/data/v35.0/sobjects/#{object_name}/describe")
49
65
 
50
66
  describeobject = Hashie::Mash.new(@description.body)
@@ -61,21 +77,17 @@ module SfdoAPI
61
77
 
62
78
  def delete(type, obj_id)
63
79
  api_client do
64
- @api_client.destroy(type, obj_id)
80
+ @api_client.destroy(true_object_name(type), obj_id)
65
81
  end
66
82
  end
67
83
 
68
84
  def delete_all(obj_type, id)
69
85
  api_client do
70
- #p "id is " + id.inspect
71
- #@api_client.destroy(obj_type, id)
86
+ obj_type = true_object_name(obj_type)
72
87
  id.each(&:destroy)
73
88
  end
74
89
  end
75
90
 
76
- # Given that the developer calls 'delete_contact(id)'
77
- # When 'contact' is a valid object
78
- # Then this method_missing method, will translate 'delete_contact' into "generic_delete('contact', id)"
79
91
 
80
92
  def method_missing(method_called, *args, &block)
81
93
  breakdown = method_called.to_s.split('_')
@@ -1,5 +1,5 @@
1
1
  module SFDO
2
2
  module API
3
- VERSION = "0.1.2"
3
+ VERSION = "0.1.3"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: SFDO-API
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris McMahon
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2016-06-02 00:00:00.000000000 Z
12
+ date: 2016-07-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler