cloudapp 0.0.12 → 0.0.13

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/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- cloudapp (0.0.12)
4
+ cloudapp (0.0.13)
5
5
  addressable
6
6
  faraday (~> 0.8.0.rc2)
7
7
  gli
data/bin/cloudapp CHANGED
@@ -35,6 +35,11 @@ def save_identity(email, password)
35
35
  end
36
36
  end
37
37
 
38
+ def clear_identity
39
+ return unless File.exist?(config_file)
40
+ File.delete(config_file)
41
+ end
42
+
38
43
  def color(*args)
39
44
  HighLine.new.color *args
40
45
  end
@@ -159,7 +164,7 @@ command [:list, :ls] do |c|
159
164
  check_for_credentials
160
165
 
161
166
  count = options[:count].to_i
162
- columns = { name: 'Name', url: 'Link', view_counter: 'Views' }
167
+ columns = { display_name: 'Name', url: 'Link', view_counter: 'Views' }
163
168
  format = format_from global_options
164
169
 
165
170
  CloudApp::DropPresenter.print(on: $stdout,
@@ -170,4 +175,14 @@ command [:list, :ls] do |c|
170
175
  end
171
176
  end
172
177
 
178
+ on_error do |e|
179
+ if CloudApp::DropService::UNAUTHORIZED === e
180
+ $stderr.puts color('Email and password given are incorrect.', :bold)
181
+ clear_identity
182
+ false
183
+ else
184
+ true
185
+ end
186
+ end
187
+
173
188
  exit GLI.run(ARGV)
data/cloudapp.gemspec CHANGED
@@ -13,7 +13,7 @@ Gem::Specification.new do |s|
13
13
  ## If your rubyforge_project name is different, then edit it and comment out
14
14
  ## the sub! line in the Rakefile
15
15
  s.name = 'cloudapp'
16
- s.version = '0.0.12'
16
+ s.version = '0.0.13'
17
17
  s.date = '2012-02-10'
18
18
  s.rubyforge_project = 'cloudapp'
19
19
 
@@ -80,12 +80,15 @@ Gem::Specification.new do |s|
80
80
  man/cloudapp.1.html
81
81
  man/cloudapp.1.ronn
82
82
  spec/cassettes/DropService/create_bookmark.yml
83
+ spec/cassettes/DropService/create_bookmark_with_bad_credentials.yml
83
84
  spec/cassettes/DropService/create_bookmark_with_name.yml
84
85
  spec/cassettes/DropService/create_private_bookmark.yml
85
86
  spec/cassettes/DropService/create_public_bookmark.yml
86
87
  spec/cassettes/DropService/list_drops.yml
88
+ spec/cassettes/DropService/list_drops_with_bad_credentials.yml
87
89
  spec/cassettes/DropService/list_drops_with_limit.yml
88
90
  spec/cassettes/DropService/list_trash.yml
91
+ spec/cassettes/DropService/list_trash_with_bad_credentials.yml
89
92
  spec/cassettes/DropService/upload_file.yml
90
93
  spec/cassettes/DropService/upload_public_file.yml
91
94
  spec/cloudapp/drop_presenter_spec.rb
data/lib/cloudapp/drop.rb CHANGED
@@ -3,5 +3,9 @@ module CloudApp
3
3
  class Drop < OpenStruct
4
4
  def private?() private == true end
5
5
  def public? () !private? end
6
+
7
+ def display_name
8
+ name || redirect_url || url
9
+ end
6
10
  end
7
11
  end
@@ -39,6 +39,10 @@ require 'cloudapp/drop'
39
39
  #
40
40
  module CloudApp
41
41
  class DropService
42
+
43
+ # Rased when given credentials are incorrect.
44
+ class UNAUTHORIZED < StandardError; end
45
+
42
46
  Leadlight.build_connection_common do |c|
43
47
  c.request :multipart
44
48
  c.request :url_encoded
@@ -117,12 +121,16 @@ module CloudApp
117
121
  root.paginated_drops(per_page: count)['items'].map do |drop_data|
118
122
  Drop.new drop_data
119
123
  end
124
+ rescue MultiJson::DecodeError => e
125
+ raise UNAUTHORIZED
120
126
  end
121
127
 
122
128
  def trash(count = 20)
123
129
  root.paginated_trash(per_page: count)['items'].map do |drop_data|
124
130
  Drop.new drop_data
125
131
  end
132
+ rescue MultiJson::DecodeError => e
133
+ raise UNAUTHORIZED
126
134
  end
127
135
 
128
136
  def create(attributes)
@@ -136,6 +144,8 @@ module CloudApp
136
144
  else
137
145
  create_bookmark options
138
146
  end
147
+ rescue MultiJson::DecodeError => e
148
+ raise UNAUTHORIZED
139
149
  end
140
150
 
141
151
  protected
data/lib/cloudapp.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module CloudApp
2
- VERSION = '0.0.12'
2
+ VERSION = '0.0.13'
3
3
  end
@@ -0,0 +1,47 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: http://ford%40prefect:earthling@my.cl.ly/
6
+ body: ''
7
+ headers:
8
+ Accept:
9
+ - application/json, text/x-yaml, application/xml, application/xhtml+xml, text/html,
10
+ text/plain
11
+ response:
12
+ status:
13
+ code: 401
14
+ message: Unauthorized
15
+ headers:
16
+ Cache-Control:
17
+ - no-cache
18
+ - no-cache
19
+ Content-Type:
20
+ - application/json; charset=utf-8
21
+ - application/json; charset=utf-8
22
+ Server:
23
+ - thin 1.2.11 codename Bat-Shit Crazy
24
+ - thin 1.2.11 codename Bat-Shit Crazy
25
+ Www-Authenticate:
26
+ - Digest realm="Application", qop="auth", algorithm=MD5, nonce="MTMyODkwOTU2MDplMzk2NTJkOWFkMTllYzljODkyNGQ5Yjc2MmRiN2I5Mg==",
27
+ opaque="9eb56ccb2e8b017ae42bdb4739690863"
28
+ - Digest realm="Application", qop="auth", algorithm=MD5, nonce="MTMyODkwOTU2MDplMzk2NTJkOWFkMTllYzljODkyNGQ5Yjc2MmRiN2I5Mg==",
29
+ opaque="9eb56ccb2e8b017ae42bdb4739690863"
30
+ X-Runtime:
31
+ - '0.004544'
32
+ - '0.009808'
33
+ X-Ua-Compatible:
34
+ - IE=Edge,chrome=1
35
+ - IE=Edge,chrome=1
36
+ Transfer-Encoding:
37
+ - chunked
38
+ - chunked
39
+ Connection:
40
+ - keep-alive
41
+ - keep-alive
42
+ body: ! 'HTTP Digest: Access denied.
43
+
44
+ '
45
+ http_version:
46
+ recorded_at: Fri, 10 Feb 2012 21:32:40 GMT
47
+ recorded_with: VCR 2.0.0.rc1
@@ -0,0 +1,47 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: http://ford%40prefect:earthling@my.cl.ly/
6
+ body: ''
7
+ headers:
8
+ Accept:
9
+ - application/json, text/x-yaml, application/xml, application/xhtml+xml, text/html,
10
+ text/plain
11
+ response:
12
+ status:
13
+ code: 401
14
+ message: Unauthorized
15
+ headers:
16
+ Cache-Control:
17
+ - no-cache
18
+ - no-cache
19
+ Content-Type:
20
+ - application/json; charset=utf-8
21
+ - application/json; charset=utf-8
22
+ Server:
23
+ - thin 1.2.11 codename Bat-Shit Crazy
24
+ - thin 1.2.11 codename Bat-Shit Crazy
25
+ Www-Authenticate:
26
+ - Digest realm="Application", qop="auth", algorithm=MD5, nonce="MTMyODkwOTA5MjpmNDRhMjMzYzU1OThmMzRjNWNhYzE3MjJkODEyODQwYQ==",
27
+ opaque="9eb56ccb2e8b017ae42bdb4739690863"
28
+ - Digest realm="Application", qop="auth", algorithm=MD5, nonce="MTMyODkwOTA5MjpmNDRhMjMzYzU1OThmMzRjNWNhYzE3MjJkODEyODQwYQ==",
29
+ opaque="9eb56ccb2e8b017ae42bdb4739690863"
30
+ X-Runtime:
31
+ - '0.009479'
32
+ - '0.026132'
33
+ X-Ua-Compatible:
34
+ - IE=Edge,chrome=1
35
+ - IE=Edge,chrome=1
36
+ Transfer-Encoding:
37
+ - chunked
38
+ - chunked
39
+ Connection:
40
+ - keep-alive
41
+ - keep-alive
42
+ body: ! 'HTTP Digest: Access denied.
43
+
44
+ '
45
+ http_version:
46
+ recorded_at: Fri, 10 Feb 2012 21:24:52 GMT
47
+ recorded_with: VCR 2.0.0.rc1
@@ -0,0 +1,48 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: http://ford%40prefect:earthling@my.cl.ly/
6
+ body: ''
7
+ headers:
8
+ Accept:
9
+ - application/json, text/x-yaml, application/xml, application/xhtml+xml, text/html,
10
+ text/plain
11
+ response:
12
+ status:
13
+ code: 401
14
+ message: Unauthorized
15
+ headers:
16
+ Cache-Control:
17
+ - no-cache
18
+ - no-cache
19
+ Content-Type:
20
+ - application/json; charset=utf-8
21
+ - application/json; charset=utf-8
22
+ Server:
23
+ - thin 1.2.11 codename Bat-Shit Crazy
24
+ - thin 1.2.11 codename Bat-Shit Crazy
25
+ Www-Authenticate:
26
+ - Digest realm="Application", qop="auth", algorithm=MD5, nonce="MTMyODkwOTUxMzo2OWY2MWQ1YjlmNmMwYzhkNGE0YjhiNDgwZWEyNDM2Ng==",
27
+ opaque="9eb56ccb2e8b017ae42bdb4739690863"
28
+ - Digest realm="Application", qop="auth", algorithm=MD5, nonce="MTMyODkwOTUxMzo2OWY2MWQ1YjlmNmMwYzhkNGE0YjhiNDgwZWEyNDM2Ng==",
29
+ opaque="9eb56ccb2e8b017ae42bdb4739690863"
30
+ X-Runtime:
31
+ - '0.001479'
32
+ - '0.006534'
33
+ X-Ua-Compatible:
34
+ - IE=Edge,chrome=1
35
+ - IE=Edge,chrome=1
36
+ Content-Length:
37
+ - '28'
38
+ Connection:
39
+ - keep-alive
40
+ - keep-alive
41
+ Transfer-Encoding:
42
+ - chunked
43
+ body: ! 'HTTP Digest: Access denied.
44
+
45
+ '
46
+ http_version:
47
+ recorded_at: Fri, 10 Feb 2012 21:31:53 GMT
48
+ recorded_with: VCR 2.0.0.rc1
@@ -193,4 +193,48 @@ describe CloudApp::DropService do
193
193
  describe '#restore' do
194
194
  it 'restores a drop from the trash'
195
195
  end
196
+
197
+ describe 'with bad authentication' do
198
+ let(:identity) { stub email: 'ford@prefect', password: 'earthling' }
199
+ let(:service) { CloudApp::DropService.as_identity identity, service_options }
200
+
201
+ describe '#drops' do
202
+ subject do
203
+ VCR.use_cassette 'DropService/list_drops_with_bad_credentials' do
204
+ service.drops
205
+ end
206
+ end
207
+
208
+ it 'raises an unauthorized error' do
209
+ lambda { subject }.
210
+ should raise_error(CloudApp::DropService::UNAUTHORIZED)
211
+ end
212
+ end
213
+
214
+ describe '#trash' do
215
+ subject do
216
+ VCR.use_cassette 'DropService/list_trash_with_bad_credentials' do
217
+ service.trash
218
+ end
219
+ end
220
+
221
+ it 'raises an unauthorized error' do
222
+ lambda { subject }.
223
+ should raise_error(CloudApp::DropService::UNAUTHORIZED)
224
+ end
225
+ end
226
+
227
+ describe '#create' do
228
+ subject do
229
+ VCR.use_cassette 'DropService/create_bookmark_with_bad_credentials' do
230
+ service.create url: 'http://getcloudapp.com'
231
+ end
232
+ end
233
+
234
+ it 'raises an unauthorized error' do
235
+ lambda { subject }.
236
+ should raise_error(CloudApp::DropService::UNAUTHORIZED)
237
+ end
238
+ end
239
+ end
196
240
  end
@@ -3,6 +3,35 @@ require 'helper'
3
3
  require 'cloudapp/drop'
4
4
 
5
5
  describe CloudApp::Drop do
6
+ describe '#display_name' do
7
+ describe 'a drop with a name' do
8
+ let(:name) { stub :name }
9
+ subject { CloudApp::Drop.new name: name }
10
+
11
+ it 'is its name' do
12
+ subject.display_name.should eq(name)
13
+ end
14
+ end
15
+
16
+ describe 'a drop with a redirect url and no a name' do
17
+ let(:redirect_url) { stub :redirect_url }
18
+ subject { CloudApp::Drop.new redirect_url: redirect_url }
19
+
20
+ it 'is its redirect url' do
21
+ subject.display_name.should eq(redirect_url)
22
+ end
23
+ end
24
+
25
+ describe 'a drop with no redirect url and name' do
26
+ let(:url) { stub :url }
27
+ subject { CloudApp::Drop.new url: url }
28
+
29
+ it 'is its remote url' do
30
+ subject.display_name.should eq(url)
31
+ end
32
+ end
33
+ end
34
+
6
35
  describe '#private?' do
7
36
  describe 'a private drop' do
8
37
  subject { CloudApp::Drop.new private: true }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cloudapp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.12
4
+ version: 0.0.13
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2012-02-10 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: addressable
16
- requirement: &70172752917860 !ruby/object:Gem::Requirement
16
+ requirement: &70141400566320 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70172752917860
24
+ version_requirements: *70141400566320
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: faraday
27
- requirement: &70172752917320 !ruby/object:Gem::Requirement
27
+ requirement: &70141400565780 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 0.8.0.rc2
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70172752917320
35
+ version_requirements: *70141400565780
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: gli
38
- requirement: &70172752916840 !ruby/object:Gem::Requirement
38
+ requirement: &70141400565300 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70172752916840
46
+ version_requirements: *70141400565300
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: highline
49
- requirement: &70172752916360 !ruby/object:Gem::Requirement
49
+ requirement: &70141400564720 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *70172752916360
57
+ version_requirements: *70141400564720
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: leadlight
60
- requirement: &70172752915680 !ruby/object:Gem::Requirement
60
+ requirement: &70141400564140 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *70172752915680
68
+ version_requirements: *70141400564140
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: typhoeus
71
- requirement: &70172752915080 !ruby/object:Gem::Requirement
71
+ requirement: &70141400563500 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '0'
77
77
  type: :runtime
78
78
  prerelease: false
79
- version_requirements: *70172752915080
79
+ version_requirements: *70141400563500
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: rake
82
- requirement: &70172752914500 !ruby/object:Gem::Requirement
82
+ requirement: &70141400562960 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '0'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *70172752914500
90
+ version_requirements: *70141400562960
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: ronn
93
- requirement: &70172752914080 !ruby/object:Gem::Requirement
93
+ requirement: &70141400562520 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ! '>='
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: '0'
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *70172752914080
101
+ version_requirements: *70141400562520
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: rspec
104
- requirement: &70172752913640 !ruby/object:Gem::Requirement
104
+ requirement: &70141400562000 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ! '>='
@@ -109,10 +109,10 @@ dependencies:
109
109
  version: '0'
110
110
  type: :development
111
111
  prerelease: false
112
- version_requirements: *70172752913640
112
+ version_requirements: *70141400562000
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: vcr
115
- requirement: &70172752912680 !ruby/object:Gem::Requirement
115
+ requirement: &70141400560980 !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
118
118
  - - ~>
@@ -120,10 +120,10 @@ dependencies:
120
120
  version: 2.0.0.rc1
121
121
  type: :development
122
122
  prerelease: false
123
- version_requirements: *70172752912680
123
+ version_requirements: *70141400560980
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: webmock
126
- requirement: &70172752911760 !ruby/object:Gem::Requirement
126
+ requirement: &70141400560100 !ruby/object:Gem::Requirement
127
127
  none: false
128
128
  requirements:
129
129
  - - ! '>='
@@ -131,7 +131,7 @@ dependencies:
131
131
  version: '0'
132
132
  type: :development
133
133
  prerelease: false
134
- version_requirements: *70172752911760
134
+ version_requirements: *70141400560100
135
135
  description: Experience all the pleasures of sharing with CloudApp now in your terminal.
136
136
  email: larry@marburger.cc
137
137
  executables:
@@ -158,12 +158,15 @@ files:
158
158
  - man/cloudapp.1.html
159
159
  - man/cloudapp.1.ronn
160
160
  - spec/cassettes/DropService/create_bookmark.yml
161
+ - spec/cassettes/DropService/create_bookmark_with_bad_credentials.yml
161
162
  - spec/cassettes/DropService/create_bookmark_with_name.yml
162
163
  - spec/cassettes/DropService/create_private_bookmark.yml
163
164
  - spec/cassettes/DropService/create_public_bookmark.yml
164
165
  - spec/cassettes/DropService/list_drops.yml
166
+ - spec/cassettes/DropService/list_drops_with_bad_credentials.yml
165
167
  - spec/cassettes/DropService/list_drops_with_limit.yml
166
168
  - spec/cassettes/DropService/list_trash.yml
169
+ - spec/cassettes/DropService/list_trash_with_bad_credentials.yml
167
170
  - spec/cassettes/DropService/upload_file.yml
168
171
  - spec/cassettes/DropService/upload_public_file.yml
169
172
  - spec/cloudapp/drop_presenter_spec.rb