activesupport 2.3.18 → 3.0.0.beta
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 +30 -53
- data/lib/active_support.rb +43 -31
- data/lib/active_support/all.rb +3 -7
- data/lib/active_support/backtrace_cleaner.rb +24 -8
- data/lib/active_support/base64.rb +9 -0
- data/lib/active_support/benchmarkable.rb +60 -0
- data/lib/active_support/buffered_logger.rb +12 -9
- data/lib/active_support/cache.rb +75 -55
- 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 +29 -20
- data/lib/active_support/cache/memory_store.rb +18 -17
- data/lib/active_support/cache/strategy/local_cache.rb +9 -1
- 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.rb +2 -7
- data/lib/active_support/core_ext/array.rb +2 -10
- data/lib/active_support/core_ext/array/access.rb +39 -46
- data/lib/active_support/core_ext/array/conversions.rb +146 -182
- data/lib/active_support/core_ext/array/extract_options.rb +12 -18
- data/lib/active_support/core_ext/array/grouping.rb +87 -93
- data/lib/active_support/core_ext/array/random_access.rb +4 -40
- 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/big_decimal.rb +1 -0
- data/lib/active_support/core_ext/big_decimal/conversions.rb +27 -0
- data/lib/active_support/core_ext/cgi.rb +0 -4
- data/lib/active_support/core_ext/cgi/escape_skipping_slashes.rb +16 -20
- data/lib/active_support/core_ext/class.rb +0 -2
- data/lib/active_support/core_ext/class/attribute.rb +8 -39
- data/lib/active_support/core_ext/class/attribute_accessors.rb +31 -35
- data/lib/active_support/core_ext/class/delegating_attributes.rb +34 -40
- data/lib/active_support/core_ext/class/inheritable_attributes.rb +100 -16
- data/lib/active_support/core_ext/date/acts_like.rb +8 -0
- data/lib/active_support/core_ext/date/calculations.rb +218 -238
- 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 +83 -95
- data/lib/active_support/core_ext/date_time/zones.rb +17 -0
- data/lib/active_support/core_ext/enumerable.rb +14 -15
- data/lib/active_support/core_ext/exception.rb +1 -43
- data/lib/active_support/core_ext/file.rb +0 -4
- data/lib/active_support/core_ext/file/atomic.rb +34 -41
- data/lib/active_support/core_ext/float.rb +0 -6
- data/lib/active_support/core_ext/float/rounding.rb +15 -20
- data/lib/active_support/core_ext/hash.rb +8 -14
- data/lib/active_support/core_ext/hash/conversions.rb +236 -236
- 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/integer.rb +1 -7
- 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/kernel/reporting.rb +9 -7
- data/lib/active_support/core_ext/kernel/requires.rb +3 -1
- data/lib/active_support/core_ext/load_error.rb +16 -33
- data/lib/active_support/core_ext/logger.rb +3 -2
- data/lib/active_support/core_ext/module.rb +3 -16
- data/lib/active_support/core_ext/module/aliasing.rb +64 -68
- 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 +36 -41
- data/lib/active_support/core_ext/module/delegation.rb +1 -1
- 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/loading.rb +2 -0
- data/lib/active_support/core_ext/module/synchronization.rb +4 -1
- data/lib/active_support/core_ext/name_error.rb +3 -4
- data/lib/active_support/core_ext/numeric.rb +1 -8
- 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/object.rb +4 -2
- data/lib/active_support/core_ext/object/acts_like.rb +10 -0
- 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/instance_variables.rb +0 -7
- data/lib/active_support/core_ext/object/metaclass.rb +5 -6
- data/lib/active_support/core_ext/object/misc.rb +2 -93
- 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/proc.rb +6 -4
- data/lib/active_support/core_ext/process/daemon.rb +17 -19
- data/lib/active_support/core_ext/range.rb +2 -9
- 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/regexp.rb +5 -0
- data/lib/active_support/core_ext/rexml.rb +12 -7
- data/lib/active_support/core_ext/string.rb +6 -19
- 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 +19 -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 +146 -153
- data/lib/active_support/{vendor/i18n-0.4.1/i18n/core_ext/string/interpolate.rb → core_ext/string/interpolation.rb} +8 -15
- data/lib/active_support/core_ext/string/multibyte.rb +68 -74
- data/lib/active_support/core_ext/string/output_safety.rb +21 -17
- data/lib/active_support/core_ext/string/starts_ends_with.rb +3 -32
- data/lib/active_support/core_ext/string/xchar.rb +10 -3
- data/lib/active_support/core_ext/time/acts_like.rb +8 -0
- data/lib/active_support/core_ext/time/calculations.rb +276 -308
- data/lib/active_support/core_ext/time/conversions.rb +78 -84
- data/lib/active_support/core_ext/time/marshal_with_utc_flag.rb +22 -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/dependencies.rb +38 -48
- data/lib/active_support/dependencies/autoload.rb +49 -0
- data/lib/active_support/deprecation.rb +9 -195
- 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 +55 -0
- data/lib/active_support/duration.rb +6 -2
- data/lib/active_support/hash_with_indifferent_access.rb +137 -0
- data/lib/active_support/i18n.rb +2 -0
- data/lib/active_support/inflections.rb +1 -1
- data/lib/active_support/inflector.rb +4 -406
- data/lib/active_support/inflector/inflections.rb +211 -0
- data/lib/active_support/inflector/methods.rb +139 -0
- data/lib/active_support/inflector/transliterate.rb +61 -0
- data/lib/active_support/json/backends/jsongem.rb +16 -10
- data/lib/active_support/json/backends/yaml.rb +72 -2
- data/lib/active_support/json/decoding.rb +2 -16
- data/lib/active_support/json/encoding.rb +153 -33
- data/lib/active_support/json/variable.rb +4 -3
- data/lib/active_support/locale/en.yml +1 -4
- data/lib/active_support/memoizable.rb +7 -6
- data/lib/active_support/message_encryptor.rb +1 -0
- data/lib/active_support/message_verifier.rb +12 -29
- data/lib/active_support/multibyte.rb +9 -4
- data/lib/active_support/multibyte/chars.rb +25 -17
- data/lib/active_support/multibyte/unicode_database.rb +5 -5
- data/lib/active_support/multibyte/utils.rb +1 -1
- data/lib/active_support/notifications.rb +77 -0
- data/lib/active_support/notifications/fanout.rb +69 -0
- data/lib/active_support/notifications/instrumenter.rb +50 -0
- data/lib/active_support/option_merger.rb +2 -0
- data/lib/active_support/ordered_hash.rb +33 -37
- data/lib/active_support/ordered_options.rb +3 -1
- data/lib/active_support/railtie.rb +64 -0
- data/lib/active_support/rescuable.rb +11 -6
- data/lib/active_support/ruby/shim.rb +19 -0
- data/lib/active_support/test_case.rb +8 -1
- data/lib/active_support/testing/assertions.rb +2 -14
- 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.rb +34 -0
- data/lib/active_support/time/autoload.rb +5 -0
- data/lib/active_support/time_with_zone.rb +18 -12
- data/lib/active_support/values/time_zone.rb +97 -93
- data/lib/active_support/version.rb +3 -3
- data/lib/active_support/whiny_nil.rb +1 -4
- data/lib/active_support/xml_mini.rb +2 -0
- data/lib/active_support/xml_mini/jdom.rb +13 -7
- data/lib/active_support/xml_mini/libxml.rb +19 -12
- data/lib/active_support/xml_mini/libxmlsax.rb +19 -9
- data/lib/active_support/xml_mini/nokogiri.rb +18 -12
- data/lib/active_support/xml_mini/nokogirisax.rb +15 -6
- data/lib/active_support/xml_mini/rexml.rb +24 -9
- metadata +94 -244
- 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.rb +0 -4
- data/lib/active_support/core_ext/base64/encoding.rb +0 -16
- data/lib/active_support/core_ext/bigdecimal.rb +0 -6
- data/lib/active_support/core_ext/bigdecimal/conversions.rb +0 -37
- 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.rb +0 -10
- data/lib/active_support/core_ext/date/behavior.rb +0 -42
- 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/singleton_class.rb +0 -13
- data/lib/active_support/core_ext/module/model_naming.rb +0 -25
- data/lib/active_support/core_ext/module/remove_method.rb +0 -6
- data/lib/active_support/core_ext/numeric/conversions.rb +0 -19
- data/lib/active_support/core_ext/object/extending.rb +0 -80
- data/lib/active_support/core_ext/object/singleton_class.rb +0 -13
- data/lib/active_support/core_ext/pathname.rb +0 -7
- data/lib/active_support/core_ext/pathname/clean_within.rb +0 -14
- 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.rb +0 -46
- data/lib/active_support/core_ext/time/behavior.rb +0 -13
- data/lib/active_support/json/backends/okjson.rb +0 -644
- data/lib/active_support/json/backends/yajl.rb +0 -40
- 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.rb +0 -36
- data/lib/active_support/vendor/builder-2.1.2/blankslate.rb +0 -113
- data/lib/active_support/vendor/builder-2.1.2/builder.rb +0 -13
- 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/i18n-0.4.1/i18n.rb +0 -322
- data/lib/active_support/vendor/i18n-0.4.1/i18n/backend.rb +0 -20
- data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/active_record.rb +0 -61
- data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/active_record/missing.rb +0 -65
- data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/active_record/store_procs.rb +0 -38
- data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/active_record/translation.rb +0 -93
- data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/base.rb +0 -237
- data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/cache.rb +0 -77
- data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/cascade.rb +0 -57
- data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/chain.rb +0 -77
- data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/cldr.rb +0 -100
- data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/fallbacks.rb +0 -69
- data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/flatten.rb +0 -113
- data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/gettext.rb +0 -75
- data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/interpolation_compiler.rb +0 -123
- data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/key_value.rb +0 -102
- data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/memoize.rb +0 -48
- data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/metadata.rb +0 -65
- data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/pluralization.rb +0 -57
- data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/simple.rb +0 -87
- data/lib/active_support/vendor/i18n-0.4.1/i18n/backend/transliterator.rb +0 -98
- data/lib/active_support/vendor/i18n-0.4.1/i18n/config.rb +0 -84
- data/lib/active_support/vendor/i18n-0.4.1/i18n/core_ext/hash.rb +0 -29
- data/lib/active_support/vendor/i18n-0.4.1/i18n/exceptions.rb +0 -61
- data/lib/active_support/vendor/i18n-0.4.1/i18n/gettext.rb +0 -27
- data/lib/active_support/vendor/i18n-0.4.1/i18n/gettext/helpers.rb +0 -65
- data/lib/active_support/vendor/i18n-0.4.1/i18n/gettext/po_parser.rb +0 -329
- data/lib/active_support/vendor/i18n-0.4.1/i18n/locale.rb +0 -6
- data/lib/active_support/vendor/i18n-0.4.1/i18n/locale/fallbacks.rb +0 -98
- data/lib/active_support/vendor/i18n-0.4.1/i18n/locale/tag.rb +0 -28
- data/lib/active_support/vendor/i18n-0.4.1/i18n/locale/tag/parents.rb +0 -24
- data/lib/active_support/vendor/i18n-0.4.1/i18n/locale/tag/rfc4646.rb +0 -76
- data/lib/active_support/vendor/i18n-0.4.1/i18n/locale/tag/simple.rb +0 -41
- data/lib/active_support/vendor/i18n-0.4.1/i18n/version.rb +0 -3
- data/lib/active_support/vendor/memcache-client-1.7.4/memcache.rb +0 -1107
- data/lib/active_support/vendor/tzinfo-0.3.12/tzinfo.rb +0 -33
- 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/activesupport.rb +0 -2
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'active_support/core_ext/array/extract_options'
|
2
|
+
|
1
3
|
# Extends the class object with class and instance accessors for class attributes,
|
2
4
|
# just like the native attr* accessors for instance attributes.
|
3
5
|
#
|
@@ -8,54 +10,48 @@
|
|
8
10
|
# Person.hair_colors = [:brown, :black, :blonde, :red]
|
9
11
|
class Class
|
10
12
|
def cattr_reader(*syms)
|
11
|
-
|
12
|
-
syms.each do |sym|
|
13
|
+
syms.flatten.each do |sym|
|
13
14
|
next if sym.is_a?(Hash)
|
14
15
|
class_eval(<<-EOS, __FILE__, __LINE__ + 1)
|
15
|
-
unless defined? @@#{sym}
|
16
|
-
@@#{sym} = nil
|
17
|
-
end
|
18
|
-
|
19
|
-
def self.#{sym}
|
20
|
-
@@#{sym}
|
21
|
-
end
|
16
|
+
unless defined? @@#{sym} # unless defined? @@hair_colors
|
17
|
+
@@#{sym} = nil # @@hair_colors = nil
|
18
|
+
end # end
|
19
|
+
#
|
20
|
+
def self.#{sym} # def self.hair_colors
|
21
|
+
@@#{sym} # @@hair_colors
|
22
|
+
end # end
|
23
|
+
#
|
24
|
+
def #{sym} # def hair_colors
|
25
|
+
@@#{sym} # @@hair_colors
|
26
|
+
end # end
|
22
27
|
EOS
|
23
|
-
|
24
|
-
unless options[:instance_reader] == false
|
25
|
-
class_eval(<<-EOS, __FILE__, __LINE__ + 1)
|
26
|
-
def #{sym}
|
27
|
-
@@#{sym}
|
28
|
-
end
|
29
|
-
EOS
|
30
|
-
end
|
31
28
|
end
|
32
29
|
end
|
33
30
|
|
34
31
|
def cattr_writer(*syms)
|
35
32
|
options = syms.extract_options!
|
36
|
-
syms.each do |sym|
|
33
|
+
syms.flatten.each do |sym|
|
37
34
|
class_eval(<<-EOS, __FILE__, __LINE__ + 1)
|
38
|
-
unless defined? @@#{sym}
|
39
|
-
@@#{sym} = nil
|
40
|
-
end
|
41
|
-
|
42
|
-
def self.#{sym}=(obj)
|
43
|
-
@@#{sym} = obj
|
44
|
-
end
|
35
|
+
unless defined? @@#{sym} # unless defined? @@hair_colors
|
36
|
+
@@#{sym} = nil # @@hair_colors = nil
|
37
|
+
end # end
|
38
|
+
#
|
39
|
+
def self.#{sym}=(obj) # def self.hair_colors=(obj)
|
40
|
+
@@#{sym} = obj # @@hair_colors = obj
|
41
|
+
end # 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
|
45
48
|
EOS
|
46
|
-
|
47
|
-
unless options[:instance_writer] == false
|
48
|
-
class_eval(<<-EOS, __FILE__, __LINE__ + 1)
|
49
|
-
def #{sym}=(obj)
|
50
|
-
@@#{sym} = obj
|
51
|
-
end
|
52
|
-
EOS
|
53
|
-
end
|
49
|
+
self.send("#{sym}=", yield) if block_given?
|
54
50
|
end
|
55
51
|
end
|
56
52
|
|
57
|
-
def cattr_accessor(*syms)
|
53
|
+
def cattr_accessor(*syms, &blk)
|
58
54
|
cattr_reader(*syms)
|
59
|
-
cattr_writer(*syms)
|
55
|
+
cattr_writer(*syms, &blk)
|
60
56
|
end
|
61
57
|
end
|
@@ -1,47 +1,41 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
# specific value. This stops the strange situation where values
|
6
|
-
# set after class definition don't get applied to subclasses.
|
1
|
+
require 'active_support/core_ext/object/blank'
|
2
|
+
require 'active_support/core_ext/array/extract_options'
|
3
|
+
require 'active_support/core_ext/object/metaclass'
|
4
|
+
|
7
5
|
class Class
|
8
|
-
def
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
!!#{name} # !!only_reader
|
25
|
-
end # end
|
26
|
-
def #{name}? # def only_reader?
|
27
|
-
!!#{name} # !!only_reader
|
28
|
-
end # end
|
29
|
-
EOS
|
30
|
-
end
|
6
|
+
def superclass_delegating_accessor(name, options = {})
|
7
|
+
# Create private _name and _name= methods that can still be used if the public
|
8
|
+
# methods are overridden. This allows
|
9
|
+
_superclass_delegating_accessor("_#{name}")
|
10
|
+
|
11
|
+
# Generate the public methods name, name=, and name?
|
12
|
+
# These methods dispatch to the private _name, and _name= methods, making them
|
13
|
+
# overridable
|
14
|
+
metaclass.send(:define_method, name) { send("_#{name}") }
|
15
|
+
metaclass.send(:define_method, "#{name}?") { !!send("_#{name}") }
|
16
|
+
metaclass.send(:define_method, "#{name}=") { |value| send("_#{name}=", value) }
|
17
|
+
|
18
|
+
# If an instance_reader is needed, generate methods for name and name= on the
|
19
|
+
# class itself, so instances will be able to see them
|
20
|
+
define_method(name) { send("_#{name}") } if options[:instance_reader] != false
|
21
|
+
define_method("#{name}?") { !!send("#{name}") } if options[:instance_reader] != false
|
31
22
|
end
|
32
23
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
24
|
+
private
|
25
|
+
|
26
|
+
# Take the object being set and store it in a method. This gives us automatic
|
27
|
+
# inheritance behavior, without having to store the object in an instance
|
28
|
+
# variable and look up the superclass chain manually.
|
29
|
+
def _stash_object_in_method(object, method, instance_reader = true)
|
30
|
+
metaclass.send(:define_method, method) { object }
|
31
|
+
define_method(method) { object } if instance_reader
|
41
32
|
end
|
42
33
|
|
43
|
-
def
|
44
|
-
|
45
|
-
|
34
|
+
def _superclass_delegating_accessor(name, options = {})
|
35
|
+
metaclass.send(:define_method, "#{name}=") do |value|
|
36
|
+
_stash_object_in_method(value, name, options[:instance_reader] != false)
|
37
|
+
end
|
38
|
+
self.send("#{name}=", nil)
|
46
39
|
end
|
40
|
+
|
47
41
|
end
|
@@ -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
|
@@ -109,11 +115,6 @@ class Class # :nodoc:
|
|
109
115
|
write_inheritable_attribute(key, read_inheritable_attribute(key).merge(hash))
|
110
116
|
end
|
111
117
|
|
112
|
-
def write_inheritable_hiwa(key, hash)
|
113
|
-
write_inheritable_attribute(key, {}.with_indifferent_access) if read_inheritable_attribute(key).nil?
|
114
|
-
write_inheritable_attribute(key, read_inheritable_attribute(key).merge(hash))
|
115
|
-
end
|
116
|
-
|
117
118
|
def read_inheritable_attribute(key)
|
118
119
|
inheritable_attributes[key]
|
119
120
|
end
|
@@ -143,3 +144,86 @@ class Class # :nodoc:
|
|
143
144
|
alias inherited_without_inheritable_attributes inherited
|
144
145
|
alias inherited inherited_with_inheritable_attributes
|
145
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
|
@@ -1,241 +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
|
-
def last_year # :nodoc:
|
139
|
-
ActiveSupport::Deprecation.warn("Date#last_year is deprecated and has been removed in Rails 3, please use Date#prev_year instead", caller)
|
140
|
-
prev_year
|
141
|
-
end
|
142
|
-
|
143
|
-
# Short-hand for years_ago(1)
|
144
|
-
def prev_year
|
145
|
-
years_ago(1)
|
146
|
-
end unless method_defined?(:prev_year)
|
147
|
-
|
148
|
-
# Short-hand for years_since(1)
|
149
|
-
def next_year
|
150
|
-
years_since(1)
|
151
|
-
end
|
152
|
-
|
153
|
-
def last_month # :nodoc:
|
154
|
-
ActiveSupport::Deprecation.warn("Date#last_month is deprecated and has been removed in Rails 3, please use Date#prev_month instead", caller)
|
155
|
-
prev_month
|
156
|
-
end
|
157
|
-
|
158
|
-
# Short-hand for months_ago(1)
|
159
|
-
def prev_month
|
160
|
-
months_ago(1)
|
161
|
-
end unless method_defined?(:prev_month)
|
162
|
-
|
163
|
-
# Short-hand for months_since(1)
|
164
|
-
def next_month
|
165
|
-
months_since(1)
|
166
|
-
end
|
167
|
-
|
168
|
-
# Returns a new Date/DateTime representing the "start" of this week (i.e, Monday; DateTime objects will have time set to 0:00)
|
169
|
-
def beginning_of_week
|
170
|
-
days_to_monday = self.wday!=0 ? self.wday-1 : 6
|
171
|
-
result = self - days_to_monday
|
172
|
-
self.acts_like?(:time) ? result.midnight : result
|
173
|
-
end
|
174
|
-
alias :monday :beginning_of_week
|
175
|
-
alias :at_beginning_of_week :beginning_of_week
|
176
|
-
|
177
|
-
# Returns a new Date/DateTime representing the end of this week (Sunday, DateTime objects will have time set to 23:59:59)
|
178
|
-
def end_of_week
|
179
|
-
days_to_sunday = self.wday!=0 ? 7-self.wday : 0
|
180
|
-
result = self + days_to_sunday.days
|
181
|
-
self.acts_like?(:time) ? result.end_of_day : result
|
182
|
-
end
|
183
|
-
alias :at_end_of_week :end_of_week
|
184
|
-
|
185
|
-
# Returns a new Date/DateTime representing the start of the given day in next week (default is Monday).
|
186
|
-
def next_week(day = :monday)
|
187
|
-
days_into_week = { :monday => 0, :tuesday => 1, :wednesday => 2, :thursday => 3, :friday => 4, :saturday => 5, :sunday => 6}
|
188
|
-
result = (self + 7).beginning_of_week + days_into_week[day]
|
189
|
-
self.acts_like?(:time) ? result.change(:hour => 0) : result
|
190
|
-
end
|
191
|
-
|
192
|
-
# 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)
|
193
|
-
def beginning_of_month
|
194
|
-
self.acts_like?(:time) ? change(:day => 1,:hour => 0, :min => 0, :sec => 0) : change(:day => 1)
|
195
|
-
end
|
196
|
-
alias :at_beginning_of_month :beginning_of_month
|
197
|
-
|
198
|
-
# 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)
|
199
|
-
def end_of_month
|
200
|
-
last_day = ::Time.days_in_month( self.month, self.year )
|
201
|
-
self.acts_like?(:time) ? change(:day => last_day, :hour => 23, :min => 59, :sec => 59) : change(:day => last_day)
|
202
|
-
end
|
203
|
-
alias :at_end_of_month :end_of_month
|
204
|
-
|
205
|
-
# 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)
|
206
|
-
def beginning_of_quarter
|
207
|
-
beginning_of_month.change(:month => [10, 7, 4, 1].detect { |m| m <= self.month })
|
208
|
-
end
|
209
|
-
alias :at_beginning_of_quarter :beginning_of_quarter
|
210
|
-
|
211
|
-
# 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)
|
212
|
-
def end_of_quarter
|
213
|
-
beginning_of_month.change(:month => [3, 6, 9, 12].detect { |m| m >= self.month }).end_of_month
|
214
|
-
end
|
215
|
-
alias :at_end_of_quarter :end_of_quarter
|
216
|
-
|
217
|
-
# Returns a new Date/DateTime representing the start of the year (1st of january; DateTime objects will have time set to 0:00)
|
218
|
-
def beginning_of_year
|
219
|
-
self.acts_like?(:time) ? change(:month => 1, :day => 1, :hour => 0, :min => 0, :sec => 0) : change(:month => 1, :day => 1)
|
220
|
-
end
|
221
|
-
alias :at_beginning_of_year :beginning_of_year
|
222
|
-
|
223
|
-
# Returns a new Time representing the end of the year (31st of december; DateTime objects will have time set to 23:59:59)
|
224
|
-
def end_of_year
|
225
|
-
self.acts_like?(:time) ? change(:month => 12,:day => 31,:hour => 23, :min => 59, :sec => 59) : change(:month => 12, :day => 31)
|
226
|
-
end
|
227
|
-
alias :at_end_of_year :end_of_year
|
228
|
-
|
229
|
-
# Convenience method which returns a new Date/DateTime representing the time 1 day ago
|
230
|
-
def yesterday
|
231
|
-
self - 1
|
232
|
-
end
|
233
|
-
|
234
|
-
# Convenience method which returns a new Date/DateTime representing the time 1 day since the instance time
|
235
|
-
def tomorrow
|
236
|
-
self + 1
|
237
|
-
end
|
238
|
-
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
|
239
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
|
240
220
|
end
|
241
221
|
end
|