summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authortenderlove <tenderlove@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-12-12 17:47:29 +0000
committertenderlove <tenderlove@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-12-12 17:47:29 +0000
commita7c2faebb0b4d564653c1d0cdc11f6da881c2bb4 (patch)
tree7b077428bb11ecd037917bc5b39a093644ff07a4 /ext
parent83d1eebb71cbce708cce9c23b3ccb69cf8bb4470 (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.rb8
-rw-r--r--ext/psych/lib/psych/nodes/node.rb3
-rw-r--r--ext/psych/lib/psych/scalar_scanner.rb17
-rw-r--r--ext/psych/lib/psych/visitors/to_ruby.rb10
-rw-r--r--ext/psych/lib/psych/visitors/yaml_tree.rb39
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