rb1drv 0.1.7 → 0.1.8

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.
@@ -1,68 +1,67 @@
1
- module Rb1drv
2
- class OneDriveItem
3
- attr_reader :id, :name, :eTag, :size, :mtime, :ctime, :muser, :cuser, :parent_path, :remote_id, :remote_drive_id
4
- protected
5
- def initialize(od, api_hash)
6
- raise api_hash.inspect unless api_hash['createdDateTime']
7
- @od = od
8
- %w(id name eTag size).each do |key|
9
- instance_variable_set("@#{key}", api_hash[key])
10
- end
11
- @remote_drive_id = api_hash.dig('remoteItem', 'parentReference', 'driveId')
12
- @remote_id = api_hash.dig('remoteItem', 'id')
13
- @mtime = Time.iso8601(api_hash['lastModifiedDateTime'])
14
- @ctime = Time.iso8601(api_hash['createdDateTime'])
15
- @muser = api_hash.dig('lastModifiedBy', 'user', 'displayName') || 'N/A'
16
- @cuser = api_hash.dig('createdBy', 'user', 'displayName') || 'N/A'
17
- @parent_path = api_hash.dig('parentReference', 'path')
18
- @remote = api_hash.has_key?('remoteItem')
19
- end
20
-
21
- # Create subclass instance by checking the item type
22
- #
23
- # @return [OneDriveFile, OneDriveDir] instanciated drive item
24
- def self.smart_new(od, item_hash)
25
- if item_hash['remoteItem']
26
- item_hash['remoteItem'].each do |key, value|
27
- item_hash[key] ||= value
28
- end
29
- end
30
- if item_hash['file']
31
- OneDriveFile.new(od, item_hash)
32
- elsif item_hash['folder']
33
- OneDriveDir.new(od, item_hash)
34
- elsif item_hash.dig('error', 'code') == 'itemNotFound'
35
- OneDrive404.new
36
- else
37
- item_hash
38
- end
39
- end
40
-
41
- # @return [String] absolute path of current item
42
- def absolute_path
43
- if @parent_path
44
- File.join(@parent_path, @name)
45
- else
46
- @name
47
- end
48
- end
49
-
50
- # TODO: API endpoint does not play well with remote files
51
- #
52
- # @return [String] api reference path of current object
53
- def api_path
54
- if remote?
55
- "drives/#{@remote_drive_id}/items/#{@remote_id}"
56
- else
57
- "drive/items/#{@id}"
58
- end
59
- end
60
-
61
- # TODO: API endpoint does not play well with remote files
62
- #
63
- # @return [Boolean] whether it's shared by others
64
- def remote?
65
- @remote
66
- end
67
- end
68
- end
1
+ module Rb1drv
2
+ class OneDriveItem
3
+ attr_reader :id, :name, :eTag, :size, :mtime, :ctime, :muser, :cuser, :parent_path, :remote_id, :remote_drive_id
4
+ protected
5
+ def initialize(od, api_hash)
6
+ @od = od
7
+ %w(id name eTag size).each do |key|
8
+ instance_variable_set("@#{key}", api_hash[key])
9
+ end
10
+ @remote_drive_id = api_hash.dig('remoteItem', 'parentReference', 'driveId')
11
+ @remote_id = api_hash.dig('remoteItem', 'id')
12
+ @mtime = Time.iso8601(api_hash.dig('lastModifiedDateTime'))
13
+ @ctime = Time.iso8601(api_hash.dig('createdDateTime'))
14
+ @muser = api_hash.dig('lastModifiedBy', 'user', 'displayName') || 'N/A'
15
+ @cuser = api_hash.dig('createdBy', 'user', 'displayName') || 'N/A'
16
+ @parent_path = api_hash.dig('parentReference', 'path')
17
+ @remote = api_hash.has_key?('remoteItem')
18
+ end
19
+
20
+ # Create subclass instance by checking the item type
21
+ #
22
+ # @return [OneDriveFile, OneDriveDir] instanciated drive item
23
+ def self.smart_new(od, item_hash)
24
+ if item_hash['remoteItem']
25
+ item_hash['remoteItem'].each do |key, value|
26
+ item_hash[key] ||= value
27
+ end
28
+ end
29
+ if item_hash['file']
30
+ OneDriveFile.new(od, item_hash)
31
+ elsif item_hash['folder']
32
+ OneDriveDir.new(od, item_hash)
33
+ elsif item_hash.dig('error', 'code') == 'itemNotFound'
34
+ OneDrive404.new
35
+ else
36
+ item_hash
37
+ end
38
+ end
39
+
40
+ # @return [String] absolute path of current item
41
+ def absolute_path
42
+ if @parent_path
43
+ File.join(@parent_path, @name)
44
+ else
45
+ @name
46
+ end
47
+ end
48
+
49
+ # TODO: API endpoint does not play well with remote files
50
+ #
51
+ # @return [String] api reference path of current object
52
+ def api_path
53
+ if remote?
54
+ "drives/#{@remote_drive_id}/items/#{@remote_id}"
55
+ else
56
+ "drive/items/#{@id}"
57
+ end
58
+ end
59
+
60
+ # TODO: API endpoint does not play well with remote files
61
+ #
62
+ # @return [Boolean] whether it's shared by others
63
+ def remote?
64
+ @remote
65
+ end
66
+ end
67
+ end
@@ -1,38 +1,38 @@
1
- # SlicedIO slices a large File into a small portion.
2
- class SlicedIO
3
- def initialize(io, from, to, &block)
4
- @io = io
5
- @from = from
6
- @to = to
7
- @block = block
8
- rewind
9
- end
10
-
11
- def rewind
12
- @io.seek(@from)
13
- @current = 0
14
- end
15
-
16
- def size
17
- @size ||= @to - @from + 1
18
- end
19
-
20
- def read(len)
21
- return nil if @current >= size
22
- len = [len, size - @current].min
23
- # Notify before we read
24
- @block.call(@current, size)
25
- failed_count = 0
26
- begin
27
- @io.read(len)
28
- rescue Errno::EIO
29
- @io.seek(@from + @current)
30
- sleep 1
31
- failed_count += 1
32
- retry unless failed_count > 5
33
- raise
34
- end
35
- ensure
36
- @current += len
37
- end
38
- end
1
+ # SlicedIO slices a large File into a small portion.
2
+ class SlicedIO
3
+ def initialize(io, from, to, &block)
4
+ @io = io
5
+ @from = from
6
+ @to = to
7
+ @block = block
8
+ rewind
9
+ end
10
+
11
+ def rewind
12
+ @io.seek(@from)
13
+ @current = 0
14
+ end
15
+
16
+ def size
17
+ @size ||= @to - @from + 1
18
+ end
19
+
20
+ def read(len)
21
+ return nil if @current >= size
22
+ len = [len, size - @current].min
23
+ # Notify before we read
24
+ @block.call(@current, size)
25
+ failed_count = 0
26
+ begin
27
+ @io.read(len)
28
+ rescue Errno::EIO
29
+ @io.seek(@from + @current)
30
+ sleep 1
31
+ failed_count += 1
32
+ retry unless failed_count > 5
33
+ raise
34
+ end
35
+ ensure
36
+ @current += len
37
+ end
38
+ end
@@ -1,3 +1,3 @@
1
- module Rb1drv
2
- VERSION = "0.1.7"
3
- end
1
+ module Rb1drv
2
+ VERSION = "0.1.8"
3
+ end
data/lib/rb1drv.rb CHANGED
@@ -1,59 +1,59 @@
1
- require 'excon'
2
- require 'oauth2'
3
- require "rb1drv/version"
4
-
5
- module Rb1drv
6
- # Base class to support oauth2 authentication and sending simple API requests.
7
- #
8
- # Call +#root+ or +#get+ to get an +OneDriveDir+ or +OneDriveFile+ to wotk with.
9
- class OneDrive
10
- attr_reader :oauth2_client, :logger, :access_token, :conn
11
- # Instanciates with app id and secret.
12
- def initialize(client_id, client_secret, callback_url, logger=nil)
13
- @client_id = client_id
14
- @client_secret = client_secret
15
- @callback_url = callback_url
16
- @logger = logger
17
- @oauth2_client = OAuth2::Client.new client_id, client_secret,
18
- authorize_url: 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize',
19
- token_url: 'https://login.microsoftonline.com/common/oauth2/v2.0/token'
20
- @conn = Excon.new('https://graph.microsoft.com/', persistent: true, idempotent: true)
21
- @conn.logger = @logger if @logger
22
- end
23
-
24
- # Issues requests to API endpoint.
25
- #
26
- # @param uri [String] relative path of the API
27
- # @param data [Hash] JSON data to be post
28
- # @param verb [Symbol] HTTP request verb if data is given
29
- #
30
- # @return [Hash] response from API.
31
- def request(uri, data=nil, verb=:post)
32
- @logger.info(uri) if @logger
33
- auth_check
34
- query = {
35
- path: File.join('v1.0/me/', URI.escape(uri)),
36
- headers: {
37
- 'Authorization': "Bearer #{@access_token.token}"
38
- }
39
- }
40
- if data
41
- query[:body] = JSON.generate(data)
42
- query[:headers]['Content-Type'] = 'application/json'
43
- @logger.info(query[:body]) if @logger
44
- verb = :post unless [:post, :put, :patch, :delete].include?(verb)
45
- response = @conn.send(verb, query)
46
- else
47
- response = @conn.get(query)
48
- end
49
- JSON.parse(response.body)
50
- end
51
- end
52
- end
53
-
54
- require 'rb1drv/auth'
55
- require 'rb1drv/onedrive'
56
- require 'rb1drv/onedrive_item'
57
- require 'rb1drv/onedrive_dir'
58
- require 'rb1drv/onedrive_file'
59
- require 'rb1drv/onedrive_404'
1
+ require 'excon'
2
+ require 'oauth2'
3
+ require "rb1drv/version"
4
+
5
+ module Rb1drv
6
+ # Base class to support oauth2 authentication and sending simple API requests.
7
+ #
8
+ # Call +#root+ or +#get+ to get an +OneDriveDir+ or +OneDriveFile+ to wotk with.
9
+ class OneDrive
10
+ attr_reader :oauth2_client, :logger, :access_token, :conn
11
+ # Instanciates with app id and secret.
12
+ def initialize(client_id, client_secret, callback_url, logger=nil)
13
+ @client_id = client_id
14
+ @client_secret = client_secret
15
+ @callback_url = callback_url
16
+ @logger = logger
17
+ @oauth2_client = OAuth2::Client.new client_id, client_secret,
18
+ authorize_url: 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize',
19
+ token_url: 'https://login.microsoftonline.com/common/oauth2/v2.0/token'
20
+ @conn = Excon.new('https://graph.microsoft.com/', persistent: true, idempotent: true)
21
+ @conn.logger = @logger if @logger
22
+ end
23
+
24
+ # Issues requests to API endpoint.
25
+ #
26
+ # @param uri [String] relative path of the API
27
+ # @param data [Hash] JSON data to be post
28
+ # @param verb [Symbol] HTTP request verb if data is given
29
+ #
30
+ # @return [Hash] response from API.
31
+ def request(uri, data=nil, verb=:post)
32
+ @logger.info(uri) if @logger
33
+ auth_check
34
+ query = {
35
+ path: File.join('v1.0/me/', URI.escape(uri)),
36
+ headers: {
37
+ 'Authorization': "Bearer #{@access_token.token}"
38
+ }
39
+ }
40
+ if data
41
+ query[:body] = JSON.generate(data)
42
+ query[:headers]['Content-Type'] = 'application/json'
43
+ @logger.info(query[:body]) if @logger
44
+ verb = :post unless [:post, :put, :patch, :delete].include?(verb)
45
+ response = @conn.send(verb, query)
46
+ else
47
+ response = @conn.get(query)
48
+ end
49
+ JSON.parse(response.body)
50
+ end
51
+ end
52
+ end
53
+
54
+ require 'rb1drv/auth'
55
+ require 'rb1drv/onedrive'
56
+ require 'rb1drv/onedrive_item'
57
+ require 'rb1drv/onedrive_dir'
58
+ require 'rb1drv/onedrive_file'
59
+ require 'rb1drv/onedrive_404'
data/rb1drv.gemspec CHANGED
@@ -1,28 +1,28 @@
1
-
2
- lib = File.expand_path("../lib", __FILE__)
3
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require "rb1drv/version"
5
-
6
- Gem::Specification.new do |spec|
7
- spec.name = "rb1drv"
8
- spec.version = Rb1drv::VERSION
9
- spec.authors = ["Xinyue Lu"]
10
- spec.email = ["i@7086.in"]
11
-
12
- spec.summary = "Ruby OneDrive Library"
13
- spec.homepage = "https://github.com/msg7086/rb1drv"
14
- spec.license = "MIT"
15
-
16
- spec.files = `git ls-files -z`.split("\x0").reject do |f|
17
- f.match(%r{^(test|spec|features)/})
18
- end
19
- spec.bindir = "exe"
20
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
- spec.require_paths = ["lib"]
22
- spec.required_ruby_version = '>= 2.3'
23
-
24
- spec.add_dependency "oauth2", "~> 1.4"
25
- spec.add_dependency "excon", "~> 0.62"
26
- spec.add_development_dependency "bundler", "~> 1.16"
27
- spec.add_development_dependency "rake", "~> 10.0"
28
- end
1
+
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "rb1drv/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "rb1drv"
8
+ spec.version = Rb1drv::VERSION
9
+ spec.authors = ["Xinyue Lu"]
10
+ spec.email = ["i@7086.in"]
11
+
12
+ spec.summary = "Ruby OneDrive Library"
13
+ spec.homepage = "https://github.com/msg7086/rb1drv"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
17
+ f.match(%r{^(test|spec|features)/})
18
+ end
19
+ spec.bindir = "exe"
20
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
+ spec.require_paths = ["lib"]
22
+ spec.required_ruby_version = '>= 2.3'
23
+
24
+ spec.add_dependency "oauth2", "~> 1.4"
25
+ spec.add_dependency "excon", "~> 0.62"
26
+ spec.add_development_dependency "bundler", "~> 1.16"
27
+ spec.add_development_dependency "rake", "~> 10.0"
28
+ 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.7
4
+ version: 0.1.8
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-29 00:00:00.000000000 Z
11
+ date: 2018-06-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: oauth2