boson 0.2.0 → 0.2.1
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.
- data/README.rdoc +21 -14
- data/VERSION.yml +1 -1
- data/lib/boson.rb +5 -5
- data/lib/boson/command.rb +20 -21
- data/lib/boson/commands/core.rb +5 -6
- data/lib/boson/index.rb +21 -98
- data/lib/boson/inspector.rb +28 -2
- data/lib/boson/inspectors/comment_inspector.rb +5 -7
- data/lib/boson/inspectors/method_inspector.rb +4 -17
- data/lib/boson/libraries/file_library.rb +22 -27
- data/lib/boson/libraries/local_file_library.rb +30 -0
- data/lib/boson/libraries/module_library.rb +1 -1
- data/lib/boson/library.rb +15 -9
- data/lib/boson/loader.rb +3 -18
- data/lib/boson/manager.rb +4 -31
- data/lib/boson/option_command.rb +204 -0
- data/lib/boson/option_parser.rb +13 -2
- data/lib/boson/options.rb +1 -1
- data/lib/boson/pipe.rb +157 -0
- data/lib/boson/repo.rb +20 -1
- data/lib/boson/repo_index.rb +123 -0
- data/lib/boson/runner.rb +3 -4
- data/lib/boson/runners/bin_runner.rb +23 -8
- data/lib/boson/runners/console_runner.rb +1 -2
- data/lib/boson/scientist.rb +48 -225
- data/lib/boson/view.rb +50 -64
- data/test/bin_runner_test.rb +48 -7
- data/test/comment_inspector_test.rb +7 -6
- data/test/config/index.marshal +0 -0
- data/test/file_library_test.rb +1 -22
- data/test/loader_test.rb +5 -13
- data/test/manager_test.rb +4 -4
- data/test/method_inspector_test.rb +7 -2
- data/test/{view_test.rb → pipe_test.rb} +11 -11
- data/test/{index_test.rb → repo_index_test.rb} +26 -26
- data/test/scientist_test.rb +2 -2
- metadata +11 -6
data/lib/boson/view.rb
CHANGED
@@ -1,5 +1,51 @@
|
|
1
1
|
module Boson
|
2
|
-
#
|
2
|
+
# This module generates views for a command by handing it to {Hirb}[http://tagaholic.me/hirb/]. Since Hirb can be customized
|
3
|
+
# to generate any view, commands can have any views associated with them!
|
4
|
+
#
|
5
|
+
# === Views with Render Options
|
6
|
+
# To pass rendering options to a Hirb helper as command options, a command has to define the options with
|
7
|
+
# the render_options method attribute:
|
8
|
+
#
|
9
|
+
# # @render_options :fields=>[:a,:b]
|
10
|
+
# def list(options={})
|
11
|
+
# [{:a=>1, :b=>2}, {:a=>10,:b=>11}]
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
# # To see that the render_options method attribute actually passes the :fields option by default:
|
15
|
+
# >> list '-p' # or list '--pretend'
|
16
|
+
# Arguments: []
|
17
|
+
# Global options: {:pretend=>true, :fields=>[:a, :b]}
|
18
|
+
#
|
19
|
+
# >> list
|
20
|
+
# +----+----+
|
21
|
+
# | a | b |
|
22
|
+
# +----+----+
|
23
|
+
# | 1 | 2 |
|
24
|
+
# | 10 | 11 |
|
25
|
+
# +----+----+
|
26
|
+
# 2 rows in set
|
27
|
+
#
|
28
|
+
# # To create a vertical table, we can pass --vertical, one of the default global render options.
|
29
|
+
# >> list '-V' # or list '--vertical'
|
30
|
+
# *** 1. row ***
|
31
|
+
# a: 1
|
32
|
+
# b: 2
|
33
|
+
# ...
|
34
|
+
#
|
35
|
+
# # To get the original return value use the global option --render
|
36
|
+
# >> list '-r' # or list '--render'
|
37
|
+
# => [{:a=>1, :b=>2}, {:a=>10,:b=>11}]
|
38
|
+
#
|
39
|
+
# === Boson and Hirb
|
40
|
+
# Since Boson uses {Hirb's auto table helper}[http://tagaholic.me/hirb/doc/classes/Hirb/Helpers/AutoTable.html]
|
41
|
+
# by default, you may want to read up on its many options. To use any of them in commands, define them locally
|
42
|
+
# with render_options or globally by adding them under the :render_options key of the main config.
|
43
|
+
# What if you want to use your own helper class? No problem. Simply pass it with the global :class option.
|
44
|
+
#
|
45
|
+
# When using the default helper, one of the most important options to define is :fields. Aside from controlling what fields
|
46
|
+
# are displayed, it's used to set :values option attributes for related options i.e. :sort and :query. This provides handy option
|
47
|
+
# value aliasing via OptionParser. If you don't set :fields, Boson will try to set its :values with field-related options i.e.
|
48
|
+
# :change_fields, :filters and :headers.
|
3
49
|
module View
|
4
50
|
extend self
|
5
51
|
|
@@ -12,23 +58,13 @@ module Boson
|
|
12
58
|
# Renders any object via Hirb. Options are passed directly to
|
13
59
|
# {Hirb::Console.render_output}[http://tagaholic.me/hirb/doc/classes/Hirb/Console.html#M000011].
|
14
60
|
def render(object, options={}, return_obj=false)
|
15
|
-
if
|
16
|
-
puts(object.inspect)
|
61
|
+
if options[:inspect]
|
62
|
+
puts(object.inspect)
|
17
63
|
else
|
18
|
-
render_object(object, options, return_obj)
|
64
|
+
render_object(object, options, return_obj) unless silent_object?(object)
|
19
65
|
end
|
20
66
|
end
|
21
67
|
|
22
|
-
# Searches and sorts an array of objects or hashes using options :query, :sort and :reverse_sort.
|
23
|
-
# The :query option is a hash of fields mapped to their search terms. Searches are OR-ed.
|
24
|
-
def search_and_sort(object, options)
|
25
|
-
if object.is_a?(Array)
|
26
|
-
object = search_object(object, options[:query]) if options[:query]
|
27
|
-
object = sort_object(object, options[:sort], options[:reverse_sort]) if object.size > 0 && options[:sort]
|
28
|
-
end
|
29
|
-
object
|
30
|
-
end
|
31
|
-
|
32
68
|
#:stopdoc:
|
33
69
|
def toggle_pager
|
34
70
|
Hirb::View.toggle_pager
|
@@ -43,56 +79,6 @@ module Boson
|
|
43
79
|
render_result = Hirb::Console.render_output(object, options)
|
44
80
|
return_obj ? object : render_result
|
45
81
|
end
|
46
|
-
|
47
|
-
def search_object(object, query_hash)
|
48
|
-
if object[0].is_a?(Hash)
|
49
|
-
TableCallbacks.search_callback(object, :query=>query_hash)
|
50
|
-
else
|
51
|
-
query_hash.map {|field,query| object.select {|e| e.send(field).to_s =~ /#{query}/i } }.flatten.uniq
|
52
|
-
end
|
53
|
-
rescue NoMethodError
|
54
|
-
$stderr.puts "Query failed with nonexistant method '#{$!.message[/`(.*)'/,1]}'"
|
55
|
-
end
|
56
|
-
|
57
|
-
def sort_object(object, sort, reverse_sort=false)
|
58
|
-
if object[0].is_a?(Hash)
|
59
|
-
TableCallbacks.sort_callback(object, :sort=>sort, :reverse_sort=>reverse_sort)
|
60
|
-
else
|
61
|
-
sort_lambda = object.all? {|e| e.send(sort).respond_to?(:<=>) } ? lambda {|e| e.send(sort) || ''} :
|
62
|
-
lambda {|e| e.send(sort).to_s }
|
63
|
-
object = object.sort_by &sort_lambda
|
64
|
-
object = object.reverse if reverse_sort
|
65
|
-
object
|
66
|
-
end
|
67
|
-
rescue NoMethodError, ArgumentError
|
68
|
-
$stderr.puts "Sort failed with nonexistant method '#{sort}'"
|
69
|
-
end
|
70
82
|
#:startdoc:
|
71
|
-
|
72
|
-
# Callbacks used by Hirb::Helpers::Table to search and sort arrays of hashes.
|
73
|
-
module TableCallbacks
|
74
|
-
extend self
|
75
|
-
# Case-insensitive searches an array of hashes using the option :query. Numerical string keys
|
76
|
-
# in :query are converted to actual numbers to interface with Hirb. See View.search_and_sort for more
|
77
|
-
# about :query.
|
78
|
-
def search_callback(obj, options)
|
79
|
-
!options[:query] ? obj : begin
|
80
|
-
options[:query].map {|field,query|
|
81
|
-
field = field.to_i if field.to_s[/^\d+$/]
|
82
|
-
obj.select {|e| e[field].to_s =~ /#{query}/i }
|
83
|
-
}.flatten.uniq
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
# Sorts an array of hashes using :sort option and reverses the sort with :reverse_sort option.
|
88
|
-
def sort_callback(obj, options)
|
89
|
-
sort = options[:sort].to_s[/^\d+$/] ? options[:sort].to_i : options[:sort]
|
90
|
-
sort_lambda = (obj.all? {|e| e[sort].respond_to?(:<=>) } ? lambda {|e| e[sort] } : lambda {|e| e[sort].to_s })
|
91
|
-
obj = obj.sort_by &sort_lambda
|
92
|
-
obj = obj.reverse if options[:reverse_sort]
|
93
|
-
obj
|
94
|
-
end
|
95
|
-
end
|
96
83
|
end
|
97
84
|
end
|
98
|
-
Hirb::Helpers::Table.send :include, Boson::View::TableCallbacks
|
data/test/bin_runner_test.rb
CHANGED
@@ -109,24 +109,24 @@ module Boson
|
|
109
109
|
def index(options={})
|
110
110
|
Manager.expects(:load).with {|*args| args[0][0].is_a?(Module) ? true : args[0] == options[:load]
|
111
111
|
}.at_least(1).returns(!options[:fails])
|
112
|
-
|
112
|
+
Index.indexes[0].expects(:write)
|
113
113
|
end
|
114
114
|
|
115
115
|
test "with index option, no existing index and core command updates index and prints index message" do
|
116
116
|
index :load=>Runner.all_libraries
|
117
|
-
Index.stubs(:exists?).returns(false)
|
117
|
+
Index.indexes[0].stubs(:exists?).returns(false)
|
118
118
|
capture_stdout { start("--index", "libraries") }.should =~ /Generating index/
|
119
119
|
end
|
120
120
|
|
121
121
|
test "with index option, existing index and core command updates incremental index" do
|
122
122
|
index :load=>['changed']
|
123
|
-
Index.stubs(:exists?).returns(true)
|
123
|
+
Index.indexes[0].stubs(:exists?).returns(true)
|
124
124
|
capture_stdout { start("--index=changed", "libraries")}.should =~ /Indexing.*changed/
|
125
125
|
end
|
126
126
|
|
127
127
|
test "with index option, failed indexing prints error" do
|
128
128
|
index :load=>['changed'], :fails=>true
|
129
|
-
Index.stubs(:exists?).returns(true)
|
129
|
+
Index.indexes[0].stubs(:exists?).returns(true)
|
130
130
|
Manager.stubs(:failed_libraries).returns(['changed'])
|
131
131
|
capture_stderr {
|
132
132
|
capture_stdout { start("--index=changed", "libraries")}.should =~ /Indexing.*changed/
|
@@ -134,7 +134,7 @@ module Boson
|
|
134
134
|
end
|
135
135
|
|
136
136
|
test "with core command updates index and doesn't print index message" do
|
137
|
-
Index.expects(:write)
|
137
|
+
Index.indexes[0].expects(:write)
|
138
138
|
Boson.main_object.expects(:send).with('libraries')
|
139
139
|
capture_stdout { start 'libraries'}.should_not =~ /index/i
|
140
140
|
end
|
@@ -142,18 +142,59 @@ module Boson
|
|
142
142
|
test "with non-core command finding library doesn't update index" do
|
143
143
|
Index.expects(:find_library).returns('sweet_lib')
|
144
144
|
Manager.expects(:load).with {|*args| args[0].is_a?(String) ? args[0] == 'sweet_lib' : true}.at_least(1)
|
145
|
-
Index.expects(:update).never
|
145
|
+
Index.indexes[0].expects(:update).never
|
146
146
|
capture_stderr { start("sweet") }.should =~ /sweet/
|
147
147
|
end
|
148
148
|
|
149
149
|
test "with non-core command not finding library, does update index" do
|
150
150
|
Index.expects(:find_library).returns(nil, 'sweet_lib').times(2)
|
151
151
|
Manager.expects(:load).with {|*args| args[0].is_a?(String) ? args[0] == 'sweet_lib' : true}.at_least(1)
|
152
|
-
Index.expects(:update).returns(true)
|
152
|
+
Index.indexes[0].expects(:update).returns(true)
|
153
153
|
capture_stderr { start("sweet") }.should =~ /sweet/
|
154
154
|
end
|
155
155
|
end
|
156
156
|
|
157
|
+
context "render_output" do
|
158
|
+
before(:each) { Scientist.rendered = false; BinRunner.instance_eval "@options = {}" }
|
159
|
+
|
160
|
+
test "doesn't render when nil, false or true" do
|
161
|
+
View.expects(:render).never
|
162
|
+
[nil, false, true].each do |e|
|
163
|
+
BinRunner.render_output e
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
test "doesn't render when rendered with Scientist" do
|
168
|
+
Scientist.rendered = true
|
169
|
+
View.expects(:render).never
|
170
|
+
BinRunner.render_output 'blah'
|
171
|
+
end
|
172
|
+
|
173
|
+
test "render with puts when non-string" do
|
174
|
+
View.expects(:render).with('dude', {:method => 'puts'})
|
175
|
+
BinRunner.render_output 'dude'
|
176
|
+
end
|
177
|
+
|
178
|
+
test "renders with inspect when non-array and non-string" do
|
179
|
+
[{:a=>true}, :ok].each do |e|
|
180
|
+
View.expects(:puts).with(e.inspect)
|
181
|
+
BinRunner.render_output e
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
test "renders with inspect when Scientist rendering toggled off with :render" do
|
186
|
+
Scientist.global_options = {:render=>true}
|
187
|
+
View.expects(:puts).with([1,2].inspect)
|
188
|
+
BinRunner.render_output [1,2]
|
189
|
+
Scientist.global_options = nil
|
190
|
+
end
|
191
|
+
|
192
|
+
test "renders with hirb when array" do
|
193
|
+
View.expects(:render_object)
|
194
|
+
BinRunner.render_output [1,2,3]
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
157
198
|
test "parse_args only translates options before command" do
|
158
199
|
BinRunner.parse_args(['-v', 'com', '-v']).should == ["com", {:verbose=>true}, ['-v']]
|
159
200
|
BinRunner.parse_args(['com', '-v']).should == ["com", {}, ['-v']]
|
@@ -84,16 +84,17 @@ module Boson
|
|
84
84
|
end
|
85
85
|
|
86
86
|
test "scrape all comment types with implicit desc" do
|
87
|
-
@lines = ["module Foo", '# @render_options :b=>1', ' # @options {:a=>true}',
|
88
|
-
|
89
|
-
|
87
|
+
@lines = ["module Foo", '# @config :a=>true', '# @render_options :b=>1', ' # @options {:a=>true}',
|
88
|
+
'#blah', " def foo", " end", "end"]
|
89
|
+
expected = {:desc=>"blah", :options=>{:a=>true}, :render_options=>{:b=>1}, :config=>{:a=>true}}
|
90
|
+
CommentInspector.scrape(@lines.join("\n"), 6, Optional).should == expected
|
90
91
|
end
|
91
92
|
|
92
93
|
test "scrape all comment types with explicit desc" do
|
93
94
|
@lines = ["module Foo", '#@desc blah', '# @render_options :b=>1,', '# :c=>2',
|
94
|
-
' # @options {:a=>true}', " def foo", " end", "end"]
|
95
|
-
expected = {:desc=>"blah", :options=>{:a=>true}, :render_options=>{:b=>1, :c=>2}}
|
96
|
-
CommentInspector.scrape(@lines.join("\n"),
|
95
|
+
' # @options {:a=>true}', ' # @config :a=>true', " def foo", " end", "end"]
|
96
|
+
expected = {:desc=>"blah", :options=>{:a=>true}, :render_options=>{:b=>1, :c=>2}, :config=>{:a=>true}}
|
97
|
+
CommentInspector.scrape(@lines.join("\n"), 7, Optional).should == expected
|
97
98
|
end
|
98
99
|
end
|
99
100
|
end
|
Binary file
|
data/test/file_library_test.rb
CHANGED
@@ -37,27 +37,6 @@ module Boson
|
|
37
37
|
test "prints error for file library with multiple modules" do
|
38
38
|
capture_stderr { load(:blah, :file_string=>"module Doo; end; module Daa; end") }.should =~ /Can't.*config/
|
39
39
|
end
|
40
|
-
|
41
|
-
test "with same module reloads" do
|
42
|
-
load(:blah, :file_string=>"module Blah; def blah; end; end")
|
43
|
-
File.stubs(:exists?).returns(true)
|
44
|
-
File.stubs(:read).returns("module Blah; def bling; end; end")
|
45
|
-
Manager.reload('blah').should == true
|
46
|
-
command_exists?('bling')
|
47
|
-
library('blah').commands.size.should == 2
|
48
|
-
end
|
49
|
-
|
50
|
-
test "with different module reloads" do
|
51
|
-
load(:blah, :file_string=>"module Blah; def blah; end; end")
|
52
|
-
File.stubs(:exists?).returns(true)
|
53
|
-
File.stubs(:read).returns("module Bling; def bling; end; end")
|
54
|
-
Manager.reload('blah').should == true
|
55
|
-
library_has_module('blah', "Boson::Commands::Bling")
|
56
|
-
command_exists?('bling')
|
57
|
-
command_exists?('blah', false)
|
58
|
-
library('blah').commands.size.should == 1
|
59
|
-
end
|
60
|
-
|
61
40
|
end
|
62
41
|
end
|
63
|
-
end
|
42
|
+
end
|
data/test/loader_test.rb
CHANGED
@@ -35,6 +35,11 @@ module Boson
|
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
+
test "from inspector attribute config sets command's config" do
|
39
|
+
load :blah, :file_string=>"module Blah; config :alias=>'ok'\n; def bling; end; end"
|
40
|
+
library('blah').command_object('bling').alias.should == 'ok'
|
41
|
+
end
|
42
|
+
|
38
43
|
test "hash from inspector recursively merged with user's config" do
|
39
44
|
with_config(:libraries=>{'blah'=>{:commands=>{'blung'=>{:args=>[], :render_options=>{:sort=>'this'}}}}}) do
|
40
45
|
CommentInspector.expects(:scrape).returns({:render_options=>{:fields=>['this']}})
|
@@ -227,18 +232,5 @@ module Boson
|
|
227
232
|
end
|
228
233
|
end
|
229
234
|
end
|
230
|
-
|
231
|
-
context "reload" do
|
232
|
-
before(:each) { reset }
|
233
|
-
test "loads currently unloaded library" do
|
234
|
-
create_library('blah')
|
235
|
-
Manager.expects(:load).with('blah', anything)
|
236
|
-
Manager.reload('blah')
|
237
|
-
end
|
238
|
-
|
239
|
-
test "doesn't load nonexistent library" do
|
240
|
-
capture_stdout { Manager.reload('bling', :verbose=>true) }.should =~ /bling doesn't/
|
241
|
-
end
|
242
|
-
end
|
243
235
|
end
|
244
236
|
end
|
data/test/manager_test.rb
CHANGED
@@ -74,14 +74,14 @@ module Boson
|
|
74
74
|
}
|
75
75
|
|
76
76
|
test "are deleted" do
|
77
|
-
Scientist.expects(:
|
78
|
-
Manager.
|
77
|
+
Scientist.expects(:redefine_command).with(anything, @foo)
|
78
|
+
Manager.redefine_commands(@library, @library.commands)
|
79
79
|
end
|
80
80
|
|
81
81
|
test "are deleted and printed when verbose" do
|
82
|
-
Scientist.expects(:
|
82
|
+
Scientist.expects(:redefine_command).with(anything, @foo)
|
83
83
|
@library.instance_eval("@options = {:verbose=>true}")
|
84
|
-
capture_stdout { Manager.
|
84
|
+
capture_stdout { Manager.redefine_commands(@library, @library.commands) } =~ /options.*blah/
|
85
85
|
end
|
86
86
|
end
|
87
87
|
|
@@ -36,9 +36,14 @@ module Boson
|
|
36
36
|
parse("render_options :z=>true; def zee; end")[:render_options].should == {"zee"=>{:z=>true}}
|
37
37
|
end
|
38
38
|
|
39
|
-
test "
|
39
|
+
test "config sets config" do
|
40
|
+
parse("config :z=>true; def zee; end")[:config].should == {"zee"=>{:z=>true}}
|
41
|
+
end
|
42
|
+
|
43
|
+
test "not all method attributes set causes method_locations to be set" do
|
40
44
|
MethodInspector.stubs(:find_method_locations).returns(["/some/path", 10])
|
41
|
-
parsed = parse "desc 'yo'; def yo; end; options :yep=>1; def yep; end;
|
45
|
+
parsed = parse "desc 'yo'; def yo; end; options :yep=>1; def yep; end; " +
|
46
|
+
"render_options :a=>1; config :a=>1; desc 'z'; options :a=>1; def az; end"
|
42
47
|
parsed[:method_locations].key?('yo').should == true
|
43
48
|
parsed[:method_locations].key?('yep').should == true
|
44
49
|
parsed[:method_locations].key?('az').should == false
|
@@ -1,57 +1,57 @@
|
|
1
1
|
require File.join(File.dirname(__FILE__), 'test_helper')
|
2
2
|
|
3
3
|
module Boson
|
4
|
-
class
|
4
|
+
class PipeTest < Test::Unit::TestCase
|
5
5
|
before(:all) {
|
6
6
|
@hashes = [{:a=>'some', :b=>'thing'}, {:a=>:more, :b=>:yep}]
|
7
|
-
Ab = Struct.new(:a, :b) unless
|
7
|
+
Ab = Struct.new(:a, :b) unless PipeTest.const_defined?(:Ab)
|
8
8
|
@objects = [Ab.new('some', 'thing'), Ab.new(:more, :yep)]
|
9
9
|
}
|
10
10
|
context "search_object" do
|
11
11
|
|
12
12
|
test "searches one query" do
|
13
13
|
[@hashes, @objects].each {|e|
|
14
|
-
|
14
|
+
Pipe.search_object(e, :a=>'some').should == e[0,1]
|
15
15
|
}
|
16
16
|
end
|
17
17
|
|
18
18
|
test "searches non-string values" do
|
19
19
|
[@hashes, @objects].each {|e|
|
20
|
-
|
20
|
+
Pipe.search_object(e, :a=>'more').should == e[1,1]
|
21
21
|
}
|
22
22
|
end
|
23
23
|
|
24
24
|
test "searches multiple search terms" do
|
25
25
|
[@hashes, @objects].each {|e|
|
26
|
-
|
26
|
+
Pipe.search_object(e, :a=>'some', :b=>'yep').size.should == 2
|
27
27
|
}
|
28
28
|
end
|
29
29
|
|
30
30
|
test "prints error for invalid search field" do
|
31
|
-
capture_stderr {
|
31
|
+
capture_stderr { Pipe.search_object(@objects, :blah=>'blah') }.should =~ /failed.*'blah'/
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
35
|
context "sort_object" do
|
36
36
|
test "sorts objects with values of different types" do
|
37
|
-
|
37
|
+
Pipe.sort_object(@objects, :a).should == @objects.reverse
|
38
38
|
end
|
39
39
|
|
40
40
|
test "sorts hashes with values of different types" do
|
41
|
-
|
41
|
+
Pipe.sort_object(@hashes, :a).should == @hashes.reverse
|
42
42
|
end
|
43
43
|
|
44
44
|
test "sorts numeric values" do
|
45
45
|
hashes = [{:a=>10, :b=>4}, {:a=>5, :b=>3}]
|
46
|
-
|
46
|
+
Pipe.sort_object(hashes, :a).should == hashes.reverse
|
47
47
|
end
|
48
48
|
|
49
49
|
test "sorts and reverses sort" do
|
50
|
-
|
50
|
+
Pipe.sort_object(@hashes, :a, true).should == @hashes
|
51
51
|
end
|
52
52
|
|
53
53
|
test "prints error for invalid sort field" do
|
54
|
-
capture_stderr {
|
54
|
+
capture_stderr { Pipe.sort_object(@objects, :blah)}.should =~ /failed.*'blah'/
|
55
55
|
end
|
56
56
|
end
|
57
57
|
end
|
@@ -1,18 +1,18 @@
|
|
1
1
|
require File.join(File.dirname(__FILE__), 'test_helper')
|
2
2
|
|
3
3
|
module Boson
|
4
|
-
class
|
4
|
+
class RepoIndexTest < Test::Unit::TestCase
|
5
5
|
# since we're defining our own @commands, @libraries, @lib_hashes
|
6
|
-
before(:all) {
|
6
|
+
before(:all) { @index = RepoIndex.new(Boson.repo); @index.instance_variable_set "@read", true }
|
7
7
|
|
8
8
|
context "read_and_transfer" do
|
9
|
-
before(:each) { reset_boson;
|
9
|
+
before(:each) { reset_boson; @index.instance_eval "@libraries = @commands = nil" }
|
10
10
|
|
11
11
|
def transfers(options={})
|
12
|
-
|
12
|
+
@index.instance_variable_set "@libraries", [Library.new(:name=>'blah', :commands=>['blurb']),
|
13
13
|
Library.new(:name=>'bling')]
|
14
|
-
|
15
|
-
|
14
|
+
@index.instance_variable_set "@commands", [Command.new(:name=>'blurb', :lib=>'blah')]
|
15
|
+
@index.read_and_transfer options[:ignored] || []
|
16
16
|
Boson.libraries.map {|e| e.name}.should == options[:libraries]
|
17
17
|
Boson.commands.map {|e| e.name}.should == options[:commands]
|
18
18
|
end
|
@@ -42,43 +42,43 @@ module Boson
|
|
42
42
|
commands = [Command.new(:name=>'blurb', :lib=>'blah', :alias=>'bb'),
|
43
43
|
Command.new(:name=>'sub', :lib=>'bling', :alias=>'s')
|
44
44
|
]
|
45
|
-
|
46
|
-
|
45
|
+
@index.instance_variable_set "@commands", commands
|
46
|
+
@index.instance_variable_set "@libraries", [Library.new(:name=>'blah'), Library.new(:name=>'bling', :namespace=>'bling')]
|
47
47
|
}
|
48
48
|
|
49
49
|
test "finds command aliased or not" do
|
50
|
-
|
51
|
-
|
50
|
+
@index.find_library('blurb').should == 'blah'
|
51
|
+
@index.find_library('bb').should == 'blah'
|
52
52
|
end
|
53
53
|
|
54
54
|
test "doesn't find command" do
|
55
|
-
|
55
|
+
@index.find_library('blah').should == nil
|
56
56
|
end
|
57
57
|
|
58
58
|
test "finds a subcommand aliased or not" do
|
59
|
-
|
60
|
-
#
|
59
|
+
@index.find_library('bling.sub').should == 'bling'
|
60
|
+
# @index.find_library('bl.s').should == 'bling'
|
61
61
|
end
|
62
62
|
|
63
63
|
test "finds namespace command aliased or not without a subcommand" do
|
64
|
-
|
65
|
-
#
|
64
|
+
@index.find_library('bling').should == 'bling'
|
65
|
+
# @index.find_library('bl').should == 'bling'
|
66
66
|
end
|
67
67
|
|
68
68
|
test "doesn't find a subcommand" do
|
69
|
-
|
69
|
+
@index.find_library('d.d').should == nil
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
73
73
|
context "changed_libraries" do
|
74
|
-
before(:all) {
|
74
|
+
before(:all) { @index.instance_eval "@lib_hashes = nil" }
|
75
75
|
|
76
76
|
def changed(string, all_libs=['file1'])
|
77
|
-
|
78
|
-
|
77
|
+
@index.repo.expects(:all_libraries).returns(all_libs)
|
78
|
+
@index.instance_variable_set "@lib_hashes", {"file1"=>Digest::MD5.hexdigest("state1")}
|
79
79
|
File.stubs(:exists?).returns(true)
|
80
80
|
File.expects(:read).returns(string)
|
81
|
-
|
81
|
+
@index.changed_libraries
|
82
82
|
end
|
83
83
|
|
84
84
|
test "detects changed libraries" do
|
@@ -99,19 +99,19 @@ module Boson
|
|
99
99
|
reset_boson
|
100
100
|
Boson.commands << Command.new(:name=>'blah', :lib=>'blah', :args=>[['arg1', {}], ['arg2', self.class]])
|
101
101
|
Boson.libraries << Library.new(:name=>'blah', :module=>self.class)
|
102
|
-
|
102
|
+
@index.expects(:latest_hashes)
|
103
103
|
libraries = commands = []
|
104
|
-
|
105
|
-
|
106
|
-
@
|
104
|
+
@index.expects(:save_marshal_index).with {|str| libraries, commands, hashes = Marshal.load(str) ; true}
|
105
|
+
@index.write
|
106
|
+
@index_hash = {:libraries=>libraries, :commands=>commands}
|
107
107
|
}
|
108
108
|
|
109
109
|
test "saves library module constants as strings" do
|
110
|
-
@
|
110
|
+
@index_hash[:libraries][0].module.class.should == String
|
111
111
|
end
|
112
112
|
|
113
113
|
test "save commands with arg values as strings" do
|
114
|
-
@
|
114
|
+
@index_hash[:commands][0].args.each {|e| e[1].class.should == String}
|
115
115
|
end
|
116
116
|
end
|
117
117
|
end
|