cnvrg 2.0.1 → 2.0.15
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Readme.md +43 -1
- data/lib/cnvrg/api.rb +2 -0
- data/lib/cnvrg/api_v2.rb +1 -0
- data/lib/cnvrg/auth.rb +4 -1
- data/lib/cnvrg/cli/library_cli.rb +2 -2
- data/lib/cnvrg/cli.rb +115 -43
- data/lib/cnvrg/files.rb +5 -1
- data/lib/cnvrg/helpers/executer.rb +2 -2
- data/lib/cnvrg/project.rb +27 -8
- data/lib/cnvrg/version.rb +1 -1
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4092be1be35506977a7f1b4778b5bb1dfa234a02fc572812e773069f38e3d518
|
4
|
+
data.tar.gz: f8e954f4bbcbb4b735966c1391c3570c6ab7bf32036c825b7fd6a25460a7d5ef
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8e80a6d6d66eb5101eaa82c339c9c3862d4e39fbaaff7ba6e6d2278d0be5ef1cfc1b7b029e50dd567bf79af389911e2d27ad0d056e33110d1c56b4d613008b33
|
7
|
+
data.tar.gz: ab28db04b2d89b4170c1df63c7fec38c0027538f0e5620672a8ca358fd3234e4d177cdadaf46f5ebb8fe0c5c90f20cfd97179d1456201432b14b094b1555b666
|
data/Readme.md
CHANGED
@@ -23,4 +23,46 @@
|
|
23
23
|
2021-05-05
|
24
24
|
* DEV-8868 - Bug: SDK - e.sync() in git project only creates empty "output" folder in commit
|
25
25
|
## Version v2.0.1
|
26
|
-
2021-06-13
|
26
|
+
2021-06-13
|
27
|
+
## Version v2.0.2
|
28
|
+
2021-06-16
|
29
|
+
* DEV-9694 - Bug: Download artifacts fails on authorization error
|
30
|
+
## Version v2.0.3
|
31
|
+
2021-06-29
|
32
|
+
* DEV-9919 - Bug: clone artifacts fails on "Not Authorize, Are you logged in?"
|
33
|
+
## Version v2.0.4
|
34
|
+
2021-07-08
|
35
|
+
* DEV-9935 - Bug: CLI - cnvrg sync creates new commit but no blob versions
|
36
|
+
## Version v2.0.5
|
37
|
+
2021-07-11
|
38
|
+
* DEV-10171 - Bug: experiment randomly fails with error- "Couldn't clone artifacts"
|
39
|
+
* DEV-10189 - Bug: CLI Sync -file/folder with broken symlink will cause sync to fail
|
40
|
+
## Version v2.0.6
|
41
|
+
2021-07-18
|
42
|
+
* DEV-10209 - Bug: some experiments in grid failed on cnvrg-cli commands (docker container id was missing)
|
43
|
+
## Version v2.0.7
|
44
|
+
2021-07-27
|
45
|
+
* DEV-10186 - Bug: CLI/run an experiment with --local tag giver server error
|
46
|
+
## Version v2.0.8
|
47
|
+
2021-09-06
|
48
|
+
* DEV-10697 - Bug: Tensorboard not starting in workspace and experiment.
|
49
|
+
## Version v2.0.9
|
50
|
+
2021-09-12
|
51
|
+
* DEV-10502 - Bug: Periodic sync stuck
|
52
|
+
## Version v2.0.10
|
53
|
+
2021-09-12
|
54
|
+
* DEV-10502 - Bug: Periodic sync stuck
|
55
|
+
## Version v2.0.11
|
56
|
+
2021-10-21
|
57
|
+
## Version v2.0.12
|
58
|
+
2021-10-25
|
59
|
+
* DEV-11544 - Sub-bug: local experiment is failing to run
|
60
|
+
## Version v2.0.13
|
61
|
+
2021-10-27
|
62
|
+
* DEV-11054 - Task: Create organization and user by default
|
63
|
+
## Version v2.0.14
|
64
|
+
2021-11-11
|
65
|
+
* DEV-11834 - Sub-task: add device name to hpu metrics
|
66
|
+
## Version v2.0.15
|
67
|
+
2021-12-12
|
68
|
+
* DEV-12316 - Improvement: cli login should identify saas users automatically
|
data/lib/cnvrg/api.rb
CHANGED
@@ -57,6 +57,7 @@ module Cnvrg
|
|
57
57
|
conn = Faraday.new "#{endpoint_uri}"
|
58
58
|
end
|
59
59
|
conn.headers['Auth-Token'] = @pass
|
60
|
+
conn.headers['Authorization'] = "CAPI #{@pass}"
|
60
61
|
conn.headers['User-Agent'] = "#{Cnvrg::API::USER_AGENT}"
|
61
62
|
conn.options.timeout = 420
|
62
63
|
conn.options.open_timeout=180
|
@@ -169,6 +170,7 @@ module Cnvrg
|
|
169
170
|
when 'POST_FILE'
|
170
171
|
conn = Faraday.new do |fr|
|
171
172
|
fr.headers['Auth-Token'] = @pass
|
173
|
+
fr.headers['Authorization'] = "CAPI #{@pass}"
|
172
174
|
fr.headers['User-Agent'] = "#{Cnvrg::API::USER_AGENT}"
|
173
175
|
fr.headers["Content-Type"] = "multipart/form-data"
|
174
176
|
if !Helpers.is_verify_ssl
|
data/lib/cnvrg/api_v2.rb
CHANGED
@@ -22,6 +22,7 @@ module Cnvrg
|
|
22
22
|
|
23
23
|
conn = Faraday.new endpoint_uri, :ssl => {:verify => !!Helpers.is_verify_ssl}
|
24
24
|
conn.headers['Auth-Token'] = pass
|
25
|
+
conn.headers['Authorization'] = "CAPI #{pass}"
|
25
26
|
conn.headers['User-Agent'] = Cnvrg::API::USER_AGENT
|
26
27
|
conn.headers['Content-Type'] = "application/json"
|
27
28
|
conn.options.timeout = 420
|
data/lib/cnvrg/auth.rb
CHANGED
@@ -44,7 +44,7 @@ module Cnvrg
|
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
|
-
def sign_in(email, password)
|
47
|
+
def sign_in(email, password, token: nil)
|
48
48
|
url = Cnvrg::API.endpoint_uri()
|
49
49
|
url = URI.parse(url+ "/users/sign_in")
|
50
50
|
http = Net::HTTP.new(url.host, url.port)
|
@@ -61,6 +61,9 @@ module Cnvrg
|
|
61
61
|
|
62
62
|
req.add_field("EMAIL", email)
|
63
63
|
req.add_field("PASSWORD", password)
|
64
|
+
if token.present?
|
65
|
+
req.add_field("Authorization", "CAPI #{token}")
|
66
|
+
end
|
64
67
|
|
65
68
|
response = http.request(req)
|
66
69
|
|
data/lib/cnvrg/cli.rb
CHANGED
@@ -496,8 +496,10 @@ module Cnvrg
|
|
496
496
|
|
497
497
|
|
498
498
|
desc 'login', 'Authenticate with cnvrg.io platform'
|
499
|
+
method_option :sso, :type => :boolean, :aliases => ["-s", "--sso"], :default => false
|
499
500
|
|
500
501
|
def login
|
502
|
+
use_token = options["sso"]
|
501
503
|
begin
|
502
504
|
log_handler()
|
503
505
|
log_start(__method__, args, options)
|
@@ -515,12 +517,22 @@ module Cnvrg
|
|
515
517
|
exit(0)
|
516
518
|
end
|
517
519
|
@email = ask("Enter your email:")
|
518
|
-
|
519
|
-
|
520
|
+
url = Cnvrg::API.endpoint_uri()
|
521
|
+
if use_token or url.include?("cloud.cnvrg.io")
|
522
|
+
@token = cmd.ask("Enter your token (hidden):") {|q| q.echo = "*"}
|
523
|
+
netrc[Cnvrg::Helpers.netrc_domain] = @email, @token
|
524
|
+
netrc.save
|
525
|
+
password = ""
|
526
|
+
else
|
527
|
+
password = cmd.ask("Enter your password (hidden):") {|q| q.echo = "*"}
|
528
|
+
end
|
529
|
+
result = @auth.sign_in(@email, password, token: @token)
|
520
530
|
|
521
531
|
if !result["token"].nil?
|
522
|
-
|
523
|
-
|
532
|
+
unless use_token
|
533
|
+
netrc[Cnvrg::Helpers.netrc_domain] = @email, result["token"]
|
534
|
+
netrc.save
|
535
|
+
end
|
524
536
|
|
525
537
|
log_message("Authenticated successfully as #{@email}", Thor::Shell::Color::GREEN)
|
526
538
|
|
@@ -3006,12 +3018,12 @@ module Cnvrg
|
|
3006
3018
|
method_option :job_slug, :type => :string, :aliases => ["-j", "--job"], :default => nil
|
3007
3019
|
method_option :job_type, :type => :string, :aliases => ["-jt", "--job_type"], :default => nil
|
3008
3020
|
method_option :files, :type => :string, :aliases => ["--files"], :default => nil
|
3009
|
-
method_option :output_dir, :type => :string, :aliases => ["--output_dir"], :default =>
|
3021
|
+
method_option :output_dir, :type => :string, :aliases => ["--output_dir"], :default => 'output'
|
3010
3022
|
method_option :git_diff, :type => :boolean, :aliases => ["--git_diff"], :default => false
|
3011
3023
|
method_option :suppress_exceptions, :type => :boolean, :aliases => ["--suppress-exceptions"], :default => true
|
3012
3024
|
method_option :debug_mode, :type => :boolean, :aliases => ["--debug-mode"], :default => false
|
3013
3025
|
method_option :chunk_size, :type => :numeric, :aliases => ["--chunk"], :default => 1000
|
3014
|
-
method_option :local, :type => :boolean, :aliases => ["--local"], :default =>
|
3026
|
+
method_option :local, :type => :boolean, :aliases => ["--local"], :default => true
|
3015
3027
|
|
3016
3028
|
def sync(direct = true)
|
3017
3029
|
verify_logged_in(true) if direct
|
@@ -3147,7 +3159,7 @@ module Cnvrg
|
|
3147
3159
|
invoke :exec, [cmd], :sync_before => sync_before, :sync_after => sync_after, :title => title,
|
3148
3160
|
:log => log, :email_notification => email_notification, :upload_output => upload_output,
|
3149
3161
|
:commit => commit, :image => image, :data => data, :data_commit => data_commit,
|
3150
|
-
:ignore => ignore, :force => force, :output_dir=>output_dir, :data_query=>data_query
|
3162
|
+
:ignore => ignore, :force => force, :output_dir=>output_dir, :data_query=>data_query, :local => local
|
3151
3163
|
return
|
3152
3164
|
end
|
3153
3165
|
else
|
@@ -3204,6 +3216,7 @@ module Cnvrg
|
|
3204
3216
|
method_option :data_query, :type => :string, :aliases => ["-q", "--query"], :default => nil
|
3205
3217
|
method_option :use_bash, :type => :boolean, :aliases => ["-b", "--use_bash"], :default => false
|
3206
3218
|
method_option :docker_stats, :type => :boolean, :aliases => ["--docker_stats"], :default => true
|
3219
|
+
method_option :local, :type => :boolean, :aliases => ["-l", "--local"], :default => false
|
3207
3220
|
|
3208
3221
|
def exec(*cmd)
|
3209
3222
|
log = []
|
@@ -3228,6 +3241,7 @@ module Cnvrg
|
|
3228
3241
|
project_home = get_project_home
|
3229
3242
|
data_query = options["data_query"]
|
3230
3243
|
docker_stats = options["docker_stats"]
|
3244
|
+
local = options[:local] || false
|
3231
3245
|
@project = Project.new(project_home)
|
3232
3246
|
if @project.is_git
|
3233
3247
|
sync_before = false
|
@@ -3323,43 +3337,49 @@ module Cnvrg
|
|
3323
3337
|
if @exp.get_cmd.present?
|
3324
3338
|
cmd = @exp.get_cmd
|
3325
3339
|
end
|
3326
|
-
|
3327
|
-
|
3328
|
-
|
3329
|
-
|
3330
|
-
|
3331
|
-
|
3332
|
-
|
3333
|
-
|
3334
|
-
|
3335
|
-
|
3336
|
-
|
3337
|
-
|
3338
|
-
|
3339
|
-
|
3340
|
-
|
3341
|
-
|
3342
|
-
|
3343
|
-
|
3344
|
-
|
3345
|
-
|
3346
|
-
|
3347
|
-
|
3348
|
-
|
3349
|
-
|
3350
|
-
|
3351
|
-
|
3352
|
-
|
3353
|
-
|
3354
|
-
|
3355
|
-
|
3356
|
-
|
3357
|
-
|
3358
|
-
log
|
3359
|
-
|
3340
|
+
|
3341
|
+
if local
|
3342
|
+
exec_local(cmd, print_log, start_commit, real, start_time)
|
3343
|
+
exit_status = $?.exitstatus
|
3344
|
+
|
3345
|
+
else
|
3346
|
+
command_slug = (0...18).map { (65 + rand(26)).chr }.join
|
3347
|
+
result_file = "/conf/result-#{command_slug}"
|
3348
|
+
data = {cmd: cmd, async: true, format: true, file_name: result_file, use_script: true, use_bash: options["use_bash"]}
|
3349
|
+
conn = Cnvrg::Helpers::Executer.get_main_conn
|
3350
|
+
response = conn.post('command', data.to_json)
|
3351
|
+
if response.to_hash[:status].to_i != 200
|
3352
|
+
exit_status = 129
|
3353
|
+
raise StandardError.new("Cant send command to slave")
|
3354
|
+
end
|
3355
|
+
t = FileWatch::Tail.new
|
3356
|
+
filename = result_file
|
3357
|
+
lines = []
|
3358
|
+
t.tail(filename)
|
3359
|
+
t.subscribe do |path, line|
|
3360
|
+
begin
|
3361
|
+
cur_log = JSON.parse(line)
|
3362
|
+
if cur_log["type"] == "endMessage"
|
3363
|
+
exit_status = cur_log["real"].to_i
|
3364
|
+
break
|
3365
|
+
else
|
3366
|
+
puts(cur_log.to_json)
|
3367
|
+
STDOUT.flush
|
3368
|
+
cur_log["time"] = Time.parse(cur_log["timestamp"])
|
3369
|
+
cur_log["message"] = cur_log["message"].to_s + "\r\n"
|
3370
|
+
log << cur_log
|
3371
|
+
end
|
3372
|
+
if log.size >= 10
|
3373
|
+
@exp.upload_temp_log(log)
|
3374
|
+
log = []
|
3375
|
+
elsif (start_time + 15.seconds) <= Time.now
|
3376
|
+
@exp.upload_temp_log(log) unless log.empty?
|
3377
|
+
log = []
|
3378
|
+
start_time = Time.now
|
3379
|
+
end
|
3380
|
+
rescue => e
|
3381
|
+
log_error(e)
|
3360
3382
|
end
|
3361
|
-
rescue => e
|
3362
|
-
log_error(e)
|
3363
3383
|
end
|
3364
3384
|
end
|
3365
3385
|
end_time = Time.now
|
@@ -4692,6 +4712,7 @@ module Cnvrg
|
|
4692
4712
|
data_result.each_with_index do |res, i|
|
4693
4713
|
timestamp, value = res["value"]
|
4694
4714
|
uuid = res["metric"]["UUID"].presence || i
|
4715
|
+
uuid = res["metric"]["device"] if query_name == "gaudi"
|
4695
4716
|
stat_value = value.present? ? ("%.2f" % value) : 0 # converting 34.685929244444445 to 34.69
|
4696
4717
|
stat_value = stat_value.to_i == stat_value.to_f ? stat_value.to_i : stat_value.to_f # converting 34.00 to 34
|
4697
4718
|
if query_name.include? 'block'
|
@@ -5876,6 +5897,57 @@ module Cnvrg
|
|
5876
5897
|
end
|
5877
5898
|
end
|
5878
5899
|
|
5900
|
+
def exec_local(cmd , print_log, start_commit, real, start_time)
|
5901
|
+
log = []
|
5902
|
+
PTY.spawn(@exp.as_env, cmd) do |stdout, stdin, pid, stderr|
|
5903
|
+
begin
|
5904
|
+
stdout.each do |line|
|
5905
|
+
cur_time = Time.now
|
5906
|
+
real_time = Time.now - real
|
5907
|
+
cur_log = {time: cur_time,
|
5908
|
+
message: line,
|
5909
|
+
type: "stdout",
|
5910
|
+
real: real_time
|
5911
|
+
}
|
5912
|
+
if print_log
|
5913
|
+
puts({log: line, timestamp: Time.now, exp_logs: true}.to_json)
|
5914
|
+
end
|
5915
|
+
log << cur_log
|
5916
|
+
if log.size >= 10
|
5917
|
+
@exp.upload_temp_log(log) unless log.empty?
|
5918
|
+
log = []
|
5919
|
+
elsif (start_time + 15.seconds) <= Time.now
|
5920
|
+
@exp.upload_temp_log(log) unless log.empty?
|
5921
|
+
log = []
|
5922
|
+
start_time = Time.now
|
5923
|
+
end
|
5924
|
+
end
|
5925
|
+
if stderr
|
5926
|
+
stderr.each do |err|
|
5927
|
+
log << {time: Time.now, message: err, type: "stderr"}
|
5928
|
+
end
|
5929
|
+
end
|
5930
|
+
rescue Errno::EIO => e
|
5931
|
+
log_error(e)
|
5932
|
+
if !log.empty?
|
5933
|
+
temp_log = log
|
5934
|
+
@exp.upload_temp_log(temp_log) unless temp_log.empty?
|
5935
|
+
log -= temp_log
|
5936
|
+
end
|
5937
|
+
rescue Errno::ENOENT => e
|
5938
|
+
exp_success = false
|
5939
|
+
log_message("command \"#{cmd}\" couldn't be executed, verify command is valid", Thor::Shell::Color::RED)
|
5940
|
+
log_error(e)
|
5941
|
+
rescue => e
|
5942
|
+
res = @exp.end(log, 1, start_commit, 0, 0)
|
5943
|
+
log_message("Error occurred,aborting", Thor::Shell::Color::RED)
|
5944
|
+
log_error(e)
|
5945
|
+
exit(0)
|
5946
|
+
end
|
5947
|
+
::Process.wait pid
|
5948
|
+
end
|
5949
|
+
end
|
5950
|
+
|
5879
5951
|
end
|
5880
5952
|
end
|
5881
5953
|
|
data/lib/cnvrg/files.rb
CHANGED
@@ -730,7 +730,11 @@ module Cnvrg
|
|
730
730
|
end
|
731
731
|
res = Cnvrg::API.request(@base_resource + "download_files", 'POST', {files: files, commit: commit})
|
732
732
|
unless Cnvrg::CLI.is_response_success(res, false)
|
733
|
-
|
733
|
+
begin
|
734
|
+
puts(res)
|
735
|
+
rescue
|
736
|
+
end
|
737
|
+
raise StandardError.new("Cant download files from the server.")
|
734
738
|
end
|
735
739
|
self.download_multiple_files_s3(res['result'], @project_home, postfix: postfix, progress: progress, threads: threads)
|
736
740
|
end
|
@@ -3,7 +3,7 @@ require 'cnvrg/helpers/agent'
|
|
3
3
|
class Cnvrg::Helpers::Executer
|
4
4
|
attr_reader :machine_activity, :agent_id, :main_id
|
5
5
|
MAIN_CONTAINER_PORT = ENV['MAIN_CONTAINER_PORT'].try(:to_i) || 4000
|
6
|
-
|
6
|
+
HAS_DOCKER = ENV['HAS_DOCKER'] == "true"
|
7
7
|
|
8
8
|
### this class represent a machine_activity. it will poll the commands, communicate with the
|
9
9
|
# server (poll commands) and let the server know the status of this executer.
|
@@ -84,7 +84,7 @@ class Cnvrg::Helpers::Executer
|
|
84
84
|
agent_id = nil
|
85
85
|
main_id = nil
|
86
86
|
timeout = 2
|
87
|
-
timeout = nil if !@is_new_main
|
87
|
+
timeout = nil if (!@is_new_main || HAS_DOCKER)
|
88
88
|
Timeout.timeout(timeout) do
|
89
89
|
while agent_id.blank? or main_id.blank?
|
90
90
|
grep_by = @job_id
|
data/lib/cnvrg/project.rb
CHANGED
@@ -328,15 +328,21 @@ module Cnvrg
|
|
328
328
|
end
|
329
329
|
|
330
330
|
def get_storage_client
|
331
|
-
|
332
|
-
|
333
|
-
|
331
|
+
client_params = nil
|
332
|
+
i = 0
|
333
|
+
begin
|
334
|
+
response = Cnvrg::API.request("users/#{@owner}/projects/#{@slug}/client", 'GET')
|
335
|
+
unless Cnvrg::CLI.is_response_success(response, false)
|
336
|
+
raise StandardError.new("Can't find project credentials")
|
337
|
+
end
|
334
338
|
client_params = response['client']
|
335
|
-
|
336
|
-
|
339
|
+
rescue StandardError
|
340
|
+
i += 1
|
341
|
+
sleep(5 * i)
|
342
|
+
retry if i < 10
|
337
343
|
client_params = get_storage_client_fallback
|
338
344
|
end
|
339
|
-
|
345
|
+
raise StandardError.new("Can't find project credentials") unless client_params
|
340
346
|
Cnvrg::Downloader::Client.factory(client_params)
|
341
347
|
end
|
342
348
|
|
@@ -381,10 +387,12 @@ module Cnvrg
|
|
381
387
|
def generate_output_dir(output_dir, local: false)
|
382
388
|
Cnvrg::Logger.log_info("Generating output dir for #{output_dir}")
|
383
389
|
upload_list = []
|
390
|
+
list = []
|
384
391
|
list = Dir.glob("/cnvrg/#{output_dir}/**/*", File::FNM_DOTMATCH)
|
385
392
|
if local
|
386
393
|
list += Dir.glob("#{output_dir}/**/*", File::FNM_DOTMATCH)
|
387
394
|
end
|
395
|
+
list.uniq!
|
388
396
|
Parallel.map(list, in_threads: IDXParallelThreads) do |e|
|
389
397
|
next if e.end_with? "/."
|
390
398
|
if File.directory? e
|
@@ -449,6 +457,10 @@ module Cnvrg
|
|
449
457
|
if list_ignore_new.include? label
|
450
458
|
next
|
451
459
|
end
|
460
|
+
if File.symlink?(e)
|
461
|
+
Cnvrg::Logger.log_info("Skipping symlink #{e}")
|
462
|
+
next
|
463
|
+
end
|
452
464
|
if File.directory? e
|
453
465
|
dir_name = (label.ends_with? "/") ? label : (label + "/")
|
454
466
|
tree_idx[dir_name] = nil
|
@@ -649,7 +661,11 @@ module Cnvrg
|
|
649
661
|
|
650
662
|
def fetch_webapp_slugs(webapp_slug, slugs: nil)
|
651
663
|
response = Cnvrg::API_V2.request("#{self.owner}/projects/#{self.slug}/webapps/#{webapp_slug}" , 'GET')
|
652
|
-
|
664
|
+
|
665
|
+
if response.key?("experiments")
|
666
|
+
return response["experiments"]
|
667
|
+
end
|
668
|
+
return response["data"]["attributes"]["experiments"]
|
653
669
|
rescue
|
654
670
|
slugs
|
655
671
|
end
|
@@ -701,8 +717,11 @@ module Cnvrg
|
|
701
717
|
res = JSON.parse(resp['result']) rescue nil
|
702
718
|
return if res.blank?
|
703
719
|
config = self.get_config
|
704
|
-
config[:is_git] = res['git']
|
705
720
|
config[:project_name] = res['title']
|
721
|
+
config[:project_slug] = @slug
|
722
|
+
config[:owner] = @owner
|
723
|
+
config[:git] = res['git'] || false
|
724
|
+
config[:is_git] = res['git'] || false
|
706
725
|
self.set_config(config)
|
707
726
|
end
|
708
727
|
|
data/lib/cnvrg/version.rb
CHANGED
metadata
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cnvrg
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.15
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yochay Ettun
|
8
8
|
- Leah Kolben
|
9
9
|
- Omer Shacham
|
10
|
-
autorequire:
|
10
|
+
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2021-
|
13
|
+
date: 2021-12-12 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: bundler
|
@@ -473,7 +473,7 @@ files:
|
|
473
473
|
homepage: https://cnvrg.io
|
474
474
|
licenses: []
|
475
475
|
metadata: {}
|
476
|
-
post_install_message:
|
476
|
+
post_install_message:
|
477
477
|
rdoc_options: []
|
478
478
|
require_paths:
|
479
479
|
- lib
|
@@ -488,8 +488,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
488
488
|
- !ruby/object:Gem::Version
|
489
489
|
version: '0'
|
490
490
|
requirements: []
|
491
|
-
rubygems_version: 3.
|
492
|
-
signing_key:
|
491
|
+
rubygems_version: 3.2.32
|
492
|
+
signing_key:
|
493
493
|
specification_version: 4
|
494
494
|
summary: A CLI tool for interacting with cnvrg.io.
|
495
495
|
test_files: []
|