Thor YAML.load_file invalid subclass (TypeError)
Question
I'm creating a thor script that shows the current project I am on based on a yml file that stores Ruby structures. I'm getting an error when I tried to load this yml file.
from /Users/cpara/.rvm/rubies/ruby-1.9.2-p318/lib/ruby/1.9.1/syck.rb:135:in `node_import'
from /Users/cpara/.rvm/rubies/ruby-1.9.2-p318/lib/ruby/1.9.1/syck.rb:135:in `load'
from /Users/cpara/.rvm/rubies/ruby-1.9.2-p318/lib/ruby/1.9.1/syck.rb:135:in `load'
from /Users/cpara/.rvm/rubies/ruby-1.9.2-p318/lib/ruby/1.9.1/syck.rb:146:in `block in load_file'
from /Users/cpara/.rvm/rubies/ruby-1.9.2-p318/lib/ruby/1.9.1/syck.rb:145:in `open'
from /Users/cpara/.rvm/rubies/ruby-1.9.2-p318/lib/ruby/1.9.1/syck.rb:145:in `load_file'
from ./project:84:in `current'
from /Users/cpara/.rvm/gems/ruby-1.9.2-p318@rails/gems/thor-0.14.6/lib/thor/task.rb:22:in `run'
from /Users/cpara/.rvm/gems/ruby-1.9.2-p318@rails/gems/thor-0.14.6/lib/thor/invocation.rb:118:in `invoke_task'
from /Users/cpara/.rvm/gems/ruby-1.9.2-p318@rails/gems/thor-0.14.6/lib/thor.rb:263:in `dispatch'
from /Users/cpara/.rvm/gems/ruby-1.9.2-p318@rails/gems/thor-0.14.6/lib/thor/base.rb:389:in `start'
from ./project:213:in `<main>'
Here is the piece of the script I'm trying to run:
#!/usr/bin/env ruby
require 'yaml'
class Project < Thor
include Thor::Actions
# Task: return current project
desc 'current', 'Shows current project.'
def current
projects = YAML.load_file "#{ENV['HOME']}/.hana/data/projects.yml" #error
abort "There are no projects. Try creating one first." if not @projects.is_a? Array
projects.each do |project|
if project.current == true
say_status :current, "Current project: #{project.name} // #{project.type} // #{project.version}", :green
return project
end
end
say_status :error, "There is no current project.", :red
end
end
I've triple checked the path in irb and it does exist. I thought it was the way my YAML was storing my Ruby structure but even the console, I get the error. Here is my YAML file
---
- !ruby/struct:Proj
name: test
type: testing
version: 4.0.2
deploy_dir: deploy
source_dir: source
current: true
Any ideas? I'm running Ruby 1.9.2p318.
Solution
YAML is trying to instanciate a Struct named Proj from the file as indicated by the line:
!ruby/struct:Proj
You should require the file where you haved defined Proj before loading the yaml. Or, just to test if it works, in your code, after the require 'yaml' line define Proj:
Proj = Struct.new(:name, :type, :version, :deploy_dir, :source_dir, :current)
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow