ipaddress_2 0.12.1 → 0.13.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/VERSION +1 -1
- data/lib/ipaddress_2/ipv4.rb +115 -0
- data/lib/ipaddress_2/ipv6.rb +114 -0
- data/lib/ipaddress_2/version.rb +1 -1
- data/test/ipaddress_2/ipv4_test.rb +52 -1
- data/test/ipaddress_2/ipv6_test.rb +45 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cda18a11bce6a923e0471a7d08d6f8df8dae71d1ff768c6e0978772124be6f50
|
4
|
+
data.tar.gz: 47c24c1776bb9de0dedbec3179e42c22ed8ff4da96db53bcd95d8cb328bf2ca5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f9c69847cbf37301f1ded22d7bd4e97f0ab1040ff14d8f14993c414908872de88d06d6c25eecf1d153aaa22644038dcf3fb0fc2e4febf8be93e339b379b1f480
|
7
|
+
data.tar.gz: dbd02e8ed7d482b51873b45f443d92d7d11c78545ac20b9ba970745d3029c3d66c90aeb526dbf87f7bf95bd8a138ceb87e8621fba8d3e71dfadd591988b1fb35
|
data/CHANGELOG.md
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.13.0
|
data/lib/ipaddress_2/ipv4.rb
CHANGED
@@ -377,6 +377,18 @@ module IPAddress;
|
|
377
377
|
def network
|
378
378
|
self.class.parse_u32(network_u32, @prefix)
|
379
379
|
end
|
380
|
+
|
381
|
+
#
|
382
|
+
# Returns a new IPv4 object containing only the host part of this IP.
|
383
|
+
#
|
384
|
+
# ip = IPAddress("172.16.10.64/24")
|
385
|
+
#
|
386
|
+
# ip.hostpart.to_s
|
387
|
+
# #=> "0.0.0.64"
|
388
|
+
#
|
389
|
+
def hostpart
|
390
|
+
self.class.parse_u32(hostpart_u32, 32)
|
391
|
+
end
|
380
392
|
|
381
393
|
#
|
382
394
|
# Returns a new IPv4 object with the
|
@@ -600,6 +612,18 @@ module IPAddress;
|
|
600
612
|
def network_u32
|
601
613
|
@u32 & @prefix.to_u32
|
602
614
|
end
|
615
|
+
|
616
|
+
#
|
617
|
+
# Returns this address' host part in unsigned 32bits format
|
618
|
+
#
|
619
|
+
# ip = IPAddress("10.0.0.42/24")
|
620
|
+
#
|
621
|
+
# ip.host_u32
|
622
|
+
# #=> 42
|
623
|
+
#
|
624
|
+
def hostpart_u32
|
625
|
+
@u32 & ~@prefix.to_u32
|
626
|
+
end
|
603
627
|
|
604
628
|
#
|
605
629
|
# Returns the broadcast address in Unsigned 32bits format
|
@@ -886,6 +910,97 @@ module IPAddress;
|
|
886
910
|
def +(oth)
|
887
911
|
aggregate(*[self,oth].sort.map{|i| i.network})
|
888
912
|
end
|
913
|
+
|
914
|
+
#
|
915
|
+
# Returns a new IPv4 object which is the result
|
916
|
+
# of advancing this IP address by a given value.
|
917
|
+
# In other words, this arithmetically adds IP addresses.
|
918
|
+
#
|
919
|
+
# Will raise an error if the resulting address is in a different subnet,
|
920
|
+
# except validating is set to false.
|
921
|
+
#
|
922
|
+
# Example:
|
923
|
+
#
|
924
|
+
# ip = IPAddress::IPv4.new("172.16.10.1/24")
|
925
|
+
# ip.add(5).to_string
|
926
|
+
# #=> "172.16.10.6/24"
|
927
|
+
def add(oth, validating=true)
|
928
|
+
oth = oth.to_i if oth.kind_of? IPAddress::IPv4 # oth shall be integer
|
929
|
+
|
930
|
+
new_obj = self.class.parse_u32(self.to_i + oth, prefix)
|
931
|
+
|
932
|
+
if validating and self.network_u32 != new_obj.network_u32
|
933
|
+
raise RuntimeError, "Subnet (/#{@prefix}) is not large enough."
|
934
|
+
end
|
935
|
+
|
936
|
+
new_obj
|
937
|
+
end
|
938
|
+
|
939
|
+
#
|
940
|
+
# Returns a new IPv4 object which is the result
|
941
|
+
# of decreasing this IP address by a given value.
|
942
|
+
# In other words, this arithmetically subtracts IP addresses.
|
943
|
+
#
|
944
|
+
# Will raise an error if the resulting address is in a different subnet,
|
945
|
+
# except validating is set to false.
|
946
|
+
#
|
947
|
+
# Example:
|
948
|
+
#
|
949
|
+
# ip = IPAddress::IPv4.new("172.16.10.10/24")
|
950
|
+
# ip.subtract(5).to_string
|
951
|
+
# #=> "172.16.10.5/24"
|
952
|
+
def subtract(oth, validating=true)
|
953
|
+
oth = oth.to_i if oth.kind_of? IPAddress::IPv4 # oth shall be integer
|
954
|
+
add(-oth, validating)
|
955
|
+
end
|
956
|
+
|
957
|
+
#
|
958
|
+
# Returns the network address of the n-th network succeeding this one.
|
959
|
+
#
|
960
|
+
# Example:
|
961
|
+
#
|
962
|
+
# ip = IPAddress::IPv4.new("172.16.10.0/24")
|
963
|
+
# ip.advance_network(24).to_string
|
964
|
+
# #=> "172.16.52.0/24"
|
965
|
+
def advance_network(amount)
|
966
|
+
IPAddress::IPv4.parse_u32(self.network.u32 + amount*self.size, @prefix)
|
967
|
+
end
|
968
|
+
|
969
|
+
#
|
970
|
+
# Returns the network address of the network succeeding this one.
|
971
|
+
#
|
972
|
+
# Example:
|
973
|
+
#
|
974
|
+
# ip = IPAddress::IPv4.new("172.16.10.0/24")
|
975
|
+
# ip.next_network.to_string
|
976
|
+
# #=> "172.16.11.0/24"
|
977
|
+
def next_network
|
978
|
+
advance_network 1
|
979
|
+
end
|
980
|
+
|
981
|
+
#
|
982
|
+
# Returns the network address of the n-th network preceeding this one.
|
983
|
+
#
|
984
|
+
# Example:
|
985
|
+
#
|
986
|
+
# ip = IPAddress::IPv4.new("172.16.10.0/24")
|
987
|
+
# ip.regress_network(5).to_string
|
988
|
+
# #=> "172.16.5.0/24"
|
989
|
+
def regress_network(amount)
|
990
|
+
advance_network(-amount)
|
991
|
+
end
|
992
|
+
|
993
|
+
#
|
994
|
+
# Returns the network address of the network preceeding this one.
|
995
|
+
#
|
996
|
+
# Example:
|
997
|
+
#
|
998
|
+
# ip = IPAddress::IPv4.new("172.16.10.0/24")
|
999
|
+
# ip.previous_network.to_string
|
1000
|
+
# #=> "172.16.9.0/24"
|
1001
|
+
def previous_network
|
1002
|
+
regress_network 1
|
1003
|
+
end
|
889
1004
|
|
890
1005
|
#
|
891
1006
|
# Checks whether the ip address belongs to a
|
data/lib/ipaddress_2/ipv6.rb
CHANGED
@@ -394,8 +394,110 @@ module IPAddress;
|
|
394
394
|
to_hex.reverse.gsub(/./){|c| c+"."} + "ip6.arpa"
|
395
395
|
end
|
396
396
|
alias_method :arpa, :reverse
|
397
|
+
|
398
|
+
#
|
399
|
+
# Returns a new IPv6 object which is the result
|
400
|
+
# of advancing this IP address by a given value.
|
401
|
+
# In other words, this arithmetically adds IP addresses.
|
402
|
+
#
|
403
|
+
# Will raise an error if the resulting address is in a different subnet,
|
404
|
+
# except validating is set to false.
|
405
|
+
#
|
406
|
+
# Example:
|
407
|
+
#
|
408
|
+
# ip = IPAddress::IPv6.new("fc42:1337::/64")
|
409
|
+
# ip.add(5).to_string
|
410
|
+
# #=> "fc42:1337::5/64"
|
411
|
+
def add(oth, validating=true)
|
412
|
+
oth = oth.to_i if oth.kind_of? IPAddress::IPv6 # oth shall be integer
|
413
|
+
|
414
|
+
new_obj = self.class.parse_u128(self.to_i + oth, prefix)
|
415
|
+
|
416
|
+
if validating and self.network_u128 != new_obj.network_u128
|
417
|
+
raise RuntimeError, "Subnet (/#{@prefix}) is not large enough."
|
418
|
+
end
|
419
|
+
|
420
|
+
new_obj
|
421
|
+
end
|
422
|
+
|
423
|
+
#
|
424
|
+
# Returns a new IPv6 object which is the result
|
425
|
+
# of decreasing this IP address by a given value.
|
426
|
+
# In other words, this arithmetically subtracts IP addresses.
|
427
|
+
#
|
428
|
+
# Will raise an error if the resulting address is in a different subnet,
|
429
|
+
# except validating is set to false.
|
430
|
+
#
|
431
|
+
# Example:
|
432
|
+
#
|
433
|
+
# ip = IPAddress::IPv6.new("fc42:1337::a/64")
|
434
|
+
# ip.subtract(5).to_string
|
435
|
+
# #=> "fc42:1337::5/64"
|
436
|
+
def subtract(oth, validating=true)
|
437
|
+
oth = oth.to_i if oth.kind_of? IPAddress::IPv6 # oth shall be integer
|
438
|
+
add(-oth, validating)
|
439
|
+
end
|
397
440
|
|
398
441
|
#
|
442
|
+
# Returns the network address of the n-th network succeeding this one.
|
443
|
+
#
|
444
|
+
# Example:
|
445
|
+
#
|
446
|
+
# ip = IPAddress::IPv6.new("fc42:1337:0:0::/64")
|
447
|
+
# ip.advance_network(5).to_string
|
448
|
+
# #=> "fc42:1337:0:5::/64"
|
449
|
+
def advance_network(amount)
|
450
|
+
IPAddress::IPv6.parse_u128(self.network.to_i + amount*self.size, @prefix)
|
451
|
+
end
|
452
|
+
|
453
|
+
#
|
454
|
+
# Returns the network address of the network succeeding this one.
|
455
|
+
#
|
456
|
+
# Example:
|
457
|
+
#
|
458
|
+
# ip = IPAddress::IPv6.new("fc42:1337:0:0::/64")
|
459
|
+
# ip.next_network.to_string
|
460
|
+
# #=> "fc42:1337:0:1::/64"
|
461
|
+
def next_network
|
462
|
+
advance_network 1
|
463
|
+
end
|
464
|
+
|
465
|
+
#
|
466
|
+
# Returns the network address of the n-th network preceeding this one.
|
467
|
+
#
|
468
|
+
# Example:
|
469
|
+
#
|
470
|
+
# ip = IPAddress::IPv6.new("fc42:1337:0:5::/64")
|
471
|
+
# ip.regress_network(4).to_string
|
472
|
+
# #=> "fc42:1337:0:1::/64"
|
473
|
+
def regress_network(amount)
|
474
|
+
advance_network(-amount)
|
475
|
+
end
|
476
|
+
|
477
|
+
#
|
478
|
+
# Returns the network address of the network preceeding this one.
|
479
|
+
#
|
480
|
+
# Example:
|
481
|
+
#
|
482
|
+
# ip = IPAddress::IPv6.new("fc42:1337:0:5::/64")
|
483
|
+
# ip.previous_network.to_string
|
484
|
+
# #=> "fc42:1337:0:4::/64"
|
485
|
+
def previous_network
|
486
|
+
regress_network 1
|
487
|
+
end
|
488
|
+
|
489
|
+
#
|
490
|
+
# Returns a new IPv6 object containing only the host part of this IP.
|
491
|
+
#
|
492
|
+
# ip = IPAddress::IPv6.new("fc42:1337:0:5::7/64")
|
493
|
+
#
|
494
|
+
# ip.hostpart.to_s
|
495
|
+
# #=> "::7"
|
496
|
+
#
|
497
|
+
def hostpart
|
498
|
+
self.class.parse_u128(hostpart_u128, 128)
|
499
|
+
end
|
500
|
+
|
399
501
|
# Splits a network into different subnets
|
400
502
|
#
|
401
503
|
# NOTE: Will allow you to split past /64 against RFC 5375
|
@@ -453,6 +555,18 @@ module IPAddress;
|
|
453
555
|
def network_u128
|
454
556
|
to_u128 & @prefix.to_u128
|
455
557
|
end
|
558
|
+
|
559
|
+
#
|
560
|
+
# Returns this address' host part in unsigned 128bits format
|
561
|
+
#
|
562
|
+
# ip = IPAddress::IPv6.new("fc42:1337:0:5::7/64")
|
563
|
+
#
|
564
|
+
# ip.host_u128
|
565
|
+
# #=> 7
|
566
|
+
#
|
567
|
+
def hostpart_u128
|
568
|
+
to_u128 & ~@prefix.to_u128
|
569
|
+
end
|
456
570
|
|
457
571
|
#
|
458
572
|
# Returns the broadcast address in Unsigned 128bits format
|
data/lib/ipaddress_2/version.rb
CHANGED
@@ -455,7 +455,7 @@ class IPv4Test < Minitest::Test
|
|
455
455
|
|
456
456
|
ip2 = @klass.new("172.16.12.2/24")
|
457
457
|
assert_equal [ip1.network.to_string, ip2.network.to_string],
|
458
|
-
|
458
|
+
(ip1 + ip2).map{|i| i.to_string}
|
459
459
|
|
460
460
|
ip1 = @klass.new("10.0.0.0/23")
|
461
461
|
ip2 = @klass.new("10.0.2.0/24")
|
@@ -533,6 +533,57 @@ class IPv4Test < Minitest::Test
|
|
533
533
|
assert_equal "172.16.8.0/22", @ip.supernet(22).to_string
|
534
534
|
end
|
535
535
|
|
536
|
+
def test_method_add
|
537
|
+
ip = IPAddress::IPv4.new("172.16.10.1/24")
|
538
|
+
assert_equal ip.add(5), IPAddress::IPv4.new("172.16.10.6/24")
|
539
|
+
assert_equal ip.add(IPAddress::IPv4.new("0.0.0.5/6")), IPAddress::IPv4.new("172.16.10.6/24")
|
540
|
+
assert_equal ip.add(50), IPAddress::IPv4.new("172.16.10.51/24")
|
541
|
+
assert_equal ip.add(254), IPAddress::IPv4.new("172.16.10.255/24")
|
542
|
+
assert_raises(RuntimeError) {ip.add(255)}
|
543
|
+
assert_equal ip.add(255, false), IPAddress::IPv4.new("172.16.11.0/24")
|
544
|
+
assert_raises(RuntimeError) {ip.add(1000)}
|
545
|
+
ip = IPAddress::IPv4.new("172.16.10.1/30")
|
546
|
+
assert_equal ip.add(2), IPAddress::IPv4.new("172.16.10.3/30")
|
547
|
+
assert_raises(RuntimeError) {ip.add(3)}
|
548
|
+
end
|
549
|
+
|
550
|
+
def test_method_subtract
|
551
|
+
ip = IPAddress::IPv4.new("172.16.10.10/24")
|
552
|
+
assert_equal ip.subtract(5), IPAddress::IPv4.new("172.16.10.5/24")
|
553
|
+
assert_equal ip.subtract(IPAddress::IPv4.new("0.0.0.5/32")), IPAddress::IPv4.new("172.16.10.5/24")
|
554
|
+
assert_equal ip.subtract(10), IPAddress::IPv4.new("172.16.10.0/24")
|
555
|
+
assert_raises(RuntimeError) {ip.subtract(11)}
|
556
|
+
assert_equal ip.subtract(11, false), IPAddress::IPv4.new("172.16.9.255/24")
|
557
|
+
assert_raises(RuntimeError) {ip.subtract(IPAddress::IPv4.new("0.0.0.11/16"))}
|
558
|
+
end
|
559
|
+
|
560
|
+
def test_method_hostpart
|
561
|
+
ip = IPAddress::IPv4.new("172.16.10.64/24")
|
562
|
+
assert_equal ip.hostpart.to_s, "0.0.0.64"
|
563
|
+
ip = IPAddress::IPv4.new("172.16.10.130/25")
|
564
|
+
assert_equal ip.hostpart.to_s, "0.0.0.2"
|
565
|
+
end
|
566
|
+
|
567
|
+
def test_method_advance_network
|
568
|
+
ip = IPAddress::IPv4.new("172.16.10.64/24")
|
569
|
+
assert_equal ip.advance_network(42), IPAddress::IPv4.new("172.16.52.0/24")
|
570
|
+
end
|
571
|
+
|
572
|
+
def test_method_next_network
|
573
|
+
ip = IPAddress::IPv4.new("172.16.10.64/24")
|
574
|
+
assert_equal ip.next_network, IPAddress::IPv4.new("172.16.11.0/24")
|
575
|
+
end
|
576
|
+
|
577
|
+
def test_method_regress_network
|
578
|
+
ip = IPAddress::IPv4.new("172.16.10.64/24")
|
579
|
+
assert_equal ip.regress_network(5), IPAddress::IPv4.new("172.16.5.0/24")
|
580
|
+
end
|
581
|
+
|
582
|
+
def test_method_previous_network
|
583
|
+
ip = IPAddress::IPv4.new("172.16.10.64/24")
|
584
|
+
assert_equal ip.previous_network, IPAddress::IPv4.new("172.16.9.0/24")
|
585
|
+
end
|
586
|
+
|
536
587
|
def test_classmethod_parse_u32
|
537
588
|
@decimal_values.each do |addr,int|
|
538
589
|
ip = @klass.parse_u32(int)
|
@@ -627,6 +627,51 @@ class IPv6Test < Minitest::Test
|
|
627
627
|
assert_equal "2001:db8:8:2000::/51", @klass.new("2001:db8:8::/51").find_adjacent_subnet
|
628
628
|
end
|
629
629
|
|
630
|
+
def test_method_add
|
631
|
+
ip = IPAddress::IPv6.new("fc42:1337::/64")
|
632
|
+
assert_equal ip.add(5), IPAddress::IPv6.new("fc42:1337::5/64")
|
633
|
+
assert_equal ip.add(IPAddress::IPv6.new("::5/42")), IPAddress::IPv6.new("fc42:1337::5/64")
|
634
|
+
assert_equal ip.add(50), IPAddress::IPv6.new("fc42:1337::32/64")
|
635
|
+
ip = IPAddress::IPv6.new("fc42:1337::/120")
|
636
|
+
assert_equal ip.add(2), IPAddress::IPv6.new("fc42:1337::2/120")
|
637
|
+
assert_raises(RuntimeError) {ip.add(256)}
|
638
|
+
assert_equal ip.add(256, false), IPAddress::IPv6.new("fc42:1337::100/120")
|
639
|
+
end
|
640
|
+
|
641
|
+
def test_method_subtract
|
642
|
+
ip = IPAddress::IPv6.new("fc42:1337::5/64")
|
643
|
+
assert_equal ip.subtract(5), IPAddress::IPv6.new("fc42:1337::/64")
|
644
|
+
assert_equal ip.subtract(IPAddress::IPv6.new("::5/12")), IPAddress::IPv6.new("fc42:1337::0/64")
|
645
|
+
assert_raises(RuntimeError) {ip.subtract(11)}
|
646
|
+
assert_raises(RuntimeError) {ip.subtract(IPAddress::IPv6.new("::11/66"))}
|
647
|
+
end
|
648
|
+
|
649
|
+
def test_method_hostpart
|
650
|
+
ip = IPAddress::IPv6.new("fc42:1337:0:5::7/64")
|
651
|
+
assert_equal ip.hostpart.to_s, "::7"
|
652
|
+
end
|
653
|
+
|
654
|
+
def test_method_advance_network
|
655
|
+
ip = IPAddress::IPv6.new("fc42:1337:0:0::/64")
|
656
|
+
assert_equal ip.advance_network(5), IPAddress::IPv6.new("fc42:1337:0:5::/64")
|
657
|
+
end
|
658
|
+
|
659
|
+
def test_method_next_network
|
660
|
+
ip = IPAddress::IPv6.new("fc42:1337:0:0::/64")
|
661
|
+
assert_equal ip.next_network, IPAddress::IPv6.new("fc42:1337:0:1::/64")
|
662
|
+
end
|
663
|
+
|
664
|
+
def test_method_regress_network
|
665
|
+
ip = IPAddress::IPv6.new("fc42:1337:0:5::/64")
|
666
|
+
assert_equal ip.regress_network(4), IPAddress::IPv6.new("fc42:1337:0:1::/64")
|
667
|
+
end
|
668
|
+
|
669
|
+
def test_method_previous_network
|
670
|
+
ip = IPAddress::IPv6.new("fc42:1337:0:5::/64")
|
671
|
+
assert_equal ip.previous_network, IPAddress::IPv6.new("fc42:1337:0:4::/64")
|
672
|
+
end
|
673
|
+
|
674
|
+
|
630
675
|
end # class IPv6Test
|
631
676
|
|
632
677
|
class IPv6UnspecifiedTest < Minitest::Test
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ipaddress_2
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.13.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- bluemonk
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2019-
|
12
|
+
date: 2019-05-08 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|