sf_cli 0.0.7.beta2 → 0.0.7

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
  SHA256:
3
- metadata.gz: dfe11b6577f9c950bc7ebe9a602392f843462d2121e4b53bad470ae5fc88d70a
4
- data.tar.gz: 7b8be5a7d4d7fe214968a41ed334df490c59fec0c1308c922b98c53d7e6d5bc4
3
+ metadata.gz: 98f07645a79ccfa6a8f8bbac048a4da5aae6f21bf294445a0888f861d91b8f27
4
+ data.tar.gz: a608a4eeb21ff2fd065cac874d6834e1a6c8aec83f9a40ada0f73917e4029ffb
5
5
  SHA512:
6
- metadata.gz: e5dd28989b46ed7044bf01f872197f29a591b005e0d150dd526c97d2c5fdf1e543a7112d3ccdff5867f967800f1673f2073a0585bb06223d8b541f8ac2ae2873
7
- data.tar.gz: 25a31b68eed96337d806721c42c24ad1452728c00f2db8577c93f211a2147fab61c9a8b692978f67df8b690ea8aa94bbf21fea5200e8b6ac4c1c2ad71062474b
6
+ metadata.gz: 9f5949bdba034feb1a7265a79fa9cd41c9e6f9d1402e4cf173fc585b0ab44d904570591382066633f5258f55503f0503410d648fb3700856029471678090efed
7
+ data.tar.gz: 32a39625a575b1f9e465d9090c1e63a0ec8ee8ed605c4f5c3104b3866121a931780cf7c2f82200ab84ca5924ff798790cf116cf9580280ab1e1e6a26458d1ef4
data/CHANGELOG.md CHANGED
@@ -1,3 +1,5 @@
1
+ ## 0.0.7 - 2024-09-19
2
+ - NEW: add `sf.apex.run`
1
3
  ## 0.0.6 - 2024-09-16
2
4
  - NEW: Object Model Support renewal;
