lib/ipaddress.rb in ipaddress-0.5.0 vs lib/ipaddress.rb in ipaddress-0.6.0
- old
+ new
@@ -1,12 +1,139 @@
-$LOAD_PATH.unshift(File.dirname(__FILE__))
-$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
+#
+# = IPAddress
+#
+# A ruby library to manipulate IPv4 and IPv6 addresses
+#
+#
+# Package:: IPAddress
+# Author:: Marco Ceresa <ceresa@ieee.org>
+# License:: Ruby License
+#
+#--
+#
+#++
-require 'ipaddress/ipbase'
require 'ipaddress/ipv4'
require 'ipaddress/ipv6'
+require 'ipaddress/extensions/extensions'
+
+module IPAddress
+
+ NAME = "IPAddress"
+ GEM = "ipaddress"
+ AUTHORS = ["Marco Ceresa <ceresa@ieee.org>"]
+
+ #
+ # Parse the argument string to create a new
+ # IPv4, IPv6 or Mapped IP object
+ #
+ # ip = IPAddress.parse "172.16.10.1/24"
+ # ip6 = IPAddress.parse "2001:db8::8:800:200c:417a/64"
+ # ip_mapped = IPAddress.parse "::ffff:172.16.10.1/128"
+ #
+ # All the object created will be instances of the
+ # correct class:
+ #
+ # ip.class
+ # #=> IPAddress::IPv4
+ # ip6.class
+ # #=> IPAddress::IPv6
+ # ip_mapped.class
+ # #=> IPAddress::IPv6::Mapped
+ #
+ def IPAddress::parse(str)
+ case str
+ when /:.+\./
+ IPAddress::IPv6::Mapped.new(str)
+ else
+ begin
+ IPAddress::IPv4.new(str)
+ rescue ArgumentError
+ IPAddress::IPv6.new(str)
+ end
+ end
+ end
+
+ #
+ # Checks if the given string is a valid IP address,
+ # either IPv4 or IPv6
+ #
+ # Example:
+ #
+ # IPAddress::valid? "2002::1"
+ # #=> true
+ #
+ # IPAddress::valid? "10.0.0.256"
+ # #=> false
+ #
+ def self.valid?(addr)
+ valid_ipv4?(addr) || valid_ipv6?(addr)
+ end
+
+ #
+ # Checks if the given string is a valid IPv4 address
+ #
+ # Example:
+ #
+ # IPAddress::valid_ipv4? "2002::1"
+ # #=> false
+ #
+ # IPAddress::valid_ipv4? "172.16.10.1"
+ # #=> true
+ #
+ def self.valid_ipv4?(addr)
+ if /\A(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\Z/ =~ addr
+ return $~.captures.all? {|i| i.to_i < 256}
+ end
+ false
+ end
+
+ #
+ # Checks if the argument is a valid IPv4 netmask
+ # expressed in dotted decimal format.
+ #
+ # IPAddress.valid_ipv4_netmask? "255.255.0.0"
+ # #=> true
+ #
+ def self.valid_ipv4_netmask?(addr)
+ arr = addr.split(".").map{|i| i.to_i}.pack("CCCC").unpack("B*").first.scan(/01/)
+ arr.empty? && valid_ipv4?(addr)
+ rescue
+ return false
+ end
+
+ #
+ # Checks if the given string is a valid IPv6 address
+ #
+ # Example:
+ #
+ # IPAddress::valid_ipv6? "2002::1"
+ # #=> true
+ #
+ # IPAddress::valid_ipv6? "2002::DEAD::BEEF"
+ # #=> false
+ #
+ def self.valid_ipv6?(addr)
+ # IPv6 (normal)
+ return true if /\A[\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*\Z/ =~ addr
+ return true if /\A[\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*::([\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*)?\Z/ =~ addr
+ return true if /\A::([\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*)?\Z/ =~ addr
+ # IPv6 (IPv4 compat)
+ return true if /\A[\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*:/ =~ addr && valid_ipv4?($')
+ return true if /\A[\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*::([\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*:)?/ =~ addr && valid_ipv4?($')
+ return true if /\A::([\dA-Fa-f]{1,4}(:[\dA-Fa-f]{1,4})*:)?/ =~ addr && valid_ipv4?($')
+ false
+ end
+
+ def self.deprecate(message = nil) # :nodoc:
+ message ||= "You are using deprecated behavior which will be removed from the next major or minor release."
+ warn("DEPRECATION WARNING: #{message}")
+ end
+
+end # module IPAddress
+
#
# IPAddress is a wrapper method built around
# IPAddress's library classes. Its purpouse is to
# make you indipendent from the type of IP address
# you're going to use.
@@ -33,20 +160,9 @@
# #=> IPAddress::IPv6
# ip_mapped.class
# #=> IPAddress::IPv6::Mapped
#
def IPAddress(str)
- case str
- when /:.+\./
- IPAddress::IPv6::Mapped.new(str)
- else
- begin
- IPAddress::IPv4.new(str)
- rescue ArgumentError
- IPAddress::IPv6.new(str)
- end
- end
+ IPAddress::parse str
end
-
-