cowtech-extensions 1.6.3 → 1.6.4
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/cowtech-extensions.rb +4 -2
- data/lib/cowtech-extensions/boolean.rb +0 -7
- data/lib/cowtech-extensions/object.rb +42 -13
- data/lib/cowtech-extensions/utils.rb +26 -0
- data/lib/cowtech-extensions/version.rb +1 -1
- data/spec/cowtech-extensions/datetime_spec.rb +7 -1
- data/spec/cowtech-extensions/object_spec.rb +209 -1
- metadata +4 -4
data/lib/cowtech-extensions.rb
CHANGED
@@ -20,6 +20,10 @@ require "cowtech-extensions/pathname"
|
|
20
20
|
|
21
21
|
module Cowtech
|
22
22
|
module Extensions
|
23
|
+
def self.settings
|
24
|
+
Cowtech::Extensions::Settings.instance
|
25
|
+
end
|
26
|
+
|
23
27
|
def self.load!(*what)
|
24
28
|
what = ["object", "boolean", "string", "hash", "datetime", "math", "pathname"] if what.count == 0
|
25
29
|
what.collect! { |w| w.to_s }
|
@@ -42,8 +46,6 @@ module Cowtech
|
|
42
46
|
include Cowtech::Extensions::Object
|
43
47
|
include Cowtech::Extensions::Boolean
|
44
48
|
end
|
45
|
-
|
46
|
-
TrueClass.cowtech_extensions_setup
|
47
49
|
end
|
48
50
|
|
49
51
|
if what.include?("string") then
|
@@ -4,27 +4,33 @@
|
|
4
4
|
# Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
|
5
5
|
#
|
6
6
|
|
7
|
-
# TODO: To test
|
8
7
|
module Cowtech
|
9
8
|
module Extensions
|
10
9
|
module Object
|
11
10
|
include ActionView::Helpers::NumberHelper
|
12
11
|
extend ActiveSupport::Concern
|
13
12
|
|
13
|
+
def normalize_number
|
14
|
+
rv = self.ensure_string.strip
|
15
|
+
rv = rv.split(/[\.,]/)
|
16
|
+
rv[-1] = "." + rv[-1] if rv.length > 1
|
17
|
+
rv.join("")
|
18
|
+
end
|
19
|
+
|
14
20
|
def is_number?
|
15
21
|
self.is_float?
|
16
22
|
end
|
17
23
|
|
18
24
|
def is_integer?
|
19
|
-
self.is_a?(Integer) || /^([+-]?)(\d+)$/.match(self.
|
25
|
+
self.is_a?(Integer) || /^([+-]?)(\d+)$/.match(self.normalize_number)
|
20
26
|
end
|
21
27
|
|
22
28
|
def is_float?
|
23
|
-
self.is_a?(Float) || /^([+-]?)(\d+)([.,]\d+)?$/.match(self.
|
29
|
+
self.is_a?(Float) || /^([+-]?)(\d+)([.,]\d+)?$/.match(self.normalize_number)
|
24
30
|
end
|
25
31
|
|
26
32
|
def is_boolean?
|
27
|
-
self.is_a?(TrueClass) || self.is_a?(FalseClass) || self.is_a?(NilClass) || /^(1|0|true|false|yes|no|t|f|y|n)$/i
|
33
|
+
self.is_a?(TrueClass) || self.is_a?(FalseClass) || self.is_a?(NilClass) || (self.ensure_string.strip =~ /^(1|0|true|false|yes|no|t|f|y|n)$/i)
|
28
34
|
end
|
29
35
|
|
30
36
|
def ensure_array
|
@@ -35,28 +41,51 @@ module Cowtech
|
|
35
41
|
self.present? ? self.to_s : ""
|
36
42
|
end
|
37
43
|
|
38
|
-
def to_float
|
39
|
-
|
44
|
+
def to_float(default_value = 0.0)
|
45
|
+
if self.is_a?(Float)
|
46
|
+
self
|
47
|
+
elsif self.is_a?(Integer)
|
48
|
+
self.to_f
|
49
|
+
else
|
50
|
+
self.is_float? ? Kernel.Float(self.normalize_number) : default_value
|
51
|
+
end
|
40
52
|
end
|
41
53
|
|
42
|
-
def to_integer
|
43
|
-
self.
|
54
|
+
def to_integer(default_value = 0)
|
55
|
+
if self.is_a?(Integer)
|
56
|
+
self
|
57
|
+
elsif self.is_a?(Float)
|
58
|
+
self.to_i
|
59
|
+
else
|
60
|
+
self.is_integer? ? Kernel.Integer(self.normalize_number) : default_value
|
61
|
+
end
|
44
62
|
end
|
45
63
|
|
46
64
|
def to_boolean
|
47
|
-
|
65
|
+
rv = self
|
66
|
+
rv = rv.to_i if rv.is_a?(Float)
|
67
|
+
(rv.is_a?(TrueClass) || /^(1|on|true|yes|t|y)$/i.match(rv.ensure_string.strip)) ? true : false
|
48
68
|
end
|
49
69
|
|
50
70
|
def round_to_precision(prec = 2)
|
51
|
-
|
71
|
+
(self.is_number? && prec >= 0) ? number_with_precision(self, :precision => prec) : nil
|
52
72
|
end
|
53
73
|
|
54
|
-
def format_number(prec =
|
55
|
-
|
74
|
+
def format_number(prec = nil, decimal_separator = nil, add_string = nil, k_separator = nil)
|
75
|
+
prec = Cowtech::Extensions.settings.format_number[:prec] if prec.nil?
|
76
|
+
decimal_separator = Cowtech::Extensions.settings.format_number[:decimal_separator] if decimal_separator.nil?
|
77
|
+
add_string = Cowtech::Extensions.settings.format_number[:add_string] if add_string.nil?
|
78
|
+
k_separator = Cowtech::Extensions.settings.format_number[:k_separator] if k_separator.nil?
|
79
|
+
|
80
|
+
(self.is_number? && prec >= 0) ? number_to_currency(self, {:precision => prec, :separator => decimal_separator, :delimiter => k_separator, :format => add_string.blank? ? "%n" : "%n %u", :unit => add_string.blank? ? "" : add_string.strip}) : nil
|
56
81
|
end
|
57
82
|
|
83
|
+
def set_defaults_for_format_number
|
84
|
+
|
85
|
+
end
|
86
|
+
|
58
87
|
def format_boolean
|
59
|
-
|
88
|
+
Cowtech::Extensions.settings.boolean_names[self.to_boolean]
|
60
89
|
end
|
61
90
|
|
62
91
|
def debug_dump(format = :yaml, must_raise = true)
|
@@ -6,6 +6,32 @@
|
|
6
6
|
|
7
7
|
module Cowtech
|
8
8
|
module Extensions
|
9
|
+
class Settings
|
10
|
+
attr_reader :format_number, :date_names, :boolean_names
|
11
|
+
|
12
|
+
def self.instance
|
13
|
+
@@instance ||= Cowtech::Extensions::Settings.new
|
14
|
+
end
|
15
|
+
|
16
|
+
def initialize
|
17
|
+
self.setup_format_number
|
18
|
+
self.setup_boolean_names
|
19
|
+
end
|
20
|
+
|
21
|
+
def setup_format_number(prec = 2, decimal_separator = ".", add_string = "", k_separator = ",")
|
22
|
+
@format_number = {
|
23
|
+
:prec => prec,
|
24
|
+
:decimal_separator => decimal_separator,
|
25
|
+
:add_string => add_string,
|
26
|
+
:k_separator => k_separator
|
27
|
+
}
|
28
|
+
end
|
29
|
+
|
30
|
+
def setup_boolean_names(true_name = "Yes", false_name = "No")
|
31
|
+
@boolean_names = {true => true_name, false => false_name}
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
9
35
|
module Exceptions
|
10
36
|
class Dump < ::RuntimeError
|
11
37
|
end
|
@@ -2,4 +2,10 @@
|
|
2
2
|
#
|
3
3
|
# This file is part of the cowtech-extensions gem. Copyright (C) 2011 and above Shogun <shogun_panda@me.com>.
|
4
4
|
# Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
|
5
|
-
#
|
5
|
+
#
|
6
|
+
|
7
|
+
require "spec_helper"
|
8
|
+
|
9
|
+
describe Cowtech::Extensions::DateTime do
|
10
|
+
|
11
|
+
end
|
@@ -2,4 +2,212 @@
|
|
2
2
|
#
|
3
3
|
# This file is part of the cowtech-extensions gem. Copyright (C) 2011 and above Shogun <shogun_panda@me.com>.
|
4
4
|
# Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
|
5
|
-
#
|
5
|
+
#
|
6
|
+
|
7
|
+
require "spec_helper"
|
8
|
+
|
9
|
+
describe Cowtech::Extensions::Object do
|
10
|
+
describe "#normalize_number" do
|
11
|
+
it "should correctly sanitize numbers" do
|
12
|
+
123.normalize_number.should == "123"
|
13
|
+
"123.45".normalize_number.should == "123.45"
|
14
|
+
"1,23.45".normalize_number.should == "123.45"
|
15
|
+
"-1.23.45".normalize_number.should == "-123.45"
|
16
|
+
"+123.45".normalize_number.should == "+123.45"
|
17
|
+
"+1.231,45".normalize_number.should == "+1231.45"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "#is_number?" do
|
22
|
+
it "should return true for a valid number" do
|
23
|
+
"123.45".is_number?.should be_true
|
24
|
+
"1,23.45".is_number?.should be_true
|
25
|
+
"-1.23.45".is_number?.should be_true
|
26
|
+
"+123.45".is_number?.should be_true
|
27
|
+
"+1.231,45".is_number?.should be_true
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should return true for a invalid number" do
|
31
|
+
"s213".is_number?.should be_false
|
32
|
+
nil.is_number?.should be_false
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe "#is_integer?" do
|
37
|
+
it "should return true for a valid number" do
|
38
|
+
"123".is_integer?.should be_true
|
39
|
+
"-123".is_integer?.should be_true
|
40
|
+
"+123".is_integer?.should be_true
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should return true for a invalid number" do
|
44
|
+
"s123".is_integer?.should be_false
|
45
|
+
"123.12".is_integer?.should be_false
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "#is_float?" do
|
50
|
+
it "should return true for a valid number" do
|
51
|
+
"123.45".is_float?.should be_true
|
52
|
+
"1,23.45".is_float?.should be_true
|
53
|
+
"-1.23.45".is_float?.should be_true
|
54
|
+
"+123.45".is_float?.should be_true
|
55
|
+
"+1.231,45".is_float?.should be_true
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should return true for a invalid number" do
|
59
|
+
"s213".is_float?.should be_false
|
60
|
+
nil.is_float?.should be_false
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe "#is_boolean?" do
|
65
|
+
it "should return true for a valid boolean" do
|
66
|
+
true.is_boolean?.should be_true
|
67
|
+
false.is_boolean?.should be_true
|
68
|
+
nil.is_boolean?.should be_true
|
69
|
+
"y".is_boolean?.should be_true
|
70
|
+
"n".is_boolean?.should be_true
|
71
|
+
"yes".is_boolean?.should be_true
|
72
|
+
"no".is_boolean?.should be_true
|
73
|
+
"1".is_boolean?.should be_true
|
74
|
+
"0".is_boolean?.should be_true
|
75
|
+
"true".is_boolean?.should be_true
|
76
|
+
"false".is_boolean?.should be_true
|
77
|
+
"t".is_boolean?.should be_true
|
78
|
+
"f".is_boolean?.should be_true
|
79
|
+
1.is_boolean?.should be_true
|
80
|
+
0.is_boolean?.should be_true
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should return true for a invalid boolean" do
|
84
|
+
"11".is_boolean?.should be_false
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
describe "#ensure_string" do
|
89
|
+
it "should correctly handle strings" do
|
90
|
+
" abc ".ensure_string.should == " abc "
|
91
|
+
1.ensure_string == "1"
|
92
|
+
1.0.ensure_string.should == "1.0"
|
93
|
+
:abc.ensure_string.should == "abc"
|
94
|
+
nil.ensure_string.should == ""
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
describe "#to_float" do
|
99
|
+
it "should correctly convert number" do
|
100
|
+
123.45.to_float.should == 123.45
|
101
|
+
123.to_float.should == 123.00
|
102
|
+
"123.45".to_float.should == 123.45
|
103
|
+
"1,23.45".to_float.should == 123.45
|
104
|
+
"-1.23.45".to_float.should == -123.45
|
105
|
+
"+123.45".to_float.should == 123.45
|
106
|
+
"+1.231,45".to_float.should == 1231.45
|
107
|
+
end
|
108
|
+
|
109
|
+
it "should return 0.0 for a invalid number without a default" do
|
110
|
+
"s213".to_float.should == 0.0
|
111
|
+
end
|
112
|
+
|
113
|
+
it "should return the default for a invalid number" do
|
114
|
+
"s213".to_float(1.0).should == 1.0
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
describe "#to_integer" do
|
119
|
+
it "should correctly convert number" do
|
120
|
+
123.45.to_integer.should == 123
|
121
|
+
123.to_integer.should == 123
|
122
|
+
"+123".to_integer.should == 123
|
123
|
+
"-123".to_integer.should == -123
|
124
|
+
end
|
125
|
+
|
126
|
+
it "should return 0 for a invalid number without a default" do
|
127
|
+
"s213".to_integer.should == 0
|
128
|
+
end
|
129
|
+
|
130
|
+
it "should return the default for a invalid number" do
|
131
|
+
"s213".to_integer(1).should == 1
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
describe "#to_boolean" do
|
136
|
+
it "should return true for a valid true boolean" do
|
137
|
+
true.to_boolean.should be_true
|
138
|
+
"y".to_boolean.should be_true
|
139
|
+
"yes".to_boolean.should be_true
|
140
|
+
"1".to_boolean.should be_true
|
141
|
+
1.to_boolean.should be_true
|
142
|
+
1.0.to_boolean.should be_true
|
143
|
+
end
|
144
|
+
|
145
|
+
it "should return false for all other values" do
|
146
|
+
false.to_boolean.should be_false
|
147
|
+
nil.to_boolean.should be_false
|
148
|
+
"n".to_boolean.should be_false
|
149
|
+
"no".to_boolean.should be_false
|
150
|
+
"2".to_boolean.should be_false
|
151
|
+
2.0.to_boolean.should be_false
|
152
|
+
"false".to_boolean.should be_false
|
153
|
+
"abc".to_boolean.should be_false
|
154
|
+
0.to_boolean.should be_false
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
describe "#round_to_precision" do
|
159
|
+
it "should round number" do
|
160
|
+
123.456789.round_to_precision(2).should == "123.46"
|
161
|
+
123.456789.round_to_precision(0).should == "123"
|
162
|
+
"123.456789".round_to_precision(2).should == "123.46"
|
163
|
+
end
|
164
|
+
|
165
|
+
it "should return nil for non numeric values" do
|
166
|
+
123.456789.round_to_precision(-1).should == nil
|
167
|
+
"abc".round_to_precision(-1).should == nil
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
describe "#format_number" do
|
172
|
+
it "should format number" do
|
173
|
+
123123.456789.format_number.should == "123,123.46"
|
174
|
+
123123.456789.format_number(2).should == "123,123.46"
|
175
|
+
123123.456789.format_number(3, "@").should == "123,123@457"
|
176
|
+
123123.456789.format_number(3, "@", "$").should == "123,123@457 $"
|
177
|
+
"123123.456789".format_number(3, "@", "$", "!").should == "123!123@457 $"
|
178
|
+
|
179
|
+
Cowtech::Extensions.settings.setup_format_number(5, ",", "£", ".")
|
180
|
+
123123.456789.format_number.should == "123.123,45679 £"
|
181
|
+
end
|
182
|
+
|
183
|
+
it "should return nil for non numeric values" do
|
184
|
+
123.456789.format_number(-1).should == nil
|
185
|
+
"abc".format_number(-1).should == nil
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
describe "#format_boolean" do
|
190
|
+
it "should return the correct string for all values" do
|
191
|
+
"yes".format_boolean.should == "Yes"
|
192
|
+
"abc".format_boolean.should == "No"
|
193
|
+
end
|
194
|
+
|
195
|
+
it "should support localization" do
|
196
|
+
Cowtech::Extensions.settings.setup_boolean_names("YYY", "NNN")
|
197
|
+
"yes".format_boolean.should == "YYY"
|
198
|
+
"abc".format_boolean.should == "NNN"
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
describe "#debug_dump" do
|
203
|
+
it "should return the correct representation for an object" do
|
204
|
+
reference = {:a => "b"}
|
205
|
+
reference.debug_dump(:json, false).should == reference.to_json
|
206
|
+
reference.debug_dump(:yaml, false).should == reference.to_yaml
|
207
|
+
end
|
208
|
+
|
209
|
+
it "should raise an exception if requested" do
|
210
|
+
expect { {:a => "b"}.debug_dump }.to raise_error(Cowtech::Extensions::Exceptions::Dump)
|
211
|
+
end
|
212
|
+
end
|
213
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cowtech-extensions
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 7
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 6
|
9
|
-
-
|
10
|
-
version: 1.6.
|
9
|
+
- 4
|
10
|
+
version: 1.6.4
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Shogun
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-06-
|
18
|
+
date: 2012-06-07 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: actionpack
|