ipaddr_range_set 0.9.0 → 0.9.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -2,32 +2,35 @@ ipaddr_range_set
2
2
  ================
3
3
 
4
4
  convenience class to create a set of possibly discontiguous IP address range
5
- segments, and check if an IP address is in the set.
5
+ segments, and check if an IP address is in the set. ruby 1.9.3+ only.
6
6
 
7
- Ruby stdlib IPAddr does the heavy-lifting, this is relatively simple code,
8
- but which can simplify your own code when used. Having to do this sort
9
- of thing is often the sign of a bad design, but many of us have to do it anyway.
7
+ Ruby stdlib [IPAddr](http://www.ruby-doc.org/stdlib-1.9.3/libdoc/ipaddr/rdoc/IPAddr.html)
8
+ does the heavy-lifting, this is relatively simple code wrapping it
9
+ in a convenience class. But this can simplify your own code when used.
10
+ Basing logic on IP address range checking can often be the sign of a bad design,
11
+ but many of us have to do it anyway.
10
12
 
11
- == Usage
13
+ ## Usage
12
14
 
13
15
  require 'ipaddr_range_set'
14
16
 
15
- # Zero or more segment arguments, of a variety
17
+ # Zero or more segment arguments, which can be input in a variety of
16
18
  # of formats.
17
19
  range = IPAddrRangeSet.new(
18
- '220.1.10.3', # an IPv4 as a string
19
- '2001:db8::10', # An IPv6 as a string
20
- '8.0.0.0/24', # IPv4 as CIDR, IPv6 CIDR too
20
+ '220.1.10.3', # a single IPv4 as a string
21
+ '2001:db8::10', # a single IPv6 as a string
22
+ '8.0.0.0/24', # IPv4 as CIDR, works for IPv6 CIDR too
21
23
  '8.*.*.*', # informal splat notation, only for IPv4
22
- '8.8.0.0'..'8.8.2.255', # arbitrary range
24
+ '8.8.0.0'..'8.8.2.255', # arbitrary range, works for IPv6 too.
23
25
  IPAddr.new(whatever), # arbitrary existing IPAddr object
24
26
  (ip_addr..ip_addr) # range of arbitrary IPAddr objects.
25
27
  )
26
28
 
27
- When ruby Range's are used, IPAddrRangeSegment makes sure to use `Range#cover?`
29
+ When ruby Range's are used, IPAddrRangeSet makes sure to use `Range#cover?`
28
30
  internally, not `Range#include?` (the latter being disastrous for anything that
29
- doesn't have `#to_int`). Triple dot `...` exclusive ranges are supported, if for
30
- some reason you want them.
31
+ doesn't have `#to_int`). Triple dot `...` exclusive endpoint ranges are
32
+ supported, which can be convenient if you don't like writing lots of `255`s
33
+ in your range end points.
31
34
 
32
35
  range.include? '220.1.10.5'
33
36
  range.include? IPAddr.new('220.1.10.5')
@@ -38,7 +41,7 @@ IPAddrRangeSets are immutable, but you can create new ones combining existing
38
41
  ranges:
39
42
 
40
43
  new_range = IPAddrRangeSet('8.10.5.1') + IPAddrRangeSet('8.11.6.1')
41
- new_range = IPAddrRangeSet('8.10.5.1').add('8.0.0.0/24')
44
+ new_range = IPAddrRangeSet('8.10.5.1').add('8.0.0.0/24', 10.0.0.1..10.1.4.255 )
42
45
 
43
46
  The internal implementation just steps through all range segments and checks
44
47
  the argument for inclusion, there's no special optimization to detect overlapping
@@ -50,17 +53,17 @@ As above range 'union' is supported, but range intersection is not. It's
50
53
  a bit tricky to implement well, and I don't have a use case for it.
51
54
 
52
55
  Built-in constants are available for local (private, not publically routable)
53
- and loopback ranges in both IPv4 IPv6. IPv4Local, IPv4Loopback, IPv6Local,
54
- IPv6Loopback. The constant `LocalAddresses` is the union of v4 and v6 local
56
+ and loopback ranges in both IPv4 and IPv6. `IPAddrRangeSet::IPv4Local`, `IPv4Loopback`, `IPv6Local`,
57
+ `IPv6Loopback`. The constant `LocalAddresses` is the union of all v4 and v6 local
55
58
  and loopback addresses.
56
59
 
57
- IPAddrRangeSet::LocalAddress.include? "127.0.0.1" # true
58
- IPAddrRangeSet::LocalAddress.include? "10.0.0.1" # true
59
- IPAddrRangeSet::LocalAddress.include? "192.168.0.1" # true
60
- IPAddrRangeSet::LocalAddress.include? "::1" # true, ipv6 loopback
61
- IPAddrRangeSet::LocalAddress.include? "fc00::1" # an ipv6 local
60
+ IPAddrRangeSet::LocalAddresses.include? "127.0.0.1" # true
61
+ IPAddrRangeSet::LocalAddresses.include? "10.0.0.1" # true
62
+ IPAddrRangeSet::LocalAddresses.include? "192.168.0.1" # true
63
+ IPAddrRangeSet::LocalAddresses.include? "::1" # true, ipv6 loopback
64
+ IPAddrRangeSet::LocalAddresses.include? "fc00::1" # an ipv6 local
62
65
 
63
- == Note on ipv6
66
+ ## Note on ipv6
64
67
 
65
68
  It supports ipv6 just because it was so easy to do so with the underlying
66
69
  IPAddr implementation. But I don't have much experience or use for IPv6, there
@@ -69,4 +72,9 @@ could be oddities hiding in there.
69
72
  You can create an IPAddrRangeSet that includes both IPv4 and IPv6 segments, no
70
73
  problem. But an individual `include?` argument will only match a segment of
71
74
  it's own type, no automatic conversion of IPv4-compatible IPv6 addresses
72
- is done (should it be? I have no idea, don't really understand ipv6 use cases).
75
+ is done (should it be? I have no idea, don't really understand ipv6 use cases).
76
+
77
+ ## thanks
78
+
79
+ to whoever wrote IPAddr in ruby stdlib, nice to have it, this is just a
80
+ convenience wrapper over it, really.
@@ -110,10 +110,11 @@ end
110
110
  class IPAddrRangeSet
111
111
  # Constant ranges for local/non-routable/private addresses
112
112
  IPv4Local = IPAddrRangeSet.new("10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16")
113
+ # who knew it's not just 127.0.0.1? Check the spec, it's this:
113
114
  IPv4Loopback = IPAddrRangeSet.new("127.0.0.0/8")
114
115
 
115
116
  IPv6Local = IPAddrRangeSet.new("fc00::/7")
116
117
  IPv6Loopback = IPAddrRangeSet.new("::1")
117
118
 
118
- LocalAddresses = IPv4Local + IPv4Local + IPv6Local + IPv6Local
119
+ LocalAddresses = IPv4Local + IPv4Loopback + IPv6Local + IPv6Loopback
119
120
  end
@@ -1,3 +1,3 @@
1
1
  module IpaddrRangeSet
2
- VERSION = "0.9.0"
2
+ VERSION = "0.9.1"
3
3
  end
@@ -121,7 +121,7 @@ class TestIpAddrRange < Test::Unit::TestCase
121
121
  end
122
122
 
123
123
  def test_local_constants
124
- %w{10.3.3.1 172.16.4.1 192.168.2.1 fc00::1}.each do |ip|
124
+ %w{10.3.3.1 172.16.4.1 192.168.2.1 fc00::1 127.0.0.1 ::1}.each do |ip|
125
125
  assert IPAddrRangeSet::LocalAddresses.include?(ip), "IPAddrRangeSet::LocalAddresses should include #{ip}"
126
126
  end
127
127
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ipaddr_range_set
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.9.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: