twterm 2.1.0 → 2.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.
Files changed (59) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +4 -1
  3. data/lib/twterm.rb +1 -1
  4. data/lib/twterm/abstract_persistable_configuration.rb +118 -0
  5. data/lib/twterm/app.rb +21 -1
  6. data/lib/twterm/environment.rb +38 -0
  7. data/lib/twterm/event/message/abstract_message.rb +23 -0
  8. data/lib/twterm/event/message/error.rb +10 -0
  9. data/lib/twterm/event/message/info.rb +10 -0
  10. data/lib/twterm/event/message/success.rb +10 -0
  11. data/lib/twterm/event/message/warning.rb +10 -0
  12. data/lib/twterm/event/notification/abstract_notification.rb +17 -12
  13. data/lib/twterm/event/notification/direct_message.rb +30 -0
  14. data/lib/twterm/event/notification/favorite.rb +35 -0
  15. data/lib/twterm/event/notification/follow.rb +33 -0
  16. data/lib/twterm/event/notification/list_member_added.rb +33 -0
  17. data/lib/twterm/event/notification/mention.rb +35 -0
  18. data/lib/twterm/event/notification/quote.rb +35 -0
  19. data/lib/twterm/event/notification/retweet.rb +35 -0
  20. data/lib/twterm/key_mapper/abstract_key_mapper.rb +4 -4
  21. data/lib/twterm/list.rb +2 -1
  22. data/lib/twterm/message_window.rb +81 -0
  23. data/lib/twterm/notification_backend/abstract_notification_backend.rb +16 -0
  24. data/lib/twterm/notification_backend/inline_backend.rb +20 -0
  25. data/lib/twterm/notification_backend/terminal_notifier_backend.rb +23 -0
  26. data/lib/twterm/notification_backend/tmux_backend.rb +17 -0
  27. data/lib/twterm/notification_dispatcher.rb +36 -0
  28. data/lib/twterm/persistable_configuration_proxy.rb +82 -0
  29. data/lib/twterm/preferences.rb +66 -0
  30. data/lib/twterm/repository/abstract_expirable_entity_repository.rb +1 -1
  31. data/lib/twterm/rest_client.rb +12 -14
  32. data/lib/twterm/scheduler.rb +1 -1
  33. data/lib/twterm/screen.rb +1 -1
  34. data/lib/twterm/search_query_window.rb +2 -2
  35. data/lib/twterm/streaming_client.rb +54 -17
  36. data/lib/twterm/tab/base.rb +2 -3
  37. data/lib/twterm/tab/new/list.rb +2 -4
  38. data/lib/twterm/tab/new/start.rb +10 -0
  39. data/lib/twterm/tab/new/user.rb +2 -2
  40. data/lib/twterm/tab/preferences/index.rb +74 -0
  41. data/lib/twterm/tab/preferences/notification_backend.rb +85 -0
  42. data/lib/twterm/tab/scrollable.rb +0 -1
  43. data/lib/twterm/tab/searchable.rb +7 -7
  44. data/lib/twterm/tab/user_list_management.rb +3 -3
  45. data/lib/twterm/tab/user_tab.rb +6 -8
  46. data/lib/twterm/tab_manager.rb +4 -4
  47. data/lib/twterm/tweetbox.rb +1 -1
  48. data/lib/twterm/uri_opener.rb +2 -2
  49. data/lib/twterm/user.rb +2 -1
  50. data/lib/twterm/version.rb +1 -1
  51. data/twterm.gemspec +4 -2
  52. metadata +59 -14
  53. data/lib/twterm/event/favorite.rb +0 -18
  54. data/lib/twterm/event/follow.rb +0 -17
  55. data/lib/twterm/event/notification/error.rb +0 -13
  56. data/lib/twterm/event/notification/info.rb +0 -13
  57. data/lib/twterm/event/notification/success.rb +0 -13
  58. data/lib/twterm/event/notification/warning.rb +0 -13
  59. data/lib/twterm/notifier.rb +0 -82
