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
|
@@ -1,53 +1,143 @@
|
|
|
1
|
-
|
|
2
|
-
module CoreExtensions #:nodoc:
|
|
3
|
-
module Hash #:nodoc:
|
|
4
|
-
module Keys
|
|
5
|
-
# Return a new hash with all keys converted to strings.
|
|
6
|
-
def stringify_keys
|
|
7
|
-
inject({}) do |options, (key, value)|
|
|
8
|
-
options[key.to_s] = value
|
|
9
|
-
options
|
|
10
|
-
end
|
|
11
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
12
2
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
3
|
+
class Hash
|
|
4
|
+
# Returns a new hash with all keys converted to strings.
|
|
5
|
+
#
|
|
6
|
+
# hash = { name: 'Rob', age: '28' }
|
|
7
|
+
#
|
|
8
|
+
# hash.stringify_keys
|
|
9
|
+
# # => {"name"=>"Rob", "age"=>"28"}
|
|
10
|
+
def stringify_keys
|
|
11
|
+
transform_keys { |k| Symbol === k ? k.name : k.to_s }
|
|
12
|
+
end
|
|
23
13
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
end
|
|
30
|
-
end
|
|
14
|
+
# Destructively converts all keys to strings. Same as
|
|
15
|
+
# +stringify_keys+, but modifies +self+.
|
|
16
|
+
def stringify_keys!
|
|
17
|
+
transform_keys! { |k| Symbol === k ? k.name : k.to_s }
|
|
18
|
+
end
|
|
31
19
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
20
|
+
# Returns a new hash with all keys converted to symbols, as long as
|
|
21
|
+
# they respond to +to_sym+.
|
|
22
|
+
#
|
|
23
|
+
# hash = { 'name' => 'Rob', 'age' => '28' }
|
|
24
|
+
#
|
|
25
|
+
# hash.symbolize_keys
|
|
26
|
+
# # => {:name=>"Rob", :age=>"28"}
|
|
27
|
+
def symbolize_keys
|
|
28
|
+
transform_keys { |key| key.to_sym rescue key }
|
|
29
|
+
end
|
|
30
|
+
alias_method :to_options, :symbolize_keys
|
|
42
31
|
|
|
43
|
-
|
|
44
|
-
|
|
32
|
+
# Destructively converts all keys to symbols, as long as they respond
|
|
33
|
+
# to +to_sym+. Same as +symbolize_keys+, but modifies +self+.
|
|
34
|
+
def symbolize_keys!
|
|
35
|
+
transform_keys! { |key| key.to_sym rescue key }
|
|
36
|
+
end
|
|
37
|
+
alias_method :to_options!, :symbolize_keys!
|
|
45
38
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
39
|
+
# Validates all keys in a hash match <tt>*valid_keys</tt>, raising
|
|
40
|
+
# +ArgumentError+ on a mismatch.
|
|
41
|
+
#
|
|
42
|
+
# Note that keys are treated differently than HashWithIndifferentAccess,
|
|
43
|
+
# meaning that string and symbol keys will not match.
|
|
44
|
+
#
|
|
45
|
+
# { name: 'Rob', years: '28' }.assert_valid_keys(:name, :age) # => raises "ArgumentError: Unknown key: :years. Valid keys are: :name, :age"
|
|
46
|
+
# { name: 'Rob', age: '28' }.assert_valid_keys('name', 'age') # => raises "ArgumentError: Unknown key: :name. Valid keys are: 'name', 'age'"
|
|
47
|
+
# { name: 'Rob', age: '28' }.assert_valid_keys(:name, :age) # => passes, raises nothing
|
|
48
|
+
def assert_valid_keys(*valid_keys)
|
|
49
|
+
valid_keys.flatten!
|
|
50
|
+
each_key do |k|
|
|
51
|
+
unless valid_keys.include?(k)
|
|
52
|
+
raise ArgumentError.new("Unknown key: #{k.inspect}. Valid keys are: #{valid_keys.map(&:inspect).join(', ')}")
|
|
50
53
|
end
|
|
51
54
|
end
|
|
52
55
|
end
|
|
56
|
+
|
|
57
|
+
# Returns a new hash with all keys converted by the block operation.
|
|
58
|
+
# This includes the keys from the root hash and from all
|
|
59
|
+
# nested hashes and arrays.
|
|
60
|
+
#
|
|
61
|
+
# hash = { person: { name: 'Rob', age: '28' } }
|
|
62
|
+
#
|
|
63
|
+
# hash.deep_transform_keys{ |key| key.to_s.upcase }
|
|
64
|
+
# # => {"PERSON"=>{"NAME"=>"Rob", "AGE"=>"28"}}
|
|
65
|
+
def deep_transform_keys(&block)
|
|
66
|
+
_deep_transform_keys_in_object(self, &block)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Destructively converts all keys by using the block operation.
|
|
70
|
+
# This includes the keys from the root hash and from all
|
|
71
|
+
# nested hashes and arrays.
|
|
72
|
+
def deep_transform_keys!(&block)
|
|
73
|
+
_deep_transform_keys_in_object!(self, &block)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# Returns a new hash with all keys converted to strings.
|
|
77
|
+
# This includes the keys from the root hash and from all
|
|
78
|
+
# nested hashes and arrays.
|
|
79
|
+
#
|
|
80
|
+
# hash = { person: { name: 'Rob', age: '28' } }
|
|
81
|
+
#
|
|
82
|
+
# hash.deep_stringify_keys
|
|
83
|
+
# # => {"person"=>{"name"=>"Rob", "age"=>"28"}}
|
|
84
|
+
def deep_stringify_keys
|
|
85
|
+
deep_transform_keys { |k| Symbol === k ? k.name : k.to_s }
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Destructively converts all keys to strings.
|
|
89
|
+
# This includes the keys from the root hash and from all
|
|
90
|
+
# nested hashes and arrays.
|
|
91
|
+
def deep_stringify_keys!
|
|
92
|
+
deep_transform_keys! { |k| Symbol === k ? k.name : k.to_s }
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# Returns a new hash with all keys converted to symbols, as long as
|
|
96
|
+
# they respond to +to_sym+. This includes the keys from the root hash
|
|
97
|
+
# and from all nested hashes and arrays.
|
|
98
|
+
#
|
|
99
|
+
# hash = { 'person' => { 'name' => 'Rob', 'age' => '28' } }
|
|
100
|
+
#
|
|
101
|
+
# hash.deep_symbolize_keys
|
|
102
|
+
# # => {:person=>{:name=>"Rob", :age=>"28"}}
|
|
103
|
+
def deep_symbolize_keys
|
|
104
|
+
deep_transform_keys { |key| key.to_sym rescue key }
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# Destructively converts all keys to symbols, as long as they respond
|
|
108
|
+
# to +to_sym+. This includes the keys from the root hash and from all
|
|
109
|
+
# nested hashes and arrays.
|
|
110
|
+
def deep_symbolize_keys!
|
|
111
|
+
deep_transform_keys! { |key| key.to_sym rescue key }
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
private
|
|
115
|
+
# Support methods for deep transforming nested hashes and arrays.
|
|
116
|
+
def _deep_transform_keys_in_object(object, &block)
|
|
117
|
+
case object
|
|
118
|
+
when Hash
|
|
119
|
+
object.each_with_object(self.class.new) do |(key, value), result|
|
|
120
|
+
result[yield(key)] = _deep_transform_keys_in_object(value, &block)
|
|
121
|
+
end
|
|
122
|
+
when Array
|
|
123
|
+
object.map { |e| _deep_transform_keys_in_object(e, &block) }
|
|
124
|
+
else
|
|
125
|
+
object
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def _deep_transform_keys_in_object!(object, &block)
|
|
130
|
+
case object
|
|
131
|
+
when Hash
|
|
132
|
+
object.keys.each do |key|
|
|
133
|
+
value = object.delete(key)
|
|
134
|
+
object[yield(key)] = _deep_transform_keys_in_object!(value, &block)
|
|
135
|
+
end
|
|
136
|
+
object
|
|
137
|
+
when Array
|
|
138
|
+
object.map! { |e| _deep_transform_keys_in_object!(e, &block) }
|
|
139
|
+
else
|
|
140
|
+
object
|
|
141
|
+
end
|
|
142
|
+
end
|
|
53
143
|
end
|
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
|
|
2
|
-
module CoreExtensions #:nodoc:
|
|
3
|
-
module Hash #:nodoc:
|
|
4
|
-
# Allows for reverse merging where its the keys in the calling hash that wins over those in the <tt>other_hash</tt>.
|
|
5
|
-
# This is particularly useful for initializing an incoming option hash with default values:
|
|
6
|
-
#
|
|
7
|
-
# def setup(options = {})
|
|
8
|
-
# options.reverse_merge! :size => 25, :velocity => 10
|
|
9
|
-
# end
|
|
10
|
-
#
|
|
11
|
-
# The default :size and :velocity is only set if the +options+ passed in doesn't already have those keys set.
|
|
12
|
-
module ReverseMerge
|
|
13
|
-
def reverse_merge(other_hash)
|
|
14
|
-
other_hash.merge(self)
|
|
15
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
16
2
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
3
|
+
class Hash
|
|
4
|
+
# Merges the caller into +other_hash+. For example,
|
|
5
|
+
#
|
|
6
|
+
# options = options.reverse_merge(size: 25, velocity: 10)
|
|
7
|
+
#
|
|
8
|
+
# is equivalent to
|
|
9
|
+
#
|
|
10
|
+
# options = { size: 25, velocity: 10 }.merge(options)
|
|
11
|
+
#
|
|
12
|
+
# This is particularly useful for initializing an options hash
|
|
13
|
+
# with default values.
|
|
14
|
+
def reverse_merge(other_hash)
|
|
15
|
+
other_hash.merge(self)
|
|
16
|
+
end
|
|
17
|
+
alias_method :with_defaults, :reverse_merge
|
|
20
18
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
19
|
+
# Destructive +reverse_merge+.
|
|
20
|
+
def reverse_merge!(other_hash)
|
|
21
|
+
replace(reverse_merge(other_hash))
|
|
24
22
|
end
|
|
25
|
-
|
|
23
|
+
alias_method :reverse_update, :reverse_merge!
|
|
24
|
+
alias_method :with_defaults!, :reverse_merge!
|
|
25
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class Hash
|
|
4
|
+
# Replaces the hash with only the given keys.
|
|
5
|
+
# Returns a hash containing the removed key/value pairs.
|
|
6
|
+
#
|
|
7
|
+
# hash = { a: 1, b: 2, c: 3, d: 4 }
|
|
8
|
+
# hash.slice!(:a, :b) # => {:c=>3, :d=>4}
|
|
9
|
+
# hash # => {:a=>1, :b=>2}
|
|
10
|
+
def slice!(*keys)
|
|
11
|
+
omit = slice(*self.keys - keys)
|
|
12
|
+
hash = slice(*keys)
|
|
13
|
+
hash.default = default
|
|
14
|
+
hash.default_proc = default_proc if default_proc
|
|
15
|
+
replace(hash)
|
|
16
|
+
omit
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Removes and returns the key/value pairs matching the given keys.
|
|
20
|
+
#
|
|
21
|
+
# hash = { a: 1, b: 2, c: 3, d: 4 }
|
|
22
|
+
# hash.extract!(:a, :b) # => {:a=>1, :b=>2}
|
|
23
|
+
# hash # => {:c=>3, :d=>4}
|
|
24
|
+
def extract!(*keys)
|
|
25
|
+
keys.each_with_object(self.class.new) { |key, result| result[key] = delete(key) if has_key?(key) }
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
require File.dirname(__FILE__) + '/hash/indifferent_access'
|
|
3
|
-
require File.dirname(__FILE__) + '/hash/reverse_merge'
|
|
1
|
+
# frozen_string_literal: true
|
|
4
2
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
3
|
+
require_relative "hash/conversions"
|
|
4
|
+
require_relative "hash/deep_merge"
|
|
5
|
+
require_relative "hash/deep_transform_values"
|
|
6
|
+
require_relative "hash/except"
|
|
7
|
+
require_relative "hash/indifferent_access"
|
|
8
|
+
require_relative "hash/keys"
|
|
9
|
+
require_relative "hash/reverse_merge"
|
|
10
|
+
require_relative "hash/slice"
|
|
@@ -1,15 +1,31 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "active_support/inflector"
|
|
4
|
+
|
|
5
|
+
class Integer
|
|
6
|
+
# Ordinalize turns a number into an ordinal string used to denote the
|
|
7
|
+
# position in an ordered sequence such as 1st, 2nd, 3rd, 4th.
|
|
8
|
+
#
|
|
9
|
+
# 1.ordinalize # => "1st"
|
|
10
|
+
# 2.ordinalize # => "2nd"
|
|
11
|
+
# 1002.ordinalize # => "1002nd"
|
|
12
|
+
# 1003.ordinalize # => "1003rd"
|
|
13
|
+
# -11.ordinalize # => "-11th"
|
|
14
|
+
# -1001.ordinalize # => "-1001st"
|
|
15
|
+
def ordinalize
|
|
16
|
+
ActiveSupport::Inflector.ordinalize(self)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Ordinal returns the suffix used to denote the position
|
|
20
|
+
# in an ordered sequence such as 1st, 2nd, 3rd, 4th.
|
|
21
|
+
#
|
|
22
|
+
# 1.ordinal # => "st"
|
|
23
|
+
# 2.ordinal # => "nd"
|
|
24
|
+
# 1002.ordinal # => "nd"
|
|
25
|
+
# 1003.ordinal # => "rd"
|
|
26
|
+
# -11.ordinal # => "th"
|
|
27
|
+
# -1001.ordinal # => "st"
|
|
28
|
+
def ordinal
|
|
29
|
+
ActiveSupport::Inflector.ordinal(self)
|
|
14
30
|
end
|
|
15
31
|
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class Integer
|
|
4
|
+
# Check whether the integer is evenly divisible by the argument.
|
|
5
|
+
#
|
|
6
|
+
# 0.multiple_of?(0) # => true
|
|
7
|
+
# 6.multiple_of?(5) # => false
|
|
8
|
+
# 10.multiple_of?(2) # => true
|
|
9
|
+
def multiple_of?(number)
|
|
10
|
+
number == 0 ? self == 0 : self % number == 0
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "active_support/duration"
|
|
4
|
+
require "active_support/core_ext/numeric/time"
|
|
5
|
+
|
|
6
|
+
class Integer
|
|
7
|
+
# Returns a Duration instance matching the number of months provided.
|
|
8
|
+
#
|
|
9
|
+
# 2.months # => 2 months
|
|
10
|
+
def months
|
|
11
|
+
ActiveSupport::Duration.months(self)
|
|
12
|
+
end
|
|
13
|
+
alias :month :months
|
|
14
|
+
|
|
15
|
+
# Returns a Duration instance matching the number of years provided.
|
|
16
|
+
#
|
|
17
|
+
# 2.years # => 2 years
|
|
18
|
+
def years
|
|
19
|
+
ActiveSupport::Duration.years(self)
|
|
20
|
+
end
|
|
21
|
+
alias :year :years
|
|
22
|
+
end
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
require File.dirname(__FILE__) + '/integer/inflections'
|
|
1
|
+
# frozen_string_literal: true
|
|
3
2
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
end
|
|
3
|
+
require_relative "integer/multiple"
|
|
4
|
+
require_relative "integer/inflections"
|
|
5
|
+
require_relative "integer/time"
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "active_support/core_ext/module/concerning"
|
|
4
|
+
|
|
5
|
+
module Kernel
|
|
6
|
+
module_function
|
|
7
|
+
|
|
8
|
+
# A shortcut to define a toplevel concern, not within a module.
|
|
9
|
+
#
|
|
10
|
+
# See Module::Concerning for more.
|
|
11
|
+
def concern(topic, &module_definition)
|
|
12
|
+
Object.concern topic, &module_definition
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Kernel
|
|
4
|
+
module_function
|
|
5
|
+
|
|
6
|
+
# Sets $VERBOSE to +nil+ for the duration of the block and back to its original
|
|
7
|
+
# value afterwards.
|
|
8
|
+
#
|
|
9
|
+
# silence_warnings do
|
|
10
|
+
# value = noisy_call # no warning voiced
|
|
11
|
+
# end
|
|
12
|
+
#
|
|
13
|
+
# noisy_call # warning voiced
|
|
14
|
+
def silence_warnings(&block)
|
|
15
|
+
with_warnings(nil, &block)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Sets $VERBOSE to +true+ for the duration of the block and back to its
|
|
19
|
+
# original value afterwards.
|
|
20
|
+
def enable_warnings(&block)
|
|
21
|
+
with_warnings(true, &block)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Sets $VERBOSE for the duration of the block and back to its original
|
|
25
|
+
# value afterwards.
|
|
26
|
+
def with_warnings(flag)
|
|
27
|
+
old_verbose, $VERBOSE = $VERBOSE, flag
|
|
28
|
+
yield
|
|
29
|
+
ensure
|
|
30
|
+
$VERBOSE = old_verbose
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Blocks and ignores any exception passed as argument if raised within the block.
|
|
34
|
+
#
|
|
35
|
+
# suppress(ZeroDivisionError) do
|
|
36
|
+
# 1/0
|
|
37
|
+
# puts 'This code is NOT reached'
|
|
38
|
+
# end
|
|
39
|
+
#
|
|
40
|
+
# puts 'This code gets executed and nothing related to ZeroDivisionError was seen'
|
|
41
|
+
def suppress(*exception_classes)
|
|
42
|
+
yield
|
|
43
|
+
rescue *exception_classes
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -1,79 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
# A Ruby-ized realization of the K combinator, courtesy of Mikael Brockman.
|
|
3
|
-
#
|
|
4
|
-
# def foo
|
|
5
|
-
# returning values = [] do
|
|
6
|
-
# values << 'bar'
|
|
7
|
-
# values << 'baz'
|
|
8
|
-
# end
|
|
9
|
-
# end
|
|
10
|
-
#
|
|
11
|
-
# foo # => ['bar', 'baz']
|
|
12
|
-
#
|
|
13
|
-
def returning(value)
|
|
14
|
-
yield
|
|
15
|
-
value
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
# Sets $VERBOSE to nil for the duration of the block and back to its original value afterwards.
|
|
19
|
-
#
|
|
20
|
-
# silence_warnings do
|
|
21
|
-
# value = noisy_call # no warning voiced
|
|
22
|
-
# end
|
|
23
|
-
#
|
|
24
|
-
# noisy_call # warning voiced
|
|
25
|
-
def silence_warnings
|
|
26
|
-
old_verbose, $VERBOSE = $VERBOSE, nil
|
|
27
|
-
yield
|
|
28
|
-
ensure
|
|
29
|
-
$VERBOSE = old_verbose
|
|
30
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
31
2
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
# $stderr.puts 'This will never be seen'
|
|
36
|
-
# end
|
|
37
|
-
#
|
|
38
|
-
# $stderr.puts 'But this will'
|
|
39
|
-
def silence_stderr
|
|
40
|
-
old_stderr = STDERR.dup
|
|
41
|
-
STDERR.reopen(RUBY_PLATFORM =~ /mswin/ ? 'NUL:' : '/dev/null')
|
|
42
|
-
STDERR.sync = true
|
|
43
|
-
yield
|
|
44
|
-
ensure
|
|
45
|
-
STDERR.reopen(old_stderr)
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
# Makes backticks behave (somewhat more) similarly on all platforms.
|
|
49
|
-
# On win32 `nonexistent_command` raises Errno::ENOENT; on Unix, the
|
|
50
|
-
# spawned shell prints a message to stderr and sets $?. We emulate
|
|
51
|
-
# Unix on the former but not the latter.
|
|
52
|
-
def `(command) #:nodoc:
|
|
53
|
-
super
|
|
54
|
-
rescue Errno::ENOENT => e
|
|
55
|
-
STDERR.puts "#$0: #{e}"
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
# Method that requires a library, ensuring that rubygems is loaded
|
|
59
|
-
def require_library_or_gem(library_name)
|
|
60
|
-
begin
|
|
61
|
-
require library_name
|
|
62
|
-
rescue LoadError => cannot_require
|
|
63
|
-
# 1. Requiring the module is unsuccessful, maybe it's a gem and nobody required rubygems yet. Try.
|
|
64
|
-
begin
|
|
65
|
-
require 'rubygems'
|
|
66
|
-
rescue LoadError => rubygems_not_installed
|
|
67
|
-
raise cannot_require
|
|
68
|
-
end
|
|
69
|
-
# 2. Rubygems is installed and loaded. Try to load the library again
|
|
70
|
-
begin
|
|
71
|
-
require library_name
|
|
72
|
-
rescue LoadError => gem_not_installed
|
|
73
|
-
raise cannot_require
|
|
74
|
-
end
|
|
75
|
-
end
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
end
|
|
3
|
+
require_relative "kernel/concern"
|
|
4
|
+
require_relative "kernel/reporting"
|
|
5
|
+
require_relative "kernel/singleton_class"
|
|
@@ -1,38 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
attr_reader :path
|
|
3
|
-
def initialize(message, path)
|
|
4
|
-
super(message)
|
|
5
|
-
@path = path
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
def is_missing?(path)
|
|
9
|
-
path.gsub(/\.rb$/, '') == self.path.gsub(/\.rb$/, '')
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
def self.from_message(message)
|
|
13
|
-
REGEXPS.each do |regexp, capture|
|
|
14
|
-
match = regexp.match(message)
|
|
15
|
-
return MissingSourceFile.new(message, match[capture]) unless match.nil?
|
|
16
|
-
end
|
|
17
|
-
nil
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
REGEXPS = [
|
|
21
|
-
[/^no such file to load -- (.+)$/i, 1],
|
|
22
|
-
[/^Missing \w+ (file\s*)?([^\s]+.rb)$/i, 2],
|
|
23
|
-
[/^Missing API definition file in (.+)$/i, 1]
|
|
24
|
-
]
|
|
25
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
26
2
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
(self == LoadError && MissingSourceFile.from_message(args.first)) || super
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
::LoadError.extend(LoadErrorClassMethods)
|
|
36
|
-
end
|
|
3
|
+
class LoadError
|
|
4
|
+
# Returns true if the given path name (except perhaps for the ".rb"
|
|
5
|
+
# extension) is the missing file which caused the exception to be raised.
|
|
6
|
+
def is_missing?(location)
|
|
7
|
+
location.delete_suffix(".rb") == path.to_s.delete_suffix(".rb")
|
|
37
8
|
end
|
|
38
9
|
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class Module
|
|
4
|
+
# Allows you to make aliases for attributes, which includes
|
|
5
|
+
# getter, setter, and a predicate.
|
|
6
|
+
#
|
|
7
|
+
# class Content < ActiveRecord::Base
|
|
8
|
+
# # has a title attribute
|
|
9
|
+
# end
|
|
10
|
+
#
|
|
11
|
+
# class Email < Content
|
|
12
|
+
# alias_attribute :subject, :title
|
|
13
|
+
# end
|
|
14
|
+
#
|
|
15
|
+
# e = Email.find(1)
|
|
16
|
+
# e.title # => "Superstars"
|
|
17
|
+
# e.subject # => "Superstars"
|
|
18
|
+
# e.subject? # => true
|
|
19
|
+
# e.subject = "Megastars"
|
|
20
|
+
# e.title # => "Megastars"
|
|
21
|
+
def alias_attribute(new_name, old_name)
|
|
22
|
+
# The following reader methods use an explicit `self` receiver in order to
|
|
23
|
+
# support aliases that start with an uppercase letter. Otherwise, they would
|
|
24
|
+
# be resolved as constants instead.
|
|
25
|
+
module_eval <<-STR, __FILE__, __LINE__ + 1
|
|
26
|
+
def #{new_name}; self.#{old_name}; end # def subject; self.title; end
|
|
27
|
+
def #{new_name}?; self.#{old_name}?; end # def subject?; self.title?; end
|
|
28
|
+
def #{new_name}=(v); self.#{old_name} = v; end # def subject=(v); self.title = v; end
|
|
29
|
+
STR
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class Module
|
|
4
|
+
# A module may or may not have a name.
|
|
5
|
+
#
|
|
6
|
+
# module M; end
|
|
7
|
+
# M.name # => "M"
|
|
8
|
+
#
|
|
9
|
+
# m = Module.new
|
|
10
|
+
# m.name # => nil
|
|
11
|
+
#
|
|
12
|
+
# +anonymous?+ method returns true if module does not have a name, false otherwise:
|
|
13
|
+
#
|
|
14
|
+
# Module.new.anonymous? # => true
|
|
15
|
+
#
|
|
16
|
+
# module M; end
|
|
17
|
+
# M.anonymous? # => false
|
|
18
|
+
#
|
|
19
|
+
# A module gets a name when it is first assigned to a constant. Either
|
|
20
|
+
# via the +module+ or +class+ keyword or by an explicit assignment:
|
|
21
|
+
#
|
|
22
|
+
# m = Module.new # creates an anonymous module
|
|
23
|
+
# m.anonymous? # => true
|
|
24
|
+
# M = m # m gets a name here as a side-effect
|
|
25
|
+
# m.name # => "M"
|
|
26
|
+
# m.anonymous? # => false
|
|
27
|
+
def anonymous?
|
|
28
|
+
name.nil?
|
|
29
|
+
end
|
|
30
|
+
end
|