cnvrg 0.7.0 → 0.7.1

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