sf_cli 0.0.4 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +24 -2
  3. data/README.rdoc +85 -40
  4. data/lib/sf_cli/sf/core/base.rb +2 -0
  5. data/lib/sf_cli/sf/data/bulk_result_v2.rb +77 -0
  6. data/lib/sf_cli/sf/data/core.rb +22 -162
  7. data/lib/sf_cli/sf/data/create_record.rb +30 -0
  8. data/lib/sf_cli/sf/data/delete_bulk.rb +47 -0
  9. data/lib/sf_cli/sf/data/delete_record.rb +33 -0
  10. data/lib/sf_cli/sf/data/delete_resume.rb +47 -0
  11. data/lib/sf_cli/sf/data/get_record.rb +42 -0
  12. data/lib/sf_cli/sf/data/helper_methods.rb +12 -0
  13. data/lib/sf_cli/sf/data/query.rb +120 -0
  14. data/lib/sf_cli/sf/data/query_helper.rb +57 -0
  15. data/lib/sf_cli/sf/data/resume.rb +87 -0
  16. data/lib/sf_cli/sf/data/search.rb +50 -0
  17. data/lib/sf_cli/sf/data/update_record.rb +38 -0
  18. data/lib/sf_cli/sf/data/upsert_bulk.rb +50 -0
  19. data/lib/sf_cli/sf/data/upsert_resume.rb +47 -0
  20. data/lib/sf_cli/sf/model/base_methods.rb +62 -0
  21. data/lib/sf_cli/sf/model/class_definition.rb +34 -43
  22. data/lib/sf_cli/sf/model/dml_methods.rb +36 -0
  23. data/lib/sf_cli/sf/model/generator.rb +8 -7
  24. data/lib/sf_cli/sf/model/query_condition.rb +136 -0
  25. data/lib/sf_cli/sf/model/query_methods.rb +58 -0
  26. data/lib/sf_cli/sf/model/sf_command_connection.rb +60 -0
  27. data/lib/sf_cli/sf/model.rb +10 -2
  28. data/lib/sf_cli/sf/org/core.rb +6 -44
  29. data/lib/sf_cli/sf/org/display.rb +41 -0
  30. data/lib/sf_cli/sf/org/list.rb +67 -0
  31. data/lib/sf_cli/sf/org/login.rb +64 -0
  32. data/lib/sf_cli/sf/project/core.rb +10 -3
  33. data/lib/sf_cli/sf/sobject/core.rb +15 -5
  34. data/lib/sf_cli/sf/sobject/schema.rb +47 -0
  35. data/lib/sf_cli.rb +8 -5
  36. metadata +29 -8
  37. data/lib/sf_cli/sf/model/schema.rb +0 -33
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9416d015ec2952621fe3525a9ed7177a68b98a86d3bced475eacf19d3ad88ce0
4
- data.tar.gz: 545bb5c54d345c194c5b62e8599492a45b13ba156b6ce195d3fb1fe38bb0d656
3
+ metadata.gz: 1996a0f93b6d2f48ea8762961526eab00df5601c902f2ec81f21331382973e56
4
+ data.tar.gz: da4da9fe6855d6f44f7995d932e6f658565b6e41091bd4c908e651a8286ece95
5
5
  SHA512:
6
- metadata.gz: bf7e32d0d73b0af136d8153b16b05cf837977f37bd2b95c0ab0cecd8fe23bef9cfcb64bda1a1b16dc1ae5ce92fbf239670c4282fd65df28ff0f4bd835f3810cc
7
- data.tar.gz: 835a95c35ef507c44d5108b613f7300bd8723428fd897ffc64ce8b0d14d0837929dc416c8259e12b713814903f1e5d59e1832e5d57bb9785f3c9bc397d111f8a
6
+ metadata.gz: 36743c7b02fbdf21626a4dcf7ce299bdce68d99e0281bac62b08180ac48792b112b130402e3b75d589f13e57acdf33b33d139db00237818b784b6ab1cd37aef4
7
+ data.tar.gz: d4008513bbbf74b24de5c94f0cfc868367b37c9d2d876806e8eb2f546669768db94c5c1f981dbad732214c16ca26ee969eeb7027c59abda23d49a6e7b8e038fa
data/CHANGELOG.md CHANGED
@@ -1,3 +1,25 @@
1
+ ## 0.0.6 - 2024-09-16
2
+ - NEW: Object Model Support renewal;
3
+ - `SfCli::Sf::Model.connection` represents the connection to Salesforce. It can be set by `set_connection` class method in the module. As of now there is only `SfCommandConnection`, which is based on sf command, as connection adapter. After the connection is set by `set_connection`, it is also automatically set to classes when `SfCli::Sf::Model.generate` method is called.
4
+ - Each object model class has `create` class method for creating a new record.
5
+ - Each object model has `#save` and `#delete` instance methods to create, update and delete the record it represents.
6
+ - Each object class has query interface such as `where`, `select`, `limit` and `order` methods that can be chainable.
7
+ - Each object class has query interface such as `find`, `all`, `take` and `pluck`.
8
+ - CHANGE: `sf.sobject.describe` changed to return `schema` object.
9
+ ## 0.0.5 - 2024-09-08
10
+ - CHANGE: target CLI version is changed: from 2.54.6 to 2.56.7
11
+ - NEW: new command features are added;
12
+ - `--bulk` option to `sf.data.query`
13
+ - `sf.data.query_resume`
14
+ - `sf.data.upsert_bulk`
15
+ - `sf.data.upsert_resume`
16
+ - `sf.data.delete_bulk`
17
+ - `sf.data.delete_resume`
18
+ - `sf.data.resume`
19
+ - `sf.data.search`
20
+ - `sf.org.list`
21
+ - `sf.login_access_token`
22
+ - `--browser` option to `sf.login_web`
1
23
  ## 0.0.4 - 2024-09-02
2
24
  - breaking change:
3
25
  - Sf class doesn't exist anymore. You can not write like `sf = SfCli::Sf.new`. Instead of that, global `sf` method is introduced. You can directly type like `sf.org.display`, which is as almost same usability as the original command.
@@ -5,8 +27,8 @@
5
27
  - support child-parent relationship
6
28
  - support parent-children relationship
7
29
  - add `--result-format` option
8
- - auto generation of Object Model (experimental)
9
- - generates SF Object Classes automatically
30
+ - auto generation of \Object Model (experimental)
31
+ - generates SF \Object Classes automatically
10
32
  - relationship is supported
11
33
 
12
34
  ## 0.0.3 - 2024-08-25
data/README.rdoc CHANGED
@@ -1,4 +1,4 @@
1
- = Salesforce CLI library
1
+ = Salesforce CLI library for Ruby
2
2
  https://badge.fury.io/rb/sf_cli.png
3
3
 
