twterm 1.0.5 → 1.0.6

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: 4c12295e3d9afd6d5530f4bef0a7ce04303534dd
4
- data.tar.gz: b510d4cbde776eea8f84f841ed4b74a620b03d97
3
+ metadata.gz: a9e8728be1c9bd555f0354eb36822c8d01156911
4
+ data.tar.gz: 03799091452f4954c392253206977513e8a66f9f
5
5
  SHA512:
6
- metadata.gz: eba83dd74c4a3ddb83f3d6bb926a88251dc705868dad7a7ceee16f89bb13a6792cd293110611561c7cb7437df8f7c4dca517a47095a458c329299c90c75caf88
7
- data.tar.gz: 89bb48da13afb9588dec0a4fdf40ffc2280487957e0326fe2eb7bf17d96cc395aad131333ea7e992951fdd335ec09af1c5b73fd82c3d201bb82888df7fc91a7d
6
+ metadata.gz: 14af06eb721896713d982419195c28e64c22cfe6eace3746fb299cbbc849d5382a1c37a4fe527899ccb5aa6d89ee13dea1ce9d3027da34865af8955fbfd7787b
7
+ data.tar.gz: 99e220ffd485f2d8b7d2909a0b9689dd2e06ef52528c600da85e201657304f693d5bab38f5410afd7135b8e49de134ceac4908056d6223fda7d4900df8990a43
data/lib/twterm.rb CHANGED
@@ -9,6 +9,7 @@ require 'readline'
9
9
  require 'singleton'
10
10
  require 'tweetstream'
11
11
  require 'twitter'
12
+ require 'twitter-text'
12
13
  require 'yaml'
13
14
 
14
15
  require 'extentions'
@@ -26,10 +27,10 @@ require 'twterm/notification/message'
26
27
  require 'twterm/notification/error'
27
28
  require 'twterm/notifier'
28
29
  require 'twterm/screen'
30
+ require 'twterm/scheduler'
29
31
  require 'twterm/status'
30
32
  require 'twterm/tab_manager'
31
33
  require 'twterm/tab/base'
32
- require 'twterm/tab/auto_reloadable'
33
34
  require 'twterm/tab/exceptions'
34
35
  require 'twterm/tab/scrollable'
35
36
  require 'twterm/tab/statuses_tab'
@@ -50,6 +51,6 @@ require 'twterm/version'
50
51
 
51
52
  module Twterm
52
53
  class Conf
53
- REQUIRE_VERSION = '1.0.4'
54
+ REQUIRE_VERSION = '1.0.6'
54
55
  end
55
56
  end
data/lib/twterm/app.rb CHANGED
@@ -51,12 +51,7 @@ module Twterm
51
51
  private
52
52
 
53
53
  def run_periodic_cleanup
54
- Thread.new do
55
- loop do
56
- sleep 300
57
- Status.cleanup
58
- end
59
- end
54
+ Scheduler.new(300) { Status.cleanup }
60
55
  end
61
56
  end
62
57
  end
data/lib/twterm/client.rb CHANGED
@@ -173,6 +173,17 @@ module Twterm
173
173
  end
174
174
  end
175
175
 
176
+ def destroy_status(status)
177
+ send_request do
178
+ begin
179
+ @rest_client.destroy_status(status.id)
180
+ yield if block_given?
181
+ rescue Twitter::Error::NotFound, Twitter::Error::Forbidden
182
+ Notifier.instance.show_error 'You cannot destroy that status'
183
+ end
184
+ end
185
+ end
186
+
176
187
  def on_timeline_status(&block)
177
188
  fail ArgumentError, 'no block given' unless block_given?
178
189
  on(:timeline_status, &block)
@@ -0,0 +1,30 @@
1
+ class Scheduler
2
+ def initialize(interval, &block)
3
+ fail ArgumentError, 'Interval must be a real number' unless interval.is_a?(Numeric) && interval.real?
4
+ fail RangeError, 'Interval must be greater than zero' unless interval > 0
5
+
6
+ @interval, @block = interval, block
7
+ @paused = false
8
+
9
+ @thread = Thread.new do
10
+ sleep @interval
11
+ run
12
+ end
13
+ end
14
+
15
+ def kill
16
+ @thread.kill
17
+ end
18
+
19
+ def pause
20
+ @paused = true
21
+ end
22
+
23
+ def run
24
+ @block.call unless @paused
25
+ end
26
+
27
+ def unpause
28
+ @paused = false
29
+ end
30
+ end
data/lib/twterm/status.rb CHANGED
@@ -116,6 +116,9 @@ module Twterm
116
116
  count = MAX_CACHED_STATUSES_COUNT
