rb1drv 0.1.6 → 0.1.7

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
  SHA256:
3
- metadata.gz: 81df80e1aa9121117a01bbfff3db1217d07f4fec06913abc4404f675180ce649
4
- data.tar.gz: 318dc652e701f11a38d2b1aafc05f5804074cf4add0dd9a783811ed8ca7e8d2a
3
+ metadata.gz: 441718671c6e794189827b5411f9d3081931dbf9b5f9b8a1b1eaad8ebfd7487b
4
+ data.tar.gz: 9dac61af7d31703a8b90288a435f54aa4681464e6598a6818f49bac77dd0cea7
5
5
  SHA512:
6
- metadata.gz: bdb422dfb4957985a3fab31c0025391b1434591652a36a84f26a129bd758ef5a2d017d953c318a8b9a762ccdf4abc1ad953cb3b84c4bf82724f08063e7f0cd15
7
- data.tar.gz: a92c40cff2015a682a965b60a57eb5c4e03fe5525a0d9d8c46a69171394e3a47c58acda9c608cc915acae2db38db8fc3f69384a7a0ef83a383911822e2371e0c
6
+ metadata.gz: c5f2da5b24a15baecef1b3e9a0cbe99b481792a66fc1eaed1280904543db09dc131ca9bb20feb49c274d790168f17c7a2e3d17aa10c1e76c7a34924e47b88b26
7
+ data.tar.gz: cadf55833889484e9856585bde0fe794ed6ed9dcdd124658502cea266e4e8cf2c621197db1504e71355a4c6eb3255dd58fae6fc08ccd0f2f9b859e74a1da68cf
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rb1drv (0.1.6)
4
+ rb1drv (0.1.7)
5
5
  excon (~> 0.62)
6
6
  oauth2 (~> 1.4)
7
7
 
@@ -3,6 +3,10 @@ module Rb1drv
3
3
  def initialize(*_)
4
4
  end
5
5
 
6
+ def id
7
+ '_FILE_NOT_FOUND_'
8
+ end
9
+
6
10
  # No
7
11
  def dir?
8
12
  false
@@ -15,7 +15,7 @@ module Rb1drv
15
15
  # @return [Array<OneDriveDir,OneDriveFile>] directories and files whose parent is current directory
16
16
  def children
17
17
  return [] if child_count <= 0
18
- @cached_children ||= @od.request("#{api_path}/children")['value'].map do |child|
18
+ @cached_children ||= @od.request("#{api_path}/children?$top=1000")['value'].map do |child|
19
19
  OneDriveItem.smart_new(@od, child)
20
20
  end
21
21
  end
@@ -110,6 +110,8 @@ module Rb1drv
110
110
 
111
111
  resume_file = "#{filename}.1drv_upload"
112
112
  resume_session = JSON.parse(File.read(resume_file)) rescue nil if File.exist?(resume_file)
113
+ old_file = OneDriveItem.smart_new(@od, @od.request("#{api_path}:/#{target_name}"))
114
+ new_file = nil
113
115
 
114
116
  result = nil
115
117
  loop do
@@ -132,14 +134,17 @@ module Rb1drv
132
134
 
133
135
  until resume_session && resume_session['session_url'] do
134
136
  result = @od.request("#{api_path}:/#{target_name}:/createUploadSession", item: {'@microsoft.graph.conflictBehavior': overwrite ? 'replace' : 'rename'})
135
- resume_session = {
136
- 'session_url' => result['uploadUrl'],
137
- 'source_size' => File.size(filename),
138
- 'fragment_size' => fragment_size
139
- }
140
- File.write(resume_file, JSON.pretty_generate(resume_session))
141
- conn = Excon.new(resume_session['session_url'], idempotent: true)
142
- sleep 15 unless result['uploadUrl']
137
+ if result['uploadUrl']
138
+ resume_session = {
139
+ 'session_url' => result['uploadUrl'],
140
+ 'source_size' => File.size(filename),
141
+ 'fragment_size' => fragment_size
142
+ }
143
+ File.write(resume_file, JSON.pretty_generate(resume_session))
144
+ conn = Excon.new(resume_session['session_url'], idempotent: true)
145
+ break
146
+ end
147
+ sleep 15
143
148
  end
144
149
 
145
150
  new_file = nil
