mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* lib/soap/streamHandler.rb: drop unused http parameters.
* lib/soap/encodingstyle/soapHandler.rb, lib/soap/mapping/factory.rb, lib/soap/mapping/mapping.rb, lib/soap/mapping/registry.rb, lib/wsdl/soap/complexType.rb: ApacheSOAP's map support was broken under WSDL dynanic client environment. fixed. * test/wsdl/raa/*: add tests. * lib/xsd/datatypes.rb: dateTime precision bug fix (at least, I hope.) bug of soap4r. XSDDateTimeImple.to_time passed a Float to Time.local/Time.gm as an usec, and NUM2LONG(rb_num2long for Float) causes rounding error. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@5045 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
a017b0cc8a
commit
42bca643c3
18 changed files with 256 additions and 95 deletions
18
ChangeLog
18
ChangeLog
|
@ -1,3 +1,21 @@
|
||||||
|
Fri Nov 28 14:41:52 2003 NAKAMURA, Hiroshi <nahi@ruby-lang.org>
|
||||||
|
|
||||||
|
* lib/soap/streamHandler.rb: drop unused http parameters.
|
||||||
|
|
||||||
|
* lib/soap/encodingstyle/soapHandler.rb, lib/soap/mapping/factory.rb,
|
||||||
|
lib/soap/mapping/mapping.rb, lib/soap/mapping/registry.rb,
|
||||||
|
lib/wsdl/soap/complexType.rb: ApacheSOAP's map support was broken
|
||||||
|
under WSDL dynanic client environment. fixed.
|
||||||
|
|
||||||
|
* test/wsdl/raa/*: add tests.
|
||||||
|
|
||||||
|
* lib/xsd/datatypes.rb: dateTime precision bug fix (at least, I hope.)
|
||||||
|
bug of soap4r. XSDDateTimeImple.to_time passed a Float to
|
||||||
|
Time.local/Time.gm as an usec, and NUM2LONG(rb_num2long for Float)
|
||||||
|
causes rounding error.
|
||||||
|
|
||||||
|
* test/soap/test_basetype.rb, test/xsd/test_xsd.rb: add tests.
|
||||||
|
|
||||||
Fri Nov 28 04:15:24 2003 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
Fri Nov 28 04:15:24 2003 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
* eval.c (method_arity): used wrong Proc object. [ruby-talk:86504]
|
* eval.c (method_arity): used wrong Proc object. [ruby-talk:86504]
|
||||||
|
|
3
MANIFEST
3
MANIFEST
|
@ -731,8 +731,9 @@ test/wsdl/axisArray/test_axisarray.rb
|
||||||
test/wsdl/emptycomplextype.wsdl
|
test/wsdl/emptycomplextype.wsdl
|
||||||
test/wsdl/raa/RAA.rb
|
test/wsdl/raa/RAA.rb
|
||||||
test/wsdl/raa/README.txt
|
test/wsdl/raa/README.txt
|
||||||
|
test/wsdl/raa/RAAServant.rb
|
||||||
|
test/wsdl/raa/RAAService.rb
|
||||||
test/wsdl/raa/raa.wsdl
|
test/wsdl/raa/raa.wsdl
|
||||||
test/wsdl/raa/server.rb
|
|
||||||
test/wsdl/raa/test_raa.rb
|
test/wsdl/raa/test_raa.rb
|
||||||
test/wsdl/test_emptycomplextype.rb
|
test/wsdl/test_emptycomplextype.rb
|
||||||
test/xsd/test_xmlschemaparser.rb
|
test/xsd/test_xmlschemaparser.rb
|
||||||
|
|
|
@ -162,8 +162,6 @@ class SOAPHandler < Handler
|
||||||
o = SOAPReference.decode(elename, href)
|
o = SOAPReference.decode(elename, href)
|
||||||
@refpool << o
|
@refpool << o
|
||||||
elsif @decode_typemap
|
elsif @decode_typemap
|
||||||
# to parse multi-ref element with decode_tag_by_type.
|
|
||||||
# && (parent.node.class != SOAPBody || @is_first_top_ele)
|
|
||||||
o = decode_tag_by_wsdl(ns, elename, type, parent.node, arytype, extraattr)
|
o = decode_tag_by_wsdl(ns, elename, type, parent.node, arytype, extraattr)
|
||||||
else
|
else
|
||||||
o = decode_tag_by_type(ns, elename, type, parent.node, arytype, extraattr)
|
o = decode_tag_by_type(ns, elename, type, parent.node, arytype, extraattr)
|
||||||
|
@ -333,6 +331,7 @@ private
|
||||||
|
|
||||||
def decode_tag_by_wsdl(ns, elename, typestr, parent, arytypestr, extraattr)
|
def decode_tag_by_wsdl(ns, elename, typestr, parent, arytypestr, extraattr)
|
||||||
o = nil
|
o = nil
|
||||||
|
# should branch by root attribute?
|
||||||
if parent.class == SOAPBody
|
if parent.class == SOAPBody
|
||||||
if @is_first_top_ele
|
if @is_first_top_ele
|
||||||
# Unqualified name is allowed here.
|
# Unqualified name is allowed here.
|
||||||
|
@ -363,11 +362,12 @@ private
|
||||||
extraattr)
|
extraattr)
|
||||||
end
|
end
|
||||||
|
|
||||||
# parent.definedtype is nil means the parent is SOAPUnknown. SOAPUnknown is
|
# parent.definedtype == nil means the parent is SOAPUnknown. SOAPUnknown
|
||||||
# generated by decode_tag_by_type when its type is anyType.
|
# is generated by decode_tag_by_type when its type is anyType.
|
||||||
parenttype = parent.definedtype || @decode_typemap[parent.type]
|
parenttype = parent.definedtype || @decode_typemap[parent.type]
|
||||||
unless parenttype
|
unless parenttype
|
||||||
raise EncodingStyleError.new("Unknown type '#{ parent.type }'.")
|
return decode_tag_by_type(ns, elename, typestr, parent, arytypestr,
|
||||||
|
extraattr)
|
||||||
end
|
end
|
||||||
|
|
||||||
definedtype_name = parenttype.child_type(elename)
|
definedtype_name = parenttype.child_type(elename)
|
||||||
|
|
|
@ -356,15 +356,22 @@ class HashFactory_ < Factory
|
||||||
unless node.type == MapQName
|
unless node.type == MapQName
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
if node.key?('default')
|
if node.class == SOAPStruct and node.key?('default')
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
obj = create_empty_object(obj_class)
|
obj = create_empty_object(obj_class)
|
||||||
mark_unmarshalled_obj(node, obj)
|
mark_unmarshalled_obj(node, obj)
|
||||||
|
if node.class == SOAPStruct
|
||||||
node.each do |key, value|
|
node.each do |key, value|
|
||||||
obj[Mapping._soap2obj(value['key'], map)] =
|
obj[Mapping._soap2obj(value['key'], map)] =
|
||||||
Mapping._soap2obj(value['value'], map)
|
Mapping._soap2obj(value['value'], map)
|
||||||
end
|
end
|
||||||
|
else
|
||||||
|
node.each do |value|
|
||||||
|
obj[Mapping._soap2obj(value['key'], map)] =
|
||||||
|
Mapping._soap2obj(value['value'], map)
|
||||||
|
end
|
||||||
|
end
|
||||||
return true, obj
|
return true, obj
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -77,9 +77,10 @@ module Mapping
|
||||||
end
|
end
|
||||||
if detail.is_a?(Mapping::SOAPException)
|
if detail.is_a?(Mapping::SOAPException)
|
||||||
begin
|
begin
|
||||||
|
remote_backtrace = detail.to_e.backtrace
|
||||||
raise detail.to_e
|
raise detail.to_e
|
||||||
rescue Exception => e2
|
rescue Exception => e2
|
||||||
detail.set_backtrace(e2)
|
e2.set_backtrace(remote_backtrace + e2.backtrace)
|
||||||
raise
|
raise
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
|
|
|
@ -34,11 +34,9 @@ RubyIVarName = XSD::QName.new(RubyTypeInstanceNamespace, 'ivars')
|
||||||
|
|
||||||
# Inner class to pass an exception.
|
# Inner class to pass an exception.
|
||||||
class SOAPException; include Marshallable
|
class SOAPException; include Marshallable
|
||||||
attr_reader :excn_type_name, :message, :backtrace, :cause
|
attr_reader :excn_type_name, :cause
|
||||||
def initialize(e)
|
def initialize(e)
|
||||||
@excn_type_name = Mapping.name2elename(e.class.to_s)
|
@excn_type_name = Mapping.name2elename(e.class.to_s)
|
||||||
@message = e.message
|
|
||||||
@backtrace = e.backtrace
|
|
||||||
@cause = e
|
@cause = e
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -50,25 +48,15 @@ class SOAPException; include Marshallable
|
||||||
klass = Mapping.class_from_name(
|
klass = Mapping.class_from_name(
|
||||||
Mapping.elename2name(@excn_type_name.to_s))
|
Mapping.elename2name(@excn_type_name.to_s))
|
||||||
if klass.nil?
|
if klass.nil?
|
||||||
raise RuntimeError.new(@message)
|
raise RuntimeError.new(@cause.message)
|
||||||
end
|
end
|
||||||
unless klass <= ::Exception
|
unless klass <= ::Exception
|
||||||
raise NameError.new
|
raise NameError.new
|
||||||
end
|
end
|
||||||
obj = klass.new(@message)
|
obj = klass.new(@cause.message)
|
||||||
obj.extend(::SOAP::Mapping::MappedException)
|
obj.extend(::SOAP::Mapping::MappedException)
|
||||||
obj
|
obj
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_backtrace(e)
|
|
||||||
e.set_backtrace(
|
|
||||||
if @backtrace.is_a?(Array)
|
|
||||||
@backtrace
|
|
||||||
else
|
|
||||||
[@backtrace.inspect]
|
|
||||||
end
|
|
||||||
)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
@ -238,10 +226,12 @@ class Registry
|
||||||
[::String, ::SOAP::SOAPGMonth, BasetypeFactory],
|
[::String, ::SOAP::SOAPGMonth, BasetypeFactory],
|
||||||
[::String, ::SOAP::SOAPQName, BasetypeFactory],
|
[::String, ::SOAP::SOAPQName, BasetypeFactory],
|
||||||
|
|
||||||
|
[::Hash, ::SOAP::SOAPArray, HashFactory],
|
||||||
|
[::Hash, ::SOAP::SOAPStruct, HashFactory],
|
||||||
|
|
||||||
[::Array, ::SOAP::SOAPArray, ArrayFactory,
|
[::Array, ::SOAP::SOAPArray, ArrayFactory,
|
||||||
{:derived_class => true}],
|
{:derived_class => true}],
|
||||||
|
|
||||||
[::Hash, ::SOAP::SOAPStruct, HashFactory],
|
|
||||||
[::SOAP::Mapping::SOAPException,
|
[::SOAP::Mapping::SOAPException,
|
||||||
::SOAP::SOAPStruct, TypedStructFactory,
|
::SOAP::SOAPStruct, TypedStructFactory,
|
||||||
{:type => XSD::QName.new(RubyCustomTypeNamespace, "SOAPException")}],
|
{:type => XSD::QName.new(RubyCustomTypeNamespace, "SOAPException")}],
|
||||||
|
@ -282,10 +272,12 @@ class Registry
|
||||||
[::String, ::SOAP::SOAPGMonth, BasetypeFactory],
|
[::String, ::SOAP::SOAPGMonth, BasetypeFactory],
|
||||||
[::String, ::SOAP::SOAPQName, BasetypeFactory],
|
[::String, ::SOAP::SOAPQName, BasetypeFactory],
|
||||||
|
|
||||||
|
[::Hash, ::SOAP::SOAPArray, HashFactory],
|
||||||
|
[::Hash, ::SOAP::SOAPStruct, HashFactory],
|
||||||
|
|
||||||
# Does not allow Array's subclass here.
|
# Does not allow Array's subclass here.
|
||||||
[::Array, ::SOAP::SOAPArray, ArrayFactory],
|
[::Array, ::SOAP::SOAPArray, ArrayFactory],
|
||||||
|
|
||||||
[::Hash, ::SOAP::SOAPStruct, HashFactory],
|
|
||||||
[::SOAP::Mapping::SOAPException,
|
[::SOAP::Mapping::SOAPException,
|
||||||
::SOAP::SOAPStruct, TypedStructFactory,
|
::SOAP::SOAPStruct, TypedStructFactory,
|
||||||
{:type => XSD::QName.new(RubyCustomTypeNamespace, "SOAPException")}],
|
{:type => XSD::QName.new(RubyCustomTypeNamespace, "SOAPException")}],
|
||||||
|
|
|
@ -82,9 +82,6 @@ public
|
||||||
attr_reader :client
|
attr_reader :client
|
||||||
|
|
||||||
NofRetry = 10 # [times]
|
NofRetry = 10 # [times]
|
||||||
ConnectTimeout = 20 # [sec]
|
|
||||||
SendTimeout = 60 # [sec]
|
|
||||||
ReceiveTimeout = 60 # [sec]
|
|
||||||
|
|
||||||
def initialize(endpoint_url, proxy = nil, charset = nil)
|
def initialize(endpoint_url, proxy = nil, charset = nil)
|
||||||
super(endpoint_url)
|
super(endpoint_url)
|
||||||
|
@ -93,9 +90,6 @@ public
|
||||||
@wiredump_dev = nil # Set an IO to get wiredump.
|
@wiredump_dev = nil # Set an IO to get wiredump.
|
||||||
@wiredump_file_base = nil
|
@wiredump_file_base = nil
|
||||||
@client = Client.new(@proxy, "SOAP4R/#{ Version }")
|
@client = Client.new(@proxy, "SOAP4R/#{ Version }")
|
||||||
@client.session_manager.connect_timeout = ConnectTimeout
|
|
||||||
@client.session_manager.send_timeout = SendTimeout
|
|
||||||
@client.session_manager.receive_timeout = ReceiveTimeout
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def inspect
|
def inspect
|
||||||
|
|
|
@ -48,14 +48,23 @@ class ComplexType < Info
|
||||||
end
|
end
|
||||||
|
|
||||||
def child_defined_complextype(name)
|
def child_defined_complextype(name)
|
||||||
unless compoundtype == :TYPE_STRUCT
|
ele = nil
|
||||||
raise RuntimeError.new("Assert: not for struct")
|
case compoundtype
|
||||||
end
|
when :TYPE_STRUCT
|
||||||
unless ele = find_element(name)
|
unless ele = find_element(name)
|
||||||
if name.namespace.nil?
|
if name.namespace.nil?
|
||||||
ele = find_element_by_name(name.name)
|
ele = find_element_by_name(name.name)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
when :TYPE_ARRAY
|
||||||
|
if content.elements.size == 1
|
||||||
|
ele = content.elements[0]
|
||||||
|
else
|
||||||
|
raise RuntimeError.new("Assert: must not reach.")
|
||||||
|
end
|
||||||
|
else
|
||||||
|
raise RuntimeError.new("Assert: Not implemented.")
|
||||||
|
end
|
||||||
unless ele
|
unless ele
|
||||||
raise RuntimeError.new("Cannot find #{name} as a children of #{@name}.")
|
raise RuntimeError.new("Cannot find #{name} as a children of #{@name}.")
|
||||||
end
|
end
|
||||||
|
@ -83,10 +92,13 @@ class ComplexType < Info
|
||||||
private
|
private
|
||||||
|
|
||||||
def content_arytype
|
def content_arytype
|
||||||
arytype = find_arytype
|
if arytype = find_arytype
|
||||||
ns = arytype.namespace
|
ns = arytype.namespace
|
||||||
name = arytype.name.sub(/\[(?:,)*\]$/, '')
|
name = arytype.name.sub(/\[(?:,)*\]$/, '')
|
||||||
XSD::QName.new(ns, name)
|
XSD::QName.new(ns, name)
|
||||||
|
else
|
||||||
|
nil
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -162,7 +162,6 @@ class XSDString < XSDAnySimpleType
|
||||||
def initialize(value = nil)
|
def initialize(value = nil)
|
||||||
super()
|
super()
|
||||||
@type = Type
|
@type = Type
|
||||||
@encoding = nil
|
|
||||||
set(value) if value
|
set(value) if value
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -254,6 +253,7 @@ private
|
||||||
end
|
end
|
||||||
|
|
||||||
@data = _to_s
|
@data = _to_s
|
||||||
|
@data.freeze
|
||||||
end
|
end
|
||||||
|
|
||||||
# 0.0 -> 0; right?
|
# 0.0 -> 0; right?
|
||||||
|
@ -440,6 +440,7 @@ private
|
||||||
@min = $7.to_i
|
@min = $7.to_i
|
||||||
@sec = $8 ? XSDDecimal.new($8) : 0
|
@sec = $8 ? XSDDecimal.new($8) : 0
|
||||||
@data = _to_s
|
@data = _to_s
|
||||||
|
@data.freeze
|
||||||
end
|
end
|
||||||
|
|
||||||
def _to_s
|
def _to_s
|
||||||
|
@ -476,11 +477,11 @@ module XSDDateTimeImpl
|
||||||
begin
|
begin
|
||||||
if @data.offset * SecInDay == Time.now.utc_offset
|
if @data.offset * SecInDay == Time.now.utc_offset
|
||||||
d = @data
|
d = @data
|
||||||
usec = (d.sec_fraction * SecInDay * 1000000).to_f
|
usec = (d.sec_fraction * SecInDay * 1000000).round
|
||||||
Time.local(d.year, d.month, d.mday, d.hour, d.min, d.sec, usec)
|
Time.local(d.year, d.month, d.mday, d.hour, d.min, d.sec, usec)
|
||||||
else
|
else
|
||||||
d = @data.newof
|
d = @data.newof
|
||||||
usec = (d.sec_fraction * SecInDay * 1000000).to_f
|
usec = (d.sec_fraction * SecInDay * 1000000).round
|
||||||
Time.gm(d.year, d.month, d.mday, d.hour, d.min, d.sec, usec)
|
Time.gm(d.year, d.month, d.mday, d.hour, d.min, d.sec, usec)
|
||||||
end
|
end
|
||||||
rescue ArgumentError
|
rescue ArgumentError
|
||||||
|
@ -516,6 +517,7 @@ module XSDDateTimeImpl
|
||||||
end
|
end
|
||||||
|
|
||||||
def _set(t)
|
def _set(t)
|
||||||
|
set_datetime_init(t)
|
||||||
if (t.is_a?(Date))
|
if (t.is_a?(Date))
|
||||||
@data = t
|
@data = t
|
||||||
elsif (t.is_a?(Time))
|
elsif (t.is_a?(Time))
|
||||||
|
@ -541,11 +543,16 @@ class XSDDateTime < XSDAnySimpleType
|
||||||
def initialize(value = nil)
|
def initialize(value = nil)
|
||||||
super()
|
super()
|
||||||
@type = Type
|
@type = Type
|
||||||
|
@secfrac = nil
|
||||||
set(value) if value
|
set(value) if value
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def set_datetime_init(t)
|
||||||
|
@secfrac = nil
|
||||||
|
end
|
||||||
|
|
||||||
def set_str(t)
|
def set_str(t)
|
||||||
/^([+\-]?\d{4,})-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d(?:\.(\d*))?)(Z|(?:[+\-]\d\d:\d\d)?)?$/ =~ t.to_s.strip
|
/^([+\-]?\d{4,})-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d(?:\.(\d*))?)(Z|(?:[+\-]\d\d:\d\d)?)?$/ =~ t.to_s.strip
|
||||||
unless Regexp.last_match
|
unless Regexp.last_match
|
||||||
|
@ -568,6 +575,7 @@ private
|
||||||
zonestr = $8
|
zonestr = $8
|
||||||
|
|
||||||
@data = DateTime.civil(year, mon, mday, hour, min, sec, tz2of(zonestr))
|
@data = DateTime.civil(year, mon, mday, hour, min, sec, tz2of(zonestr))
|
||||||
|
@secfrac = secfrac
|
||||||
|
|
||||||
if secfrac
|
if secfrac
|
||||||
diffday = secfrac.to_i.to_r / (10 ** secfrac.size) / SecInDay
|
diffday = secfrac.to_i.to_r / (10 ** secfrac.size) / SecInDay
|
||||||
|
@ -588,10 +596,11 @@ private
|
||||||
s = format('%.4d-%02d-%02dT%02d:%02d:%02d',
|
s = format('%.4d-%02d-%02dT%02d:%02d:%02d',
|
||||||
year, @data.mon, @data.mday, @data.hour, @data.min, @data.sec)
|
year, @data.mon, @data.mday, @data.hour, @data.min, @data.sec)
|
||||||
if @data.sec_fraction.nonzero?
|
if @data.sec_fraction.nonzero?
|
||||||
fr = @data.sec_fraction * SecInDay
|
if @secfrac
|
||||||
shiftsize = fr.denominator.to_s.size + 1
|
s << ".#{ @secfrac }"
|
||||||
fr_s = (fr * (10 ** shiftsize)).to_i.to_s
|
else
|
||||||
s << '.' << '0' * (shiftsize - fr_s.size) << fr_s.sub(/0+$/, '')
|
s << sprintf("%.16f", (@data.sec_fraction * SecInDay).to_f).sub(/^0/, '').sub(/0*$/, '')
|
||||||
|
end
|
||||||
end
|
end
|
||||||
add_tz(s)
|
add_tz(s)
|
||||||
end
|
end
|
||||||
|
@ -604,11 +613,16 @@ class XSDTime < XSDAnySimpleType
|
||||||
def initialize(value = nil)
|
def initialize(value = nil)
|
||||||
super()
|
super()
|
||||||
@type = Type
|
@type = Type
|
||||||
|
@secfrac = nil
|
||||||
set(value) if value
|
set(value) if value
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def set_datetime_init(t)
|
||||||
|
@secfrac = nil
|
||||||
|
end
|
||||||
|
|
||||||
def set_str(t)
|
def set_str(t)
|
||||||
/^(\d\d):(\d\d):(\d\d(?:\.(\d*))?)(Z|(?:([+\-])(\d\d):(\d\d))?)?$/ =~ t.to_s.strip
|
/^(\d\d):(\d\d):(\d\d(?:\.(\d*))?)(Z|(?:([+\-])(\d\d):(\d\d))?)?$/ =~ t.to_s.strip
|
||||||
unless Regexp.last_match
|
unless Regexp.last_match
|
||||||
|
@ -622,19 +636,22 @@ private
|
||||||
zonestr = $5
|
zonestr = $5
|
||||||
|
|
||||||
@data = DateTime.civil(1, 1, 1, hour, min, sec, tz2of(zonestr))
|
@data = DateTime.civil(1, 1, 1, hour, min, sec, tz2of(zonestr))
|
||||||
|
@secfrac = secfrac
|
||||||
|
|
||||||
if secfrac
|
if secfrac
|
||||||
@data += secfrac.to_i.to_r / (10 ** secfrac.size) / SecInDay
|
diffday = secfrac.to_i.to_r / (10 ** secfrac.size) / SecInDay
|
||||||
|
@data += diffday
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def _to_s
|
def _to_s
|
||||||
s = format('%02d:%02d:%02d', @data.hour, @data.min, @data.sec)
|
s = format('%02d:%02d:%02d', @data.hour, @data.min, @data.sec)
|
||||||
if @data.sec_fraction.nonzero?
|
if @data.sec_fraction.nonzero?
|
||||||
fr = @data.sec_fraction * SecInDay
|
if @secfrac
|
||||||
shiftsize = fr.denominator.to_s.size + 1
|
s << ".#{ @secfrac }"
|
||||||
fr_s = (fr * (10 ** shiftsize)).to_i.to_s
|
else
|
||||||
s << '.' << '0' * (shiftsize - fr_s.size) << fr_s.sub(/0+$/, '')
|
s << sprintf("%.16f", (@data.sec_fraction * SecInDay).to_f).sub(/^0/, '').sub(/0*$/, '')
|
||||||
|
end
|
||||||
end
|
end
|
||||||
add_tz(s)
|
add_tz(s)
|
||||||
end
|
end
|
||||||
|
@ -652,6 +669,9 @@ class XSDDate < XSDAnySimpleType
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def set_datetime_init(t)
|
||||||
|
end
|
||||||
|
|
||||||
def set_str(t)
|
def set_str(t)
|
||||||
/^([+\-]?\d{4,})-(\d\d)-(\d\d)(Z|(?:([+\-])(\d\d):(\d\d))?)?$/ =~ t.to_s.strip
|
/^([+\-]?\d{4,})-(\d\d)-(\d\d)(Z|(?:([+\-])(\d\d):(\d\d))?)?$/ =~ t.to_s.strip
|
||||||
unless Regexp.last_match
|
unless Regexp.last_match
|
||||||
|
@ -688,6 +708,9 @@ class XSDGYearMonth < XSDAnySimpleType
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def set_datetime_init(t)
|
||||||
|
end
|
||||||
|
|
||||||
def set_str(t)
|
def set_str(t)
|
||||||
/^([+\-]?\d{4,})-(\d\d)(Z|(?:([+\-])(\d\d):(\d\d))?)?$/ =~ t.to_s.strip
|
/^([+\-]?\d{4,})-(\d\d)(Z|(?:([+\-])(\d\d):(\d\d))?)?$/ =~ t.to_s.strip
|
||||||
unless Regexp.last_match
|
unless Regexp.last_match
|
||||||
|
@ -723,6 +746,9 @@ class XSDGYear < XSDAnySimpleType
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def set_datetime_init(t)
|
||||||
|
end
|
||||||
|
|
||||||
def set_str(t)
|
def set_str(t)
|
||||||
/^([+\-]?\d{4,})(Z|(?:([+\-])(\d\d):(\d\d))?)?$/ =~ t.to_s.strip
|
/^([+\-]?\d{4,})(Z|(?:([+\-])(\d\d):(\d\d))?)?$/ =~ t.to_s.strip
|
||||||
unless Regexp.last_match
|
unless Regexp.last_match
|
||||||
|
@ -757,6 +783,9 @@ class XSDGMonthDay < XSDAnySimpleType
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def set_datetime_init(t)
|
||||||
|
end
|
||||||
|
|
||||||
def set_str(t)
|
def set_str(t)
|
||||||
/^(\d\d)-(\d\d)(Z|(?:[+\-]\d\d:\d\d)?)?$/ =~ t.to_s.strip
|
/^(\d\d)-(\d\d)(Z|(?:[+\-]\d\d:\d\d)?)?$/ =~ t.to_s.strip
|
||||||
unless Regexp.last_match
|
unless Regexp.last_match
|
||||||
|
@ -788,6 +817,9 @@ class XSDGDay < XSDAnySimpleType
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def set_datetime_init(t)
|
||||||
|
end
|
||||||
|
|
||||||
def set_str(t)
|
def set_str(t)
|
||||||
/^(\d\d)(Z|(?:[+\-]\d\d:\d\d)?)?$/ =~ t.to_s.strip
|
/^(\d\d)(Z|(?:[+\-]\d\d:\d\d)?)?$/ =~ t.to_s.strip
|
||||||
unless Regexp.last_match
|
unless Regexp.last_match
|
||||||
|
@ -818,6 +850,9 @@ class XSDGMonth < XSDAnySimpleType
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def set_datetime_init(t)
|
||||||
|
end
|
||||||
|
|
||||||
def set_str(t)
|
def set_str(t)
|
||||||
/^(\d\d)(Z|(?:[+\-]\d\d:\d\d)?)?$/ =~ t.to_s.strip
|
/^(\d\d)(Z|(?:[+\-]\d\d:\d\d)?)?$/ =~ t.to_s.strip
|
||||||
unless Regexp.last_match
|
unless Regexp.last_match
|
||||||
|
@ -935,6 +970,7 @@ private
|
||||||
@prefix = $1
|
@prefix = $1
|
||||||
@localpart = $2
|
@localpart = $2
|
||||||
@data = _to_s
|
@data = _to_s
|
||||||
|
@data.freeze
|
||||||
end
|
end
|
||||||
|
|
||||||
def _to_s
|
def _to_s
|
||||||
|
|
|
@ -38,6 +38,7 @@ AMAZON_WSDL = 'http://soap.amazon.com/schemas3/AmazonWebServices.wsdl'
|
||||||
amazon = SOAP::WSDLDriverFactory.new(AMAZON_WSDL).create_driver
|
amazon = SOAP::WSDLDriverFactory.new(AMAZON_WSDL).create_driver
|
||||||
p "WSDL loaded"
|
p "WSDL loaded"
|
||||||
amazon.generate_explicit_type = true
|
amazon.generate_explicit_type = true
|
||||||
|
amazon.mandatorycharset = 'utf-8' # AWS should fix this bug.
|
||||||
#amazon.wiredump_dev = STDERR
|
#amazon.wiredump_dev = STDERR
|
||||||
|
|
||||||
# Show sales rank.
|
# Show sales rank.
|
||||||
|
|
|
@ -369,7 +369,7 @@ module MarshalTestLib
|
||||||
class MyTime < Time; def initialize(v, *args) super(*args); @v = v; end end
|
class MyTime < Time; def initialize(v, *args) super(*args); @v = v; end end
|
||||||
def test_time
|
def test_time
|
||||||
# once there was a bug caused by usec overflow. try a little harder.
|
# once there was a bug caused by usec overflow. try a little harder.
|
||||||
10.times do
|
100.times do
|
||||||
t = Time.now
|
t = Time.now
|
||||||
marshal_equal(t, t.usec.to_s)
|
marshal_equal(t, t.usec.to_s)
|
||||||
end
|
end
|
||||||
|
|
|
@ -351,6 +351,8 @@ class TestSOAP < Test::Unit::TestCase
|
||||||
"2002-12-31T23:59:59-00:01",
|
"2002-12-31T23:59:59-00:01",
|
||||||
"2002-12-31T23:59:59-23:59",
|
"2002-12-31T23:59:59-23:59",
|
||||||
"2002-12-31T23:59:59.00000000000000000001+13:30",
|
"2002-12-31T23:59:59.00000000000000000001+13:30",
|
||||||
|
"2002-12-31T23:59:59.51375Z",
|
||||||
|
"2002-12-31T23:59:59.51345+12:34",
|
||||||
"-2002-05-18T16:52:20Z",
|
"-2002-05-18T16:52:20Z",
|
||||||
"-4711-12-31T23:59:59Z",
|
"-4711-12-31T23:59:59Z",
|
||||||
"-4713-01-01T12:00:00Z",
|
"-4713-01-01T12:00:00Z",
|
||||||
|
@ -414,6 +416,8 @@ class TestSOAP < Test::Unit::TestCase
|
||||||
"23:59:59-00:01",
|
"23:59:59-00:01",
|
||||||
"23:59:59-23:59",
|
"23:59:59-23:59",
|
||||||
"23:59:59.00000000000000000001+13:30",
|
"23:59:59.00000000000000000001+13:30",
|
||||||
|
"23:59:59.51375Z",
|
||||||
|
"23:59:59.51375+12:34",
|
||||||
"23:59:59+00:01",
|
"23:59:59+00:01",
|
||||||
]
|
]
|
||||||
targets.each do |str|
|
targets.each do |str|
|
||||||
|
|
|
@ -235,20 +235,9 @@ class StringArray < Array
|
||||||
end
|
end
|
||||||
|
|
||||||
# http://xml.apache.org/xml-soap
|
# http://xml.apache.org/xml-soap
|
||||||
class Map
|
class Map < Array
|
||||||
|
# Contents type should be dumped here...
|
||||||
@@schema_type = "Map"
|
@@schema_type = "Map"
|
||||||
@@schema_ns = "http://xml.apache.org/xml-soap"
|
@@schema_ns = "http://xml.apache.org/xml-soap"
|
||||||
|
|
||||||
def item
|
|
||||||
@item
|
|
||||||
end
|
|
||||||
|
|
||||||
def item=(value)
|
|
||||||
@item = value
|
|
||||||
end
|
|
||||||
|
|
||||||
def initialize(item = nil)
|
|
||||||
@item = item
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
99
test/wsdl/raa/RAAServant.rb
Normal file
99
test/wsdl/raa/RAAServant.rb
Normal file
|
@ -0,0 +1,99 @@
|
||||||
|
class RAABaseServicePortType
|
||||||
|
# SYNOPSIS
|
||||||
|
# getAllListings
|
||||||
|
#
|
||||||
|
# ARGS
|
||||||
|
# N/A
|
||||||
|
#
|
||||||
|
# RETURNS
|
||||||
|
# return StringArray - {http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/}StringArray
|
||||||
|
#
|
||||||
|
# RAISES
|
||||||
|
# (undefined)
|
||||||
|
#
|
||||||
|
def getAllListings
|
||||||
|
#raise NotImplementedError.new
|
||||||
|
["ruby", "soap4r"]
|
||||||
|
end
|
||||||
|
|
||||||
|
# SYNOPSIS
|
||||||
|
# getProductTree
|
||||||
|
#
|
||||||
|
# ARGS
|
||||||
|
# N/A
|
||||||
|
#
|
||||||
|
# RETURNS
|
||||||
|
# return Map - {http://xml.apache.org/xml-soap}Map
|
||||||
|
#
|
||||||
|
# RAISES
|
||||||
|
# (undefined)
|
||||||
|
#
|
||||||
|
def getProductTree
|
||||||
|
raise NotImplementedError.new
|
||||||
|
end
|
||||||
|
|
||||||
|
# SYNOPSIS
|
||||||
|
# getInfoFromCategory(category)
|
||||||
|
#
|
||||||
|
# ARGS
|
||||||
|
# category Category - {http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/}Category
|
||||||
|
#
|
||||||
|
# RETURNS
|
||||||
|
# return InfoArray - {http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/}InfoArray
|
||||||
|
#
|
||||||
|
# RAISES
|
||||||
|
# (undefined)
|
||||||
|
#
|
||||||
|
def getInfoFromCategory(category)
|
||||||
|
raise NotImplementedError.new
|
||||||
|
end
|
||||||
|
|
||||||
|
# SYNOPSIS
|
||||||
|
# getModifiedInfoSince(timeInstant)
|
||||||
|
#
|
||||||
|
# ARGS
|
||||||
|
# timeInstant - {http://www.w3.org/2001/XMLSchema}dateTime
|
||||||
|
#
|
||||||
|
# RETURNS
|
||||||
|
# return InfoArray - {http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/}InfoArray
|
||||||
|
#
|
||||||
|
# RAISES
|
||||||
|
# (undefined)
|
||||||
|
#
|
||||||
|
def getModifiedInfoSince(timeInstant)
|
||||||
|
raise NotImplementedError.new
|
||||||
|
end
|
||||||
|
|
||||||
|
# SYNOPSIS
|
||||||
|
# getInfoFromName(productName)
|
||||||
|
#
|
||||||
|
# ARGS
|
||||||
|
# productName - {http://www.w3.org/2001/XMLSchema}string
|
||||||
|
#
|
||||||
|
# RETURNS
|
||||||
|
# return Info - {http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/}Info
|
||||||
|
#
|
||||||
|
# RAISES
|
||||||
|
# (undefined)
|
||||||
|
#
|
||||||
|
def getInfoFromName(productName)
|
||||||
|
raise NotImplementedError.new
|
||||||
|
end
|
||||||
|
|
||||||
|
# SYNOPSIS
|
||||||
|
# getInfoFromOwnerId(ownerId)
|
||||||
|
#
|
||||||
|
# ARGS
|
||||||
|
# ownerId - {http://www.w3.org/2001/XMLSchema}int
|
||||||
|
#
|
||||||
|
# RETURNS
|
||||||
|
# return InfoArray - {http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/}InfoArray
|
||||||
|
#
|
||||||
|
# RAISES
|
||||||
|
# (undefined)
|
||||||
|
#
|
||||||
|
def getInfoFromOwnerId(ownerId)
|
||||||
|
raise NotImplementedError.new
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#!/usr/bin/env ruby
|
#!/usr/bin/env ruby
|
||||||
|
require 'RAAServant.rb'
|
||||||
|
|
||||||
require 'soap/rpc/standaloneServer'
|
require 'soap/rpc/standaloneServer'
|
||||||
require 'RAA.rb'
|
|
||||||
|
|
||||||
class RAABaseServicePortType
|
class RAABaseServicePortType
|
||||||
MappingRegistry = SOAP::Mapping::Registry.new
|
MappingRegistry = SOAP::Mapping::Registry.new
|
||||||
|
@ -13,9 +14,9 @@ class RAABaseServicePortType
|
||||||
)
|
)
|
||||||
MappingRegistry.set(
|
MappingRegistry.set(
|
||||||
Map,
|
Map,
|
||||||
::SOAP::SOAPStruct,
|
::SOAP::SOAPArray,
|
||||||
::SOAP::Mapping::Registry::TypedStructFactory,
|
::SOAP::Mapping::Registry::TypedArrayFactory,
|
||||||
{ :type => XSD::QName.new("http://xml.apache.org/xml-soap", "Map") }
|
{ :type => XSD::QName.new("http://www.w3.org/2001/XMLSchema", "anyType") }
|
||||||
)
|
)
|
||||||
MappingRegistry.set(
|
MappingRegistry.set(
|
||||||
Category,
|
Category,
|
||||||
|
@ -48,47 +49,38 @@ class RAABaseServicePortType
|
||||||
{ :type => XSD::QName.new("http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/", "Owner") }
|
{ :type => XSD::QName.new("http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/", "Owner") }
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
Methods = [
|
Methods = [
|
||||||
["getAllListings", "getAllListings", [
|
["getAllListings", "getAllListings", [
|
||||||
["retval", "return",
|
["retval", "return",
|
||||||
[::SOAP::SOAPArray, "http://www.w3.org/2001/XMLSchema", "string"]]],
|
[::SOAP::SOAPArray, "http://www.w3.org/2001/XMLSchema", "string"]]], "", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/"],
|
||||||
"", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/"],
|
|
||||||
["getProductTree", "getProductTree", [
|
["getProductTree", "getProductTree", [
|
||||||
["retval", "return",
|
["retval", "return",
|
||||||
[::SOAP::SOAPStruct, "http://xml.apache.org/xml-soap", "Map"]]],
|
[::SOAP::SOAPArray, "http://www.w3.org/2001/XMLSchema", "anyType"]]], "", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/"],
|
||||||
"", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/"],
|
|
||||||
["getInfoFromCategory", "getInfoFromCategory", [
|
["getInfoFromCategory", "getInfoFromCategory", [
|
||||||
["in", "category",
|
["in", "category",
|
||||||
[::SOAP::SOAPStruct, "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/", "Category"]],
|
[::SOAP::SOAPStruct, "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/", "Category"]],
|
||||||
["retval", "return",
|
["retval", "return",
|
||||||
[::SOAP::SOAPArray, "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/", "Info"]]],
|
[::SOAP::SOAPArray, "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/", "Info"]]], "", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/"],
|
||||||
"", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/"],
|
|
||||||
["getModifiedInfoSince", "getModifiedInfoSince", [
|
["getModifiedInfoSince", "getModifiedInfoSince", [
|
||||||
["in", "timeInstant",
|
["in", "timeInstant",
|
||||||
[SOAP::SOAPDateTime]],
|
[SOAP::SOAPDateTime]],
|
||||||
["retval", "return",
|
["retval", "return",
|
||||||
[::SOAP::SOAPArray, "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/", "Info"]]],
|
[::SOAP::SOAPArray, "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/", "Info"]]], "", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/"],
|
||||||
"", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/"],
|
|
||||||
["getInfoFromName", "getInfoFromName", [
|
["getInfoFromName", "getInfoFromName", [
|
||||||
["in", "productName",
|
["in", "productName",
|
||||||
[SOAP::SOAPString]],
|
[SOAP::SOAPString]],
|
||||||
["retval", "return",
|
["retval", "return",
|
||||||
[::SOAP::SOAPStruct, "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/", "Info"]]],
|
[::SOAP::SOAPStruct, "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/", "Info"]]], "", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/"],
|
||||||
"", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/"],
|
|
||||||
["getInfoFromOwnerId", "getInfoFromOwnerId", [
|
["getInfoFromOwnerId", "getInfoFromOwnerId", [
|
||||||
["in", "ownerId",
|
["in", "ownerId",
|
||||||
[SOAP::SOAPInt]],
|
[SOAP::SOAPInt]],
|
||||||
["retval", "return",
|
["retval", "return",
|
||||||
[::SOAP::SOAPArray, "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/", "Info"]]],
|
[::SOAP::SOAPArray, "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/", "Info"]]], "", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/"]
|
||||||
"", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.2/"]
|
|
||||||
]
|
]
|
||||||
|
|
||||||
def getAllListings
|
|
||||||
["ruby", "soap4r"]
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
class RAABaseServiceServer < SOAP::RPC::StandaloneServer
|
class App < SOAP::RPC::StandaloneServer
|
||||||
def initialize(*arg)
|
def initialize(*arg)
|
||||||
super
|
super
|
||||||
|
|
||||||
|
@ -102,3 +94,8 @@ class RAABaseServiceServer < SOAP::RPC::StandaloneServer
|
||||||
self.mapping_registry = RAABaseServicePortType::MappingRegistry
|
self.mapping_registry = RAABaseServicePortType::MappingRegistry
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Change listen port.
|
||||||
|
if $0 == __FILE__
|
||||||
|
App.new('app', nil, '0.0.0.0', 10080).start
|
||||||
|
end
|
|
@ -1,4 +1,7 @@
|
||||||
server.rb: based on RAAService.rb which is generated with the following command;
|
RAAServant.rb: based on the file which is generated with the following command;
|
||||||
|
bin/wsdl2ruby.rb --wsdl raa.wsdl --servant_skelton --force
|
||||||
|
|
||||||
|
RAAService.rb: generated with the following command;
|
||||||
bin/wsdl2ruby.rb --wsdl raa.wsdl --standalone_server_stub --force
|
bin/wsdl2ruby.rb --wsdl raa.wsdl --standalone_server_stub --force
|
||||||
|
|
||||||
RAA.rb: generated with the following command;
|
RAA.rb: generated with the following command;
|
||||||
|
|
|
@ -18,9 +18,11 @@ class TestRAA < Test::Unit::TestCase
|
||||||
|
|
||||||
def setup_server
|
def setup_server
|
||||||
$:.push(DIR)
|
$:.push(DIR)
|
||||||
require File.join(DIR, 'server.rb')
|
require File.join(DIR, 'RAA.rb')
|
||||||
|
require File.join(DIR, 'RAAServant.rb')
|
||||||
|
require File.join(DIR, 'RAAService.rb')
|
||||||
$:.delete(DIR)
|
$:.delete(DIR)
|
||||||
@server = RAABaseServiceServer.new('RAA server', nil, '0.0.0.0', Port)
|
@server = App.new('RAA server', nil, '0.0.0.0', Port)
|
||||||
@server.level = Logger::Severity::ERROR
|
@server.level = Logger::Severity::ERROR
|
||||||
@t = Thread.new {
|
@t = Thread.new {
|
||||||
Thread.current.abort_on_exception = true
|
Thread.current.abort_on_exception = true
|
||||||
|
|
|
@ -384,6 +384,9 @@ class TestXSD < Test::Unit::TestCase
|
||||||
"2002-12-31T23:59:59-00:01",
|
"2002-12-31T23:59:59-00:01",
|
||||||
"2002-12-31T23:59:59-23:59",
|
"2002-12-31T23:59:59-23:59",
|
||||||
"2002-12-31T23:59:59.00000000000000000001+13:30",
|
"2002-12-31T23:59:59.00000000000000000001+13:30",
|
||||||
|
"2002-12-31T23:59:59.5137Z",
|
||||||
|
"2002-12-31T23:59:59.51375Z", # 411/800
|
||||||
|
"2002-12-31T23:59:59.51375+12:34",
|
||||||
"-2002-05-18T16:52:20Z",
|
"-2002-05-18T16:52:20Z",
|
||||||
"-4713-01-01T12:00:00Z",
|
"-4713-01-01T12:00:00Z",
|
||||||
"-2002-12-31T23:59:59+00:01",
|
"-2002-12-31T23:59:59+00:01",
|
||||||
|
@ -445,6 +448,8 @@ class TestXSD < Test::Unit::TestCase
|
||||||
"23:59:59-00:01",
|
"23:59:59-00:01",
|
||||||
"23:59:59-23:59",
|
"23:59:59-23:59",
|
||||||
"23:59:59.00000000000000000001+13:30",
|
"23:59:59.00000000000000000001+13:30",
|
||||||
|
"23:59:59.51345Z",
|
||||||
|
"23:59:59.51345+12:34",
|
||||||
"23:59:59+00:01",
|
"23:59:59+00:01",
|
||||||
]
|
]
|
||||||
targets.each do |str|
|
targets.each do |str|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue