activesupport 1.2.4 → 8.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG.md +505 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +40 -0
- data/lib/active_support/actionable_error.rb +50 -0
- data/lib/active_support/all.rb +5 -0
- data/lib/active_support/array_inquirer.rb +50 -0
- data/lib/active_support/backtrace_cleaner.rb +234 -0
- data/lib/active_support/benchmark.rb +21 -0
- data/lib/active_support/benchmarkable.rb +53 -0
- data/lib/active_support/broadcast_logger.rb +238 -0
- data/lib/active_support/builder.rb +8 -0
- data/lib/active_support/cache/coder.rb +153 -0
- data/lib/active_support/cache/entry.rb +134 -0
- data/lib/active_support/cache/file_store.rb +244 -0
- data/lib/active_support/cache/mem_cache_store.rb +288 -0
- data/lib/active_support/cache/memory_store.rb +264 -0
- data/lib/active_support/cache/null_store.rb +62 -0
- data/lib/active_support/cache/redis_cache_store.rb +498 -0
- data/lib/active_support/cache/serializer_with_fallback.rb +152 -0
- data/lib/active_support/cache/strategy/local_cache.rb +246 -0
- data/lib/active_support/cache/strategy/local_cache_middleware.rb +45 -0
- data/lib/active_support/cache.rb +1170 -0
- data/lib/active_support/callbacks.rb +960 -0
- data/lib/active_support/class_attribute.rb +33 -0
- data/lib/active_support/code_generator.rb +79 -0
- data/lib/active_support/concern.rb +217 -0
- data/lib/active_support/concurrency/load_interlock_aware_monitor.rb +18 -0
- data/lib/active_support/concurrency/null_lock.rb +13 -0
- data/lib/active_support/concurrency/share_lock.rb +225 -0
- data/lib/active_support/concurrency/thread_monitor.rb +55 -0
- data/lib/active_support/configurable.rb +193 -0
- data/lib/active_support/configuration_file.rb +60 -0
- data/lib/active_support/continuous_integration.rb +145 -0
- data/lib/active_support/core_ext/array/access.rb +100 -0
- data/lib/active_support/core_ext/array/conversions.rb +209 -26
- data/lib/active_support/core_ext/array/extract.rb +21 -0
- data/lib/active_support/core_ext/array/extract_options.rb +31 -0
- data/lib/active_support/core_ext/array/grouping.rb +109 -0
- data/lib/active_support/core_ext/array/inquiry.rb +19 -0
- data/lib/active_support/core_ext/array/wrap.rb +48 -0
- data/lib/active_support/core_ext/array.rb +8 -4
- data/lib/active_support/core_ext/benchmark.rb +6 -0
- data/lib/active_support/core_ext/big_decimal/conversions.rb +14 -0
- data/lib/active_support/core_ext/big_decimal.rb +3 -0
- data/lib/active_support/core_ext/class/attribute.rb +137 -0
- data/lib/active_support/core_ext/class/attribute_accessors.rb +6 -0
- data/lib/active_support/core_ext/class/subclasses.rb +24 -0
- data/lib/active_support/core_ext/class.rb +4 -0
- data/lib/active_support/core_ext/date/acts_like.rb +10 -0
- data/lib/active_support/core_ext/date/blank.rb +18 -0
- data/lib/active_support/core_ext/date/calculations.rb +161 -0
- data/lib/active_support/core_ext/date/conversions.rb +95 -28
- data/lib/active_support/core_ext/date/zones.rb +8 -0
- data/lib/active_support/core_ext/date.rb +6 -5
- data/lib/active_support/core_ext/date_and_time/calculations.rb +374 -0
- data/lib/active_support/core_ext/date_and_time/compatibility.rb +23 -0
- data/lib/active_support/core_ext/date_and_time/zones.rb +40 -0
- data/lib/active_support/core_ext/date_time/acts_like.rb +16 -0
- data/lib/active_support/core_ext/date_time/blank.rb +18 -0
- data/lib/active_support/core_ext/date_time/calculations.rb +215 -0
- data/lib/active_support/core_ext/date_time/compatibility.rb +16 -0
- data/lib/active_support/core_ext/date_time/conversions.rb +108 -0
- data/lib/active_support/core_ext/date_time.rb +7 -0
- data/lib/active_support/core_ext/digest/uuid.rb +76 -0
- data/lib/active_support/core_ext/digest.rb +3 -0
- data/lib/active_support/core_ext/enumerable.rb +277 -7
- data/lib/active_support/core_ext/erb/util.rb +201 -0
- data/lib/active_support/core_ext/file/atomic.rb +72 -0
- data/lib/active_support/core_ext/file.rb +3 -0
- data/lib/active_support/core_ext/hash/conversions.rb +262 -0
- data/lib/active_support/core_ext/hash/deep_merge.rb +43 -0
- data/lib/active_support/core_ext/hash/deep_transform_values.rb +46 -0
- data/lib/active_support/core_ext/hash/except.rb +12 -0
- data/lib/active_support/core_ext/hash/indifferent_access.rb +19 -55
- data/lib/active_support/core_ext/hash/keys.rb +134 -44
- data/lib/active_support/core_ext/hash/reverse_merge.rb +22 -22
- data/lib/active_support/core_ext/hash/slice.rb +27 -0
- data/lib/active_support/core_ext/hash.rb +9 -8
- data/lib/active_support/core_ext/integer/inflections.rb +29 -13
- data/lib/active_support/core_ext/integer/multiple.rb +12 -0
- data/lib/active_support/core_ext/integer/time.rb +22 -0
- data/lib/active_support/core_ext/integer.rb +4 -6
- data/lib/active_support/core_ext/kernel/concern.rb +14 -0
- data/lib/active_support/core_ext/kernel/reporting.rb +45 -0
- data/lib/active_support/core_ext/kernel/singleton_class.rb +8 -0
- data/lib/active_support/core_ext/kernel.rb +4 -78
- data/lib/active_support/core_ext/load_error.rb +6 -35
- data/lib/active_support/core_ext/module/aliasing.rb +31 -0
- data/lib/active_support/core_ext/module/anonymous.rb +30 -0
- data/lib/active_support/core_ext/module/attr_internal.rb +48 -0
- data/lib/active_support/core_ext/module/attribute_accessors.rb +214 -0
- data/lib/active_support/core_ext/module/attribute_accessors_per_thread.rb +175 -0
- data/lib/active_support/core_ext/module/concerning.rb +140 -0
- data/lib/active_support/core_ext/module/delegation.rb +225 -0
- data/lib/active_support/core_ext/module/deprecation.rb +25 -0
- data/lib/active_support/core_ext/module/introspection.rb +65 -0
- data/lib/active_support/core_ext/module/redefine_method.rb +40 -0
- data/lib/active_support/core_ext/module/remove_method.rb +17 -0
- data/lib/active_support/core_ext/module.rb +13 -0
- data/lib/active_support/core_ext/name_error.rb +59 -0
- data/lib/active_support/core_ext/numeric/bytes.rb +73 -42
- data/lib/active_support/core_ext/numeric/conversions.rb +145 -0
- data/lib/active_support/core_ext/numeric/time.rb +64 -57
- data/lib/active_support/core_ext/numeric.rb +4 -6
- data/lib/active_support/core_ext/object/acts_like.rb +45 -0
- data/lib/active_support/core_ext/object/blank.rb +199 -0
- data/lib/active_support/core_ext/object/conversions.rb +6 -0
- data/lib/active_support/core_ext/object/deep_dup.rb +71 -0
- data/lib/active_support/core_ext/object/duplicable.rb +69 -0
- data/lib/active_support/core_ext/object/inclusion.rb +37 -0
- data/lib/active_support/core_ext/object/instance_variables.rb +32 -0
- data/lib/active_support/core_ext/object/json.rb +267 -0
- data/lib/active_support/core_ext/object/to_param.rb +3 -0
- data/lib/active_support/core_ext/object/to_query.rb +93 -0
- data/lib/active_support/core_ext/object/try.rb +158 -0
- data/lib/active_support/core_ext/object/with.rb +46 -0
- data/lib/active_support/core_ext/object/with_options.rb +101 -0
- data/lib/active_support/core_ext/object.rb +17 -0
- data/lib/active_support/core_ext/pathname/blank.rb +20 -0
- data/lib/active_support/core_ext/pathname/existence.rb +23 -0
- data/lib/active_support/core_ext/pathname.rb +4 -0
- data/lib/active_support/core_ext/range/compare_range.rb +57 -0
- data/lib/active_support/core_ext/range/conversions.rb +58 -17
- data/lib/active_support/core_ext/range/overlap.rb +40 -0
- data/lib/active_support/core_ext/range/sole.rb +17 -0
- data/lib/active_support/core_ext/range.rb +5 -4
- data/lib/active_support/core_ext/regexp.rb +14 -0
- data/lib/active_support/core_ext/securerandom.rb +57 -0
- data/lib/active_support/core_ext/string/access.rb +93 -56
- data/lib/active_support/core_ext/string/behavior.rb +8 -0
- data/lib/active_support/core_ext/string/conversions.rb +57 -16
- data/lib/active_support/core_ext/string/exclude.rb +13 -0
- data/lib/active_support/core_ext/string/filters.rb +151 -0
- data/lib/active_support/core_ext/string/indent.rb +45 -0
- data/lib/active_support/core_ext/string/inflections.rb +297 -54
- data/lib/active_support/core_ext/string/inquiry.rb +16 -0
- data/lib/active_support/core_ext/string/multibyte.rb +67 -0
- data/lib/active_support/core_ext/string/output_safety.rb +235 -0
- data/lib/active_support/core_ext/string/starts_ends_with.rb +4 -18
- data/lib/active_support/core_ext/string/strip.rb +27 -0
- data/lib/active_support/core_ext/string/zones.rb +16 -0
- data/lib/active_support/core_ext/string.rb +14 -10
- data/lib/active_support/core_ext/symbol/starts_ends_with.rb +6 -0
- data/lib/active_support/core_ext/symbol.rb +3 -0
- data/lib/active_support/core_ext/thread/backtrace/location.rb +7 -0
- data/lib/active_support/core_ext/time/acts_like.rb +10 -0
- data/lib/active_support/core_ext/time/calculations.rb +358 -153
- data/lib/active_support/core_ext/time/compatibility.rb +15 -0
- data/lib/active_support/core_ext/time/conversions.rb +69 -30
- data/lib/active_support/core_ext/time/zones.rb +97 -0
- data/lib/active_support/core_ext/time.rb +6 -6
- data/lib/active_support/core_ext.rb +5 -1
- data/lib/active_support/current_attributes/test_helper.rb +13 -0
- data/lib/active_support/current_attributes.rb +243 -0
- data/lib/active_support/deep_mergeable.rb +53 -0
- data/lib/active_support/delegation.rb +183 -0
- data/lib/active_support/dependencies/autoload.rb +72 -0
- data/lib/active_support/dependencies/interlock.rb +55 -0
- data/lib/active_support/dependencies/require_dependency.rb +28 -0
- data/lib/active_support/dependencies.rb +84 -222
- data/lib/active_support/deprecation/behaviors.rb +148 -0
- data/lib/active_support/deprecation/constant_accessor.rb +74 -0
- data/lib/active_support/deprecation/deprecators.rb +104 -0
- data/lib/active_support/deprecation/disallowed.rb +54 -0
- data/lib/active_support/deprecation/method_wrappers.rb +68 -0
- data/lib/active_support/deprecation/proxy_wrappers.rb +189 -0
- data/lib/active_support/deprecation/reporting.rb +162 -0
- data/lib/active_support/deprecation.rb +81 -0
- data/lib/active_support/deprecator.rb +7 -0
- data/lib/active_support/descendants_tracker.rb +112 -0
- data/lib/active_support/digest.rb +22 -0
- data/lib/active_support/duration/iso8601_parser.rb +123 -0
- data/lib/active_support/duration/iso8601_serializer.rb +64 -0
- data/lib/active_support/duration.rb +524 -0
- data/lib/active_support/editor.rb +70 -0
- data/lib/active_support/encrypted_configuration.rb +126 -0
- data/lib/active_support/encrypted_file.rb +133 -0
- data/lib/active_support/environment_inquirer.rb +40 -0
- data/lib/active_support/error_reporter/test_helper.rb +15 -0
- data/lib/active_support/error_reporter.rb +318 -0
- data/lib/active_support/event_reporter/test_helper.rb +32 -0
- data/lib/active_support/event_reporter.rb +592 -0
- data/lib/active_support/evented_file_update_checker.rb +185 -0
- data/lib/active_support/execution_context/test_helper.rb +13 -0
- data/lib/active_support/execution_context.rb +110 -0
- data/lib/active_support/execution_wrapper.rb +150 -0
- data/lib/active_support/executor/test_helper.rb +7 -0
- data/lib/active_support/executor.rb +8 -0
- data/lib/active_support/file_update_checker.rb +166 -0
- data/lib/active_support/fork_tracker.rb +43 -0
- data/lib/active_support/gem_version.rb +17 -0
- data/lib/active_support/gzip.rb +41 -0
- data/lib/active_support/hash_with_indifferent_access.rb +464 -0
- data/lib/active_support/html_safe_translation.rb +56 -0
- data/lib/active_support/i18n.rb +17 -0
- data/lib/active_support/i18n_railtie.rb +140 -0
- data/lib/active_support/inflections.rb +68 -49
- data/lib/active_support/inflector/inflections.rb +290 -0
- data/lib/active_support/inflector/methods.rb +387 -0
- data/lib/active_support/inflector/transliterate.rb +147 -0
- data/lib/active_support/inflector.rb +7 -164
- data/lib/active_support/isolated_execution_state.rb +76 -0
- data/lib/active_support/json/decoding.rb +78 -0
- data/lib/active_support/json/encoding.rb +256 -0
- data/lib/active_support/json.rb +4 -0
- data/lib/active_support/key_generator.rb +66 -0
- data/lib/active_support/lazy_load_hooks.rb +107 -0
- data/lib/active_support/locale/en.rb +33 -0
- data/lib/active_support/locale/en.yml +141 -0
- data/lib/active_support/log_subscriber/test_helper.rb +106 -0
- data/lib/active_support/log_subscriber.rb +188 -0
- data/lib/active_support/logger.rb +55 -0
- data/lib/active_support/logger_silence.rb +21 -0
- data/lib/active_support/logger_thread_safe_level.rb +50 -0
- data/lib/active_support/message_encryptor.rb +374 -0
- data/lib/active_support/message_encryptors.rb +193 -0
- data/lib/active_support/message_pack/cache_serializer.rb +23 -0
- data/lib/active_support/message_pack/extensions.rb +310 -0
- data/lib/active_support/message_pack/serializer.rb +63 -0
- data/lib/active_support/message_pack.rb +50 -0
- data/lib/active_support/message_verifier.rb +377 -0
- data/lib/active_support/message_verifiers.rb +189 -0
- data/lib/active_support/messages/codec.rb +65 -0
- data/lib/active_support/messages/metadata.rb +146 -0
- data/lib/active_support/messages/rotation_configuration.rb +23 -0
- data/lib/active_support/messages/rotation_coordinator.rb +102 -0
- data/lib/active_support/messages/rotator.rb +69 -0
- data/lib/active_support/messages/serializer_with_fallback.rb +158 -0
- data/lib/active_support/multibyte/chars.rb +188 -0
- data/lib/active_support/multibyte/unicode.rb +42 -0
- data/lib/active_support/multibyte.rb +27 -0
- data/lib/active_support/notifications/fanout.rb +467 -0
- data/lib/active_support/notifications/instrumenter.rb +240 -0
- data/lib/active_support/notifications.rb +281 -0
- data/lib/active_support/number_helper/number_converter.rb +190 -0
- data/lib/active_support/number_helper/number_to_currency_converter.rb +46 -0
- data/lib/active_support/number_helper/number_to_delimited_converter.rb +30 -0
- data/lib/active_support/number_helper/number_to_human_converter.rb +69 -0
- data/lib/active_support/number_helper/number_to_human_size_converter.rb +60 -0
- data/lib/active_support/number_helper/number_to_percentage_converter.rb +16 -0
- data/lib/active_support/number_helper/number_to_phone_converter.rb +60 -0
- data/lib/active_support/number_helper/number_to_rounded_converter.rb +59 -0
- data/lib/active_support/number_helper/rounding_helper.rb +46 -0
- data/lib/active_support/number_helper.rb +479 -0
- data/lib/active_support/option_merger.rb +38 -0
- data/lib/active_support/ordered_hash.rb +50 -0
- data/lib/active_support/ordered_options.rb +141 -25
- data/lib/active_support/parameter_filter.rb +157 -0
- data/lib/active_support/rails.rb +26 -0
- data/lib/active_support/railtie.rb +180 -0
- data/lib/active_support/reloader.rb +138 -0
- data/lib/active_support/rescuable.rb +176 -0
- data/lib/active_support/secure_compare_rotator.rb +58 -0
- data/lib/active_support/security_utils.rb +38 -0
- data/lib/active_support/string_inquirer.rb +35 -0
- data/lib/active_support/structured_event_subscriber.rb +99 -0
- data/lib/active_support/subscriber.rb +141 -0
- data/lib/active_support/syntax_error_proxy.rb +67 -0
- data/lib/active_support/tagged_logging.rb +157 -0
- data/lib/active_support/test_case.rb +365 -0
- data/lib/active_support/testing/assertions.rb +369 -0
- data/lib/active_support/testing/autorun.rb +10 -0
- data/lib/active_support/testing/constant_lookup.rb +51 -0
- data/lib/active_support/testing/constant_stubbing.rb +54 -0
- data/lib/active_support/testing/declarative.rb +28 -0
- data/lib/active_support/testing/deprecation.rb +82 -0
- data/lib/active_support/testing/error_reporter_assertions.rb +124 -0
- data/lib/active_support/testing/event_reporter_assertions.rb +227 -0
- data/lib/active_support/testing/file_fixtures.rb +38 -0
- data/lib/active_support/testing/isolation.rb +121 -0
- data/lib/active_support/testing/method_call_assertions.rb +69 -0
- data/lib/active_support/testing/notification_assertions.rb +92 -0
- data/lib/active_support/testing/parallelization/server.rb +98 -0
- data/lib/active_support/testing/parallelization/worker.rb +107 -0
- data/lib/active_support/testing/parallelization.rb +79 -0
- data/lib/active_support/testing/parallelize_executor.rb +81 -0
- data/lib/active_support/testing/setup_and_teardown.rb +57 -0
- data/lib/active_support/testing/stream.rb +41 -0
- data/lib/active_support/testing/tagged_logging.rb +27 -0
- data/lib/active_support/testing/tests_without_assertions.rb +19 -0
- data/lib/active_support/testing/time_helpers.rb +273 -0
- data/lib/active_support/time.rb +20 -0
- data/lib/active_support/time_with_zone.rb +613 -0
- data/lib/active_support/values/time_zone.rb +599 -158
- data/lib/active_support/version.rb +7 -6
- data/lib/active_support/xml_mini/jdom.rb +175 -0
- data/lib/active_support/xml_mini/libxml.rb +80 -0
- data/lib/active_support/xml_mini/libxmlsax.rb +83 -0
- data/lib/active_support/xml_mini/nokogiri.rb +83 -0
- data/lib/active_support/xml_mini/nokogirisax.rb +86 -0
- data/lib/active_support/xml_mini/rexml.rb +137 -0
- data/lib/active_support/xml_mini.rb +212 -0
- data/lib/active_support.rb +122 -10
- metadata +524 -93
- data/CHANGELOG +0 -283
- data/lib/active_support/binding_of_caller.rb +0 -84
- data/lib/active_support/breakpoint.rb +0 -523
- data/lib/active_support/class_attribute_accessors.rb +0 -57
- data/lib/active_support/class_inheritable_attributes.rb +0 -117
- data/lib/active_support/clean_logger.rb +0 -36
- data/lib/active_support/core_ext/blank.rb +0 -38
- data/lib/active_support/core_ext/cgi/escape_skipping_slashes.rb +0 -14
- data/lib/active_support/core_ext/cgi.rb +0 -5
- data/lib/active_support/core_ext/exception.rb +0 -29
- data/lib/active_support/core_ext/integer/even_odd.rb +0 -24
- data/lib/active_support/core_ext/object_and_class.rb +0 -44
- data/lib/active_support/module_attribute_accessors.rb +0 -57
- data/lib/active_support/whiny_nil.rb +0 -38
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "active_support/multibyte"
|
|
4
|
+
|
|
5
|
+
class String
|
|
6
|
+
# == Multibyte proxy
|
|
7
|
+
#
|
|
8
|
+
# +mb_chars+ is a multibyte safe proxy for string methods.
|
|
9
|
+
#
|
|
10
|
+
# It creates and returns an instance of the ActiveSupport::Multibyte::Chars class which
|
|
11
|
+
# encapsulates the original string. A Unicode safe version of all the String methods are defined on this proxy
|
|
12
|
+
# class. If the proxy class doesn't respond to a certain method, it's forwarded to the encapsulated string.
|
|
13
|
+
#
|
|
14
|
+
# >> "lj".mb_chars.upcase.to_s
|
|
15
|
+
# # => "LJ"
|
|
16
|
+
#
|
|
17
|
+
# NOTE: Ruby 2.4 and later support native Unicode case mappings:
|
|
18
|
+
#
|
|
19
|
+
# >> "lj".upcase
|
|
20
|
+
# # => "LJ"
|
|
21
|
+
#
|
|
22
|
+
# == \Method chaining
|
|
23
|
+
#
|
|
24
|
+
# All the methods on the Chars proxy which normally return a string will return a Chars object. This allows
|
|
25
|
+
# method chaining on the result of any of these methods.
|
|
26
|
+
#
|
|
27
|
+
# name.mb_chars.reverse.length # => 12
|
|
28
|
+
#
|
|
29
|
+
# == Interoperability and configuration
|
|
30
|
+
#
|
|
31
|
+
# The Chars object tries to be as interchangeable with String objects as possible: sorting and comparing between
|
|
32
|
+
# String and Char work like expected. The bang! methods change the internal string representation in the Chars
|
|
33
|
+
# object. Interoperability problems can be resolved easily with a +to_s+ call.
|
|
34
|
+
#
|
|
35
|
+
# For more information about the methods defined on the Chars proxy see ActiveSupport::Multibyte::Chars. For
|
|
36
|
+
# information about how to change the default Multibyte behavior see ActiveSupport::Multibyte.
|
|
37
|
+
def mb_chars
|
|
38
|
+
ActiveSupport.deprecator.warn(
|
|
39
|
+
"String#mb_chars is deprecated and will be removed in Rails 8.2. " \
|
|
40
|
+
"Use normal string methods instead."
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
if ActiveSupport::Multibyte.proxy_class == ActiveSupport::Multibyte::Chars
|
|
44
|
+
ActiveSupport::Multibyte::Chars.new(self, deprecation: false)
|
|
45
|
+
else
|
|
46
|
+
ActiveSupport::Multibyte.proxy_class.new(self)
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Returns +true+ if string has utf_8 encoding.
|
|
51
|
+
#
|
|
52
|
+
# utf_8_str = "some string".encode "UTF-8"
|
|
53
|
+
# iso_str = "some string".encode "ISO-8859-1"
|
|
54
|
+
#
|
|
55
|
+
# utf_8_str.is_utf8? # => true
|
|
56
|
+
# iso_str.is_utf8? # => false
|
|
57
|
+
def is_utf8?
|
|
58
|
+
case encoding
|
|
59
|
+
when Encoding::UTF_8, Encoding::US_ASCII
|
|
60
|
+
valid_encoding?
|
|
61
|
+
when Encoding::ASCII_8BIT
|
|
62
|
+
dup.force_encoding(Encoding::UTF_8).valid_encoding?
|
|
63
|
+
else
|
|
64
|
+
false
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "active_support/core_ext/erb/util"
|
|
4
|
+
require "active_support/multibyte/unicode"
|
|
5
|
+
|
|
6
|
+
class Object
|
|
7
|
+
def html_safe?
|
|
8
|
+
false
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
class Numeric
|
|
13
|
+
def html_safe?
|
|
14
|
+
true
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
module ActiveSupport # :nodoc:
|
|
19
|
+
class SafeBuffer < String
|
|
20
|
+
UNSAFE_STRING_METHODS = %w(
|
|
21
|
+
capitalize chomp chop delete delete_prefix delete_suffix
|
|
22
|
+
downcase lstrip next reverse rstrip scrub squeeze strip
|
|
23
|
+
succ swapcase tr tr_s unicode_normalize upcase
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
UNSAFE_STRING_METHODS_WITH_BACKREF = %w(gsub sub)
|
|
27
|
+
|
|
28
|
+
alias_method :original_concat, :concat
|
|
29
|
+
private :original_concat
|
|
30
|
+
|
|
31
|
+
# Raised when ActiveSupport::SafeBuffer#safe_concat is called on unsafe buffers.
|
|
32
|
+
class SafeConcatError < StandardError
|
|
33
|
+
def initialize
|
|
34
|
+
super "Could not concatenate to the buffer because it is not HTML safe."
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def [](*args)
|
|
39
|
+
if html_safe?
|
|
40
|
+
new_string = super
|
|
41
|
+
|
|
42
|
+
return unless new_string
|
|
43
|
+
|
|
44
|
+
string_into_safe_buffer(new_string, true)
|
|
45
|
+
else
|
|
46
|
+
to_str[*args]
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
alias_method :slice, :[]
|
|
50
|
+
|
|
51
|
+
def slice!(*args)
|
|
52
|
+
new_string = super
|
|
53
|
+
|
|
54
|
+
return new_string if !html_safe? || new_string.nil?
|
|
55
|
+
|
|
56
|
+
string_into_safe_buffer(new_string, true)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def chr
|
|
60
|
+
return super unless html_safe?
|
|
61
|
+
|
|
62
|
+
string_into_safe_buffer(super, true)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def safe_concat(value)
|
|
66
|
+
raise SafeConcatError unless html_safe?
|
|
67
|
+
original_concat(value)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def initialize(_str = "")
|
|
71
|
+
super
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def initialize_copy(other)
|
|
75
|
+
super
|
|
76
|
+
@html_unsafe = true unless other.html_safe?
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def concat(value)
|
|
80
|
+
unless value.nil?
|
|
81
|
+
super(implicit_html_escape_interpolated_argument(value))
|
|
82
|
+
end
|
|
83
|
+
self
|
|
84
|
+
end
|
|
85
|
+
alias << concat
|
|
86
|
+
|
|
87
|
+
def bytesplice(*args, value)
|
|
88
|
+
super(*args, implicit_html_escape_interpolated_argument(value))
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def insert(index, value)
|
|
92
|
+
super(index, implicit_html_escape_interpolated_argument(value))
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def prepend(value)
|
|
96
|
+
super(implicit_html_escape_interpolated_argument(value))
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def replace(value)
|
|
100
|
+
super(implicit_html_escape_interpolated_argument(value))
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def []=(arg1, arg2, arg3 = nil)
|
|
104
|
+
if arg3
|
|
105
|
+
super(arg1, arg2, implicit_html_escape_interpolated_argument(arg3))
|
|
106
|
+
else
|
|
107
|
+
super(arg1, implicit_html_escape_interpolated_argument(arg2))
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def +(other)
|
|
112
|
+
dup.concat(other)
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def *(_)
|
|
116
|
+
new_string = super
|
|
117
|
+
new_safe_buffer = new_string.is_a?(SafeBuffer) ? new_string : SafeBuffer.new(new_string)
|
|
118
|
+
if @html_unsafe
|
|
119
|
+
new_safe_buffer.instance_variable_set(:@html_unsafe, true)
|
|
120
|
+
end
|
|
121
|
+
new_safe_buffer
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def %(args)
|
|
125
|
+
case args
|
|
126
|
+
when Hash
|
|
127
|
+
escaped_args = args.transform_values { |arg| explicit_html_escape_interpolated_argument(arg) }
|
|
128
|
+
else
|
|
129
|
+
escaped_args = Array(args).map { |arg| explicit_html_escape_interpolated_argument(arg) }
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
self.class.new(super(escaped_args))
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def html_safe?
|
|
136
|
+
@html_unsafe.nil?
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def to_s
|
|
140
|
+
self
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def as_json(*)
|
|
144
|
+
to_str
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def to_param
|
|
148
|
+
to_str
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def encode_with(coder)
|
|
152
|
+
coder.represent_object nil, to_str
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
UNSAFE_STRING_METHODS.each do |unsafe_method|
|
|
156
|
+
if unsafe_method.respond_to?(unsafe_method)
|
|
157
|
+
class_eval <<-EOT, __FILE__, __LINE__ + 1
|
|
158
|
+
def #{unsafe_method}(*args, &block) # def capitalize(*args, &block)
|
|
159
|
+
to_str.#{unsafe_method}(*args, &block) # to_str.capitalize(*args, &block)
|
|
160
|
+
end # end
|
|
161
|
+
|
|
162
|
+
def #{unsafe_method}!(*args) # def capitalize!(*args)
|
|
163
|
+
@html_unsafe = true # @html_unsafe = true
|
|
164
|
+
super # super
|
|
165
|
+
end # end
|
|
166
|
+
EOT
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
UNSAFE_STRING_METHODS_WITH_BACKREF.each do |unsafe_method|
|
|
171
|
+
class_eval <<-EOT, __FILE__, __LINE__ + 1
|
|
172
|
+
def #{unsafe_method}(*args, &block) # def gsub(*args, &block)
|
|
173
|
+
if block # if block
|
|
174
|
+
to_str.#{unsafe_method}(*args) { |*params| # to_str.gsub(*args) { |*params|
|
|
175
|
+
set_block_back_references(block, $~) # set_block_back_references(block, $~)
|
|
176
|
+
block.call(*params) # block.call(*params)
|
|
177
|
+
} # }
|
|
178
|
+
else # else
|
|
179
|
+
to_str.#{unsafe_method}(*args) # to_str.gsub(*args)
|
|
180
|
+
end # end
|
|
181
|
+
end # end
|
|
182
|
+
|
|
183
|
+
def #{unsafe_method}!(*args, &block) # def gsub!(*args, &block)
|
|
184
|
+
@html_unsafe = true # @html_unsafe = true
|
|
185
|
+
if block # if block
|
|
186
|
+
super(*args) { |*params| # super(*args) { |*params|
|
|
187
|
+
set_block_back_references(block, $~) # set_block_back_references(block, $~)
|
|
188
|
+
block.call(*params) # block.call(*params)
|
|
189
|
+
} # }
|
|
190
|
+
else # else
|
|
191
|
+
super # super
|
|
192
|
+
end # end
|
|
193
|
+
end # end
|
|
194
|
+
EOT
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
private
|
|
198
|
+
def explicit_html_escape_interpolated_argument(arg)
|
|
199
|
+
(!html_safe? || arg.html_safe?) ? arg : ERB::Util.unwrapped_html_escape(arg)
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
def implicit_html_escape_interpolated_argument(arg)
|
|
203
|
+
if !html_safe? || arg.html_safe?
|
|
204
|
+
arg
|
|
205
|
+
else
|
|
206
|
+
ERB::Util.unwrapped_html_escape(arg.to_str)
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
def set_block_back_references(block, match_data)
|
|
211
|
+
block.binding.eval("proc { |m| $~ = m }").call(match_data)
|
|
212
|
+
rescue ArgumentError
|
|
213
|
+
# Can't create binding from C level Proc
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
def string_into_safe_buffer(new_string, is_html_safe)
|
|
217
|
+
new_safe_buffer = new_string.is_a?(SafeBuffer) ? new_string : SafeBuffer.new(new_string)
|
|
218
|
+
unless is_html_safe
|
|
219
|
+
new_safe_buffer.instance_variable_set :@html_unsafe, true
|
|
220
|
+
end
|
|
221
|
+
new_safe_buffer
|
|
222
|
+
end
|
|
223
|
+
end
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
class String
|
|
227
|
+
# Marks a string as trusted safe. It will be inserted into HTML with no
|
|
228
|
+
# additional escaping performed. It is your responsibility to ensure that the
|
|
229
|
+
# string contains no malicious content. This method is equivalent to the
|
|
230
|
+
# +raw+ helper in views. It is recommended that you use +sanitize+ instead of
|
|
231
|
+
# this method. It should never be called on user input.
|
|
232
|
+
def html_safe
|
|
233
|
+
ActiveSupport::SafeBuffer.new(self)
|
|
234
|
+
end
|
|
235
|
+
end
|
|
@@ -1,20 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
module CoreExtensions #:nodoc:
|
|
3
|
-
module String #:nodoc:
|
|
4
|
-
# Additional string tests.
|
|
5
|
-
module StartsEndsWith
|
|
6
|
-
# Does the string start with the specified +prefix+?
|
|
7
|
-
def starts_with?(prefix)
|
|
8
|
-
prefix = prefix.to_s
|
|
9
|
-
self[0, prefix.length] == prefix
|
|
10
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
11
2
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
self[-suffix.length, suffix.length] == suffix
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
end
|
|
3
|
+
class String
|
|
4
|
+
alias :starts_with? :start_with?
|
|
5
|
+
alias :ends_with? :end_with?
|
|
20
6
|
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class String
|
|
4
|
+
# Strips indentation in heredocs.
|
|
5
|
+
#
|
|
6
|
+
# For example in
|
|
7
|
+
#
|
|
8
|
+
# if options[:usage]
|
|
9
|
+
# puts <<-USAGE.strip_heredoc
|
|
10
|
+
# This command does such and such.
|
|
11
|
+
#
|
|
12
|
+
# Supported options are:
|
|
13
|
+
# -h This message
|
|
14
|
+
# ...
|
|
15
|
+
# USAGE
|
|
16
|
+
# end
|
|
17
|
+
#
|
|
18
|
+
# the user would see the usage message aligned against the left margin.
|
|
19
|
+
#
|
|
20
|
+
# Technically, it looks for the least indented non-empty line
|
|
21
|
+
# in the whole string, and removes that amount of leading whitespace.
|
|
22
|
+
def strip_heredoc
|
|
23
|
+
gsub(/^#{scan(/^[ \t]*(?=\S)/).min}/, "").tap do |stripped|
|
|
24
|
+
stripped.freeze if frozen?
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "active_support/core_ext/string/conversions"
|
|
4
|
+
require "active_support/core_ext/time/zones"
|
|
5
|
+
|
|
6
|
+
class String
|
|
7
|
+
# Converts String to a TimeWithZone in the current zone if Time.zone or Time.zone_default
|
|
8
|
+
# is set, otherwise converts String to a Time via String#to_time
|
|
9
|
+
def in_time_zone(zone = ::Time.zone)
|
|
10
|
+
if zone
|
|
11
|
+
::Time.find_zone!(zone).parse(self)
|
|
12
|
+
else
|
|
13
|
+
to_time
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -1,11 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
require File.dirname(__FILE__) + '/string/conversions'
|
|
3
|
-
require File.dirname(__FILE__) + '/string/access'
|
|
4
|
-
require File.dirname(__FILE__) + '/string/starts_ends_with'
|
|
1
|
+
# frozen_string_literal: true
|
|
5
2
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
3
|
+
require_relative "string/conversions"
|
|
4
|
+
require_relative "string/filters"
|
|
5
|
+
require_relative "string/multibyte"
|
|
6
|
+
require_relative "string/starts_ends_with"
|
|
7
|
+
require_relative "string/inflections"
|
|
8
|
+
require_relative "string/access"
|
|
9
|
+
require_relative "string/behavior"
|
|
10
|
+
require_relative "string/output_safety"
|
|
11
|
+
require_relative "string/exclude"
|
|
12
|
+
require_relative "string/strip"
|
|
13
|
+
require_relative "string/inquiry"
|
|
14
|
+
require_relative "string/indent"
|
|
15
|
+
require_relative "string/zones"
|