clir 0.22.0
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 +7 -0
- data/.gitignore +8 -0
- data/.travis.yml +6 -0
- data/CHANGELOG.md +229 -0
- data/Gemfile +8 -0
- data/Gemfile.lock +44 -0
- data/Manual/Manuel_fr.md +222 -0
- data/Manual/Manuel_fr.pdf +0 -0
- data/README.md +63 -0
- data/REFLEXIONS.md +8 -0
- data/Rakefile +10 -0
- data/TODO.md +9 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/clir.gemspec +40 -0
- data/lib/clir/Array.ext.rb +9 -0
- data/lib/clir/CLI.mod.rb +237 -0
- data/lib/clir/CSV_extension.rb +177 -0
- data/lib/clir/Config.cls.rb +25 -0
- data/lib/clir/Date_utils.rb +161 -0
- data/lib/clir/File_extension.rb +127 -0
- data/lib/clir/Integer.ext.rb +43 -0
- data/lib/clir/Labelizor.rb +231 -0
- data/lib/clir/Replayer.cls.rb +90 -0
- data/lib/clir/String.ext.rb +304 -0
- data/lib/clir/Symbol.ext.rb +20 -0
- data/lib/clir/TTY-Prompt.cls.rb +415 -0
- data/lib/clir/Table.rb +369 -0
- data/lib/clir/console_methods.rb +42 -0
- data/lib/clir/helpers_methods.rb +68 -0
- data/lib/clir/state_methods.rb +48 -0
- data/lib/clir/utils_methods.rb +57 -0
- data/lib/clir/utils_numbers.rb +50 -0
- data/lib/clir/version.rb +3 -0
- data/lib/clir.rb +36 -0
- metadata +136 -0
@@ -0,0 +1,304 @@
|
|
1
|
+
=begin
|
2
|
+
String extension for CLIR
|
3
|
+
=end
|
4
|
+
|
5
|
+
class String
|
6
|
+
|
7
|
+
CHIFFRE_HAUT = {
|
8
|
+
0 => '⁰',
|
9
|
+
1 => '¹',
|
10
|
+
2 => '²',
|
11
|
+
3 => '³',
|
12
|
+
4 => '⁴',
|
13
|
+
5 => '⁵',
|
14
|
+
6 => '⁶',
|
15
|
+
7 => '⁷',
|
16
|
+
8 => '⁸',
|
17
|
+
9 => '⁹'
|
18
|
+
}
|
19
|
+
CHIFFRE_BAS = {
|
20
|
+
0 => '₀',
|
21
|
+
1 => '₁',
|
22
|
+
2 => '₂',
|
23
|
+
3 => '₃',
|
24
|
+
4 => '₄',
|
25
|
+
5 => '₅',
|
26
|
+
6 => '₆',
|
27
|
+
7 => '₇',
|
28
|
+
8 => '₈',
|
29
|
+
9 => '₉'
|
30
|
+
}
|
31
|
+
|
32
|
+
DATA_NORMALIZE = {
|
33
|
+
:from => "ÀÁÂÃÄÅàáâãäåĀāĂ㥹ÇçĆćĈĉĊċČčÐðĎďĐđÈÉÊËèéêëĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħÌÍÎÏìíîïĨĩĪīĬĭĮįİıĴĵĶķĸĹĺĻļĽľĿŀŁłÑñŃńŅņŇňʼnŊŋÒÓÔÕÖØòóôõöøŌōŎŏŐőŔŕŖŗŘřŚśŜŝŞşŠšſŢţŤťŦŧÙÚÛÜùúûüŨũŪūŬŭŮůŰűŲųŴŵÝýÿŶŷŸŹźŻżŽž",
|
34
|
+
:to => "AAAAAAaaaaaaAaAaAaCcCcCcCcCcDdDdDdEEEEeeeeEeEeEeEeEeGgGgGgGgHhHhIIIIiiiiIiIiIiIiIiJjKkkLlLlLlLlLlNnNnNnNnnNnOOOOOOooooooOoOoOoRrRrRrSsSsSsSssTtTtTtUUUUuuuuUuUuUuUuUuUuWwYyyYyYZzZzZz"
|
35
|
+
}
|
36
|
+
|
37
|
+
def self.columnize(lines, delimitor = ',', gutter = ' ')
|
38
|
+
# lines = lines.join("\n") if lines.is_a?(Array)
|
39
|
+
lines = lines.split("\n") if lines.is_a?(String)
|
40
|
+
#
|
41
|
+
# Nombre de colonnes
|
42
|
+
#
|
43
|
+
nombre_colonnes = 0
|
44
|
+
colonnes_widths = []
|
45
|
+
lines = lines.map do |line|
|
46
|
+
line.strip.split(delimitor).map {|e| e.strip}
|
47
|
+
end.each do |line|
|
48
|
+
nb = line.count # nombre de colonnes
|
49
|
+
nombre_colonnes = nb if nb > nombre_colonnes
|
50
|
+
end
|
51
|
+
#
|
52
|
+
# On met le même nombre de colonnes à toutes les lignes
|
53
|
+
#
|
54
|
+
lines.map do |line|
|
55
|
+
while line.count < nombre_colonnes
|
56
|
+
line << ''
|
57
|
+
end
|
58
|
+
line
|
59
|
+
end.each do |line|
|
60
|
+
line.each_with_index do |str, col_idx|
|
61
|
+
colonnes_widths[col_idx] = 0 if colonnes_widths[col_idx].nil?
|
62
|
+
colonnes_widths[col_idx] = str.length if str.length > colonnes_widths[col_idx]
|
63
|
+
end
|
64
|
+
end.each do |line|
|
65
|
+
#
|
66
|
+
# Mettre toutes les colonnes à la même taille
|
67
|
+
#
|
68
|
+
line.each_with_index do |str, col_idx|
|
69
|
+
line[col_idx] = str.ljust(colonnes_widths[col_idx])
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
lines.map do |line|
|
74
|
+
line.join(gutter)
|
75
|
+
end.join("\n").strip
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
# --- Predicate Methods ---
|
80
|
+
|
81
|
+
# @return TRUE is +str+ is a number (integer or float) in a string.
|
82
|
+
def numeric?
|
83
|
+
self.match?(/^[0-9.]+$/)
|
84
|
+
end
|
85
|
+
|
86
|
+
# @return TRUE if +ary+, as a String or an Array, includes
|
87
|
+
# self. If it's an Hash, has key self.
|
88
|
+
def in?(ary)
|
89
|
+
case ary
|
90
|
+
when Array
|
91
|
+
ary.include?(self)
|
92
|
+
when String
|
93
|
+
ary.match?(self)
|
94
|
+
when Hash
|
95
|
+
ary.key?(self)
|
96
|
+
else
|
97
|
+
raise "in? waits for a String, an Hash or a Array. Given: #{ary.class}."
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
# --- Helpers Methods ---
|
102
|
+
|
103
|
+
|
104
|
+
##
|
105
|
+
# @return self with +len+ length. Cut it if necessary.
|
106
|
+
# @note
|
107
|
+
# Up to 10, cut at the end with '…' separator
|
108
|
+
# Up to 15, cut at the middle and if diff < 5, the separator is '…'
|
109
|
+
# @example
|
110
|
+
# "Sentence".max(5) # => "Sent…"
|
111
|
+
# "Long sentence".max(10) # => "Long…tence"
|
112
|
+
# "Very long and long sentence".max(16)
|
113
|
+
# # => "Very lo[…]ntence"
|
114
|
+
#
|
115
|
+
# @param [Integer] len Lenght required (> 1)
|
116
|
+
#
|
117
|
+
def max(len)
|
118
|
+
len.is_a?(Integer) || raise(ArgumentError.new("Argument should be a Integer"))
|
119
|
+
len > 1 || raise(ArgumentError.new("Minimum length should be 2. You give #{len}."))
|
120
|
+
return "#{self}" if self.length <= len
|
121
|
+
return self[0...len-1]+'…' if len <= 10
|
122
|
+
cur_len = self.length
|
123
|
+
diff = cur_len - len
|
124
|
+
|
125
|
+
sep, moitie =
|
126
|
+
if len > 15 && diff > 4
|
127
|
+
['[…]', len / 2 - 2]
|
128
|
+
else
|
129
|
+
['…', len / 2]
|
130
|
+
end
|
131
|
+
|
132
|
+
midav = self[0..moitie-1] + sep
|
133
|
+
reste = len - midav.length
|
134
|
+
midap = self[-reste..-1]
|
135
|
+
|
136
|
+
return midav + midap
|
137
|
+
end
|
138
|
+
|
139
|
+
def max!(len)
|
140
|
+
self.replace(self.max(len))
|
141
|
+
return true
|
142
|
+
end
|
143
|
+
|
144
|
+
|
145
|
+
# As ljust (which align to the left) ans rjust (which align to the
|
146
|
+
# right), cjust align to the center depending length
|
147
|
+
# @example
|
148
|
+
# "good".cjust(10) # => " good "
|
149
|
+
# "good".cjust(10, '+') # => "+++good+++"
|
150
|
+
def cjust(length, fill_with = ' ')
|
151
|
+
if self.length == length
|
152
|
+
return self
|
153
|
+
elsif self.length > length
|
154
|
+
return self[0...length]
|
155
|
+
else
|
156
|
+
nombre_moitie = (length - self.length) / 2
|
157
|
+
ret = (fill_with * nombre_moitie) + self + (fill_with * nombre_moitie)
|
158
|
+
ret = ret + fill_with if ret.length < length
|
159
|
+
return ret
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
# Si le texte est :
|
164
|
+
#
|
165
|
+
# Mon titre
|
166
|
+
#
|
167
|
+
# … cette méthode retourne :
|
168
|
+
#
|
169
|
+
# Mon titre
|
170
|
+
# ---------
|
171
|
+
#
|
172
|
+
#
|
173
|
+
def as_title(sous = '=', indent = 2)
|
174
|
+
len = self.length
|
175
|
+
ind = ' ' * indent
|
176
|
+
del = ind + sous * (len + 2)
|
177
|
+
"\n#{del}\n#{ind} #{self.upcase}\n#{del}"
|
178
|
+
end
|
179
|
+
|
180
|
+
|
181
|
+
def strike
|
182
|
+
"\033[9m#{self}\033[0m"
|
183
|
+
end
|
184
|
+
def underline
|
185
|
+
"\033[4m#{self}\033[0m"
|
186
|
+
end
|
187
|
+
def italic
|
188
|
+
"\033[3m#{self}\033[0m"
|
189
|
+
end
|
190
|
+
|
191
|
+
|
192
|
+
def blanc
|
193
|
+
"\033[0;38m#{self}\033[0m"
|
194
|
+
end
|
195
|
+
alias :white :blanc
|
196
|
+
|
197
|
+
def blanc_clair
|
198
|
+
"\033[0;37m#{self}\033[0m"
|
199
|
+
end
|
200
|
+
|
201
|
+
def bleu
|
202
|
+
"\033[0;96m#{self}\033[0m"
|
203
|
+
end
|
204
|
+
alias :blue :bleu
|
205
|
+
|
206
|
+
def bleu_clair
|
207
|
+
"\033[0;36m#{self}\033[0m"
|
208
|
+
end
|
209
|
+
|
210
|
+
def fond_bleu
|
211
|
+
"\033[0;44m#{self}\033[0m"
|
212
|
+
end
|
213
|
+
|
214
|
+
def fond_bleu_clair
|
215
|
+
"\033[0;46m#{self}\033[0m"
|
216
|
+
end
|
217
|
+
|
218
|
+
def vert
|
219
|
+
"\033[0;92m#{self}\033[0m"
|
220
|
+
end
|
221
|
+
alias :green :vert
|
222
|
+
|
223
|
+
def vert_clair
|
224
|
+
"\033[0;32m#{self}\033[0m"
|
225
|
+
end
|
226
|
+
alias :ligth_green :vert_clair
|
227
|
+
|
228
|
+
def fond_vert
|
229
|
+
"\033[0;42m#{self}\033[0m"
|
230
|
+
end
|
231
|
+
|
232
|
+
def rouge
|
233
|
+
"\033[0;91m#{self}\033[0m"
|
234
|
+
end
|
235
|
+
alias :red :rouge
|
236
|
+
|
237
|
+
def gris
|
238
|
+
"\033[0;90m#{self}\033[0m"
|
239
|
+
end
|
240
|
+
alias :grey :gris
|
241
|
+
|
242
|
+
def orange
|
243
|
+
"\033[38;5;214m#{self}\033[0m"
|
244
|
+
end
|
245
|
+
|
246
|
+
def jaune
|
247
|
+
"\033[0;93m#{self}\033[0m"
|
248
|
+
end
|
249
|
+
alias :yellow :jaune
|
250
|
+
|
251
|
+
def jaune_dark
|
252
|
+
"\033[0;33m#{self}\033[0m"
|
253
|
+
end
|
254
|
+
|
255
|
+
def mauve
|
256
|
+
"\033[1;94m#{self}\033[0m"
|
257
|
+
end
|
258
|
+
alias :purple :mauve
|
259
|
+
|
260
|
+
|
261
|
+
# --- Transform Methods ---
|
262
|
+
|
263
|
+
def camelize
|
264
|
+
str = "#{self}"
|
265
|
+
str[0] = str[0].upcase
|
266
|
+
str.split(' ').map do |seg|
|
267
|
+
seg.gsub(/(?:_+([a-z]))/i){$1.upcase}
|
268
|
+
end.join(' ')
|
269
|
+
end
|
270
|
+
|
271
|
+
def decamelize
|
272
|
+
str = self
|
273
|
+
str[0] = str[0].downcase
|
274
|
+
str.split(' ').map do |seg|
|
275
|
+
seg.gsub(/([A-Z])/){ "_#{$1.downcase}"}
|
276
|
+
end.join(' ')
|
277
|
+
end
|
278
|
+
|
279
|
+
def titleize
|
280
|
+
str = self
|
281
|
+
str.split(' ').map { |n| n[0].upcase + n[1..-1].downcase }.join(' ')
|
282
|
+
end
|
283
|
+
|
284
|
+
def patronize
|
285
|
+
str = self
|
286
|
+
str.split(/( |\-)/).map do |n|
|
287
|
+
n = n.downcase
|
288
|
+
if n == 'de'
|
289
|
+
'de'
|
290
|
+
else
|
291
|
+
n.capitalize
|
292
|
+
end
|
293
|
+
end.join('')
|
294
|
+
end
|
295
|
+
|
296
|
+
def normalize
|
297
|
+
self
|
298
|
+
.force_encoding('utf-8')
|
299
|
+
.gsub(/[œŒæÆ]/,{'œ'=>'oe', 'Œ' => 'Oe', 'æ'=> 'ae', 'Æ' => 'Ae'})
|
300
|
+
.tr(DATA_NORMALIZE[:from], DATA_NORMALIZE[:to])
|
301
|
+
end
|
302
|
+
alias :normalized :normalize
|
303
|
+
|
304
|
+
end #/class String
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class Symbol
|
2
|
+
|
3
|
+
# @return TRUE if self is inside +ary+ or has key self
|
4
|
+
# @param ary {Range|Array|Hash}
|
5
|
+
def in?(ary)
|
6
|
+
case ary
|
7
|
+
when Array
|
8
|
+
ary.include?(self)
|
9
|
+
when Hash
|
10
|
+
ary.key?(self)
|
11
|
+
else
|
12
|
+
raise "Symbol#in? waits for a Array or an Hash. Given: #{ary.class}."
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def camelize
|
17
|
+
self.to_s.camelize
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|