cnvrg 0.7.0 → 0.7.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1b627b016030a88e2a88088ea28015400b6343bd
4
- data.tar.gz: 9b348a048c3488b05e741fcc201648a229abf755
3
+ metadata.gz: 11c1d6358ef98bf5b6372fc3ddf3348cefd64c5a
4
+ data.tar.gz: 661547a796ec6a79cd45bb09c9621f4cfb7bace8
5
5
  SHA512:
6
- metadata.gz: 2cac1941c4a91d93fa4328b4b7e134853bd22c4631af862e83efe52871cc837a97b12ef0172396b4f9fcd206085820f32c5301f07bdcc1c5023442b86677b484
7
- data.tar.gz: c4c99f4e19e94461b36b24046e836dd835f24bddd0611f3244c90f56e68fd156f9c197f5baf9cb8dda98a01e4501dcc03242bfd027cced5cf15269ad69029f5b
6
+ metadata.gz: cc98c43afdcabb9b433c8472504ef62ad3fe5a0bb2097b020c907acdba984a73debc56848a98e8d34866c3efca8f2b255370d084cc54a50b4c922ecf4e8943f5
7
+ data.tar.gz: 45aef2a6405f28cba33c69feb7202e82b3845d353fcf54283fd0b769306f861e3cb5120faa5a6e19f0db0ba8b38648d5b2ec14273e0e8cc2d839b79ab03fa1a1
@@ -79,14 +79,15 @@ module Cnvrg
79
79
  else
80
80
  response
81
81
  end
82
- when 'POST'
82
+ when 'POST', 'PUT'
83
83
  conn.options.timeout = 4200
84
84
  conn.options.open_timeout =4200
85
85
  retries = 0
86
86
  success = false
87
87
  while !success and retries < 20
88
88
  begin
89
- response = conn.post "#{resource}", data
89
+ response = conn.post "#{resource}", data if method.eql? 'POST'
90
+ response = conn.put "#{resource}", data if method.eql? 'PUT'
90
91
  success = true
91
92
 
92
93
  rescue => e
@@ -1,6 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
2
  require "pty" unless !!(RUBY_PLATFORM =~ /mswin32|mingw32/)
3
-
4
3
  require 'etc'
5
4
  require 'parallel'
6
5
  require 'netrc'
@@ -163,6 +162,27 @@ module Cnvrg
163
162
 
164
163
  desc "", "", :hide => true
165
164
 
165
+ def test
166
+ # image_settings = {
167
+ # 'Image' => "cnvrg:latest",
168
+ # 'User' => 'ds',
169
+ # 'Cmd' => '/home/ds/run_ipython.sh',
170
+ # 'ExposedPorts' => {``
171
+ # '80/tcp' => {},
172
+ # },
173
+ # 'HostConfig' => {
174
+ # 'PortBindings' => {
175
+ # '80/tcp' => [
176
+ # {'HostPort' => "7654", 'HostIp' => 'localhost'}
177
+ # ],
178
+ # },
179
+ # },
180
+ # }
181
+ # container = Docker::Container.get('b4d64bf83f41')
182
+ # s = "/leah/1/2/3/4/5"
183
+ # command = ["/bin/bash","-lc","sed -i 's#c.NotebookApp.base_url = .*#c.NotebookApp.base_url = \"#{s}\"#' /home/ds/.jupyter/jupyter_notebook_config.py"]
184
+ # puts container.exec(command, tty: true)
185
+ end
166
186
 
167
187
 
168
188
  desc 'version', 'Prints cnvrg current version'
@@ -172,6 +192,32 @@ module Cnvrg
172
192
 
173
193
  end
174
194
 
195
+
196
+ desc 'dataurl', 'dataur', :hide => true
197
+ def set_data_url(dataset_url)
198
+ begin
199
+ verify_logged_in(true)
200
+ log_start(__method__, args, options)
201
+ unless is_cnvrg_dir
202
+ log_message("Not in cnvrg dir.", Thor::Shell::Color::RED)
203
+ end
204
+ url_parts = dataset_url.split("/")
205
+ project_index = Cnvrg::Helpers.look_for_in_path(dataset_url, "datasets")
206
+ slug = url_parts[project_index + 1]
207
+ owner = url_parts[project_index - 1]
208
+ res = Cnvrg::API.request("users/#{owner}/datasets/#{slug}", 'GET')
209
+ unless Cnvrg::CLI.is_response_success(res, false)
210
+ raise SignalException.new()
211
+ end
212
+ @dataset = Dataset.new(Dir.pwd)
213
+ result = res['result']
214
+ @dataset.change_url(result.symbolize_keys)
215
+ log_message("Changed URL Succesfuly to #{dataset_url}", Thor::Shell::Color::GREEN)
216
+ rescue => e
217
+ log_message("Cant change the url to the given dataset url", Thor::Shell::Color::RED)
218
+ end
219
+ end
220
+
175
221
  map %w(-v --version) => :version
