bencode 0.1.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/bencode.rb CHANGED
@@ -1,7 +1,6 @@
1
- # Thanks to Daniel Martin and all the other lads at ruby-lang for
2
- # helping me out.
3
-
4
- # bencode is a Ruby implementation of the Bencode data serialization
1
+ # = bencode.rb - Bencode Library
2
+ #
3
+ # Bencode is a Ruby implementation of the Bencode data serialization
5
4
  # format used in the BitTorrent protocol.
6
5
  #
7
6
  # == Synopsis
@@ -10,6 +9,45 @@
10
9
  # 42.bencode #=> "i42e"
11
10
  # [1, 2, 3].bencode #=> "li1ei2ei3ee"
12
11
  #
12
+ # Bencoding (pronounced _bee-encode_) is a simple protocol, consiting of
13
+ # only 4 value types.
14
+ #
15
+ # === Integers ===
16
+ #
17
+ # An integer is encoded an _i_ followed by the numeral itself, followed
18
+ # by an _e_. Leading zeros are not allowed. Negative values are prefixed
19
+ # with a minus sign.
20
+ #
21
+ # 42.bencode #=> "i42e"
22
+ # -2.bencode #=> "i-2e"
23
+ # 0.bencode #=> "i0e"
24
+ #
25
+ # === Strings ===
26
+ #
27
+ # Strings are a sequence of zero or more bytes. It is encoded as
28
+ # _<length>:<contents>_, where _length_ is the lenth of _contents_. _length_
29
+ # must be non-negative.
30
+ #
31
+ # "".bencode #=> "0:"
32
+ # "foo".bencode #=> "3:foo"
33
+ #
34
+ # === Lists ===
35
+ #
36
+ # Lists are encoded as _l_ followed by the elements, followed by _e_.
37
+ # There is no element seperator.
38
+ #
39
+ # [1, 2, 3].bencode #=> "li1ei2ei3ee"
40
+ #
41
+ # === Dictionaries ===
42
+ #
43
+ # Dictionaries are encoded as _d<contents>e_, where _contents_ is a sequence
44
+ # of keys and values. Each value is immediately preceded by a key. Keys must
45
+ # be strings, and will appear in lexicographical order.
46
+ #
47
+ # {"foo" => 3, "bar" => 1, "baz" => 2}.bencode
48
+ # #=> "d3:bari1e3:bazi2e3:fooi3ee"
49
+ #
50
+ #
13
51
  # == Authors
14
52
  #
15
53
  # * Daniel Schierbeck
@@ -29,6 +67,7 @@
29
67
  # Bencode is distributed in the hope that it will be useful, but WITHOUT ANY
30
68
  # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
31
69
  # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
70
+ #
32
71
 
33
72
  class Object
34
73
  # Raises an exception. Subclasses of Object must themselves
@@ -133,28 +172,16 @@ class BencodeError < StandardError
133
172
  end
134
173
  end
135
174
 
136
- class BdecodeError < StandardError
137
- attr_reader :pos
138
-
139
- def initialize(pos = nil) # :nodoc:
140
- @pos = pos
141
- end
142
-
143
- def to_s # :nodoc:
144
- if pos.nil?
145
- "syntax error"
146
- else
147
- "syntax error near position #{pos}"
148
- end
149
- end
150
- end
175
+ class BdecodeError < StandardError; end
151
176
 
152
177
  module Bencode
153
178
  class << self
179
+ # Bencodes +obj+
154
180
  def dump(obj)
155
181
  obj.bencode
156
182
  end
157
183
 
184
+ # Bdecodes +str+
158
185
  def load(str)
159
186
  require 'strscan'
160
187
 
@@ -164,6 +191,7 @@ module Bencode
164
191
  return obj
165
192
  end
166
193
 
194
+ # Bdecodes the file located at +path+
167
195
  def load_file(path)
168
196
  load(File.open(path).read)
169
197
  end
@@ -171,12 +199,10 @@ module Bencode
171
199
  def parse(scanner) # :nodoc:
172
200
  case token = scanner.scan(/[ild]|\d+:|\s/)
173
201
  when nil
174
- raise BdecodeError, scanner.pos
202
+ raise BdecodeError
175
203
  when "i"
176
204
  number = scanner.scan(/0|(?:-?[1-9][0-9]*)/)
177
- unless number and scanner.scan(/e/)
178
- raise BdecodeError, scanner.pos
179
- end
205
+ raise BdecodeError unless number and scanner.scan(/e/)
180
206
  return number.to_i
181
207
  when "l"
182
208
  ary = []
@@ -189,10 +215,7 @@ module Bencode
189
215
  hsh = {}
190
216
  until scanner.peek(1) == "e"
191
217
  key, value = parse(scanner), parse(scanner)
192
- unless key.is_a? String
193
- raise BdecodeError, "error at #{scanner.pos}: " +
194
- "key must be a string"
195
- end
218
+ raise BdecodeError, "key must be a string" unless key.is_a? String
196
219
  hsh.store(key, value)
197
220
  end
198
221
  scanner.pos += 1
@@ -205,7 +228,7 @@ module Bencode
205
228
  when /\s/
206
229
  nil
207
230
  else
208
- raise BdecodeError, scanner.pos
231
+ raise BdecodeError
209
232
  end
210
233
  end
211
234
 
data/test/tc_bdecode.rb CHANGED
@@ -1,5 +1,6 @@
1
1
 
2
2
  require 'test/unit'
3
+ require 'rubygems'
3
4
  require 'bencode'
4
5
 
5
6
  class BdecodeTest < Test::Unit::TestCase
data/test/tc_bencode.rb CHANGED
@@ -1,5 +1,6 @@
1
1
 
2
- require 'unit/test'
2
+ require 'test/unit'
3
+ require 'rubygems'
3
4
  require 'bencode'
4
5
 
5
6
  class BencodeTest < Test::Unit::TestCase
metadata CHANGED
@@ -1,11 +1,11 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.8.11
2
+ rubygems_version: 0.9.0
3
3
  specification_version: 1
4
4
  name: bencode
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.1.0
7
- date: 2006-09-17 00:00:00 +02:00
8
- summary: Serialize and unserialize data to and from the Bencode format
6
+ version: 0.3.0
7
+ date: 2006-09-29 00:00:00 +02:00
8
+ summary: A Ruby implementation of the Bencode encoding used by BitTorrent
9
9
  require_paths:
10
10
  - lib
11
11
  email:
@@ -25,15 +25,16 @@ required_ruby_version: !ruby/object:Gem::Version::Requirement
25
25
  platform: ruby
26
26
  signing_key:
27
27
  cert_chain:
28
+ post_install_message:
28
29
  authors:
29
30
  - Daniel Schierbeck
30
31
  files:
31
32
  - lib/bencode.rb
32
- - test/tc_bdecode.rb
33
33
  - test/tc_bencode.rb
34
- test_files:
35
34
  - test/tc_bdecode.rb
35
+ test_files:
36
36
  - test/tc_bencode.rb
37
+ - test/tc_bdecode.rb
37
38
  rdoc_options: []
38
39
 
39
40
  extra_rdoc_files: []