Chrononaut-hirb 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.rdoc +19 -0
- data/LICENSE.txt +22 -0
- data/README.rdoc +164 -0
- data/Rakefile +50 -0
- data/VERSION.yml +4 -0
- data/lib/hirb.rb +56 -0
- data/lib/hirb/console.rb +43 -0
- data/lib/hirb/formatter.rb +199 -0
- data/lib/hirb/hash_struct.rb +17 -0
- data/lib/hirb/helpers.rb +7 -0
- data/lib/hirb/helpers/active_record_table.rb +16 -0
- data/lib/hirb/helpers/auto_table.rb +15 -0
- data/lib/hirb/helpers/object_table.rb +15 -0
- data/lib/hirb/helpers/parent_child_tree.rb +22 -0
- data/lib/hirb/helpers/table.rb +243 -0
- data/lib/hirb/helpers/tree.rb +177 -0
- data/lib/hirb/import_object.rb +10 -0
- data/lib/hirb/menu.rb +47 -0
- data/lib/hirb/pager.rb +94 -0
- data/lib/hirb/util.rb +80 -0
- data/lib/hirb/view.rb +177 -0
- data/lib/hirb/views/activerecord_base.rb +9 -0
- data/test/console_test.rb +12 -0
- data/test/formatter_test.rb +172 -0
- data/test/hirb_test.rb +23 -0
- data/test/import_test.rb +9 -0
- data/test/menu_test.rb +94 -0
- data/test/pager_test.rb +164 -0
- data/test/table_test.rb +374 -0
- data/test/test_helper.rb +47 -0
- data/test/tree_test.rb +167 -0
- data/test/util_test.rb +56 -0
- data/test/view_test.rb +116 -0
- metadata +96 -0
data/test/test_helper.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'test/unit'
|
3
|
+
require 'context' #gem install jeremymcanally-context -s http://gems.github.com
|
4
|
+
require 'matchy' #gem install jeremymcanally-matchy -s http://gems.github.com
|
5
|
+
require 'mocha'
|
6
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
7
|
+
require 'hirb'
|
8
|
+
|
9
|
+
class Test::Unit::TestCase
|
10
|
+
# set these to avoid invoking stty multiple times which doubles test suite running time
|
11
|
+
ENV["LINES"] = ENV["COLUMNS"] = "20"
|
12
|
+
def reset_terminal_size
|
13
|
+
ENV["LINES"] = ENV["COLUMNS"] = "20"
|
14
|
+
end
|
15
|
+
|
16
|
+
def capture_stdout(&block)
|
17
|
+
original_stdout = $stdout
|
18
|
+
$stdout = fake = StringIO.new
|
19
|
+
begin
|
20
|
+
yield
|
21
|
+
ensure
|
22
|
+
$stdout = original_stdout
|
23
|
+
end
|
24
|
+
fake.string
|
25
|
+
end
|
26
|
+
|
27
|
+
def reset_config
|
28
|
+
Hirb::View.instance_eval "@config = nil"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
class String
|
33
|
+
def unindent(num=nil)
|
34
|
+
regex = num ? /^\s{#{num}}/ : /^\s*/
|
35
|
+
gsub(regex, '').chomp
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# mocks IRB for View + Pager
|
40
|
+
module ::IRB
|
41
|
+
class Irb
|
42
|
+
def initialize(context)
|
43
|
+
@context = context
|
44
|
+
end
|
45
|
+
def output_value; end
|
46
|
+
end
|
47
|
+
end
|
data/test/tree_test.rb
ADDED
@@ -0,0 +1,167 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'test_helper')
|
2
|
+
|
3
|
+
class Hirb::Helpers::TreeTest < Test::Unit::TestCase
|
4
|
+
def tree(*args)
|
5
|
+
Hirb::Helpers::Tree.render(*args)
|
6
|
+
end
|
7
|
+
|
8
|
+
context "basic tree" do
|
9
|
+
test "with hash nodes renders" do
|
10
|
+
expected_tree = <<-TREE.unindent(6)
|
11
|
+
0.0
|
12
|
+
1.1
|
13
|
+
2.2
|
14
|
+
3.2
|
15
|
+
4.1
|
16
|
+
TREE
|
17
|
+
tree([{:level=>0, :value=>'0.0'}, {:level=>1, :value=>'1.1'}, {:level=>2, :value=>'2.2'},{:level=>2, :value=>'3.2'},
|
18
|
+
{:level=>1, :value=>'4.1'}]).should == expected_tree
|
19
|
+
end
|
20
|
+
|
21
|
+
test "with array nodes renders" do
|
22
|
+
expected_tree = <<-TREE.unindent(6)
|
23
|
+
0.0
|
24
|
+
1.1
|
25
|
+
2.2
|
26
|
+
3.2
|
27
|
+
4.1
|
28
|
+
TREE
|
29
|
+
tree([[0, "0.0"], [1, "1.1"], [2, "2.2"], [2, "3.2"], [1, "4.1"]]).should == expected_tree
|
30
|
+
end
|
31
|
+
|
32
|
+
test "with non-string values renders" do
|
33
|
+
expected_tree = <<-TREE.unindent(6)
|
34
|
+
0.0
|
35
|
+
1.1
|
36
|
+
2.2
|
37
|
+
3.2
|
38
|
+
4.1
|
39
|
+
TREE
|
40
|
+
tree([[0,0.0],[1,1.1],[2,2.2],[2,3.2],[1,4.1]]).should == expected_tree
|
41
|
+
end
|
42
|
+
|
43
|
+
test "with indent option renders" do
|
44
|
+
expected_tree = <<-TREE.unindent(6)
|
45
|
+
0.0
|
46
|
+
1.1
|
47
|
+
2.2
|
48
|
+
3.2
|
49
|
+
4.1
|
50
|
+
TREE
|
51
|
+
tree([[0, "0.0"], [1, "1.1"], [2, "2.2"], [2, "3.2"], [1, "4.1"]], :indent=>2).should == expected_tree
|
52
|
+
end
|
53
|
+
|
54
|
+
test "with limit option renders" do
|
55
|
+
expected_tree = <<-TREE.unindent(6)
|
56
|
+
0.0
|
57
|
+
1.1
|
58
|
+
4.1
|
59
|
+
TREE
|
60
|
+
tree([[0, "0.0"], [1, "1.1"], [2, "2.2"], [2, "3.2"], [1, "4.1"]], :limit=>1).should == expected_tree
|
61
|
+
end
|
62
|
+
|
63
|
+
test "with description option renders" do
|
64
|
+
expected_tree = <<-TREE.unindent(6)
|
65
|
+
0.0
|
66
|
+
1.1
|
67
|
+
2.2
|
68
|
+
3.2
|
69
|
+
4.1
|
70
|
+
|
71
|
+
5 nodes in tree
|
72
|
+
TREE
|
73
|
+
tree([[0, "0.0"], [1, "1.1"], [2, "2.2"], [2, "3.2"], [1, "4.1"]], :description=>true).should == expected_tree
|
74
|
+
end
|
75
|
+
|
76
|
+
test "with type directory renders" do
|
77
|
+
expected_tree = <<-TREE.unindent
|
78
|
+
0.0
|
79
|
+
|-- 1.1
|
80
|
+
| |-- 2.2
|
81
|
+
| `-- 3.2
|
82
|
+
`-- 4.1
|
83
|
+
TREE
|
84
|
+
tree([[0, "0.0"], [1, "1.1"], [2, "2.2"], [2, "3.2"], [1, "4.1"]], :type=>:directory).should == expected_tree
|
85
|
+
end
|
86
|
+
|
87
|
+
test "with type directory and multiple children per level renders" do
|
88
|
+
expected_tree = <<-TREE.unindent
|
89
|
+
0.0
|
90
|
+
|-- 1.1
|
91
|
+
| |-- 2.2
|
92
|
+
| | `-- 3.3
|
93
|
+
| `-- 4.2
|
94
|
+
| `-- 5.3
|
95
|
+
`-- 6.1
|
96
|
+
TREE
|
97
|
+
tree([[0,'0.0'], [1,'1.1'], [2,'2.2'],[3,'3.3'],[2,'4.2'],[3,'5.3'],[1,'6.1']], :type=>:directory).should == expected_tree
|
98
|
+
end
|
99
|
+
|
100
|
+
test "with type number renders" do
|
101
|
+
expected_tree = <<-TREE.unindent(6)
|
102
|
+
1. 0
|
103
|
+
1. 1
|
104
|
+
1. 2
|
105
|
+
2. 3
|
106
|
+
2. 4
|
107
|
+
TREE
|
108
|
+
tree([[0,'0'],[1,'1'],[2,'2'],[2,'3'],[1,'4']], :type=>:number)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def mock_node(value, value_method)
|
113
|
+
children = []
|
114
|
+
value,children = *value if value.is_a?(Array)
|
115
|
+
mock(value_method=>value, :children=>children.map {|e| mock_node(e, value_method)})
|
116
|
+
end
|
117
|
+
|
118
|
+
context "parent_child_tree" do
|
119
|
+
test "with name value renders" do
|
120
|
+
expected_tree = <<-TREE.unindent
|
121
|
+
0.0
|
122
|
+
|-- 1.1
|
123
|
+
|-- 2.1
|
124
|
+
| `-- 3.2
|
125
|
+
`-- 4.1
|
126
|
+
TREE
|
127
|
+
root = mock_node(['0.0', ['1.1', ['2.1', '3.2'], '4.1']], :name)
|
128
|
+
Hirb::Helpers::ParentChildTree.render(root, :type=>:directory).should == expected_tree
|
129
|
+
end
|
130
|
+
|
131
|
+
test "with object_id value renders" do
|
132
|
+
expected_tree = <<-TREE.unindent
|
133
|
+
0.0
|
134
|
+
|-- 1.1
|
135
|
+
|-- 2.1
|
136
|
+
| `-- 3.2
|
137
|
+
`-- 4.1
|
138
|
+
TREE
|
139
|
+
root = mock_node(['0.0', ['1.1', ['2.1', '3.2'], '4.1']], :object_id)
|
140
|
+
Hirb::Helpers::ParentChildTree.render(root, :type=>:directory).should == expected_tree
|
141
|
+
end
|
142
|
+
|
143
|
+
test "with value_method option renders" do
|
144
|
+
expected_tree = <<-TREE.unindent
|
145
|
+
0.0
|
146
|
+
|-- 1.1
|
147
|
+
|-- 2.1
|
148
|
+
| `-- 3.2
|
149
|
+
`-- 4.1
|
150
|
+
TREE
|
151
|
+
root = mock_node(['0.0', ['1.1', ['2.1', '3.2'], '4.1']], :blah)
|
152
|
+
Hirb::Helpers::ParentChildTree.render(root, :type=>:directory, :value_method=>:blah).should == expected_tree
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
test "tree with parentless nodes renders ParentlessNodeError" do
|
157
|
+
assert_raises(Hirb::Helpers::Tree::ParentlessNodeError) { tree([[0, "0.0"], [2, '1.2']], :validate=>true) }
|
158
|
+
end
|
159
|
+
|
160
|
+
test "tree with hash nodes missing level raises MissingLevelError" do
|
161
|
+
assert_raises(Hirb::Helpers::Tree::Node::MissingLevelError) { tree([{:value=>'ok'}]) }
|
162
|
+
end
|
163
|
+
|
164
|
+
test "tree with hash nodes missing level raises MissingValueError" do
|
165
|
+
assert_raises(Hirb::Helpers::Tree::Node::MissingValueError) { tree([{:level=>0}]) }
|
166
|
+
end
|
167
|
+
end
|
data/test/util_test.rb
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'test_helper')
|
2
|
+
|
3
|
+
module Hirb
|
4
|
+
class UtilTest < Test::Unit::TestCase
|
5
|
+
test "any_const_get returns nested class" do
|
6
|
+
Util.any_const_get("Test::Unit").should == ::Test::Unit
|
7
|
+
end
|
8
|
+
|
9
|
+
test "any_const_get returns nil for invalid class" do
|
10
|
+
Util.any_const_get("Basdfr").should == nil
|
11
|
+
end
|
12
|
+
|
13
|
+
test "any_const_get returns class when given class" do
|
14
|
+
Util.any_const_get(String).should == String
|
15
|
+
end
|
16
|
+
|
17
|
+
test "recursive_hash_merge merges" do
|
18
|
+
expected_hash = {:output=>{:fields=>["f1", "f2"], :method=>"blah"}, :key1=>"hash1", :key2=>"hash2"}
|
19
|
+
Util.recursive_hash_merge({:output=>{:fields=>%w{f1 f2}}, :key1=>'hash1'},
|
20
|
+
{:output=>{:method=>'blah'}, :key2=>'hash2'}).should == expected_hash
|
21
|
+
end
|
22
|
+
|
23
|
+
test "choose_from_array specifies range with -" do
|
24
|
+
Util.choose_from_array([1,2,3,4], '1-2,4').should == [1,2,4]
|
25
|
+
end
|
26
|
+
|
27
|
+
test "choose_from_array specifies range with .." do
|
28
|
+
Util.choose_from_array([1,2,3,4], '1 .. 2,4').should == [1,2,4]
|
29
|
+
end
|
30
|
+
|
31
|
+
test "choose_from_array chooses all with *" do
|
32
|
+
Util.choose_from_array([1,2,3,4], '*').should == [1,2,3,4]
|
33
|
+
end
|
34
|
+
|
35
|
+
test "choose_from_array ignores non-numerical input" do
|
36
|
+
Util.choose_from_array([1,2,3,4], 'a,2').should == [2]
|
37
|
+
end
|
38
|
+
|
39
|
+
test "choose_from_array ignores 0" do
|
40
|
+
Util.choose_from_array([1,2,3,4], '0,2').should == [2]
|
41
|
+
end
|
42
|
+
|
43
|
+
test "choose_from_array returns empty when empty input" do
|
44
|
+
Util.choose_from_array([1,2,3,4], "\n").should == []
|
45
|
+
end
|
46
|
+
|
47
|
+
test "choose_from_array returns empty with an invalid range" do
|
48
|
+
Util.choose_from_array([1,2,3,4], "5").should == []
|
49
|
+
end
|
50
|
+
|
51
|
+
test "capture_stdout" do
|
52
|
+
string = "sweetness man"
|
53
|
+
Util.capture_stdout { puts string }.should == string + "\n"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
data/test/view_test.rb
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'test_helper')
|
2
|
+
|
3
|
+
module Hirb
|
4
|
+
class ViewTest < Test::Unit::TestCase
|
5
|
+
def formatter_config
|
6
|
+
View.formatter.config
|
7
|
+
end
|
8
|
+
|
9
|
+
test "page_output pages when view is enabled" do
|
10
|
+
Hirb.enable
|
11
|
+
View.pager.stubs(:activated_by?).returns(true)
|
12
|
+
View.pager.expects(:page)
|
13
|
+
View.page_output('blah').should be(true)
|
14
|
+
Hirb.disable
|
15
|
+
end
|
16
|
+
|
17
|
+
test "page_output doesn't page when view is disabled" do
|
18
|
+
Hirb.enable
|
19
|
+
Hirb.disable
|
20
|
+
View.pager.stubs(:activated_by?).returns(true)
|
21
|
+
View.pager.expects(:page).never
|
22
|
+
View.page_output('blah').should be(false)
|
23
|
+
end
|
24
|
+
|
25
|
+
context "enable" do
|
26
|
+
before(:each) { reset_config }
|
27
|
+
after(:each) { Hirb.disable }
|
28
|
+
test "redefines irb output_value" do
|
29
|
+
View.expects(:render_output).once
|
30
|
+
Hirb.enable
|
31
|
+
context_stub = stub(:last_value=>'')
|
32
|
+
::IRB::Irb.new(context_stub).output_value
|
33
|
+
end
|
34
|
+
test "is enabled?" do
|
35
|
+
Hirb.enable
|
36
|
+
assert View.enabled?
|
37
|
+
end
|
38
|
+
|
39
|
+
test "works without irb" do
|
40
|
+
Object.stubs(:const_defined?).with(:IRB).returns(false)
|
41
|
+
Hirb.enable
|
42
|
+
assert formatter_config.size > 0
|
43
|
+
end
|
44
|
+
|
45
|
+
test "with config_file option sets config_file" do
|
46
|
+
Hirb.config_file.should_not == 'test_file'
|
47
|
+
Hirb.enable :config_file=> 'test_file'
|
48
|
+
Hirb.config_file.should == 'test_file'
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context "resize" do
|
53
|
+
def pager; View.pager; end
|
54
|
+
before(:each) { View.pager = nil; reset_config; Hirb.enable }
|
55
|
+
after(:each) { Hirb.disable}
|
56
|
+
test "changes width and height with stty" do
|
57
|
+
Util.expects(:command_exists?).with('stty').returns(true)
|
58
|
+
ENV['COLUMNS'] = ENV['LINES'] = nil # bypasses env usage
|
59
|
+
View.resize
|
60
|
+
pager.width.should_not == 10
|
61
|
+
pager.height.should_not == 10
|
62
|
+
reset_terminal_size
|
63
|
+
end
|
64
|
+
|
65
|
+
test "changes width and height with ENV" do
|
66
|
+
ENV['COLUMNS'] = ENV['LINES'] = '10' # simulates resizing
|
67
|
+
View.resize
|
68
|
+
pager.width.should == 10
|
69
|
+
pager.height.should == 10
|
70
|
+
end
|
71
|
+
|
72
|
+
test "with no environment or stty still has valid width and height" do
|
73
|
+
View.config[:width] = View.config[:height] = nil
|
74
|
+
Util.expects(:command_exists?).with('stty').returns(false)
|
75
|
+
ENV['COLUMNS'] = ENV['LINES'] = nil
|
76
|
+
View.resize
|
77
|
+
pager.width.is_a?(Integer).should be(true)
|
78
|
+
pager.height.is_a?(Integer).should be(true)
|
79
|
+
reset_terminal_size
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
test "disable points output_value back to original output_value" do
|
84
|
+
View.expects(:render_output).never
|
85
|
+
Hirb.enable
|
86
|
+
Hirb.disable
|
87
|
+
context_stub = stub(:last_value=>'')
|
88
|
+
::IRB::Irb.new(context_stub).output_value
|
89
|
+
end
|
90
|
+
|
91
|
+
test "disable works without irb defined" do
|
92
|
+
Object.stubs(:const_defined?).with(:IRB).returns(false)
|
93
|
+
Hirb.enable
|
94
|
+
Hirb.disable
|
95
|
+
View.enabled?.should be(false)
|
96
|
+
end
|
97
|
+
|
98
|
+
test "capture_and_render" do
|
99
|
+
string = 'no waaaay'
|
100
|
+
View.render_method.expects(:call).with(string)
|
101
|
+
View.capture_and_render { print string }
|
102
|
+
end
|
103
|
+
|
104
|
+
test "state is toggled by toggle_pager" do
|
105
|
+
previous_state = View.config[:pager]
|
106
|
+
View.toggle_pager
|
107
|
+
View.config[:pager].should == !previous_state
|
108
|
+
end
|
109
|
+
|
110
|
+
test "state is toggled by toggle_formatter" do
|
111
|
+
previous_state = View.config[:formatter]
|
112
|
+
View.toggle_formatter
|
113
|
+
View.config[:formatter].should == !previous_state
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
metadata
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: Chrononaut-hirb
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Gabriel Horner
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-06-20 00:00:00 -07:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: Hirb currently provides a mini view framework for console applications, designed to improve irb's default output. Hirb improves console output by providing a smart pager and auto-formatting output. The smart pager detects when an output exceeds a screenful and thus only pages output as needed. Auto-formatting adds a view to an output's class. This is helpful in separating views from content (MVC anyone?). The framework encourages reusing views by letting you package them in classes and associate them with any number of output classes.
|
17
|
+
email: gabriel.horner@gmail.com
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files:
|
23
|
+
- LICENSE.txt
|
24
|
+
- README.rdoc
|
25
|
+
files:
|
26
|
+
- CHANGELOG.rdoc
|
27
|
+
- LICENSE.txt
|
28
|
+
- README.rdoc
|
29
|
+
- Rakefile
|
30
|
+
- VERSION.yml
|
31
|
+
- lib/hirb.rb
|
32
|
+
- lib/hirb/console.rb
|
33
|
+
- lib/hirb/formatter.rb
|
34
|
+
- lib/hirb/hash_struct.rb
|
35
|
+
- lib/hirb/helpers.rb
|
36
|
+
- lib/hirb/helpers/active_record_table.rb
|
37
|
+
- lib/hirb/helpers/auto_table.rb
|
38
|
+
- lib/hirb/helpers/object_table.rb
|
39
|
+
- lib/hirb/helpers/parent_child_tree.rb
|
40
|
+
- lib/hirb/helpers/table.rb
|
41
|
+
- lib/hirb/helpers/tree.rb
|
42
|
+
- lib/hirb/import_object.rb
|
43
|
+
- lib/hirb/menu.rb
|
44
|
+
- lib/hirb/pager.rb
|
45
|
+
- lib/hirb/util.rb
|
46
|
+
- lib/hirb/view.rb
|
47
|
+
- lib/hirb/views/activerecord_base.rb
|
48
|
+
- test/console_test.rb
|
49
|
+
- test/formatter_test.rb
|
50
|
+
- test/hirb_test.rb
|
51
|
+
- test/import_test.rb
|
52
|
+
- test/menu_test.rb
|
53
|
+
- test/pager_test.rb
|
54
|
+
- test/table_test.rb
|
55
|
+
- test/test_helper.rb
|
56
|
+
- test/tree_test.rb
|
57
|
+
- test/util_test.rb
|
58
|
+
- test/view_test.rb
|
59
|
+
has_rdoc: true
|
60
|
+
homepage: http://github.com/cldwalker/hirb
|
61
|
+
post_install_message:
|
62
|
+
rdoc_options:
|
63
|
+
- --charset=UTF-8
|
64
|
+
require_paths:
|
65
|
+
- lib
|
66
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: "0"
|
71
|
+
version:
|
72
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ">="
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: "0"
|
77
|
+
version:
|
78
|
+
requirements: []
|
79
|
+
|
80
|
+
rubyforge_project: tagaholic
|
81
|
+
rubygems_version: 1.2.0
|
82
|
+
signing_key:
|
83
|
+
specification_version: 3
|
84
|
+
summary: A mini view framework for console/irb that's easy to use, even while under its influence.
|
85
|
+
test_files:
|
86
|
+
- test/console_test.rb
|
87
|
+
- test/formatter_test.rb
|
88
|
+
- test/hirb_test.rb
|
89
|
+
- test/import_test.rb
|
90
|
+
- test/menu_test.rb
|
91
|
+
- test/pager_test.rb
|
92
|
+
- test/table_test.rb
|
93
|
+
- test/test_helper.rb
|
94
|
+
- test/tree_test.rb
|
95
|
+
- test/util_test.rb
|
96
|
+
- test/view_test.rb
|