ruby_gntp 0.2.3 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/ruby_gntp.rb +67 -32
- data/test/ruby_gntp_spec.rb +59 -2
- data/test/ruby_gntp_spec_helper.rb +6 -0
- metadata +2 -2
data/lib/ruby_gntp.rb
CHANGED
@@ -38,17 +38,17 @@ class TooFewParametersError < Exception
|
|
38
38
|
end
|
39
39
|
|
40
40
|
class GNTP
|
41
|
-
attr_reader :app_name, :target_host, :target_port
|
41
|
+
attr_reader :app_name, :target_host, :target_port
|
42
42
|
attr_reader :message if $DEBUG
|
43
43
|
|
44
44
|
RUBY_GNTP_NAME = 'ruby_gntp'
|
45
|
-
RUBY_GNTP_VERSION = '0.
|
45
|
+
RUBY_GNTP_VERSION = '0.3.0'
|
46
46
|
|
47
47
|
def initialize(app_name = 'Ruby/GNTP', host = 'localhost', password = '', port = 23053)
|
48
|
-
@app_name
|
49
|
-
@target_host
|
50
|
-
@target_port
|
51
|
-
@password
|
48
|
+
@app_name = app_name
|
49
|
+
@target_host = host
|
50
|
+
@target_port = port
|
51
|
+
@password = password
|
52
52
|
end
|
53
53
|
|
54
54
|
#
|
@@ -56,16 +56,17 @@ class GNTP
|
|
56
56
|
#
|
57
57
|
def register(params)
|
58
58
|
@notifications = params[:notifications]
|
59
|
+
@app_icon = params[:app_icon]
|
60
|
+
|
59
61
|
raise TooFewParametersError, "Need least one 'notification' for register" unless @notifications
|
60
62
|
|
61
|
-
@app_icon = params[:app_icon]
|
62
63
|
@binaries = []
|
63
64
|
|
64
|
-
|
65
|
-
|
65
|
+
message = register_header(@app_name, @app_icon)
|
66
|
+
message << output_origin_headers
|
66
67
|
|
67
|
-
|
68
|
-
|
68
|
+
message << "Notifications-Count: #{@notifications.size}\r\n"
|
69
|
+
message << "\r\n"
|
69
70
|
|
70
71
|
@notifications.each do |notification|
|
71
72
|
name = notification[:name]
|
@@ -73,19 +74,19 @@ class GNTP
|
|
73
74
|
enabled = notification[:enabled] || true
|
74
75
|
icon = notification[:icon]
|
75
76
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
77
|
+
message << "Notification-Name: #{name}\r\n"
|
78
|
+
message << "Notification-Enabled: #{enabled ? 'True' : 'False'}\r\n"
|
79
|
+
message << "Notification-Display-Name: #{disp_name}\r\n"
|
80
|
+
message << "#{handle_icon(icon, 'Notification')}\r\n" if icon
|
80
81
|
end
|
81
82
|
|
82
83
|
@binaries.each {|binary|
|
83
|
-
|
84
|
+
message << output_binary(binary)
|
84
85
|
}
|
85
86
|
|
86
|
-
|
87
|
+
message << "\r\n"
|
87
88
|
|
88
|
-
unless (ret = send_and_recieve(
|
89
|
+
unless (ret = send_and_recieve(message))
|
89
90
|
raise "Register failed"
|
90
91
|
end
|
91
92
|
end
|
@@ -93,27 +94,33 @@ class GNTP
|
|
93
94
|
#
|
94
95
|
# notify
|
95
96
|
#
|
96
|
-
def notify(params)
|
97
|
+
def notify(params, &callback)
|
97
98
|
name = params[:name]
|
98
|
-
raise TooFewParametersError, "Notification need 'name', 'title' parameters" unless name || title
|
99
|
-
|
100
99
|
title = params[:title]
|
101
100
|
text = params[:text]
|
102
101
|
icon = params[:icon] || get_notification_icon(name)
|
103
102
|
sticky = params[:sticky]
|
103
|
+
callback_context = params[:callback_context]
|
104
|
+
callback_context_type = params[:callback_context_type]
|
105
|
+
|
106
|
+
raise TooFewParametersError, "Notification need 'name', 'title' parameters" unless name || title
|
104
107
|
|
105
108
|
@binaries = []
|
106
109
|
|
107
|
-
|
108
|
-
|
110
|
+
message = notify_header(app_name, name, title, text, sticky, icon)
|
111
|
+
message << output_origin_headers
|
112
|
+
if callback || callback_context
|
113
|
+
message << "Notification-Callback-Context: #{callback_context || '(none)'}\r\n"
|
114
|
+
message << "Notification-Callback-Context-Type: #{callback_context_type || '(none)'}\r\n"
|
115
|
+
end
|
109
116
|
|
110
117
|
@binaries.each {|binary|
|
111
|
-
|
118
|
+
message << output_binary(binary)
|
112
119
|
}
|
113
120
|
|
114
|
-
|
121
|
+
message << "\r\n"
|
115
122
|
|
116
|
-
unless (ret = send_and_recieve(
|
123
|
+
unless (ret = send_and_recieve(message, callback))
|
117
124
|
raise "Notify failed"
|
118
125
|
end
|
119
126
|
end
|
@@ -122,7 +129,7 @@ class GNTP
|
|
122
129
|
#
|
123
130
|
# instant notification
|
124
131
|
#
|
125
|
-
def self.notify(params)
|
132
|
+
def self.notify(params, &callback)
|
126
133
|
host = params[:host]
|
127
134
|
passwd = params[:passwd]
|
128
135
|
|
@@ -133,7 +140,7 @@ class GNTP
|
|
133
140
|
growl.register(:notifications => [
|
134
141
|
:name => notification[:name]
|
135
142
|
])
|
136
|
-
growl.notify(notification)
|
143
|
+
growl.notify(notification, &callback)
|
137
144
|
end
|
138
145
|
|
139
146
|
private
|
@@ -141,7 +148,7 @@ class GNTP
|
|
141
148
|
#
|
142
149
|
# send and recieve
|
143
150
|
#
|
144
|
-
def send_and_recieve
|
151
|
+
def send_and_recieve(msg, callback=nil)
|
145
152
|
print msg if $DEBUG
|
146
153
|
|
147
154
|
sock = TCPSocket.open(@target_host, @target_port)
|
@@ -153,8 +160,24 @@ class GNTP
|
|
153
160
|
print ">#{rcv}" if $DEBUG
|
154
161
|
ret = $1 if /GNTP\/1.0\s+-(\S+)/ =~ rcv
|
155
162
|
end
|
156
|
-
sock.close
|
157
163
|
|
164
|
+
if callback
|
165
|
+
Thread.new do
|
166
|
+
response = {}
|
167
|
+
while rcv = sock.gets
|
168
|
+
break if rcv == "\r\n"
|
169
|
+
print ">>#{rcv}" if $DEBUG
|
170
|
+
response[:callback_result] = $1 if /Notification-Callback-Result:\s+(\S*)\r\n/ =~ rcv
|
171
|
+
response[:callback_context] = $1 if /Notification-Callback-Context:\s+(\S*)\r\n/ =~ rcv
|
172
|
+
response[:callback_context_type] = $1 if /Notification-Callback-Context-Type:\s+(\S*)\r\n/ =~ rcv
|
173
|
+
end
|
174
|
+
callback.call(response)
|
175
|
+
sock.close
|
176
|
+
end
|
177
|
+
return true
|
178
|
+
end
|
179
|
+
|
180
|
+
sock.close
|
158
181
|
return 'OK' == ret
|
159
182
|
end
|
160
183
|
|
@@ -198,6 +221,9 @@ class GNTP
|
|
198
221
|
|
199
222
|
platformname, platformversion = '', ''
|
200
223
|
|
224
|
+
# see Proper way to detect Windows platform in Ruby - The Empty Way
|
225
|
+
# http://blog.emptyway.com/2009/11/03/proper-way-to-detect-windows-platform-in-ruby/
|
226
|
+
#
|
201
227
|
if Config::CONFIG['host_os'] =~ /mswin/
|
202
228
|
ver = `ver`
|
203
229
|
if ver.index('[')
|
@@ -285,7 +311,9 @@ if __FILE__ == $0
|
|
285
311
|
:text => "Congraturation! You are successful install ruby_gntp.",
|
286
312
|
:icon => "http://www.hatena.ne.jp/users/sn/snaka72/profile.gif",
|
287
313
|
:sticky=> true
|
288
|
-
)
|
314
|
+
) do |response|
|
315
|
+
p response
|
316
|
+
end
|
289
317
|
|
290
318
|
#--- Use instant notification method (just 'notify')
|
291
319
|
GNTP.notify({
|
@@ -295,7 +323,14 @@ if __FILE__ == $0
|
|
295
323
|
:title => "Instant notification",
|
296
324
|
:text => "Instant notification available now.",
|
297
325
|
:icon => "http://www.hatena.ne.jp/users/sn/snaka72/profile.gif",
|
298
|
-
})
|
326
|
+
}) do |response|
|
327
|
+
p response
|
328
|
+
end
|
329
|
+
|
330
|
+
#--- wait
|
331
|
+
puts
|
332
|
+
puts "press enter key to finish."
|
333
|
+
a = STDIN.gets
|
299
334
|
end
|
300
335
|
|
301
336
|
# vim: ts=2 sw=2 expandtab fdm=marker
|
data/test/ruby_gntp_spec.rb
CHANGED
@@ -54,6 +54,7 @@ describe GNTP do
|
|
54
54
|
].each {|expected_text|
|
55
55
|
@sended_messages.last.should include(expected_text)
|
56
56
|
}
|
57
|
+
|
57
58
|
end
|
58
59
|
|
59
60
|
it "can notify with minimum params" do
|
@@ -72,11 +73,67 @@ describe GNTP do
|
|
72
73
|
end
|
73
74
|
|
74
75
|
it "should callback when notify clicked" do
|
76
|
+
# prepare callback msg
|
77
|
+
@opened_socket.add [
|
78
|
+
"GNTP/1.0 -CALLBACK NONE\r\n",
|
79
|
+
"Notification-Callback-Result: CLICKED\r\n",
|
80
|
+
"Notification-Callback-Context: hoge\r\n",
|
81
|
+
"Notification-Callback-Context-Type: fuga\r\n",
|
82
|
+
"\r\n",
|
83
|
+
].join
|
84
|
+
|
85
|
+
callback_called = false
|
86
|
+
msg = {}
|
87
|
+
|
75
88
|
@gntp = GNTP.new
|
76
89
|
@gntp.register :notifications => [{:name => NOTIFICATION_NAME}]
|
77
|
-
@gntp.notify(:name => NOTIFICATION_NAME) do |
|
78
|
-
|
90
|
+
@gntp.notify(:name => NOTIFICATION_NAME) do |response|
|
91
|
+
sleep 1
|
92
|
+
callback_called = true
|
93
|
+
msg = response
|
79
94
|
end
|
95
|
+
|
96
|
+
[
|
97
|
+
"Notification-Callback-Context: (none)\r\n",
|
98
|
+
"Notification-Callback-Context-Type: (none)\r\n"
|
99
|
+
].each {|expected_text|
|
100
|
+
@sended_messages.last.should include(expected_text)
|
101
|
+
}
|
102
|
+
|
103
|
+
# wait for callback called
|
104
|
+
sleep 3
|
105
|
+
callback_called.should be_true
|
106
|
+
msg[:callback_result].should == 'CLICKED'
|
107
|
+
msg[:callback_context].should == 'hoge'
|
108
|
+
msg[:callback_context_type].should == 'fuga'
|
109
|
+
end
|
110
|
+
|
111
|
+
it "should not send 'Notification-Callback-*' header when block parameter has not given" do
|
112
|
+
@gntp = GNTP.new
|
113
|
+
@gntp.register :notifications => [{:name => NOTIFICATION_NAME}]
|
114
|
+
@gntp.notify :name => NOTIFICATION_NAME
|
115
|
+
|
116
|
+
[
|
117
|
+
"Notification-Callback-Context: (none)\r\n",
|
118
|
+
"Notification-Callback-Context-Type: (none)\r\n"
|
119
|
+
].each {|expected_text|
|
120
|
+
@sended_messages.last.should_not include(expected_text)
|
121
|
+
}
|
122
|
+
end
|
123
|
+
|
124
|
+
it "should send 'Notification-Callback-*' header when block parameter has not given, but supply :callback_* parameter given" do
|
125
|
+
@gntp = GNTP.new
|
126
|
+
@gntp.register :notifications => [{:name => NOTIFICATION_NAME}]
|
127
|
+
@gntp.notify :name => NOTIFICATION_NAME,
|
128
|
+
:callback_context => 'hoge',
|
129
|
+
:callback_context_type => 'text'
|
130
|
+
|
131
|
+
[
|
132
|
+
"Notification-Callback-Context: hoge\r\n",
|
133
|
+
"Notification-Callback-Context-Type: text\r\n"
|
134
|
+
].each {|expected_text|
|
135
|
+
@sended_messages.last.should include(expected_text)
|
136
|
+
}
|
80
137
|
end
|
81
138
|
|
82
139
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby_gntp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- snaka
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2009-11-
|
13
|
+
date: 2009-11-09 00:00:00 +09:00
|
14
14
|
default_executable:
|
15
15
|
dependencies: []
|
16
16
|
|