tweetwine 0.3.2 → 0.4.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.
Files changed (46) hide show
  1. data/.gitignore +6 -0
  2. data/CHANGELOG.rdoc +9 -0
  3. data/Gemfile +5 -13
  4. data/LICENSE.txt +1 -1
  5. data/README.md +3 -2
  6. data/Rakefile +8 -2
  7. data/lib/tweetwine/character_encoding.rb +1 -1
  8. data/lib/tweetwine/cli.rb +9 -3
  9. data/lib/tweetwine/config.rb +3 -3
  10. data/lib/tweetwine/exceptions.rb +54 -0
  11. data/lib/tweetwine/http.rb +1 -1
  12. data/lib/tweetwine/{util.rb → support.rb} +19 -12
  13. data/lib/tweetwine/tweet.rb +69 -0
  14. data/lib/tweetwine/twitter.rb +70 -72
  15. data/lib/tweetwine/ui.rb +36 -41
  16. data/lib/tweetwine/uri.rb +31 -0
  17. data/lib/tweetwine/version.rb +15 -0
  18. data/lib/tweetwine.rb +6 -64
  19. data/man/tweetwine.7 +4 -3
  20. data/man/tweetwine.7.ronn +3 -2
  21. data/release-script.txt +10 -0
  22. data/test/example/authorization_example.rb +40 -0
  23. data/test/example/example_helper.rb +1 -1
  24. data/test/example/global_options_example.rb +64 -0
  25. data/test/example/search_statuses_example.rb +36 -31
  26. data/test/example/show_followers_example.rb +1 -1
  27. data/test/example/show_friends_example.rb +1 -1
  28. data/test/example/show_home_example.rb +17 -29
  29. data/test/example/show_mentions_example.rb +2 -2
  30. data/test/example/show_user_example.rb +14 -12
  31. data/test/example/update_status_example.rb +9 -9
  32. data/test/example/use_http_proxy_example.rb +7 -6
  33. data/test/example/{application_behavior_example.rb → user_help_example.rb} +6 -39
  34. data/test/unit/config_test.rb +1 -1
  35. data/test/unit/http_test.rb +1 -21
  36. data/test/unit/oauth_test.rb +11 -11
  37. data/test/unit/{util_test.rb → support_test.rb} +37 -38
  38. data/test/unit/tweet_helper.rb +83 -0
  39. data/test/unit/tweet_test.rb +153 -0
  40. data/test/unit/twitter_test.rb +240 -248
  41. data/test/unit/ui_test.rb +174 -78
  42. data/test/unit/unit_helper.rb +18 -6
  43. data/test/unit/uri_test.rb +41 -0
  44. data/test/unit/url_shortener_test.rb +7 -7
  45. data/tweetwine.gemspec +12 -22
  46. metadata +52 -73
data/lib/tweetwine/ui.rb CHANGED
@@ -1,7 +1,5 @@
1
1
  # coding: utf-8
2
2
 
3
- require "uri"
4
-
5
3
  module Tweetwine
6
4
  class UI
