activesupport 4.2.11.1 → 5.2.4
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 +4 -4
- data/CHANGELOG.md +399 -440
- data/MIT-LICENSE +2 -2
- data/README.rdoc +4 -5
- 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/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 +461 -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/cache.rb +287 -196
- data/lib/active_support/callbacks.rb +640 -590
- data/lib/active_support/concern.rb +11 -5
- 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/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/array.rb +9 -6
- data/lib/active_support/core_ext/benchmark.rb +3 -1
- data/lib/active_support/core_ext/big_decimal/conversions.rb +10 -12
- data/lib/active_support/core_ext/big_decimal.rb +3 -1
- 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 -6
- data/lib/active_support/core_ext/class.rb +4 -3
- 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 +25 -23
- data/lib/active_support/core_ext/date/zones.rb +4 -2
- data/lib/active_support/core_ext/date.rb +6 -4
- data/lib/active_support/core_ext/date_and_time/calculations.rb +170 -58
- data/lib/active_support/core_ext/date_and_time/compatibility.rb +4 -3
- data/lib/active_support/core_ext/date_and_time/zones.rb +12 -12
- 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 +36 -18
- data/lib/active_support/core_ext/date_time/compatibility.rb +8 -6
- data/lib/active_support/core_ext/date_time/conversions.rb +16 -12
- data/lib/active_support/core_ext/date_time.rb +7 -5
- data/lib/active_support/core_ext/digest/uuid.rb +7 -5
- data/lib/active_support/core_ext/digest.rb +3 -0
- data/lib/active_support/core_ext/enumerable.rb +101 -33
- data/lib/active_support/core_ext/file/atomic.rb +38 -31
- data/lib/active_support/core_ext/file.rb +3 -1
- data/lib/active_support/core_ext/hash/compact.rb +14 -9
- data/lib/active_support/core_ext/hash/conversions.rb +62 -41
- 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 +14 -5
- data/lib/active_support/core_ext/hash.rb +11 -9
- 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 -18
- data/lib/active_support/core_ext/integer.rb +5 -3
- 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 -84
- data/lib/active_support/core_ext/kernel/singleton_class.rb +2 -0
- data/lib/active_support/core_ext/kernel.rb +6 -5
- data/lib/active_support/core_ext/load_error.rb +3 -22
- data/lib/active_support/core_ext/marshal.rb +8 -8
- 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 +99 -29
- 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/module.rb +14 -11
- data/lib/active_support/core_ext/name_error.rb +22 -2
- data/lib/active_support/core_ext/numeric/bytes.rb +22 -0
- data/lib/active_support/core_ext/numeric/conversions.rb +78 -81
- data/lib/active_support/core_ext/numeric/inquiry.rb +28 -0
- data/lib/active_support/core_ext/numeric/time.rb +35 -23
- data/lib/active_support/core_ext/numeric.rb +6 -3
- data/lib/active_support/core_ext/object/acts_like.rb +12 -1
- data/lib/active_support/core_ext/object/blank.rb +27 -2
- 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 +41 -14
- 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 +10 -5
- data/lib/active_support/core_ext/object/try.rb +69 -21
- data/lib/active_support/core_ext/object/with_options.rb +16 -3
- data/lib/active_support/core_ext/object.rb +14 -13
- data/lib/active_support/core_ext/range/compare_range.rb +61 -0
- 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 +2 -22
- 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/range.rb +7 -4
- 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/access.rb +8 -6
- data/lib/active_support/core_ext/string/behavior.rb +3 -1
- data/lib/active_support/core_ext/string/conversions.rb +7 -4
- data/lib/active_support/core_ext/string/exclude.rb +2 -0
- data/lib/active_support/core_ext/string/filters.rb +6 -5
- 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 +34 -38
- 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/string.rb +15 -13
- data/lib/active_support/core_ext/time/acts_like.rb +3 -1
- data/lib/active_support/core_ext/time/calculations.rb +85 -51
- data/lib/active_support/core_ext/time/compatibility.rb +4 -2
- 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/time.rb +7 -6
- data/lib/active_support/core_ext/uri.rb +6 -8
- data/lib/active_support/core_ext.rb +3 -1
- data/lib/active_support/current_attributes.rb +195 -0
- data/lib/active_support/dependencies/autoload.rb +2 -0
- data/lib/active_support/dependencies/interlock.rb +57 -0
- data/lib/active_support/dependencies.rb +152 -161
- data/lib/active_support/deprecation/behaviors.rb +44 -11
- 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 +66 -20
- data/lib/active_support/deprecation/proxy_wrappers.rb +56 -28
- data/lib/active_support/deprecation/reporting.rb +32 -12
- data/lib/active_support/deprecation.rb +12 -9
- data/lib/active_support/descendants_tracker.rb +2 -0
- data/lib/active_support/digest.rb +20 -0
- data/lib/active_support/duration/iso8601_parser.rb +125 -0
- data/lib/active_support/duration/iso8601_serializer.rb +55 -0
- data/lib/active_support/duration.rb +307 -35
- 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 +6 -4
- data/lib/active_support/gzip.rb +7 -5
- data/lib/active_support/hash_with_indifferent_access.rb +123 -28
- data/lib/active_support/i18n.rb +8 -6
- data/lib/active_support/i18n_railtie.rb +37 -13
- data/lib/active_support/inflections.rb +13 -11
- data/lib/active_support/inflector/inflections.rb +61 -12
- data/lib/active_support/inflector/methods.rb +163 -136
- data/lib/active_support/inflector/transliterate.rb +48 -27
- data/lib/active_support/inflector.rb +7 -5
- data/lib/active_support/json/decoding.rb +16 -13
- data/lib/active_support/json/encoding.rb +11 -58
- data/lib/active_support/json.rb +4 -2
- 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/test_helper.rb +14 -12
- data/lib/active_support/log_subscriber.rb +13 -10
- data/lib/active_support/logger.rb +8 -7
- data/lib/active_support/logger_silence.rb +6 -4
- data/lib/active_support/logger_thread_safe_level.rb +7 -5
- data/lib/active_support/message_encryptor.rb +168 -53
- 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/chars.rb +36 -23
- data/lib/active_support/multibyte/unicode.rb +100 -96
- data/lib/active_support/multibyte.rb +4 -2
- data/lib/active_support/notifications/fanout.rb +11 -9
- data/lib/active_support/notifications/instrumenter.rb +27 -7
- data/lib/active_support/notifications.rb +11 -7
- 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/number_helper.rb +94 -68
- 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 +23 -5
- data/lib/active_support/per_thread_registry.rb +9 -4
- 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 +15 -11
- data/lib/active_support/string_inquirer.rb +11 -3
- data/lib/active_support/subscriber.rb +21 -16
- data/lib/active_support/tagged_logging.rb +14 -11
- data/lib/active_support/test_case.rb +19 -47
- 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 +13 -8
- 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 +81 -15
- data/lib/active_support/time.rb +14 -12
- data/lib/active_support/time_with_zone.rb +169 -39
- data/lib/active_support/values/time_zone.rb +196 -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/jdom.rb +116 -114
- data/lib/active_support/xml_mini/libxml.rb +16 -13
- data/lib/active_support/xml_mini/libxmlsax.rb +15 -14
- data/lib/active_support/xml_mini/nokogiri.rb +14 -12
- data/lib/active_support/xml_mini/nokogirisax.rb +14 -13
- data/lib/active_support/xml_mini/rexml.rb +11 -9
- data/lib/active_support/xml_mini.rb +37 -37
- data/lib/active_support.rb +12 -11
- metadata +54 -24
- data/lib/active_support/concurrency/latch.rb +0 -27
- data/lib/active_support/core_ext/big_decimal/yaml_conversions.rb +0 -16
- 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 -13
- 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,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Module
|
2
4
|
# deprecate :foo
|
3
5
|
# deprecate bar: 'message'
|
@@ -13,8 +15,8 @@ class Module
|
|
13
15
|
#
|
14
16
|
# class MyLib::Deprecator
|
15
17
|
# def deprecation_warning(deprecated_method_name, message, caller_backtrace = nil)
|
16
|
-
#
|
17
|
-
#
|
18
|
+
# message = "#{deprecated_method_name} is deprecated and will be removed from MyLibrary | #{message}"
|
19
|
+
# Kernel.warn message
|
18
20
|
# end
|
19
21
|
# end
|
20
22
|
def deprecate(*method_names)
|
@@ -1,14 +1,18 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_support/inflector"
|
2
4
|
|
3
5
|
class Module
|
4
6
|
# Returns the name of the module containing this one.
|
5
7
|
#
|
6
8
|
# M::N.parent_name # => "M"
|
7
9
|
def parent_name
|
8
|
-
if defined?
|
10
|
+
if defined?(@parent_name)
|
9
11
|
@parent_name
|
10
12
|
else
|
11
|
-
|
13
|
+
parent_name = name =~ /::[^:]+\Z/ ? $`.freeze : nil
|
14
|
+
@parent_name = parent_name unless frozen?
|
15
|
+
parent_name
|
12
16
|
end
|
13
17
|
end
|
14
18
|
|
@@ -46,17 +50,13 @@ class Module
|
|
46
50
|
def parents
|
47
51
|
parents = []
|
48
52
|
if parent_name
|
49
|
-
parts = parent_name.split(
|
53
|
+
parts = parent_name.split("::")
|
50
54
|
until parts.empty?
|
51
|
-
parents << ActiveSupport::Inflector.constantize(parts *
|
55
|
+
parents << ActiveSupport::Inflector.constantize(parts * "::")
|
52
56
|
parts.pop
|
53
57
|
end
|
54
58
|
end
|
55
59
|
parents << Object unless parents.include? Object
|
56
60
|
parents
|
57
61
|
end
|
58
|
-
|
59
|
-
def local_constants #:nodoc:
|
60
|
-
constants(false)
|
61
|
-
end
|
62
62
|
end
|
@@ -1,8 +1,11 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_support/core_ext/module/anonymous"
|
4
|
+
require "active_support/core_ext/string/inflections"
|
3
5
|
|
4
6
|
class Module
|
5
7
|
def reachable? #:nodoc:
|
6
8
|
!anonymous? && name.safe_constantize.equal?(self)
|
7
9
|
end
|
10
|
+
deprecate :reachable?
|
8
11
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Module
|
4
|
+
if RUBY_VERSION >= "2.3"
|
5
|
+
# Marks the named method as intended to be redefined, if it exists.
|
6
|
+
# Suppresses the Ruby method redefinition warning. Prefer
|
7
|
+
# #redefine_method where possible.
|
8
|
+
def silence_redefinition_of_method(method)
|
9
|
+
if method_defined?(method) || private_method_defined?(method)
|
10
|
+
# This suppresses the "method redefined" warning; the self-alias
|
11
|
+
# looks odd, but means we don't need to generate a unique name
|
12
|
+
alias_method method, method
|
13
|
+
end
|
14
|
+
end
|
15
|
+
else
|
16
|
+
def silence_redefinition_of_method(method)
|
17
|
+
if method_defined?(method) || private_method_defined?(method)
|
18
|
+
alias_method :__rails_redefine, method
|
19
|
+
remove_method :__rails_redefine
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# Replaces the existing method definition, if there is one, with the passed
|
25
|
+
# block as its body.
|
26
|
+
def redefine_method(method, &block)
|
27
|
+
visibility = method_visibility(method)
|
28
|
+
silence_redefinition_of_method(method)
|
29
|
+
define_method(method, &block)
|
30
|
+
send(visibility, method)
|
31
|
+
end
|
32
|
+
|
33
|
+
# Replaces the existing singleton method definition, if there is one, with
|
34
|
+
# the passed block as its body.
|
35
|
+
def redefine_singleton_method(method, &block)
|
36
|
+
singleton_class.redefine_method(method, &block)
|
37
|
+
end
|
38
|
+
|
39
|
+
def method_visibility(method) # :nodoc:
|
40
|
+
case
|
41
|
+
when private_method_defined?(method)
|
42
|
+
:private
|
43
|
+
when protected_method_defined?(method)
|
44
|
+
:protected
|
45
|
+
else
|
46
|
+
:public
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -1,12 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_support/core_ext/module/redefine_method"
|
4
|
+
|
1
5
|
class Module
|
6
|
+
# Removes the named method, if it exists.
|
2
7
|
def remove_possible_method(method)
|
3
8
|
if method_defined?(method) || private_method_defined?(method)
|
4
9
|
undef_method(method)
|
5
10
|
end
|
6
11
|
end
|
7
12
|
|
8
|
-
|
9
|
-
|
10
|
-
|
13
|
+
# Removes the named singleton method, if it exists.
|
14
|
+
def remove_possible_singleton_method(method)
|
15
|
+
singleton_class.remove_possible_method(method)
|
11
16
|
end
|
12
17
|
end
|
@@ -1,11 +1,14 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
11
|
-
require
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_support/core_ext/module/aliasing"
|
4
|
+
require "active_support/core_ext/module/introspection"
|
5
|
+
require "active_support/core_ext/module/anonymous"
|
6
|
+
require "active_support/core_ext/module/reachable"
|
7
|
+
require "active_support/core_ext/module/attribute_accessors"
|
8
|
+
require "active_support/core_ext/module/attribute_accessors_per_thread"
|
9
|
+
require "active_support/core_ext/module/attr_internal"
|
10
|
+
require "active_support/core_ext/module/concerning"
|
11
|
+
require "active_support/core_ext/module/delegation"
|
12
|
+
require "active_support/core_ext/module/deprecation"
|
13
|
+
require "active_support/core_ext/module/redefine_method"
|
14
|
+
require "active_support/core_ext/module/remove_method"
|
@@ -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,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,70 +16,72 @@ 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.000 %
|
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
|
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"
|
81
85
|
# 1234567890123.to_s(:human_size, precision: 5) # => "1.1228 TB"
|
82
86
|
# 524288000.to_s(:human_size, precision: 5) # => "500 MB"
|
83
87
|
#
|
@@ -97,47 +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
|
-
end
|
128
|
-
|
129
|
-
klasses.each do |klass|
|
130
|
-
klass.send(:alias_method, :to_default_s, :to_s)
|
131
|
-
|
132
|
-
klass.send(:define_method, :to_s) do |*args|
|
133
|
-
if args[0].is_a?(Symbol)
|
134
|
-
format = args[0]
|
135
|
-
options = args[1] || {}
|
136
|
-
|
137
|
-
self.to_formatted_s(format, options)
|
138
|
-
else
|
139
|
-
to_default_s(*args)
|
140
|
-
end
|
141
|
-
end
|
142
|
-
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
|
143
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,53 +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
|
10
|
+
# Returns a Duration instance matching the number of seconds provided.
|
13
11
|
#
|
14
|
-
# #
|
15
|
-
# 2.years.from_now
|
16
|
-
#
|
17
|
-
# # equivalent to Time.current.advance(months: 4, years: 5)
|
18
|
-
# (4.months + 5.years).from_now
|
12
|
+
# 2.seconds # => 2 seconds
|
19
13
|
def seconds
|
20
|
-
ActiveSupport::Duration.
|
14
|
+
ActiveSupport::Duration.seconds(self)
|
21
15
|
end
|
22
16
|
alias :second :seconds
|
23
17
|
|
18
|
+
# Returns a Duration instance matching the number of minutes provided.
|
19
|
+
#
|
20
|
+
# 2.minutes # => 2 minutes
|
24
21
|
def minutes
|
25
|
-
ActiveSupport::Duration.
|
22
|
+
ActiveSupport::Duration.minutes(self)
|
26
23
|
end
|
27
24
|
alias :minute :minutes
|
28
25
|
|
26
|
+
# Returns a Duration instance matching the number of hours provided.
|
27
|
+
#
|
28
|
+
# 2.hours # => 2 hours
|
29
29
|
def hours
|
30
|
-
ActiveSupport::Duration.
|
30
|
+
ActiveSupport::Duration.hours(self)
|
31
31
|
end
|
32
32
|
alias :hour :hours
|
33
33
|
|
34
|
+
# Returns a Duration instance matching the number of days provided.
|
35
|
+
#
|
36
|
+
# 2.days # => 2 days
|
34
37
|
def days
|
35
|
-
ActiveSupport::Duration.
|
38
|
+
ActiveSupport::Duration.days(self)
|
36
39
|
end
|
37
40
|
alias :day :days
|
38
41
|
|
42
|
+
# Returns a Duration instance matching the number of weeks provided.
|
43
|
+
#
|
44
|
+
# 2.weeks # => 2 weeks
|
39
45
|
def weeks
|
40
|
-
ActiveSupport::Duration.
|
46
|
+
ActiveSupport::Duration.weeks(self)
|
41
47
|
end
|
42
48
|
alias :week :weeks
|
43
49
|
|
50
|
+
# Returns a Duration instance matching the number of fortnights provided.
|
51
|
+
#
|
52
|
+
# 2.fortnights # => 4 weeks
|
44
53
|
def fortnights
|
45
|
-
ActiveSupport::Duration.
|
54
|
+
ActiveSupport::Duration.weeks(self * 2)
|
46
55
|
end
|
47
56
|
alias :fortnight :fortnights
|
48
57
|
|
49
|
-
#
|
50
|
-
#
|
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
|
51
63
|
def in_milliseconds
|
52
64
|
self * 1000
|
53
65
|
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 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
|