twterm 2.0.0.beta2 → 2.0.0.beta3

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
  SHA1:
3
- metadata.gz: 4fa2049730342bdd24b2910b9325f63ba28bd608
4
- data.tar.gz: 4b558c35428ad291487bca5ae126f86138b1188a
3
+ metadata.gz: 5437110c78f1fd007bdd6ce02f1c88f2d699e320
4
+ data.tar.gz: fc02658604bfb54ccb45edc61ac69e3c33e67dac
5
5
  SHA512:
6
- metadata.gz: cc54183f0dddf1624bfda8f6edfe512d735d30491512088cff95ae8de84cbadb0ca4e17a333071fd34a1fa036d3a151d5740d217aebbda96c815c8c0d89af4b3
7
- data.tar.gz: e3fcce826377a533d874c01df4eac8494ba808a0b5357a24aa160aedf94caa4c3e5b18c4163f1d1bda0437e890f1297053c612dd797993cdd0069720469d52de
6
+ metadata.gz: 70b852078a4f295a4c27d15ec86b67c330cbe67f5f803e243240e21dde99a5635dbb3aa1da1ad339ec3a50b1e7f778e9b8a845702daf90adee29f2fd4442fd69
7
+ data.tar.gz: 9dc10d8f391208aa9f40a31407fc5721ead7a6aaa7997a1371888a2bd093e43b12b3ef70b82847b99a4d155bd706d1ef5532af0683f45948f082b047c441860b
data/README.md CHANGED
@@ -39,7 +39,7 @@ key | operation
39
39
  `^N` | new tweet
40
40
  `^T` | new tab
41
41
  `w` | close current tab
42
- `F10` | quit
42
+ `F10` `^C` | quit
43
43
  `F1` | key assignments cheatsheet
44
44
 
45
45
  ## License
data/lib/twterm/app.rb CHANGED
@@ -78,7 +78,7 @@ module Twterm
78
78
  Scheduler.new(300) do
79
79
  status_repository.expire(3600)
80
80
 
81
- _ = status_repository.all.map { |user_id| user_repository.find(user_id) }
81
+ _ = status_repository.all.map { |status| user_repository.find(status.user_id) }
82
82
  user_repository.expire(3600)
83
83
  end
84
84
 
@@ -0,0 +1,13 @@
1
+ require 'twterm/event/base'
2
+
3
+ module Twterm
4
+ module Event
5
+ class StatusGarbageCollected < Base
6
+ def fields
7
+ {
8
+ id: Integer
9
+ }
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ require 'twterm/event/base'
2
+
3
+ module Twterm
4
+ module Event
5
+ class UserGarbageCollected < Base
6
+ def fields
7
+ {
8
+ id: Integer
9
+ }
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,10 +1,13 @@
1
1
  require 'concurrent'
2
2
 
3
+ require 'twterm/publisher'
3
4
  require 'twterm/repository/abstract_entity_repository'
4
5
 
5
6
  module Twterm
6
7
  module Repository
7
8
  class AbstractExpirableEntityRepository < AbstractEntityRepository
9
+ include Publisher
10
+
8
11
  def initialize
9
12
  super
10
13
  @touched_at = Concurrent::Hash.new
@@ -22,11 +25,19 @@ module Twterm
22
25
 
23
26
  def expire(threshold)
24
27
  now = Time.now
25
- repository.delete_if { |id, _| !@touched_at[id] || @touched_at[id] + threshold < now }
28
+ ids = repository.select { |id, _| !@touched_at[id] || @touched_at[id] + threshold < now }
29
+
30
+ ids.each { |id| publish(garbage_collection_event_class.new(id)) }
31
+
32
+ repository.delete_if { |id, _| ids.include?(id) }
26
33
  end
27
34
 
28
35
  private
29
36
 
37
+ def garbage_collection_event_class
38
+ raise NotImplementedError, '`garbage_collection_event_class` must be implemented'
39
+ end
40
+
30
41
  def touch(id)
31
42
  @touched_at[id] = Time.now
32
43
  end
@@ -1,3 +1,4 @@
1
+ require 'twterm/event/status_garbage_collected'
1
2
  require 'twterm/repository/abstract_expirable_entity_repository'
2
3
  require 'twterm/status'
3
4
 
@@ -18,6 +19,14 @@ module Twterm
18
19
  repository.delete(id)
19
20
  end
20
21
 
22
+ def find(id)
23
+ status = super
24
+
25
+ touch(status.retweeted_status_id) if !status.nil? && status.retweet?
26
+
27
+ status
28
+ end
29
+
21
30
  def find_replies_for(id)
22
31
  repository.values.select { |s| s.in_reply_to_status_id == id }
23
32
  end
@@ -28,6 +37,10 @@ module Twterm
28
37
 
29
38
  private
30
39
 
40
+ def garbage_collection_event_class
41
+ Event::StatusGarbageCollected
42
+ end
43
+
31
44
  def type
32
45
  Status
33
46
  end
@@ -1,3 +1,4 @@
1
+ require 'twterm/event/user_garbage_collected'
1
2
  require 'twterm/repository/abstract_expirable_entity_repository'
2
3
  require 'twterm/user'
3
4
 
@@ -14,6 +15,10 @@ module Twterm
14
15
 
15
16
  private
16
17
 
18
+ def garbage_collection_event_class
19
+ Event::UserGarbageCollected
20
+ end
21
+
17
22
  def type
18
23
  User
19
24
  end
@@ -250,7 +250,8 @@ module Twterm
250
250
  def post(text, in_reply_to = nil)
251
251
  send_request do
252
252
  if in_reply_to.is_a? Status
253
- text = "@#{in_reply_to.user.screen_name} #{text}"
253
+ user = user_repository.find(in_reply_to.user_id)
254
+ text = "@#{user.screen_name} #{text}"
254
255
  rest_client.update(text, in_reply_to_status_id: in_reply_to.id)
255
256
  else
256
257
  rest_client.update(text)
@@ -107,6 +107,13 @@ module Twterm
107
107
  )
108
108
  end
109
109
 
110
+ def reload
111
+ fetch.then do |statuses|
112
+ statuses.each { |s| append(s) }
113
+ sort
114
+ end
115
+ end
116
+
110
117
  def resize(event)
111
118
  window.resize(stdscr.maxy - 5, stdscr.maxx)
112
119
  window.move(3, 0)
@@ -82,7 +82,7 @@ module Twterm
82
82
  return if count == 0 || index == count - 1
83
83
 
84
84
  @index = no_cursor_mode? ? count - drawable_item_count : count - 1
85
- @offset = [count - drawable_item_count + 1, 0].max
85
+ @offset = [count - drawable_item_count, 0].max
86
86
 
87
87
  @offset += 1 until last_item_shown?
88
88
 
@@ -2,6 +2,7 @@ require 'concurrent'
2
2
 
3
3
  require 'twterm/event/open_uri'
4
4
  require 'twterm/event/status/delete'
5
+ require 'twterm/event/status_garbage_collected'
5
6
  require 'twterm/publisher'
6
7
  require 'twterm/subscriber'
7
8
  require 'twterm/tab/base'
@@ -74,6 +75,7 @@ module Twterm
74
75
  @status_ids = Concurrent::Array.new
75
76
 
76
77
  subscribe(Event::Status::Delete) { |e| delete(e.status_id) }
78
+ subscribe(Event::StatusGarbageCollected) { |e| @status_ids.delete(e.id) }
77
79
  end
78
80
 
79
81
  def items
@@ -138,7 +140,7 @@ module Twterm
138
140
  when k[:status, :retweet]
139
141
  retweet
140
142
  when k[:tab, :reload]
141
- fetch
143
+ reload
142
144
  when k[:status, :user]
143
145
  show_user
144
146
  else
@@ -182,10 +184,7 @@ module Twterm
182
184
  end
183
185
 
184
186
  def statuses
185
- statuses = @status_ids.map { |id| app.status_repository.find(id) }.compact
186
- @status_ids = statuses.map(&:id)
187
-
188
- statuses
187
+ @status_ids.map { |id| app.status_repository.find(id) }.compact
189
188
  end
190
189
 
191
190
  def total_item_count
@@ -239,11 +238,6 @@ module Twterm
239
238
  def sort
240
239
  return if items.empty? || scroller.current_item.nil?
241
240
 
242
- repo = app.status_repository
243
-
244
- @status_ids &= repo.ids
245
- @status_ids.sort_by! { |id| repo.find(id).created_at }.reverse!
246
-
247
241
  formerly_selected_status_id = scroller.current_item.id
248
242
 
249
243
  unless formerly_selected_status_id.nil?
@@ -8,12 +8,20 @@ module Twterm
8
8
  class Conversation < Base
9
9
  include Dumpable
10
10
 
11
- attr_reader :status
11
+ attr_reader :status_id
12
12
 
13
13
  def ==(other)
14
14
  other.is_a?(self.class) && status == other.status
15
15
  end
16
16
 
17
+ def fetch
18
+ find_or_fetch_status(status_id).then do |status|
19
+ append(status)
20
+ fetch_ancestor(status)
21
+ find_descendants(status)
22
+ end
23
+ end
24
+
17
25
  def fetch_ancestor(status)
18
26
  in_reply_to_status_id = status.in_reply_to_status_id
19
27
 
@@ -41,19 +49,17 @@ module Twterm
41
49
  end
42
50
 
43
51
  def dump
44
- @status.id
52
+ @status_id
45
53
  end
46
54
 
47
55
  def initialize(app, client, status_id)
48
56
  super(app, client)
49
57
 
50
- find_or_fetch_status(status_id).then do |status|
51
- @status = status
58
+ @status_id = status_id
52
59
 
53
- append(status)
60
+ reload.then do
54
61
  scroller.move_to_top
55
- fetch_ancestor(status)
56
- find_descendants(status)
62
+ sort
57
63
  end
58
64
  end
59
65
 
@@ -17,10 +17,7 @@ module Twterm
17
17
  end
18
18
 
19
19
  def fetch
20
- client.favorites(@user.id).then do |statuses|
21
- statuses.each { |s| append(s) }
22
- sort
23
- end
20
+ client.favorites(@user.id)
24
21
  end
25
22
 
26
23
  def initialize(app, client, user_id)
@@ -32,7 +29,7 @@ module Twterm
32
29
  @user = user
33
30
  app.tab_manager.refresh_window
34
31
 
35
- fetch.then do
32
+ reload.then do
36
33
  initially_loaded!
37
34
  scroller.move_to_top
38
35
  end
@@ -15,10 +15,7 @@ module Twterm
15
15
  end
16
16
 
17
17
  def fetch
18
- client.home_timeline.then do |statuses|
19
- statuses.each { |s| append(s) }
20
- sort
21
- end
18
+ client.home_timeline
22
19
  end
23
20
 
24
21
  def initialize(app, client)
@@ -26,12 +23,12 @@ module Twterm
26
23
 
27
24
  subscribe(Event::Status::Timeline) { |e| prepend(e.status) }
28
25
 
29
- fetch.then do
26
+ reload.then do
30
27
  initially_loaded!
31
28
  scroller.move_to_top
32
29
  end
33
30
 
34
- @auto_reloader = Scheduler.new(180) { fetch }
31
+ @auto_reloader = Scheduler.new(180) { reload }
35
32
  end
36
33
 
37
34
  def title
@@ -18,20 +18,17 @@ module Twterm
18
18
  self.title = @list.full_name
19
19
  app.tab_manager.refresh_window
20
20
 
21
- fetch.then do
21
+ reload.then do
22
22
  initially_loaded!
23
23
  scroller.move_to_top
24
24
  end
25
25
 
26
- @auto_reloader = Scheduler.new(300) { fetch }
26
+ @auto_reloader = Scheduler.new(300) { reload }
27
27
  end
28
28
  end
29
29
 
30
30
  def fetch
