Skip to content

Fix loading of config file with recent Rubies (Psych 4.0)#779

Closed
cboos wants to merge 2 commits intogettalong:masterfrom
cboos:fix-compatibility-with-psych-4.0
Closed

Fix loading of config file with recent Rubies (Psych 4.0)#779
cboos wants to merge 2 commits intogettalong:masterfrom
cboos:fix-compatibility-with-psych-4.0

Conversation

@cboos
Copy link
Copy Markdown

@cboos cboos commented Feb 17, 2023

Hello,

I've been using the bin/kramdown utility recently with Ruby 3.2, and I hit an error when I use the --config-file option.


Using Ruby 3.2, the following command would fail like this without the fix:

> bin\kramdown --config-file .kramdown.yml -i GFM -o html README.md
.../ruby-3.2-lean/lib/ruby/3.2.0/psych.rb:322:in `safe_load': wrong number of arguments (given 2, expected 1) (ArgumentError)
    from .../vendor/ruby/3.2.0/gems/kramdown-2.4.0/bin/kramdown:114:in `<top (required)>'
    from .../bin/kramdown.cmd:30:in `load'
    from .../bin/kramdown.cmd:30:in `<main>'

The kramdown script still uses the legacy YAML.safe_load API, which has been removed in Psych version 4.0 (cf. ruby/psych@07672270 and ruby/psych#533). Here's a fix that works for me, tested with Ruby v2.4, v2.7, v3.0, and v3.2.

As for the fix, using the keyword argument directly instead of checking whether it is supported is also an option if you think there's no need to support Psych versions older than v3.1.0 (ruby/psych@682abf20). The comment in the commit should indeed have been # compatibility with Psych < 3.1.0.

Using Ruby 3.2, the following command would fail like this without the fix:

    > bin\kramdown --config-file .kramdown.yml -i GFM -o html README.md
    .../ruby-3.2-lean/lib/ruby/3.2.0/psych.rb:322:in `safe_load': wrong number of arguments (given 2, expected 1) (ArgumentError)
        from .../vendor/ruby/3.2.0/gems/kramdown-2.4.0/bin/kramdown:114:in `<top (required)>'
        from .../bin/kramdown.cmd:30:in `load'
        from .../bin/kramdown.cmd:30:in `<main>'
The whole story is that Psych 4.0 removed the support for the
legacy API with positional arguments, but the permitted_classes
keyword argument was already supported since Psych 3.1.0.
@stanhu
Copy link
Copy Markdown
Contributor

stanhu commented Mar 13, 2023

I created #781 before I saw this. Ruby 2.4-2.6 are EOL, so perhaps we can just avoid the if statement?

@gettalong gettalong self-assigned this Mar 14, 2023
@gettalong gettalong added the bug label Mar 14, 2023
@gettalong
Copy link
Copy Markdown
Owner

@cboos Thanks for the pull request! I have rebased and squashed your changes, see 85c4370

@gettalong gettalong closed this Mar 14, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants