twterm 1.1.0 → 1.1.1

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