twterm 2.4.0 → 2.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3ed5b1fe74b479cd44e106d99f63dcbc348d3f3c67b4f1dd537edd9c8dd9044c
4
- data.tar.gz: 1969619f0f236f559409b7eaf4f9ac49e8d7226e5068e405ebd18955080b7260
3
+ metadata.gz: 5059f1ee80a71d21c74f4131143a74c250a39db8f34ef758f594a07a9c05c980
4
+ data.tar.gz: 27dff9906c217a17b482c6c3df44e87bbac5df74b624a8d430f0baadbaa308a9
5
5
  SHA512:
6
- metadata.gz: 2a78e4c7a2b71df77830a3639d16610de65f05ae4ca9d2a56790e7a542eb41b5a476db5e60adc784eb0905649eab2827acfdd2c93111e4d3a49afd5785f51002
7
- data.tar.gz: d7625b41113573124d36363e5848e794698c17cb332aef8e47bdf9c54548a750ebc8003a92051a72fca8414c9b5393fffbb3b31aaf54c0bed3ce664f78c79263
6
+ metadata.gz: 104eb1d6cbd160193ab940e7190126d8280a81247a68e404864f70a2aa5e06b2448075c3a53e360d8b76edc091fa375c3f09d63db7d85f8a0c9837689bbfbd21
7
+ data.tar.gz: d6b06359ee0330e8a3f4631286564dd49f7a56f3e0cf979bd98a2cb693380b4a981abda81343b73c43825489b26063c17f8f70add1d53ed0b6b6aaf65cb45026
@@ -6,10 +6,10 @@ module Twterm
6
6
  @uname = `uname`.strip
7
7
 
8
8
  @terminal_notifier_available = TerminalNotifier.available?
9
- @with_eog = system('which eog 2>&1 >/dev/null')
10
- @with_imgcat = system('which imgcat 2>&1 >/dev/null')
11
- @with_tmux = system('which tmux 2>&1 >/dev/null') && !ENV['TMUX'].nil?
12
- @with_qlmanage = system('which qlmanage 2>&1 >/dev/null')
9
+ @with_eog = system('which eog >/dev/null 2>&1')
10
+ @with_imgcat = system('which imgcat >/dev/null 2>&1')
11
+ @with_tmux = system('which tmux >/dev/null 2>&1') && !ENV['TMUX'].nil?
12
+ @with_qlmanage = system('which qlmanage >/dev/null 2>&1')
13
13
  end
14
14
 
15
15
  def darwin?
@@ -6,7 +6,7 @@ module Twterm
6
6
  module Event
7
7
  class OpenPhoto < AbstractEvent
8
8
  def fields
9
- { photo: Twitter::Media::Photo }
9
+ { photo: Addressable::URI }
10
10
  end
11
11
  end
12
12
  end
@@ -0,0 +1,11 @@
1
+ require 'twterm/event/abstract_event'
2
+
3
+ module Twterm
4
+ module Event
5
+ class StatusDeleted < AbstractEvent
6
+ def fields
7
+ { status_id: Integer }
8
+ end
9
+ end
10
+ end
11
+ end
@@ -25,11 +25,11 @@ module Twterm
25
25
 
26
26
  attr_reader :backends, :preferences
27
27
 
28
- # @param photo [Twitter::Media::Photo]
28
+ # @param url [Addressable::URI]
29
29
  # @return [void]
30
- def view(photo)
30
+ def view(url)
31
31
  backends.each do |key, backend|
32
- backend.view(photo) if preferences[:photo_viewer_backend, key]
32
+ backend.view(url) if preferences[:photo_viewer_backend, key]
33
33
  end
34
34
  end
35
35
  end
@@ -5,7 +5,7 @@ module Twterm
5
5
  # @abstract
6
6
  class AbstractPhotoViewerBackend
7
7
  # @abstract
8
- def view(_photo)
8
+ def view(_url)
9
9
  raise NotImplementedError, '`view` method must be implemented'
10
10
  end
11
11
 
@@ -18,7 +18,7 @@ module Twterm
18
18
  system('stty -raw echo')
19
19
  end
20
20
 
21
- # @param url [String]
21
+ # @param url [#to_s]
22
22
  # @yieldparam file [File]
23
23
  def with_downloaded_file(url, &block)
24
24
  uri = URI.parse(url)
@@ -7,8 +7,8 @@ module Twterm
7
7
  class BrowserBackend < AbstractPhotoViewerBackend
8
8
  include Publisher
9
9
 
10
- def view(photo)
11
- event = Event::OpenURI.new(photo.media_url_https)
10
+ def view(url)
11
+ event = Event::OpenURI.new(url)
12
12
  publish(event)
13
13
  end
14
14
  end
@@ -9,12 +9,12 @@ module Twterm
9
9
  class ImgcatBackend < AbstractPhotoViewerBackend
10
10
  include Publisher
11
11
 
12
- def view(photo)
12
+ def view(url)
13
13
  Curses.close_screen unless Curses.closed?
14
14
 
15
15
  puts "\e[H\e[2JDownloading..."
16
16
 
17
- with_downloaded_file(photo.media_url_https) do |file|
17
+ with_downloaded_file(url) do |file|
18
18
  begin
19
19
  puts "\e[H\e[2JRendering..."
20
20
  system "imgcat #{file.path}"
@@ -3,8 +3,8 @@ require 'twterm/photo_viewer_backend/abstract_photo_viewer_backend'
3
3
  module Twterm
4
4
  module PhotoViewerBackend
5
5
  class QuickLookBackend < AbstractPhotoViewerBackend
6
- def view(photo)
7
- with_downloaded_file(photo.media_url_https) do |file|
6
+ def view(url)
7
+ with_downloaded_file(url) do |file|
8
8
  `qlmanage -p #{file.path} 2>/dev/null`
9
9
  end
10
10
  end
@@ -84,7 +84,7 @@ module Twterm
84
84
  when Twitter::Streaming::FriendList
85
85
  user_stream_connected!
86
86
  when Twitter::Streaming::DeletedTweet
87
- publish(Event::Status::Delete.new(event.id))
87
+ publish(Event::StatusDeleted.new(event.id))
88
88
  end
89
89
  end
90
90
  rescue Twitter::Error::TooManyRequests
@@ -39,6 +39,7 @@ module Twterm
39
39
  open_link: 'Open URLs',
40
40
  reply: 'Reply',
41
41
  retweet: 'Retweet',
42
+ quote: 'Quote',
42
43
  user: 'User',
43
44
  },
44
45
  ['Cursor', :cursor] => {
@@ -185,7 +185,7 @@ module Twterm
185
185
  when Twitter::Entity::URI
186
186
  publish(Event::OpenURI.new(item.expanded_url))
187
187
  when Twitter::Media::Photo
188
- publish(Event::OpenPhoto.new(item))
188
+ publish(Event::OpenPhoto.new(item.media_url_https))
189
189
  when Twitter::Media::AnimatedGif, Twitter::Media::Video
190
190
  url = item.video_info.variants.max { |v| v.bitrate }.url
191
191
  publish(Event::OpenURI.new(url))
@@ -1,7 +1,7 @@
1
1
  require 'concurrent'
2
2
 
3
3
  require 'twterm/event/open_uri'
4
- require 'twterm/event/status/delete'
4
+ require 'twterm/event/status_deleted'
5
5
  require 'twterm/event/status_garbage_collected'
6
6
  require 'twterm/image_builder/user_name_image_builder'
7
7
  require 'twterm/publisher'
@@ -77,7 +77,7 @@ module Twterm
77
77
 
78
78
  @status_ids = Concurrent::Array.new
79
79
 
80
- subscribe(Event::Status::Delete) { |e| delete(e.status_id) }
80
+ subscribe(Event::StatusDeleted) { |e| delete(e.status_id) }
81
81
  subscribe(Event::StatusGarbageCollected) { |e| @status_ids.delete(e.id) }
82
82
  end
83
83
 
@@ -1,6 +1,7 @@
1
+ require 'twterm/event/open_photo'
1
2
  require 'twterm/event/open_uri'
2
- require 'twterm/publisher'
3
3
  require 'twterm/image_builder/user_name_image_builder'
4
+ require 'twterm/publisher'
4
5
  require 'twterm/tab/abstract_tab'
5
6
  require 'twterm/tab/user_list_management'
6
7
 
@@ -44,18 +45,21 @@ module Twterm
44
45
  end
45
46
 
46
47
  def items
47
- items = %i(
48
- open_timeline_tab
49
- show_friends
50
- show_followers
51
- show_likes
52
- manage_lists
53
- )
54
- items << :compose_direct_message unless myself?
55
- items << :open_website unless user.website.nil?
56
- items << :toggle_follow unless myself?
57
- items << :toggle_mute unless myself?
58
- items << :toggle_block unless myself?
48
+ items = [
49
+ :open_timeline_tab,
50
+ :show_friends,
51
+ :show_followers,
52
+ :show_likes,
53
+ :profile_image,
54
+ (:profile_background_image unless user.profile_background_image.nil?),
55
+ :manage_lists,
56
+ (:compose_direct_message unless myself?),
57
+ (:open_website unless user.website.nil?),
58
+ (:toggle_follow unless myself?),
59
+ (:toggle_mute unless myself?),
60
+ (:toggle_block unless myself?),
61
+ :open_in_browser,
62
+ ].compact
59
63
 
60
64
  items
61
65
  end
@@ -139,11 +143,26 @@ module Twterm
139
143
  user_id == client.user_id
140
144
  end
141
145
 
146
+ def open_in_browser
147
+ event = Event::OpenURI.new(user.url)
148
+ publish(event)
149
+ end
150
+
142
151
  def open_list_management_tab
143
152
  tab = Tab::UserListManagement.new(app, client, user_id)
144
153
  app.tab_manager.add_and_show(tab)
145
154
  end
146
155
 
156
+ def open_profile_background_image
157
+ event = Event::OpenPhoto.new(user.profile_background_image)
158
+ publish(event)
159
+ end
160
+
161
+ def open_profile_image
162
+ event = Event::OpenPhoto.new(user.profile_image)
163
+ publish(event)
164
+ end
165
+
147
166
  def open_timeline_tab
148
167
  tab = Tab::Statuses::UserTimeline.new(app, client, user_id)
149
168
  app.tab_manager.add_and_show(tab)
@@ -161,10 +180,16 @@ module Twterm
161
180
  compose_direct_message
162
181
  when :manage_lists
163
182
  open_list_management_tab
183
+ when :open_in_browser
184
+ open_in_browser
164
185
  when :open_timeline_tab
165
186
  open_timeline_tab
166
187
  when :open_website
167
188
  open_website
189
+ when :profile_background_image
190
+ open_profile_background_image
191
+ when :profile_image
192
+ open_profile_image
168
193
  when :show_likes
169
194
  show_likes
170
195
  when :show_followers
@@ -291,10 +316,16 @@ module Twterm
291
316
  else
292
317
  Image.string('Mute this user')
293
318
  end
319
+ when :open_in_browser
320
+ Image.string("Open this user in browser (#{user.url})")
294
321
  when :open_timeline_tab
295
322
  Image.number(user.statuses_count) - Image.whitespace - Image.plural(user.statuses_count, 'tweet')
296
323
  when :open_website
297
324
  Image.string("Open website (#{user.website})")
325
+ when :profile_background_image
326
+ Image.string('View profile background image')
327
+ when :profile_image
328
+ Image.string('View profile image')
298
329
  when :show_likes
299
330
  Image.number(user.favorites_count) - Image.whitespace - Image.plural(user.favorites_count, 'like')
300
331
  when :show_followers
@@ -38,9 +38,9 @@ module Twterm
38
38
  def reply(status)
39
39
  screen_name = app.user_repository.find(status.user_id).screen_name
40
40
  leading_text = "\e[1mReplying to @#{screen_name}\e[0m\n\n#{status.text}"
41
- prompt = "> @#{screen_name} "
41
+ prompt = { prompt: '> ', init_text: "@#{screen_name} " }
42
42
 
43
- ask_and_post(leading_text, prompt, -> body { "@#{screen_name} #{body}" }, { in_reply_to_status_id: status.id })
43
+ ask_and_post(leading_text, prompt, -> body { body }, { in_reply_to_status_id: status.id })
44
44
  end
45
45
 
46
46
  private
@@ -51,6 +51,13 @@ module Twterm
51
51
  app.completion_manager.set_default_mode!
52
52
 
53
53
  thread = Thread.new do
54
+ if prompt.is_a?(Hash)
55
+ if prompt.include?(:init_text)
56
+ init_readline_text(prompt[:init_text])
57
+ end
58
+ prompt = prompt[:prompt] || '> '
59
+ end
60
+
54
61
  raw_text = ''
55
62
 
56
63
  loop do
@@ -102,6 +109,16 @@ module Twterm
102
109
  ask(prompt, postprocessor) { |text| client.post(postprocessor.call(text), options) }
103
110
  end
104
111
 
112
+ def init_readline_text(text)
113
+ old_pre_input_hook = Readline.pre_input_hook
114
+ Readline.pre_input_hook = lambda do
115
+ old_pre_input_hook.call if old_pre_input_hook
116
+ Readline.insert_text(text)
117
+ Readline.redisplay
118
+ Readline.pre_input_hook = old_pre_input_hook
119
+ end
120
+ end
121
+
105
122
  def reset
106
123
  reset_prog_mode
107
124
  sleep 0.1
data/lib/twterm/user.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  module Twterm
2
2
  class User
3
3
  attr_reader :description, :favorites_count, :followers_count,
4
- :friends_count, :id, :location, :name, :protected,
5
- :screen_name, :statuses_count, :url, :verified, :website
4
+ :friends_count, :id, :location, :name, :protected, :profile_image,
5
+ :profile_background_image, :screen_name, :statuses_count, :url, :verified, :website
6
6
  alias_method :protected?, :protected
7
7
  alias_method :verified?, :verified
8
8
 
@@ -24,6 +24,8 @@ module Twterm
24
24
  @followers_count = user.followers_count
25
25
  @url = user.url
26
26
  @verified = user.verified?
27
+ @profile_image = user.profile_image_uri_https
28
+ @profile_background_image = user.profile_banner_uri_https
27
29
 
28
30
  self
29
31
  end
@@ -1,3 +1,3 @@
1
1
  module Twterm
2
- VERSION = '2.4.0'
2
+ VERSION = '2.5.0'
3
3
  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.4.0
4
+ version: 2.5.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: 2018-04-07 00:00:00.000000000 Z
11
+ date: 2018-05-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: curses
@@ -258,9 +258,9 @@ files:
258
258
  - lib/twterm/event/screen/refresh.rb
259
259
  - lib/twterm/event/screen/resize.rb
260
260
  - lib/twterm/event/status/abstract_status_event.rb
261
- - lib/twterm/event/status/delete.rb
262
261
  - lib/twterm/event/status/mention.rb
263
262
  - lib/twterm/event/status/timeline.rb
263
+ - lib/twterm/event/status_deleted.rb
264
264
  - lib/twterm/event/status_garbage_collected.rb
265
265
  - lib/twterm/event/user_garbage_collected.rb
266
266
  - lib/twterm/event_dispatcher.rb
@@ -1,13 +0,0 @@
1
- require 'twterm/event/abstract_event'
2
-
3
- module Twterm
4
- module Event
5
- module Status
6
- class Delete < AbstractStatusEvent
7
- def fields
8
- { status_id: Integer }
9
- end
10
- end
11
- end
12
- end
13
- end