tzispa_utils 0.3.1 → 0.3.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/lib/tzispa/utils/decorator.rb +7 -4
- data/lib/tzispa/utils/duplicable.rb +4 -2
- data/lib/tzispa/utils/hash.rb +66 -33
- data/lib/tzispa/utils/indenter.rb +18 -10
- data/lib/tzispa/utils/integer.rb +28 -20
- data/lib/tzispa/utils/mail.rb +88 -0
- data/lib/tzispa/utils/string.rb +142 -144
- data/lib/tzispa/utils/version.rb +1 -1
- data/test/decorator_test.rb +4 -8
- data/test/hash_test.rb +53 -0
- data/test/indenter_test.rb +11 -7
- data/test/integer_test.rb +3 -1
- data/test/string_test.rb +1 -1
- metadata +20 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ca4b92f6f0b683404de7f1cc52994ddf93999cf4
|
4
|
+
data.tar.gz: 83300a6e5917346f27cda41d471ff7f4f1e719c6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2968a00cffa40a2afb2ac0b7155753b10eb1edc999afd1aacb6331b889cc5b1a6bda01a40064507688c32631fac820aec44e017fe37e7554b9340b0aff157886
|
7
|
+
data.tar.gz: 830b03732abc7ceabca1dd9c3006e427015cd96cfd04422b28fa182e395fcf3d4ae45f5cae913351f8a6a25374231759c10491512db4fe72087d4ccadf15e6af
|
data/CHANGELOG.md
CHANGED
@@ -1,16 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Tzispa
|
2
4
|
module Utils
|
3
5
|
|
4
6
|
class Decorator < SimpleDelegator
|
7
|
+
attr_reader :component
|
5
8
|
|
6
|
-
def component
|
7
|
-
@component
|
9
|
+
def initialize(component)
|
10
|
+
@component = component
|
11
|
+
super
|
8
12
|
end
|
9
13
|
|
10
14
|
def cclass
|
11
|
-
component.class
|
15
|
+
@component.class
|
12
16
|
end
|
13
|
-
|
14
17
|
end
|
15
18
|
|
16
19
|
end
|
data/lib/tzispa/utils/hash.rb
CHANGED
@@ -1,57 +1,90 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'tzispa/utils/duplicable'
|
2
4
|
|
3
5
|
module Tzispa
|
4
6
|
module Utils
|
7
|
+
module TzHash
|
5
8
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
9
|
+
DUPLICATE_LOGIC = proc do |value|
|
10
|
+
case value
|
11
|
+
when Hash
|
12
|
+
value.deep_dup
|
13
|
+
when ::Hash
|
14
|
+
Hash.new(value).deep_dup.to_h
|
15
|
+
end
|
16
|
+
end.freeze
|
17
|
+
|
18
|
+
refine ::Hash do
|
19
|
+
def symbolize
|
20
|
+
dup.tap(&:symbolize!)
|
21
|
+
end
|
14
22
|
|
15
|
-
|
23
|
+
def symbolize!
|
24
|
+
keys.each do |k|
|
25
|
+
v = delete(k)
|
26
|
+
self[k.to_sym] = v
|
27
|
+
end
|
16
28
|
|
17
|
-
|
18
|
-
keys.each do |k|
|
19
|
-
v = delete(k)
|
20
|
-
self[k.to_sym] = v
|
29
|
+
self
|
21
30
|
end
|
22
31
|
|
23
|
-
|
24
|
-
|
32
|
+
def deep_symbolize
|
33
|
+
dup.tap do |hsh|
|
34
|
+
hsh.keys.each do |k|
|
35
|
+
v = hsh.delete(k)
|
36
|
+
v = v.dup.deep_symbolize if v.respond_to?(:to_hash)
|
37
|
+
|
38
|
+
hsh[k.to_sym] = v
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
25
42
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
43
|
+
def deep_symbolize!
|
44
|
+
keys.each do |k|
|
45
|
+
v = delete(k)
|
46
|
+
v = v.deep_symbolize! if v.respond_to?(:to_hash)
|
30
47
|
|
31
|
-
|
48
|
+
self[k.to_sym] = v
|
49
|
+
end
|
50
|
+
|
51
|
+
self
|
32
52
|
end
|
33
53
|
|
34
|
-
|
35
|
-
|
54
|
+
def stringify
|
55
|
+
dup.tap(&:stringify!)
|
56
|
+
end
|
57
|
+
|
58
|
+
def stringify!
|
59
|
+
keys.each do |k|
|
60
|
+
v = delete(k)
|
61
|
+
v = self.class.new(v).stringify! if v.respond_to?(:to_hash)
|
36
62
|
|
37
|
-
|
38
|
-
|
39
|
-
v = delete(k)
|
40
|
-
v = self.class.new(v).stringify! if v.respond_to?(:to_hash)
|
63
|
+
self[k.to_s] = v
|
64
|
+
end
|
41
65
|
|
42
|
-
self
|
66
|
+
self
|
43
67
|
end
|
44
68
|
|
45
|
-
|
46
|
-
|
69
|
+
def tuplify
|
70
|
+
[].tap do |tp|
|
71
|
+
each do |k, v|
|
72
|
+
if v.respond_to? :each
|
73
|
+
v.each { |w| tp << [k, w] }
|
74
|
+
else
|
75
|
+
tp << [k, v]
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
47
80
|
|
48
|
-
|
49
|
-
|
50
|
-
|
81
|
+
def deep_dup
|
82
|
+
self.class.new.tap do |result|
|
83
|
+
@hash.each { |k, v| result[k] = Duplicable.dup(v, &DUPLICATE_LOGIC) }
|
84
|
+
end
|
51
85
|
end
|
52
86
|
end
|
53
87
|
|
54
88
|
end
|
55
|
-
|
56
89
|
end
|
57
90
|
end
|
@@ -1,24 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'tzispa/utils/string'
|
2
4
|
|
3
5
|
module Tzispa
|
4
6
|
module Utils
|
5
7
|
|
6
8
|
class Indenter
|
7
|
-
using Tzispa::Utils
|
9
|
+
using Tzispa::Utils::TzString
|
8
10
|
|
9
11
|
DEFAULT_INDENT_CHAR = ' '
|
12
|
+
DEFAULT_INDENT_SIZE = 2
|
10
13
|
|
11
14
|
attr_reader :sbuff, :indent_char, :instr
|
12
15
|
|
13
|
-
def initialize(indent_size, indent_char=
|
14
|
-
@indent_size = indent_size
|
16
|
+
def initialize(indent_size = nil, indent_char = nil)
|
17
|
+
@indent_size = indent_size || DEFAULT_INDENT_SIZE
|
15
18
|
@indent_current = 0
|
16
|
-
@indent_char = indent_char
|
19
|
+
@indent_char = indent_char || DEFAULT_INDENT_CHAR
|
17
20
|
@instr = String.new
|
18
21
|
end
|
19
22
|
|
20
|
-
def <<(
|
21
|
-
|
23
|
+
def <<(item)
|
24
|
+
ss = item.to_s.indentize(@indent_current, @indent_char)
|
25
|
+
@instr.concat ss
|
26
|
+
|
22
27
|
self
|
23
28
|
end
|
24
29
|
|
@@ -28,16 +33,19 @@ module Tzispa
|
|
28
33
|
|
29
34
|
def indent
|
30
35
|
@indent_current += @indent_size
|
36
|
+
|
31
37
|
self
|
32
38
|
end
|
33
39
|
|
34
40
|
def unindent
|
35
|
-
@indent_current
|
36
|
-
|
41
|
+
if (@indent_current - @indent_size).positive?
|
42
|
+
@indent_current -= @indent_size
|
43
|
+
else
|
44
|
+
@indent_current = 0
|
45
|
+
end
|
46
|
+
|
37
47
|
self
|
38
48
|
end
|
39
|
-
|
40
|
-
|
41
49
|
end
|
42
50
|
|
43
51
|
end
|
data/lib/tzispa/utils/integer.rb
CHANGED
@@ -1,30 +1,38 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require 'escape_utils'
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
4
3
|
require 'i18n'
|
5
4
|
|
6
5
|
module Tzispa
|
7
6
|
module Utils
|
7
|
+
module TzInteger
|
8
|
+
|
9
|
+
refine ::Integer do
|
10
|
+
def to_filesize(precission = 1, sep = nil)
|
11
|
+
units, qty = __i18n_filesize
|
12
|
+
ns = (to_f / (qty / 1024)).round(precission).to_s.split('.')
|
13
|
+
ns.pop if ns.last.to_i.zero?
|
14
|
+
__nu_format(ns.join(sep || I18n.t('number.format.separator', default: '.')),
|
15
|
+
units)
|
16
|
+
end
|
8
17
|
|
9
|
-
|
18
|
+
def __nu_format(number, units)
|
19
|
+
I18n.t('number.human.storage_units.format', default: '%n %u')
|
20
|
+
.sub('%n', number)
|
21
|
+
.sub('%u', units)
|
22
|
+
end
|
10
23
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
u = fsz[0]
|
22
|
-
fmt = I18n.t('number.human.storage_units.format', default: '%n %u')
|
23
|
-
fmt.sub('%n', n).sub('%u', u)
|
24
|
+
def __i18n_filesize
|
25
|
+
{
|
26
|
+
I18n.t('number.human.storage_units.byte.other', default: 'Bytes') => 1024,
|
27
|
+
I18n.t('number.human.storage_units.kb', default: 'KB') => 1024**2,
|
28
|
+
I18n.t('number.human.storage_units.mb', default: 'MB') => 1024**3,
|
29
|
+
I18n.t('number.human.storage_units.gb', default: 'GB') => 1024**4,
|
30
|
+
I18n.t('number.human.storage_units.tb', default: 'TB') => 1024**5,
|
31
|
+
I18n.t('number.human.storage_units.pb', default: 'PB') => 1024**6
|
32
|
+
}.select { |_, v| self < v }.first
|
33
|
+
end
|
24
34
|
end
|
25
35
|
|
26
36
|
end
|
27
|
-
|
28
|
-
|
29
37
|
end
|
30
|
-
end
|
38
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'mail'
|
4
|
+
|
5
|
+
module Tzispa
|
6
|
+
module Utils
|
7
|
+
|
8
|
+
class Mail
|
9
|
+
attr_accessor :from, :to, :subject, :content, :cc,
|
10
|
+
:html, :charset, :debug
|
11
|
+
|
12
|
+
attr_reader :config, :mail, :logger
|
13
|
+
|
14
|
+
DEFAULT_CHARSET = 'UTF-8'
|
15
|
+
|
16
|
+
def initialize(config, logger = nil)
|
17
|
+
@hmtl = false
|
18
|
+
@debug = false
|
19
|
+
@charset = DEFAULT_CHARSET
|
20
|
+
@logger = logger
|
21
|
+
@config = config
|
22
|
+
smtp_configuration(config)
|
23
|
+
@mail = ::Mail.new
|
24
|
+
end
|
25
|
+
|
26
|
+
def send_mail
|
27
|
+
recipients
|
28
|
+
body
|
29
|
+
mail.subject = subject
|
30
|
+
mail.charset = charset
|
31
|
+
mail.deliver
|
32
|
+
rescue
|
33
|
+
raise if debug
|
34
|
+
end
|
35
|
+
|
36
|
+
def add_file(path, attach_name)
|
37
|
+
mail.attachments[attach_name] = File.read(path)
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def recipients
|
43
|
+
mail.from = from
|
44
|
+
mail.to to.split(';')
|
45
|
+
return unless cc
|
46
|
+
mail.cc cc.split(';')
|
47
|
+
end
|
48
|
+
|
49
|
+
def body
|
50
|
+
if html
|
51
|
+
mail.html_part do
|
52
|
+
content_type "text/html; charset=#{charset}"
|
53
|
+
body content
|
54
|
+
end
|
55
|
+
else
|
56
|
+
mail.body = content
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def smtp_configuration(config)
|
61
|
+
if config.smtp_auth
|
62
|
+
auth_delivery(config)
|
63
|
+
else
|
64
|
+
delivery(config)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def delivery(config)
|
69
|
+
::Mail.defaults do
|
70
|
+
delivery_method :smtp, address: config.host, domain: config.domain,
|
71
|
+
port: config.port, openssl_verify_mode: config.openssl_verify,
|
72
|
+
enable_starttls_auto: config.starttls_auto
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def auth_delivery(config)
|
77
|
+
::Mail.defaults do
|
78
|
+
delivery_method :smtp, address: config.host, domain: config.domain,
|
79
|
+
port: config.port, authentication: config.authentication,
|
80
|
+
openssl_verify_mode: config.openssl_verify,
|
81
|
+
enable_starttls_auto: config.starttls_auto,
|
82
|
+
user_name: config.user_name, password: config.password
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
88
|
+
end
|
data/lib/tzispa/utils/string.rb
CHANGED
@@ -1,183 +1,181 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'i18n'
|
2
4
|
require 'sanitize'
|
3
5
|
require 'escape_utils'
|
4
6
|
|
5
7
|
module Tzispa
|
6
8
|
module Utils
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
9
|
+
module TzString
|
10
|
+
|
11
|
+
NAMESPACE_SEPARATOR = '::'
|
12
|
+
CLASSIFY_SEPARATOR = '_'
|
13
|
+
UNDERSCORE_SEPARATOR = '/'
|
14
|
+
DOT_SEPARATOR = '.'
|
15
|
+
UNDERSCORE_DIVISION_TARGET = '\1_\2'
|
16
|
+
|
17
|
+
refine String do
|
18
|
+
def constantize
|
19
|
+
names = split(NAMESPACE_SEPARATOR)
|
20
|
+
names.shift if names.empty? || names.first.empty?
|
21
|
+
constant = Object
|
22
|
+
names.each do |name|
|
23
|
+
constant = if constant.const_defined?(name)
|
24
|
+
constant.const_get(name)
|
25
|
+
else
|
26
|
+
constant.const_missing(name)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
constant
|
23
30
|
end
|
24
|
-
constant
|
25
|
-
end
|
26
31
|
|
27
|
-
|
28
|
-
|
29
|
-
|
32
|
+
def camelize
|
33
|
+
split(CLASSIFY_SEPARATOR).collect(&:capitalize).join
|
34
|
+
end
|
30
35
|
|
31
|
-
|
32
|
-
|
33
|
-
|
36
|
+
def camelize!
|
37
|
+
split(CLASSIFY_SEPARATOR).collect!(&:capitalize).join
|
38
|
+
end
|
34
39
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
+
def dottize
|
41
|
+
dup.tap do |s|
|
42
|
+
s.gsub!(NAMESPACE_SEPARATOR, DOT_SEPARATOR)
|
43
|
+
s.gsub!(/([A-Z\d]+)([A-Z][a-z])/, UNDERSCORE_DIVISION_TARGET)
|
44
|
+
s.gsub!(/([a-z\d])([A-Z])/, UNDERSCORE_DIVISION_TARGET)
|
45
|
+
s.gsub!(/[[:space:]]|\-/, UNDERSCORE_DIVISION_TARGET)
|
46
|
+
s.downcase!
|
47
|
+
end
|
48
|
+
end
|
40
49
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
+
def dottize!
|
51
|
+
tap do |s|
|
52
|
+
s.gsub!(NAMESPACE_SEPARATOR, DOT_SEPARATOR)
|
53
|
+
s.gsub!(/([A-Z\d]+)([A-Z][a-z])/, UNDERSCORE_DIVISION_TARGET)
|
54
|
+
s.gsub!(/([a-z\d])([A-Z])/, UNDERSCORE_DIVISION_TARGET)
|
55
|
+
s.gsub!(/[[:space:]]|\-/, UNDERSCORE_DIVISION_TARGET)
|
56
|
+
s.downcase!
|
57
|
+
end
|
58
|
+
end
|
50
59
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
}
|
55
|
-
end
|
60
|
+
def underscore
|
61
|
+
dup.tap(&:underscore!)
|
62
|
+
end
|
56
63
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
64
|
+
def underscore!
|
65
|
+
tap do |s|
|
66
|
+
s.gsub!(NAMESPACE_SEPARATOR, UNDERSCORE_SEPARATOR)
|
67
|
+
s.gsub!(/([A-Z\d]+)([A-Z][a-z])/, UNDERSCORE_DIVISION_TARGET)
|
68
|
+
s.gsub!(/([a-z\d])([A-Z])/, UNDERSCORE_DIVISION_TARGET)
|
69
|
+
s.gsub!(/[[:space:]]|\-/, UNDERSCORE_DIVISION_TARGET)
|
70
|
+
s.downcase!
|
71
|
+
end
|
72
|
+
end
|
66
73
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
}
|
71
|
-
end
|
74
|
+
def indentize(count, char = ' ')
|
75
|
+
dup.tap { |str| str.indentize! count, char }
|
76
|
+
end
|
72
77
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
78
|
+
# Indent a string by count chars
|
79
|
+
def indentize!(count, char = ' ')
|
80
|
+
gsub!(/([^\n]*)(\n|$)/) do
|
81
|
+
s1 = Regexp.last_match(1)
|
82
|
+
s2 = Regexp.last_match(2)
|
83
|
+
last_iteration = (s1 == '' && s2 == '')
|
84
|
+
line = String.new
|
79
85
|
line << (char * count) unless last_iteration
|
80
|
-
line <<
|
81
|
-
line << $2
|
86
|
+
line << s1 << s2
|
82
87
|
line
|
83
88
|
end
|
84
|
-
|
85
|
-
end
|
86
|
-
|
89
|
+
end
|
87
90
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
91
|
+
# Replace accents in the string using I18n.transliterate
|
92
|
+
def transliterate(locale = nil)
|
93
|
+
I18n.transliterate(self, ({ locale: locale } if locale))
|
94
|
+
end
|
92
95
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
96
|
+
# Convert a string to a format suitable for a URL without ever using escaped characters.
|
97
|
+
# It calls strip, transliterate, downcase (optional) then removes the spaces (optional)
|
98
|
+
# and finally removes any characters matching the default regexp (/[^-_A-Za-z0-9]/).
|
99
|
+
#
|
100
|
+
# Options
|
101
|
+
#
|
102
|
+
# * :downcase => call downcase on the string (defaults to true)
|
103
|
+
# * :convert_spaces => Convert space to underscore (defaults to true)
|
104
|
+
# * :regexp => matching characters that will be removed (defaults to /[^-_A-Za-z0-9]/)
|
105
|
+
def urlize(options = {})
|
106
|
+
options[:downcase] ||= true
|
107
|
+
options[:convert_spaces] ||= true
|
108
|
+
options[:regexp] ||= /[^-_A-Za-z0-9]/
|
109
|
+
|
110
|
+
transliterate(options[:locale]).strip.tap do |str|
|
111
|
+
str.downcase! if options[:downcase]
|
112
|
+
str.tr!(' ', '_') if options[:convert_spaces]
|
113
|
+
str.gsub!(options[:regexp], '')
|
114
|
+
end
|
115
|
+
end
|
113
116
|
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
117
|
+
def length_constraint_wordify(max, word_splitter = ' ')
|
118
|
+
ml = 0
|
119
|
+
split(word_splitter).take_while { |s| (ml += s.length + 1) <= max }.join(word_splitter)
|
120
|
+
end
|
118
121
|
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
alias sanitize_htm sanitize_html
|
122
|
+
def sanitize_html(level = nil)
|
123
|
+
level ? Sanitize.fragment(self, level) : Sanitize.fragment(self)
|
124
|
+
end
|
125
|
+
alias_method :sanitize_htm, :sanitize_html
|
124
126
|
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
127
|
+
def escape_html
|
128
|
+
EscapeUtils.escape_html(self)
|
129
|
+
end
|
130
|
+
alias_method :escape_htm, :escape_html
|
129
131
|
|
130
|
-
|
131
|
-
|
132
|
+
def unescape_html
|
133
|
+
EscapeUtils.unescape_html(self)
|
134
|
+
end
|
135
|
+
alias_method :unescape_htm, :unescape_html
|
132
136
|
end
|
133
|
-
alias_method :unescape_htm, :unescape_html
|
134
137
|
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
def underscore(str)
|
141
|
-
String.new(str).underscore
|
142
|
-
end
|
138
|
+
refine String.singleton_class do
|
139
|
+
def underscore(str)
|
140
|
+
String.new(str).underscore
|
141
|
+
end
|
143
142
|
|
144
|
-
|
145
|
-
|
146
|
-
|
143
|
+
def camelize(str)
|
144
|
+
String.new(str).camelize
|
145
|
+
end
|
147
146
|
|
148
|
-
|
149
|
-
|
150
|
-
|
147
|
+
def dottize(str)
|
148
|
+
String.new(str).dottize
|
149
|
+
end
|
151
150
|
|
152
|
-
|
153
|
-
|
154
|
-
|
151
|
+
def constantize(str)
|
152
|
+
String.new(str).constantize
|
153
|
+
end
|
155
154
|
|
156
|
-
|
157
|
-
|
158
|
-
|
155
|
+
def urlize(str)
|
156
|
+
String.new(str).urlize
|
157
|
+
end
|
159
158
|
|
160
|
-
|
161
|
-
|
162
|
-
|
159
|
+
def indentize(str, count, char = ' ')
|
160
|
+
String.new(str).indentize count, char
|
161
|
+
end
|
163
162
|
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
163
|
+
def sanitize_html(str, level = nil)
|
164
|
+
String.new(str).santize(level)
|
165
|
+
end
|
166
|
+
alias_method :sanitize_htm, :sanitize_html
|
168
167
|
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
168
|
+
def escape_html(str)
|
169
|
+
String.new(str).escape_html
|
170
|
+
end
|
171
|
+
alias_method :escape_htm, :escape_html
|
173
172
|
|
174
|
-
|
175
|
-
|
173
|
+
def unescape_html(str)
|
174
|
+
String.new(str).unescape_html
|
175
|
+
end
|
176
|
+
alias_method :unescape_htm, :unescape_html
|
176
177
|
end
|
177
|
-
alias_method :unescape_htm, :unescape_html
|
178
178
|
|
179
179
|
end
|
180
|
-
|
181
|
-
|
182
180
|
end
|
183
181
|
end
|
data/lib/tzispa/utils/version.rb
CHANGED
data/test/decorator_test.rb
CHANGED
@@ -1,26 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'test_helper'
|
2
4
|
|
3
5
|
class BaseClass
|
4
|
-
|
5
6
|
attr_accessor :a, :b
|
6
7
|
|
7
8
|
def sum
|
8
|
-
a+b
|
9
|
+
(a + b)
|
9
10
|
end
|
10
|
-
|
11
11
|
end
|
12
12
|
|
13
13
|
class DecoratedClass < Tzispa::Utils::Decorator
|
14
|
-
|
15
14
|
def substract
|
16
|
-
b-a
|
15
|
+
(b - a)
|
17
16
|
end
|
18
|
-
|
19
17
|
end
|
20
18
|
|
21
|
-
|
22
19
|
class DecoratorTest < Minitest::Test
|
23
|
-
|
24
20
|
def setup
|
25
21
|
@base = BaseClass.new
|
26
22
|
@base.a = 12
|
data/test/hash_test.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
require 'tzispa/utils/hash'
|
5
|
+
|
6
|
+
class HashTest < Minitest::Test
|
7
|
+
using Tzispa::Utils::TzHash
|
8
|
+
|
9
|
+
def test_symbolize
|
10
|
+
s1 = { 'one' => 1, 'two' => 2 }
|
11
|
+
s1s = { one: 1, two: 2 }
|
12
|
+
assert_equal s1.symbolize.keys, [:one, :two]
|
13
|
+
assert_equal s1.symbolize, s1s
|
14
|
+
refute_equal s1, s1s
|
15
|
+
s1.symbolize!
|
16
|
+
assert_equal s1, s1s
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_deep_symbolize
|
20
|
+
s2 = { 'one' => 1, 'two' => { 'one' => 1, 'two' => 2 } }
|
21
|
+
s2s = { one: 1, two: { 'one' => 1, 'two' => 2 } }
|
22
|
+
s2d = { one: 1, two: { one: 1, two: 2 } }
|
23
|
+
s2m = { 'one' => 1, 'two' => { one: 1, two: 2 } }
|
24
|
+
assert_equal s2.symbolize, s2s
|
25
|
+
assert_equal s2.deep_symbolize, s2d
|
26
|
+
refute_equal s2, s2d
|
27
|
+
refute_equal s2, s2m
|
28
|
+
s2.deep_symbolize!
|
29
|
+
assert_equal s2, s2d
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_stringify
|
33
|
+
s1 = { 'one' => 1, 'two' => 2 }
|
34
|
+
s1s = { one: 1, two: 2 }
|
35
|
+
assert_equal s1s.stringify.keys, %w(one two)
|
36
|
+
assert_equal s1s.stringify, s1
|
37
|
+
refute_equal s1, s1s
|
38
|
+
s1s.stringify!
|
39
|
+
assert_equal s1, s1s
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_tuplify
|
43
|
+
s1 = { 'one' => 1, 'two' => 2, 'three' => 3 }
|
44
|
+
s2 = { file: %w(read write delete), document: %w(read update), folder: 'read' }
|
45
|
+
assert_equal s1.tuplify,
|
46
|
+
[['one', 1], ['two', 2], ['three', 3]]
|
47
|
+
assert_equal s2.tuplify,
|
48
|
+
[[:file, 'read'], [:file, 'write'], [:file, 'delete'],
|
49
|
+
[:document, 'read'], [:document, 'update'],
|
50
|
+
[:folder, 'read']]
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
data/test/indenter_test.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'test_helper'
|
2
4
|
|
3
5
|
class IndenterTest < Minitest::Test
|
@@ -7,13 +9,15 @@ class IndenterTest < Minitest::Test
|
|
7
9
|
end
|
8
10
|
|
9
11
|
def test_indenter
|
10
|
-
str_t =
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
12
|
+
str_t = 'indenter test'
|
13
|
+
assert_equal (@ind.indent << str_t).to_s,
|
14
|
+
' indenter test'
|
15
|
+
assert_equal (@ind.indent << str_t).to_s,
|
16
|
+
' indenter test indenter test'
|
17
|
+
assert_equal (@ind.unindent << str_t).to_s,
|
18
|
+
' indenter test indenter test indenter test'
|
19
|
+
assert_equal (@ind.unindent << str_t).to_s,
|
20
|
+
' indenter test indenter test indenter testindenter test'
|
15
21
|
end
|
16
22
|
|
17
|
-
|
18
|
-
|
19
23
|
end
|
data/test/integer_test.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class IntegerTest < Minitest::Test
|
4
|
-
using Tzispa::Utils
|
4
|
+
using Tzispa::Utils::TzInteger
|
5
5
|
|
6
6
|
def setup
|
7
7
|
I18n.enforce_available_locales = false
|
@@ -12,6 +12,8 @@ class IntegerTest < Minitest::Test
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def test_filesize
|
15
|
+
I18n.load_path = nil
|
16
|
+
I18n.default_locale = nil
|
15
17
|
assert_equal 8192.to_filesize, '8 KB'
|
16
18
|
assert_equal 8192000.to_filesize, '7.8 MB'
|
17
19
|
assert_equal 8388608.to_filesize, '8 MB'
|
data/test/string_test.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tzispa_utils
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Juan Antonio Piñero
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-03-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: i18n
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '1.2'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: mail
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '2.6'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '2.6'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: minitest
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -66,7 +80,7 @@ dependencies:
|
|
66
80
|
- - "~>"
|
67
81
|
- !ruby/object:Gem::Version
|
68
82
|
version: '5.0'
|
69
|
-
description: Utility classes used
|
83
|
+
description: Utility classes used by Tzispa framework
|
70
84
|
email:
|
71
85
|
- japinero@area-integral.com
|
72
86
|
executables: []
|
@@ -83,10 +97,12 @@ files:
|
|
83
97
|
- lib/tzispa/utils/hash.rb
|
84
98
|
- lib/tzispa/utils/indenter.rb
|
85
99
|
- lib/tzispa/utils/integer.rb
|
100
|
+
- lib/tzispa/utils/mail.rb
|
86
101
|
- lib/tzispa/utils/string.rb
|
87
102
|
- lib/tzispa/utils/version.rb
|
88
103
|
- lib/tzispa_utils.rb
|
89
104
|
- test/decorator_test.rb
|
105
|
+
- test/hash_test.rb
|
90
106
|
- test/indenter_test.rb
|
91
107
|
- test/integer_test.rb
|
92
108
|
- test/res/locales/es.yml
|
@@ -100,6 +116,7 @@ post_install_message:
|
|
100
116
|
rdoc_options: []
|
101
117
|
require_paths:
|
102
118
|
- lib
|
119
|
+
- test
|
103
120
|
required_ruby_version: !ruby/object:Gem::Requirement
|
104
121
|
requirements:
|
105
122
|
- - "~>"
|