activesupport 3.0.pre → 3.0.0.rc
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of activesupport might be problematic. Click here for more details.
- data/CHANGELOG +121 -1
- data/README.rdoc +33 -0
- data/lib/active_support.rb +42 -4
- data/lib/active_support/backtrace_cleaner.rb +31 -9
- data/lib/active_support/benchmarkable.rb +1 -0
- data/lib/active_support/buffered_logger.rb +5 -2
- data/lib/active_support/builder.rb +6 -0
- data/lib/active_support/cache.rb +454 -84
- data/lib/active_support/cache/compressed_mem_cache_store.rb +6 -13
- data/lib/active_support/cache/file_store.rb +140 -41
- data/lib/active_support/cache/mem_cache_store.rb +121 -76
- data/lib/active_support/cache/memory_store.rb +127 -27
- data/lib/active_support/cache/strategy/local_cache.rb +111 -58
- data/lib/active_support/cache/synchronized_memory_store.rb +2 -38
- data/lib/active_support/callbacks.rb +105 -76
- data/lib/active_support/configurable.rb +19 -18
- data/lib/active_support/core_ext/array.rb +1 -0
- data/lib/active_support/core_ext/array/access.rb +1 -1
- data/lib/active_support/core_ext/array/conversions.rb +29 -54
- data/lib/active_support/core_ext/array/extract_options.rb +16 -1
- data/lib/active_support/core_ext/array/grouping.rb +1 -1
- data/lib/active_support/core_ext/array/random_access.rb +26 -5
- data/lib/active_support/core_ext/array/uniq_by.rb +17 -0
- data/lib/active_support/core_ext/array/wrap.rb +13 -9
- data/lib/active_support/core_ext/benchmark.rb +0 -12
- data/lib/active_support/core_ext/cgi/escape_skipping_slashes.rb +2 -0
- data/lib/active_support/core_ext/class.rb +2 -1
- data/lib/active_support/core_ext/class/attribute.rb +67 -0
- data/lib/active_support/core_ext/class/attribute_accessors.rb +33 -27
- data/lib/active_support/core_ext/class/delegating_attributes.rb +35 -41
- data/lib/active_support/core_ext/class/inheritable_attributes.rb +23 -14
- data/lib/active_support/core_ext/class/subclasses.rb +50 -0
- data/lib/active_support/core_ext/date/calculations.rb +35 -12
- data/lib/active_support/core_ext/date/conversions.rb +5 -5
- data/lib/active_support/core_ext/date/zones.rb +14 -0
- data/lib/active_support/core_ext/date_time/calculations.rb +3 -1
- data/lib/active_support/core_ext/date_time/conversions.rb +24 -5
- data/lib/active_support/core_ext/date_time/zones.rb +4 -0
- data/lib/active_support/core_ext/enumerable.rb +5 -9
- data/lib/active_support/core_ext/exception.rb +0 -47
- data/lib/active_support/core_ext/file.rb +1 -0
- data/lib/active_support/core_ext/file/atomic.rb +3 -2
- data/lib/active_support/core_ext/file/path.rb +5 -0
- data/lib/active_support/core_ext/float/rounding.rb +3 -2
- data/lib/active_support/core_ext/hash/conversions.rb +65 -145
- data/lib/active_support/core_ext/hash/deep_merge.rb +6 -7
- data/lib/active_support/core_ext/hash/except.rb +8 -1
- data/lib/active_support/core_ext/hash/indifferent_access.rb +5 -0
- data/lib/active_support/core_ext/hash/keys.rb +10 -11
- data/lib/active_support/core_ext/hash/slice.rb +6 -0
- data/lib/active_support/core_ext/integer.rb +1 -1
- data/lib/active_support/core_ext/integer/multiple.rb +6 -0
- data/lib/active_support/core_ext/kernel.rb +1 -1
- data/lib/active_support/core_ext/kernel/debugger.rb +3 -2
- data/lib/active_support/core_ext/kernel/reporting.rb +2 -1
- data/lib/active_support/core_ext/kernel/requires.rb +2 -2
- data/lib/active_support/core_ext/kernel/singleton_class.rb +13 -0
- data/lib/active_support/core_ext/load_error.rb +17 -30
- data/lib/active_support/core_ext/logger.rb +2 -40
- data/lib/active_support/core_ext/module.rb +5 -3
- data/lib/active_support/core_ext/module/aliasing.rb +1 -1
- data/lib/active_support/core_ext/module/anonymous.rb +24 -0
- data/lib/active_support/core_ext/module/attr_accessor_with_default.rb +1 -1
- data/lib/active_support/core_ext/module/attr_internal.rb +2 -2
- data/lib/active_support/core_ext/module/attribute_accessors.rb +20 -22
- data/lib/active_support/core_ext/module/delegation.rb +21 -10
- data/lib/active_support/core_ext/module/introspection.rb +8 -8
- data/lib/active_support/core_ext/module/method_names.rb +14 -0
- data/lib/active_support/core_ext/module/reachable.rb +10 -0
- data/lib/active_support/core_ext/module/remove_method.rb +11 -0
- data/lib/active_support/core_ext/module/synchronization.rb +2 -1
- data/lib/active_support/core_ext/name_error.rb +3 -1
- data/lib/active_support/core_ext/object.rb +5 -3
- data/lib/active_support/core_ext/object/blank.rb +20 -2
- data/lib/active_support/core_ext/object/conversions.rb +2 -16
- data/lib/active_support/core_ext/object/duplicable.rb +23 -1
- data/lib/active_support/core_ext/object/instance_variables.rb +0 -7
- data/lib/active_support/core_ext/object/to_json.rb +19 -0
- data/lib/active_support/core_ext/object/to_param.rb +49 -0
- data/lib/active_support/core_ext/object/to_query.rb +27 -0
- data/lib/active_support/core_ext/object/with_options.rb +2 -0
- data/lib/active_support/core_ext/proc.rb +4 -4
- data/lib/active_support/core_ext/range/overlaps.rb +1 -1
- data/lib/active_support/core_ext/regexp.rb +0 -22
- data/lib/active_support/core_ext/rexml.rb +4 -1
- data/lib/active_support/core_ext/string.rb +3 -2
- data/lib/active_support/core_ext/string/access.rb +4 -2
- data/lib/active_support/core_ext/string/conversions.rb +28 -1
- data/lib/active_support/core_ext/string/encoding.rb +11 -0
- data/lib/active_support/core_ext/string/exclude.rb +6 -0
- data/lib/active_support/core_ext/string/filters.rb +29 -0
- data/lib/active_support/core_ext/string/inflections.rb +12 -12
- data/lib/active_support/core_ext/string/interpolation.rb +2 -92
- data/lib/active_support/core_ext/string/multibyte.rb +16 -19
- data/lib/active_support/core_ext/string/output_safety.rb +101 -35
- data/lib/active_support/core_ext/string/starts_ends_with.rb +0 -14
- data/lib/active_support/core_ext/string/xchar.rb +1 -1
- data/lib/active_support/core_ext/time/calculations.rb +14 -7
- data/lib/active_support/core_ext/time/conversions.rb +1 -0
- data/lib/active_support/core_ext/time/marshal.rb +56 -0
- data/lib/active_support/core_ext/time/zones.rb +2 -5
- data/lib/active_support/core_ext/uri.rb +10 -4
- data/lib/active_support/dependencies.rb +200 -197
- data/lib/active_support/dependencies/autoload.rb +50 -0
- data/lib/active_support/deprecation/behaviors.rb +13 -9
- data/lib/active_support/deprecation/method_wrappers.rb +10 -9
- data/lib/active_support/deprecation/proxy_wrappers.rb +7 -0
- data/lib/active_support/deprecation/reporting.rb +5 -3
- data/lib/active_support/descendants_tracker.rb +43 -0
- data/lib/active_support/duration.rb +8 -4
- data/lib/active_support/file_update_checker.rb +36 -0
- data/lib/active_support/hash_with_indifferent_access.rb +9 -1
- data/lib/active_support/i18n.rb +9 -0
- data/lib/active_support/i18n_railtie.rb +81 -0
- data/lib/active_support/inflections.rb +1 -1
- data/lib/active_support/inflector.rb +4 -407
- data/lib/active_support/inflector/inflections.rb +211 -0
- data/lib/active_support/inflector/methods.rb +151 -0
- data/lib/active_support/inflector/transliterate.rb +97 -0
- data/lib/active_support/json/backends/jsongem.rb +12 -9
- data/lib/active_support/json/backends/yajl.rb +40 -0
- data/lib/active_support/json/backends/yaml.rb +1 -1
- data/lib/active_support/json/decoding.rb +17 -2
- data/lib/active_support/json/encoding.rb +48 -31
- data/lib/active_support/json/variable.rb +2 -4
- data/lib/active_support/lazy_load_hooks.rb +27 -0
- data/lib/active_support/locale/en.yml +5 -2
- data/lib/active_support/log_subscriber.rb +123 -0
- data/lib/active_support/log_subscriber/test_helper.rb +99 -0
- data/lib/active_support/memoizable.rb +1 -1
- data/lib/active_support/message_encryptor.rb +1 -0
- data/lib/active_support/message_verifier.rb +2 -1
- data/lib/active_support/multibyte.rb +8 -23
- data/lib/active_support/multibyte/chars.rb +213 -446
- data/lib/active_support/multibyte/unicode.rb +392 -0
- data/lib/active_support/multibyte/utils.rb +6 -7
- data/lib/active_support/notifications.rb +29 -122
- data/lib/active_support/notifications/fanout.rb +61 -0
- data/lib/active_support/notifications/instrumenter.rb +54 -0
- data/lib/active_support/ordered_hash.rb +59 -14
- data/lib/active_support/ordered_options.rb +6 -0
- data/lib/active_support/railtie.rb +60 -0
- data/lib/active_support/rescuable.rb +7 -4
- data/lib/active_support/ruby/shim.rb +4 -6
- data/lib/active_support/test_case.rb +2 -7
- data/lib/active_support/testing/assertions.rb +15 -0
- data/lib/active_support/testing/declarative.rb +1 -1
- data/lib/active_support/testing/isolation.rb +64 -17
- data/lib/active_support/testing/performance.rb +306 -335
- data/lib/active_support/testing/setup_and_teardown.rb +51 -29
- data/lib/active_support/time.rb +24 -3
- data/lib/active_support/time_with_zone.rb +10 -14
- data/lib/active_support/values/time_zone.rb +192 -234
- data/lib/active_support/values/unicode_tables.dat +0 -0
- data/lib/active_support/version.rb +3 -2
- data/lib/active_support/whiny_nil.rb +9 -7
- data/lib/active_support/xml_mini.rb +130 -1
- data/lib/active_support/xml_mini/jdom.rb +2 -0
- data/lib/active_support/xml_mini/libxml.rb +23 -86
- data/lib/active_support/xml_mini/libxmlsax.rb +85 -0
- data/lib/active_support/xml_mini/nokogiri.rb +27 -24
- data/lib/active_support/xml_mini/nokogirisax.rb +83 -0
- data/lib/active_support/xml_mini/rexml.rb +8 -2
- metadata +62 -195
- data/README +0 -43
- data/lib/active_support/autoload.rb +0 -28
- data/lib/active_support/core_ext/boolean.rb +0 -1
- data/lib/active_support/core_ext/boolean/conversions.rb +0 -11
- data/lib/active_support/core_ext/class/removal.rb +0 -53
- data/lib/active_support/core_ext/date.rb +0 -7
- data/lib/active_support/core_ext/date_time.rb +0 -5
- data/lib/active_support/core_ext/integer/even_odd.rb +0 -16
- data/lib/active_support/core_ext/kernel/daemonizing.rb +0 -7
- data/lib/active_support/core_ext/module/inclusion.rb +0 -30
- data/lib/active_support/core_ext/module/loading.rb +0 -23
- data/lib/active_support/core_ext/nil.rb +0 -1
- data/lib/active_support/core_ext/nil/conversions.rb +0 -5
- data/lib/active_support/core_ext/object/extending.rb +0 -80
- data/lib/active_support/core_ext/object/metaclass.rb +0 -13
- data/lib/active_support/core_ext/object/misc.rb +0 -3
- data/lib/active_support/core_ext/object/returning.rb +0 -42
- data/lib/active_support/core_ext/object/tap.rb +0 -16
- data/lib/active_support/core_ext/string/bytesize.rb +0 -5
- data/lib/active_support/core_ext/string/iterators.rb +0 -13
- data/lib/active_support/core_ext/symbol.rb +0 -1
- data/lib/active_support/core_ext/symbol/to_proc.rb +0 -14
- data/lib/active_support/core_ext/time.rb +0 -10
- data/lib/active_support/core_ext/time/marshal_with_utc_flag.rb +0 -22
- data/lib/active_support/deprecated_callbacks.rb +0 -283
- data/lib/active_support/multibyte/unicode_database.rb +0 -71
- data/lib/active_support/vendor.rb +0 -16
- data/lib/active_support/vendor/builder-2.1.2/lib/blankslate.rb +0 -113
- data/lib/active_support/vendor/builder-2.1.2/lib/builder.rb +0 -13
- data/lib/active_support/vendor/builder-2.1.2/lib/builder/blankslate.rb +0 -20
- data/lib/active_support/vendor/builder-2.1.2/lib/builder/css.rb +0 -250
- data/lib/active_support/vendor/builder-2.1.2/lib/builder/xchar.rb +0 -115
- data/lib/active_support/vendor/builder-2.1.2/lib/builder/xmlbase.rb +0 -139
- data/lib/active_support/vendor/builder-2.1.2/lib/builder/xmlevents.rb +0 -63
- data/lib/active_support/vendor/builder-2.1.2/lib/builder/xmlmarkup.rb +0 -328
- data/lib/active_support/vendor/i18n-0.1.3/MIT-LICENSE +0 -20
- data/lib/active_support/vendor/i18n-0.1.3/README.textile +0 -20
- data/lib/active_support/vendor/i18n-0.1.3/Rakefile +0 -5
- data/lib/active_support/vendor/i18n-0.1.3/i18n.gemspec +0 -27
- data/lib/active_support/vendor/i18n-0.1.3/lib/i18n.rb +0 -204
- data/lib/active_support/vendor/i18n-0.1.3/lib/i18n/backend/simple.rb +0 -215
- data/lib/active_support/vendor/i18n-0.1.3/lib/i18n/exceptions.rb +0 -53
- data/lib/active_support/vendor/i18n-0.1.3/test/all.rb +0 -5
- data/lib/active_support/vendor/i18n-0.1.3/test/i18n_exceptions_test.rb +0 -99
- data/lib/active_support/vendor/i18n-0.1.3/test/i18n_test.rb +0 -124
- data/lib/active_support/vendor/i18n-0.1.3/test/locale/en.rb +0 -1
- data/lib/active_support/vendor/i18n-0.1.3/test/locale/en.yml +0 -3
- data/lib/active_support/vendor/i18n-0.1.3/test/simple_backend_test.rb +0 -567
- data/lib/active_support/vendor/memcache-client-1.7.5/lib/memcache.rb +0 -1133
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo.rb +0 -33
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/data_timezone.rb +0 -47
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/data_timezone_info.rb +0 -228
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Africa/Algiers.rb +0 -55
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Africa/Cairo.rb +0 -219
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Africa/Casablanca.rb +0 -42
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Africa/Harare.rb +0 -18
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Africa/Johannesburg.rb +0 -25
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Africa/Monrovia.rb +0 -22
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Africa/Nairobi.rb +0 -23
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Argentina/Buenos_Aires.rb +0 -166
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Argentina/San_Juan.rb +0 -86
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Bogota.rb +0 -23
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Caracas.rb +0 -23
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Chicago.rb +0 -283
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Chihuahua.rb +0 -136
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Denver.rb +0 -204
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Godthab.rb +0 -161
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Guatemala.rb +0 -27
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Halifax.rb +0 -274
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Indiana/Indianapolis.rb +0 -149
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Juneau.rb +0 -194
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/La_Paz.rb +0 -22
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Lima.rb +0 -35
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Los_Angeles.rb +0 -232
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Mazatlan.rb +0 -139
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Mexico_City.rb +0 -144
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Monterrey.rb +0 -131
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/New_York.rb +0 -282
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Phoenix.rb +0 -30
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Regina.rb +0 -74
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Santiago.rb +0 -205
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Sao_Paulo.rb +0 -171
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/St_Johns.rb +0 -288
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/America/Tijuana.rb +0 -196
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Almaty.rb +0 -67
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Baghdad.rb +0 -73
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Baku.rb +0 -161
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Bangkok.rb +0 -20
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Chongqing.rb +0 -33
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Colombo.rb +0 -30
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Dhaka.rb +0 -27
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Hong_Kong.rb +0 -87
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Irkutsk.rb +0 -165
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Jakarta.rb +0 -30
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Jerusalem.rb +0 -163
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Kabul.rb +0 -20
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Kamchatka.rb +0 -163
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Karachi.rb +0 -32
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Kathmandu.rb +0 -20
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Kolkata.rb +0 -25
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Krasnoyarsk.rb +0 -163
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Kuala_Lumpur.rb +0 -31
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Kuwait.rb +0 -18
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Magadan.rb +0 -163
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Muscat.rb +0 -18
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Novosibirsk.rb +0 -164
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Rangoon.rb +0 -24
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Riyadh.rb +0 -18
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Seoul.rb +0 -34
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Shanghai.rb +0 -35
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Singapore.rb +0 -33
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Taipei.rb +0 -59
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Tashkent.rb +0 -47
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Tbilisi.rb +0 -78
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Tehran.rb +0 -121
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Tokyo.rb +0 -30
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Ulaanbaatar.rb +0 -65
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Urumqi.rb +0 -33
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Vladivostok.rb +0 -164
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Yakutsk.rb +0 -163
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Yekaterinburg.rb +0 -165
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Asia/Yerevan.rb +0 -165
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Atlantic/Azores.rb +0 -270
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Atlantic/Cape_Verde.rb +0 -23
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Atlantic/South_Georgia.rb +0 -18
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Australia/Adelaide.rb +0 -187
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Australia/Brisbane.rb +0 -35
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Australia/Darwin.rb +0 -29
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Australia/Hobart.rb +0 -193
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Australia/Melbourne.rb +0 -185
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Australia/Perth.rb +0 -37
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Australia/Sydney.rb +0 -185
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Etc/UTC.rb +0 -16
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Amsterdam.rb +0 -228
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Athens.rb +0 -185
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Belgrade.rb +0 -163
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Berlin.rb +0 -188
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Bratislava.rb +0 -13
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Brussels.rb +0 -232
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Bucharest.rb +0 -181
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Budapest.rb +0 -197
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Copenhagen.rb +0 -179
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Dublin.rb +0 -276
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Helsinki.rb +0 -163
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Istanbul.rb +0 -218
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Kiev.rb +0 -168
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Lisbon.rb +0 -268
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Ljubljana.rb +0 -13
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/London.rb +0 -288
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Madrid.rb +0 -211
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Minsk.rb +0 -170
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Moscow.rb +0 -181
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Paris.rb +0 -232
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Prague.rb +0 -187
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Riga.rb +0 -176
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Rome.rb +0 -215
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Sarajevo.rb +0 -13
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Skopje.rb +0 -13
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Sofia.rb +0 -173
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Stockholm.rb +0 -165
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Tallinn.rb +0 -172
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Vienna.rb +0 -183
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Vilnius.rb +0 -170
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Warsaw.rb +0 -212
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Europe/Zagreb.rb +0 -13
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Auckland.rb +0 -202
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Fiji.rb +0 -23
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Guam.rb +0 -22
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Honolulu.rb +0 -28
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Majuro.rb +0 -20
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Midway.rb +0 -25
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Noumea.rb +0 -25
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Pago_Pago.rb +0 -26
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Port_Moresby.rb +0 -20
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/definitions/Pacific/Tongatapu.rb +0 -27
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/info_timezone.rb +0 -52
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/linked_timezone.rb +0 -51
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/linked_timezone_info.rb +0 -44
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/offset_rationals.rb +0 -98
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/ruby_core_support.rb +0 -56
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/time_or_datetime.rb +0 -292
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/timezone.rb +0 -508
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/timezone_definition.rb +0 -56
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/timezone_info.rb +0 -40
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/timezone_offset_info.rb +0 -94
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/timezone_period.rb +0 -198
- data/lib/active_support/vendor/tzinfo-0.3.13/lib/tzinfo/timezone_transition_info.rb +0 -129
@@ -2,7 +2,10 @@ require 'active_support/core_ext/kernel/reporting'
|
|
2
2
|
|
3
3
|
# Fixes the rexml vulnerability disclosed at:
|
4
4
|
# http://www.ruby-lang.org/en/news/2008/08/23/dos-vulnerability-in-rexml/
|
5
|
-
# This fix is identical to rexml-expansion-fix version 1.0.1
|
5
|
+
# This fix is identical to rexml-expansion-fix version 1.0.1.
|
6
|
+
#
|
7
|
+
# We still need to distribute this fix because albeit the REXML
|
8
|
+
# in recent 1.8.7s is patched, it wasn't in early patchlevels.
|
6
9
|
require 'rexml/rexml'
|
7
10
|
|
8
11
|
# Earlier versions of rexml defined REXML::Version, newer ones REXML::VERSION
|
@@ -4,8 +4,9 @@ require 'active_support/core_ext/string/multibyte'
|
|
4
4
|
require 'active_support/core_ext/string/starts_ends_with'
|
5
5
|
require 'active_support/core_ext/string/inflections'
|
6
6
|
require 'active_support/core_ext/string/access'
|
7
|
-
require 'active_support/core_ext/string/iterators'
|
8
7
|
require 'active_support/core_ext/string/xchar'
|
9
8
|
require 'active_support/core_ext/string/behavior'
|
10
9
|
require 'active_support/core_ext/string/interpolation'
|
11
|
-
require 'active_support/core_ext/string/output_safety'
|
10
|
+
require 'active_support/core_ext/string/output_safety'
|
11
|
+
require 'active_support/core_ext/string/exclude'
|
12
|
+
require 'active_support/core_ext/string/encoding'
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require "active_support/multibyte"
|
2
|
+
|
1
3
|
class String
|
2
4
|
unless '1.9'.respond_to?(:force_encoding)
|
3
5
|
# Returns the character at the +position+ treating the string as an array (where 0 is the first character).
|
@@ -5,7 +7,7 @@ class String
|
|
5
7
|
# Examples:
|
6
8
|
# "hello".at(0) # => "h"
|
7
9
|
# "hello".at(4) # => "o"
|
8
|
-
# "hello".at(10) # => nil
|
10
|
+
# "hello".at(10) # => ERROR if < 1.9, nil in 1.9
|
9
11
|
def at(position)
|
10
12
|
mb_chars[position, 1].to_s
|
11
13
|
end
|
@@ -15,7 +17,7 @@ class String
|
|
15
17
|
# Examples:
|
16
18
|
# "hello".from(0) # => "hello"
|
17
19
|
# "hello".from(2) # => "llo"
|
18
|
-
# "hello".from(10) # => nil
|
20
|
+
# "hello".from(10) # => "" if < 1.9, nil in 1.9
|
19
21
|
def from(position)
|
20
22
|
mb_chars[position..-1].to_s
|
21
23
|
end
|
@@ -1,24 +1,51 @@
|
|
1
1
|
require 'date'
|
2
|
+
require 'active_support/core_ext/time/publicize_conversion_methods'
|
2
3
|
require 'active_support/core_ext/time/calculations'
|
3
4
|
|
4
5
|
class String
|
5
|
-
#
|
6
|
+
# Returns the codepoint of the first character of the string, assuming a
|
7
|
+
# single-byte character encoding:
|
8
|
+
#
|
9
|
+
# "a".ord # => 97
|
10
|
+
# "à".ord # => 224, in ISO-8859-1
|
11
|
+
#
|
12
|
+
# This method is defined in Ruby 1.8 for Ruby 1.9 forward compatibility on
|
13
|
+
# these character encodings.
|
14
|
+
#
|
15
|
+
# <tt>ActiveSupport::Multibyte::Chars#ord</tt> is forward compatible with
|
16
|
+
# Ruby 1.9 on UTF8 strings:
|
17
|
+
#
|
18
|
+
# "a".mb_chars.ord # => 97
|
19
|
+
# "à".mb_chars.ord # => 224, in UTF8
|
20
|
+
#
|
21
|
+
# Note that the 224 is different in both examples. In ISO-8859-1 "à" is
|
22
|
+
# represented as a single byte, 224. In UTF8 it is represented with two
|
23
|
+
# bytes, namely 195 and 160, but its Unicode codepoint is 224. If we
|
24
|
+
# call +ord+ on the UTF8 string "à" the return value will be 195. That is
|
25
|
+
# not an error, because UTF8 is unsupported, the call itself would be
|
26
|
+
# bogus.
|
6
27
|
def ord
|
7
28
|
self[0]
|
8
29
|
end unless method_defined?(:ord)
|
9
30
|
|
31
|
+
# +getbyte+ backport from Ruby 1.9
|
32
|
+
alias_method :getbyte, :[] unless method_defined?(:getbyte)
|
33
|
+
|
10
34
|
# Form can be either :utc (default) or :local.
|
11
35
|
def to_time(form = :utc)
|
36
|
+
return nil if self.blank?
|
12
37
|
d = ::Date._parse(self, false).values_at(:year, :mon, :mday, :hour, :min, :sec, :sec_fraction).map { |arg| arg || 0 }
|
13
38
|
d[6] *= 1000000
|
14
39
|
::Time.send("#{form}_time", *d)
|
15
40
|
end
|
16
41
|
|
17
42
|
def to_date
|
43
|
+
return nil if self.blank?
|
18
44
|
::Date.new(*::Date._parse(self, false).values_at(:year, :mon, :mday))
|
19
45
|
end
|
20
46
|
|
21
47
|
def to_datetime
|
48
|
+
return nil if self.blank?
|
22
49
|
d = ::Date._parse(self, false).values_at(:year, :mon, :mday, :hour, :min, :sec, :zone, :sec_fraction).map { |arg| arg || 0 }
|
23
50
|
d[5] += d.pop
|
24
51
|
::DateTime.civil(*d)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'active_support/core_ext/string/multibyte'
|
2
|
+
|
1
3
|
class String
|
2
4
|
# Returns the string, first removing all whitespace on both ends of
|
3
5
|
# the string, and then changing remaining consecutive whitespace
|
@@ -17,4 +19,31 @@ class String
|
|
17
19
|
gsub!(/\s+/, ' ')
|
18
20
|
self
|
19
21
|
end
|
22
|
+
|
23
|
+
# Truncates a given +text+ after a given <tt>length</tt> if +text+ is longer than <tt>length</tt>:
|
24
|
+
#
|
25
|
+
# "Once upon a time in a world far far away".truncate(27)
|
26
|
+
# # => "Once upon a time in a wo..."
|
27
|
+
#
|
28
|
+
# The last characters will be replaced with the <tt>:omission</tt> string (defaults to "...")
|
29
|
+
# for a total length not exceeding <tt>:length</tt>:
|
30
|
+
#
|
31
|
+
# "Once upon a time in a world far far away".truncate(27, :separator => ' ')
|
32
|
+
# # => "Once upon a time in a..."
|
33
|
+
#
|
34
|
+
# Pass a <tt>:separator</tt> to truncate +text+ at a natural break:
|
35
|
+
#
|
36
|
+
# "And they found that many people were sleeping better.".truncate(25, :omission => "... (continued)")
|
37
|
+
# # => "And they f... (continued)"
|
38
|
+
def truncate(length, options = {})
|
39
|
+
text = self.dup
|
40
|
+
options[:omission] ||= "..."
|
41
|
+
|
42
|
+
length_with_room_for_omission = length - options[:omission].mb_chars.length
|
43
|
+
chars = text.mb_chars
|
44
|
+
stop = options[:separator] ?
|
45
|
+
(chars.rindex(options[:separator].mb_chars, length_with_room_for_omission) || length_with_room_for_omission) : length_with_room_for_omission
|
46
|
+
|
47
|
+
(chars.length > length ? chars[0...stop] + options[:omission] : text).to_s
|
48
|
+
end
|
20
49
|
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
# For instance, you can figure out the name of a database from the name of a class.
|
3
3
|
#
|
4
4
|
# "ScaleScore".tableize # => "scale_scores"
|
5
|
-
|
5
|
+
#
|
6
6
|
class String
|
7
7
|
# Returns the plural form of the word in the string.
|
8
8
|
#
|
@@ -28,6 +28,17 @@ class String
|
|
28
28
|
ActiveSupport::Inflector.singularize(self)
|
29
29
|
end
|
30
30
|
|
31
|
+
# +constantize+ tries to find a declared constant with the name specified
|
32
|
+
# in the string. It raises a NameError when the name is not in CamelCase
|
33
|
+
# or is not initialized.
|
34
|
+
#
|
35
|
+
# Examples
|
36
|
+
# "Module".constantize # => Module
|
37
|
+
# "Class".constantize # => Class
|
38
|
+
def constantize
|
39
|
+
ActiveSupport::Inflector.constantize(self)
|
40
|
+
end
|
41
|
+
|
31
42
|
# By default, +camelize+ converts strings to UpperCamelCase. If the argument to camelize
|
32
43
|
# is set to <tt>:lower</tt> then camelize produces lowerCamelCase.
|
33
44
|
#
|
@@ -146,15 +157,4 @@ class String
|
|
146
157
|
def foreign_key(separate_class_name_and_id_with_underscore = true)
|
147
158
|
ActiveSupport::Inflector.foreign_key(self, separate_class_name_and_id_with_underscore)
|
148
159
|
end
|
149
|
-
|
150
|
-
# +constantize+ tries to find a declared constant with the name specified
|
151
|
-
# in the string. It raises a NameError when the name is not in CamelCase
|
152
|
-
# or is not initialized.
|
153
|
-
#
|
154
|
-
# Examples
|
155
|
-
# "Module".constantize # => Module
|
156
|
-
# "Class".constantize # => Class
|
157
|
-
def constantize
|
158
|
-
ActiveSupport::Inflector.constantize(self)
|
159
|
-
end
|
160
160
|
end
|
@@ -1,92 +1,2 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
http://github.com/mutoh/gettext/blob/f6566738b981fe0952548c421042ad1e0cdfb31e/lib/gettext/core_ext/string.rb
|
4
|
-
Copyright (C) 2005-2009 Masao Mutoh
|
5
|
-
You may redistribute it and/or modify it under the same license terms as Ruby.
|
6
|
-
=end
|
7
|
-
|
8
|
-
if RUBY_VERSION < '1.9'
|
9
|
-
require 'active_support/core_ext/string/bytesize'
|
10
|
-
|
11
|
-
# KeyError is raised by String#% when the string contains a named placeholder
|
12
|
-
# that is not contained in the given arguments hash. Ruby 1.9 includes and
|
13
|
-
# raises this exception natively. We define it to mimic Ruby 1.9's behaviour
|
14
|
-
# in Ruby 1.8.x
|
15
|
-
|
16
|
-
class KeyError < IndexError
|
17
|
-
def initialize(message = nil)
|
18
|
-
super(message || "key not found")
|
19
|
-
end
|
20
|
-
end unless defined?(KeyError)
|
21
|
-
|
22
|
-
# Extension for String class. This feature is included in Ruby 1.9 or later but not occur TypeError.
|
23
|
-
#
|
24
|
-
# String#% method which accept "named argument". The translator can know
|
25
|
-
# the meaning of the msgids using "named argument" instead of %s/%d style.
|
26
|
-
|
27
|
-
class String
|
28
|
-
alias :interpolate_without_ruby_19_syntax :% # :nodoc:
|
29
|
-
|
30
|
-
INTERPOLATION_PATTERN = Regexp.union(
|
31
|
-
/%%/,
|
32
|
-
/%\{(\w+)\}/, # matches placeholders like "%{foo}"
|
33
|
-
/%<(\w+)>(.*?\d*\.?\d*[bBdiouxXeEfgGcps])/ # matches placeholders like "%<foo>.d"
|
34
|
-
)
|
35
|
-
|
36
|
-
# % uses self (i.e. the String) as a format specification and returns the
|
37
|
-
# result of applying it to the given arguments. In other words it interpolates
|
38
|
-
# the given arguments to the string according to the formats the string
|
39
|
-
# defines.
|
40
|
-
#
|
41
|
-
# There are three ways to use it:
|
42
|
-
#
|
43
|
-
# * Using a single argument or Array of arguments.
|
44
|
-
#
|
45
|
-
# This is the default behaviour of the String class. See Kernel#sprintf for
|
46
|
-
# more details about the format string.
|
47
|
-
#
|
48
|
-
# Example:
|
49
|
-
#
|
50
|
-
# "%d %s" % [1, "message"]
|
51
|
-
# # => "1 message"
|
52
|
-
#
|
53
|
-
# * Using a Hash as an argument and unformatted, named placeholders.
|
54
|
-
#
|
55
|
-
# When you pass a Hash as an argument and specify placeholders with %{foo}
|
56
|
-
# it will interpret the hash values as named arguments.
|
57
|
-
#
|
58
|
-
# Example:
|
59
|
-
#
|
60
|
-
# "%{firstname}, %{lastname}" % {:firstname => "Masao", :lastname => "Mutoh"}
|
61
|
-
# # => "Masao Mutoh"
|
62
|
-
#
|
63
|
-
# * Using a Hash as an argument and formatted, named placeholders.
|
64
|
-
#
|
65
|
-
# When you pass a Hash as an argument and specify placeholders with %<foo>d
|
66
|
-
# it will interpret the hash values as named arguments and format the value
|
67
|
-
# according to the formatting instruction appended to the closing >.
|
68
|
-
#
|
69
|
-
# Example:
|
70
|
-
#
|
71
|
-
# "%<integer>d, %<float>.1f" % { :integer => 10, :float => 43.4 }
|
72
|
-
# # => "10, 43.3"
|
73
|
-
def %(args)
|
74
|
-
if args.kind_of?(Hash)
|
75
|
-
dup.gsub(INTERPOLATION_PATTERN) do |match|
|
76
|
-
if match == '%%'
|
77
|
-
'%'
|
78
|
-
else
|
79
|
-
key = ($1 || $2).to_sym
|
80
|
-
raise KeyError unless args.has_key?(key)
|
81
|
-
$3 ? sprintf("%#{$3}", args[key]) : args[key]
|
82
|
-
end
|
83
|
-
end
|
84
|
-
elsif self =~ INTERPOLATION_PATTERN
|
85
|
-
raise ArgumentError.new('one hash required')
|
86
|
-
else
|
87
|
-
result = gsub(/%([{<])/, '%%\1')
|
88
|
-
result.send :'interpolate_without_ruby_19_syntax', args
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
1
|
+
require 'active_support/i18n'
|
2
|
+
require 'i18n/core_ext/string/interpolate'
|
@@ -2,7 +2,7 @@
|
|
2
2
|
require 'active_support/multibyte'
|
3
3
|
|
4
4
|
class String
|
5
|
-
|
5
|
+
if RUBY_VERSION >= "1.9"
|
6
6
|
# == Multibyte proxy
|
7
7
|
#
|
8
8
|
# +mb_chars+ is a multibyte safe proxy for string methods.
|
@@ -37,30 +37,13 @@ class String
|
|
37
37
|
# For more information about the methods defined on the Chars proxy see ActiveSupport::Multibyte::Chars. For
|
38
38
|
# information about how to change the default Multibyte behaviour see ActiveSupport::Multibyte.
|
39
39
|
def mb_chars
|
40
|
-
if ActiveSupport::Multibyte.proxy_class.
|
40
|
+
if ActiveSupport::Multibyte.proxy_class.consumes?(self)
|
41
41
|
ActiveSupport::Multibyte.proxy_class.new(self)
|
42
42
|
else
|
43
43
|
self
|
44
44
|
end
|
45
45
|
end
|
46
|
-
|
47
|
-
# Returns true if the string has UTF-8 semantics (a String used for purely byte resources is unlikely to have
|
48
|
-
# them), returns false otherwise.
|
49
|
-
def is_utf8?
|
50
|
-
ActiveSupport::Multibyte::Chars.consumes?(self)
|
51
|
-
end
|
52
46
|
|
53
|
-
unless '1.8.7 and later'.respond_to?(:chars)
|
54
|
-
def chars
|
55
|
-
ActiveSupport::Deprecation.warn('String#chars has been deprecated in favor of String#mb_chars.', caller)
|
56
|
-
mb_chars
|
57
|
-
end
|
58
|
-
end
|
59
|
-
else
|
60
|
-
def mb_chars #:nodoc
|
61
|
-
self
|
62
|
-
end
|
63
|
-
|
64
47
|
def is_utf8? #:nodoc
|
65
48
|
case encoding
|
66
49
|
when Encoding::UTF_8
|
@@ -71,5 +54,19 @@ class String
|
|
71
54
|
false
|
72
55
|
end
|
73
56
|
end
|
57
|
+
else
|
58
|
+
def mb_chars
|
59
|
+
if ActiveSupport::Multibyte.proxy_class.wants?(self)
|
60
|
+
ActiveSupport::Multibyte.proxy_class.new(self)
|
61
|
+
else
|
62
|
+
self
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# Returns true if the string has UTF-8 semantics (a String used for purely byte resources is unlikely to have
|
67
|
+
# them), returns false otherwise.
|
68
|
+
def is_utf8?
|
69
|
+
ActiveSupport::Multibyte::Chars.consumes?(self)
|
70
|
+
end
|
74
71
|
end
|
75
72
|
end
|
@@ -1,43 +1,109 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
require 'erb'
|
2
|
+
require 'active_support/core_ext/kernel/singleton_class'
|
3
|
+
|
4
|
+
class ERB
|
5
|
+
module Util
|
6
|
+
HTML_ESCAPE = { '&' => '&', '>' => '>', '<' => '<', '"' => '"' }
|
7
|
+
JSON_ESCAPE = { '&' => '\u0026', '>' => '\u003E', '<' => '\u003C' }
|
8
|
+
|
9
|
+
# A utility method for escaping HTML tag characters.
|
10
|
+
# This method is also aliased as <tt>h</tt>.
|
11
|
+
#
|
12
|
+
# In your ERb templates, use this method to escape any unsafe content. For example:
|
13
|
+
# <%=h @person.name %>
|
14
|
+
#
|
15
|
+
# ==== Example:
|
16
|
+
# puts html_escape("is a > 0 & a < 10?")
|
17
|
+
# # => is a > 0 & a < 10?
|
18
|
+
def html_escape(s)
|
19
|
+
s = s.to_s
|
20
|
+
if s.html_safe?
|
21
|
+
s
|
22
|
+
else
|
23
|
+
s.gsub(/[&"><]/) { |special| HTML_ESCAPE[special] }.html_safe
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
remove_method(:h)
|
28
|
+
alias h html_escape
|
29
|
+
|
30
|
+
module_function :h
|
31
|
+
|
32
|
+
singleton_class.send(:remove_method, :html_escape)
|
33
|
+
module_function :html_escape
|
34
|
+
|
35
|
+
# A utility method for escaping HTML entities in JSON strings.
|
36
|
+
# This method is also aliased as <tt>j</tt>.
|
37
|
+
#
|
38
|
+
# In your ERb templates, use this method to escape any HTML entities:
|
39
|
+
# <%=j @person.to_json %>
|
40
|
+
#
|
41
|
+
# ==== Example:
|
42
|
+
# puts json_escape("is a > 0 & a < 10?")
|
43
|
+
# # => is a \u003E 0 \u0026 a \u003C 10?
|
44
|
+
def json_escape(s)
|
45
|
+
s.to_s.gsub(/[&"><]/) { |special| JSON_ESCAPE[special] }
|
46
|
+
end
|
47
|
+
|
48
|
+
alias j json_escape
|
49
|
+
module_function :j
|
50
|
+
module_function :json_escape
|
4
51
|
end
|
52
|
+
end
|
5
53
|
|
6
|
-
|
7
|
-
|
8
|
-
|
54
|
+
class Object
|
55
|
+
def html_safe?
|
56
|
+
false
|
9
57
|
end
|
10
|
-
|
11
|
-
|
12
|
-
|
58
|
+
end
|
59
|
+
|
60
|
+
class Fixnum
|
61
|
+
def html_safe?
|
62
|
+
true
|
13
63
|
end
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
64
|
+
end
|
65
|
+
|
66
|
+
module ActiveSupport #:nodoc:
|
67
|
+
class SafeBuffer < String
|
68
|
+
alias safe_concat concat
|
69
|
+
|
70
|
+
def concat(value)
|
71
|
+
if value.html_safe?
|
72
|
+
super(value)
|
73
|
+
else
|
74
|
+
super(ERB::Util.h(value))
|
75
|
+
end
|
76
|
+
end
|
77
|
+
alias << concat
|
78
|
+
|
79
|
+
def +(other)
|
80
|
+
dup.concat(other)
|
81
|
+
end
|
82
|
+
|
83
|
+
def html_safe?
|
84
|
+
true
|
85
|
+
end
|
86
|
+
|
87
|
+
def html_safe
|
88
|
+
self
|
89
|
+
end
|
90
|
+
|
91
|
+
def to_s
|
92
|
+
self
|
93
|
+
end
|
94
|
+
|
95
|
+
def to_yaml(*args)
|
96
|
+
to_str.to_yaml(*args)
|
22
97
|
end
|
23
98
|
end
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
@_rails_html_safe = false
|
30
|
-
end
|
31
|
-
result
|
99
|
+
end
|
100
|
+
|
101
|
+
class String
|
102
|
+
def html_safe!
|
103
|
+
raise "You can't call html_safe! on a String"
|
32
104
|
end
|
33
|
-
|
34
|
-
def
|
35
|
-
self
|
105
|
+
|
106
|
+
def html_safe
|
107
|
+
ActiveSupport::SafeBuffer.new(self)
|
36
108
|
end
|
37
|
-
|
38
|
-
private
|
39
|
-
def also_html_safe?(other)
|
40
|
-
other.respond_to?(:html_safe?) && other.html_safe?
|
41
|
-
end
|
42
|
-
|
43
|
-
end
|
109
|
+
end
|