bencode 0.3.1 → 0.3.2
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/bencode.rb +22 -15
- data/test/tc_bdecode.rb +1 -2
- data/test/tc_bencode.rb +11 -2
- metadata +2 -2
data/lib/bencode.rb
CHANGED
@@ -5,12 +5,12 @@
|
|
5
5
|
#
|
6
6
|
# == Synopsis
|
7
7
|
#
|
8
|
-
# Bencoding (pronounced
|
8
|
+
# Bencoding (pronounced <i>bee-encode</i>) is a simple protocol, consisting of
|
9
9
|
# only 4 value types.
|
10
10
|
#
|
11
11
|
# === Integers
|
12
12
|
#
|
13
|
-
# An integer is encoded an _i_ followed by the numeral itself, followed
|
13
|
+
# An integer is encoded as an _i_ followed by the numeral itself, followed
|
14
14
|
# by an _e_. Leading zeros are not allowed. Negative values are prefixed
|
15
15
|
# with a minus sign.
|
16
16
|
#
|
@@ -20,8 +20,8 @@
|
|
20
20
|
#
|
21
21
|
# === Strings
|
22
22
|
#
|
23
|
-
# Strings are
|
24
|
-
#
|
23
|
+
# Strings are sequences of zero or more bytes. They are encoded as
|
24
|
+
# <i><length>:<contents></i>, where _length_ is the length of _contents_. _length_
|
25
25
|
# must be non-negative.
|
26
26
|
#
|
27
27
|
# "".bencode #=> "0:"
|
@@ -36,9 +36,9 @@
|
|
36
36
|
#
|
37
37
|
# === Dictionaries
|
38
38
|
#
|
39
|
-
# Dictionaries are encoded as
|
40
|
-
#
|
41
|
-
#
|
39
|
+
# Dictionaries are encoded as _d_ followed by a sequence of key-value pairs, followed by _e_.
|
40
|
+
# Each value must be immediately preceded by a key. Keys must be strings, and must appear in
|
41
|
+
# lexicographical order.
|
42
42
|
#
|
43
43
|
# {"foo" => 3, "bar" => 1, "baz" => 2}.bencode
|
44
44
|
# #=> "d3:bari1e3:bazi2e3:fooi3ee"
|
@@ -67,6 +67,7 @@
|
|
67
67
|
#
|
68
68
|
|
69
69
|
class Object
|
70
|
+
#
|
70
71
|
# Raises an exception. Subclasses of Object must themselves
|
71
72
|
# define meaningful #bencode methods.
|
72
73
|
def bencode
|
@@ -75,6 +76,7 @@ class Object
|
|
75
76
|
end
|
76
77
|
|
77
78
|
class Integer
|
79
|
+
#
|
78
80
|
# Bencodes the Integer object. Bencoded integers are represented
|
79
81
|
# as +ixe+, where +x+ is the integer with an optional
|
80
82
|
# hyphen prepended, indicating negativity.
|
@@ -87,8 +89,9 @@ class Integer
|
|
87
89
|
end
|
88
90
|
|
89
91
|
class String
|
92
|
+
#
|
90
93
|
# Bencodes the String object. Bencoded strings are represented
|
91
|
-
# as +x
|
94
|
+
# as +x+:+y+, where +y+ is the string and +x+ is the length of the
|
92
95
|
# string.
|
93
96
|
#
|
94
97
|
# "foo".bencode #=> "3:foo"
|
@@ -98,6 +101,7 @@ class String
|
|
98
101
|
"#{length}:#{self}"
|
99
102
|
end
|
100
103
|
|
104
|
+
#
|
101
105
|
# Bdecodes the String object and returns the data serialized
|
102
106
|
# through bencoding.
|
103
107
|
#
|
@@ -107,6 +111,7 @@ class String
|
|
107
111
|
Bencode.load(self)
|
108
112
|
end
|
109
113
|
|
114
|
+
#
|
110
115
|
# Tests whether the String object is a valid bencoded string.
|
111
116
|
def bencoded?
|
112
117
|
bdecode
|
@@ -118,8 +123,9 @@ class String
|
|
118
123
|
end
|
119
124
|
|
120
125
|
class Array
|
126
|
+
#
|
121
127
|
# Bencodes the Array object. Bencoded arrays are represented as
|
122
|
-
# +lxe+, where x is zero or more bencoded objects.
|
128
|
+
# +lxe+, where +x+ is zero or more bencoded objects.
|
123
129
|
#
|
124
130
|
# [1, "foo"].bencode #=> "li1e3:fooe"
|
125
131
|
#
|
@@ -129,8 +135,9 @@ class Array
|
|
129
135
|
end
|
130
136
|
|
131
137
|
class Hash
|
138
|
+
#
|
132
139
|
# Bencodes the Hash object. Bencoded hashes are represented as
|
133
|
-
# +dxe+, where x is zero or a power of two bencoded objects.
|
140
|
+
# +dxe+, where +x+ is zero or a power of two bencoded objects.
|
134
141
|
# each key is immediately followed by its associated value.
|
135
142
|
# All keys must be strings. The keys of the bencoded hash will
|
136
143
|
# be in lexicographical order.
|
@@ -141,12 +148,12 @@ class Hash
|
|
141
148
|
end
|
142
149
|
|
143
150
|
class IO
|
144
|
-
def self.bdecode(
|
145
|
-
|
151
|
+
def self.bdecode(filename)
|
152
|
+
open(filename, 'r').bdecode
|
146
153
|
end
|
147
154
|
|
148
|
-
def self.bencode(
|
149
|
-
|
155
|
+
def self.bencode(filename)
|
156
|
+
open(filename, 'r').bencode
|
150
157
|
end
|
151
158
|
|
152
159
|
def bdecode
|
@@ -154,7 +161,7 @@ class IO
|
|
154
161
|
end
|
155
162
|
|
156
163
|
def bencode
|
157
|
-
read.chomp.
|
164
|
+
read.chomp.bencode
|
158
165
|
end
|
159
166
|
end
|
160
167
|
|
data/test/tc_bdecode.rb
CHANGED
data/test/tc_bencode.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
|
2
2
|
require 'test/unit'
|
3
|
-
require
|
4
|
-
require 'bencode'
|
3
|
+
require "#{File.dirname(__FILE__)}/../lib/bencode"
|
5
4
|
|
6
5
|
class BencodeTest < Test::Unit::TestCase
|
7
6
|
def test_string
|
@@ -9,6 +8,11 @@ class BencodeTest < Test::Unit::TestCase
|
|
9
8
|
assert_equal "0:", "".bencode
|
10
9
|
end
|
11
10
|
|
11
|
+
def test_multiline_string
|
12
|
+
assert_equal "1:\n", "\n".bencode
|
13
|
+
assert_equal "2:\n\n", "\n\n".bencode
|
14
|
+
end
|
15
|
+
|
12
16
|
def test_integer
|
13
17
|
assert_equal "i42e", 42.bencode
|
14
18
|
assert_equal "i-3e", -3.bencode
|
@@ -28,4 +32,9 @@ class BencodeTest < Test::Unit::TestCase
|
|
28
32
|
assert_equal "d1:a3:foo1:g3:bar1:z3:baze",
|
29
33
|
{"a" => "foo", "g" => "bar", "z" => "baz"}.bencode
|
30
34
|
end
|
35
|
+
|
36
|
+
def test_hash_julien
|
37
|
+
assert_equal "d1:ai1e2:bbi1e1:ci1ee",
|
38
|
+
{'a' => 1, 'c' => 1, 'bb' => 1}.bencode
|
39
|
+
end
|
31
40
|
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0
|
|
3
3
|
specification_version: 1
|
4
4
|
name: bencode
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.3.
|
7
|
-
date: 2006-
|
6
|
+
version: 0.3.2
|
7
|
+
date: 2006-12-26 00:00:00 +01:00
|
8
8
|
summary: A Ruby implementation of the Bencode encoding used by BitTorrent
|
9
9
|
require_paths:
|
10
10
|
- lib
|