cloudapp 2.0.0 → 2.1.0.beta.1

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.
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- cloudapp (2.0.0)
4
+ cloudapp (2.1.0.beta.1)
5
5
  clipboard (~> 1.0.1)
6
6
  leadlight (~> 0.1.0)
7
7
  mime-types (~> 1.19)
data/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # CloudApp CLI
2
2
 
3
- Experience all the pleasures of sharing with [CloudApp][] from your terminal.
3
+ Experience all the pleasures of sharing with [CloudApp][] now in your Ruby code
4
+ and terminal.
4
5
 
5
6
  [cloudapp]: http://getcloudapp.com
6
7
 
@@ -17,9 +17,9 @@ def service
17
17
  .on_error(&method(:service_error_handler))
18
18
  end
19
19
 
20
- def token_for_account credentials
20
+ def token_for_account email, password
21
21
  CloudApp::Service
22
- .token_for_account(*credentials, &method(:service_error_handler))
22
+ .token_for_account(email, password, &method(:service_error_handler))
23
23
  end
24
24
 
25
25
  def service_error_handler representation
@@ -29,7 +29,7 @@ def service_error_handler representation
29
29
  message << ' '
30
30
  message << representation.link('upgrade').href
31
31
  end
32
- print_error message
32
+ service_error message
33
33
  end
34
34
  end
35
35
 
@@ -43,24 +43,29 @@ end
43
43
 
44
44
  def authenticate
45
45
  while not valid_token?
46
- credentials = CloudApp::CLI::Prompt.new.ask_for_credentials
47
- token = token_for_account credentials
48
- Credentials.save_token token
46
+ email, password = CloudApp::CLI::Prompt.new.ask_for_credentials
47
+ token = token_for_account email, password
48
+ Credentials.save email, token
49
49
  end
50
50
  end
51
51
 
52
- def fetch_link drop, link_type, copy_link
53
- link = drop.link(link_type)
54
- copy link if copy_link
52
+ def fetch_link drop, options
53
+ link_rel = options.direct_link? ? :embed : :canonical
54
+ link = drop.link(link_rel) || drop.link(:canonical)
55
+ copy link if options.copy_link?
55
56
  $stdout.puts link
56
57
  $stderr.puts link unless $stdout.tty?
57
58
  end
58
59
 
59
60
 
60
61
  def print_error message
62
+ $stderr.puts "! #{wrap(message, 78, ' ')}"
63
+ end
64
+
65
+ def service_error message
61
66
  $stderr.puts
62
67
  $stderr.puts
63
- $stderr.puts "! #{wrap(message, 78, ' ')}"
68
+ print_error message
64
69
  $stderr.puts
65
70
  end
66
71
 
@@ -83,8 +88,7 @@ def print_help io = $stdout
83
88
  cloudapp, version #{CloudApp::VERSION}
84
89
 
85
90
  Usage:
86
- cloudapp bookmark [--direct] [--[no-]copy] <url> [<url>...]
87
- cloudapp upload [--direct] [--[no-]copy] <file> [<file>...]
91
+ cloudapp [--direct] [--[no-]copy] <file_or_url> [<file_or_url>...]
88
92
 
89
93
  EOS
90
94
  end
@@ -98,36 +102,34 @@ def invalid_command
98
102
  exit 1
99
103
  end
100
104
 
101
- def bookmark options
102
- error 'Missing URL to bookmark.' if options.arguments.empty?
103
- authenticate
104
- options.arguments.each do |arg|
105
- $stderr.print "Bookmarking #{arg}... "
106
- error "#{arg} doesn't look like a valid URL" unless arg =~ URI.regexp
107
- bookmark = service.bookmark(arg)
108
- exit 1 unless bookmark
109
- fetch_link bookmark, options.link_type, options.copy_link?
110
- end
105
+ def file_names options, input = $stdin
106
+ stdin_file_names = input.tty? ? [] : input.each_line.map(&:chomp)
107
+ stdin_file_names + options.arguments
111
108
  end
112
109
 
113
- def upload options
114
- error 'Missing file to upload.' if options.arguments.empty?
110
+ def share file_names, options
111
+ invalid_command if file_names.empty?
115
112
  authenticate
116
- options.arguments.each do |arg|
117
- $stderr.print "Uploading #{File.basename(arg)}... "
118
- error "#{arg.inspect} doesn't exist" unless File.exists? arg
119
- upload = service.upload(arg)
120
- exit 1 unless upload
121
- fetch_link upload, options.link_type, options.copy_link?
113
+
114
+ file_names.each do |arg|
115
+ if File.exists? arg
116
+ $stderr.print "Uploading #{File.basename(arg)}... "
117
+ drop = service.upload(arg)
118
+ elsif arg =~ URI.regexp
119
+ $stderr.print "Bookmarking #{arg}... "
120
+ drop = service.bookmark(arg)
121
+ else
122
+ error "#{arg.inspect} isn't a file that exists or a valid URL."
123
+ end
124
+
125
+ exit 1 unless drop
126
+ fetch_link drop, options
122
127
  end
123
128
  end
124
129
 
125
-
126
130
  options = CloudApp::CLI::Options.parse ARGV
127
131
  case options.action
128
- when :help then print_help
129
- when :version then print_version
130
- when :bookmark then bookmark options
131
- when :upload then upload options
132
- else invalid_command
132
+ when :help then print_help
133
+ when :version then print_version
134
+ when :share then share file_names(options), options
133
135
  end
@@ -13,14 +13,14 @@ 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 = '2.0.0'
17
- s.date = '2013-01-07'
16
+ s.version = '2.1.0.beta.1'
17
+ s.date = '2013-01-11'
18
18
  s.rubyforge_project = 'cloudapp'
19
19
 
20
20
  ## Make sure your summary is short. The description may be as long
21
21
  ## as you like.
22
- s.summary = "CloudApp CLI"
23
- s.description = "Experience all the pleasures of sharing with CloudApp now in your terminal."
22
+ s.summary = "CloudApp API wrapper and CLI"
23
+ s.description = "Experience all the pleasures of sharing with CloudApp now in your Ruby code and terminal."
24
24
 
25
25
  ## List the primary authors. If there are a bunch of authors, it's probably
26
26
  ## better to set the email to an email list or something. If you don't have
@@ -1,3 +1,3 @@
1
1
  module CloudApp
2
- VERSION = '2.0.0'
2
+ VERSION = '2.1.0.beta.1'
3
3
  end
@@ -9,41 +9,30 @@ module CloudApp
9
9
  options[:copy_link] = true unless args.delete('--no-copy')
10
10
  options[:help] = args.delete('--help') || args.delete('-h')
11
11
  options[:version] = args.delete('--version')
12
- options[:action] = args.shift unless args.empty?
13
12
  options[:arguments] = args unless args.empty?
14
13
 
15
14
  Options.new options
16
15
  end
17
16
 
18
- attr_accessor :arguments
17
+ attr_reader :arguments
19
18
  def initialize options
20
19
  @copy_link = options.fetch :copy_link, false
21
20
  @direct = options.fetch :direct, false
22
21
  @help = options.fetch :help, false
23
22
  @version = options.fetch :version, false
24
- @action = options.fetch :action, nil
25
23
  @arguments = options.fetch :arguments, []
26
24
  end
27
25
 
28
- def copy_link?
29
- @copy_link
30
- end
31
-
32
- def link_type
33
- @direct && action != :bookmark ? :embed : :canonical
34
- end
26
+ def copy_link?() @copy_link end
27
+ def direct_link?() @direct end
35
28
 
36
29
  def action
37
- if @help or @action == 'help'
30
+ if @help or @arguments.first == 'help'
38
31
  :help
39
32
  elsif @version
40
33
  :version
41
- elsif @action == 'bookmark'
42
- :bookmark
43
- elsif @action == 'upload'
44
- :upload
45
34
  else
46
- :invalid
35
+ :share
47
36
  end
48
37
  end
49
38
  end
@@ -13,7 +13,8 @@ module CloudApp
13
13
  end
14
14
 
15
15
  def link rel
16
- links.find {|link| link.rel == rel.to_s }.href
16
+ link = links.find {|link| link.rel == rel.to_s }
17
+ link && link.href
17
18
  end
18
19
 
19
20
  def data
@@ -1,33 +1,35 @@
1
1
  require 'netrc'
2
2
 
3
3
  class Credentials
4
- attr_reader :netrc
4
+ attr_reader :netrc, :label
5
5
 
6
- def initialize netrc
6
+ def initialize netrc, label
7
7
  @netrc = netrc
8
+ @label = label
8
9
  end
9
10
 
10
- def self.token netrc = Netrc.read
11
- new(netrc).token
11
+ def self.token netrc = Netrc.read, label = CloudApp::Service.url.host
12
+ new(netrc, label).token
12
13
  end
13
14
 
14
- def self.save_token token, netrc = Netrc.read
15
- new(netrc).save_token token
15
+ def self.save login, token, netrc = Netrc.read, label = CloudApp::Service.url.host
16
+ new(netrc, label).save login, token
16
17
  end
17
18
 
18
19
  def token
19
20
  credentials.last
20
21
  end
21
22
 
22
- def save_token token
23
+ def save login, token
24
+ return if login.nil? or login =~ /^\s*$/
23
25
  return if token.nil? or token =~ /^\s*$/
24
- netrc['api.getcloudapp.com'] = [ 'api@getcloudapp.com', token ]
26
+ netrc[label] = [ login, token ]
25
27
  netrc.save
26
28
  end
27
29
 
28
30
  private
29
31
 
30
32
  def credentials
31
- Array netrc['api.getcloudapp.com']
33
+ Array netrc[label]
32
34
  end
33
35
  end
@@ -1,16 +1,13 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "CLOUDAPP" "1" "December 2012" "" ""
4
+ .TH "CLOUDAPP" "1" "January 2013" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBcloudapp\fR \- all the pleasures of cloudapp in a cli
8
8
  .
9
9
  .SH "SYNOPSIS"
10
- \fBcloudapp bookmark\fR [\fB\-\-direct\fR] [\fB\-\-[no\-]copy\fR] \fIurl\fR [\fIurl\fR\.\.\.]
11
- .
12
- .br
13
- \fBcloudapp upload\fR [\fB\-\-direct\fR] [\fB\-\-[no\-]copy\fR] \fIfile\fR [\fIfile\fR\.\.\.]
10
+ \fBcloudapp [\fR\-\-direct\fB] [\fR\-\-[no\-]copy`] \fIfile_or_url\fR [\fIfile_or_url\fR\.\.\.]
14
11
  .
15
12
  .SH "DESCRIPTION"
16
13
  Upload a file or share a bookmark with CloudApp\. The drop\'s share link will be printed to standard output and copied to the system clipboard\. Account credentials are stored in \fB~/\.netrc\fR as defined by \fBftp\fR(1)\.
@@ -43,7 +40,7 @@ Upload a file:
43
40
  .
44
41
  .nf
45
42
 
46
- $ cloudapp upload screenshot\.png
43
+ $ cloudapp screenshot\.png
47
44
  Uploading screenshot\.png\.\.\. http://cl\.ly/image/3U2U2f3B1O0x
48
45
  .
49
46
  .fi
@@ -57,7 +54,7 @@ Upload several files:
57
54
  .
58
55
  .nf
59
56
 
60
- $ cloudapp upload *\.png
57
+ $ cloudapp *\.png
61
58
  Uploading screenshot\-1\.png\.\.\. http://cl\.ly/image/1E1F1k3Q3919
62
59
  Uploading screenshot\-2\.png\.\.\. http://cl\.ly/image/3P1s3p0c3545
63
60
  Uploading screenshot\-3\.png\.\.\. http://cl\.ly/image/0E3k0h353X0w
@@ -67,13 +64,48 @@ Uploading screenshot\-3\.png\.\.\. http://cl\.ly/image/0E3k0h353X0w
67
64
  .IP "" 0
68
65
  .
69
66
  .P
67
+ Upload file names and URLs from standard input:
68
+ .
69
+ .IP "" 4
70
+ .
71
+ .nf
72
+
73
+ $ ls *\.png | cloudapp
74
+ Uploading screenshot\-1\.png\.\.\. http://cl\.ly/image/1E1F1k3Q3919
75
+ Uploading screenshot\-2\.png\.\.\. http://cl\.ly/image/3P1s3p0c3545
76
+ Uploading screenshot\-3\.png\.\.\. http://cl\.ly/image/0E3k0h353X0w
77
+
78
+ $ gifme {1,2,3}\.png | cloudapp \-\-direct
79
+ You now have a handsome animation at /Users/Larry/Desktop/animated\-2013\-01\-11_15h\-59m\-49s\.gif
80
+ Uploading animated\-2013\-01\-11_15h\-59m\-49s\.gif\.\.\. http://cl\.ly/image/373I3q2g1p36
81
+ .
82
+ .fi
83
+ .
84
+ .IP "" 0
85
+ .
86
+ .P
70
87
  Bookmark a URL:
71
88
  .
72
89
  .IP "" 4
73
90
  .
74
91
  .nf
75
92
 
76
- $ cloudapp bookmark http://getcloudapp\.com
93
+ $ cloudapp http://getcloudapp\.com
94
+ Bookmarking http://getcloudapp\.com\.\.\. http://cl\.ly/352T3Z2G0G2S
95
+ .
96
+ .fi
97
+ .
98
+ .IP "" 0
99
+ .
100
+ .P
101
+ Everything at once:
102
+ .
103
+ .IP "" 4
104
+ .
105
+ .nf
106
+
107
+ $ cloudapp screenshot\.png http://getcloudapp\.com
108
+ Uploading screenshot\.png\.\.\. http://cl\.ly/image/3U2U2f3B1O0x
77
109
  Bookmarking http://getcloudapp\.com\.\.\. http://cl\.ly/352T3Z2G0G2S
78
110
  .
79
111
  .fi
@@ -87,7 +119,7 @@ Copy the drop\'s direct link:
87
119
  .
88
120
  .nf
89
121
 
90
- $ cloudapp upload \-\-direct screenshot\.png
122
+ $ cloudapp \-\-direct screenshot\.png
91
123
  Uploading screenshot\.png\.\.\. http://cl\.ly/image/3U2U2f3B1O0x/screenshot\.png
92
124
  .
93
125
  .fi
@@ -101,7 +133,7 @@ Print but don\'t copy the drop\'s link:
101
133
  .
102
134
  .nf
103
135
 
104
- $ cloudapp upload \-\-no\-copy screenshot\.png
136
+ $ cloudapp \-\-no\-copy screenshot\.png
105
137
  Uploading screenshot\.png\.\.\. http://cl\.ly/image/3U2U2f3B1O0x
106
138
  .
107
139
  .fi
@@ -79,8 +79,7 @@
79
79
 
80
80
  <h2 id="SYNOPSIS">SYNOPSIS</h2>
81
81
 
82
- <p><code>cloudapp bookmark</code> [<code>--direct</code>] [<code>--[no-]copy</code>] <var>url</var> [<var>url</var>...]<br />
83
- <code>cloudapp upload</code> [<code>--direct</code>] [<code>--[no-]copy</code>] <var>file</var> [<var>file</var>...]</p>
82
+ <p><code>cloudapp [</code>--direct<code>] [</code>--[no-]copy`] <var>file_or_url</var> [<var>file_or_url</var>...]</p>
84
83
 
85
84
  <h2 id="DESCRIPTION">DESCRIPTION</h2>
86
85
 
@@ -106,40 +105,59 @@ copy.</p></dd>
106
105
 
107
106
  <p>Upload a file:</p>
108
107
 
109
- <pre><code>$ cloudapp upload screenshot.png
108
+ <pre><code>$ cloudapp screenshot.png
110
109
  Uploading screenshot.png... http://cl.ly/image/3U2U2f3B1O0x
111
110
  </code></pre>
112
111
 
113
112
  <p>Upload several files:</p>
114
113
 
115
- <pre><code>$ cloudapp upload *.png
114
+ <pre><code>$ cloudapp *.png
116
115
  Uploading screenshot-1.png... http://cl.ly/image/1E1F1k3Q3919
117
116
  Uploading screenshot-2.png... http://cl.ly/image/3P1s3p0c3545
118
117
  Uploading screenshot-3.png... http://cl.ly/image/0E3k0h353X0w
119
118
  </code></pre>
120
119
 
120
+ <p>Upload file names and URLs from standard input:</p>
121
+
122
+ <pre><code>$ ls *.png | cloudapp
123
+ Uploading screenshot-1.png... http://cl.ly/image/1E1F1k3Q3919
124
+ Uploading screenshot-2.png... http://cl.ly/image/3P1s3p0c3545
125
+ Uploading screenshot-3.png... http://cl.ly/image/0E3k0h353X0w
126
+
127
+ $ gifme {1,2,3}.png | cloudapp --direct
128
+ You now have a handsome animation at /Users/Larry/Desktop/animated-2013-01-11_15h-59m-49s.gif
129
+ Uploading animated-2013-01-11_15h-59m-49s.gif... http://cl.ly/image/373I3q2g1p36
130
+ </code></pre>
131
+
121
132
  <p>Bookmark a URL:</p>
122
133
 
123
- <pre><code>$ cloudapp bookmark http://getcloudapp.com
134
+ <pre><code>$ cloudapp http://getcloudapp.com
135
+ Bookmarking http://getcloudapp.com... http://cl.ly/352T3Z2G0G2S
136
+ </code></pre>
137
+
138
+ <p>Everything at once:</p>
139
+
140
+ <pre><code>$ cloudapp screenshot.png http://getcloudapp.com
141
+ Uploading screenshot.png... http://cl.ly/image/3U2U2f3B1O0x
124
142
  Bookmarking http://getcloudapp.com... http://cl.ly/352T3Z2G0G2S
125
143
  </code></pre>
126
144
 
127
145
  <p>Copy the drop's direct link:</p>
128
146
 
129
- <pre><code>$ cloudapp upload --direct screenshot.png
147
+ <pre><code>$ cloudapp --direct screenshot.png
130
148
  Uploading screenshot.png... http://cl.ly/image/3U2U2f3B1O0x/screenshot.png
131
149
  </code></pre>
132
150
 
133
151
  <p>Print but don't copy the drop's link:</p>
134
152
 
135
- <pre><code>$ cloudapp upload --no-copy screenshot.png
153
+ <pre><code>$ cloudapp --no-copy screenshot.png
136
154
  Uploading screenshot.png... http://cl.ly/image/3U2U2f3B1O0x
137
155
  </code></pre>
138
156
 
139
157
 
140
158
  <ol class='man-decor man-foot man foot'>
141
159
  <li class='tl'></li>
142
- <li class='tc'>December 2012</li>
160
+ <li class='tc'>January 2013</li>
143
161
  <li class='tr'>cloudapp(1)</li>
144
162
  </ol>
145
163
 
@@ -3,8 +3,7 @@ cloudapp(1) -- all the pleasures of cloudapp in a cli
3
3
 
4
4
  ## SYNOPSIS
5
5
 
6
- `cloudapp bookmark` [`--direct`] [`--[no-]copy`] <url> [<url>...]<br>
7
- `cloudapp upload` [`--direct`] [`--[no-]copy`] <file> [<file>...]
6
+ `cloudapp [`--direct`] [`--[no-]copy`] <file_or_url> [<file_or_url>...]
8
7
 
9
8
  ## DESCRIPTION
10
9
 
@@ -34,27 +33,44 @@ credentials are stored in `~/.netrc` as defined by `ftp`(1).
34
33
 
35
34
  Upload a file:
36
35
 
37
- $ cloudapp upload screenshot.png
36
+ $ cloudapp screenshot.png
38
37
  Uploading screenshot.png... http://cl.ly/image/3U2U2f3B1O0x
39
38
 
40
39
  Upload several files:
41
40
 
42
- $ cloudapp upload *.png
41
+ $ cloudapp *.png
43
42
  Uploading screenshot-1.png... http://cl.ly/image/1E1F1k3Q3919
44
43
  Uploading screenshot-2.png... http://cl.ly/image/3P1s3p0c3545
45
44
  Uploading screenshot-3.png... http://cl.ly/image/0E3k0h353X0w
46
45
 
46
+ Upload file names and URLs from standard input:
47
+
48
+ $ ls *.png | cloudapp
49
+ Uploading screenshot-1.png... http://cl.ly/image/1E1F1k3Q3919
50
+ Uploading screenshot-2.png... http://cl.ly/image/3P1s3p0c3545
51
+ Uploading screenshot-3.png... http://cl.ly/image/0E3k0h353X0w
52
+
53
+ $ gifme {1,2,3}.png | cloudapp --direct
54
+ You now have a handsome animation at /Users/Larry/Desktop/animated-2013-01-11_15h-59m-49s.gif
55
+ Uploading animated-2013-01-11_15h-59m-49s.gif... http://cl.ly/image/373I3q2g1p36
56
+
47
57
  Bookmark a URL:
48
58
 
49
- $ cloudapp bookmark http://getcloudapp.com
59
+ $ cloudapp http://getcloudapp.com
60
+ Bookmarking http://getcloudapp.com... http://cl.ly/352T3Z2G0G2S
61
+
62
+ Everything at once:
63
+
64
+ $ cloudapp screenshot.png http://getcloudapp.com
65
+ Uploading screenshot.png... http://cl.ly/image/3U2U2f3B1O0x
50
66
  Bookmarking http://getcloudapp.com... http://cl.ly/352T3Z2G0G2S
51
67
 
52
68
  Copy the drop's direct link:
53
69
 
54
- $ cloudapp upload --direct screenshot.png
70
+ $ cloudapp --direct screenshot.png
55
71
  Uploading screenshot.png... http://cl.ly/image/3U2U2f3B1O0x/screenshot.png
56
72
 
57
73
  Print but don't copy the drop's link:
58
74
 
59
- $ cloudapp upload --no-copy screenshot.png
75
+ $ cloudapp --no-copy screenshot.png
60
76
  Uploading screenshot.png... http://cl.ly/image/3U2U2f3B1O0x
@@ -21,43 +21,28 @@ describe CloudApp::CLI::Options do
21
21
  end
22
22
  end
23
23
 
24
- describe '#link_type' do
25
- subject { described_class.parse(args).link_type }
24
+ describe '#direct_link?' do
25
+ subject { described_class.parse(args).direct_link? }
26
26
 
27
27
  context 'with no args' do
28
28
  let(:args) {[ '' ]}
29
- it { should eq(:canonical) }
29
+ it { should eq(false) }
30
30
  end
31
31
 
32
32
  context 'with --direct' do
33
33
  let(:args) { %w(--direct) }
34
- it { should eq(:embed) }
34
+ it { should eq(true) }
35
35
  end
36
36
 
37
37
  context 'with -d' do
38
38
  let(:args) { %w(-d) }
39
- it { should eq(:embed) }
40
- end
41
-
42
- context 'with --direct when bookmarking' do
43
- let(:args) { %w(bookmark --direct) }
44
- it { should eq(:canonical) }
39
+ it { should eq(true) }
45
40
  end
46
41
  end
47
42
 
48
43
  describe '#action' do
49
44
  subject { described_class.parse(args).action }
50
45
 
51
- context 'with bookmark' do
52
- let(:args) { %w(bookmark) }
53
- it { should eq(:bookmark) }
54
- end
55
-
56
- context 'with upload' do
57
- let(:args) { %w(upload) }
58
- it { should eq(:upload) }
59
- end
60
-
61
46
  context 'with help' do
62
47
  let(:args) { %w(help) }
63
48
  it { should eq(:help) }
@@ -80,12 +65,7 @@ describe CloudApp::CLI::Options do
80
65
 
81
66
  context 'with no args' do
82
67
  let(:args) {[ '' ]}
83
- it { should eq(:invalid) }
84
- end
85
-
86
- context 'with an invalid command' do
87
- let(:args) {[ '' ]}
88
- it { should eq(:invalid) }
68
+ it { should eq(:share) }
89
69
  end
90
70
  end
91
71
 
@@ -93,17 +73,12 @@ describe CloudApp::CLI::Options do
93
73
  subject { described_class.parse(args).arguments }
94
74
 
95
75
  context 'with no args' do
96
- let(:args) {[ '' ]}
97
- it { should be_empty }
98
- end
99
-
100
- context 'with no args when bookmarking' do
101
- let(:args) { %w(bookmark) }
76
+ let(:args) { [] }
102
77
  it { should be_empty }
103
78
  end
104
79
 
105
- context 'with args when bookmarking' do
106
- let(:args) { %w(bookmark one two) }
80
+ context 'with args' do
81
+ let(:args) { %w(one two) }
107
82
  it { should eq(%w(one two)) }
108
83
  end
109
84
  end
@@ -66,6 +66,11 @@ describe CloudApp::CollectionJson::Item do
66
66
  { 'rel' => 'next', 'href' => 'http://next.com' }] }}
67
67
 
68
68
  it { should eq 'http://next.com' }
69
+
70
+ context 'a nonexistent link' do
71
+ subject { described_class.new(data).link('nonexistent') }
72
+ it { should be_nil }
73
+ end
69
74
  end
70
75
 
71
76
  describe '#data' do
@@ -4,18 +4,20 @@ require 'cloudapp/credentials'
4
4
  describe Credentials do
5
5
  describe '.token' do
6
6
  let(:netrc) { stub :netrc, :[] => %w( arthur@dent.com towel ) }
7
- subject { Credentials.token(netrc) }
7
+ let(:label) { stub :label }
8
+ subject { Credentials.token(netrc, label) }
8
9
  it { should eq 'towel' }
9
10
  end
10
11
 
11
12
  describe '#token' do
12
13
  let(:netrc) { stub :netrc, :[] => %w( arthur@dent.com towel ) }
13
- subject { Credentials.new(netrc).token }
14
+ let(:label) { stub :label }
15
+ subject { Credentials.new(netrc, label).token }
14
16
 
15
17
  it { should eq 'towel' }
16
18
 
17
19
  it 'fetches token from netrc' do
18
- netrc.should_receive(:[]).with('api.getcloudapp.com').once
20
+ netrc.should_receive(:[]).with(label).once
19
21
  subject
20
22
  end
21
23
 
@@ -25,38 +27,54 @@ describe Credentials do
25
27
  end
26
28
  end
27
29
 
28
- describe '.save_token' do
30
+ describe '.save' do
29
31
  let(:netrc) { stub :netrc, :[]= => nil }
32
+ let(:label) { stub :label }
30
33
 
31
34
  it 'saves the token' do
32
35
  netrc.should_receive(:save).once.ordered
33
- Credentials.save_token 'new token', netrc
36
+ Credentials.save 'login', 'new token', netrc, label
34
37
  end
35
38
  end
36
39
 
37
- describe '#save_token' do
40
+ describe '#save' do
38
41
  let(:netrc) { stub :netrc }
39
- subject { Credentials.new(netrc) }
42
+ let(:label) { stub :label }
43
+ let(:login) { stub :login }
44
+ subject { Credentials.new(netrc, label) }
40
45
 
41
46
  it 'saves the token' do
42
- credentials = [ 'api@getcloudapp.com', 'new token' ]
43
- netrc.should_receive(:[]=).with('api.getcloudapp.com', credentials)
47
+ credentials = [ 'arthur@dent.com', 'new token' ]
48
+ netrc.should_receive(:[]=).with(label, credentials)
44
49
  .once.ordered
45
50
  netrc.should_receive(:save).once.ordered
46
- subject.save_token 'new token'
51
+ subject.save *credentials
52
+ end
53
+
54
+ it 'ignores a nil login' do
55
+ netrc.should_not_receive(:[]=)
56
+ netrc.should_not_receive(:save)
57
+ subject.save nil, 'new token'
58
+ end
59
+
60
+ it 'ignores an empty login' do
61
+ netrc.should_not_receive(:[]=)
62
+ netrc.should_not_receive(:save)
63
+ subject.save '', 'new token'
64
+ subject.save ' ', 'new token'
47
65
  end
48
66
 
49
67
  it 'ignores a nil token' do
50
68
  netrc.should_not_receive(:[]=)
51
69
  netrc.should_not_receive(:save)
52
- subject.save_token nil
70
+ subject.save login, nil
53
71
  end
54
72
 
55
73
  it 'ignores an empty token' do
56
74
  netrc.should_not_receive(:[]=)
57
75
  netrc.should_not_receive(:save)
58
- subject.save_token ''
59
- subject.save_token ' '
76
+ subject.save login, ''
77
+ subject.save login, ' '
60
78
  end
61
79
  end
62
80
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cloudapp
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
5
- prerelease:
4
+ version: 2.1.0.beta.1
5
+ prerelease: 6
6
6
  platform: ruby
7
7
  authors:
8
8
  - Larry Marburger
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-01-07 00:00:00.000000000 Z
12
+ date: 2013-01-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: clipboard
@@ -139,7 +139,8 @@ dependencies:
139
139
  - - ! '>='
140
140
  - !ruby/object:Gem::Version
141
141
  version: '0'
142
- description: Experience all the pleasures of sharing with CloudApp now in your terminal.
142
+ description: Experience all the pleasures of sharing with CloudApp now in your Ruby
143
+ code and terminal.
143
144
  email: larry@marburger.cc
144
145
  executables:
145
146
  - cloudapp
@@ -191,17 +192,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
191
192
  version: '0'
192
193
  segments:
193
194
  - 0
194
- hash: 709427020080498495
195
+ hash: 186077293750345953
195
196
  required_rubygems_version: !ruby/object:Gem::Requirement
196
197
  none: false
197
198
  requirements:
198
- - - ! '>='
199
+ - - ! '>'
199
200
  - !ruby/object:Gem::Version
200
- version: '0'
201
+ version: 1.3.1
201
202
  requirements: []
202
203
  rubyforge_project: cloudapp
203
204
  rubygems_version: 1.8.23
204
205
  signing_key:
205
206
  specification_version: 2
206
- summary: CloudApp CLI
207
+ summary: CloudApp API wrapper and CLI
207
208
  test_files: []