4
4
  This is a class library for introducing {Salesforce CLI}[https://developer.salesforce.com/docs/atlas.en-us.sfdx_cli_reference.meta/sfdx_cli_reference/cli_reference_top.htm] to Ruby scripting.<br>
@@ -7,13 +7,13 @@ Currently only *sf* command is the target of development.
7
7
 
8
8
  == prerequisite
9
9
  Salesforce CLI must be installed.<br>
10
- As of as of August in 2024, ver.2.54.6 is the development target.
10
+ As of as of September in 2024, ver.2.56.7 is the development target.
11
11
 
12
12
  == install
13
- === Rubygem
13
+ ==== Rubygem
14
14
  $ gem install sf_cli
15
15
 
16
- === Bundler
16
+ ==== Bundler
17
17
  in Gemfile:
18
18
  gem 'sf_cli'
19
19
 
@@ -23,35 +23,15 @@ then,
23
23
  == Examples
24
24
  === Since 0.0.4
25
25
  require 'sf_cli'
26
- #
26
+
27
27
  # login to org
28
- #
29
28
  sf.org.login_web
30
- sf.org.login_web target_org: :dev # if the org you login isn't the default one, you should give it alias name for later use.
31
29
 
32
- #
33
30
  # get records
34
- #
35
31
  sf.data.query 'SELECT Id, Name FROM Account LIMIT 1' # => [{Id: "abc", Name: "account name"}]
36
32
 
37
- Account = Struct.new(:Id, :Name) # you can manually prepare the object model
38
- sf.data.query('SELECT Id, Name From Account Limit 3', model_class: Account) # returns an array of Account
39
-
40
- # child-parent relationship is supported
41
- sf.data.query 'SELECT Id, Name, Account.Name From Contact Limit 1' # [{Id: "abc", Name: "contact name", Account: {Name: "account name"}}]
42
-
43
- # parent-children relationship is supported
44
- sf.data.query 'SELECT Id, Name, (SELECT Name From Contacts) FROM Account Limit 1' # [{Id: "abc", Name: "account name", Contacts: [{Name: "contact name"}]}]
45
-
46
- #
47
- # get sobject schema
48
- #
49
- sf.sobject.describe :Case # get Case Object schema information
50
-
51
- #
52
- # generate a Salesforce DX project with manifest generation option
53
- #
54
- sf.project.generate 'MyProject', manifest: true
33
+ # generate a Salesforce DX project
34
+ sf.project.generate 'MyProject'
55
35
 
56
36
  === Before 0.0.3
57
37
  require 'sf_cli/sf'
@@ -60,31 +40,96 @@ then,
60
40
 
61
41
  # login to org
62
42
  sf.org.login_web
63
- sf.org.login_web target_org: :dev # name an alias to the org, which you're going to log in, for later use. This is needed when you don't use the default org.
64
43
 
65
44
  # get Account records
66
45
  sf.data.query 'SELECT Id, Name FROM Account LIMIT 3' # => returns an array containing 3 records
67
46
 
68
- Account = Struct.new(:Id, :Name)
69
- sf.data.query('SELECT Id, Name From Account Limit 3', model_class: Account) # returns an array of Account struct object
70
-
71
47
  # generate a Salesforce DX project
72
48
  sf.project.generate 'MyProject'
73
49
 
74
50
  == \Object Model support (experimental, since 0.0.4)
75
- require 'sf_cli'
51
+ === generate Models
76
52
  require 'sf_cli/sf/model'
53
+ require 'sf_cli/sf/model/sf_command_connection'
77
54
 
78
- # generates Model Class for Contact and Account, accessing the org aliased as 'dev'
79
- SfCli::Sf::Model.generate %w[Contact Account], target_org: :dev
55
+ # first, you must prepare the connection
56
+ conn = SfCli::Sf::Model::SfCommandConnection.new target_org: your_org, instance_url: your_org_url
80
57
 
81
- c = Contact.new(:Name => "John Smith")
82
- c.Name # => "John Smith"
58
+ # then set it to Model module
59
+ SfCli::Sf::Model.set_connection conn
83
60
 
84
- rows = sf.data.query 'SELECT Id, Name, Account.Name From Contact Limit 1', model_class: Contact
85
- rows.size # => 1
86
- rows.first.Name # => Name of the Contact
87
- rows.first.Account.Name # => Name of the Account
61
+ # generates some model classes (for example, Account and Contact)
62
+ SfCli::Sf::Model.generate %w[Account Contact]
63
+ === apply to sf command
64
+ rows = sf.data.query "SELECT Id, Name FROM Contact WHERE Name = 'Akin Kristen'", model_class: Contact
65
+
66
+ # the array object contains Contact object instances
67
+ rows.size # 1
68
+ rows.first # <Contact: @Id="0035j00001RW3xbAAD", @Name="Akin Kristen">
69
+ rows.first.Name # Akin Kristen
70
+
71
+ === using models Independently
72
+ ==== initialize and save a record
73
+ c = Contact.new(:Name => "John Smith")
74
+ c.Name # "John Smith"
75
+ c.save
76
+
77
+ ==== find and update a record
78
+ # find by record ID and update
79
+ c2 = Contact.find(c.id)
80
+ c2.Name = "Johnny Smith"
81
+ c2.save # update
82
+
83
+ ==== delete a record
84
+ c2 = Contact.find(c.id)
85
+ c2.delete
86
+
87
+ ==== query and get a record
88
+ contact = Contact.select(:Id, :Name).where(Name: 'Akin Kristen').take
89
+ contact # => #<Contact: @Id="0035j00001RW3xbAAD", @Name="Akin Kristen">
90
+ contact.Name # Akin Kristen
91
+
92
+ ==== query and get records
93
+ contacts = Contact.select(:Id, :Name).where(LastModifiedDate: :Yesterday).all # get all records that is modified yesterday
94
+
95
+ # these 2 example are the same meaning
96
+ Contact.select(Name).where(Name: 'John Smith', LastModifiedDate: :Yesterday).take
97
+ Contact.select(Name).where(Name: 'John Smith').where(LastModifiedDate: :Yesterday).take
98
+
99
+ ==== child-parent relationship
100
+ contact = Contact.select(:Id, :Name, "Account.Name").where(Name: 'Akin Kristen').take
101
+ contact # <Contact: @Id="0035j00001RW3xbAAD", @Name="Akin Kristen", @Account= #<Account @Name="Aethna Home Products">>
102
+ contact.Account.Name # Aethna Home Products
103
+
104
+ ==== parent-children relationship
105
+ account = Account.select(:Id, :Name, "(SELECT Name FROM Contacts)").take
106
+ account # <Account @Contacts=[#<Contact @Name="Akin Kristen">], @Id="0015j00001dsDuhAAE", @Name="Aethna Home Products">
107
+ account.Name # Aethna Home Products
108
+ rows.Contacts # [#<Contact @Name="Akin Kristen">]
109
+ rows.Contacts.first.Name # Akin Kristen
110
+
111
+ ==== get all fields in a record
112
+ # just by not using 'select' method
113
+ contact = Contact.find(record_id) # <Contact @Id="...", @Name="...", other fields...>
114
+
115
+ ==== time keywords such as 'yesterday' or 'LAST_N_DAYS:N' with symbol style
116
+ Contact.select(:Name).where(LastModifiedDate: :Yesterday).take # "SELECT Id, Name FROM Contact WHERE LastModifiedDate = Yesterday"
117
+ Contact.select(:Name).where(LastModifiedDate: :"LAST_N_DAYS:5").take # "SELECT Id, Name FROM Contact WHERE LastModifiedDate = LAST_N_DAYS:5"
118
+
119
+ ==== array for 'IN' keyword
120
+ Contact.select(:Name).where(Name: ['Jonny Good', 'John Smith']).all # same as "SELECT Name FROM Contact WHERE Name IN ('Jonny Good', 'John Smith')"
121
+
122
+ ==== using partial soql directly
123
+ Contact.select("Id, Name").where("LastModifiedDate = LAST_N_DAYS:5").all
124
+
125
+ ==== ternary style
126
+ Contact.select(:Id, :Name).where(:LastModifiedDate, :>=, :"LAST_N_DAYS:5").all # SELECT Id, Name FROM Contact WHERE LastModifiedDate >= LAST_N_DAYS:5
127
+ Account.select(:Id, :Name).where(:Name, :LIKE, "%OIL%").all # SELECT Id, Name FROM Account WHERE Name LIKE '%OIL%'
128
+
129
+ ==== get schema
130
+ schema = Account.describe
131
+ schema.name # Account
132
+ schema.field_names # [Id, Name, ....]
88
133
 
89
134
  == Documents
90
135
  The following steps generate *doc* directory, which all documents are generated in.
@@ -1,3 +1,5 @@
1
+ require 'json'
2
+
1
3
  module SfCli
2
4
  module Sf
3
5
  module Core
@@ -0,0 +1,77 @@
1
+ module SfCli
2
+ module Sf
3
+ module Data
4
+ #
5
+ # Bulk Job information.
6
+ #
7
+ # You can check the job status using the following method:
8
+ # - opened?
9
+ # - upload_completed?
10
+ # - in_progress?
11
+ # - completed?
12
+ # ==== example:
13
+ # result = sf.data.delete_resume job_id: jobinfo.id
14
+ # puts 'yey!' if result.job_info.completed? # the job has completed
15
+ #
16
+ # For more details, see {the guide document}[https://developer.salesforce.com/docs/atlas.en-us.api_asynch.meta/api_asynch/bulk_api_2_job_states.htm]
17
+ #
18
+ JobInfo = Struct.new(
19
+ :id,
20
+ :operation,
21
+ :object,
22
+ :createdById,
23
+ :createdDate,
24
+ :systemModstamp,
25
+ :state,
26
+ :externalIdFieldName,
27
+ :concurrencyMode,
28
+ :contentType,
29
+ :apiVersion,
30
+ :jobType,
31
+ :lineEnding,
32
+ :columnDelimiter,
33
+ :numberRecordsProcessed,
34
+ :numberRecordsFailed,
35
+ :retries,
36
+ :totalProcessingTime,
37
+ :apiActiveProcessingTime,
38
+ :apexProcessingTime,
39
+ :isPkChunkingSupported
40
+ ) do
41
+ def opened?
42
+ state == 'Open'
43
+ end
44
+
45
+ def upload_completed?
46
+ state == 'UploadComplete'
47
+ end
48
+
49
+ def in_progress?
50
+ state == 'InProgress'
51
+ end
52
+
53
+ def completed?
54
+ state == 'JobComplete'
55
+ end
56
+
57
+ def failed?
58
+ state == 'Failed'
59
+ end
60
+
61
+ def aborted?
62
+ state == 'Aborted'
63
+ end
64
+ end
65
+
66
+ #
67
+ # Records processed by Bulk API
68
+ #
69
+ BulkRecordsV2 = Struct.new(:successfulResults, :failedResults, :unprocessedRecords)
70
+
71
+ #
72
+ # Bulk Result information that contains JobInfo and BulkRecordsV2
73
+ #
74
+ BulkResultV2 = Struct.new(:job_info, :records)
75
+ end
76
+ end
77
+ end
@@ -1,5 +1,15 @@
1
1
  require_relative '../core/base'
2
- require_relative './helper_methods'
2
+ require_relative './query'
3
+ require_relative './get_record'
4
+ require_relative './update_record'
5
+ require_relative './create_record'
6
+ require_relative './delete_record'
7
+ require_relative './delete_bulk'
8
+ require_relative './delete_resume'
9
+ require_relative './upsert_bulk'
10
+ require_relative './upsert_resume'
11
+ require_relative './resume'
12
+ require_relative './search'
3
13
 
4
14
  module SfCli
5
15
  module Sf
@@ -12,167 +22,17 @@ module SfCli
12
22
  #
13
23
  class Core
14
24
  include ::SfCli::Sf::Core::Base
15
- include ::SfCli::Sf::Data::HelperMethods
16
-
17
- # get object records using SQOL. (eqivalent to *sf* *data* *query*)
18
- #
19
- # *soql* --- SOQL<br>
20
- # *target_org* --- an alias of paticular org, not default one<br>
21
- # *model_class* --- the object model class<br>
22
- #
23
- # == examples
24
- # sf.data.query 'SELECT Id, Name FROM Account LIMIT 1' # => [{Id: "abc", Name: "account name"}]
25
- #
26
- # Account = Struct.new(:Id, :Name)
27
- # sf.data.query('SELECT Id, Name From Account Limit 3', model_class: Account) # returns an array of Account struct object
28
- #
29
- # # child-parent relationship is supported
30
- # sf.data.query 'SELECT Id, Name, Account.Name From Contact Limit 1' # [{Id: "abc", Name: "contact name", Account: {Name: "account name"}}]
31
- #
32
- # # parent-children relationship is supported
33
- # sf.data.query 'SELECT Id, Name, (SELECT Name From Contacts) FROM Account Limit 1' # [{Id: "abc", Name: "account name", Contacts: [{Name: "contact name"}]}]
34
- #
35
- # Account = Struct.new(:Id, :Name) # you can manually prepare the object model
36
- # sf.data.query('SELECT Id, Name From Account Limit 3', model_class: Account) # returns an array of Account
37
- #
38
- # For more command details, see {the command reference}[https://developer.salesforce.com/docs/atlas.en-us.sfdx_cli_reference.meta/sfdx_cli_reference/cli_reference_data_commands_unified.htm#cli_reference_data_query_unified]
39
- #
40
- # About querying with auto generated object model, see the section {"Object Model support"}[link://files/README_rdoc.html#label-Object+Model+support+-28experimental-2C+since+0.0.4-29] in README.
41
- #
42
- def query(soql, target_org: nil, format: nil, model_class: nil)
43
- flags = {
44
- :"query" => %("#{soql}"),
45
- :"target-org" => target_org,
46
- :"result-format" => format,
47
- }
48
-
49
- raw_output = format ? true : false
50
- format = format || :json
51
-
52
- result = exec(__method__, flags: flags, redirection: :null_stderr, raw_output: raw_output, format: format)
53
- return result if raw_output
54
-
55
- result['result']['records'].each_with_object([]) do |h, a|
56
- record = prepare_record(h)
57
- a << (model_class ? model_class.new(**record) : record)
58
- end
59
- end
60
-
61
- # get a object record. (eqivalent to *sf* *data* *get* *record*)
62
- #
63
- # *object_type* --- \Object Type (ex. Account)<br>
64
- # *record_id* --- id of the object<br>
65
- # *where* --- hash object that is used to identify a record<br>
66
- # *target_org* --- an alias of paticular org, not default one<br>
67
- # *model_class* --- the object model class<br>
68
- #
69
- # ==== examples
70
- # sf.data.get_record :Account, record_id: 'xxxxxxx'
71
- # sf.data.get_record :Account, where: {Name: 'Jonny B.Good', Country: 'USA'}
72
- #
73
- # CustomObject = Struct.new(:Id, :Name)
74
- # sf.data.get_record :TheCustomObject__c, record_id: 'xxxxx', model_class: CustomObject # returns a CustomObject struct object
75
- #
76
- # For more command details, see {the command reference}[https://developer.salesforce.com/docs/atlas.en-us.sfdx_cli_reference.meta/sfdx_cli_reference/cli_reference_data_commands_unified.htm#cli_reference_data_get_record_unified]
77
- #
78
- def get_record(object_type, record_id: nil, where: nil, target_org: nil, model_class: nil)
79
- where_conditions = field_value_pairs(where)
80
- flags = {
81
- :"sobject" => object_type,
82
- :"record-id" => record_id,
83
- :"where" => (where_conditions.nil? ? nil : %|"#{where_conditions}"|),
84
- :"target-org" => target_org,
85
- }
86
- action = __method__.to_s.tr('_', ' ')
87
- json = exec(action, flags: flags, redirection: :null_stderr)
88
-
89
- result = json['result']
90
- result.delete 'attributes'
91
-
92
- model_class ? model_class.new(**result) : result
93
- end
94
-
95
- # update a object record. (eqivalent to *sf* *data* *update* *record*)
96
- #
97
- # *object_type* --- \Object Type (ex. Account)<br>
98
- # *record_id* --- id of the object<br>
99
- # *where* --- field values that is used to identify a record<br>
100
- # *values* --- field values for update<br>
101
- # *target_org* --- an alias of paticular org, not default one<br>
102
- #
103
- # ==== examples
104
- # sf.data.update_record :Account, record_id: 'xxxxxxx', values: {Name: 'New Account Name'}
105
- # sf.data.update_record :Hoge__c, where: {Name: 'Jonny B.Good', Country: 'USA'}, values: {Phone: 'xxxxx', bar: 2000}
106
- #
107
- # For more command details, see {the command reference}[https://developer.salesforce.com/docs/atlas.en-us.sfdx_cli_reference.meta/sfdx_cli_reference/cli_reference_data_commands_unified.htm#cli_reference_data_update_record_unified]
108
- #
109
- def update_record(object_type, record_id: nil, where: nil, values: nil, target_org: nil)
110
- where_conditions = field_value_pairs(where)
111
- field_values = field_value_pairs(values)
112
- flags = {
113
- :"sobject" => object_type,
114
- :"record-id" => record_id,
115
- :"where" => (where_conditions.nil? ? nil : %|"#{where_conditions}"|),
116
- :"values" => (field_values.nil? ? nil : %|"#{field_values}"|),
117
- :"target-org" => target_org,
118
- }
119
- action = __method__.to_s.tr('_', ' ')
120
- json = exec(action, flags: flags, redirection: :null_stderr)
121
-
122
- json['result']['id']
123
- end
124
-
125
- # create a object record. (eqivalent to *sf* *data* *create* *record*)
126
- #
127
- # *object_type* --- \Object Type (ex. Account)<br>
128
- # *values* --- field values to be assigned<br>
129
- # *target_org* --- an alias of paticular org, not default one<br>
130
- #
131
- # ==== examples
132
- #
133
- # sf.data.create_record :TheCustomObject__c, values: {Name: "John Smith", Age: 33} # creating a TheCustomObject record with name and age
134
- #
135
- # For more command details, see {the command reference}[https://developer.salesforce.com/docs/atlas.en-us.sfdx_cli_reference.meta/sfdx_cli_reference/cli_reference_data_commands_unified.htm#cli_reference_data_create_record_unified]
136
- #
137
- def create_record(object_type, values: {}, target_org: nil)
138
- field_values = field_value_pairs(values)
139
- flags = {
140
- :"sobject" => object_type,
141
- :"values" => (field_values.nil? ? nil : %|"#{field_values}"|),
142
- :"target-org" => target_org,
143
- }
144
- action = __method__.to_s.tr('_', ' ')
145
- json = exec(action, flags: flags, redirection: :null_stderr)
146
-
147
- json['result']['id']
148
- end
149
-
150
- # delete a object record. (eqivalent to *sf* *data* *delete* *record*)
151
- #
152
- # *object_type* --- \Object Type (ex. Account)<br>
153
- # *record_id* --- id of the object<br>
154
- # *where* --- hash object that is used to identify a record<br>
155
- # *target_org* --- an alias of paticular org, not default one<br>
156
- #
157
- # ==== examples
158
- # sf.data.delete_record :Hoge__c, record_id: 'xxxxxxx'
159
- # sf.data.delete_record :Hoge__c, where: {Name: 'Jonny B.Good', Country: 'USA'}
160
- #
161
- # For more command details, see {the command reference}[https://developer.salesforce.com/docs/atlas.en-us.sfdx_cli_reference.meta/sfdx_cli_reference/cli_reference_data_commands_unified.htm#cli_reference_data_delete_record_unified]
162
- #
163
- def delete_record(object_type, record_id: nil, where: nil, target_org: nil)
164
- where_conditions = field_value_pairs(where)
165
- flags = {
166
- :"sobject" => object_type,
167
- :"record-id" => record_id,
168
- :"where" => (where_conditions.nil? ? nil : %|"#{where_conditions}"|),
169
- :"target-org" => target_org,
170
- }
171
- action = __method__.to_s.tr('_', ' ')
172
- json = exec(action, flags: flags, redirection: :null_stderr)
173
-
174
- json['result']['id']
175
- end
25
+ include Query
26
+ include GetRecord
27
+ include UpdateRecord
28
+ include CreateRecord
29
+ include DeleteRecord
30
+ include DeleteBulk
31
+ include DeleteResume
32
+ include UpsertBulk
33
+ include UpsertResume
34
+ include Resume
35
+ include Search
176
36
  end
177
37
  end
178
38
  end
@@ -0,0 +1,30 @@
1
+ module SfCli::Sf::Data
2
+ module CreateRecord
3
+ # create a object record.
4
+ #
5
+ # *object_type* --- \Object Type (ex. Account)<br>
6
+ #
7
+ # *values* --- field values to be assigned<br>
8
+ #
9
+ # *target_org* --- an alias of paticular org, or username can be used<br>
10
+ #
11
+ # ======
12
+ # # create a TheCustomObject record with name and age
13
+ # sf.data.create_record :TheCustomObject__c, values: {Name: "John Smith", Age: 33}
14
+ #
15
+ # For more command details, see {the command reference}[https://developer.salesforce.com/docs/atlas.en-us.sfdx_cli_reference.meta/sfdx_cli_reference/cli_reference_data_commands_unified.htm#cli_reference_data_create_record_unified]
16
+ #
17
+ def create_record(object_type, values: {}, target_org: nil)
18
+ field_values = field_value_pairs(values)
19
+ flags = {
20
+ :"sobject" => object_type,
21
+ :"values" => (field_values.nil? ? nil : %|"#{field_values}"|),
22
+ :"target-org" => target_org,
23
+ }
24
+ action = __method__.to_s.tr('_', ' ')
25
+ json = exec(action, flags: flags, redirection: :null_stderr)
26
+
27
+ json['result']['id']
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,47 @@
1
+ require_relative './bulk_result_v2'
2
+
3
+ module SfCli::Sf::Data
4
+ module DeleteBulk
5
+ # delete records using Bulk API 2.0
6
+ #
7
+ # *file* --- a CSV file, which is written record IDs to delete<br>
8
+ #
9
+ # *sobject* --- \Object Type (ex. Account)<br>
10
+ #
11
+ # *timeout* --- max minutes to wait for the job complete the task.<br>
12
+ #
13
+ # *target_org* --- an alias of paticular org, or username can be used<br>
14
+ #
15
+ # ======
16
+ # # start a delete job
17
+ # jobinfo = sf.data.delete_bulk sobject: :TestCustomObject__c, file: 'delete.csv' # this returns immediately
18
+ # jobinfo.id # => "750J4000003g1OaIAI" it's job ID
19
+ #
20
+ # # you can check if the delete job completed
21
+ # sf.data.delete_resume job_id: jobinfo.id
22
+ #
23
+ # # Or, you can wait for the job completion with one try.
24
+ # result = sf.data.delete_bulk sobject: :TestCustomObject__c, file: 'delete.csv', timeout: 5 # wait within 5 minutes
25
+ #
26
+ # For more command details, see {the command reference}[https://developer.salesforce.com/docs/atlas.en-us.sfdx_cli_reference.meta/sfdx_cli_reference/cli_reference_data_commands_unified.htm#cli_reference_data_delete_bulk_unified]
27
+ #
28
+ def delete_bulk(file:, sobject:, timeout: nil, target_org: nil)
29
+ flags = {
30
+ :"file" => file,
31
+ :"sobject" => sobject,
32
+ :"wait" => timeout,
33
+ :"target-org" => target_org,
34
+ }
35
+ action = __method__.to_s.tr('_', ' ')
36
+ json = exec(action, flags: flags, redirection: :null_stderr)
37
+
38
+ job_info = ::SfCli::Sf::Data::JobInfo.new(**json['result']['jobInfo'])
39
+ return job_info unless json['result']['records']
40
+
41
+ ::SfCli::Sf::Data::BulkResultV2.new(
42
+ job_info: job_info,
43
+ records: ::SfCli::Sf::Data::BulkRecordsV2.new(**json['result']['records'])
44
+ )
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,33 @@
1
+ module SfCli::Sf::Data
2
+ module DeleteRecord
3
+ # delete a object record.
4
+ #
5
+ # *object_type* --- \Object Type (ex. Account)<br>
6
+ #
7
+ # *record_id* --- id of the object<br>
8
+ #
9
+ # *where* --- hash object that is used to identify a record<br>
10
+ #
11
+ # *target_org* --- an alias of paticular org, or username can be used<br>
12
+ #
13
+ # ======
14
+ # sf.data.delete_record :Hoge__c, record_id: 'xxxxxxx'
15
+ # sf.data.delete_record :Hoge__c, where: {Name: 'Jonny B.Good', Country: 'USA'}
16
+ #
17
+ # For more command details, see {the command reference}[https://developer.salesforce.com/docs/atlas.en-us.sfdx_cli_reference.meta/sfdx_cli_reference/cli_reference_data_commands_unified.htm#cli_reference_data_delete_record_unified]
18
+ #
19
+ def delete_record(object_type, record_id: nil, where: nil, target_org: nil)
20
+ where_conditions = field_value_pairs(where)
21
+ flags = {
22
+ :"sobject" => object_type,
23
+ :"record-id" => record_id,
24
+ :"where" => (where_conditions.nil? ? nil : %|"#{where_conditions}"|),
25
+ :"target-org" => target_org,
26
+ }
27
+ action = __method__.to_s.tr('_', ' ')
28
+ json = exec(action, flags: flags, redirection: :null_stderr)
29
+
30
+ json['result']['id']
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,47 @@
1
+ require_relative './bulk_result_v2'
2
+
3
+ module SfCli::Sf::Data
4
+ module DeleteResume
5
+ # resume a bulk delete job you previously started with Bulk API 2.0 and return a bulk result object.
6
+ #
7
+ # *job_id* --- job ID you want to resume<br>
8
+ #
9
+ # *timeout* --- max minutes to wait for the job complete the task.<br>
10
+ #
11
+ # *target_org* --- an alias of paticular org, or username can be used<br>
12
+ #
13
+ # ======
14
+ # # start a delete job
15
+ # jobinfo = sf.data.delete_bulk sobject: :TestCustomObject__c, file: 'delete.csv' # this returns immediately
16
+ # jobinfo.id # => "750J4000003g1OaIAI" it's job ID
17
+ #
18
+ # # the job has already started asynchronously.
19
+ # # So you should check its progress.
20
+ # # if you want to wait for the job complete the task, try 'timeout' option.
21
+ # result = sf.data.delete_resume job_id: jobinfo.id
22
+ #
23
+ # puts 'yey!' if result.job_info.completed? # the job has completed
24
+ #
25
+ # To know more about a job result, take a look at SfCli::Sf::Data module
26
+ #
27
+ # For more command details, see {the command reference}[https://developer.salesforce.com/docs/atlas.en-us.sfdx_cli_reference.meta/sfdx_cli_reference/cli_reference_data_commands_unified.htm#cli_reference_data_delete_resume_unified]
28
+ #
29
+ def delete_resume(job_id:, timeout: nil, target_org: nil)
30
+ flags = {
31
+ :"job-id" => job_id,
32
+ :"wait" => timeout,
33
+ :"target-org" => target_org,
34
+ }
35
+ action = __method__.to_s.tr('_', ' ')
36
+ json = exec(action, flags: flags, redirection: :null_stderr)
37
+
38
+ job_info = ::SfCli::Sf::Data::JobInfo.new(**json['result']['jobInfo'])
39
+ return job_info unless json['result']['records']
40
+
41
+ ::SfCli::Sf::Data::BulkResultV2.new(
42
+ job_info: job_info,
43
+ records: ::SfCli::Sf::Data::BulkRecordsV2.new(**json['result']['records'])
44
+ )
45
+ end
46
+ end
47
+ end