cnvrg 1.2.5 → 1.2.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 6c380da2980fbcbf88cc7dd13b618a339b858f1e
4
- data.tar.gz: 7622da00f49f89325195bd03caaa23920e7f9f0d
2
+ SHA256:
3
+ metadata.gz: 8e33d716e3fce0ef29d6684c29dec59f6edd04173d0330343d0510ec11bd087a
4
+ data.tar.gz: 9a019b36e6611ffd4b627c7fb9b9edecbde44be360f26034b668c52da804da8d
5
5
  SHA512:
6
- metadata.gz: ff8016c9f8e7b66b7818292e69f86971249ba225e3178f297c7f93b0bec1a8a85e14439cca76fdaf70afd1793d6eee1d083df3162af11d5c8f7e9de7b9b6aceb
7
- data.tar.gz: e3f764b61ce441484238d01f42cebef55aedb00c2d93a23e663ba3f705551ad5c8aa8c7ef37a6486cfdffee938d2b21e5111638115db42c8ba3efe7ab19b8eec
6
+ metadata.gz: ad76658b08c85dcab2cade07327e5e6c7f4843e9eecbc6d2c768d4e3d166723e2f007d8260d83fd6d2f3cabbb25daf85bf7b247fe7b0bd45445f8af7cae2b141
7
+ data.tar.gz: 22da11b1b04ec3e55fbb9a3586651783411daa1fc1c5d06548890f71770b0e152740589b883394f84172f3e5d0f0519001abaa4416031bfa0856cd553be685c3
@@ -20,7 +20,6 @@ module Cnvrg
20
20
  @owner = ""
21
21
  @username = ""
22
22
  Cnvrg::Logger.log_info("cnvrg is not configured")
23
-
24
23
  end
25
24
 
26
25
  end
@@ -449,6 +449,22 @@ module Cnvrg
449
449
  end
450
450
 
451
451
 
452
+ desc 'auth', "hidden..", hide: true
453
+ def auth
454
+ @token = ENV['CNVRG_TOKEN']
455
+ owner = ENV['CNVRG_OWNER']
456
+ user = ENV['CNVRG_USER']
457
+ api = ENV['CNVRG_API']
458
+ @email = ENV['CNVRG_EMAIL']
459
+
460
+ netrc = Netrc.read
461
+ netrc[Cnvrg::Helpers.netrc_domain] = @email, @token
462
+ netrc.save
463
+
464
+ set_owner(owner, user, api)
465
+ end
466
+
467
+
452
468
  desc 'login', 'Authenticate with cnvrg.io platform'
453
469
 
454
470
  def login
@@ -488,39 +504,6 @@ module Cnvrg
488
504
  choose_owner = owners[0]
489
505
  end
490
506
 
491
- # if owners.empty?
492
- # else
493
- # owners << choose_owner
494
- # chosen = false
495
- # while !chosen
496
- # owners_id = owners.each_with_index.map { |x, i| "#{i+1}. #{x}" }
497
- # choose_owner = ask("Choose default owner:\n"+owners_id.join("\n")+"\n")
498
- #
499
- # if choose_owner =~ /[[:digit:]]/
500
- # ow_index = choose_owner.to_i-1
501
- # if ow_index<0 or ow_index >= owners.size
502
- # say "No such owner, please choose again", Thor::Shell::Color::BLUE
503
- # chosen = false
504
- # next
505
- # end
506
- # choose_owner = owners[choose_owner.to_i-1]
507
- # chosen = true
508
- #
509
- # else
510
- #
511
- # owners_lower = owners.map { |o| o.downcase }
512
- # ow_index = owners_lower.index(choose_owner.downcase)
513
- # if ow_index.nil?
514
- # say "Could not find owner named #{choose_owner}", Thor::Shell::Color::RED
515
- # else
516
- # chosen = true
517
- # end
518
- # end
519
- #
520
- # end
521
-
522
-
523
- # end
524
507
 
525
508
  if set_owner(choose_owner, result["username"], urls[ow_index])
526
509
  log_message("Setting default owner: #{choose_owner}", Thor::Shell::Color::GREEN)
@@ -831,13 +814,10 @@ module Cnvrg
831
814
  log_message("Cloning #{dataset_name}", Thor::Shell::Color::BLUE)
832
815
  @files = Cnvrg::Datafiles.new(owner, slug)
833
816
  log_message("Downloading files", Thor::Shell::Color::BLUE)
834
- # if not(query.nil? or query.empty?)
835
- # @files.download_list_files_in_query(response["result"]["list_files"],dataset_home)
836
-
837
- # log_message("#{check} Clone finished successfully", Thor::Shell::Color::GREEN)
838
- # return
839
-
840
- # end
817
+ if only_tree
818
+ success = Dataset.clone_tree(commit: commit, dataset_home: dataset_home)
819
+ return if success
820
+ end
841
821
  commit = response["result"]["commit"]
842
822
  files_count = response["result"]["file_count"]
843
823
  files = @files.get_clone_chunk(commit: commit)
@@ -1688,7 +1668,7 @@ module Cnvrg
1688
1668
  end
1689
1669
 
1690
1670
 
1691
- desc 'link git project', 'link git project'
1671
+ desc 'link_git CNVRG_PROJECT_URL', 'Link git project to existed cnvrg project'
1692
1672
  method_option :git, :type => :boolean, :aliases => ["-g", "--git"], :default => false
1693
1673
  def link_git(project_url)
1694
1674
  begin
@@ -3069,9 +3049,6 @@ module Cnvrg
3069
3049
  exp_success = false
3070
3050
  log_message("command \"#{cmd}\" couldn't be executed, verify command is valid", Thor::Shell::Color::RED)
3071
3051
  log_error(e)
3072
- # rescue Open4::ChildExited
3073
- # exp_success = false
3074
- # log_message("The process exited!", Thor::Shell::Color::RED)
3075
3052
  rescue => e
3076
3053
  res = @exp.end(log, 1, start_commit, 0, 0)
3077
3054
  log_message("Error occurred,aborting", Thor::Shell::Color::RED)
@@ -3080,6 +3057,7 @@ module Cnvrg
3080
3057
  end
3081
3058
  ::Process.wait pid
3082
3059
  end
3060
+ end_time = Time.now
3083
3061
  process_running = false
3084
3062
 
3085
3063
  if !log.empty?
@@ -3116,7 +3094,7 @@ module Cnvrg
3116
3094
  # log_thread.join
3117
3095
  stats_thread.join
3118
3096
 
3119
- res = @exp.end(log, exit_status, end_commit, cpu_average, memory_average)
3097
+ res = @exp.end(log, exit_status, end_commit, cpu_average, memory_average, end_time: end_time)
3120
3098
 
3121
3099
 
3122
3100
  if !exp_success
@@ -3410,12 +3388,7 @@ module Cnvrg
3410
3388
 
3411
3389
 
3412
3390
  image = is_project_with_docker(working_dir)
3413
- if !image or !image.is_docker
3414
- image = Images.new(working_dir, "cnvrg")
3415
- image_slug = image.image_slug
3416
- else
3417
- image_slug = image.image_slug
3418
- end
3391
+ image_slug = 'cnvrg'
3419
3392
 
3420
3393
 
3421
3394
  invoke :sync, [false], []
@@ -5961,7 +5934,7 @@ module Cnvrg
5961
5934
 
5962
5935
 
5963
5936
  def parse_io(block_io_str)
5964
- block_io = block_io_str.gsub!(" ", "").split('/')
5937
+ block_io = block_io_str.gsub(" ", "").split('/')
5965
5938
  input = block_io[0]
5966
5939
  output = block_io[1]
5967
5940
  r = Regexp.new('(\d+(\.\d+)?)([A-Za-z]+)')
@@ -114,7 +114,7 @@ module Cnvrg
114
114
  end
115
115
  end
116
116
 
117
- desc 'date put dataset_url', 'clone datset'
117
+ desc 'data put dataset_url', 'clone datset'
118
118
  method_option :dir, :type => :string, :aliases => ["-d", "--dir"], :default => ''
119
119
  def put(dataset_url, *files)
120
120
  cli = Cnvrg::CLI.new()
@@ -151,6 +151,24 @@ module Cnvrg
151
151
 
152
152
  end
153
153
 
