scaffolder-tools 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,57 @@
1
+ require 'scaffolder/tool'
2
+
3
+ class Scaffolder::Tool::Help < Scaffolder::Tool
4
+ include Scaffolder::ToolIndex
5
+
6
+ def self.description
7
+ "Help information for scaffolder commands"
8
+ end
9
+
10
+ def execute
11
+ raise_for_unknown(@settings[:unknown_tool]) if @settings[:unknown_tool]
12
+
13
+ tool = settings.rest.first
14
+ if tool
15
+ raise_for_unknown(tool) unless tool_exists?(tool)
16
+ man settings.rest.first
17
+ elsif @settings[:version]
18
+ return version
19
+ else
20
+ return help
21
+ end
22
+ end
23
+
24
+ private
25
+
26
+ def raise_for_unknown(command)
27
+ msg = "Unknown command '#{command}'.\nSee 'scaffolder help'."
28
+ raise ArgumentError.new(msg)
29
+ end
30
+
31
+ def version
32
+ ver = File.read(File.join(%W|#{File.dirname(__FILE__)} .. .. .. VERSION|)).strip
33
+ "scaffolder tool version #{ver}"
34
+ end
35
+
36
+ def help
37
+ string = <<-MSG.gsub(/^ {6}/, '')
38
+ usage: scaffolder [--version] COMMAND scaffold-file sequence-file
39
+ [options]
40
+
41
+ Commands:
42
+ MSG
43
+ [:help,:sequence,:validate].each do |name|
44
+ string << " "
45
+ string << name.to_s.ljust(12)
46
+ string << tools[name].description + "\n"
47
+ end
48
+ string
49
+ end
50
+
51
+ def man(tool)
52
+ man_page = File.join(
53
+ %W|#{File.dirname(__FILE__)} .. .. .. man scaffolder-#{tool}.1.ronn|)
54
+
55
+ Kernel.system("ronn -m #{File.expand_path(man_page)}")
56
+ end
57
+ end
@@ -0,0 +1,34 @@
1
+ require 'yaml'
2
+ require 'digest/sha1'
3
+ require 'scaffolder'
4
+ require 'scaffolder/tool'
5
+
6
+ class Scaffolder::Tool::Sequence < Scaffolder::Tool
7
+
8
+ def self.description
9
+ "Generate the fasta output for the scaffold"
10
+ end
11
+
12
+ def execute
13
+ s = sequence(scaffold)
14
+ Bio::Sequence.new(s).output(:fasta,:header => header(s,@settings))
15
+ end
16
+
17
+ private
18
+
19
+ def sequence(scaffold)
20
+ sequence = scaffold.inject(String.new) do |string,entry|
21
+ string << entry.sequence
22
+ end
23
+ end
24
+
25
+ def header(sequence,opts={})
26
+ header = String.new
27
+ header << opts[:definition] + " " if opts[:definition]
28
+ unless opts[:no] && opts[:no][:sequence] && opts[:no][:sequence][:hash]
29
+ header << Digest::SHA1.hexdigest(sequence)
30
+ end
31
+ header
32
+ end
33
+
34
+ end
@@ -0,0 +1,51 @@
1
+ require 'yaml'
2
+ require 'scaffolder'
3
+ require 'scaffolder/tool'
4
+
5
+ class Scaffolder::Tool::Validate < Scaffolder::Tool
6
+
7
+ def self.description
8
+ "Validate scaffold for overlapping inserts"
9
+ end
10
+
11
+ def execute
12
+ bad_sequences = errors
13
+ return if bad_sequences.empty?
14
+
15
+ output = bad_sequences.inject(Array.new) do |array, sequence|
16
+ self.class.sequence_errors(sequence).each do |overlaps|
17
+ array << {'sequence-insert-overlap' => {
18
+ 'source' => sequence.source,
19
+ 'inserts' => overlaps.map do |overlap|
20
+ {'open' => overlap.open,
21
+ 'close' => overlap.close,
22
+ 'source' => overlap.source}
23
+ end
24
+ }}
25
+ end
26
+ array
27
+ end
28
+
29
+ YAML.dump(output)
30
+ end
31
+
32
+ def errors
33
+ sequences = scaffold.select{|i| i.entry_type == :sequence}
34
+ sequences.reject{|i| self.class.sequence_errors(i).empty? }
35
+ end
36
+
37
+ def self.inserts_overlap?(a,b)
38
+ ! (a.position.to_a & b.position.to_a).empty?
39
+ end
40
+
41
+ def self.sequence_errors(sequence)
42
+ sequence.inserts.inject(Array.new) do |errors,a|
43
+ sequence.inserts.each do |b|
44
+ next if a.equal?(b)
45
+ errors << [a,b].sort if inserts_overlap?(a,b)
46
+ end
47
+ errors
48
+ end.uniq
49
+ end
50
+
51
+ end
@@ -0,0 +1,44 @@
1
+ require 'scaffolder'
2
+
3
+ class Scaffolder::Tool
4
+ require 'scaffolder/tool_index'
5
+
6
+ attr :scaffold_file
7
+ attr :sequence_file
8
+ attr :settings
9
+
10
+ def initialize(settings)
11
+ @scaffold_file = settings.rest.first
12
+ @sequence_file = settings.rest.last
13
+ @settings = settings
14
+ end
15
+
16
+ def run(out=STDOUT,err=STDERR)
17
+ begin
18
+ message = execute
19
+ rescue Exception => e
20
+ err.puts("Error. #{e.message}")
21
+ exit(1)
22
+ else
23
+ out.puts(message) if message
24
+ exit(0)
25
+ end
26
+ end
27
+
28
+ def scaffold
29
+ {:Scaffold => @scaffold_file, :Sequence => @sequence_file}.each do |name,file|
30
+ unless File.exists?(file)
31
+ raise ArgumentError.new("#{name} file not found: #{file}")
32
+ end
33
+ if File.size(file) == 0
34
+ raise ArgumentError.new("#{name} file is empty: #{file}")
35
+ end
36
+ end
37
+
38
+ Scaffolder.new(YAML.load(File.read(@scaffold_file)),@sequence_file)
39
+ end
40
+
41
+ Dir["#{File.dirname(__FILE__)}/tool/*.rb"].each do |f|
42
+ require File.expand_path(f)
43
+ end
44
+ end
@@ -0,0 +1,50 @@
1
+ require 'scaffolder'
2
+
3
+ module Scaffolder::ToolIndex
4
+ require 'scaffolder/tool'
5
+
6
+ def get_tool(name)
7
+ tools[normalise(name)]
8
+ end
9
+
10
+ def tool_exists?(name)
11
+ ! get_tool(name).nil?
12
+ end
13
+
14
+ def [](type)
15
+ if tool_exists?(type)
16
+ get_tool(type)
17
+ else
18
+ Scaffolder::Tool::Help
19
+ end
20
+ end
21
+
22
+ def determine_tool(settings)
23
+ type = settings.rest.shift
24
+ tool_class = self[type]
25
+ settings[:unknown_tool] = type unless (tool_exists?(type) or type.nil?)
26
+ [tool_class,settings]
27
+ end
28
+
29
+ private
30
+
31
+ def tool_classes
32
+ Scaffolder::Tool.constants.inject(Array.new) do |array,constant|
33
+ clss = Scaffolder::Tool.const_get(constant)
34
+ array << clss if clss.superclass == Scaffolder::Tool
35
+ array
36
+ end
37
+ end
38
+
39
+ def tools
40
+ tool_classes.inject(Hash.new) do |hash,clss|
41
+ hash[clss.to_s.split('::').last.downcase.to_sym] = clss
42
+ hash
43
+ end
44
+ end
45
+
46
+ def normalise(name)
47
+ name.to_s.downcase.to_sym if name
48
+ end
49
+
50
+ end
@@ -0,0 +1,23 @@
1
+ scaffolder-help(1) -- display help information about scaffolder commands
2
+ ========================================================================
3
+
4
+ ## SYNOPSIS
5
+
6
+ `scaffolder help` [COMMAND]
7
+
8
+ ## DESCRIPTION
9
+
10
+ When run with no options **scaffolder-help** returns a list of available
11
+ commands. When run with a scaffolder command name the corresponding man page is
12
+ shown.
13
+
14
+ ## BUGS
15
+
16
+ **Scaffolder-help** is written in Ruby and depends on the scaffolder, BioRuby,
17
+ configliere and ronn gems. See the Gemfile in the scaffolder-tools gem install
18
+ directory for version details.
19
+
20
+ ## COPYRIGHT
21
+
22
+ **Scaffolder** is Copyright (C) 2010 Michael Barton
23
+ <http://michaelbarton.me.uk>
@@ -0,0 +1,48 @@
1
+ scaffolder-sequence(1) -- assemble yaml scaffold file into fasta sequence
2
+ =========================================================================
3
+
4
+ ## SYNOPSIS
5
+
6
+ `scaffolder sequence` [<options>...] <scaffold-file> <sequence-file>
7
+
8
+ ## DESCRIPTION
9
+
10
+ **Scaffolder-sequence** assembles a single fasta nucleotide sequence from the
11
+ sequences and coordinates specified in the **scaffold-file**.
12
+
13
+ ## FILES
14
+
15
+ **Scaffolder-sequence** requires two files to create a fasta assembly. The
16
+ **scaffold-file** specifies the positions of individual contigs in the scaffold
17
+ assembly. The **sequence-file** contains the corresponding fasta sequences of
18
+ each contig specified in the scaffold file.
19
+
20
+ ## OPTIONS
21
+
22
+ * `--definition`=[<definition>]:
23
+ Fasta definition line added at the top of the assembled sequence. The
24
+ default is to use the SHA1 hash of the sequence as the definition.
25
+
26
+ * `--no-sequence-hash`:
27
+ Do not append the SHA1 hash of the assembled sequence to the definition
28
+ line.
29
+
30
+ ## EXAMPLES
31
+
32
+ Assemble sequence using a scaffold file and fasta formatted set of contigs.
33
+ Pipe the assembly into another file.
34
+
35
+ $ scaffolder-sequence scaffold.yml contigs.fna > assembly.fna
36
+
37
+ ## BUGS
38
+
39
+ ## BUGS
40
+
41
+ **Scaffolder-sequence** is written in Ruby and depends on the scaffolder,
42
+ BioRuby, configliere and ronn gems. See the Gemfile in the scaffolder-tools gem
43
+ install directory for version details.
44
+
45
+ ## COPYRIGHT
46
+
47
+ **Scaffolder** is Copyright (C) 2010 Michael Barton
48
+ <http://michaelbarton.me.uk>
@@ -0,0 +1,28 @@
1
+ scaffolder-validate(1) -- Test scaffold for overlapping inserts
2
+ ===============================================================
3
+
4
+ ## SYNOPSIS
5
+
6
+ `scaffolder validate` <scaffolder-file> <sequence-file>
7
+
8
+ ## DESCRIPTION
9
+
10
+ **Scaffolder-validate** examines the **scaffolder-file** to detect overlapping
11
+ sequence inserts. Overlapping sequence inserts may lead to unexpected sequence
12
+ output in generated scaffold sequence and should be avoided. A list of any
13
+ overlapping inserts is returned in a yaml format.
14
+
15
+ ## EXAMPLES
16
+
17
+ $ scaffolder-validate scaffold.yml sequences.fna > overlapping_inserts.yml
18
+
19
+ ## BUGS
20
+
21
+ **Scaffolder-validate** is written in Ruby and depends on the scaffolder,
22
+ BioRuby, configliere and ronn gems. See the Gemfile in the scaffolder-tools gem
23
+ install directory for version details.
24
+
25
+ ## COPYRIGHT
26
+
27
+ **Scaffolder** is Copyright (C) 2010 Michael Barton
28
+ <http://michaelbarton.me.uk>
@@ -0,0 +1,125 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{scaffolder-tools}
8
+ s.version = "0.1.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Michael Barton"]
12
+ s.date = %q{2011-01-04}
13
+ s.default_executable = %q{scaffolder}
14
+ s.description = %q{Binary to use with scaffolder genome scaffolds}
15
+ s.email = %q{mail@michaelbarton.me.uk}
16
+ s.executables = ["scaffolder"]
17
+ s.extra_rdoc_files = [
18
+ "LICENSE.txt",
19
+ "README.rdoc"
20
+ ]
21
+ s.files = [
22
+ ".document",
23
+ ".rspec",
24
+ "Gemfile",
25
+ "LICENSE.txt",
26
+ "README.rdoc",
27
+ "Rakefile",
28
+ "VERSION",
29
+ "bin/scaffolder",
30
+ "features/help.feature",
31
+ "features/sequence.feature",
32
+ "features/step_definitions/scaffolder-tools.rb",
33
+ "features/support/env.rb",
34
+ "features/validate.feature",
35
+ "lib/scaffolder/binary_helper.rb",
36
+ "lib/scaffolder/tool.rb",
37
+ "lib/scaffolder/tool/help.rb",
38
+ "lib/scaffolder/tool/sequence.rb",
39
+ "lib/scaffolder/tool/validate.rb",
40
+ "lib/scaffolder/tool_index.rb",
41
+ "man/scaffolder-help.1.ronn",
42
+ "man/scaffolder-sequence.1.ronn",
43
+ "man/scaffolder-validate.1.ronn",
44
+ "scaffolder-tools.gemspec",
45
+ "spec/scaffolder/binary_helper_spec.rb",
46
+ "spec/scaffolder/tool/help_spec.rb",
47
+ "spec/scaffolder/tool/sequence_spec.rb",
48
+ "spec/scaffolder/tool/validate_spec.rb",
49
+ "spec/scaffolder/tool_index_spec.rb",
50
+ "spec/scaffolder/tool_spec.rb",
51
+ "spec/spec_helper.rb",
52
+ "spec/support/exit_code_matcher.rb"
53
+ ]
54
+ s.homepage = %q{http://github.com/michaelbarton/scaffolder-tools}
55
+ s.licenses = ["MIT"]
56
+ s.require_paths = ["lib"]
57
+ s.rubygems_version = %q{1.3.7}
58
+ s.summary = %q{Tools for manipulating genome scaffolds}
59
+ s.test_files = [
60
+ "spec/scaffolder/binary_helper_spec.rb",
61
+ "spec/scaffolder/tool/help_spec.rb",
62
+ "spec/scaffolder/tool/sequence_spec.rb",
63
+ "spec/scaffolder/tool/validate_spec.rb",
64
+ "spec/scaffolder/tool_index_spec.rb",
65
+ "spec/scaffolder/tool_spec.rb",
66
+ "spec/spec_helper.rb",
67
+ "spec/support/exit_code_matcher.rb"
68
+ ]
69
+
70
+ if s.respond_to? :specification_version then
71
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
72
+ s.specification_version = 3
73
+
74
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
75
+ s.add_runtime_dependency(%q<configliere>, ["~> 0.1"])
76
+ s.add_runtime_dependency(%q<bio>, ["~> 1.4"])
77
+ s.add_runtime_dependency(%q<scaffolder>, ["~> 0.4"])
78
+ s.add_runtime_dependency(%q<ronn>, ["~> 0.7"])
79
+ s.add_development_dependency(%q<bundler>, ["~> 1.0"])
80
+ s.add_development_dependency(%q<jeweler>, ["~> 1.5"])
81
+ s.add_development_dependency(%q<gherkin>, ["~> 2.3.3"])
82
+ s.add_development_dependency(%q<rspec>, ["~> 2.4"])
83
+ s.add_development_dependency(%q<cucumber>, ["~> 0.10"])
84
+ s.add_development_dependency(%q<fakefs>, ["~> 0.2"])
85
+ s.add_development_dependency(%q<aruba>, ["~> 0.2"])
86
+ s.add_development_dependency(%q<mocha>, ["~> 0.9"])
87
+ s.add_development_dependency(%q<hashie>, ["~> 0.4"])
88
+ s.add_development_dependency(%q<yard>, ["~> 0.6"])
89
+ s.add_development_dependency(%q<scaffolder-test-helpers>, ["~> 0.1"])
90
+ else
91
+ s.add_dependency(%q<configliere>, ["~> 0.1"])
92
+ s.add_dependency(%q<bio>, ["~> 1.4"])
93
+ s.add_dependency(%q<scaffolder>, ["~> 0.4"])
94
+ s.add_dependency(%q<ronn>, ["~> 0.7"])
95
+ s.add_dependency(%q<bundler>, ["~> 1.0"])
96
+ s.add_dependency(%q<jeweler>, ["~> 1.5"])
97
+ s.add_dependency(%q<gherkin>, ["~> 2.3.3"])
98
+ s.add_dependency(%q<rspec>, ["~> 2.4"])
99
+ s.add_dependency(%q<cucumber>, ["~> 0.10"])
100
+ s.add_dependency(%q<fakefs>, ["~> 0.2"])
101
+ s.add_dependency(%q<aruba>, ["~> 0.2"])
102
+ s.add_dependency(%q<mocha>, ["~> 0.9"])
103
+ s.add_dependency(%q<hashie>, ["~> 0.4"])
104
+ s.add_dependency(%q<yard>, ["~> 0.6"])
105
+ s.add_dependency(%q<scaffolder-test-helpers>, ["~> 0.1"])
106
+ end
107
+ else
108
+ s.add_dependency(%q<configliere>, ["~> 0.1"])
109
+ s.add_dependency(%q<bio>, ["~> 1.4"])
110
+ s.add_dependency(%q<scaffolder>, ["~> 0.4"])
111
+ s.add_dependency(%q<ronn>, ["~> 0.7"])
112
+ s.add_dependency(%q<bundler>, ["~> 1.0"])
113
+ s.add_dependency(%q<jeweler>, ["~> 1.5"])
114
+ s.add_dependency(%q<gherkin>, ["~> 2.3.3"])
115
+ s.add_dependency(%q<rspec>, ["~> 2.4"])
116
+ s.add_dependency(%q<cucumber>, ["~> 0.10"])
117
+ s.add_dependency(%q<fakefs>, ["~> 0.2"])
118
+ s.add_dependency(%q<aruba>, ["~> 0.2"])
119
+ s.add_dependency(%q<mocha>, ["~> 0.9"])
120
+ s.add_dependency(%q<hashie>, ["~> 0.4"])
121
+ s.add_dependency(%q<yard>, ["~> 0.6"])
122
+ s.add_dependency(%q<scaffolder-test-helpers>, ["~> 0.1"])
123
+ end
124
+ end
125
+
@@ -0,0 +1,71 @@
1
+ require File.join(File.dirname(__FILE__),'..','spec_helper')
2
+
3
+ describe Scaffolder::BinaryHelper do
4
+
5
+ before(:each) do
6
+ @help_tool = Scaffolder::Tool::Help
7
+
8
+ @tool_class = Class.new(Scaffolder::Tool)
9
+ @tool_name = 'type'
10
+ Scaffolder::Tool.const_set(@tool_name.capitalize,@tool_class)
11
+
12
+ @args = OpenStruct.new({ :rest => %W|#{@tool_name} arg1 arg2| })
13
+ end
14
+
15
+ after(:each) do
16
+ Scaffolder::Tool.send(:remove_const,'Type')
17
+ end
18
+
19
+ subject do
20
+ object = Object.new
21
+ object.extend described_class
22
+ object
23
+ end
24
+
25
+ describe "select_tool method" do
26
+
27
+ it "should return corresponding tool subclass when requested by name" do
28
+ subject[@tool_name].should == @tool_class
29
+ end
30
+
31
+ it "should return the help tool when passed an unknown name" do
32
+ subject['unknown-tool'].should == @help_tool
33
+ end
34
+
35
+ it "should return the help tool when passed nil" do
36
+ subject[nil].should == @help_tool
37
+ end
38
+
39
+ end
40
+
41
+ it "should fetch the right tool class when requested" do
42
+ tool, args = subject.determine_tool(@args)
43
+ tool.should == @tool_class
44
+ args.rest.should == @args.rest[-2..-1]
45
+ end
46
+
47
+ it "should fetch the help tool class when no arguments passed" do
48
+ no_args = Hash.new
49
+ no_args.expects(:rest).returns([])
50
+
51
+ expected = no_args.clone
52
+ expected[:empty_args] = true
53
+
54
+ tool, args = subject.determine_tool(no_args)
55
+
56
+ tool.should == @help_tool
57
+ args.should == expected
58
+ end
59
+
60
+ it "should fetch the help tool class when an invalid argument is passed" do
61
+ args = Hash.new
62
+ args.expects(:rest).returns(['unknown-tool'])
63
+ updated_args = args.clone
64
+ updated_args[:unknown_tool] = 'unknown-tool'
65
+
66
+ tool, args = subject.determine_tool(args)
67
+
68
+ tool.should == @help_tool
69
+ args.should == updated_args
70
+ end
71
+ end
@@ -0,0 +1,127 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__),'..','..','spec_helper'))
2
+
3
+ describe Scaffolder::Tool::Help do
4
+
5
+ it "should inherit from Scaffolder::Tool" do
6
+ described_class.superclass.should == Scaffolder::Tool
7
+ end
8
+
9
+ it "should return the description of the tool" do
10
+ desc = "Help information for scaffolder commands"
11
+ described_class.description.should == desc
12
+ end
13
+
14
+ USAGE = <<-MSG.gsub(/^ {6}/, '')
15
+ usage: scaffolder [--version] COMMAND scaffold-file sequence-file
16
+ [options]
17
+
18
+ Commands:
19
+ MSG
20
+
21
+ before(:each) do
22
+ @settings = Hash.new
23
+ @settings.stubs(:rest).returns([])
24
+ end
25
+
26
+ describe "execution with no command and the version argument" do
27
+
28
+ subject do
29
+ @settings[:version] = true
30
+ @settings[:empty_args] = true
31
+ described_class.new(@settings)
32
+ end
33
+
34
+ it "should not raise an error" do
35
+ lambda{ subject.execute }.should_not raise_error
36
+ end
37
+
38
+ it "should return the version number" do
39
+ version = File.read('VERSION').strip
40
+ subject.execute.should == "scaffolder tool version " + version
41
+ end
42
+
43
+ end
44
+
45
+ describe "execution with no command" do
46
+
47
+ subject do
48
+ @settings[:empty_args] = true
49
+ described_class.new(@settings)
50
+ end
51
+
52
+ it "should not raise an error" do
53
+ lambda{ subject.execute }.should_not raise_error
54
+ end
55
+
56
+ it "should contain the usage information" do
57
+ subject.execute.should include(USAGE)
58
+ end
59
+
60
+ it "should contain each tool information" do
61
+ tool_subclasses.each do |cls|
62
+ subject.execute.should include(cls.description)
63
+ end
64
+ end
65
+
66
+ end
67
+
68
+ describe "execution with an invalid command arguments" do
69
+
70
+ subject do
71
+ @settings[:unknown_tool] = 'unknown_command'
72
+ described_class.new(@settings)
73
+ end
74
+
75
+ it "should raise an error" do
76
+ lambda{ subject.execute }.should(raise_error(ArgumentError,
77
+ "Unknown command 'unknown_command'.\nSee 'scaffolder help'."))
78
+ end
79
+
80
+ end
81
+
82
+ describe "execution with the name of a scaffolder tool command" do
83
+
84
+ before(:each) do
85
+ @tool = Class.new(Scaffolder::Tool)
86
+ described_class.superclass.const_set('Fake',@tool)
87
+
88
+ @man_dir = File.join(%W|#{File.dirname(__FILE__)} .. .. .. man| )
89
+ @fake_man = File.join(@man_dir,'scaffolder-fake.1.ronn')
90
+ end
91
+
92
+ after(:each) do
93
+ described_class.superclass.send(:remove_const,'Fake')
94
+ end
95
+
96
+ subject do
97
+ @settings.stubs(:rest).returns(['fake'])
98
+ described_class.new(@settings)
99
+ end
100
+
101
+ it "should not raise an error" do
102
+ Kernel.stubs(:system).with("ronn -m #{File.expand_path(@fake_man)}")
103
+ lambda{ subject.execute }.should_not raise_error
104
+ end
105
+
106
+ it "should call ronn on the command line with the man file location" do
107
+ Kernel.expects(:system).with("ronn -m #{File.expand_path(@fake_man)}")
108
+ subject.execute
109
+ end
110
+
111
+ end
112
+
113
+ describe "execution with the name of a unknown command" do
114
+
115
+ subject do
116
+ @settings.stubs(:rest).returns(['fake'])
117
+ described_class.new(@settings)
118
+ end
119
+
120
+ it "should raise an error" do
121
+ lambda{ subject.execute }.should(raise_error(ArgumentError,
122
+ "Unknown command 'fake'.\nSee 'scaffolder help'."))
123
+ end
124
+
125
+ end
126
+
127
+ end