activesupport 5.1.1 → 6.1.1
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 +360 -442
- data/MIT-LICENSE +1 -1
- data/README.rdoc +5 -4
- data/lib/active_support/actionable_error.rb +48 -0
- data/lib/active_support/all.rb +2 -0
- data/lib/active_support/array_inquirer.rb +6 -2
- data/lib/active_support/backtrace_cleaner.rb +31 -3
- data/lib/active_support/benchmarkable.rb +3 -1
- data/lib/active_support/builder.rb +2 -0
- data/lib/active_support/cache/file_store.rb +37 -36
- data/lib/active_support/cache/mem_cache_store.rb +65 -53
- data/lib/active_support/cache/memory_store.rb +61 -33
- data/lib/active_support/cache/null_store.rb +10 -3
- data/lib/active_support/cache/redis_cache_store.rb +493 -0
- data/lib/active_support/cache/strategy/local_cache.rb +68 -22
- data/lib/active_support/cache/strategy/local_cache_middleware.rb +2 -0
- data/lib/active_support/cache.rb +305 -127
- data/lib/active_support/callbacks.rb +106 -98
- data/lib/active_support/concern.rb +79 -6
- data/lib/active_support/concurrency/load_interlock_aware_monitor.rb +35 -0
- data/lib/active_support/concurrency/share_lock.rb +2 -1
- data/lib/active_support/configurable.rb +12 -14
- data/lib/active_support/configuration_file.rb +46 -0
- data/lib/active_support/core_ext/array/access.rb +21 -7
- data/lib/active_support/core_ext/array/conversions.rb +7 -5
- data/lib/active_support/core_ext/array/extract.rb +21 -0
- data/lib/active_support/core_ext/array/extract_options.rb +2 -0
- data/lib/active_support/core_ext/array/grouping.rb +2 -0
- data/lib/active_support/core_ext/array/inquiry.rb +2 -0
- data/lib/active_support/core_ext/array/wrap.rb +2 -0
- data/lib/active_support/core_ext/array.rb +3 -1
- data/lib/active_support/core_ext/benchmark.rb +4 -2
- data/lib/active_support/core_ext/big_decimal/conversions.rb +2 -0
- data/lib/active_support/core_ext/big_decimal.rb +2 -0
- data/lib/active_support/core_ext/class/attribute.rb +50 -47
- data/lib/active_support/core_ext/class/attribute_accessors.rb +2 -0
- data/lib/active_support/core_ext/class/subclasses.rb +18 -40
- data/lib/active_support/core_ext/class.rb +2 -0
- data/lib/active_support/core_ext/date/acts_like.rb +2 -0
- data/lib/active_support/core_ext/date/blank.rb +2 -0
- data/lib/active_support/core_ext/date/calculations.rb +8 -5
- data/lib/active_support/core_ext/date/conversions.rb +12 -10
- data/lib/active_support/core_ext/date/zones.rb +2 -0
- data/lib/active_support/core_ext/date.rb +2 -0
- data/lib/active_support/core_ext/date_and_time/calculations.rb +61 -37
- data/lib/active_support/core_ext/date_and_time/compatibility.rb +18 -1
- data/lib/active_support/core_ext/date_and_time/zones.rb +2 -1
- data/lib/active_support/core_ext/date_time/acts_like.rb +2 -0
- data/lib/active_support/core_ext/date_time/blank.rb +2 -0
- data/lib/active_support/core_ext/date_time/calculations.rb +3 -1
- data/lib/active_support/core_ext/date_time/compatibility.rb +7 -5
- data/lib/active_support/core_ext/date_time/conversions.rb +2 -1
- data/lib/active_support/core_ext/date_time.rb +2 -0
- data/lib/active_support/core_ext/digest/uuid.rb +3 -1
- data/lib/active_support/core_ext/digest.rb +3 -0
- data/lib/active_support/core_ext/enumerable.rb +174 -71
- data/lib/active_support/core_ext/file/atomic.rb +3 -1
- data/lib/active_support/core_ext/file.rb +2 -0
- data/lib/active_support/core_ext/hash/conversions.rb +7 -5
- data/lib/active_support/core_ext/hash/deep_merge.rb +8 -12
- data/lib/active_support/core_ext/hash/deep_transform_values.rb +46 -0
- data/lib/active_support/core_ext/hash/except.rb +4 -2
- data/lib/active_support/core_ext/hash/indifferent_access.rb +2 -0
- data/lib/active_support/core_ext/hash/keys.rb +3 -30
- data/lib/active_support/core_ext/hash/reverse_merge.rb +5 -2
- data/lib/active_support/core_ext/hash/slice.rb +8 -29
- data/lib/active_support/core_ext/hash.rb +3 -2
- data/lib/active_support/core_ext/integer/inflections.rb +2 -0
- data/lib/active_support/core_ext/integer/multiple.rb +3 -1
- data/lib/active_support/core_ext/integer/time.rb +7 -14
- data/lib/active_support/core_ext/integer.rb +2 -0
- data/lib/active_support/core_ext/kernel/concern.rb +2 -0
- data/lib/active_support/core_ext/kernel/reporting.rb +2 -0
- data/lib/active_support/core_ext/kernel/singleton_class.rb +2 -0
- data/lib/active_support/core_ext/kernel.rb +2 -1
- data/lib/active_support/core_ext/load_error.rb +3 -8
- data/lib/active_support/core_ext/marshal.rb +4 -0
- data/lib/active_support/core_ext/module/aliasing.rb +2 -0
- data/lib/active_support/core_ext/module/anonymous.rb +2 -0
- data/lib/active_support/core_ext/module/attr_internal.rb +4 -2
- data/lib/active_support/core_ext/module/attribute_accessors.rb +44 -56
- data/lib/active_support/core_ext/module/attribute_accessors_per_thread.rb +18 -18
- data/lib/active_support/core_ext/module/concerning.rb +15 -10
- data/lib/active_support/core_ext/module/delegation.rb +103 -58
- data/lib/active_support/core_ext/module/deprecation.rb +2 -0
- data/lib/active_support/core_ext/module/introspection.rb +18 -15
- data/lib/active_support/core_ext/module/redefine_method.rb +40 -0
- data/lib/active_support/core_ext/module/remove_method.rb +5 -23
- data/lib/active_support/core_ext/module.rb +3 -1
- data/lib/active_support/core_ext/name_error.rb +36 -2
- data/lib/active_support/core_ext/numeric/bytes.rb +2 -0
- data/lib/active_support/core_ext/numeric/conversions.rb +131 -129
- data/lib/active_support/core_ext/numeric/time.rb +7 -15
- data/lib/active_support/core_ext/numeric.rb +2 -1
- data/lib/active_support/core_ext/object/acts_like.rb +12 -1
- data/lib/active_support/core_ext/object/blank.rb +13 -3
- data/lib/active_support/core_ext/object/conversions.rb +2 -0
- data/lib/active_support/core_ext/object/deep_dup.rb +3 -1
- data/lib/active_support/core_ext/object/duplicable.rb +6 -101
- data/lib/active_support/core_ext/object/inclusion.rb +2 -0
- data/lib/active_support/core_ext/object/instance_variables.rb +2 -0
- data/lib/active_support/core_ext/object/json.rb +22 -2
- data/lib/active_support/core_ext/object/to_param.rb +2 -0
- data/lib/active_support/core_ext/object/to_query.rb +7 -2
- data/lib/active_support/core_ext/object/try.rb +19 -7
- data/lib/active_support/core_ext/object/with_options.rb +4 -2
- data/lib/active_support/core_ext/object.rb +2 -0
- data/lib/active_support/core_ext/range/compare_range.rb +82 -0
- data/lib/active_support/core_ext/range/conversions.rb +35 -25
- data/lib/active_support/core_ext/range/each.rb +5 -2
- data/lib/active_support/core_ext/range/include_time_with_zone.rb +28 -0
- data/lib/active_support/core_ext/range/overlaps.rb +2 -0
- data/lib/active_support/core_ext/range.rb +4 -1
- data/lib/active_support/core_ext/regexp.rb +10 -5
- data/lib/active_support/core_ext/securerandom.rb +25 -3
- data/lib/active_support/core_ext/string/access.rb +7 -16
- data/lib/active_support/core_ext/string/behavior.rb +2 -0
- data/lib/active_support/core_ext/string/conversions.rb +3 -0
- data/lib/active_support/core_ext/string/exclude.rb +2 -0
- data/lib/active_support/core_ext/string/filters.rb +44 -1
- data/lib/active_support/core_ext/string/indent.rb +2 -0
- data/lib/active_support/core_ext/string/inflections.rb +69 -16
- data/lib/active_support/core_ext/string/inquiry.rb +3 -0
- data/lib/active_support/core_ext/string/multibyte.rb +9 -4
- data/lib/active_support/core_ext/string/output_safety.rb +76 -20
- data/lib/active_support/core_ext/string/starts_ends_with.rb +4 -2
- data/lib/active_support/core_ext/string/strip.rb +5 -1
- data/lib/active_support/core_ext/string/zones.rb +2 -0
- data/lib/active_support/core_ext/string.rb +2 -0
- data/lib/active_support/core_ext/symbol/starts_ends_with.rb +14 -0
- data/lib/active_support/core_ext/symbol.rb +3 -0
- data/lib/active_support/core_ext/time/acts_like.rb +2 -0
- data/lib/active_support/core_ext/time/calculations.rb +73 -18
- data/lib/active_support/core_ext/time/compatibility.rb +4 -2
- data/lib/active_support/core_ext/time/conversions.rb +4 -0
- data/lib/active_support/core_ext/time/zones.rb +6 -4
- data/lib/active_support/core_ext/time.rb +2 -0
- data/lib/active_support/core_ext/uri.rb +11 -6
- data/lib/active_support/core_ext.rb +3 -1
- data/lib/active_support/current_attributes/test_helper.rb +13 -0
- data/lib/active_support/current_attributes.rb +208 -0
- data/lib/active_support/dependencies/autoload.rb +2 -0
- data/lib/active_support/dependencies/interlock.rb +2 -0
- data/lib/active_support/dependencies/zeitwerk_integration.rb +117 -0
- data/lib/active_support/dependencies.rb +135 -60
- data/lib/active_support/deprecation/behaviors.rb +43 -11
- data/lib/active_support/deprecation/constant_accessor.rb +4 -2
- data/lib/active_support/deprecation/disallowed.rb +56 -0
- data/lib/active_support/deprecation/instance_delegator.rb +2 -1
- data/lib/active_support/deprecation/method_wrappers.rb +30 -15
- data/lib/active_support/deprecation/proxy_wrappers.rb +32 -6
- data/lib/active_support/deprecation/reporting.rb +54 -9
- data/lib/active_support/deprecation.rb +9 -2
- data/lib/active_support/descendants_tracker.rb +61 -9
- data/lib/active_support/digest.rb +20 -0
- data/lib/active_support/duration/iso8601_parser.rb +6 -6
- data/lib/active_support/duration/iso8601_serializer.rb +20 -14
- data/lib/active_support/duration.rb +179 -41
- data/lib/active_support/encrypted_configuration.rb +45 -0
- data/lib/active_support/encrypted_file.rb +117 -0
- data/lib/active_support/environment_inquirer.rb +20 -0
- data/lib/active_support/evented_file_update_checker.rb +84 -117
- data/lib/active_support/execution_wrapper.rb +3 -0
- data/lib/active_support/executor.rb +2 -0
- data/lib/active_support/file_update_checker.rb +2 -1
- data/lib/active_support/fork_tracker.rb +62 -0
- data/lib/active_support/gem_version.rb +3 -1
- data/lib/active_support/gzip.rb +2 -0
- data/lib/active_support/hash_with_indifferent_access.rb +134 -37
- data/lib/active_support/i18n.rb +4 -1
- data/lib/active_support/i18n_railtie.rb +20 -11
- data/lib/active_support/inflections.rb +2 -0
- data/lib/active_support/inflector/inflections.rb +19 -8
- data/lib/active_support/inflector/methods.rb +87 -77
- data/lib/active_support/inflector/transliterate.rb +56 -18
- data/lib/active_support/inflector.rb +2 -0
- data/lib/active_support/json/decoding.rb +27 -26
- data/lib/active_support/json/encoding.rb +13 -3
- data/lib/active_support/json.rb +2 -0
- data/lib/active_support/key_generator.rb +3 -33
- data/lib/active_support/lazy_load_hooks.rb +33 -10
- data/lib/active_support/locale/en.rb +33 -0
- data/lib/active_support/locale/en.yml +7 -3
- data/lib/active_support/log_subscriber/test_helper.rb +2 -0
- data/lib/active_support/log_subscriber.rb +46 -13
- data/lib/active_support/logger.rb +4 -17
- data/lib/active_support/logger_silence.rb +13 -20
- data/lib/active_support/logger_thread_safe_level.rb +54 -7
- data/lib/active_support/message_encryptor.rb +101 -33
- data/lib/active_support/message_verifier.rb +85 -14
- data/lib/active_support/messages/metadata.rb +80 -0
- data/lib/active_support/messages/rotation_configuration.rb +23 -0
- data/lib/active_support/messages/rotator.rb +57 -0
- data/lib/active_support/multibyte/chars.rb +12 -68
- data/lib/active_support/multibyte/unicode.rb +17 -327
- data/lib/active_support/multibyte.rb +2 -0
- data/lib/active_support/notifications/fanout.rb +118 -16
- data/lib/active_support/notifications/instrumenter.rb +73 -9
- data/lib/active_support/notifications.rb +74 -8
- data/lib/active_support/number_helper/number_converter.rb +7 -6
- data/lib/active_support/number_helper/number_to_currency_converter.rb +6 -9
- data/lib/active_support/number_helper/number_to_delimited_converter.rb +5 -2
- data/lib/active_support/number_helper/number_to_human_converter.rb +8 -7
- data/lib/active_support/number_helper/number_to_human_size_converter.rb +6 -3
- data/lib/active_support/number_helper/number_to_percentage_converter.rb +5 -1
- data/lib/active_support/number_helper/number_to_phone_converter.rb +5 -2
- data/lib/active_support/number_helper/number_to_rounded_converter.rb +16 -53
- data/lib/active_support/number_helper/rounding_helper.rb +50 -0
- data/lib/active_support/number_helper.rb +41 -12
- data/lib/active_support/option_merger.rb +24 -3
- data/lib/active_support/ordered_hash.rb +3 -1
- data/lib/active_support/ordered_options.rb +17 -5
- data/lib/active_support/parameter_filter.rb +133 -0
- data/lib/active_support/per_thread_registry.rb +3 -1
- data/lib/active_support/proxy_object.rb +2 -0
- data/lib/active_support/rails.rb +3 -10
- data/lib/active_support/railtie.rb +60 -9
- data/lib/active_support/reloader.rb +11 -10
- data/lib/active_support/rescuable.rb +7 -6
- data/lib/active_support/secure_compare_rotator.rb +51 -0
- data/lib/active_support/security_utils.rb +26 -15
- data/lib/active_support/string_inquirer.rb +6 -3
- data/lib/active_support/subscriber.rb +74 -24
- data/lib/active_support/tagged_logging.rb +44 -8
- data/lib/active_support/test_case.rb +94 -2
- data/lib/active_support/testing/assertions.rb +58 -20
- data/lib/active_support/testing/autorun.rb +2 -4
- data/lib/active_support/testing/constant_lookup.rb +2 -0
- data/lib/active_support/testing/declarative.rb +2 -0
- data/lib/active_support/testing/deprecation.rb +2 -1
- data/lib/active_support/testing/file_fixtures.rb +4 -0
- data/lib/active_support/testing/isolation.rb +8 -4
- data/lib/active_support/testing/method_call_assertions.rb +30 -1
- data/lib/active_support/testing/parallelization/server.rb +78 -0
- data/lib/active_support/testing/parallelization/worker.rb +100 -0
- data/lib/active_support/testing/parallelization.rb +51 -0
- data/lib/active_support/testing/setup_and_teardown.rb +12 -7
- data/lib/active_support/testing/stream.rb +3 -2
- data/lib/active_support/testing/tagged_logging.rb +2 -0
- data/lib/active_support/testing/time_helpers.rb +78 -13
- data/lib/active_support/time.rb +2 -0
- data/lib/active_support/time_with_zone.rb +113 -41
- data/lib/active_support/values/time_zone.rb +55 -25
- data/lib/active_support/version.rb +2 -0
- data/lib/active_support/xml_mini/jdom.rb +5 -4
- data/lib/active_support/xml_mini/libxml.rb +4 -2
- data/lib/active_support/xml_mini/libxmlsax.rb +6 -4
- data/lib/active_support/xml_mini/nokogiri.rb +4 -2
- data/lib/active_support/xml_mini/nokogirisax.rb +5 -3
- data/lib/active_support/xml_mini/rexml.rb +12 -3
- data/lib/active_support/xml_mini.rb +5 -11
- data/lib/active_support.rb +18 -13
- metadata +81 -35
- data/lib/active_support/core_ext/array/prepend_and_append.rb +0 -7
- data/lib/active_support/core_ext/hash/compact.rb +0 -27
- data/lib/active_support/core_ext/hash/transform_values.rb +0 -30
- data/lib/active_support/core_ext/kernel/agnostics.rb +0 -11
- data/lib/active_support/core_ext/module/reachable.rb +0 -8
- data/lib/active_support/core_ext/numeric/inquiry.rb +0 -26
- data/lib/active_support/core_ext/range/include_range.rb +0 -23
- data/lib/active_support/values/unicode_tables.dat +0 -0
@@ -1,138 +1,140 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "active_support/core_ext/big_decimal/conversions"
|
2
4
|
require "active_support/number_helper"
|
3
|
-
require "active_support/core_ext/module/deprecation"
|
4
5
|
|
5
|
-
module ActiveSupport
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
#
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
#
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
#
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
#
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
#
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
#
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
6
|
+
module ActiveSupport
|
7
|
+
module NumericWithFormat
|
8
|
+
# Provides options for converting numbers into formatted strings.
|
9
|
+
# Options are provided for phone numbers, currency, percentage,
|
10
|
+
# precision, positional notation, file size and pretty printing.
|
11
|
+
#
|
12
|
+
# ==== Options
|
13
|
+
#
|
14
|
+
# For details on which formats use which options, see ActiveSupport::NumberHelper
|
15
|
+
#
|
16
|
+
# ==== Examples
|
17
|
+
#
|
18
|
+
# Phone Numbers:
|
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"
|
25
|
+
# 1235551234.to_s(:phone, country_code: 1, extension: 1343, delimiter: '.')
|
26
|
+
# # => "+1.123.555.1234 x 1343"
|
27
|
+
#
|
28
|
+
# Currency:
|
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, round_mode: :down) # => "$1,234,567,890.50"
|
33
|
+
# 1234567890.506.to_s(:currency, locale: :fr) # => "1 234 567 890,51 €"
|
34
|
+
# -1234567890.50.to_s(:currency, negative_format: '(%u%n)')
|
35
|
+
# # => "($1,234,567,890.50)"
|
36
|
+
# 1234567890.50.to_s(:currency, unit: '£', separator: ',', delimiter: '')
|
37
|
+
# # => "£1234567890,50"
|
38
|
+
# 1234567890.50.to_s(:currency, unit: '£', separator: ',', delimiter: '', format: '%n %u')
|
39
|
+
# # => "1234567890,50 £"
|
40
|
+
#
|
41
|
+
# Percentage:
|
42
|
+
# 100.to_s(:percentage) # => "100.000%"
|
43
|
+
# 100.to_s(:percentage, precision: 0) # => "100%"
|
44
|
+
# 1000.to_s(:percentage, delimiter: '.', separator: ',') # => "1.000,000%"
|
45
|
+
# 302.24398923423.to_s(:percentage, precision: 5) # => "302.24399%"
|
46
|
+
# 302.24398923423.to_s(:percentage, round_mode: :down) # => "302.243%"
|
47
|
+
# 1000.to_s(:percentage, locale: :fr) # => "1 000,000%"
|
48
|
+
# 100.to_s(:percentage, format: '%n %') # => "100.000 %"
|
49
|
+
#
|
50
|
+
# Delimited:
|
51
|
+
# 12345678.to_s(:delimited) # => "12,345,678"
|
52
|
+
# 12345678.05.to_s(:delimited) # => "12,345,678.05"
|
53
|
+
# 12345678.to_s(:delimited, delimiter: '.') # => "12.345.678"
|
54
|
+
# 12345678.to_s(:delimited, delimiter: ',') # => "12,345,678"
|
55
|
+
# 12345678.05.to_s(:delimited, separator: ' ') # => "12,345,678 05"
|
56
|
+
# 12345678.05.to_s(:delimited, locale: :fr) # => "12 345 678,05"
|
57
|
+
# 98765432.98.to_s(:delimited, delimiter: ' ', separator: ',')
|
58
|
+
# # => "98 765 432,98"
|
59
|
+
#
|
60
|
+
# Rounded:
|
61
|
+
# 111.2345.to_s(:rounded) # => "111.235"
|
62
|
+
# 111.2345.to_s(:rounded, precision: 2) # => "111.23"
|
63
|
+
# 111.2345.to_s(:rounded, precision: 2, round_mode: :up) # => "111.24"
|
64
|
+
# 13.to_s(:rounded, precision: 5) # => "13.00000"
|
65
|
+
# 389.32314.to_s(:rounded, precision: 0) # => "389"
|
66
|
+
# 111.2345.to_s(:rounded, significant: true) # => "111"
|
67
|
+
# 111.2345.to_s(:rounded, precision: 1, significant: true) # => "100"
|
68
|
+
# 13.to_s(:rounded, precision: 5, significant: true) # => "13.000"
|
69
|
+
# 111.234.to_s(:rounded, locale: :fr) # => "111,234"
|
70
|
+
# 13.to_s(:rounded, precision: 5, significant: true, strip_insignificant_zeros: true)
|
71
|
+
# # => "13"
|
72
|
+
# 389.32314.to_s(:rounded, precision: 4, significant: true) # => "389.3"
|
73
|
+
# 1111.2345.to_s(:rounded, precision: 2, separator: ',', delimiter: '.')
|
74
|
+
# # => "1.111,23"
|
75
|
+
#
|
76
|
+
# Human-friendly size in Bytes:
|
77
|
+
# 123.to_s(:human_size) # => "123 Bytes"
|
78
|
+
# 1234.to_s(:human_size) # => "1.21 KB"
|
79
|
+
# 12345.to_s(:human_size) # => "12.1 KB"
|
80
|
+
# 1234567.to_s(:human_size) # => "1.18 MB"
|
81
|
+
# 1234567890.to_s(:human_size) # => "1.15 GB"
|
82
|
+
# 1234567890123.to_s(:human_size) # => "1.12 TB"
|
83
|
+
# 1234567890123456.to_s(:human_size) # => "1.1 PB"
|
84
|
+
# 1234567890123456789.to_s(:human_size) # => "1.07 EB"
|
85
|
+
# 1234567.to_s(:human_size, precision: 2) # => "1.2 MB"
|
86
|
+
# 1234567.to_s(:human_size, precision: 2, round_mode: :up) # => "1.3 MB"
|
87
|
+
# 483989.to_s(:human_size, precision: 2) # => "470 KB"
|
88
|
+
# 1234567.to_s(:human_size, precision: 2, separator: ',') # => "1,2 MB"
|
89
|
+
# 1234567890123.to_s(:human_size, precision: 5) # => "1.1228 TB"
|
90
|
+
# 524288000.to_s(:human_size, precision: 5) # => "500 MB"
|
91
|
+
#
|
92
|
+
# Human-friendly format:
|
93
|
+
# 123.to_s(:human) # => "123"
|
94
|
+
# 1234.to_s(:human) # => "1.23 Thousand"
|
95
|
+
# 12345.to_s(:human) # => "12.3 Thousand"
|
96
|
+
# 1234567.to_s(:human) # => "1.23 Million"
|
97
|
+
# 1234567890.to_s(:human) # => "1.23 Billion"
|
98
|
+
# 1234567890123.to_s(:human) # => "1.23 Trillion"
|
99
|
+
# 1234567890123456.to_s(:human) # => "1.23 Quadrillion"
|
100
|
+
# 1234567890123456789.to_s(:human) # => "1230 Quadrillion"
|
101
|
+
# 489939.to_s(:human, precision: 2) # => "490 Thousand"
|
102
|
+
# 489939.to_s(:human, precision: 2, round_mode: :down) # => "480 Thousand"
|
103
|
+
# 489939.to_s(:human, precision: 4) # => "489.9 Thousand"
|
104
|
+
# 1234567.to_s(:human, precision: 4,
|
105
|
+
# significant: false) # => "1.2346 Million"
|
106
|
+
# 1234567.to_s(:human, precision: 1,
|
107
|
+
# separator: ',',
|
108
|
+
# significant: false) # => "1,2 Million"
|
109
|
+
def to_s(format = nil, options = nil)
|
110
|
+
case format
|
111
|
+
when nil
|
112
|
+
super()
|
113
|
+
when Integer, String
|
114
|
+
super(format)
|
115
|
+
when :phone
|
116
|
+
ActiveSupport::NumberHelper.number_to_phone(self, options || {})
|
117
|
+
when :currency
|
118
|
+
ActiveSupport::NumberHelper.number_to_currency(self, options || {})
|
119
|
+
when :percentage
|
120
|
+
ActiveSupport::NumberHelper.number_to_percentage(self, options || {})
|
121
|
+
when :delimited
|
122
|
+
ActiveSupport::NumberHelper.number_to_delimited(self, options || {})
|
123
|
+
when :rounded
|
124
|
+
ActiveSupport::NumberHelper.number_to_rounded(self, options || {})
|
125
|
+
when :human
|
126
|
+
ActiveSupport::NumberHelper.number_to_human(self, options || {})
|
127
|
+
when :human_size
|
128
|
+
ActiveSupport::NumberHelper.number_to_human_size(self, options || {})
|
129
|
+
when Symbol
|
130
|
+
super()
|
131
|
+
else
|
132
|
+
super(format)
|
133
|
+
end
|
126
134
|
end
|
127
135
|
end
|
128
136
|
end
|
129
137
|
|
130
|
-
|
131
|
-
if 0.class == Integer
|
132
|
-
Integer.prepend ActiveSupport::NumericWithFormat
|
133
|
-
else
|
134
|
-
Fixnum.prepend ActiveSupport::NumericWithFormat
|
135
|
-
Bignum.prepend ActiveSupport::NumericWithFormat
|
136
|
-
end
|
138
|
+
Integer.prepend ActiveSupport::NumericWithFormat
|
137
139
|
Float.prepend ActiveSupport::NumericWithFormat
|
138
140
|
BigDecimal.prepend ActiveSupport::NumericWithFormat
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "active_support/duration"
|
2
4
|
require "active_support/core_ext/time/calculations"
|
3
5
|
require "active_support/core_ext/time/acts_like"
|
@@ -5,19 +7,9 @@ require "active_support/core_ext/date/calculations"
|
|
5
7
|
require "active_support/core_ext/date/acts_like"
|
6
8
|
|
7
9
|
class Numeric
|
8
|
-
#
|
9
|
-
#
|
10
|
-
# These methods use Time#advance for precise date calculations when using from_now, ago, etc.
|
11
|
-
# as well as adding or subtracting their results from a Time object. For example:
|
12
|
-
#
|
13
|
-
# # equivalent to Time.current.advance(months: 1)
|
14
|
-
# 1.month.from_now
|
15
|
-
#
|
16
|
-
# # equivalent to Time.current.advance(years: 2)
|
17
|
-
# 2.years.from_now
|
10
|
+
# Returns a Duration instance matching the number of seconds provided.
|
18
11
|
#
|
19
|
-
# #
|
20
|
-
# (4.months + 5.years).from_now
|
12
|
+
# 2.seconds # => 2 seconds
|
21
13
|
def seconds
|
22
14
|
ActiveSupport::Duration.seconds(self)
|
23
15
|
end
|
@@ -64,10 +56,10 @@ class Numeric
|
|
64
56
|
alias :fortnight :fortnights
|
65
57
|
|
66
58
|
# Returns the number of milliseconds equivalent to the seconds provided.
|
67
|
-
# Used with the standard time durations
|
68
|
-
# so we can feed them to JavaScript functions like getTime().
|
59
|
+
# Used with the standard time durations.
|
69
60
|
#
|
70
|
-
# 2.in_milliseconds # =>
|
61
|
+
# 2.in_milliseconds # => 2000
|
62
|
+
# 1.hour.in_milliseconds # => 3600000
|
71
63
|
def in_milliseconds
|
72
64
|
self * 1000
|
73
65
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Object
|
2
4
|
# A duck-type assistant method. For example, Active Support extends Date
|
3
5
|
# to define an <tt>acts_like_date?</tt> method, and extends Time to define
|
@@ -5,6 +7,15 @@ class Object
|
|
5
7
|
# <tt>x.acts_like?(:date)</tt> to do duck-type-safe comparisons, since classes that
|
6
8
|
# we want to act like Time simply need to define an <tt>acts_like_time?</tt> method.
|
7
9
|
def acts_like?(duck)
|
8
|
-
|
10
|
+
case duck
|
11
|
+
when :time
|
12
|
+
respond_to? :acts_like_time?
|
13
|
+
when :date
|
14
|
+
respond_to? :acts_like_date?
|
15
|
+
when :string
|
16
|
+
respond_to? :acts_like_string?
|
17
|
+
else
|
18
|
+
respond_to? :"acts_like_#{duck}?"
|
19
|
+
end
|
9
20
|
end
|
10
21
|
end
|
@@ -1,8 +1,10 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "concurrent/map"
|
2
4
|
|
3
5
|
class Object
|
4
6
|
# An object is blank if it's false, empty, or a whitespace string.
|
5
|
-
# For example, +
|
7
|
+
# For example, +nil+, '', ' ', [], {}, and +false+ are all blank.
|
6
8
|
#
|
7
9
|
# This simplifies
|
8
10
|
#
|
@@ -100,6 +102,9 @@ end
|
|
100
102
|
|
101
103
|
class String
|
102
104
|
BLANK_RE = /\A[[:space:]]*\z/
|
105
|
+
ENCODED_BLANKS = Concurrent::Map.new do |h, enc|
|
106
|
+
h[enc] = Regexp.new(BLANK_RE.source.encode(enc), BLANK_RE.options | Regexp::FIXEDENCODING)
|
107
|
+
end
|
103
108
|
|
104
109
|
# A string is blank if it's empty or contains whitespaces only:
|
105
110
|
#
|
@@ -117,7 +122,12 @@ class String
|
|
117
122
|
# The regexp that matches blank strings is expensive. For the case of empty
|
118
123
|
# strings we can speed up this method (~3.5x) with an empty? call. The
|
119
124
|
# penalty for the rest of strings is marginal.
|
120
|
-
empty? ||
|
125
|
+
empty? ||
|
126
|
+
begin
|
127
|
+
BLANK_RE.match?(self)
|
128
|
+
rescue Encoding::CompatibilityError
|
129
|
+
ENCODED_BLANKS[self.encoding].match?(self)
|
130
|
+
end
|
121
131
|
end
|
122
132
|
end
|
123
133
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "active_support/core_ext/object/duplicable"
|
2
4
|
|
3
5
|
class Object
|
@@ -41,7 +43,7 @@ class Hash
|
|
41
43
|
def deep_dup
|
42
44
|
hash = dup
|
43
45
|
each_pair do |key, value|
|
44
|
-
if key.frozen?
|
46
|
+
if (::String === key && key.frozen?) || ::Symbol === key
|
45
47
|
hash[key] = value.deep_dup
|
46
48
|
else
|
47
49
|
hash.delete(key)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
#--
|
2
4
|
# Most objects are cloneable, but not all. For example you can't dup methods:
|
3
5
|
#
|
@@ -26,93 +28,6 @@ class Object
|
|
26
28
|
end
|
27
29
|
end
|
28
30
|
|
29
|
-
class NilClass
|
30
|
-
begin
|
31
|
-
nil.dup
|
32
|
-
rescue TypeError
|
33
|
-
|
34
|
-
# +nil+ is not duplicable:
|
35
|
-
#
|
36
|
-
# nil.duplicable? # => false
|
37
|
-
# nil.dup # => TypeError: can't dup NilClass
|
38
|
-
def duplicable?
|
39
|
-
false
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
class FalseClass
|
45
|
-
begin
|
46
|
-
false.dup
|
47
|
-
rescue TypeError
|
48
|
-
|
49
|
-
# +false+ is not duplicable:
|
50
|
-
#
|
51
|
-
# false.duplicable? # => false
|
52
|
-
# false.dup # => TypeError: can't dup FalseClass
|
53
|
-
def duplicable?
|
54
|
-
false
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
class TrueClass
|
60
|
-
begin
|
61
|
-
true.dup
|
62
|
-
rescue TypeError
|
63
|
-
|
64
|
-
# +true+ is not duplicable:
|
65
|
-
#
|
66
|
-
# true.duplicable? # => false
|
67
|
-
# true.dup # => TypeError: can't dup TrueClass
|
68
|
-
def duplicable?
|
69
|
-
false
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
class Symbol
|
75
|
-
begin
|
76
|
-
:symbol.dup # Ruby 2.4.x.
|
77
|
-
"symbol_from_string".to_sym.dup # Some symbols can't `dup` in Ruby 2.4.0.
|
78
|
-
rescue TypeError
|
79
|
-
|
80
|
-
# Symbols are not duplicable:
|
81
|
-
#
|
82
|
-
# :my_symbol.duplicable? # => false
|
83
|
-
# :my_symbol.dup # => TypeError: can't dup Symbol
|
84
|
-
def duplicable?
|
85
|
-
false
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
class Numeric
|
91
|
-
begin
|
92
|
-
1.dup
|
93
|
-
rescue TypeError
|
94
|
-
|
95
|
-
# Numbers are not duplicable:
|
96
|
-
#
|
97
|
-
# 3.duplicable? # => false
|
98
|
-
# 3.dup # => TypeError: can't dup Integer
|
99
|
-
def duplicable?
|
100
|
-
false
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
require "bigdecimal"
|
106
|
-
class BigDecimal
|
107
|
-
# BigDecimals are duplicable:
|
108
|
-
#
|
109
|
-
# BigDecimal.new("1.2").duplicable? # => true
|
110
|
-
# BigDecimal.new("1.2").dup # => #<BigDecimal:...,'0.12E1',18(18)>
|
111
|
-
def duplicable?
|
112
|
-
true
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
31
|
class Method
|
117
32
|
# Methods are not duplicable:
|
118
33
|
#
|
@@ -123,21 +38,11 @@ class Method
|
|
123
38
|
end
|
124
39
|
end
|
125
40
|
|
126
|
-
class
|
127
|
-
#
|
128
|
-
#
|
129
|
-
# Complex(1).duplicable? # => false
|
130
|
-
# Complex(1).dup # => TypeError: can't copy Complex
|
131
|
-
def duplicable?
|
132
|
-
false
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
|
-
class Rational
|
137
|
-
# Rationals are not duplicable:
|
41
|
+
class UnboundMethod
|
42
|
+
# Unbound methods are not duplicable:
|
138
43
|
#
|
139
|
-
#
|
140
|
-
#
|
44
|
+
# method(:puts).unbind.duplicable? # => false
|
45
|
+
# method(:puts).unbind.dup # => TypeError: allocator undefined for UnboundMethod
|
141
46
|
def duplicable?
|
142
47
|
false
|
143
48
|
end
|
@@ -1,6 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Hack to load json gem first so we can overwrite its to_json.
|
2
4
|
require "json"
|
3
5
|
require "bigdecimal"
|
6
|
+
require "ipaddr"
|
4
7
|
require "uri/generic"
|
5
8
|
require "pathname"
|
6
9
|
require "active_support/core_ext/big_decimal/conversions" # for #to_s
|
@@ -12,6 +15,7 @@ require "active_support/core_ext/time/conversions"
|
|
12
15
|
require "active_support/core_ext/date_time/conversions"
|
13
16
|
require "active_support/core_ext/date/conversions"
|
14
17
|
|
18
|
+
#--
|
15
19
|
# The JSON gem adds a few modules to Ruby core classes containing :to_json definition, overwriting
|
16
20
|
# their default behavior. That said, we need to define the basic to_json method in all of them,
|
17
21
|
# otherwise they will always use to_json gem implementation, which is backwards incompatible in
|
@@ -42,7 +46,7 @@ module ActiveSupport
|
|
42
46
|
end
|
43
47
|
end
|
44
48
|
|
45
|
-
[Object, Array, FalseClass, Float, Hash, Integer, NilClass, String, TrueClass
|
49
|
+
[Enumerable, Object, Array, FalseClass, Float, Hash, Integer, NilClass, String, TrueClass].reverse_each do |klass|
|
46
50
|
klass.prepend(ActiveSupport::ToJsonWithActiveSupportEncoder)
|
47
51
|
end
|
48
52
|
|
@@ -133,6 +137,12 @@ module Enumerable
|
|
133
137
|
end
|
134
138
|
end
|
135
139
|
|
140
|
+
class IO
|
141
|
+
def as_json(options = nil) #:nodoc:
|
142
|
+
to_s
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
136
146
|
class Range
|
137
147
|
def as_json(options = nil) #:nodoc:
|
138
148
|
to_s
|
@@ -160,7 +170,11 @@ class Hash
|
|
160
170
|
self
|
161
171
|
end
|
162
172
|
|
163
|
-
|
173
|
+
result = {}
|
174
|
+
subset.each do |k, v|
|
175
|
+
result[k.to_s] = options ? v.as_json(options.dup) : v.as_json
|
176
|
+
end
|
177
|
+
result
|
164
178
|
end
|
165
179
|
end
|
166
180
|
|
@@ -206,6 +220,12 @@ class Pathname #:nodoc:
|
|
206
220
|
end
|
207
221
|
end
|
208
222
|
|
223
|
+
class IPAddr # :nodoc:
|
224
|
+
def as_json(options = nil)
|
225
|
+
to_s
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
209
229
|
class Process::Status #:nodoc:
|
210
230
|
def as_json(options = nil)
|
211
231
|
{ exitstatus: exitstatus, pid: pid }
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "cgi"
|
2
4
|
|
3
5
|
class Object
|
@@ -73,11 +75,14 @@ class Hash
|
|
73
75
|
#
|
74
76
|
# This method is also aliased as +to_param+.
|
75
77
|
def to_query(namespace = nil)
|
76
|
-
collect do |key, value|
|
78
|
+
query = collect do |key, value|
|
77
79
|
unless (value.is_a?(Hash) || value.is_a?(Array)) && value.empty?
|
78
80
|
value.to_query(namespace ? "#{namespace}[#{key}]" : key)
|
79
81
|
end
|
80
|
-
end.compact
|
82
|
+
end.compact
|
83
|
+
|
84
|
+
query.sort! unless namespace.to_s.include?("[]")
|
85
|
+
query.join("&")
|
81
86
|
end
|
82
87
|
|
83
88
|
alias_method :to_param, :to_query
|