7
5
  COLOR_CODES = {
@@ -14,10 +12,11 @@ module Tweetwine
14
12
  USERNAME_REGEX = /^(@\w+)|\s+(@\w+)/
15
13
 
16
14
  def initialize(options = {})
17
- @in = options[:in] || $stdin
18
- @out = options[:out] || $stdout
19
- @err = options[:err] || $stderr
20
- @colors = options[:colors] || false
15
+ @in = options[:in] || $stdin
16
+ @out = options[:out] || $stdout
17
+ @err = options[:err] || $stderr
18
+ @colors = options[:colors] || false
19
+ @reverse = options[:show_reverse] || false
21
20
  end
22
21
 
23
22
  def info(start_msg = "\n", end_msg = " done.")
@@ -57,41 +56,32 @@ module Tweetwine
57
56
  END
58
57
  end
59
58
 
60
- def show_record(record)
61
- clean_record(record)
62
- if record[:status]
63
- show_record_as_user_with_status(record)
59
+ def show_tweets(tweets)
60
+ tweets = tweets.reverse if @reverse
61
+ tweets.each { |t| show_tweet(t) }
62
+ end
63
+
64
+ def show_tweet(tweet)
65
+ if tweet.status?
66
+ show_regular_tweet(tweet)
64
67
  else
65
- show_record_as_user(record)
68
+ show_user_info_tweet(tweet)
66
69
  end
67
70
  end
68
71
 
69
72
  private
70
73
 
71
- def clean_record(record)
72
- record.each_pair do |key, value|
73
- if value.is_a? Hash
74
- clean_record(value)
75
- else
76
- unless value.nil?
77
- value = value.to_s
78
- record[key] = value.empty? ? nil : value
79
- end
80
- end
81
- end
82
- end
83
-
84
- def show_record_as_user(record)
74
+ def show_user_info_tweet(tweet)
85
75
  @out.puts <<-END
86
- #{format_user(record[:from_user])}
76
+ #{format_user(tweet.from_user)}
87
77
 
88
78
  END
89
79
  end
90
80
 
91
- def show_record_as_user_with_status(record)
81
+ def show_regular_tweet(tweet)
92
82
  @out.puts <<-END
93
- #{format_record_header(record[:from_user], record[:to_user], record[:created_at])}
94
- #{format_status(record[:status])}
83
+ #{format_header(tweet)}
84
+ #{format_status(tweet.status)}
95
85
 
96
86
  END
97
87
  end
@@ -102,26 +92,31 @@ module Tweetwine
102
92
  end
103
93
 
104
94
  def format_status(status)
105
- status = Util.unescape_html(status)
95
+ status = Support.unescape_html(status)
106
96
  if @colors
107
- status = colorize_matching(:yellow, status, USERNAME_REGEX)
108
- status = colorize_matching(:magenta, status, HASHTAG_REGEX)
109
- status = colorize_matching(:cyan, status, URI.extract(status, %w{http https}).uniq)
97
+ status = colorize_matching(:yellow, status, USERNAME_REGEX)
98
+ status = colorize_matching(:magenta, status, HASHTAG_REGEX)
99
+ status = colorize_matching(:cyan, status, Uri.extract(status, %w{http https}).uniq)
110
100
  end
111
101
  status
112
102
  end
113
103
 
114
- def format_record_header(from_user, to_user, created_at)
115
- time_diff_value, time_diff_unit = Util.humanize_time_diff(created_at, Time.now)
104
+ def format_header(tweet)
105
+ from_user = tweet.from_user
106
+ to_user = tweet.to_user if tweet.reply?
107
+ rt_user = tweet.rt_user if tweet.retweet?
116
108
  if @colors
117
109
  from_user = colorize(:green, from_user)
118
- to_user = colorize(:green, to_user) if to_user
110
+ to_user = colorize(:green, to_user) if tweet.reply?
111
+ rt_user = colorize(:green, rt_user) if tweet.retweet?
119
112
  end
120
- if to_user
121
- "#{from_user}, in reply to #{to_user}, #{time_diff_value} #{time_diff_unit} ago:"
122
- else
123
- "#{from_user}, #{time_diff_value} #{time_diff_unit} ago:"
113
+ if tweet.timestamped?
114
+ time_diff_value, time_diff_unit = Support.humanize_time_diff(tweet.created_at, Time.now)
124
115
  end
116
+ from_part = tweet.retweet? ? "#{rt_user} RT #{from_user}" : from_user
117
+ to_part = tweet.reply? ? ", in reply to #{to_user}" : ''
118
+ time_part = tweet.timestamped? ? ", #{time_diff_value} #{time_diff_unit} ago" : ''
119
+ "#{from_part}#{to_part}#{time_part}:"
125
120
  end
126
121
 
127
122
  def colorize_matching(color, str, pattern)
@@ -133,7 +128,7 @@ module Tweetwine
133
128
  else
134
129
  raise "unknown kind of pattern"
135
130
  end
136
- Util.str_gsub_by_group(str, regexp) { |s| colorize(color, s) }
131
+ Support.str_gsub_by_group(str, regexp) { |s| colorize(color, s) }
137
132
  end
138
133
 
139
134
  def colorize(color, str)
@@ -0,0 +1,31 @@
1
+ # coding: utf-8
2
+
3
+ require 'uri'
4
+
5
+ module Tweetwine
6
+ module Uri
7
+ UNSAFE_CHARS_REGEXP = /[^#{URI::PATTERN::UNRESERVED}]/
8
+
9
+ class << self
10
+ def parser
11
+ if ::URI.const_defined? :Parser
12
+ @parser ||= ::URI::Parser.new
13
+ else
14
+ ::URI
15
+ end
16
+ end
17
+
18
+ def extract(*args)
19
+ parser.extract(*args)
20
+ end
21
+
22
+ def parse(*args)
23
+ parser.parse(*args)
24
+ end
25
+
26
+ def percent_encode(str)
27
+ parser.escape(str.to_s, UNSAFE_CHARS_REGEXP)
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,15 @@
1
+ # coding: utf-8
2
+
3
+ module Tweetwine
4
+ VERSION = '0.4.0'.freeze
5
+
6
+ class << self
7
+ def version
8
+ VERSION
9
+ end
10
+
11
+ def summary
12
+ 'Tweetwine shows the latest tweets from the command line quickly.'
13
+ end
14
+ end
15
+ end
data/lib/tweetwine.rb CHANGED
@@ -8,72 +8,12 @@ end unless defined? JSON
8
8
 
9
9
  gem 'oauth', '~> 0.4.4'
10
10
 
11
- module Tweetwine
12
- VERSION = '0.3.2'.freeze
13
-
14
- class << self
15
- def version
16
- VERSION
17
- end
18
-
19
- def summary
20
- 'Tweetwine shows the latest tweets from the command line quickly.'
21
- end
22
- end
23
-
24
- class Error < StandardError
25
- @status_code = 42
26
-
27
- # Idea got from Bundler.
28
- def self.status_code(code = nil)
29
- return @status_code unless code
30
- @status_code = code
31
- end
32
-
33
- def status_code
34
- self.class.status_code
35
- end
36
- end
37
-
38
- class CommandLineError < Error; status_code(13); end
39
- class UnknownCommandError < Error; status_code(14); end
40
-
41
- class RequiredOptionError < Error
42
- status_code(15)
43
-
44
- attr_reader :key, :owner
45
-
46
- def initialize(key, owner)
47
- @key, @owner = key, owner
48
- end
49
-
50
- def to_s
51
- "#{key} is required for #{owner}"
52
- end
53
- end
54
-
55
- class ConnectionError < Error; status_code(21); end
56
- class TimeoutError < Error; status_code(22); end
57
-
58
- class HttpError < Error
59
- status_code(25)
60
-
61
- attr_reader :http_code, :http_message
62
-
63
- def initialize(code, message)
64
- @http_code, @http_message = code.to_i, message
65
- end
66
-
67
- def to_s
68
- "#{http_code} #{http_message}"
69
- end
70
- end
71
-
72
- class TranscodeError < Error; status_code(31); end
73
- class AuthorizationError < Error; status_code(32); end
11
+ require 'tweetwine/version'
74
12
 
13
+ module Tweetwine
75
14
  lib_path = File.expand_path(File.dirname(__FILE__))
76
15
 
16
+ require "#{lib_path}/tweetwine/exceptions"
77
17
  require "#{lib_path}/tweetwine/basic_object"
78
18
 
79
19
  autoload :CharacterEncoding, "#{lib_path}/tweetwine/character_encoding"
@@ -84,8 +24,10 @@ module Tweetwine
84
24
  autoload :Obfuscate, "#{lib_path}/tweetwine/obfuscate"
85
25
  autoload :OptionParser, "#{lib_path}/tweetwine/option_parser"
86
26
  autoload :Promise, "#{lib_path}/tweetwine/promise"
27
+ autoload :Support, "#{lib_path}/tweetwine/support"
28
+ autoload :Tweet, "#{lib_path}/tweetwine/tweet"
87
29
  autoload :Twitter, "#{lib_path}/tweetwine/twitter"
88
30
  autoload :UI, "#{lib_path}/tweetwine/ui"
31
+ autoload :Uri, "#{lib_path}/tweetwine/uri"
89
32
  autoload :UrlShortener, "#{lib_path}/tweetwine/url_shortener"
90
- autoload :Util, "#{lib_path}/tweetwine/util"
91
33
  end
data/man/tweetwine.7 CHANGED
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "TWEETWINE" "7" "November 2010" "Tuomas Kareinen" "Tweetwine Manual"
4
+ .TH "TWEETWINE" "7" "February 2011" "Tuomas Kareinen" "Tweetwine Manual"
5
5
  .
6
6
  .SH "DESCRIPTION"
7
7
  Tweetwine shows the latest tweets from the command line quickly\.
@@ -126,6 +126,7 @@ Before actually sending a new status update, it is possible for the software to
126
126
 
127
127
  username: spoonman
128
128
  colors: true
129
+ show_reverse: true
129
130
  shorten_urls:
130
131
  service_url: http://is\.gd/create\.php
131
132
  method: post
@@ -181,7 +182,7 @@ fi
181
182
  .IP "" 0
182
183
  .
183
184
  .SH "COPYRIGHT"
184
- Tweetwine is Copyright (c) 2009\-2010 Tuomas Kareinen\.
185
+ Tweetwine is copyright \(co 2009\-2011 Tuomas Kareinen\. See \fBLICENSE\.txt\fR\.
185
186
  .
186
187
  .SH "SEE ALSO"
187
- \fIhttps://github\.com/tuomas/tweetwine\fR
188
+ \fIhttps://github\.com/tkareine/tweetwine\fR
data/man/tweetwine.7.ronn CHANGED
@@ -77,6 +77,7 @@ enabled via `shorten_urls` field in the configuration file; for example:
77
77
 
78
78
  username: spoonman
79
79
  colors: true
80
+ show_reverse: true
80
81
  shorten_urls:
81
82
  service_url: http://is.gd/create.php
82
83
  method: post
@@ -124,8 +125,8 @@ snippet to your Bash initialization script (such as `~/.bashrc`):
124
125
 
125
126
  ## COPYRIGHT
126
127
 
127
- Tweetwine is Copyright (c) 2009-2010 Tuomas Kareinen.
128
+ Tweetwine is copyright &copy; 2009-2011 Tuomas Kareinen. See `LICENSE.txt`.
128
129
 
129
130
  ## SEE ALSO
130
131
 
131
- <https://github.com/tuomas/tweetwine>
132
+ <https://github.com/tkareine/tweetwine>
@@ -0,0 +1,10 @@
1
+ In order to release, do
2
+
3
+ $EDITOR lib/tweetwine/version.rb # update version number
4
+ $EDITOR CHANGELOG.rdoc # describe history summary
5
+ git diff # review the changes
6
+ rake gem:build # check that tests pass
7
+ git commit -am "Bump to release-<version>"
8
+ git tag release-<version>
9
+ git push --tags origin master
10
+ gem push tweetwine-<version>.gem
@@ -0,0 +1,40 @@
1
+ # coding: utf-8
2
+
3
+ require "example_helper"
4
+ require "fixture/oauth"
5
+
6
+ include Tweetwine::Test::Fixture::OAuth
7
+
8
+ Feature "authorization" do
9
+ as_a "user"
10
+ i_want_to "see authorize myself"
11
+ in_order_to "use the service"
12
+
13
+ Scenario "authorize user with OAuth and save access token" do
14
+ When "I start the application with 'home' command and the command fails due to me being unauthorized" do
15
+ @command_url = "https://api.twitter.com/1/statuses/home_timeline.json?count=20&page=1"
16
+ stub_http_request(METHOD, REQUEST_TOKEN_URL).to_return(:body => REQUEST_TOKEN_RESPONSE)
17
+ stub_http_request(METHOD, ACCESS_TOKEN_URL).to_return(:body => ACCESS_TOKEN_RESPONSE)
18
+ stub_http_request(:get, @command_url).
19
+ to_return(:status => [401, 'Unauthorized']).then.
20
+ to_return(:body => fixture_file('home.json'))
21
+ in_temp_dir do
22
+ config_file = 'tweetwine.tmp'
23
+ @output = start_cli %W{--no-colors -f #{config_file} home}, [PIN], {}
24
+ @config_contents = YAML.load_file(config_file)
25
+ @config_mode = file_mode(config_file)
26
+ end
27
+ end
28
+
29
+ Then "the application authorizes me, saves access token to config file, and tries the command again" do
30
+ assert_requested(METHOD, REQUEST_TOKEN_URL)
31
+ assert_requested(METHOD, ACCESS_TOKEN_URL)
32
+ assert_requested(:get, @command_url, :headers => {'Authorization' => /^OAuth /}, :times => 2)
33
+ @output[0].should == "Please authorize: #{AUTHORIZE_URL}"
34
+ @output[1].should =~ /^Enter PIN:/
35
+ @output[2].should == "F1-kausi alkaa marraskuussa http://bit.ly/1qQwjQ"
36
+ @config_contents['oauth_access'].empty?.should == false
37
+ @config_mode.should == 0600
38
+ end
39
+ end
40
+ end
@@ -48,7 +48,7 @@ module Tweetwine::Test
48
48
  end
49
49
 
50
50
  def read_shorten_config
51
- Util.symbolize_hash_keys(YAML.load_file(CONFIG_FILE))[:shorten_urls]
51
+ Support.symbolize_hash_keys(YAML.load_file(CONFIG_FILE))[:shorten_urls]
52
52
  end
53
53
  end
54
54
  end
@@ -0,0 +1,64 @@
1
+ # coding: utf-8
2
+
3
+ require "example_helper"
4
+
5
+ Feature "global options" do
6
+ as_a "user"
7
+ i_want_to "set global options"
8
+ in_order_to "affect general application behavior"
9
+
10
+ def setup
11
+ super
12
+ stub_http_request(:get, %r{https://api.twitter.com/1/statuses/home_timeline\.json\?count=\d+&page=\d+}).to_return(:body => fixture_file('home.json'))
13
+ end
14
+
15
+ Scenario "colors" do
16
+ When "I start the application with '--colors' option" do
17
+ @output = start_cli %w{--colors}
18
+ end
19
+
20
+ Then "the application shows tweets with colors" do
21
+ @output[0].should == "\e[32mpelit\e[0m, 11 days ago:"
22
+ @output[1].should == "F1-kausi alkaa marraskuussa \e[36mhttp://bit.ly/1qQwjQ\e[0m"
23
+ @output[2].should == ""
24
+ @output[58].should == "\e[32mradar\e[0m, 15 days ago:"
25
+ @output[59].should == "Four short links: 29 September 2009 \e[36mhttp://bit.ly/dYxay\e[0m"
26
+ end
27
+ end
28
+
29
+ Scenario "show reverse" do
30
+ When "I start the application with '--reverse' option" do
31
+ @output = start_cli %w{--reverse}
32
+ end
33
+
34
+ Then "the application shows tweets in reverse order" do
35
+ @output[0].should == "radar, 15 days ago:"
36
+ @output[1].should == "Four short links: 29 September 2009 http://bit.ly/dYxay"
37
+ @output[2].should == ""
38
+ @output[58].should == "pelit, 11 days ago:"
39
+ @output[59].should == "F1-kausi alkaa marraskuussa http://bit.ly/1qQwjQ"
40
+ end
41
+ end
42
+
43
+ Scenario "num" do
44
+ When "I start the application with '--num <n>' option" do
45
+ @num = 2
46
+ @output = start_cli %W{--num #{@num}}
47
+ end
48
+
49
+ Then "the application requests the specified number of tweets" do
50
+ assert_requested(:get, %r{/home_timeline\.json\?count=#{@num}&page=\d+})
51
+ end
52
+ end
53
+
54
+ Scenario "page" do
55
+ When "I start the application with '--page <p>' option" do
56
+ @page = 2
57
+ @output = start_cli %W{--page #{@page}}
58
+ end
59
+
60
+ Then "the application requests the specified page number for tweets" do
61
+ assert_requested(:get, %r{/home_timeline\.json\?count=\d+&page=#{@page}})
62
+ end
63
+ end
64
+ end
@@ -3,56 +3,51 @@
3
3
  require "example_helper"
4
4
 
5
5
  Feature "search tweets" do
6
- in_order_to "search statuses"
7
6
  as_a "authenticated user"
8
- i_want_to "see tweets matching the search"
7
+ i_want_to "search tweets with keywords"
8
+ in_order_to "see tweets that interest me"
9
9
 
10
- SEARCH_OR_URL = "http://search.twitter.com/search.json?q=braid%20game&rpp=2&page=1"
11
- SEARCH_AND_URL = "http://search.twitter.com/search.json?q=braid%20OR%20game&rpp=2&page=1"
10
+ SEARCH_BASE_URL = "http://search.twitter.com/search.json"
11
+ SEARCH_OR_URL = "#{SEARCH_BASE_URL}?q=braid%20OR%20game&rpp=2&page=1"
12
+ SEARCH_AND_URL = "#{SEARCH_BASE_URL}?q=braid%20game&rpp=2&page=1"
12
13
  SEARCH_FIXTURE = fixture_file('search.json')
13
14
 
14
- Scenario "search words" do
15
- When "I start the application with command 'search' and search words" do
16
- stub_http_request(:get, SEARCH_OR_URL).to_return(:body => SEARCH_FIXTURE)
17
- @output = start_cli %w{-n 2 search braid game}
18
- end
19
-
20
- Then "the application shows tweets matching all the words" do
21
- @output[0].should == "thatswhatshesaid, in reply to hatguy, 5 hours ago:"
22
- @output[1].should == "@hatguy braid, perhaps the best indie game of 2009"
23
- @output[2].should == ""
24
- @output[3].should == "jillv, 11 hours ago:"
25
- @output[4].should == "braid is even better than of the games i'm in, expect re4"
26
- end
15
+ def setup
16
+ super
17
+ stub_http_request(:get, SEARCH_AND_URL).to_return(:body => SEARCH_FIXTURE)
18
+ stub_http_request(:get, SEARCH_OR_URL).to_return(:body => SEARCH_FIXTURE)
27
19
  end
28
20
 
29
21
  Scenario "search tweets matching all words" do
30
22
  When "I start the application with command 'search', option '-a', and search words" do
31
- stub_http_request(:get, SEARCH_OR_URL).to_return(:body => SEARCH_FIXTURE)
32
23
  @output = start_cli %w{-n 2 search -a braid game}
33
24
  end
34
25
 
35
- Then "the application shows tweets matching all the words" do
36
- @output[0].should == "thatswhatshesaid, in reply to hatguy, 5 hours ago:"
37
- @output[1].should == "@hatguy braid, perhaps the best indie game of 2009"
38
- @output[2].should == ""
39
- @output[3].should == "jillv, 11 hours ago:"
40
- @output[4].should == "braid is even better than of the games i'm in, expect re4"
26
+ Then "the application requests tweets matching all the words and shows them" do
27
+ assert_requested(:get, SEARCH_AND_URL)
28
+ should_output_tweets
41
29
  end
42
30
  end
43
31
 
44
32
  Scenario "search tweets matching any words" do
45
33
  When "I start the application with command 'search', option '-o', and search words" do
46
- stub_http_request(:get, SEARCH_AND_URL).to_return(:body => SEARCH_FIXTURE)
47
34
  @output = start_cli %w{-n 2 search -o braid game}
48
35
  end
49
36
 
50
- Then "the application shows tweets matching any of the words" do
51
- @output[0].should == "thatswhatshesaid, in reply to hatguy, 5 hours ago:"
52
- @output[1].should == "@hatguy braid, perhaps the best indie game of 2009"
53
- @output[2].should == ""
54
- @output[3].should == "jillv, 11 hours ago:"
55
- @output[4].should == "braid is even better than of the games i'm in, expect re4"
37
+ Then "the application requests tweets matching any of the words and shows them" do
38
+ assert_requested(:get, SEARCH_OR_URL)
39
+ should_output_tweets
40
+ end
41
+ end
42
+
43
+ Scenario "option '-a' is implied unless specified" do
44
+ When "I start the application with command 'search' and search words" do
45
+ @output = start_cli %w{-n 2 search braid game}
46
+ end
47
+
48
+ Then "the application requests tweets matching all the words and shows them" do
49
+ assert_requested(:get, SEARCH_AND_URL)
50
+ should_output_tweets
56
51
  end
57
52
  end
58
53
 
@@ -68,4 +63,14 @@ Feature "search tweets" do
68
63
  @status.exitstatus.should == CommandLineError.status_code
69
64
  end
70
65
  end
66
+
67
+ private
68
+
69
+ def should_output_tweets
70
+ @output[0].should == "thatswhatshesaid, in reply to hatguy, 5 hours ago:"
71
+ @output[1].should == "@hatguy braid, perhaps the best indie game of 2009"
72
+ @output[2].should == ""
73
+ @output[3].should == "jillv, 11 hours ago:"
74
+ @output[4].should == "braid is even better than of the games i'm in, expect re4"
75
+ end
71
76
  end
@@ -3,9 +3,9 @@
3
3
  require "example_helper"
4
4
 
5
5
  Feature "show followers" do
6
- in_order_to "to see who follows me"
7
6
  as_a "authenticated user"
8
7
  i_want_to "see my followers"
8
+ in_order_to "to see who follows me"
9
9
 
10
10
  Scenario "show followers" do
11
11
  When "I start the application with 'followers' command" do
@@ -3,9 +3,9 @@
3
3
  require "example_helper"
4
4
 
5
5
  Feature "show friends" do
6
- in_order_to "to see who I follow"
7
6
  as_a "authenticated user"
8
7
  i_want_to "see my friends"
8
+ in_order_to "to see who I follow"
9
9
 
10
10
  Scenario "show friends" do
11
11
  When "I start the application with 'followers' command" do
@@ -3,54 +3,42 @@
3
3
  require "example_helper"
4
4
 
5
5
  Feature "show tweets from home timeline" do
6
- in_order_to "stay up-to-date of other people's doings"
7
6
  as_a "authenticated user"
8
7
  i_want_to "see my home timeline"
8
+ in_order_to "stay up-to-date of other people's doings"
9
9
 
10
10
  def setup
11
11
  super
12
12
  stub_http_request(:get, "https://api.twitter.com/1/statuses/home_timeline.json?count=20&page=1").to_return(:body => fixture_file('home.json'))
13
13
  end
14
14
 
15
- Scenario "with colorization disabled" do
16
- When "I start the application with no command" do
17
- @output = start_cli %w{--no-colors}
15
+ Scenario "show home timeline" do
16
+ When "I start the application with 'home' command" do
17
+ @output = start_cli %w{--no-colors home}
18
18
  end
19
19
 
20
- Then "the application shows tweets from home timeline without colors" do
21
- @output[0].should == "pelit, 11 days ago:"
22
- @output[1].should == "F1-kausi alkaa marraskuussa http://bit.ly/1qQwjQ"
23
- @output[2].should == ""
24
- @output[58].should == "radar, 15 days ago:"
25
- @output[59].should == "Four short links: 29 September 2009 http://bit.ly/dYxay"
20
+ Then "the application shows tweets from home timeline" do
21
+ should_output_tweets
26
22
  end
27
23
  end
28
24
 
29
- Scenario "with colorization enabled" do
25
+ Scenario "show home timeline is default command" do
30
26
  When "I start the application with no command" do
31
- @output = start_cli %w{--colors}
27
+ @output = start_cli %w{--no-colors}
32
28
  end
33
29
 
34
- Then "the application shows tweets from home timeline with colors" do
35
- @output[0].should == "\e[32mpelit\e[0m, 11 days ago:"
36
- @output[1].should == "F1-kausi alkaa marraskuussa \e[36mhttp://bit.ly/1qQwjQ\e[0m"
37
- @output[2].should == ""
38
- @output[58].should == "\e[32mradar\e[0m, 15 days ago:"
39
- @output[59].should == "Four short links: 29 September 2009 \e[36mhttp://bit.ly/dYxay\e[0m"
30
+ Then "the application shows tweets from home timeline" do
31
+ should_output_tweets
40
32
  end
41
33
  end
42
34
 
43
- Scenario "the command for showing the home view is the default command" do
44
- When "I start the application with 'home' command" do
45
- @output = start_cli %w{--no-colors home}
46
- end
35
+ private
47
36
 
48
- Then "the application shows tweets from home timeline" do
49
- @output[0].should == "pelit, 11 days ago:"
50
- @output[1].should == "F1-kausi alkaa marraskuussa http://bit.ly/1qQwjQ"
51
- @output[2].should == ""
52
- @output[58].should == "radar, 15 days ago:"
53
- @output[59].should == "Four short links: 29 September 2009 http://bit.ly/dYxay"
54
- end
37
+ def should_output_tweets
38
+ @output[0].should == "pelit, 11 days ago:"
39
+ @output[1].should == "F1-kausi alkaa marraskuussa http://bit.ly/1qQwjQ"
40
+ @output[2].should == ""
41
+ @output[58].should == "radar, 15 days ago:"
42
+ @output[59].should == "Four short links: 29 September 2009 http://bit.ly/dYxay"
55
43
  end
56
44
  end
@@ -3,9 +3,9 @@
3
3
  require "example_helper"
4
4
 
5
5
  Feature "show tweets mentioning the user" do
6
- in_order_to "know if someone has mentioned me"
7
6
  as_a "authenticated user"
8
- i_want_to "see the tweets mentioning me"
7
+ i_want_to "see tweets mentioning me"
8
+ in_order_to "know if someone has replied or otherwise mentioned me"
9
9
 
10
10
  Scenario "show tweets mentioning me" do
11
11
  When "I start the application with 'mentions' command" do