Created
January 20, 2010 21:11
-
-
Save snoblenet/282265 to your computer and use it in GitHub Desktop.
This file contains hidden or 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
module Cucumber | |
module Cli | |
class ProfileLoader | |
def initialize | |
@cucumber_yml = nil | |
end | |
def args_from(profile) | |
unless cucumber_yml.has_key?(profile) | |
raise(ProfileNotFound, <<-END_OF_ERROR) | |
Could not find profile: '#{profile}' | |
Defined profiles in cucumber.yml: | |
* #{cucumber_yml.keys.join("\n * ")} | |
END_OF_ERROR | |
end | |
args_from_yml = cucumber_yml[profile] || '' | |
case(args_from_yml) | |
when String | |
raise YmlLoadError, "The '#{profile}' profile in cucumber.yml was blank. Please define the command line arguments for the '#{profile}' profile in cucumber.yml.\n" if args_from_yml =~ /^\s*$/ | |
args_from_yml = args_from_yml.split(' ') | |
when Array | |
raise YmlLoadError, "The '#{profile}' profile in cucumber.yml was empty. Please define the command line arguments for the '#{profile}' profile in cucumber.yml.\n" if args_from_yml.empty? | |
else | |
raise YmlLoadError, "The '#{profile}' profile in cucumber.yml was a #{args_from_yml.class}. It must be a String or Array" | |
end | |
args_from_yml | |
end | |
def has_profile?(profile) | |
cucumber_yml.has_key?(profile) | |
end | |
def cucumber_yml_defined? | |
cucumber_file && File.exist?(cucumber_file) | |
end | |
private | |
# Loads the profile, processing it through ERB and YAML, and returns it as a hash. | |
def cucumber_yml | |
return @cucumber_yml if @cucumber_yml | |
unless cucumber_yml_defined? | |
raise(ProfilesNotDefinedError,"cucumber.yml was not found. Please refer to cucumber's documentation on defining profiles in cucumber.yml. You must define a 'default' profile to use the cucumber command without any arguments.\nType 'cucumber --help' for usage.\n") | |
end | |
require 'erb' | |
require 'yaml' | |
begin | |
@cucumber_erb = ERB.new(IO.read(cucumber_file)).result | |
rescue Exception => e | |
raise(YmlLoadError,"cucumber.yml was found, but could not be parsed with ERB. Please refer to cucumber's documentation on correct profile usage.\n#{$!.inspect}") | |
end | |
begin | |
@cucumber_yml = YAML::load(@cucumber_erb) | |
rescue StandardError => e | |
e.message << "\nYAML:\n#{@cucumber_erb}\n" | |
raise e | |
raise(YmlLoadError,"cucumber.yml was found, but could not be parsed. Please refer to cucumber's documentation on correct profile usage.\n") | |
end | |
if @cucumber_yml.nil? || !@cucumber_yml.is_a?(Hash) | |
raise(YmlLoadError,"cucumber.yml was found, but was blank or malformed. Please refer to cucumber's documentation on correct profile usage.\n") | |
end | |
return @cucumber_yml | |
end | |
# Locates cucumber.yml file. The file can end in .yml or .yaml, | |
# and be located in the current directory (eg. project root) or | |
# in a .config/ or config/ subdirectory of the current directory. | |
def cucumber_file | |
@cucumber_file ||= Dir.glob('{,.config/,config/}cucumber{.yml,.yaml}').first | |
end | |
end | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment