twterm 2.0.0.beta2 → 2.0.0.beta3

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
  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