cnvrg 0.6.3 → 0.6.5

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
2
  SHA1:
3
- metadata.gz: c1eb2a526f32419697a93b9927b01ec1327588db
4
- data.tar.gz: cbc3517d2341d6a1905190a6a6f99bfa1e1df20c
3
+ metadata.gz: 88c66150eee5e836d00d2cbf4983ab978b227f6f
4
+ data.tar.gz: 28ff50dfd3e535e640ebd5d7a2333dc55f954176
5
5
  SHA512:
6
- metadata.gz: 9287cf89d3440a871737dd037c2bc5b3dc6ebc2457ea31cfbd1156d022891460977d44a5993f06620d396ec9604ce5786ba63e957672773dac32a259a2792b45
7
- data.tar.gz: 66a9c63f4adccb2720d9cbee9b7f17ac79cedda0e9389bd9300b830c02292ad03259eec1c42e427ea095df1bffe1fa5496d1239d96fe37ce5b207041def87b82
6
+ metadata.gz: d5276cacdecc9b1860e1f1a966d93186b9c5ff00320f53d65cf4bed39ac67ff4ba927a73d232cd98fd3d54a3deb237dde92289079d648583bf30a7672ffdf975
7
+ data.tar.gz: 9c84dca4965fc101de56e573fbd655e290c34c068c9d0598b524a82436ddb332af02228407e8c7c517734a992ad67ba489b64d2d35092deb248ce59cdff03455
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
- require "pty"
2
+ require "pty" unless !!(RUBY_PLATFORM =~ /mswin32|mingw32/)
3
+
3
4
  require 'etc'
4
5
  require 'parallel'
5
6
  require 'netrc'
@@ -844,6 +845,7 @@ module Cnvrg
844
845
  :starting_at => 0,
845
846
  :total => files_count,
846
847
  :autofinish => true)
848
+
847
849
  while files['keys'].length > 0
848
850
  @files.download_multiple_files_s3(files, dataset_home, progressbar: progressbar)
849
851
  downloaded_files += files['keys'].length
@@ -1922,8 +1924,10 @@ module Cnvrg
1922
1924
  log_start(__method__, args, options)
1923
1925
  log_message('Syncing dataset', Thor::Shell::Color::BLUE, !options["verbose"])
1924
1926
  if !force and !init
1925
- invoke :download_data_new,[verbose,true, commit, all_files], :new_branch=>new_branch, :direct=>false, :force =>force
1927
+ # w(verbose=false, new_branch=false,sync=false, commit=nil,all_files=true)
1928
+ invoke :download_data_new,[verbose, new_branch, true, commit, all_files], :new_branch=>new_branch, :direct=>false, :force =>force
1926
1929
  end
1930
+ # w(new_branch, verbose,sync,force, tags, chunk_size)
1927
1931
  invoke :upload_data_new,[new_branch, verbose,true,force, tags, chunk_size], :new_branch=>new_branch,
1928
1932
  :direct=>false, :force =>force, :sync =>true, :tags =>tags, :parallel => parallel
1929
1933
 
@@ -1936,6 +1940,7 @@ module Cnvrg
1936
1940
  method_option :tags, :type => :boolean, :aliases => ["--tags"], :desc => "upload file tags", :default => false
1937
1941
  method_option :parallel, :type => :numeric, :aliases => ["-p", "--parallel"], :desc => "uparallel upload at the same time", :default => 15
1938
1942
  def upload_data_new(new_branch, verbose,sync,force, tags, chunk_size)
1943
+ begin
1939
1944
  commit = invoke :start_commit_data,[], :new_branch=> new_branch, :direct=>false, :force =>force, :chunk_size => chunk_size
1940
1945
  upload_res = invoke :upload_data_files,[commit],:new_branch=>new_branch, :verbose =>verbose, :force =>force, :sync =>sync, :chunk_size => chunk_size
1941
1946
  if upload_res < 0
@@ -1962,11 +1967,21 @@ module Cnvrg
1962
1967
  log_message('There was some error in uploading Tags', Thor::Shell::Color::RED)
1963
1968
  end
1964
1969
  end
