activesupport-refinements 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +17 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +22 -0
- data/README.md +32 -0
- data/Rakefile +1 -0
- data/activesupport-refinements.gemspec +21 -0
- data/lib/active_support/refinements/core_ext/array.rb +7 -0
- data/lib/active_support/refinements/core_ext/array/access.rb +56 -0
- data/lib/active_support/refinements/core_ext/array/conversions.rb +224 -0
- data/lib/active_support/refinements/core_ext/array/extract_options.rb +31 -0
- data/lib/active_support/refinements/core_ext/array/grouping.rb +101 -0
- data/lib/active_support/refinements/core_ext/array/prepend_and_append.rb +9 -0
- data/lib/active_support/refinements/core_ext/array/uniq_by.rb +21 -0
- data/lib/active_support/refinements/core_ext/array/wrap.rb +48 -0
- data/lib/active_support/refinements/core_ext/benchmark.rb +7 -0
- data/lib/active_support/refinements/core_ext/big_decimal.rb +1 -0
- data/lib/active_support/refinements/core_ext/big_decimal/conversions.rb +32 -0
- data/lib/active_support/refinements/core_ext/class.rb +4 -0
- data/lib/active_support/refinements/core_ext/class/attribute.rb +119 -0
- data/lib/active_support/refinements/core_ext/class/attribute_accessors.rb +172 -0
- data/lib/active_support/refinements/core_ext/class/delegating_attributes.rb +42 -0
- data/lib/active_support/refinements/core_ext/class/subclasses.rb +44 -0
- data/lib/active_support/refinements/core_ext/date.rb +5 -0
- data/lib/active_support/refinements/core_ext/date/acts_like.rb +10 -0
- data/lib/active_support/refinements/core_ext/date/calculations.rb +123 -0
- data/lib/active_support/refinements/core_ext/date/conversions.rb +86 -0
- data/lib/active_support/refinements/core_ext/date/zones.rb +17 -0
- data/lib/active_support/refinements/core_ext/date_and_time/calculations.rb +232 -0
- data/lib/active_support/refinements/core_ext/date_time.rb +4 -0
- data/lib/active_support/refinements/core_ext/date_time/acts_like.rb +15 -0
- data/lib/active_support/refinements/core_ext/date_time/calculations.rb +143 -0
- data/lib/active_support/refinements/core_ext/date_time/conversions.rb +93 -0
- data/lib/active_support/refinements/core_ext/date_time/zones.rb +26 -0
- data/lib/active_support/refinements/core_ext/enumerable.rb +82 -0
- data/lib/active_support/refinements/core_ext/exception.rb +5 -0
- data/lib/active_support/refinements/core_ext/file.rb +1 -0
- data/lib/active_support/refinements/core_ext/file/atomic.rb +60 -0
- data/lib/active_support/refinements/core_ext/hash.rb +8 -0
- data/lib/active_support/refinements/core_ext/hash/conversions.rb +161 -0
- data/lib/active_support/refinements/core_ext/hash/deep_merge.rb +29 -0
- data/lib/active_support/refinements/core_ext/hash/diff.rb +15 -0
- data/lib/active_support/refinements/core_ext/hash/except.rb +17 -0
- data/lib/active_support/refinements/core_ext/hash/indifferent_access.rb +24 -0
- data/lib/active_support/refinements/core_ext/hash/keys.rb +140 -0
- data/lib/active_support/refinements/core_ext/hash/reverse_merge.rb +24 -0
- data/lib/active_support/refinements/core_ext/hash/slice.rb +42 -0
- data/lib/active_support/refinements/core_ext/integer.rb +3 -0
- data/lib/active_support/refinements/core_ext/integer/inflections.rb +31 -0
- data/lib/active_support/refinements/core_ext/integer/multiple.rb +12 -0
- data/lib/active_support/refinements/core_ext/integer/time.rb +43 -0
- data/lib/active_support/refinements/core_ext/kernel.rb +4 -0
- data/lib/active_support/refinements/core_ext/kernel/agnostics.rb +13 -0
- data/lib/active_support/refinements/core_ext/kernel/debugger.rb +12 -0
- data/lib/active_support/refinements/core_ext/kernel/reporting.rb +97 -0
- data/lib/active_support/refinements/core_ext/kernel/singleton_class.rb +8 -0
- data/lib/active_support/refinements/core_ext/load_error.rb +27 -0
- data/lib/active_support/refinements/core_ext/logger.rb +86 -0
- data/lib/active_support/refinements/core_ext/module.rb +10 -0
- data/lib/active_support/refinements/core_ext/module/aliasing.rb +69 -0
- data/lib/active_support/refinements/core_ext/module/anonymous.rb +21 -0
- data/lib/active_support/refinements/core_ext/module/attr_internal.rb +40 -0
- data/lib/active_support/refinements/core_ext/module/attribute_accessors.rb +68 -0
- data/lib/active_support/refinements/core_ext/module/delegation.rb +172 -0
- data/lib/active_support/refinements/core_ext/module/deprecation.rb +27 -0
- data/lib/active_support/refinements/core_ext/module/introspection.rb +80 -0
- data/lib/active_support/refinements/core_ext/module/qualified_const.rb +54 -0
- data/lib/active_support/refinements/core_ext/module/reachable.rb +10 -0
- data/lib/active_support/refinements/core_ext/module/remove_method.rb +14 -0
- data/lib/active_support/refinements/core_ext/name_error.rb +20 -0
- data/lib/active_support/refinements/core_ext/numeric.rb +3 -0
- data/lib/active_support/refinements/core_ext/numeric/bytes.rb +46 -0
- data/lib/active_support/refinements/core_ext/numeric/conversions.rb +137 -0
- data/lib/active_support/refinements/core_ext/numeric/time.rb +81 -0
- data/lib/active_support/refinements/core_ext/object.rb +14 -0
- data/lib/active_support/refinements/core_ext/object/acts_like.rb +12 -0
- data/lib/active_support/refinements/core_ext/object/blank.rb +107 -0
- data/lib/active_support/refinements/core_ext/object/conversions.rb +4 -0
- data/lib/active_support/refinements/core_ext/object/deep_dup.rb +48 -0
- data/lib/active_support/refinements/core_ext/object/duplicable.rb +92 -0
- data/lib/active_support/refinements/core_ext/object/inclusion.rb +27 -0
- data/lib/active_support/refinements/core_ext/object/instance_variables.rb +30 -0
- data/lib/active_support/refinements/core_ext/object/to_json.rb +27 -0
- data/lib/active_support/refinements/core_ext/object/to_param.rb +60 -0
- data/lib/active_support/refinements/core_ext/object/to_query.rb +29 -0
- data/lib/active_support/refinements/core_ext/object/try.rb +72 -0
- data/lib/active_support/refinements/core_ext/object/with_options.rb +44 -0
- data/lib/active_support/refinements/core_ext/proc.rb +19 -0
- data/lib/active_support/refinements/core_ext/range.rb +3 -0
- data/lib/active_support/refinements/core_ext/range/conversions.rb +21 -0
- data/lib/active_support/refinements/core_ext/range/include_range.rb +23 -0
- data/lib/active_support/refinements/core_ext/range/overlaps.rb +10 -0
- data/lib/active_support/refinements/core_ext/regexp.rb +7 -0
- data/lib/active_support/refinements/core_ext/string.rb +13 -0
- data/lib/active_support/refinements/core_ext/string/access.rb +106 -0
- data/lib/active_support/refinements/core_ext/string/behavior.rb +8 -0
- data/lib/active_support/refinements/core_ext/string/conversions.rb +60 -0
- data/lib/active_support/refinements/core_ext/string/encoding.rb +10 -0
- data/lib/active_support/refinements/core_ext/string/exclude.rb +13 -0
- data/lib/active_support/refinements/core_ext/string/filters.rb +54 -0
- data/lib/active_support/refinements/core_ext/string/indent.rb +45 -0
- data/lib/active_support/refinements/core_ext/string/inflections.rb +214 -0
- data/lib/active_support/refinements/core_ext/string/inquiry.rb +15 -0
- data/lib/active_support/refinements/core_ext/string/multibyte.rb +58 -0
- data/lib/active_support/refinements/core_ext/string/output_safety.rb +194 -0
- data/lib/active_support/refinements/core_ext/string/starts_ends_with.rb +6 -0
- data/lib/active_support/refinements/core_ext/string/strip.rb +28 -0
- data/lib/active_support/refinements/core_ext/string/xchar.rb +18 -0
- data/lib/active_support/refinements/core_ext/time.rb +5 -0
- data/lib/active_support/refinements/core_ext/time/acts_like.rb +10 -0
- data/lib/active_support/refinements/core_ext/time/calculations.rb +251 -0
- data/lib/active_support/refinements/core_ext/time/conversions.rb +65 -0
- data/lib/active_support/refinements/core_ext/time/marshal.rb +30 -0
- data/lib/active_support/refinements/core_ext/time/zones.rb +98 -0
- data/lib/active_support/refinements/core_ext/uri.rb +28 -0
- data/lib/activesupport-refinements.rb +9 -0
- data/lib/activesupport-refinements/version.rb +5 -0
- data/refine_core_ext.rb +45 -0
- data/spec/hwia_spec.rb +15 -0
- data/spec/try_spec.rb +18 -0
- metadata +182 -0
@@ -0,0 +1,14 @@
|
|
1
|
+
module ModuleExt; end; module ModuleExt::RemoveMethod
|
2
|
+
refine Module do
|
3
|
+
def remove_possible_method(method)
|
4
|
+
if method_defined?(method) || private_method_defined?(method)
|
5
|
+
undef_method(method)
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
def redefine_method(method, &block)
|
10
|
+
remove_possible_method(method)
|
11
|
+
define_method(method, &block)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module NameErrorExt
|
2
|
+
refine NameError do
|
3
|
+
# Extract the name of the missing constant from the exception message.
|
4
|
+
def missing_name
|
5
|
+
if /undefined local variable or method/ !~ message
|
6
|
+
$1 if /((::)?([A-Z]\w*)(::[A-Z]\w*)*)$/ =~ message
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
# Was this exception raised because the given name was missing?
|
11
|
+
def missing_name?(name)
|
12
|
+
if name.is_a? Symbol
|
13
|
+
last_name = (missing_name || '').split('::').last
|
14
|
+
last_name == name.to_s
|
15
|
+
else
|
16
|
+
missing_name == name.to_s
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module NumericExt; end; module NumericExt::Bytes
|
2
|
+
refine Numeric do
|
3
|
+
KILOBYTE = 1024
|
4
|
+
MEGABYTE = KILOBYTE * 1024
|
5
|
+
GIGABYTE = MEGABYTE * 1024
|
6
|
+
TERABYTE = GIGABYTE * 1024
|
7
|
+
PETABYTE = TERABYTE * 1024
|
8
|
+
EXABYTE = PETABYTE * 1024
|
9
|
+
|
10
|
+
# Enables the use of byte calculations and declarations, like 45.bytes + 2.6.megabytes
|
11
|
+
def bytes
|
12
|
+
self
|
13
|
+
end
|
14
|
+
# alias :byte :bytes
|
15
|
+
|
16
|
+
def kilobytes
|
17
|
+
self * KILOBYTE
|
18
|
+
end
|
19
|
+
# alias :kilobyte :kilobytes
|
20
|
+
|
21
|
+
def megabytes
|
22
|
+
self * MEGABYTE
|
23
|
+
end
|
24
|
+
# alias :megabyte :megabytes
|
25
|
+
|
26
|
+
def gigabytes
|
27
|
+
self * GIGABYTE
|
28
|
+
end
|
29
|
+
# alias :gigabyte :gigabytes
|
30
|
+
|
31
|
+
def terabytes
|
32
|
+
self * TERABYTE
|
33
|
+
end
|
34
|
+
# alias :terabyte :terabytes
|
35
|
+
|
36
|
+
def petabytes
|
37
|
+
self * PETABYTE
|
38
|
+
end
|
39
|
+
# alias :petabyte :petabytes
|
40
|
+
|
41
|
+
def exabytes
|
42
|
+
self * EXABYTE
|
43
|
+
end
|
44
|
+
# alias :exabyte :exabytes
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,137 @@
|
|
1
|
+
module NumericExt; end; module NumericExt::Conversions
|
2
|
+
require 'active_support/refinements/core_ext/big_decimal/conversions'
|
3
|
+
require 'active_support/number_helper'
|
4
|
+
|
5
|
+
refine Numeric do
|
6
|
+
|
7
|
+
# Provides options for converting numbers into formatted strings.
|
8
|
+
# Options are provided for phone numbers, currency, percentage,
|
9
|
+
# precision, positional notation, file size and pretty printing.
|
10
|
+
#
|
11
|
+
# ==== Options
|
12
|
+
#
|
13
|
+
# For details on which formats use which options, see ActiveSupport::NumberHelper
|
14
|
+
#
|
15
|
+
# ==== Examples
|
16
|
+
#
|
17
|
+
# Phone Numbers:
|
18
|
+
# 5551234.to_s(:phone) # => 555-1234
|
19
|
+
# 1235551234.to_s(:phone) # => 123-555-1234
|
20
|
+
# 1235551234.to_s(:phone, area_code: true) # => (123) 555-1234
|
21
|
+
# 1235551234.to_s(:phone, delimiter: ' ') # => 123 555 1234
|
22
|
+
# 1235551234.to_s(:phone, area_code: true, extension: 555) # => (123) 555-1234 x 555
|
23
|
+
# 1235551234.to_s(:phone, country_code: 1) # => +1-123-555-1234
|
24
|
+
# 1235551234.to_s(:phone, country_code: 1, extension: 1343, delimiter: '.')
|
25
|
+
# # => +1.123.555.1234 x 1343
|
26
|
+
#
|
27
|
+
# Currency:
|
28
|
+
# 1234567890.50.to_s(:currency) # => $1,234,567,890.50
|
29
|
+
# 1234567890.506.to_s(:currency) # => $1,234,567,890.51
|
30
|
+
# 1234567890.506.to_s(:currency, precision: 3) # => $1,234,567,890.506
|
31
|
+
# 1234567890.506.to_s(:currency, locale: :fr) # => 1 234 567 890,51 €
|
32
|
+
# -1234567890.50.to_s(:currency, negative_format: '(%u%n)')
|
33
|
+
# # => ($1,234,567,890.50)
|
34
|
+
# 1234567890.50.to_s(:currency, unit: '£', separator: ',', delimiter: '')
|
35
|
+
# # => £1234567890,50
|
36
|
+
# 1234567890.50.to_s(:currency, unit: '£', separator: ',', delimiter: '', format: '%n %u')
|
37
|
+
# # => 1234567890,50 £
|
38
|
+
#
|
39
|
+
# Percentage:
|
40
|
+
# 100.to_s(:percentage) # => 100.000%
|
41
|
+
# 100.to_s(:percentage, precision: 0) # => 100%
|
42
|
+
# 1000.to_s(:percentage, delimiter: '.', separator: ',') # => 1.000,000%
|
43
|
+
# 302.24398923423.to_s(:percentage, precision: 5) # => 302.24399%
|
44
|
+
# 1000.to_s(:percentage, locale: :fr) # => 1 000,000%
|
45
|
+
# 100.to_s(:percentage, format: '%n %') # => 100 %
|
46
|
+
#
|
47
|
+
# Delimited:
|
48
|
+
# 12345678.to_s(:delimited) # => 12,345,678
|
49
|
+
# 12345678.05.to_s(:delimited) # => 12,345,678.05
|
50
|
+
# 12345678.to_s(:delimited, delimiter: '.') # => 12.345.678
|
51
|
+
# 12345678.to_s(:delimited, delimiter: ',') # => 12,345,678
|
52
|
+
# 12345678.05.to_s(:delimited, separator: ' ') # => 12,345,678 05
|
53
|
+
# 12345678.05.to_s(:delimited, locale: :fr) # => 12 345 678,05
|
54
|
+
# 98765432.98.to_s(:delimited, delimiter: ' ', separator: ',')
|
55
|
+
# # => 98 765 432,98
|
56
|
+
#
|
57
|
+
# Rounded:
|
58
|
+
# 111.2345.to_s(:rounded) # => 111.235
|
59
|
+
# 111.2345.to_s(:rounded, precision: 2) # => 111.23
|
60
|
+
# 13.to_s(:rounded, precision: 5) # => 13.00000
|
61
|
+
# 389.32314.to_s(:rounded, precision: 0) # => 389
|
62
|
+
# 111.2345.to_s(:rounded, significant: true) # => 111
|
63
|
+
# 111.2345.to_s(:rounded, precision: 1, significant: true) # => 100
|
64
|
+
# 13.to_s(:rounded, precision: 5, significant: true) # => 13.000
|
65
|
+
# 111.234.to_s(:rounded, locale: :fr) # => 111,234
|
66
|
+
# 13.to_s(:rounded, precision: 5, significant: true, strip_insignificant_zeros: true)
|
67
|
+
# # => 13
|
68
|
+
# 389.32314.to_s(:rounded, precision: 4, significant: true) # => 389.3
|
69
|
+
# 1111.2345.to_s(:rounded, precision: 2, separator: ',', delimiter: '.')
|
70
|
+
# # => 1.111,23
|
71
|
+
#
|
72
|
+
# Human-friendly size in Bytes:
|
73
|
+
# 123.to_s(:human_size) # => 123 Bytes
|
74
|
+
# 1234.to_s(:human_size) # => 1.21 KB
|
75
|
+
# 12345.to_s(:human_size) # => 12.1 KB
|
76
|
+
# 1234567.to_s(:human_size) # => 1.18 MB
|
77
|
+
# 1234567890.to_s(:human_size) # => 1.15 GB
|
78
|
+
# 1234567890123.to_s(:human_size) # => 1.12 TB
|
79
|
+
# 1234567.to_s(:human_size, precision: 2) # => 1.2 MB
|
80
|
+
# 483989.to_s(:human_size, precision: 2) # => 470 KB
|
81
|
+
# 1234567.to_s(:human_size, precision: 2, separator: ',') # => 1,2 MB
|
82
|
+
# 1234567890123.to_s(:human_size, precision: 5) # => "1.1229 TB"
|
83
|
+
# 524288000.to_s(:human_size, precision: 5) # => "500 MB"
|
84
|
+
#
|
85
|
+
# Human-friendly format:
|
86
|
+
# 123.to_s(:human) # => "123"
|
87
|
+
# 1234.to_s(:human) # => "1.23 Thousand"
|
88
|
+
# 12345.to_s(:human) # => "12.3 Thousand"
|
89
|
+
# 1234567.to_s(:human) # => "1.23 Million"
|
90
|
+
# 1234567890.to_s(:human) # => "1.23 Billion"
|
91
|
+
# 1234567890123.to_s(:human) # => "1.23 Trillion"
|
92
|
+
# 1234567890123456.to_s(:human) # => "1.23 Quadrillion"
|
93
|
+
# 1234567890123456789.to_s(:human) # => "1230 Quadrillion"
|
94
|
+
# 489939.to_s(:human, precision: 2) # => "490 Thousand"
|
95
|
+
# 489939.to_s(:human, precision: 4) # => "489.9 Thousand"
|
96
|
+
# 1234567.to_s(:human, precision: 4,
|
97
|
+
# significant: false) # => "1.2346 Million"
|
98
|
+
# 1234567.to_s(:human, precision: 1,
|
99
|
+
# separator: ',',
|
100
|
+
# significant: false) # => "1,2 Million"
|
101
|
+
def to_formatted_s(format = :default, options = {})
|
102
|
+
case format
|
103
|
+
when :phone
|
104
|
+
return ActiveSupport::NumberHelper.number_to_phone(self, options)
|
105
|
+
when :currency
|
106
|
+
return ActiveSupport::NumberHelper.number_to_currency(self, options)
|
107
|
+
when :percentage
|
108
|
+
return ActiveSupport::NumberHelper.number_to_percentage(self, options)
|
109
|
+
when :delimited
|
110
|
+
return ActiveSupport::NumberHelper.number_to_delimited(self, options)
|
111
|
+
when :rounded
|
112
|
+
return ActiveSupport::NumberHelper.number_to_rounded(self, options)
|
113
|
+
when :human
|
114
|
+
return ActiveSupport::NumberHelper.number_to_human(self, options)
|
115
|
+
when :human_size
|
116
|
+
return ActiveSupport::NumberHelper.number_to_human_size(self, options)
|
117
|
+
else
|
118
|
+
self.to_default_s
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
[Float, Fixnum, Bignum, BigDecimal].each do |klass|
|
123
|
+
klass.send(:alias_method, :to_default_s, :to_s)
|
124
|
+
|
125
|
+
klass.send(:define_method, :to_s) do |*args|
|
126
|
+
if args[0].is_a?(Symbol)
|
127
|
+
format = args[0]
|
128
|
+
options = args[1] || {}
|
129
|
+
|
130
|
+
self.to_formatted_s(format, options)
|
131
|
+
else
|
132
|
+
to_default_s(*args)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
module NumericExt; end; module NumericExt::Time
|
2
|
+
require 'active_support/duration'
|
3
|
+
require 'active_support/refinements/core_ext/time/calculations'
|
4
|
+
require 'active_support/refinements/core_ext/time/acts_like'
|
5
|
+
|
6
|
+
refine Numeric do
|
7
|
+
# Enables the use of time calculations and declarations, like 45.minutes + 2.hours + 4.years.
|
8
|
+
#
|
9
|
+
# These methods use Time#advance for precise date calculations when using from_now, ago, etc.
|
10
|
+
# as well as adding or subtracting their results from a Time object. For example:
|
11
|
+
#
|
12
|
+
# # equivalent to Time.current.advance(months: 1)
|
13
|
+
# 1.month.from_now
|
14
|
+
#
|
15
|
+
# # equivalent to Time.current.advance(years: 2)
|
16
|
+
# 2.years.from_now
|
17
|
+
#
|
18
|
+
# # equivalent to Time.current.advance(months: 4, years: 5)
|
19
|
+
# (4.months + 5.years).from_now
|
20
|
+
#
|
21
|
+
# While these methods provide precise calculation when used as in the examples above, care
|
22
|
+
# should be taken to note that this is not true if the result of `months', `years', etc is
|
23
|
+
# converted before use:
|
24
|
+
#
|
25
|
+
# # equivalent to 30.days.to_i.from_now
|
26
|
+
# 1.month.to_i.from_now
|
27
|
+
#
|
28
|
+
# # equivalent to 365.25.days.to_f.from_now
|
29
|
+
# 1.year.to_f.from_now
|
30
|
+
#
|
31
|
+
# In such cases, Ruby's core
|
32
|
+
# Date[http://ruby-doc.org/stdlib/libdoc/date/rdoc/Date.html] and
|
33
|
+
# Time[http://ruby-doc.org/stdlib/libdoc/time/rdoc/Time.html] should be used for precision
|
34
|
+
# date and time arithmetic.
|
35
|
+
def seconds
|
36
|
+
ActiveSupport::Duration.new(self, [[:seconds, self]])
|
37
|
+
end
|
38
|
+
# alias :second :seconds
|
39
|
+
|
40
|
+
def minutes
|
41
|
+
ActiveSupport::Duration.new(self * 60, [[:seconds, self * 60]])
|
42
|
+
end
|
43
|
+
# alias :minute :minutes
|
44
|
+
|
45
|
+
def hours
|
46
|
+
ActiveSupport::Duration.new(self * 3600, [[:seconds, self * 3600]])
|
47
|
+
end
|
48
|
+
# alias :hour :hours
|
49
|
+
|
50
|
+
def days
|
51
|
+
ActiveSupport::Duration.new(self * 24.hours, [[:days, self]])
|
52
|
+
end
|
53
|
+
# alias :day :days
|
54
|
+
|
55
|
+
def weeks
|
56
|
+
ActiveSupport::Duration.new(self * 7.days, [[:days, self * 7]])
|
57
|
+
end
|
58
|
+
# alias :week :weeks
|
59
|
+
|
60
|
+
def fortnights
|
61
|
+
ActiveSupport::Duration.new(self * 2.weeks, [[:days, self * 14]])
|
62
|
+
end
|
63
|
+
# alias :fortnight :fortnights
|
64
|
+
|
65
|
+
# Reads best without arguments: 10.minutes.ago
|
66
|
+
def ago(time = ::Time.current)
|
67
|
+
time - self
|
68
|
+
end
|
69
|
+
|
70
|
+
# Reads best with argument: 10.minutes.until(time)
|
71
|
+
# alias :until :ago
|
72
|
+
|
73
|
+
# Reads best with argument: 10.minutes.since(time)
|
74
|
+
def since(time = ::Time.current)
|
75
|
+
time + self
|
76
|
+
end
|
77
|
+
|
78
|
+
# Reads best without arguments: 10.minutes.from_now
|
79
|
+
# alias :from_now :since
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'active_support/refinements/core_ext/object/acts_like'
|
2
|
+
require 'active_support/refinements/core_ext/object/blank'
|
3
|
+
require 'active_support/refinements/core_ext/object/duplicable'
|
4
|
+
require 'active_support/refinements/core_ext/object/deep_dup'
|
5
|
+
require 'active_support/refinements/core_ext/object/try'
|
6
|
+
require 'active_support/refinements/core_ext/object/inclusion'
|
7
|
+
|
8
|
+
require 'active_support/refinements/core_ext/object/conversions'
|
9
|
+
require 'active_support/refinements/core_ext/object/instance_variables'
|
10
|
+
|
11
|
+
require 'active_support/refinements/core_ext/object/to_json'
|
12
|
+
require 'active_support/refinements/core_ext/object/to_param'
|
13
|
+
require 'active_support/refinements/core_ext/object/to_query'
|
14
|
+
require 'active_support/refinements/core_ext/object/with_options'
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module ObjectExt; end; module ObjectExt::ActsLike
|
2
|
+
refine Object do
|
3
|
+
# A duck-type assistant method. For example, Active Support extends Date
|
4
|
+
# to define an acts_like_date? method, and extends Time to define
|
5
|
+
# acts_like_time?. As a result, we can do "x.acts_like?(:time)" and
|
6
|
+
# "x.acts_like?(:date)" to do duck-type-safe comparisons, since classes that
|
7
|
+
# we want to act like Time simply need to define an acts_like_time? method.
|
8
|
+
def acts_like?(duck)
|
9
|
+
respond_to? :"acts_like_#{duck}?"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
module ObjectExt; end; module ObjectExt::Blank
|
2
|
+
# encoding: utf-8
|
3
|
+
|
4
|
+
refine Object do
|
5
|
+
# An object is blank if it's false, empty, or a whitespace string.
|
6
|
+
# For example, '', ' ', +nil+, [], and {} are all blank.
|
7
|
+
#
|
8
|
+
# This simplifies:
|
9
|
+
#
|
10
|
+
# if address.nil? || address.empty?
|
11
|
+
#
|
12
|
+
# ...to:
|
13
|
+
#
|
14
|
+
# if address.blank?
|
15
|
+
def blank?
|
16
|
+
respond_to?(:empty?) ? empty? : !self
|
17
|
+
end
|
18
|
+
|
19
|
+
# An object is present if it's not <tt>blank?</tt>.
|
20
|
+
def present?
|
21
|
+
!blank?
|
22
|
+
end
|
23
|
+
|
24
|
+
# Returns object if it's <tt>present?</tt> otherwise returns +nil+.
|
25
|
+
# <tt>object.presence</tt> is equivalent to <tt>object.present? ? object : nil</tt>.
|
26
|
+
#
|
27
|
+
# This is handy for any representation of objects where blank is the same
|
28
|
+
# as not present at all. For example, this simplifies a common check for
|
29
|
+
# HTTP POST/query parameters:
|
30
|
+
#
|
31
|
+
# state = params[:state] if params[:state].present?
|
32
|
+
# country = params[:country] if params[:country].present?
|
33
|
+
# region = state || country || 'US'
|
34
|
+
#
|
35
|
+
# ...becomes:
|
36
|
+
#
|
37
|
+
# region = params[:state].presence || params[:country].presence || 'US'
|
38
|
+
def presence
|
39
|
+
self if present?
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
refine NilClass do
|
44
|
+
# +nil+ is blank:
|
45
|
+
#
|
46
|
+
# nil.blank? # => true
|
47
|
+
def blank?
|
48
|
+
true
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
refine FalseClass do
|
53
|
+
# +false+ is blank:
|
54
|
+
#
|
55
|
+
# false.blank? # => true
|
56
|
+
def blank?
|
57
|
+
true
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
refine TrueClass do
|
62
|
+
# +true+ is not blank:
|
63
|
+
#
|
64
|
+
# true.blank? # => false
|
65
|
+
def blank?
|
66
|
+
false
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
refine Array do
|
71
|
+
# An array is blank if it's empty:
|
72
|
+
#
|
73
|
+
# [].blank? # => true
|
74
|
+
# [1,2,3].blank? # => false
|
75
|
+
# alias_method :blank?, :empty?
|
76
|
+
end
|
77
|
+
|
78
|
+
refine Hash do
|
79
|
+
# A hash is blank if it's empty:
|
80
|
+
#
|
81
|
+
# {}.blank? # => true
|
82
|
+
# { key: 'value' }.blank? # => false
|
83
|
+
# alias_method :blank?, :empty?
|
84
|
+
end
|
85
|
+
|
86
|
+
refine String do
|
87
|
+
# A string is blank if it's empty or contains whitespaces only:
|
88
|
+
#
|
89
|
+
# ''.blank? # => true
|
90
|
+
# ' '.blank? # => true
|
91
|
+
# ' '.blank? # => true
|
92
|
+
# ' something here '.blank? # => false
|
93
|
+
def blank?
|
94
|
+
self !~ /[^[:space:]]/
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
refine Numeric do
|
99
|
+
# No number is blank:
|
100
|
+
#
|
101
|
+
# 1.blank? # => false
|
102
|
+
# 0.blank? # => false
|
103
|
+
def blank?
|
104
|
+
false
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|