@@ -0,0 +1,85 @@
1
+ require 'twterm/image'
2
+ require 'twterm/preferences'
3
+ require 'twterm/publisher'
4
+ require 'twterm/tab/base'
5
+ require 'twterm/tab/scrollable'
6
+
7
+ module Twterm
8
+ module Tab
9
+ module Preferences
10
+ class NotificationBackend < Tab::Base
11
+ include Scrollable
12
+ include Publisher
13
+
14
+ def drawable_item_count
15
+ (window.maxy - 1) / 2
16
+ end
17
+
18
+ def image
19
+ drawable_items.map.with_index do |item, i|
20
+ cursor = Image.cursor(1, scroller.current_index?(i))
21
+ checkbox = Image.checkbox(app.preferences[:notification_backend, item])
22
+ desc =
23
+ case item
24
+ when :inline
25
+ 'Inline backend'
26
+ when :tmux
27
+ 'Tmux backend'
28
+ when :terminal_notifier
29
+ 'Terminal Notifier backend'
30
+ end
31
+
32
+ cursor - Image.whitespace - checkbox - Image.whitespace - Image.string(desc)
33
+ end
34
+ .intersperse(Image.blank_line)
35
+ .reduce(Image.empty) { |acc, x| acc | x }
36
+ end
37
+
38
+ def items
39
+ env = app.environment
40
+
41
+ [
42
+ :inline,
43
+ (:tmux if env.with_tmux?),
44
+ (:terminal_notifier if env.terminal_notifier_available?),
45
+ ].compact
46
+ end
47
+
48
+ def respond_to_key(key)
49
+ return true if scroller.respond_to_key(key)
50
+
51
+ case key
52
+ when 10
53
+ perform_selected_action
54
+ end
55
+
56
+ false
57
+ end
58
+
59
+ def title
60
+ 'Notification backend preferences'
61
+ end
62
+
63
+ private
64
+
65
+ def perform_selected_action
66
+ item = scroller.current_item
67
+
68
+ case item
69
+ when :inline
70
+ app.preferences[:notification_backend, :inline] =
71
+ !app.preferences[:notification_backend, :inline]
72
+ when :terminal_notifier
73
+ app.preferences[:notification_backend, :terminal_notifier] =
74
+ !app.preferences[:notification_backend, :terminal_notifier]
75
+ when :tmux
76
+ app.preferences[:notification_backend, :tmux] =
77
+ !app.preferences[:notification_backend, :tmux]
78
+ end
79
+
80
+ render
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
@@ -3,7 +3,6 @@ module Twterm
3
3
  module Scrollable
4
4
  extend Forwardable
5
5
 
6
- attr_reader :scroller
7
6
  def_delegators :scroller, :current_item, :drawable_items
8
7
 
9
8
  def scroller
@@ -1,5 +1,5 @@
1
- require 'twterm/event/notification/info'
2
- require 'twterm/event/notification/warning'
1
+ require 'twterm/event/message/info'
2
+ require 'twterm/event/message/warning'
3
3
  require 'twterm/search_query_window'
4
4
 
5
5
  module Twterm
@@ -10,7 +10,7 @@ module Twterm
10
10
 
11
11
  def_delegators :scroller, :search_query
12
12
 
13
- def matches?(item, query)
13
+ def matches?(_item, _query)
14
14
  raise NotImplementedError, '`matches?` method must be implemented'
15
15
  end
16
16
 
@@ -96,7 +96,7 @@ module Twterm
96
96
  @search_query = search_query_window.last_query if search_query.empty?
97
97
 
98
98
  if @search_query.empty?
99
- event = Event::Notification::Info.new("search query is empty. Press '/' or '?' to start searching.")
99
+ event = Event::Message::Info.new("search query is empty. Press '/' or '?' to start searching.")
100
100
  publish(event)
101
101
  return
102
102
  end
@@ -111,10 +111,10 @@ module Twterm
111
111
  _, index = xs.find { |x, _| tab.matches?(x, search_query) }
112
112
 
113
113
  if index.nil?
114
- publish(Event::Notification::Warning.new("No matches found: \"#{search_query}\""))
114
+ publish(Event::Message::Warning.new("No matches found: \"#{search_query}\""))
115
115
  else
116
- hit_bottom = Event::Notification::Info.new('search hit BOTTOM, continuing at TOP')
117
- hit_top = Event::Notification::Info.new('search hit TOP, continuing at BOTTOM')
116
+ hit_bottom = Event::Message::Info.new('search hit BOTTOM, continuing at TOP')
117
+ hit_top = Event::Message::Info.new('search hit TOP, continuing at BOTTOM')
118
118
 
119
119
  publish(hit_bottom) if (searching_down? ^ searching_backward?) && index <= previous_index
120
120
  publish(hit_top) if (searching_up? ^ searching_backward?) && index >= previous_index
@@ -1,6 +1,6 @@
1
1
  require 'concurrent'
