Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Port the Psych/Syck YAML fix from Rubygems 1.8.24
The existing Psych/Syck fix wasn't working in certain circumstances (gem fetch XXXXX, for example), so the broader solution from Rubygems 1.8.24 was used instead. This resolved the problem without breaking existing tests.
- Loading branch information
Showing
5 changed files
with
173 additions
and
22 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
# This exists just to satify bugs in marshal'd gemspecs that | ||
# contain a reference to YAML::PrivateType. We prune these out | ||
# in Specification._load, but if we don't have the constant, Marshal | ||
# blows up. | ||
|
||
module Psych | ||
class PrivateType | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
module Gem | ||
if defined? ::Psych::Visitors | ||
class NoAliasYAMLTree < Psych::Visitors::YAMLTree | ||
def visit_String(str) | ||
return super unless str == '=' # or whatever you want | ||
|
||
quote = Psych::Nodes::Scalar::SINGLE_QUOTED | ||
@emitter.scalar str, nil, nil, false, true, quote | ||
end | ||
|
||
# Noop this out so there are no anchors | ||
def register(target, obj) | ||
end | ||
|
||
# This is ported over from the yaml_tree in 1.9.3 | ||
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 | ||
|
||
private :format_time | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
# :stopdoc: | ||
|
||
# Hack to handle syck's DefaultKey bug | ||
# | ||
# This file is always loaded AFTER either syck or psych are already | ||
# loaded. It then looks at what constants are available and creates | ||
# a consistent view on all rubys. | ||
# | ||
# All this is so that there is always a YAML::Syck::DefaultKey | ||
# class no matter if the full yaml library has loaded or not. | ||
# | ||
|
||
module YAML | ||
# In newer 1.9.2, there is a Syck toplevel constant instead of it | ||
# being underneith YAML. If so, reference it back under YAML as | ||
# well. | ||
if defined? ::Syck | ||
# for tests that change YAML::ENGINE | ||
# 1.8 does not support the second argument to const_defined? | ||
remove_const :Syck rescue nil | ||
|
||
Syck = ::Syck | ||
|
||
# JRuby's "Syck" is called "Yecht" | ||
elsif defined? YAML::Yecht | ||
Syck = YAML::Yecht | ||
|
||
# Otherwise, if there is no YAML::Syck, then we've got just psych | ||
# loaded, so lets define a stub for DefaultKey. | ||
elsif !defined? YAML::Syck | ||
module Syck | ||
class DefaultKey | ||
end | ||
end | ||
end | ||
|
||
# Now that we've got something that is always here, define #to_s | ||
# so when code tries to use this, it at least just shows up like it | ||
# should. | ||
module Syck | ||
class DefaultKey | ||
remove_method :to_s rescue nil | ||
|
||
def to_s | ||
'=' | ||
end | ||
end | ||
end | ||
end | ||
|
||
# Sometime in the 1.9 dev cycle, the Syck constant was moved from under YAML | ||
# to be a toplevel constant. So gemspecs created under these versions of Syck | ||
# will have references to Syck::DefaultKey. | ||
# | ||
# So we need to be sure that we reference Syck at the toplevel too so that | ||
# we can always load these kind of gemspecs. | ||
# | ||
if !defined?(Syck) | ||
Syck = YAML::Syck | ||
end | ||
|
||
# Now that we've got Syck setup in all the right places, store | ||
# a reference to the DefaultKey class inside Gem. We do this so that | ||
# if later on YAML, etc are redefined, we've still got a consistent | ||
# place to find the DefaultKey class for comparison. | ||
|
||
module Gem | ||
# for tests that change YAML::ENGINE | ||
remove_const :SyckDefaultKey if const_defined? :SyckDefaultKey | ||
|
||
SyckDefaultKey = YAML::Syck::DefaultKey | ||
end | ||
|
||
# :startdoc: |