ruby-nuggets 0.9.1 → 0.9.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README +4 -5
- data/Rakefile +7 -9
- data/lib/nuggets/ansicolor2css.rb +125 -0
- data/lib/nuggets/cli.rb +240 -0
- data/lib/nuggets/content_type.rb +103 -0
- data/lib/nuggets/dotted_decimal.rb +78 -0
- data/lib/nuggets/i18n.rb +165 -0
- data/lib/nuggets/lazy_attr.rb +45 -0
- data/lib/nuggets/log_parser/apache.rb +102 -0
- data/lib/nuggets/log_parser/rails.rb +220 -0
- data/lib/nuggets/log_parser.rb +71 -0
- data/lib/nuggets/midos.rb +130 -0
- data/lib/nuggets/mysql.rb +209 -0
- data/lib/nuggets/pluggable.rb +92 -0
- data/lib/nuggets/ruby.rb +348 -0
- data/lib/nuggets/util/ansicolor2css.rb +3 -126
- data/lib/nuggets/util/cli.rb +3 -241
- data/lib/nuggets/util/content_type.rb +3 -104
- data/lib/nuggets/util/dotted_decimal.rb +3 -77
- data/lib/nuggets/util/i18n.rb +3 -166
- data/lib/nuggets/util/lazy_attr.rb +3 -44
- data/lib/nuggets/util/log_parser/apache.rb +3 -105
- data/lib/nuggets/util/log_parser/rails.rb +3 -223
- data/lib/nuggets/util/log_parser.rb +3 -72
- data/lib/nuggets/util/midos.rb +4 -0
- data/lib/nuggets/util/mysql.rb +3 -210
- data/lib/nuggets/util/pluggable.rb +3 -93
- data/lib/nuggets/util/ruby.rb +3 -347
- data/lib/nuggets/version.rb +1 -1
- metadata +19 -7
- data/lib/nuggets/util/added_methods/init.rb +0 -3
- data/lib/nuggets/util/added_methods.rb +0 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 253d8874e5b94ce688f3b97a0e41a52a0397e2bb
|
4
|
+
data.tar.gz: 7901cb5cfc2138f3b3fe22c692b7ecb74299692e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d5630b19a59b8a25f4421b8525f419bdc5c98807358074f5f665c934ec96e2eccc8ead5277a1f0d23b321e273ab68c33911aaac1e08d2d2c9828203c6497ba32
|
7
|
+
data.tar.gz: 520a5f92d9011a4ea1089315f0109ba002e2379320786b0d6332092e9ffe23847351489c6749f81fecff4a0b5fff3cec0ffcc9de12176632ea2c436bd6bbf28c
|
data/README
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
== VERSION
|
4
4
|
|
5
|
-
This documentation refers to ruby-nuggets version 0.9.
|
5
|
+
This documentation refers to ruby-nuggets version 0.9.2
|
6
6
|
|
7
7
|
|
8
8
|
== DESCRIPTION
|
@@ -34,10 +34,9 @@ cause other libraries to misbehave. Use at your own risk!
|
|
34
34
|
== LINKS
|
35
35
|
|
36
36
|
<b></b>
|
37
|
-
Documentation::
|
38
|
-
Source code::
|
39
|
-
|
40
|
-
RubyGem:: http://rubygems.org/gems/ruby-nuggets
|
37
|
+
Documentation:: http://blackwinter.github.com/ruby-nuggets
|
38
|
+
Source code:: http://github.com/blackwinter/ruby-nuggets
|
39
|
+
RubyGem:: http://rubygems.org/gems/ruby-nuggets
|
41
40
|
|
42
41
|
|
43
42
|
== AUTHORS
|
data/Rakefile
CHANGED
@@ -4,16 +4,14 @@ begin
|
|
4
4
|
require 'hen'
|
5
5
|
|
6
6
|
Hen.lay! {{
|
7
|
-
:rubyforge => {
|
8
|
-
:project => %q{prometheus},
|
9
|
-
:package => %q{ruby-nuggets}
|
10
|
-
},
|
11
|
-
|
12
7
|
:gem => {
|
13
|
-
:
|
14
|
-
:
|
15
|
-
:
|
16
|
-
:
|
8
|
+
:name => %q{ruby-nuggets},
|
9
|
+
:version => Nuggets::VERSION,
|
10
|
+
:summary => %q{Some extensions to the Ruby programming language.},
|
11
|
+
:author => %q{Jens Wille},
|
12
|
+
:email => %q{jens.wille@gmail.com},
|
13
|
+
:homepage => :blackwinter,
|
14
|
+
:dependencies => %w[]
|
17
15
|
}
|
18
16
|
}}
|
19
17
|
rescue LoadError => err
|
@@ -0,0 +1,125 @@
|
|
1
|
+
#--
|
2
|
+
###############################################################################
|
3
|
+
# #
|
4
|
+
# A component of ruby-nuggets, some extensions to the Ruby programming #
|
5
|
+
# language. #
|
6
|
+
# #
|
7
|
+
# Copyright (C) 2007-2011 Jens Wille #
|
8
|
+
# #
|
9
|
+
# Authors: #
|
10
|
+
# Jens Wille <jens.wille@gmail.com> #
|
11
|
+
# #
|
12
|
+
# ruby-nuggets is free software; you can redistribute it and/or modify it #
|
13
|
+
# under the terms of the GNU Affero General Public License as published by #
|
14
|
+
# the Free Software Foundation; either version 3 of the License, or (at your #
|
15
|
+
# option) any later version. #
|
16
|
+
# #
|
17
|
+
# ruby-nuggets is distributed in the hope that it will be useful, but WITHOUT #
|
18
|
+
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
|
19
|
+
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License #
|
20
|
+
# for more details. #
|
21
|
+
# #
|
22
|
+
# You should have received a copy of the GNU Affero General Public License #
|
23
|
+
# along with ruby-nuggets. If not, see <http://www.gnu.org/licenses/>. #
|
24
|
+
# #
|
25
|
+
###############################################################################
|
26
|
+
#++
|
27
|
+
|
28
|
+
module Nuggets
|
29
|
+
module ANSIColor2CSS
|
30
|
+
|
31
|
+
extend self
|
32
|
+
|
33
|
+
ATTRIBUTES = {
|
34
|
+
'0' => nil, # clear
|
35
|
+
'1' => 'font-weight: bold', # bold
|
36
|
+
'2' => '', # dark
|
37
|
+
'3' => 'font-style: italic', # italic -- not widely implemented
|
38
|
+
'4' => 'text-decoration: underline', # underline
|
39
|
+
'5' => 'text-decoration: blink', # blink
|
40
|
+
'6' => 'text-decoration: blink', # rapid blink -- not widely implemented
|
41
|
+
'7' => '', # reverse
|
42
|
+
'8' => 'opacity: 0', # concealed
|
43
|
+
'9' => 'text-decoration: line-through', # strikethrough -- not widely implemented
|
44
|
+
'22' => 'font-weight: normal', # bold off
|
45
|
+
'23' => 'font-style: normal', # italic off
|
46
|
+
'24' => 'text-decoration: none', # underline off
|
47
|
+
'25' => 'text-decoration: none', # blink off
|
48
|
+
'27' => '', # reverse off
|
49
|
+
'28' => 'opacity: 1', # concealed off
|
50
|
+
'29' => 'text-decoration: none', # strikethrough off
|
51
|
+
'30' => 'color: black', # black
|
52
|
+
'31' => 'color: maroon', # red
|
53
|
+
'32' => 'color: green', # green
|
54
|
+
'33' => 'color: olive', # yellow
|
55
|
+
'34' => 'color: navy', # blue
|
56
|
+
'35' => 'color: purple', # magenta
|
57
|
+
'36' => 'color: teal', # cyan
|
58
|
+
'37' => 'color: silver', # white
|
59
|
+
'39' => 'color: silver', # default (white)
|
60
|
+
'40' => 'background-color: black', # on black
|
61
|
+
'41' => 'background-color: maroon', # on red
|
62
|
+
'42' => 'background-color: green', # on green
|
63
|
+
'43' => 'background-color: olive', # on yellow
|
64
|
+
'44' => 'background-color: navy', # on blue
|
65
|
+
'45' => 'background-color: purple', # on magenta
|
66
|
+
'46' => 'background-color: teal', # on cyan
|
67
|
+
'47' => 'background-color: silver', # on white
|
68
|
+
'49' => 'background-color: black', # on default (black)
|
69
|
+
'90' => 'color: gray', # bright black
|
70
|
+
'91' => 'color: red', # bright red
|
71
|
+
'92' => 'color: lime', # bright green
|
72
|
+
'93' => 'color: yellow', # bright yellow
|
73
|
+
'94' => 'color: blue', # bright blue
|
74
|
+
'95' => 'color: fuchsia', # bright magenta
|
75
|
+
'96' => 'color: cyan', # bright cyan
|
76
|
+
'97' => 'color: white', # bright white
|
77
|
+
'100' => 'background-color: gray', # on bright black
|
78
|
+
'101' => 'background-color: red', # on bright red
|
79
|
+
'102' => 'background-color: lime', # on bright green
|
80
|
+
'103' => 'background-color: yellow', # on bright yellow
|
81
|
+
'104' => 'background-color: blue', # on bright blue
|
82
|
+
'105' => 'background-color: fuchsia', # on bright magenta
|
83
|
+
'106' => 'background-color: cyan', # on bright cyan
|
84
|
+
'107' => 'background-color: white' # on bright white
|
85
|
+
}
|
86
|
+
|
87
|
+
ATTRIBUTES_RE = ::Regexp.union(*ATTRIBUTES.keys)
|
88
|
+
|
89
|
+
DELIMITER = ';'
|
90
|
+
|
91
|
+
COLOR_RE = %r{
|
92
|
+
\e \[ ( #{ATTRIBUTES_RE} (?: #{DELIMITER} #{ATTRIBUTES_RE} )* ) m
|
93
|
+
}x
|
94
|
+
|
95
|
+
STYLE = '<span style="%s">'
|
96
|
+
CLEAR = '</span>'
|
97
|
+
|
98
|
+
def convert(string)
|
99
|
+
string.gsub(COLOR_RE) { format($1.split(DELIMITER).uniq) }
|
100
|
+
end
|
101
|
+
|
102
|
+
def format(attributes)
|
103
|
+
"#{clear(attributes)}#{style(attributes) if attributes.any?}"
|
104
|
+
end
|
105
|
+
|
106
|
+
def clear(attributes)
|
107
|
+
CLEAR if attributes.delete('0')
|
108
|
+
end
|
109
|
+
|
110
|
+
def style(attributes)
|
111
|
+
STYLE % ATTRIBUTES.values_at(*attributes).join('; ')
|
112
|
+
end
|
113
|
+
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
class String
|
118
|
+
|
119
|
+
def ansicolor2css
|
120
|
+
::Nuggets::ANSIColor2CSS.convert(self)
|
121
|
+
end
|
122
|
+
|
123
|
+
alias_method :ansicolour2css, :ansicolor2css
|
124
|
+
|
125
|
+
end
|
data/lib/nuggets/cli.rb
ADDED
@@ -0,0 +1,240 @@
|
|
1
|
+
#--
|
2
|
+
###############################################################################
|
3
|
+
# #
|
4
|
+
# A component of ruby-nuggets, some extensions to the Ruby programming #
|
5
|
+
# language. #
|
6
|
+
# #
|
7
|
+
# Copyright (C) 2007-2011 Jens Wille #
|
8
|
+
# #
|
9
|
+
# Authors: #
|
10
|
+
# Jens Wille <jens.wille@gmail.com> #
|
11
|
+
# #
|
12
|
+
# ruby-nuggets is free software; you can redistribute it and/or modify it #
|
13
|
+
# under the terms of the GNU Affero General Public License as published by #
|
14
|
+
# the Free Software Foundation; either version 3 of the License, or (at your #
|
15
|
+
# option) any later version. #
|
16
|
+
# #
|
17
|
+
# ruby-nuggets is distributed in the hope that it will be useful, but WITHOUT #
|
18
|
+
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
|
19
|
+
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License #
|
20
|
+
# for more details. #
|
21
|
+
# #
|
22
|
+
# You should have received a copy of the GNU Affero General Public License #
|
23
|
+
# along with ruby-nuggets. If not, see <http://www.gnu.org/licenses/>. #
|
24
|
+
# #
|
25
|
+
###############################################################################
|
26
|
+
#++
|
27
|
+
|
28
|
+
require 'optparse'
|
29
|
+
require 'yaml'
|
30
|
+
require 'zlib'
|
31
|
+
require 'highline'
|
32
|
+
|
33
|
+
module Nuggets
|
34
|
+
class CLI
|
35
|
+
|
36
|
+
class << self
|
37
|
+
|
38
|
+
def usage(prog)
|
39
|
+
"Usage: #{prog} [-h|--help] [options]"
|
40
|
+
end
|
41
|
+
|
42
|
+
def version
|
43
|
+
parent_const_get(:VERSION)
|
44
|
+
end
|
45
|
+
|
46
|
+
def defaults
|
47
|
+
{}
|
48
|
+
end
|
49
|
+
|
50
|
+
def execute(*args)
|
51
|
+
new.execute(*args)
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
def parent_const_get(const, range = 0...-1)
|
57
|
+
name.split('::').inject([::Object]) { |memo, name|
|
58
|
+
memo << memo.last.const_get(name)
|
59
|
+
}.reverse[range].each { |mod|
|
60
|
+
return mod.const_get(const) if mod.const_defined?(const)
|
61
|
+
}
|
62
|
+
|
63
|
+
raise ::NameError, "uninitialized constant #{self}::#{const}"
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
attr_reader :options, :config, :defaults
|
69
|
+
attr_reader :stdin, :stdout, :stderr
|
70
|
+
|
71
|
+
attr_accessor :prog
|
72
|
+
|
73
|
+
def initialize(defaults = nil, *args)
|
74
|
+
@defaults, @prog = defaults || self.class.defaults, $0
|
75
|
+
|
76
|
+
init(*args)
|
77
|
+
|
78
|
+
# prevent backtrace on ^C
|
79
|
+
trap(:INT) { exit 130 }
|
80
|
+
end
|
81
|
+
|
82
|
+
def progname
|
83
|
+
::File.basename(prog)
|
84
|
+
end
|
85
|
+
|
86
|
+
def usage
|
87
|
+
self.class.usage(prog)
|
88
|
+
end
|
89
|
+
|
90
|
+
def version
|
91
|
+
self.class.version
|
92
|
+
end
|
93
|
+
|
94
|
+
def execute(arguments = ::ARGV, *inouterr)
|
95
|
+
reset(*inouterr)
|
96
|
+
parse_options(arguments)
|
97
|
+
run(arguments)
|
98
|
+
rescue => err
|
99
|
+
raise if $VERBOSE
|
100
|
+
abort "#{err.backtrace.first}: #{err} (#{err.class})"
|
101
|
+
ensure
|
102
|
+
options.each_value { |value|
|
103
|
+
value.close if value.is_a?(::Zlib::GzipWriter)
|
104
|
+
}
|
105
|
+
end
|
106
|
+
|
107
|
+
def reset(stdin = ::STDIN, stdout = ::STDOUT, stderr = ::STDERR)
|
108
|
+
@stdin, @stdout, @stderr = stdin, stdout, stderr
|
109
|
+
@options, @config = {}, {}
|
110
|
+
end
|
111
|
+
|
112
|
+
private
|
113
|
+
|
114
|
+
def init(*args)
|
115
|
+
reset
|
116
|
+
end
|
117
|
+
|
118
|
+
def ask(question, &block)
|
119
|
+
::HighLine.new(stdin, stdout).ask(question, &block)
|
120
|
+
end
|
121
|
+
|
122
|
+
def puts(*msg)
|
123
|
+
stdout.puts(*msg)
|
124
|
+
end
|
125
|
+
|
126
|
+
def warn(*msg)
|
127
|
+
stderr.puts(*msg)
|
128
|
+
end
|
129
|
+
|
130
|
+
def quit(msg = nil, include_usage = msg != false)
|
131
|
+
out = []
|
132
|
+
|
133
|
+
out << "#{progname}: #{msg}" if msg
|
134
|
+
out << usage if include_usage
|
135
|
+
|
136
|
+
abort out.any? && out.join("\n\n")
|
137
|
+
end
|
138
|
+
|
139
|
+
def abort(msg = nil, status = 1)
|
140
|
+
warn(msg) if msg
|
141
|
+
exit(status)
|
142
|
+
end
|
143
|
+
|
144
|
+
def shut(msg = nil, status = 0)
|
145
|
+
puts(msg) if msg
|
146
|
+
exit(status)
|
147
|
+
end
|
148
|
+
|
149
|
+
def exit(status = 0)
|
150
|
+
::Kernel.exit(status)
|
151
|
+
end
|
152
|
+
|
153
|
+
def open_file_or_std(file, write = false)
|
154
|
+
if file == '-'
|
155
|
+
write ? stdout : stdin
|
156
|
+
else
|
157
|
+
gz = file =~ /\.gz\z/i
|
158
|
+
|
159
|
+
if write
|
160
|
+
gz ? ::Zlib::GzipWriter.open(file) : ::File.open(file, 'w')
|
161
|
+
else
|
162
|
+
quit "No such file: #{file}" unless ::File.readable?(file)
|
163
|
+
(gz ? ::Zlib::GzipReader : ::File).open(file)
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
def load_config(file = options[:config] || default = defaults[:config])
|
169
|
+
return unless file
|
170
|
+
|
171
|
+
if ::File.readable?(file)
|
172
|
+
@config = ::YAML.load_file(file)
|
173
|
+
else
|
174
|
+
quit "No such file: #{file}" unless default
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
def merge_config(args = [config, defaults])
|
179
|
+
args.each { |hash| hash && hash.each { |key, value|
|
180
|
+
options[key] = value unless options.has_key?(key)
|
181
|
+
} }
|
182
|
+
end
|
183
|
+
|
184
|
+
def parse_options(arguments)
|
185
|
+
option_parser.parse!(arguments)
|
186
|
+
|
187
|
+
load_config
|
188
|
+
merge_config
|
189
|
+
end
|
190
|
+
|
191
|
+
def option_parser
|
192
|
+
::OptionParser.new { |opts|
|
193
|
+
opts.banner = usage
|
194
|
+
|
195
|
+
pre_opts(opts)
|
196
|
+
|
197
|
+
opts.separator ''
|
198
|
+
opts.separator 'Options:'
|
199
|
+
|
200
|
+
opts(opts)
|
201
|
+
|
202
|
+
opts.separator ''
|
203
|
+
opts.separator 'Generic options:'
|
204
|
+
|
205
|
+
generic_opts(opts)
|
206
|
+
post_opts(opts)
|
207
|
+
}.extend(Nuggets::CLI::OptionParserExtension)
|
208
|
+
end
|
209
|
+
|
210
|
+
def pre_opts(opts)
|
211
|
+
end
|
212
|
+
|
213
|
+
def opts(opts)
|
214
|
+
end
|
215
|
+
|
216
|
+
def generic_opts(opts)
|
217
|
+
opts.on('-h', '--help', 'Print this help message and exit') {
|
218
|
+
shut opts
|
219
|
+
}
|
220
|
+
|
221
|
+
opts.on('--version', 'Print program version and exit') {
|
222
|
+
shut "#{progname} v#{version}"
|
223
|
+
}
|
224
|
+
end
|
225
|
+
|
226
|
+
def post_opts(opts)
|
227
|
+
end
|
228
|
+
|
229
|
+
module OptionParserExtension
|
230
|
+
|
231
|
+
KEY_POOL = ('A'..'Z').to_a + ('a'..'z').to_a + ('0'..'9').to_a
|
232
|
+
|
233
|
+
def keys
|
234
|
+
{ :used => keys = top.short.keys, :free => KEY_POOL - keys }
|
235
|
+
end
|
236
|
+
|
237
|
+
end
|
238
|
+
|
239
|
+
end
|
240
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
#--
|
2
|
+
###############################################################################
|
3
|
+
# #
|
4
|
+
# A component of ruby-nuggets, some extensions to the Ruby programming #
|
5
|
+
# language. #
|
6
|
+
# #
|
7
|
+
# Copyright (C) 2007-2011 Jens Wille #
|
8
|
+
# #
|
9
|
+
# Authors: #
|
10
|
+
# Jens Wille <jens.wille@gmail.com> #
|
11
|
+
# #
|
12
|
+
# ruby-nuggets is free software; you can redistribute it and/or modify it #
|
13
|
+
# under the terms of the GNU Affero General Public License as published by #
|
14
|
+
# the Free Software Foundation; either version 3 of the License, or (at your #
|
15
|
+
# option) any later version. #
|
16
|
+
# #
|
17
|
+
# ruby-nuggets is distributed in the hope that it will be useful, but WITHOUT #
|
18
|
+
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
|
19
|
+
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License #
|
20
|
+
# for more details. #
|
21
|
+
# #
|
22
|
+
# You should have received a copy of the GNU Affero General Public License #
|
23
|
+
# along with ruby-nuggets. If not, see <http://www.gnu.org/licenses/>. #
|
24
|
+
# #
|
25
|
+
###############################################################################
|
26
|
+
#++
|
27
|
+
|
28
|
+
begin
|
29
|
+
require 'rubygems'
|
30
|
+
rescue ::LoadError
|
31
|
+
end
|
32
|
+
|
33
|
+
begin
|
34
|
+
require 'filemagic/ext'
|
35
|
+
rescue ::LoadError
|
36
|
+
def File.content_type(path) # :nodoc:
|
37
|
+
nil
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
begin
|
42
|
+
require 'nuggets/uri/content_type'
|
43
|
+
rescue ::LoadError
|
44
|
+
module URI
|
45
|
+
def self.content_type(path) # :nodoc:
|
46
|
+
nil
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
begin
|
52
|
+
require 'mime/types'
|
53
|
+
rescue ::LoadError
|
54
|
+
module MIME # :nodoc:
|
55
|
+
class Types # :nodoc:
|
56
|
+
def self.of(path)
|
57
|
+
[]
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
module Nuggets
|
64
|
+
module ContentType
|
65
|
+
|
66
|
+
extend self
|
67
|
+
|
68
|
+
# call-seq:
|
69
|
+
# ContentType.of(path) => aString or +nil+
|
70
|
+
#
|
71
|
+
# Get the MIME-Type of the file living at +path+. Either by looking
|
72
|
+
# directly into the file (requires FileMagic), or, assuming +path+
|
73
|
+
# might denote a URI, by asking the web server (via OpenURI), or
|
74
|
+
# finally by just looking at the file extension (requires MIME::Types).
|
75
|
+
# Returns +nil+ in case no decision could be made.
|
76
|
+
#
|
77
|
+
# NOTE: This is really only useful with the filemagic and mime-types gems
|
78
|
+
# installed.
|
79
|
+
def of(path)
|
80
|
+
::File.content_type(path) || ::URI.content_type(path) || (
|
81
|
+
t = ::MIME::Types.of(path).first and t.content_type
|
82
|
+
)
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
# Just a short-cut to make the code read nicer...
|
89
|
+
ContentType = ::Nuggets::ContentType
|
90
|
+
|
91
|
+
if $0 == __FILE__
|
92
|
+
[
|
93
|
+
__FILE__,
|
94
|
+
'bla/blub.jpg',
|
95
|
+
'bla/blub.blob',
|
96
|
+
'http://www.google.de',
|
97
|
+
'http://blackwinter.de/misc/ww.png',
|
98
|
+
'http://blackwinter.de/misc/ww.jpg',
|
99
|
+
'http://blackwinter.de/bla/blub.blob'
|
100
|
+
].each { |f|
|
101
|
+
p [f, ::ContentType.of(f)]
|
102
|
+
}
|
103
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
#--
|
2
|
+
###############################################################################
|
3
|
+
# #
|
4
|
+
# A component of ruby-nuggets, some extensions to the Ruby programming #
|
5
|
+
# language. #
|
6
|
+
# #
|
7
|
+
# Copyright (C) 2007-2011 Jens Wille #
|
8
|
+
# #
|
9
|
+
# Authors: #
|
10
|
+
# Jens Wille <jens.wille@gmail.com> #
|
11
|
+
# #
|
12
|
+
# ruby-nuggets is free software; you can redistribute it and/or modify it #
|
13
|
+
# under the terms of the GNU Affero General Public License as published by #
|
14
|
+
# the Free Software Foundation; either version 3 of the License, or (at your #
|
15
|
+
# option) any later version. #
|
16
|
+
# #
|
17
|
+
# ruby-nuggets is distributed in the hope that it will be useful, but WITHOUT #
|
18
|
+
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
|
19
|
+
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License #
|
20
|
+
# for more details. #
|
21
|
+
# #
|
22
|
+
# You should have received a copy of the GNU Affero General Public License #
|
23
|
+
# along with ruby-nuggets. If not, see <http://www.gnu.org/licenses/>. #
|
24
|
+
# #
|
25
|
+
###############################################################################
|
26
|
+
#++
|
27
|
+
|
28
|
+
require 'nuggets/integer/to_binary_s'
|
29
|
+
|
30
|
+
class Integer
|
31
|
+
|
32
|
+
# call-seq:
|
33
|
+
# int.to_dotted_decimal => aString
|
34
|
+
#
|
35
|
+
# Converts _int_ to dotted-decimal notation.
|
36
|
+
def to_dotted_decimal
|
37
|
+
to_binary_s(32).unpack('a8' * 4).map { |s| s.to_i(2) }.join('.')
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
class String
|
43
|
+
|
44
|
+
# call-seq:
|
45
|
+
# str.from_dotted_decimal => anInteger
|
46
|
+
#
|
47
|
+
# Converts _str_ from dotted-decimal notation to integer.
|
48
|
+
def from_dotted_decimal
|
49
|
+
split('.').map { |i| i.to_i.to_binary_s(8) }.join.to_i(2)
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
class Array
|
55
|
+
|
56
|
+
def sort_by_dotted_decimal
|
57
|
+
sort_by { |i| i.split('.').map { |j| j.to_i } }
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
if $0 == __FILE__
|
63
|
+
[2294967042, 4294967040].each { |i|
|
64
|
+
p i.to_binary_s(32)
|
65
|
+
p i.to_dotted_decimal
|
66
|
+
}
|
67
|
+
|
68
|
+
puts '#' * 34
|
69
|
+
|
70
|
+
%w[77.47.161.3 196.101.53.1].each { |s|
|
71
|
+
p s
|
72
|
+
p s.from_dotted_decimal.to_binary_s(32)
|
73
|
+
}
|
74
|
+
|
75
|
+
a = %w[77.47.161.3 196.101.53.1 77.47.161.11]
|
76
|
+
p a.sort
|
77
|
+
p a.sort_by_dotted_decimal
|
78
|
+
end
|