boson 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +29 -12
- data/Rakefile +2 -2
- data/VERSION.yml +2 -2
- data/lib/boson.rb +4 -3
- data/lib/boson/command.rb +11 -1
- data/lib/boson/commands/core.rb +6 -6
- data/lib/boson/commands/web_core.rb +17 -4
- data/lib/boson/index.rb +30 -15
- data/lib/boson/inspector.rb +2 -2
- data/lib/boson/inspectors/argument_inspector.rb +4 -4
- data/lib/boson/inspectors/comment_inspector.rb +2 -2
- data/lib/boson/inspectors/method_inspector.rb +8 -6
- data/lib/boson/libraries/file_library.rb +60 -3
- data/lib/boson/libraries/module_library.rb +1 -1
- data/lib/boson/library.rb +23 -2
- data/lib/boson/loader.rb +2 -2
- data/lib/boson/manager.rb +3 -2
- data/lib/boson/namespace.rb +18 -13
- data/lib/boson/option_parser.rb +63 -18
- data/lib/boson/repo.rb +29 -10
- data/lib/boson/runner.rb +19 -13
- data/lib/boson/runners/bin_runner.rb +42 -21
- data/lib/boson/runners/console_runner.rb +54 -0
- data/lib/boson/scientist.rb +92 -17
- data/lib/boson/util.rb +22 -3
- data/lib/boson/view.rb +15 -3
- data/test/bin_runner_test.rb +18 -8
- data/test/loader_test.rb +1 -1
- data/test/manager_test.rb +2 -2
- data/test/repo_test.rb +1 -1
- data/test/runner_test.rb +7 -7
- data/test/scientist_test.rb +8 -7
- data/test/test_helper.rb +14 -3
- metadata +5 -6
- data/lib/boson/runners/repl_runner.rb +0 -40
- data/test/config/index.marshal +0 -0
@@ -0,0 +1,54 @@
|
|
1
|
+
module Boson
|
2
|
+
# Runner used when starting irb. To use in irb, drop this in your ~/.irbrc:
|
3
|
+
# require 'boson'
|
4
|
+
# Boson.start
|
5
|
+
class ConsoleRunner < Runner
|
6
|
+
class <<self
|
7
|
+
# Starts Boson by loading configured libraries. If no default libraries are specified in the config,
|
8
|
+
# it will load up all detected libraries.
|
9
|
+
# ==== Options
|
10
|
+
# [:libraries] Array of libraries to load.
|
11
|
+
# [:verbose] Boolean to be verbose about libraries loading. Default is true.
|
12
|
+
# [:no_defaults] Boolean which turns off loading any default libraries. Default is false.
|
13
|
+
# [:autoload_libraries] Boolean which makes any command execution easier. It redefines
|
14
|
+
# method_missing on Boson.main_object so that commands with unloaded
|
15
|
+
# libraries are automatically loaded. Default is false.
|
16
|
+
def start(options={})
|
17
|
+
@options = {:verbose=>true}.merge options
|
18
|
+
init unless @initialized
|
19
|
+
Manager.load(@options[:libraries], load_options) if @options[:libraries]
|
20
|
+
end
|
21
|
+
|
22
|
+
# Loads libraries and then starts irb (or the configured console) from the commandline.
|
23
|
+
def bin_start(repl, libraries)
|
24
|
+
start :no_defaults=>true, :libraries=>libraries
|
25
|
+
repl = Boson.repo.config[:console] if Boson.repo.config[:console]
|
26
|
+
repl = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb' unless repl.is_a?(String)
|
27
|
+
unless repl.index('/') == 0 || (repl = Util.which(repl))
|
28
|
+
$stderr.puts "Console not found. Please specify full path in config[:console]."
|
29
|
+
return
|
30
|
+
end
|
31
|
+
ARGV.replace ['-f']
|
32
|
+
Kernel.load $0 = repl
|
33
|
+
end
|
34
|
+
|
35
|
+
def init #:nodoc:
|
36
|
+
super
|
37
|
+
define_autoloader if @options[:autoload_libraries]
|
38
|
+
@initialized = true
|
39
|
+
end
|
40
|
+
|
41
|
+
def default_libraries #:nodoc:
|
42
|
+
defaults = super
|
43
|
+
unless @options[:no_defaults]
|
44
|
+
new_defaults = Boson.repos.map {|e| e.config[:console_defaults] }.flatten
|
45
|
+
new_defaults = detected_libraries if new_defaults.empty?
|
46
|
+
defaults += new_defaults
|
47
|
+
defaults.uniq!
|
48
|
+
end
|
49
|
+
defaults
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
data/lib/boson/scientist.rb
CHANGED
@@ -1,27 +1,96 @@
|
|
1
1
|
require 'shellwords'
|
2
2
|
module Boson
|
3
|
+
# Scientist redefines the methods of commands that have options and/or take global options. This redefinition
|
4
|
+
# allows a command to receive its arguments normally or as a commandline app does. For a command's
|
5
|
+
# method to be redefined correctly, its last argument _must_ expect a hash.
|
6
|
+
#
|
7
|
+
# Take for example this basic method/command with an options definition:
|
8
|
+
# options :level=>:numeric, :verbose=>:boolean
|
9
|
+
# def foo(arg='', options={})
|
10
|
+
# [arg, options]
|
11
|
+
# end
|
12
|
+
#
|
13
|
+
# When Scientist wraps around foo(), argument defaults are respected:
|
14
|
+
# foo '', :verbose=>true # normal call
|
15
|
+
# foo '-v' # commandline call
|
16
|
+
#
|
17
|
+
# Both calls return: ['', {:verbose=>true}]
|
18
|
+
#
|
19
|
+
# Non-string arguments can be passed in:
|
20
|
+
# foo Object, :level=>1
|
21
|
+
# foo Object, 'l1'
|
22
|
+
#
|
23
|
+
# Both calls return: [Object, {:level=>1}]
|
24
|
+
#
|
25
|
+
# === Global Options
|
26
|
+
# Any command with options comes with default global options. For example '-hv' on such a command
|
27
|
+
# prints a help summarizing a command's options as well as the global options.
|
28
|
+
# When using global options along with command options, global options _must_ precede command options.
|
29
|
+
# Take for example using the global --pretend option with the method above:
|
30
|
+
# irb>> foo '-p -l=1'
|
31
|
+
# Arguments: ["", {:level=>1}]
|
32
|
+
# Global options: {:pretend=>true}
|
33
|
+
#
|
34
|
+
# If a global option conflicts with a command's option, the command's option takes precedence. You can get around
|
35
|
+
# this by passing a --global option which takes a string of options without their dashes. For example:
|
36
|
+
# foo '-p --fields=f1,f2 -l=1'
|
37
|
+
# # is the same as
|
38
|
+
# foo ' -g "p fields=f1,f2" -l=1 '
|
39
|
+
#
|
40
|
+
# === Rendering Views With Global Options
|
41
|
+
# Perhaps the most important global option is --render. This option toggles the rendering of your command's output
|
42
|
+
# with Hirb[http://github.com/cldwalker/hirb]. Since Hirb can be customized to generate any view, this option allows
|
43
|
+
# you toggle a predefined view for a command without embedding view code in your command!
|
44
|
+
#
|
45
|
+
# Here's a simple example, toggling Hirb's table view:
|
46
|
+
# # Defined in a library file:
|
47
|
+
# #@options {}
|
48
|
+
# def list(options={})
|
49
|
+
# [1,2,3]
|
50
|
+
# end
|
51
|
+
#
|
52
|
+
# Using it in irb:
|
53
|
+
# >> list
|
54
|
+
# => [1,2,3]
|
55
|
+
# >> list '-r'
|
56
|
+
# +-------+
|
57
|
+
# | value |
|
58
|
+
# +-------+
|
59
|
+
# | 1 |
|
60
|
+
# | 2 |
|
61
|
+
# | 3 |
|
62
|
+
# +-------+
|
63
|
+
# 3 rows in set
|
64
|
+
# => true
|
65
|
+
#
|
66
|
+
# To default to rendering a view for a command, add a render_options {method attribute}[link:classes/Boson/MethodInspector.html]
|
67
|
+
# above list() along with any options you want to pass to your Hirb helper class. In this case, using '-r' gives you the
|
68
|
+
# command's returned object instead of a formatted view!
|
3
69
|
module Scientist
|
4
70
|
extend self
|
71
|
+
# Handles all Scientist errors.
|
5
72
|
class Error < StandardError; end
|
6
73
|
class EscapeGlobalOption < StandardError; end
|
74
|
+
|
7
75
|
attr_reader :global_options, :rendered
|
8
76
|
@no_option_commands ||= []
|
9
77
|
GLOBAL_OPTIONS = {
|
10
78
|
:help=>{:type=>:boolean, :desc=>"Display a command's help"},
|
11
|
-
:render=>{:type=>:boolean, :desc=>"Toggle a command's default
|
79
|
+
:render=>{:type=>:boolean, :desc=>"Toggle a command's default rendering behavior"},
|
12
80
|
:verbose=>{:type=>:boolean, :desc=>"Increase verbosity for help, errors, etc."},
|
13
|
-
:global=>{:type=>:string, :desc=>"Pass a string of global options without the dashes
|
81
|
+
:global=>{:type=>:string, :desc=>"Pass a string of global options without the dashes"},
|
14
82
|
:pretend=>{:type=>:boolean, :desc=>"Display what a command would execute without executing it"}
|
15
|
-
}
|
83
|
+
} #:nodoc:
|
16
84
|
RENDER_OPTIONS = {
|
17
85
|
:fields=>{:type=>:array, :desc=>"Displays fields in the order given"},
|
18
86
|
:sort=>{:type=>:string, :desc=>"Sort by given field"},
|
19
|
-
:
|
87
|
+
:class=>{:type=>:string, :desc=>"Hirb helper class which renders"},
|
20
88
|
:reverse_sort=>{:type=>:boolean, :desc=>"Reverse a given sort"},
|
21
89
|
:max_width=>{:type=>:numeric, :desc=>"Max width of a table"},
|
22
90
|
:vertical=>{:type=>:boolean, :desc=>"Display a vertical table"}
|
23
|
-
}
|
91
|
+
} #:nodoc:
|
24
92
|
|
93
|
+
# Redefines a command's method for the given object.
|
25
94
|
def create_option_command(obj, command)
|
26
95
|
cmd_block = create_option_command_block(obj, command)
|
27
96
|
@no_option_commands << command if command.options.nil?
|
@@ -30,12 +99,14 @@ module Boson
|
|
30
99
|
}
|
31
100
|
end
|
32
101
|
|
102
|
+
# The actual method which replaces a command's original method
|
33
103
|
def create_option_command_block(obj, command)
|
34
104
|
lambda {|*args|
|
35
105
|
Boson::Scientist.translate_and_render(obj, command, args) {|args| super(*args) }
|
36
106
|
}
|
37
107
|
end
|
38
108
|
|
109
|
+
#:stopdoc:
|
39
110
|
def translate_and_render(obj, command, args)
|
40
111
|
@global_options = {}
|
41
112
|
args = translate_args(obj, command, args)
|
@@ -58,13 +129,9 @@ module Boson
|
|
58
129
|
return @args if @no_option_commands.include?(@command)
|
59
130
|
@args << parsed_options
|
60
131
|
if @args.size != command.arg_size && !command.has_splat_args?
|
61
|
-
command_size = @args.size > command.arg_size ? command.arg_size
|
62
|
-
|
63
|
-
|
64
|
-
"size or no argument for this method's options."
|
65
|
-
else
|
66
|
-
raise ArgumentError, "wrong number of arguments (#{@args.size - 1} for #{command_size})"
|
67
|
-
end
|
132
|
+
command_size, args_size = @args.size > command.arg_size ? [command.arg_size, @args.size] :
|
133
|
+
[command.arg_size - 1, @args.size - 1]
|
134
|
+
raise ArgumentError, "wrong number of arguments (#{args_size} for #{command_size})"
|
68
135
|
end
|
69
136
|
end
|
70
137
|
@args
|
@@ -110,7 +177,7 @@ module Boson
|
|
110
177
|
@command.render_options[k] = {:default=>v}
|
111
178
|
end
|
112
179
|
}
|
113
|
-
opts = Util.recursive_hash_merge(@command.render_options, RENDER_OPTIONS)
|
180
|
+
opts = Util.recursive_hash_merge(@command.render_options, Util.deep_copy(RENDER_OPTIONS))
|
114
181
|
opts[:sort][:values] ||= opts[:fields][:values] if opts[:fields][:values]
|
115
182
|
opts
|
116
183
|
end
|
@@ -129,11 +196,17 @@ module Boson
|
|
129
196
|
parsed_options, @args = parse_options Shellwords.shellwords(@args[0])
|
130
197
|
# last string argument interpreted as args + options
|
131
198
|
elsif @args.size > 1 && @args[-1].is_a?(String)
|
132
|
-
|
199
|
+
args = caller.grep(/bin_runner.rb:/).empty? ? Shellwords.shellwords(@args.pop) : @args
|
200
|
+
parsed_options, new_args = parse_options args
|
133
201
|
@args += new_args
|
134
|
-
# default options
|
135
|
-
elsif (@args.size <= @command.arg_size - 1) ||
|
202
|
+
# add default options
|
203
|
+
elsif (!@command.has_splat_args? && @args.size <= @command.arg_size - 1) ||
|
204
|
+
(@command.has_splat_args? && !@args[-1].is_a?(Hash))
|
205
|
+
parsed_options = parse_options([])[0]
|
206
|
+
# merge default options with given hash of options
|
207
|
+
elsif (@command.has_splat_args? || (@args.size == @command.arg_size)) && @args[-1].is_a?(Hash)
|
136
208
|
parsed_options = parse_options([])[0]
|
209
|
+
parsed_options.merge!(@args.pop)
|
137
210
|
end
|
138
211
|
parsed_options
|
139
212
|
end
|
@@ -143,7 +216,8 @@ module Boson
|
|
143
216
|
@global_options = option_parser.parse @command.option_parser.leading_non_opts
|
144
217
|
new_args = option_parser.non_opts.dup + @command.option_parser.trailing_non_opts
|
145
218
|
if @global_options[:global]
|
146
|
-
global_opts = Shellwords.shellwords(@global_options[:global]).map {|str|
|
219
|
+
global_opts = Shellwords.shellwords(@global_options[:global]).map {|str|
|
220
|
+
((str[/^(.*?)=/,1] || str).length > 1 ? "--" : "-") + str }
|
147
221
|
@global_options.merge! option_parser.parse(global_opts)
|
148
222
|
end
|
149
223
|
raise EscapeGlobalOption if @global_options[:help]
|
@@ -164,5 +238,6 @@ module Boson
|
|
164
238
|
}
|
165
239
|
end
|
166
240
|
end
|
241
|
+
#:startdoc:
|
167
242
|
end
|
168
243
|
end
|
data/lib/boson/util.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
module Boson
|
2
|
+
# Collection of utility methods used throughout Boson.
|
2
3
|
module Util
|
3
4
|
extend self
|
4
|
-
#From Rails ActiveSupport
|
5
|
+
# From Rails ActiveSupport, converts a camelcased string to an underscored string:
|
6
|
+
# 'Boson::MethodInspector' -> 'boson/method_inspector'
|
5
7
|
def underscore(camel_cased_word)
|
6
8
|
camel_cased_word.to_s.gsub(/::/, '/').
|
7
9
|
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
@@ -10,11 +12,14 @@ module Boson
|
|
10
12
|
downcase
|
11
13
|
end
|
12
14
|
|
13
|
-
#
|
15
|
+
# From Rails ActiveSupport, does the reverse of underscore:
|
16
|
+
# 'boson/method_inspector' -> 'Boson::MethodInspector'
|
14
17
|
def camelize(string)
|
15
18
|
string.to_s.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
|
16
19
|
end
|
17
|
-
|
20
|
+
|
21
|
+
# Converts a module/class string to the actual constant.
|
22
|
+
# Returns nil if not found.
|
18
23
|
def constantize(string)
|
19
24
|
any_const_get(camelize(string))
|
20
25
|
end
|
@@ -40,6 +45,9 @@ module Boson
|
|
40
45
|
end
|
41
46
|
end
|
42
47
|
|
48
|
+
# Detects new object/kernel methods, gems and modules created within a block.
|
49
|
+
# Returns a hash of what's detected.
|
50
|
+
# Valid options and possible returned keys are :methods, :object_methods, :modules, :gems.
|
43
51
|
def detect(options={}, &block)
|
44
52
|
options = {:methods=>true, :object_methods=>true}.merge!(options)
|
45
53
|
original_gems = Gem.loaded_specs.keys if Object.const_defined? :Gem
|
@@ -56,6 +64,7 @@ module Boson
|
|
56
64
|
detected
|
57
65
|
end
|
58
66
|
|
67
|
+
# Safely calls require, returning false if LoadError occurs.
|
59
68
|
def safe_require(lib)
|
60
69
|
begin
|
61
70
|
require lib
|
@@ -64,16 +73,20 @@ module Boson
|
|
64
73
|
end
|
65
74
|
end
|
66
75
|
|
76
|
+
# Returns all modules that currently exist.
|
67
77
|
def modules
|
68
78
|
all_modules = []
|
69
79
|
ObjectSpace.each_object(Module) {|e| all_modules << e}
|
70
80
|
all_modules
|
71
81
|
end
|
72
82
|
|
83
|
+
# Returns array of _all_ common instance methods between two modules/classes.
|
73
84
|
def common_instance_methods(module1, module2)
|
74
85
|
(module1.instance_methods + module1.private_instance_methods) & (module2.instance_methods + module2.private_instance_methods)
|
75
86
|
end
|
76
87
|
|
88
|
+
# Creates a module under a given base module and possible name. If the module already exists, it attempts
|
89
|
+
# to create one with a number appended to the name.
|
77
90
|
def create_module(base_module, name)
|
78
91
|
desired_class = camelize(name)
|
79
92
|
if (suffix = ([""] + (1..10).to_a).find {|e| !base_module.const_defined?(desired_class+e)})
|
@@ -81,10 +94,16 @@ module Boson
|
|
81
94
|
end
|
82
95
|
end
|
83
96
|
|
97
|
+
# Behaves just like the unix which command, returning the full path to an executable based on ENV['PATH'].
|
84
98
|
def which(command)
|
85
99
|
ENV['PATH'].split(File::PATH_SEPARATOR).map {|e| File.join(e, command) }.find {|e| File.exists?(e) }
|
86
100
|
end
|
87
101
|
|
102
|
+
# Deep copies any object if it can be marshaled. Useful for deep hashes.
|
103
|
+
def deep_copy(obj)
|
104
|
+
Marshal::load(Marshal::dump(obj))
|
105
|
+
end
|
106
|
+
|
88
107
|
# Recursively merge hash1 with hash2.
|
89
108
|
def recursive_hash_merge(hash1, hash2)
|
90
109
|
hash1.merge(hash2) {|k,o,n| (o.is_a?(Hash)) ? recursive_hash_merge(o,n) : n}
|
data/lib/boson/view.rb
CHANGED
@@ -1,18 +1,30 @@
|
|
1
1
|
module Boson
|
2
|
+
# Handles {Hirb}[http://tagaholic.me/hirb/]-based views.
|
2
3
|
module View
|
3
4
|
extend self
|
4
5
|
|
6
|
+
# Enables hirb and reads a config file from the main repo's config/hirb.yml.
|
5
7
|
def enable
|
6
8
|
Hirb::View.enable(:config_file=>File.join(Boson.repo.config_dir, 'hirb.yml')) unless @enabled
|
7
9
|
@enabled = true
|
8
10
|
end
|
9
11
|
|
12
|
+
# Renders any object via Hirb. Options are passed directly to
|
13
|
+
# {Hirb::Console.render_output}[http://tagaholic.me/hirb/doc/classes/Hirb/Console.html#M000011].
|
10
14
|
def render(object, options={})
|
11
|
-
|
15
|
+
if silent_object?(object)
|
16
|
+
puts(object.inspect) unless options[:silence_booleans]
|
17
|
+
else
|
18
|
+
render_object(object, options)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def silent_object?(obj)
|
23
|
+
[nil,false,true].include?(obj)
|
12
24
|
end
|
13
25
|
|
14
|
-
def render_object(object, options={})
|
15
|
-
options[:class]
|
26
|
+
def render_object(object, options={}) #:nodoc:
|
27
|
+
options[:class] ||= :auto_table
|
16
28
|
if object.is_a?(Array) && object.size > 0 && (sort = options.delete(:sort))
|
17
29
|
begin
|
18
30
|
sort_lambda = object[0].is_a?(Hash) ? (object[0][sort].respond_to?(:<=>) ?
|
data/test/bin_runner_test.rb
CHANGED
@@ -36,17 +36,17 @@ module Boson
|
|
36
36
|
start('-l', 'blah', 'libraries')
|
37
37
|
end
|
38
38
|
|
39
|
-
test "
|
40
|
-
|
39
|
+
test "console option starts irb" do
|
40
|
+
ConsoleRunner.expects(:start)
|
41
41
|
Util.expects(:which).returns("/usr/bin/irb")
|
42
42
|
Kernel.expects(:load).with("/usr/bin/irb")
|
43
|
-
start("--
|
43
|
+
start("--console")
|
44
44
|
end
|
45
45
|
|
46
|
-
test "
|
47
|
-
|
46
|
+
test "console option but no irb found prints error" do
|
47
|
+
ConsoleRunner.expects(:start)
|
48
48
|
Util.expects(:which).returns(nil)
|
49
|
-
capture_stderr { start("--
|
49
|
+
capture_stderr { start("--console") }.should =~ /Console not found/
|
50
50
|
end
|
51
51
|
|
52
52
|
test "execute option executes string" do
|
@@ -54,17 +54,27 @@ module Boson
|
|
54
54
|
capture_stdout { start("-e", "p 1 + 1") }.should == "2\n"
|
55
55
|
end
|
56
56
|
|
57
|
+
test "global option takes value with whitespace" do
|
58
|
+
View.expects(:render).with(anything, {:sort => :lib, :fields => [:name, :lib]})
|
59
|
+
start('commands', '-g', 'f=name,lib s=lib')
|
60
|
+
end
|
61
|
+
|
57
62
|
test "execute option errors are caught" do
|
58
63
|
capture_stderr { start("-e", "raise 'blah'") }.should =~ /^Error:/
|
59
64
|
end
|
60
65
|
|
61
66
|
test "command and too many arguments prints error" do
|
62
|
-
capture_stdout { start('commands','1','2','3') }.should =~ /
|
67
|
+
capture_stdout { capture_stderr { start('commands','1','2','3') }.should =~ /'commands'.*incorrect/ }
|
68
|
+
end
|
69
|
+
|
70
|
+
test "failed subcommand prints error and not command not found" do
|
71
|
+
BinRunner.expects(:execute_command).raises("bling")
|
72
|
+
capture_stderr { start("commands.blah") }.should =~ /Error: bling/
|
63
73
|
end
|
64
74
|
|
65
75
|
test "undiscovered command prints error" do
|
66
76
|
BinRunner.expects(:load_command_by_index).returns(false)
|
67
|
-
capture_stderr { start('blah') }.should =~ /Error.*
|
77
|
+
capture_stderr { start('blah') }.should =~ /Error.*not found/
|
68
78
|
end
|
69
79
|
|
70
80
|
test "basic command executes" do
|
data/test/loader_test.rb
CHANGED
@@ -30,7 +30,7 @@ module Boson
|
|
30
30
|
end
|
31
31
|
|
32
32
|
test "loads and strips aliases from a library's commands" do
|
33
|
-
with_config(:
|
33
|
+
with_config(:command_aliases=>{"blah"=>'b'}) do
|
34
34
|
load :blah, :file_string=>"module Blah; def blah; end; alias_method(:b, :blah); end"
|
35
35
|
library_loaded?('blah')
|
36
36
|
library('blah').commands.should == ['blah']
|
data/test/manager_test.rb
CHANGED
@@ -37,7 +37,7 @@ module Boson
|
|
37
37
|
after(:each) { Object.send(:remove_const, "Aquateen") }
|
38
38
|
|
39
39
|
test "created with command specific config" do
|
40
|
-
with_config(:
|
40
|
+
with_config(:command_aliases=>{'frylock'=>'fr'}) do
|
41
41
|
Manager.expects(:create_instance_aliases).with({"Aquateen"=>{"frylock"=>"fr"}})
|
42
42
|
load_library :name=>'aquateen', :commands=>['frylock'], :module=>Aquateen
|
43
43
|
library_loaded? 'aquateen'
|
@@ -53,7 +53,7 @@ module Boson
|
|
53
53
|
end
|
54
54
|
|
55
55
|
test "not created and warns for commands with no module" do
|
56
|
-
with_config(:
|
56
|
+
with_config(:command_aliases=>{'frylock'=>'fr'}) do
|
57
57
|
capture_stderr {
|
58
58
|
load_library(:name=>'aquateen', :commands=>['frylock'])
|
59
59
|
}.should =~ /No aliases/
|
data/test/repo_test.rb
CHANGED
@@ -16,7 +16,7 @@ class Boson::RepoTest < Test::Unit::TestCase
|
|
16
16
|
end
|
17
17
|
|
18
18
|
test "ignores nonexistent file and sets config defaults" do
|
19
|
-
assert @repo.config[:
|
19
|
+
assert @repo.config[:command_aliases].is_a?(Hash) && @repo.config[:libraries].is_a?(Hash)
|
20
20
|
end
|
21
21
|
end
|
22
22
|
end
|
data/test/runner_test.rb
CHANGED
@@ -3,17 +3,17 @@ require File.join(File.dirname(__FILE__), 'test_helper')
|
|
3
3
|
module Boson
|
4
4
|
class RunnerTest < Test::Unit::TestCase
|
5
5
|
context "repl_runner" do
|
6
|
-
def start(
|
6
|
+
def start(hash={})
|
7
7
|
Hirb.stubs(:enable)
|
8
|
-
Boson.start(
|
8
|
+
Boson.start(hash.merge(:verbose=>false))
|
9
9
|
end
|
10
10
|
|
11
11
|
before(:all) { reset }
|
12
|
-
before(:each) { Boson::
|
12
|
+
before(:each) { Boson::ConsoleRunner.instance_eval("@initialized = false") }
|
13
13
|
|
14
|
-
test "loads default libraries and libraries in :
|
14
|
+
test "loads default libraries and libraries in :console_defaults config" do
|
15
15
|
defaults = Boson::Runner.default_libraries + ['yo']
|
16
|
-
with_config(:
|
16
|
+
with_config(:console_defaults=>['yo']) do
|
17
17
|
Manager.expects(:load).with {|*args| args[0] == defaults }
|
18
18
|
start
|
19
19
|
end
|
@@ -21,12 +21,12 @@ module Boson
|
|
21
21
|
|
22
22
|
test "doesn't call init twice" do
|
23
23
|
start
|
24
|
-
|
24
|
+
ConsoleRunner.expects(:init).never
|
25
25
|
start
|
26
26
|
end
|
27
27
|
|
28
28
|
test "loads multiple libraries with :libraries option" do
|
29
|
-
|
29
|
+
ConsoleRunner.expects(:init)
|
30
30
|
Manager.expects(:load).with([:lib1,:lib2], anything)
|
31
31
|
start(:libraries=>[:lib1, :lib2])
|
32
32
|
end
|