twterm 1.1.3 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/twterm +4 -4
- data/lib/twterm/app.rb +19 -4
- data/lib/twterm/client.rb +8 -470
- data/lib/twterm/direct_message.rb +82 -0
- data/lib/twterm/direct_message_composer.rb +74 -0
- data/lib/twterm/direct_message_manager.rb +52 -0
- data/lib/twterm/event/base.rb +22 -0
- data/lib/twterm/event/direct_message/fetched.rb +10 -0
- data/lib/twterm/event/favorite.rb +18 -0
- data/lib/twterm/event/follow.rb +17 -0
- data/lib/twterm/event/notification.rb +33 -0
- data/lib/twterm/event/open_uri.rb +11 -0
- data/lib/twterm/event/screen/resize.rb +13 -0
- data/lib/twterm/event/status/base.rb +14 -0
- data/lib/twterm/event/status/delete.rb +13 -0
- data/lib/twterm/event/status/mention.rb +10 -0
- data/lib/twterm/event/status/timeline.rb +10 -0
- data/lib/twterm/event_dispatcher.rb +59 -0
- data/lib/twterm/filter_query_window.rb +11 -5
- data/lib/twterm/filterable_list.rb +6 -1
- data/lib/twterm/notifier.rb +39 -15
- data/lib/twterm/promise.rb +2 -2
- data/lib/twterm/publisher.rb +16 -0
- data/lib/twterm/rest_client.rb +401 -0
- data/lib/twterm/screen.rb +16 -13
- data/lib/twterm/status.rb +12 -1
- data/lib/twterm/streaming_client.rb +103 -0
- data/lib/twterm/subscriber.rb +33 -0
- data/lib/twterm/tab/base.rb +13 -6
- data/lib/twterm/tab/direct_message/conversation.rb +103 -0
- data/lib/twterm/tab/direct_message/conversation_list.rb +99 -0
- data/lib/twterm/tab/key_assignments_cheatsheet.rb +3 -2
- data/lib/twterm/tab/new/list.rb +5 -3
- data/lib/twterm/tab/new/search.rb +3 -2
- data/lib/twterm/tab/new/start.rb +17 -2
- data/lib/twterm/tab/new/user.rb +6 -3
- data/lib/twterm/tab/statuses/base.rb +18 -11
- data/lib/twterm/tab/statuses/conversation.rb +3 -2
- data/lib/twterm/tab/statuses/favorites.rb +3 -2
- data/lib/twterm/tab/statuses/home.rb +10 -4
- data/lib/twterm/tab/statuses/list_timeline.rb +3 -2
- data/lib/twterm/tab/statuses/mentions.rb +6 -6
- data/lib/twterm/tab/statuses/search.rb +4 -3
- data/lib/twterm/tab/statuses/user_timeline.rb +3 -2
- data/lib/twterm/tab/user_tab.rb +26 -16
- data/lib/twterm/tab/users/base.rb +3 -2
- data/lib/twterm/tab/users/followers.rb +3 -2
- data/lib/twterm/tab/users/friends.rb +3 -2
- data/lib/twterm/tab_manager.rb +20 -8
- data/lib/twterm/tweetbox.rb +5 -2
- data/lib/twterm/uri_opener.rb +25 -0
- data/lib/twterm/user.rb +11 -1
- data/lib/twterm/utils.rb +13 -0
- data/lib/twterm/version.rb +1 -1
- data/lib/twterm.rb +0 -3
- data/spec/twterm/event/screen/resize_spec.rb +11 -0
- data/spec/twterm/event_dispatcher_spec.rb +19 -0
- data/twterm.gemspec +1 -1
- metadata +29 -7
- data/lib/twterm/notification/base.rb +0 -24
- data/lib/twterm/notification/error.rb +0 -19
- data/lib/twterm/notification/message.rb +0 -19
data/lib/twterm/tab_manager.rb
CHANGED
@@ -1,12 +1,20 @@
|
|
1
|
+
require 'twterm/event/screen/resize'
|
2
|
+
require 'twterm/publisher'
|
3
|
+
require 'twterm/subscriber'
|
4
|
+
require 'twterm/utils'
|
5
|
+
|
1
6
|
module Twterm
|
2
7
|
class TabManager
|
3
8
|
include Singleton
|
4
9
|
include Curses
|
10
|
+
include Publisher
|
11
|
+
include Subscriber
|
12
|
+
include Utils
|
5
13
|
|
6
14
|
DUMPED_TABS_FILE = "#{ENV['HOME']}/.twterm/dumped_tabs"
|
7
15
|
|
8
16
|
def add(tab_to_add)
|
9
|
-
|
17
|
+
check_type Tab::Base, tab_to_add
|
10
18
|
|
11
19
|
@tabs.each.with_index do |tab, i|
|
12
20
|
next unless tab == tab_to_add
|
@@ -37,7 +45,7 @@ module Twterm
|
|
37
45
|
current_tab.refresh
|
38
46
|
refresh_window
|
39
47
|
rescue Tab::NotClosableError
|
40
|
-
|
48
|
+
publish(Event::Notification.new(:error, 'this tab cannot be closed'))
|
41
49
|
end
|
42
50
|
|
43
51
|
def current_tab
|
@@ -67,6 +75,8 @@ module Twterm
|
|
67
75
|
@history = []
|
68
76
|
|
69
77
|
@window = stdscr.subwin(3, stdscr.maxx, 0, 0)
|
78
|
+
|
79
|
+
subscribe(Event::Screen::Resize, :resize)
|
70
80
|
end
|
71
81
|
|
72
82
|
def open_my_profile
|
@@ -93,7 +103,7 @@ module Twterm
|
|
93
103
|
add(tab)
|
94
104
|
end
|
95
105
|
rescue
|
96
|
-
|
106
|
+
publish(Event::Notification.new(:error, 'Failed to recover tabs'))
|
97
107
|
end
|
98
108
|
|
99
109
|
def refresh_window
|
@@ -116,11 +126,6 @@ module Twterm
|
|
116
126
|
@window.refresh
|
117
127
|
end
|
118
128
|
|
119
|
-
def resize
|
120
|
-
@window.resize(3, stdscr.maxx)
|
121
|
-
@window.move(0, 0)
|
122
|
-
end
|
123
|
-
|
124
129
|
def respond_to_key(key)
|
125
130
|
case key
|
126
131
|
when ?1..?9
|
@@ -163,5 +168,12 @@ module Twterm
|
|
163
168
|
close
|
164
169
|
add_and_show(tab)
|
165
170
|
end
|
171
|
+
|
172
|
+
private
|
173
|
+
|
174
|
+
def resize(event)
|
175
|
+
@window.resize(3, stdscr.maxx)
|
176
|
+
@window.move(0, 0)
|
177
|
+
end
|
166
178
|
end
|
167
179
|
end
|
data/lib/twterm/tweetbox.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'twterm/publisher'
|
2
|
+
|
1
3
|
module Twterm
|
2
4
|
class Tweetbox
|
3
5
|
class EmptyTextError < StandardError; end
|
@@ -7,6 +9,7 @@ module Twterm
|
|
7
9
|
include Singleton
|
8
10
|
include Readline
|
9
11
|
include Curses
|
12
|
+
include Publisher
|
10
13
|
|
11
14
|
def compose(in_reply_to = nil)
|
12
15
|
@text = ''
|
@@ -94,9 +97,9 @@ module Twterm
|
|
94
97
|
rescue EmptyTextError
|
95
98
|
# do nothing
|
96
99
|
rescue InvalidCharactersError
|
97
|
-
|
100
|
+
publish(Event::Notification.new(:error, 'Text contains invalid characters'))
|
98
101
|
rescue TextTooLongError
|
99
|
-
|
102
|
+
publish(Event::Notification.new(:error, "Text is too long (#{text_length} / 140 characters)"))
|
100
103
|
ensure
|
101
104
|
clear
|
102
105
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'launchy'
|
2
|
+
require 'singleton'
|
3
|
+
require 'twterm/event/open_uri'
|
4
|
+
require 'twterm/publisher'
|
5
|
+
require 'twterm/subscriber'
|
6
|
+
|
7
|
+
module Twterm
|
8
|
+
class URIOpener
|
9
|
+
include Publisher
|
10
|
+
include Singleton
|
11
|
+
include Subscriber
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
subscribe(Event::OpenURI) { |e| open e.uri }
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def open(uri)
|
20
|
+
Launchy.open(uri)
|
21
|
+
rescue Launchy::CommandNotFoundError
|
22
|
+
publish(Event::Notification.new(:error, 'Browser not found'))
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/twterm/user.rb
CHANGED
@@ -61,6 +61,8 @@ module Twterm
|
|
61
61
|
end
|
62
62
|
|
63
63
|
def update!(user)
|
64
|
+
return self if recently_updated?
|
65
|
+
|
64
66
|
@name = user.name
|
65
67
|
@screen_name = user.screen_name
|
66
68
|
@description = user.description || ''
|
@@ -87,6 +89,8 @@ module Twterm
|
|
87
89
|
Friendship.following_not_requested(client_id, user.id)
|
88
90
|
end
|
89
91
|
|
92
|
+
@updated_at = Time.now
|
93
|
+
|
90
94
|
self
|
91
95
|
end
|
92
96
|
|
@@ -116,7 +120,7 @@ module Twterm
|
|
116
120
|
cond = -> (user) { user.touched_at > Time.now - MAX_CACHED_TIME }
|
117
121
|
users = all.select(&cond)
|
118
122
|
user_ids = users.map(&:id)
|
119
|
-
@@instances = user_ids.zip(users)
|
123
|
+
@@instances = Hash[user_ids.zip(users)]
|
120
124
|
end
|
121
125
|
|
122
126
|
def self.ids
|
@@ -127,5 +131,11 @@ module Twterm
|
|
127
131
|
instance = find(user.id)
|
128
132
|
instance.nil? ? super : instance.update!(user)
|
129
133
|
end
|
134
|
+
|
135
|
+
private
|
136
|
+
|
137
|
+
def recently_updated?
|
138
|
+
!@updated_at.nil? && @updated_at + 60 > Time.now
|
139
|
+
end
|
130
140
|
end
|
131
141
|
end
|
data/lib/twterm/utils.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
module Twterm
|
2
|
+
module Utils
|
3
|
+
module_function
|
4
|
+
|
5
|
+
def check_type(expected_type, argument)
|
6
|
+
return if argument.is_a?(expected_type)
|
7
|
+
|
8
|
+
raise TypeError, 'TypeError: wrong argument type %s (expected %s)' % [
|
9
|
+
argument.class, expected_type
|
10
|
+
]
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/lib/twterm/version.rb
CHANGED
data/lib/twterm.rb
CHANGED
@@ -32,9 +32,6 @@ require 'twterm/history/savable'
|
|
32
32
|
require 'twterm/history/hashtag'
|
33
33
|
require 'twterm/history/screen_name'
|
34
34
|
require 'twterm/list'
|
35
|
-
require 'twterm/notification/base'
|
36
|
-
require 'twterm/notification/message'
|
37
|
-
require 'twterm/notification/error'
|
38
35
|
require 'twterm/notifier'
|
39
36
|
require 'twterm/promise'
|
40
37
|
require 'twterm/screen'
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'twterm/event/screen/resize'
|
3
|
+
|
4
|
+
RSpec.describe Twterm::Event::Screen::Resize do
|
5
|
+
describe '#fields' do
|
6
|
+
it 'has fields of Integer * Integer' do
|
7
|
+
expect { described_class.new(5, 10) }.not_to raise_error
|
8
|
+
expect { described_class.new('hello', 'world') }.to raise_error
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Twterm::EventDispatcher do
|
4
|
+
let(:event_dispatcher) { described_class.instance }
|
5
|
+
|
6
|
+
describe '#dispatch' do
|
7
|
+
subject { event_dispatcher.dispatch(event) }
|
8
|
+
|
9
|
+
let(:event) { Twterm::Event::Base.new }
|
10
|
+
|
11
|
+
it { is_expected.to eq event_dispatcher }
|
12
|
+
end
|
13
|
+
|
14
|
+
describe '.instance' do
|
15
|
+
subject { described_class.instance }
|
16
|
+
|
17
|
+
it { is_expected.to be_kind_of described_class }
|
18
|
+
end
|
19
|
+
end
|
data/twterm.gemspec
CHANGED
@@ -16,7 +16,7 @@ Gem::Specification.new do |spec|
|
|
16
16
|
spec.files = `git ls-files -z`.split("\x0").reject { |i| i == 'Gemfile.lock' }
|
17
17
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
18
|
spec.require_paths = ['lib']
|
19
|
-
spec.required_ruby_version = '>= 2.
|
19
|
+
spec.required_ruby_version = '>= 2.0.0'
|
20
20
|
|
21
21
|
spec.add_dependency 'curses', '>= 1.0.1'
|
22
22
|
spec.add_dependency 'launchy', '>= 2.4.3'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: twterm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryota Kameoka
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-01-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: curses
|
@@ -158,6 +158,21 @@ files:
|
|
158
158
|
- lib/twterm/color_manager.rb
|
159
159
|
- lib/twterm/completion_mamanger.rb
|
160
160
|
- lib/twterm/config.rb
|
161
|
+
- lib/twterm/direct_message.rb
|
162
|
+
- lib/twterm/direct_message_composer.rb
|
163
|
+
- lib/twterm/direct_message_manager.rb
|
164
|
+
- lib/twterm/event/base.rb
|
165
|
+
- lib/twterm/event/direct_message/fetched.rb
|
166
|
+
- lib/twterm/event/favorite.rb
|
167
|
+
- lib/twterm/event/follow.rb
|
168
|
+
- lib/twterm/event/notification.rb
|
169
|
+
- lib/twterm/event/open_uri.rb
|
170
|
+
- lib/twterm/event/screen/resize.rb
|
171
|
+
- lib/twterm/event/status/base.rb
|
172
|
+
- lib/twterm/event/status/delete.rb
|
173
|
+
- lib/twterm/event/status/mention.rb
|
174
|
+
- lib/twterm/event/status/timeline.rb
|
175
|
+
- lib/twterm/event_dispatcher.rb
|
161
176
|
- lib/twterm/extensions/curses/window.rb
|
162
177
|
- lib/twterm/extensions/enumerator/lazy.rb
|
163
178
|
- lib/twterm/extensions/integer.rb
|
@@ -170,15 +185,18 @@ files:
|
|
170
185
|
- lib/twterm/history/savable.rb
|
171
186
|
- lib/twterm/history/screen_name.rb
|
172
187
|
- lib/twterm/list.rb
|
173
|
-
- lib/twterm/notification/base.rb
|
174
|
-
- lib/twterm/notification/error.rb
|
175
|
-
- lib/twterm/notification/message.rb
|
176
188
|
- lib/twterm/notifier.rb
|
177
189
|
- lib/twterm/promise.rb
|
190
|
+
- lib/twterm/publisher.rb
|
191
|
+
- lib/twterm/rest_client.rb
|
178
192
|
- lib/twterm/scheduler.rb
|
179
193
|
- lib/twterm/screen.rb
|
180
194
|
- lib/twterm/status.rb
|
195
|
+
- lib/twterm/streaming_client.rb
|
196
|
+
- lib/twterm/subscriber.rb
|
181
197
|
- lib/twterm/tab/base.rb
|
198
|
+
- lib/twterm/tab/direct_message/conversation.rb
|
199
|
+
- lib/twterm/tab/direct_message/conversation_list.rb
|
182
200
|
- lib/twterm/tab/dumpable.rb
|
183
201
|
- lib/twterm/tab/exceptions.rb
|
184
202
|
- lib/twterm/tab/favorites.rb
|
@@ -202,11 +220,15 @@ files:
|
|
202
220
|
- lib/twterm/tab/users/friends.rb
|
203
221
|
- lib/twterm/tab_manager.rb
|
204
222
|
- lib/twterm/tweetbox.rb
|
223
|
+
- lib/twterm/uri_opener.rb
|
205
224
|
- lib/twterm/user.rb
|
225
|
+
- lib/twterm/utils.rb
|
206
226
|
- lib/twterm/version.rb
|
207
227
|
- spec/resources/config
|
208
228
|
- spec/spec_helper.rb
|
209
229
|
- spec/twterm/config_spec.rb
|
230
|
+
- spec/twterm/event/screen/resize_spec.rb
|
231
|
+
- spec/twterm/event_dispatcher_spec.rb
|
210
232
|
- spec/twterm/friendship_spec.rb
|
211
233
|
- twterm.gemspec
|
212
234
|
homepage: http://twterm.ryota-ka.me/
|
@@ -221,7 +243,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
221
243
|
requirements:
|
222
244
|
- - ">="
|
223
245
|
- !ruby/object:Gem::Version
|
224
|
-
version: 2.
|
246
|
+
version: 2.0.0
|
225
247
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
226
248
|
requirements:
|
227
249
|
- - ">="
|
@@ -229,7 +251,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
229
251
|
version: '0'
|
230
252
|
requirements: []
|
231
253
|
rubyforge_project:
|
232
|
-
rubygems_version: 2.
|
254
|
+
rubygems_version: 2.5.1
|
233
255
|
signing_key:
|
234
256
|
specification_version: 4
|
235
257
|
summary: A full-featured CLI Twitter client
|
@@ -1,24 +0,0 @@
|
|
1
|
-
module Twterm
|
2
|
-
module Notification
|
3
|
-
module Base
|
4
|
-
attr_reader :time, :fg_color, :bg_color
|
5
|
-
|
6
|
-
def initialize(message)
|
7
|
-
@message = CGI.unescapeHTML(message)
|
8
|
-
@time = Time.now
|
9
|
-
end
|
10
|
-
|
11
|
-
def show_with_width(width)
|
12
|
-
@message.gsub("\n", ' ')
|
13
|
-
end
|
14
|
-
|
15
|
-
def fg_color
|
16
|
-
fail NotImplementedError, 'fg_color method must be implemented'
|
17
|
-
end
|
18
|
-
|
19
|
-
def bg_color
|
20
|
-
fail NotImplementedError, 'bg_color method must be implemented'
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|