ruby-net-nntp 0.0.2 → 0.0.3
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.
- data/CHANGELOG +23 -1
- data/lib/net/nntp.rb +19 -5
- data/test/functional/test_nntp.rb +245 -239
- data/test/mock/mock_socket.rb +23 -1
- metadata +4 -4
data/CHANGELOG
CHANGED
@@ -1,4 +1,26 @@
|
|
1
|
-
2007-
|
1
|
+
2007-06-28 14:52 +0200 Anton 'tony' Bangratz <anton.bangratz@gmail.com> (96257e85a815 [tip])
|
2
|
+
|
3
|
+
* lib/net/nntp.rb, tags:
|
4
|
+
branch merge from tests, added documentation, added nntp.close
|
5
|
+
|
6
|
+
2007-06-28 14:34 +0200 Anton 'tony' Bangratz <anton.bangratz@gmail.com> (1ca49077563a)
|
7
|
+
|
8
|
+
* lib/net/nntp.rb, script/console, tags:
|
9
|
+
bugfix for last, next, xover, grouplist
|
10
|
+
- last and next commands don't hang anymore
|
11
|
+
- xover doesn't hang and can be called without parameters, or with
|
12
|
+
groupname only
|
13
|
+
- grouplist actually returns data
|
14
|
+
|
15
|
+
2007-05-21 11:16 +0200 Anton 'tony' Bangratz <tony@twincode.net> (168baa3c37eb)
|
16
|
+
|
17
|
+
* lib/net/nntp.rb, tags, test/functional/test_nntp.rb,
|
18
|
+
test/mock/mock_socket.rb:
|
19
|
+
- added more tests for over/xover
|
20
|
+
- completed help (mock)
|
21
|
+
- added dummy functions for over/xover selections
|
22
|
+
|
23
|
+
2007-05-17 08:09 +0200 Anton 'tony' Bangratz <tony@twincode.net> (702e55388bb4)
|
2
24
|
|
3
25
|
* .hgtags:
|
4
26
|
tags fix
|
data/lib/net/nntp.rb
CHANGED
@@ -9,7 +9,7 @@ require 'net/nntp_article'
|
|
9
9
|
|
10
10
|
module Net
|
11
11
|
class NNTP
|
12
|
-
VERSION = "0.0.
|
12
|
+
VERSION = "0.0.3"
|
13
13
|
include Timeout # :nodoc:
|
14
14
|
|
15
15
|
# Error to indicate that NNTP Command failed gracefully
|
@@ -34,6 +34,11 @@ module Net
|
|
34
34
|
@welcome = @socket.recv 1024
|
35
35
|
end
|
36
36
|
|
37
|
+
# Closes connection. If not reconnected, subsequent calls of commands raise exceptions
|
38
|
+
def close
|
39
|
+
@socket.close unless socket.closed?
|
40
|
+
end
|
41
|
+
|
37
42
|
# Uses authinfo commands to authenticate. Timeout for first command is set to 10 seconds.
|
38
43
|
#
|
39
44
|
# Returns true on success, false on failure.
|
@@ -88,15 +93,23 @@ module Net
|
|
88
93
|
end
|
89
94
|
|
90
95
|
# Issues 'XOVER' command to NNTP Server, and returns raw response. Checks if group has been selected, selects group
|
91
|
-
# otherwise.
|
96
|
+
# otherwise. If no group is selected nor given, raises error.
|
97
|
+
# Parameter 'rest' can be in the form of :from => number, :to => number or :messageid => 'messageid',
|
98
|
+
# if not set, a 'next' command is issued to the server prior to the xover command
|
92
99
|
#
|
93
|
-
def xover(groupname, rest)
|
100
|
+
def xover(groupname=nil, rest=nil)
|
101
|
+
raise CommandFailedError, 'No group selected' unless @group || groupname
|
94
102
|
group(groupname) unless (@group && @group.name == groupname)
|
103
|
+
self.next unless rest
|
95
104
|
prefix = "xover"
|
96
105
|
suffix = numbers_or_id(rest)
|
97
106
|
cmd = [prefix, suffix].join ' '
|
98
107
|
send_cmd(cmd)
|
99
|
-
|
108
|
+
response = nil
|
109
|
+
timeout(10) do
|
110
|
+
response = read_response()
|
111
|
+
end
|
112
|
+
response
|
100
113
|
end
|
101
114
|
|
102
115
|
# Issues 'LISTGROUP' command to NNTP Server, and returns raw response. Checks if group has been selected, selects group
|
@@ -126,6 +139,7 @@ module Net
|
|
126
139
|
@overview_format = Net::NNTP.parse_overview_format list.join
|
127
140
|
else
|
128
141
|
create_grouplist(list)
|
142
|
+
list
|
129
143
|
end
|
130
144
|
|
131
145
|
when '501', '503', '500'
|
@@ -208,7 +222,7 @@ module Net
|
|
208
222
|
def last_or_next(cmd)
|
209
223
|
raise ProtocolError, "No group selected" unless @group
|
210
224
|
send_cmd(cmd)
|
211
|
-
response =
|
225
|
+
response = @socket.recv(1024)
|
212
226
|
code = response[0..2]
|
213
227
|
article = @group.articles.create
|
214
228
|
case code
|
@@ -6,244 +6,250 @@ require 'mock/mock_socket'
|
|
6
6
|
|
7
7
|
|
8
8
|
module TestNet
|
9
|
-
class TestNNTP < Test::Unit::TestCase
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
9
|
+
class TestNNTP < Test::Unit::TestCase
|
10
|
+
|
11
|
+
def setup
|
12
|
+
nntp_connect_and_auth('localhost', 119, 'dummy', 'test')
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_new
|
16
|
+
host = 'localhost'
|
17
|
+
port = '119'
|
18
|
+
assert_nothing_raised do
|
19
|
+
@nntp = Net::NNTP.new(host)
|
20
|
+
end
|
21
|
+
assert_nothing_raised do
|
22
|
+
nntp_new(host, port)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_connect
|
27
|
+
assert_nothing_raised do
|
28
|
+
@nntp.connect
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_help
|
33
|
+
help = @nntp.help.join
|
34
|
+
assert_equal '100', help[0..2]
|
35
|
+
assert_equal 473, help.length
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_authenticate
|
39
|
+
assert_nothing_raised do
|
40
|
+
assert nntp_connect_and_auth('localhost', 119, 'dummy', 'test')
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_group
|
45
|
+
assert_nothing_raised do
|
46
|
+
group = @nntp.group('at.linux')
|
47
|
+
assert_kind_of Net::NNTP::Group, group
|
48
|
+
assert_equal 'at.linux', group.name
|
49
|
+
assert_equal 12, group.article_count
|
50
|
+
assert_equal 1363, group.article_first
|
51
|
+
assert_equal 1375, group.article_last
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_xhdr
|
56
|
+
headers = @nntp.xhdr('at.linux', 'subject', :from => 1363, :to => 1375)
|
57
|
+
assert_equal 15, headers.length
|
58
|
+
assert_equal '221', headers[0][0..2]
|
59
|
+
assert_equal "1364", headers[2].split[0]
|
60
|
+
header = @nntp.xhdr('at.linux', 'subject', :message_id => "<slrnf26akq.ci5.hjp-usenet2@zeno.hjp.at>").join
|
61
|
+
assert_equal 49, header.length
|
62
|
+
assert_equal "1375", header.split[0]
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_xhdr_fails
|
66
|
+
header = @nntp.xhdr('at.linux', '', {}).join
|
67
|
+
assert_equal '502', header[0..2]
|
68
|
+
assert_raise(Net::NNTP::CommandFailedError) do
|
69
|
+
header = @nntp.xhdr('at.xxx', 'subject', {})
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
|
74
|
+
def test_group_fails
|
75
|
+
assert_raise(Net::NNTP::CommandFailedError) do
|
76
|
+
group = @nntp.group('at.xxx')
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def test_xover
|
81
|
+
overviews = @nntp.xover('at.linux', :from => 1363, :to => 1375)
|
82
|
+
assert_equal 15, overviews.length
|
83
|
+
assert_equal '224', overviews[0][0..2]
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_over_or_xover
|
87
|
+
assert @nntp.has_xover?
|
88
|
+
assert @nntp.has_over?
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_xover_fails
|
92
|
+
over = @nntp.xover('at.linux', :from => 1363, :to => 1375)
|
93
|
+
over = @nntp.xover('at.linux', :message_id => "<slrnf26akq.ci5.hjp-usenet2@zeno.hjp.at>").join
|
94
|
+
assert_equal '502', over[0..2]
|
95
|
+
assert_raises(Net::NNTP::CommandFailedError) do
|
96
|
+
over = @nntp.xover('at.xxx', :message_id => "<slrnf26akq.ci5.hjp-usenet2@zeno.hjp.at>")
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_listgroup
|
101
|
+
list = @nntp.listgroup('at.linux')
|
102
|
+
assert_equal 15, list.length
|
103
|
+
match = /(\d{3}).*f\or\s+(\S+)\s/.match(list[0])
|
104
|
+
assert_equal "211", match[1]
|
105
|
+
assert_equal "at.linux", match[2]
|
106
|
+
assert_equal "1365\r\n", list[3]
|
107
|
+
end
|
108
|
+
|
109
|
+
def test_list
|
110
|
+
assert_respond_to @nntp, :list
|
111
|
+
assert_nothing_raised do
|
112
|
+
@nntp.list('overview.fmt')
|
113
|
+
assert_equal 9, @nntp.overview_format.length
|
114
|
+
@nntp.list()
|
115
|
+
assert_not_equal 0, @nntp.grouplist.length
|
116
|
+
assert_not_nil @nntp.grouplist
|
117
|
+
assert_equal 'at.test', @nntp.grouplist['at.test'].name
|
118
|
+
@nntp.list('active')
|
119
|
+
assert_equal 'at.test', @nntp.grouplist['at.test'].name
|
120
|
+
@nntp.list('active.times')
|
121
|
+
@nntp.list('active.times', 'at.*')
|
122
|
+
end
|
123
|
+
assert_raise Net::NNTP::CommandFailedError do
|
124
|
+
@nntp.list('distrib.pat', 'at.*')
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def test_article
|
129
|
+
assert_raises Net::NNTP::CommandFailedError do
|
130
|
+
article = @nntp.article
|
131
|
+
end
|
132
|
+
article = @nntp.article("<5d6be$4625ae23$51df8a12$32566@news.inode.at>")
|
133
|
+
response, id, msgid = article[0].split
|
134
|
+
assert_equal '220', response
|
135
|
+
assert_equal '1392', id
|
136
|
+
assert_equal "<5d6be$4625ae23$51df8a12$32566@news.inode.at>", msgid
|
137
|
+
group = @nntp.group 'at.linux'
|
138
|
+
article = @nntp.article '1392'
|
139
|
+
response, id, msgid = article[0].split
|
140
|
+
assert_equal '220', response
|
141
|
+
assert_equal '1392', id
|
142
|
+
assert_equal "<5d6be$4625ae23$51df8a12$32566@news.inode.at>", msgid
|
143
|
+
end
|
144
|
+
|
145
|
+
def test_head
|
146
|
+
nntp_connect_and_auth('localhost', 119, 'dummy', 'test')
|
147
|
+
assert_nothing_raised do
|
148
|
+
assert_respond_to @nntp, :head
|
149
|
+
end
|
150
|
+
assert_raise Net::NNTP::CommandFailedError do
|
151
|
+
head = @nntp.head
|
152
|
+
end
|
153
|
+
@nntp.group 'at.linux'
|
154
|
+
@io = [
|
155
|
+
"221 1430 <462dfa6f$0$23135$9b4e6d93@newsspool1.arcor-online.net> article retrieved - head follows\r\n",
|
156
|
+
"Path: vietwist00.chello.at!newsfeed02.chello.at!newsfeed01.chello.at!newsfeed.arcor.de!newsspool1.arcor-online.net!news.arcor.de.POSTED!not-for-mail\r\n",
|
157
|
+
"Message-ID: <462dfa6f$0$23135$9b4e6d93@newsspool1.arcor-online.net>\r\n",
|
158
|
+
"From: Gerhard Engler <gerhard.engler@gmx.de>\r\n",
|
159
|
+
"Newsgroups: at.linux\r\n",
|
160
|
+
"Subject: Re: udev_node_mknod: /dev/capi Operation not permitted\r\n",
|
161
|
+
"Date: Tue, 24 Apr 2007 14:39:11 +0200\r\n",
|
162
|
+
"References: <4629ee10$0$10187$9b4e6d93@newsspool4.arcor-online.net> <slrnf2np7k.a8e.tom-usenet@eristoteles.iwoars.net>\r\n",
|
163
|
+
"Lines: 26\r\n",
|
164
|
+
"User-Agent: Thunderbird 1.5.0.10 (Windows/20070221)\r\n",
|
165
|
+
"MIME-Version: 1.0\r\n",
|
166
|
+
"In-Reply-To: <slrnf2np7k.a8e.tom-usenet@eristoteles.iwoars.net>\r\n",
|
167
|
+
"Content-Type: text/plain; charset=ISO-8859-15; format=flowed\r\n",
|
168
|
+
"Content-Transfer-Encoding: 7bit\r\n",
|
169
|
+
"Organization: Arcor\r\n",
|
170
|
+
"NNTP-Posting-Date: 24 Apr 2007 14:39:11 CEST\r\n",
|
171
|
+
"NNTP-Posting-Host: 6cf11d8c.newsspool1.arcor-online.net\r\n",
|
172
|
+
"X-Trace: DXC=Cd=D_AR>:`a^Y=RbYBPl4`ic==]BZ:afn4Fo<]lROoRaFl8W>\BH3Yb7K@fQgPi`FgUTEAfnAR\Ta@JWJ8E:^d<ob]cIfD6hVgh<SdIn0f]3?i\r\n",
|
173
|
+
"X-Complaints-To: usenet-abuse@arcor.de\r\n",
|
174
|
+
"Xref: sensor.twincode.net at.linux:1430\r\n",
|
175
|
+
".\r\n"
|
176
|
+
]
|
177
|
+
head = @nntp.head
|
178
|
+
assert_kind_of Array, head
|
179
|
+
response, id, msgid = head[0].split
|
180
|
+
assert_equal '221', response
|
181
|
+
assert_equal '1430', id
|
182
|
+
assert_equal '<462dfa6f$0$23135$9b4e6d93@newsspool1.arcor-online.net>', msgid
|
183
|
+
end
|
184
|
+
|
185
|
+
def test_body
|
186
|
+
assert_raises Net::NNTP::CommandFailedError do
|
187
|
+
body = @nntp.body
|
188
|
+
end
|
189
|
+
body = @nntp.body("<5d6be$4625ae23$51df8a12$32566@news.inode.at>")
|
190
|
+
response, id, msgid = body[0].split
|
191
|
+
assert_equal '222', response
|
192
|
+
assert_equal '1392', id
|
193
|
+
assert_equal "<5d6be$4625ae23$51df8a12$32566@news.inode.at>", msgid
|
194
|
+
group = @nntp.group 'at.linux'
|
195
|
+
body = @nntp.body '1392'
|
196
|
+
response, id, msgid = body[0].split
|
197
|
+
assert_equal '222', response
|
198
|
+
assert_equal '1392', id
|
199
|
+
assert_equal "<5d6be$4625ae23$51df8a12$32566@news.inode.at>", msgid
|
200
|
+
end
|
201
|
+
|
202
|
+
def test_stat
|
203
|
+
assert_nothing_raised do
|
204
|
+
assert_respond_to @nntp, :stat
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
def test_last
|
209
|
+
assert_raise Net::NNTP::ProtocolError do
|
210
|
+
last = @nntp.last
|
211
|
+
end
|
212
|
+
@nntp.group 'at.linux'
|
213
|
+
assert_raise Net::NNTP::CommandFailedError do
|
214
|
+
last = @nntp.last
|
215
|
+
end
|
216
|
+
@nntp.next
|
217
|
+
@nntp.next
|
218
|
+
last = @nntp.last
|
219
|
+
assert_kind_of String, last
|
220
|
+
response, article, msgid, rest = last.split
|
221
|
+
assert_equal "223", response
|
222
|
+
assert_equal "1363", article
|
223
|
+
end
|
224
|
+
|
225
|
+
def test_next
|
226
|
+
assert_raise Net::NNTP::ProtocolError do
|
227
|
+
anext = @nntp.next
|
228
|
+
end
|
229
|
+
@nntp.group 'at.linux'
|
230
|
+
anext = @nntp.next
|
231
|
+
assert_kind_of String, anext
|
232
|
+
response, article, msgid, rest = anext.split
|
233
|
+
assert_equal "223", response
|
234
|
+
assert_equal "1363", article
|
235
|
+
assert_equal "<example.msgid@fake.host>", msgid
|
236
|
+
anext = @nntp.next
|
237
|
+
response, article, msgid, rest = anext.split
|
238
|
+
assert_equal "1364", article
|
239
|
+
end
|
240
|
+
|
241
|
+
private
|
242
|
+
def nntp_new(host, port=119)
|
243
|
+
@nntp = Net::NNTP.new(host, port)
|
244
|
+
end
|
245
|
+
def nntp_connect_and_auth(host, port, user, pass)
|
246
|
+
@nntp = Net::NNTP.new(host, port)
|
247
|
+
@nntp.instance_variable_set :@socket_class, MockSocket
|
248
|
+
@nntp.connect
|
249
|
+
@nntp.socket.activate
|
250
|
+
@nntp.authenticate(user, pass)
|
251
|
+
end
|
252
|
+
end
|
247
253
|
end
|
248
254
|
|
249
|
-
|
255
|
+
|
data/test/mock/mock_socket.rb
CHANGED
@@ -114,7 +114,29 @@ class MockSocket < Test::Unit::MockObject( TCPSocket )
|
|
114
114
|
@io = ["501 Bad Command Usage"]
|
115
115
|
end
|
116
116
|
when "help\r\n" then
|
117
|
-
@io = [
|
117
|
+
@io = [
|
118
|
+
"100 Legal commands on THIS server:\r\n",
|
119
|
+
"ARTICLE [<Message-ID>|<Number>]\r\n",
|
120
|
+
"BODY [<Message-ID>|<Number>]\r\n",
|
121
|
+
"DATE\r\n",
|
122
|
+
"GROUP <Newsgroup>\r\n",
|
123
|
+
"HDR <Header> <Message-ID>|<Range>\r\n",
|
124
|
+
"HEAD [<Message-ID>|<Number>]\r\n",
|
125
|
+
"HELP\r\n",
|
126
|
+
"LAST\r\n",
|
127
|
+
"LIST [ACTIVE|NEWSGROUPS] [<Wildmat>]]\r\n",
|
128
|
+
"LIST [ACTIVE.TIMES|EXTENSIONS|OVERVIEW.FMT]\r\n",
|
129
|
+
"LISTGROUP <Newsgroup>\r\n",
|
130
|
+
"MODE READER\r\n",
|
131
|
+
"NEWGROUPS <yymmdd> <hhmmss> [GMT]\r\n",
|
132
|
+
"NEXT\r\n",
|
133
|
+
"POST\r\n",
|
134
|
+
"OVER <Range>\r\n",
|
135
|
+
"SLAVE\r\n",
|
136
|
+
"STAT [<Message-ID>|<Number>]\r\n",
|
137
|
+
"XHDR <Header> <Message-ID>|<Range>\r\n",
|
138
|
+
"XOVER <Range>\r\n",
|
139
|
+
".\r\n"]
|
118
140
|
when /^next/i
|
119
141
|
if @group_selected
|
120
142
|
if @last_article
|
metadata
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.
|
2
|
+
rubygems_version: 0.9.4
|
3
3
|
specification_version: 1
|
4
4
|
name: ruby-net-nntp
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.0.
|
7
|
-
date: 2007-
|
6
|
+
version: 0.0.3
|
7
|
+
date: 2007-06-28 00:00:00 +02:00
|
8
8
|
summary: Net::XXX style NNTP Library for easy access.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -30,9 +30,9 @@ authors:
|
|
30
30
|
- Anton Bangratz
|
31
31
|
files:
|
32
32
|
- lib/net
|
33
|
-
- lib/net/nntp.rb
|
34
33
|
- lib/net/nntp_article.rb
|
35
34
|
- lib/net/nntp_group.rb
|
35
|
+
- lib/net/nntp.rb
|
36
36
|
- test/functional
|
37
37
|
- test/functional/test_nntp.rb
|
38
38
|
- test/mock
|