rdoba 0.0.3 → 0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +43 -0
- data/CHANGES.md +28 -0
- data/Gemfile +2 -11
- data/{LICENSE.txt → LICENSE} +0 -0
- data/README.md +410 -0
- data/Rakefile +1 -51
- data/lib/rdoba/a.rb +114 -0
- data/lib/rdoba/combinations.rb +59 -0
- data/lib/rdoba/common.rb +190 -0
- data/lib/rdoba/debug.rb +48 -0
- data/lib/rdoba/deploy.rb +80 -0
- data/lib/rdoba/dup.rb +64 -0
- data/lib/rdoba/fenc.rb +17 -0
- data/lib/rdoba/hashorder.rb +66 -0
- data/lib/rdoba/io.rb +160 -0
- data/lib/rdoba/numeric.rb +93 -0
- data/lib/rdoba/re.rb +22 -0
- data/lib/rdoba/require.rb +62 -0
- data/lib/rdoba/roman.rb +45 -0
- data/lib/rdoba/strings.rb +149 -0
- data/lib/rdoba/version.rb +3 -0
- data/lib/rdoba/yaml.rb +48 -0
- data/lib/rdoba.rb +13 -1142
- data/rdoba.gemspec +18 -56
- metadata +38 -59
- data/README.rdoc +0 -19
- data/VERSION +0 -1
@@ -0,0 +1,93 @@
|
|
1
|
+
#!/usr/bin/ruby -KU
|
2
|
+
#<Encoding:UTF-8>
|
3
|
+
|
4
|
+
require 'rdoba/common'
|
5
|
+
require 'rdoba/strings'
|
6
|
+
|
7
|
+
class String
|
8
|
+
alias :_rdoba_to_i :to_i
|
9
|
+
def to_i(base = 10, *opts)
|
10
|
+
v = parse_opts(opts)
|
11
|
+
if v[:be]
|
12
|
+
(str, sign, num) = (self.match /\s*(-?)([0-9a-fx]+)/u).to_a
|
13
|
+
if str
|
14
|
+
n = num.reverse._rdoba_to_i(base)
|
15
|
+
sign.empty? && n || -n
|
16
|
+
else
|
17
|
+
0
|
18
|
+
end
|
19
|
+
else
|
20
|
+
_rdoba_to_i(base)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class Fixnum
|
26
|
+
alias :_rdoba_to_s :to_s
|
27
|
+
def to_s(base = 10, *opts)
|
28
|
+
v = parse_opts(opts)
|
29
|
+
|
30
|
+
return _rdoba_to_s(base) unless v[:padding] or v[:style_formatting]
|
31
|
+
|
32
|
+
raise "Base of number can't be equal or less then zero" if base <= 0
|
33
|
+
raise "Padding count numberr can't be equal or less then zero" if v[:padding] <= 0
|
34
|
+
value = self
|
35
|
+
minus = if value < 0
|
36
|
+
value = -value
|
37
|
+
true
|
38
|
+
end
|
39
|
+
res = ''
|
40
|
+
while value != 0
|
41
|
+
value, rem = value.divmod(base)
|
42
|
+
rem += 0x40 - 0x39 if rem >= 10
|
43
|
+
res += (0x30 + rem).chr
|
44
|
+
end
|
45
|
+
res += "0" * (v[:padding].to_i - res.size) if res.size < v[:padding].to_i
|
46
|
+
res += 'x0' if v[:style_formatting] and base == 16
|
47
|
+
res += '-' if minus
|
48
|
+
res.reverse
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
class Numeric
|
53
|
+
def to_p(*opts)
|
54
|
+
v = parse_opts(opts)
|
55
|
+
|
56
|
+
value = self
|
57
|
+
minus = if value < 0
|
58
|
+
value = -value
|
59
|
+
true
|
60
|
+
end
|
61
|
+
res = ''
|
62
|
+
while value != 0
|
63
|
+
value, rem = value.divmod(256)
|
64
|
+
res += rem.chr
|
65
|
+
end
|
66
|
+
|
67
|
+
pad_char = if minus
|
68
|
+
negres += ''
|
69
|
+
over = 1
|
70
|
+
res.each_byte do |byte|
|
71
|
+
negbyte = 255 - byte + over
|
72
|
+
negres += if negbyte > 255
|
73
|
+
over = 1
|
74
|
+
0
|
75
|
+
else
|
76
|
+
over = 0
|
77
|
+
negbyte
|
78
|
+
end
|
79
|
+
end
|
80
|
+
res = negres
|
81
|
+
"\xFF"
|
82
|
+
else
|
83
|
+
"\0"
|
84
|
+
end
|
85
|
+
|
86
|
+
res += pad_char * (v[:padding].to_i - res.size) if res.size < v[:padding].to_i
|
87
|
+
|
88
|
+
plain = (v[:be] ? res.reverse(String::ByteByByte) : res).to_p
|
89
|
+
plain
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
|
data/lib/rdoba/re.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
#!/usr/bin/ruby -KU
|
2
|
+
#<Encoding:UTF-8>
|
3
|
+
|
4
|
+
class String
|
5
|
+
def to_res
|
6
|
+
ostr = self.dup
|
7
|
+
res = ''
|
8
|
+
while true
|
9
|
+
m = ostr.match(/(?:([+\[\]\\().*?{}^$\/|])|«([^«]*)»)/u)
|
10
|
+
break unless m
|
11
|
+
res += m.pre_match + (m[2] || m[1] && ('\\' + m[1]))
|
12
|
+
ostr = m.post_match
|
13
|
+
end
|
14
|
+
|
15
|
+
res + ostr
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_re
|
19
|
+
/#{to_res}/ui
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
@@ -0,0 +1,62 @@
|
|
1
|
+
#!/usr/bin/ruby -KU
|
2
|
+
#<Encoding:UTF-8>
|
3
|
+
|
4
|
+
require 'rdoba/common'
|
5
|
+
require 'rdoba/debug'
|
6
|
+
|
7
|
+
module Kernel
|
8
|
+
private
|
9
|
+
def require_dir(dir, name)
|
10
|
+
dbp11 "[require_dir] <<< dir = #{dir}, name = #{name}"
|
11
|
+
begin
|
12
|
+
rdir = File.join(dir, name)
|
13
|
+
return false unless File.directory?(rdir)
|
14
|
+
rdir = File.join(dir, name)
|
15
|
+
$: << rdir unless $:.include?(rdir)
|
16
|
+
dbp14 "[require_dir]> Found dir #{rdir}"
|
17
|
+
Dir.foreach(rdir) do |file|
|
18
|
+
next unless file =~ /(.*)\.(rb|so)$/
|
19
|
+
dbp14 "[require_dir]> Loading ... #{$1}"
|
20
|
+
require $1
|
21
|
+
end
|
22
|
+
true
|
23
|
+
rescue
|
24
|
+
false
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def sub_require(name)
|
29
|
+
dbp11 "[sub_require] <<< name = #{name} "
|
30
|
+
$:.each do |dir|
|
31
|
+
begin
|
32
|
+
Dir.foreach(dir) do |file|
|
33
|
+
next unless file =~ /^#{name}\.(rb|so)$/
|
34
|
+
dbp14 "[sub_require]> Require Dir #{dir}/#{name} for #{file}"
|
35
|
+
r1 = require_dir(dir, name + '.modules')
|
36
|
+
r2 = require_dir(dir, name)
|
37
|
+
dbp14 "[sub_require]> Require Dir #{(r1 || r2) && 'passed' || 'failed'} ... #{name}"
|
38
|
+
end
|
39
|
+
rescue
|
40
|
+
end
|
41
|
+
end unless $".include?(name)
|
42
|
+
true
|
43
|
+
end
|
44
|
+
|
45
|
+
public
|
46
|
+
|
47
|
+
alias :__require__ :require
|
48
|
+
def require(name, *opts)
|
49
|
+
v = parse_opts(opts)
|
50
|
+
dbp11 "[require] <<< name = #{name}"
|
51
|
+
begin
|
52
|
+
res = __require__ name
|
53
|
+
rescue => bang
|
54
|
+
puts "Lib internal error: #{$!.class} -> #{$!}\n\t#{$@.join("\n\t")}"
|
55
|
+
exit
|
56
|
+
end
|
57
|
+
dbp14 "[require]> Loaded? #{name}... #{res}"
|
58
|
+
res = sub_require(name) if res and v[:recursive]
|
59
|
+
res
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
data/lib/rdoba/roman.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
#!/usr/bin/ruby -KU
|
2
|
+
|
3
|
+
class Numeric
|
4
|
+
Roman = { 1 => 'I', 4 => 'IV', 5 => 'V', 9 => 'IX', 10 => 'X', 40 => 'XL', 50 => 'L',
|
5
|
+
90 => 'XC', 100 => 'C', 400 => 'CD', 500 => 'D', 900 => 'CM', 1000 => 'M' }
|
6
|
+
Romani = Roman.keys.sort
|
7
|
+
|
8
|
+
def to_rom
|
9
|
+
res = ''
|
10
|
+
num = self
|
11
|
+
i = Romani.size - 1
|
12
|
+
|
13
|
+
while num > 0
|
14
|
+
if num >= Romani[i]
|
15
|
+
res << Roman[Romani[i]]
|
16
|
+
num -= Romani[i]
|
17
|
+
else
|
18
|
+
i -= 1
|
19
|
+
end
|
20
|
+
end
|
21
|
+
res
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
class String
|
27
|
+
def rom
|
28
|
+
h = Numeric::Roman.reverse
|
29
|
+
keys = h.keys.sort do |x,y| x.size < y.size ? 1 : x.size > y.size ? -1 : x <=> y end
|
30
|
+
str = self.upcase
|
31
|
+
res = 0
|
32
|
+
while str and not str.empty?
|
33
|
+
raise "Invalid roman number" if (keys.each do |key|
|
34
|
+
if str =~ /^#{key}(.*)/
|
35
|
+
str = $1
|
36
|
+
res += h[key]
|
37
|
+
break nil
|
38
|
+
end
|
39
|
+
end)
|
40
|
+
end
|
41
|
+
res
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
|
@@ -0,0 +1,149 @@
|
|
1
|
+
#!/usr/bin/ruby -KU
|
2
|
+
#<Encoding:UTF-8>
|
3
|
+
|
4
|
+
class String
|
5
|
+
|
6
|
+
def self.upcase(char)
|
7
|
+
chr = char.class == String ? char.ord : char.to_i
|
8
|
+
if chr >= 0x430 and chr < 0x450
|
9
|
+
chr -= 0x20
|
10
|
+
elsif chr >= 0x410 and chr < 0x430
|
11
|
+
elsif chr >= 0x400 and chr < 0x410 or
|
12
|
+
chr >= 0x450 and chr < 0x482 or
|
13
|
+
chr >= 0x48A and chr < 0x524 or
|
14
|
+
chr >= 0xA642 and chr < 0xA668 or
|
15
|
+
chr >= 0xA680 and chr < 0xA698
|
16
|
+
chr -= 1 if (chr % 1) == 1
|
17
|
+
else
|
18
|
+
return chr.chr.__upcase__
|
19
|
+
end
|
20
|
+
chr.chr
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.downcase(char)
|
24
|
+
chr = (char.class == String) ? char.ord : char.to_i
|
25
|
+
if chr >= 0x410 and chr < 0x430
|
26
|
+
chr += 0x20
|
27
|
+
elsif chr >= 0x430 and chr < 0x450
|
28
|
+
elsif chr >= 0x400 and chr < 0x410 or
|
29
|
+
chr >= 0x450 and chr < 0x482 or
|
30
|
+
chr >= 0x48A and chr < 0x524 or
|
31
|
+
chr >= 0xA642 and chr < 0xA668 or
|
32
|
+
chr >= 0xA680 and chr < 0xA698
|
33
|
+
chr += 1 if (chr % 1) == 0
|
34
|
+
else
|
35
|
+
return chr.chr.__downcase__
|
36
|
+
end
|
37
|
+
chr.chr
|
38
|
+
end
|
39
|
+
|
40
|
+
if RUBY_VERSION < '1.9'
|
41
|
+
|
42
|
+
alias :setbyte :[]=
|
43
|
+
|
44
|
+
def encoding
|
45
|
+
'UTF-8'
|
46
|
+
end
|
47
|
+
|
48
|
+
def force_encoding(*args)
|
49
|
+
self
|
50
|
+
end
|
51
|
+
|
52
|
+
def ord
|
53
|
+
a = nil
|
54
|
+
self.each_byte do |b|
|
55
|
+
c = b & 0xC0
|
56
|
+
case c
|
57
|
+
when 0xc0
|
58
|
+
a = (b & 0x3F)
|
59
|
+
when 0x80
|
60
|
+
return (a << 6) + (b & 0x3F)
|
61
|
+
else
|
62
|
+
return b
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
FirstChar = 0
|
70
|
+
alias :__upcase__ :upcase
|
71
|
+
def upcase(option = nil)
|
72
|
+
if option == FirstChar
|
73
|
+
r = self.dup
|
74
|
+
r[0] = String.upcase(self.ord)
|
75
|
+
r
|
76
|
+
elsif self.match(/[Ѐ-ҁҊ-ԣꙀ-ꙧꚀꚗ]/u)
|
77
|
+
self.unpack('U*').map do |chr| String.upcase(chr) end.join
|
78
|
+
else; __upcase__ end
|
79
|
+
end
|
80
|
+
|
81
|
+
alias :__downcase__ :downcase
|
82
|
+
def downcase(option = nil)
|
83
|
+
if option == FirstChar
|
84
|
+
r = self.dup
|
85
|
+
r[0] = String.downcase(self.ord)
|
86
|
+
r
|
87
|
+
elsif self.match(/[Ѐ-ҁҊ-ԣꙀ-ꙧꚀꚗ]/u)
|
88
|
+
self.unpack('U*').map do |chr| String.downcase(chr) end.join
|
89
|
+
else; __downcase__ end
|
90
|
+
end
|
91
|
+
|
92
|
+
alias :to_p :to_s
|
93
|
+
|
94
|
+
ByteByByte = 0
|
95
|
+
alias :__reverse__ :reverse
|
96
|
+
def reverse(step = 1)
|
97
|
+
case step
|
98
|
+
when ByteByByte
|
99
|
+
arr = []
|
100
|
+
self.each_byte do |byte| arr << byte.chr end
|
101
|
+
arr.reverse.join
|
102
|
+
when 1
|
103
|
+
__reverse__
|
104
|
+
else
|
105
|
+
res = ''
|
106
|
+
offset = (self.size + 1) / step * step - step
|
107
|
+
(0..offset).step(step) do |shift|
|
108
|
+
res += self[offset - shift..offset - shift + 1]
|
109
|
+
end
|
110
|
+
res
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def compare_to(value, opts = {} )
|
115
|
+
if opts == :ignore_diacritics or
|
116
|
+
(opts.class == Hash and opts.key? :ignore_diacritics)
|
117
|
+
# TODO verify composite range
|
118
|
+
def crop_diacritics(x)
|
119
|
+
(x < 0x300 or
|
120
|
+
x > 0x36f and x < 0x483 or
|
121
|
+
x > 0x487 and x < 0xa67c or
|
122
|
+
x > 0xa67d) && x || nil
|
123
|
+
end
|
124
|
+
|
125
|
+
(self.unpack('U*').map do |x| crop_diacritics(x)
|
126
|
+
end.compact) <=> (value.unpack('U*').map do |x| crop_diacritics(x)
|
127
|
+
end.compact)
|
128
|
+
else
|
129
|
+
self <=> value
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
class Fixnum
|
135
|
+
alias :__chr__ :chr
|
136
|
+
def chr
|
137
|
+
if self >= 256
|
138
|
+
num = self; s = "\0"; byte = 0x80; a = []
|
139
|
+
while num >= 0x40
|
140
|
+
s.setbyte(0, byte + (num & 0x3F))
|
141
|
+
a << s.dup; num >>= 6; byte = 0x40
|
142
|
+
end
|
143
|
+
s.setbyte(0, 0xC0 + (num & 0x3F))
|
144
|
+
a << s
|
145
|
+
a.reverse.join.force_encoding('UTF-8')
|
146
|
+
else; __chr__ end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
data/lib/rdoba/yaml.rb
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
require 'rdoba/common'
|
4
|
+
|
5
|
+
class Object
|
6
|
+
def to_yml( o = {} )
|
7
|
+
level = o[:level] || 0
|
8
|
+
res = ''
|
9
|
+
res += '---' if level == 0
|
10
|
+
res += case self.class.to_sym
|
11
|
+
when :Hash
|
12
|
+
rs = ''
|
13
|
+
self.keys.sort do |x,y|
|
14
|
+
(ix, iy) = o[:order] ? [ o[:order].index(x), o[:order].index(y) ] : [ nil, nil ]
|
15
|
+
(ix and iy) ? ix <=> iy : (ix ? -1 : (iy ? 1 : x <=> y))
|
16
|
+
end.each do |key|
|
17
|
+
value = self[key]
|
18
|
+
rs += "\n" + ' ' * level * 2 + key.to_yml( { :level => level + 1, :order => o[:order] } )
|
19
|
+
rs += ': ' + value.to_yml( { :level => level + 1, :order => o[:order] } )
|
20
|
+
end
|
21
|
+
rs.empty? and "{}" or rs
|
22
|
+
when :Array
|
23
|
+
rs = ''
|
24
|
+
self.each do |value|
|
25
|
+
rs += "\n" + ' ' * level * 2 + '- ' + value.to_yml( { :level => level + 1, :order => o[:order] } )
|
26
|
+
end
|
27
|
+
rs.empty? and "[]" or rs
|
28
|
+
when :Fixnum
|
29
|
+
self.to_s
|
30
|
+
when :String
|
31
|
+
if self =~ /^["'\-:!#={}\[\]~]/ or self =~ /\s+$/ or self =~ /:\s/
|
32
|
+
if self.count("'") < self.count('"')
|
33
|
+
"'#{self.gsub("'","\\'")}'"
|
34
|
+
else
|
35
|
+
"\"#{self.gsub('"','\"')}\""
|
36
|
+
end
|
37
|
+
else
|
38
|
+
self
|
39
|
+
end
|
40
|
+
when :NilClass
|
41
|
+
''
|
42
|
+
else
|
43
|
+
$stderr.puts "Unsupported class #{self.class} to export to yml"; ''
|
44
|
+
end
|
45
|
+
res
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|