twterm 1.0.5 → 1.0.6

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