ipaddress 0.7.0 → 0.7.5
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.rdoc +8 -1
- data/LICENSE +1 -1
- data/README.rdoc +17 -16
- data/VERSION +1 -1
- data/lib/ipaddress.rb +25 -1
- data/lib/ipaddress/ipv4.rb +50 -16
- data/lib/ipaddress/prefix.rb +3 -3
- data/test/ipaddress/ipv4_test.rb +34 -0
- data/test/ipaddress/ipv6_test.rb +21 -17
- data/test/ipaddress/prefix_test.rb +5 -1
- metadata +10 -11
- data/.gitignore +0 -7
data/CHANGELOG.rdoc
CHANGED
@@ -1,4 +1,11 @@
|
|
1
|
-
==
|
1
|
+
== ipaddress 0.7.5
|
2
|
+
|
3
|
+
CHANGED:: IPAddress::IPv4#each_host to improve speed
|
4
|
+
FIXED:: IPAddress::IPv4::summarize bug (summarization should now work properly)
|
5
|
+
NEW:: IPAddress::IPv4#include_all?
|
6
|
+
NEW:: #ipv4? and #ipv6?
|
7
|
+
|
8
|
+
== ipaddress 0.7.0
|
2
9
|
|
3
10
|
NEW:: IPAddress::IPv6#include?
|
4
11
|
NEW:: IPAddress::IPv6#network_u128
|
data/LICENSE
CHANGED
data/README.rdoc
CHANGED
@@ -81,7 +81,7 @@ documentation with Rake:
|
|
81
81
|
ipaddress$ rake rdoc
|
82
82
|
|
83
83
|
The latest documentation can be found online at
|
84
|
-
{this address}[http://rubydoc.info/
|
84
|
+
{this address}[http://rubydoc.info/gems/ipaddress/0.7.0/frames]
|
85
85
|
|
86
86
|
== IPv4
|
87
87
|
|
@@ -108,7 +108,7 @@ or, in a easier way, using the IPAddress parse method
|
|
108
108
|
which accepts and parses any kind of IP (IPv4, IPV6 and
|
109
109
|
IPv4 IPv6 Mapped addresses).
|
110
110
|
|
111
|
-
If you like
|
111
|
+
If you like syntactic sugar, you can use the wrapper method
|
112
112
|
IPAddress(), which is built around IPAddress::parse:
|
113
113
|
|
114
114
|
ip = IPAddress "172.16.10.1/24"
|
@@ -246,7 +246,7 @@ address has all one's. For example, ip "172.16.10.1/24" has broadcast
|
|
246
246
|
"172.16.10.255/24", where ip "172.16.10.1/16" has broadcast
|
247
247
|
"172.16.255.255/16".
|
248
248
|
|
249
|
-
Method IPv4#broadcast has the same
|
249
|
+
Method IPv4#broadcast has the same behavior as is #network
|
250
250
|
counterpart: it creates a new IPv4 object to handle the broadcast
|
251
251
|
address:
|
252
252
|
|
@@ -277,7 +277,7 @@ It is important to note that it doesn't matter if the original IP is a
|
|
277
277
|
host IP or a network number (or a broadcast address): the #each method
|
278
278
|
only considers the range that the original IP specifies.
|
279
279
|
|
280
|
-
If you only want to iterate over hosts IP, use the
|
280
|
+
If you only want to iterate over hosts IP, use the IPv4#each_host
|
281
281
|
method:
|
282
282
|
|
283
283
|
ip = IPAddress "172.16.10.1/24"
|
@@ -327,7 +327,7 @@ the IPv4#to_u32 method
|
|
327
327
|
|
328
328
|
This method is the equivalent of the Unix call pton(), expressing an
|
329
329
|
IP address in the so called +network byte order+ notation. However, if
|
330
|
-
you want to
|
330
|
+
you want to transmit your IP over a network socket, you might need to
|
331
331
|
transform it in data format using the IPv4#data method:
|
332
332
|
|
333
333
|
ip.data
|
@@ -382,7 +382,7 @@ You can easily check which CLASSFUL network an IPv4 object belongs:
|
|
382
382
|
#=> true
|
383
383
|
|
384
384
|
Remember that these methods are only checking the address portion of an IP, and are
|
385
|
-
|
385
|
+
independent from its prefix, as classful networks have no concept of prefix.
|
386
386
|
|
387
387
|
For more information on CLASSFUL networks visit the
|
388
388
|
{Wikipedia page}[http://en.wikipedia.org/wiki/Classful_network]
|
@@ -430,7 +430,7 @@ example:
|
|
430
430
|
|
431
431
|
Usually, subnetting implies dividing a network to a number of subnets
|
432
432
|
which is a power of two: in this way, you can be sure that the network
|
433
|
-
will be
|
433
|
+
will be divided evenly, and all the subnets will have the same number
|
434
434
|
of hosts.
|
435
435
|
|
436
436
|
==== Uneven subnetting
|
@@ -460,7 +460,7 @@ We can go even further and divide into 11 subnets:
|
|
460
460
|
"172.16.10.160/27", "172.16.10.192/26"]
|
461
461
|
|
462
462
|
As you can see, most of the networks are /28, with a few /27 and one
|
463
|
-
/26 to fill up the
|
463
|
+
/26 to fill up the remaining space.
|
464
464
|
|
465
465
|
==== Summarization
|
466
466
|
|
@@ -569,7 +569,7 @@ our projects.
|
|
569
569
|
IPv6 addresses are 128 bits long, in contrast with IPv4 addresses
|
570
570
|
which are only 32 bits long. An IPv6 address is generally written as
|
571
571
|
eight groups of four hexadecimal digits, each group representing 16
|
572
|
-
bits or two
|
572
|
+
bits or two octet. For example, the following is a valid IPv6
|
573
573
|
address:
|
574
574
|
|
575
575
|
1080:0000:0000:0000:0008:0800:200c:417a
|
@@ -581,7 +581,7 @@ they will be converted.
|
|
581
581
|
==== Compression
|
582
582
|
|
583
583
|
Since IPv6 addresses are very long to write, there are some
|
584
|
-
|
584
|
+
simplifications and compressions that you can use to shorten them.
|
585
585
|
|
586
586
|
* Leading zeroes: all the leading zeroes within a group can be
|
587
587
|
omitted: "0008" would become "8"
|
@@ -765,7 +765,7 @@ Finally, a new IPv6 address can be created from an hex string:
|
|
765
765
|
=== Special IPv6 addresses
|
766
766
|
|
767
767
|
Some IPv6 have a special meaning and are expressed in a special form,
|
768
|
-
quite different than an usual IPv6 address. IPAddress has
|
768
|
+
quite different than an usual IPv6 address. IPAddress has built-in
|
769
769
|
support for unspecified, loopback and mapped IPv6 addresses.
|
770
770
|
|
771
771
|
==== Unspecified address
|
@@ -921,14 +921,15 @@ Feel free to join us and tell us what you think!
|
|
921
921
|
|
922
922
|
== Thanks to
|
923
923
|
|
924
|
-
Thanks to Luca Russo (vargolo) and Simone Carletti
|
925
|
-
the support and technical review. Thanks to Marco Beri,
|
926
|
-
Nicolas Fevrier, jdpace, Daniele Alessandri
|
927
|
-
|
924
|
+
Thanks to Luca Russo (vargolo) and Simone Carletti
|
925
|
+
(weppos) for all the support and technical review. Thanks to Marco Beri,
|
926
|
+
Bryan T. Richardson, Nicolas Fevrier, jdpace, Daniele Alessandri, jrdioko,
|
927
|
+
Ghislain Charrier, Pawel Krzesniak, Mark Sullivan, Erik Ahlström and
|
928
|
+
Steve Rawlinson for their support, feedback and bug reports.
|
928
929
|
|
929
930
|
== Copyright
|
930
931
|
|
931
|
-
Copyright (c) 2009-
|
932
|
+
Copyright (c) 2009-2011 Marco Ceresa. See LICENSE for details.
|
932
933
|
|
933
934
|
|
934
935
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.7.
|
1
|
+
0.7.5
|
data/lib/ipaddress.rb
CHANGED
@@ -22,7 +22,7 @@ module IPAddress
|
|
22
22
|
NAME = "IPAddress"
|
23
23
|
GEM = "ipaddress"
|
24
24
|
AUTHORS = ["Marco Ceresa <ceresa@ieee.org>"]
|
25
|
-
|
25
|
+
|
26
26
|
#
|
27
27
|
# Parse the argument string to create a new
|
28
28
|
# IPv4, IPv6 or Mapped IP object
|
@@ -50,6 +50,30 @@ module IPAddress
|
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
53
|
+
#
|
54
|
+
# True if the object is an IPv4 address
|
55
|
+
#
|
56
|
+
# ip = IPAddress("192.168.10.100/24")
|
57
|
+
#
|
58
|
+
# ip.ipv4?
|
59
|
+
# #-> true
|
60
|
+
#
|
61
|
+
def ipv4?
|
62
|
+
self.kind_of? IPAddress::IPv4
|
63
|
+
end
|
64
|
+
|
65
|
+
#
|
66
|
+
# True if the object is an IPv6 address
|
67
|
+
#
|
68
|
+
# ip = IPAddress("192.168.10.100/24")
|
69
|
+
#
|
70
|
+
# ip.ipv6?
|
71
|
+
# #-> false
|
72
|
+
#
|
73
|
+
def ipv6?
|
74
|
+
self.kind_of? IPAddress::IPv6
|
75
|
+
end
|
76
|
+
|
53
77
|
#
|
54
78
|
# Checks if the given string is a valid IP address,
|
55
79
|
# either IPv4 or IPv6
|
data/lib/ipaddress/ipv4.rb
CHANGED
@@ -382,7 +382,7 @@ module IPAddress;
|
|
382
382
|
#
|
383
383
|
# ip = IPAddress("10.0.0.1/29")
|
384
384
|
#
|
385
|
-
# ip.
|
385
|
+
# ip.each_host do |i|
|
386
386
|
# p i.to_s
|
387
387
|
# end
|
388
388
|
# #=> "10.0.0.1"
|
@@ -393,8 +393,8 @@ module IPAddress;
|
|
393
393
|
# #=> "10.0.0.6"
|
394
394
|
#
|
395
395
|
def each_host
|
396
|
-
|
397
|
-
yield i
|
396
|
+
(network_u32+1..broadcast_u32-1).each do |i|
|
397
|
+
yield self.class.parse_u32(i, @prefix)
|
398
398
|
end
|
399
399
|
end
|
400
400
|
|
@@ -520,8 +520,7 @@ module IPAddress;
|
|
520
520
|
#
|
521
521
|
# Checks whether a subnet includes the given IP address.
|
522
522
|
#
|
523
|
-
# Accepts
|
524
|
-
# object.
|
523
|
+
# Accepts an IPAddress::IPv4 object.
|
525
524
|
#
|
526
525
|
# ip = IPAddress("192.168.10.100/24")
|
527
526
|
#
|
@@ -537,6 +536,46 @@ module IPAddress;
|
|
537
536
|
@prefix <= oth.prefix and network_u32 == (oth.to_u32 & @prefix.to_u32)
|
538
537
|
end
|
539
538
|
|
539
|
+
#
|
540
|
+
# Checks whether a subnet includes all the
|
541
|
+
# given IPv4 objects.
|
542
|
+
#
|
543
|
+
# ip = IPAddress("192.168.10.100/24")
|
544
|
+
#
|
545
|
+
# addr1 = IPAddress("192.168.10.102/24")
|
546
|
+
# addr2 = IPAddress("192.168.10.103/24")
|
547
|
+
#
|
548
|
+
# ip.include_all?(addr1,addr2)
|
549
|
+
# #=> true
|
550
|
+
#
|
551
|
+
def include_all?(*others)
|
552
|
+
others.all? {|oth| include?(oth)}
|
553
|
+
end
|
554
|
+
|
555
|
+
#
|
556
|
+
# True if the object is an IPv4 address
|
557
|
+
#
|
558
|
+
# ip = IPAddress("192.168.10.100/24")
|
559
|
+
#
|
560
|
+
# ip.ipv4?
|
561
|
+
# #-> true
|
562
|
+
#
|
563
|
+
# def ipv4?
|
564
|
+
# true
|
565
|
+
# end
|
566
|
+
|
567
|
+
#
|
568
|
+
# True if the object is an IPv6 address
|
569
|
+
#
|
570
|
+
# ip = IPAddress("192.168.10.100/24")
|
571
|
+
#
|
572
|
+
# ip.ipv6?
|
573
|
+
# #-> false
|
574
|
+
#
|
575
|
+
# def ipv6?
|
576
|
+
# false
|
577
|
+
# end
|
578
|
+
|
540
579
|
#
|
541
580
|
# Checks if an IPv4 address objects belongs
|
542
581
|
# to a private network RFC1918
|
@@ -943,20 +982,15 @@ module IPAddress;
|
|
943
982
|
end
|
944
983
|
|
945
984
|
def aggregate(ip1,ip2)
|
946
|
-
if ip1.include? ip2
|
947
|
-
|
985
|
+
return [ip1] if ip1.include? ip2
|
986
|
+
|
987
|
+
snet = ip1.supernet(ip1.prefix-1)
|
988
|
+
if snet.include_all?(ip1, ip2) && ((ip1.size + ip2.size) == snet.size)
|
989
|
+
return [snet]
|
948
990
|
else
|
949
|
-
|
950
|
-
arr1 = ip1.subnet(2**(ip2.prefix-ip1.prefix)).map{|i| i.to_string}
|
951
|
-
arr2 = snet.subnet(2**(ip2.prefix-snet.prefix)).map{|i| i.to_string}
|
952
|
-
if (arr2 - [ip2.to_string] - arr1).empty?
|
953
|
-
return [snet]
|
954
|
-
else
|
955
|
-
return [ip1, ip2]
|
956
|
-
end
|
991
|
+
return [ip1, ip2]
|
957
992
|
end
|
958
993
|
end
|
959
|
-
|
960
994
|
end # class IPv4
|
961
995
|
end # module IPAddress
|
962
996
|
|
data/lib/ipaddress/prefix.rb
CHANGED
@@ -92,8 +92,8 @@ module IPAddress
|
|
92
92
|
# #=> 24
|
93
93
|
#
|
94
94
|
def initialize(num)
|
95
|
-
unless (
|
96
|
-
raise ArgumentError, "Prefix must be in range
|
95
|
+
unless (0..32).include? num
|
96
|
+
raise ArgumentError, "Prefix must be in range 0..32, got: #{num}"
|
97
97
|
end
|
98
98
|
super(num)
|
99
99
|
end
|
@@ -121,7 +121,7 @@ module IPAddress
|
|
121
121
|
# #=> "11111111111111111111111100000000"
|
122
122
|
#
|
123
123
|
def bits
|
124
|
-
to_u32
|
124
|
+
"%.32b" % to_u32
|
125
125
|
end
|
126
126
|
|
127
127
|
#
|
data/test/ipaddress/ipv4_test.rb
CHANGED
@@ -6,6 +6,7 @@ class IPv4Test < Test::Unit::TestCase
|
|
6
6
|
@klass = IPAddress::IPv4
|
7
7
|
|
8
8
|
@valid_ipv4 = {
|
9
|
+
"0.0.0.0/0" => ["0.0.0.0", 0],
|
9
10
|
"10.0.0.0" => ["10.0.0.0", 32],
|
10
11
|
"10.0.0.1" => ["10.0.0.1", 32],
|
11
12
|
"10.0.0.1/24" => ["10.0.0.1", 24],
|
@@ -21,12 +22,14 @@ class IPv4Test < Test::Unit::TestCase
|
|
21
22
|
"10.1-254.0.0"]
|
22
23
|
|
23
24
|
@netmask_values = {
|
25
|
+
"0.0.0.0/0" => "0.0.0.0",
|
24
26
|
"10.0.0.0/8" => "255.0.0.0",
|
25
27
|
"172.16.0.0/16" => "255.255.0.0",
|
26
28
|
"192.168.0.0/24" => "255.255.255.0",
|
27
29
|
"192.168.100.4/30" => "255.255.255.252"}
|
28
30
|
|
29
31
|
@decimal_values ={
|
32
|
+
"0.0.0.0/0" => 0,
|
30
33
|
"10.0.0.0/8" => 167772160,
|
31
34
|
"172.16.0.0/16" => 2886729728,
|
32
35
|
"192.168.0.0/24" => 3232235520,
|
@@ -237,6 +240,22 @@ class IPv4Test < Test::Unit::TestCase
|
|
237
240
|
assert_equal false, ip.include?(@klass.new("13.16.0.0/32"))
|
238
241
|
end
|
239
242
|
|
243
|
+
def test_method_include_all?
|
244
|
+
ip = @klass.new("192.168.10.100/24")
|
245
|
+
addr1 = @klass.new("192.168.10.102/24")
|
246
|
+
addr2 = @klass.new("192.168.10.103/24")
|
247
|
+
assert_equal true, ip.include_all?(addr1,addr2)
|
248
|
+
assert_equal false, ip.include_all?(addr1, @klass.new("13.16.0.0/32"))
|
249
|
+
end
|
250
|
+
|
251
|
+
def test_method_ipv4?
|
252
|
+
assert_equal true, @ip.ipv4?
|
253
|
+
end
|
254
|
+
|
255
|
+
def test_method_ipv6?
|
256
|
+
assert_equal false, @ip.ipv6?
|
257
|
+
end
|
258
|
+
|
240
259
|
def test_method_private?
|
241
260
|
assert_equal true, @klass.new("192.168.10.50/24").private?
|
242
261
|
assert_equal true, @klass.new("192.168.10.50/16").private?
|
@@ -453,6 +472,21 @@ class IPv4Test < Test::Unit::TestCase
|
|
453
472
|
result = ["10.0.1.0/24","10.10.2.0/24","172.16.0.0/23"]
|
454
473
|
assert_equal result, @klass.summarize(ip1,ip2,ip3,ip4).map{|i| i.to_string}
|
455
474
|
|
475
|
+
ips = [@klass.new("10.0.0.12/30"),
|
476
|
+
@klass.new("10.0.100.0/24")]
|
477
|
+
result = ["10.0.0.12/30", "10.0.100.0/24"]
|
478
|
+
assert_equal result, @klass.summarize(*ips).map{|i| i.to_string}
|
479
|
+
|
480
|
+
ips = [@klass.new("172.16.0.0/31"),
|
481
|
+
@klass.new("10.10.2.1/32")]
|
482
|
+
result = ["10.10.2.1/32", "172.16.0.0/31"]
|
483
|
+
assert_equal result, @klass.summarize(*ips).map{|i| i.to_string}
|
484
|
+
|
485
|
+
ips = [@klass.new("172.16.0.0/32"),
|
486
|
+
@klass.new("10.10.2.1/32")]
|
487
|
+
result = ["10.10.2.1/32", "172.16.0.0/32"]
|
488
|
+
assert_equal result, @klass.summarize(*ips).map{|i| i.to_string}
|
489
|
+
|
456
490
|
end
|
457
491
|
|
458
492
|
def test_classmethod_parse_data
|
data/test/ipaddress/ipv6_test.rb
CHANGED
@@ -106,6 +106,14 @@ class IPv6Test < Test::Unit::TestCase
|
|
106
106
|
end
|
107
107
|
end
|
108
108
|
|
109
|
+
def test_method_ipv4?
|
110
|
+
assert_equal false, @ip.ipv4?
|
111
|
+
end
|
112
|
+
|
113
|
+
def test_method_ipv6?
|
114
|
+
assert_equal true, @ip.ipv6?
|
115
|
+
end
|
116
|
+
|
109
117
|
def test_method_network?
|
110
118
|
assert_equal true, @network.network?
|
111
119
|
assert_equal false, @ip.network?
|
@@ -197,22 +205,6 @@ class IPv6Test < Test::Unit::TestCase
|
|
197
205
|
assert_not_equal compressed, @klass.compress("2001:0db8::cd3")
|
198
206
|
end
|
199
207
|
|
200
|
-
# def test_classmethod_create_unpecified
|
201
|
-
# unspec = @klass.create_unspecified
|
202
|
-
# assert_equal "::", unspec.address
|
203
|
-
# assert_equal 128, unspec.prefix
|
204
|
-
# assert_equal true, unspec.unspecified?
|
205
|
-
# assert_instance_of @klass, unspec.class
|
206
|
-
# end
|
207
|
-
|
208
|
-
# def test_classmethod_create_loopback
|
209
|
-
# loopb = @klass.create_loopback
|
210
|
-
# assert_equal "::1", loopb.address
|
211
|
-
# assert_equal 128, loopb.prefix
|
212
|
-
# assert_equal true, loopb.loopback?
|
213
|
-
# assert_instance_of @klass, loopb.class
|
214
|
-
# end
|
215
|
-
|
216
208
|
def test_classmethod_parse_data
|
217
209
|
str = " \001\r\270\000\000\000\000\000\b\b\000 \fAz"
|
218
210
|
ip = @klass.parse_data str
|
@@ -231,7 +223,7 @@ class IPv6Test < Test::Unit::TestCase
|
|
231
223
|
assert_equal @ip.to_s, @klass.parse_hex(@hex,64).to_s
|
232
224
|
end
|
233
225
|
|
234
|
-
end # class
|
226
|
+
end # class IPv6Test
|
235
227
|
|
236
228
|
class IPv6UnspecifiedTest < Test::Unit::TestCase
|
237
229
|
|
@@ -259,6 +251,10 @@ class IPv6UnspecifiedTest < Test::Unit::TestCase
|
|
259
251
|
assert_equal @string, @ip.to_string_uncompressed
|
260
252
|
assert_equal @u128, @ip.to_u128
|
261
253
|
end
|
254
|
+
|
255
|
+
def test_method_ipv6?
|
256
|
+
assert_equal true, @ip.ipv6?
|
257
|
+
end
|
262
258
|
|
263
259
|
end # class IPv6UnspecifiedTest
|
264
260
|
|
@@ -289,6 +285,10 @@ class IPv6LoopbackTest < Test::Unit::TestCase
|
|
289
285
|
assert_equal @string, @ip.to_string_uncompressed
|
290
286
|
assert_equal @u128, @ip.to_u128
|
291
287
|
end
|
288
|
+
|
289
|
+
def test_method_ipv6?
|
290
|
+
assert_equal true, @ip.ipv6?
|
291
|
+
end
|
292
292
|
|
293
293
|
end # class IPv6LoopbackTest
|
294
294
|
|
@@ -345,6 +345,10 @@ class IPv6MappedTest < Test::Unit::TestCase
|
|
345
345
|
assert_equal @u128, @ip.to_u128
|
346
346
|
end
|
347
347
|
|
348
|
+
def test_method_ipv6?
|
349
|
+
assert_equal true, @ip.ipv6?
|
350
|
+
end
|
351
|
+
|
348
352
|
def test_mapped?
|
349
353
|
assert_equal true, @ip.mapped?
|
350
354
|
end
|
@@ -3,25 +3,29 @@ require 'test_helper'
|
|
3
3
|
class Prefix32Test < Test::Unit::TestCase
|
4
4
|
|
5
5
|
def setup
|
6
|
+
@netmask0 = "0.0.0.0"
|
6
7
|
@netmask8 = "255.0.0.0"
|
7
8
|
@netmask16 = "255.255.0.0"
|
8
9
|
@netmask24 = "255.255.255.0"
|
9
10
|
@netmask30 = "255.255.255.252"
|
10
|
-
@netmasks
|
11
|
+
@netmasks = [@netmask0,@netmask8,@netmask16,@netmask24,@netmask30]
|
11
12
|
|
12
13
|
@prefix_hash = {
|
14
|
+
"0.0.0.0" => 0,
|
13
15
|
"255.0.0.0" => 8,
|
14
16
|
"255.255.0.0" => 16,
|
15
17
|
"255.255.255.0" => 24,
|
16
18
|
"255.255.255.252" => 30}
|
17
19
|
|
18
20
|
@octets_hash = {
|
21
|
+
[0,0,0,0] => 0,
|
19
22
|
[255,0,0,0] => 8,
|
20
23
|
[255,255,0,0] => 16,
|
21
24
|
[255,255,255,0] => 24,
|
22
25
|
[255,255,255,252] => 30}
|
23
26
|
|
24
27
|
@u32_hash = {
|
28
|
+
0 => 0,
|
25
29
|
8 => 4278190080,
|
26
30
|
16 => 4294901760,
|
27
31
|
24 => 4294967040,
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ipaddress
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 9
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 7
|
9
|
-
-
|
10
|
-
version: 0.7.
|
9
|
+
- 5
|
10
|
+
version: 0.7.5
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Marco Ceresa
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
18
|
+
date: 2011-04-08 00:00:00 +02:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|
@@ -30,7 +30,6 @@ extra_rdoc_files:
|
|
30
30
|
- README.rdoc
|
31
31
|
files:
|
32
32
|
- .document
|
33
|
-
- .gitignore
|
34
33
|
- CHANGELOG.rdoc
|
35
34
|
- LICENSE
|
36
35
|
- README.rdoc
|
@@ -52,8 +51,8 @@ homepage: http://github.com/bluemonk/ipaddress
|
|
52
51
|
licenses: []
|
53
52
|
|
54
53
|
post_install_message:
|
55
|
-
rdoc_options:
|
56
|
-
|
54
|
+
rdoc_options: []
|
55
|
+
|
57
56
|
require_paths:
|
58
57
|
- lib
|
59
58
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -82,9 +81,9 @@ signing_key:
|
|
82
81
|
specification_version: 3
|
83
82
|
summary: IPv4/IPv6 addresses manipulation library
|
84
83
|
test_files:
|
85
|
-
- test/test_helper.rb
|
86
|
-
- test/ipaddress_test.rb
|
87
|
-
- test/ipaddress/prefix_test.rb
|
88
|
-
- test/ipaddress/ipv6_test.rb
|
89
84
|
- test/ipaddress/extensions/extensions_test.rb
|
90
85
|
- test/ipaddress/ipv4_test.rb
|
86
|
+
- test/ipaddress/ipv6_test.rb
|
87
|
+
- test/ipaddress/prefix_test.rb
|
88
|
+
- test/ipaddress_test.rb
|
89
|
+
- test/test_helper.rb
|