earthquake 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.txt
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/Gemfile ADDED
@@ -0,0 +1,21 @@
1
+ source "http://rubygems.org"
2
+ # Add dependencies required to use your gem here.
3
+ # Example:
4
+ # gem "activesupport", ">= 2.3.5"
5
+
6
+ gem 'twitter-stream', :require => 'twitter/json_stream'
7
+ gem 'notify'
8
+ gem 'i18n'
9
+ gem 'activesupport', :require => 'active_support/core_ext'
10
+ gem 'awesome_print', :require => 'ap'
11
+ gem 'launchy'
12
+ gem 'oauth'
13
+
14
+ # Add dependencies to develop your gem here.
15
+ # Include everything needed to run rake, tests, features, etc.
16
+ group :development do
17
+ gem "rspec", "~> 2.3.0"
18
+ gem "bundler", "~> 1.0.0"
19
+ gem "jeweler", "~> 1.5.2"
20
+ gem "rcov", ">= 0"
21
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,49 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ activesupport (3.0.5)
5
+ awesome_print (0.3.2)
6
+ configuration (1.2.0)
7
+ diff-lcs (1.1.2)
8
+ eventmachine (0.12.10)
9
+ git (1.2.5)
10
+ i18n (0.5.0)
11
+ jeweler (1.5.2)
12
+ bundler (~> 1.0.0)
13
+ git (>= 1.2.5)
14
+ rake
15
+ launchy (0.4.0)
16
+ configuration (>= 0.0.5)
17
+ rake (>= 0.8.1)
18
+ notify (0.3.0)
19
+ oauth (0.4.4)
20
+ rake (0.8.7)
21
+ rcov (0.9.9)
22
+ roauth (0.0.3)
23
+ rspec (2.3.0)
24
+ rspec-core (~> 2.3.0)
25
+ rspec-expectations (~> 2.3.0)
26
+ rspec-mocks (~> 2.3.0)
27
+ rspec-core (2.3.1)
28
+ rspec-expectations (2.3.0)
29
+ diff-lcs (~> 1.1.2)
30
+ rspec-mocks (2.3.0)
31
+ twitter-stream (0.1.12)
32
+ eventmachine (>= 0.12.8)
33
+ roauth (>= 0.0.2)
34
+
35
+ PLATFORMS
36
+ ruby
37
+
38
+ DEPENDENCIES
39
+ activesupport
40
+ awesome_print
41
+ bundler (~> 1.0.0)
42
+ i18n
43
+ jeweler (~> 1.5.2)
44
+ launchy
45
+ notify
46
+ oauth
47
+ rcov
48
+ rspec (~> 2.3.0)
49
+ twitter-stream
data/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 jugyo
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,30 @@
1
+ Earthquake
2
+ ====
3
+
4
+ Twitter Client on Terminal with Streaming API.
5
+
6
+ Install
7
+ ----
8
+
9
+ gem install earthquake
10
+
11
+ Usage
12
+ ----
13
+
14
+ ### Run
15
+
16
+ $ earthquake
17
+
18
+ TODO
19
+ ----
20
+
21
+ * plugin system
22
+ * command
23
+ * filter
24
+ * colorize
25
+ * reconnect
26
+
27
+ Copyright
28
+ ----
29
+
30
+ Copyright (c) 2011 jugyo. See LICENSE.txt for further details.
data/Rakefile ADDED
@@ -0,0 +1,45 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'rake'
11
+
12
+ require 'jeweler'
13
+ Jeweler::Tasks.new do |gem|
14
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
15
+ gem.name = "earthquake"
16
+ gem.homepage = "http://github.com/jugyo/earthquake"
17
+ gem.license = "MIT"
18
+ gem.summary = %Q{Twitter Client on Terminal.}
19
+ gem.description = %Q{Twitter Client on Terminal with Twitter Streaming API.}
20
+ gem.email = "jugyo.org@gmail.com"
21
+ gem.authors = ["jugyo"]
22
+ # Include your dependencies below. Runtime dependencies are required when using your gem,
23
+ # and development dependencies are only needed for development (ie running rake tasks, tests, etc)
24
+ # gem.add_runtime_dependency 'jabber4r', '> 0.1'
25
+ # gem.add_development_dependency 'rspec', '> 1.2.3'
26
+ end
27
+ Jeweler::RubygemsDotOrgTasks.new
28
+
29
+ require 'rspec/core'
30
+ require 'rspec/core/rake_task'
31
+ RSpec::Core::RakeTask.new(:spec) do |spec|
32
+ spec.pattern = FileList['spec/**/*_spec.rb']
33
+ end
34
+
35
+ task :default => :spec
36
+
37
+ require 'rake/rdoctask'
38
+ Rake::RDocTask.new do |rdoc|
39
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
40
+
41
+ rdoc.rdoc_dir = 'rdoc'
42
+ rdoc.title = "earthquake #{version}"
43
+ rdoc.rdoc_files.include('README*')
44
+ rdoc.rdoc_files.include('lib/**/*.rb')
45
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.2
data/bin/earthquake ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ $:.unshift(File.expand_path('../../lib', __FILE__))
3
+ require 'earthquake'
4
+ Earthquake.start(ARGV)
data/lib/earthquake.rb ADDED
@@ -0,0 +1,13 @@
1
+ require 'json'
2
+ require 'thread'
3
+ require 'readline'
4
+ require 'bundler/setup'
5
+ Bundler.require :default
6
+
7
+ $:.unshift File.expand_path('..', __FILE__)
8
+
9
+ require 'earthquake/core'
10
+
11
+ module Earthquake
12
+ extend Earthquake::Core
13
+ end
@@ -0,0 +1,138 @@
1
+ module Earthquake
2
+ module Core
3
+ attr_accessor :config
4
+ attr_reader :item_queue
5
+
6
+ def init(*argv)
7
+ # TODO: parse argv
8
+ self.config = {
9
+ :dir => File.expand_path('~/.earthquake'),
10
+ :consumer_key => 'qOdgatiUm6HIRcdoGVqaZg',
11
+ :consumer_secret => 'DHcL0bmS02vjSMHMrbFxCQqbDxh8yJZuLuzKviyFMo'
12
+ }
13
+ config[:file] ||= File.join(config[:dir], 'config')
14
+ load config[:file]
15
+
16
+ get_access_token unless self.config[:access_key] && self.config[:access_secret]
17
+ end
18
+
19
+ def get_access_token
20
+ consumer = OAuth::Consumer.new(
21
+ self.config[:consumer_key],
22
+ self.config[:consumer_secret],
23
+ :site => 'http://api.twitter.com'
24
+ )
25
+ request_token = consumer.get_request_token
26
+
27
+ puts "1) open: #{request_token.authorize_url}"
28
+ Launchy::Browser.run(request_token.authorize_url)
29
+
30
+ print "2) Enter the PIN: "
31
+ pin = gets.strip
32
+
33
+ access_token = request_token.get_access_token(:oauth_verifier => pin)
34
+ config[:access_key] = access_token.token
35
+ config[:access_secret] = access_token.secret
36
+
37
+ puts "Saving 'access_key' and 'access_secret' to '#{config[:file]}'"
38
+ File.open(config[:file], 'a') do |f|
39
+ f << "\n"
40
+ f << "Earthquake.config[:access_key] = '#{config[:access_key]}'"
41
+ f << "\n"
42
+ f << "Earthquake.config[:access_secret] = '#{config[:access_secret]}'"
43
+ end
44
+ end
45
+
46
+ def start(*argv)
47
+ init(*argv)
48
+
49
+ @item_queue = []
50
+
51
+ Thread.abort_on_exception = true
52
+
53
+ Thread.start do
54
+ while buf = Readline.readline("[earthquake] ", true)
55
+ begin
56
+ buf = buf.strip
57
+
58
+ if buf == '/exit'
59
+ # TODO: refactor
60
+ @stream.stop if @stream
61
+ EventMachine.stop if EventMachine.reactor_running?
62
+ end
63
+ rescue => e
64
+ notify "[ERROR] #{e}"
65
+ end
66
+ end
67
+ end
68
+
69
+ Thread.start do
70
+ loop do
71
+ # TODO: handle the response that include friends
72
+ if Readline.line_buffer.empty?
73
+ while item = item_queue.shift
74
+ begin
75
+ insert "#{item["user"]["screen_name"]}: #{item["text"]}"
76
+ rescue => e
77
+ insert do
78
+ ap item
79
+ end
80
+ # notify "[ERROR] #{e}"
81
+ end
82
+ end
83
+ end
84
+ sleep 1
85
+ end
86
+ end
87
+
88
+ EventMachine::run {
89
+ @stream = Twitter::JSONStream.connect(
90
+ :ssl => true,
91
+ :host => 'userstream.twitter.com',
92
+ :path => '/2/user.json',
93
+ :oauth => config.slice(:consumer_key, :consumer_secret, :access_key, :access_secret)
94
+ )
95
+
96
+ @stream.each_item do |item|
97
+ item_queue << JSON.parse(item)
98
+ end
99
+
100
+ @stream.on_error do |message|
101
+ $stdout.print "error: #{message}\n"
102
+ $stdout.flush
103
+ end
104
+
105
+ @stream.on_reconnect do |timeout, retries|
106
+ $stdout.print "reconnecting in: #{timeout} seconds\n"
107
+ $stdout.flush
108
+ end
109
+
110
+ @stream.on_max_reconnects do |timeout, retries|
111
+ $stdout.print "Failed after #{retries} failed reconnects\n"
112
+ $stdout.flush
113
+ end
114
+
115
+ trap('TERM') {
116
+ @stream.stop
117
+ EventMachine.stop if EventMachine.reactor_running?
118
+ }
119
+ }
120
+ end
121
+
122
+ def notify(message)
123
+ Notify.notify 'earthquake', message
124
+ end
125
+
126
+ def insert(*messages)
127
+ clear_line
128
+ puts messages unless messages.empty?
129
+ yield if block_given?
130
+ ensure
131
+ Readline.refresh_line
132
+ end
133
+
134
+ def clear_line
135
+ print "\e[0G" + "\e[K"
136
+ end
137
+ end
138
+ end
@@ -0,0 +1,7 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "Earthquake" do
4
+ it "fails" do
5
+ fail "hey buddy, you should probably rename this file and start specing for real"
6
+ end
7
+ end
@@ -0,0 +1,12 @@
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
3
+ require 'rspec'
4
+ require 'earthquake'
5
+
6
+ # Requires supporting files with custom matchers and macros, etc,
7
+ # in ./support/ and its subdirectories.
8
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
9
+
10
+ RSpec.configure do |config|
11
+
12
+ end
metadata ADDED
@@ -0,0 +1,193 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: earthquake
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.0.2
6
+ platform: ruby
7
+ authors:
8
+ - jugyo
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-03-16 00:00:00 +09:00
14
+ default_executable: earthquake
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: twitter-stream
18
+ requirement: &id001 !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ type: :runtime
25
+ prerelease: false
26
+ version_requirements: *id001
27
+ - !ruby/object:Gem::Dependency
28
+ name: notify
29
+ requirement: &id002 !ruby/object:Gem::Requirement
30
+ none: false
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: "0"
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: *id002
38
+ - !ruby/object:Gem::Dependency
39
+ name: i18n
40
+ requirement: &id003 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ version: "0"
46
+ type: :runtime
47
+ prerelease: false
48
+ version_requirements: *id003
49
+ - !ruby/object:Gem::Dependency
50
+ name: activesupport
51
+ requirement: &id004 !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: "0"
57
+ type: :runtime
58
+ prerelease: false
59
+ version_requirements: *id004
60
+ - !ruby/object:Gem::Dependency
61
+ name: awesome_print
62
+ requirement: &id005 !ruby/object:Gem::Requirement
63
+ none: false
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: "0"
68
+ type: :runtime
69
+ prerelease: false
70
+ version_requirements: *id005
71
+ - !ruby/object:Gem::Dependency
72
+ name: launchy
73
+ requirement: &id006 !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: "0"
79
+ type: :runtime
80
+ prerelease: false
81
+ version_requirements: *id006
82
+ - !ruby/object:Gem::Dependency
83
+ name: oauth
84
+ requirement: &id007 !ruby/object:Gem::Requirement
85
+ none: false
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: "0"
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: *id007
93
+ - !ruby/object:Gem::Dependency
94
+ name: rspec
95
+ requirement: &id008 !ruby/object:Gem::Requirement
96
+ none: false
97
+ requirements:
98
+ - - ~>
99
+ - !ruby/object:Gem::Version
100
+ version: 2.3.0
101
+ type: :development
102
+ prerelease: false
103
+ version_requirements: *id008
104
+ - !ruby/object:Gem::Dependency
105
+ name: bundler
106
+ requirement: &id009 !ruby/object:Gem::Requirement
107
+ none: false
108
+ requirements:
109
+ - - ~>
110
+ - !ruby/object:Gem::Version
111
+ version: 1.0.0
112
+ type: :development
113
+ prerelease: false
114
+ version_requirements: *id009
115
+ - !ruby/object:Gem::Dependency
116
+ name: jeweler
117
+ requirement: &id010 !ruby/object:Gem::Requirement
118
+ none: false
119
+ requirements:
120
+ - - ~>
121
+ - !ruby/object:Gem::Version
122
+ version: 1.5.2
123
+ type: :development
124
+ prerelease: false
125
+ version_requirements: *id010
126
+ - !ruby/object:Gem::Dependency
127
+ name: rcov
128
+ requirement: &id011 !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ">="
132
+ - !ruby/object:Gem::Version
133
+ version: "0"
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: *id011
137
+ description: Twitter Client on Terminal with Twitter Streaming API.
138
+ email: jugyo.org@gmail.com
139
+ executables:
140
+ - earthquake
141
+ extensions: []
142
+
143
+ extra_rdoc_files:
144
+ - LICENSE.txt
145
+ - README.md
146
+ files:
147
+ - .document
148
+ - .rspec
149
+ - Gemfile
150
+ - Gemfile.lock
151
+ - LICENSE.txt
152
+ - README.md
153
+ - Rakefile
154
+ - VERSION
155
+ - bin/earthquake
156
+ - lib/earthquake.rb
157
+ - lib/earthquake/core.rb
158
+ - spec/earthquake_spec.rb
159
+ - spec/spec_helper.rb
160
+ has_rdoc: true
161
+ homepage: http://github.com/jugyo/earthquake
162
+ licenses:
163
+ - MIT
164
+ post_install_message:
165
+ rdoc_options: []
166
+
167
+ require_paths:
168
+ - lib
169
+ required_ruby_version: !ruby/object:Gem::Requirement
170
+ none: false
171
+ requirements:
172
+ - - ">="
173
+ - !ruby/object:Gem::Version
174
+ hash: 2067108568798120051
175
+ segments:
176
+ - 0
177
+ version: "0"
178
+ required_rubygems_version: !ruby/object:Gem::Requirement
179
+ none: false
180
+ requirements:
181
+ - - ">="
182
+ - !ruby/object:Gem::Version
183
+ version: "0"
184
+ requirements: []
185
+
186
+ rubyforge_project:
187
+ rubygems_version: 1.6.0
188
+ signing_key:
189
+ specification_version: 3
190
+ summary: Twitter Client on Terminal.
191
+ test_files:
192
+ - spec/earthquake_spec.rb
193
+ - spec/spec_helper.rb