twterm 1.1.0 → 1.1.1

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: 6899ab95b0be06317c390cbb3a0a8638f73b1ead
4
- data.tar.gz: 5414fbb91b92079b03f2f4f001ac49e9379357ad
3
+ metadata.gz: 706e593e4edcad70bc6c85a508a87bb3b0b6f627
4
+ data.tar.gz: 5103de0dc3e61d085910facd228e7901feec04bd
5
5
  SHA512:
6
- metadata.gz: b0b7bfcaa4aea696889614b2c7e804fb873c5abd25ab288093005dfcbd8e1037a05b2bb0137c26bda64fcefa60cb647c38ab6f9276e172a755345025ee9a8be7
7
- data.tar.gz: b47ef4cb13b9c371d15287e328e7c5b1701dc10446ffd9e054af8aa8d90878d8e5b33506f7abc465d8458ba92128d16e0f24ce03b9fb100d420591e20203c75b
6
+ metadata.gz: b154db08ac62478501dbad44c8330f6abb79a30514ded5432400b36221934a7c89e740b4180471c9334d04c2638bada78fec70a0c4490a570c8db6ad9f99e2de
7
+ data.tar.gz: e383c7167af2a394cc2ea7f0930c581c6e3afae5c630b7311791e2dcff8438b45f2999fda09e586f71324c3d35d48b567252a3fa9960abb63172d465faea585e
data/lib/twterm.rb CHANGED
@@ -28,6 +28,7 @@ require 'twterm/filter_query_window'
28
28
  require 'twterm/filterable_list'
29
29
  require 'twterm/friendship'
30
30
  require 'twterm/history/base'
31
+ require 'twterm/history/savable'
31
32
  require 'twterm/history/hashtag'
32
33
  require 'twterm/history/screen_name'
33
34
  require 'twterm/list'
@@ -67,6 +68,6 @@ require 'twterm/version'
67
68
 
68
69
  module Twterm
69
70
  class Conf
70
- REQUIRE_VERSION = '1.1.0.beta1'
71
+ REQUIRE_VERSION = '1.1.1'
71
72
  end
72
73
  end
data/lib/twterm/app.rb CHANGED
@@ -21,9 +21,11 @@ module Twterm
21
21
 
22
22
  Screen.instance.refresh
23
23
 
24
- client.stream
24
+ client.user_stream
25
25
 
26
26
  reset_interruption_handler
27
+
28
+ Signal.trap(:WINCH) { Screen.instance.resize }
27
29
  end
28
30
 
29
31
  def run
data/lib/twterm/client.rb CHANGED
@@ -18,21 +18,6 @@ module Twterm
18
18
  end
19
19
  end
20
20
 
21
- def connect_stream
22
- stream_client.stop_stream
23
-
24
- @streaming_thread = Thread.new do
25
- begin
26
- Notifier.instance.show_message 'Trying to connect to Twitter...'
27
- stream_client.userstream
28
- rescue EventMachine::ConnectionError
29
- Notifier.instance.show_error 'Connection failed'
30
- sleep 30
31
- retry
32
- end
33
- end
34
- end
35
-
36
21
  def destroy_status(status)
37
22
  send_request_without_catch do
38
23
  rest_client.destroy_status(status.id)
@@ -143,9 +128,45 @@ module Twterm
143
128
  end
144
129
  end
145
130
 
131
+ initialize_user_stream
132
+
146
133
  @@instances << self
147
134
  end
148
135
 
136
+ def initialize_user_stream
137
+ return if user_stream_initialized?
138
+
139
+ streaming_client.on_friends do
140
+ user_stream_connected!
141
+ end
142
+
143
+ streaming_client.on_timeline_status do |tweet|
144
+ status = Status.new(tweet)
145
+ invoke_callbacks(:timeline_status, status)
146
+ invoke_callbacks(:mention, status) if status.text.include? "@#{@screen_name}"
147
+ end
148
+
149
+ streaming_client.on_delete do |status_id|
150
+ timeline.delete_status(status_id)
151
+ end
152
+
153
+ streaming_client.on_event(:favorite) do |event|
154
+ break if event[:source][:screen_name] == @screen_name
155
+
156
+ user = event[:source][:screen_name]
157
+ text = event[:target_object][:text]
158
+ message = "@#{user} has favorited your tweet: #{text}"
159
+ Notifier.instance.show_message(message)
160
+ end
161
+
162
+ streaming_client.on_no_data_received do
163
+ user_stream_disconnected!
164
+ user_stream
165
+ end
166
+
167
+ user_stream_initialized!
168
+ end
169
+
149
170
  def list(list_id)