176
222
 
177
223
  desc 'api', 'set api url, e.g cnvrg --api "https://cnvrg.io/api"'
@@ -1099,6 +1145,59 @@ module Cnvrg
1099
1145
  exit(1)
1100
1146
  end
1101
1147
 
1148
+ desc '', '', :hide => true
1149
+ def data_put(dataset_url, files: [], dir: '', chunk_size: 1000)
1150
+ begin
1151
+ verify_logged_in(true)
1152
+ log_start(__method__, args, options)
1153
+
1154
+ #find owner and slug in url
1155
+ url_parts = dataset_url.split("/")
1156
+ project_index = Cnvrg::Helpers.look_for_in_path(dataset_url, "datasets")
1157
+ slug = url_parts[project_index + 1]
1158
+ owner = url_parts[project_index - 1]
1159
+
1160
+ @datafiles = Cnvrg::Datafiles.new(owner, slug)
1161
+ @dataset = Dataset.new(Dir.pwd)
1162
+ @files = @datafiles.verify_files_exists(files)
1163
+
1164
+ if @files.blank?
1165
+ raise SignalException.new(1, "Cant find files to upload, exiting.")
1166
+ end
1167
+ log_message("Uploading #{@files.size} files", Thor::Shell::Color::GREEN)
1168
+ number_of_chunks = (@files.size.to_f / chunk_size).ceil
1169
+ response = @datafiles.start_commit(false, true, chunks: number_of_chunks)
1170
+ unless response #means we failed in the start commit.
1171
+ raise SignalException.new(1, "Cant put files into server, check the dataset slug")
1172
+ end
1173
+ @commit = response['result']['commit_sha1']
1174
+ #dir shouldnt have starting or ending slash.
1175
+ dir = dir[0..-2] if dir.end_with? '/'
1176
+ dir = dir[1..-1] if dir.start_with? '/'
1177
+
1178
+ progressbar = ProgressBar.create(:title => "Upload Progress",
1179
+ :progress_mark => '=',
1180
+ :format => "%b>>%i| %p%% %t",
1181
+ :starting_at => 0,
1182
+ :total => @files.size,
1183
+ :autofinish => true)
1184
+
1185
+ @files.each_slice(chunk_size).each do |list_files|
1186
+ temp_tree = @dataset.generate_chunked_idx(list_files, prefix: dir)
1187
+ #will throw a signal exception if something goes wrong.
1188
+ @datafiles.upload_multiple_files(@commit, temp_tree, force: false, progressbar: progressbar, prefix: dir)
1189
+ end
1190
+ res = @datafiles.put_commit(@commit)
1191
+ unless res.is_success?
1192
+ raise SignalException.new(1, res.msg)
1193
+ end
1194
+ log_message("Upload finished", Thor::Shell::Color::GREEN)
1195
+ rescue SignalException => e
1196
+ log_message(e.message, Thor::Shell::Color::RED)
1197
+ return false
1198
+ end
1199
+ end
1200
+
1102
1201
 
1103
1202
 
1104
1203
 
@@ -2082,7 +2181,6 @@ module Cnvrg
2082
2181
  method_option :parallel, :type => :numeric, :aliases => ["-p", "--parallel"], :desc => "uparallel upload at the same time", :default => 15
2083
2182
 
2084
2183
  def upload_data_files(new_commit, *files)
2085
-
2086
2184
  begin
2087
2185
  verify_logged_in(true)
2088
2186
  log_start(__method__, args, options)
@@ -2378,8 +2476,6 @@ module Cnvrg
2378
2476
  end
2379
2477
  end
2380
2478
 
2381
-
2382
-
2383
2479
  if ignore.nil? or ignore.empty?
2384
2480
  ignore = ignore_list
2385
2481
  end
@@ -2394,7 +2490,7 @@ module Cnvrg
2394
2490
  if !@project.update_ignore_list(ignore)
