yandex-disk 0.0.4 → 0.0.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: 42f0c7884f42dcd37fefa77569a482362dfc6299
4
- data.tar.gz: 671e00b8bd8266a902c279b358b99d7bb025f648
3
+ metadata.gz: 23dcd981d7eb0cc5b888019fd9807d936b7dfe3c
4
+ data.tar.gz: 1a39ad88ca3b303cdc1c9e8f13958a79bc0d5ee1
5
5
  SHA512:
6
- metadata.gz: 02063f9671ec83c4b79ee08f05c36f908aa79dc683e864a4378362cfac34888faebf02c1046c7c879089790df081c86243ff09132feb136da95873b61209ae50
7
- data.tar.gz: 14eaa321bc25830b2a9ae6063e0d2b5f420c7638aeebaa892316bf6c5aa558a724add0b247ffb89cad8283683df6f4f4e49151b14ebfae83f7b06a7cd6c0cbc3
6
+ metadata.gz: b2539167f83cb414f64e790a923f39dd2a024266e3efe7e753cb22e55678b0a885ec75329a260bd1290fa95b18a8e01cb9bc1b96835947275c9fbbd03dd0731a
7
+ data.tar.gz: 86d90585dc811a40d49f333076fcade0bd9c9a92b3044ec9fed4228ebdb15508a4954a6754bcb0632b9ad191bc2b2f93460cff7a2daa80d6c3bcccd9eb1b6c60
data/README.md CHANGED
@@ -19,8 +19,12 @@ Add this line to your application's Gemfile:
19
19
  ## Usage
20
20
 
21
21
  ```ruby
22
+ # authorize via oauth access token...
22
23
  disk = Yandex::Disk::Client.new(:access_token => 'YOUR_ACCESS_TOKEN')
23
24
 
25
+ # ...or use login password for authorization
26
+ disk = Yandex::Disk::Client.new(:login => 'me', :password => 'secret')
27
+
24
28
  # to upload file to Yandex.Disk
25
29
  disk.put('path/to/local/file', '/path/to/remote/file') # returns `true` if everything is ok
26
30
 
@@ -41,6 +45,12 @@ disk.copy('/path/to/remote/file/or/dir', '/path/to/new/remote/file/or/dir')
41
45
  disk.move('/path/to/remote/file/or/dir', '/path/to/new/remote/file/or/dir')
42
46
  # delete file/dir
43
47
  disk.delete('/path/to/remote/file/or/dir') # returns `true` if everything is ok
48
+
49
+ # to get quotas
50
+ disk.space # returns hash like { :quota_available_bytes => 2488943615, :quota_used_bytes => 2488943615 }
51
+
52
+ # to get dir contents
53
+ disk.list('/') # returns array with hashes like [{:href=>"/",:resourcetype=>:collection,:getlastmodified=><DateTime>,:getcontentlength=>0,:displayname=>"disk",:creationdate=><DateTime>},{:href=>"/readme.pdf",:getlastmodified=><DateTime>,:getcontentlength=>455833,:displayname=>"readme.pdf",:creationdate=><DateTime>}]
44
54
  ```
45
55
 
46
56
  ## Using it with [backup gem](https://github.com/meskyanichi/backup)
@@ -49,7 +59,7 @@ disk.delete('/path/to/remote/file/or/dir') # returns `true` if everything is ok
49
59
  require 'yandex/disk/backup/storage'
50
60
 
51
61
  Backup::Model.new(:my_backup, 'Description for my_backup') do
52
- split_into_chunks_of 250
62
+ split_into_chunks_of 50
53
63
 
54
64
  database PostgreSQL do |db|
55
65
  db.name = 'pg_db_name'
@@ -64,7 +74,6 @@ Backup::Model.new(:my_backup, 'Description for my_backup') do
64
74
  disk.path = '/backups/'
65
75
  disk.keep = 5
66
76
  end
67
-
68
77
  end
69
78
  ```
70
79
 
@@ -1,16 +1,25 @@
1
1
  # coding: utf-8
2
2
 
3
+ require 'base64'
3
4
  require 'faraday'
4
5
  require 'faraday_middleware'
5
6
 
7
+ Faraday::Connection::METHODS << :propfind
8
+
6
9
  module Yandex
7
10
  module Disk
8
11
  class Client
12
+ autoload :Request, 'yandex/disk/client/request'
9
13
 
10
14
  def initialize options={}
11
15
  @timeout = options[:timeout] || 300
12
16
  @http = Faraday.new(:url => 'https://webdav.yandex.ru') do |builder|
13
- builder.request :authorization, "OAuth", options[:access_token]
17
+ if options[:access_token].present?
18
+ builder.request :authorization, "OAuth", options[:access_token]
19
+ else
20
+ basic_token = Base64.encode64("#{options[:login]}:#{options[:password]}")
21
+ builder.request :authorization, "Basic", basic_token
22
+ end
14
23
 
15
24
  builder.response :follow_redirects
16
25
 
@@ -44,6 +53,16 @@ module Yandex
44
53
  @http.get(path)
45
54
  end
46
55
 
56
+ def space
57
+ request = Request::Space.new(@http)
58
+ request.perform
59
+ end
60
+
61
+ def list path
62
+ request = Request::List.new(@http, path)
63
+ request.perform
64
+ end
65
+
47
66
  alias_method :mkdir, :mkcol
48
67
 
49
68
  def mkdir_p path
@@ -0,0 +1,4 @@
1
+ module Yandex::Disk::Client::Request
2
+ autoload :Space, 'yandex/disk/client/request/space'
3
+ autoload :List, 'yandex/disk/client/request/list'
4
+ end
@@ -0,0 +1,89 @@
1
+ require 'nokogiri'
2
+
3
+ class Yandex::Disk::Client::Request::List
4
+ HEADERS = {
5
+ :Depth => 1
6
+ }
7
+
8
+ def initialize http, path
9
+ @http = http
10
+ @path = path
11
+ end
12
+
13
+ def perform
14
+ response = @http.run_request :propfind, @path, nil, HEADERS
15
+ parse_result = parse(response.body)
16
+ parse_result.list
17
+ end
18
+
19
+
20
+ private
21
+
22
+ class ListParser < Nokogiri::XML::SAX::Document
23
+ attr_reader :list
24
+
25
+ def initialize
26
+ @list = []
27
+ end
28
+
29
+ def start_element name, attributes = []
30
+ case name
31
+ when 'd:href'
32
+ @current = {}
33
+ @is_href = true
34
+
35
+ when 'd:displayname'
36
+ @is_displayname = true
37
+
38
+ when 'd:getcontentlength'
39
+ @is_getcontentlength = true
40
+
41
+ when 'd:creationdate'
42
+ @is_creationdate = true
43
+
44
+ when 'd:getlastmodified'
45
+ @is_getlastmodified = true
46
+
47
+ when 'd:collection'
48
+ @current[:resourcetype] = :collection
49
+ end
50
+ end
51
+
52
+ def end_element name, attributes = []
53
+ case name
54
+ when 'd:href'
55
+ @list << @current if @current
56
+ @is_href = false
57
+
58
+ when 'd:displayname'
59
+ @is_displayname = false
60
+
61
+ when 'd:getcontentlength'
62
+ @is_getcontentlength = false
63
+
64
+ when 'd:creationdate'
65
+ @is_creationdate = false
66
+
67
+ when 'd:getlastmodified'
68
+ @is_getlastmodified = false
69
+ end
70
+ end
71
+
72
+ def characters string
73
+ @current[:href] = string if @is_href
74
+ @current[:displayname] = string if @is_displayname
75
+ @current[:getcontentlength] = string.to_i if @is_getcontentlength
76
+ @current[:creationdate] = DateTime.parse(string) if @is_creationdate
77
+ @current[:getlastmodified] = DateTime.parse(string) if @is_getlastmodified
78
+ end
79
+ end
80
+
81
+ def parse body
82
+ list_parser = ListParser.new
83
+
84
+ parser = Nokogiri::XML::SAX::Parser.new(list_parser)
85
+ parser.parse(body)
86
+
87
+ list_parser
88
+ end
89
+ end
@@ -0,0 +1,56 @@
1
+ require 'nokogiri'
2
+
3
+ class Yandex::Disk::Client::Request::Space
4
+ BODY = '<D:propfind xmlns:D="DAV:">
5
+ <D:prop>
6
+ <D:quota-available-bytes/>
7
+ <D:quota-used-bytes/>
8
+ </D:prop>
9
+ </D:propfind>'
10
+ HEADERS = {
11
+ :Depth => 0
12
+ }
13
+
14
+ def initialize http
15
+ @http = http
16
+ end
17
+
18
+ def perform
19
+ response = @http.run_request :propfind, '/', BODY, HEADERS
20
+ parse_result = parse(response.body)
21
+ {
22
+ :quota_available_bytes => parse_result.quota_available_bytes,
23
+ :quota_used_bytes => parse_result.quota_used_bytes
24
+ }
25
+ end
26
+
27
+
28
+ private
29
+
30
+ class AttriutesParser < Nokogiri::XML::SAX::Document
31
+ attr_reader :quota_available_bytes, :quota_used_bytes
32
+
33
+ def start_element name, attributes = []
34
+ case name
35
+ when 'd:quota-used-bytes'
36
+ @is_quota_used_bytes = true
37
+ when 'd:quota-available-bytes'
38
+ @is_quota_available_bytes = true
39
+ end
40
+ end
41
+
42
+ def characters string
43
+ @quota_used_bytes = string.to_i if @is_quota_used_bytes
44
+ @quota_available_bytes = string.to_i if @is_quota_available_bytes
45
+ end
46
+ end
47
+
48
+ def parse body
49
+ attributes_parser = AttriutesParser.new
50
+
51
+ parser = Nokogiri::XML::SAX::Parser.new(attributes_parser)
52
+ parser.parse(body)
53
+
54
+ attributes_parser
55
+ end
56
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Yandex
4
4
  module Disk
5
- VERSION = "0.0.4"
5
+ VERSION = "0.0.5"
6
6
  end
7
7
  end
@@ -6,8 +6,8 @@ require 'yandex/disk/version'
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "yandex-disk"
8
8
  spec.version = Yandex::Disk::VERSION
9
- spec.authors = ["Yury Korolev"]
10
- spec.email = ["yurykorolev@me.com"]
9
+ spec.authors = ["Yury Korolev", "Alexandr Borisov"]
10
+ spec.email = ["yurykorolev@me.com", "aishek@gmail.com"]
11
11
  spec.description = %q{Ruby client for Yandex.Disk}
12
12
  spec.summary = %q{Ruby client for Yandex.Disk with backup gem support}
13
13
  spec.homepage = "https://github.com/anjlab/yandex-disk"
@@ -19,6 +19,7 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
  spec.add_dependency('faraday', '~> 0.8')
22
+ spec.add_dependency('nokogiri', '~> 1.6.0')
22
23
  spec.add_dependency('faraday_middleware', '~> 0.9.0')
23
24
  spec.add_dependency('excon', '>= 0.16')
24
25
 
metadata CHANGED
@@ -1,14 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yandex-disk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yury Korolev
8
+ - Alexandr Borisov
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2013-08-28 00:00:00.000000000 Z
12
+ date: 2013-10-28 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: faraday
@@ -24,6 +25,20 @@ dependencies:
24
25
  - - ~>
25
26
  - !ruby/object:Gem::Version
26
27
  version: '0.8'
28
+ - !ruby/object:Gem::Dependency
29
+ name: nokogiri
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ~>
33
+ - !ruby/object:Gem::Version
34
+ version: 1.6.0
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ~>
40
+ - !ruby/object:Gem::Version
41
+ version: 1.6.0
27
42
  - !ruby/object:Gem::Dependency
28
43
  name: faraday_middleware
29
44
  requirement: !ruby/object:Gem::Requirement
@@ -83,6 +98,7 @@ dependencies:
83
98
  description: Ruby client for Yandex.Disk
84
99
  email:
85
100
  - yurykorolev@me.com
101
+ - aishek@gmail.com
86
102
  executables: []
87
103
  extensions: []
88
104
  extra_rdoc_files: []
@@ -95,6 +111,9 @@ files:
95
111
  - lib/yandex/disk.rb
96
112
  - lib/yandex/disk/backup/storage.rb
97
113
  - lib/yandex/disk/client.rb
114
+ - lib/yandex/disk/client/request.rb
115
+ - lib/yandex/disk/client/request/list.rb
116
+ - lib/yandex/disk/client/request/space.rb
98
117
  - lib/yandex/disk/version.rb
99
118
  - test/yandex_dist_test.rb
100
119
  - yandex-disk.gemspec