3
5
  - `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.
@@ -0,0 +1,19 @@
1
+ require_relative '../core/base'
2
+ require_relative './run'
3
+
4
+ module SfCli
5
+ module Sf
6
+ module Apex
7
+ #
8
+ # ==== description
9
+ # The class representing *sf* *apex*.
10
+ #
11
+ # https://developer.salesforce.com/docs/atlas.en-us.sfdx_cli_reference.meta/sfdx_cli_reference/cli_reference_apex_commands_unified.htm
12
+ #
13
+ class Core
14
+ include ::SfCli::Sf::Core::Base
15
+ include Run
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,110 @@
1
+ require 'tempfile'
2
+ require 'stringio'
3
+
4
+ module SfCli::Sf::Apex
5
+ module Run
6
+ #
7
+ # run apex code and returns its result
8
+ #
9
+ # *target_org* --- an alias of paticular org, or username can be used<br>
10
+ #
11
+ # *file* --- (1) path to a local file that contains \Apex code. (2) StringIO object
12
+ #
13
+ # == Examples
14
+ # Execute apex code in a file
15
+ # result = sf.apex.run file: "path/to/apex"
16
+ # result.success # true if the execution succeeds
17
+ # result.logs # execution log
18
+ #
19
+ # StringIO is usable instead of file path
20
+ # require 'stringio'
21
+ #
22
+ # pseudo_file = StringIO.new <<~EOS
23
+ # Account acc = [SELECT Id, Name FROM Account Limit 1];
24
+ # System.debug(acc.Name);
25
+ # EOS
26
+ #
27
+ # sf.apex.run target_org: :dev, file: pseudo_file
28
+ #
29
+ # == Interactive Mode
30
+ #
31
+ # If you don't specify *file* argument, it starts interactive mode that may be helpful in IRB environment.
32
+ # irb(main:) > sf.apex.run target_org: :dev
33
+ #
34
+ # Account acc = [SELECT Id, Name FROM Account LIMIT 1];
35
+ # System.debug(acc.Name);
36
+ # <press Ctrl-D>
37
+ #
38
+ # =>
39
+ # #<SfCli::Sf::Apex::Run::ApexResult:0x00007437b4e13218
40
+ # @column=-1,
41
+ # @compile_problem="",
42
+ # @compiled=true,
43
+ # @exception_message="",
44
+ # @exception_stack_trace="",
45
+ # @line=-1,
46
+ # @logs=
47
+ # ["61.0 APEX_CODE,DEBUG;APEX_PROFILING,INFO",
48
+ # "Execute Anonymous: Account acc = [SELECT Id, Name FROM Account LIMIT 1];",
49
+ # "Execute Anonymous: System.debug(acc.Name);",
50
+ # ....]
51
+ # 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_apex_commands_unified.htm#cli_reference_apex_run_unified]
52
+ #
53
+ def run(target_org: nil, file: nil)
54
+ return run_interactive(target_org) if file.nil?
55
+ return run_by_io(target_org, file) if file.is_a? StringIO
56
+
57
+ return unless file.is_a? String
58
+
59
+ flags = {:"target-org" => target_org, :"file" => file}
60
+
61
+ json = exec(__method__, flags: flags, redirection: :null_stderr)
62
+ ApexResult.new(json['result'])
63
+ end
64
+
65
+ private
66
+
67
+ def run_by_io(target_org, io)
68
+ file = Tempfile.open(%w[sf apex]){|f| f.write(io.read); f}
69
+
70
+ flags = {:"target-org" => target_org, :"file" => file.path}
71
+ json = exec(:run, flags: flags, redirection: :null_stderr)
72
+ ApexResult.new(json['result'])
73
+ ensure
74
+ file&.close!
75
+ end
76
+
77
+ def run_interactive(target_org)
78
+ file = Tempfile.open(%w[sf apex]) do |f|
79
+ s = $stdin.gets
80
+ while s
81
+ f.puts(s)
82
+ s = $stdin.gets
83
+ end
84
+ f
85
+ end
86
+
87
+ flags = {:"target-org" => target_org, :"file" => file.path}
88
+
89
+ json = exec(:run, flags: flags, redirection: :null_stderr)
90
+ ApexResult.new(json['result'])
91
+ ensure
92
+ file&.close!
93
+ end
94
+
95
+ class ApexResult
96
+ attr_reader :success, :compiled, :compile_problem, :exception_message, :exception_stack_trace, :line, :column, :logs
97
+
98
+ def initialize(attributes)
99
+ @success = attributes['success']
100
+ @compiled = attributes['compiled']
101
+ @compile_problem = attributes['compileProblem']
102
+ @exception_message = attributes['exceptionMessage']
103
+ @exception_stack_trace = attributes['exceptionStackTrace']
104
+ @line = attributes['line']
105
+ @column = attributes['column']
106
+ @logs = attributes['logs'].chomp.split("\n")
107
+ end
108
+ end
109
+ end
110
+ end
@@ -1,6 +1,7 @@
1
1
  require 'sf_cli'
2
2
  require 'sf_cli/sf/model'
3
3
  require 'sf_cli/sf/model/sf_command_connection'
4
+ require 'stringio'
4
5
 
5
6
  def sf_init(org_alias)
6
7
  org_info = sf.org.display target_org: org_alias
@@ -20,7 +21,13 @@ def target_org
20
21
  connection.target_org
21
22
  end
22
23
 
24
+ def apex(apex_code)
25
+ sf.apex.run target_org: target_org, file: StringIO.new(apex_code)
26
+ end
27
+
23
28
  alias :sfinit :sf_init
24
29
  alias :gen :generate
25
30
  alias :conn :connection
26
31
  alias :org :target_org
32
+
33
+ sfinit ARGV[0]
@@ -14,7 +14,7 @@ module SfCli
14
14
  class Main
15
15
  include Singleton
16
16
 
17
- OPERATION_CATEGORIES = %w[Org Sobject Data Project]
17
+ OPERATION_CATEGORIES = %w[Org Sobject Data Project Apex]
18
18
 
19
19
  OPERATION_CATEGORIES.each do |category|
20
20
  require_relative %(#{category.downcase}/core)
@@ -123,7 +123,7 @@ module SfCli
123
123
  end
124
124
 
125
125
  def take
126
- all.first
126
+ limit(1).all.first
127
127
  end
128
128
 
129
129
  def select_fields
@@ -1,53 +1,4 @@
1
- = Salesforce CLI library for Ruby
2
- https://badge.fury.io/rb/sf_cli.png
3
-
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>
5
- It is designed to be similar usability to the original command.<br>
6
- Currently only *sf* command is the target of development.
7
-
8
- == prerequisite
9
- Salesforce CLI must be installed.<br>
10
- As of as of September in 2024, ver.2.56.7 is the development target.
11
-
12
- == install
13
- ==== Rubygem
14
- $ gem install sf_cli
15
-
16
- ==== Bundler
17
- in Gemfile:
18
- gem 'sf_cli'
19
-
20
- then,
21
- $ bundle install
22
-
23
- == Examples
24
- === Since 0.0.4
25
- require 'sf_cli'
26
-
27
- # login to org
28
- sf.org.login_web
29
-
30
- # get records
31
- sf.data.query 'SELECT Id, Name FROM Account LIMIT 1' # => [{Id: "abc", Name: "account name"}]
32
-
33
- # generate a Salesforce DX project
34
- sf.project.generate 'MyProject'
35
-
36
- === Before 0.0.3
37
- require 'sf_cli/sf'
38
-
39
- sf = SfCli::Sf.new
40
-
41
- # login to org
42
- sf.org.login_web
43
-
44
- # get Account records
45
- sf.data.query 'SELECT Id, Name FROM Account LIMIT 3' # => returns an array containing 3 records
46
-
47
- # generate a Salesforce DX project
48
- sf.project.generate 'MyProject'
49
-
50
- == \Object Model support (experimental, since 0.0.4)
1
+ == \Object Model support
51
2
  === generate Models
52
3
  require 'sf_cli/sf/model'
53
4
  require 'sf_cli/sf/model/sf_command_connection'
@@ -130,12 +81,3 @@ then,
130
81
  schema = Account.describe
131
82
  schema.name # Account
132
83
  schema.field_names # [Id, Name, ....]
133
-
134
- == Documents
135
- The following steps generate *doc* directory, which all documents are generated in.
136
- $ git clone https://github.com/tmkw/sf_cli.git
137
- $ cd sf_cli
138
- $ bundle install
139
- $ bundle exec rake rdoc
140
-
141
- *Or*, you can read the same documents online at {rubygems.org}[https://rubygems.org/gems/sf_cli]
data/rdoc/README.rdoc ADDED
@@ -0,0 +1,79 @@
1
+ = Salesforce CLI library for Ruby
2
+ https://badge.fury.io/rb/sf_cli.png
3
+
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>
5
+ It is designed to be similar usability to the original command.<br>
6
+ Currently only *sf* command is the target of development.
7
+
8
+ == prerequisite
9
+ Salesforce CLI must be installed.<br>
10
+ As of as of September in 2024, ver.2.56.7 is the development target.
11
+
12
+ == install
13
+ Rubygem::
14
+ the simplest way:
15
+ $ gem install sf_cli
16
+ Bundler::
17
+ in Gemfile:
18
+ gem 'sf_cli'
19
+ then,
20
+ $ bundle install
21
+ == Documents
22
+ Class Library Reference::
23
+ {Online document}[https://www.rubydoc.info/gems/sf_cli/0.0.7] at rubygems.org
24
+
25
+ Or,
26
+ Generate locally:
27
+ $ git clone https://github.com/tmkw/sf_cli.git
28
+ $ cd sf_cli
29
+ $ bundle install
30
+ $ bundle exec rake rdoc
31
+ *As* *of* *0.0.7*, *this* *may* *be* *better* *to* *know* *what* *it* *is* *exactly*.
32
+ Salesforce CLI and Sf command::
33
+ 1. {Salesforce CLI reference}[https://developer.salesforce.com/docs/atlas.en-us.sfdx_cli_reference.meta/sfdx_cli_reference/cli_reference_top.htm]
34
+ 2. {sf command reference}[https://developer.salesforce.com/docs/atlas.en-us.sfdx_cli_reference.meta/sfdx_cli_reference/cli_reference_unified.htm]
35
+
36
+ == Short Examples
37
+ require 'sf_cli'
38
+
39
+ # login to org
40
+ sf.org.login_web
41
+
42
+ # get salesforce object schema
43
+ sf.sobject.describe :Account
44
+
45
+ # get a record
46
+ sf.data.get_record :Account, record_id: 'xxxxxxx'
47
+ sf.data.get_record :Account, where: {Name: 'Jonny B.Good', Country: 'USA'}
48
+
49
+ # execute soql
50
+ sf.data.query "SELECT Id, Name FROM Account LIMIT 1" # => [{Id: "abc", Name: "account name"}]
51
+
52
+ # create a record
53
+ sf.data.create_record :TheCustomObject__c, values: {Name: "John Smith", Age: 33}
54
+
55
+ # update a record
56
+ sf.data.update_record :Account, record_id: 'xxxxxxx', values: {Name: 'New Account Name'}
57
+ sf.data.update_record :Hoge__c, where: {Name: 'Jonny B.Good', Country: 'USA'}, values: {Phone: 'xxxxx', bar: 2000}
58
+
59
+ # delete a record
60
+ sf.data.delete_record :Hoge__c, record_id: 'xxxxxxx'
61
+ sf.data.delete_record :Hoge__c, where: {Name: 'Jonny B.Good', Country: 'USA'}
62
+
63
+ # using Bulk API 2.0
64
+ sf.data.upsert_bulk sobject: :TestCustomObject__c, file: 'upsert.csv', timeout: 5 # waiting for 5 minutes at maximum
65
+
66
+ # run Apex
67
+ sf.apex.run file: 'path/to/file'
68
+ sf.apex.run file: StringIO.new("System.debug('Hello World')")
69
+ == \Object Model Support
70
+ As of now, there is experimental support for object model in Salesforce.
71
+ === Short examples
72
+ ===== With sf command:
73
+ rows = sf.data.query "SELECT Id, Name FROM Contact WHERE Name = 'Akin Kristen'", model_class: Contact
74
+ rows.first # <Contact: @Id="0035j00001RW3xbAAD", @Name="Akin Kristen">
75
+ rows.first.Name # Akin Kristen
76
+ ===== Doing the same thing with model independently
77
+ contact = Contact.select(:Id, :Name).where(Name: 'Akin Kristen').take
78
+ contact.Name # Akin Kristen
79
+ For more details, take a look at {the object model section}[link://files/rdoc/ObjectModel_rdoc.html]
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sf_cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7.beta2
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Takanobu Maekawa
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-09-16 00:00:00.000000000 Z
11
+ date: 2024-09-18 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: This is a class library for introducing Salesforce CLI to Ruby scripting.
14
14
  Currenty only sf command is the target of development.
15
15
  email:
16
- executables:
17
- - sfc
16
+ executables: []
18
17
  extensions: []
19
18
  extra_rdoc_files:
20
- - README.rdoc
19
+ - rdoc/ObjectModel.rdoc
20
+ - rdoc/README.rdoc
21
21
  - CHANGELOG.md
22
22
  files:
23
23
  - CHANGELOG.md
24
- - README.rdoc
25
- - bin/sfc
26
24
  - lib/sf_cli.rb
25
+ - lib/sf_cli/sf/apex/core.rb
26
+ - lib/sf_cli/sf/apex/run.rb
27
27
  - lib/sf_cli/sf/console.rb
28
28
  - lib/sf_cli/sf/core/base.rb
29
29
  - lib/sf_cli/sf/data/bulk_result_v2.rb
@@ -57,6 +57,8 @@ files:
57
57
  - lib/sf_cli/sf/project/core.rb
58
58
  - lib/sf_cli/sf/sobject/core.rb
59
59
  - lib/sf_cli/sf/sobject/schema.rb
60
+ - rdoc/ObjectModel.rdoc
61
+ - rdoc/README.rdoc
60
62
  homepage: https://github.com/tmkw/sf_cli
61
63
  licenses:
62
64
  - MIT
data/bin/sfc DELETED
@@ -1,7 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'rake'
4
-
5
- Rake.application.init
6
- Rake.application.define_task(Rake::Task, :default) { system('irb -r sf_cli/sf/console') }
7
- Rake.application.top_level