Chrononaut-hirb 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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