rdoba 0.9.3 → 0.9.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/Gemfile +4 -4
- data/README.md +21 -27
- data/Rakefile +21 -19
- data/features/step_definitions/mixin_steps.rb +237 -198
- data/features/support/env.rb +26 -160
- data/features/support/mixin_support.rb +13 -9
- data/lib/rdoba/_version_.rb +3 -1
- data/lib/rdoba/a.rb +44 -42
- data/lib/rdoba/bcd.rb +43 -26
- data/lib/rdoba/blank.rb +14 -0
- data/lib/rdoba/combinations.rb +17 -15
- data/lib/rdoba/common.rb +53 -53
- data/lib/rdoba/debug.rb +7 -5
- data/lib/rdoba/deploy.rb +55 -50
- data/lib/rdoba/dup.rb +31 -31
- data/lib/rdoba/fe.rb +6 -5
- data/lib/rdoba/gem.rb +33 -29
- data/lib/rdoba/hashorder.rb +24 -24
- data/lib/rdoba/io.rb +81 -74
- data/lib/rdoba/merge.rb +16 -16
- data/lib/rdoba/mixin/time.rb +13 -7
- data/lib/rdoba/mixin/try.rb +10 -5
- data/lib/rdoba/mixin/try_1_9_0.rb +8 -3
- data/lib/rdoba/mixin/wait_if.rb +24 -18
- data/lib/rdoba/mixin.rb +363 -306
- data/lib/rdoba/numeric.rb +19 -17
- data/lib/rdoba/os.rb +127 -0
- data/lib/rdoba/re.rb +4 -4
- data/lib/rdoba/require.rb +24 -19
- data/lib/rdoba/roman.rb +47 -35
- data/lib/rdoba/strings.rb +5 -6
- data/lib/rdoba/yaml.rb +20 -18
- data/lib/rdoba.rb +53 -44
- data/rdoba.gemspec +10 -9
- metadata +44 -46
- data/features/log.feature +0 -277
- data/features/step_definitions/log_steps.rb +0 -200
- data/features/support/fulltest_as_log.rb.in +0 -143
- data/features/support/fulltest_as_self.rb.in +0 -144
- data/lib/rdoba/log.rb +0 -419
data/lib/rdoba/mixin.rb
CHANGED
@@ -1,321 +1,378 @@
|
|
1
1
|
#!/usr/bin/ruby -KU
|
2
|
-
#
|
3
|
-
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
4
|
class String
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
# TODO: obsolete
|
6
|
+
ByteByByte = 0
|
7
|
+
FirstChar = 1
|
8
8
|
end
|
9
9
|
|
10
10
|
module Rdoba
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
11
|
+
module Mixin
|
12
|
+
class InvalidOption < StandardError
|
13
|
+
end
|
14
|
+
|
15
|
+
module CompareString
|
16
|
+
def compare_to(value, opts = {})
|
17
|
+
if opts == :ignore_diacritics || opts.instance_of?(Hash) && opts.key?(:ignore_diacritics)
|
18
|
+
# TODO: verify composite range
|
19
|
+
def crop_diacritics(x)
|
20
|
+
(x < 0x300 || x > 0x36f && x < 0x483 || x > 0x487 && x < 0xa67c || x > 0xa67d) && x || nil
|
21
|
+
end
|
22
|
+
|
23
|
+
(unpack('U*').map do |x| crop_diacritics(x)end.compact) <=>
|
24
|
+
(value.unpack('U*').map do |x| crop_diacritics(x)end.compact)
|
25
|
+
else
|
26
|
+
self <=> value
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
module ReverseString
|
32
|
+
Fixups = [:reverse]
|
33
|
+
|
34
|
+
Aliases = { __rdoba_mixin_reverse_orig__: :reverse }
|
35
|
+
|
36
|
+
def __rdoba_mixin_reverse__(step = 1)
|
37
|
+
if (!step.is_a?(Numeric) || step < 0) && step != :byte_by_byte
|
38
|
+
raise "Invalid step value #{step.inspect}"
|
39
|
+
end
|
40
|
+
|
41
|
+
if [:byte_by_byte, String::ByteByByte].include?(step)
|
42
|
+
arr = []
|
43
|
+
each_byte do |byte|
|
44
|
+
arr << byte.chr
|
45
|
+
end
|
46
|
+
arr.reverse.join.force_encoding(encoding)
|
47
|
+
elsif step == 1
|
48
|
+
__rdoba_mixin_reverse_orig__
|
49
|
+
elsif step > 1
|
50
|
+
res = ''
|
51
|
+
offset = (size + 1) / step * step - step
|
52
|
+
(0..offset).step(step) do |shift|
|
53
|
+
res += self[offset - shift..offset - shift + 1]
|
54
|
+
end
|
55
|
+
res
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
module CaseString
|
61
|
+
Fixups = %i[upcase downcase]
|
62
|
+
|
63
|
+
Aliases = { __rdoba_mixin_upcase_orig__: :upcase, __rdoba_mixin_downcase_orig__: :downcase }
|
64
|
+
|
65
|
+
ConvertTable = {
|
66
|
+
up: {
|
67
|
+
ranges: [
|
68
|
+
{ ords: [(0xE0..0xFF), (0x3B1..0x3CB), (0x430..0x44F)], change: proc { |chr, _value| chr -= 0x20 } },
|
69
|
+
{ ords: [(0x3AC..0x3AC)], change: proc { |ord| ord -= 0x26 } },
|
70
|
+
{ ords: [(0x3AD..0x3AF)], change: proc { |ord| ord -= 0x25 } },
|
71
|
+
{ ords: [(0x3B0..0x3B0)], change: proc { |ord| ord -= 0x22 } },
|
72
|
+
{
|
73
|
+
ords: [
|
74
|
+
(0x1F00..0x1F07),
|
75
|
+
(0x1F10..0x1F17),
|
76
|
+
(0x1F20..0x1F27),
|
77
|
+
(0x1F30..0x1F37),
|
78
|
+
(0x1F40..0x1F47),
|
79
|
+
(0x1F50..0x1F57),
|
80
|
+
(0x1F60..0x1F67),
|
81
|
+
(0x1F80..0x1F87),
|
82
|
+
(0x1F90..0x1F97),
|
83
|
+
(0x1Fa0..0x1Fa7),
|
84
|
+
(0x1Fb0..0x1Fb3)
|
85
|
+
],
|
86
|
+
change: proc { |ord| ord += 0x8 }
|
87
|
+
},
|
88
|
+
{ ords: [(0x450..0x45F)], change: proc { |ord| ord -= 0x50 } },
|
89
|
+
{
|
90
|
+
ords: [
|
91
|
+
(0x100..0x1B9),
|
92
|
+
(0x1C4..0x233),
|
93
|
+
(0x460..0x481),
|
94
|
+
(0x48A..0x523),
|
95
|
+
(0x1E00..0x1E95),
|
96
|
+
(0x1EA0..0x1EFF),
|
97
|
+
(0x0A642..0xA667),
|
98
|
+
(0x0A680..0x0A697),
|
99
|
+
(0xA722..0xA7A9)
|
100
|
+
],
|
101
|
+
change: proc { |ord| ord.odd? && (ord - 1) || ord }
|
102
|
+
}
|
103
|
+
],
|
104
|
+
default:
|
105
|
+
proc do |ord|
|
106
|
+
[ord].pack('U').__rdoba_mixin_upcase_orig__
|
107
|
+
end
|
108
|
+
},
|
109
|
+
down: {
|
110
|
+
ranges: [
|
111
|
+
{ ords: [(0xC0..0xDF), (0x391..0x3AB), (0x410..0x42F)], change: proc { |chr, _value| chr += 0x20 } },
|
112
|
+
{ ords: [(0x386..0x386)], change: proc { |ord| ord += 0x26 } },
|
113
|
+
{ ords: [(0x388..0x38A)], change: proc { |ord| ord += 0x25 } },
|
114
|
+
{ ords: [(0x38E..0x38E)], change: proc { |ord| ord += 0x22 } },
|
115
|
+
{
|
116
|
+
ords: [
|
117
|
+
(0x1F08..0x1F0F),
|
118
|
+
(0x1F18..0x1F1F),
|
119
|
+
(0x1F28..0x1F2F),
|
120
|
+
(0x1F38..0x1F3F),
|
121
|
+
(0x1F48..0x1F4F),
|
122
|
+
(0x1F58..0x1F5F),
|
123
|
+
(0x1F68..0x1F6F),
|
124
|
+
(0x1F88..0x1F8F),
|
125
|
+
(0x1F98..0x1F9F),
|
126
|
+
(0x1Fa8..0x1FaF),
|
127
|
+
(0x1Fb8..0x1FbA)
|
128
|
+
],
|
129
|
+
change: proc { |ord| ord -= 0x8 }
|
130
|
+
},
|
131
|
+
{ ords: [(0x400..0x40F)], change: proc { |ord| ord += 0x50 } },
|
132
|
+
{
|
133
|
+
ords: [
|
134
|
+
(0x100..0x1B9),
|
135
|
+
(0x1C4..0x233),
|
136
|
+
(0x450..0x481),
|
137
|
+
(0x48A..0x523),
|
138
|
+
(0x1E00..0x1E95),
|
139
|
+
(0x1EA0..0x1EFF),
|
140
|
+
(0x0A642..0xA667),
|
141
|
+
(0x0A680..0x0A697),
|
142
|
+
(0xA722..0xA7A9)
|
143
|
+
],
|
144
|
+
change: proc { |ord| ord.even? && (ord + 1) || ord }
|
145
|
+
}
|
146
|
+
],
|
147
|
+
default:
|
148
|
+
proc do |ord|
|
149
|
+
[ord].pack('U').__rdoba_mixin_downcase_orig__
|
150
|
+
end
|
151
|
+
}
|
152
|
+
}
|
153
|
+
|
154
|
+
def self.change_case_char(dest, char)
|
155
|
+
ord = char.is_a?(String) ? char.ord : char.to_i
|
156
|
+
table = ConvertTable[dest]
|
157
|
+
nord =
|
158
|
+
table[:ranges].each do |range|
|
159
|
+
c =
|
160
|
+
range[:ords].each do |r|
|
161
|
+
if r.include?(ord)
|
162
|
+
break false
|
163
|
+
end
|
164
|
+
end
|
165
|
+
unless c
|
166
|
+
break range[:change].call ord
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
unless nord.is_a? Numeric
|
171
|
+
return table[:default].call ord
|
172
|
+
end
|
173
|
+
|
174
|
+
[nord].pack('U')
|
175
|
+
end
|
176
|
+
|
177
|
+
def self.up_char(char)
|
178
|
+
CaseString.change_case_char :up, char
|
179
|
+
end
|
180
|
+
|
181
|
+
def self.downcase_char(char)
|
182
|
+
CaseString.change_case_char :down, char
|
183
|
+
end
|
184
|
+
|
185
|
+
if RUBY_VERSION < '1.9'
|
186
|
+
alias setbyte []=
|
187
|
+
|
188
|
+
def encoding
|
189
|
+
'UTF-8'
|
190
|
+
end
|
191
|
+
|
192
|
+
def force_encoding(*_args)
|
193
|
+
self
|
194
|
+
end
|
195
|
+
|
196
|
+
def ord
|
197
|
+
a = nil
|
198
|
+
each_byte do |b|
|
199
|
+
case (b & 0xC0)
|
200
|
+
when 0xc0
|
201
|
+
a = (b & 0x3F)
|
202
|
+
when 0x80
|
203
|
+
return (a << 6) + (b & 0x3F)
|
30
204
|
else
|
31
|
-
|
32
|
-
|
33
|
-
module ReverseString
|
34
|
-
|
35
|
-
Fixups = [ :reverse ]
|
36
|
-
|
37
|
-
Aliases = {
|
38
|
-
:__rdoba_mixin_reverse_orig__ => :reverse
|
39
|
-
}
|
40
|
-
|
41
|
-
|
42
|
-
def __rdoba_mixin_reverse__ step = 1
|
43
|
-
if ( !step.is_a?( Numeric ) || step < 0 ) && step != :byte_by_byte
|
44
|
-
raise "Invalid step value #{step.inspect}" ; end
|
45
|
-
|
46
|
-
if step == :byte_by_byte || step == String::ByteByByte
|
47
|
-
arr = []
|
48
|
-
self.each_byte do | byte |
|
49
|
-
arr << byte.chr ; end
|
50
|
-
arr.reverse.join.force_encoding( self.encoding )
|
51
|
-
elsif step == 1
|
52
|
-
__rdoba_mixin_reverse_orig__
|
53
|
-
elsif step > 1
|
54
|
-
res = ''
|
55
|
-
offset = (self.size + 1) / step * step - step
|
56
|
-
( 0..offset ).step( step ) do | shift |
|
57
|
-
res += self[ offset - shift..offset - shift + 1 ] ; end
|
58
|
-
res ; end ; end ; end
|
59
|
-
|
60
|
-
module CaseString
|
61
|
-
Fixups = [ :upcase, :downcase ]
|
62
|
-
|
63
|
-
Aliases = {
|
64
|
-
:__rdoba_mixin_upcase_orig__ => :upcase,
|
65
|
-
:__rdoba_mixin_downcase_orig__ => :downcase
|
66
|
-
}
|
67
|
-
|
68
|
-
ConvertTable = {
|
69
|
-
:up => {
|
70
|
-
:ranges => [ {
|
71
|
-
:ords => [ (0xE0..0xFF), (0x3B1..0x3CB),
|
72
|
-
(0x430..0x44F) ],
|
73
|
-
:change => proc { | chr, value | chr -= 0x20 },
|
74
|
-
}, {
|
75
|
-
:ords => [ (0x3AC..0x3AC) ],
|
76
|
-
:change => proc { | ord | ord -= 0x26 },
|
77
|
-
}, {
|
78
|
-
:ords => [ (0x3AD..0x3AF) ],
|
79
|
-
:change => proc { | ord | ord -= 0x25 },
|
80
|
-
}, {
|
81
|
-
:ords => [ (0x3B0..0x3B0) ],
|
82
|
-
:change => proc { | ord | ord -= 0x22 },
|
83
|
-
}, {
|
84
|
-
:ords => [ (0x1F00..0x1F07), (0x1F10..0x1F17),
|
85
|
-
(0x1F20..0x1F27), (0x1F30..0x1F37),
|
86
|
-
(0x1F40..0x1F47), (0x1F50..0x1F57),
|
87
|
-
(0x1F60..0x1F67), (0x1F80..0x1F87),
|
88
|
-
(0x1F90..0x1F97), (0x1Fa0..0x1Fa7),
|
89
|
-
(0x1Fb0..0x1Fb3), ],
|
90
|
-
:change => proc { | ord | ord += 0x8 },
|
91
|
-
}, {
|
92
|
-
:ords => [ (0x450..0x45F) ],
|
93
|
-
:change => proc { | ord | ord -= 0x50 },
|
94
|
-
}, {
|
95
|
-
:ords => [ (0x100..0x1B9), (0x1C4..0x233),
|
96
|
-
(0x460..0x481), (0x48A..0x523),
|
97
|
-
(0x1E00..0x1E95), (0x1EA0..0x1EFF),
|
98
|
-
(0x0A642..0xA667), (0x0A680..0x0A697),
|
99
|
-
(0xA722..0xA7A9) ],
|
100
|
-
:change => proc { | ord | ord.odd? && ( ord - 1 ) || ord },
|
101
|
-
} ],
|
102
|
-
:default => proc do | ord |
|
103
|
-
[ ord ].pack( 'U' ).__rdoba_mixin_upcase_orig__ ; end },
|
104
|
-
:down => {
|
105
|
-
:ranges => [ {
|
106
|
-
:ords => [ (0xC0..0xDF), (0x391..0x3AB),
|
107
|
-
(0x410..0x42F) ],
|
108
|
-
:change => proc { |chr, value| chr += 0x20 },
|
109
|
-
}, {
|
110
|
-
:ords => [ (0x386..0x386) ],
|
111
|
-
:change => proc { | ord | ord += 0x26 },
|
112
|
-
}, {
|
113
|
-
:ords => [ (0x388..0x38A) ],
|
114
|
-
:change => proc { | ord | ord += 0x25 },
|
115
|
-
}, {
|
116
|
-
:ords => [ (0x38E..0x38E) ],
|
117
|
-
:change => proc { | ord | ord += 0x22 },
|
118
|
-
}, {
|
119
|
-
:ords => [ (0x1F08..0x1F0F), (0x1F18..0x1F1F),
|
120
|
-
(0x1F28..0x1F2F), (0x1F38..0x1F3F),
|
121
|
-
(0x1F48..0x1F4F), (0x1F58..0x1F5F),
|
122
|
-
(0x1F68..0x1F6F), (0x1F88..0x1F8F),
|
123
|
-
(0x1F98..0x1F9F), (0x1Fa8..0x1FaF),
|
124
|
-
(0x1Fb8..0x1FbA), ],
|
125
|
-
:change => proc { | ord | ord -= 0x8 },
|
126
|
-
}, {
|
127
|
-
:ords => [ (0x400..0x40F) ],
|
128
|
-
:change => proc { | ord | ord += 0x50 },
|
129
|
-
}, {
|
130
|
-
:ords => [ (0x100..0x1B9), (0x1C4..0x233),
|
131
|
-
(0x450..0x481), (0x48A..0x523),
|
132
|
-
(0x1E00..0x1E95), (0x1EA0..0x1EFF),
|
133
|
-
(0x0A642..0xA667), (0x0A680..0x0A697),
|
134
|
-
(0xA722..0xA7A9) ],
|
135
|
-
:change => proc { | ord | ord.even? && ( ord + 1 ) || ord },
|
136
|
-
} ],
|
137
|
-
:default => proc do | ord |
|
138
|
-
[ ord ].pack( 'U' ).__rdoba_mixin_downcase_orig__ ; end } }
|
139
|
-
|
140
|
-
def self.change_case_char dest, char
|
141
|
-
ord = char.is_a?( String ) ? char.ord : char.to_i
|
142
|
-
table = ConvertTable[ dest ]
|
143
|
-
nord = table[ :ranges ].each do |range|
|
144
|
-
c = range[ :ords ].each do |r|
|
145
|
-
if r.include?( ord )
|
146
|
-
break false ; end ; end
|
147
|
-
if !c
|
148
|
-
break range[ :change ].call ord ; end ; end
|
149
|
-
|
150
|
-
if !nord.is_a? Numeric
|
151
|
-
return table[ :default ].call ord ; end
|
152
|
-
|
153
|
-
[ nord ].pack( 'U' ) ; end
|
154
|
-
|
155
|
-
def self.up_char char
|
156
|
-
CaseString.change_case_char :up, char ; end
|
157
|
-
|
158
|
-
def self.downcase_char char
|
159
|
-
CaseString.change_case_char :down, char ; end
|
160
|
-
|
161
|
-
if RUBY_VERSION < '1.9'
|
162
|
-
alias :setbyte :[]=
|
163
|
-
|
164
|
-
def encoding
|
165
|
-
'UTF-8'
|
205
|
+
return b
|
166
206
|
end
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
def __rdoba_mixin_downcase__(options = {})
|
212
|
+
__rdoba_mixin_changecase__ :down, options
|
213
|
+
end
|
214
|
+
|
215
|
+
def __rdoba_mixin_upcase__(options = {})
|
216
|
+
__rdoba_mixin_changecase__ :up, options
|
217
|
+
end
|
218
|
+
|
219
|
+
def __rdoba_mixin_changecase__(reg, options = {})
|
220
|
+
unless %i[up down].include? reg
|
221
|
+
return self
|
222
|
+
end
|
223
|
+
|
224
|
+
re = Regexp.new '[\x80-\xFF]', nil, 'n'
|
225
|
+
if options == String::FirstChar || options.include?(:first_char)
|
226
|
+
r = dup
|
227
|
+
r[0] = CaseString.change_case_char reg, ord
|
228
|
+
r
|
229
|
+
elsif dup.force_encoding('ASCII-8BIT').match re
|
230
|
+
unpack('U*').map do |chr|
|
231
|
+
CaseString.change_case_char reg, chr
|
232
|
+
end.join
|
233
|
+
elsif reg == :up
|
234
|
+
__rdoba_mixin_upcase_orig__
|
235
|
+
else
|
236
|
+
__rdoba_mixin_downcase_orig__
|
237
|
+
end
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
module To_hArray
|
242
|
+
def to_h(options = {})
|
243
|
+
h = {}
|
244
|
+
each do |v|
|
245
|
+
if v.is_a? Array
|
246
|
+
if h.key? v[0]
|
247
|
+
unless h[v[0]].is_a? Array
|
248
|
+
h[v[0]] = [h[v[0]]]
|
249
|
+
end
|
250
|
+
|
251
|
+
if v.size > 2
|
252
|
+
h[v[0]].concat v[1..-1]
|
253
|
+
else
|
254
|
+
h[v[0]] << v[1]
|
255
|
+
end
|
256
|
+
else
|
257
|
+
h[v[0]] = v.size > 2 && v[1..-1] || v[1]
|
258
|
+
end
|
259
|
+
elsif h.key? v
|
260
|
+
unless h[v].is_a? Array
|
261
|
+
h[v] = [h[v]]
|
262
|
+
end
|
263
|
+
|
264
|
+
h[v] << v
|
265
|
+
else
|
266
|
+
h[v] = nil
|
267
|
+
end
|
268
|
+
end
|
167
269
|
|
168
|
-
|
169
|
-
|
270
|
+
if options[:save_unique]
|
271
|
+
h.each_pair do |_k, v|
|
272
|
+
if v.is_a? Array
|
273
|
+
v.uniq!
|
170
274
|
end
|
275
|
+
end
|
276
|
+
end
|
277
|
+
|
278
|
+
h
|
279
|
+
end
|
280
|
+
end
|
281
|
+
|
282
|
+
module Split_byArray
|
283
|
+
#
|
284
|
+
# +split_by+ method splits the +self+ array by a condition,
|
285
|
+
# which is evaliated in a passed block, in two versions that are
|
286
|
+
# the return value. Usage:
|
287
|
+
#
|
288
|
+
# require 'rdoba'
|
289
|
+
#
|
290
|
+
# rdoba mixin: :split_by
|
291
|
+
#
|
292
|
+
# (first, second) = [0,1,2,3].split_by { |value| value % 2 == 0 }
|
293
|
+
# first # => [0,2]
|
294
|
+
# second # => [1,3]
|
295
|
+
#
|
296
|
+
def split_by
|
297
|
+
idxs = []
|
298
|
+
rejected = reject.with_index do |v, i| yield(v) && (idxs << i)end
|
299
|
+
[values_at(*idxs), rejected]
|
300
|
+
end
|
301
|
+
end
|
302
|
+
|
303
|
+
module EmptyObject
|
304
|
+
def empty?
|
305
|
+
false
|
306
|
+
end
|
307
|
+
end
|
308
|
+
|
309
|
+
module EmptyNilClass
|
310
|
+
def empty?
|
311
|
+
true
|
312
|
+
end
|
313
|
+
end
|
314
|
+
end
|
315
|
+
end
|
171
316
|
|
172
|
-
|
173
|
-
|
174
|
-
self.each_byte do |b|
|
175
|
-
case ( b & 0xC0 )
|
176
|
-
when 0xc0
|
177
|
-
a = (b & 0x3F)
|
178
|
-
when 0x80
|
179
|
-
return (a << 6) + (b & 0x3F)
|
180
|
-
else
|
181
|
-
return b ; end ; end ; end ; end
|
182
|
-
|
183
|
-
def __rdoba_mixin_downcase__ options = {}
|
184
|
-
self.__rdoba_mixin_changecase__ :down, options ; end
|
185
|
-
|
186
|
-
def __rdoba_mixin_upcase__ options = {}
|
187
|
-
self.__rdoba_mixin_changecase__ :up, options ; end
|
188
|
-
|
189
|
-
def __rdoba_mixin_changecase__ reg, options = {}
|
190
|
-
if ![ :up, :down ].include? reg
|
191
|
-
return self ; end
|
192
|
-
|
193
|
-
re = Regexp.new '[\x80-\xFF]', nil, 'n'
|
194
|
-
if options == String::FirstChar || options.include?( :first_char )
|
195
|
-
r = self.dup
|
196
|
-
r[0] = CaseString.change_case_char reg, self.ord
|
197
|
-
r
|
198
|
-
elsif self.dup.force_encoding( 'ASCII-8BIT' ).match re
|
199
|
-
self.unpack('U*').map do | chr |
|
200
|
-
CaseString.change_case_char reg, chr
|
201
|
-
end.join
|
202
|
-
elsif reg == :up
|
203
|
-
self.__rdoba_mixin_upcase_orig__
|
204
|
-
else
|
205
|
-
self.__rdoba_mixin_downcase_orig__ ; end ; end ; end
|
206
|
-
|
207
|
-
module To_hArray
|
208
|
-
def to_h options = {}
|
209
|
-
h = {}
|
210
|
-
self.each do |v|
|
211
|
-
if v.is_a? Array
|
212
|
-
if h.key? v[ 0 ]
|
213
|
-
if !h[ v[ 0 ] ].is_a? Array
|
214
|
-
h[ v[ 0 ] ] = [ h[ v[ 0 ] ] ] ; end
|
215
|
-
|
216
|
-
if v.size > 2
|
217
|
-
h[ v [ 0 ] ].concat v[ 1..-1 ]
|
218
|
-
else
|
219
|
-
h[ v [ 0 ] ] << v[ 1 ] ; end
|
220
|
-
else
|
221
|
-
h[ v[ 0 ] ] = v.size > 2 && v[ 1..-1] || v[ 1 ] ; end
|
222
|
-
else
|
223
|
-
if h.key? v
|
224
|
-
if !h[ v ].is_a? Array
|
225
|
-
h[ v ] = [ h[ v ] ] ; end
|
226
|
-
|
227
|
-
h[ v ] << v
|
228
|
-
else
|
229
|
-
h[ v ] = nil ; end ; end ; end
|
230
|
-
|
231
|
-
if options[ :save_unique ]
|
232
|
-
h.each_pair do |k,v|
|
233
|
-
if v.is_a? Array
|
234
|
-
v.uniq! ; end ; end ; end
|
235
|
-
|
236
|
-
h ; end ; end
|
237
|
-
|
238
|
-
module Split_byArray
|
239
|
-
#
|
240
|
-
# +split_by+ method splits the +self+ array by a condition,
|
241
|
-
# which is evaliated in a passed block, in two versions that are
|
242
|
-
# the return value. Usage:
|
243
|
-
#
|
244
|
-
# require 'rdoba'
|
245
|
-
#
|
246
|
-
# rdoba mixin: :split_by
|
247
|
-
#
|
248
|
-
# (first, second) = [0,1,2,3].split_by { |value| value % 2 == 0 }
|
249
|
-
# first # => [0,2]
|
250
|
-
# second # => [1,3]
|
251
|
-
#
|
252
|
-
def split_by &block
|
253
|
-
idxs = []
|
254
|
-
rejected = self.reject.with_index do |v, i|
|
255
|
-
yield( v ) && ( idxs << i ) ; end
|
256
|
-
[ self.values_at(*idxs), rejected ] ; end ; end
|
257
|
-
|
258
|
-
module EmptyObject
|
259
|
-
def empty?
|
260
|
-
false ; end ; end
|
261
|
-
|
262
|
-
module EmptyNilClass
|
263
|
-
def empty?
|
264
|
-
true ; end ; end ; end ; end
|
265
|
-
|
266
|
-
if RUBY_VERSION >= "2.0.0"
|
267
|
-
require_relative 'mixin/try'
|
317
|
+
if RUBY_VERSION >= '2.0.0'
|
318
|
+
require_relative 'mixin/try'
|
268
319
|
else
|
269
|
-
|
320
|
+
require_relative 'mixin/try_1_9_0'
|
321
|
+
end
|
270
322
|
|
271
323
|
require_relative 'mixin/wait_if'
|
272
324
|
|
273
325
|
module Rdoba
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
326
|
+
def self.mixin(options)
|
327
|
+
[options[:value]].flatten.each do |value|
|
328
|
+
case value
|
329
|
+
when :case
|
330
|
+
Mixin::CaseString::Aliases.each do |k, v|
|
331
|
+
::String.send :alias_method, k, v
|
332
|
+
end
|
333
|
+
Mixin::CaseString::Fixups.each do |e|
|
334
|
+
::String.class_eval "def #{e}(*args);self.__rdoba_mixin_#{e}__(*args);end", __FILE__, __LINE__
|
335
|
+
end
|
336
|
+
::String.include Mixin::CaseString
|
337
|
+
when :reverse
|
338
|
+
Mixin::ReverseString::Aliases.each do |k, v|
|
339
|
+
::String.send :alias_method, k, v
|
340
|
+
end
|
341
|
+
Mixin::ReverseString::Fixups.each do |e|
|
342
|
+
::String.class_eval "def #{e}(*args);self.__rdoba_mixin_#{e}__(*args);end", __FILE__, __LINE__
|
343
|
+
end
|
344
|
+
String.include Mixin::ReverseString
|
345
|
+
when :compare
|
346
|
+
String.include Mixin::CompareString
|
347
|
+
when :to_h
|
348
|
+
if [].respond_to?(:to_h)
|
349
|
+
m = Mixin::To_hArray.instance_method(:to_h)
|
350
|
+
Array.send(:define_method, :to_h, m)
|
351
|
+
else
|
352
|
+
Array.include Mixin::To_hArray
|
353
|
+
end
|
354
|
+
when :time
|
355
|
+
require_relative 'mixin/time'
|
356
|
+
if File.respond_to?(:mtime)
|
357
|
+
%i[mtime atime ctime].each do |name|
|
358
|
+
m = Mixin::Time.instance_method(name)
|
359
|
+
::File.send(:define_singleton_method, name, m)
|
360
|
+
end
|
361
|
+
else
|
362
|
+
::File.extend Mixin::Time
|
363
|
+
end
|
364
|
+
when :wait_if
|
365
|
+
Object.include Mixin::Wait_ifKernel
|
366
|
+
when :split_by
|
367
|
+
Array.include Mixin::Split_byArray
|
368
|
+
when :try
|
369
|
+
Object.include Mixin::TryObject
|
370
|
+
when :empty
|
371
|
+
Object.include Mixin::EmptyObject
|
372
|
+
NilClass.include Mixin::EmptyNilClass
|
373
|
+
else
|
374
|
+
raise(Mixin::InvalidOption, 'Invalid rdoba-mixin options key: ' + value.to_s)
|
375
|
+
end
|
376
|
+
end
|
377
|
+
end
|
378
|
+
end
|