twterm 2.4.0 → 2.5.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.
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