stars 0.1.1 → 0.2.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.
data/README.markdown CHANGED
@@ -11,28 +11,32 @@ So anyway, I spend a lot of time on the command line, and switching over to the
11
11
 
12
12
  Install with `gem install stars`, then do a quick `stars`, fill in your Twitter username, and let it do its sultry magic. This is me lately:
13
13
 
14
- +---------+-------------+--------------------------------------------------------+
15
- | Stars | Time | Your Funnies |
16
- +---------+-------------+--------------------------------------------------------+
17
- | * * | 11 days ago | I have a severe sore throat. Or, if I said that ou... |
18
- | * * | 11 days ago | Way too many Scientology ads on Muni buses. It wor... |
19
- | * | 11 days ago | Napping didn't fix this cold; I feel a bit worse. M... |
20
- | * | 10 days ago | God I leave the room for one minute and the girls o... |
21
- | * | 10 days ago | Man, Avatar really fucked Up. |
22
- | * | 9 days ago | I'd play out here, but the west coast is all about ... |
23
- | * | 9 days ago | I just want to know who moved my Maps app to my iPh... |
24
- | * * | 9 days ago | just about finished my thesis on generating free en... |
25
- | * * * | 7 days ago | You change your Facebook pic, that syncs to my iPho... |
26
- | * | 6 days ago | Going to totally refork and rework my dotfiles soon... |
27
- | * | 6 days ago | Oh hey, a year or so of my beer consumption: http:/... |
28
- | * * | 5 days ago | In another life I want to be a pop star heartthrob ... |
29
- | * * * | 5 days ago | I pre-ordered an iPad, checked into lunch, and now ... |
30
- | * * * * | 3 days ago | I wouldn't say I'm "saving daylight" as much as I'm... |
31
- | * x 13 | 3 days ago | So for the seven of us that are both nerdy *and* va... |
32
- | * * * | 2 days ago | Just got my third free replacement earbuds from the... |
33
- | * | 2 days ago | Oh, they're doing a MacGruber movie. This makes sen... |
34
- | * | 2 days ago | At the MySQL + Rails combined meetup. I don't want ... |
35
- +---------+-------------+--------------------------------------------------------+
14
+ ★ by @holman
15
+ +----+-----------+--------------+--------------------------------------------------------+
16
+ | # | Stars | Time | Your Funnies |
17
+ +----+-----------+--------------+--------------------------------------------------------+
18
+ | 1 | * | 12 hours ago | Today's GitHub todo list: put cupholders in the for... |
19
+ | 2 | * * * | 1 day ago | This bus is going so slowly that my AT&T 3G coverag... |
20
+ | 3 | * * * * * | 2 days ago | Every now and then I bust out that I'm from North D... |
21
+ | 4 | * * * | 3 days ago | Was told that "y'alls be stupid" by an adamant stre... |
22
+ | 5 | * * | 4 days ago | Now that we've fixed healthcare forever, who wants ... |
23
+ | 6 | * * * * | 4 days ago | Just wikipedia'd "Justin Bieber" and I still don't ... |
24
+ | 7 | * * * * | 5 days ago | Look. I'm not saying David Copperfield is a little ... |
25
+ | 8 | * | 6 days ago | SFO. Guys, we're at TERROR ALERT ORANGE. I don't t... |
26
+ | 9 | * | 7 days ago | Dammit. 2012 looks like garbage so far, but if a mo... |
27
+ | 10 | * | 10 days ago | At the MySQL + Rails combined meetup. I don't want ... |
28
+ | 11 | * | 10 days ago | Oh, they're doing a MacGruber movie. This makes sen... |
29
+ | 12 | * * * | 10 days ago | Just got my third free replacement earbuds from the... |
30
+ | 13 | * x 13 | 11 days ago | So for the seven of us that are both nerdy *and* va... |
31
+ | 14 | * * * * * | 11 days ago | I wouldn't say I'm "saving daylight" as much as I'm... |
32
+ | 15 | * * * | 13 days ago | I pre-ordered an iPad, checked into lunch, and now ... |
33
+ | 16 | * * | 13 days ago | In another life I want to be a pop star heartthrob ... |
34
+ | 17 | * | 14 days ago | Oh hey, a year or so of my beer consumption: http:/... |
35
+ | 18 | * | 14 days ago | Going to totally refork and rework my dotfiles soon... |
36
+ | 19 | * * * | 15 days ago | You change your Facebook pic, that syncs to my iPho... |
37
+ | 20 | * * | 17 days ago | just about finished my thesis on generating free en... |
38
+ +----+-----------+--------------+--------------------------------------------------------+
39
+
36
40
 
37
41
  You can tell from the relative dearth of stars that I'm in my *screw followers I'm important so here's what I had for lunch* phase. Don't worry; I'll become a star whore again and tweet pop culture references in relation to presidential penile size soon enough.
38
42
 
@@ -43,9 +47,26 @@ You can also specify which user you want to run the query against by passing it
43
47
  stars goodtutorials # generates @goodtutorials' stars
44
48
  stars # generates @goodtutorials' stars
45
49
 
50
+ You can also get some knowledge dropped all over your face about a specific toot:
51
+
52
+ Type the number of the toot that you want to learn about
53
+ (or hit return to view all again, you ego-maniac) >>
54
+ 14
55
+
56
+ 5 stars: I wouldn't say I'm "saving daylight" as much as
57
+ I'm sequestering it in a small room underneath my stairs so
58
+ its screams can't be heard.
59
+
60
+ ★ twilighteyes08
61
+ ★ itsjustEm
62
+ ★ aklw
63
+ ★ shariv67
64
+ ★ IsJonas
65
+
66
+
46
67
  ## state of affairs
47
68
 
48
- This was a one-night hack thing; ideally it'd be cool to maybe retain some "this was read" state, and improve the formatting (if only "★" worked better in a fixed-width environment, AMIRITE?). All in due time. I mean, for you to fork and do it yourself, I mean.
69
+ Fork this bad boy and shape it as you see fit. I just randomly built some shit that I might like; maybe that process will work for you, too. Send me a pull request if you ship something awesome. Reminder: something is never awesome without tests.
49
70
 
50
71
  ## who
51
72
 
data/Rakefile CHANGED
@@ -13,6 +13,7 @@ begin
13
13
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
14
14
  gem.add_dependency('httparty')
15
15
  gem.add_dependency('terminal-table')
16
+ gem.add_dependency('nokogiri')
16
17
  end
17
18
  Jeweler::GemcutterTasks.new
18
19
  rescue LoadError
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.1
1
+ 0.2.0
data/lib/stars/client.rb CHANGED
@@ -1,11 +1,17 @@
1
1
  module Stars
2
2
  class Client
3
-
3
+
4
4
  def self.load!(new_username=nil)
5
5
  remember_username(new_username) if new_username
6
- favstar = Stars::Favstar.new(username)
6
+ @recent = Stars::Favstar.new.recent(username)
7
+ display
8
+ end
9
+
10
+ def self.display
11
+ system 'clear'
7
12
  puts "\n ★ by @#{username}"
8
- puts Stars::Formatter.new(favstar.recent)
13
+ puts Stars::Formatter.new(@recent)
14
+ select_star
9
15
  end
10
16
 
11
17
  def self.username
@@ -29,6 +35,34 @@ module Stars
29
35
  def self.config_path
30
36
  File.join(ENV['HOME'], '.stars')
31
37
  end
