jugyo-termtter 1.0.6 → 1.0.7
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +25 -20
- data/Rakefile +1 -2
- data/lib/plugins/addspace.rb +3 -3
- data/lib/plugins/bomb.rb +1 -1
- data/lib/plugins/confirm.rb +4 -1
- data/lib/plugins/expand-tinyurl.rb +1 -1
- data/lib/plugins/growl.rb +24 -33
- data/lib/plugins/log.rb +6 -2
- data/lib/plugins/msagent.rb +3 -3
- data/lib/plugins/notify-send.rb +3 -3
- data/lib/plugins/notify-send2.rb +39 -0
- data/lib/plugins/say.rb +1 -1
- data/lib/plugins/screen-notify.rb +1 -1
- data/lib/plugins/spam.rb +7 -4
- data/lib/plugins/standard_plugins.rb +27 -28
- data/lib/plugins/stdout.rb +22 -6
- data/lib/plugins/storage.rb +15 -1
- data/lib/plugins/storage/status.rb +43 -11
- data/lib/plugins/timer.rb +18 -0
- data/lib/plugins/uri-open.rb +1 -1
- data/lib/termtter/api.rb +1 -0
- data/lib/termtter/client.rb +28 -28
- data/lib/termtter/command.rb +7 -9
- data/lib/termtter/hook.rb +0 -1
- data/lib/termtter/version.rb +1 -1
- data/spec/termtter/client_spec.rb +14 -0
- data/spec/termtter/command_spec.rb +28 -20
- data/spec/termtter/hook_spec.rb +17 -8
- data/spec/termtter_spec.rb +3 -5
- metadata +4 -13
- data/lib/plugins/url_addspace.rb +0 -16
data/README.rdoc
CHANGED
@@ -1,19 +1,36 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
1
|
= termtter
|
3
2
|
|
4
3
|
http://github.com/jugyo/termtter
|
5
4
|
|
6
5
|
== DESCRIPTION:
|
7
6
|
|
8
|
-
Termtter is a terminal based Twitter client
|
7
|
+
Termtter is a terminal based Twitter client.
|
9
8
|
|
10
9
|
== FEATURES/PROBLEMS:
|
11
10
|
|
12
11
|
== SYNOPSIS:
|
13
12
|
|
14
|
-
Run:
|
13
|
+
=== Run:
|
15
14
|
|
16
|
-
termtter
|
15
|
+
% termtter
|
16
|
+
|
17
|
+
=== Some Termtter Commands:
|
18
|
+
|
19
|
+
Show help
|
20
|
+
|
21
|
+
> help
|
22
|
+
|
23
|
+
Update status
|
24
|
+
|
25
|
+
> update hi!
|
26
|
+
|
27
|
+
Show replies
|
28
|
+
|
29
|
+
> replies
|
30
|
+
|
31
|
+
Search
|
32
|
+
|
33
|
+
> search termtter
|
17
34
|
|
18
35
|
== REQUIREMENTS:
|
19
36
|
|
@@ -23,24 +40,14 @@ Run:
|
|
23
40
|
|
24
41
|
== INSTALL:
|
25
42
|
|
26
|
-
sudo gem
|
27
|
-
sudo gem install jugyo-termtter
|
28
|
-
|
29
|
-
if you want to install gem package from source code, install like following.
|
30
|
-
|
31
|
-
git clone git://github.com/jugyo/termtter.git
|
32
|
-
cd termtter
|
33
|
-
rake gem
|
34
|
-
gem install *.gem
|
35
|
-
|
36
|
-
Just run a new command termtter.
|
43
|
+
% sudo gem install termtter
|
37
44
|
|
38
|
-
|
45
|
+
== CONFIGURATION:
|
39
46
|
|
40
|
-
Termtter generates a configuration file named '
|
47
|
+
Termtter generates a configuration file named '~/.termtter/config'.
|
41
48
|
You can edit the file anytime.
|
42
49
|
|
43
|
-
vim ~/.termtter
|
50
|
+
% vim ~/.termtter/config
|
44
51
|
|
45
52
|
config.user_name = 'USERNAME'
|
46
53
|
config.password = 'PASSWORD'
|
@@ -65,9 +72,7 @@ http://wiki.github.com/jugyo/termtter/home (in Japanese)
|
|
65
72
|
== TODO:
|
66
73
|
|
67
74
|
- Enhance the document and spec
|
68
|
-
- Finalize the Hook specification and integration
|
69
75
|
- Improve the UI(a status view, etc...)
|
70
|
-
- Build a logging function
|
71
76
|
|
72
77
|
== LICENSE:
|
73
78
|
|
data/Rakefile
CHANGED
@@ -26,8 +26,7 @@ Gem::Specification.new do |s|
|
|
26
26
|
s.add_dependency("json_pure", ">= 1.1.3")
|
27
27
|
s.add_dependency("highline", ">= 1.5.0")
|
28
28
|
s.add_dependency("termcolor", ">= 0.3.1")
|
29
|
-
s.add_dependency("rubytter", ">= 0.6.
|
30
|
-
s.add_dependency("sqlite3-ruby", ">= 1.2.4")
|
29
|
+
s.add_dependency("rubytter", ">= 0.6.4")
|
31
30
|
s.authors = %w(jugyo ujihisa)
|
32
31
|
s.email = 'jugyo.org@gmail.com'
|
33
32
|
s.homepage = 'http://wiki.github.com/jugyo/termtter'
|
data/lib/plugins/addspace.rb
CHANGED
@@ -1,18 +1,18 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
|
3
3
|
config.plugins.addspace.set_default( :before, [ %r{https?://} ] )
|
4
|
-
config.plugins.addspace.set_default( :after, %w{ ★ ☆ △ ▽})
|
4
|
+
config.plugins.addspace.set_default( :after, %w{ ★ ☆ △ ▽ … })
|
5
5
|
|
6
6
|
module Termtter::Client
|
7
7
|
add_filter do |statuses, event|
|
8
8
|
statuses.each do |s|
|
9
9
|
config.plugins.addspace.before.each do |c|
|
10
|
-
s.text.gsub!(/(
|
10
|
+
s.text.gsub!(/(?<=\S)(#{c})/, ' \1' )
|
11
11
|
end
|
12
12
|
end
|
13
13
|
statuses.each do |s|
|
14
14
|
config.plugins.addspace.after.each do |c|
|
15
|
-
s.text.gsub!(/(#{c})(
|
15
|
+
s.text.gsub!(/(#{c})(?=\S)/, '\1 ' )
|
16
16
|
end
|
17
17
|
statuses
|
18
18
|
end
|
data/lib/plugins/bomb.rb
CHANGED
data/lib/plugins/confirm.rb
CHANGED
@@ -4,6 +4,9 @@ Termtter::Client.register_hook(
|
|
4
4
|
:name => :confirm,
|
5
5
|
:points => [:pre_exec_update],
|
6
6
|
:exec_proc => lambda {|cmd, arg|
|
7
|
-
|
7
|
+
if /^y?$/i !~ Readline.readline("update? #{arg} [Y/n] ", false)
|
8
|
+
puts 'canceled.'
|
9
|
+
raise Termtter::CommandCanceled
|
10
|
+
end
|
8
11
|
}
|
9
12
|
)
|
data/lib/plugins/growl.rb
CHANGED
@@ -4,58 +4,49 @@ require 'tmpdir'
|
|
4
4
|
require 'open-uri'
|
5
5
|
require 'uri'
|
6
6
|
require 'fileutils'
|
7
|
+
require 'cgi'
|
7
8
|
|
8
9
|
begin
|
9
10
|
require 'ruby-growl'
|
10
|
-
growl = Growl.new "localhost", "termtter", "
|
11
|
+
growl = Growl.new "localhost", "termtter", ["update_friends_timeline"]
|
11
12
|
rescue LoadError
|
12
13
|
growl = nil
|
13
14
|
end
|
14
15
|
|
15
|
-
config.plugins.growl.set_default(:icon_cache_dir, "#{
|
16
|
+
config.plugins.growl.set_default(:icon_cache_dir, "#{Termtter::CONF_DIR}/tmp/user_profile_images")
|
16
17
|
FileUtils.mkdir_p(config.plugins.growl.icon_cache_dir) unless File.exist?(config.plugins.growl.icon_cache_dir)
|
17
18
|
|
18
19
|
def get_icon_path(s)
|
20
|
+
Dir.mkdir_p(config.plugins.growl.icon_cache_dir) unless File.exists?(config.plugins.growl.icon_cache_dir)
|
19
21
|
cache_file = "%s/%s%s" % [ config.plugins.growl.icon_cache_dir,
|
20
|
-
s.
|
21
|
-
File.extname(s.
|
22
|
-
if File.exist?(cache_file)
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
22
|
+
s.user.screen_name,
|
23
|
+
File.extname(s.user.profile_image_url) ]
|
24
|
+
if !File.exist?(cache_file) || (File.atime(cache_file) + 24*60*60) < Time.now
|
25
|
+
File.open(cache_file, "wb") do |f|
|
26
|
+
begin
|
27
|
+
f << open(URI.escape(s.user.profile_image_url)).read
|
28
|
+
rescue OpenURI::HTTPError
|
29
|
+
return nil
|
28
30
|
end
|
29
31
|
end
|
30
|
-
return nil
|
31
32
|
end
|
33
|
+
cache_file
|
32
34
|
end
|
33
35
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
36
|
+
Termtter::Client.register_hook(
|
37
|
+
:name => :growl,
|
38
|
+
:points => [:output],
|
39
|
+
:exec_proc => lambda {|statuses, event|
|
40
|
+
return unless event == :update_friends_timeline
|
41
|
+
Thread.start do
|
42
|
+
statuses.each do |s|
|
39
43
|
unless growl
|
40
|
-
|
41
|
-
#icon_path = get_icon_path(s)
|
42
|
-
#arg += ['--image', icon_path] if icon_path
|
43
|
-
system *arg
|
44
|
+
system 'growlnotify', s.user.screen_name, '-m', s.text.gsub("\n",''), '-n', 'termtter', '--image', get_icon_path(s)
|
44
45
|
else
|
45
|
-
growl.notify "
|
46
|
+
growl.notify "update_friends_timeline", s.user.screen_name, CGI.unescapeHTML(s.text)
|
46
47
|
end
|
48
|
+
sleep 0.1
|
47
49
|
end
|
48
|
-
rescue => e
|
49
|
-
puts e
|
50
|
-
puts e.backtrace.join("\n")
|
51
50
|
end
|
52
|
-
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
Termtter::Client.register_hook(:name => :growl,
|
57
|
-
:points => [:post_filter],
|
58
|
-
:exec_proc => lambda {|statuses, event|
|
59
|
-
statuses.each {|s| queue << s} if event == :update_friends_timeline
|
60
|
-
}
|
51
|
+
}
|
61
52
|
)
|
data/lib/plugins/log.rb
CHANGED
@@ -22,8 +22,12 @@ module Termtter::Client
|
|
22
22
|
statuses.each do |s|
|
23
23
|
public_storage[:tweet][s.user.screen_name] = [] unless public_storage[:tweet][s.user.screen_name]
|
24
24
|
public_storage[:tweet][s.user.screen_name] << s
|
25
|
-
|
26
|
-
|
25
|
+
end
|
26
|
+
|
27
|
+
statuses.map{ |s| s.user.screen_name}.uniq.each do |name|
|
28
|
+
public_storage[:tweet][name]
|
29
|
+
if public_storage[:tweet][name].size > max_size
|
30
|
+
public_storage[:tweet][name] = public_storage[:tweet][name][-max_size..-1]
|
27
31
|
end
|
28
32
|
end
|
29
33
|
}
|
data/lib/plugins/msagent.rb
CHANGED
@@ -13,12 +13,12 @@ achar.show
|
|
13
13
|
|
14
14
|
Termtter::Client.register_hook(
|
15
15
|
:name => :msagent,
|
16
|
-
:points => [:
|
16
|
+
:points => [:output],
|
17
17
|
:exec_proc => lambda {|statuses, event|
|
18
18
|
if !statuses.empty? && event == :update_friends_timeline
|
19
19
|
Thread.start do
|
20
|
-
statuses.
|
21
|
-
req = achar.speak("#{s
|
20
|
+
statuses.each do |s|
|
21
|
+
req = achar.speak("#{s.user.screen_name}: #{s.text}".tosjis)
|
22
22
|
sleep 1
|
23
23
|
WIN32OLE_EVENT.message_loop
|
24
24
|
achar.stop(req)
|
data/lib/plugins/notify-send.rb
CHANGED
@@ -2,15 +2,15 @@
|
|
2
2
|
|
3
3
|
Termtter::Client.register_hook(
|
4
4
|
:name => :notify_send,
|
5
|
-
:points => [:
|
5
|
+
:points => [:output],
|
6
6
|
:exec_proc => lambda {|statuses, event|
|
7
7
|
if event == :update_friends_timeline
|
8
8
|
max = 10
|
9
9
|
|
10
10
|
text = statuses.take(max).map {|s|
|
11
|
-
status_text = CGI.escapeHTML(s
|
11
|
+
status_text = CGI.escapeHTML(s.text)
|
12
12
|
status_text.gsub!(%r{https?://[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+},'<a href="\0">\0</a>')
|
13
|
-
"<b>#{s
|
13
|
+
"<b>#{s.user.screen_name}:</b> <span font=\"9.0\">#{status_text}</span>"
|
14
14
|
}.join("\n")
|
15
15
|
|
16
16
|
text << %Q|\n<a href="http://twitter.com/">more...</a>| if statuses.size > max
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
# notify-send.rb からコピペ。共通化したいところ。
|
6
|
+
config.plugins.notify_send.set_default(:icon_cache_dir, "#{Termtter::CONF_DIR}/tmp/user_profile_images")
|
7
|
+
def get_icon_path(s)
|
8
|
+
FileUtils.mkdir_p(config.plugins.notify_send.icon_cache_dir) unless File.exist?(config.plugins.notify_send.icon_cache_dir)
|
9
|
+
cache_file = "%s/%s%s" % [ config.plugins.notify_send.icon_cache_dir,
|
10
|
+
s.user.screen_name,
|
11
|
+
File.extname(s.user.profile_image_url) ]
|
12
|
+
if !File.exist?(cache_file) || (File.atime(cache_file) + 24*60*60) < Time.now
|
13
|
+
File.open(cache_file, "wb") do |f|
|
14
|
+
begin
|
15
|
+
f << open(URI.escape(s.user.profile_image_url)).read
|
16
|
+
rescue OpenURI::HTTPError
|
17
|
+
return nil
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
cache_file
|
22
|
+
end
|
23
|
+
|
24
|
+
Termtter::Client.register_hook(
|
25
|
+
:name => :notify_send2,
|
26
|
+
:points => [:output],
|
27
|
+
:exec_proc => lambda {|statuses, event|
|
28
|
+
return unless event == :update_friends_timeline
|
29
|
+
Thread.start do
|
30
|
+
statuses.each do |s|
|
31
|
+
text = CGI.escapeHTML(s.text)
|
32
|
+
text.gsub!(%r{https?://[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+},'<a href="\0">\0</a>')
|
33
|
+
system 'notify-send', s.user.screen_name, text, '-i', get_icon_path(s)
|
34
|
+
sleep 0.1
|
35
|
+
end
|
36
|
+
end
|
37
|
+
}
|
38
|
+
)
|
39
|
+
|
data/lib/plugins/say.rb
CHANGED
@@ -12,7 +12,7 @@ end
|
|
12
12
|
module Termtter::Client
|
13
13
|
register_hook(
|
14
14
|
:name => :say,
|
15
|
-
:points => [:
|
15
|
+
:points => [:output],
|
16
16
|
:exec_proc => lambda {|statuses, event|
|
17
17
|
statuses.reverse.each do |s|
|
18
18
|
text_without_uri = s[:text].gsub(%r|https?://[^\s]+|, 'U.R.I.')
|
@@ -5,7 +5,7 @@ config.screen_notify.set_default(:format, "[termtter] %s")
|
|
5
5
|
module Termtter::Client
|
6
6
|
register_hook(
|
7
7
|
:name => :screen_notify,
|
8
|
-
:points => [:
|
8
|
+
:points => [:output],
|
9
9
|
:exec_proc => lambda{|statuses, event|
|
10
10
|
return unless event = :update_friends_timeline
|
11
11
|
Thread.new(statuses) do |ss|
|
data/lib/plugins/spam.rb
CHANGED
@@ -1,13 +1,16 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
|
3
|
-
|
3
|
+
message = '*super spam time*'
|
4
|
+
Termtter::API.twitter.update(message)
|
5
|
+
puts "=> #{message}"
|
6
|
+
|
4
7
|
Termtter::Client.register_hook(
|
5
8
|
:name => :span,
|
6
|
-
:
|
7
|
-
:
|
9
|
+
:point => /^pre_exec/,
|
10
|
+
:exec => lambda{|*arg|
|
8
11
|
text = arg.join(' ')
|
9
12
|
Termtter::API.twitter.update(text)
|
10
13
|
puts "=> #{text}"
|
11
|
-
|
14
|
+
raise Termtter::CommandCanceled
|
12
15
|
}
|
13
16
|
)
|
@@ -13,7 +13,7 @@ module Termtter::Client
|
|
13
13
|
register_command(
|
14
14
|
:name => :update, :aliases => [:u],
|
15
15
|
:exec_proc => lambda {|arg|
|
16
|
-
unless
|
16
|
+
unless /^\s*$/ =~ arg
|
17
17
|
# TODO: Change to able to disable erb.
|
18
18
|
text = ERB.new(arg).result(binding).gsub(/\n/, ' ')
|
19
19
|
result = Termtter::API.twitter.update(text)
|
@@ -31,14 +31,14 @@ module Termtter::Client
|
|
31
31
|
register_command(
|
32
32
|
:name => :direct, :aliases => [:d],
|
33
33
|
:exec_proc => lambda {|arg|
|
34
|
-
if
|
34
|
+
if /^([^\s]+)\s+(.*)\s*$/ =~ arg
|
35
35
|
user, text = $1, $2
|
36
36
|
Termtter::API.twitter.direct_message(user, text)
|
37
37
|
puts "=> to:#{user} message:#{text}"
|
38
38
|
end
|
39
39
|
},
|
40
40
|
:completion_proc => lambda {|cmd, args|
|
41
|
-
if
|
41
|
+
if /^([^\s]+)$/ =~ args
|
42
42
|
find_user_candidates $1, "#{cmd} %s"
|
43
43
|
end
|
44
44
|
}
|
@@ -49,10 +49,10 @@ module Termtter::Client
|
|
49
49
|
:exec_proc => lambda {|arg|
|
50
50
|
user = Termtter::API.twitter.user(arg.strip)
|
51
51
|
attrs = %w[ name screen_name url description profile_image_url location protected following
|
52
|
-
|
53
|
-
|
52
|
+
friends_count followers_count statuses_count favourites_count
|
53
|
+
id time_zone created_at utc_offset notifications
|
54
54
|
]
|
55
|
-
label_width = attrs.map
|
55
|
+
label_width = attrs.map(&:size).max
|
56
56
|
attrs.each do |attr|
|
57
57
|
value = user.__send__(attr.to_sym)
|
58
58
|
puts "#{attr.gsub('_', ' ').rjust(label_width)}: #{value}"
|
@@ -69,13 +69,13 @@ module Termtter::Client
|
|
69
69
|
user_name = arg.strip
|
70
70
|
user_name = config.user_name if user_name.empty?
|
71
71
|
|
72
|
-
followers = []
|
72
|
+
followers = []
|
73
73
|
page = 0
|
74
74
|
begin
|
75
75
|
followers += tmp = Termtter::API.twitter.followers(user_name, :page => page+=1)
|
76
76
|
end until tmp.empty?
|
77
77
|
Termtter::Client.public_storage[:followers] = followers
|
78
|
-
puts followers.map
|
78
|
+
puts followers.map(&:screen_name).join(' ')
|
79
79
|
}
|
80
80
|
# TODO :completion_proc
|
81
81
|
)
|
@@ -85,7 +85,7 @@ module Termtter::Client
|
|
85
85
|
:exec_proc => lambda {|arg|
|
86
86
|
if arg.empty?
|
87
87
|
event = :list_friends_timeline
|
88
|
-
statuses = Termtter::API.twitter.friends_timeline
|
88
|
+
statuses = Termtter::API.twitter.friends_timeline
|
89
89
|
else
|
90
90
|
event = :list_user_timeline
|
91
91
|
statuses = Termtter::API.twitter.user_timeline(arg)
|
@@ -108,7 +108,7 @@ module Termtter::Client
|
|
108
108
|
register_command(
|
109
109
|
:name => :replies, :aliases => [:r],
|
110
110
|
:exec_proc => lambda {|arg|
|
111
|
-
output(Termtter::API.twitter.replies
|
111
|
+
output(Termtter::API.twitter.replies, :replies)
|
112
112
|
}
|
113
113
|
)
|
114
114
|
|
@@ -125,9 +125,9 @@ module Termtter::Client
|
|
125
125
|
else
|
126
126
|
users = find_users(arg)
|
127
127
|
unless users.empty?
|
128
|
-
users.map{|user| "#{cmd} #{user}:"}
|
128
|
+
users.map {|user| "#{cmd} #{user}:"}
|
129
129
|
else
|
130
|
-
find_status_ids(arg).map{|id| "#{cmd} #{id}"}
|
130
|
+
find_status_ids(arg).map {|id| "#{cmd} #{id}"}
|
131
131
|
end
|
132
132
|
end
|
133
133
|
}
|
@@ -147,7 +147,7 @@ module Termtter::Client
|
|
147
147
|
:name => :follow, :aliases => [],
|
148
148
|
:exec_proc => lambda {|args|
|
149
149
|
args.split(' ').each do |arg|
|
150
|
-
if
|
150
|
+
if /^(\w+)/ =~ arg
|
151
151
|
res = Termtter::API::twitter.follow($1.strip)
|
152
152
|
end
|
153
153
|
end
|
@@ -155,14 +155,14 @@ module Termtter::Client
|
|
155
155
|
:completion_proc => lambda {|cmd, args|
|
156
156
|
find_user_candidates args, "#{cmd} %s"
|
157
157
|
},
|
158
|
-
|
158
|
+
:help => ['follow USER', 'Follow user']
|
159
159
|
)
|
160
160
|
|
161
161
|
register_command(
|
162
162
|
:name => :leave, :aliases => [],
|
163
163
|
:exec_proc => lambda {|args|
|
164
164
|
args.split(' ').each do |arg|
|
165
|
-
if
|
165
|
+
if /^(\w+)/ =~ arg
|
166
166
|
res = Termtter::API::twitter.leave($1.strip)
|
167
167
|
end
|
168
168
|
end
|
@@ -170,7 +170,7 @@ module Termtter::Client
|
|
170
170
|
:completion_proc => lambda {|cmd, args|
|
171
171
|
find_user_candidates args, "#{cmd} %s"
|
172
172
|
},
|
173
|
-
|
173
|
+
:help => ['leave USER', 'Leave user']
|
174
174
|
)
|
175
175
|
|
176
176
|
# TODO: Change colors when remaining_hits is low.
|
@@ -192,7 +192,7 @@ module Termtter::Client
|
|
192
192
|
:help => ["limit,lm", "Show the API limit status"]
|
193
193
|
)
|
194
194
|
|
195
|
-
register_command(
|
195
|
+
register_command(
|
196
196
|
:name => :pause,
|
197
197
|
:exec_proc => lambda {|arg| pause},
|
198
198
|
:help => ["pause", "Pause updating"]
|
@@ -255,21 +255,21 @@ module Termtter::Client
|
|
255
255
|
register_command(
|
256
256
|
:name => :execute,
|
257
257
|
:exec_proc => lambda{|arg|
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
258
|
+
if arg
|
259
|
+
`#{arg}`.each_line do |line|
|
260
|
+
unless line.strip.empty?
|
261
|
+
Termtter::API.twitter.update(line)
|
262
|
+
puts "=> #{line}"
|
263
|
+
end
|
263
264
|
end
|
264
265
|
end
|
265
|
-
end
|
266
266
|
},
|
267
267
|
:help => ['execute COMMAND', 'execute the command']
|
268
268
|
)
|
269
269
|
|
270
270
|
def self.formatted_help(helps)
|
271
|
-
helps = helps.sort_by{|help| help[0]}
|
272
|
-
width = helps.map {|n,
|
271
|
+
helps = helps.sort_by {|help| help[0] }
|
272
|
+
width = helps.map {|n, _| n.size }.max
|
273
273
|
space = 3
|
274
274
|
helps.map {|name, desc|
|
275
275
|
name.to_s.ljust(width + space) + desc.to_s
|
@@ -296,11 +296,11 @@ module Termtter::Client
|
|
296
296
|
)
|
297
297
|
|
298
298
|
def self.find_status_ids(text)
|
299
|
-
public_storage[:status_ids].select{|id|
|
299
|
+
public_storage[:status_ids].select {|id| /#{Regexp.quote(text)}/ =~ id.to_s}
|
300
300
|
end
|
301
301
|
|
302
302
|
def self.find_users(text)
|
303
|
-
public_storage[:users].select{|user|
|
303
|
+
public_storage[:users].select {|user| /#{Regexp.quote(text)}/ =~ user}
|
304
304
|
end
|
305
305
|
|
306
306
|
def self.find_user_candidates(a, b)
|
@@ -311,5 +311,4 @@ module Termtter::Client
|
|
311
311
|
end.
|
312
312
|
map {|u| b % u }
|
313
313
|
end
|
314
|
-
|
315
314
|
end
|
data/lib/plugins/stdout.rb
CHANGED
@@ -9,7 +9,11 @@ config.plugins.stdout.set_default(
|
|
9
9
|
config.plugins.stdout.set_default(
|
10
10
|
:timeline_format,
|
11
11
|
'<90><%=time%></90> <<%=status_color%>><%=status%></<%=status_color%>> <90><%=id%></90>')
|
12
|
-
config.plugins.stdout.set_default(:
|
12
|
+
config.plugins.stdout.set_default(:search_highlight_format, '<on_magenta><white>\1</white></on_magenta>')
|
13
|
+
|
14
|
+
config.plugins.stdout.set_default(:enable_pager, true)
|
15
|
+
config.plugins.stdout.set_default(:pager, 'less -R -f +G')
|
16
|
+
config.plugins.stdout.set_default(:window_height, 50)
|
13
17
|
|
14
18
|
module Termtter
|
15
19
|
class StdOut < Hook
|
@@ -24,21 +28,23 @@ module Termtter
|
|
24
28
|
def print_statuses(statuses, sort = true, time_format = nil)
|
25
29
|
return unless statuses and statuses.first
|
26
30
|
unless time_format
|
27
|
-
|
31
|
+
t0 = Time.now
|
28
32
|
t1 = Time.parse(statuses.first[:created_at])
|
29
33
|
t2 = Time.parse(statuses.last[:created_at])
|
30
34
|
time_format =
|
31
|
-
if [
|
35
|
+
if [t0.year, t0.month, t0.day] == [t1.year, t1.month, t1.day] \
|
36
|
+
and [t1.year, t1.month, t1.day] == [t2.year, t2.month, t2.day]
|
32
37
|
'%H:%M:%S'
|
33
38
|
else
|
34
39
|
'%y/%m/%d %H:%M'
|
35
40
|
end
|
36
41
|
end
|
37
|
-
|
42
|
+
|
43
|
+
output_text = ''
|
38
44
|
statuses.each do |s|
|
39
45
|
text = s.text
|
40
46
|
status_color = config.plugins.stdout.colors[s.user.id.hash % config.plugins.stdout.colors.size]
|
41
|
-
status = "#{s.user.screen_name}: #{text}"
|
47
|
+
status = "#{s.user.screen_name}: #{TermColor.escape(text)}"
|
42
48
|
if s.in_reply_to_status_id
|
43
49
|
status += " (repl. to #{s.in_reply_to_status_id})"
|
44
50
|
end
|
@@ -46,7 +52,17 @@ module Termtter
|
|
46
52
|
time = "(#{Time.parse(s.created_at).strftime(time_format)})"
|
47
53
|
id = s.id
|
48
54
|
erbed_text = ERB.new(config.plugins.stdout.timeline_format).result(binding)
|
49
|
-
|
55
|
+
output_text << TermColor.parse(erbed_text) + "\n"
|
56
|
+
end
|
57
|
+
|
58
|
+
if config.plugins.stdout.enable_pager && ENV['LINES'] && statuses.size > ENV['LINES'].to_i
|
59
|
+
file = Tempfile.new('termtter')
|
60
|
+
file.print output_text
|
61
|
+
file.close
|
62
|
+
system "#{config.plugins.stdout.pager} #{file.path}"
|
63
|
+
file.close(true)
|
64
|
+
else
|
65
|
+
print output_text
|
50
66
|
end
|
51
67
|
end
|
52
68
|
end
|
data/lib/plugins/storage.rb
CHANGED
@@ -18,7 +18,7 @@ module Termtter::Client
|
|
18
18
|
:created_at => Time.parse(s.created_at).to_i,
|
19
19
|
:in_reply_to_status_id => s.in_reply_to_status_id,
|
20
20
|
:in_reply_to_user_id => s.in_reply_to_user_id,
|
21
|
-
:
|
21
|
+
:text => s.text,
|
22
22
|
:user_id => s.user.id,
|
23
23
|
:screen_name => s.user.screen_name
|
24
24
|
)
|
@@ -38,4 +38,18 @@ module Termtter::Client
|
|
38
38
|
},
|
39
39
|
:help => [ 'search_storage WORD', 'Search storage for WORD' ]
|
40
40
|
)
|
41
|
+
|
42
|
+
register_command(
|
43
|
+
:name => :search_storage_user,
|
44
|
+
:aliases => [:ssu],
|
45
|
+
:exec_proc => lambda {|arg|
|
46
|
+
unless arg.strip.empty?
|
47
|
+
key = arg.strip
|
48
|
+
statuses = Termtter::Storage::Status.search_user({:user => key})
|
49
|
+
output(statuses, :search)
|
50
|
+
end
|
51
|
+
},
|
52
|
+
:help => [ 'search_storage_user SCREEN_NAME', 'Search storage for SCREE_NAME' ]
|
53
|
+
)
|
54
|
+
|
41
55
|
end
|
@@ -13,8 +13,16 @@ module Termtter::Storage
|
|
13
13
|
|
14
14
|
def self.search(query)
|
15
15
|
raise "query must be Hash(#{query}, #{query.class})" unless query.kind_of? Hash
|
16
|
+
if query[:text] == nil then
|
17
|
+
query[:text] = '';
|
18
|
+
end
|
19
|
+
if query[:user] == nil then
|
20
|
+
query[:user] = '';
|
21
|
+
end
|
16
22
|
result = []
|
17
|
-
|
23
|
+
sql = "select created_at, screen_name, post_text, in_reply_to_status_id, post_id, user_id "
|
24
|
+
sql += "from post inner join user on post.user_id = user.id where post_text like '%' || ? || '%'"
|
25
|
+
DB.instance.db.execute(sql,
|
18
26
|
query[:text]) do |created_at, screen_name, post_text, in_reply_to_status_id, post_id, user_id|
|
19
27
|
created_at = Time.at(created_at).to_s
|
20
28
|
result << {
|
@@ -32,19 +40,43 @@ module Termtter::Storage
|
|
32
40
|
Rubytter.json_to_struct(result)
|
33
41
|
end
|
34
42
|
|
43
|
+
def self.search_user(query)
|
44
|
+
raise "query must be Hash(#{query}, #{query.class})" unless query.kind_of? Hash
|
45
|
+
result = []
|
46
|
+
sql = "select created_at, screen_name, post_text, in_reply_to_status_id, post_id, user_id "
|
47
|
+
sql += "from post inner join user on post.user_id = user.id where "
|
48
|
+
sql += query[:user].split(' ').map!{|que| que.gsub(/(\w+)/, 'screen_name like \'%\1%\'')}.join(' or ')
|
49
|
+
DB.instance.db.execute(sql) do |created_at, screen_name, post_text, in_reply_to_status_id, post_id, user_id|
|
50
|
+
created_at = Time.at(created_at).to_s
|
51
|
+
result << {
|
52
|
+
:id => post_id,
|
53
|
+
:created_at => created_at,
|
54
|
+
:text => post_text,
|
55
|
+
:in_reply_to_status_id => in_reply_to_status_id,
|
56
|
+
:in_reply_to_user_id => nil,
|
57
|
+
:user => {
|
58
|
+
:id => user_id,
|
59
|
+
:screen_name => screen_name
|
60
|
+
}
|
61
|
+
}
|
62
|
+
end
|
63
|
+
Rubytter.json_to_struct(result)
|
64
|
+
end
|
65
|
+
|
35
66
|
def self.insert(data)
|
67
|
+
return unless data[:text]
|
36
68
|
DB.instance.db.execute(
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
69
|
+
"insert into post values(?,?,?,?,?,?)",
|
70
|
+
data[:post_id],
|
71
|
+
data[:created_at],
|
72
|
+
data[:in_reply_to_status_id],
|
73
|
+
data[:in_reply_to_user_id],
|
74
|
+
data[:text],
|
75
|
+
data[:user_id])
|
44
76
|
DB.instance.db.execute(
|
45
|
-
|
46
|
-
|
47
|
-
|
77
|
+
"insert into user values(?,?)",
|
78
|
+
data[:user_id],
|
79
|
+
data[:screen_name])
|
48
80
|
rescue SQLite3::SQLException
|
49
81
|
end
|
50
82
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
module Termtter::Client
|
4
|
+
register_command(
|
5
|
+
:name => :timer,
|
6
|
+
:exec_proc => lambda{|arg|
|
7
|
+
# argをparseする
|
8
|
+
return unless arg =~ /^\d+$/
|
9
|
+
after = arg.to_i
|
10
|
+
Termtter::Client.add_task(:after => after) do
|
11
|
+
text = "@#{config.user_name} 時間ですよ!!"
|
12
|
+
Termtter::API.twitter.update text
|
13
|
+
puts "=> " << text
|
14
|
+
end
|
15
|
+
},
|
16
|
+
:help => ['timer SEC', 'post reminder after SEC.']
|
17
|
+
)
|
18
|
+
end
|
data/lib/plugins/uri-open.rb
CHANGED
data/lib/termtter/api.rb
CHANGED
data/lib/termtter/client.rb
CHANGED
@@ -5,6 +5,7 @@ require 'logger'
|
|
5
5
|
module Termtter
|
6
6
|
|
7
7
|
class CommandNotFound < StandardError; end
|
8
|
+
class CommandCanceled < StandardError; end
|
8
9
|
|
9
10
|
module Client
|
10
11
|
|
@@ -17,8 +18,7 @@ module Termtter
|
|
17
18
|
@since_id = nil
|
18
19
|
@input_thread = nil
|
19
20
|
@task_manager = Termtter::TaskManager.new
|
20
|
-
config.
|
21
|
-
config.log.set_default(:level, nil)
|
21
|
+
config.set_default(:logger, nil)
|
22
22
|
config.set_default(:update_interval, 300)
|
23
23
|
config.set_default(:prompt, '> ')
|
24
24
|
config.set_default(:devel, false)
|
@@ -102,7 +102,10 @@ module Termtter
|
|
102
102
|
call_hooks(:pre_filter, statuses, event)
|
103
103
|
filtered = apply_filters(statuses, event)
|
104
104
|
call_hooks(:post_filter, filtered, event)
|
105
|
-
|
105
|
+
get_hooks(:output).each do |hook|
|
106
|
+
filtered_for_hook = apply_filters_for_hook(filtered, hook.name)
|
107
|
+
hook.call(filtered_for_hook, event)
|
108
|
+
end
|
106
109
|
end
|
107
110
|
|
108
111
|
def apply_filters(statuses, event)
|
@@ -111,8 +114,12 @@ module Termtter
|
|
111
114
|
filtered = f.call(filtered, event)
|
112
115
|
end
|
113
116
|
filtered
|
114
|
-
|
115
|
-
|
117
|
+
end
|
118
|
+
|
119
|
+
def apply_filters_for_hook(statuses, hook_name)
|
120
|
+
# TODO
|
121
|
+
filtered = statuses.map(&:dup)
|
122
|
+
filtered
|
116
123
|
end
|
117
124
|
|
118
125
|
# return last hook return value
|
@@ -123,12 +130,6 @@ module Termtter
|
|
123
130
|
result = hook.call(*args)
|
124
131
|
}
|
125
132
|
result
|
126
|
-
rescue => e
|
127
|
-
if point.to_sym == :on_error
|
128
|
-
raise
|
129
|
-
else
|
130
|
-
handle_error(e)
|
131
|
-
end
|
132
133
|
end
|
133
134
|
|
134
135
|
def call_commands(text, tw = nil)
|
@@ -136,26 +137,24 @@ module Termtter
|
|
136
137
|
|
137
138
|
command_found = false
|
138
139
|
@commands.each do |key, command|
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
command_found = true
|
140
|
+
next unless command.match?(text)
|
141
|
+
command_found = true
|
142
|
+
command_str, command_arg = Command.split_command_line(text)
|
143
143
|
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
144
|
+
modified_arg = call_hooks(
|
145
|
+
"modify_arg_for_#{command.name.to_s}",
|
146
|
+
command_str,
|
147
|
+
command_arg) || command_arg || ''
|
148
148
|
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
next if pre_exec_hook_result == false
|
149
|
+
@task_manager.invoke_and_wait do
|
150
|
+
begin
|
151
|
+
call_hooks("pre_exec_#{command.name.to_s}", command_str, modified_arg)
|
153
152
|
# exec command
|
154
|
-
result = command.call(modified_arg)
|
153
|
+
result = command.call(command_str, modified_arg, text)
|
155
154
|
if result
|
156
155
|
call_hooks("post_exec_#{command.name.to_s}", command_str, modified_arg, result)
|
157
156
|
end
|
158
|
-
|
157
|
+
rescue CommandCanceled
|
159
158
|
end
|
160
159
|
end
|
161
160
|
end
|
@@ -259,6 +258,8 @@ module Termtter
|
|
259
258
|
puts 'plese check your account settings'
|
260
259
|
exit!
|
261
260
|
end
|
261
|
+
rescue => e
|
262
|
+
handle_error(e)
|
262
263
|
end
|
263
264
|
}
|
264
265
|
)
|
@@ -308,8 +309,7 @@ module Termtter
|
|
308
309
|
end
|
309
310
|
|
310
311
|
def setup_logger
|
311
|
-
@logger = config.
|
312
|
-
@logger.level = config.log.level || Logger::WARN
|
312
|
+
@logger = config.logger || Logger.new(STDOUT)
|
313
313
|
end
|
314
314
|
|
315
315
|
def run
|
@@ -328,7 +328,7 @@ module Termtter
|
|
328
328
|
end
|
329
329
|
|
330
330
|
def handle_error(e)
|
331
|
-
|
331
|
+
get_hooks(:on_error).each {|hook| hook.call(e) }
|
332
332
|
rescue Exception => e
|
333
333
|
puts "Error: #{e}"
|
334
334
|
puts e.backtrace.join("\n")
|
data/lib/termtter/command.rb
CHANGED
@@ -36,7 +36,7 @@ module Termtter
|
|
36
36
|
end
|
37
37
|
|
38
38
|
def complement(input)
|
39
|
-
command_str, command_arg =
|
39
|
+
command_str, command_arg = Command.split_command_line(input)
|
40
40
|
if command_arg
|
41
41
|
if completion_proc
|
42
42
|
[completion_proc.call(command_str, command_arg || '')].flatten.compact
|
@@ -48,7 +48,7 @@ module Termtter
|
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
51
|
-
def call(arg)
|
51
|
+
def call(cmd, arg, original_text)
|
52
52
|
arg = case arg
|
53
53
|
when nil
|
54
54
|
''
|
@@ -60,14 +60,8 @@ module Termtter
|
|
60
60
|
exec_proc.call(arg)
|
61
61
|
end
|
62
62
|
|
63
|
-
# return array like [command, arg]
|
64
|
-
# match? メソッドがなんかきもちわるいので変える予定
|
65
63
|
def match?(input)
|
66
|
-
|
67
|
-
[$2 || $3, $4] # $2 or $3 => command, $4 => argument
|
68
|
-
else
|
69
|
-
[nil, nil]
|
70
|
-
end
|
64
|
+
(pattern =~ input) != nil
|
71
65
|
end
|
72
66
|
|
73
67
|
def pattern
|
@@ -78,6 +72,10 @@ module Termtter
|
|
78
72
|
def commands
|
79
73
|
[name] + aliases
|
80
74
|
end
|
75
|
+
|
76
|
+
def self.split_command_line(line)
|
77
|
+
line.strip.split(/\s+/, 2)
|
78
|
+
end
|
81
79
|
end
|
82
80
|
end
|
83
81
|
|
data/lib/termtter/hook.rb
CHANGED
data/lib/termtter/version.rb
CHANGED
@@ -230,5 +230,19 @@ module Termtter
|
|
230
230
|
end
|
231
231
|
$stderr = old
|
232
232
|
end
|
233
|
+
|
234
|
+
it 'should cancel command by hook' do
|
235
|
+
command = Command.new(:name => :test)
|
236
|
+
Client.register_command(command)
|
237
|
+
Client.register_hook(
|
238
|
+
:name => :test,
|
239
|
+
:point => /^pre_exec/,
|
240
|
+
:exec => lambda{|*arg|
|
241
|
+
raise Termtter::CommandCanceled
|
242
|
+
}
|
243
|
+
)
|
244
|
+
command.should_not_receive(:call)
|
245
|
+
Client.call_commands('test')
|
246
|
+
end
|
233
247
|
end
|
234
248
|
end
|
@@ -58,18 +58,18 @@ module Termtter
|
|
58
58
|
|
59
59
|
it 'should return command_info when call method "match?"' do
|
60
60
|
[
|
61
|
-
['update',
|
62
|
-
['up',
|
63
|
-
['u',
|
64
|
-
['update ',
|
65
|
-
[' update ',
|
66
|
-
['update foo',
|
67
|
-
[' update foo',
|
68
|
-
[' update foo ',
|
69
|
-
['u foo',
|
70
|
-
['up foo',
|
71
|
-
['upd foo',
|
72
|
-
['upd foo',
|
61
|
+
['update', true],
|
62
|
+
['up', true],
|
63
|
+
['u', true],
|
64
|
+
['update ', true],
|
65
|
+
[' update ', false],
|
66
|
+
['update foo', true],
|
67
|
+
[' update foo', false],
|
68
|
+
[' update foo ', false],
|
69
|
+
['u foo', true],
|
70
|
+
['up foo', true],
|
71
|
+
['upd foo', false],
|
72
|
+
['upd foo', false],
|
73
73
|
].each do |input, result|
|
74
74
|
@command.match?(input).should == result
|
75
75
|
end
|
@@ -82,17 +82,25 @@ module Termtter
|
|
82
82
|
end
|
83
83
|
|
84
84
|
it 'should call exec_proc when call method "call"' do
|
85
|
-
@command.call('test').should == 'test'
|
86
|
-
@command.call(' test').should == ' test'
|
87
|
-
@command.call(' test ').should == ' test '
|
88
|
-
@command.call('test test').should == 'test test'
|
85
|
+
@command.call('foo', 'test', 'foo test').should == 'test'
|
86
|
+
@command.call('foo', ' test', 'foo test').should == ' test'
|
87
|
+
@command.call('foo', ' test ', 'foo test ').should == ' test '
|
88
|
+
@command.call('foo', 'test test', 'foo test test').should == 'test test'
|
89
89
|
end
|
90
90
|
|
91
91
|
it 'should raise ArgumentError at call' do
|
92
|
-
lambda { @command.call(nil) }.should_not raise_error(ArgumentError)
|
93
|
-
lambda { @command.call('foo') }.should_not raise_error(ArgumentError)
|
94
|
-
lambda { @command.call(false) }.should raise_error(ArgumentError)
|
95
|
-
lambda { @command.call(Array.new) }.should raise_error(ArgumentError)
|
92
|
+
lambda { @command.call('foo', nil, 'foo') }.should_not raise_error(ArgumentError)
|
93
|
+
lambda { @command.call('foo', 'foo', 'foo') }.should_not raise_error(ArgumentError)
|
94
|
+
lambda { @command.call('foo', false, 'foo') }.should raise_error(ArgumentError)
|
95
|
+
lambda { @command.call('foo', Array.new, 'foo') }.should raise_error(ArgumentError)
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'split command line' do
|
99
|
+
Command.split_command_line('test foo bar').should == ['test', 'foo bar']
|
100
|
+
Command.split_command_line('test foo bar').should == ['test', 'foo bar']
|
101
|
+
Command.split_command_line('test foo bar').should == ['test', 'foo bar']
|
102
|
+
Command.split_command_line(' test foo bar').should == ['test', 'foo bar']
|
103
|
+
Command.split_command_line(' test foo bar ').should == ['test', 'foo bar']
|
96
104
|
end
|
97
105
|
end
|
98
106
|
end
|
data/spec/termtter/hook_spec.rb
CHANGED
@@ -9,10 +9,9 @@ module Termtter
|
|
9
9
|
|
10
10
|
it 'should match' do
|
11
11
|
hook = Hook.new(
|
12
|
-
:name => :
|
12
|
+
:name => :spam,
|
13
13
|
:points => ['foo'],
|
14
14
|
:exec_proc => lambda{|cmd, arg|
|
15
|
-
puts 'a'
|
16
15
|
}
|
17
16
|
)
|
18
17
|
hook.match?('foo').should == true
|
@@ -23,10 +22,9 @@ module Termtter
|
|
23
22
|
|
24
23
|
it 'should match when multi points' do
|
25
24
|
hook = Hook.new(
|
26
|
-
:name => :
|
25
|
+
:name => :spam,
|
27
26
|
:points => ['foo', 'bar'],
|
28
27
|
:exec_proc => lambda{|cmd, arg|
|
29
|
-
puts 'a'
|
30
28
|
}
|
31
29
|
)
|
32
30
|
hook.match?('foo').should == true
|
@@ -37,10 +35,9 @@ module Termtter
|
|
37
35
|
|
38
36
|
it 'should match when multi points' do
|
39
37
|
hook = Hook.new(
|
40
|
-
:name => :
|
38
|
+
:name => :spam,
|
41
39
|
:points => ['foo', /bar/],
|
42
40
|
:exec_proc => lambda{|cmd, arg|
|
43
|
-
puts 'a'
|
44
41
|
}
|
45
42
|
)
|
46
43
|
hook.match?('foo').should == true
|
@@ -52,10 +49,9 @@ module Termtter
|
|
52
49
|
|
53
50
|
it 'should match when multi points' do
|
54
51
|
hook = Hook.new(
|
55
|
-
:name => :
|
52
|
+
:name => :spam,
|
56
53
|
:points => ['foo', /^bar/],
|
57
54
|
:exec_proc => lambda{|cmd, arg|
|
58
|
-
puts 'a'
|
59
55
|
}
|
60
56
|
)
|
61
57
|
hook.match?('bar').should == true
|
@@ -65,5 +61,18 @@ module Termtter
|
|
65
61
|
hook.match?(:'bar_').should == true
|
66
62
|
hook.match?(:'_bar_').should == false
|
67
63
|
end
|
64
|
+
|
65
|
+
it 'call hook proc' do
|
66
|
+
proc_args = nil
|
67
|
+
hook = Hook.new(
|
68
|
+
:name => :spam,
|
69
|
+
:points => ['foo'],
|
70
|
+
:exec_proc => lambda{|*args|
|
71
|
+
proc_args = args
|
72
|
+
}
|
73
|
+
)
|
74
|
+
hook.call('foo', 'bar')
|
75
|
+
proc_args.should == ['foo', 'bar']
|
76
|
+
end
|
68
77
|
end
|
69
78
|
end
|
data/spec/termtter_spec.rb
CHANGED
@@ -4,14 +4,12 @@ require File.dirname(__FILE__) + '/spec_helper'
|
|
4
4
|
|
5
5
|
describe Termtter, 'when plugin is called (without init option)' do
|
6
6
|
it 'should require global plugin if exist' do
|
7
|
-
|
8
|
-
should_receive(:require).with('plugins/aaa')
|
7
|
+
should_receive(:load).with('plugins/aaa.rb')
|
9
8
|
plugin 'aaa'
|
10
9
|
end
|
11
10
|
|
12
11
|
it 'should require user plugin if not exist' do
|
13
|
-
|
14
|
-
should_receive(:require).with(File.expand_path('~/.termtter/plugins/aaa'))
|
12
|
+
should_receive(:load).with('plugins/aaa.rb')
|
15
13
|
plugin 'aaa'
|
16
14
|
end
|
17
15
|
|
@@ -23,7 +21,7 @@ end
|
|
23
21
|
|
24
22
|
describe Termtter, 'when plugin is called (with init option)' do
|
25
23
|
it 'init option will become config' do
|
26
|
-
should_receive(:
|
24
|
+
should_receive(:load)
|
27
25
|
|
28
26
|
plugin 'aaa', :bbb => :ccc
|
29
27
|
config.plugins.aaa.bbb.should == :ccc
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jugyo-termtter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- jugyo
|
@@ -51,17 +51,7 @@ dependencies:
|
|
51
51
|
requirements:
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 0.6.
|
55
|
-
version:
|
56
|
-
- !ruby/object:Gem::Dependency
|
57
|
-
name: sqlite3-ruby
|
58
|
-
type: :runtime
|
59
|
-
version_requirement:
|
60
|
-
version_requirements: !ruby/object:Gem::Requirement
|
61
|
-
requirements:
|
62
|
-
- - ">="
|
63
|
-
- !ruby/object:Gem::Version
|
64
|
-
version: 1.2.4
|
54
|
+
version: 0.6.4
|
65
55
|
version:
|
66
56
|
description: Termtter is a terminal based Twitter client
|
67
57
|
email: jugyo.org@gmail.com
|
@@ -103,6 +93,7 @@ files:
|
|
103
93
|
- lib/plugins/msagent.rb
|
104
94
|
- lib/plugins/multi_reply.rb
|
105
95
|
- lib/plugins/notify-send.rb
|
96
|
+
- lib/plugins/notify-send2.rb
|
106
97
|
- lib/plugins/otsune.rb
|
107
98
|
- lib/plugins/outputz.rb
|
108
99
|
- lib/plugins/pause.rb
|
@@ -130,10 +121,10 @@ files:
|
|
130
121
|
- lib/plugins/storage/status_mook.rb
|
131
122
|
- lib/plugins/storage.rb
|
132
123
|
- lib/plugins/system_status.rb
|
124
|
+
- lib/plugins/timer.rb
|
133
125
|
- lib/plugins/translation.rb
|
134
126
|
- lib/plugins/update_editor.rb
|
135
127
|
- lib/plugins/uri-open.rb
|
136
|
-
- lib/plugins/url_addspace.rb
|
137
128
|
- lib/plugins/wassr_post.rb
|
138
129
|
- lib/plugins/yhara.rb
|
139
130
|
- lib/plugins/yhara_filter.rb
|
data/lib/plugins/url_addspace.rb
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
|
-
|
3
|
-
module Termtter::Client
|
4
|
-
add_filter do |statuses, event|
|
5
|
-
statuses.each do |s|
|
6
|
-
s.text.gsub!(/(\S)(https?:\/\/)/, '\1 \2')
|
7
|
-
end
|
8
|
-
statuses
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
# url_addspace
|
13
|
-
# add space before URL without space
|
14
|
-
# example:
|
15
|
-
# before: ABCDEhttp://~~~
|
16
|
-
# after: ABCDE http://~~~
|