@@ -157,31 +162,36 @@ module Rb1drv
157
162
  yield :progress, file: filename, from: from, to: to, progress: progress, total: total if block_given?
158
163
  end
159
164
  begin
160
- result = conn.put headers: headers, chunk_size: chunk_size, body: sliced_io, read_timeout: 15, write_timeout: 15, retry_limit: 2
165
+ result = conn.put headers: headers, chunk_size: chunk_size, body: sliced_io, retry_limit: 2
161
166
  raise IOError if result.body.include? 'accessDenied'
162
- rescue Excon::Error::Timeout, Excon::Error::Socket
167
+ rescue Excon::Error::Socket, IOError
168
+ # Probably server rejected this request
169
+ throw :restart
170
+ rescue Excon::Error::Timeout
163
171
  conn = Excon.new(resume_session['session_url'], idempotent: true)
164
172
  yield :retry, file: filename, from: from, to: to if block_given?
165
173
  retry
166
- rescue IOError
167
- conn = Excon.new(resume_session['session_url'], idempotent: true)
168
- yield :retry, file: filename, from: from, to: to if block_given?
169
- sleep 60
170
- retry
174
+ ensure
175
+ yield :finish_segment, file: filename, from: from, to: to if block_given?
171
176
  end
172
- yield :finish_segment, file: filename, from: from, to: to if block_given?
173
177
  throw :restart if result.body.include?('</html>')
174
178
  result = JSON.parse(result.body)
175
179
  new_file = OneDriveFile.new(@od, result) if result.dig('file')
176
180
  end
177
181
  end
178
182
  throw :restart unless new_file&.file?
179
- File.unlink(resume_file)
180
- return set_mtime(new_file, File.mtime(filename))
183
+ break
181
184
  end
182
185
  # catch :restart here
183
- sleep 60 # and retry the whole process
186
+ sleep 60 # wait for server to process the previous request
187
+ new_file = OneDriveItem.smart_new(@od, @od.request("#{api_path}:/#{target_name}"))
188
+ break if new_file.file? && new_file.id != old_file.id
189
+ # and retry the whole process
184
190
  end
191
+
192
+ # upload completed
193
+ File.unlink(resume_file)
194
+ return new_file.set_mtime(File.mtime(filename))
185
195
  end
186
196
 
187
197
  # Uploads a local file into current remote directory using simple upload mode.
@@ -209,11 +219,7 @@ module Rb1drv
209
219
  result = @od.conn.put(query)
210
220
  result = JSON.parse(result.body)
211
221
  file = OneDriveFile.new(@od, result)
212
- set_mtime(file, File.mtime(filename))
213
- end
214
-
215
- def set_mtime(file, time)
216
- OneDriveFile.new(@od, @od.request(file.api_path, {fileSystemInfo: {lastModifiedDateTime: time.utc.iso8601}}, :patch))
222
+ file.set_mtime(File.mtime(filename))
217
223
  end
218
224
  end
219
225
  end
@@ -57,5 +57,23 @@ module Rb1drv
57
57
  yield :finish_segment, file: target_name if block_given?
58
58
  FileUtils.mv(tmpfile, filename)
59
59
  end
60
+
61
+ # Change last modified time for a remote file.
62
+ #
63
+ # NOTICE: OneDrive by default keeps multiple history version for this operation.
64
+ # NOTICE: You must turn off versioning to prevent multiple counts on disk quota.
65
+ #
66
+ # 3 attempts will be made due to delay after a file upload.
67
+ #
68
+ # @param time [Time] desired last modified time
69
+ # @return [OneDriveFile] new file object returned by API
70
+ def set_mtime(time)
71
+ attempt = 0
72
+ OneDriveFile.new(@od, @od.request(api_path, {fileSystemInfo: {lastModifiedDateTime: time.utc.iso8601}}, :patch))
73
+ rescue
74
+ sleep 10
75
+ attempt += 1
76
+ retry if attempt <= 3
77
+ end
60
78
  end
61
79
  end
@@ -1,3 +1,3 @@
1
1
  module Rb1drv
2
- VERSION = "0.1.6"
2
+ VERSION = "0.1.7"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rb1drv
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Xinyue Lu
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-05-22 00:00:00.000000000 Z
11
+ date: 2018-05-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: oauth2