38
+
39
+ def self.select_star
40
+ selection = ''
41
+ while true
42
+ puts "Type the number of the toot that you want to learn about"
43
+ puts " (or hit return to view all again, you ego-maniac) >>"
44
+ selection = gets.chomp
45
+ break if ['','q','quit','exit','fuckthis'].include?(selection.downcase)
46
+ show_selection(selection)
47
+ end
48
+ display if selection == ''
49
+ end
50
+
51
+ def self.show_selection(id)
52
+ puts ''
53
+ puts wrap_text(' ' + @recent[id.to_i - 1]['title'], 60)
54
+ puts parse_who(@recent[id.to_i - 1]['guid'])
55
+ puts ''
56
+ end
57
+
58
+ def self.parse_who(url)
59
+ Stars::Favstar.new.show(url)
60
+ end
61
+
62
+ def self.wrap_text(txt, col = 80)
63
+ txt.gsub(/(.{1,#{col}})( +|$\n?)|(.{1,#{col}})/,
64
+ "\\1\\3\n ")
65
+ end
32
66
 
33
67
  end
34
68
  end
data/lib/stars/favstar.rb CHANGED
@@ -1,16 +1,20 @@
1
+ require 'nokogiri'
1
2
  module Stars
2
3
  class Favstar
3
4
  include HTTParty
4
5
  base_uri 'favstar.fm'
5
- format :xml
6
- attr_accessor :username
7
-
8
- def initialize(username)
9
- @username = username
10
- end
11
6
 
12
- def recent
13
- self.class.get("/users/#{@username}/rss")['rss']['channel']['item']
7
+ def recent(username)
8
+ self.class.get("/users/#{username}/rss",
9
+ :format => :xml)['rss']['channel']['item']
10
+ end
11
+
12
+ def show(url)
13
+ # hardcode 17 to strip favstar domain for now
14
+ html = self.class.get(url[17..200], :format => :html)
15
+ Nokogiri::HTML(html).css('.avatarList img').collect do |img|
16
+ " ★ #{img.attributes['alt'].value}"
17
+ end
14
18
  end
15
19
  end
16
20
  end
@@ -15,9 +15,9 @@ module Stars
15
15
  truncated + (truncated.size == text.size ? '' : '...')
16
16
  end
17
17
 
18
- def format(tweet)
18
+ def format(i, tweet)
19
19
  stars,text = split_stars(tweet['title'])
20
- [stars,relative_time(tweet['pubDate']),text]
20
+ [i,stars,relative_time(tweet['pubDate']),text]
21
21
  end
22
22
 
23
23
  def split_stars(text)
@@ -40,8 +40,8 @@ module Stars
40
40
  end
41
41
 
42
42
  def to_s
43
- tweets = @tweets.reverse.collect{|tweet| format tweet}
44
- table(['Stars','Time','Your Funnies'], *tweets).render
43
+ tweets = @tweets.collect_with_index{|tweet,i| format(i+1,tweet)}
44
+ table(['#','Stars','Time','Your Funnies'], *tweets).render
45
45
  end
46
46
 
47
47
  def relative_time(time)
data/stars.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{stars}
8
- s.version = "0.1.1"
8
+ s.version = "0.2.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Zach Holman"]
12
- s.date = %q{2010-03-18}
12
+ s.date = %q{2010-03-25}
13
13
  s.default_executable = %q{stars}
14
14
  s.description = %q{Recent favstar faves on your command line.}
15
15
  s.email = %q{github.com@zachholman.com}
@@ -57,13 +57,16 @@ Gem::Specification.new do |s|
57
57
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
58
58
  s.add_runtime_dependency(%q<httparty>, [">= 0"])
59
59
  s.add_runtime_dependency(%q<terminal-table>, [">= 0"])
60
+ s.add_runtime_dependency(%q<nokogiri>, [">= 0"])
60
61
  else
61
62
  s.add_dependency(%q<httparty>, [">= 0"])
62
63
  s.add_dependency(%q<terminal-table>, [">= 0"])
64
+ s.add_dependency(%q<nokogiri>, [">= 0"])
63
65
  end
64
66
  else
65
67
  s.add_dependency(%q<httparty>, [">= 0"])
66
68
  s.add_dependency(%q<terminal-table>, [">= 0"])
69
+ s.add_dependency(%q<nokogiri>, [">= 0"])
67
70
  end
68
71
  end
69
72
 
data/test/test_client.rb CHANGED
@@ -3,14 +3,18 @@ require 'helper'
3
3
  class TestClient < Test::Unit::TestCase
4
4
 
5
5
  def test_load_with_username
6
- mock(Stars::Formatter).new.with_any_args
6
+ mock(Stars::Client).system.with('clear').returns('')
7
+ mock(Stars::Formatter).new.times(any_times).with_any_args
7
8
  mock(Stars::Client).puts.times(any_times).with_any_args
9
+ mock(Stars::Client).gets.times(any_times).with_any_args.returns('q')
8
10
  Stars::Client.load!('holman')
9
11
  end
10
12
 
11
13
  def test_load_without_username
12
- mock(Stars::Formatter).new.with_any_args
14
+ mock(Stars::Client).system.with('clear').returns('')
15
+ mock(Stars::Formatter).new.times(any_times).with_any_args
13
16
  mock(Stars::Client).puts.times(any_times).with_any_args
17
+ mock(Stars::Client).gets.times(any_times).with_any_args.returns('q')
14
18
  Stars::Client.load!(nil)
15
19
  end
16
20
 
data/test/test_favstar.rb CHANGED
@@ -3,18 +3,14 @@ require 'helper'
3
3
  class TestFavstar < Test::Unit::TestCase
4
4
 
5
5
  def setup
6
- @favstar = Stars::Favstar.new('holman')
7
- end
8
-
9
- def test_sets_username
10
- assert_equal @favstar.username, 'holman'
6
+ @favstar = Stars::Favstar.new
11
7
  end
12
8
 
13
9
  def test_parties_hard
14
- mock(Stars::Favstar).get('/users/holman/rss') {
10
+ mock(Stars::Favstar).get('/users/holman/rss', :format => :xml) {
15
11
  {'rss' => {'channel' => {'item' => 'etc'} } }
16
12
  }
17
- @favstar.recent
13
+ @favstar.recent('holman')
18
14
  end
19
15
 
20
16
  end
@@ -19,9 +19,9 @@ class TestFormatter < Test::Unit::TestCase
19
19
  end
20
20
 
21
21
  def test_format
22
- format = @formatter.format(favstar_tweet_hash[0])
23
- assert_equal format.size, 3
24
- assert_equal format[0], '* *'
22
+ format = @formatter.format(1,favstar_tweet_hash[0])
23
+ assert_equal format.size, 4
24
+ assert_equal 1,format[0], '* *'
25
25
  end
26
26
 
27
27
  def test_split_stars
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 1
8
- - 1
9
- version: 0.1.1
7
+ - 2
8
+ - 0
9
+ version: 0.2.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Zach Holman
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-03-18 00:00:00 -07:00
17
+ date: 2010-03-25 00:00:00 -07:00
18
18
  default_executable: stars
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -41,6 +41,18 @@ dependencies:
41
41
  version: "0"
42
42
  type: :runtime
43
43
  version_requirements: *id002
44
+ - !ruby/object:Gem::Dependency
45
+ name: nokogiri
46
+ prerelease: false
47
+ requirement: &id003 !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ segments:
52
+ - 0
53
+ version: "0"
54
+ type: :runtime
55
+ version_requirements: *id003
44
56
  description: Recent favstar faves on your command line.
45
57
  email: github.com@zachholman.com
46
58
  executables: