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 +4 -4
- data/README.md +1 -1
- data/lib/twterm/app.rb +1 -1
- data/lib/twterm/event/status_garbage_collected.rb +13 -0
- data/lib/twterm/event/user_garbage_collected.rb +13 -0
- data/lib/twterm/repository/abstract_expirable_entity_repository.rb +12 -1
- data/lib/twterm/repository/status_repository.rb +13 -0
- data/lib/twterm/repository/user_repository.rb +5 -0
- data/lib/twterm/rest_client.rb +2 -1
- data/lib/twterm/tab/base.rb +7 -0
- data/lib/twterm/tab/scrollable.rb +1 -1
- data/lib/twterm/tab/statuses/base.rb +4 -10
- data/lib/twterm/tab/statuses/conversation.rb +13 -7
- data/lib/twterm/tab/statuses/favorites.rb +2 -5
- data/lib/twterm/tab/statuses/home.rb +3 -6
- data/lib/twterm/tab/statuses/list_timeline.rb +3 -6
- data/lib/twterm/tab/statuses/mentions.rb +1 -8
- data/lib/twterm/tab/statuses/search.rb +3 -6
- data/lib/twterm/tab/statuses/user_timeline.rb +3 -6
- data/lib/twterm/tab/users/base.rb +3 -0
- data/lib/twterm/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5437110c78f1fd007bdd6ce02f1c88f2d699e320
|
4
|
+
data.tar.gz: fc02658604bfb54ccb45edc61ac69e3c33e67dac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 70b852078a4f295a4c27d15ec86b67c330cbe67f5f803e243240e21dde99a5635dbb3aa1da1ad339ec3a50b1e7f778e9b8a845702daf90adee29f2fd4442fd69
|
7
|
+
data.tar.gz: 9dc10d8f391208aa9f40a31407fc5721ead7a6aaa7997a1371888a2bd093e43b12b3ef70b82847b99a4d155bd706d1ef5532af0683f45948f082b047c441860b
|
data/README.md
CHANGED
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 { |
|
81
|
+
_ = status_repository.all.map { |status| user_repository.find(status.user_id) }
|
82
82
|
user_repository.expire(3600)
|
83
83
|
end
|
84
84
|
|
@@ -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.
|
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
|
data/lib/twterm/rest_client.rb
CHANGED
@@ -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
|
-
|
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)
|
data/lib/twterm/tab/base.rb
CHANGED
@@ -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
|
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
|
-
|
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
|
-
|
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 :
|
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
|
-
@
|
52
|
+
@status_id
|
45
53
|
end
|
46
54
|
|
47
55
|
def initialize(app, client, status_id)
|
48
56
|
super(app, client)
|
49
57
|
|
50
|
-
|
51
|
-
@status = status
|
58
|
+
@status_id = status_id
|
52
59
|
|
53
|
-
|
60
|
+
reload.then do
|
54
61
|
scroller.move_to_top
|
55
|
-
|
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)
|
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
|
-
|
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
|
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
|
-
|
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) {
|
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
|
-
|
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) {
|
26
|
+
@auto_reloader = Scheduler.new(300) { reload }
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
30
|
def fetch
|
31
|
-
client.list_timeline(@list)
|
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
|
-
|
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)
|
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
|
-
|
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) {
|
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)
|
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
|
-
|
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) {
|
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
|
data/lib/twterm/version.rb
CHANGED
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.
|
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-
|
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
|