t 1.0.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/t/cli.rb CHANGED
@@ -608,8 +608,9 @@ module T
608
608
  map %w(rts) => :retweets
609
609
 
610
610
  desc "ruler", "Prints a 140-character ruler"
611
+ method_option "indent", :aliases => "-i", :type => :numeric, :default => 0, :desc => "The number of space to print before the ruler."
611
612
  def ruler
612
- say "----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|"
613
+ say "#{' ' * options['indent'].to_i}----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|"
613
614
  end
614
615
 
615
616
  desc "status STATUS_ID", "Retrieves detailed information about a Tweet."
@@ -752,10 +753,15 @@ module T
752
753
 
753
754
  desc "update MESSAGE", "Post a Tweet."
754
755
  method_option "location", :aliases => "-l", :type => :boolean, :default => false
756
+ method_option "file", :aliases => "-f", :type => :string, :desc => "The path to an image to attach to your tweet."
755
757
  def update(message)
756
758
  opts = {:trim_user => true}
757
759
  opts.merge!(:lat => location.lat, :long => location.lng) if options['location']
758
- status = client.update(message, opts)
760
+ status = if options['file']
761
+ client.update_with_media(message, File.new(File.expand_path(options['file'])), opts)
762
+ else
763
+ client.update(message, opts)
764
+ end
759
765
  say "Tweet posted by @#{@rcfile.active_profile[0]}."
760
766
  say
761
767
  say "Run `#{File.basename($0)} delete status #{status.id}` to delete."
data/lib/t/rcfile.rb CHANGED
@@ -12,7 +12,24 @@ module T
12
12
  end
13
13
 
14
14
  def [](username)
15
- profiles[username]
15
+ profiles[find(username)]
16
+ end
17
+
18
+ def find(username)
19
+ possibilities = Array(find_case_insensitive_match(username) || find_case_insensitive_possibilities(username))
20
+ if possibilities.size == 1
21
+ possibilities.first
22
+ else
23
+ raise ArgumentError, "Username #{username} is #{possibilities.size < 1 ? 'not found.' : 'ambiguous, matching ' + possibilities.join(', ')}"
24
+ end
25
+ end
26
+
27
+ def find_case_insensitive_match(username)
28
+ profiles.keys.detect { |u| username.downcase == u.downcase }
29
+ end
30
+
31
+ def find_case_insensitive_possibilities(username)
32
+ profiles.keys.select { |u| username.downcase == u.downcase[0, username.length] }
16
33
  end
17
34
 
18
35
  def []=(username, profile)
data/lib/t/set.rb CHANGED
@@ -19,8 +19,8 @@ module T
19
19
  screen_name = screen_name.strip_ats
20
20
  @rcfile.path = options['profile'] if options['profile']
21
21
  consumer_key = @rcfile[screen_name].keys.last if consumer_key.nil?
22
- @rcfile.active_profile = {'username' => screen_name, 'consumer_key' => consumer_key}
23
- say "Active account has been updated."
22
+ @rcfile.active_profile = {'username' => @rcfile[screen_name][consumer_key]["username"], 'consumer_key' => consumer_key}
23
+ say "Active account has been updated to #{@rcfile.active_profile[0]}."
24
24
  end
25
25
  map %w(default) => :active
26
26
 
@@ -48,6 +48,21 @@ module T
48
48
  say "@#{@rcfile.active_profile[0]}'s name has been updated."
49
49
  end
50
50
 
51
+ desc "profile_background_image FILE", "Sets the background image on your Twitter profile."
52
+ method_option "tile", :aliases => "-t", :type => :boolean, :default => false, :desc => "Whether or not to tile the background image."
53
+ def profile_background_image(file)
54
+ client.update_profile_background_image(File.new(File.expand_path(file)), :tile => options['tile'], :skip_status => true)
55
+ say "@#{@rcfile.active_profile[0]}'s background image has been updated."
56
+ end
57
+ map %w(background background_image) => :profile_background_image
58
+
59
+ desc "profile_image FILE", "Sets the image on your Twitter profile."
60
+ def profile_image(file)
61
+ client.update_profile_image(File.new(File.expand_path(file)))
62
+ say "@#{@rcfile.active_profile[0]}'s image has been updated."
63
+ end
64
+ map %w(avatar image) => :profile_image
65
+
51
66
  desc "url URL", "Sets the URL field on your profile."
52
67
  def url(url)
53
68
  client.update_profile(:url => url)
data/lib/t/version.rb CHANGED
@@ -8,12 +8,12 @@ module T
8
8
 
9
9
  # @return [Integer]
10
10
  def self.minor
11
- 0
11
+ 1
12
12
  end
13
13
 
14
14
  # @return [Integer]
15
15
  def self.patch
16
- 1
16
+ 0
17
17
  end
18
18
 
19
19
  # @return [String, NilClass]
data/spec/cli_spec.rb CHANGED
@@ -2357,7 +2357,7 @@ Hourly limit,Remaining hits,Reset time
2357
2357
  stub_request(:get, "http://checkip.dyndns.org/").
2358
2358
  to_return(:body => fixture("checkip.html"), :headers => {:content_type => "text/html"})
2359
2359
  stub_request(:get, "http://www.geoplugin.net/xml.gp?ip=50.131.22.169").
2360
- to_return(:body => fixture("xml.gp"), :headers => {:content_type => "application/xml"})
2360
+ to_return(:body => fixture("geoplugin.xml"), :headers => {:content_type => "application/xml"})
2361
2361
  end
2362
2362
  it "should request the correct resource" do
2363
2363
  @cli.reply("55709764298092545", "Testing")
@@ -2705,6 +2705,16 @@ ID Posted at Screen name Text
2705
2705
  $stdout.string.chomp.size.should == 140
2706
2706
  $stdout.string.chomp.should == "----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|"
2707
2707
  end
2708
+ context "with indentation" do
2709
+ before do
2710
+ @cli.options = @cli.options.merge("indent" => 2)
2711
+ end
2712
+ it "should have the correct output" do
2713
+ @cli.ruler
2714
+ $stdout.string.chomp.size.should == 142
2715
+ $stdout.string.chomp.should == " ----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|"
2716
+ end
2717
+ end
2708
2718
  end
2709
2719
 
2710
2720
  describe "#status" do
@@ -3485,7 +3495,7 @@ WOEID Parent ID Type Name Country
3485
3495
  stub_request(:get, "http://checkip.dyndns.org/").
3486
3496
  to_return(:body => fixture("checkip.html"), :headers => {:content_type => "text/html"})
3487
3497
  stub_request(:get, "http://www.geoplugin.net/xml.gp?ip=50.131.22.169").
3488
- to_return(:body => fixture("xml.gp"), :headers => {:content_type => "application/xml"})
3498
+ to_return(:body => fixture("geoplugin.xml"), :headers => {:content_type => "application/xml"})
3489
3499
  end
3490
3500
  it "should request the correct resource" do
3491
3501
  @cli.update("Testing")
@@ -3501,6 +3511,22 @@ WOEID Parent ID Type Name Country
3501
3511
  @cli.update("Testing")
3502
3512
  $stdout.string.split("\n").first.should == "Tweet posted by @testcli."
3503
3513
  end
3514
+ context "with file" do
3515
+ before do
3516
+ @cli.options = @cli.options.merge("file" => fixture_path + "/long.png")
3517
+ stub_post("/1/statuses/update_with_media.json", "https://upload.twitter.com").
3518
+ to_return(:body => fixture("status.json"), :headers => {:content_type => "application/json; charset=utf-8"})
3519
+ end
3520
+ it "should request the correct resource" do
3521
+ @cli.update("Testing")
3522
+ a_post("/1/statuses/update_with_media.json", "https://upload.twitter.com").
3523
+ should have_been_made
3524
+ end
3525
+ it "should have the correct output" do
3526
+ @cli.update("Testing")
3527
+ $stdout.string.split("\n").first.should == "Tweet posted by @testcli."
3528
+ end
3529
+ end
3504
3530
  end
3505
3531
 
3506
3532
  describe "#users" do
File without changes
Binary file
Binary file
Binary file
data/spec/helper.rb CHANGED
@@ -12,35 +12,35 @@ require 'rspec'
12
12
  require 'timecop'
13
13
  require 'webmock/rspec'
14
14
 
15
- def a_delete(path, endpoint=Twitter.endpoint)
15
+ def a_delete(path, endpoint='https://api.twitter.com')
16
16
  a_request(:delete, endpoint + path)
17
17
  end
18
18
 
19
- def a_get(path, endpoint=Twitter.endpoint)
19
+ def a_get(path, endpoint='https://api.twitter.com')
20
20
  a_request(:get, endpoint + path)
21
21
  end
22
22
 
23
- def a_post(path, endpoint=Twitter.endpoint)
23
+ def a_post(path, endpoint='https://api.twitter.com')
24
24
  a_request(:post, endpoint + path)
25
25
  end
26
26
 
27
- def a_put(path, endpoint=Twitter.endpoint)
27
+ def a_put(path, endpoint='https://api.twitter.com')
28
28
  a_request(:put, endpoint + path)
29
29
  end
30
30
 
31
- def stub_delete(path, endpoint=Twitter.endpoint)
31
+ def stub_delete(path, endpoint='https://api.twitter.com')
32
32
  stub_request(:delete, endpoint + path)
33
33
  end
34
34
 
35
- def stub_get(path, endpoint=Twitter.endpoint)
35
+ def stub_get(path, endpoint='https://api.twitter.com')
36
36
  stub_request(:get, endpoint + path)
37
37
  end
38
38
 
39
- def stub_post(path, endpoint=Twitter.endpoint)
39
+ def stub_post(path, endpoint='https://api.twitter.com')
40
40
  stub_request(:post, endpoint + path)
41
41
  end
42
42
 
43
- def stub_put(path, endpoint=Twitter.endpoint)
43
+ def stub_put(path, endpoint='https://api.twitter.com')
44
44
  stub_request(:put, endpoint + path)
45
45
  end
46
46
 
data/spec/set_spec.rb CHANGED
@@ -20,11 +20,29 @@ describe T::Set do
20
20
 
21
21
  describe "#active" do
22
22
  before do
23
- @set.options = @set.options.merge("profile" => fixture_path + "/.trc")
23
+ @set.options = @set.options.merge("profile" => fixture_path + "/.trc_set")
24
24
  end
25
25
  it "should have the correct output" do
26
26
  @set.active("testcli", "abc123")
27
- $stdout.string.chomp.should == "Active account has been updated."
27
+ $stdout.string.chomp.should == "Active account has been updated to testcli."
28
+ end
29
+ it "should accept an account name without a consumer key" do
30
+ @set.active("testcli")
31
+ $stdout.string.chomp.should == "Active account has been updated to testcli."
32
+ end
33
+ it "should be case insensitive" do
34
+ @set.active("TestCLI", "abc123")
35
+ $stdout.string.chomp.should == "Active account has been updated to testcli."
36
+ end
37
+ it "should raise an error if username is ambiguous" do
38
+ lambda do
39
+ @set.active("test", "abc123")
40
+ end.should raise_error(ArgumentError, /Username test is ambiguous/)
41
+ end
42
+ it "should raise an error if the username is not found" do
43
+ lambda do
44
+ @set.active("clitest")
45
+ end.should raise_error(ArgumentError, /Username clitest is not found/)
28
46
  end
29
47
  end
30
48
 
@@ -104,6 +122,40 @@ describe T::Set do
104
122
  end
105
123
  end
106
124
 