31
- client.list_timeline(@list).then do |statuses|
32
- statuses.each { |s| append(s) }
33
- sort
34
- end
31
+ client.list_timeline(@list)
35
32
  end
36
33
 
37
34
  def close
@@ -21,7 +21,7 @@ module Twterm
21
21
 
22
22
  subscribe(Event::Status::Mention) { |e| prepend(e.status) }
23
23
 
24
- fetch.then do |statuses|
24
+ reload.then do |statuses|
25
25
  initially_loaded!
26
26
  statuses.each { |s| append(s) }
27
27
  scroller.move_to_top
@@ -30,13 +30,6 @@ module Twterm
30
30
  @auto_reloader = Scheduler.new(300) { reload }
31
31
  end
32
32
 
33
- def reload
34
- fetch.then do |statuses|
35
- statuses.each { |s| append(s) }
36
- sort
37
- end
38
- end
39
-
40
33
  def title
41
34
  'Mentions'.freeze
42
35
  end
@@ -22,10 +22,7 @@ module Twterm
22
22
  end
23
23
 
24
24
  def fetch
25
- client.search(@query).then do |statuses|
26
- statuses.each(&method(:append))
27
- sort
28
- end
25
+ client.search(@query)
29
26
  end
30
27
 
31
28
  def initialize(app, client, query)
@@ -34,12 +31,12 @@ module Twterm
34
31
  @query = query
35
32
  @title = "\"#{@query}\""
36
33
 
37
- fetch.then do
34
+ reload.then do
38
35
  initially_loaded!
39
36
  scroller.move_to_top
40
37
  end
41
38
 
42
- @auto_reloader = Scheduler.new(300) { fetch }
39
+ @auto_reloader = Scheduler.new(300) { reload }
43
40
  end
44
41
  end
45
42
  end
@@ -22,10 +22,7 @@ module Twterm
22
22
  end
23
23
 
24
24
  def fetch
25
- client.user_timeline(@user.id).then do |statuses|
26
- statuses.each { |s| append(s) }
27
- sort
28
- end
25
+ client.user_timeline(@user.id)
29
26
  end
30
27
 
31
28
  def initialize(app, client, user_id)
@@ -37,12 +34,12 @@ module Twterm
37
34
  @user = user
38
35
  app.tab_manager.refresh_window
39
36
 
40
- fetch.then do
37
+ reload.then do
41
38
  initially_loaded!
42
39
  scroller.move_to_top
43
40
  end
44
41
 
45
- @auto_reloader = Scheduler.new(120) { fetch }
42
+ @auto_reloader = Scheduler.new(120) { reload }
46
43
  end
47
44
  end
48
45
 
@@ -1,5 +1,6 @@
1
1
  require 'concurrent'
2
2
 
3
+ require 'twterm/event/user_garbage_collected'
3
4
  require 'twterm/tab/base'
4
5
  require 'twterm/tab/loadable'
5
6
 
@@ -21,6 +22,8 @@ module Twterm
21
22
  def initialize(app, client)
22
23
  super(app, client)
23
24
  @user_ids = Concurrent::Array.new
25
+
26
+ subscribe(Event::UserGarbageCollected) { |id| @user_ids.delete(id) }
24
27
  end
25
28
 
26
29
  def items
@@ -1,3 +1,3 @@
1
1
  module Twterm
2
- VERSION = '2.0.0.beta2'
2
+ VERSION = '2.0.0.beta3'
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.0.0.beta2
4
+ version: 2.0.0.beta3
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-07-30 00:00:00.000000000 Z
11
+ date: 2017-08-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: curses
@@ -205,6 +205,8 @@ files:
205
205
  - lib/twterm/event/status/delete.rb
206
206
  - lib/twterm/event/status/mention.rb
207
207
  - lib/twterm/event/status/timeline.rb
208
+ - lib/twterm/event/status_garbage_collected.rb
209
+ - lib/twterm/event/user_garbage_collected.rb
208
210
  - lib/twterm/event_dispatcher.rb
209
211
  - lib/twterm/extensions/array.rb
210
212
  - lib/twterm/extensions/curses/window.rb