117
117
  return if @@instances.count < count
118
118
 
119
+ TabManager.instance.each_tab do |tab|
120
+ tab.touch_statuses if tab.is_a?(Tab::StatusesTab)
121
+ end
119
122
  statuses = @@instances.values.sort_by(&:touched_at).take(count)
120
123
  status_ids = statuses.map(&:id)
121
124
  @@instances = status_ids.zip(statuses).to_h
@@ -13,7 +13,7 @@ module Twterm
13
13
  @list = list
14
14
  @title = @list.full_name
15
15
  fetch { move_to_top }
16
- auto_reload(300) { fetch }
16
+ @auto_reloader = Scheduler.new(300) { fetch }
17
17
  end
18
18
 
19
19
  def fetch
@@ -25,6 +25,11 @@ module Twterm
25
25
  end
26
26
  end
27
27
 
28
+ def close
29
+ @auto_reloader.kill
30
+ super
31
+ end
32
+
28
33
  def ==(other)
29
34
  other.is_a?(self.class) && list == other.list
30
35
  end
@@ -17,7 +17,7 @@ module Twterm
17
17
  @title = 'Mentions'
18
18
 
19
19
  fetch { move_to_top }
20
- auto_reload(300) { fetch }
20
+ @auto_reloader = Scheduler.new(300) { fetch }
21
21
  end
22
22
 
23
23
  def fetch
@@ -3,19 +3,11 @@ module Twterm
3
3
  module StatusesTab
4
4
  include Base
5
5
  include Scrollable
6
- include AutoReloadable
7
6
 
8
7
  def initialize
9
8
  super
10
9
 
11
10
  @status_ids = []
12
-
13
- Thread.new do
14
- loop do
15
- statuses.take(100).each(&:touch!)
16
- sleep 60
17
- end
18
- end
19
11
  end
20
12
 
21
13
  def statuses
@@ -73,7 +65,16 @@ module Twterm
73
65
  end
74
66
  end
75
67
 
76
- def delete_status(status_id)
68
+ def destroy_status
69
+ status = highlighted_status
70
+
71
+ Client.current.destroy_status(status) do
72
+ delete(status.id)
73
+ refresh
74
+ end
75
+ end
76
+
77
+ def delete(status_id)
77
78
  @status_ids.delete(status_id)
78
79
  refresh
79
80
  end
@@ -102,6 +103,10 @@ module Twterm
102
103
  fail NotImplementedError, 'fetch method must be implemented'
103
104
  end
104
105
 
106
+ def touch_statuses
107
+ statuses.take(100).each(&:touch!)
108
+ end
109
+
105
110
  def update
106
111
  current_line = 0
107
112
 
@@ -195,6 +200,8 @@ module Twterm
195
200
  case key
196
201
  when 'c'
197
202
  show_conversation
203
+ when 'D'
204
+ destroy_status
198
205
  when 'F'
199
206
  favorite
200
207
  when 'o'
@@ -12,7 +12,7 @@ module Twterm
12
12
  @title = 'Timeline'
13
13
 
14
14
  fetch { move_to_top }
15
- auto_reload(180) { fetch }
15
+ @auto_reloader = Scheduler.new(180) { fetch }
16
16
  end
17
17
 
18
18
  def fetch
@@ -14,7 +14,7 @@ module Twterm
14
14
  @title = "@#{user.screen_name}"
15
15
 
16
16
  fetch { move_to_top }
17
- auto_reload(120) { fetch }
17
+ @auto_reloader = Scheduler.new(120) { fetch }
18
18
  end
19
19
 
20
20
  def fetch
@@ -25,6 +25,11 @@ module Twterm
25
25
  end
26
26
  end
27
27
 
28
+ def close
29
+ @auto_reloader.kill
30
+ super
31
+ end
32
+
28
33
  def ==(other)
29
34
  other.is_a?(self.class) && user == other.user