150
171
  send_request do
151
172
  rest_client.list(list_id)
@@ -318,41 +339,8 @@ module Twterm
318
339
  end
319
340
  end
320
341
 
321
- def stream
322
- stream_client.on_friends do
323
- Notifier.instance.show_message 'Connection established' unless @stream_connected
324
- @stream_connected = true
325
- end
326
-
327
- stream_client.on_timeline_status do |tweet|
328
- status = Status.new(tweet)
329
- invoke_callbacks(:timeline_status, status)
330
- invoke_callbacks(:mention, status) if status.text.include? "@#{@screen_name}"
331
- end
332
-
333
- stream_client.on_delete do |status_id|
334
- timeline.delete_status(status_id)
335
- end
336
-
337
- stream_client.on_event(:favorite) do |event|
338
- break if event[:source][:screen_name] == @screen_name
339
-
340
- user = event[:source][:screen_name]
341
- text = event[:target_object][:text]
342
- message = "@#{user} has favorited your tweet: #{text}"
343
- Notifier.instance.show_message(message)
344
- end
345
-
346
- stream_client.on_no_data_received do
347
- @stream_connected = false
348
- connect_stream
349
- end
350
-
351
- connect_stream
352
- end
353
-
354
- def stream_client
355
- @stream_client ||= TweetStream::Client.new(
342
+ def streaming_client
343
+ @streaming_client ||= TweetStream::Client.new(
356
344
  consumer_key: CONSUMER_KEY,
357
345
  consumer_secret: CONSUMER_SECRET,
358
346
  oauth_token: @access_token,
@@ -402,6 +390,42 @@ module Twterm
402
390
  end
403
391
  end
404
392
 
393
+ def user_stream
394
+ streaming_client.stop_stream
395
+
396
+ @streaming_thread = Thread.new do
397
+ begin
398
+ Notifier.instance.show_message 'Trying to connect to Twitter...'
399
+ streaming_client.userstream
400
+ rescue EventMachine::ConnectionError
401
+ Notifier.instance.show_error 'Connection failed'
402
+ sleep 30
403
+ retry
404
+ end
405
+ end
406
+ end
407
+
408
+ def user_stream_connected?
409
+ @user_stream_connected || false
410
+ end
411
+
412
+ def user_stream_connected!
413
+ Notifier.instance.show_message 'Connection established' unless user_stream_connected?
414
+ @user_stream_connected = true
415
+ end
416
+
417
+ def user_stream_disconnected!
418
+ @user_stream_connected = false
419
+ end
420
+
421
+ def user_stream_initialized?
422
+ @user_stream_initialized || false
423
+ end
424
+
425
+ def user_stream_initialized!
426
+ @user_stream_initialized = true
427
+ end
428
+
405
429
  def user_timeline(user_id)
406
430
  send_request do
407
431
  rest_client.user_timeline(user_id, count: 200)
@@ -73,6 +73,11 @@ module Twterm
73
73
  stdscr.addstr(' ' * window.maxx)
74
74
  end
75
75
 
76
+ def resize
77
+ @window.resize(1, stdscr.maxx)
78
+ @window.move(stdscr.maxy - 1, 0)
79
+ end
80
+
76
81
  private
77
82
 
78
83
  attr_reader :window
@@ -1,39 +1,20 @@
1
1
  module Twterm
2
2
  module History
3
3
  module Base
4
- MAX_HISTORY_SIZE = 500
5
-
6
4
  attr_reader :history
7
5
 
8
6
  def initialize
9
- unless File.exist?(history_file)
10
- @history = []
11
- return
12
- end
13
-
14
- begin
15
- @history = YAML.load(File.read(history_file)) || []
16
- rescue
17
- @history = []
18
- end
7
+ @history = []
19
8
  end
20
9
 
21
- def add(hashtag)
22
- @history.unshift(hashtag)
23
- @history = @history.uniq.take(MAX_HISTORY_SIZE)
24
- save
10
+ def add(item)
11
+ @history << item
25
12
  end
26
13
 
27
14
  private
28
15
 
29
- def save
30
- File.open(history_file, 'w', 0600) do |f|
31
- f.write @history.to_yaml
32
- end
33
- end
34
-
35
- def history_file
36
- fail NotImplementedError, 'history_file method must be implemented'
16
+ def file
17
+ fail NotImplementedError, 'file method must be implemented'
37
18
  end
38
19
  end
39
20
  end
@@ -1,12 +1,12 @@
1
1
  module Twterm
2
2
  module History
3
3
  class Hashtag
4
- include Singleton, Base
4
+ include Singleton, Savable
5
5
 
6
6
  private
7
7
 
8
- def history_file
9
- "#{App::DATA_DIR}/hashtags"
8
+ def file
9
+ "#{App::DATA_DIR}/hashtags".freeze
10
10
  end
11
11
  end
12
12
  end
@@ -0,0 +1,37 @@
1
+ module Twterm
2
+ module History
3
+ module Savable
4
+ include Base
5
+
6
+ def initialize
7
+ unless File.exist?(file)
8
+ @history = []
9
+ return
10
+ end
11
+
12
+ begin
13
+ @history = YAML.load(File.read(file)) || []
14
+ rescue
15
+ @history = []
16
+ end
17
+
18
+ Scheduler.new(300) { save }
19
+ end
20
+
21
+ def add(item)
22
+ @history << item unless @history.include?(item)
23
+ @history = history.take(1000)
24
+ end
25
+
26
+ def save
27
+ File.open(file, 'w', 0600) { |f| f.write(history.to_yaml) }
28
+ end
29
+
30
+ private
31
+
32
+ def file
33
+ fail NotImplementedError, 'file method must be implemented'
34
+ end
35
+ end
36
+ end
37
+ end
@@ -3,10 +3,8 @@ module Twterm
3
3
  class ScreenName
4
4
  include Singleton, Base
5
5
 
6
- private
7
-
8
- def history_file
9
- "#{App::DATA_DIR}/screen_names"
6
+ def history
7
+ User.all.map(&:screen_name)
10
8
  end
11
9
  end
12
10
  end
@@ -16,6 +16,11 @@ module Twterm
16
16
  end
17
17
  end
18
18
 
19
+ def resize
20
+ @window.resize(1, stdscr.maxx)
21
+ @window.move(stdscr.maxy - 2, 0)
22
+ end
23
+
19
24
  def show_error(message)
20
25
  notification = Notification::Error.new(message)
21
26
  @queue.push(notification)
data/lib/twterm/screen.rb CHANGED
@@ -19,6 +19,17 @@ module Twterm
19
19
  Notifier.instance.show
20
20
  end
21
21
 
22
+ def resize
23
+ resizeterm(`tput lines`.to_i, `tput cols`.to_i)
24
+ @screen.resize(`tput lines`.to_i, `tput cols`.to_i)
25
+
26
+ TabManager.instance.resize
27
+ TabManager.instance.each_tab(&:resize)
28
+ Notifier.instance.resize
29
+ FilterQueryWindow.instance.resize
30
+ refresh
31
+ end
32
+
22
33
  def respond_to_key(key)
23
34
  case key
24
35
  when ?n
data/lib/twterm/status.rb CHANGED
@@ -52,13 +52,13 @@ module Twterm
52
52
  unless tweet.retweeted_status.is_a? Twitter::NullObject
53
53
  @retweeted_by_user_id = tweet.user.id
54
54
  User.new(tweet.user)
55
- retweeted_at = Status.parse_time(tweet.created_at)
55
+ retweeted_at = tweet.created_at.dup.localtime
56
56
  tweet = tweet.retweeted_status
57
57
  end
58
58
 
59
59
  @id = tweet.id
60
60
  @text = CGI.unescapeHTML(tweet.full_text.dup)
61
- @created_at = Status.parse_time(tweet.created_at)
61
+ @created_at = tweet.created_at.dup.localtime
62
62
  @appeared_at = retweeted_at || @created_at
63
63
  @retweet_count = tweet.retweet_count
64
64
  @favorite_count = tweet.favorite_count
@@ -100,7 +100,7 @@ module Twterm
100
100
  end
101
101
 
102
102
  def split(width)
103
- @splitted_text[:width] ||= @text.split_by_width(width)
103
+ @splitted_text[width] ||= @text.split_by_width(width)
104
104
  end
105
105
 
106
106
  def touch!
@@ -138,6 +138,10 @@ module Twterm
138
138
  @@instances = status_ids.zip(statuses).to_h
139
139
  end
140
140
 
141
+ def self.delete(id)
142
+ @@instances.delete(id)
143
+ end
144
+
141
145
  def self.find(id)
142
146
  @@instances[id]
143
147
  end
@@ -155,9 +159,5 @@ module Twterm
155
159
  instance = find(tweet.id)
156
160
  instance.nil? ? super : instance.update!(tweet)
157
161
  end
158
-
159
- def self.parse_time(time)
160
- (time.is_a?(String) ? Time.parse(time) : time.dup).localtime
161
- end
162
162
  end
163
163
  end
@@ -37,6 +37,11 @@ module Twterm
37
37
  end
38
38
  end
39
39
 
40
+ def resize
41
+ window.resize(stdscr.maxy - 5, stdscr.maxx)
42
+ window.move(3, 0)
43
+ end
44
+
40
45
  def respond_to_key(_)
41
46
  fail NotImplementedError, 'respond_to_key method must be implemented'
42
47
  end
@@ -20,7 +20,7 @@ module Twterm
20
20
  end
21
21
 
22
22
  def delete(status_id)
23
- @status_ids.delete(status_id)
23
+ Status.delete(status_id)
24
24
  refresh
25
25
  end
26
26
 
@@ -116,8 +116,21 @@ module Twterm
116
116
  @window.refresh
117
117
  end
118
118
 
119
+ def resize
120
+ @window.resize(3, stdscr.maxx)
121
+ @window.move(0, 0)
122
+ end
123
+
119
124
  def respond_to_key(key)
120
125
  case key
126
+ when ?1..?9
127
+ @index = key.to_i - 1 if @tabs.count >= key.to_i
128
+ current_tab.refresh
129
+ refresh_window
130
+ when ?0
131
+ @index = @tabs.count - 1
132
+ current_tab.refresh
133
+ refresh_window
121
134
  when ?h, 2, Key::LEFT
122
135
  show_previous
123
136
  when ?l, 6, Key::RIGHT
data/lib/twterm/user.rb CHANGED
@@ -87,8 +87,6 @@ module Twterm
87
87
  Friendship.following_not_requested(client_id, user.id)
88
88
  end
89
89
 
90
- History::ScreenName.instance.add(user.screen_name)
91
-
92
90
  self
93
91
  end
94
92
 
@@ -1,3 +1,3 @@
1
1
  module Twterm
2
- VERSION = '1.1.0'
2
+ VERSION = '1.1.1'
3
3
  end
data/twterm.gemspec CHANGED
@@ -21,8 +21,8 @@ Gem::Specification.new do |spec|
21
21
  spec.add_dependency 'curses', '>= 1.0.1'
22
22
  spec.add_dependency 'launchy', '>= 2.4.3'
23
23
  spec.add_dependency 'oauth', '>= 0.4.7'
24
- spec.add_dependency 'tweetstream', '>= 2.6.1'
25
- spec.add_dependency 'twitter', '>= 5.14.0'
24
+ spec.add_dependency 'tweetstream', '~> 2.6'
25
+ spec.add_dependency 'twitter', '~> 5.13'
26
26
  spec.add_dependency 'twitter-text', '>= 1.11.0'
27
27
 
28
28
  spec.add_development_dependency 'bundler', '~> 1.8'
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: 1.1.0
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryota Kameoka
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-09-20 00:00:00.000000000 Z
11
+ date: 2015-10-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: curses
@@ -56,30 +56,30 @@ dependencies:
56
56
  name: tweetstream
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ">="
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 2.6.1
61
+ version: '2.6'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ">="
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 2.6.1
68
+ version: '2.6'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: twitter
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ">="
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 5.14.0
75
+ version: '5.13'
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ">="
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: 5.14.0
82
+ version: '5.13'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: twitter-text
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -167,6 +167,7 @@ files:
167
167
  - lib/twterm/friendship.rb
168
168
  - lib/twterm/history/base.rb
169
169
  - lib/twterm/history/hashtag.rb
170
+ - lib/twterm/history/savable.rb
170
171
  - lib/twterm/history/screen_name.rb
171
172
  - lib/twterm/list.rb
172
173
  - lib/twterm/notification/base.rb