1965
-
1966
- if upload_res
1967
- invoke :end_commit_data,[commit] , :new_branch=>new_branch, :force =>force
1968
- end
1969
-
1970
+ rescue => e
1971
+ say "\nAborting", Thor::Shell::Color::BLUE
1972
+ dataset_dir = is_cnvrg_dir(Dir.pwd)
1973
+ return false if dataset_dir.blank?
1974
+ @dataset = Dataset.new(dataset_dir)
1975
+ @dataset.revert_to_last_commit
1976
+ return false
1977
+ rescue SignalException
1978
+ say "\nAborting", Thor::Shell::Color::BLUE
1979
+ dataset_dir = is_cnvrg_dir(Dir.pwd)
1980
+ return false if dataset_dir.blank?
1981
+ @dataset = Dataset.new(dataset_dir)
1982
+ @dataset.revert_to_last_commit
1983
+ return false
1984
+ end
1970
1985
  end
1971
1986
 
1972
1987
  desc 'start_commit', 'start data commit'
@@ -2014,18 +2029,7 @@ module Cnvrg
2014
2029
  puts commit_sha1
2015
2030
  end
2016
2031
  return commit_sha1
2017
- rescue => e
2018
- if commit_sha1.present?
2019
- @dataset.set_next_commit(commit_sha1)
2020
- end
2021
- rescue SignalException
2022
- log_message("Aborting..", Thor::Shell::Color::YELLOW)
2023
- if commit_sha1.present?
2024
- @dataset.set_next_commit(commit_sha1)
2025
- end
2026
- exit(1)
2027
2032
  end
2028
-
2029
2033
  end
2030
2034
  desc 'end_commit', 'start data commit'
2031
2035
  method_option :new_branch, :type => :boolean, :aliases => ["-nb"], :desc => "create new branch of commits"
@@ -2049,18 +2053,9 @@ module Cnvrg
2049
2053
  log_message("#{check} Data files were updated successfully", Thor::Shell::Color::GREEN)
2050
2054
  @dataset.set_next_commit(resp["result"]["commit_sha1"]) # no need fo rboth methods FIX
2051
2055
  @dataset.remove_next_commit()
2052
-
2053
2056
  end
2054
-
2055
2057
  end
2056
- rescue => e
2057
- puts e
2058
- rescue SignalException
2059
- @dataset.set_next_commit(commit)
2060
- log_message("Aborting", Thor::Shell::Color::YELLOW)
2061
- exit(1)
2062
2058
  end
2063
-
2064
2059
  end
2065
2060
  desc 'list_files', 'list files in dataset'
2066
2061
  method_option :json, :type => :boolean, :aliases => ["-j","--json"],:default => true, :desc => "response as json"
@@ -2137,12 +2132,13 @@ module Cnvrg
2137
2132
  files_uploaded = 0
2138
2133
  all_files.each_slice(chunk_size).each do |list_files|
2139
2134
  temp_tree = @dataset.generate_chunked_idx(list_files, threads: parallel_threads)
2135
+
2140
2136
  upload_resp = @files.upload_multiple_files(new_commit, temp_tree, threads: parallel_threads, force: force, new_branch: new_branch, progressbar: progressbar)
2141
2137
 
2142
2138
  if upload_resp.is_a? Cnvrg::Result
2143
2139
  log_message(upload_resp.msg, upload_resp.msg_color)
2144
-
2145
- return -1
2140
+ raise SignalException.new(upload_resp.msg)
2141
+ # return -1
2146
2142
 
2147
2143
  else
2148
2144
  files_uploaded += upload_resp
@@ -2155,9 +2151,6 @@ module Cnvrg
2155
2151
  @dataset.write_idx(new_tree, new_commit)
2156
2152
  end
2157
2153
  return files_uploaded
2158
- rescue Exception => e
2159
- puts e
2160
- return false
2161
2154
  end
2162
2155
 
2163
2156
  # local_idx = @dataset.generate_idx
@@ -2522,7 +2515,6 @@ module Cnvrg
2522
2515
  rescue SignalException
2523
2516
  log_message("Couldn't upload, Rolling Back all changes.", Thor::Shell::Color::RED)
2524
2517
  @files.rollback_commit(commit_sha1)
2525
-
2526
2518
  return false
2527
2519
  end
2528
2520
  end
@@ -2767,30 +2759,30 @@ module Cnvrg
2767
2759
  dataset_dir = is_cnvrg_dir(Dir.pwd)
2768
2760
  @dataset = Dataset.new(dataset_dir)
2769
2761
  @files = Cnvrg::Datafiles.new(@dataset.owner, @dataset.slug)
2770
- commit_to_download = commit
2771
- local_idx = @dataset.generate_idx
2772
2762
  all_files = all_files
2773
- res = @dataset.compare_idx_download(commit=commit_to_download.presence, local_idx= local_idx,all_files=all_files)
2763
+ res = @dataset.compare_idx_download(all_files: all_files, desired_commit: commit)
2764
+ unless CLI.is_response_success(res, false)
2765
+ log_message("Cant find the desired commit, please check it or try to download without it.", Thor::Shell::Color::RED)
2766
+ exit(1)
2767
+ end
2774
2768
  result = res["result"]["tree"]
2775
2769
  commit = res["result"]["commit"]
2776
- if result["updated_on_server"].empty? and result["conflicts"].empty? and result["deleted"].empty?
2777
- log_message("Dataset is up to date", Thor::Shell::Color::GREEN, ((options["sync"] or sync) ? false : true))
2778
- return true
2779
- end
2780
- update_total = result["updated_on_server"].size + result["conflicts"].size + result["deleted"].size
2781
- successful_changes = 0
2782
- if update_total ==1
2783
- log_message("Downloading #{update_total} file", Thor::Shell::Color::BLUE, !sync)
2784
- elsif update_total == 0
2785
- log_message("Dataset is up to date", Thor::Shell::Color::GREEN, !sync)
2770
+ update_total = [result['added'], result["updated_on_server"], result["conflicts"], result["deleted"]].compact.flatten.size
2771
+ successful_changes = 0
2772
+ if update_total == 0
2773
+ log_message("Dataset is up to date", Thor::Shell::Color::GREEN) if !sync
2786
2774
  return true
2787
2775
  elsif options["verbose"]
2788
2776
  log_message("Downloading #{update_total} files", Thor::Shell::Color::BLUE)
2789
2777
  else
2790
2778
  log_message("Syncing Dataset", Thor::Shell::Color::BLUE, !sync)
2791
2779
  end
2780
+ conflicts = @files.mark_conflicts(result)
2781
+
2782
+ log_message("Found some conflicts, check .conflict files.", Thor::Shell::Color::BLUE) if conflicts > 0
2792
2783
  update_res = @files.download_files_in_chunks(result["updated_on_server"]) if result["updated_on_server"].present?
2793
- conflict_res = @files.download_files_in_chunks(result["conflicts"], conflict: true) if result["conflicts"].present?
2784
+ added_res = @files.download_files_in_chunks(result["added"]) if result["added"].present?
2785
+ # conflict_res = @files.download_files_in_chunks(result["conflicts"], conflict: true) if result["conflicts"].present?
2794
2786
  deleted = result["deleted"].to_a
2795
2787
  delete_res = @files.delete_commit_files_local(deleted)
2796
2788
  if !delete_res
@@ -2798,7 +2790,10 @@ module Cnvrg
2798
2790
  log_message("Couldn't download, Rolling Back all changes.", Thor::Shell::Color::RED)
2799
2791
  exit(1)
2800
2792
  end
2801
- if [update_res.is_success?, delete_res.is_success?, (conflict_res.blank? or conflict_res.is_success?)].all?
2793
+ success = (update_res.blank? or update_res.is_success?)
2794
+ success &= (delete_res.blank? or delete_res.is_success?)
2795
+ success &= (added_res.blank? or added_res.is_success?)
2796
+ if success
2802
2797
  # update idx with latest commit
2803
2798
  @dataset.update_idx_with_commit!(commit)
2804
2799
  check = Helpers.checkmark()
@@ -2809,17 +2804,15 @@ module Cnvrg
2809
2804
  else
2810
2805
  log_message("#{check} Downloaded changes successfully", Thor::Shell::Color::GREEN, ((sync or options["sync"]) ? false : true))
2811
2806
  end
2812
- return true
2813
- else
2814
- @dataset.update_idx_with_commit!(commit_to_download)
2807
+ return true
2815
2808
  end
2809
+ rescue SignalException
2810
+ say "\nAborting", Thor::Shell::Color::BLUE
2811
+ exit(1)
2816
2812
  rescue => e
2817
2813
  log_message("Error occurred, \nAborting", Thor::Shell::Color::BLUE)
2818
2814
  log_error(e)
2819
2815
  exit(1)
2820
- rescue SignalException
2821
- say "\nAborting", Thor::Shell::Color::BLUE
2822
- exit(1)
2823
2816
  end
2824
2817
  end
2825
2818
 
@@ -3339,10 +3332,15 @@ module Cnvrg
3339
3332
  options_hash = Hash[options]
3340
3333
 
3341
3334
  if local
3342
- invoke :exec, [cmd], :sync_before => sync_before, :sync_after => sync_after, :title => title,
3343
- :log => log, :email_notification => email_notification, :upload_output => upload_output,
3344
- :commit => commit, :image => image, :data => data, :data_commit => data_commit, :ignore => ignore, :force => force, :output_dir=>output_dir, :data_query=>data_query
3345
- return
3335
+ if Cnvrg::Helpers.windows?
3336
+ say "Windows is currently not supported for running experiments locally"
3337
+ return
3338
+ else
3339
+ invoke :exec, [cmd], :sync_before => sync_before, :sync_after => sync_after, :title => title,
3340
+ :log => log, :email_notification => email_notification, :upload_output => upload_output,
3341
+ :commit => commit, :image => image, :data => data, :data_commit => data_commit, :ignore => ignore, :force => force, :output_dir=>output_dir, :data_query=>data_query
3342
+ return
3343
+ end
3346
3344
  else
3347
3345
  if !periodic_sync.nil? and !periodic_sync.empty?
3348
3346
  if /^\d{2}$/ === periodic_sync
@@ -20,6 +20,39 @@ module Cnvrg
20
20
  @base_resource = "users/#{owner}/datasets/#{dataset_slug}/"
21
21
  end
22
22
 
23
+ def check_file_sha1(filename, org_sha1, tag: 'conflict')
24
+ file_loc = "#{Dir.pwd}/#{filename}"
25
+ sha1 = OpenSSL::Digest::SHA1.file(file_loc).hexdigest
26
+ return 0 if sha1 == org_sha1
27
+ FileUtils.cp(file_loc, "#{file_loc}.#{tag}")
28
+ return 1
29
+ end
30
+
31
+ def check_files_sha1(files, resolver, tag)
32
+ conflicts = 0
33
+ files.each do |file|
34
+ next if file.ends_with? '/'
35
+ sha1 = resolver.fetch(file, {}).fetch("sha1", nil)
36
+ conflicts += self.check_file_sha1(file, sha1, tag: tag)
37
+ end
38
+ conflicts
39
+ end
40
+
41
+ def mark_conflicts(results)
42
+ begin
43
+ updated = results["updated_on_server"]
44
+ deleted = results["deleted"]
45
+ resolver = results['resolved_files']
46
+ overall = 0
47
+ overall += self.check_files_sha1(updated, resolver, "conflict")
48
+ overall += self.check_files_sha1(deleted, resolver, "deleted")
49
+ overall
50
+ rescue => e
51
+ 0
52
+ end
53
+ end
54
+
55
+
23
56
  def upload_multiple_files(commit_sha1, tree, threads: ParallelThreads, force: false, new_branch: false, progressbar: nil)
24
57
  random_file_name = (0...8).map { (65 + rand(26)).chr }.join #needed to create a file for post_file..
25
58
  # each file have: {sha1: sha1, file_name: file_name, file_size: file_size, content_type: content_type, absolute_path, relative_path}
@@ -29,9 +62,9 @@ module Cnvrg
29
62
  upload_resp = Cnvrg::API.request(@base_resource + "upload_files", 'POST_JSON', {commit_sha1: commit_sha1, tree: tree, force: force, is_branch: new_branch})
30
63
  return Cnvrg::Result.new(false, "Failed to upload files") unless Cnvrg::CLI.is_response_success(upload_resp, false)
31
64
  results = upload_resp['result'].with_indifferent_access
32
- if results['files'].blank?
33
- return 0
34
- end
65
+ if results['files'].blank?
66
+ return 0
67
+ end
35
68
  props = Cnvrg::Helpers.get_s3_props(results)
36
69
  client = props[:client]
37
70
  bucket = props[:bucket]
@@ -45,7 +78,7 @@ module Cnvrg
45
78
  progressbar.progress += 1 if progressbar.present?
46
79
  end
47
80
  blob_ids = files.values.map{|f| f['bv_id']}
48
- dirs = tree.keys.select{|k| tree[k].nil? }
81
+ dirs = tree.keys.select{|k| tree[k].nil? } || []
49
82
  upload_resp = Cnvrg::API.request(@base_resource + "upload_files_save", "POST", {commit: commit_sha1, blob_ids: blob_ids, dirs: dirs})
50
83
  return files.keys.length
51
84
  rescue => e
@@ -808,15 +841,16 @@ module Cnvrg
808
841
  (1..5).each do |i|
809
842
  response = Cnvrg::API.request("users/#{@owner}/datasets/#{@dataset_slug}/download_multi", 'POST', {files: files})
810
843
  next unless Cnvrg::CLI.is_response_success(response, false) #trying to api request 5 times.
811
- files = response['files']
844
+ files_to_download = response['files']
812
845
  data_home = "#{Dir.pwd}/#{response['name']}"
813
- res = download_multiple_files_s3(files, data_home, conflict: conflict)
846
+ res = download_multiple_files_s3(files_to_download, data_home, conflict: conflict)
814
847
  next unless res.is_success? #try again..
815
- return files['keys'].length
848
+ return files_to_download['keys'].length
816
849
  end
817
850
  end
818
851
 
819
852
  def download_multiple_chunks(commit, chunk_size=1000)
853
+ begin
820
854
  last_chunk_size = chunk_size
821
855
  q = { commit: commit, chunk_size: chunk_size}
822
856
  overall = 0
@@ -835,6 +869,9 @@ module Cnvrg
835
869
  end
836
870
  end
837
871
  Cnvrg::Result.new(true, "Cloned #{overall} files!")
872
+ rescue => e
873
+ Cnvrg::Result.new(false, "Cant download chunk")
874
+ end
838
875
  end
839
876
 
840
877
  def generate_parallel_idx
@@ -314,6 +314,17 @@ module Cnvrg
314
314
  return tree
315
315
  end
316
316
 
317
+ def revert_to_last_commit(commit: nil)
318
+ if commit.blank?
319
+ resp = Cnvrg::API.request("users/#{self.owner}/datasets/#{self.slug}/last_valid_commit", 'GET')
320
+ if CLI.is_response_success(resp, false)
321
+ commit = resp['result']['commit_sha1']
322
+ end
323
+ end
324
+ self.update_idx_with_commit(commit) if commit.present?
325
+ self.revert_next_commit
326
+ end
327
+
317
328
  def list_all_files
318
329
  list = Dir.glob("#{self.local_path}/**/*", File::FNM_DOTMATCH).reject { |x| (x =~ /\/\.{1,2}$/) or (x =~ /^#{self.local_path}\/\.cnvrg\/*/) or (x =~/^#{self.local_path}\/\.cnvrgignore.conflict*/) and not (x =~/^#{self.local_path}\/\.cnvrgignore/) }
319
330
  list_ignore = self.get_ignore_list()
@@ -423,15 +434,13 @@ module Cnvrg
423
434
  CLI.is_response_success(response,false)
424
435
  return response
425
436
  end
426
- def compare_idx_download(commit=last_local_commit,local_idx=nil,all=false)
427
- if local_idx.nil?
428
- local_idx = self.generate_idx
429
- end
437
+
438
+ def compare_idx_download(all_files: false, desired_commit: nil)
439
+ current_commit = self.last_local_commit
430
440
  ignore_list = self.send_ignore_list()
431
- response = Cnvrg::API.request("users/#{self.owner}/datasets/#{self.slug}/download_status", 'POST', {idx: local_idx, current_commit: commit, ignore:ignore_list,all_files:all})
432
- CLI.is_response_success(response,false)
433
- return response
441
+ return Cnvrg::API.request("users/#{self.owner}/datasets/#{self.slug}/download_status", 'POST', {current_commit: current_commit, ignore:ignore_list,all_files:all_files, desired_commit: desired_commit.presence})
434
442
  end
443
+
435
444
  def current_status(new_branch)
436
445
  commit=last_local_commit
437
446
  response = Cnvrg::API.request("users/#{self.owner}/datasets/#{self.slug}/status_current", 'POST', {current_commit: commit,new_branch: new_branch})
@@ -263,7 +263,8 @@ parameters:
263
263
  :http_open_timeout => 60, :retry_limit => 20)
264
264
  use_accelerate_endpoint = true
265
265
  else
266
- endpoint = Cnvrg::Helpers.decrypt(key,iv, files["endpoint"])
266
+
267
+ endpoint = Cnvrg::Helpers.decrypt(key,iv, files["endpoint_url"])
267
268
  client = Aws::S3::Client.new(
268
269
  :access_key_id =>access,
269
270
  :secret_access_key => secret,
@@ -1,4 +1,4 @@
1
1
  module Cnvrg
2
- VERSION = '0.6.3'
2
+ VERSION = '0.6.5'
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: 0.6.3
4
+ version: 0.6.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yochay Ettun