154
+ desc 'data files', 'list dataset files'
155
+ method_option :offset, :type => :numeric, :aliases => ["-o", "--offset"], :default => 0
156
+ method_option :limit, :type => :numeric, :aliases => ["-l", "--limit"], :default => 1000
157
+ method_option :expires, :type => :numeric, :aliases => ["-ex", "--expires"], :default => 3600
158
+ method_option :commit_sha1, :type => :string, :aliases => ["-c", "--commit"], :default => nil
159
+ def files(dataset_url)
160
+ cli = Cnvrg::CLI.new()
161
+ cli.verify_logged_in(false)
162
+ cli.log_start(__method__, args, options)
163
+ @dataset = Dataset.new(dataset_url: dataset_url)
164
+ files = @dataset.list_files(
165
+ commit_sha1: options[:commit_sha1],
166
+ limit: options[:limit],
167
+ expires: options[:expires],
168
+ offset: options[:offset])
169
+ cli.log_message(files)
170
+ end
171
+
154
172
  desc 'data queries', 'list of all queries'
155
173
  def queries()
156
174
  cli = Cnvrg::CLI.new()
@@ -875,6 +875,12 @@ module Cnvrg
875
875
  end
876
876
  end
877
877
 
878
+ def get_trees(commit: "latest")
879
+ response = Cnvrg::API.request("#{@base_resource}/clone_trees", 'POST',{commit: commit})
880
+ return nil unless Cnvrg::CLI.is_response_success(response, false)
881
+ response['result']['files']
882
+ end
883
+
878
884
  def get_clone_chunk(latest_id: nil, chunk_size: 1000, commit: 'latest')
879
885
  response = Cnvrg::API.request("#{@base_resource}/clone_chunk", 'POST',{commit: commit, chunk_size: chunk_size, latest_id: latest_id})
880
886
  return nil unless Cnvrg::CLI.is_response_success(response, false)
@@ -7,14 +7,21 @@ module Cnvrg
7
7
  IDXParallelThreads ||= 15
8
8
  IDXParallelProcesses ||= Parallel.processor_count
9
9
 
10
- def initialize(project_home)
10
+ def initialize(project_home = '', dataset_url: '')
11
11
  begin
12
- @local_path = project_home
13
- @working_dir = project_home
14
- config = YAML.load_file(project_home+"/.cnvrg/config.yml")
15
- @title = config[:dataset_name]
16
- @slug = config[:dataset_slug]
17
- @owner = config[:owner]
12
+ if project_home.present?
13
+ @local_path = project_home
14
+ @working_dir = project_home
15
+ config = YAML.load_file(project_home+"/.cnvrg/config.yml")
16
+ @title = config[:dataset_name]
17
+ @slug = config[:dataset_slug]
18
+ @owner = config[:owner]
19
+ else
20
+ owner, slug = Cnvrg::Helpers.extract_owner_slug_from_url(dataset_url, 'datasets')
21
+ @title = slug
22
+ @slug = slug
23
+ @owner = owner
24
+ end
18
25
  rescue => e
19
26
 
20
27
  end
@@ -306,6 +313,32 @@ module Cnvrg
306
313
  return true
307
314
  end
308
315
 
316
+ def list_files(commit_sha1: "latest", limit: 1000, offset: 0, expires: 3600)
317
+ response = Cnvrg::API.request("users/#{self.owner}/datasets/#{self.slug}/list", 'GET', {commit_sha1: commit_sha1, limit: limit, offset: offset, expires: expires})
318
+ return nil if response.blank?
319
+ response.to_json
320
+ end
321
+
322
+ def self.clone_tree(commit: 'latest', dataset_home: nil)
323
+ @dataset = Cnvrg::Dataset.new(dataset_home)
324
+ @files = Cnvrg::Datafiles.new(@dataset.owner, @dataset.slug, dataset: @dataset)
325
+ trees = @files.get_trees(commit: commit)
326
+ return false if trees.nil?
327
+ pb = ProgressBar.create(:title => "Download Progress",
328
+ :progress_mark => '=',
329
+ :format => "%b>>%i| %p%% %t",
330
+ :starting_at => 0,
331
+ :total => trees.size,
332
+ :autofinish => true)
333
+ trees.each do |tree|
334
+ pb.progress += 1
335
+ @files.download_dir(dataset_home, tree)
336
+ end
337
+ pb.finish
338
+ @dataset.write_success
339
+ true
340
+ end
341
+
309
342
  def write_success(in_folder = false)
310
343
  file_path = ".cnvrg/config.yml"
311
344
  file_path = "#{@slug}/" + file_path if !in_folder
@@ -623,11 +656,7 @@ module Cnvrg
623
656
  idx_hash = YAML.load_file("#{self.local_path}/.cnvrg/idx.yml")
624
657
  return idx_hash[:commit]
625
658
  end
626
- def list_files(commit, json)
627
- response = Cnvrg::API.request("users/#{self.owner}/datasets/#{self.slug}/list", 'GET', {commit_sha1:commit, as_json:json})
628
- CLI.is_response_success(response,true)
629
- return response
630
- end
659
+
631
660
  def compare_commit(commit)
632
661
  if commit.nil? or commit.empty?
633
662
  commit = last_local_commit
@@ -127,12 +127,21 @@ module Cnvrg
127
127
  Cnvrg::CLI.is_response_success(response,false)
128
128
  end
129
129
 
130
- def end(output, exit_status, end_commit, cpu_average, memory_average)
130
+ def end(output, exit_status, end_commit, cpu_average, memory_average, end_time: nil)
131
131
  #if remote try to remove
132
- response = Cnvrg::API.request(@base_resource + "experiment/end", 'POST', {output: output, exp_slug: @slug,
132
+ tries = 0
133
+ success = false
134
+ end_time ||= Time.now
135
+ while tries < 10 and success.blank?
136
+ sleep (tries*rand) ** 2 ### exponential backoff
137
+ ## this call is super important so we cant let it crash.
138
+
139
+ tries += 1
140
+ response = Cnvrg::API.request(@base_resource + "experiment/end", 'POST', {output: output, exp_slug: @slug,
133
141
  exit_status: exit_status, end_commit: end_commit,
134
- cpu_average: cpu_average, memory_average: memory_average})
135
- Cnvrg::CLI.is_response_success(response,false)
142
+ cpu_average: cpu_average, memory_average: memory_average, end_time: end_time})
143
+ success = Cnvrg::CLI.is_response_success(response,false)
144
+ end
136
145
 
137
146
  begin
138
147
  FileUtils.rm_rf(["/home/ds/.cnvrg/tmp/exec.log"])
@@ -584,6 +584,7 @@ module Cnvrg
584
584
  #TODO: parallel
585
585
  files_list.map do |file|
586
586
  next [file, nil] unless File.exists? file
587
+ next [file, nil] if File.directory? file
587
588
  sha1 = OpenSSL::Digest::SHA1.file(file).hexdigest
588
589
  [file.gsub("#{@project_home}/", ""), sha1]
589
590
  end.to_h
@@ -238,6 +238,14 @@ parameters:
238
238
  return -1
239
239
  end
240
240
 
241
+ def extract_owner_slug_from_url(url, breaker)
242
+ url_parts = url.split("/")
243
+ project_index = Cnvrg::Helpers.look_for_in_path(url, breaker)
244
+ slug = url_parts[project_index + 1]
245
+ owner = url_parts[project_index - 1]
246
+ return owner, slug
247
+ end
248
+
241
249
  # cpu
242
250
 
243
251
  def cpu_time
@@ -92,6 +92,11 @@ module Cnvrg
92
92
  $log.info message: msg, type: "info"
93
93
  end
94
94
 
95
+ def log_json(json, msg: '')
96
+ Cnvrg::Logger.log_handler if $log.blank?
97
+ $log.info message: msg, type: "info", data: json
98
+ end
99
+
95
100
  def jsonify_message(msg: '', success: true)
96
101
  puts JSON[{
97
102
  "msg": msg,
@@ -504,6 +504,7 @@ module Cnvrg
504
504
  response['result']['tree']['added'] -= downloaded_files
505
505
  response['result']['tree']['updated_on_server'] -= downloaded_files
506
506
  end
507
+ Cnvrg::Logger.log_json(response, msg: "Comparing IDX response(tree)")
507
508
  return response
508
509
  end
509
510
 
@@ -1,4 +1,4 @@
1
1
  module Cnvrg
2
- VERSION = '1.2.5'
2
+ VERSION = '1.2.6'
3
3
  end
4
4
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cnvrg
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.5
4
+ version: 1.2.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yochay Ettun
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2019-02-05 00:00:00.000000000 Z
12
+ date: 2019-03-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -412,7 +412,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
412
412
  version: '0'
413
413
  requirements: []
414
414
  rubyforge_project:
415
- rubygems_version: 2.6.14
415
+ rubygems_version: 2.7.9
416
416
  signing_key:
417
417
  specification_version: 4
418
418
  summary: A CLI tool for interacting with cnvrg.io.