2
2
 
3
- require 'twterm/event/notification/success'
3
+ require 'twterm/event/message/success'
4
4
  require 'twterm/image'
5
5
  require 'twterm/publisher'
6
6
  require 'twterm/tab/dumpable'
@@ -94,12 +94,12 @@ module Twterm
94
94
  if list_ids.include?(list.id)
95
95
  client.remove_list_member(list.id, user_id).then do
96
96
  @list_ids.delete(list.id)
97
- publish(Event::Notification::Success.new("Removed @#{user.screen_name} from #{list.name}"))
97
+ publish(Event::Message::Success.new("Removed @#{user.screen_name} from #{list.name}"))
98
98
  end
99
99
  else
100
100
  client.add_list_member(list.id, user_id).then do
101
101
  @list_ids.push(list.id)
102
- publish(Event::Notification::Success.new("Added @#{user.screen_name} to #{list.name}"))
102
+ publish(Event::Message::Success.new("Added @#{user.screen_name} to #{list.name}"))
103
103
  end
104
104
  end
105
105
  .then { render }
@@ -62,8 +62,6 @@ module Twterm
62
62
  def respond_to_key(key)
63
63
  return true if scroller.respond_to_key(key)
64
64
 
65
- k = KeyMapper.instance
66
-
67
65
  case key
68
66
  when 10
69
67
  perform_selected_action
@@ -85,7 +83,7 @@ module Twterm
85
83
  render
86
84
 
87
85
  user = users.first
88
- publish(Event::Notification::Success.new('Blocked @%s' % user.screen_name))
86
+ publish(Event::Message::Success.new('Blocked @%s' % user.screen_name))
89
87
  end
90
88
  end
91
89
 
@@ -107,7 +105,7 @@ module Twterm
107
105
  else
108
106
  msg = "Followed @#{user.screen_name}"
109
107
  end
110
- publish(Event::Notification::Success.new(msg))
108
+ publish(Event::Message::Success.new(msg))
111
109
  end
112
110
  end
113
111
 
@@ -128,7 +126,7 @@ module Twterm
128
126
  render
129
127
 
130
128
  user = users.first
131
- publish(Event::Notification::Success.new('Muted @%s' % user.screen_name))
129
+ publish(Event::Message::Success.new('Muted @%s' % user.screen_name))
132
130
  end
133
131
  end
134
132
 
@@ -207,7 +205,7 @@ module Twterm
207
205
  render
208
206
 
209
207
  user = users.first
210
- publish(Event::Notification::Success.new('Unblocked @%s' % user.screen_name))
208
+ publish(Event::Message::Success.new('Unblocked @%s' % user.screen_name))
211
209
  end
212
210
  end
213
211
 
@@ -216,7 +214,7 @@ module Twterm
216
214
  render
217
215
 
218
216
  user = users.first
219
- publish(Event::Notification::Success.new('Unfollowed @%s' % user.screen_name))
217
+ publish(Event::Message::Success.new('Unfollowed @%s' % user.screen_name))
220
218
  end
221
219
  end
222
220
 
@@ -225,7 +223,7 @@ module Twterm
225
223
  render
226
224
 
227
225
  user = users.first
228
- publish(Event::Notification::Success.new('Unmuted @%s' % user.screen_name))
226
+ publish(Event::Message::Success.new('Unmuted @%s' % user.screen_name))
229
227
  end
230
228
  end
231
229
 
@@ -45,7 +45,7 @@ module Twterm
45
45
  current_tab.render
46
46
  refresh_window
47
47
  rescue Tab::NotClosableError
48
- publish(Event::Notification::Warning.new('this tab cannot be closed'))
48
+ publish(Event::Message::Warning.new('this tab cannot be closed', 'this tab cannot be closed'))
49
49
  end
50
50
 
51
51
  def current_tab
@@ -104,8 +104,8 @@ module Twterm
104
104
  tab = klass.recover(app, client, title, arg)
105
105
  add(tab)
106
106
  end
107
- rescue
108
- publish(Event::Notification::Error.new('Failed to recover tabs'))
107
+ rescue StandardError
108
+ publish(Event::Message::Error.new('Failed to recover tabs'))
109
109
  end
110
110
 
111
111
  def refresh_window
@@ -195,7 +195,7 @@ module Twterm
195
195
 
196
196
  attr_reader :app, :client
197
197
 
198
- def resize(event)
198
+ def resize(_event)
199
199
  @window.resize(3, stdscr.maxx)
