my_bitcasa 1.0.0

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.
Files changed (58) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +29 -0
  6. data/Rakefile +1 -0
  7. data/example/delete.rb +17 -0
  8. data/example/directory.rb +15 -0
  9. data/example/download_photo_legacy_thumbs.rb +27 -0
  10. data/example/download_photo_thumbs.rb +27 -0
  11. data/example/download_photos.rb +27 -0
  12. data/example/list.rb +15 -0
  13. data/example/login.rb +15 -0
  14. data/example/mkdir.rb +15 -0
  15. data/example/recursive_directory.rb +27 -0
  16. data/example/rename.rb +19 -0
  17. data/example/setting.yml.example +2 -0
  18. data/example/share.rb +19 -0
  19. data/example/upload.rb +18 -0
  20. data/example/zip_download_photos.rb +26 -0
  21. data/lib/my_bitcasa/api_error.rb +6 -0
  22. data/lib/my_bitcasa/authorization_error.rb +6 -0
  23. data/lib/my_bitcasa/bitcasa_base.rb +11 -0
  24. data/lib/my_bitcasa/bitcasa_drive.rb +15 -0
  25. data/lib/my_bitcasa/bitcasa_file.rb +61 -0
  26. data/lib/my_bitcasa/bitcasa_folder.rb +46 -0
  27. data/lib/my_bitcasa/bitcasa_item.rb +38 -0
  28. data/lib/my_bitcasa/bitcasa_share.rb +13 -0
  29. data/lib/my_bitcasa/connection.rb +102 -0
  30. data/lib/my_bitcasa/connection_error.rb +6 -0
  31. data/lib/my_bitcasa/connection_finalizer.rb +12 -0
  32. data/lib/my_bitcasa/connection_pool.rb +26 -0
  33. data/lib/my_bitcasa/data_accessor.rb +31 -0
  34. data/lib/my_bitcasa/delete.rb +26 -0
  35. data/lib/my_bitcasa/directory.rb +59 -0
  36. data/lib/my_bitcasa/download.rb +105 -0
  37. data/lib/my_bitcasa/downloadable.rb +60 -0
  38. data/lib/my_bitcasa/error.rb +4 -0
  39. data/lib/my_bitcasa/legacy_thumbnail.rb +33 -0
  40. data/lib/my_bitcasa/list.rb +71 -0
  41. data/lib/my_bitcasa/login_engine/phantomjs.rb +29 -0
  42. data/lib/my_bitcasa/login_engine/phantomjs_login.js +58 -0
  43. data/lib/my_bitcasa/login_engine/pure.rb +47 -0
  44. data/lib/my_bitcasa/login_engine/selenium.rb +87 -0
  45. data/lib/my_bitcasa/login_engine.rb +15 -0
  46. data/lib/my_bitcasa/mkdir.rb +26 -0
  47. data/lib/my_bitcasa/profile.rb +39 -0
  48. data/lib/my_bitcasa/rename.rb +24 -0
  49. data/lib/my_bitcasa/response_format_error.rb +6 -0
  50. data/lib/my_bitcasa/response_middleware.rb +39 -0
  51. data/lib/my_bitcasa/share.rb +30 -0
  52. data/lib/my_bitcasa/thumbnail.rb +33 -0
  53. data/lib/my_bitcasa/upload.rb +42 -0
  54. data/lib/my_bitcasa/version.rb +3 -0
  55. data/lib/my_bitcasa/zip_download.rb +21 -0
  56. data/lib/my_bitcasa.rb +38 -0
  57. data/my_bitcasa.gemspec +28 -0
  58. metadata +198 -0
@@ -0,0 +1,87 @@
1
+ module MyBitcasa
2
+ module LoginEngine
3
+ class Selenium
4
+ attr_reader :cookie
5
+
6
+ def initialize
7
+ require 'selenium-webdriver'
8
+ @use_headless = nil
9
+ end
10
+
11
+ def use_headless=(use)
12
+ if use
13
+ require 'headless'
14
+ end
15
+ @use_headless = use
16
+ end
17
+
18
+ def use_headless
19
+ if @use_headless.nil?
20
+ # autodetect
21
+ begin
22
+ require 'headless'
23
+ Headless::CliUtil.ensure_application_exists!('Xvfb', 'Xvfb not found on your system')
24
+ @use_headless = true
25
+ rescue => e
26
+ @use_headless = false
27
+ end
28
+ end
29
+
30
+ @use_headless
31
+ end
32
+
33
+ def login(user, password)
34
+ if use_headless
35
+ login_with_headless(user, password)
36
+ else
37
+ login_without_headless(user, password)
38
+ end
39
+ end
40
+
41
+ def login_with_headless(user, password)
42
+ Headless.ly do
43
+ login_without_headless(user, password)
44
+ end
45
+ end
46
+
47
+ def login_without_headless(user, password)
48
+ profile = ::Selenium::WebDriver::Firefox::Profile.new
49
+ driver = ::Selenium::WebDriver.for :firefox, :profile => profile
50
+
51
+ begin
52
+ driver.navigate.to "https://my.bitcasa.com/login"
53
+
54
+ input_user_tag = nil
55
+ input_password_tag = nil
56
+
57
+ 5.times {
58
+ sleep 1
59
+ input_user_tag ||= driver.find_element(:xpath, "//input[@name='user']") || next
60
+ input_password_tag ||= driver.find_element(:xpath, "//input[@name='password']") || next
61
+ break
62
+ }
63
+
64
+ input_user_tag.send_keys(user)
65
+ input_password_tag.send_keys(password)
66
+ sleep 1
67
+
68
+ input_password_tag.submit()
69
+ sleep 3
70
+
71
+ @cookie = driver.manage.all_cookies.map{|cookie|
72
+ "#{cookie[:name]}=#{cookie[:value]}"
73
+ }.join("; ")
74
+
75
+ ensure
76
+ driver.quit
77
+ end
78
+ end
79
+
80
+ class << self
81
+ def available?
82
+ new && true rescue false
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,15 @@
1
+ require 'my_bitcasa/login_engine/phantomjs'
2
+ require 'my_bitcasa/login_engine/selenium'
3
+
4
+ module MyBitcasa
5
+ module LoginEngine
6
+ class << self
7
+ def autodetect
8
+ [Phantomjs, Selenium].each do |engine|
9
+ return engine if engine.available?
10
+ end
11
+ raise RuntimeError, "available login engine is not found"
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,26 @@
1
+ require 'my_bitcasa/connection_pool'
2
+ require 'my_bitcasa/bitcasa_item'
3
+ require 'my_bitcasa/api_error'
4
+
5
+ module MyBitcasa
6
+ class Mkdir
7
+ include ConnectionPool
8
+
9
+ def initialize(path)
10
+ @path = path
11
+ end
12
+
13
+ def mkdir
14
+ res = connection.post do |req|
15
+ req.url Connection.uri_encode("/directory#{@path}")
16
+ end
17
+
18
+ case res.body["status"]
19
+ when "created"
20
+ BitcasaItem.create(res.body["items"].first)
21
+ else
22
+ raise ApiError, "mkdir error: status=#{res.body["status"]} path=#{@path}"
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,39 @@
1
+ require 'my_bitcasa/connection_pool'
2
+
3
+ module MyBitcasa
4
+ class Profile < Hash
5
+ include ConnectionPool
6
+
7
+ def initialize
8
+ renew!
9
+ end
10
+
11
+ def renew!
12
+ res = connection.get "/profile"
13
+ self.clear
14
+ self.merge!(res.body)
15
+ end
16
+
17
+ [
18
+ :last_name,
19
+ :usage_str,
20
+ :plan_type,
21
+ :quota,
22
+ :button1_url,
23
+ :first_name,
24
+ :days_left,
25
+ :created_at,
26
+ :button1,
27
+ :state,
28
+ :storage_used,
29
+ :state_id,
30
+ :email,
31
+ ].each do |key|
32
+ class_eval %{
33
+ def #{key}
34
+ self["#{key}"]
35
+ end
36
+ }
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,24 @@
1
+ require 'my_bitcasa/connection_pool'
2
+
3
+ module MyBitcasa
4
+ class Rename
5
+ include ConnectionPool
6
+
7
+ def initialize(from, to)
8
+ @from = from
9
+ @to = to
10
+ end
11
+
12
+ def rename
13
+ res = connection.post do |req|
14
+ req.url "/rename/"
15
+ req.body = {
16
+ from: @from,
17
+ to: @to,
18
+ }
19
+ end
20
+
21
+ res.body
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,6 @@
1
+ require 'my_bitcasa/error'
2
+
3
+ module MyBitcasa
4
+ class ResponseFormatError < Error
5
+ end
6
+ end
@@ -0,0 +1,39 @@
1
+ require 'json'
2
+ require 'faraday_middleware/response_middleware'
3
+ require 'my_bitcasa/connection_error'
4
+ require 'my_bitcasa/authorization_error'
5
+
6
+ module MyBitcasa
7
+ class ResponseMiddleware < FaradayMiddleware::ResponseMiddleware
8
+ def process_response(env)
9
+ # check status code
10
+ case env[:status]
11
+ when 200
12
+ # 200 OK
13
+ when 401
14
+ # 401 Auhorization error
15
+ raise AuthorizationError, "login required"
16
+ else
17
+ # other status
18
+ raise ConnectionError, "response status code: #{env[:status]}"
19
+ end
20
+
21
+ # parse json
22
+ case env[:body]
23
+ when "OK"
24
+ # OK string
25
+ else
26
+ # parse json
27
+ begin
28
+ env[:body] = JSON.parse(env[:body])
29
+ rescue => e
30
+ e2 =ResponseFormatError.new("#{e.class}: #{e.message}")
31
+ e2.set_backtrace(e.backtrace)
32
+ raise e2
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+
39
+ Faraday::Response.register_middleware :my_bitcasa => MyBitcasa::ResponseMiddleware
@@ -0,0 +1,30 @@
1
+ require 'my_bitcasa/connection_pool'
2
+ require 'my_bitcasa/bitcasa_share'
3
+
4
+ module MyBitcasa
5
+ class Share
6
+ include ConnectionPool
7
+
8
+ def initialize(name, *paths)
9
+ @name = name
10
+ @paths = paths.flatten
11
+ end
12
+
13
+ def share
14
+ res = connection.post do |req|
15
+ req.url "/share"
16
+ req.body = {
17
+ name: @name,
18
+ selection: JSON.generate({
19
+ paths: @paths,
20
+ albums: {},
21
+ artists: [],
22
+ photo_albums: [],
23
+ }),
24
+ }
25
+ end
26
+
27
+ BitcasaShare.new(res.body)
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,33 @@
1
+ require 'my_bitcasa/connection_pool'
2
+ require 'my_bitcasa/downloadable'
3
+
4
+ module MyBitcasa
5
+ class Thumbnail
6
+ include ConnectionPool
7
+ include Downloadable
8
+
9
+ THUMB_SIZE = {
10
+ small: "thumb_35x35.jpg",
11
+ medium: "thumb_150x150.jpg",
12
+ large: "thumb_260x260.jpg",
13
+ preview: "preview_1024x768.jpg",
14
+ }.freeze
15
+
16
+ downloadable_path {
17
+ "/transcode/#{@file.id}/#{@specific_size}"
18
+ }
19
+ downloadable_params {{
20
+ size: @file.size,
21
+ extension: @file.extension,
22
+ }}
23
+ downloadable_basename {
24
+ name = File.basename(@file.name, "."+@file.extension)
25
+ "#{name}_#{@specific_size}"
26
+ }
27
+
28
+ def initialize(file, size=:small)
29
+ @file = file
30
+ @specific_size = THUMB_SIZE[size] || size
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,42 @@
1
+ require 'my_bitcasa/connection_pool'
2
+ require 'mime-types'
3
+
4
+ module MyBitcasa
5
+ class Upload
6
+ include ConnectionPool
7
+
8
+ def initialize(dest_path)
9
+ @dest_path = dest_path
10
+ end
11
+
12
+ def upload(src_path, content_type: nil, filename: nil)
13
+ # check src_path
14
+ unless File.file?(src_path)
15
+ raise Errno::ENOENT, "No such file - #{src_path}"
16
+ end
17
+
18
+ # check content_type
19
+ unless content_type
20
+ mime_type = MIME::Types.type_for(src_path).first
21
+ if mime_type
22
+ content_type = mime_type.to_s
23
+ else
24
+ content_type = 'application/octet-stream'
25
+ end
26
+ end
27
+
28
+ # multipart connection
29
+ res = multipart_connection.post do |req|
30
+ req.url "/files"
31
+ req.params = {
32
+ path: @dest_path,
33
+ }
34
+ req.body = {
35
+ file: Faraday::UploadIO.new(src_path, content_type, filename)
36
+ }
37
+ end
38
+
39
+ BitcasaFile.new(res.body.first)
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,3 @@
1
+ module MyBitcasa
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,21 @@
1
+ require 'my_bitcasa/download'
2
+ require 'json'
3
+
4
+ module MyBitcasa
5
+ class ZipDownload < Download
6
+ def initialize(paths)
7
+ @path = "/download/File from My Drive.zip"
8
+ @params = {}
9
+ @body = {
10
+ selection: JSON.generate({
11
+ paths: paths,
12
+ albums: {},
13
+ artists: [],
14
+ photo_albums: [],
15
+ }),
16
+ }
17
+ @basename = "File from My Drive.zip"
18
+ @req_class = Net::HTTP::Post
19
+ end
20
+ end
21
+ end
data/lib/my_bitcasa.rb ADDED
@@ -0,0 +1,38 @@
1
+ # connection
2
+ require 'my_bitcasa/connection'
3
+ require 'my_bitcasa/connection_pool'
4
+ require 'my_bitcasa/login_engine'
5
+
6
+ # api
7
+ require 'my_bitcasa/profile'
8
+ require 'my_bitcasa/directory'
9
+ require 'my_bitcasa/list'
10
+ require 'my_bitcasa/download'
11
+ require 'my_bitcasa/zip_download'
12
+ require 'my_bitcasa/thumbnail'
13
+ require 'my_bitcasa/legacy_thumbnail'
14
+ require 'my_bitcasa/upload'
15
+ require 'my_bitcasa/mkdir'
16
+ require 'my_bitcasa/rename'
17
+ require 'my_bitcasa/delete'
18
+ require 'my_bitcasa/share'
19
+
20
+ # model
21
+ require 'my_bitcasa/data_accessor'
22
+ require 'my_bitcasa/bitcasa_base'
23
+ require 'my_bitcasa/bitcasa_item'
24
+ require 'my_bitcasa/bitcasa_drive'
25
+ require 'my_bitcasa/bitcasa_folder'
26
+ require 'my_bitcasa/bitcasa_file'
27
+ require 'my_bitcasa/bitcasa_share'
28
+
29
+ # error
30
+ require 'my_bitcasa/error'
31
+ require 'my_bitcasa/connection_error'
32
+ require 'my_bitcasa/authorization_error'
33
+ require 'my_bitcasa/response_format_error'
34
+ require 'my_bitcasa/api_error'
35
+
36
+ module MyBitcasa
37
+ include ConnectionPool
38
+ end
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'my_bitcasa/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "my_bitcasa"
8
+ spec.version = MyBitcasa::VERSION
9
+ spec.authors = ["Yoshida Tetsuya"]
10
+ spec.email = ["yoshida.eth0@gmail.com"]
11
+ spec.description = %q{MyBitcasa is an unofficial Bitcasa SDK.}
12
+ spec.summary = %q{MyBitcasa is an unofficial Bitcasa SDK.}
13
+ spec.homepage = "https://github.com/yoshida-eth0/ruby-my_bitcasa"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "active_support"
24
+ spec.add_development_dependency "faraday"
25
+ spec.add_development_dependency "faraday_middleware"
26
+ spec.add_development_dependency "phantomjs"
27
+ spec.add_development_dependency "mime-types"
28
+ end
metadata ADDED
@@ -0,0 +1,198 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: my_bitcasa
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Yoshida Tetsuya
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-11-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: active_support
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: faraday
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: faraday_middleware
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: phantomjs
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: mime-types
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ description: MyBitcasa is an unofficial Bitcasa SDK.
112
+ email:
113
+ - yoshida.eth0@gmail.com
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - .gitignore
119
+ - Gemfile
120
+ - LICENSE.txt
121
+ - README.md
122
+ - Rakefile
123
+ - example/delete.rb
124
+ - example/directory.rb
125
+ - example/download_photo_legacy_thumbs.rb
126
+ - example/download_photo_thumbs.rb
127
+ - example/download_photos.rb
128
+ - example/list.rb
129
+ - example/login.rb
130
+ - example/mkdir.rb
131
+ - example/recursive_directory.rb
132
+ - example/rename.rb
133
+ - example/setting.yml.example
134
+ - example/share.rb
135
+ - example/upload.rb
136
+ - example/zip_download_photos.rb
137
+ - lib/my_bitcasa.rb
138
+ - lib/my_bitcasa/api_error.rb
139
+ - lib/my_bitcasa/authorization_error.rb
140
+ - lib/my_bitcasa/bitcasa_base.rb
141
+ - lib/my_bitcasa/bitcasa_drive.rb
142
+ - lib/my_bitcasa/bitcasa_file.rb
143
+ - lib/my_bitcasa/bitcasa_folder.rb
144
+ - lib/my_bitcasa/bitcasa_item.rb
145
+ - lib/my_bitcasa/bitcasa_share.rb
146
+ - lib/my_bitcasa/connection.rb
147
+ - lib/my_bitcasa/connection_error.rb
148
+ - lib/my_bitcasa/connection_finalizer.rb
149
+ - lib/my_bitcasa/connection_pool.rb
150
+ - lib/my_bitcasa/data_accessor.rb
151
+ - lib/my_bitcasa/delete.rb
152
+ - lib/my_bitcasa/directory.rb
153
+ - lib/my_bitcasa/download.rb
154
+ - lib/my_bitcasa/downloadable.rb
155
+ - lib/my_bitcasa/error.rb
156
+ - lib/my_bitcasa/legacy_thumbnail.rb
157
+ - lib/my_bitcasa/list.rb
158
+ - lib/my_bitcasa/login_engine.rb
159
+ - lib/my_bitcasa/login_engine/phantomjs.rb
160
+ - lib/my_bitcasa/login_engine/phantomjs_login.js
161
+ - lib/my_bitcasa/login_engine/pure.rb
162
+ - lib/my_bitcasa/login_engine/selenium.rb
163
+ - lib/my_bitcasa/mkdir.rb
164
+ - lib/my_bitcasa/profile.rb
165
+ - lib/my_bitcasa/rename.rb
166
+ - lib/my_bitcasa/response_format_error.rb
167
+ - lib/my_bitcasa/response_middleware.rb
168
+ - lib/my_bitcasa/share.rb
169
+ - lib/my_bitcasa/thumbnail.rb
170
+ - lib/my_bitcasa/upload.rb
171
+ - lib/my_bitcasa/version.rb
172
+ - lib/my_bitcasa/zip_download.rb
173
+ - my_bitcasa.gemspec
174
+ homepage: https://github.com/yoshida-eth0/ruby-my_bitcasa
175
+ licenses:
176
+ - MIT
177
+ metadata: {}
178
+ post_install_message:
179
+ rdoc_options: []
180
+ require_paths:
181
+ - lib
182
+ required_ruby_version: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - '>='
185
+ - !ruby/object:Gem::Version
186
+ version: '0'
187
+ required_rubygems_version: !ruby/object:Gem::Requirement
188
+ requirements:
189
+ - - '>='
190
+ - !ruby/object:Gem::Version
191
+ version: '0'
192
+ requirements: []
193
+ rubyforge_project:
194
+ rubygems_version: 2.0.2
195
+ signing_key:
196
+ specification_version: 4
197
+ summary: MyBitcasa is an unofficial Bitcasa SDK.
198
+ test_files: []