alet 0.1.0

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 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: []