iplogic 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
data/iplogic.gemspec CHANGED
@@ -10,6 +10,10 @@ Gem::Specification.new do |s|
10
10
  An IPv4 swiss-army chainsaw
11
11
  desc
12
12
 
13
+ s.summary = <<-sum
14
+ Because it's just a 32-bit integer.
15
+ sum
16
+
13
17
  s.email = %q{jay@causes.com}
14
18
  s.extra_rdoc_files = %w(
15
19
  LICENSE
@@ -32,10 +36,6 @@ Gem::Specification.new do |s|
32
36
  s.require_paths = ["lib"]
33
37
  s.rubygems_version = '1.3.7'
34
38
 
35
- s.summary = <<-sum
36
- Because it's just a 32-bit integer.
37
- sum
38
-
39
39
  s.test_files = %w(
40
40
  spec/ip_spec.rb
41
41
  spec/cidr_spec.rb
data/lib/iplogic.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module IPLogic
2
- VERSION = '0.1.3'
2
+ VERSION = '0.1.4'
3
3
 
4
4
  LIB = File.expand_path(File.dirname(__FILE__))
5
5
  end
data/lib/iplogic/cidr.rb CHANGED
@@ -2,6 +2,7 @@ module IPLogic
2
2
  class CIDR
3
3
  include Enumerable
4
4
 
5
+ SHORTENED_IP_REGEX = /^(\d{1,3}(\.\d{1,3}){1,3})\/(\d+)$/
5
6
  class << self
6
7
  def wrap(*args)
7
8
  return args.first if args.first.is_a? CIDR
@@ -11,10 +12,8 @@ module IPLogic
11
12
  bits = case bits
12
13
  when Integer
13
14
  bits
14
- when String
15
+ when String, IP
15
16
  netmask_to_bits(IP.wrap(bits))
16
- when IP
17
- netmask_to_bits(bits)
18
17
  else
19
18
  if bits.respond_to? :to_i
20
19
  bits.to_i
@@ -23,18 +22,40 @@ module IPLogic
23
22
  end
24
23
  end
25
24
 
26
- new(ip, bits)
25
+ ip = parse_shortened_ip(ip) if ip.is_a? String
26
+
27
+ return new(ip, bits)
28
+
27
29
  elsif args.size == 1
28
30
  arg = args.first
29
- if arg =~ /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\/(\d+)/
30
- new($1, $2)
31
+
32
+ return arg if arg.is_a? CIDR
33
+
34
+ # one argument means it's gotta be a string to parse
35
+ format_error(arg) unless arg.is_a? String
36
+
37
+ if arg =~ SHORTENED_IP_REGEX
38
+ new(parse_shortened_ip($1), $3)
39
+ elsif (parts = arg.split('/')).size == 2
40
+ ip = parse_shortened_ip(parts[0])
41
+ mask = IP.wrap(parts[1])
42
+ return new(ip, netmask_to_bits(mask))
31
43
  else
32
44
  format_error(arg)
33
45
  end
34
46
  end
35
47
  end
48
+
36
49
  private
50
+ # helper for formats like 11.22.33/24
51
+ # just adds some .0's to the end
52
+ def parse_shortened_ip(ip_str)
53
+ dots = ip_str.count('.')
54
+ IP.wrap(ip_str + '.0'*(3 - dots))
55
+ end
56
+
37
57
  def netmask_to_bits(netmask)
58
+ raise FormatError, "CIDR: #{netmask} is not a netmask" unless netmask.netmask?
38
59
  # TODO: there's probably a clever mathy way to do this,
39
60
  # but this works just fine.
40
61
  netmask.to_i.to_s(2) =~ /^(1*)0*$/
data/spec/cidr_spec.rb CHANGED
@@ -21,6 +21,37 @@ describe CIDR do
21
21
  r.inspect.should include '11.22.33.44/8'
22
22
  end
23
23
 
24
+ it "parses slash notation with a netmask" do
25
+ r = CIDR('11.22.33.44/255.255.255.0')
26
+ r.ip.should be_a IP
27
+ r.ip.to_s.should == '11.22.33.44'
28
+ r.bits.should == 24
29
+ r.netmask.should == '255.255.255.0'
30
+ end
31
+
32
+ it "parses shortened slash notation" do
33
+ r = CIDR('11.22.33/24')
34
+ r.ip.should be_a IP
35
+ r.ip.to_s.should == '11.22.33.0'
36
+ r.bits.should == 24
37
+ r.netmask.should == '255.255.255.0'
38
+ end
39
+
40
+ it "parses shortened slash notation with a netmask" do
41
+ r = CIDR('11.22/255.255.0.0')
42
+ r.ip.should be_a IP
43
+ r.ip.to_s.should == '11.22.0.0'
44
+ r.bits.should == 16
45
+ r.netmask.should == '255.255.0.0'
46
+ end
47
+
48
+ it "supports wrapping" do
49
+ r = CIDR('11.22.33.44/24')
50
+ wrapped = CIDR(r)
51
+ wrapped.should be_a CIDR
52
+ r.object_id.should == wrapped.object_id
53
+ end
54
+
24
55
  it "knows its bits" do
25
56
  i = rand(33)
26
57
  CIDR("1.1.1.1/#{i}").bits.
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: iplogic
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 19
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 3
10
- version: 0.1.3
9
+ - 4
10
+ version: 0.1.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - Jay Adkisson