зеркало из https://github.com/github/ruby.git
* ext/psych/lib/psych/visitors/to_ruby.rb(visit_Psych_Nodes_Scalar):
teaching Psych to deserialize DateTime objects. [Bug #1390] * ext/psych/lib/psych/visitors/yaml_tree.rb(visit_DateTime): added a method for serializing DateTime objects. * ext/psych/lib/psych/scalar_scanner.rb(parse_time): add method for parsing times objects from a string. * test/psych/test_date_time.rb: tests for dumping DateTime objects. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@28532 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
6fe92a3cd6
Коммит
59cad45f99
13
ChangeLog
13
ChangeLog
|
@ -1,3 +1,16 @@
|
||||||
|
Sat Jul 3 09:47:26 2010 Aaron Patterson <aaron@tenderlovemaking.com>
|
||||||
|
|
||||||
|
* ext/psych/lib/psych/visitors/to_ruby.rb(visit_Psych_Nodes_Scalar):
|
||||||
|
teaching Psych to deserialize DateTime objects. [Bug #1390]
|
||||||
|
|
||||||
|
* ext/psych/lib/psych/visitors/yaml_tree.rb(visit_DateTime): added a
|
||||||
|
method for serializing DateTime objects.
|
||||||
|
|
||||||
|
* ext/psych/lib/psych/scalar_scanner.rb(parse_time): add method for
|
||||||
|
parsing times objects from a string.
|
||||||
|
|
||||||
|
* test/psych/test_date_time.rb: tests for dumping DateTime objects.
|
||||||
|
|
||||||
Sat Jul 3 09:13:55 2010 Aaron Patterson <aaron@tenderlovemaking.com>
|
Sat Jul 3 09:13:55 2010 Aaron Patterson <aaron@tenderlovemaking.com>
|
||||||
|
|
||||||
* ext/psych/lib/psych/visitors/yaml_tree.rb (visit_Time): use
|
* ext/psych/lib/psych/visitors/yaml_tree.rb (visit_Time): use
|
||||||
|
|
|
@ -39,19 +39,7 @@ module Psych
|
||||||
string
|
string
|
||||||
end
|
end
|
||||||
when TIME
|
when TIME
|
||||||
date, time = *(string.split(/[ tT]/, 2))
|
parse_time string
|
||||||
(yy, m, dd) = date.split('-').map { |x| x.to_i }
|
|
||||||
md = time.match(/(\d+:\d+:\d+)(\.\d*)?\s*(Z|[-+]\d+(:\d\d)?)?/)
|
|
||||||
|
|
||||||
(hh, mm, ss) = md[1].split(':').map { |x| x.to_i }
|
|
||||||
us = (md[2] ? Rational(md[2].sub(/^\./, '0.')) : 0) * 1000000
|
|
||||||
|
|
||||||
time = Time.utc(yy, m, dd, hh, mm, ss, us)
|
|
||||||
|
|
||||||
return time if 'Z' == md[3]
|
|
||||||
|
|
||||||
tz = md[3] ? Integer(md[3].split(':').first.sub(/([-+])0/, '\1')) : 0
|
|
||||||
Time.at((time - (tz * 3600)).to_i, us)
|
|
||||||
when /^\d{4}-\d{1,2}-\d{1,2}$/
|
when /^\d{4}-\d{1,2}-\d{1,2}$/
|
||||||
require 'date'
|
require 'date'
|
||||||
Date.strptime(string, '%Y-%m-%d')
|
Date.strptime(string, '%Y-%m-%d')
|
||||||
|
@ -86,5 +74,23 @@ module Psych
|
||||||
string
|
string
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
###
|
||||||
|
# Parse and return a Time from +string+
|
||||||
|
def parse_time string
|
||||||
|
date, time = *(string.split(/[ tT]/, 2))
|
||||||
|
(yy, m, dd) = date.split('-').map { |x| x.to_i }
|
||||||
|
md = time.match(/(\d+:\d+:\d+)(\.\d*)?\s*(Z|[-+]\d+(:\d\d)?)?/)
|
||||||
|
|
||||||
|
(hh, mm, ss) = md[1].split(':').map { |x| x.to_i }
|
||||||
|
us = (md[2] ? Rational(md[2].sub(/^\./, '0.')) : 0) * 1000000
|
||||||
|
|
||||||
|
time = Time.utc(yy, m, dd, hh, mm, ss, us)
|
||||||
|
|
||||||
|
return time if 'Z' == md[3]
|
||||||
|
|
||||||
|
tz = md[3] ? Integer(md[3].split(':').first.sub(/([-+])0/, '\1')) : 0
|
||||||
|
Time.at((time - (tz * 3600)).to_i, us)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -50,6 +50,9 @@ module Psych
|
||||||
o.value.unpack('m').first
|
o.value.unpack('m').first
|
||||||
when '!str', 'tag:yaml.org,2002:str'
|
when '!str', 'tag:yaml.org,2002:str'
|
||||||
o.value
|
o.value
|
||||||
|
when "!ruby/object:DateTime"
|
||||||
|
require 'date'
|
||||||
|
@ss.parse_time(o.value).to_datetime
|
||||||
when "!ruby/object:Complex"
|
when "!ruby/object:Complex"
|
||||||
Complex(o.value)
|
Complex(o.value)
|
||||||
when "!ruby/object:Rational"
|
when "!ruby/object:Rational"
|
||||||
|
|
|
@ -135,6 +135,19 @@ module Psych
|
||||||
@emitter.scalar o.inspect, nil, '!ruby/regexp', false, false, Nodes::Scalar::ANY
|
@emitter.scalar o.inspect, nil, '!ruby/regexp', false, false, Nodes::Scalar::ANY
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def visit_DateTime o
|
||||||
|
o = o.to_time
|
||||||
|
formatted = o.strftime("%Y-%m-%d %H:%M:%S")
|
||||||
|
if o.utc?
|
||||||
|
formatted += ".%06dZ" % [o.nsec]
|
||||||
|
else
|
||||||
|
formatted += ".%06d %+.2d:00" % [o.nsec, o.gmt_offset / 3600]
|
||||||
|
end
|
||||||
|
|
||||||
|
tag = '!ruby/object:DateTime'
|
||||||
|
@emitter.scalar formatted, nil, tag, false, false, Nodes::Scalar::ANY
|
||||||
|
end
|
||||||
|
|
||||||
def visit_Time o
|
def visit_Time o
|
||||||
formatted = o.strftime("%Y-%m-%d %H:%M:%S")
|
formatted = o.strftime("%Y-%m-%d %H:%M:%S")
|
||||||
if o.utc?
|
if o.utc?
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
require_relative 'helper'
|
||||||
|
require 'date'
|
||||||
|
|
||||||
|
module Psych
|
||||||
|
class TestDateTime < TestCase
|
||||||
|
def test_string_tag
|
||||||
|
dt = DateTime.now
|
||||||
|
yaml = Psych.dump dt
|
||||||
|
assert_match(/DateTime/, yaml)
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_round_trip
|
||||||
|
dt = DateTime.now
|
||||||
|
assert_cycle dt
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Загрузка…
Ссылка в новой задаче