activesupport 3.0.pre → 3.0.0.rc
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.
- data/CHANGELOG +121 -1
- data/README.rdoc +33 -0
- data/lib/active_support.rb +42 -4
- data/lib/active_support/backtrace_cleaner.rb +31 -9
- data/lib/active_support/benchmarkable.rb +1 -0
- data/lib/active_support/buffered_logger.rb +5 -2
- data/lib/active_support/builder.rb +6 -0
- data/lib/active_support/cache.rb +454 -84
- data/lib/active_support/cache/compressed_mem_cache_store.rb +6 -13
- data/lib/active_support/cache/file_store.rb +140 -41
- data/lib/active_support/cache/mem_cache_store.rb +121 -76
- data/lib/active_support/cache/memory_store.rb +127 -27
- data/lib/active_support/cache/strategy/local_cache.rb +111 -58
- data/lib/active_support/cache/synchronized_memory_store.rb +2 -38
- data/lib/active_support/callbacks.rb +105 -76
- data/lib/active_support/configurable.rb +19 -18
- data/lib/active_support/core_ext/array.rb +1 -0
- data/lib/active_support/core_ext/array/access.rb +1 -1
- data/lib/active_support/core_ext/array/conversions.rb +29 -54
- data/lib/active_support/core_ext/array/extract_options.rb +16 -1
- data/lib/active_support/core_ext/array/grouping.rb +1 -1
- data/lib/active_support/core_ext/array/random_access.rb +26 -5
- data/lib/active_support/core_ext/array/uniq_by.rb +17 -0
- data/lib/active_support/core_ext/array/wrap.rb +13 -9
- data/lib/active_support/core_ext/benchmark.rb +0 -12
- data/lib/active_support/core_ext/cgi/escape_skipping_slashes.rb +2 -0
- data/lib/active_support/core_ext/class.rb +2 -1
- data/lib/active_support/core_ext/class/attribute.rb +67 -0
- data/lib/active_support/core_ext/class/attribute_accessors.rb +33 -27
- data/lib/active_support/core_ext/class/delegating_attributes.rb +35 -41
- data/lib/active_support/core_ext/class/inheritable_attributes.rb +23 -14
- data/lib/active_support/core_ext/class/subclasses.rb +50 -0
- data/lib/active_support/core_ext/date/calculations.rb +35 -12
- data/lib/active_support/core_ext/date/conversions.rb +5 -5
- data/lib/active_support/core_ext/date/zones.rb +14 -0
- data/lib/active_support/core_ext/date_time/calculations.rb +3 -1
- data/lib/active_support/core_ext/date_time/conversions.rb +24 -5
- data/lib/active_support/core_ext/date_time/zones.rb +4 -0
- data/lib/active_support/core_ext/enumerable.rb +5 -9
- data/lib/active_support/core_ext/exception.rb +0 -47
- data/lib/active_support/core_ext/file.rb +1 -0
- data/lib/active_support/core_ext/file/atomic.rb +3 -2
- data/lib/active_support/core_ext/file/path.rb +5 -0
- data/lib/active_support/core_ext/float/rounding.rb +3 -2
- data/lib/active_support/core_ext/hash/conversions.rb +65 -145
- data/lib/active_support/core_ext/hash/deep_merge.rb +6 -7
- data/lib/active_support/core_ext/hash/except.rb +8 -1
- data/lib/active_support/core_ext/hash/indifferent_access.rb +5 -0
- data/lib/active_support/core_ext/hash/keys.rb +10 -11
- data/lib/active_support/core_ext/hash/slice.rb +6 -0
- data/lib/active_support/core_ext/integer.rb +1 -1
- data/lib/active_support/core_ext/integer/multiple.rb +6 -0
- data/lib/active_support/core_ext/kernel.rb +1 -1
- data/lib/active_support/core_ext/kernel/debugger.rb +3 -2
- data/lib/active_support/core_ext/kernel/reporting.rb +2 -1
- data/lib/active_support/core_ext/kernel/requires.rb +2 -2
- data/lib/active_support/core_ext/kernel/singleton_class.rb +13 -0
- data/lib/active_support/core_ext/load_error.rb +17 -30
- data/lib/active_support/core_ext/logger.rb +2 -40
- data/lib/active_support/core_ext/module.rb +5 -3
- data/lib/active_support/core_ext/module/aliasing.rb +1 -1
- data/lib/active_support/core_ext/module/anonymous.rb +24 -0
- data/lib/active_support/core_ext/module/attr_accessor_with_default.rb +1 -1
- data/lib/active_support/core_ext/module/attr_internal.rb +2 -2
- data/lib/active_support/core_ext/module/attribute_accessors.rb +20 -22
- data/lib/active_support/core_ext/module/delegation.rb +21 -10
- data/lib/active_support/core_ext/module/introspection.rb +8 -8
- data/lib/active_support/core_ext/module/method_names.rb +14 -0
- data/lib/active_support/core_ext/module/reachable.rb +10 -0
- data/lib/active_support/core_ext/module/remove_method.rb +11 -0
- data/lib/active_support/core_ext/module/synchronization.rb +2 -1
- data/lib/active_support/core_ext/name_error.rb +3 -1
- data/lib/active_support/core_ext/object.rb +5 -3
- data/lib/active_support/core_ext/object/blank.rb +20 -2
- data/lib/active_support/core_ext/object/conversions.rb +2 -16
- data/lib/active_support/core_ext/object/duplicable.rb +23 -1
- data/lib/active_support/core_ext/object/instance_variables.rb +0 -7
- data/lib/active_support/core_ext/object/to_json.rb +19 -0
- data/lib/active_support/core_ext/object/to_param.rb +49 -0
- data/lib/active_support/core_ext/object/to_query.rb +27 -0
- data/lib/active_support/core_ext/object/with_options.rb +2 -0
- data/lib/active_support/core_ext/proc.rb +4 -4
- data/lib/active_support/core_ext/range/overlaps.rb +1 -1
- data/lib/active_support/core_ext/regexp.rb +0 -22
- data/lib/active_support/core_ext/rexml.rb +4 -1
- data/lib/active_support/core_ext/string.rb +3 -2
- data/lib/active_support/core_ext/string/access.rb +4 -2
- data/lib/active_support/core_ext/string/conversions.rb +28 -1
- data/lib/active_support/core_ext/string/encoding.rb +11 -0
- data/lib/active_support/core_ext/string/exclude.rb +6 -0
- data/lib/active_support/core_ext/string/filters.rb +29 -0
- data/lib/active_support/core_ext/string/inflections.rb +12 -12
- data/lib/active_support/core_ext/string/interpolation.rb +2 -92
- data/lib/active_support/core_ext/string/multibyte.rb +16 -19
- data/lib/active_support/core_ext/string/output_safety.rb +101 -35
- data/lib/active_support/core_ext/string/starts_ends_with.rb +0 -14
- data/lib/active_support/core_ext/string/xchar.rb +1 -1
- data/lib/active_support/core_ext/time/calculations.rb +14 -7
- data/lib/active_support/core_ext/time/conversions.rb +1 -0
- data/lib/active_support/core_ext/time/marshal.rb +56 -0
- data/lib/active_support/core_ext/time/zones.rb +2 -5
- data/lib/active_support/core_ext/uri.rb +10 -4
- data/lib/active_support/dependencies.rb +200 -197
- data/lib/active_support/dependencies/autoload.rb +50 -0
- data/lib/active_support/deprecation/behaviors.rb +13 -9
- data/lib/active_support/deprecation/method_wrappers.rb +10 -9
- data/lib/active_support/deprecation/proxy_wrappers.rb +7 -0
- data/lib/active_support/deprecation/reporting.rb +5 -3
- data/lib/active_support/descendants_tracker.rb +43 -0
- data/lib/active_support/duration.rb +8 -4
- data/lib/active_support/file_update_checker.rb +36 -0
- data/lib/active_support/hash_with_indifferent_access.rb +9 -1
- data/lib/active_support/i18n.rb +9 -0
- data/lib/active_support/i18n_railtie.rb +81 -0
- data/lib/active_support/inflections.rb +1 -1
- data/lib/active_support/inflector.rb +4 -407
- data/lib/active_support/inflector/inflections.rb +211 -0
- data/lib/active_support/inflector/methods.rb +151 -0
- data/lib/active_support/inflector/transliterate.rb +97 -0
- data/lib/active_support/json/backends/jsongem.rb +12 -9
- data/lib/active_support/json/backends/yajl.rb +40 -0
- data/lib/active_support/json/backends/yaml.rb +1 -1
- data/lib/active_support/json/decoding.rb +17 -2
- data/lib/active_support/json/encoding.rb +48 -31
- data/lib/active_support/json/variable.rb +2 -4
- data/lib/active_support/lazy_load_hooks.rb +27 -0
- data/lib/active_support/locale/en.yml +5 -2
- data/lib/active_support/log_subscriber.rb +123 -0
- data/lib/active_support/log_subscriber/test_helper.rb +99 -0
- data/lib/active_support/memoizable.rb +1 -1
- data/lib/active_support/message_encryptor.rb +1 -0
- data/lib/active_support/message_verifier.rb +2 -1
- data/lib/active_support/multibyte.rb +8 -23
- data/lib/active_support/multibyte/chars.rb +213 -446
- data/lib/active_support/multibyte/unicode.rb +392 -0
- data/lib/active_support/multibyte/utils.rb +6 -7
- data/lib/active_support/notifications.rb +29 -122
- data/lib/active_support/notifications/fanout.rb +61 -0
- data/lib/active_support/notifications/instrumenter.rb +54 -0
- data/lib/active_support/ordered_hash.rb +59 -14
- data/lib/active_support/ordered_options.rb +6 -0
- data/lib/active_support/railtie.rb +60 -0
- data/lib/active_support/rescuable.rb +7 -4
- data/lib/active_support/ruby/shim.rb +4 -6
- data/lib/active_support/test_case.rb +2 -7
- data/lib/active_support/testing/assertions.rb +15 -0
- data/lib/active_support/testing/declarative.rb +1 -1
- data/lib/active_support/testing/isolation.rb +64 -17
- data/lib/active_support/testing/performance.rb +306 -335
- data/lib/active_support/testing/setup_and_teardown.rb +51 -29
- data/lib/active_support/time.rb +24 -3
- data/lib/active_support/time_with_zone.rb +10 -14
- data/lib/active_support/values/time_zone.rb +192 -234
- data/lib/active_support/values/unicode_tables.dat +0 -0
- data/lib/active_support/version.rb +3 -2
- data/lib/active_support/whiny_nil.rb +9 -7
- data/lib/active_support/xml_mini.rb +130 -1
- data/lib/active_support/xml_mini/jdom.rb +2 -0
- data/lib/active_support/xml_mini/libxml.rb +23 -86
- data/lib/active_support/xml_mini/libxmlsax.rb +85 -0
- data/lib/active_support/xml_mini/nokogiri.rb +27 -24
- data/lib/active_support/xml_mini/nokogirisax.rb +83 -0
- data/lib/active_support/xml_mini/rexml.rb +8 -2
- metadata +62 -195
- data/README +0 -43
- data/lib/active_support/autoload.rb +0 -28
- data/lib/active_support/core_ext/boolean.rb +0 -1
- data/lib/active_support/core_ext/boolean/conversions.rb +0 -11
- data/lib/active_support/core_ext/class/removal.rb +0 -53
- data/lib/active_support/core_ext/date.rb +0 -7
- data/lib/active_support/core_ext/date_time.rb +0 -5
- data/lib/active_support/core_ext/integer/even_odd.rb +0 -16
- data/lib/active_support/core_ext/kernel/daemonizing.rb +0 -7
- data/lib/active_support/core_ext/module/inclusion.rb +0 -30
- data/lib/active_support/core_ext/module/loading.rb +0 -23
- data/lib/active_support/core_ext/nil.rb +0 -1
- data/lib/active_support/core_ext/nil/conversions.rb +0 -5
- data/lib/active_support/core_ext/object/extending.rb +0 -80
- data/lib/active_support/core_ext/object/metaclass.rb +0 -13
- data/lib/active_support/core_ext/object/misc.rb +0 -3
- data/lib/active_support/core_ext/object/returning.rb +0 -42
- data/lib/active_support/core_ext/object/tap.rb +0 -16
- data/lib/active_support/core_ext/string/bytesize.rb +0 -5
- data/lib/active_support/core_ext/string/iterators.rb +0 -13
- data/lib/active_support/core_ext/symbol.rb +0 -1
- data/lib/active_support/core_ext/symbol/to_proc.rb +0 -14
- data/lib/active_support/core_ext/time.rb +0 -10
- data/lib/active_support/core_ext/time/marshal_with_utc_flag.rb +0 -22
- data/lib/active_support/deprecated_callbacks.rb +0 -283
- data/lib/active_support/multibyte/unicode_database.rb +0 -71
- data/lib/active_support/vendor.rb +0 -16
- data/lib/active_support/vendor/builder-2.1.2/lib/blankslate.rb +0 -113
- data/lib/active_support/vendor/builder-2.1.2/lib/builder.rb +0 -13
- data/lib/active_support/vendor/builder-2.1.2/lib/builder/blankslate.rb +0 -20
- data/lib/active_support/vendor/builder-2.1.2/lib/builder/css.rb +0 -250
- data/lib/active_support/vendor/builder-2.1.2/lib/builder/xchar.rb +0 -115
- data/lib/active_support/vendor/builder-2.1.2/lib/builder/xmlbase.rb +0 -139
- data/lib/active_support/vendor/builder-2.1.2/lib/builder/xmlevents.rb +0 -63
- data/lib/active_support/vendor/builder-2.1.2/lib/builder/xmlmarkup.rb +0 -328
- data/lib/active_support/vendor/i18n-0.1.3/MIT-LICENSE +0 -20
- data/lib/active_support/vendor/i18n-0.1.3/README.textile +0 -20
- data/lib/active_support/vendor/i18n-0.1.3/Rakefile +0 -5
- data/lib/active_support/vendor/i18n-0.1.3/i18n.gemspec +0 -27
- data/lib/active_support/vendor/i18n-0.1.3/lib/i18n.rb +0 -204
- data/lib/active_support/vendor/i18n-0.1.3/lib/i18n/backend/simple.rb +0 -215
- data/lib/active_support/vendor/i18n-0.1.3/lib/i18n/exceptions.rb +0 -53
- data/lib/active_support/vendor/i18n-0.1.3/test/all.rb +0 -5
- data/lib/active_support/vendor/i18n-0.1.3/test/i18n_exceptions_test.rb +0 -99
- data/lib/active_support/vendor/i18n-0.1.3/test/i18n_test.rb +0 -124
- data/lib/active_support/vendor/i18n-0.1.3/test/locale/en.rb +0 -1
- data/lib/active_support/vendor/i18n-0.1.3/test/locale/en.yml +0 -3
- data/lib/active_support/vendor/i18n-0.1.3/test/simple_backend_test.rb +0 -567
- data/lib/active_support/vendor/memcache-client-1.7.5/lib/memcache.rb +0 -1133
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo.rb +0 -33
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/data_timezone.rb +0 -47
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/data_timezone_info.rb +0 -228
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Africa/Algiers.rb +0 -55
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Africa/Cairo.rb +0 -219
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Africa/Casablanca.rb +0 -42
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Africa/Harare.rb +0 -18
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Africa/Johannesburg.rb +0 -25
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Africa/Monrovia.rb +0 -22
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Africa/Nairobi.rb +0 -23
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Argentina/Buenos_Aires.rb +0 -166
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Argentina/San_Juan.rb +0 -86
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Bogota.rb +0 -23
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Caracas.rb +0 -23
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Chicago.rb +0 -283
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Chihuahua.rb +0 -136
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Denver.rb +0 -204
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Godthab.rb +0 -161
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Guatemala.rb +0 -27
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Halifax.rb +0 -274
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Indiana/Indianapolis.rb +0 -149
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Juneau.rb +0 -194
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/La_Paz.rb +0 -22
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Lima.rb +0 -35
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Los_Angeles.rb +0 -232
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Mazatlan.rb +0 -139
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Mexico_City.rb +0 -144
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Monterrey.rb +0 -131
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/New_York.rb +0 -282
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Phoenix.rb +0 -30
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Regina.rb +0 -74
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Santiago.rb +0 -205
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Sao_Paulo.rb +0 -171
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/St_Johns.rb +0 -288
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Tijuana.rb +0 -196
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Almaty.rb +0 -67
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Baghdad.rb +0 -73
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Baku.rb +0 -161
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Bangkok.rb +0 -20
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Chongqing.rb +0 -33
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Colombo.rb +0 -30
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Dhaka.rb +0 -27
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Hong_Kong.rb +0 -87
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Irkutsk.rb +0 -165
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Jakarta.rb +0 -30
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Jerusalem.rb +0 -163
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Kabul.rb +0 -20
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Kamchatka.rb +0 -163
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Karachi.rb +0 -32
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Kathmandu.rb +0 -20
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Kolkata.rb +0 -25
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Krasnoyarsk.rb +0 -163
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Kuala_Lumpur.rb +0 -31
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Kuwait.rb +0 -18
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Magadan.rb +0 -163
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Muscat.rb +0 -18
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Novosibirsk.rb +0 -164
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Rangoon.rb +0 -24
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Riyadh.rb +0 -18
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Seoul.rb +0 -34
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Shanghai.rb +0 -35
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Singapore.rb +0 -33
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Taipei.rb +0 -59
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Tashkent.rb +0 -47
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Tbilisi.rb +0 -78
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Tehran.rb +0 -121
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Tokyo.rb +0 -30
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Ulaanbaatar.rb +0 -65
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Urumqi.rb +0 -33
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Vladivostok.rb +0 -164
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Yakutsk.rb +0 -163
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Yekaterinburg.rb +0 -165
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Yerevan.rb +0 -165
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Atlantic/Azores.rb +0 -270
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Atlantic/Cape_Verde.rb +0 -23
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Atlantic/South_Georgia.rb +0 -18
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Australia/Adelaide.rb +0 -187
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Australia/Brisbane.rb +0 -35
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Australia/Darwin.rb +0 -29
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Australia/Hobart.rb +0 -193
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Australia/Melbourne.rb +0 -185
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Australia/Perth.rb +0 -37
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Australia/Sydney.rb +0 -185
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Etc/UTC.rb +0 -16
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Amsterdam.rb +0 -228
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Athens.rb +0 -185
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Belgrade.rb +0 -163
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Berlin.rb +0 -188
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Bratislava.rb +0 -13
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Brussels.rb +0 -232
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Bucharest.rb +0 -181
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Budapest.rb +0 -197
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Copenhagen.rb +0 -179
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Dublin.rb +0 -276
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Helsinki.rb +0 -163
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Istanbul.rb +0 -218
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Kiev.rb +0 -168
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Lisbon.rb +0 -268
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Ljubljana.rb +0 -13
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/London.rb +0 -288
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Madrid.rb +0 -211
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Minsk.rb +0 -170
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Moscow.rb +0 -181
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Paris.rb +0 -232
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Prague.rb +0 -187
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Riga.rb +0 -176
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Rome.rb +0 -215
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Sarajevo.rb +0 -13
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Skopje.rb +0 -13
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Sofia.rb +0 -173
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Stockholm.rb +0 -165
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Tallinn.rb +0 -172
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Vienna.rb +0 -183
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Vilnius.rb +0 -170
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Warsaw.rb +0 -212
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Zagreb.rb +0 -13
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Auckland.rb +0 -202
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Fiji.rb +0 -23
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Guam.rb +0 -22
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Honolulu.rb +0 -28
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Majuro.rb +0 -20
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Midway.rb +0 -25
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Noumea.rb +0 -25
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Pago_Pago.rb +0 -26
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Port_Moresby.rb +0 -20
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Tongatapu.rb +0 -27
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/info_timezone.rb +0 -52
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/linked_timezone.rb +0 -51
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/linked_timezone_info.rb +0 -44
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/offset_rationals.rb +0 -98
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/ruby_core_support.rb +0 -56
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/time_or_datetime.rb +0 -292
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/timezone.rb +0 -508
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/timezone_definition.rb +0 -56
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/timezone_info.rb +0 -40
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/timezone_offset_info.rb +0 -94
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/timezone_period.rb +0 -198
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/timezone_transition_info.rb +0 -129
@@ -1,3 +1,14 @@
|
|
1
|
+
class Hash
|
2
|
+
# By default, only instances of Hash itself are extractable.
|
3
|
+
# Subclasses of Hash may implement this method and return
|
4
|
+
# true to declare themselves as extractable. If a Hash
|
5
|
+
# is extractable, Array#extract_options! pops it from
|
6
|
+
# the Array when it is the last element of the Array.
|
7
|
+
def extractable_options?
|
8
|
+
instance_of?(Hash)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
1
12
|
class Array
|
2
13
|
# Extracts options from a set of arguments. Removes and returns the last
|
3
14
|
# element in the array if it's a hash, otherwise returns a blank hash.
|
@@ -9,6 +20,10 @@ class Array
|
|
9
20
|
# options(1, 2) # => {}
|
10
21
|
# options(1, 2, :a => :b) # => {:a=>:b}
|
11
22
|
def extract_options!
|
12
|
-
last.is_a?(
|
23
|
+
if last.is_a?(Hash) && last.extractable_options?
|
24
|
+
pop
|
25
|
+
else
|
26
|
+
{}
|
27
|
+
end
|
13
28
|
end
|
14
29
|
end
|
@@ -55,7 +55,7 @@ class Array
|
|
55
55
|
# ["6", "7"]
|
56
56
|
def in_groups(number, fill_with = nil)
|
57
57
|
# size / number gives minor group size;
|
58
|
-
# size % number gives how many objects need extra
|
58
|
+
# size % number gives how many objects need extra accommodation;
|
59
59
|
# each group hold either division or division + 1 items.
|
60
60
|
division = size / number
|
61
61
|
modulo = size % number
|
@@ -1,6 +1,27 @@
|
|
1
1
|
class Array
|
2
|
-
#
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
2
|
+
# Backport of Array#sample based on Marc-Andre Lafortune's http://github.com/marcandre/backports/
|
3
|
+
# Returns a random element or +n+ random elements from the array.
|
4
|
+
# If the array is empty and +n+ is nil, returns <tt>nil</tt>. if +n+ is passed, returns <tt>[]</tt>.
|
5
|
+
#
|
6
|
+
# [1,2,3,4,5,6].sample # => 4
|
7
|
+
# [1,2,3,4,5,6].sample(3) # => [2, 4, 5]
|
8
|
+
# [].sample # => nil
|
9
|
+
# [].sample(3) # => []
|
10
|
+
def sample(n=nil)
|
11
|
+
return self[Kernel.rand(size)] if n.nil?
|
12
|
+
n = n.to_int
|
13
|
+
rescue Exception => e
|
14
|
+
raise TypeError, "Coercion error: #{n.inspect}.to_int => Integer failed:\n(#{e.message})"
|
15
|
+
else
|
16
|
+
raise TypeError, "Coercion error: obj.to_int did NOT return an Integer (was #{n.class})" unless n.kind_of? Integer
|
17
|
+
raise ArgumentError, "negative array size" if n < 0
|
18
|
+
n = size if n > size
|
19
|
+
result = Array.new(self)
|
20
|
+
n.times do |i|
|
21
|
+
r = i + Kernel.rand(size - i)
|
22
|
+
result[i], result[r] = result[r], result[i]
|
23
|
+
end
|
24
|
+
result[n..size] = []
|
25
|
+
result
|
26
|
+
end unless method_defined? :sample
|
27
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
class Array
|
2
|
+
# Return an unique array based on the criteria given as a proc.
|
3
|
+
#
|
4
|
+
# [1, 2, 3, 4].uniq_by { |i| i.odd? }
|
5
|
+
# #=> [1, 2]
|
6
|
+
#
|
7
|
+
def uniq_by
|
8
|
+
hash, array = {}, []
|
9
|
+
each { |i| hash[yield(i)] ||= (array << i) }
|
10
|
+
array
|
11
|
+
end
|
12
|
+
|
13
|
+
# Same as uniq_by, but modifies self.
|
14
|
+
def uniq_by!
|
15
|
+
replace(uniq_by{ |i| yield(i) })
|
16
|
+
end
|
17
|
+
end
|
@@ -1,18 +1,22 @@
|
|
1
1
|
class Array
|
2
2
|
# Wraps the object in an Array unless it's an Array. Converts the
|
3
3
|
# object to an Array using #to_ary if it implements that.
|
4
|
+
#
|
5
|
+
# It differs with Array() in that it does not call +to_a+ on
|
6
|
+
# the argument:
|
7
|
+
#
|
8
|
+
# Array(:foo => :bar) # => [[:foo, :bar]]
|
9
|
+
# Array.wrap(:foo => :bar) # => [{:foo => :bar}]
|
10
|
+
#
|
11
|
+
# Array("foo\nbar") # => ["foo\n", "bar"], in Ruby 1.8
|
12
|
+
# Array.wrap("foo\nbar") # => ["foo\nbar"]
|
4
13
|
def self.wrap(object)
|
5
|
-
|
6
|
-
when nil
|
14
|
+
if object.nil?
|
7
15
|
[]
|
8
|
-
|
9
|
-
object
|
16
|
+
elsif object.respond_to?(:to_ary)
|
17
|
+
object.to_ary
|
10
18
|
else
|
11
|
-
|
12
|
-
object.to_ary
|
13
|
-
else
|
14
|
-
[object]
|
15
|
-
end
|
19
|
+
[object]
|
16
20
|
end
|
17
21
|
end
|
18
22
|
end
|
@@ -1,18 +1,6 @@
|
|
1
1
|
require 'benchmark'
|
2
2
|
|
3
3
|
class << Benchmark
|
4
|
-
# Earlier Ruby had a slower implementation.
|
5
|
-
if RUBY_VERSION < '1.8.7'
|
6
|
-
remove_method :realtime
|
7
|
-
|
8
|
-
def realtime
|
9
|
-
r0 = Time.now
|
10
|
-
yield
|
11
|
-
r1 = Time.now
|
12
|
-
r1.to_f - r0.to_f
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
4
|
def ms
|
17
5
|
1000 * realtime { yield }
|
18
6
|
end
|
@@ -1,4 +1,5 @@
|
|
1
|
+
require 'active_support/core_ext/class/attribute'
|
1
2
|
require 'active_support/core_ext/class/attribute_accessors'
|
2
3
|
require 'active_support/core_ext/class/inheritable_attributes'
|
3
|
-
require 'active_support/core_ext/class/removal'
|
4
4
|
require 'active_support/core_ext/class/delegating_attributes'
|
5
|
+
require 'active_support/core_ext/class/subclasses'
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'active_support/core_ext/kernel/singleton_class'
|
2
|
+
require 'active_support/core_ext/module/remove_method'
|
3
|
+
|
4
|
+
class Class
|
5
|
+
# Declare a class-level attribute whose value is inheritable and
|
6
|
+
# overwritable by subclasses:
|
7
|
+
#
|
8
|
+
# class Base
|
9
|
+
# class_attribute :setting
|
10
|
+
# end
|
11
|
+
#
|
12
|
+
# class Subclass < Base
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
# Base.setting = true
|
16
|
+
# Subclass.setting # => true
|
17
|
+
# Subclass.setting = false
|
18
|
+
# Subclass.setting # => false
|
19
|
+
# Base.setting # => true
|
20
|
+
#
|
21
|
+
# This matches normal Ruby method inheritance: think of writing an attribute
|
22
|
+
# on a subclass as overriding the reader method.
|
23
|
+
#
|
24
|
+
# For convenience, a query method is defined as well:
|
25
|
+
#
|
26
|
+
# Subclass.setting? # => false
|
27
|
+
#
|
28
|
+
# Instances may overwrite the class value in the same way:
|
29
|
+
#
|
30
|
+
# Base.setting = true
|
31
|
+
# object = Base.new
|
32
|
+
# object.setting # => true
|
33
|
+
# object.setting = false
|
34
|
+
# object.setting # => false
|
35
|
+
# Base.setting # => true
|
36
|
+
#
|
37
|
+
# To opt out of the instance writer method, pass :instance_writer => false.
|
38
|
+
#
|
39
|
+
# object.setting = false # => NoMethodError
|
40
|
+
def class_attribute(*attrs)
|
41
|
+
instance_writer = !attrs.last.is_a?(Hash) || attrs.pop[:instance_writer]
|
42
|
+
|
43
|
+
attrs.each do |name|
|
44
|
+
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
45
|
+
def self.#{name}() nil end
|
46
|
+
def self.#{name}?() !!#{name} end
|
47
|
+
|
48
|
+
def self.#{name}=(val)
|
49
|
+
singleton_class.class_eval do
|
50
|
+
remove_possible_method(:#{name})
|
51
|
+
define_method(:#{name}) { val }
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def #{name}
|
56
|
+
defined?(@#{name}) ? @#{name} : singleton_class.#{name}
|
57
|
+
end
|
58
|
+
|
59
|
+
def #{name}?
|
60
|
+
!!#{name}
|
61
|
+
end
|
62
|
+
RUBY
|
63
|
+
|
64
|
+
attr_writer name if instance_writer
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -10,42 +10,48 @@ require 'active_support/core_ext/array/extract_options'
|
|
10
10
|
# Person.hair_colors = [:brown, :black, :blonde, :red]
|
11
11
|
class Class
|
12
12
|
def cattr_reader(*syms)
|
13
|
-
syms.
|
14
|
-
|
13
|
+
options = syms.extract_options!
|
14
|
+
syms.each do |sym|
|
15
15
|
class_eval(<<-EOS, __FILE__, __LINE__ + 1)
|
16
|
-
unless defined? @@#{sym}
|
17
|
-
@@#{sym} = nil
|
18
|
-
end
|
19
|
-
|
20
|
-
def self.#{sym}
|
21
|
-
@@#{sym}
|
22
|
-
end
|
23
|
-
#
|
24
|
-
def #{sym} # def hair_colors
|
25
|
-
@@#{sym} # @@hair_colors
|
26
|
-
end # end
|
16
|
+
unless defined? @@#{sym}
|
17
|
+
@@#{sym} = nil
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.#{sym}
|
21
|
+
@@#{sym}
|
22
|
+
end
|
27
23
|
EOS
|
24
|
+
|
25
|
+
unless options[:instance_reader] == false
|
26
|
+
class_eval(<<-EOS, __FILE__, __LINE__ + 1)
|
27
|
+
def #{sym}
|
28
|
+
@@#{sym}
|
29
|
+
end
|
30
|
+
EOS
|
31
|
+
end
|
28
32
|
end
|
29
33
|
end
|
30
34
|
|
31
35
|
def cattr_writer(*syms)
|
32
36
|
options = syms.extract_options!
|
33
|
-
syms.
|
37
|
+
syms.each do |sym|
|
34
38
|
class_eval(<<-EOS, __FILE__, __LINE__ + 1)
|
35
|
-
unless defined? @@#{sym}
|
36
|
-
@@#{sym} = nil
|
37
|
-
end
|
38
|
-
|
39
|
-
def self.#{sym}=(obj)
|
40
|
-
@@#{sym} = obj
|
41
|
-
end
|
42
|
-
#
|
43
|
-
#{" #
|
44
|
-
def #{sym}=(obj) # def hair_colors=(obj)
|
45
|
-
@@#{sym} = obj # @@hair_colors = obj
|
46
|
-
end # end
|
47
|
-
" unless options[:instance_writer] == false } # # instance writer above is generated unless options[:instance_writer] == false
|
39
|
+
unless defined? @@#{sym}
|
40
|
+
@@#{sym} = nil
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.#{sym}=(obj)
|
44
|
+
@@#{sym} = obj
|
45
|
+
end
|
48
46
|
EOS
|
47
|
+
|
48
|
+
unless options[:instance_writer] == false
|
49
|
+
class_eval(<<-EOS, __FILE__, __LINE__ + 1)
|
50
|
+
def #{sym}=(obj)
|
51
|
+
@@#{sym} = obj
|
52
|
+
end
|
53
|
+
EOS
|
54
|
+
end
|
49
55
|
self.send("#{sym}=", yield) if block_given?
|
50
56
|
end
|
51
57
|
end
|
@@ -1,50 +1,44 @@
|
|
1
1
|
require 'active_support/core_ext/object/blank'
|
2
|
+
require 'active_support/core_ext/array/extract_options'
|
3
|
+
require 'active_support/core_ext/kernel/singleton_class'
|
4
|
+
require 'active_support/core_ext/module/remove_method'
|
2
5
|
|
3
6
|
class Class
|
4
|
-
def
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
!!#{name} # !!only_reader
|
21
|
-
end # end
|
22
|
-
def #{name}? # def only_reader?
|
23
|
-
!!#{name} # !!only_reader
|
24
|
-
end # end
|
25
|
-
EOS
|
26
|
-
end
|
7
|
+
def superclass_delegating_accessor(name, options = {})
|
8
|
+
# Create private _name and _name= methods that can still be used if the public
|
9
|
+
# methods are overridden. This allows
|
10
|
+
_superclass_delegating_accessor("_#{name}")
|
11
|
+
|
12
|
+
# Generate the public methods name, name=, and name?
|
13
|
+
# These methods dispatch to the private _name, and _name= methods, making them
|
14
|
+
# overridable
|
15
|
+
singleton_class.send(:define_method, name) { send("_#{name}") }
|
16
|
+
singleton_class.send(:define_method, "#{name}?") { !!send("_#{name}") }
|
17
|
+
singleton_class.send(:define_method, "#{name}=") { |value| send("_#{name}=", value) }
|
18
|
+
|
19
|
+
# If an instance_reader is needed, generate methods for name and name= on the
|
20
|
+
# class itself, so instances will be able to see them
|
21
|
+
define_method(name) { send("_#{name}") } if options[:instance_reader] != false
|
22
|
+
define_method("#{name}?") { !!send("#{name}") } if options[:instance_reader] != false
|
27
23
|
end
|
28
24
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
25
|
+
private
|
26
|
+
|
27
|
+
# Take the object being set and store it in a method. This gives us automatic
|
28
|
+
# inheritance behavior, without having to store the object in an instance
|
29
|
+
# variable and look up the superclass chain manually.
|
30
|
+
def _stash_object_in_method(object, method, instance_reader = true)
|
31
|
+
singleton_class.remove_possible_method(method)
|
32
|
+
singleton_class.send(:define_method, method) { object }
|
33
|
+
remove_possible_method(method)
|
34
|
+
define_method(method) { object } if instance_reader
|
38
35
|
end
|
39
36
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
# set after class definition don't get applied to subclasses.
|
46
|
-
def superclass_delegating_accessor(*names, &block)
|
47
|
-
superclass_delegating_reader(*names)
|
48
|
-
superclass_delegating_writer(*names, &block)
|
37
|
+
def _superclass_delegating_accessor(name, options = {})
|
38
|
+
singleton_class.send(:define_method, "#{name}=") do |value|
|
39
|
+
_stash_object_in_method(value, name, options[:instance_reader] != false)
|
40
|
+
end
|
41
|
+
send("#{name}=", nil)
|
49
42
|
end
|
43
|
+
|
50
44
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'active_support/core_ext/object/duplicable'
|
2
|
+
require 'active_support/core_ext/array/extract_options'
|
2
3
|
|
3
4
|
# Retain for backward compatibility. Methods are now included in Class.
|
4
5
|
module ClassInheritableAttributes # :nodoc:
|
@@ -8,18 +9,24 @@ end
|
|
8
9
|
# their parents' attributes, instead of just a pointer to the same. This means that the child can add elements
|
9
10
|
# to, for example, an array without those additions being shared with either their parent, siblings, or
|
10
11
|
# children, which is unlike the regular class-level attributes that are shared across the entire hierarchy.
|
12
|
+
#
|
13
|
+
# The copies of inheritable parent attributes are added to subclasses when they are created, via the
|
14
|
+
# +inherited+ hook.
|
11
15
|
class Class # :nodoc:
|
12
16
|
def class_inheritable_reader(*syms)
|
17
|
+
options = syms.extract_options!
|
13
18
|
syms.each do |sym|
|
14
19
|
next if sym.is_a?(Hash)
|
15
20
|
class_eval(<<-EOS, __FILE__, __LINE__ + 1)
|
16
|
-
def self.#{sym}
|
17
|
-
read_inheritable_attribute(:#{sym})
|
18
|
-
end
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
21
|
+
def self.#{sym} # def self.after_add
|
22
|
+
read_inheritable_attribute(:#{sym}) # read_inheritable_attribute(:after_add)
|
23
|
+
end # end
|
24
|
+
#
|
25
|
+
#{" #
|
26
|
+
def #{sym} # def after_add
|
27
|
+
self.class.#{sym} # self.class.after_add
|
28
|
+
end # end
|
29
|
+
" unless options[:instance_reader] == false } # # the reader above is generated unless options[:instance_reader] == false
|
23
30
|
EOS
|
24
31
|
end
|
25
32
|
end
|
@@ -121,7 +128,7 @@ class Class # :nodoc:
|
|
121
128
|
|
122
129
|
private
|
123
130
|
# Prevent this constant from being created multiple times
|
124
|
-
EMPTY_INHERITABLE_ATTRIBUTES = {}.freeze
|
131
|
+
EMPTY_INHERITABLE_ATTRIBUTES = {}.freeze
|
125
132
|
|
126
133
|
def inherited_with_inheritable_attributes(child)
|
127
134
|
inherited_without_inheritable_attributes(child) if respond_to?(:inherited_without_inheritable_attributes)
|
@@ -155,8 +162,8 @@ class Class
|
|
155
162
|
# (error out or do the same as other methods above) instead of silently
|
156
163
|
# moving on). In particular, this makes the return value of this function
|
157
164
|
# less useful.
|
158
|
-
def extlib_inheritable_reader(*ivars)
|
159
|
-
|
165
|
+
def extlib_inheritable_reader(*ivars, &block)
|
166
|
+
options = ivars.extract_options!
|
160
167
|
|
161
168
|
ivars.each do |ivar|
|
162
169
|
self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
@@ -164,16 +171,17 @@ class Class
|
|
164
171
|
return @#{ivar} if self.object_id == #{self.object_id} || defined?(@#{ivar})
|
165
172
|
ivar = superclass.#{ivar}
|
166
173
|
return nil if ivar.nil? && !#{self}.instance_variable_defined?("@#{ivar}")
|
167
|
-
@#{ivar} = ivar
|
174
|
+
@#{ivar} = ivar.duplicable? ? ivar.dup : ivar
|
168
175
|
end
|
169
176
|
RUBY
|
170
|
-
unless instance_reader == false
|
177
|
+
unless options[:instance_reader] == false
|
171
178
|
self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
172
179
|
def #{ivar}
|
173
180
|
self.class.#{ivar}
|
174
181
|
end
|
175
182
|
RUBY
|
176
183
|
end
|
184
|
+
instance_variable_set(:"@#{ivar}", yield) if block_given?
|
177
185
|
end
|
178
186
|
end
|
179
187
|
|
@@ -190,14 +198,15 @@ class Class
|
|
190
198
|
# @todo We need a style for class_eval <<-HEREDOC. I'd like to make it
|
191
199
|
# class_eval(<<-RUBY, __FILE__, __LINE__), but we should codify it somewhere.
|
192
200
|
def extlib_inheritable_writer(*ivars)
|
193
|
-
|
201
|
+
options = ivars.extract_options!
|
202
|
+
|
194
203
|
ivars.each do |ivar|
|
195
204
|
self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
196
205
|
def self.#{ivar}=(obj)
|
197
206
|
@#{ivar} = obj
|
198
207
|
end
|
199
208
|
RUBY
|
200
|
-
unless instance_writer == false
|
209
|
+
unless options[:instance_writer] == false
|
201
210
|
self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
202
211
|
def #{ivar}=(obj) self.class.#{ivar} = obj end
|
203
212
|
RUBY
|