activesupport 2.3.5 → 3.0.0.beta3
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.
- data/CHANGELOG +66 -9
- data/lib/active_support/all.rb +2 -7
- data/lib/active_support/backtrace_cleaner.rb +31 -9
- data/lib/active_support/base64.rb +9 -0
- data/lib/active_support/basic_object.rb +7 -10
- data/lib/active_support/benchmarkable.rb +60 -0
- data/lib/active_support/buffered_logger.rb +14 -9
- data/lib/active_support/cache/compressed_mem_cache_store.rb +2 -0
- data/lib/active_support/cache/file_store.rb +35 -17
- data/lib/active_support/cache/mem_cache_store.rb +32 -23
- data/lib/active_support/cache/memory_store.rb +17 -10
- data/lib/active_support/cache/strategy/local_cache.rb +9 -1
- data/lib/active_support/cache.rb +75 -55
- data/lib/active_support/callbacks.rb +490 -169
- data/lib/active_support/concern.rb +29 -0
- data/lib/active_support/configurable.rb +35 -0
- data/lib/active_support/core_ext/array/access.rb +39 -46
- data/lib/active_support/core_ext/array/conversions.rb +145 -182
- data/lib/active_support/core_ext/array/extract_options.rb +26 -17
- data/lib/active_support/core_ext/array/grouping.rb +87 -93
- data/lib/active_support/core_ext/array/random_access.rb +4 -10
- data/lib/active_support/core_ext/array/uniq_by.rb +17 -0
- data/lib/active_support/core_ext/array/wrap.rb +22 -0
- data/lib/active_support/core_ext/array.rb +2 -10
- data/lib/active_support/core_ext/big_decimal/conversions.rb +27 -0
- data/lib/active_support/core_ext/big_decimal.rb +1 -0
- data/lib/active_support/core_ext/cgi/escape_skipping_slashes.rb +16 -20
- data/lib/active_support/core_ext/cgi.rb +0 -4
- data/lib/active_support/core_ext/class/attribute.rb +70 -0
- data/lib/active_support/core_ext/class/attribute_accessors.rb +40 -31
- data/lib/active_support/core_ext/class/delegating_attributes.rb +37 -40
- data/lib/active_support/core_ext/class/inheritable_attributes.rb +100 -11
- data/lib/active_support/core_ext/class/subclasses.rb +55 -0
- data/lib/active_support/core_ext/class.rb +1 -1
- data/lib/active_support/core_ext/date/acts_like.rb +8 -0
- data/lib/active_support/core_ext/date/calculations.rb +218 -228
- data/lib/active_support/core_ext/date/conversions.rb +87 -96
- data/lib/active_support/core_ext/date/freeze.rb +31 -0
- data/lib/active_support/core_ext/date_time/acts_like.rb +13 -0
- data/lib/active_support/core_ext/date_time/calculations.rb +97 -110
- data/lib/active_support/core_ext/date_time/conversions.rb +85 -85
- data/lib/active_support/core_ext/date_time/zones.rb +17 -0
- data/lib/active_support/core_ext/enumerable.rb +18 -13
- data/lib/active_support/core_ext/exception.rb +1 -43
- data/lib/active_support/core_ext/file/atomic.rb +35 -40
- data/lib/active_support/core_ext/file/path.rb +5 -0
- data/lib/active_support/core_ext/file.rb +0 -4
- data/lib/active_support/core_ext/float/rounding.rb +15 -20
- data/lib/active_support/core_ext/float.rb +0 -6
- data/lib/active_support/core_ext/hash/conversions.rb +255 -229
- data/lib/active_support/core_ext/hash/deep_merge.rb +12 -19
- data/lib/active_support/core_ext/hash/diff.rb +11 -17
- data/lib/active_support/core_ext/hash/except.rb +21 -22
- data/lib/active_support/core_ext/hash/indifferent_access.rb +8 -137
- data/lib/active_support/core_ext/hash/keys.rb +38 -45
- data/lib/active_support/core_ext/hash/reverse_merge.rb +25 -32
- data/lib/active_support/core_ext/hash/slice.rb +35 -37
- data/lib/active_support/core_ext/hash.rb +8 -14
- data/lib/active_support/core_ext/integer/inflections.rb +10 -16
- data/lib/active_support/core_ext/integer/multiple.rb +6 -0
- data/lib/active_support/core_ext/integer/time.rb +36 -42
- data/lib/active_support/core_ext/integer.rb +1 -7
- data/lib/active_support/core_ext/kernel/debugger.rb +1 -1
- data/lib/active_support/core_ext/kernel/reporting.rb +9 -7
- data/lib/active_support/core_ext/kernel/requires.rb +3 -1
- data/lib/active_support/core_ext/kernel/singleton_class.rb +13 -0
- data/lib/active_support/core_ext/kernel.rb +1 -1
- data/lib/active_support/core_ext/load_error.rb +16 -32
- data/lib/active_support/core_ext/logger.rb +3 -2
- data/lib/active_support/core_ext/module/aliasing.rb +64 -68
- 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 +4 -4
- data/lib/active_support/core_ext/module/attribute_accessors.rb +48 -42
- data/lib/active_support/core_ext/module/delegation.rb +22 -11
- data/lib/active_support/core_ext/module/deprecation.rb +9 -0
- data/lib/active_support/core_ext/module/introspection.rb +77 -79
- 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 +6 -0
- data/lib/active_support/core_ext/module/synchronization.rb +4 -1
- data/lib/active_support/core_ext/module.rb +7 -18
- data/lib/active_support/core_ext/name_error.rb +3 -4
- data/lib/active_support/core_ext/numeric/bytes.rb +35 -41
- data/lib/active_support/core_ext/numeric/time.rb +70 -74
- data/lib/active_support/core_ext/numeric.rb +1 -8
- data/lib/active_support/core_ext/object/acts_like.rb +10 -0
- data/lib/active_support/core_ext/object/blank.rb +20 -2
- data/lib/active_support/core_ext/object/conversions.rb +4 -15
- data/lib/active_support/core_ext/object/duplicable.rb +65 -0
- data/lib/active_support/core_ext/object/extending.rb +8 -77
- data/lib/active_support/core_ext/object/instance_variables.rb +0 -7
- data/lib/active_support/core_ext/object/misc.rb +2 -90
- data/lib/active_support/core_ext/object/returning.rb +42 -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/{try.rb → object/try.rb} +4 -4
- data/lib/active_support/core_ext/object/with_options.rb +24 -0
- data/lib/active_support/core_ext/object.rb +10 -2
- data/lib/active_support/core_ext/proc.rb +3 -1
- data/lib/active_support/core_ext/process/daemon.rb +17 -19
- data/lib/active_support/core_ext/range/blockless_step.rb +24 -27
- data/lib/active_support/core_ext/range/conversions.rb +17 -23
- data/lib/active_support/core_ext/range/include_range.rb +18 -27
- data/lib/active_support/core_ext/range/overlaps.rb +6 -13
- data/lib/active_support/core_ext/range.rb +2 -9
- data/lib/active_support/core_ext/regexp.rb +5 -0
- data/lib/active_support/core_ext/rexml.rb +12 -7
- data/lib/active_support/core_ext/string/access.rb +88 -95
- data/lib/active_support/core_ext/string/behavior.rb +6 -12
- data/lib/active_support/core_ext/string/conversions.rb +20 -21
- data/lib/active_support/core_ext/string/exclude.rb +6 -0
- data/lib/active_support/core_ext/string/filters.rb +17 -23
- data/lib/active_support/core_ext/string/inflections.rb +147 -154
- data/lib/active_support/core_ext/string/interpolation.rb +1 -0
- data/lib/active_support/core_ext/string/multibyte.rb +68 -74
- data/lib/active_support/core_ext/string/output_safety.rb +105 -44
- data/lib/active_support/core_ext/string/starts_ends_with.rb +3 -34
- data/lib/active_support/core_ext/string/xchar.rb +10 -3
- data/lib/active_support/core_ext/string.rb +6 -20
- data/lib/active_support/core_ext/time/acts_like.rb +8 -0
- data/lib/active_support/core_ext/time/calculations.rb +276 -299
- data/lib/active_support/core_ext/time/conversions.rb +79 -84
- data/lib/active_support/core_ext/time/marshal.rb +56 -0
- data/lib/active_support/core_ext/time/publicize_conversion_methods.rb +10 -0
- data/lib/active_support/core_ext/time/zones.rb +73 -81
- data/lib/active_support/core_ext/uri.rb +2 -1
- data/lib/active_support/core_ext.rb +2 -7
- data/lib/active_support/dependencies/autoload.rb +50 -0
- data/lib/active_support/dependencies.rb +168 -197
- data/lib/active_support/deprecation/behaviors.rb +38 -0
- data/lib/active_support/deprecation/method_wrappers.rb +29 -0
- data/lib/active_support/deprecation/proxy_wrappers.rb +74 -0
- data/lib/active_support/deprecation/reporting.rb +56 -0
- data/lib/active_support/deprecation.rb +9 -187
- data/lib/active_support/duration.rb +6 -2
- data/lib/active_support/hash_with_indifferent_access.rb +141 -0
- data/lib/active_support/i18n.rb +3 -0
- data/lib/active_support/inflections.rb +1 -1
- data/lib/active_support/inflector/inflections.rb +211 -0
- data/lib/active_support/inflector/methods.rb +141 -0
- data/lib/active_support/inflector/transliterate.rb +77 -0
- data/lib/active_support/inflector.rb +4 -403
- data/lib/active_support/json/backends/jsongem.rb +16 -10
- data/lib/active_support/json/backends/yajl.rb +40 -0
- data/lib/active_support/json/backends/yaml.rb +14 -8
- data/lib/active_support/json/decoding.rb +17 -1
- data/lib/active_support/json/encoding.rb +164 -35
- data/lib/active_support/json/variable.rb +4 -3
- data/lib/active_support/lazy_load_hooks.rb +17 -0
- data/lib/active_support/memoizable.rb +8 -5
- data/lib/active_support/message_encryptor.rb +1 -0
- data/lib/active_support/message_verifier.rb +12 -29
- data/lib/active_support/multibyte/chars.rb +88 -31
- data/lib/active_support/multibyte/unicode_database.rb +5 -5
- data/lib/active_support/multibyte/utils.rb +6 -7
- data/lib/active_support/multibyte.rb +11 -6
- data/lib/active_support/notifications/fanout.rb +83 -0
- data/lib/active_support/notifications/instrumenter.rb +50 -0
- data/lib/active_support/notifications.rb +81 -0
- data/lib/active_support/option_merger.rb +2 -0
- data/lib/active_support/ordered_hash.rb +28 -11
- data/lib/active_support/ordered_options.rb +9 -1
- data/lib/active_support/railtie.rb +64 -0
- data/lib/active_support/rescuable.rb +11 -6
- data/lib/active_support/ruby/shim.rb +21 -0
- data/lib/active_support/test_case.rb +10 -8
- data/lib/active_support/testing/assertions.rb +17 -0
- data/lib/active_support/testing/declarative.rb +31 -12
- data/lib/active_support/testing/deprecation.rb +8 -10
- data/lib/active_support/testing/isolation.rb +153 -0
- data/lib/active_support/testing/pending.rb +48 -0
- data/lib/active_support/testing/performance.rb +342 -339
- data/lib/active_support/testing/setup_and_teardown.rb +48 -31
- data/lib/active_support/time/autoload.rb +5 -0
- data/lib/active_support/time.rb +34 -0
- data/lib/active_support/time_with_zone.rb +18 -12
- data/lib/active_support/values/time_zone.rb +51 -68
- data/lib/active_support/version.rb +5 -4
- data/lib/active_support/whiny_nil.rb +5 -9
- data/lib/active_support/xml_mini/jdom.rb +13 -7
- data/lib/active_support/xml_mini/libxml.rb +38 -91
- data/lib/active_support/xml_mini/libxmlsax.rb +85 -0
- data/lib/active_support/xml_mini/nokogiri.rb +40 -31
- data/lib/active_support/xml_mini/nokogirisax.rb +83 -0
- data/lib/active_support/xml_mini/rexml.rb +30 -9
- data/lib/active_support/xml_mini.rb +2 -0
- data/lib/active_support.rb +46 -30
- metadata +136 -215
- data/lib/active_support/cache/drb_store.rb +0 -14
- data/lib/active_support/core_ext/array/wrapper.rb +0 -24
- data/lib/active_support/core_ext/base64/encoding.rb +0 -16
- data/lib/active_support/core_ext/base64.rb +0 -4
- data/lib/active_support/core_ext/bigdecimal/conversions.rb +0 -37
- data/lib/active_support/core_ext/bigdecimal.rb +0 -6
- data/lib/active_support/core_ext/blank.rb +0 -2
- data/lib/active_support/core_ext/class/removal.rb +0 -50
- data/lib/active_support/core_ext/date/behavior.rb +0 -42
- data/lib/active_support/core_ext/date.rb +0 -10
- data/lib/active_support/core_ext/date_time.rb +0 -12
- data/lib/active_support/core_ext/duplicable.rb +0 -43
- data/lib/active_support/core_ext/float/time.rb +0 -27
- data/lib/active_support/core_ext/integer/even_odd.rb +0 -29
- 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/module/model_naming.rb +0 -25
- data/lib/active_support/core_ext/numeric/conversions.rb +0 -19
- data/lib/active_support/core_ext/object/metaclass.rb +0 -13
- data/lib/active_support/core_ext/pathname/clean_within.rb +0 -14
- data/lib/active_support/core_ext/pathname.rb +0 -7
- data/lib/active_support/core_ext/string/bytesize.rb +0 -5
- data/lib/active_support/core_ext/string/iterators.rb +0 -23
- data/lib/active_support/core_ext/symbol.rb +0 -14
- data/lib/active_support/core_ext/time/behavior.rb +0 -13
- data/lib/active_support/core_ext/time.rb +0 -42
- data/lib/active_support/json/encoders/date.rb +0 -22
- data/lib/active_support/json/encoders/date_time.rb +0 -22
- data/lib/active_support/json/encoders/enumerable.rb +0 -17
- data/lib/active_support/json/encoders/false_class.rb +0 -7
- data/lib/active_support/json/encoders/hash.rb +0 -56
- data/lib/active_support/json/encoders/nil_class.rb +0 -7
- data/lib/active_support/json/encoders/numeric.rb +0 -21
- data/lib/active_support/json/encoders/object.rb +0 -10
- data/lib/active_support/json/encoders/regexp.rb +0 -9
- data/lib/active_support/json/encoders/string.rb +0 -9
- data/lib/active_support/json/encoders/symbol.rb +0 -5
- data/lib/active_support/json/encoders/time.rb +0 -22
- data/lib/active_support/json/encoders/true_class.rb +0 -7
- data/lib/active_support/vendor/builder-2.1.2/blankslate.rb +0 -113
- data/lib/active_support/vendor/builder-2.1.2/builder/blankslate.rb +0 -20
- data/lib/active_support/vendor/builder-2.1.2/builder/css.rb +0 -250
- data/lib/active_support/vendor/builder-2.1.2/builder/xchar.rb +0 -115
- data/lib/active_support/vendor/builder-2.1.2/builder/xmlbase.rb +0 -139
- data/lib/active_support/vendor/builder-2.1.2/builder/xmlevents.rb +0 -63
- data/lib/active_support/vendor/builder-2.1.2/builder/xmlmarkup.rb +0 -328
- data/lib/active_support/vendor/builder-2.1.2/builder.rb +0 -13
- 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/backend/simple.rb +0 -214
- data/lib/active_support/vendor/i18n-0.1.3/lib/i18n/exceptions.rb +0 -53
- data/lib/active_support/vendor/i18n-0.1.3/lib/i18n.rb +0 -199
- 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.4/memcache.rb +0 -1107
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/data_timezone.rb +0 -47
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/data_timezone_info.rb +0 -228
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Algiers.rb +0 -55
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Cairo.rb +0 -219
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Casablanca.rb +0 -40
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Harare.rb +0 -18
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Johannesburg.rb +0 -25
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Monrovia.rb +0 -22
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Africa/Nairobi.rb +0 -23
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Argentina/Buenos_Aires.rb +0 -166
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Argentina/San_Juan.rb +0 -86
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Bogota.rb +0 -23
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Caracas.rb +0 -23
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Chicago.rb +0 -283
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Chihuahua.rb +0 -136
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Denver.rb +0 -204
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Godthab.rb +0 -161
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Guatemala.rb +0 -27
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Halifax.rb +0 -274
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Indiana/Indianapolis.rb +0 -149
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Juneau.rb +0 -194
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/La_Paz.rb +0 -22
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Lima.rb +0 -35
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Los_Angeles.rb +0 -232
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Mazatlan.rb +0 -139
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Mexico_City.rb +0 -144
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Monterrey.rb +0 -131
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/New_York.rb +0 -282
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Phoenix.rb +0 -30
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Regina.rb +0 -74
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Santiago.rb +0 -205
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Sao_Paulo.rb +0 -171
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/St_Johns.rb +0 -288
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/America/Tijuana.rb +0 -196
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Almaty.rb +0 -67
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Baghdad.rb +0 -73
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Baku.rb +0 -161
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Bangkok.rb +0 -20
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Chongqing.rb +0 -33
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Colombo.rb +0 -30
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Dhaka.rb +0 -27
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Hong_Kong.rb +0 -87
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Irkutsk.rb +0 -165
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Jakarta.rb +0 -30
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Jerusalem.rb +0 -163
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kabul.rb +0 -20
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kamchatka.rb +0 -163
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Karachi.rb +0 -30
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Katmandu.rb +0 -20
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kolkata.rb +0 -25
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Krasnoyarsk.rb +0 -163
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kuala_Lumpur.rb +0 -31
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Kuwait.rb +0 -18
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Magadan.rb +0 -163
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Muscat.rb +0 -18
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Novosibirsk.rb +0 -164
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Rangoon.rb +0 -24
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Riyadh.rb +0 -18
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Seoul.rb +0 -34
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Shanghai.rb +0 -35
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Singapore.rb +0 -33
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Taipei.rb +0 -59
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Tashkent.rb +0 -47
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Tbilisi.rb +0 -78
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Tehran.rb +0 -121
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Tokyo.rb +0 -30
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Ulaanbaatar.rb +0 -65
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Urumqi.rb +0 -33
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Vladivostok.rb +0 -164
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Yakutsk.rb +0 -163
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Yekaterinburg.rb +0 -165
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Asia/Yerevan.rb +0 -165
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Atlantic/Azores.rb +0 -270
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Atlantic/Cape_Verde.rb +0 -23
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Atlantic/South_Georgia.rb +0 -18
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Adelaide.rb +0 -187
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Brisbane.rb +0 -35
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Darwin.rb +0 -29
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Hobart.rb +0 -193
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Melbourne.rb +0 -185
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Perth.rb +0 -37
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Australia/Sydney.rb +0 -185
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Etc/UTC.rb +0 -16
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Amsterdam.rb +0 -228
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Athens.rb +0 -185
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Belgrade.rb +0 -163
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Berlin.rb +0 -188
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Bratislava.rb +0 -13
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Brussels.rb +0 -232
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Bucharest.rb +0 -181
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Budapest.rb +0 -197
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Copenhagen.rb +0 -179
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Dublin.rb +0 -276
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Helsinki.rb +0 -163
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Istanbul.rb +0 -218
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Kiev.rb +0 -168
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Lisbon.rb +0 -268
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Ljubljana.rb +0 -13
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/London.rb +0 -288
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Madrid.rb +0 -211
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Minsk.rb +0 -170
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Moscow.rb +0 -181
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Paris.rb +0 -232
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Prague.rb +0 -187
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Riga.rb +0 -176
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Rome.rb +0 -215
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Sarajevo.rb +0 -13
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Skopje.rb +0 -13
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Sofia.rb +0 -173
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Stockholm.rb +0 -165
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Tallinn.rb +0 -172
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Vienna.rb +0 -183
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Vilnius.rb +0 -170
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Warsaw.rb +0 -212
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Europe/Zagreb.rb +0 -13
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Auckland.rb +0 -202
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Fiji.rb +0 -23
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Guam.rb +0 -22
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Honolulu.rb +0 -28
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Majuro.rb +0 -20
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Midway.rb +0 -25
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Noumea.rb +0 -25
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Pago_Pago.rb +0 -26
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Port_Moresby.rb +0 -20
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/definitions/Pacific/Tongatapu.rb +0 -27
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/info_timezone.rb +0 -52
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/linked_timezone.rb +0 -51
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/linked_timezone_info.rb +0 -44
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/offset_rationals.rb +0 -98
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/ruby_core_support.rb +0 -56
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/time_or_datetime.rb +0 -292
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone.rb +0 -508
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_definition.rb +0 -56
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_info.rb +0 -40
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_offset_info.rb +0 -94
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_period.rb +0 -198
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo/timezone_transition_info.rb +0 -129
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo.rb +0 -33
- data/lib/active_support/vendor.rb +0 -28
- data/lib/activesupport.rb +0 -2
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
require 'active_support/core_ext/object/duplicable'
|
|
2
|
+
require 'active_support/core_ext/array/extract_options'
|
|
3
|
+
|
|
1
4
|
# Retain for backward compatibility. Methods are now included in Class.
|
|
2
5
|
module ClassInheritableAttributes # :nodoc:
|
|
3
6
|
end
|
|
@@ -8,16 +11,19 @@ end
|
|
|
8
11
|
# children, which is unlike the regular class-level attributes that are shared across the entire hierarchy.
|
|
9
12
|
class Class # :nodoc:
|
|
10
13
|
def class_inheritable_reader(*syms)
|
|
14
|
+
options = syms.extract_options!
|
|
11
15
|
syms.each do |sym|
|
|
12
16
|
next if sym.is_a?(Hash)
|
|
13
|
-
class_eval
|
|
14
|
-
def self.#{sym}
|
|
15
|
-
read_inheritable_attribute(:#{sym})
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
class_eval(<<-EOS, __FILE__, __LINE__ + 1)
|
|
18
|
+
def self.#{sym} # def self.after_add
|
|
19
|
+
read_inheritable_attribute(:#{sym}) # read_inheritable_attribute(:after_add)
|
|
20
|
+
end # end
|
|
21
|
+
#
|
|
22
|
+
#{" #
|
|
23
|
+
def #{sym} # def after_add
|
|
24
|
+
self.class.#{sym} # self.class.after_add
|
|
25
|
+
end # end
|
|
26
|
+
" unless options[:instance_reader] == false } # # the reader above is generated unless options[:instance_reader] == false
|
|
21
27
|
EOS
|
|
22
28
|
end
|
|
23
29
|
end
|
|
@@ -25,7 +31,7 @@ class Class # :nodoc:
|
|
|
25
31
|
def class_inheritable_writer(*syms)
|
|
26
32
|
options = syms.extract_options!
|
|
27
33
|
syms.each do |sym|
|
|
28
|
-
class_eval
|
|
34
|
+
class_eval(<<-EOS, __FILE__, __LINE__ + 1)
|
|
29
35
|
def self.#{sym}=(obj) # def self.color=(obj)
|
|
30
36
|
write_inheritable_attribute(:#{sym}, obj) # write_inheritable_attribute(:color, obj)
|
|
31
37
|
end # end
|
|
@@ -42,7 +48,7 @@ class Class # :nodoc:
|
|
|
42
48
|
def class_inheritable_array_writer(*syms)
|
|
43
49
|
options = syms.extract_options!
|
|
44
50
|
syms.each do |sym|
|
|
45
|
-
class_eval
|
|
51
|
+
class_eval(<<-EOS, __FILE__, __LINE__ + 1)
|
|
46
52
|
def self.#{sym}=(obj) # def self.levels=(obj)
|
|
47
53
|
write_inheritable_array(:#{sym}, obj) # write_inheritable_array(:levels, obj)
|
|
48
54
|
end # end
|
|
@@ -59,7 +65,7 @@ class Class # :nodoc:
|
|
|
59
65
|
def class_inheritable_hash_writer(*syms)
|
|
60
66
|
options = syms.extract_options!
|
|
61
67
|
syms.each do |sym|
|
|
62
|
-
class_eval
|
|
68
|
+
class_eval(<<-EOS, __FILE__, __LINE__ + 1)
|
|
63
69
|
def self.#{sym}=(obj) # def self.nicknames=(obj)
|
|
64
70
|
write_inheritable_hash(:#{sym}, obj) # write_inheritable_hash(:nicknames, obj)
|
|
65
71
|
end # end
|
|
@@ -138,3 +144,86 @@ class Class # :nodoc:
|
|
|
138
144
|
alias inherited_without_inheritable_attributes inherited
|
|
139
145
|
alias inherited inherited_with_inheritable_attributes
|
|
140
146
|
end
|
|
147
|
+
|
|
148
|
+
class Class
|
|
149
|
+
# Defines class-level inheritable attribute reader. Attributes are available to subclasses,
|
|
150
|
+
# each subclass has a copy of parent's attribute.
|
|
151
|
+
#
|
|
152
|
+
# @param *syms<Array[#to_s]> Array of attributes to define inheritable reader for.
|
|
153
|
+
# @return <Array[#to_s]> Array of attributes converted into inheritable_readers.
|
|
154
|
+
#
|
|
155
|
+
# @api public
|
|
156
|
+
#
|
|
157
|
+
# @todo Do we want to block instance_reader via :instance_reader => false
|
|
158
|
+
# @todo It would be preferable that we do something with a Hash passed in
|
|
159
|
+
# (error out or do the same as other methods above) instead of silently
|
|
160
|
+
# moving on). In particular, this makes the return value of this function
|
|
161
|
+
# less useful.
|
|
162
|
+
def extlib_inheritable_reader(*ivars, &block)
|
|
163
|
+
options = ivars.extract_options!
|
|
164
|
+
|
|
165
|
+
ivars.each do |ivar|
|
|
166
|
+
self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
|
167
|
+
def self.#{ivar}
|
|
168
|
+
return @#{ivar} if self.object_id == #{self.object_id} || defined?(@#{ivar})
|
|
169
|
+
ivar = superclass.#{ivar}
|
|
170
|
+
return nil if ivar.nil? && !#{self}.instance_variable_defined?("@#{ivar}")
|
|
171
|
+
@#{ivar} = ivar.duplicable? ? ivar.dup : ivar
|
|
172
|
+
end
|
|
173
|
+
RUBY
|
|
174
|
+
unless options[:instance_reader] == false
|
|
175
|
+
self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
|
176
|
+
def #{ivar}
|
|
177
|
+
self.class.#{ivar}
|
|
178
|
+
end
|
|
179
|
+
RUBY
|
|
180
|
+
end
|
|
181
|
+
instance_variable_set(:"@#{ivar}", yield) if block_given?
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
# Defines class-level inheritable attribute writer. Attributes are available to subclasses,
|
|
186
|
+
# each subclass has a copy of parent's attribute.
|
|
187
|
+
#
|
|
188
|
+
# @param *syms<Array[*#to_s, Hash{:instance_writer => Boolean}]> Array of attributes to
|
|
189
|
+
# define inheritable writer for.
|
|
190
|
+
# @option syms :instance_writer<Boolean> if true, instance-level inheritable attribute writer is defined.
|
|
191
|
+
# @return <Array[#to_s]> An Array of the attributes that were made into inheritable writers.
|
|
192
|
+
#
|
|
193
|
+
# @api public
|
|
194
|
+
#
|
|
195
|
+
# @todo We need a style for class_eval <<-HEREDOC. I'd like to make it
|
|
196
|
+
# class_eval(<<-RUBY, __FILE__, __LINE__), but we should codify it somewhere.
|
|
197
|
+
def extlib_inheritable_writer(*ivars)
|
|
198
|
+
options = ivars.extract_options!
|
|
199
|
+
|
|
200
|
+
ivars.each do |ivar|
|
|
201
|
+
self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
|
202
|
+
def self.#{ivar}=(obj)
|
|
203
|
+
@#{ivar} = obj
|
|
204
|
+
end
|
|
205
|
+
RUBY
|
|
206
|
+
unless options[:instance_writer] == false
|
|
207
|
+
self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
|
208
|
+
def #{ivar}=(obj) self.class.#{ivar} = obj end
|
|
209
|
+
RUBY
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
self.send("#{ivar}=", yield) if block_given?
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
# Defines class-level inheritable attribute accessor. Attributes are available to subclasses,
|
|
217
|
+
# each subclass has a copy of parent's attribute.
|
|
218
|
+
#
|
|
219
|
+
# @param *syms<Array[*#to_s, Hash{:instance_writer => Boolean}]> Array of attributes to
|
|
220
|
+
# define inheritable accessor for.
|
|
221
|
+
# @option syms :instance_writer<Boolean> if true, instance-level inheritable attribute writer is defined.
|
|
222
|
+
# @return <Array[#to_s]> An Array of attributes turned into inheritable accessors.
|
|
223
|
+
#
|
|
224
|
+
# @api public
|
|
225
|
+
def extlib_inheritable_accessor(*syms, &block)
|
|
226
|
+
extlib_inheritable_reader(*syms)
|
|
227
|
+
extlib_inheritable_writer(*syms, &block)
|
|
228
|
+
end
|
|
229
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
require 'active_support/core_ext/module/anonymous'
|
|
2
|
+
require 'active_support/core_ext/module/reachable'
|
|
3
|
+
|
|
4
|
+
class Class #:nodoc:
|
|
5
|
+
# Returns an array with the names of the subclasses of +self+ as strings.
|
|
6
|
+
#
|
|
7
|
+
# Integer.subclasses # => ["Bignum", "Fixnum"]
|
|
8
|
+
def subclasses
|
|
9
|
+
Class.subclasses_of(self).map { |o| o.to_s }
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# Rubinius
|
|
13
|
+
if defined?(Class.__subclasses__)
|
|
14
|
+
def descendents
|
|
15
|
+
subclasses = []
|
|
16
|
+
__subclasses__.each {|k| subclasses << k; subclasses.concat k.descendents }
|
|
17
|
+
subclasses
|
|
18
|
+
end
|
|
19
|
+
else
|
|
20
|
+
# MRI
|
|
21
|
+
begin
|
|
22
|
+
ObjectSpace.each_object(Class.new) {}
|
|
23
|
+
|
|
24
|
+
def descendents
|
|
25
|
+
subclasses = []
|
|
26
|
+
ObjectSpace.each_object(class << self; self; end) do |k|
|
|
27
|
+
subclasses << k unless k == self
|
|
28
|
+
end
|
|
29
|
+
subclasses
|
|
30
|
+
end
|
|
31
|
+
# JRuby
|
|
32
|
+
rescue StandardError
|
|
33
|
+
def descendents
|
|
34
|
+
subclasses = []
|
|
35
|
+
ObjectSpace.each_object(Class) do |k|
|
|
36
|
+
subclasses << k if k < self
|
|
37
|
+
end
|
|
38
|
+
subclasses.uniq!
|
|
39
|
+
subclasses
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Exclude this class unless it's a subclass of our supers and is defined.
|
|
45
|
+
# We check defined? in case we find a removed class that has yet to be
|
|
46
|
+
# garbage collected. This also fails for anonymous classes -- please
|
|
47
|
+
# submit a patch if you have a workaround.
|
|
48
|
+
def self.subclasses_of(*superclasses) #:nodoc:
|
|
49
|
+
subclasses = []
|
|
50
|
+
superclasses.each do |klass|
|
|
51
|
+
subclasses.concat klass.descendents.select {|k| k.anonymous? || k.reachable?}
|
|
52
|
+
end
|
|
53
|
+
subclasses
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
require 'active_support/core_ext/class/attribute_accessors'
|
|
2
2
|
require 'active_support/core_ext/class/inheritable_attributes'
|
|
3
|
-
require 'active_support/core_ext/class/removal'
|
|
4
3
|
require 'active_support/core_ext/class/delegating_attributes'
|
|
4
|
+
require 'active_support/core_ext/class/subclasses'
|
|
@@ -1,231 +1,221 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
alias_method :+, :plus_with_duration
|
|
12
|
-
|
|
13
|
-
alias_method :minus_without_duration, :-
|
|
14
|
-
alias_method :-, :minus_with_duration
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
module ClassMethods
|
|
19
|
-
# Returns a new Date representing the date 1 day ago (i.e. yesterday's date).
|
|
20
|
-
def yesterday
|
|
21
|
-
::Date.today.yesterday
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
# Returns a new Date representing the date 1 day after today (i.e. tomorrow's date).
|
|
25
|
-
def tomorrow
|
|
26
|
-
::Date.today.tomorrow
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
# Returns Time.zone.today when config.time_zone is set, otherwise just returns Date.today.
|
|
30
|
-
def current
|
|
31
|
-
::Time.zone_default ? ::Time.zone.today : ::Date.today
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
# Tells whether the Date object's date lies in the past
|
|
36
|
-
def past?
|
|
37
|
-
self < ::Date.current
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
# Tells whether the Date object's date is today
|
|
41
|
-
def today?
|
|
42
|
-
self.to_date == ::Date.current # we need the to_date because of DateTime
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
# Tells whether the Date object's date lies in the future
|
|
46
|
-
def future?
|
|
47
|
-
self > ::Date.current
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
# Converts Date to a Time (or DateTime if necessary) with the time portion set to the beginning of the day (0:00)
|
|
51
|
-
# and then subtracts the specified number of seconds
|
|
52
|
-
def ago(seconds)
|
|
53
|
-
to_time.since(-seconds)
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
# Converts Date to a Time (or DateTime if necessary) with the time portion set to the beginning of the day (0:00)
|
|
57
|
-
# and then adds the specified number of seconds
|
|
58
|
-
def since(seconds)
|
|
59
|
-
to_time.since(seconds)
|
|
60
|
-
end
|
|
61
|
-
alias :in :since
|
|
62
|
-
|
|
63
|
-
# Converts Date to a Time (or DateTime if necessary) with the time portion set to the beginning of the day (0:00)
|
|
64
|
-
def beginning_of_day
|
|
65
|
-
to_time
|
|
66
|
-
end
|
|
67
|
-
alias :midnight :beginning_of_day
|
|
68
|
-
alias :at_midnight :beginning_of_day
|
|
69
|
-
alias :at_beginning_of_day :beginning_of_day
|
|
70
|
-
|
|
71
|
-
# Converts Date to a Time (or DateTime if necessary) with the time portion set to the end of the day (23:59:59)
|
|
72
|
-
def end_of_day
|
|
73
|
-
to_time.end_of_day
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
def plus_with_duration(other) #:nodoc:
|
|
77
|
-
if ActiveSupport::Duration === other
|
|
78
|
-
other.since(self)
|
|
79
|
-
else
|
|
80
|
-
plus_without_duration(other)
|
|
81
|
-
end
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
def minus_with_duration(other) #:nodoc:
|
|
85
|
-
if ActiveSupport::Duration === other
|
|
86
|
-
plus_with_duration(-other)
|
|
87
|
-
else
|
|
88
|
-
minus_without_duration(other)
|
|
89
|
-
end
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
# Provides precise Date calculations for years, months, and days. The +options+ parameter takes a hash with
|
|
93
|
-
# any of these keys: <tt>:years</tt>, <tt>:months</tt>, <tt>:weeks</tt>, <tt>:days</tt>.
|
|
94
|
-
def advance(options)
|
|
95
|
-
options = options.dup
|
|
96
|
-
d = self
|
|
97
|
-
d = d >> options.delete(:years) * 12 if options[:years]
|
|
98
|
-
d = d >> options.delete(:months) if options[:months]
|
|
99
|
-
d = d + options.delete(:weeks) * 7 if options[:weeks]
|
|
100
|
-
d = d + options.delete(:days) if options[:days]
|
|
101
|
-
d
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
# Returns a new Date where one or more of the elements have been changed according to the +options+ parameter.
|
|
105
|
-
#
|
|
106
|
-
# Examples:
|
|
107
|
-
#
|
|
108
|
-
# Date.new(2007, 5, 12).change(:day => 1) # => Date.new(2007, 5, 1)
|
|
109
|
-
# Date.new(2007, 5, 12).change(:year => 2005, :month => 1) # => Date.new(2005, 1, 12)
|
|
110
|
-
def change(options)
|
|
111
|
-
::Date.new(
|
|
112
|
-
options[:year] || self.year,
|
|
113
|
-
options[:month] || self.month,
|
|
114
|
-
options[:day] || self.day
|
|
115
|
-
)
|
|
116
|
-
end
|
|
117
|
-
|
|
118
|
-
# Returns a new Date/DateTime representing the time a number of specified months ago
|
|
119
|
-
def months_ago(months)
|
|
120
|
-
advance(:months => -months)
|
|
121
|
-
end
|
|
122
|
-
|
|
123
|
-
# Returns a new Date/DateTime representing the time a number of specified months in the future
|
|
124
|
-
def months_since(months)
|
|
125
|
-
advance(:months => months)
|
|
126
|
-
end
|
|
127
|
-
|
|
128
|
-
# Returns a new Date/DateTime representing the time a number of specified years ago
|
|
129
|
-
def years_ago(years)
|
|
130
|
-
advance(:years => -years)
|
|
131
|
-
end
|
|
132
|
-
|
|
133
|
-
# Returns a new Date/DateTime representing the time a number of specified years in the future
|
|
134
|
-
def years_since(years)
|
|
135
|
-
advance(:years => years)
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
# Short-hand for years_ago(1)
|
|
139
|
-
def last_year
|
|
140
|
-
years_ago(1)
|
|
141
|
-
end
|
|
142
|
-
|
|
143
|
-
# Short-hand for years_since(1)
|
|
144
|
-
def next_year
|
|
145
|
-
years_since(1)
|
|
146
|
-
end
|
|
147
|
-
|
|
148
|
-
# Short-hand for months_ago(1)
|
|
149
|
-
def last_month
|
|
150
|
-
months_ago(1)
|
|
151
|
-
end
|
|
152
|
-
|
|
153
|
-
# Short-hand for months_since(1)
|
|
154
|
-
def next_month
|
|
155
|
-
months_since(1)
|
|
156
|
-
end
|
|
157
|
-
|
|
158
|
-
# Returns a new Date/DateTime representing the "start" of this week (i.e, Monday; DateTime objects will have time set to 0:00)
|
|
159
|
-
def beginning_of_week
|
|
160
|
-
days_to_monday = self.wday!=0 ? self.wday-1 : 6
|
|
161
|
-
result = self - days_to_monday
|
|
162
|
-
self.acts_like?(:time) ? result.midnight : result
|
|
163
|
-
end
|
|
164
|
-
alias :monday :beginning_of_week
|
|
165
|
-
alias :at_beginning_of_week :beginning_of_week
|
|
166
|
-
|
|
167
|
-
# Returns a new Date/DateTime representing the end of this week (Sunday, DateTime objects will have time set to 23:59:59)
|
|
168
|
-
def end_of_week
|
|
169
|
-
days_to_sunday = self.wday!=0 ? 7-self.wday : 0
|
|
170
|
-
result = self + days_to_sunday.days
|
|
171
|
-
self.acts_like?(:time) ? result.end_of_day : result
|
|
172
|
-
end
|
|
173
|
-
alias :at_end_of_week :end_of_week
|
|
174
|
-
|
|
175
|
-
# Returns a new Date/DateTime representing the start of the given day in next week (default is Monday).
|
|
176
|
-
def next_week(day = :monday)
|
|
177
|
-
days_into_week = { :monday => 0, :tuesday => 1, :wednesday => 2, :thursday => 3, :friday => 4, :saturday => 5, :sunday => 6}
|
|
178
|
-
result = (self + 7).beginning_of_week + days_into_week[day]
|
|
179
|
-
self.acts_like?(:time) ? result.change(:hour => 0) : result
|
|
180
|
-
end
|
|
181
|
-
|
|
182
|
-
# Returns a new ; DateTime objects will have time set to 0:00DateTime representing the start of the month (1st of the month; DateTime objects will have time set to 0:00)
|
|
183
|
-
def beginning_of_month
|
|
184
|
-
self.acts_like?(:time) ? change(:day => 1,:hour => 0, :min => 0, :sec => 0) : change(:day => 1)
|
|
185
|
-
end
|
|
186
|
-
alias :at_beginning_of_month :beginning_of_month
|
|
187
|
-
|
|
188
|
-
# Returns a new Date/DateTime representing the end of the month (last day of the month; DateTime objects will have time set to 0:00)
|
|
189
|
-
def end_of_month
|
|
190
|
-
last_day = ::Time.days_in_month( self.month, self.year )
|
|
191
|
-
self.acts_like?(:time) ? change(:day => last_day, :hour => 23, :min => 59, :sec => 59) : change(:day => last_day)
|
|
192
|
-
end
|
|
193
|
-
alias :at_end_of_month :end_of_month
|
|
194
|
-
|
|
195
|
-
# Returns a new Date/DateTime representing the start of the quarter (1st of january, april, july, october; DateTime objects will have time set to 0:00)
|
|
196
|
-
def beginning_of_quarter
|
|
197
|
-
beginning_of_month.change(:month => [10, 7, 4, 1].detect { |m| m <= self.month })
|
|
198
|
-
end
|
|
199
|
-
alias :at_beginning_of_quarter :beginning_of_quarter
|
|
200
|
-
|
|
201
|
-
# Returns a new Date/DateTime representing the end of the quarter (last day of march, june, september, december; DateTime objects will have time set to 23:59:59)
|
|
202
|
-
def end_of_quarter
|
|
203
|
-
beginning_of_month.change(:month => [3, 6, 9, 12].detect { |m| m >= self.month }).end_of_month
|
|
204
|
-
end
|
|
205
|
-
alias :at_end_of_quarter :end_of_quarter
|
|
206
|
-
|
|
207
|
-
# Returns a new Date/DateTime representing the start of the year (1st of january; DateTime objects will have time set to 0:00)
|
|
208
|
-
def beginning_of_year
|
|
209
|
-
self.acts_like?(:time) ? change(:month => 1, :day => 1, :hour => 0, :min => 0, :sec => 0) : change(:month => 1, :day => 1)
|
|
210
|
-
end
|
|
211
|
-
alias :at_beginning_of_year :beginning_of_year
|
|
212
|
-
|
|
213
|
-
# Returns a new Time representing the end of the year (31st of december; DateTime objects will have time set to 23:59:59)
|
|
214
|
-
def end_of_year
|
|
215
|
-
self.acts_like?(:time) ? change(:month => 12,:day => 31,:hour => 23, :min => 59, :sec => 59) : change(:month => 12, :day => 31)
|
|
216
|
-
end
|
|
217
|
-
alias :at_end_of_year :end_of_year
|
|
218
|
-
|
|
219
|
-
# Convenience method which returns a new Date/DateTime representing the time 1 day ago
|
|
220
|
-
def yesterday
|
|
221
|
-
self - 1
|
|
222
|
-
end
|
|
223
|
-
|
|
224
|
-
# Convenience method which returns a new Date/DateTime representing the time 1 day since the instance time
|
|
225
|
-
def tomorrow
|
|
226
|
-
self + 1
|
|
227
|
-
end
|
|
228
|
-
end
|
|
1
|
+
require 'date'
|
|
2
|
+
require 'active_support/duration'
|
|
3
|
+
require 'active_support/core_ext/time/zones'
|
|
4
|
+
require 'active_support/core_ext/object/acts_like'
|
|
5
|
+
|
|
6
|
+
class Date
|
|
7
|
+
class << self
|
|
8
|
+
# Returns a new Date representing the date 1 day ago (i.e. yesterday's date).
|
|
9
|
+
def yesterday
|
|
10
|
+
::Date.today.yesterday
|
|
229
11
|
end
|
|
12
|
+
|
|
13
|
+
# Returns a new Date representing the date 1 day after today (i.e. tomorrow's date).
|
|
14
|
+
def tomorrow
|
|
15
|
+
::Date.today.tomorrow
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Returns Time.zone.today when config.time_zone is set, otherwise just returns Date.today.
|
|
19
|
+
def current
|
|
20
|
+
::Time.zone_default ? ::Time.zone.today : ::Date.today
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Tells whether the Date object's date lies in the past
|
|
25
|
+
def past?
|
|
26
|
+
self < ::Date.current
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Tells whether the Date object's date is today
|
|
30
|
+
def today?
|
|
31
|
+
self.to_date == ::Date.current # we need the to_date because of DateTime
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Tells whether the Date object's date lies in the future
|
|
35
|
+
def future?
|
|
36
|
+
self > ::Date.current
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Converts Date to a Time (or DateTime if necessary) with the time portion set to the beginning of the day (0:00)
|
|
40
|
+
# and then subtracts the specified number of seconds
|
|
41
|
+
def ago(seconds)
|
|
42
|
+
to_time.since(-seconds)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Converts Date to a Time (or DateTime if necessary) with the time portion set to the beginning of the day (0:00)
|
|
46
|
+
# and then adds the specified number of seconds
|
|
47
|
+
def since(seconds)
|
|
48
|
+
to_time.since(seconds)
|
|
49
|
+
end
|
|
50
|
+
alias :in :since
|
|
51
|
+
|
|
52
|
+
# Converts Date to a Time (or DateTime if necessary) with the time portion set to the beginning of the day (0:00)
|
|
53
|
+
def beginning_of_day
|
|
54
|
+
to_time
|
|
55
|
+
end
|
|
56
|
+
alias :midnight :beginning_of_day
|
|
57
|
+
alias :at_midnight :beginning_of_day
|
|
58
|
+
alias :at_beginning_of_day :beginning_of_day
|
|
59
|
+
|
|
60
|
+
# Converts Date to a Time (or DateTime if necessary) with the time portion set to the end of the day (23:59:59)
|
|
61
|
+
def end_of_day
|
|
62
|
+
to_time.end_of_day
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def plus_with_duration(other) #:nodoc:
|
|
66
|
+
if ActiveSupport::Duration === other
|
|
67
|
+
other.since(self)
|
|
68
|
+
else
|
|
69
|
+
plus_without_duration(other)
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
alias_method :plus_without_duration, :+
|
|
73
|
+
alias_method :+, :plus_with_duration
|
|
74
|
+
|
|
75
|
+
def minus_with_duration(other) #:nodoc:
|
|
76
|
+
if ActiveSupport::Duration === other
|
|
77
|
+
plus_with_duration(-other)
|
|
78
|
+
else
|
|
79
|
+
minus_without_duration(other)
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
alias_method :minus_without_duration, :-
|
|
83
|
+
alias_method :-, :minus_with_duration
|
|
84
|
+
|
|
85
|
+
# Provides precise Date calculations for years, months, and days. The +options+ parameter takes a hash with
|
|
86
|
+
# any of these keys: <tt>:years</tt>, <tt>:months</tt>, <tt>:weeks</tt>, <tt>:days</tt>.
|
|
87
|
+
def advance(options)
|
|
88
|
+
options = options.dup
|
|
89
|
+
d = self
|
|
90
|
+
d = d >> options.delete(:years) * 12 if options[:years]
|
|
91
|
+
d = d >> options.delete(:months) if options[:months]
|
|
92
|
+
d = d + options.delete(:weeks) * 7 if options[:weeks]
|
|
93
|
+
d = d + options.delete(:days) if options[:days]
|
|
94
|
+
d
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# Returns a new Date where one or more of the elements have been changed according to the +options+ parameter.
|
|
98
|
+
#
|
|
99
|
+
# Examples:
|
|
100
|
+
#
|
|
101
|
+
# Date.new(2007, 5, 12).change(:day => 1) # => Date.new(2007, 5, 1)
|
|
102
|
+
# Date.new(2007, 5, 12).change(:year => 2005, :month => 1) # => Date.new(2005, 1, 12)
|
|
103
|
+
def change(options)
|
|
104
|
+
::Date.new(
|
|
105
|
+
options[:year] || self.year,
|
|
106
|
+
options[:month] || self.month,
|
|
107
|
+
options[:day] || self.day
|
|
108
|
+
)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# Returns a new Date/DateTime representing the time a number of specified months ago
|
|
112
|
+
def months_ago(months)
|
|
113
|
+
advance(:months => -months)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# Returns a new Date/DateTime representing the time a number of specified months in the future
|
|
117
|
+
def months_since(months)
|
|
118
|
+
advance(:months => months)
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# Returns a new Date/DateTime representing the time a number of specified years ago
|
|
122
|
+
def years_ago(years)
|
|
123
|
+
advance(:years => -years)
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
# Returns a new Date/DateTime representing the time a number of specified years in the future
|
|
127
|
+
def years_since(years)
|
|
128
|
+
advance(:years => years)
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
# Short-hand for years_ago(1)
|
|
132
|
+
def last_year
|
|
133
|
+
years_ago(1)
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
# Short-hand for years_since(1)
|
|
137
|
+
def next_year
|
|
138
|
+
years_since(1)
|
|
139
|
+
end unless method_defined?(:next_year)
|
|
140
|
+
|
|
141
|
+
# Short-hand for months_ago(1)
|
|
142
|
+
def last_month
|
|
143
|
+
months_ago(1)
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
# Short-hand for months_since(1)
|
|
147
|
+
def next_month
|
|
148
|
+
months_since(1)
|
|
149
|
+
end unless method_defined?(:next_month)
|
|
150
|
+
|
|
151
|
+
# Returns a new Date/DateTime representing the "start" of this week (i.e, Monday; DateTime objects will have time set to 0:00)
|
|
152
|
+
def beginning_of_week
|
|
153
|
+
days_to_monday = self.wday!=0 ? self.wday-1 : 6
|
|
154
|
+
result = self - days_to_monday
|
|
155
|
+
self.acts_like?(:time) ? result.midnight : result
|
|
156
|
+
end
|
|
157
|
+
alias :monday :beginning_of_week
|
|
158
|
+
alias :at_beginning_of_week :beginning_of_week
|
|
159
|
+
|
|
160
|
+
# Returns a new Date/DateTime representing the end of this week (Sunday, DateTime objects will have time set to 23:59:59)
|
|
161
|
+
def end_of_week
|
|
162
|
+
days_to_sunday = self.wday!=0 ? 7-self.wday : 0
|
|
163
|
+
result = self + days_to_sunday.days
|
|
164
|
+
self.acts_like?(:time) ? result.end_of_day : result
|
|
165
|
+
end
|
|
166
|
+
alias :at_end_of_week :end_of_week
|
|
167
|
+
|
|
168
|
+
# Returns a new Date/DateTime representing the start of the given day in next week (default is Monday).
|
|
169
|
+
def next_week(day = :monday)
|
|
170
|
+
days_into_week = { :monday => 0, :tuesday => 1, :wednesday => 2, :thursday => 3, :friday => 4, :saturday => 5, :sunday => 6}
|
|
171
|
+
result = (self + 7).beginning_of_week + days_into_week[day]
|
|
172
|
+
self.acts_like?(:time) ? result.change(:hour => 0) : result
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
# Returns a new ; DateTime objects will have time set to 0:00DateTime representing the start of the month (1st of the month; DateTime objects will have time set to 0:00)
|
|
176
|
+
def beginning_of_month
|
|
177
|
+
self.acts_like?(:time) ? change(:day => 1,:hour => 0, :min => 0, :sec => 0) : change(:day => 1)
|
|
178
|
+
end
|
|
179
|
+
alias :at_beginning_of_month :beginning_of_month
|
|
180
|
+
|
|
181
|
+
# Returns a new Date/DateTime representing the end of the month (last day of the month; DateTime objects will have time set to 0:00)
|
|
182
|
+
def end_of_month
|
|
183
|
+
last_day = ::Time.days_in_month( self.month, self.year )
|
|
184
|
+
self.acts_like?(:time) ? change(:day => last_day, :hour => 23, :min => 59, :sec => 59) : change(:day => last_day)
|
|
185
|
+
end
|
|
186
|
+
alias :at_end_of_month :end_of_month
|
|
187
|
+
|
|
188
|
+
# Returns a new Date/DateTime representing the start of the quarter (1st of january, april, july, october; DateTime objects will have time set to 0:00)
|
|
189
|
+
def beginning_of_quarter
|
|
190
|
+
beginning_of_month.change(:month => [10, 7, 4, 1].detect { |m| m <= self.month })
|
|
191
|
+
end
|
|
192
|
+
alias :at_beginning_of_quarter :beginning_of_quarter
|
|
193
|
+
|
|
194
|
+
# Returns a new Date/DateTime representing the end of the quarter (last day of march, june, september, december; DateTime objects will have time set to 23:59:59)
|
|
195
|
+
def end_of_quarter
|
|
196
|
+
beginning_of_month.change(:month => [3, 6, 9, 12].detect { |m| m >= self.month }).end_of_month
|
|
197
|
+
end
|
|
198
|
+
alias :at_end_of_quarter :end_of_quarter
|
|
199
|
+
|
|
200
|
+
# Returns a new Date/DateTime representing the start of the year (1st of january; DateTime objects will have time set to 0:00)
|
|
201
|
+
def beginning_of_year
|
|
202
|
+
self.acts_like?(:time) ? change(:month => 1, :day => 1, :hour => 0, :min => 0, :sec => 0) : change(:month => 1, :day => 1)
|
|
203
|
+
end
|
|
204
|
+
alias :at_beginning_of_year :beginning_of_year
|
|
205
|
+
|
|
206
|
+
# Returns a new Time representing the end of the year (31st of december; DateTime objects will have time set to 23:59:59)
|
|
207
|
+
def end_of_year
|
|
208
|
+
self.acts_like?(:time) ? change(:month => 12,:day => 31,:hour => 23, :min => 59, :sec => 59) : change(:month => 12, :day => 31)
|
|
209
|
+
end
|
|
210
|
+
alias :at_end_of_year :end_of_year
|
|
211
|
+
|
|
212
|
+
# Convenience method which returns a new Date/DateTime representing the time 1 day ago
|
|
213
|
+
def yesterday
|
|
214
|
+
self - 1
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
# Convenience method which returns a new Date/DateTime representing the time 1 day since the instance time
|
|
218
|
+
def tomorrow
|
|
219
|
+
self + 1
|
|
230
220
|
end
|
|
231
221
|
end
|