diff options
author | tenderlove <tenderlove@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-12-12 17:47:29 +0000 |
---|---|---|
committer | tenderlove <tenderlove@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-12-12 17:47:29 +0000 |
commit | a7c2faebb0b4d564653c1d0cdc11f6da881c2bb4 (patch) | |
tree | 7b077428bb11ecd037917bc5b39a093644ff07a4 /ext | |
parent | 83d1eebb71cbce708cce9c23b3ccb69cf8bb4470 (diff) |
merge revision(s) 33160,33381,33382,33383,33384,33385:
* ext/psych/lib/psych.rb: update psych version.
* ext/psych/psych.gemspec: generate new gemspec for new version.
* ext/psych/lib/psych.rb: calling `yaml` rather than `to_yaml`.
* ext/psych/lib/psych/nodes/node.rb: Rename `to_yaml` to just `yaml`
in order to avoid YAML::ENGINE switching from replacing this method.
* test/psych/helper.rb: fix tests for method name change.
* test/psych/test_document.rb: ditto
* test/psych/visitors/test_emitter.rb: ditto
* ext/psych/lib/psych/scalar_scanner.rb: Match values against the
floating point spec defined in YAML to avoid erronious parses.
* test/psych/test_numeric.rb: corresponding test.
* ext/psych/lib/psych/visitors/to_ruby.rb: ToRuby visitor can be
constructed with a ScalarScanner.
* ext/psych/lib/psych/visitors/yaml_tree.rb: ScalarScanner can be
passed to the YAMLTree visitor.
* ext/psych/lib/psych/visitors/to_ruby.rb: Define Regexp::NOENCODING
for 1.9.2 backwards compatibility.
* ext/psych/lib/psych/visitors/yaml_tree.rb: Fix Date string
generation for 1.9.2 backwards compatibility.
* ext/psych/lib/psych/visitors/yaml_tree.rb: emit strings tagged as
ascii-8bit as binary in YAML.
* test/psych/test_string.rb: corresponding test.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_3@34017 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext')
-rw-r--r-- | ext/psych/lib/psych.rb | 8 | ||||
-rw-r--r-- | ext/psych/lib/psych/nodes/node.rb | 3 | ||||
-rw-r--r-- | ext/psych/lib/psych/scalar_scanner.rb | 17 | ||||
-rw-r--r-- | ext/psych/lib/psych/visitors/to_ruby.rb | 10 | ||||
-rw-r--r-- | ext/psych/lib/psych/visitors/yaml_tree.rb | 39 |
5 files changed, 59 insertions, 18 deletions
diff --git a/ext/psych/lib/psych.rb b/ext/psych/lib/psych.rb index 9507bbb53b..f9052f92a4 100644 --- a/ext/psych/lib/psych.rb +++ b/ext/psych/lib/psych.rb @@ -90,7 +90,7 @@ require 'psych/json' module Psych # The version is Psych you're using - VERSION = '1.2.1' + VERSION = '1.2.2' # The version of libyaml Psych is using LIBYAML_VERSION = Psych.libyaml_version.join '.' @@ -187,7 +187,7 @@ module Psych visitor = Psych::Visitors::YAMLTree.new options visitor << o - visitor.tree.to_yaml io, options + visitor.tree.yaml io, options end ### @@ -201,7 +201,7 @@ module Psych objects.each do |o| visitor << o end - visitor.tree.to_yaml + visitor.tree.yaml end ### @@ -209,7 +209,7 @@ module Psych def self.to_json o visitor = Psych::Visitors::JSONTree.new visitor << o - visitor.tree.to_yaml + visitor.tree.yaml end ### diff --git a/ext/psych/lib/psych/nodes/node.rb b/ext/psych/lib/psych/nodes/node.rb index 2a5573a2bd..0cefe44e44 100644 --- a/ext/psych/lib/psych/nodes/node.rb +++ b/ext/psych/lib/psych/nodes/node.rb @@ -40,13 +40,14 @@ module Psych # Convert this node to YAML. # # See also Psych::Visitors::Emitter - def to_yaml io = nil, options = {} + def yaml io = nil, options = {} real_io = io || StringIO.new(''.encode('utf-8')) Visitors::Emitter.new(real_io, options).accept self return real_io.string unless io io end + alias :to_yaml :yaml end end end diff --git a/ext/psych/lib/psych/scalar_scanner.rb b/ext/psych/lib/psych/scalar_scanner.rb index 29d66ee4cc..3e8acbb21c 100644 --- a/ext/psych/lib/psych/scalar_scanner.rb +++ b/ext/psych/lib/psych/scalar_scanner.rb @@ -7,6 +7,12 @@ module Psych # Taken from http://yaml.org/type/timestamp.html TIME = /^\d{4}-\d{1,2}-\d{1,2}([Tt]|\s+)\d{1,2}:\d\d:\d\d(\.\d*)?(\s*Z|[-+]\d{1,2}(:\d\d)?)?/ + # Taken from http://yaml.org/type/float.html + FLOAT = /^(?:[-+]?([0-9][0-9_,]*)?\.[0-9.]*([eE][-+][0-9]+)?(?# base 10) + |[-+]?[0-9][0-9_,]*(:[0-5]?[0-9])+\.[0-9_]*(?# base 60) + |[-+]?\.(inf|Inf|INF)(?# infinity) + |\.(nan|NaN|NAN)(?# not a number))$/x + # Create a new scanner def initialize @string_cache = {} @@ -67,9 +73,16 @@ module Psych i += (n.to_f * 60 ** (e - 2).abs) end i - else - return Integer(string.gsub(/[,_]/, '')) rescue ArgumentError + when FLOAT return Float(string.gsub(/[,_]/, '')) rescue ArgumentError + + @string_cache[string] = true + string + else + if string.count('.') < 2 + return Integer(string.gsub(/[,_]/, '')) rescue ArgumentError + end + @string_cache[string] = true string end diff --git a/ext/psych/lib/psych/visitors/to_ruby.rb b/ext/psych/lib/psych/visitors/to_ruby.rb index b8eb698754..ca046c5da9 100644 --- a/ext/psych/lib/psych/visitors/to_ruby.rb +++ b/ext/psych/lib/psych/visitors/to_ruby.rb @@ -1,14 +1,18 @@ require 'psych/scalar_scanner' +unless defined?(Regexp::NOENCODING) + Regexp::NOENCODING = 32 +end + module Psych module Visitors ### # This class walks a YAML AST, converting each node to ruby class ToRuby < Psych::Visitors::Visitor - def initialize - super + def initialize ss = ScalarScanner.new + super() @st = {} - @ss = ScalarScanner.new + @ss = ss @domain_types = Psych.domain_types end diff --git a/ext/psych/lib/psych/visitors/yaml_tree.rb b/ext/psych/lib/psych/visitors/yaml_tree.rb index eef6125ff1..5a092850c3 100644 --- a/ext/psych/lib/psych/visitors/yaml_tree.rb +++ b/ext/psych/lib/psych/visitors/yaml_tree.rb @@ -12,13 +12,13 @@ module Psych alias :finished? :finished alias :started? :started - def initialize options = {}, emitter = Psych::TreeBuilder.new + def initialize options = {}, emitter = TreeBuilder.new, ss = ScalarScanner.new super() @started = false @finished = false @emitter = emitter @st = {} - @ss = ScalarScanner.new + @ss = ss @options = options @dispatch_cache = Hash.new do |h,klass| @@ -214,12 +214,19 @@ module Psych end end + def binary? string + string.encoding == Encoding::ASCII_8BIT || + string.index("\x00") || + string.count("\x00-\x7F", "^ -~\t\r\n").fdiv(string.length) > 0.3 + end + private :binary? + def visit_String o plain = false quote = false style = Nodes::Scalar::ANY - if o.index("\x00") || o.count("\x00-\x7F", "^ -~\t\r\n").fdiv(o.length) > 0.3 + if binary?(o) str = [o].pack('m').chomp tag = '!binary' # FIXME: change to below when syck is removed #tag = 'tag:yaml.org,2002:binary' @@ -304,11 +311,27 @@ module Psych end private - def format_time time - if time.utc? - time.strftime("%Y-%m-%d %H:%M:%S.%9N Z") - else - time.strftime("%Y-%m-%d %H:%M:%S.%9N %:z") + # '%:z' was no defined until 1.9.3 + if RUBY_VERSION < '1.9.3' + def format_time time + formatted = time.strftime("%Y-%m-%d %H:%M:%S.%9N") + + if time.utc? + formatted += " Z" + else + zone = time.strftime('%z') + formatted += " #{zone[0,3]}:#{zone[3,5]}" + end + + formatted + end + else + def format_time time + if time.utc? + time.strftime("%Y-%m-%d %H:%M:%S.%9N Z") + else + time.strftime("%Y-%m-%d %H:%M:%S.%9N %:z") + end end end |