ruby-box 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.
data/spec/file_spec.rb ADDED
@@ -0,0 +1,95 @@
1
+ #encoding: UTF-8
2
+
3
+ require 'helper/account'
4
+ require 'ruby-box'
5
+ require 'webmock/rspec'
6
+
7
+ describe RubyBox::File do
8
+
9
+ before do
10
+ @session = RubyBox::Session.new
11
+ @full_file = JSON.parse('{ "type": "file", "id": "5000948880", "sequence_id": "3", "etag": "3", "sha1": "134b65991ed521fcfe4724b7d814ab8ded5185dc", "name": "tigers.jpeg", "description": "a picture of tigers", "size": 629644, "path_collection": { "total_count": 2, "entries": [ { "type": "folder", "id": "0", "sequence_id": null, "etag": null, "name": "All Files" }, { "type": "folder", "id": "11446498", "sequence_id": "1", "etag": "1", "name": "Pictures" } ] }, "created_at": "2012-12-12T10:55:30-08:00", "modified_at": "2012-12-12T11:04:26-08:00", "trashed_at": null, "purged_at": null, "content_created_at": "2013-02-04T16:57:52-08:00", "content_modified_at": "2013-02-04T16:57:52-08:00", "created_by": { "type": "user", "id": "17738362", "name": "sean rose", "login": "sean@box.com" }, "modified_by": { "type": "user", "id": "17738362", "name": "sean rose", "login": "sean@box.com" }, "owned_by": { "type": "user", "id": "17738362", "name": "sean rose", "login": "sean@box.com" }, "shared_link": { "url": "https://www.box.com/s/rh935iit6ewrmw0unyul", "download_url": "https://www.box.com/shared/static/rh935iit6ewrmw0unyul.jpeg", "vanity_url": null, "is_password_enabled": false, "unshared_at": null, "download_count": 0, "preview_count": 0, "access": "open", "permissions": { "can_download": true, "can_preview": true } }, "parent": { "type": "folder", "id": "11446498", "sequence_id": "1", "etag": "1", "name": "Pictures" }, "item_status": "active"}')
12
+ @mini_file = JSON.parse('{ "sequence_id": "0", "type": "file", "id": "2631999573", "name":"IMG_1312.JPG"}')
13
+ @comments = JSON.parse('{ "total_count": 1, "entries": [ { "type": "comment", "id": "191969", "is_reply_comment": false, "message": "These tigers are cool!", "created_by": { "type": "user", "id": "17738362", "name": "sean rose", "login": "sean@box.com" }, "created_at": "2012-12-12T11:25:01-08:00", "item": { "id": "5000948880", "type": "file" }, "modified_at": "2012-12-12T11:25:01-08:00" } ]}')
14
+ end
15
+
16
+ it "should use missing_method to expose files fields" do
17
+ file = RubyBox::File.new(@session, @mini_file)
18
+ file.id.should == '2631999573'
19
+ end
20
+
21
+ it "should load all meta information if reload_meta is called" do
22
+ # request is called once when reload_meta is automatically executed.
23
+ RubyBox::Session.any_instance.should_receive(:request).once.and_return(@full_file)
24
+ session = RubyBox::Session.new
25
+
26
+ file = RubyBox::File.new(session, @mini_file)
27
+ file.size.should == 629644
28
+ end
29
+
30
+ describe '#parent' do
31
+ it 'should return parent folder' do
32
+ session = RubyBox::Session.new
33
+ file = RubyBox::File.new(session, @full_file)
34
+ file.parent.name.should == 'Pictures'
35
+ end
36
+
37
+ it 'should reload_meta data if necessary before loading parent' do
38
+ RubyBox::Session.any_instance.stub(:request).and_return(@full_file)
39
+ session = RubyBox::Session.new
40
+ file = RubyBox::File.new(session, @mini_file)
41
+ file.parent.name.should == 'Pictures'
42
+ end
43
+ end
44
+
45
+ describe '#update' do
46
+ it 'should update files raw_item hash if name or description changed' do
47
+ RubyBox::Session.any_instance.stub(:request).and_return(@full_file)
48
+ session = RubyBox::Session.new
49
+ file = RubyBox::File.new(session, @mini_file)
50
+ file.name = 'Funky Monkey.jpg'
51
+ file.description = 'a new description'
52
+ file.name.should == 'Funky Monkey.jpg'
53
+ file.description.should == 'a new description'
54
+ end
55
+
56
+ it 'should not update files raw_item hash for keys not in update_fields' do
57
+ RubyBox::Session.any_instance.stub(:request).and_return(@full_file)
58
+ session = RubyBox::Session.new
59
+ file = RubyBox::File.new(session, @mini_file)
60
+ file.id = '000'
61
+ file.id.should == '2631999573'
62
+ end
63
+
64
+ it 'should make request with appropriate update hash when update called' do
65
+ RubyBox::Session.any_instance.stub(:request) do |uri, request|
66
+ data = JSON.parse(request.body)
67
+ data['description'].should == 'a new description'
68
+ end
69
+ session = RubyBox::Session.new
70
+ file = RubyBox::File.new(session, @full_file)
71
+ file.description = 'a new description'
72
+ file.update
73
+ end
74
+ end
75
+
76
+ describe '#put_data' do
77
+ it "should load full meta information if etag not present" do
78
+ RubyBox::Session.any_instance.should_receive(:request).twice.and_return(@full_file)
79
+ session = RubyBox::Session.new
80
+ file = RubyBox::File.new(session, @mini_file)
81
+ file.stub(:prepare_upload).and_return('fake data')
82
+ file.update_content('data')
83
+ end
84
+ end
85
+
86
+ describe '#comments' do
87
+ it 'should return an array of comment objects' do
88
+ RubyBox::Session.any_instance.stub(:request).and_return(@comments)
89
+ session = RubyBox::Session.new
90
+ file = RubyBox::File.new(session, @mini_file)
91
+ file.comments.first.message.should == 'These tigers are cool!'
92
+ end
93
+ end
94
+
95
+ end
@@ -0,0 +1,101 @@
1
+ #encoding: UTF-8
2
+
3
+ require 'helper/account'
4
+ require 'ruby-box'
5
+ require 'webmock/rspec'
6
+
7
+ describe RubyBox::Folder do
8
+ before do
9
+ @session = RubyBox::Session.new
10
+ @full_folder = JSON.parse('{ "type": "folder", "id": "11446498", "sequence_id": "1", "etag": "1", "name": "Pictures", "created_at": "2012-12-12T10:53:43-08:00", "modified_at": "2012-12-12T11:15:04-08:00", "description": "Some pictures I took", "size": 629644, "path_collection": { "total_count": 1, "entries": [ { "type": "folder", "id": "0", "sequence_id": null, "etag": null, "name": "All Files" } ] }, "created_by": { "type": "user", "id": "17738362", "name": "sean rose", "login": "sean@box.com" }, "modified_by": { "type": "user", "id": "17738362", "name": "sean rose", "login": "sean@box.com" }, "owned_by": { "type": "user", "id": "17738362", "name": "sean rose", "login": "sean@box.com" }, "shared_link": { "url": "https://www.box.com/s/vspke7y05sb214wjokpk", "download_url": "https://www.box.com/shared/static/vspke7y05sb214wjokpk", "vanity_url": null, "is_password_enabled": false, "unshared_at": null, "download_count": 0, "preview_count": 0, "access": "open", "permissions": { "can_download": true, "can_preview": true } }, "folder_upload_email": { "access": "open", "email": "upload.Picture.k13sdz1@u.box.com" }, "parent": { "type": "folder", "id": "0", "sequence_id": null, "etag": null, "name": "All Files" }, "item_status": "active", "item_collection": { "total_count": 1, "entries": [ { "type": "file", "id": "5000948880", "sequence_id": "3", "etag": "3", "sha1": "134b65991ed521fcfe4724b7d814ab8ded5185dc", "name": "tigers.jpeg" } ], "offset": 0, "limit": 100 }}')
11
+ @mini_folder = JSON.parse('{ "type":"folder", "id":"301415432", "sequence_id":"0", "name":"my first sub-folder"}')
12
+ @items = [
13
+ JSON.parse('{ "total_count": 4, "entries": [ { "type": "folder", "id": "409047867", "sequence_id": "1", "etag": "1", "name": "Here\'s your folder" }, { "type": "file", "id": "409042867", "sequence_id": "1", "etag": "1", "name": "A choice file" } ], "offset": "0", "limit": "2"}'),
14
+ JSON.parse('{ "total_count": 4, "entries": [ { "type": "folder", "id": "409047868", "sequence_id": "1", "etag": "1", "name": "Here\'s another folder" }, { "type": "file", "id": "409042810", "sequence_id": "1", "etag": "1", "name": "A choice file" } ], "offset": "2", "limit": "2"}')
15
+ ]
16
+ end
17
+
18
+ it "#root returns full root folder object" do
19
+ RubyBox::Session.any_instance.stub(:request).and_return(@full_folder)
20
+ session = RubyBox::Session.new
21
+ root = RubyBox::Client.new(session).root_folder
22
+ root.name.should == 'Pictures'
23
+ end
24
+
25
+ it "returns iso8601 format keys as a time object" do
26
+ RubyBox::Session.any_instance.stub(:request).and_return(@full_folder)
27
+ session = RubyBox::Session.new
28
+ root = RubyBox::Client.new(session).root_folder
29
+ root.created_at.year.should == 2012
30
+ end
31
+
32
+ describe '#items' do
33
+ it "should return a folder object for folder items" do
34
+ item = JSON.parse('{ "id": "0000001", "total_count": 1, "entries": [ { "type": "folder", "id": "409047867", "sequence_id": "1", "etag": "1", "name": "Here\'s your folder" } ], "offset": "0", "limit": "1"}')
35
+ RubyBox::Session.any_instance.stub(:request).and_return(item)
36
+ session = RubyBox::Session.new
37
+ item = RubyBox::Client.new(session).root_folder.items.first
38
+ item.kind_of?(RubyBox::Folder).should == true
39
+ end
40
+
41
+ it "should return a file object for file items" do
42
+ item = JSON.parse('{ "id": "0000001", "total_count": 1, "entries": [ { "type": "file", "id": "409042867", "sequence_id": "1", "etag": "1", "name": "A choice file" } ], "offset": "0", "limit": "1"}')
43
+ RubyBox::Session.any_instance.stub(:request).and_return(item)
44
+ session = RubyBox::Session.new
45
+ item = RubyBox::Client.new(session).root_folder.items.first
46
+ item.kind_of?(RubyBox::File).should == true
47
+ end
48
+
49
+ it "it should return an iterator that lazy loads all entries" do
50
+ RubyBox::Session.any_instance.stub(:request) { @items.pop }
51
+ session = RubyBox::Session.new
52
+ items = RubyBox::Folder.new(session, {'id' => 1}).items(1).to_a
53
+ items[0].kind_of?(RubyBox::Folder).should == true
54
+ items[1].kind_of?(RubyBox::File).should == true
55
+ end
56
+ end
57
+
58
+ describe '#files' do
59
+ it "should only return items of type file" do
60
+ RubyBox::Session.any_instance.stub(:request) { @items.pop }
61
+ session = RubyBox::Session.new
62
+ files = RubyBox::Folder.new(session, {'id' => 1}).files
63
+ files.count.should == 1
64
+ files.first.kind_of?(RubyBox::File).should == true
65
+ end
66
+
67
+ it "should allow you to filter files by name" do
68
+ items = [
69
+ JSON.parse('{ "total_count": 4, "entries": [ { "type": "folder", "id": "409047867", "sequence_id": "1", "etag": "1", "name": "Here\'s your folder" }, { "type": "file", "id": "409042867", "sequence_id": "1", "etag": "1", "name": "A choice file" } ], "offset": "0", "limit": "2"}'),
70
+ JSON.parse('{ "total_count": 4, "entries": [ { "type": "folder", "id": "409047868", "sequence_id": "1", "etag": "1", "name": "Here\'s another folder" }, { "type": "file", "id": "409042810", "sequence_id": "1", "etag": "1", "name": "A choice file" } ], "offset": "2", "limit": "2"}')
71
+ ]
72
+
73
+ RubyBox::Session.any_instance.stub(:request) { items.pop }
74
+ session = RubyBox::Session.new
75
+
76
+ # should return one file.
77
+ files = RubyBox::Folder.new(session, {'id' => 1}).files('A choice file')
78
+ files.count.should == 1
79
+
80
+ items = [
81
+ JSON.parse('{ "total_count": 4, "entries": [ { "type": "folder", "id": "409047867", "sequence_id": "1", "etag": "1", "name": "Here\'s your folder" }, { "type": "file", "id": "409042867", "sequence_id": "1", "etag": "1", "name": "A choice file" } ], "offset": "0", "limit": "2"}'),
82
+ JSON.parse('{ "total_count": 4, "entries": [ { "type": "folder", "id": "409047868", "sequence_id": "1", "etag": "1", "name": "Here\'s another folder" }, { "type": "file", "id": "409042810", "sequence_id": "1", "etag": "1", "name": "A choice file" } ], "offset": "2", "limit": "2"}')
83
+ ]
84
+
85
+ # should return no files.
86
+ files = RubyBox::Folder.new(session, {'id' => 1}).files('foobar')
87
+ files.count.should == 0
88
+ end
89
+
90
+ end
91
+
92
+ describe '#folders' do
93
+ it "should only return items of type folder" do
94
+ RubyBox::Session.any_instance.stub(:request) { @items.pop }
95
+ session = RubyBox::Session.new
96
+ files = RubyBox::Folder.new(session, {'id' => 1}).folders
97
+ files.count.should == 1
98
+ files.first.kind_of?(RubyBox::Folder).should == true
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,3 @@
1
+ ---
2
+ api_key: "YOUR_API_TOKEN"
3
+ auth_token: "YOUR_AUTH_TOKEN"
@@ -0,0 +1,8 @@
1
+ require 'yaml'
2
+
3
+ ACCOUNT = {}
4
+ begin
5
+ ACCOUNT = YAML.load_file(File.dirname(__FILE__) + '/account.yml')
6
+ rescue
7
+ p "create an account.yml file with your credentials to run integration tests."
8
+ end
@@ -0,0 +1,181 @@
1
+ #encoding: UTF-8
2
+
3
+ require 'helper/account'
4
+ require 'ruby-box'
5
+ require 'webmock/rspec'
6
+
7
+ describe RubyBox do
8
+ before do
9
+ next unless ACCOUNT['api_key'] # skip these tests if accout.yml does not exist.
10
+
11
+ WebMock.allow_net_connect!
12
+
13
+ @session = RubyBox::Session.new({
14
+ api_key: ACCOUNT['api_key'],
15
+ auth_token: ACCOUNT['auth_token']
16
+ })
17
+
18
+ @client = RubyBox::Client.new(@session)
19
+ end
20
+
21
+ it "raises an AuthError if not client auth fails" do
22
+ next unless ACCOUNT['api_key'] # skip these tests if accout.yml does not exist.
23
+
24
+ session = RubyBox::Session.new({
25
+ api_key: 'bad-key',
26
+ auth_token: 'bad-token'
27
+ })
28
+
29
+ @bad_client = RubyBox::Client.new(session)
30
+
31
+ lambda {@bad_client.root_folder}.should raise_error( RubyBox::AuthError )
32
+ end
33
+
34
+ it "raises a RequestError if a badly formed request detected by the server" do
35
+ next unless ACCOUNT['api_key'] # skip these tests if accout.yml does not exist.
36
+ stub_request(:get, "https://api.box.com/2.0/folders/0").to_return(:status => 401, :body => '{"type": "error", "status": 401, "message": "baddd req"}', :headers => {})
37
+ lambda {@client.root_folder}.should raise_error( RubyBox::AuthError )
38
+ end
39
+
40
+ it "raises a ServerError if the server raises a 500 error" do
41
+ next unless ACCOUNT['api_key'] # skip these tests if accout.yml does not exist.
42
+ stub_request(:get, "https://api.box.com/2.0/folders/0").to_return(:status => 503, :body => '{"type": "error", "status": 503, "message": "We messed up! - Box.com"}', :headers => {})
43
+ lambda {@client.root_folder}.should raise_error( RubyBox::ServerError )
44
+ end
45
+
46
+ describe RubyBox::Folder do
47
+ describe '#root_folder' do
48
+ it "#items returns a lits of items in the root folder" do
49
+ next unless ACCOUNT['api_key'] # skip these tests if accout.yml does not exist.
50
+ items = @client.root_folder.items.to_a
51
+ items.count.should == 6
52
+ items.any? do |item|
53
+ item.type == "folder" &&
54
+ item.id == "318810303" &&
55
+ item.name == "ruby-box_gem_testing"
56
+ end.should == true
57
+ end
58
+
59
+ it "returns list of items in the folder id passed in" do
60
+ next unless ACCOUNT['api_key'] # skip these tests if accout.yml does not exist.
61
+ folder = RubyBox::Folder.new(@session, {'id' => '318810303'})
62
+ items = folder.items.to_a
63
+ items.count.should == 2
64
+ items.any? do |item|
65
+ item.type == "file" &&
66
+ item.id == "2550686921" &&
67
+ item.name == "2513582219_03fb9b67db_b.jpg"
68
+ end.should == true
69
+ end
70
+ end
71
+
72
+ describe '#file' do
73
+ it "finds the id of a file" do
74
+ next unless ACCOUNT['api_key'] # skip these tests if accout.yml does not exist.
75
+ folder = RubyBox::Folder.new(@session, {'id' => '318810303'})
76
+ file = folder.files( '2513582219_03fb9b67db_b.jpg' ).first
77
+ file.id.should == "2550686921"
78
+ end
79
+ end
80
+
81
+ describe '#create' do
82
+ it "creates a folder" do
83
+ next unless ACCOUNT['api_key'] # skip these tests if accout.yml does not exist.
84
+
85
+ folder = @client.folder('/ruby-box_gem_testing')
86
+ subfolder = folder.create_subfolder( 'new_folder_created' )
87
+ subfolder.id.should_not == nil
88
+
89
+ subfolder.delete
90
+ end
91
+
92
+ it "creates a folder with special chars in the name" do
93
+ next unless ACCOUNT['api_key'] # skip these tests if accout.yml does not exist.
94
+
95
+ folder = @client.folder('/ruby-box_gem_testing')
96
+ subfolder = folder.create_subfolder( '!@#$%^&$$()' )
97
+ subfolder.id.should_not == nil
98
+
99
+ subfolder.delete
100
+ end
101
+ end
102
+
103
+ end
104
+
105
+ describe RubyBox::Client do
106
+
107
+ describe '#put_data' do
108
+ it "should update an existing file" do
109
+ next unless ACCOUNT['api_key'] # skip these tests if accout.yml does not exist.
110
+
111
+ utf8_file_name = '遠志教授.jpg'
112
+ fdata = File.open( 'spec/fixtures/' + utf8_file_name, 'rb' )
113
+ response = @client.upload_data('/ruby-box_gem_testing/cool stuff/遠志教授.jpg', fdata)
114
+ fdata = File.open( 'spec/fixtures/' + utf8_file_name, 'rb' )
115
+
116
+ file = @client.upload_data('/ruby-box_gem_testing/cool stuff/遠志教授.jpg', fdata)
117
+ file.name.should == '遠志教授.jpg'
118
+ file.delete
119
+ end
120
+
121
+ it "should upload a new file" do
122
+ next unless ACCOUNT['api_key'] # skip these tests if accout.yml does not exist.
123
+ utf8_file_name = '遠志教授.jpg'
124
+ file = @client.upload_file('spec/fixtures/' + utf8_file_name, '/ruby-box_gem_testing/cool stuff/')
125
+ file.name.should == '遠志教授.jpg'
126
+ file.delete
127
+ end
128
+ end
129
+
130
+ describe '#create_folder' do
131
+ it "creates a path that doesnt exist" do
132
+ next unless ACCOUNT['api_key'] # skip these tests if accout.yml does not exist.
133
+ folder = @client.create_folder('/ruby-box_gem_testing/cool stuff/екузц/path1/path2')
134
+ folder.id.should_not == nil
135
+ folder.delete if folder
136
+ end
137
+ end
138
+
139
+ describe '#get_file_info' do
140
+ it "returns meta information for a file" do
141
+ next unless ACCOUNT['api_key'] # skip these tests if accout.yml does not exist.
142
+ file = @client.file( '/ruby-box_gem_testing/cool stuff/кузнецкий_105_а_№2.test' )
143
+ file.size.should == 14
144
+ end
145
+ end
146
+
147
+ describe '#stream' do
148
+ it "should download file contents" do
149
+ next unless ACCOUNT['api_key'] # skip these tests if accout.yml does not exist.
150
+ stream = @client.stream( '/ruby-box_gem_testing/cool stuff/кузнецкий_105_а_№2.test' )
151
+ stream.read.should eq "Test more data"
152
+ end
153
+
154
+ it "should execute content_length_proc lambda with filesize" do
155
+ next unless ACCOUNT['api_key'] # skip these tests if accout.yml does not exist.
156
+ stream = @client.stream(
157
+ '/ruby-box_gem_testing/cool stuff/кузнецкий_105_а_№2.test',
158
+ :content_length_proc => lambda {|filesize|
159
+ filesize.should == 14
160
+ }
161
+ )
162
+ stream.read.should eq "Test more data"
163
+ end
164
+ end
165
+
166
+ describe '#download' do
167
+ it "finds the id of a file" do
168
+ next unless ACCOUNT['api_key'] # skip these tests if accout.yml does not exist.
169
+ data = @client.download( '/ruby-box_gem_testing/cool stuff/кузнецкий_105_а_№2.test' )
170
+ data.should eq "Test more data"
171
+ end
172
+
173
+ it "returns nil for a nonexistent file" do
174
+ next unless ACCOUNT['api_key'] # skip these tests if accout.yml does not exist.
175
+ data = @client.download( '/ruby-box_gem_testing/doesntexist' )
176
+ data.should eq nil
177
+ end
178
+ end
179
+ end
180
+ end
181
+
metadata ADDED
@@ -0,0 +1,143 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ruby-box
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Benjamin Coe
8
+ - Jesse Miller
9
+ - Larry Kang
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2013-03-02 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: multipart-post
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 1.1.5
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ~>
27
+ - !ruby/object:Gem::Version
28
+ version: 1.1.5
29
+ - !ruby/object:Gem::Dependency
30
+ name: rspec
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - ! '>='
34
+ - !ruby/object:Gem::Version
35
+ version: '0'
36
+ type: :development
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ! '>='
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ - !ruby/object:Gem::Dependency
44
+ name: bundler
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ! '>='
48
+ - !ruby/object:Gem::Version
49
+ version: '0'
50
+ type: :development
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ! '>='
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
57
+ - !ruby/object:Gem::Dependency
58
+ name: jeweler
59
+ requirement: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ~>
62
+ - !ruby/object:Gem::Version
63
+ version: 1.6.4
64
+ type: :development
65
+ prerelease: false
66
+ version_requirements: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ~>
69
+ - !ruby/object:Gem::Version
70
+ version: 1.6.4
71
+ - !ruby/object:Gem::Dependency
72
+ name: webmock
73
+ requirement: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ type: :development
79
+ prerelease: false
80
+ version_requirements: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ! '>='
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
85
+ description: ruby gem for box.com 2.0 api
86
+ email: ben@attachments.me
87
+ executables: []
88
+ extensions: []
89
+ extra_rdoc_files:
90
+ - LICENSE.txt
91
+ - README.markdown
92
+ files:
93
+ - .document
94
+ - .gitignore
95
+ - Gemfile
96
+ - Gemfile.lock
97
+ - LICENSE.txt
98
+ - README.markdown
99
+ - Rakefile
100
+ - VERSION
101
+ - lib/ruby-box.rb
102
+ - lib/ruby-box/client.rb
103
+ - lib/ruby-box/comment.rb
104
+ - lib/ruby-box/discussion.rb
105
+ - lib/ruby-box/exceptions.rb
106
+ - lib/ruby-box/file.rb
107
+ - lib/ruby-box/folder.rb
108
+ - lib/ruby-box/item.rb
109
+ - lib/ruby-box/session.rb
110
+ - lib/ruby-box/user.rb
111
+ - ruby-box.gemspec
112
+ - spec/client_spec.rb
113
+ - spec/file_spec.rb
114
+ - spec/folder_spec.rb
115
+ - spec/helper/account.example
116
+ - spec/helper/account.rb
117
+ - spec/integration_spec.rb
118
+ homepage: http://github.com/attachmentsme/ruby-box
119
+ licenses:
120
+ - MIT
121
+ metadata: {}
122
+ post_install_message:
123
+ rdoc_options: []
124
+ require_paths:
125
+ - lib
126
+ required_ruby_version: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ! '>='
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ required_rubygems_version: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - ! '>='
134
+ - !ruby/object:Gem::Version
135
+ version: '0'
136
+ requirements: []
137
+ rubyforge_project:
138
+ rubygems_version: 2.0.3
139
+ signing_key:
140
+ specification_version: 3
141
+ summary: ruby gem for box.com 2.0 api
142
+ test_files: []
143
+ has_rdoc: