sf_cli 0.0.1
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.
- checksums.yaml +7 -0
- data/lib/sf_cli/helper_methods.rb +26 -0
- data/lib/sf_cli/sf/base.rb +17 -0
- data/lib/sf_cli/sf/data.rb +38 -0
- data/lib/sf_cli/sf/operations.rb +4 -0
- data/lib/sf_cli/sf/org.rb +56 -0
- data/lib/sf_cli/sf/project.rb +74 -0
- data/lib/sf_cli/sf/sobject.rb +36 -0
- data/lib/sf_cli/sf.rb +33 -0
- data/lib/sf_cli.rb +1 -0
- metadata +52 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: de348eca269f611892a10afe7064a6db06d701cc349d92bf5092543e4372e176
|
4
|
+
data.tar.gz: 33057527c8449b9f6a39e88a23bfaa5179084267243501b04dbaa17ce8f7d9c4
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b1918b2fca8857f3a7520fec1c7dc0fc596d0ae272997edf24eb4335189a1ea62dd9d2fbeb80ed9dec91341fe2d85f48293d499e4873d3a4ae8fc6d59266b9cc
|
7
|
+
data.tar.gz: fae662b7c7534da4c59bed8a3f1dbe8fb4191224b8fdb79810f507bb81f617892ae0b6252dff007512750845c91d90425779fe8306c7fc16d2203fc9bdd24aad
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module SfCli
|
2
|
+
module HelperMethods
|
3
|
+
def os
|
4
|
+
@os ||= ENV['OS']
|
5
|
+
end
|
6
|
+
|
7
|
+
def null_stderr_redirection
|
8
|
+
@null_stderr_redirection ||=
|
9
|
+
if os.nil? || os.eql?('Windows_NT')
|
10
|
+
'2>nul'
|
11
|
+
else
|
12
|
+
'2> dev/null'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def flag(name, arg = nil, use_argument: true, long_flag: true)
|
17
|
+
flag_indicator = long_flag ? '--' : '-'
|
18
|
+
|
19
|
+
if use_argument
|
20
|
+
arg ? %(#{flag_indicator}#{name} #{arg}) : ''
|
21
|
+
else
|
22
|
+
%(#{flag_indicator}#{name})
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require_relative '../helper_methods'
|
2
|
+
|
3
|
+
module SfCli
|
4
|
+
class Sf
|
5
|
+
class Base
|
6
|
+
include ::SfCli::HelperMethods
|
7
|
+
|
8
|
+
attr_reader :target_org
|
9
|
+
|
10
|
+
# *target_org* --- an org alias name, which is used for sf command operations (default is nil). If it is nil, the command uses the default org.
|
11
|
+
#
|
12
|
+
def initialize(target_org = nil)
|
13
|
+
@target_org = target_org
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'json'
|
2
|
+
require_relative './base'
|
3
|
+
|
4
|
+
module SfCli
|
5
|
+
class Sf
|
6
|
+
#
|
7
|
+
# ==== description
|
8
|
+
# The class representing *sf* *data*
|
9
|
+
#
|
10
|
+
# https://developer.salesforce.com/docs/atlas.en-us.sfdx_cli_reference.meta/sfdx_cli_reference/cli_reference_data_commands_unified.htm
|
11
|
+
#
|
12
|
+
class Data < Base
|
13
|
+
|
14
|
+
# get the object records. It's eqivalent to use *sf* *data* *query*
|
15
|
+
#
|
16
|
+
# *soql* --- SOQL
|
17
|
+
#
|
18
|
+
# *model_class* --- the data model class representing the record object.
|
19
|
+
#
|
20
|
+
# ==== examples
|
21
|
+
# sf.data.query('SELECT Id, Name From Account Limit 3') # returns an array of Hash object
|
22
|
+
#
|
23
|
+
# Account = Struct.new(:Id, :Name)
|
24
|
+
# sf.data.query('SELECT Id, Name From Account Limit 3', model_class: Account) # returns an array of Account struct object
|
25
|
+
#
|
26
|
+
def query(soql, model_class: nil)
|
27
|
+
json = JSON.parse `sf data query --json --query "#{soql}" #{flag :"target-org", target_org} #{null_stderr_redirection}`
|
28
|
+
raise StandardError.new(%|sf data query: failed. (query: "#{soql}")|) if json['status'] != 0
|
29
|
+
|
30
|
+
json['result']['records'].each_with_object([]) do |h, a|
|
31
|
+
h.delete "attributes"
|
32
|
+
a << (model_class ? model_class.new(**h) : h)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require_relative './base'
|
2
|
+
|
3
|
+
module SfCli
|
4
|
+
class Sf
|
5
|
+
#
|
6
|
+
# ==== description
|
7
|
+
# The class representing *sf* *org*.
|
8
|
+
#
|
9
|
+
# https://developer.salesforce.com/docs/atlas.en-us.sfdx_cli_reference.meta/sfdx_cli_reference/cli_reference_org_commands_unified.htm
|
10
|
+
#
|
11
|
+
class Org < Base
|
12
|
+
ConnectionInfo = Struct.new(:access_token, :alias, :instance_url, :api_version, :status)
|
13
|
+
|
14
|
+
# login to the org by the browser. It's equivalent to use *sf* *org* *login* *web*
|
15
|
+
#
|
16
|
+
# *instance_url* --- custom login url.
|
17
|
+
#
|
18
|
+
def login_web(instance_url: nil)
|
19
|
+
`sf org login web #{flag :alias, target_org} #{flag :"instance-url", instance_url}`
|
20
|
+
end
|
21
|
+
|
22
|
+
#
|
23
|
+
# returns the org's connection information. It's equivalent to use *sf* *org* *display*.
|
24
|
+
#
|
25
|
+
def display
|
26
|
+
lines = StringIO.new(`sf org display #{flag :"target-org", target_org} #{null_stderr_redirection}`).readlines
|
27
|
+
|
28
|
+
connection_info = ConnectionInfo.new(
|
29
|
+
access_token: nil,
|
30
|
+
alias: nil,
|
31
|
+
instance_url: nil,
|
32
|
+
api_version: nil,
|
33
|
+
status: nil
|
34
|
+
)
|
35
|
+
|
36
|
+
lines.each do |line|
|
37
|
+
case line
|
38
|
+
when /Access Token/
|
39
|
+
connection_info.access_token = line.split(' ')[2]
|
40
|
+
when /Alias/
|
41
|
+
connection_info.alias = line.split(' ')[1]
|
42
|
+
when /Instance Url/
|
43
|
+
connection_info.instance_url = line.split(' ')[2]
|
44
|
+
when /Api Version/
|
45
|
+
connection_info.api_version = line.split(' ')[2]
|
46
|
+
when /Connected Status/
|
47
|
+
connection_info.status = line.split(' ')[2]
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
connection_info
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
require_relative './base'
|
3
|
+
|
4
|
+
module SfCli
|
5
|
+
class Sf
|
6
|
+
# ==== description
|
7
|
+
# The class representing *sf* *project*
|
8
|
+
#
|
9
|
+
# command reference: https://developer.salesforce.com/docs/atlas.en-us.sfdx_cli_reference.meta/sfdx_cli_reference/cli_reference_project_commands_unified.htm
|
10
|
+
#
|
11
|
+
class Project < Base
|
12
|
+
|
13
|
+
#
|
14
|
+
# generate a Salesforce project. It's equivalent to *sf* *project* *generate*.
|
15
|
+
#
|
16
|
+
# *name* --- project name
|
17
|
+
#
|
18
|
+
# *template* --- project template name
|
19
|
+
#
|
20
|
+
# *output_dir* --- output directory
|
21
|
+
#
|
22
|
+
def generate(name, template: 'standard', output_dir: nil)
|
23
|
+
`sf project generate #{flag :name, name} #{flag :template, template} #{flag :"output-dir", output_dir} --manifest #{null_stderr_redirection}`
|
24
|
+
raise StandardError.new(%|command 'sf project generate' failed.|) unless $?.success?
|
25
|
+
end
|
26
|
+
|
27
|
+
# generate the manifest file of a Salesforce project. It's equivalent to *sf* *project* *generate* *manifest*
|
28
|
+
#
|
29
|
+
# *metadata* --- an array that consists of metadata type like CustomObject, Layout and so on. (default: [])
|
30
|
+
#
|
31
|
+
# *api_verson* --- api version (default: nil)
|
32
|
+
#
|
33
|
+
# *project_dir* --- project directory which you want to create the manifest (default: nil)
|
34
|
+
#
|
35
|
+
# *output_dir* --- manifest's output directory in the project directory. You can use relative path from the project root (default: nil)
|
36
|
+
#
|
37
|
+
# *from_org* --- username or alias of the org that contains the metadata components from which to build a manifest (default: nil)
|
38
|
+
#
|
39
|
+
# *source_dir* --- paths to the local source files to include in the manifest (default: nil)
|
40
|
+
#
|
41
|
+
# ==== examples
|
42
|
+
# sf.project.generate_manifest metadata: %w[CustomObject Layout] # creates a package.xml, which is initialized with CustomObject and Layout
|
43
|
+
# sf.project.generate_manifest from_org: <org_name> # creates a package.xml, which is initialized with all metadata types in the org
|
44
|
+
#
|
45
|
+
def generate_manifest(metadata: [], api_version: nil, project_dir: nil, output_dir: nil, from_org: nil, source_dir: nil)
|
46
|
+
raise StandardError.new('Exactly one of the following must be provided: --from-org, --metadata, --source-dir') if metadata.empty? && from_org.nil? && source_dir.nil?
|
47
|
+
base_dir = Dir.pwd
|
48
|
+
|
49
|
+
if project_dir
|
50
|
+
raise StandardError.new('the project directory not found') unless FileTest.exist?(project_dir) && FileTest.directory?(project_dir)
|
51
|
+
Dir.chdir project_dir
|
52
|
+
end
|
53
|
+
|
54
|
+
Dir.mkdir(output_dir) if output_dir && FileTest.exist?(output_dir) == false
|
55
|
+
|
56
|
+
metdata_flags = metadata.empty? ? '' : metadata.map{|md| %|--metadata #{md}|}.join(' ')
|
57
|
+
cmd =
|
58
|
+
%|sf project generate manifest %{metdata} %{output_dir} %{api_version} %{from_org} %{source_dir}| %
|
59
|
+
{
|
60
|
+
metdata: metdata_flags,
|
61
|
+
output_dir: flag(:"output-dir", output_dir),
|
62
|
+
api_version: flag(:"api-version", api_version),
|
63
|
+
from_org: flag(:"from-org", from_org),
|
64
|
+
source_dir: flag(:"source-dir", source_dir),
|
65
|
+
}
|
66
|
+
`#{cmd} #{null_stderr_redirection}`
|
67
|
+
|
68
|
+
raise StandardError.new(%|command 'sf project generate manifest' failed.|) unless $?.success?
|
69
|
+
ensure
|
70
|
+
Dir.chdir base_dir
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'json'
|
2
|
+
require_relative './base'
|
3
|
+
|
4
|
+
module SfCli
|
5
|
+
class Sf
|
6
|
+
# ==== description
|
7
|
+
# The class representing *sf* *sobject*
|
8
|
+
#
|
9
|
+
# command reference: https://developer.salesforce.com/docs/atlas.en-us.sfdx_cli_reference.meta/sfdx_cli_reference/cli_reference_sobject_commands_unified.htm
|
10
|
+
#
|
11
|
+
class SObject < Base
|
12
|
+
|
13
|
+
# get the schema information of a Salesforce object and returns a hash object. It's equivalent to use *sf* *sobject* *describe*
|
14
|
+
#
|
15
|
+
# *objectType* --- object type (ex: Account)
|
16
|
+
#
|
17
|
+
def describe(objectType)
|
18
|
+
json = JSON.parse `sf sobject describe --json --sobject #{objectType} #{flag :"target-org", target_org} #{null_stderr_redirection}`
|
19
|
+
raise StandardError.new(%|sf sobject describe: failed. (sobject: #{objectType})|) if json['status'] != 0
|
20
|
+
|
21
|
+
json['result']
|
22
|
+
end
|
23
|
+
|
24
|
+
# returns a list of Salesforce object name (object's API name). It's equivalent to *sf* *sobject* *list*
|
25
|
+
#
|
26
|
+
# *object_type* --- all or custom (default: all)
|
27
|
+
#
|
28
|
+
def list(object_type: 'all')
|
29
|
+
json = JSON.parse `sf sobject list --json --sobject #{object_type} #{flag :"target-org", target_org} #{null_stderr_redirection}`
|
30
|
+
raise StandardError.new(%|sf sobject list: failed.|) if json['status'] != 0
|
31
|
+
|
32
|
+
json['result']
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/sf_cli/sf.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
require_relative './sf/operations'
|
2
|
+
|
3
|
+
module SfCli
|
4
|
+
# ==== description
|
5
|
+
# The main object class of *sf* command.
|
6
|
+
#
|
7
|
+
#
|
8
|
+
# https://developer.salesforce.com/docs/atlas.en-us.sfdx_cli_reference.meta/sfdx_cli_reference/cli_reference_unified.htm
|
9
|
+
#
|
10
|
+
# ==== examples
|
11
|
+
# sf = SfCli::Sf.new # use default org
|
12
|
+
# sf = SfCli::Sf.new target_org: 'hoge' # use an alias "hoge" as target org
|
13
|
+
#
|
14
|
+
# # get the org connection infomation, which is equivalent to the result of 'sf org display'
|
15
|
+
# sf.org.display
|
16
|
+
#
|
17
|
+
# # get Account records (equivalent to 'sf data query')
|
18
|
+
# sf.data.query 'SELECT Id, Name FROM Account LIMIT 3' # => returns an array containing 3 records
|
19
|
+
#
|
20
|
+
class Sf
|
21
|
+
attr_reader :target_org, :org, :data, :sobject, :project
|
22
|
+
|
23
|
+
#
|
24
|
+
# *\target_org* --- an org alias name, which is used for sf command operations (default is nil). If it is nil, the command uses the default org.
|
25
|
+
#
|
26
|
+
def initialize(target_org: nil)
|
27
|
+
@org = Org.new(target_org)
|
28
|
+
@data = Data.new(target_org)
|
29
|
+
@sobject = SObject.new(target_org)
|
30
|
+
@project = Project.new
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/sf_cli.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'sf_cli/sf'
|
metadata
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sf_cli
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Takanobu Maekawa
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2024-08-17 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: A thin wrapper classes representing salesforce CLI. Currenty only sf
|
14
|
+
command is implemented, but not all functions are supported.
|
15
|
+
email:
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- lib/sf_cli.rb
|
21
|
+
- lib/sf_cli/helper_methods.rb
|
22
|
+
- lib/sf_cli/sf.rb
|
23
|
+
- lib/sf_cli/sf/base.rb
|
24
|
+
- lib/sf_cli/sf/data.rb
|
25
|
+
- lib/sf_cli/sf/operations.rb
|
26
|
+
- lib/sf_cli/sf/org.rb
|
27
|
+
- lib/sf_cli/sf/project.rb
|
28
|
+
- lib/sf_cli/sf/sobject.rb
|
29
|
+
homepage:
|
30
|
+
licenses:
|
31
|
+
- MIT
|
32
|
+
metadata: {}
|
33
|
+
post_install_message:
|
34
|
+
rdoc_options: []
|
35
|
+
require_paths:
|
36
|
+
- lib
|
37
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
47
|
+
requirements: []
|
48
|
+
rubygems_version: 3.5.11
|
49
|
+
signing_key:
|
50
|
+
specification_version: 4
|
51
|
+
summary: A wrapper class library for Salesforce CLI
|
52
|
+
test_files: []
|