alet 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: dd98bfc5b916cdb44ed82a989ff245b3d9beb2d1a718b041daa04aec1c80d702
4
+ data.tar.gz: 63022319f768a23d3b8a263510e76ed9e757d5108141a8fd0998fc1c50c8b52b
5
+ SHA512:
6
+ metadata.gz: eddff301a4933e57d9f319131926936fc7de7f6aef2cba066bc136d7233a43b34a49978ba8ef24729ccda52f0cdef96b954e8e381a3c17ae1e6c2639789d88d2
7
+ data.tar.gz: b931f8e9185e58c9ea0a4dd6285af06ec2fb0c2f3e2ab24eaf1d080438dcadbb15540d42eab82bea764fdee7fb5966dff751f4b9567485f4558e6b7eef79062e
data/bin/alet ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ require 'alet/app'
3
+
4
+ Alet::App.run(ARGV)
data/lib/alet/app.rb ADDED
@@ -0,0 +1,77 @@
1
+ require 'gli'
2
+ require 'irb'
3
+ require 'alet/config'
4
+ require 'alet/utils/irb'
5
+ require 'alet/generate/project'
6
+ require 'alet/version'
7
+ require 'i18n'
8
+
9
+ #
10
+ # i18n settings
11
+ #
12
+ I18n.load_path += Alet.config.i18n.load_path
13
+ I18n.default_locale = :en
14
+ I18n.locale = /jp|JP|ja|ja_JP/.match?(ENV['LANG']) ? :ja : :en
15
+
16
+ def t(indicator)
17
+ I18n.t(indicator)
18
+ end
19
+
20
+ module Alet
21
+ class App
22
+ extend GLI::App
23
+
24
+ using IRBUtils
25
+
26
+ program_desc t('cli.desc')
27
+ version Alet::VERSION
28
+
29
+ desc t('cli.target_org')
30
+ flag [:o, 'target-org'], default_value: nil, arg_name: 'org'
31
+
32
+
33
+ desc t('cli.irb.desc')
34
+ command :irb do |c|
35
+ c.desc desc t('cli.target_org')
36
+ c.flag [:o, 'target-org'], default_value: nil, arg_name: 'org'
37
+
38
+ c.example "alet", desc: t('cli.irb.example.default')
39
+ c.example "alet -o org", desc: t('cli.irb.example.target_org')
40
+
41
+ c.action do |global_options, options, args|
42
+ Alet.config.cli_options[:"target-org"] = global_options['target-org'] || options['target-org']
43
+ IRB.start(__FILE__, ['-r', 'alet/irb', '--noscript', global_options['target-org']])
44
+ end
45
+ end
46
+
47
+ desc t('cli.generate.desc')
48
+ command [:generate, :g] do |c|
49
+ c.desc desc t('cli.generate.project.desc')
50
+ c.arg_name 'project_name'
51
+ c.command :project do |prj|
52
+ prj.desc t('cli.generate.project.target_org')
53
+ prj.flag [:o, 'target-org'], default_value: nil, arg_name: 'org'
54
+
55
+ prj.desc t('cli.generate.project.manifest')
56
+ prj.switch [:m, :manifest], negatable: false
57
+
58
+ prj.desc t('cli.generate.project.open_editor')
59
+ prj.switch [:e, 'editor-open'], negatable: false
60
+
61
+ prj.desc t('cli.generate.project.retrieve')
62
+ prj.switch [:r, 'retrieve'], negatable: false
63
+
64
+ prj.example "alet generate project MyProject", desc: t('cli.generate.project.example.default')
65
+ prj.example "alet generate project MyProject -m", desc: t('cli.generate.project.example.manifest')
66
+ prj.example "alet generate project MyProject -m -o org", desc: t('cli.generate.project.example.from_org')
67
+ prj.example "alet generate project MyProject -mr -o org", desc:t('cli.generate.project.example.retrieve')
68
+
69
+ prj.action do |_, options, args|
70
+ Alet::Project.generate(args.first, **options)
71
+ end
72
+ end
73
+ end
74
+
75
+ default_command :irb
76
+ end
77
+ end
@@ -0,0 +1,103 @@
1
+ en:
2
+ cli:
3
+ desc: A Ruby-styled Salesforce console utility
4
+ target_org: Username or alias of the target org
5
+ irb:
6
+ desc: start irb session(if there is no subcommand specified, irb gets default)
7
+ example:
8
+ default: start irb session
9
+ target_org: start irb session with specifying target org
10
+ generate:
11
+ desc: generate resources that are related to Salesforce DX project
12
+ project:
13
+ desc: generate salesforce DX project
14
+ target_org: Username or alias of the target org, which the manifest and source files are generated based on
15
+ manifest: Generate a manifest (package.xml)
16
+ retrieve: Retrieve source files from org
17
+ open_editor: open editor(vs code) to edit the project
18
+ example:
19
+ default: create a Salesfore DX project
20
+ manifest: create a Salesfore DX project with manifest file (package.xml)
21
+ from_org: The manifest file is built based on org
22
+ retrieve: The manifest file and medadata source files are built based on org. This option is only available with -o option.
23
+ connection:
24
+ description: Current connection with Salesforce
25
+ apex:
26
+ description: Execute Apex code
27
+ gen:
28
+ description: Generate sObject classes
29
+ help: |
30
+ ## Name
31
+ gen
32
+
33
+ ## SYNOPSIS
34
+ gene sObjectType...
35
+
36
+ ## DESCRIPTION
37
+ generate sObject classes
38
+
39
+ ## ARGUMENTS
40
+ **sObjectType** sObject type
41
+
42
+ ## EXAMPLES
43
+ ```shell
44
+ gen Account Contact User
45
+ query:
46
+ description: Query by SOQL
47
+ help: |
48
+ ## NAME
49
+ query
50
+
51
+ ## SYNOPSIS
52
+ query SOQL
53
+
54
+ ## DESCRIPTION
55
+ query by SOQL
56
+
57
+ ## ARGUMENTS
58
+ **SOQL** - a SOQL query (SELECT statement)
59
+
60
+ ## EXAMPLE
61
+ ```shell
62
+ query SELECT Id, Name FROM Account Name LIKE '%hoge%'
63
+ ```
64
+ sh:
65
+ description: Excute shell command
66
+ help: |
67
+ ## NAME
68
+ sh
69
+
70
+ ## SYNOPSIS
71
+ sh [command]
72
+
73
+ ## DESCRIPTION
74
+ excute shell command
75
+
76
+ ## ARGUMENTS
77
+ **command** - shell command
78
+
79
+ If no command is specified, it starts interactive mode. To escape interactive mode, press CTRL-D
80
+
81
+ ## EXAMPLE
82
+ ```shell
83
+ sh ls -aF
84
+ ```
85
+ export:
86
+ description: Export sObject records
87
+ help: |
88
+ ## NAME
89
+ export
90
+
91
+ ## SYNOPSIS
92
+ export SOQL
93
+
94
+ ## DESCRIPTION
95
+ export sObject records. If it succeeds, a csv file is created.
96
+
97
+ ## ARGUMENTS
98
+ **SOQL** SOQL(SELECT statement)
99
+
100
+ ## EXAMPLE
101
+ ```shell
102
+ export SELECT Id, Name FROM Account
103
+ ```
@@ -0,0 +1,104 @@
1
+ ja:
2
+ cli:
3
+ desc: RubyスタイルのSalesforceコンソールユーティリティ
4
+ target_org: ユーザー名またはSF組織の別名
5
+ irb:
6
+ desc: irbセッションを開始
7
+ example:
8
+ default: irbセッションを開始.
9
+ target_org: SF組織の別名またはログインユーザー名を指定してirbを起動
10
+ generate:
11
+ desc: Salesforce DXプロジェクトに関連した資材を生成する
12
+ project:
13
+ desc: salesforce DX projectを生成する
14
+ target_org: マニフェストファイルとソースファイルの読み込み先となるSF組織の別名またはその組織のユーザー名
15
+ manifest: マニフェストファイル(package.xml)を生成する
16
+ retrieve: マニフェストファイルの内容を元にSF組織からソースファイルを取得する
17
+ open_editor: プロジェクト構築完了後、そのプロジェクトをカレントディレクトとしてvs codeを起動する
18
+ example:
19
+ default: a Salesfore DXプロジェクトのディレクトリを作成する
20
+ manifest: プロジェクトディレクトリにマニフェストファイル(package.xml)を含める
21
+ from_org: 接続組織のメタデータ情報を元にマニフェストファイルの内容を書き込む.
22
+ retrieve: メタデータのソースファイルをDXプロジェクト内に生成する
23
+ connection:
24
+ description: 現在のSalesforce組織との接続情報
25
+ apex:
26
+ description: Apexコードを実行する
27
+ gen:
28
+ description: 1つ以上のsObjectクラスを生成する
29
+ help: |
30
+ ## Name
31
+ gen
32
+
33
+ ## SYNOPSIS
34
+ gen sObjectType...
35
+
36
+ ## DESCRIPTION
37
+ 1つ以上のsObjectクラスを生成する
38
+
39
+ ## ARGUMENTS
40
+ **sObjectType** sObjectの型名
41
+
42
+ ## EXAMPLES
43
+ ```shell
44
+ gen Account Contact User
45
+ ```
46
+ query:
47
+ description: SOQLを使ってレコードを検索する
48
+ help: |
49
+ ## NAME
50
+ query
51
+
52
+ ## SYNOPSIS
53
+ query SOQL
54
+
55
+ ## DESCRIPTION
56
+ SOQLを使ってレコードを検索する
57
+
58
+ ## ARGUMENTS
59
+ **SOQL** - SOQL(SELECT 構文)
60
+
61
+ ## EXAMPLE
62
+ ```shell
63
+ query SELECT Id, Name FROM Account Name LIKE '%hoge%'
64
+ ```
65
+ sh:
66
+ description: シェルコマンドを実行する
67
+ help: |
68
+ ## NAME
69
+ sh
70
+
71
+ ## SYNOPSIS
72
+ sh [command]
73
+
74
+ ## DESCRIPTION
75
+ シェルコマンドを実行する
76
+
77
+ ## ARGUMENTS
78
+ **command** - 実行するコマンドライン
79
+
80
+ コマンドを指定せずにEnterを押すとインタラクティブモードに移行する。インタラクティブモードから抜けるにはCTR-Dを押す
81
+
82
+ ## EXAMPLE
83
+ ```shell
84
+ sh ls -aF
85
+ ```
86
+ export:
87
+ description: レコードをエクスポートする
88
+ help: |
89
+ ## NAME
90
+ export
91
+
92
+ ## SYNOPSIS
93
+ export SOQL
94
+
95
+ ## DESCRIPTION
96
+ レコードをエクスポートする.正常に終了するとカレントディレクトリにCSVファイルが生成される.
97
+
98
+ ## ARGUMENTS
99
+ **SOQL** SOQL(SELECT構文)
100
+
101
+ ## EXAMPLE
102
+ ```shell
103
+ export SELECT Id, Name FROM Account
104
+ ```
@@ -0,0 +1,31 @@
1
+ module Alet
2
+ def self.config
3
+ @config ||= Config.new
4
+ end
5
+
6
+ class Config
7
+ def connection
8
+ @connection
9
+ end
10
+ alias conn connection
11
+
12
+ def connection=(conn)
13
+ @connection = conn
14
+ end
15
+ alias conn= connection=
16
+
17
+ def cli_options
18
+ @cli_options ||= {}
19
+ end
20
+
21
+ def i18n
22
+ @i18n ||= I18nConfig.new
23
+ end
24
+
25
+ class I18nConfig
26
+ def load_path
27
+ Dir[File.expand_path("../config/locales", __FILE__) + "/*.yml"]
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,22 @@
1
+ require 'sf_cli'
2
+
3
+ module Alet
4
+ module Project
5
+ def self.generate(project_name, params)
6
+ base_dir = Dir.pwd
7
+ target_org = params[:"target-org"]
8
+ retrieve_source = params[:retrieve]
9
+ editor = params[:"editor-open"]
10
+
11
+ sf.project.generate project_name, manifest: true
12
+
13
+ Dir.chdir project_name
14
+
15
+ sf.project.generate_manifest from_org: target_org, output_dir: 'manifest' if target_org
16
+ sf.project.retrieve_start manifest: 'manifest/package.xml', target_org: target_org if retrieve_source
17
+ system 'code .' if editor
18
+ ensure
19
+ Dir.chdir base_dir
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,24 @@
1
+ class Export < IRB::Command::Base
2
+ category "Alet"
3
+ description t('export.description')
4
+ help_message TTY::Markdown.parse t('export.help')
5
+
6
+ def execute(arg)
7
+ soql =
8
+ if /\ASELECT/.match?(arg.strip.upcase)
9
+ arg
10
+ else
11
+ object = eval(arg)
12
+ object.to_soql if object&.instance_of? Yamori::QueryMethods::QueryCondition
13
+ end
14
+
15
+ return if soql.nil?
16
+
17
+ csv = sf.data.query(soql, format: :csv, target_org: ::Alet.config.connection.alias)
18
+
19
+ filename = "#{Time.now.strftime('%Y%m%d%H%M%S')}_export.csv"
20
+ File.open(filename, 'w'){|f| f.write(csv) }
21
+
22
+ puts filename
23
+ end
24
+ end
@@ -0,0 +1,10 @@
1
+ class GenerateModel < IRB::Command::Base
2
+ category "Alet"
3
+ description t('gen.description')
4
+ help_message TTY::Markdown.parse t('gen.help')
5
+
6
+ def execute(arg)
7
+ object_types = arg.split(' ').map{|s| s.tr(' ', '')}
8
+ Yamori.generate(*object_types)
9
+ end
10
+ end
@@ -0,0 +1,21 @@
1
+ require 'yamori/query_condition'
2
+
3
+ class Query < IRB::Command::Base
4
+ category "Alet"
5
+ description t('query.description')
6
+ help_message TTY::Markdown.parse t('query.help')
7
+
8
+ def execute(arg)
9
+ soql =
10
+ if /\ASELECT/.match?(arg.strip.upcase)
11
+ arg
12
+ else
13
+ object = eval(arg)
14
+ object.to_soql if object&.instance_of? Yamori::QueryMethods::QueryCondition
15
+ end
16
+
17
+ return if soql.nil?
18
+
19
+ puts sf.data.query(soql, format: :human, target_org: ::Alet.config.connection.alias)
20
+ end
21
+ end
@@ -0,0 +1,18 @@
1
+ class Shell < IRB::Command::Base
2
+ category "Alet"
3
+ description t('sh.description')
4
+ help_message TTY::Markdown.parse t('sh.help')
5
+
6
+ def execute(arg)
7
+ ::IRB.conf[:INSPECT_MODE] = false
8
+ return puts `#{arg}` if arg.size > 0
9
+
10
+ s = $stdin.gets
11
+ while s
12
+ puts `#{s}`
13
+ s = $stdin.gets
14
+ end
15
+ ensure
16
+ ::IRB.conf[:INSPECT_MODE] = true
17
+ end
18
+ end
@@ -0,0 +1,45 @@
1
+ require 'irb/helper_method/base'
2
+
3
+ class CurrentConnection < IRB::HelperMethod::Base
4
+ description t('connection.description')
5
+
6
+ def execute
7
+ info = Alet.config.connection
8
+ table =
9
+ TTY::Table.new(rows: [
10
+ [:id, info.id],
11
+ [:alias, info.alias],
12
+ [:user_name, info.user_name],
13
+ [:status, info.status],
14
+ [:instance_url, info.instance_url],
15
+ [:api_version, info.api_version],
16
+ [:access_token, info.access_token]
17
+ ])
18
+ puts table.render :unicode
19
+ end
20
+ end
21
+
22
+ class Apex < IRB::HelperMethod::Base
23
+ description t('apex.description')
24
+
25
+ def execute(apex_code = nil, verbose: false)
26
+ result =
27
+ if apex_code
28
+ sf.apex.run target_org: Alet.config.conn.alias, file: StringIO.new(apex_code)
29
+ else
30
+ sf.apex.run target_org: Alet.config.conn.alias
31
+ end
32
+
33
+ IRB.conf[:INSPECT_MODE] = false
34
+ if verbose
35
+ result.logs.each{|line| puts line }
36
+ else
37
+ pastel = Pastel.new
38
+ result.logs.select{|line| line.include? "USER_DEBUG"}.each do |line|
39
+ match_result = /USER_DEBUG\|.+DEBUG\|(.+)\Z/.match(line)
40
+ puts pastel.cyan(match_result[1])
41
+ end
42
+ end
43
+ IRB.conf[:INSPECT_MODE] = true
44
+ end
45
+ end
data/lib/alet/irb.rb ADDED
@@ -0,0 +1,48 @@
1
+ require 'sf_cli'
2
+ require 'yamori'
3
+ require 'alet/config'
4
+ require 'irb/command/base'
5
+ require 'tty-markdown'
6
+ require 'tty-table'
7
+ require 'pastel'
8
+ require 'i18n'
9
+
10
+ I18n.locale = IRB.conf[:LC_MESSAGES].lang.to_sym
11
+
12
+ #
13
+ # load commands
14
+ #
15
+ require_relative 'irb/command/generate_model'
16
+ require_relative 'irb/command/query'
17
+ require_relative 'irb/command/sh'
18
+ require_relative 'irb/command/export'
19
+
20
+ IRB::Command.register :gen, GenerateModel
21
+ IRB::Command.register :query, Query
22
+ IRB::Command.register :export, Export
23
+ IRB::Command.register :sh, Shell
24
+
25
+ #
26
+ # load helper methods
27
+ #
28
+ require_relative 'irb/helper_methods'
29
+
30
+ IRB::HelperMethod.register(:conn, CurrentConnection)
31
+ IRB::HelperMethod.register(:apex, Apex)
32
+
33
+
34
+ #
35
+ # set connection
36
+ #
37
+ conn = sf.org.display target_org: Alet.config.cli_options[:"target-org"]
38
+
39
+ Alet.config.connection = conn
40
+
41
+ sf.org.login_web target_org: conn.alias, instance_url: conn.instance_url unless conn.connected?
42
+
43
+ Yamori.connect(
44
+ :rest,
45
+ instance_url: conn.instance_url,
46
+ access_token: conn.access_token,
47
+ api_version: conn.api_version
48
+ )
@@ -0,0 +1,19 @@
1
+ module IRBUtils
2
+ refine IRB do
3
+ def IRB.start(ap_path, argv)
4
+ STDOUT.sync = true
5
+ $0 = File::basename(ap_path, ".rb") if ap_path
6
+
7
+ setup(ap_path, argv: argv)
8
+
9
+ @CONF[:USE_COLORIZE] = false
10
+
11
+ if @CONF[:SCRIPT]
12
+ irb = ::IRB::Irb.new(nil, @CONF[:SCRIPT])
13
+ else
14
+ irb = ::IRB::Irb.new
15
+ end
16
+ irb.run(@CONF)
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,3 @@
1
+ module Alet
2
+ VERSION = '0.1.0'
3
+ end
metadata ADDED
@@ -0,0 +1,157 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: alet
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Takanobu Maekawa
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-10-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: gli
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 2.21.5
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 2.21.5
27
+ - !ruby/object:Gem::Dependency
28
+ name: sf_cli
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.2'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.2'
41
+ - !ruby/object:Gem::Dependency
42
+ name: yamori
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.1'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.1'
55
+ - !ruby/object:Gem::Dependency
56
+ name: tty-markdown
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.7.2
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.7.2
69
+ - !ruby/object:Gem::Dependency
70
+ name: tty-table
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 0.12.0
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 0.12.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: pastel
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 0.8.0
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 0.8.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: i18n
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 1.14.6
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 1.14.6
111
+ description: Salesforce console utility for Ruby users
112
+ email:
113
+ executables:
114
+ - alet
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - bin/alet
119
+ - lib/alet/app.rb
120
+ - lib/alet/config.rb
121
+ - lib/alet/config/locales/en.yml
122
+ - lib/alet/config/locales/ja.yml
123
+ - lib/alet/generate/project.rb
124
+ - lib/alet/irb.rb
125
+ - lib/alet/irb/command/export.rb
126
+ - lib/alet/irb/command/generate_model.rb
127
+ - lib/alet/irb/command/query.rb
128
+ - lib/alet/irb/command/sh.rb
129
+ - lib/alet/irb/helper_methods.rb
130
+ - lib/alet/utils/irb.rb
131
+ - lib/alet/version.rb
132
+ homepage: https://github.com/tmkw/alet
133
+ licenses:
134
+ - BSD-2-Clause
135
+ metadata:
136
+ homepage_uri: https://github.com/tmkw/alet
137
+ post_install_message:
138
+ rdoc_options: []
139
+ require_paths:
140
+ - lib
141
+ required_ruby_version: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: 3.3.3
146
+ required_rubygems_version: !ruby/object:Gem::Requirement
147
+ requirements:
148
+ - - ">="
149
+ - !ruby/object:Gem::Version
150
+ version: '0'
151
+ requirements:
152
+ - 'Salesforce CLI ( >= 2.56.7): https://developer.salesforce.com/tools/salesforcecli'
153
+ rubygems_version: 3.5.11
154
+ signing_key:
155
+ specification_version: 4
156
+ summary: A Ruby-styled Salesforce console utility
157
+ test_files: []