200
200
  @window.move(0, 0)
201
201
  end
@@ -1,5 +1,5 @@
1
1
  require 'twterm/publisher'
2
- require 'twterm/event/notification/error'
2
+ require 'twterm/event/message/error'
3
3
 
4
4
  module Twterm
5
5
  class Tweetbox
@@ -3,7 +3,7 @@ require 'singleton'
3
3
  require 'twterm/event/open_uri'
4
4
  require 'twterm/publisher'
5
5
  require 'twterm/subscriber'
6
- require 'twterm/event/notification/warning'
6
+ require 'twterm/event/message/warning'
7
7
 
8
8
  module Twterm
9
9
  class URIOpener
@@ -20,7 +20,7 @@ module Twterm
20
20
  def open(uri)
21
21
  Launchy.open(uri)
22
22
  rescue Launchy::CommandNotFoundError
23
- publish(Event::Notification::Warning.new('Browser not found'))
23
+ publish(Event::Message::Warning.new('Browser not found'))
24
24
  end
25
25
  end
26
26
  end
data/lib/twterm/user.rb CHANGED
@@ -2,7 +2,7 @@ module Twterm
2
2
  class User
3
3
  attr_reader :color, :description, :favorites_count, :followers_count,
4
4
  :friends_count, :id, :location, :name, :protected,
5
- :screen_name, :statuses_count, :verified, :website
5
+ :screen_name, :statuses_count, :url, :verified, :website
6
6
  alias_method :protected?, :protected
7
7
  alias_method :verified?, :verified
8
8
 
@@ -25,6 +25,7 @@ module Twterm
25
25
  @favorites_count = user.favorites_count
26
26
  @friends_count = user.friends_count
27
27
  @followers_count = user.followers_count
28
+ @url = user.url
28
29
  @verified = user.verified?
29
30
 
30
31
  self
@@ -1,3 +1,3 @@
1
1
  module Twterm
2
- VERSION = '2.1.0'
2
+ VERSION = '2.2.0'
3
3
  end
data/twterm.gemspec CHANGED
@@ -22,12 +22,14 @@ Gem::Specification.new do |spec|
22
22
  spec.add_dependency 'concurrent-ruby', '~> 1.0.5'
23
23
  spec.add_dependency 'launchy', '~> 2.4.3'
24
24
  spec.add_dependency 'oauth', '~> 0.5.1'
25
+ spec.add_dependency 'terminal-notifier', '~> 2.0.0'
25
26
  spec.add_dependency 'toml-rb', '~> 0.3.14'
26
- spec.add_dependency 'twitter', '~> 6.1.0'
27
+ spec.add_dependency 'twitter', '~> 6.2.0'
27
28
  spec.add_dependency 'twitter-text', '1.14.5'
28
29
 
29
30
  spec.add_development_dependency 'bundler', '~> 1.8'
30
31
  spec.add_development_dependency 'hashie', '~> 3.5.6'
31
32
  spec.add_development_dependency 'rake', '~> 12.0'
32
- spec.add_development_dependency 'rspec', '~> 3.5.0'
33
+ spec.add_development_dependency 'rspec', '~> 3.7.0'
34
+ spec.add_development_dependency 'rubocop', '~> 0.51.0'
33
35
  end
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: 2.1.0
4
+ version: 2.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: 2017-10-10 00:00:00.000000000 Z
11
+ date: 2018-01-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: curses
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: 0.5.1
69
+ - !ruby/object:Gem::Dependency
70
+ name: terminal-notifier
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 2.0.0
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 2.0.0
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: toml-rb
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -86,14 +100,14 @@ dependencies:
86
100
  requirements:
87
101
  - - "~>"
88
102
  - !ruby/object:Gem::Version
89
- version: 6.1.0
103
+ version: 6.2.0
90
104
  type: :runtime
91
105
  prerelease: false
92
106
  version_requirements: !ruby/object:Gem::Requirement
93
107
  requirements:
94
108
  - - "~>"
95
109
  - !ruby/object:Gem::Version
96
- version: 6.1.0
110
+ version: 6.2.0
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: twitter-text
99
113
  requirement: !ruby/object:Gem::Requirement
@@ -156,14 +170,28 @@ dependencies:
156
170
  requirements:
157
171
  - - "~>"
158
172
  - !ruby/object:Gem::Version
159
- version: 3.5.0
173
+ version: 3.7.0
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: 3.7.0
181
+ - !ruby/object:Gem::Dependency
182
+ name: rubocop
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - "~>"
186
+ - !ruby/object:Gem::Version
187
+ version: 0.51.0
160
188
  type: :development
161
189
  prerelease: false
162
190
  version_requirements: !ruby/object:Gem::Requirement
163
191
  requirements:
164
192
  - - "~>"
165
193
  - !ruby/object:Gem::Version
166
- version: 3.5.0
194
+ version: 0.51.0
167
195
  description: A full-featured TUI Twitter client
168
196
  email:
169
197
  - kameoka.ryota@gmail.com
@@ -181,6 +209,7 @@ files:
181
209
  - Rakefile
182
210
  - bin/twterm
183
211
  - lib/twterm.rb
212
+ - lib/twterm/abstract_persistable_configuration.rb
184
213
  - lib/twterm/app.rb
185
214
  - lib/twterm/auth.rb
186
215
  - lib/twterm/client.rb
@@ -194,15 +223,22 @@ files:
194
223
  - lib/twterm/direct_message.rb
195
224
  - lib/twterm/direct_message_composer.rb
196
225
  - lib/twterm/direct_message_manager.rb
226
+ - lib/twterm/environment.rb
197
227
  - lib/twterm/event/base.rb
198
228
  - lib/twterm/event/direct_message/fetched.rb
199
- - lib/twterm/event/favorite.rb
200
- - lib/twterm/event/follow.rb
229
+ - lib/twterm/event/message/abstract_message.rb
230
+ - lib/twterm/event/message/error.rb
231
+ - lib/twterm/event/message/info.rb
232
+ - lib/twterm/event/message/success.rb
233
+ - lib/twterm/event/message/warning.rb
201
234
  - lib/twterm/event/notification/abstract_notification.rb
202
- - lib/twterm/event/notification/error.rb
203
- - lib/twterm/event/notification/info.rb
204
- - lib/twterm/event/notification/success.rb
205
- - lib/twterm/event/notification/warning.rb
235
+ - lib/twterm/event/notification/direct_message.rb
236
+ - lib/twterm/event/notification/favorite.rb
237
+ - lib/twterm/event/notification/follow.rb
238
+ - lib/twterm/event/notification/list_member_added.rb
239
+ - lib/twterm/event/notification/mention.rb
240
+ - lib/twterm/event/notification/quote.rb
241
+ - lib/twterm/event/notification/retweet.rb
206
242
  - lib/twterm/event/open_uri.rb
207
243
  - lib/twterm/event/screen/resize.rb
208
244
  - lib/twterm/event/status/base.rb
@@ -238,7 +274,14 @@ files:
238
274
  - lib/twterm/key_mapper/status_key_mapper.rb
239
275
  - lib/twterm/key_mapper/tab_key_mapper.rb
240
276
  - lib/twterm/list.rb
241
- - lib/twterm/notifier.rb
277
+ - lib/twterm/message_window.rb
278
+ - lib/twterm/notification_backend/abstract_notification_backend.rb
279
+ - lib/twterm/notification_backend/inline_backend.rb
280
+ - lib/twterm/notification_backend/terminal_notifier_backend.rb
281
+ - lib/twterm/notification_backend/tmux_backend.rb
282
+ - lib/twterm/notification_dispatcher.rb
283
+ - lib/twterm/persistable_configuration_proxy.rb
284
+ - lib/twterm/preferences.rb
242
285
  - lib/twterm/publisher.rb
243
286
  - lib/twterm/repository/abstract_entity_repository.rb
244
287
  - lib/twterm/repository/abstract_expirable_entity_repository.rb
@@ -268,6 +311,8 @@ files:
268
311
  - lib/twterm/tab/new/search.rb
269
312
  - lib/twterm/tab/new/start.rb
270
313
  - lib/twterm/tab/new/user.rb
314
+ - lib/twterm/tab/preferences/index.rb
315
+ - lib/twterm/tab/preferences/notification_backend.rb
271
316
  - lib/twterm/tab/rate_limit_status.rb
272
317
  - lib/twterm/tab/scrollable.rb
273
318
  - lib/twterm/tab/searchable.rb
@@ -341,7 +386,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
341
386
  version: '0'
342
387
  requirements: []
343
388
  rubyforge_project:
344
- rubygems_version: 2.6.13
389
+ rubygems_version: 2.7.4
345
390
  signing_key:
346
391
  specification_version: 4
347
392
  summary: A full-featured TUI Twitter client