tzispa_utils 0.3.1 → 0.3.2
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 +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
|
- - "~>"
|