tduehr-libmatty 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,25 @@
1
+ class Fixnum
2
+ module FixnumExtensions
3
+ # Ridiculous that this isn't in the library.
4
+ def printable?; self >= 0x20 and self <= 0x7e; end
5
+
6
+ # Like Numeric#Step, but yields the length of each span along with
7
+ # the offset. Useful for stepping through data in increments:
8
+ # 0.stepwith(buffer.size, 4096) {|off,len| pp buffer[off,len]}
9
+ # The "len" parameter accounts for the inevitable short final block.
10
+ def stepwith(limit, stepv, &block)
11
+ step(limit, stepv) do |i|
12
+ remt = limit - i
13
+ yield i, remt.cap(stepv)
14
+ end
15
+ end
16
+
17
+ # you can't clone a fixnum? Why?
18
+ def clone; self; end
19
+
20
+ def upper?; self >= 0x41 and self <= 0x5a; end
21
+ def lower?; self >= 0x61 and self <= 0x7a; end
22
+ end
23
+ include FixnumExtensions
24
+ end
25
+
@@ -0,0 +1,47 @@
1
+ class Hash
2
+ module HashExtensions
3
+ # XXX does the same thing as Hash#invert i think?
4
+ def flip
5
+ map {|k,v| [v,k]}.to_hash
6
+ end
7
+
8
+ # Model.create(params.deny_keys(:password, :isadmin))
9
+ ##
10
+ def allow_keys(*keys)
11
+ tmp = self.clone
12
+ tmp.delete_if {|k,v| ! keys.include?(k) }
13
+ tmp
14
+ end
15
+
16
+ def allow_keys!(*keys)
17
+ delete_if{|k,v| ! keys.include?(k) }
18
+ end
19
+
20
+ # Filter a list of keys, rejecting the ones we don't
21
+ # want to allow through.
22
+ def deny_keys(*keys)
23
+ tmp = self.clone
24
+ tmp.delete_if {|k,v| keys.include?(k) }
25
+ tmp
26
+ end
27
+
28
+ # {:foo=>"bar"}.xfrm(:foo => :meep) ==> {:meep=>"bar"}
29
+ def xfrm(opts={})
30
+ self.map do |k,v|
31
+ x = [opts.fetch(k, k), v]
32
+ pp x
33
+ x
34
+ end.to_h
35
+ end
36
+ class KeyRequired < RuntimeError; end
37
+
38
+ def demand(*args)
39
+ args.each do |a|
40
+ if not self.has_key? a
41
+ raise KeyRequired, "option #{ a } required"
42
+ end
43
+ end
44
+ end
45
+ end
46
+ include HashExtensions
47
+ end
@@ -0,0 +1,120 @@
1
+ class Integer
2
+ module IntegerExtensions
3
+ # Convert integers to binary strings
4
+ def to_l32; [self].pack "L"; end
5
+ def to_b32; [self].pack "N"; end
6
+ def to_l16; [self].pack "v"; end
7
+ def to_b16; [self].pack "n"; end
8
+ def to_u8; [self].pack "C"; end
9
+
10
+ # sign extend
11
+ def sx8; ([self].pack "c").unpack("C").first; end
12
+ def sx16; ([self].pack "s").unpack("S").first; end
13
+ def sx32; ([self].pack "l").unpack("L").first; end
14
+
15
+ # Print a number in hex
16
+ def to_hex(pre="0x"); pre + to_s(16); end
17
+
18
+ # Print a number in binary
19
+ def to_b(pre=""); pre + to_s(2); end
20
+
21
+ def clear_bits(c); (self ^ (self & c)); end
22
+
23
+ def ffs
24
+ i = 0
25
+ v = self
26
+ while((v >>= 1) != 0)
27
+ i += 1
28
+ end
29
+ return i
30
+ end
31
+ module ClassMethods
32
+ # Make a bitmask with m-many bits, as an Integer
33
+ def mask_for(m)
34
+ # This is just table lookup for values less than 65
35
+
36
+ @@mask ||= {
37
+ 1 => 0x1,
38
+ 2 => 0x3,
39
+ 3 => 0x7,
40
+ 4 => 0xf,
41
+ 5 => 0x1f,
42
+ 6 => 0x3f,
43
+ 7 => 0x7f,
44
+ 8 => 0xff,
45
+ 9 => 0x1ff,
46
+ 10 => 0x3ff,
47
+ 11 => 0x7ff,
48
+ 12 => 0xfff,
49
+ 13 => 0x1fff,
50
+ 14 => 0x3fff,
51
+ 15 => 0x7fff,
52
+ 16 => 0xffff,
53
+ 17 => 0x1ffff,
54
+ 18 => 0x3ffff,
55
+ 19 => 0x7ffff,
56
+ 20 => 0xfffff,
57
+ 21 => 0x1fffff,
58
+ 22 => 0x3fffff,
59
+ 23 => 0x7fffff,
60
+ 24 => 0xffffff,
61
+ 25 => 0x1ffffff,
62
+ 26 => 0x3ffffff,
63
+ 27 => 0x7ffffff,
64
+ 28 => 0xfffffff,
65
+ 29 => 0x1fffffff,
66
+ 30 => 0x3fffffff,
67
+ 31 => 0x7fffffff,
68
+ 32 => 0xffffffff,
69
+ 33 => 0x1ffffffff,
70
+ 34 => 0x3ffffffff,
71
+ 35 => 0x7ffffffff,
72
+ 36 => 0xfffffffff,
73
+ 37 => 0x1fffffffff,
74
+ 38 => 0x3fffffffff,
75
+ 39 => 0x7fffffffff,
76
+ 40 => 0xffffffffff,
77
+ 41 => 0x1ffffffffff,
78
+ 42 => 0x3ffffffffff,
79
+ 43 => 0x7ffffffffff,
80
+ 44 => 0xfffffffffff,
81
+ 45 => 0x1fffffffffff,
82
+ 46 => 0x3fffffffffff,
83
+ 47 => 0x7fffffffffff,
84
+ 48 => 0xffffffffffff,
85
+ 49 => 0x1ffffffffffff,
86
+ 50 => 0x3ffffffffffff,
87
+ 51 => 0x7ffffffffffff,
88
+ 52 => 0xfffffffffffff,
89
+ 53 => 0x1fffffffffffff,
90
+ 54 => 0x3fffffffffffff,
91
+ 55 => 0x7fffffffffffff,
92
+ 56 => 0xffffffffffffff,
93
+ 57 => 0x1ffffffffffffff,
94
+ 58 => 0x3ffffffffffffff,
95
+ 59 => 0x7ffffffffffffff,
96
+ 60 => 0xfffffffffffffff,
97
+ 61 => 0x1fffffffffffffff,
98
+ 62 => 0x3fffffffffffffff,
99
+ 63 => 0x7fffffffffffffff,
100
+ 64 => 0xffffffffffffffff
101
+ }
102
+
103
+ if (v = @@mask[m])
104
+ return v
105
+ end
106
+
107
+ # Compute it for crazy values.
108
+
109
+ r = 0
110
+ 0.upto(m-1) {|q| r |= (1 << q)}
111
+ return r
112
+ end
113
+ end
114
+
115
+ def self.included(klass)
116
+ klass.extend(ClassMethods)
117
+ end
118
+ end
119
+ include IntegerExtensions
120
+ end
@@ -0,0 +1,113 @@
1
+ require 'ipaddr'
2
+
3
+ class IPAddr
4
+ attr_reader :mask_addr
5
+
6
+ module IPAddrExtensions
7
+
8
+ # make an IP address take the int32 value provided
9
+ def set_int(ip)
10
+ set(ip, Socket::AF_INET)
11
+ end
12
+
13
+ # randomize the "host" part of the IP address (destructive)
14
+ def random(mask=0xFFFFFFFF)
15
+ r = rand(0xFFFFFFFF) & mask
16
+ i = self.to_i & (~mask)
17
+ self.set_int(i | r)
18
+ end
19
+
20
+ alias_method :random!, :random
21
+
22
+ # convert a string to IP
23
+ def inet_addr(str)
24
+ in_addr(str)
25
+ end
26
+
27
+ module ClassMethods
28
+ # construct an IPAddr from a dotted quad string or integer
29
+ def inet_addr(str)
30
+ if str.kind_of? String
31
+ IPAddr.lite(str).to_i
32
+ else
33
+ i = IPAddr.new(0, Socket::AF_INET)
34
+ i.set_int(str)
35
+ return i
36
+ end
37
+ end
38
+
39
+ # construct an IPAddr from a dotted quad string without
40
+ # incurring a reverse lookup.
41
+ def lite(str)
42
+ ip = IPAddr.new(0, Socket::AF_INET)
43
+
44
+ parts = str.split "/"
45
+
46
+ ip.set_int(ip.inet_addr(parts[0]))
47
+ ip = ip.mask parts[1] if parts[1]
48
+ return ip
49
+ end
50
+
51
+ # Convert 255.255.255.0 to 24
52
+ def mask2mlen(mask)
53
+ len = 0
54
+ while len < 32 && mask & 0x80000000 != 0
55
+ mask <<= 1
56
+ mask &= 0xFFFFFFFF
57
+ len += 1
58
+ end
59
+ return len
60
+ end
61
+ end
62
+
63
+ def self.included(klass)
64
+ klass.extend(ClassMethods)
65
+ end
66
+
67
+ # to_s with a cidr prefix at the end
68
+ def to_cidr_s
69
+ "#{ to_s }/#{ self.class.mask2mlen(@mask_addr) }"
70
+ end
71
+
72
+ # get the mask length
73
+ def to_mlen
74
+ mask = self.to_i
75
+ self.class.mask2mlen(mask)
76
+ end
77
+
78
+
79
+ # get the highest address in the range defined by the netmask
80
+ def top
81
+ IPAddr.inet_addr(self.to_i | (0xFFFFFFFF & (~self.mask_addr)))
82
+ end
83
+
84
+ # get the lowest address in the range defined by the netmask
85
+ def bottom
86
+ IPAddr.inet_addr(self.to_i & self.mask_addr)
87
+ end
88
+
89
+ # get a random address from within the range defined by the
90
+ # netmask.
91
+ def choice
92
+ return self.clone if self.mask_addr == 0xFFFFFFFF
93
+
94
+ span = self.top.to_i - self.bottom.to_i
95
+ x = self.clone
96
+ x.set_int(self.bottom.to_i + rand(span))
97
+ return x
98
+ end
99
+
100
+ # test if the address provided is in the range defined by the
101
+ # netmask
102
+ def contains(i)
103
+ if not i.kind_of? IPAddr
104
+ i = IPAddr.inet_addr i
105
+ end
106
+
107
+ i.to_i >= self.bottom.to_i and i.to_i <= self.top.to_i
108
+ end
109
+
110
+ alias_method :contains?, :contains
111
+ end
112
+ include IPAddrExtensions
113
+ end
@@ -0,0 +1,29 @@
1
+ require 'irb'
2
+
3
+ module IRB
4
+ # Lifted from http://errtheblog.com/posts/9-drop-to-irb
5
+ # Starts an IRB session with a specific binding. To use type:
6
+ # IRB.start_session(binding)
7
+ def self.start_session(binding)
8
+ IRB.setup(nil)
9
+
10
+ workspace = WorkSpace.new(binding)
11
+
12
+ if @CONF[:SCRIPT]
13
+ irb = Irb.new(workspace, @CONF[:SCRIPT])
14
+ else
15
+ irb = Irb.new(workspace)
16
+ end
17
+
18
+ @CONF[:IRB_RC].call(irb.context) if @CONF[:IRB_RC]
19
+ @CONF[:MAIN_CONTEXT] = irb.context
20
+
21
+ trap("SIGINT") do
22
+ irb.signal_handle
23
+ end
24
+
25
+ catch(:IRB_EXIT) do
26
+ irb.eval_input
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,6 @@
1
+ module Math
2
+ # Ick. Why isn't this in the standard library? Ick.
3
+ def log2(x); log(x) / log(2); end
4
+ module_function :log2
5
+ end
6
+
@@ -0,0 +1,67 @@
1
+ class Module
2
+ module ModuleExtensions
3
+ def to_name_hash
4
+ @name_hash ||= constants.map {|k| [k.intern, const_get(k.intern)]}.to_hash
5
+ end
6
+
7
+ def to_key_hash
8
+ @key_hash ||= constants.map {|k| [const_get(k.intern), k.intern]}.to_hash
9
+ end
10
+
11
+ def flag_dump(i)
12
+ @bit_map ||= constants.map do |k|
13
+ [k, const_get(k.intern).ffs]
14
+ end.sort {|x, y| x[1] <=> y[1]}
15
+
16
+ last = 0
17
+ r = ""
18
+ @bit_map.each do |tup|
19
+ if((v = (tup[1] - last)) > 1)
20
+ r << ("." * (v-1))
21
+ end
22
+
23
+ if((i & (1 << tup[1])) != 0)
24
+ r << tup[0][0].chr
25
+ else
26
+ r << tup[0][0].chr.downcase
27
+ end
28
+ last = tup[1]
29
+ end
30
+ return r.reverse
31
+ end
32
+
33
+ # When the base class method just returns nil
34
+ def stub(*args)
35
+ opts = {}
36
+ if args[-1].kind_of? Hash
37
+ opts = args[-1]
38
+ args = args[0..-2]
39
+ end
40
+
41
+ args.each do |meth|
42
+ class_def(meth) do |*a|; nil; end
43
+ end
44
+ end
45
+
46
+ # Dynamically create instance methods
47
+ def class_def(name, &blk)
48
+ class_eval { define_method name, &blk }
49
+ end
50
+
51
+ module ClassMethods
52
+ # like const_get, but doesn't raise exception if sym not found.
53
+ def const_find(sym)
54
+ begin
55
+ const_get(sym)
56
+ rescue
57
+ nil
58
+ end
59
+ end
60
+ end
61
+
62
+ def self.included(klass)
63
+ klass.extend ClassMethods
64
+ end
65
+ end
66
+ include ModuleExtensions
67
+ end
@@ -0,0 +1,12 @@
1
+ class Numeric
2
+ module NumericExtensions
3
+ # This HAS TO BE in the library somewhere already, but: give a fixnum,
4
+ # cap it at some number (ie, max(x, y) -> x). 10.cap(9) => 9.
5
+ def cap(limit); self > limit ? limit : self; end
6
+
7
+ # shortcut for packing a single number...
8
+ def pack(arg) ; [self].pack(arg) ; end
9
+
10
+ end
11
+ include NumericExtensions
12
+ end
@@ -0,0 +1,33 @@
1
+ class Object
2
+ module ObjectExtensions
3
+ # don't need these if we're using 1.9
4
+ if not Object::RUBY_FRAMEWORK_VERSION == "1.9"
5
+ # Every object has a "singleton" class, which you can think
6
+ # of as the class (ie, 1.metaclass =~ Fixnum) --- but that you
7
+ # can modify and extend without fucking up the actual class.
8
+
9
+ def metaclass; class << self; self; end; end
10
+ def meta_eval(&blk) metaclass.instance_eval &blk; end
11
+ def meta_def(name, &blk) meta_eval { define_method name, &blk }; end
12
+ def try(meth, *args); send(meth, *args) if respond_to? meth; end
13
+
14
+ def through(meth, *args)
15
+ if respond_to? meth
16
+ send(meth, *args)
17
+ else
18
+ self
19
+ end
20
+ end
21
+ end
22
+
23
+ def pbpaste
24
+ `pbpaste`
25
+ end if RUBY_PLATFORM =~ /darwin/
26
+
27
+ ## This is from Topher Cyll's Stupd IRB tricks
28
+ def mymethods
29
+ (self.methods - self.class.superclass.methods).sort
30
+ end
31
+ end
32
+ include ObjectExtensions
33
+ end