125
+ describe "#profile_background_image" do
126
+ before do
127
+ @set.options = @set.options.merge("profile" => fixture_path + "/.trc")
128
+ stub_post("/1/account/update_profile_background_image.json").
129
+ to_return(:body => fixture("sferik.json"), :headers => {:content_type => "application/json; charset=utf-8"})
130
+ end
131
+ it "should request the correct resource" do
132
+ @set.profile_background_image(fixture_path + "/we_concept_bg2.png")
133
+ a_post("/1/account/update_profile_background_image.json").
134
+ should have_been_made
135
+ end
136
+ it "should have the correct output" do
137
+ @set.profile_background_image(fixture_path + "/we_concept_bg2.png")
138
+ $stdout.string.chomp.should == "@testcli's background image has been updated."
139
+ end
140
+ end
141
+
142
+ describe "#profile_image" do
143
+ before do
144
+ @set.options = @set.options.merge("profile" => fixture_path + "/.trc")
145
+ stub_post("/1/account/update_profile_image.json").
146
+ to_return(:body => fixture("sferik.json"), :headers => {:content_type => "application/json; charset=utf-8"})
147
+ end
148
+ it "should request the correct resource" do
149
+ @set.profile_image(fixture_path + "/me.jpg")
150
+ a_post("/1/account/update_profile_image.json").
151
+ should have_been_made
152
+ end
153
+ it "should have the correct output" do
154
+ @set.profile_image(fixture_path + "/me.jpg")
155
+ $stdout.string.chomp.should == "@testcli's image has been updated."
156
+ end
157
+ end
158
+
107
159
  describe "#url" do
108
160
  before do
109
161
  @set.options = @set.options.merge("profile" => fixture_path + "/.trc")
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: t
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-08-14 00:00:00.000000000 Z
12
+ date: 2012-08-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: launchy
@@ -315,9 +315,12 @@ files:
315
315
  - spec/fixtures/followers_ids.json
316
316
  - spec/fixtures/friends_ids.json
317
317
  - spec/fixtures/gem.json
318
+ - spec/fixtures/geoplugin.xml
318
319
  - spec/fixtures/list.json
319
320
  - spec/fixtures/lists.json
320
321
  - spec/fixtures/locations.json
322
+ - spec/fixtures/long.png
323
+ - spec/fixtures/me.jpg
321
324
  - spec/fixtures/not_found.json
322
325
  - spec/fixtures/rate_limit_status.json
323
326
  - spec/fixtures/recommendations.json
@@ -337,7 +340,7 @@ files:
337
340
  - spec/fixtures/true.json
338
341
  - spec/fixtures/users.json
339
342
  - spec/fixtures/users_list.json
340
- - spec/fixtures/xml.gp
343
+ - spec/fixtures/we_concept_bg2.png
341
344
  - spec/helper.rb
342
345
  - spec/list_spec.rb
343
346
  - spec/rcfile_spec.rb
@@ -384,9 +387,12 @@ test_files:
384
387
  - spec/fixtures/followers_ids.json
385
388
  - spec/fixtures/friends_ids.json
386
389
  - spec/fixtures/gem.json
390
+ - spec/fixtures/geoplugin.xml
387
391
  - spec/fixtures/list.json
388
392
  - spec/fixtures/lists.json
389
393
  - spec/fixtures/locations.json
394
+ - spec/fixtures/long.png
395
+ - spec/fixtures/me.jpg
390
396
  - spec/fixtures/not_found.json
391
397
  - spec/fixtures/rate_limit_status.json
392
398
  - spec/fixtures/recommendations.json
@@ -406,7 +412,7 @@ test_files:
406
412
  - spec/fixtures/true.json
407
413
  - spec/fixtures/users.json
408
414
  - spec/fixtures/users_list.json
409
- - spec/fixtures/xml.gp
415
+ - spec/fixtures/we_concept_bg2.png
410
416
  - spec/helper.rb
411
417
  - spec/list_spec.rb
412
418
  - spec/rcfile_spec.rb