cloudapp 0.0.12 → 0.0.13

Sign up to get free protection for your applications and to get access to all the features.
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