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,7 +1,19 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
|
+
require 'active_support/core_ext/array/wrap'
|
|
3
|
+
require 'active_support/core_ext/hash/except'
|
|
4
|
+
require 'active_support/core_ext/hash/slice'
|
|
2
5
|
require 'active_support/core_ext/module/delegation'
|
|
6
|
+
require 'active_support/core_ext/object/instance_variables'
|
|
3
7
|
require 'active_support/deprecation'
|
|
4
8
|
|
|
9
|
+
require 'active_support/time'
|
|
10
|
+
|
|
11
|
+
# Hack to load json gem first so we can overwrite its to_json.
|
|
12
|
+
begin
|
|
13
|
+
require 'json'
|
|
14
|
+
rescue LoadError
|
|
15
|
+
end
|
|
16
|
+
|
|
5
17
|
module ActiveSupport
|
|
6
18
|
class << self
|
|
7
19
|
delegate :use_standard_json_time_format, :use_standard_json_time_format=,
|
|
@@ -13,15 +25,55 @@ module ActiveSupport
|
|
|
13
25
|
# matches YAML-formatted dates
|
|
14
26
|
DATE_REGEX = /^(?:\d{4}-\d{2}-\d{2}|\d{4}-\d{1,2}-\d{1,2}[ \t]+\d{1,2}:\d{2}:\d{2}(\.[0-9]*)?(([ \t]*)Z|[-+]\d{2}?(:\d{2})?))$/
|
|
15
27
|
|
|
16
|
-
|
|
17
|
-
|
|
28
|
+
# Dumps object in JSON (JavaScript Object Notation). See www.json.org for more info.
|
|
29
|
+
def self.encode(value, options = nil)
|
|
30
|
+
Encoding::Encoder.new(options).encode(value)
|
|
18
31
|
end
|
|
19
32
|
|
|
20
33
|
module Encoding #:nodoc:
|
|
21
|
-
class CircularReferenceError < StandardError
|
|
34
|
+
class CircularReferenceError < StandardError; end
|
|
35
|
+
|
|
36
|
+
class Encoder
|
|
37
|
+
attr_reader :options
|
|
38
|
+
|
|
39
|
+
def initialize(options = nil)
|
|
40
|
+
@options = options
|
|
41
|
+
@seen = []
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def encode(value)
|
|
45
|
+
check_for_circular_references(value) do
|
|
46
|
+
value.as_json(options).encode_json(self)
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def escape(string)
|
|
51
|
+
Encoding.escape(string)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
private
|
|
55
|
+
def check_for_circular_references(value)
|
|
56
|
+
if @seen.any? { |object| object.equal?(value) }
|
|
57
|
+
raise CircularReferenceError, 'object references itself'
|
|
58
|
+
end
|
|
59
|
+
@seen.unshift value
|
|
60
|
+
yield
|
|
61
|
+
ensure
|
|
62
|
+
@seen.shift
|
|
63
|
+
end
|
|
22
64
|
end
|
|
23
65
|
|
|
66
|
+
|
|
24
67
|
ESCAPED_CHARS = {
|
|
68
|
+
"\x00" => '\u0000', "\x01" => '\u0001', "\x02" => '\u0002',
|
|
69
|
+
"\x03" => '\u0003', "\x04" => '\u0004', "\x05" => '\u0005',
|
|
70
|
+
"\x06" => '\u0006', "\x07" => '\u0007', "\x0B" => '\u000B',
|
|
71
|
+
"\x0E" => '\u000E', "\x0F" => '\u000F', "\x10" => '\u0010',
|
|
72
|
+
"\x11" => '\u0011', "\x12" => '\u0012', "\x13" => '\u0013',
|
|
73
|
+
"\x14" => '\u0014', "\x15" => '\u0015', "\x16" => '\u0016',
|
|
74
|
+
"\x17" => '\u0017', "\x18" => '\u0018', "\x19" => '\u0019',
|
|
75
|
+
"\x1A" => '\u001A', "\x1B" => '\u001B', "\x1C" => '\u001C',
|
|
76
|
+
"\x1D" => '\u001D', "\x1E" => '\u001E', "\x1F" => '\u001F',
|
|
25
77
|
"\010" => '\b',
|
|
26
78
|
"\f" => '\f',
|
|
27
79
|
"\n" => '\n',
|
|
@@ -43,9 +95,9 @@ module ActiveSupport
|
|
|
43
95
|
def escape_html_entities_in_json=(value)
|
|
44
96
|
self.escape_regex = \
|
|
45
97
|
if @escape_html_entities_in_json = value
|
|
46
|
-
/[\
|
|
98
|
+
/[\x00-\x1F"\\><&]/
|
|
47
99
|
else
|
|
48
|
-
/[\
|
|
100
|
+
/[\x00-\x1F"\\]/
|
|
49
101
|
end
|
|
50
102
|
end
|
|
51
103
|
|
|
@@ -60,43 +112,120 @@ module ActiveSupport
|
|
|
60
112
|
}
|
|
61
113
|
%("#{json}")
|
|
62
114
|
end
|
|
63
|
-
|
|
64
|
-
# Converts a Ruby object into a JSON string.
|
|
65
|
-
def encode(value, options = nil)
|
|
66
|
-
options = {} unless Hash === options
|
|
67
|
-
seen = (options[:seen] ||= [])
|
|
68
|
-
raise CircularReferenceError, 'object references itself' if seen.include?(value)
|
|
69
|
-
seen << value
|
|
70
|
-
value.to_json(options)
|
|
71
|
-
ensure
|
|
72
|
-
seen.pop
|
|
73
|
-
end
|
|
74
115
|
end
|
|
75
116
|
|
|
76
|
-
self.
|
|
117
|
+
self.use_standard_json_time_format = true
|
|
118
|
+
self.escape_html_entities_in_json = false
|
|
77
119
|
end
|
|
78
120
|
|
|
79
121
|
CircularReferenceError = Deprecation::DeprecatedConstantProxy.new('ActiveSupport::JSON::CircularReferenceError', Encoding::CircularReferenceError)
|
|
80
122
|
end
|
|
81
123
|
end
|
|
82
124
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
125
|
+
class Object
|
|
126
|
+
# Dumps object in JSON (JavaScript Object Notation). See www.json.org for more info.
|
|
127
|
+
def to_json(options = nil)
|
|
128
|
+
ActiveSupport::JSON.encode(self, options)
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def as_json(options = nil) instance_values end #:nodoc:
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# A string that returns itself as its JSON-encoded form.
|
|
135
|
+
class ActiveSupport::JSON::Variable < String
|
|
136
|
+
def as_json(options = nil) self end #:nodoc:
|
|
137
|
+
def encode_json(encoder) self end #:nodoc:
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
class TrueClass
|
|
141
|
+
AS_JSON = ActiveSupport::JSON::Variable.new('true').freeze
|
|
142
|
+
def as_json(options = nil) AS_JSON end #:nodoc:
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
class FalseClass
|
|
146
|
+
AS_JSON = ActiveSupport::JSON::Variable.new('false').freeze
|
|
147
|
+
def as_json(options = nil) AS_JSON end #:nodoc:
|
|
87
148
|
end
|
|
88
149
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
150
|
+
class NilClass
|
|
151
|
+
AS_JSON = ActiveSupport::JSON::Variable.new('null').freeze
|
|
152
|
+
def as_json(options = nil) AS_JSON end #:nodoc:
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
class String
|
|
156
|
+
def as_json(options = nil) self end #:nodoc:
|
|
157
|
+
def encode_json(encoder) encoder.escape(self) end #:nodoc:
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
class Symbol
|
|
161
|
+
def as_json(options = nil) to_s end #:nodoc:
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
class Numeric
|
|
165
|
+
def as_json(options = nil) self end #:nodoc:
|
|
166
|
+
def encode_json(encoder) to_s end #:nodoc:
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
class Regexp
|
|
170
|
+
def as_json(options = nil) self end #:nodoc:
|
|
171
|
+
def encode_json(encoder) inspect end #:nodoc:
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
module Enumerable
|
|
175
|
+
def as_json(options = nil) to_a end #:nodoc:
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
class Array
|
|
179
|
+
def as_json(options = nil) self end #:nodoc:
|
|
180
|
+
def encode_json(encoder) "[#{map { |v| encoder.encode(v) } * ','}]" end #:nodoc:
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
class Hash
|
|
184
|
+
def as_json(options = nil) #:nodoc:
|
|
185
|
+
if options
|
|
186
|
+
if attrs = options[:only]
|
|
187
|
+
slice(*Array.wrap(attrs))
|
|
188
|
+
elsif attrs = options[:except]
|
|
189
|
+
except(*Array.wrap(attrs))
|
|
190
|
+
else
|
|
191
|
+
self
|
|
192
|
+
end
|
|
193
|
+
else
|
|
194
|
+
self
|
|
195
|
+
end
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
def encode_json(encoder)
|
|
199
|
+
"{#{map { |k,v| "#{encoder.encode(k.to_s)}:#{encoder.encode(v)}" } * ','}}"
|
|
200
|
+
end
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
class Time
|
|
204
|
+
def as_json(options = nil) #:nodoc:
|
|
205
|
+
if ActiveSupport.use_standard_json_time_format
|
|
206
|
+
xmlschema
|
|
207
|
+
else
|
|
208
|
+
%(#{strftime("%Y/%m/%d %H:%M:%S")} #{formatted_offset(false)})
|
|
209
|
+
end
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
class Date
|
|
214
|
+
def as_json(options = nil) #:nodoc:
|
|
215
|
+
if ActiveSupport.use_standard_json_time_format
|
|
216
|
+
strftime("%Y-%m-%d")
|
|
217
|
+
else
|
|
218
|
+
strftime("%Y/%m/%d")
|
|
219
|
+
end
|
|
220
|
+
end
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
class DateTime
|
|
224
|
+
def as_json(options = nil) #:nodoc:
|
|
225
|
+
if ActiveSupport.use_standard_json_time_format
|
|
226
|
+
xmlschema
|
|
227
|
+
else
|
|
228
|
+
strftime('%Y/%m/%d %H:%M:%S %z')
|
|
229
|
+
end
|
|
230
|
+
end
|
|
231
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module ActiveSupport
|
|
2
|
+
@load_hooks = Hash.new {|h,k| h[k] = [] }
|
|
3
|
+
@loaded = {}
|
|
4
|
+
|
|
5
|
+
def self.on_load(name, &block)
|
|
6
|
+
if base = @loaded[name]
|
|
7
|
+
base.instance_eval(&block)
|
|
8
|
+
else
|
|
9
|
+
@load_hooks[name] << block
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def self.run_load_hooks(name, base = Object)
|
|
14
|
+
@load_hooks[name].each { |hook| base.instance_eval(&hook) }
|
|
15
|
+
@loaded[name] = base
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
require 'active_support/core_ext/kernel/singleton_class'
|
|
2
|
+
require 'active_support/core_ext/module/aliasing'
|
|
3
|
+
|
|
1
4
|
module ActiveSupport
|
|
2
5
|
module Memoizable
|
|
3
6
|
def self.memoized_ivar_for(symbol)
|
|
@@ -41,10 +44,10 @@ module ActiveSupport
|
|
|
41
44
|
end
|
|
42
45
|
end
|
|
43
46
|
|
|
44
|
-
def flush_cache(*syms
|
|
47
|
+
def flush_cache(*syms)
|
|
45
48
|
syms.each do |sym|
|
|
46
49
|
(methods + private_methods + protected_methods).each do |m|
|
|
47
|
-
if m.to_s =~ /^_unmemoized_(#{sym})/
|
|
50
|
+
if m.to_s =~ /^_unmemoized_(#{sym.to_s.gsub(/\?\Z/, '\?')})/
|
|
48
51
|
ivar = ActiveSupport::Memoizable.memoized_ivar_for($1)
|
|
49
52
|
instance_variable_get(ivar).clear if instance_variable_defined?(ivar)
|
|
50
53
|
end
|
|
@@ -58,7 +61,7 @@ module ActiveSupport
|
|
|
58
61
|
original_method = :"_unmemoized_#{symbol}"
|
|
59
62
|
memoized_ivar = ActiveSupport::Memoizable.memoized_ivar_for(symbol)
|
|
60
63
|
|
|
61
|
-
class_eval <<-EOS, __FILE__, __LINE__
|
|
64
|
+
class_eval <<-EOS, __FILE__, __LINE__ + 1
|
|
62
65
|
include InstanceMethods # include InstanceMethods
|
|
63
66
|
#
|
|
64
67
|
if method_defined?(:#{original_method}) # if method_defined?(:_unmemoized_mime_type)
|
|
@@ -69,7 +72,7 @@ module ActiveSupport
|
|
|
69
72
|
if instance_method(:#{symbol}).arity == 0 # if instance_method(:mime_type).arity == 0
|
|
70
73
|
def #{symbol}(reload = false) # def mime_type(reload = false)
|
|
71
74
|
if reload || !defined?(#{memoized_ivar}) || #{memoized_ivar}.empty? # if reload || !defined?(@_memoized_mime_type) || @_memoized_mime_type.empty?
|
|
72
|
-
#{memoized_ivar} = [#{original_method}
|
|
75
|
+
#{memoized_ivar} = [#{original_method}] # @_memoized_mime_type = [_unmemoized_mime_type]
|
|
73
76
|
end # end
|
|
74
77
|
#{memoized_ivar}[0] # @_memoized_mime_type[0]
|
|
75
78
|
end # end
|
|
@@ -82,7 +85,7 @@ module ActiveSupport
|
|
|
82
85
|
if !reload && #{memoized_ivar}.has_key?(args) # if !reload && @_memoized_mime_type.has_key?(args)
|
|
83
86
|
#{memoized_ivar}[args] # @_memoized_mime_type[args]
|
|
84
87
|
elsif #{memoized_ivar} # elsif @_memoized_mime_type
|
|
85
|
-
#{memoized_ivar}[args] = #{original_method}(*args)
|
|
88
|
+
#{memoized_ivar}[args] = #{original_method}(*args) # @_memoized_mime_type[args] = _unmemoized_mime_type(*args)
|
|
86
89
|
end # end
|
|
87
90
|
else # else
|
|
88
91
|
#{original_method}(*args) # _unmemoized_mime_type(*args)
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
require 'active_support/base64'
|
|
2
|
+
require 'active_support/core_ext/object/blank'
|
|
3
|
+
|
|
1
4
|
module ActiveSupport
|
|
2
5
|
# MessageVerifier makes it easy to generate and verify messages which are signed
|
|
3
6
|
# to prevent tampering.
|
|
@@ -40,40 +43,20 @@ module ActiveSupport
|
|
|
40
43
|
end
|
|
41
44
|
|
|
42
45
|
private
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
a = a.dup.force_encoding(Encoding::BINARY)
|
|
47
|
-
b = b.dup.force_encoding(Encoding::BINARY)
|
|
46
|
+
# constant-time comparison algorithm to prevent timing attacks
|
|
47
|
+
def secure_compare(a, b)
|
|
48
|
+
return false unless a.bytesize == b.bytesize
|
|
48
49
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
result == 0
|
|
55
|
-
else
|
|
56
|
-
false
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
else
|
|
60
|
-
# For <= 1.8.6
|
|
61
|
-
def secure_compare(a, b)
|
|
62
|
-
if a.length == b.length
|
|
63
|
-
result = 0
|
|
64
|
-
for i in 0..(a.length - 1)
|
|
65
|
-
result |= a[i] ^ b[i]
|
|
66
|
-
end
|
|
67
|
-
result == 0
|
|
68
|
-
else
|
|
69
|
-
false
|
|
70
|
-
end
|
|
71
|
-
end
|
|
50
|
+
l = a.unpack "C#{a.bytesize}"
|
|
51
|
+
|
|
52
|
+
res = 0
|
|
53
|
+
b.each_byte { |byte| res |= byte ^ l.shift }
|
|
54
|
+
res == 0
|
|
72
55
|
end
|
|
73
56
|
|
|
74
57
|
def generate_digest(data)
|
|
75
58
|
require 'openssl' unless defined?(OpenSSL)
|
|
76
|
-
OpenSSL::HMAC.hexdigest(OpenSSL::Digest
|
|
59
|
+
OpenSSL::HMAC.hexdigest(OpenSSL::Digest.const_get(@digest).new, @secret, data)
|
|
77
60
|
end
|
|
78
61
|
end
|
|
79
62
|
end
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
|
+
require 'active_support/core_ext/string/access'
|
|
3
|
+
require 'active_support/core_ext/string/behavior'
|
|
2
4
|
|
|
3
5
|
module ActiveSupport #:nodoc:
|
|
4
6
|
module Multibyte #:nodoc:
|
|
@@ -17,7 +19,7 @@ module ActiveSupport #:nodoc:
|
|
|
17
19
|
# bad.explicit_checking_method "T".mb_chars.downcase.to_s
|
|
18
20
|
#
|
|
19
21
|
# The default Chars implementation assumes that the encoding of the string is UTF-8, if you want to handle different
|
|
20
|
-
# encodings you can write your own multibyte string handler and configure it through
|
|
22
|
+
# encodings you can write your own multibyte string handler and configure it through
|
|
21
23
|
# ActiveSupport::Multibyte.proxy_class.
|
|
22
24
|
#
|
|
23
25
|
# class CharsForUTF32
|
|
@@ -196,7 +198,7 @@ module ActiveSupport #:nodoc:
|
|
|
196
198
|
# 'Café périferôl'.mb_chars.index('ô') #=> 12
|
|
197
199
|
# 'Café périferôl'.mb_chars.index(/\w/u) #=> 0
|
|
198
200
|
def index(needle, offset=0)
|
|
199
|
-
wrapped_offset =
|
|
201
|
+
wrapped_offset = first(offset).wrapped_string.length
|
|
200
202
|
index = @wrapped_string.index(needle, wrapped_offset)
|
|
201
203
|
index ? (self.class.u_unpack(@wrapped_string.slice(0...index)).size) : nil
|
|
202
204
|
end
|
|
@@ -210,7 +212,7 @@ module ActiveSupport #:nodoc:
|
|
|
210
212
|
# 'Café périferôl'.mb_chars.rindex(/\w/u) #=> 13
|
|
211
213
|
def rindex(needle, offset=nil)
|
|
212
214
|
offset ||= length
|
|
213
|
-
wrapped_offset =
|
|
215
|
+
wrapped_offset = first(offset).wrapped_string.length
|
|
214
216
|
index = @wrapped_string.rindex(needle, wrapped_offset)
|
|
215
217
|
index ? (self.class.u_unpack(@wrapped_string.slice(0...index)).size) : nil
|
|
216
218
|
end
|
|
@@ -362,6 +364,16 @@ module ActiveSupport #:nodoc:
|
|
|
362
364
|
slice
|
|
363
365
|
end
|
|
364
366
|
|
|
367
|
+
# Limit the byte size of the string to a number of bytes without breaking characters. Usable
|
|
368
|
+
# when the storage for a string is limited for some reason.
|
|
369
|
+
#
|
|
370
|
+
# Example:
|
|
371
|
+
# s = 'こんにちは'
|
|
372
|
+
# s.mb_chars.limit(7) #=> "こに"
|
|
373
|
+
def limit(limit)
|
|
374
|
+
slice(0...translate_offset(limit))
|
|
375
|
+
end
|
|
376
|
+
|
|
365
377
|
# Returns the codepoint of the first character in the string.
|
|
366
378
|
#
|
|
367
379
|
# Example:
|
|
@@ -373,7 +385,7 @@ module ActiveSupport #:nodoc:
|
|
|
373
385
|
# Convert characters in the string to uppercase.
|
|
374
386
|
#
|
|
375
387
|
# Example:
|
|
376
|
-
# 'Laurent,
|
|
388
|
+
# 'Laurent, où sont les tests ?'.mb_chars.upcase.to_s #=> "LAURENT, OÙ SONT LES TESTS ?"
|
|
377
389
|
def upcase
|
|
378
390
|
apply_mapping :uppercase_mapping
|
|
379
391
|
end
|
|
@@ -446,8 +458,10 @@ module ActiveSupport #:nodoc:
|
|
|
446
458
|
end
|
|
447
459
|
|
|
448
460
|
# Replaces all ISO-8859-1 or CP1252 characters by their UTF-8 equivalent resulting in a valid UTF-8 string.
|
|
449
|
-
|
|
450
|
-
|
|
461
|
+
#
|
|
462
|
+
# Passing +true+ will forcibly tidy all bytes, assuming that the string's encoding is entirely CP1252 or ISO-8859-1.
|
|
463
|
+
def tidy_bytes(force = false)
|
|
464
|
+
chars(self.class.tidy_bytes(@wrapped_string, force))
|
|
451
465
|
end
|
|
452
466
|
|
|
453
467
|
%w(lstrip rstrip strip reverse upcase downcase tidy_bytes capitalize).each do |method|
|
|
@@ -516,7 +530,7 @@ module ActiveSupport #:nodoc:
|
|
|
516
530
|
unpacked << codepoints[marker..pos-1]
|
|
517
531
|
marker = pos
|
|
518
532
|
end
|
|
519
|
-
end
|
|
533
|
+
end
|
|
520
534
|
unpacked
|
|
521
535
|
end
|
|
522
536
|
|
|
@@ -632,20 +646,67 @@ module ActiveSupport #:nodoc:
|
|
|
632
646
|
codepoints
|
|
633
647
|
end
|
|
634
648
|
|
|
649
|
+
def tidy_byte(byte)
|
|
650
|
+
if byte < 160
|
|
651
|
+
[UCD.cp1252[byte] || byte].pack("U").unpack("C*")
|
|
652
|
+
elsif byte < 192
|
|
653
|
+
[194, byte]
|
|
654
|
+
else
|
|
655
|
+
[195, byte - 64]
|
|
656
|
+
end
|
|
657
|
+
end
|
|
658
|
+
private :tidy_byte
|
|
659
|
+
|
|
635
660
|
# Replaces all ISO-8859-1 or CP1252 characters by their UTF-8 equivalent resulting in a valid UTF-8 string.
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
661
|
+
#
|
|
662
|
+
# Passing +true+ will forcibly tidy all bytes, assuming that the string's encoding is entirely CP-1252 or ISO-8859-1.
|
|
663
|
+
def tidy_bytes(string, force = false)
|
|
664
|
+
if force
|
|
665
|
+
return string.unpack("C*").map do |b|
|
|
666
|
+
tidy_byte(b)
|
|
667
|
+
end.flatten.compact.pack("C*").unpack("U*").pack("U*")
|
|
668
|
+
end
|
|
669
|
+
|
|
670
|
+
bytes = string.unpack("C*")
|
|
671
|
+
conts_expected = 0
|
|
672
|
+
last_lead = 0
|
|
673
|
+
|
|
674
|
+
bytes.each_index do |i|
|
|
675
|
+
|
|
676
|
+
byte = bytes[i]
|
|
677
|
+
is_ascii = byte < 128
|
|
678
|
+
is_cont = byte > 127 && byte < 192
|
|
679
|
+
is_lead = byte > 191 && byte < 245
|
|
680
|
+
is_unused = byte > 240
|
|
681
|
+
is_restricted = byte > 244
|
|
682
|
+
|
|
683
|
+
# Impossible or highly unlikely byte? Clean it.
|
|
684
|
+
if is_unused || is_restricted
|
|
685
|
+
bytes[i] = tidy_byte(byte)
|
|
686
|
+
elsif is_cont
|
|
687
|
+
# Not expecting contination byte? Clean up. Otherwise, now expect one less.
|
|
688
|
+
conts_expected == 0 ? bytes[i] = tidy_byte(byte) : conts_expected -= 1
|
|
645
689
|
else
|
|
646
|
-
|
|
690
|
+
if conts_expected > 0
|
|
691
|
+
# Expected continuation, but got ASCII or leading? Clean backwards up to
|
|
692
|
+
# the leading byte.
|
|
693
|
+
(1..(i - last_lead)).each {|j| bytes[i - j] = tidy_byte(bytes[i - j])}
|
|
694
|
+
conts_expected = 0
|
|
695
|
+
end
|
|
696
|
+
if is_lead
|
|
697
|
+
# Final byte is leading? Clean it.
|
|
698
|
+
if i == bytes.length - 1
|
|
699
|
+
bytes[i] = tidy_byte(bytes.last)
|
|
700
|
+
else
|
|
701
|
+
# Valid leading byte? Expect continuations determined by position of
|
|
702
|
+
# first zero bit, with max of 3.
|
|
703
|
+
conts_expected = byte < 224 ? 1 : byte < 240 ? 2 : 3
|
|
704
|
+
last_lead = i
|
|
705
|
+
end
|
|
706
|
+
end
|
|
647
707
|
end
|
|
648
|
-
end
|
|
708
|
+
end
|
|
709
|
+
bytes.empty? ? "" : bytes.flatten.compact.pack("C*").unpack("U*").pack("U*")
|
|
649
710
|
end
|
|
650
711
|
end
|
|
651
712
|
|
|
@@ -654,20 +715,16 @@ module ActiveSupport #:nodoc:
|
|
|
654
715
|
def translate_offset(byte_offset) #:nodoc:
|
|
655
716
|
return nil if byte_offset.nil?
|
|
656
717
|
return 0 if @wrapped_string == ''
|
|
657
|
-
|
|
718
|
+
|
|
719
|
+
if @wrapped_string.respond_to?(:force_encoding)
|
|
720
|
+
@wrapped_string = @wrapped_string.dup.force_encoding(Encoding::ASCII_8BIT)
|
|
721
|
+
end
|
|
722
|
+
|
|
658
723
|
begin
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
# Stop retrying at the end of the string
|
|
664
|
-
raise e unless byte_offset < chunk.length
|
|
665
|
-
# We damaged a character, retry
|
|
666
|
-
retry
|
|
667
|
-
end
|
|
668
|
-
# Catch the ArgumentError so we can throw our own
|
|
669
|
-
rescue ArgumentError
|
|
670
|
-
raise EncodingError, 'malformed UTF-8 character'
|
|
724
|
+
@wrapped_string[0...byte_offset].unpack('U*').length
|
|
725
|
+
rescue ArgumentError => e
|
|
726
|
+
byte_offset -= 1
|
|
727
|
+
retry
|
|
671
728
|
end
|
|
672
729
|
end
|
|
673
730
|
|
|
@@ -23,11 +23,11 @@ module ActiveSupport #:nodoc:
|
|
|
23
23
|
|
|
24
24
|
# Lazy load the Unicode database so it's only loaded when it's actually used
|
|
25
25
|
ATTRIBUTES.each do |attr_name|
|
|
26
|
-
class_eval(<<-EOS, __FILE__, __LINE__)
|
|
27
|
-
def #{attr_name}
|
|
28
|
-
load
|
|
29
|
-
@#{attr_name}
|
|
30
|
-
end
|
|
26
|
+
class_eval(<<-EOS, __FILE__, __LINE__ + 1)
|
|
27
|
+
def #{attr_name} # def codepoints
|
|
28
|
+
load # load
|
|
29
|
+
@#{attr_name} # @codepoints
|
|
30
|
+
end # end
|
|
31
31
|
EOS
|
|
32
32
|
end
|
|
33
33
|
|
|
@@ -26,11 +26,11 @@ module ActiveSupport #:nodoc:
|
|
|
26
26
|
else
|
|
27
27
|
def self.verify(string)
|
|
28
28
|
if expression = valid_character
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
# Splits the string on character boundaries, which are determined based on $KCODE.
|
|
30
|
+
string.split(//).all? { |c| expression =~ c }
|
|
31
|
+
else
|
|
32
|
+
true
|
|
32
33
|
end
|
|
33
|
-
true
|
|
34
34
|
end
|
|
35
35
|
end
|
|
36
36
|
|
|
@@ -49,9 +49,8 @@ module ActiveSupport #:nodoc:
|
|
|
49
49
|
else
|
|
50
50
|
def self.clean(string)
|
|
51
51
|
if expression = valid_character
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
end; stripped.join
|
|
52
|
+
# Splits the string on character boundaries, which are determined based on $KCODE.
|
|
53
|
+
string.split(//).grep(expression).join
|
|
55
54
|
else
|
|
56
55
|
string
|
|
57
56
|
end
|
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
2
|
|
|
3
|
+
require 'active_support/core_ext/module/attribute_accessors'
|
|
4
|
+
|
|
3
5
|
module ActiveSupport #:nodoc:
|
|
4
6
|
module Multibyte
|
|
7
|
+
autoload :EncodingError, 'active_support/multibyte/exceptions'
|
|
8
|
+
autoload :Chars, 'active_support/multibyte/chars'
|
|
9
|
+
autoload :UnicodeDatabase, 'active_support/multibyte/unicode_database'
|
|
10
|
+
autoload :Codepoint, 'active_support/multibyte/unicode_database'
|
|
11
|
+
autoload :UCD, 'active_support/multibyte/unicode_database'
|
|
12
|
+
|
|
5
13
|
# A list of all available normalization forms. See http://www.unicode.org/reports/tr15/tr15-29.html for more
|
|
6
14
|
# information about normalization.
|
|
7
15
|
NORMALIZATION_FORMS = [:c, :kc, :d, :kd]
|
|
@@ -45,13 +53,10 @@ module ActiveSupport #:nodoc:
|
|
|
45
53
|
\xf4 [\x80-\x8f] [\x80-\xbf] [\x80-\xbf])\z /xn,
|
|
46
54
|
# Quick check for valid Shift-JIS characters, disregards the odd-even pairing
|
|
47
55
|
'Shift_JIS' => /\A(?:
|
|
48
|
-
[\x00-\x7e
|
|
49
|
-
[\x81-\x9f
|
|
56
|
+
[\x00-\x7e\xa1-\xdf] |
|
|
57
|
+
[\x81-\x9f\xe0-\xef] [\x40-\x7e\x80-\x9e\x9f-\xfc])\z /xn
|
|
50
58
|
}
|
|
51
59
|
end
|
|
52
60
|
end
|
|
53
61
|
|
|
54
|
-
require 'active_support/multibyte/
|
|
55
|
-
require 'active_support/multibyte/exceptions'
|
|
56
|
-
require 'active_support/multibyte/unicode_database'
|
|
57
|
-
require 'active_support/multibyte/utils'
|
|
62
|
+
require 'active_support/multibyte/utils'
|