rails error, couldn't parse YAML

Ruby on-Rails-3YamlRedcloth

Ruby on-Rails-3 Problem Overview


After updating the gems I've got this:

/home/megas/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/psych.rb:148:in `parse': couldn't parse YAML at line 182 column 9 (Psych::SyntaxError)
    from /home/megas/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/psych.rb:148:in `parse_stream'
    from /home/megas/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/psych.rb:119:in `parse'
    from /home/megas/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/psych.rb:106:in `load'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/RedCloth-4.2.3/lib/redcloth/formatters/latex.rb:6:in `<module:LATEX>'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/RedCloth-4.2.3/lib/redcloth/formatters/latex.rb:3:in `<top (required)>'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/RedCloth-4.2.3/lib/redcloth.rb:21:in `require'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/RedCloth-4.2.3/lib/redcloth.rb:21:in `<top (required)>'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/RedCloth-4.2.3/lib/case_sensitive_require/RedCloth.rb:6:in `require'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/RedCloth-4.2.3/lib/case_sensitive_require/RedCloth.rb:6:in `<top (required)>'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/bundler-1.0.10/lib/bundler/runtime.rb:68:in `require'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/bundler-1.0.10/lib/bundler/runtime.rb:68:in `block (2 levels) in require'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/bundler-1.0.10/lib/bundler/runtime.rb:66:in `each'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/bundler-1.0.10/lib/bundler/runtime.rb:66:in `block in require'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/bundler-1.0.10/lib/bundler/runtime.rb:55:in `each'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/bundler-1.0.10/lib/bundler/runtime.rb:55:in `require'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/bundler-1.0.10/lib/bundler.rb:120:in `require'
    from /home/megas/Work/railscasts/config/application.rb:10:in `<top (required)>'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/railties-3.0.3/lib/rails/commands.rb:28:in `require'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/railties-3.0.3/lib/rails/commands.rb:28:in `block in <top (required)>'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/railties-3.0.3/lib/rails/commands.rb:27:in `tap'
    from /home/megas/.rvm/gems/ruby-1.9.2-p136/gems/railties-3.0.3/lib/rails/commands.rb:27:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'

ruby-1.9.2-p136 rails 3.0.3

Tried to reinstall gem RedCloth, didn't help, system wants to use only 4.2.3 version

Any idea how to fix it? Thanks

Ruby on-Rails-3 Solutions


Solution 1 - Ruby on-Rails-3

You have invalid YAML code somewhere. I mean invalid for Psych (the new ruby YAML parser).

If you cannot (or don't want to) fix your YAML code, try to load the old YAML parser (syck), adding this at the beginning of config/boot.rb

require 'yaml'
YAML::ENGINE.yamler = 'syck'

It's just a 'quick and dirty' fix, I know

Solution 2 - Ruby on-Rails-3

My regular Rails 3 App also had this problem, because I was using a localized yaml File for Date/Times.

As you can see in this commit https://github.com/rails/rails/commit/dc94d81 this can be easy "fixed" by placing the array in seperate lines.

         -    order: [ :year, :month, :day ]
 	18	+    order:
 	19	+      - :year
 	20	+      - :month
 	21	+      - :day

Solution 3 - Ruby on-Rails-3

A slight tweak on Paul Raupach's answer which, when run from a directory, finds all *.yml files recursively in all sub-directories and tests the file. I ran it from my Rails root dir.

require 'yaml'

d = Dir["./**/*.yml"]
d.each do |file|
  begin
    puts "checking : #{file}"
    f =  YAML.load_file(file)
  rescue StandardError
    puts "failed to read #{file}: #{$!}"
  end
end

Solution 4 - Ruby on-Rails-3

The root cause was described on many places and I will summarize it again.

There are two default yaml parser Psych is the new one, the one you should be using. Syck is the old one, its not maintained and dying, its currently used as fall back for when there is no libyaml present (non-linux systems usually).

The important thing is you have some invalid yaml somewhere. It is most probably in your translation files (I had unquoted strings strating with %). Just try loading all your yml files with YAML.load_file on the production box and you will see which one is the broken one.

Solution 5 - Ruby on-Rails-3

I had this problem because i had used a tab instead of spaces

Solution 6 - Ruby on-Rails-3

It's best to fix your YAML files

Here is how using irb so you don't need the rails console which is probably not working:

require 'yaml'
YAML::ENGINE.yamler = 'psych'
YAML.load_file('config/locales/xxx.en.yml')

you'll get a nice output telling you where the issue is:

Psych::SyntaxError: couldn't parse YAML at line 25 column 17
	from /home/xxx/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/psych.rb:148:in `parse'
	from /home/xxx/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/psych.rb:148:in `parse_stream'
	from /home/xxx/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/psych.rb:119:in `parse'
	from /home/xxx/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/psych.rb:106:in `load'
	from /home/xxx/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/psych.rb:205:in `load_file'
	from (irb):10
	from /home/xxx/.rvm/rubies/ruby-1.9.2-p290/bin/irb:16:in `<main>'

Solution 7 - Ruby on-Rails-3

Absolutely fix your yaml code don't just 'mask' the real problem by forcing YAMl to use 'syck'. I had this same problem and found malformed yml statements in my localization files. If you just force using the older parser then you will not get the benefits of all the work on the new parser elsewhere in your project.

Solution 8 - Ruby on-Rails-3

The problem with the original question was in RedCloth. I was experiencing the same issue and simply updating to the most recent version of the RedCloth gem (Currently 4.2.7) fixed the issue.

The above advice from Honza and FlyboyArt is sound and you should fix any custom YAML you have, but with RedCloth being as popular as it is, most users finding this question who also use RedCloth should make sure their GemFile has this line added:

gem 'RedCloth', ">= 4.2.7"

Solution 9 - Ruby on-Rails-3

For others reading this, I got this error after making a typo in my database configuration - /config/database.yml

Solution 10 - Ruby on-Rails-3

It's a bundler 1.0.10 issue: details here

Try just to downdate bundler

Solution 11 - Ruby on-Rails-3

What fixed it in my cause was indeed malformed YAML translation file in:

config/locales/bg.yml

Corrected the YAML mistake and it was all fine. :-)

Solution 12 - Ruby on-Rails-3

For my case, it is not a Bundle issue: (Ruby 1.9 is assumed)

  • Ruby, by default, uses 'psych' (newer and maintained yaml library linking to the C library: libyaml) if libyaml is present
  • Otherwise, Ruby uses 'syck' (old and not maintained)
  • YAML::ENGINE.yamler= 'syck' will thus forces Ruby to use 'syck' on a machine where 'psych' is also installed

More info here: require "yaml" doesn't use psych as default

Solution 13 - Ruby on-Rails-3

For those pursuing this issue I have just found that my database.yml was triggering this error because it had no space between the password: keyword and the password. An almost invisible error, and with a database.yml that had worked without errors on an earlier version of rails.

Solution 14 - Ruby on-Rails-3

I got this error from trying to connect to a remote db with the password 'p@ssword' and figured out that psych doesn't like the '@' symbol. Changed the DB password and problem solved.

Solution 15 - Ruby on-Rails-3

I had this problem. My problem was I had an extra tab in my database.yml file.

Solution 16 - Ruby on-Rails-3

I came across this as I was using the r18n library in a Sinatra app I'm building, and in my translation file I had the following:

day: !!pl
  0: 0 days
  1: 1 day
  n: %1 days

which used to work just fine in an older project under Ruby 1.8.7, but which was failing under Ruby 1.9.3.

An answer by @SB gave me the clue I needed to work out my problem. The newer YAML was balking at the %1. Some quick digging and an experiment with irb and I now know that the newer version of the YAML parser requires you to put quotes around strings that start with %1, so I just changed my translation to be

day: !!pl
  0: 0 days
  1: 1 day
  n: "%1 days"

and voila - nasty error message vanished.

Solution 17 - Ruby on-Rails-3

I manage to fix this problem by installing gem psych inside group :development and :test.

gem 'psych'

Solution 18 - Ruby on-Rails-3

I had the same issue with ruby 1.9.2-p180 , going to 1.9.2-p290 solved this for me

Solution 19 - Ruby on-Rails-3

Though the answer given by @Vicvega may or may not work (Didn't test it) it goes against Rails and Ruby common principle "Convention over configuration" and should be treated with care (and even more in collaborative work),,, even though the "configuration" in this case is not great

so my vote goes (If i could vote) for those who proposed to eliminate the syntax errors in the YAML files.

now... to solve the error, for me it was kind of a newby error, I didn't have the locale file which I had defined to be the default in Config/application.rb in my Config/locales directory

happy coding

Solution 20 - Ruby on-Rails-3

Need to check .yml files for error, I have found problem in my database.yml

Solution 21 - Ruby on-Rails-3

I had a similar issue with a malformed YAML translation file. It used a variable before defining it. The following was wrong:

...
messages:
  ...
  <<: *errors_messages
...
messages: &errors_messages
...

It had to be changed to:

...
messages: &errors_messages
...
messages:
  ...
  <<: *errors_messages
...

Then it started working again.

Solution 22 - Ruby on-Rails-3

If you're like me and facing a project (inherited) with hundreds of fixtures a few lines of Ruby can save you hours:

require 'yaml'

d = Dir.new('test/fixtures/')
d.each do |file|
  begin
     f =  YAML.load_file('test/fixtures/' + file)
  rescue StandardError
     puts "failed to read test/fixtures/#{file}: #{$!}"
   end
 end

Just put it in your Rails root and run it, trash it when you're done.

Solution 23 - Ruby on-Rails-3

In my case there were 2 issues.

  1. As mentioned by @stwienert, the array representation was an issue.
  2. One more thing was, if a String started with a %{var} I received a Parse exception. I had to change the strings accordingly to avoid beginning with %{var}

For example if the string was

%{user_name} welcome to %{application_name} -- This threw an error

To fix it I had to change it to

Hi, %{user_name} welcome to %{application_name}

Hope this helps someone.

Regards,

Shardul.

Solution 24 - Ruby on-Rails-3

Well, just in case this helps...
What I did:

  • select all and copy from https://github.com/svenfuchs/rails-i18n/tree/master/rails/locale/es.yml into a new es.yml with notepad++
  • tried to watch this new file with netBeans IDE text editor, I got a warning about safe load with utf8 (cannot recall the exact text). Hence did not open it with this text editor.
  • switched the local thru configuration/application.rb i18n
  • when I loaded a irb page I got "couldn't parse YAML at line 0 column 0" referring to Psych.
    - Went to IRB and loaded the file with syck it was ok; switched to psych and got same error.

How I solved it:

Solution 25 - Ruby on-Rails-3

Remove unused databases from database.rb. If you use MySQL and there is no PostgreSQL then delete PG database code from databases.yml.

Solution 26 - Ruby on-Rails-3

Pshych parse is suck to the core. I am not sure if this is elegant solution but i manage to fix this problem by uninstalling it.

gem uninstall psych

Solution 27 - Ruby on-Rails-3

I had a really, really strange problem because I had spaces after. E.g.:

title: "NASA"

Did not work, but

title:"NASA"

Did.

Solution 28 - Ruby on-Rails-3

For other people looking at this I found the issue in rerun.txt which was being called by config/cucumber.yml in a Rails app. rerun.txt was configured to store the most recent cucumber failing test and I had somehow entered weird characters for a cucumber test in the console.

That was hard to find. Wish I had seen Glenn Rempe's answer a while back.

Solution 29 - Ruby on-Rails-3

One of the possible causes is mapping values are not allowed in this context at line ...

Here is an incorrect YAML example (user: should not contain any value actually, because it contains children items some_key and some_other_key)

customer: Customer
user: User
  some_key: value
  some_other_key: value 2

It's not a trivial task to find such issue especially if you have a huge YAML file.

I've created a pretty simple regexp to detect such things. I checked it in RubyMine

^(\s+)['"\w]+:\s?['"\w]+.*\n\1\s\s

Be careful! It doesn't work correct with special chars like å ø æ etc.

Let me know in comments if it worked for you :)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionmegasView Question on Stackoverflow
Solution 1 - Ruby on-Rails-3vicvegaView Answer on Stackoverflow
Solution 2 - Ruby on-Rails-3stwienertView Answer on Stackoverflow
Solution 3 - Ruby on-Rails-3Glenn RempeView Answer on Stackoverflow
Solution 4 - Ruby on-Rails-3HonzaView Answer on Stackoverflow
Solution 5 - Ruby on-Rails-3flunderView Answer on Stackoverflow
Solution 6 - Ruby on-Rails-3Christian SommerauerView Answer on Stackoverflow
Solution 7 - Ruby on-Rails-3FlyboyArtView Answer on Stackoverflow
Solution 8 - Ruby on-Rails-3tiddyView Answer on Stackoverflow
Solution 9 - Ruby on-Rails-3DavidView Answer on Stackoverflow
Solution 10 - Ruby on-Rails-3vicvegaView Answer on Stackoverflow
Solution 11 - Ruby on-Rails-3dimitarvpView Answer on Stackoverflow
Solution 12 - Ruby on-Rails-3gamovView Answer on Stackoverflow
Solution 13 - Ruby on-Rails-3Anita GrahamView Answer on Stackoverflow
Solution 14 - Ruby on-Rails-3wantrapreneurView Answer on Stackoverflow
Solution 15 - Ruby on-Rails-3TimView Answer on Stackoverflow
Solution 16 - Ruby on-Rails-3Dave SagView Answer on Stackoverflow
Solution 17 - Ruby on-Rails-3Thaha kpView Answer on Stackoverflow
Solution 18 - Ruby on-Rails-3Jakob CosoroabaView Answer on Stackoverflow
Solution 19 - Ruby on-Rails-3juanm55View Answer on Stackoverflow
Solution 20 - Ruby on-Rails-3chaitanyaView Answer on Stackoverflow
Solution 21 - Ruby on-Rails-3RemoView Answer on Stackoverflow
Solution 22 - Ruby on-Rails-3Paul RaupachView Answer on Stackoverflow
Solution 23 - Ruby on-Rails-3SB.View Answer on Stackoverflow
Solution 24 - Ruby on-Rails-3Victor MaidanaView Answer on Stackoverflow
Solution 25 - Ruby on-Rails-3vijayView Answer on Stackoverflow
Solution 26 - Ruby on-Rails-3sovanlandyView Answer on Stackoverflow
Solution 27 - Ruby on-Rails-3andrewmart.inView Answer on Stackoverflow
Solution 28 - Ruby on-Rails-3webdevguyView Answer on Stackoverflow
Solution 29 - Ruby on-Rails-3Sergiy SeletskyyView Answer on Stackoverflow