diff options
Diffstat (limited to 'ext/psych')
-rw-r--r-- | ext/psych/depend | 20 | ||||
-rw-r--r-- | ext/psych/extconf.rb | 41 | ||||
-rw-r--r-- | ext/psych/extlibs | 11 | ||||
-rw-r--r-- | ext/psych/lib/psych.rb | 56 | ||||
-rw-r--r-- | ext/psych/lib/psych/class_loader.rb | 2 | ||||
-rw-r--r-- | ext/psych/lib/psych/parser.rb | 13 | ||||
-rw-r--r-- | ext/psych/lib/psych/scalar_scanner.rb | 2 | ||||
-rw-r--r-- | ext/psych/lib/psych/tree_builder.rb | 4 | ||||
-rw-r--r-- | ext/psych/lib/psych/versions.rb | 4 | ||||
-rw-r--r-- | ext/psych/lib/psych/visitors/to_ruby.rb | 6 | ||||
-rw-r--r-- | ext/psych/lib/psych/visitors/yaml_tree.rb | 44 | ||||
-rw-r--r-- | ext/psych/psych.gemspec | 50 | ||||
-rw-r--r-- | ext/psych/psych_parser.c | 22 |
13 files changed, 132 insertions, 143 deletions
diff --git a/ext/psych/depend b/ext/psych/depend index 78bde9a53d..a4d9ca9a6a 100644 --- a/ext/psych/depend +++ b/ext/psych/depend @@ -67,6 +67,7 @@ psych.o: $(hdrdir)/ruby/internal/attr/noexcept.h psych.o: $(hdrdir)/ruby/internal/attr/noinline.h psych.o: $(hdrdir)/ruby/internal/attr/nonnull.h psych.o: $(hdrdir)/ruby/internal/attr/noreturn.h +psych.o: $(hdrdir)/ruby/internal/attr/packed_struct.h psych.o: $(hdrdir)/ruby/internal/attr/pure.h psych.o: $(hdrdir)/ruby/internal/attr/restrict.h psych.o: $(hdrdir)/ruby/internal/attr/returns_nonnull.h @@ -135,7 +136,6 @@ psych.o: $(hdrdir)/ruby/internal/intern/enumerator.h psych.o: $(hdrdir)/ruby/internal/intern/error.h psych.o: $(hdrdir)/ruby/internal/intern/eval.h psych.o: $(hdrdir)/ruby/internal/intern/file.h -psych.o: $(hdrdir)/ruby/internal/intern/gc.h psych.o: $(hdrdir)/ruby/internal/intern/hash.h psych.o: $(hdrdir)/ruby/internal/intern/io.h psych.o: $(hdrdir)/ruby/internal/intern/load.h @@ -166,12 +166,12 @@ psych.o: $(hdrdir)/ruby/internal/memory.h psych.o: $(hdrdir)/ruby/internal/method.h psych.o: $(hdrdir)/ruby/internal/module.h psych.o: $(hdrdir)/ruby/internal/newobj.h -psych.o: $(hdrdir)/ruby/internal/rgengc.h psych.o: $(hdrdir)/ruby/internal/scan_args.h psych.o: $(hdrdir)/ruby/internal/special_consts.h psych.o: $(hdrdir)/ruby/internal/static_assert.h psych.o: $(hdrdir)/ruby/internal/stdalign.h psych.o: $(hdrdir)/ruby/internal/stdbool.h +psych.o: $(hdrdir)/ruby/internal/stdckdint.h psych.o: $(hdrdir)/ruby/internal/symbol.h psych.o: $(hdrdir)/ruby/internal/value.h psych.o: $(hdrdir)/ruby/internal/value_type.h @@ -244,6 +244,7 @@ psych_emitter.o: $(hdrdir)/ruby/internal/attr/noexcept.h psych_emitter.o: $(hdrdir)/ruby/internal/attr/noinline.h psych_emitter.o: $(hdrdir)/ruby/internal/attr/nonnull.h psych_emitter.o: $(hdrdir)/ruby/internal/attr/noreturn.h +psych_emitter.o: $(hdrdir)/ruby/internal/attr/packed_struct.h psych_emitter.o: $(hdrdir)/ruby/internal/attr/pure.h psych_emitter.o: $(hdrdir)/ruby/internal/attr/restrict.h psych_emitter.o: $(hdrdir)/ruby/internal/attr/returns_nonnull.h @@ -312,7 +313,6 @@ psych_emitter.o: $(hdrdir)/ruby/internal/intern/enumerator.h psych_emitter.o: $(hdrdir)/ruby/internal/intern/error.h psych_emitter.o: $(hdrdir)/ruby/internal/intern/eval.h psych_emitter.o: $(hdrdir)/ruby/internal/intern/file.h -psych_emitter.o: $(hdrdir)/ruby/internal/intern/gc.h psych_emitter.o: $(hdrdir)/ruby/internal/intern/hash.h psych_emitter.o: $(hdrdir)/ruby/internal/intern/io.h psych_emitter.o: $(hdrdir)/ruby/internal/intern/load.h @@ -343,12 +343,12 @@ psych_emitter.o: $(hdrdir)/ruby/internal/memory.h psych_emitter.o: $(hdrdir)/ruby/internal/method.h psych_emitter.o: $(hdrdir)/ruby/internal/module.h psych_emitter.o: $(hdrdir)/ruby/internal/newobj.h -psych_emitter.o: $(hdrdir)/ruby/internal/rgengc.h psych_emitter.o: $(hdrdir)/ruby/internal/scan_args.h psych_emitter.o: $(hdrdir)/ruby/internal/special_consts.h psych_emitter.o: $(hdrdir)/ruby/internal/static_assert.h psych_emitter.o: $(hdrdir)/ruby/internal/stdalign.h psych_emitter.o: $(hdrdir)/ruby/internal/stdbool.h +psych_emitter.o: $(hdrdir)/ruby/internal/stdckdint.h psych_emitter.o: $(hdrdir)/ruby/internal/symbol.h psych_emitter.o: $(hdrdir)/ruby/internal/value.h psych_emitter.o: $(hdrdir)/ruby/internal/value_type.h @@ -421,6 +421,7 @@ psych_parser.o: $(hdrdir)/ruby/internal/attr/noexcept.h psych_parser.o: $(hdrdir)/ruby/internal/attr/noinline.h psych_parser.o: $(hdrdir)/ruby/internal/attr/nonnull.h psych_parser.o: $(hdrdir)/ruby/internal/attr/noreturn.h +psych_parser.o: $(hdrdir)/ruby/internal/attr/packed_struct.h psych_parser.o: $(hdrdir)/ruby/internal/attr/pure.h psych_parser.o: $(hdrdir)/ruby/internal/attr/restrict.h psych_parser.o: $(hdrdir)/ruby/internal/attr/returns_nonnull.h @@ -489,7 +490,6 @@ psych_parser.o: $(hdrdir)/ruby/internal/intern/enumerator.h psych_parser.o: $(hdrdir)/ruby/internal/intern/error.h psych_parser.o: $(hdrdir)/ruby/internal/intern/eval.h psych_parser.o: $(hdrdir)/ruby/internal/intern/file.h -psych_parser.o: $(hdrdir)/ruby/internal/intern/gc.h psych_parser.o: $(hdrdir)/ruby/internal/intern/hash.h psych_parser.o: $(hdrdir)/ruby/internal/intern/io.h psych_parser.o: $(hdrdir)/ruby/internal/intern/load.h @@ -520,12 +520,12 @@ psych_parser.o: $(hdrdir)/ruby/internal/memory.h psych_parser.o: $(hdrdir)/ruby/internal/method.h psych_parser.o: $(hdrdir)/ruby/internal/module.h psych_parser.o: $(hdrdir)/ruby/internal/newobj.h -psych_parser.o: $(hdrdir)/ruby/internal/rgengc.h psych_parser.o: $(hdrdir)/ruby/internal/scan_args.h psych_parser.o: $(hdrdir)/ruby/internal/special_consts.h psych_parser.o: $(hdrdir)/ruby/internal/static_assert.h psych_parser.o: $(hdrdir)/ruby/internal/stdalign.h psych_parser.o: $(hdrdir)/ruby/internal/stdbool.h +psych_parser.o: $(hdrdir)/ruby/internal/stdckdint.h psych_parser.o: $(hdrdir)/ruby/internal/symbol.h psych_parser.o: $(hdrdir)/ruby/internal/value.h psych_parser.o: $(hdrdir)/ruby/internal/value_type.h @@ -598,6 +598,7 @@ psych_to_ruby.o: $(hdrdir)/ruby/internal/attr/noexcept.h psych_to_ruby.o: $(hdrdir)/ruby/internal/attr/noinline.h psych_to_ruby.o: $(hdrdir)/ruby/internal/attr/nonnull.h psych_to_ruby.o: $(hdrdir)/ruby/internal/attr/noreturn.h +psych_to_ruby.o: $(hdrdir)/ruby/internal/attr/packed_struct.h psych_to_ruby.o: $(hdrdir)/ruby/internal/attr/pure.h psych_to_ruby.o: $(hdrdir)/ruby/internal/attr/restrict.h psych_to_ruby.o: $(hdrdir)/ruby/internal/attr/returns_nonnull.h @@ -666,7 +667,6 @@ psych_to_ruby.o: $(hdrdir)/ruby/internal/intern/enumerator.h psych_to_ruby.o: $(hdrdir)/ruby/internal/intern/error.h psych_to_ruby.o: $(hdrdir)/ruby/internal/intern/eval.h psych_to_ruby.o: $(hdrdir)/ruby/internal/intern/file.h -psych_to_ruby.o: $(hdrdir)/ruby/internal/intern/gc.h psych_to_ruby.o: $(hdrdir)/ruby/internal/intern/hash.h psych_to_ruby.o: $(hdrdir)/ruby/internal/intern/io.h psych_to_ruby.o: $(hdrdir)/ruby/internal/intern/load.h @@ -697,12 +697,12 @@ psych_to_ruby.o: $(hdrdir)/ruby/internal/memory.h psych_to_ruby.o: $(hdrdir)/ruby/internal/method.h psych_to_ruby.o: $(hdrdir)/ruby/internal/module.h psych_to_ruby.o: $(hdrdir)/ruby/internal/newobj.h -psych_to_ruby.o: $(hdrdir)/ruby/internal/rgengc.h psych_to_ruby.o: $(hdrdir)/ruby/internal/scan_args.h psych_to_ruby.o: $(hdrdir)/ruby/internal/special_consts.h psych_to_ruby.o: $(hdrdir)/ruby/internal/static_assert.h psych_to_ruby.o: $(hdrdir)/ruby/internal/stdalign.h psych_to_ruby.o: $(hdrdir)/ruby/internal/stdbool.h +psych_to_ruby.o: $(hdrdir)/ruby/internal/stdckdint.h psych_to_ruby.o: $(hdrdir)/ruby/internal/symbol.h psych_to_ruby.o: $(hdrdir)/ruby/internal/value.h psych_to_ruby.o: $(hdrdir)/ruby/internal/value_type.h @@ -775,6 +775,7 @@ psych_yaml_tree.o: $(hdrdir)/ruby/internal/attr/noexcept.h psych_yaml_tree.o: $(hdrdir)/ruby/internal/attr/noinline.h psych_yaml_tree.o: $(hdrdir)/ruby/internal/attr/nonnull.h psych_yaml_tree.o: $(hdrdir)/ruby/internal/attr/noreturn.h +psych_yaml_tree.o: $(hdrdir)/ruby/internal/attr/packed_struct.h psych_yaml_tree.o: $(hdrdir)/ruby/internal/attr/pure.h psych_yaml_tree.o: $(hdrdir)/ruby/internal/attr/restrict.h psych_yaml_tree.o: $(hdrdir)/ruby/internal/attr/returns_nonnull.h @@ -843,7 +844,6 @@ psych_yaml_tree.o: $(hdrdir)/ruby/internal/intern/enumerator.h psych_yaml_tree.o: $(hdrdir)/ruby/internal/intern/error.h psych_yaml_tree.o: $(hdrdir)/ruby/internal/intern/eval.h psych_yaml_tree.o: $(hdrdir)/ruby/internal/intern/file.h -psych_yaml_tree.o: $(hdrdir)/ruby/internal/intern/gc.h psych_yaml_tree.o: $(hdrdir)/ruby/internal/intern/hash.h psych_yaml_tree.o: $(hdrdir)/ruby/internal/intern/io.h psych_yaml_tree.o: $(hdrdir)/ruby/internal/intern/load.h @@ -874,12 +874,12 @@ psych_yaml_tree.o: $(hdrdir)/ruby/internal/memory.h psych_yaml_tree.o: $(hdrdir)/ruby/internal/method.h psych_yaml_tree.o: $(hdrdir)/ruby/internal/module.h psych_yaml_tree.o: $(hdrdir)/ruby/internal/newobj.h -psych_yaml_tree.o: $(hdrdir)/ruby/internal/rgengc.h psych_yaml_tree.o: $(hdrdir)/ruby/internal/scan_args.h psych_yaml_tree.o: $(hdrdir)/ruby/internal/special_consts.h psych_yaml_tree.o: $(hdrdir)/ruby/internal/static_assert.h psych_yaml_tree.o: $(hdrdir)/ruby/internal/stdalign.h psych_yaml_tree.o: $(hdrdir)/ruby/internal/stdbool.h +psych_yaml_tree.o: $(hdrdir)/ruby/internal/stdckdint.h psych_yaml_tree.o: $(hdrdir)/ruby/internal/symbol.h psych_yaml_tree.o: $(hdrdir)/ruby/internal/value.h psych_yaml_tree.o: $(hdrdir)/ruby/internal/value_type.h diff --git a/ext/psych/extconf.rb b/ext/psych/extconf.rb index 6d03870436..e7dd0bb60a 100644 --- a/ext/psych/extconf.rb +++ b/ext/psych/extconf.rb @@ -6,39 +6,9 @@ if $mswin or $mingw or $cygwin $CPPFLAGS << " -DYAML_DECLARE_STATIC" end -yaml_source = with_config("libyaml-source-dir") || enable_config("bundled-libyaml", false) -unless yaml_source # default to pre-installed libyaml - pkg_config('yaml-0.1') - dir_config('libyaml') - unless find_header('yaml.h') && find_library('yaml', 'yaml_get_version') - yaml_source = true # fallback to the bundled source if exists - end -end - -if yaml_source == true - # search the latest libyaml source under $srcdir - yaml_source = Dir.glob("#{$srcdir}/yaml{,-*}/").max_by {|n| File.basename(n).scan(/\d+/).map(&:to_i)} - unless yaml_source - download_failure = "failed to download libyaml source. Try manually installing libyaml?" - begin - require_relative '../../tool/extlibs.rb' - rescue LoadError - # When running in ruby/ruby, we use miniruby and don't have stdlib. - # Avoid LoadError because it aborts the whole build. Usually when - # stdlib extension fail to configure we skip it and continue. - raise download_failure - end - extlibs = ExtLibs.new(cache_dir: File.expand_path("../../tmp/download_cache", $srcdir)) - unless extlibs.process_under($srcdir) - raise download_failure - end - yaml_source, = Dir.glob("#{$srcdir}/yaml-*/") - raise "libyaml not found" unless yaml_source - end -elsif yaml_source - yaml_source = yaml_source.gsub(/\$\((\w+)\)|\$\{(\w+)\}/) {ENV[$1||$2]} -end +yaml_source = with_config("libyaml-source-dir") if yaml_source + yaml_source = yaml_source.gsub(/\$\((\w+)\)|\$\{(\w+)\}/) {ENV[$1||$2]} yaml_source = yaml_source.chomp("/") yaml_configure = "#{File.expand_path(yaml_source)}/configure" unless File.exist?(yaml_configure) @@ -52,7 +22,7 @@ if yaml_source args = [ yaml_configure, "--enable-#{shared ? 'shared' : 'static'}", - "--host=#{RbConfig::CONFIG['host'].sub(/-unknown-/, '-')}", + "--host=#{RbConfig::CONFIG['host'].sub(/-unknown-/, '-').sub(/arm64/, 'arm')}", "CC=#{RbConfig::CONFIG['CC']}", *(["CFLAGS=-w"] if RbConfig::CONFIG["GCC"] == "yes"), ] @@ -66,6 +36,11 @@ if yaml_source libyaml = "libyaml.#$LIBEXT" $cleanfiles << libyaml $LOCAL_LIBS.prepend("$(LIBYAML) ") +else # default to pre-installed libyaml + pkg_config('yaml-0.1') + dir_config('libyaml') + find_header('yaml.h') or abort "yaml.h not found" + find_library('yaml', 'yaml_get_version') or abort "libyaml not found" end create_makefile 'psych' do |mk| diff --git a/ext/psych/extlibs b/ext/psych/extlibs deleted file mode 100644 index 108aad42af..0000000000 --- a/ext/psych/extlibs +++ /dev/null @@ -1,11 +0,0 @@ -ver = 0.2.5 -pkg = yaml-$(ver) - -https://github.com/yaml/libyaml/releases/download/$(ver)/$(pkg).tar.gz \ - rmd160:cc175ed640046722fb7790de828002633407b6b9 \ - sha256:c642ae9b75fee120b2d96c712538bd2cf283228d2337df2cf2988e3c02678ef4 \ - sha512:dadd7d8e0d88b5ebab005e5d521d56d541580198aa497370966b98c904586e642a1cd4f3881094eb57624f218d50db77417bbfd0ffdce50340f011e35e8c4c02 \ - # - -$(pkg)/config/config.guess -> /tool/config.guess -$(pkg)/config/config.sub -> /tool/config.sub diff --git a/ext/psych/lib/psych.rb b/ext/psych/lib/psych.rb index 4a2ab58514..d87bd9040a 100644 --- a/ext/psych/lib/psych.rb +++ b/ext/psych/lib/psych.rb @@ -489,6 +489,10 @@ module Psych # # Default: <tt>false</tt>. # + # [<tt>:stringify_names</tt>] Dump symbol keys in Hash objects as string. + # + # Default: <tt>false</tt>. + # # Example: # # # Dump an array, get back a YAML string @@ -502,6 +506,9 @@ module Psych # # # Dump an array to an IO with indentation set # Psych.dump(['a', ['b']], StringIO.new, indentation: 3) + # + # # Dump hash with symbol keys as string + # Psych.dump({a: "b"}, stringify_names: true) # => "---\na: b\n" def self.dump o, io = nil, options = {} if Hash === io options = io @@ -562,6 +569,10 @@ module Psych # # Default: <tt>false</tt>. # + # [<tt>:stringify_names</tt>] Dump symbol keys in Hash objects as string. + # + # Default: <tt>false</tt>. + # # Example: # # # Dump an array, get back a YAML string @@ -575,6 +586,9 @@ module Psych # # # Dump an array to an IO with indentation set # Psych.safe_dump(['a', ['b']], StringIO.new, indentation: 3) + # + # # Dump hash with symbol keys as string + # Psych.dump({a: "b"}, stringify_names: true) # => "---\na: b\n" def self.safe_dump o, io = nil, options = {} if Hash === io options = io @@ -694,26 +708,8 @@ module Psych dump_tags[klass] = tag end - # Workaround for emulating `warn '...', uplevel: 1` in Ruby 2.4 or lower. - def self.warn_with_uplevel(message, uplevel: 1) - at = parse_caller(caller[uplevel]).join(':') - warn "#{at}: #{message}" - end - - def self.parse_caller(at) - if /^(.+?):(\d+)(?::in `.*')?/ =~ at - file = $1 - line = $2.to_i - [file, line] - end - end - private_class_method :warn_with_uplevel, :parse_caller - class << self if defined?(Ractor) - require 'forwardable' - extend Forwardable - class Config attr_accessor :load_tags, :dump_tags, :domain_types def initialize @@ -727,7 +723,29 @@ module Psych Ractor.current[:PsychConfig] ||= Config.new end - def_delegators :config, :load_tags, :dump_tags, :domain_types, :load_tags=, :dump_tags=, :domain_types= + def load_tags + config.load_tags + end + + def dump_tags + config.dump_tags + end + + def domain_types + config.domain_types + end + + def load_tags=(value) + config.load_tags = value + end + + def dump_tags=(value) + config.dump_tags = value + end + + def domain_types=(value) + config.domain_types = value + end else attr_accessor :load_tags attr_accessor :dump_tags diff --git a/ext/psych/lib/psych/class_loader.rb b/ext/psych/lib/psych/class_loader.rb index c2e4ea4c93..50efc35ee2 100644 --- a/ext/psych/lib/psych/class_loader.rb +++ b/ext/psych/lib/psych/class_loader.rb @@ -35,7 +35,7 @@ module Psych constants.each do |const| konst = const_get const - class_eval <<~RUBY + class_eval <<~RUBY, __FILE__, __LINE__ + 1 def #{const.to_s.downcase} load #{konst.inspect} end diff --git a/ext/psych/lib/psych/parser.rb b/ext/psych/lib/psych/parser.rb index 39bc8289be..2181c730e5 100644 --- a/ext/psych/lib/psych/parser.rb +++ b/ext/psych/lib/psych/parser.rb @@ -48,5 +48,18 @@ module Psych @handler = handler @external_encoding = ANY end + + ### + # call-seq: + # parser.parse(yaml) + # + # Parse the YAML document contained in +yaml+. Events will be called on + # the handler set on the parser instance. + # + # See Psych::Parser and Psych::Parser#handler + + def parse yaml, path = yaml.respond_to?(:path) ? yaml.path : "<unknown>" + _native_parse @handler, yaml, path + end end end diff --git a/ext/psych/lib/psych/scalar_scanner.rb b/ext/psych/lib/psych/scalar_scanner.rb index b50667c315..3cb4bf3c7e 100644 --- a/ext/psych/lib/psych/scalar_scanner.rb +++ b/ext/psych/lib/psych/scalar_scanner.rb @@ -63,7 +63,7 @@ module Psych elsif string.match?(/^\d{4}-(?:1[012]|0\d|\d)-(?:[12]\d|3[01]|0\d|\d)$/) require 'date' begin - class_loader.date.strptime(string, '%Y-%m-%d') + class_loader.date.strptime(string, '%F', Date::GREGORIAN) rescue ArgumentError string end diff --git a/ext/psych/lib/psych/tree_builder.rb b/ext/psych/lib/psych/tree_builder.rb index 414ca02bf7..83115bd721 100644 --- a/ext/psych/lib/psych/tree_builder.rb +++ b/ext/psych/lib/psych/tree_builder.rb @@ -41,7 +41,7 @@ module Psych Sequence Mapping }.each do |node| - class_eval %{ + class_eval <<~RUBY, __FILE__, __LINE__ + 1 def start_#{node.downcase}(anchor, tag, implicit, style) n = Nodes::#{node}.new(anchor, tag, implicit, style) set_start_location(n) @@ -54,7 +54,7 @@ module Psych set_end_location(n) n end - } + RUBY end ### diff --git a/ext/psych/lib/psych/versions.rb b/ext/psych/lib/psych/versions.rb index 0fdead154c..b9e8d9ef11 100644 --- a/ext/psych/lib/psych/versions.rb +++ b/ext/psych/lib/psych/versions.rb @@ -2,9 +2,9 @@ module Psych # The version of Psych you are using - VERSION = '5.0.0.dev' + VERSION = '5.1.2' if RUBY_ENGINE == 'jruby' - DEFAULT_SNAKEYAML_VERSION = '1.28'.freeze + DEFAULT_SNAKEYAML_VERSION = '2.7'.freeze end end diff --git a/ext/psych/lib/psych/visitors/to_ruby.rb b/ext/psych/lib/psych/visitors/to_ruby.rb index cce5daf3bb..f0fda9bdbc 100644 --- a/ext/psych/lib/psych/visitors/to_ruby.rb +++ b/ext/psych/lib/psych/visitors/to_ruby.rb @@ -80,7 +80,9 @@ module Psych when "!ruby/object:DateTime" class_loader.date_time require 'date' unless defined? DateTime - @ss.parse_time(o.value).to_datetime + t = @ss.parse_time(o.value) + DateTime.civil(*t.to_a[0, 6].reverse, Rational(t.utc_offset, 86400)) + + (t.subsec/86400) when '!ruby/encoding' ::Encoding.find o.value when "!ruby/object:Complex" @@ -99,7 +101,7 @@ module Psych source = $1 options = 0 lang = nil - ($2 || '').split('').each do |option| + $2&.each_char do |option| case option when 'x' then options |= Regexp::EXTENDED when 'i' then options |= Regexp::IGNORECASE diff --git a/ext/psych/lib/psych/visitors/yaml_tree.rb b/ext/psych/lib/psych/visitors/yaml_tree.rb index 316a3a9496..a2ebc4d781 100644 --- a/ext/psych/lib/psych/visitors/yaml_tree.rb +++ b/ext/psych/lib/psych/visitors/yaml_tree.rb @@ -15,30 +15,25 @@ module Psych class YAMLTree < Psych::Visitors::Visitor class Registrar # :nodoc: def initialize - @obj_to_id = {} - @obj_to_node = {} - @targets = [] + @obj_to_id = {}.compare_by_identity + @obj_to_node = {}.compare_by_identity @counter = 0 end def register target, node - return unless target.respond_to? :object_id - @targets << target - @obj_to_node[target.object_id] = node + @obj_to_node[target] = node end def key? target - @obj_to_node.key? target.object_id - rescue NoMethodError - false + @obj_to_node.key? target end def id_for target - @obj_to_id[target.object_id] ||= (@counter += 1) + @obj_to_id[target] ||= (@counter += 1) end def node_for target - @obj_to_node[target.object_id] + @obj_to_node[target] end end @@ -70,6 +65,7 @@ module Psych fail(ArgumentError, "Invalid line_width #{@line_width}, must be non-negative or -1 for unlimited.") end end + @stringify_names = options[:stringify_names] @coders = [] @dispatch_cache = Hash.new do |h,klass| @@ -192,12 +188,13 @@ module Psych register o, @emitter.scalar(o.inspect, nil, '!ruby/regexp', false, false, Nodes::Scalar::ANY) end + def visit_Date o + register o, visit_Integer(o.gregorian) + end + def visit_DateTime o - formatted = if o.offset.zero? - o.strftime("%Y-%m-%d %H:%M:%S.%9N Z".freeze) - else - o.strftime("%Y-%m-%d %H:%M:%S.%9N %:z".freeze) - end + t = o.italy + formatted = format_time t, t.offset.zero? tag = '!ruby/object:DateTime' register o, @emitter.scalar(formatted, nil, tag, false, false, Nodes::Scalar::ANY) end @@ -235,7 +232,6 @@ module Psych end alias :visit_TrueClass :visit_Integer alias :visit_FalseClass :visit_Integer - alias :visit_Date :visit_Integer def visit_Float o if o.nan? @@ -272,7 +268,7 @@ module Psych tag = 'tag:yaml.org,2002:str' plain = false quote = false - elsif o == 'y' || o == 'n' + elsif o == 'y' || o == 'Y' || o == 'n' || o == 'N' style = Nodes::Scalar::DOUBLE_QUOTED elsif @line_width && o.length > @line_width style = Nodes::Scalar::FOLDED @@ -328,7 +324,7 @@ module Psych if o.class == ::Hash register(o, @emitter.start_mapping(nil, nil, true, Psych::Nodes::Mapping::BLOCK)) o.each do |k,v| - accept k + accept(@stringify_names && Symbol === k ? k.to_s : k) accept v end @emitter.end_mapping @@ -341,7 +337,7 @@ module Psych register(o, @emitter.start_mapping(nil, '!set', false, Psych::Nodes::Mapping::BLOCK)) o.each do |k,v| - accept k + accept(@stringify_names && Symbol === k ? k.to_s : k) accept v end @@ -482,8 +478,8 @@ module Psych @emitter.end_mapping end - def format_time time - if time.utc? + def format_time time, utc = time.utc? + if utc time.strftime("%Y-%m-%d %H:%M:%S.%9N Z") else time.strftime("%Y-%m-%d %H:%M:%S.%9N %:z") @@ -568,7 +564,7 @@ module Psych raise BadAlias, "Tried to dump an aliased object" end - unless @permitted_classes[target.class] + unless Symbol === target || @permitted_classes[target.class] raise DisallowedClass.new('dump', target.class.name || target.class.inspect) end @@ -576,7 +572,7 @@ module Psych end def visit_Symbol sym - unless @permitted_symbols[sym] + unless @permitted_classes[Symbol] || @permitted_symbols[sym] raise DisallowedClass.new('dump', "Symbol(#{sym.inspect})") end diff --git a/ext/psych/psych.gemspec b/ext/psych/psych.gemspec index 5f5168ddb0..a3fc53a8b9 100644 --- a/ext/psych/psych.gemspec +++ b/ext/psych/psych.gemspec @@ -21,28 +21,41 @@ DESCRIPTION s.licenses = ["MIT"] s.require_paths = ["lib"] - # for ruby core repository. It was generated by `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) } + # for ruby core repository. + # It was generated by + # `git ls-files -z`.split("\x0").reject { |f| + # f.match(%r{^\.git|^(test|spec|features|bin|tool)/|^[A-Z]\w+file$|/extlibs$|\.(gemspec|java)$|jar}) + # } s.files = [ - ".gitignore", "Gemfile", "LICENSE", "Mavenfile", "README.md", "Rakefile", "bin/console", - "bin/setup", "ext/psych/depend", "ext/psych/extconf.rb", "ext/psych/psych.c", "ext/psych/psych.h", - "ext/psych/psych_emitter.c", "ext/psych/psych_emitter.h", "ext/psych/psych_parser.c", "ext/psych/psych_parser.h", - "ext/psych/psych_to_ruby.c", "ext/psych/psych_to_ruby.h", "ext/psych/psych_yaml_tree.c", "ext/psych/psych_yaml_tree.h", - "lib/psych.rb", "lib/psych/class_loader.rb", "lib/psych/coder.rb", "lib/psych/core_ext.rb", "lib/psych/exception.rb", - "lib/psych/handler.rb", "lib/psych/handlers/document_stream.rb", "lib/psych/handlers/recorder.rb", - "lib/psych/json/ruby_events.rb", "lib/psych/json/stream.rb", "lib/psych/json/tree_builder.rb", - "lib/psych/json/yaml_events.rb", "lib/psych/nodes.rb", "lib/psych/nodes/alias.rb", "lib/psych/nodes/document.rb", - "lib/psych/nodes/mapping.rb", "lib/psych/nodes/node.rb", "lib/psych/nodes/scalar.rb", "lib/psych/nodes/sequence.rb", - "lib/psych/nodes/stream.rb", "lib/psych/omap.rb", "lib/psych/parser.rb", "lib/psych/scalar_scanner.rb", - "lib/psych/set.rb", "lib/psych/stream.rb", "lib/psych/streaming.rb", "lib/psych/syntax_error.rb", - "lib/psych/tree_builder.rb", "lib/psych/versions.rb", "lib/psych/visitors.rb","lib/psych/visitors/depth_first.rb", - "lib/psych/visitors/emitter.rb", "lib/psych/visitors/json_tree.rb", "lib/psych/visitors/to_ruby.rb", - "lib/psych/visitors/visitor.rb", "lib/psych/visitors/yaml_tree.rb", "lib/psych/y.rb", "psych.gemspec" + "CONTRIBUTING.md", "LICENSE", "README.md", "ext/psych/depend", + "ext/psych/extconf.rb", "ext/psych/psych.c", "ext/psych/psych.h", + "ext/psych/psych_emitter.c", "ext/psych/psych_emitter.h", + "ext/psych/psych_parser.c", "ext/psych/psych_parser.h", + "ext/psych/psych_to_ruby.c", "ext/psych/psych_to_ruby.h", + "ext/psych/psych_yaml_tree.c", "ext/psych/psych_yaml_tree.h", + "lib/psych.rb", "lib/psych/class_loader.rb", "lib/psych/coder.rb", + "lib/psych/core_ext.rb", "lib/psych/exception.rb", "lib/psych/handler.rb", + "lib/psych/handlers/document_stream.rb", "lib/psych/handlers/recorder.rb", + "lib/psych/json/ruby_events.rb", "lib/psych/json/stream.rb", + "lib/psych/json/tree_builder.rb", "lib/psych/json/yaml_events.rb", + "lib/psych/nodes.rb", "lib/psych/nodes/alias.rb", + "lib/psych/nodes/document.rb", "lib/psych/nodes/mapping.rb", + "lib/psych/nodes/node.rb", "lib/psych/nodes/scalar.rb", + "lib/psych/nodes/sequence.rb", "lib/psych/nodes/stream.rb", + "lib/psych/omap.rb", "lib/psych/parser.rb", "lib/psych/scalar_scanner.rb", + "lib/psych/set.rb", "lib/psych/stream.rb", "lib/psych/streaming.rb", + "lib/psych/syntax_error.rb", "lib/psych/tree_builder.rb", + "lib/psych/versions.rb", "lib/psych/visitors.rb", + "lib/psych/visitors/depth_first.rb", "lib/psych/visitors/emitter.rb", + "lib/psych/visitors/json_tree.rb", "lib/psych/visitors/to_ruby.rb", + "lib/psych/visitors/visitor.rb", "lib/psych/visitors/yaml_tree.rb", + "lib/psych/y.rb" ] s.rdoc_options = ["--main", "README.md"] s.extra_rdoc_files = ["README.md"] - s.required_ruby_version = Gem::Requirement.new(">= 2.4.0") + s.required_ruby_version = Gem::Requirement.new(">= 2.5.0") s.required_rubygems_version = Gem::Requirement.new(">= 0") if RUBY_ENGINE == 'jruby' @@ -52,15 +65,16 @@ DESCRIPTION "ext/java/org/jruby/ext/psych/PsychLibrary.java", "ext/java/org/jruby/ext/psych/PsychParser.java", "ext/java/org/jruby/ext/psych/PsychToRuby.java", - "ext/java/org/jruby/ext/psych/PsychYamlTree.java", "lib/psych_jars.rb", "lib/psych.jar" ] - s.requirements = "jar org.yaml:snakeyaml, #{version_module::Psych::DEFAULT_SNAKEYAML_VERSION}" + s.requirements = "jar org.snakeyaml:snakeyaml-engine, #{version_module::Psych::DEFAULT_SNAKEYAML_VERSION}" s.add_dependency 'jar-dependencies', '>= 0.1.7' else s.extensions = ["ext/psych/extconf.rb"] s.add_dependency 'stringio' end + s.metadata['msys2_mingw_dependencies'] = 'libyaml' + s.metadata['changelog_uri'] = s.homepage + '/releases' end diff --git a/ext/psych/psych_parser.c b/ext/psych/psych_parser.c index f91475b835..9c5179cc44 100644 --- a/ext/psych/psych_parser.c +++ b/ext/psych/psych_parser.c @@ -245,18 +245,8 @@ static VALUE protected_event_location(VALUE pointer) return rb_funcall3(args[0], id_event_location, 4, args + 1); } -/* - * call-seq: - * parser.parse(yaml) - * - * Parse the YAML document contained in +yaml+. Events will be called on - * the handler set on the parser instance. - * - * See Psych::Parser and Psych::Parser#handler - */ -static VALUE parse(int argc, VALUE *argv, VALUE self) +static VALUE parse(VALUE self, VALUE handler, VALUE yaml, VALUE path) { - VALUE yaml, path; yaml_parser_t * parser; yaml_event_t event; int done = 0; @@ -264,14 +254,6 @@ static VALUE parse(int argc, VALUE *argv, VALUE self) int parser_encoding = YAML_ANY_ENCODING; int encoding = rb_utf8_encindex(); rb_encoding * internal_enc = rb_default_internal_encoding(); - VALUE handler = rb_iv_get(self, "@handler"); - - if (rb_scan_args(argc, argv, "11", &yaml, &path) == 1) { - if(rb_respond_to(yaml, id_path)) - path = rb_funcall(yaml, id_path, 0); - else - path = rb_str_new2("<unknown>"); - } TypedData_Get_Struct(self, yaml_parser_t, &psych_parser_type, parser); @@ -562,7 +544,7 @@ void Init_psych_parser(void) rb_require("psych/syntax_error"); - rb_define_method(cPsychParser, "parse", parse, -1); + rb_define_private_method(cPsychParser, "_native_parse", parse, 3); rb_define_method(cPsychParser, "mark", mark, 0); id_read = rb_intern("read"); |