activesupport 4.2.0 → 5.2.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of activesupport might be problematic. Click here for more details.
- checksums.yaml +5 -5
- data/CHANGELOG.md +366 -232
- data/MIT-LICENSE +2 -2
- data/README.rdoc +4 -5
- data/lib/active_support.rb +17 -7
- data/lib/active_support/all.rb +5 -3
- data/lib/active_support/array_inquirer.rb +48 -0
- data/lib/active_support/backtrace_cleaner.rb +7 -5
- data/lib/active_support/benchmarkable.rb +6 -4
- data/lib/active_support/builder.rb +3 -1
- data/lib/active_support/cache.rb +271 -177
- data/lib/active_support/cache/file_store.rb +41 -35
- data/lib/active_support/cache/mem_cache_store.rb +97 -88
- data/lib/active_support/cache/memory_store.rb +27 -30
- data/lib/active_support/cache/null_store.rb +7 -8
- data/lib/active_support/cache/redis_cache_store.rb +454 -0
- data/lib/active_support/cache/strategy/local_cache.rb +67 -34
- data/lib/active_support/cache/strategy/local_cache_middleware.rb +10 -9
- data/lib/active_support/callbacks.rb +654 -560
- data/lib/active_support/concern.rb +5 -3
- data/lib/active_support/concurrency/load_interlock_aware_monitor.rb +17 -0
- data/lib/active_support/concurrency/share_lock.rb +227 -0
- data/lib/active_support/configurable.rb +8 -5
- data/lib/active_support/core_ext.rb +3 -1
- data/lib/active_support/core_ext/array.rb +9 -6
- data/lib/active_support/core_ext/array/access.rb +29 -1
- data/lib/active_support/core_ext/array/conversions.rb +22 -18
- data/lib/active_support/core_ext/array/extract_options.rb +2 -0
- data/lib/active_support/core_ext/array/grouping.rb +11 -18
- data/lib/active_support/core_ext/array/inquiry.rb +19 -0
- data/lib/active_support/core_ext/array/prepend_and_append.rb +5 -3
- data/lib/active_support/core_ext/array/wrap.rb +7 -4
- data/lib/active_support/core_ext/benchmark.rb +3 -1
- data/lib/active_support/core_ext/big_decimal.rb +3 -1
- data/lib/active_support/core_ext/big_decimal/conversions.rb +10 -12
- data/lib/active_support/core_ext/class.rb +4 -3
- data/lib/active_support/core_ext/class/attribute.rb +41 -22
- data/lib/active_support/core_ext/class/attribute_accessors.rb +3 -1
- data/lib/active_support/core_ext/class/subclasses.rb +20 -8
- data/lib/active_support/core_ext/date.rb +6 -4
- data/lib/active_support/core_ext/date/acts_like.rb +3 -1
- data/lib/active_support/core_ext/date/blank.rb +14 -0
- data/lib/active_support/core_ext/date/calculations.rb +11 -9
- data/lib/active_support/core_ext/date/conversions.rb +31 -23
- data/lib/active_support/core_ext/date/zones.rb +4 -2
- data/lib/active_support/core_ext/date_and_time/calculations.rb +179 -56
- data/lib/active_support/core_ext/date_and_time/compatibility.rb +16 -0
- data/lib/active_support/core_ext/date_and_time/zones.rb +12 -12
- data/lib/active_support/core_ext/date_time.rb +7 -4
- data/lib/active_support/core_ext/date_time/acts_like.rb +4 -2
- data/lib/active_support/core_ext/date_time/blank.rb +14 -0
- data/lib/active_support/core_ext/date_time/calculations.rb +58 -20
- data/lib/active_support/core_ext/date_time/compatibility.rb +18 -0
- data/lib/active_support/core_ext/date_time/conversions.rb +16 -12
- data/lib/active_support/core_ext/digest/uuid.rb +7 -5
- data/lib/active_support/core_ext/enumerable.rb +107 -28
- data/lib/active_support/core_ext/file.rb +3 -1
- data/lib/active_support/core_ext/file/atomic.rb +38 -31
- data/lib/active_support/core_ext/hash.rb +11 -9
- data/lib/active_support/core_ext/hash/compact.rb +24 -15
- data/lib/active_support/core_ext/hash/conversions.rb +63 -43
- data/lib/active_support/core_ext/hash/deep_merge.rb +9 -13
- data/lib/active_support/core_ext/hash/except.rb +11 -8
- data/lib/active_support/core_ext/hash/indifferent_access.rb +4 -3
- data/lib/active_support/core_ext/hash/keys.rb +33 -27
- data/lib/active_support/core_ext/hash/reverse_merge.rb +5 -2
- data/lib/active_support/core_ext/hash/slice.rb +8 -8
- data/lib/active_support/core_ext/hash/transform_values.rb +16 -7
- data/lib/active_support/core_ext/integer.rb +5 -3
- data/lib/active_support/core_ext/integer/inflections.rb +3 -1
- data/lib/active_support/core_ext/integer/multiple.rb +2 -0
- data/lib/active_support/core_ext/integer/time.rb +11 -33
- data/lib/active_support/core_ext/kernel.rb +6 -5
- data/lib/active_support/core_ext/kernel/agnostics.rb +2 -0
- data/lib/active_support/core_ext/kernel/concern.rb +5 -1
- data/lib/active_support/core_ext/kernel/reporting.rb +4 -83
- data/lib/active_support/core_ext/kernel/singleton_class.rb +2 -0
- data/lib/active_support/core_ext/load_error.rb +3 -22
- data/lib/active_support/core_ext/marshal.rb +13 -10
- data/lib/active_support/core_ext/module.rb +14 -11
- data/lib/active_support/core_ext/module/aliasing.rb +6 -44
- data/lib/active_support/core_ext/module/anonymous.rb +12 -1
- data/lib/active_support/core_ext/module/attr_internal.rb +8 -9
- data/lib/active_support/core_ext/module/attribute_accessors.rb +43 -40
- data/lib/active_support/core_ext/module/attribute_accessors_per_thread.rb +150 -0
- data/lib/active_support/core_ext/module/concerning.rb +11 -12
- data/lib/active_support/core_ext/module/delegation.rb +121 -39
- data/lib/active_support/core_ext/module/deprecation.rb +4 -2
- data/lib/active_support/core_ext/module/introspection.rb +9 -9
- data/lib/active_support/core_ext/module/reachable.rb +5 -2
- data/lib/active_support/core_ext/module/redefine_method.rb +49 -0
- data/lib/active_support/core_ext/module/remove_method.rb +8 -3
- data/lib/active_support/core_ext/name_error.rb +22 -2
- data/lib/active_support/core_ext/numeric.rb +6 -3
- data/lib/active_support/core_ext/numeric/bytes.rb +22 -0
- data/lib/active_support/core_ext/numeric/conversions.rb +79 -74
- data/lib/active_support/core_ext/numeric/inquiry.rb +28 -0
- data/lib/active_support/core_ext/numeric/time.rb +35 -38
- data/lib/active_support/core_ext/object.rb +14 -13
- data/lib/active_support/core_ext/object/acts_like.rb +12 -1
- data/lib/active_support/core_ext/object/blank.rb +29 -4
- data/lib/active_support/core_ext/object/conversions.rb +6 -4
- data/lib/active_support/core_ext/object/deep_dup.rb +13 -4
- data/lib/active_support/core_ext/object/duplicable.rb +98 -45
- data/lib/active_support/core_ext/object/inclusion.rb +5 -3
- data/lib/active_support/core_ext/object/instance_variables.rb +3 -1
- data/lib/active_support/core_ext/object/json.rb +49 -19
- data/lib/active_support/core_ext/object/to_param.rb +3 -1
- data/lib/active_support/core_ext/object/to_query.rb +6 -4
- data/lib/active_support/core_ext/object/try.rb +70 -22
- data/lib/active_support/core_ext/object/with_options.rb +16 -3
- data/lib/active_support/core_ext/range.rb +7 -4
- data/lib/active_support/core_ext/range/conversions.rb +27 -7
- data/lib/active_support/core_ext/range/each.rb +19 -17
- data/lib/active_support/core_ext/range/include_range.rb +21 -19
- data/lib/active_support/core_ext/range/include_time_with_zone.rb +23 -0
- data/lib/active_support/core_ext/range/overlaps.rb +2 -0
- data/lib/active_support/core_ext/regexp.rb +6 -0
- data/lib/active_support/core_ext/securerandom.rb +25 -0
- data/lib/active_support/core_ext/string.rb +15 -13
- data/lib/active_support/core_ext/string/access.rb +9 -7
- data/lib/active_support/core_ext/string/behavior.rb +3 -1
- data/lib/active_support/core_ext/string/conversions.rb +8 -5
- data/lib/active_support/core_ext/string/exclude.rb +2 -0
- data/lib/active_support/core_ext/string/filters.rb +10 -8
- data/lib/active_support/core_ext/string/indent.rb +6 -4
- data/lib/active_support/core_ext/string/inflections.rb +61 -24
- data/lib/active_support/core_ext/string/inquiry.rb +3 -1
- data/lib/active_support/core_ext/string/multibyte.rb +15 -7
- data/lib/active_support/core_ext/string/output_safety.rb +35 -35
- data/lib/active_support/core_ext/string/starts_ends_with.rb +2 -0
- data/lib/active_support/core_ext/string/strip.rb +4 -5
- data/lib/active_support/core_ext/string/zones.rb +4 -2
- data/lib/active_support/core_ext/time.rb +7 -5
- data/lib/active_support/core_ext/time/acts_like.rb +3 -1
- data/lib/active_support/core_ext/time/calculations.rb +101 -51
- data/lib/active_support/core_ext/time/compatibility.rb +16 -0
- data/lib/active_support/core_ext/time/conversions.rb +20 -13
- data/lib/active_support/core_ext/time/zones.rb +41 -7
- data/lib/active_support/core_ext/uri.rb +5 -4
- data/lib/active_support/current_attributes.rb +195 -0
- data/lib/active_support/dependencies.rb +143 -160
- data/lib/active_support/dependencies/autoload.rb +2 -0
- data/lib/active_support/dependencies/interlock.rb +57 -0
- data/lib/active_support/deprecation.rb +12 -9
- data/lib/active_support/deprecation/behaviors.rb +41 -12
- data/lib/active_support/deprecation/constant_accessor.rb +52 -0
- data/lib/active_support/deprecation/instance_delegator.rb +17 -2
- data/lib/active_support/deprecation/method_wrappers.rb +54 -21
- data/lib/active_support/deprecation/proxy_wrappers.rb +56 -28
- data/lib/active_support/deprecation/reporting.rb +32 -12
- data/lib/active_support/descendants_tracker.rb +2 -0
- data/lib/active_support/digest.rb +20 -0
- data/lib/active_support/duration.rb +326 -30
- data/lib/active_support/duration/iso8601_parser.rb +125 -0
- data/lib/active_support/duration/iso8601_serializer.rb +55 -0
- data/lib/active_support/encrypted_configuration.rb +49 -0
- data/lib/active_support/encrypted_file.rb +99 -0
- data/lib/active_support/evented_file_update_checker.rb +205 -0
- data/lib/active_support/execution_wrapper.rb +128 -0
- data/lib/active_support/executor.rb +8 -0
- data/lib/active_support/file_update_checker.rb +63 -37
- data/lib/active_support/gem_version.rb +4 -2
- data/lib/active_support/gzip.rb +7 -5
- data/lib/active_support/hash_with_indifferent_access.rb +130 -30
- data/lib/active_support/i18n.rb +8 -6
- data/lib/active_support/i18n_railtie.rb +34 -14
- data/lib/active_support/inflections.rb +13 -11
- data/lib/active_support/inflector.rb +7 -5
- data/lib/active_support/inflector/inflections.rb +61 -12
- data/lib/active_support/inflector/methods.rb +161 -136
- data/lib/active_support/inflector/transliterate.rb +48 -27
- data/lib/active_support/json.rb +4 -2
- data/lib/active_support/json/decoding.rb +16 -13
- data/lib/active_support/json/encoding.rb +15 -57
- data/lib/active_support/key_generator.rb +25 -25
- data/lib/active_support/lazy_load_hooks.rb +50 -20
- data/lib/active_support/locale/en.yml +2 -0
- data/lib/active_support/log_subscriber.rb +13 -10
- data/lib/active_support/log_subscriber/test_helper.rb +14 -12
- data/lib/active_support/logger.rb +54 -3
- data/lib/active_support/logger_silence.rb +12 -7
- data/lib/active_support/logger_thread_safe_level.rb +33 -0
- data/lib/active_support/message_encryptor.rb +173 -51
- data/lib/active_support/message_verifier.rb +150 -17
- data/lib/active_support/messages/metadata.rb +71 -0
- data/lib/active_support/messages/rotation_configuration.rb +22 -0
- data/lib/active_support/messages/rotator.rb +56 -0
- data/lib/active_support/multibyte.rb +4 -2
- data/lib/active_support/multibyte/chars.rb +37 -24
- data/lib/active_support/multibyte/unicode.rb +100 -96
- data/lib/active_support/notifications.rb +11 -7
- data/lib/active_support/notifications/fanout.rb +10 -8
- data/lib/active_support/notifications/instrumenter.rb +27 -7
- data/lib/active_support/number_helper.rb +94 -68
- data/lib/active_support/number_helper/number_converter.rb +13 -11
- data/lib/active_support/number_helper/number_to_currency_converter.rb +9 -9
- data/lib/active_support/number_helper/number_to_delimited_converter.rb +9 -3
- data/lib/active_support/number_helper/number_to_human_converter.rb +11 -9
- data/lib/active_support/number_helper/number_to_human_size_converter.rb +9 -8
- data/lib/active_support/number_helper/number_to_percentage_converter.rb +3 -1
- data/lib/active_support/number_helper/number_to_phone_converter.rb +13 -4
- data/lib/active_support/number_helper/number_to_rounded_converter.rb +23 -56
- data/lib/active_support/number_helper/rounding_helper.rb +66 -0
- data/lib/active_support/option_merger.rb +3 -1
- data/lib/active_support/ordered_hash.rb +6 -4
- data/lib/active_support/ordered_options.rb +22 -4
- data/lib/active_support/per_thread_registry.rb +13 -6
- data/lib/active_support/proxy_object.rb +2 -0
- data/lib/active_support/rails.rb +16 -8
- data/lib/active_support/railtie.rb +43 -9
- data/lib/active_support/reloader.rb +131 -0
- data/lib/active_support/rescuable.rb +108 -53
- data/lib/active_support/security_utils.rb +17 -6
- data/lib/active_support/string_inquirer.rb +11 -3
- data/lib/active_support/subscriber.rb +15 -14
- data/lib/active_support/tagged_logging.rb +14 -11
- data/lib/active_support/test_case.rb +18 -46
- data/lib/active_support/testing/assertions.rb +137 -20
- data/lib/active_support/testing/autorun.rb +4 -2
- data/lib/active_support/testing/constant_lookup.rb +2 -1
- data/lib/active_support/testing/declarative.rb +3 -1
- data/lib/active_support/testing/deprecation.rb +14 -10
- data/lib/active_support/testing/file_fixtures.rb +36 -0
- data/lib/active_support/testing/isolation.rb +34 -25
- data/lib/active_support/testing/method_call_assertions.rb +43 -0
- data/lib/active_support/testing/setup_and_teardown.rb +12 -3
- data/lib/active_support/testing/stream.rb +44 -0
- data/lib/active_support/testing/tagged_logging.rb +3 -1
- data/lib/active_support/testing/time_helpers.rb +96 -27
- data/lib/active_support/time.rb +14 -12
- data/lib/active_support/time_with_zone.rb +195 -53
- data/lib/active_support/values/time_zone.rb +200 -61
- data/lib/active_support/values/unicode_tables.dat +0 -0
- data/lib/active_support/version.rb +3 -1
- data/lib/active_support/xml_mini.rb +69 -51
- data/lib/active_support/xml_mini/jdom.rb +116 -113
- data/lib/active_support/xml_mini/libxml.rb +17 -16
- data/lib/active_support/xml_mini/libxmlsax.rb +16 -18
- data/lib/active_support/xml_mini/nokogiri.rb +15 -15
- data/lib/active_support/xml_mini/nokogirisax.rb +15 -16
- data/lib/active_support/xml_mini/rexml.rb +17 -16
- metadata +55 -43
- data/lib/active_support/concurrency/latch.rb +0 -27
- data/lib/active_support/core_ext/big_decimal/yaml_conversions.rb +0 -14
- data/lib/active_support/core_ext/class/delegating_attributes.rb +0 -45
- data/lib/active_support/core_ext/date_time/zones.rb +0 -6
- data/lib/active_support/core_ext/kernel/debugger.rb +0 -10
- data/lib/active_support/core_ext/module/method_transplanting.rb +0 -11
- data/lib/active_support/core_ext/module/qualified_const.rb +0 -52
- data/lib/active_support/core_ext/object/itself.rb +0 -15
- data/lib/active_support/core_ext/struct.rb +0 -6
- data/lib/active_support/core_ext/thread.rb +0 -86
- data/lib/active_support/core_ext/time/marshal.rb +0 -30
@@ -1,16 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class NameError
|
2
4
|
# Extract the name of the missing constant from the exception message.
|
5
|
+
#
|
6
|
+
# begin
|
7
|
+
# HelloWorld
|
8
|
+
# rescue NameError => e
|
9
|
+
# e.missing_name
|
10
|
+
# end
|
11
|
+
# # => "HelloWorld"
|
3
12
|
def missing_name
|
13
|
+
# Since ruby v2.3.0 `did_you_mean` gem is loaded by default.
|
14
|
+
# It extends NameError#message with spell corrections which are SLOW.
|
15
|
+
# We should use original_message message instead.
|
16
|
+
message = respond_to?(:original_message) ? original_message : self.message
|
17
|
+
|
4
18
|
if /undefined local variable or method/ !~ message
|
5
19
|
$1 if /((::)?([A-Z]\w*)(::[A-Z]\w*)*)$/ =~ message
|
6
20
|
end
|
7
21
|
end
|
8
22
|
|
9
23
|
# Was this exception raised because the given name was missing?
|
24
|
+
#
|
25
|
+
# begin
|
26
|
+
# HelloWorld
|
27
|
+
# rescue NameError => e
|
28
|
+
# e.missing_name?("HelloWorld")
|
29
|
+
# end
|
30
|
+
# # => true
|
10
31
|
def missing_name?(name)
|
11
32
|
if name.is_a? Symbol
|
12
|
-
|
13
|
-
last_name == name.to_s
|
33
|
+
self.name == name
|
14
34
|
else
|
15
35
|
missing_name == name.to_s
|
16
36
|
end
|
@@ -1,3 +1,6 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_support/core_ext/numeric/bytes"
|
4
|
+
require "active_support/core_ext/numeric/time"
|
5
|
+
require "active_support/core_ext/numeric/inquiry"
|
6
|
+
require "active_support/core_ext/numeric/conversions"
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Numeric
|
2
4
|
KILOBYTE = 1024
|
3
5
|
MEGABYTE = KILOBYTE * 1024
|
@@ -7,36 +9,56 @@ class Numeric
|
|
7
9
|
EXABYTE = PETABYTE * 1024
|
8
10
|
|
9
11
|
# Enables the use of byte calculations and declarations, like 45.bytes + 2.6.megabytes
|
12
|
+
#
|
13
|
+
# 2.bytes # => 2
|
10
14
|
def bytes
|
11
15
|
self
|
12
16
|
end
|
13
17
|
alias :byte :bytes
|
14
18
|
|
19
|
+
# Returns the number of bytes equivalent to the kilobytes provided.
|
20
|
+
#
|
21
|
+
# 2.kilobytes # => 2048
|
15
22
|
def kilobytes
|
16
23
|
self * KILOBYTE
|
17
24
|
end
|
18
25
|
alias :kilobyte :kilobytes
|
19
26
|
|
27
|
+
# Returns the number of bytes equivalent to the megabytes provided.
|
28
|
+
#
|
29
|
+
# 2.megabytes # => 2_097_152
|
20
30
|
def megabytes
|
21
31
|
self * MEGABYTE
|
22
32
|
end
|
23
33
|
alias :megabyte :megabytes
|
24
34
|
|
35
|
+
# Returns the number of bytes equivalent to the gigabytes provided.
|
36
|
+
#
|
37
|
+
# 2.gigabytes # => 2_147_483_648
|
25
38
|
def gigabytes
|
26
39
|
self * GIGABYTE
|
27
40
|
end
|
28
41
|
alias :gigabyte :gigabytes
|
29
42
|
|
43
|
+
# Returns the number of bytes equivalent to the terabytes provided.
|
44
|
+
#
|
45
|
+
# 2.terabytes # => 2_199_023_255_552
|
30
46
|
def terabytes
|
31
47
|
self * TERABYTE
|
32
48
|
end
|
33
49
|
alias :terabyte :terabytes
|
34
50
|
|
51
|
+
# Returns the number of bytes equivalent to the petabytes provided.
|
52
|
+
#
|
53
|
+
# 2.petabytes # => 2_251_799_813_685_248
|
35
54
|
def petabytes
|
36
55
|
self * PETABYTE
|
37
56
|
end
|
38
57
|
alias :petabyte :petabytes
|
39
58
|
|
59
|
+
# Returns the number of bytes equivalent to the exabytes provided.
|
60
|
+
#
|
61
|
+
# 2.exabytes # => 2_305_843_009_213_693_952
|
40
62
|
def exabytes
|
41
63
|
self * EXABYTE
|
42
64
|
end
|
@@ -1,8 +1,10 @@
|
|
1
|
-
|
2
|
-
require 'active_support/number_helper'
|
1
|
+
# frozen_string_literal: true
|
3
2
|
|
4
|
-
|
3
|
+
require "active_support/core_ext/big_decimal/conversions"
|
4
|
+
require "active_support/number_helper"
|
5
|
+
require "active_support/core_ext/module/deprecation"
|
5
6
|
|
7
|
+
module ActiveSupport::NumericWithFormat
|
6
8
|
# Provides options for converting numbers into formatted strings.
|
7
9
|
# Options are provided for phone numbers, currency, percentage,
|
8
10
|
# precision, positional notation, file size and pretty printing.
|
@@ -14,71 +16,73 @@ class Numeric
|
|
14
16
|
# ==== Examples
|
15
17
|
#
|
16
18
|
# Phone Numbers:
|
17
|
-
# 5551234.to_s(:phone) # => 555-1234
|
18
|
-
# 1235551234.to_s(:phone) # => 123-555-1234
|
19
|
-
# 1235551234.to_s(:phone, area_code: true) # => (123) 555-1234
|
20
|
-
# 1235551234.to_s(:phone, delimiter: ' ') # => 123 555 1234
|
21
|
-
# 1235551234.to_s(:phone, area_code: true, extension: 555) # => (123) 555-1234 x 555
|
22
|
-
# 1235551234.to_s(:phone, country_code: 1) # => +1-123-555-1234
|
19
|
+
# 5551234.to_s(:phone) # => "555-1234"
|
20
|
+
# 1235551234.to_s(:phone) # => "123-555-1234"
|
21
|
+
# 1235551234.to_s(:phone, area_code: true) # => "(123) 555-1234"
|
22
|
+
# 1235551234.to_s(:phone, delimiter: ' ') # => "123 555 1234"
|
23
|
+
# 1235551234.to_s(:phone, area_code: true, extension: 555) # => "(123) 555-1234 x 555"
|
24
|
+
# 1235551234.to_s(:phone, country_code: 1) # => "+1-123-555-1234"
|
23
25
|
# 1235551234.to_s(:phone, country_code: 1, extension: 1343, delimiter: '.')
|
24
|
-
# # => +1.123.555.1234 x 1343
|
26
|
+
# # => "+1.123.555.1234 x 1343"
|
25
27
|
#
|
26
28
|
# Currency:
|
27
|
-
# 1234567890.50.to_s(:currency) # => $1,234,567,890.50
|
28
|
-
# 1234567890.506.to_s(:currency) # => $1,234,567,890.51
|
29
|
-
# 1234567890.506.to_s(:currency, precision: 3) # => $1,234,567,890.506
|
30
|
-
# 1234567890.506.to_s(:currency, locale: :fr) # => 1 234 567 890,51 €
|
29
|
+
# 1234567890.50.to_s(:currency) # => "$1,234,567,890.50"
|
30
|
+
# 1234567890.506.to_s(:currency) # => "$1,234,567,890.51"
|
31
|
+
# 1234567890.506.to_s(:currency, precision: 3) # => "$1,234,567,890.506"
|
32
|
+
# 1234567890.506.to_s(:currency, locale: :fr) # => "1 234 567 890,51 €"
|
31
33
|
# -1234567890.50.to_s(:currency, negative_format: '(%u%n)')
|
32
|
-
# # => ($1,234,567,890.50)
|
34
|
+
# # => "($1,234,567,890.50)"
|
33
35
|
# 1234567890.50.to_s(:currency, unit: '£', separator: ',', delimiter: '')
|
34
|
-
# # => £1234567890,50
|
36
|
+
# # => "£1234567890,50"
|
35
37
|
# 1234567890.50.to_s(:currency, unit: '£', separator: ',', delimiter: '', format: '%n %u')
|
36
|
-
# # => 1234567890,50 £
|
38
|
+
# # => "1234567890,50 £"
|
37
39
|
#
|
38
40
|
# Percentage:
|
39
|
-
# 100.to_s(:percentage) # => 100.000%
|
40
|
-
# 100.to_s(:percentage, precision: 0) # => 100%
|
41
|
-
# 1000.to_s(:percentage, delimiter: '.', separator: ',') # => 1.000,000%
|
42
|
-
# 302.24398923423.to_s(:percentage, precision: 5) # => 302.24399%
|
43
|
-
# 1000.to_s(:percentage, locale: :fr) # => 1 000,000%
|
44
|
-
# 100.to_s(:percentage, format: '%n %') # => 100 %
|
41
|
+
# 100.to_s(:percentage) # => "100.000%"
|
42
|
+
# 100.to_s(:percentage, precision: 0) # => "100%"
|
43
|
+
# 1000.to_s(:percentage, delimiter: '.', separator: ',') # => "1.000,000%"
|
44
|
+
# 302.24398923423.to_s(:percentage, precision: 5) # => "302.24399%"
|
45
|
+
# 1000.to_s(:percentage, locale: :fr) # => "1 000,000%"
|
46
|
+
# 100.to_s(:percentage, format: '%n %') # => "100.000 %"
|
45
47
|
#
|
46
48
|
# Delimited:
|
47
|
-
# 12345678.to_s(:delimited) # => 12,345,678
|
48
|
-
# 12345678.05.to_s(:delimited) # => 12,345,678.05
|
49
|
-
# 12345678.to_s(:delimited, delimiter: '.') # => 12.345.678
|
50
|
-
# 12345678.to_s(:delimited, delimiter: ',') # => 12,345,678
|
51
|
-
# 12345678.05.to_s(:delimited, separator: ' ') # => 12,345,678 05
|
52
|
-
# 12345678.05.to_s(:delimited, locale: :fr) # => 12 345 678,05
|
49
|
+
# 12345678.to_s(:delimited) # => "12,345,678"
|
50
|
+
# 12345678.05.to_s(:delimited) # => "12,345,678.05"
|
51
|
+
# 12345678.to_s(:delimited, delimiter: '.') # => "12.345.678"
|
52
|
+
# 12345678.to_s(:delimited, delimiter: ',') # => "12,345,678"
|
53
|
+
# 12345678.05.to_s(:delimited, separator: ' ') # => "12,345,678 05"
|
54
|
+
# 12345678.05.to_s(:delimited, locale: :fr) # => "12 345 678,05"
|
53
55
|
# 98765432.98.to_s(:delimited, delimiter: ' ', separator: ',')
|
54
|
-
# # => 98 765 432,98
|
56
|
+
# # => "98 765 432,98"
|
55
57
|
#
|
56
58
|
# Rounded:
|
57
|
-
# 111.2345.to_s(:rounded) # => 111.235
|
58
|
-
# 111.2345.to_s(:rounded, precision: 2) # => 111.23
|
59
|
-
# 13.to_s(:rounded, precision: 5) # => 13.00000
|
60
|
-
# 389.32314.to_s(:rounded, precision: 0) # => 389
|
61
|
-
# 111.2345.to_s(:rounded, significant: true) # => 111
|
62
|
-
# 111.2345.to_s(:rounded, precision: 1, significant: true) # => 100
|
63
|
-
# 13.to_s(:rounded, precision: 5, significant: true) # => 13.000
|
64
|
-
# 111.234.to_s(:rounded, locale: :fr) # => 111,234
|
59
|
+
# 111.2345.to_s(:rounded) # => "111.235"
|
60
|
+
# 111.2345.to_s(:rounded, precision: 2) # => "111.23"
|
61
|
+
# 13.to_s(:rounded, precision: 5) # => "13.00000"
|
62
|
+
# 389.32314.to_s(:rounded, precision: 0) # => "389"
|
63
|
+
# 111.2345.to_s(:rounded, significant: true) # => "111"
|
64
|
+
# 111.2345.to_s(:rounded, precision: 1, significant: true) # => "100"
|
65
|
+
# 13.to_s(:rounded, precision: 5, significant: true) # => "13.000"
|
66
|
+
# 111.234.to_s(:rounded, locale: :fr) # => "111,234"
|
65
67
|
# 13.to_s(:rounded, precision: 5, significant: true, strip_insignificant_zeros: true)
|
66
|
-
# # => 13
|
67
|
-
# 389.32314.to_s(:rounded, precision: 4, significant: true) # => 389.3
|
68
|
+
# # => "13"
|
69
|
+
# 389.32314.to_s(:rounded, precision: 4, significant: true) # => "389.3"
|
68
70
|
# 1111.2345.to_s(:rounded, precision: 2, separator: ',', delimiter: '.')
|
69
|
-
# # => 1.111,23
|
71
|
+
# # => "1.111,23"
|
70
72
|
#
|
71
73
|
# Human-friendly size in Bytes:
|
72
|
-
# 123.to_s(:human_size) # => 123 Bytes
|
73
|
-
# 1234.to_s(:human_size) # => 1.21 KB
|
74
|
-
# 12345.to_s(:human_size) # => 12.1 KB
|
75
|
-
# 1234567.to_s(:human_size) # => 1.18 MB
|
76
|
-
# 1234567890.to_s(:human_size) # => 1.15 GB
|
77
|
-
# 1234567890123.to_s(:human_size) # => 1.12 TB
|
78
|
-
#
|
79
|
-
#
|
80
|
-
# 1234567.to_s(:human_size, precision: 2
|
81
|
-
#
|
74
|
+
# 123.to_s(:human_size) # => "123 Bytes"
|
75
|
+
# 1234.to_s(:human_size) # => "1.21 KB"
|
76
|
+
# 12345.to_s(:human_size) # => "12.1 KB"
|
77
|
+
# 1234567.to_s(:human_size) # => "1.18 MB"
|
78
|
+
# 1234567890.to_s(:human_size) # => "1.15 GB"
|
79
|
+
# 1234567890123.to_s(:human_size) # => "1.12 TB"
|
80
|
+
# 1234567890123456.to_s(:human_size) # => "1.1 PB"
|
81
|
+
# 1234567890123456789.to_s(:human_size) # => "1.07 EB"
|
82
|
+
# 1234567.to_s(:human_size, precision: 2) # => "1.2 MB"
|
83
|
+
# 483989.to_s(:human_size, precision: 2) # => "470 KB"
|
84
|
+
# 1234567.to_s(:human_size, precision: 2, separator: ',') # => "1,2 MB"
|
85
|
+
# 1234567890123.to_s(:human_size, precision: 5) # => "1.1228 TB"
|
82
86
|
# 524288000.to_s(:human_size, precision: 5) # => "500 MB"
|
83
87
|
#
|
84
88
|
# Human-friendly format:
|
@@ -97,39 +101,40 @@ class Numeric
|
|
97
101
|
# 1234567.to_s(:human, precision: 1,
|
98
102
|
# separator: ',',
|
99
103
|
# significant: false) # => "1,2 Million"
|
100
|
-
def
|
104
|
+
def to_s(format = nil, options = nil)
|
101
105
|
case format
|
106
|
+
when nil
|
107
|
+
super()
|
108
|
+
when Integer, String
|
109
|
+
super(format)
|
102
110
|
when :phone
|
103
|
-
|
111
|
+
ActiveSupport::NumberHelper.number_to_phone(self, options || {})
|
104
112
|
when :currency
|
105
|
-
|
113
|
+
ActiveSupport::NumberHelper.number_to_currency(self, options || {})
|
106
114
|
when :percentage
|
107
|
-
|
115
|
+
ActiveSupport::NumberHelper.number_to_percentage(self, options || {})
|
108
116
|
when :delimited
|
109
|
-
|
117
|
+
ActiveSupport::NumberHelper.number_to_delimited(self, options || {})
|
110
118
|
when :rounded
|
111
|
-
|
119
|
+
ActiveSupport::NumberHelper.number_to_rounded(self, options || {})
|
112
120
|
when :human
|
113
|
-
|
121
|
+
ActiveSupport::NumberHelper.number_to_human(self, options || {})
|
114
122
|
when :human_size
|
115
|
-
|
123
|
+
ActiveSupport::NumberHelper.number_to_human_size(self, options || {})
|
124
|
+
when Symbol
|
125
|
+
super()
|
116
126
|
else
|
117
|
-
|
127
|
+
super(format)
|
118
128
|
end
|
119
129
|
end
|
130
|
+
end
|
120
131
|
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
options = args[1] || {}
|
128
|
-
|
129
|
-
self.to_formatted_s(format, options)
|
130
|
-
else
|
131
|
-
to_default_s(*args)
|
132
|
-
end
|
133
|
-
end
|
134
|
-
end
|
132
|
+
# Ruby 2.4+ unifies Fixnum & Bignum into Integer.
|
133
|
+
if 0.class == Integer
|
134
|
+
Integer.prepend ActiveSupport::NumericWithFormat
|
135
|
+
else
|
136
|
+
Fixnum.prepend ActiveSupport::NumericWithFormat
|
137
|
+
Bignum.prepend ActiveSupport::NumericWithFormat
|
135
138
|
end
|
139
|
+
Float.prepend ActiveSupport::NumericWithFormat
|
140
|
+
BigDecimal.prepend ActiveSupport::NumericWithFormat
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
unless 1.respond_to?(:positive?) # TODO: Remove this file when we drop support to ruby < 2.3
|
4
|
+
class Numeric
|
5
|
+
# Returns true if the number is positive.
|
6
|
+
#
|
7
|
+
# 1.positive? # => true
|
8
|
+
# 0.positive? # => false
|
9
|
+
# -1.positive? # => false
|
10
|
+
def positive?
|
11
|
+
self > 0
|
12
|
+
end
|
13
|
+
|
14
|
+
# Returns true if the number is negative.
|
15
|
+
#
|
16
|
+
# -1.negative? # => true
|
17
|
+
# 0.negative? # => false
|
18
|
+
# 1.negative? # => false
|
19
|
+
def negative?
|
20
|
+
self < 0
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class Complex
|
25
|
+
undef :positive?
|
26
|
+
undef :negative?
|
27
|
+
end
|
28
|
+
end
|
@@ -1,68 +1,65 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_support/duration"
|
4
|
+
require "active_support/core_ext/time/calculations"
|
5
|
+
require "active_support/core_ext/time/acts_like"
|
6
|
+
require "active_support/core_ext/date/calculations"
|
7
|
+
require "active_support/core_ext/date/acts_like"
|
4
8
|
|
5
9
|
class Numeric
|
6
|
-
#
|
7
|
-
#
|
8
|
-
# These methods use Time#advance for precise date calculations when using from_now, ago, etc.
|
9
|
-
# as well as adding or subtracting their results from a Time object. For example:
|
10
|
-
#
|
11
|
-
# # equivalent to Time.current.advance(months: 1)
|
12
|
-
# 1.month.from_now
|
13
|
-
#
|
14
|
-
# # equivalent to Time.current.advance(years: 2)
|
15
|
-
# 2.years.from_now
|
16
|
-
#
|
17
|
-
# # equivalent to Time.current.advance(months: 4, years: 5)
|
18
|
-
# (4.months + 5.years).from_now
|
19
|
-
#
|
20
|
-
# While these methods provide precise calculation when used as in the examples above, care
|
21
|
-
# should be taken to note that this is not true if the result of `months', `years', etc is
|
22
|
-
# converted before use:
|
23
|
-
#
|
24
|
-
# # equivalent to 30.days.to_i.from_now
|
25
|
-
# 1.month.to_i.from_now
|
10
|
+
# Returns a Duration instance matching the number of seconds provided.
|
26
11
|
#
|
27
|
-
# #
|
28
|
-
# 1.year.to_f.from_now
|
29
|
-
#
|
30
|
-
# In such cases, Ruby's core
|
31
|
-
# Date[http://ruby-doc.org/stdlib/libdoc/date/rdoc/Date.html] and
|
32
|
-
# Time[http://ruby-doc.org/stdlib/libdoc/time/rdoc/Time.html] should be used for precision
|
33
|
-
# date and time arithmetic.
|
12
|
+
# 2.seconds # => 2 seconds
|
34
13
|
def seconds
|
35
|
-
ActiveSupport::Duration.
|
14
|
+
ActiveSupport::Duration.seconds(self)
|
36
15
|
end
|
37
16
|
alias :second :seconds
|
38
17
|
|
18
|
+
# Returns a Duration instance matching the number of minutes provided.
|
19
|
+
#
|
20
|
+
# 2.minutes # => 2 minutes
|
39
21
|
def minutes
|
40
|
-
ActiveSupport::Duration.
|
22
|
+
ActiveSupport::Duration.minutes(self)
|
41
23
|
end
|
42
24
|
alias :minute :minutes
|
43
25
|
|
26
|
+
# Returns a Duration instance matching the number of hours provided.
|
27
|
+
#
|
28
|
+
# 2.hours # => 2 hours
|
44
29
|
def hours
|
45
|
-
ActiveSupport::Duration.
|
30
|
+
ActiveSupport::Duration.hours(self)
|
46
31
|
end
|
47
32
|
alias :hour :hours
|
48
33
|
|
34
|
+
# Returns a Duration instance matching the number of days provided.
|
35
|
+
#
|
36
|
+
# 2.days # => 2 days
|
49
37
|
def days
|
50
|
-
ActiveSupport::Duration.
|
38
|
+
ActiveSupport::Duration.days(self)
|
51
39
|
end
|
52
40
|
alias :day :days
|
53
41
|
|
42
|
+
# Returns a Duration instance matching the number of weeks provided.
|
43
|
+
#
|
44
|
+
# 2.weeks # => 2 weeks
|
54
45
|
def weeks
|
55
|
-
ActiveSupport::Duration.
|
46
|
+
ActiveSupport::Duration.weeks(self)
|
56
47
|
end
|
57
48
|
alias :week :weeks
|
58
49
|
|
50
|
+
# Returns a Duration instance matching the number of fortnights provided.
|
51
|
+
#
|
52
|
+
# 2.fortnights # => 4 weeks
|
59
53
|
def fortnights
|
60
|
-
ActiveSupport::Duration.
|
54
|
+
ActiveSupport::Duration.weeks(self * 2)
|
61
55
|
end
|
62
56
|
alias :fortnight :fortnights
|
63
57
|
|
64
|
-
#
|
65
|
-
#
|
58
|
+
# Returns the number of milliseconds equivalent to the seconds provided.
|
59
|
+
# Used with the standard time durations.
|
60
|
+
#
|
61
|
+
# 2.in_milliseconds # => 2000
|
62
|
+
# 1.hour.in_milliseconds # => 3600000
|
66
63
|
def in_milliseconds
|
67
64
|
self * 1000
|
68
65
|
end
|
@@ -1,15 +1,16 @@
|
|
1
|
-
|
2
|
-
require 'active_support/core_ext/object/blank'
|
3
|
-
require 'active_support/core_ext/object/duplicable'
|
4
|
-
require 'active_support/core_ext/object/deep_dup'
|
5
|
-
require 'active_support/core_ext/object/itself'
|
6
|
-
require 'active_support/core_ext/object/try'
|
7
|
-
require 'active_support/core_ext/object/inclusion'
|
1
|
+
# frozen_string_literal: true
|
8
2
|
|
9
|
-
require
|
10
|
-
require
|
3
|
+
require "active_support/core_ext/object/acts_like"
|
4
|
+
require "active_support/core_ext/object/blank"
|
5
|
+
require "active_support/core_ext/object/duplicable"
|
6
|
+
require "active_support/core_ext/object/deep_dup"
|
7
|
+
require "active_support/core_ext/object/try"
|
8
|
+
require "active_support/core_ext/object/inclusion"
|
11
9
|
|
12
|
-
require
|
13
|
-
require
|
14
|
-
|
15
|
-
require
|
10
|
+
require "active_support/core_ext/object/conversions"
|
11
|
+
require "active_support/core_ext/object/instance_variables"
|
12
|
+
|
13
|
+
require "active_support/core_ext/object/json"
|
14
|
+
require "active_support/core_ext/object/to_param"
|
15
|
+
require "active_support/core_ext/object/to_query"
|
16
|
+
require "active_support/core_ext/object/with_options"
|