30
35
  end
@@ -72,6 +72,12 @@ module Twterm
72
72
  add_and_show(tab)
73
73
  end
74
74
 
75
+ def each_tab(&block)
76
+ @tabs.each do |tab|
77
+ block.call(tab)
78
+ end
79
+ end
80
+
75
81
  def refresh_window
76
82
  @window.clear
77
83
  current_tab_id = current_tab.object_id
@@ -47,16 +47,32 @@ module Twterm
47
47
  end
48
48
 
49
49
  loop do
50
- msg = @in_reply_to.nil? || !@status.empty? ? '> ' : "> @#{in_reply_to.user.screen_name} "
51
- line = (readline(msg, true) || '').strip
52
- break if line.empty?
50
+ loop do
51
+ msg = @in_reply_to.nil? || !@status.empty? ? '> ' : "> @#{in_reply_to.user.screen_name} "
52
+ line = (readline(msg, true) || '').strip
53
+ break if line.empty?
53
54
 
54
- if line.end_with?('\\')
55
- @status << line.chop.lstrip + "\n"
55
+ if line.end_with?('\\')
56
+ @status << line.chop.lstrip + "\n"
57
+ else
58
+ @status << line
59
+ break
60
+ end
61
+ end
62
+
63
+ puts "\n"
64
+
65
+ case validate
66
+ when :too_long
67
+ puts "Status is too long (#{length} / 140 characters)"
68
+ when :invalid_characters
69
+ puts 'Status contains invalid characters'
56
70
  else
57
- @status << line
58
71
  break
59
72
  end
73
+
74
+ puts "\n"
75
+ clear
60
76
  end
61
77
 
62
78
  resetter.call
@@ -74,12 +90,20 @@ module Twterm
74
90
  end
75
91
 
76
92
  def post
77
- return if @status.nil? || @status.empty?
93
+ return if validate
78
94
 
79
95
  Client.current.post(@status, @in_reply_to)
80
96
  clear
81
97
  end
82
98
 
99
+ def validate
100
+ Twitter::Validation.tweet_invalid?(@status)
101
+ end
102
+
103
+ def length
104
+ Twitter::Validation.tweet_length(@status)
105
+ end
106
+
83
107
  def clear
84
108
  @status = ''
85
109
  end
@@ -1,3 +1,3 @@
1
1
  module Twterm
2
- VERSION = '1.0.5'
2
+ VERSION = '1.0.6'
3
3
  end
data/twterm.gemspec CHANGED
@@ -22,6 +22,7 @@ Gem::Specification.new do |spec|
22
22
  spec.add_dependency 'oauth', '>= 0.4.7'
23
23
  spec.add_dependency 'tweetstream', '>= 2.6.1'
24
24
  spec.add_dependency 'twitter', '>= 5.14.0'
25
+ spec.add_dependency 'twitter-text', '>= 1.11.0'
25
26
 
26
27
  spec.add_development_dependency 'bundler', '~> 1.8'
27
28
  spec.add_development_dependency 'rake', '~> 10.0'
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.0.5
4
+ version: 1.0.6
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-03-27 00:00:00.000000000 Z
11
+ date: 2015-04-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: curses
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: 5.14.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: twitter-text
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: 1.11.0
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: 1.11.0
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: bundler
85
99
  requirement: !ruby/object:Gem::Requirement
@@ -137,9 +151,9 @@ files:
137
151
  - lib/twterm/notification/error.rb
138
152
  - lib/twterm/notification/message.rb
139
153
  - lib/twterm/notifier.rb
154
+ - lib/twterm/scheduler.rb
140
155
  - lib/twterm/screen.rb
141
156
  - lib/twterm/status.rb
142
- - lib/twterm/tab/auto_reloadable.rb
143
157
  - lib/twterm/tab/base.rb
144
158
  - lib/twterm/tab/conversation_tab.rb
145
159
  - lib/twterm/tab/exceptions.rb
@@ -1,14 +0,0 @@
1
- module Twterm
2
- module Tab
3
- module AutoReloadable
4
- def auto_reload(period, &block)
5
- Thread.new do
6
- loop do
7
- sleep period
8
- block.call
9
- end
10
- end
11
- end
12
- end
13
- end
14
- end