twithub 0.1.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/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "http://rubygems.org"
2
+ gem 'feedzirra', :git => "https://github.com/pauldix/feedzirra.git", :tag => "v0.2.0.rc2"
3
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,59 @@
1
+ GIT
2
+ remote: https://github.com/pauldix/feedzirra.git
3
+ revision: fcdc0aeaa29efee2160651f12c71f81c82c65c32
4
+ tag: v0.2.0.rc2
5
+ specs:
6
+ feedzirra (0.2.0.rc2)
7
+ curb (~> 0.8.0)
8
+ gorillib (~> 0.1.9)
9
+ loofah (~> 1.2.1)
10
+ nokogiri (~> 1.5.3)
11
+ sax-machine (~> 0.2.0.rc1)
12
+
13
+ PATH
14
+ remote: .
15
+ specs:
16
+ twithub (0.1.0)
17
+ feedzirra
18
+ twitter
19
+
20
+ GEM
21
+ remote: http://rubygems.org/
22
+ specs:
23
+ curb (0.8.1)
24
+ diff-lcs (1.1.3)
25
+ faraday (0.8.1)
26
+ multipart-post (~> 1.1)
27
+ gorillib (0.1.11)
28
+ json
29
+ json (1.7.3)
30
+ loofah (1.2.1)
31
+ nokogiri (>= 1.4.4)
32
+ multi_json (1.3.6)
33
+ multipart-post (1.1.5)
34
+ nokogiri (1.5.5)
35
+ rake (0.9.2.2)
36
+ rspec (2.11.0)
37
+ rspec-core (~> 2.11.0)
38
+ rspec-expectations (~> 2.11.0)
39
+ rspec-mocks (~> 2.11.0)
40
+ rspec-core (2.11.1)
41
+ rspec-expectations (2.11.1)
42
+ diff-lcs (~> 1.1.3)
43
+ rspec-mocks (2.11.1)
44
+ sax-machine (0.2.0.rc1)
45
+ nokogiri (~> 1.5.2)
46
+ simple_oauth (0.1.8)
47
+ twitter (3.3.1)
48
+ faraday (~> 0.8)
49
+ multi_json (~> 1.3)
50
+ simple_oauth (~> 0.1.6)
51
+
52
+ PLATFORMS
53
+ ruby
54
+
55
+ DEPENDENCIES
56
+ feedzirra!
57
+ rake
58
+ rspec
59
+ twithub!
data/README.markdown ADDED
@@ -0,0 +1 @@
1
+ Just a little gem...
data/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec) do |s|
5
+ s.pattern = 'spec/**/*_spec.rb'
6
+ end
7
+ task :default => :spec
@@ -0,0 +1,18 @@
1
+ module Twithub
2
+ module EntryBuilderMethods
3
+ def with_content(content)
4
+ @content = content
5
+ self
6
+ end
7
+
8
+ def with_username(username)
9
+ @username = username
10
+ self
11
+ end
12
+
13
+ def with_posted_at(posted_at)
14
+ @posted_at = posted_at
15
+ self
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,12 @@
1
+ module Twithub
2
+ class FeedEntry
3
+ include Comparable
4
+ TWITTER = "twitter"
5
+ GITHUB = "github"
6
+ attr_reader :content, :posted_at, :origin, :username
7
+
8
+ def <=>(other_entry)
9
+ other_entry.posted_at <=> posted_at
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,11 @@
1
+ module Twithub
2
+ class Github
3
+ def self.entries_for(username)
4
+ return [] unless username
5
+ url = "http://github.com/#{username}.atom"
6
+ Feedzirra::Feed.fetch_and_parse(url).entries.map do |entry|
7
+ GithubEntry.new.with_content(entry.title).with_username(entry.author).with_posted_at(entry.published)
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,9 @@
1
+
2
+ module Twithub
3
+ class GithubEntry < FeedEntry
4
+ include Twithub::EntryBuilderMethods
5
+ def initialize
6
+ @origin = GITHUB
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,10 @@
1
+ module Twithub
2
+ class Twitter
3
+ def self.entries_for(username)
4
+ return [] unless username
5
+ ::Twitter.user_timeline(username).map do |status|
6
+ TwitterEntry.new.with_content(status.text).with_username(status.from_user).with_posted_at(status.created_at)
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,9 @@
1
+
2
+ module Twithub
3
+ class TwitterEntry < FeedEntry
4
+ include Twithub::EntryBuilderMethods
5
+ def initialize
6
+ @origin = TWITTER
7
+ end
8
+ end
9
+ end
data/lib/twithub.rb ADDED
@@ -0,0 +1,16 @@
1
+ require 'twitter'
2
+ require 'feedzirra'
3
+ require_relative 'twithub/entry_builder_methods'
4
+ require_relative 'twithub/feed_entry'
5
+ require_relative 'twithub/twitter'
6
+ require_relative 'twithub/github'
7
+ require_relative 'twithub/twitter_entry'
8
+ require_relative 'twithub/github_entry'
9
+
10
+ module Twithub
11
+ def entries_for(params)
12
+ entries = Twitter.entries_for(params[:twitter]) + Github.entries_for(params[:github])
13
+ entries.sort
14
+ end
15
+ module_function :entries_for
16
+ end
@@ -0,0 +1,27 @@
1
+ require_relative '../../lib/twithub'
2
+ describe Twithub::FeedEntry do
3
+ describe "an empty base entry" do
4
+ it "should have no attributes filled out by default" do
5
+ entry = Twithub::FeedEntry.new
6
+ entry.content.should be_nil
7
+ entry.username.should be_nil
8
+ entry.posted_at.should be_nil
9
+ entry.origin.should be_nil
10
+ end
11
+
12
+ describe "two entries with stubbed out times" do
13
+ let(:old_entry) { Twithub::FeedEntry.new }
14
+ let(:new_entry) { Twithub::FeedEntry.new }
15
+
16
+ before do
17
+ old_entry.stub(:posted_at).and_return(Time.parse("Jan 1 2011"))
18
+ new_entry.stub(:posted_at).and_return(Time.now)
19
+ end
20
+
21
+ it "should allow comparing the entries to one another" do
22
+ (old_entry > new_entry).should be_true
23
+ (old_entry < new_entry).should be_false
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,15 @@
1
+ require_relative '../../lib/twithub'
2
+
3
+ describe Twithub::GithubEntry do
4
+ let(:time) { Time.now }
5
+ let(:text) { "just a random content string" }
6
+ let(:username) { "randomusername" }
7
+
8
+ it "should allow building of a twitter entry" do
9
+ entry = Twithub::GithubEntry.new.with_content(text).with_username(username).with_posted_at(time)
10
+ entry.content.should == text
11
+ entry.username.should == username
12
+ entry.posted_at.should == time
13
+ entry.origin.should == Twithub::FeedEntry::GITHUB
14
+ end
15
+ end
@@ -0,0 +1,41 @@
1
+ require_relative '../../lib/twithub'
2
+
3
+ describe Twithub::Github do
4
+ describe "when given a valid login" do
5
+ let(:early_time) { Time.parse("Jan 1 2011 1:00EST") }
6
+ let(:recent_time) { Time.now }
7
+ let(:username) { "pzimbelman" }
8
+ let(:url) { "http://github.com/#{username}.atom" }
9
+ let(:first_github_response) { double("git", :title => "pushed to master!", :author => username, :published => recent_time) }
10
+ let(:second_github_response) { double("git", :title => "pushed to branch", :author => username, :published => early_time) }
11
+ let(:responses) { [first_github_response, second_github_response] }
12
+
13
+ before do
14
+ Feedzirra::Feed.should_receive(:fetch_and_parse).with(url).and_return(responses)
15
+ end
16
+
17
+ it "should return twitter entries for the values fetched from twitter" do
18
+ entries = Twithub::Github.entries_for("pzimbelman")
19
+ entries.size.should == 2
20
+ entries.first.is_a?(Twithub::GithubEntry).should be_true
21
+ entries.first.content.should == first_github_response.title
22
+ entries.first.username.should == username
23
+ entries.first.posted_at.should == recent_time
24
+
25
+ entries.last.is_a?(Twithub::GithubEntry).should be_true
26
+ entries.last.content.should == second_github_response.title
27
+ entries.last.username.should == username
28
+ entries.last.posted_at.should == early_time
29
+ end
30
+ end
31
+
32
+ describe "when given nil" do
33
+ before do
34
+ Feedzirra::Feed.should_receive(:fetch_and_parse).never
35
+ end
36
+
37
+ it "should not call feedzirra and return no entries" do
38
+ Twithub::Github.entries_for(nil).should == []
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,15 @@
1
+ require_relative '../../lib/twithub'
2
+
3
+ describe Twithub::TwitterEntry do
4
+ let(:time) { Time.now }
5
+ let(:text) { "just a random content string" }
6
+ let(:username) { "randomusername" }
7
+
8
+ it "should allow building of a twitter entry" do
9
+ entry = Twithub::TwitterEntry.new.with_content(text).with_username(username).with_posted_at(time)
10
+ entry.content.should == text
11
+ entry.username.should == username
12
+ entry.posted_at.should == time
13
+ entry.origin.should == Twithub::FeedEntry::TWITTER
14
+ end
15
+ end
@@ -0,0 +1,40 @@
1
+ require_relative '../../lib/twithub'
2
+
3
+ describe Twithub::Twitter do
4
+ describe "when given a valid login" do
5
+ let(:early_time) { Time.parse("Jan 1 2011 1:00EST") }
6
+ let(:recent_time) { Time.now }
7
+ let(:username) { "pzimbelman" }
8
+ let(:first_twitter_response) { double("twitter", :text => "the tweet!", :from_user => username, :created_at => recent_time) }
9
+ let(:second_twitter_response) { double("twitter", :text => "the early tweet!", :from_user => username, :created_at => early_time) }
10
+
11
+ before do
12
+ Twitter.should_receive(:user_timeline).with(username).and_return([first_twitter_response,
13
+ second_twitter_response])
14
+ end
15
+
16
+ it "should return twitter entries for the values fetched from twitter" do
17
+ entries = Twithub::Twitter.entries_for("pzimbelman")
18
+ entries.size.should == 2
19
+ entries.first.is_a?(Twithub::TwitterEntry).should be_true
20
+ entries.first.content.should == "the tweet!"
21
+ entries.first.username.should == username
22
+ entries.first.posted_at.should == recent_time
23
+
24
+ entries.last.is_a?(Twithub::TwitterEntry).should be_true
25
+ entries.last.content.should == "the early tweet!"
26
+ entries.last.username.should == username
27
+ entries.last.posted_at.should == early_time
28
+ end
29
+ end
30
+
31
+ describe "when given nil" do
32
+ before do
33
+ ::Twitter.should_receive(:user_timeline).never
34
+ end
35
+
36
+ it "should not call twitter and return no entries" do
37
+ Twithub::Twitter.entries_for(nil).should == []
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,33 @@
1
+ require_relative '../lib/twithub'
2
+
3
+ describe Twithub do
4
+ let(:twitter_name) { "twitteruser" }
5
+ let(:github_name) {"gituser" }
6
+ describe "with the twitter response being more recent" do
7
+ let(:github_entry) {Twithub::GithubEntry.new.with_content("foo").with_username(twitter_name).with_posted_at(Time.parse("Jan 1 2011")) }
8
+ let(:twitter_entry) {Twithub::TwitterEntry.new.with_content("bar").with_username(github_name).with_posted_at(Time.now) }
9
+
10
+ before do
11
+ Twithub::Github.should_receive(:entries_for).with(github_name).and_return([github_entry])
12
+ Twithub::Twitter.should_receive(:entries_for).with(twitter_name).and_return([twitter_entry])
13
+ end
14
+
15
+ it "should call to the proper services and return sorted results" do
16
+ Twithub.entries_for(:twitter => twitter_name, :github => github_name).should == [twitter_entry, github_entry]
17
+ end
18
+ end
19
+
20
+ describe "with the github response being more recent" do
21
+ let(:github_entry) {Twithub::GithubEntry.new.with_content("foo").with_username(twitter_name).with_posted_at(Time.now) }
22
+ let(:twitter_entry) {Twithub::TwitterEntry.new.with_content("bar").with_username(github_name).with_posted_at(Time.parse("Jan 1 2011")) }
23
+
24
+ before do
25
+ Twithub::Github.should_receive(:entries_for).with(github_name).and_return([github_entry])
26
+ Twithub::Twitter.should_receive(:entries_for).with(twitter_name).and_return([twitter_entry])
27
+ end
28
+
29
+ it "should call to the proper services and return sorted results" do
30
+ Twithub.entries_for(:twitter => twitter_name, :github => github_name).should == [github_entry, twitter_entry]
31
+ end
32
+ end
33
+ end
data/twithub.gemspec ADDED
@@ -0,0 +1,20 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = "twithub"
3
+ s.version = "0.1.0"
4
+ s.authors = ["Peter Zimbelman"]
5
+ s.email = ["pzimbelman@gmail.com"]
6
+ s.homepage = "https://github.com/pzimbelman/twithub"
7
+ s.summary = %q{A gem to aggregate your recent twitter and github activity}
8
+ s.description = %q{A gem to aggregate your recent twitter and github activity into a single feed. Can accept multiple logins for either service.}
9
+
10
+ s.files = `git ls-files`.split("\n")
11
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
12
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
13
+ s.require_paths = ["lib"]
14
+
15
+ s.add_development_dependency "rspec"
16
+ s.add_development_dependency "rake"
17
+ s.add_runtime_dependency "activesupport", "= 3.1.1"
18
+ s.add_dependency "twitter"
19
+ s.add_dependency "feedzirra"
20
+ end
metadata ADDED
@@ -0,0 +1,125 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: twithub
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Peter Zimbelman
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-07-19 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: &70238926483460 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *70238926483460
25
+ - !ruby/object:Gem::Dependency
26
+ name: rake
27
+ requirement: &70238926483000 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *70238926483000
36
+ - !ruby/object:Gem::Dependency
37
+ name: activesupport
38
+ requirement: &70238926482460 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - =
42
+ - !ruby/object:Gem::Version
43
+ version: 3.1.1
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *70238926482460
47
+ - !ruby/object:Gem::Dependency
48
+ name: twitter
49
+ requirement: &70238926482000 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: *70238926482000
58
+ - !ruby/object:Gem::Dependency
59
+ name: feedzirra
60
+ requirement: &70238926481520 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ type: :runtime
67
+ prerelease: false
68
+ version_requirements: *70238926481520
69
+ description: A gem to aggregate your recent twitter and github activity into a single
70
+ feed. Can accept multiple logins for either service.
71
+ email:
72
+ - pzimbelman@gmail.com
73
+ executables: []
74
+ extensions: []
75
+ extra_rdoc_files: []
76
+ files:
77
+ - Gemfile
78
+ - Gemfile.lock
79
+ - README.markdown
80
+ - Rakefile
81
+ - lib/twithub.rb
82
+ - lib/twithub/entry_builder_methods.rb
83
+ - lib/twithub/feed_entry.rb
84
+ - lib/twithub/github.rb
85
+ - lib/twithub/github_entry.rb
86
+ - lib/twithub/twitter.rb
87
+ - lib/twithub/twitter_entry.rb
88
+ - spec/twithub/feed_entry_spec.rb
89
+ - spec/twithub/github_entry_spec.rb
90
+ - spec/twithub/github_spec.rb
91
+ - spec/twithub/twitter_entry_spec.rb
92
+ - spec/twithub/twitter_spec.rb
93
+ - spec/twithub_spec.rb
94
+ - twithub.gemspec
95
+ homepage: https://github.com/pzimbelman/twithub
96
+ licenses: []
97
+ post_install_message:
98
+ rdoc_options: []
99
+ require_paths:
100
+ - lib
101
+ required_ruby_version: !ruby/object:Gem::Requirement
102
+ none: false
103
+ requirements:
104
+ - - ! '>='
105
+ - !ruby/object:Gem::Version
106
+ version: '0'
107
+ required_rubygems_version: !ruby/object:Gem::Requirement
108
+ none: false
109
+ requirements:
110
+ - - ! '>='
111
+ - !ruby/object:Gem::Version
112
+ version: '0'
113
+ requirements: []
114
+ rubyforge_project:
115
+ rubygems_version: 1.8.17
116
+ signing_key:
117
+ specification_version: 3
118
+ summary: A gem to aggregate your recent twitter and github activity
119
+ test_files:
120
+ - spec/twithub/feed_entry_spec.rb
121
+ - spec/twithub/github_entry_spec.rb
122
+ - spec/twithub/github_spec.rb
123
+ - spec/twithub/twitter_entry_spec.rb
124
+ - spec/twithub/twitter_spec.rb
125
+ - spec/twithub_spec.rb