2395
2491
  log_message("Couldn't append new ignore files to .cnvrgignore", Thor::Shell::Color::YELLOW)
2396
2492
  end
2397
- new_branch = options["new_branch"] || false
2493
+ new_branch = options["new_branch"] || @project.is_branch
2398
2494
 
2399
2495
  result = @project.compare_idx(new_branch, force: force, deploy: options["deploy"],in_exp:in_exp, specific_files: spec_files_to_upload)
2400
2496
  commit = result["result"]["commit"]
@@ -2408,8 +2504,6 @@ module Cnvrg
2408
2504
  log_message("Comparing local changes with remote version:", Thor::Shell::Color::BLUE, (options["verbose"]))
2409
2505
  end
2410
2506
  result = result["result"]["tree"]
2411
-
2412
-
2413
2507
  if result["added"].empty? and result["updated_on_local"].empty? and result["deleted"].empty?
2414
2508
  log_message("#{check} Project is up to date", Thor::Shell::Color::GREEN, (((options["sync"] or sync) and !direct) ? false : true))
2415
2509
  return true
@@ -2428,18 +2522,19 @@ module Cnvrg
2428
2522
  log_message("Syncing files", Thor::Shell::Color::BLUE, ((options["sync"] or sync)) ? false : true)
2429
2523
  end
2430
2524
  # Start commit
2525
+ current_commit = nil
2526
+ exp_start_commit = nil
2431
2527
  if in_exp || (job_slug.present? and job_type.present?)
2432
2528
  exp_start_commit = @project.last_local_commit
2433
2529
  else
2434
- exp_start_commit = nil
2530
+ current_commit = @project.last_local_commit
2435
2531
  end
2436
2532
  job_type = options['job_type'] || job_type
2437
2533
  job_slug = options['job_slug'] || job_slug
2438
2534
  commit_sha1 = @files.start_commit(new_branch, force: force, exp_start_commit:exp_start_commit,
2439
- job_type: job_type, job_slug: job_slug)["result"]["commit_sha1"]
2535
+ job_type: job_type, job_slug: job_slug, start_commit: current_commit)["result"]["commit_sha1"]
2440
2536
  # upload / update
2441
2537
  begin
2442
-
2443
2538
  parallel_options = {
2444
2539
  :progress => {
2445
2540
  :title => "Upload Progress",
@@ -2869,7 +2964,7 @@ module Cnvrg
2869
2964
  if !@project.update_ignore_list(ignore)
2870
2965
  log_message("Couldn't append new ignore files to .cnvrgignore", Thor::Shell::Color::YELLOW)
2871
2966
  end
2872
- new_branch = options["new_branch"] || false
2967
+ new_branch = options["new_branch"] || @project.is_branch || false
2873
2968
  res = @project.compare_idx(new_branch, commit: nil, in_exp: in_exp)["result"]
2874
2969
  result = res["tree"]
2875
2970
 
@@ -3046,82 +3141,82 @@ module Cnvrg
3046
3141
 
3047
3142
 
3048
3143
  desc 'jump', 'jump to specific commit'
3049
- method_option :remote, :type => :boolean, :aliases => ["-r", "--r"], :default => false
3050
3144
  def jump(commit_sha1)
3051
3145
  begin
3052
3146
  verify_logged_in()
3053
3147
  log_start(__method__, args, options)
3054
- is_remote = options["remote"]
3055
3148
  project_home = get_project_home
3056
3149
  @project = Project.new(project_home)
3057
- # say "Syncing existing project tree before jumping", Thor::Shell::Color::BLUE
3058
3150
  current_commit = @project.last_local_commit
3059
3151
  if current_commit.eql? commit_sha1
3060
3152
  log_message("Project is already updated", Thor::Shell::Color::GREEN)
3061
3153
  exit(0)
3062
3154
  end
3063
- @files = Cnvrg::Files.new(@project.owner, @project.slug)
3064
- response = @project.clone(false, commit_sha1)
3065
- Cnvrg::CLI.is_response_success(response, true)
3066
-
3067
- successful_changes = []
3068
-
3069
- if !response["result"]["tree"].nil?
3070
- parallel_options = {
3071
- :progress => {
3072
- :title => "Jump Progress",
3073
- :progress_mark => '=',
3074
- :format => "%b>>%i| %p%% %t",
3075
- :starting_at => 0,
3076
- :total => response["result"]["tree"].size,
3077
- :autofinish => true
3078
- },
3079
- in_processes: ParallelProcesses,
3080
- in_thread: ParallelThreads
3081
- }
3082
- commit_sha1 = response["result"]["commit"]
3083
- idx = {commit: response["result"]["commit"], tree: response["result"]["tree"]}
3084
- File.open(project_home + "/.cnvrg/idx.yml", "w+") {|f| f.write idx.to_yaml}
3085
- if is_remote
3086
- current_tree = Dir.glob("**/*", File::FNM_DOTMATCH).flatten.reject {|file| file.start_with? '.' or file.eql? "__init__.py" or file.eql? "uwsgi.ini" or file.ends_with? "/." or file.eql? "."}
3087
- else
3088
- current_tree = Dir.glob("**/*", File::FNM_DOTMATCH).flatten.reject {|file| file.start_with? '.cnvrg' or file.ends_with? "/." or file.eql? "."}
3089
- end
3090
-
3091
- jump_result = Parallel.map(response["result"]["tree"], parallel_options) do |f|
3092
-
3093
- relative_path = f[0].gsub(/^#{@project.local_path}/, "")
3094
- log_message("Downloading #{f[0]}", Thor::Shell::Color::BLUE, false)
3095
- if f[0].end_with? "/"
3096
- # dir
3097
- @files.download_dir(f[0], relative_path, project_home)
3098
-
3099
- else
3100
- # blob
3101
- @files.download_file_s3(f[0], relative_path, project_home, commit_sha1 = commit_sha1)
3102
- end
3103
- end
3104
-
3105
-
3106
- successful_changes = jump_result.select {|x| not x.nil?}
3107
- end
3108
- response["result"]["tree"].each do |f|
3109
- if f[0].end_with? "/"
3110
- current_tree.delete(f[0][0, f[0].size - 1])
3111
- else
3112
- current_tree.delete(f[0])
3113
- end
3155
+ @files = Cnvrg::Files.new(@project.owner, @project.slug, project_home: project_home)
3156
+ resp = @project.jump_idx(destination: commit_sha1)
3157
+ if resp.blank?
3158
+ log_message("Cant find the given commit", Thor::Shell::Color::RED)
3159
+ exit(0)
3114
3160
  end
3115
-
3116
- FileUtils.rm_rf(current_tree)
3117
- log_message("Done. Jumped to #{commit_sha1} completed successfully", Thor::Shell::Color::GREEN)
3161
+ compare = resp['result']['compare']
3162
+ resolver = resp['result']['resolver']
3163
+ latest = resp['result']['latest']
3164
+ commit = resp['result']['commit']
3165
+ @files.handle_compare_idx(compare, resolver: resolver)
3166
+ @project.set_on_branch(latest)
3167
+ @project.update_idx_with_commit!(commit)
3168
+ @project.generate_idx
3169
+ log_message("Jumped successfuly!", Thor::Shell::Color::GREEN)
3118
3170
  rescue => e
3119
- log_message("Error occurred, Aborting", Thor::Shell::Color::RED)
3120
- log_error(e)
3121
- rescue SignalException
3122
-
3123
- exit(1)
3124
- end
3171
+ log_message("Cant jump to the specified commit", Thor::Shell::Color::RED)
3172
+ end
3173
+ # successful_changes = []
3174
+ #
3175
+ # if !response["result"]["tree"].nil?
3176
+
3177
+ # commit_sha1 = response["result"]["commit"]
3178
+ # idx = {commit: response["result"]["commit"], tree: response["result"]["tree"]}
3179
+ # File.open(project_home + "/.cnvrg/idx.yml", "w+") {|f| f.write idx.to_yaml}
3180
+ # if is_remote
3181
+ # current_tree = Dir.glob("**/*", File::FNM_DOTMATCH).flatten.reject {|file| file.start_with? '.' or file.eql? "__init__.py" or file.eql? "uwsgi.ini" or file.ends_with? "/." or file.eql? "."}
3182
+ # else
3183
+ # current_tree = Dir.glob("**/*", File::FNM_DOTMATCH).flatten.reject {|file| file.start_with? '.cnvrg' or file.ends_with? "/." or file.eql? "."}
3184
+ # end
3185
+ #
3186
+ # jump_result = Parallel.map(response["result"]["tree"], parallel_options) do |f|
3187
+ #
3188
+ # relative_path = f[0].gsub(/^#{@project.local_path}/, "")
3189
+ # log_message("Downloading #{f[0]}", Thor::Shell::Color::BLUE, false)
3190
+ # if f[0].end_with? "/"
3191
+ # # dir
3192
+ # @files.download_dir(f[0], relative_path, project_home)
3193
+ #
3194
+ # else
3195
+ # # blob
3196
+ # @files.download_file_s3(f[0], relative_path, project_home, commit_sha1 = commit_sha1)
3197
+ # end
3198
+ # end
3199
+ #
3200
+ #
3201
+ # successful_changes = jump_result.select {|x| not x.nil?}
3202
+ # end
3203
+ # response["result"]["tree"].each do |f|
3204
+ # if f[0].end_with? "/"
3205
+ # current_tree.delete(f[0][0, f[0].size - 1])
3206
+ # else
3207
+ # current_tree.delete(f[0])
3208
+ # end
3209
+ # end
3210
+ #
3211
+ # FileUtils.rm_rf(current_tree)
3212
+ # log_message("Done. Jumped to #{commit_sha1} completed successfully", Thor::Shell::Color::GREEN)
3213
+ # rescue => e
3214
+ # log_message("Error occurred, Aborting", Thor::Shell::Color::RED)
3215
+ # log_error(e)
3216
+ # rescue SignalException
3217
+ #
3218
+ # exit(1)
3219
+ # end
3125
3220
  end
3126
3221
 
3127
3222
  desc 'show', 'Show specific file from a specific commit'
@@ -3820,6 +3915,7 @@ module Cnvrg
3820
3915
  if forced_commit and (commit_to_run.nil? or commit_to_run.empty?)
3821
3916
  commit_to_run = forced_commit
3822
3917
  end
3918
+ commit_to_run = commit_to_run.presence || project.last_local_commit
3823
3919
  res = exp.exec_remote(command, commit_to_run, instance_type, image_slug, schedule, local_timestamp, grid, path_to_cmd, data, data_commit,
3824
3920
  periodic_sync, sync_before_terminate, max_time, ds_sync_options,output_dir,
3825
3921
  data_query, git_commit, git_branch, restart_if_stuck,local_folders_options )
@@ -5780,6 +5876,22 @@ module Cnvrg
5780
5876
  end
5781
5877
  end
5782
5878
 
5879
+ def self.log_message(message, type = Thor::Shell::Color::BLUE, to_print: true)
5880
+ say "#{type}#{message}" if to_print
5881
+ case type
5882
+ when Thor::Shell::Color::BLUE
5883
+ $LOG.info message: message, type: "info"
5884
+ when Thor::Shell::Color::RED
5885
+ $LOG.error message: message, type: "error"
5886
+ when Thor::Shell::Color::YELLOW
5887
+ $LOG.warn message: message, type: "warning"
5888
+ when Thor::Shell::Color::GREEN
5889
+ $LOG.info message: message, type: "success"
5890
+ else
5891
+ $LOG.info message: message, type: "unknown"
5892
+ end
5893
+ end
5894
+
5783
5895
  def log_message(message, type, to_print = true)
5784
5896
  if to_print
5785
5897
  say message, type
@@ -0,0 +1,8 @@
1
+ module Cnvrg
2
+ class Colors
3
+ RED = 0
4
+ BLUE = 1
5
+ YELLOW = 2
6
+ GREEN = 3
7
+ end
8
+ end
@@ -77,7 +77,6 @@ module Cnvrg
77
77
  commit = options["commit"]
78
78
  all_files = options["all_files"]
79
79
  cli.download_data_new(verbose,sync,new_branch, commit,all_files)
80
-
81
80
  end
82
81
  desc 'data clone', 'clone datset'
83
82
  method_option :only_tree, :type => :boolean, :aliases => ["-t", "--tree"], :default => false
@@ -92,6 +91,25 @@ module Cnvrg
92
91
  cli.clone_data(dataset_url, only_tree=only_tree,commit=commit, query=query)
93
92
  end
94
93
 
94
+ desc 'data set --url=dataset_url', 'Set dataset url to other url'
95
+ method_option :url, :type => :string, :aliases => ["--url"], :default => ''
96
+ def set
97
+ cli = Cnvrg::CLI.new
98
+ cli.log_start(__method__)
99
+ cli.log_handler
100
+ if options['url'].present?
101
+ cli.set_data_url(options['url'])
102
+ end
103
+ end
104
+
105
+ desc 'date put dataset_url', 'clone datset'
106
+ method_option :dir, :type => :string, :aliases => ["-d", "--dir"], :default => ''
107
+ def put(dataset_url, *files)
108
+ cli = Cnvrg::CLI.new()
109
+ dir = options[:dir]
110
+ cli.data_put(dataset_url, files: files, dir: dir)
111
+ end
112
+
95
113
  desc 'data clone_query', 'clone query datset'
96
114
  method_option :query, :type => :string, :aliases => ["-q", "--query"], :default => nil
97
115
  def clone_query(dataset_url)
@@ -28,6 +28,22 @@ module Cnvrg
28
28
  return 1
29
29
  end
30
30
 
31
+ def verify_files_exists(files)
32
+ paths = []
33
+ files.each do |file|
34
+ if File.exists? file
35
+ if File.directory? file
36
+ paths += Dir.glob("#{file}/**/*")
37
+ else
38
+ paths << file
39
+ end
40
+ next
41
+ end
42
+ raise SignalException.new(1, "Cant find file #{file}") unless File.exists? "#{Dir.pwd}/#{file}"
43
+ end
44
+ paths
45
+ end
46
+
31
47
  def check_files_sha1(files, resolver, tag)
32
48
  conflicts = 0
33
49
  files.each do |file|
@@ -53,7 +69,19 @@ module Cnvrg
53
69
  end
54
70
 
55
71
 
56
- def upload_multiple_files(commit_sha1, tree, threads: ParallelThreads, force: false, new_branch: false, progressbar: nil)
72
+ def put_commit(commit_sha1)
73
+ response = Cnvrg::API.request("#{@base_resource}/commit/latest", 'PUT', {commit_sha1: commit_sha1})
74
+ if response.present?
75
+ msg = response['result']
76
+ else
77
+ msg = "Cant save changes in the dataset"
78
+ end
79
+
80
+ Cnvrg::Result.new(Cnvrg::CLI.is_response_success(response, false), msg)
81
+ end
82
+
83
+
84
+ def upload_multiple_files(commit_sha1, tree, threads: ParallelThreads, force: false, new_branch: false, progressbar: nil, prefix: '')
57
85
  random_file_name = (0...8).map { (65 + rand(26)).chr }.join #needed to create a file for post_file..
58
86
  # each file have: {sha1: sha1, file_name: file_name, file_size: file_size, content_type: content_type, absolute_path, relative_path}
59
87
 
@@ -63,6 +91,7 @@ module Cnvrg
63
91
  return Cnvrg::Result.new(false, "Failed to upload files") unless Cnvrg::CLI.is_response_success(upload_resp, false)
64
92
  results = upload_resp['result'].with_indifferent_access
65
93
  if results['files'].blank?
94
+ progressbar.progress += tree.keys.length if progressbar.present?
66
95
  return 0
67
96
  end
68
97
  props = Cnvrg::Helpers.get_s3_props(results)
@@ -9,17 +9,22 @@ module Cnvrg
9
9
 
10
10
  def initialize(project_home)
11
11
  begin
12
- config = YAML.load_file(project_home+"/.cnvrg/config.yml")
13
12
  @local_path = project_home
13
+ @working_dir = project_home
14
+ config = YAML.load_file(project_home+"/.cnvrg/config.yml")
14
15
  @title = config[:dataset_name]
15
16
  @slug = config[:dataset_slug]
16
17
  @owner = config[:owner]
17
- @working_dir = project_home
18
18
  rescue => e
19
19
 
20
20
  end
21
21
  end
22
22
 
23
+ def change_url(owner: '', slug: '', title: '')
24
+ config = {dataset_home: title, dataset_slug: slug, owner: owner}
25
+ File.open(".cnvrg/config.yml", "w+") { |f| f.write config.to_yaml }
26
+ end
27
+
23
28
 
24
29
  def self.delete(dataset_slug,owner)
25
30
  response = Cnvrg::API.request("users/#{owner}/datasets/#{dataset_slug}/delete", 'DELETE')
@@ -295,10 +300,12 @@ module Cnvrg
295
300
  url = Cnvrg::Helpers.remote_url
296
301
  "#{url}/#{self.owner}/datasets/#{self.slug}"
297
302
  end
298
- def generate_chunked_idx(list_files=[], threads: IDXParallelThreads)
303
+ def generate_chunked_idx(list_files=[], threads: IDXParallelThreads, prefix: '')
299
304
  tree = {}
300
- Parallel.map(list_files, in_threads: IDXParallelThreads) do |file|
305
+ Parallel.map(list_files, in_threads: threads) do |file|
306
+ #check if prefix exists do prefix/path otherwise path
301
307
  label = file.gsub(self.local_path + "/", "")
308
+ label = "#{prefix}/#{label}" if prefix.present?
302
309
  if File.directory? file
303
310
  tree[label+"/"] = nil
304
311
  else
@@ -308,9 +315,19 @@ module Cnvrg
308
315
  mime_type = MimeMagic.by_path(file)
309
316
  content_type = !(mime_type.nil? or mime_type.text?) ? mime_type.type : "text/plain"
310
317
  relative_path = file.gsub(/^#{@local_path + "/"}/, "")
318
+ relative_path = "#{prefix}/#{relative_path}" if prefix.present?
311
319
  tree[label] = {sha1: sha1, file_name: file_name, file_size: file_size, content_type: content_type, absolute_path: file, relative_path: relative_path}
312
320
  end
313
321
  end
322
+ if prefix.present? #add the prefix as dirs to the files
323
+ #lets say the prefix is a/b/c so we want that a/, a/b/, a/b/c/ will be in our files_list
324
+ dirs = prefix.split('/')
325
+ curr_path = []
326
+ dirs.each do |dir|
327
+ curr_path << dir
328
+ list_files << curr_path.join('/')
329
+ end
330
+ end
314
331
  return tree
315
332
  end
316
333
 
@@ -12,10 +12,11 @@ module Cnvrg
12
12
 
13
13
  attr_reader :base_resource
14
14
 
15
- def initialize(owner, project_slug)
15
+ def initialize(owner, project_slug, project_home: '')
16
16
  @project_slug = project_slug
17
17
  @owner = owner
18
18
  @base_resource = "users/#{owner}/projects/#{project_slug}/"
19
+ @project_home = project_home
19
20
  end
20
21
 
21
22
  def upload_file(absolute_path, relative_path, commit_sha1)
@@ -657,9 +658,9 @@ module Cnvrg
657
658
  return true
658
659
 
659
660
  end
660
- def start_commit(new_branch,force:false, exp_start_commit:nil, job_slug: nil, job_type: nil)
661
+ def start_commit(new_branch,force:false, exp_start_commit:nil, job_slug: nil, job_type: nil, start_commit: nil)
661
662
  response = Cnvrg::API.request("#{base_resource}/commit/start", 'POST', {project_slug: @project_slug, new_branch: new_branch,force:force,
662
- username: @owner, exp_start_commit:exp_start_commit, job_slug: job_slug, job_type: job_type})
663
+ username: @owner, exp_start_commit:exp_start_commit, job_slug: job_slug, job_type: job_type, start_commit: start_commit})
663
664
  Cnvrg::CLI.is_response_success(response,false)
664
665
  return response
665
666
  end
@@ -669,6 +670,60 @@ module Cnvrg
669
670
  return response
670
671
  end
671
672
 
673
+ def download_file(file_path: '', key: '', iv: '', bucket: '', path: '', client: nil)
674
+ file_key = Cnvrg::Helpers.decrypt(key,iv, path)
675
+ resp = false
676
+ File.open(@project_home+"/"+file_path, 'w+') do |file|
677
+ resp = client.get_object({bucket:bucket,
678
+ key:file_key}, target: file)
679
+ end
680
+ end
681
+
682
+ def delete(file)
683
+ FileUtils.rm_rf(file)
684
+ end
685
+
686
+ def handle_compare_idx(compared, resolver: {})
687
+ begin
688
+ all_files = compared.values.flatten.uniq
689
+ props = Cnvrg::Helpers.get_s3_props(resolver)
690
+ files = resolver['keys'].map{|f| [f['name'], f]}.to_h
691
+ client = props[:client]
692
+ iv = props[:iv]
693
+ key = props[:key]
694
+ bucket = props[:bucket]
695
+ parallel_options = {
696
+ :progress => {
697
+ :title => "Jump Progress",
698
+ :progress_mark => '=',
699
+ :format => "%b>>%i| %p%% %t",
700
+ :starting_at => 0,
701
+ :total => all_files.size,
702
+ :autofinish => true
703
+ },
704
+ in_processes: Cnvrg::CLI::ParallelProcesses,
705
+ in_thread: Cnvrg::CLI::ParallelThreads
706
+ }
707
+ Parallel.map(all_files, parallel_options) do |file|
708
+ Cnvrg::CLI.log_message("Trying #{file}")
709
+ if compared['conflicts'].include? file
710
+ self.download_file(file_path: "#{file}.conflict", key: key, iv: iv, bucket: bucket, path: files[file]['path'], client: client)
711
+ next
712
+ end
713
+ if compared['updated_on_server'].include? file or compared['added'].include? file
714
+ self.download_file(file_path: file, key: key, iv: iv, bucket: bucket, path: files[file]['path'], client: client)
715
+ next
716
+ end
717
+ if compared['deleted'].include? file
718
+ self.delete(file)
719
+ next
720
+ end
721
+ Cnvrg::CLI.log_message("Failed #{file}")
722
+ end
723
+ rescue => e
724
+ raise Exception.new("Cant upload files")
725
+ end
726
+ end
672
727
  def rollback_commit(commit_sha1)
673
728
  response = Cnvrg::API.request("#{base_resource}/commit/rollback", 'POST', {commit_sha1: commit_sha1})
674
729
  Cnvrg::CLI.is_response_success(response, false)
@@ -1,7 +1,7 @@
1
1
  require 'fileutils'
2
2
  module Cnvrg
3
3
  class Project
4
- attr_reader :slug, :owner, :title, :local_path, :working_dir, :is_git
4
+ attr_reader :slug, :owner, :title, :local_path, :working_dir, :is_git, :is_branch
5
5
 
6
6
  RemoteURL ||= "https://cnvrg.io"
7
7
  IDXParallelThreads ||= 15
@@ -15,10 +15,10 @@ module Cnvrg
15
15
  @title = config[:project_name]
16
16
  @slug = config[:project_slug]
17
17
  @owner = config[:owner]
18
+ @is_branch = config[:is_branch]
18
19
  @is_git = config[:git] || false
19
20
  rescue => e
20
21
  end
21
-
22
22
  end
23
23
 
24
24
 
@@ -423,14 +423,26 @@ module Cnvrg
423
423
  CLI.is_response_success(response,true)
424
424
  return response
425
425
  end
426
- def jump_idx(new_branch, commit=last_local_commit)
427
-
426
+ def jump_idx(destination: self.last_local_commit)
428
427
  local_idx = self.generate_idx
429
- ignore_list = self.send_ignore_list()
430
- response = Cnvrg::API.request("users/#{self.owner}/projects/#{self.slug}/jump", 'POST', {idx: local_idx, new_branch: new_branch,
431
- current_commit: commit,ignore:ignore_list})
428
+ ignore_list = self.send_ignore_list
429
+ current_commit = local_idx[:commit]
430
+ tree = local_idx[:tree]
431
+ response = Cnvrg::API.request("users/#{self.owner}/projects/#{self.slug}/jump_to",
432
+ 'POST',
433
+ {tree: tree, ignore: ignore_list,
434
+ dest_commit: destination, current_commit: current_commit})
432
435
  CLI.is_response_success(response,false)
433
- return response
436
+ response
437
+ end
438
+
439
+ def set_on_branch(is_latest)
440
+ config = YAML.load_file(@working_dir+"/.cnvrg/config.yml")
441
+ @is_branch = !is_latest
442
+ config[:is_branch] = @is_branch
443
+
444
+ File.open(@working_dir+"/.cnvrg/config.yml", 'w') { |f| f.write config.to_yaml }
445
+
434
446
  end
435
447
 
436
448
  def compare_commit(commit)
@@ -1,4 +1,4 @@
1
1
  module Cnvrg
2
- VERSION = '0.7.0'
2
+ VERSION = '0.7.1'
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.7.0
4
+ version: 0.7.1
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: 2018-09-04 00:00:00.000000000 Z
12
+ date: 2018-09-05 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -400,6 +400,7 @@ files:
400
400
  - lib/cnvrg/api.rb
401
401
  - lib/cnvrg/auth.rb
402
402
  - lib/cnvrg/cli.rb
403
+ - lib/cnvrg/colors.rb
403
404
  - lib/cnvrg/data.rb
404
405
  - lib/cnvrg/datafiles.rb
405
406
  - lib/cnvrg/dataset.rb