hsume2-hirb 0.6.0.beta.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.
Files changed (53) hide show
  1. data/.gemspec +21 -0
  2. data/CHANGELOG.rdoc +144 -0
  3. data/LICENSE.txt +22 -0
  4. data/README.rdoc +194 -0
  5. data/Rakefile +35 -0
  6. data/lib/bond/completions/hirb.rb +15 -0
  7. data/lib/hirb/console.rb +43 -0
  8. data/lib/hirb/dynamic_view.rb +113 -0
  9. data/lib/hirb/formatter.rb +126 -0
  10. data/lib/hirb/helpers/auto_table.rb +24 -0
  11. data/lib/hirb/helpers/object_table.rb +14 -0
  12. data/lib/hirb/helpers/parent_child_tree.rb +24 -0
  13. data/lib/hirb/helpers/tab_table.rb +24 -0
  14. data/lib/hirb/helpers/table/filters.rb +10 -0
  15. data/lib/hirb/helpers/table/resizer.rb +82 -0
  16. data/lib/hirb/helpers/table.rb +349 -0
  17. data/lib/hirb/helpers/tree.rb +181 -0
  18. data/lib/hirb/helpers/unicode_table.rb +15 -0
  19. data/lib/hirb/helpers/vertical_table.rb +37 -0
  20. data/lib/hirb/helpers.rb +18 -0
  21. data/lib/hirb/import_object.rb +10 -0
  22. data/lib/hirb/menu.rb +238 -0
  23. data/lib/hirb/pager.rb +105 -0
  24. data/lib/hirb/string.rb +44 -0
  25. data/lib/hirb/util.rb +96 -0
  26. data/lib/hirb/version.rb +3 -0
  27. data/lib/hirb/view.rb +270 -0
  28. data/lib/hirb/views/couch_db.rb +11 -0
  29. data/lib/hirb/views/misc_db.rb +15 -0
  30. data/lib/hirb/views/mongo_db.rb +14 -0
  31. data/lib/hirb/views/orm.rb +11 -0
  32. data/lib/hirb/views/rails.rb +19 -0
  33. data/lib/hirb/views.rb +8 -0
  34. data/lib/hirb.rb +82 -0
  35. data/lib/ripl/hirb.rb +15 -0
  36. data/test/auto_table_test.rb +30 -0
  37. data/test/console_test.rb +27 -0
  38. data/test/deps.rip +4 -0
  39. data/test/dynamic_view_test.rb +94 -0
  40. data/test/formatter_test.rb +176 -0
  41. data/test/hirb_test.rb +39 -0
  42. data/test/import_test.rb +9 -0
  43. data/test/menu_test.rb +255 -0
  44. data/test/object_table_test.rb +79 -0
  45. data/test/pager_test.rb +162 -0
  46. data/test/resizer_test.rb +62 -0
  47. data/test/table_test.rb +630 -0
  48. data/test/test_helper.rb +61 -0
  49. data/test/tree_test.rb +184 -0
  50. data/test/util_test.rb +59 -0
  51. data/test/view_test.rb +165 -0
  52. data/test/views_test.rb +13 -0
  53. metadata +184 -0
data/lib/hirb/util.rb ADDED
@@ -0,0 +1,96 @@
1
+ module Hirb
2
+ # Group of handy utility functions used throughout Hirb.
3
+ module Util
4
+ extend self
5
+ # Returns a constant like Module#const_get no matter what namespace it's nested in.
6
+ # Returns nil if the constant is not found.
7
+ def any_const_get(name)
8
+ return name if name.is_a?(Module)
9
+ begin
10
+ klass = Object
11
+ name.split('::').each {|e|
12
+ klass = klass.const_get(e)
13
+ }
14
+ klass
15
+ rescue
16
+ nil
17
+ end
18
+ end
19
+
20
+ # Recursively merge hash1 with hash2.
21
+ def recursive_hash_merge(hash1, hash2)
22
+ hash1.merge(hash2) {|k,o,n| (o.is_a?(Hash)) ? recursive_hash_merge(o,n) : n}
23
+ end
24
+
25
+ # From Rails ActiveSupport, converting undescored lowercase to camel uppercase.
26
+ def camelize(string)
27
+ string.to_s.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
28
+ end
29
+
30
+ # Used by Hirb::Menu to select items from an array. Array counting starts at 1. Ranges of numbers are specified with a '-' or '..'.
31
+ # Multiple ranges can be comma delimited. Anything that isn't a valid number is ignored. All elements can be returned with a '*'.
32
+ # Examples:
33
+ # 1-3,5-6 -> [1,2,3,5,6]
34
+ # * -> all elements in array
35
+ # '' -> []
36
+ def choose_from_array(array, input, options={})
37
+ options = {:splitter=>","}.merge(options)
38
+ return array if input.strip == '*'
39
+ result = []
40
+ input.split(options[:splitter]).each do |e|
41
+ if e =~ /-|\.\./
42
+ min,max = e.split(/-|\.\./)
43
+ slice_min = min.to_i - 1
44
+ result.push(*array.slice(slice_min, max.to_i - min.to_i + 1))
45
+ elsif e =~ /\s*(\d+)\s*/
46
+ index = $1.to_i - 1
47
+ next if index < 0
48
+ result.push(array[index]) if array[index]
49
+ end
50
+ end
51
+ result
52
+ end
53
+
54
+ # Determines if a shell command exists by searching for it in ENV['PATH'].
55
+ def command_exists?(command)
56
+ ENV['PATH'].split(File::PATH_SEPARATOR).any? {|d| File.exists? File.join(d, command) }
57
+ end
58
+
59
+ # Returns [width, height] of terminal when detected, nil if not detected.
60
+ # Think of this as a simpler version of Highline's Highline::SystemExtensions.terminal_size()
61
+ def detect_terminal_size
62
+ if (ENV['COLUMNS'] =~ /^\d+$/) && (ENV['LINES'] =~ /^\d+$/)
63
+ [ENV['COLUMNS'].to_i, ENV['LINES'].to_i]
64
+ elsif (RUBY_PLATFORM =~ /java/ || (!STDIN.tty? && ENV['TERM'])) && command_exists?('tput')
65
+ [`tput cols`.to_i, `tput lines`.to_i]
66
+ elsif STDIN.tty? && command_exists?('stty')
67
+ `stty size`.scan(/\d+/).map { |s| s.to_i }.reverse
68
+ else
69
+ nil
70
+ end
71
+ rescue
72
+ nil
73
+ end
74
+
75
+ # Captures STDOUT of anything run in its block and returns it as string.
76
+ def capture_stdout(&block)
77
+ original_stdout = $stdout
78
+ $stdout = fake = StringIO.new
79
+ begin
80
+ yield
81
+ ensure
82
+ $stdout = original_stdout
83
+ end
84
+ fake.string
85
+ end
86
+
87
+ # From Rubygems, determine a user's home.
88
+ def find_home
89
+ ['HOME', 'USERPROFILE'].each {|e| return ENV[e] if ENV[e] }
90
+ return "#{ENV['HOMEDRIVE']}#{ENV['HOMEPATH']}" if ENV['HOMEDRIVE'] && ENV['HOMEPATH']
91
+ File.expand_path("~")
92
+ rescue
93
+ File::ALT_SEPARATOR ? "C:/" : "/"
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,3 @@
1
+ module Hirb
2
+ VERSION = '0.6.0.beta.1'
3
+ end
data/lib/hirb/view.rb ADDED
@@ -0,0 +1,270 @@
1
+ module Hirb
2
+ # This class is responsible for managing all view-related functionality.
3
+ #
4
+ # == Create a View
5
+ # Let's create a simple view for Hash objects:
6
+ # $ irb -rubygems
7
+ # >> require 'hirb'
8
+ # =>true
9
+ # >> Hirb.enable
10
+ # =>nil
11
+ # >> require 'yaml'
12
+ # =>true
13
+ #
14
+ # # A view method is the smallest view
15
+ # >> def yaml(output); output.to_yaml; end
16
+ # => nil
17
+ # # Add the view
18
+ # >> Hirb.add_view Hash, :method=>:yaml
19
+ # => true
20
+ #
21
+ # # Hashes now appear as yaml
22
+ # >> {:a=>1, :b=>{:c=>3}}
23
+ # ---
24
+ # :a : 1
25
+ # :b :
26
+ # :c : 3
27
+ # => true
28
+ #
29
+ # Another way of creating a view is a Helper class:
30
+ #
31
+ # # Create yaml view class
32
+ # >> class Hirb::Helpers::Yaml; def self.render(output, options={}); output.to_yaml; end ;end
33
+ # =>nil
34
+ # # Add the view
35
+ # >> Hirb.add_view Hash, :class=>Hirb::Helpers::Yaml
36
+ # =>true
37
+ #
38
+ # # Hashes appear as yaml like above ...
39
+ #
40
+ # == Configure a View
41
+ # To configure the above Helper class as a view, either pass Hirb.enable a hash:
42
+ # # In .irbrc
43
+ # require 'hirb'
44
+ # # View class needs to come before enable()
45
+ # class Hirb::Helpers::Yaml; def self.render(output, options={}); output.to_yaml; end ;end
46
+ # Hirb.enable :output=>{"Hash"=>{:class=>"Hirb::Helpers::Yaml"}}
47
+ #
48
+ # Or create a config file at config/hirb.yml or ~/.hirb.yml:
49
+ # # The config file for the yaml example would look like:
50
+ # # ---
51
+ # # :output :
52
+ # # Hash :
53
+ # # :class : Hirb::Helpers::Yaml
54
+ #
55
+ # # In .irbrc
56
+ # require 'hirb'
57
+ # # View class needs to come before enable()
58
+ # class Hirb::Helpers::Yaml; def self.render(output, options={}); output.to_yaml; end ;end
59
+ # Hirb.enable
60
+ #
61
+ # For more about configuring Hirb, see the Config Files section in Hirb.
62
+ module View
63
+ DEFAULT_WIDTH = 120
64
+ DEFAULT_HEIGHT = 40
65
+ class<<self
66
+ attr_accessor :render_method
67
+ attr_reader :config
68
+
69
+ # This activates view functionality i.e. the formatter, pager and size detection. If irb exists, it overrides irb's output
70
+ # method with Hirb::View.view_output. When called multiple times, new configs are merged into the existing config.
71
+ # If using Wirble, you should call this after it. The view configuration can be specified in a hash via a config file,
72
+ # or as options to this method. In addition to the config keys mentioned in Hirb, options also take the following keys:
73
+ # ==== Options:
74
+ # * config_file: Name of config file(s) that are merged into existing config
75
+ # Examples:
76
+ # Hirb.enable
77
+ # Hirb.enable :formatter=>false
78
+ def enable(options={}, &block)
79
+ Array(options.delete(:config_file)).each {|e|
80
+ @new_config_file = true
81
+ Hirb.config_files << e
82
+ }
83
+ enable_output_method unless @output_method
84
+ merge_or_load_config options
85
+ resize(config[:width], config[:height])
86
+ @enabled = true
87
+ end
88
+
89
+ # Indicates if Hirb::View is enabled.
90
+ def enabled?
91
+ @enabled || false
92
+ end
93
+
94
+ # Disable's Hirb's output and revert's irb's output method if irb exists.
95
+ def disable
96
+ @enabled = false
97
+ disable_output_method if @output_method
98
+ false
99
+ end
100
+
101
+ # Toggles pager on or off. The pager only works while Hirb::View is enabled.
102
+ def toggle_pager
103
+ config[:pager] = !config[:pager]
104
+ end
105
+
106
+ # Toggles formatter on or off.
107
+ def toggle_formatter
108
+ config[:formatter] = !config[:formatter]
109
+ end
110
+
111
+ # Resizes the console width and height for use with the table and pager i.e. after having resized the console window. *nix users
112
+ # should only have to call this method. Non-*nix users should call this method with explicit width and height. If you don't know
113
+ # your width and height, in irb play with "a"* width to find width and puts "a\n" * height to find height.
114
+ def resize(width=nil, height=nil)
115
+ config[:width], config[:height] = determine_terminal_size(width, height)
116
+ pager.resize(config[:width], config[:height])
117
+ end
118
+
119
+ # This is the main method of this class. When view is enabled, this method searches for a formatter it can use for the output and if
120
+ # successful renders it using render_method(). The options this method takes are helper config hashes as described in
121
+ # Hirb::Formatter.format_output(). Returns true if successful and false if no formatting is done or if not enabled.
122
+ def view_output(output, options={})
123
+ enabled? && config[:formatter] && render_output(output, options)
124
+ rescue Exception=>e
125
+ if config[:ignore_errors]
126
+ $stderr.puts "Hirb Error: #{e.message}"
127
+ false
128
+ else
129
+ index = (obj = e.backtrace.find {|f| f =~ /^\(eval\)/}) ? e.backtrace.index(obj) : e.backtrace.length
130
+ $stderr.puts "Hirb Error: #{e.message}", e.backtrace.slice(0,index).map {|e| " " + e }
131
+ true
132
+ end
133
+ end
134
+
135
+ # Captures STDOUT and renders it using render_method(). The main use case is to conditionally page captured stdout.
136
+ def capture_and_render(&block)
137
+ render_method.call Util.capture_stdout(&block)
138
+ end
139
+
140
+ # A lambda or proc which handles the final formatted object.
141
+ # Although this pages/puts the object by default, it could be set to do other things
142
+ # i.e. write the formatted object to a file.
143
+ def render_method
144
+ @render_method ||= default_render_method
145
+ end
146
+
147
+ # Resets render_method back to its default.
148
+ def reset_render_method
149
+ @render_method = default_render_method
150
+ end
151
+
152
+ # Current console width
153
+ def width
154
+ config && config[:width] ? config[:width] : DEFAULT_WIDTH
155
+ end
156
+
157
+ # Current console height
158
+ def height
159
+ config && config[:height] ? config[:height] : DEFAULT_HEIGHT
160
+ end
161
+
162
+ # Current formatter config, storing a hash of all static views
163
+ def formatter_config
164
+ formatter.config
165
+ end
166
+
167
+ # Adds a view when View is enabled. See Formatter.add_view for more details.
168
+ def add(klass, view_config)
169
+ if enabled?
170
+ formatter.add_view(klass, view_config)
171
+ else
172
+ puts "View must be enabled to add a view"
173
+ end
174
+ end
175
+
176
+ #:stopdoc:
177
+ def enable_output_method
178
+ if defined?(Ripl) && Ripl.respond_to?(:started?) && Ripl.started?
179
+ @output_method = true
180
+ require 'ripl/hirb' unless defined? Ripl::Hirb
181
+ elsif defined? IRB::Irb
182
+ @output_method = true
183
+ ::IRB::Irb.class_eval do
184
+ alias_method :non_hirb_view_output, :output_value
185
+ def output_value #:nodoc:
186
+ Hirb::View.view_or_page_output(@context.last_value) || non_hirb_view_output
187
+ end
188
+ end
189
+ end
190
+ end
191
+
192
+ def disable_output_method
193
+ if defined?(IRB::Irb) && !defined? Ripl
194
+ ::IRB::Irb.send :alias_method, :output_value, :non_hirb_view_output
195
+ end
196
+ @output_method = nil
197
+ end
198
+
199
+ def view_or_page_output(str)
200
+ view_output(str) || page_output(str.inspect, true)
201
+ end
202
+
203
+ def render_output(output, options={})
204
+ if (formatted_output = formatter.format_output(output, options))
205
+ render_method.call(formatted_output)
206
+ true
207
+ else
208
+ false
209
+ end
210
+ end
211
+
212
+ def determine_terminal_size(width, height)
213
+ detected = (width.nil? || height.nil?) ? Util.detect_terminal_size || [] : []
214
+ [width || detected[0] || DEFAULT_WIDTH , height || detected[1] || DEFAULT_HEIGHT]
215
+ end
216
+
217
+ def page_output(output, inspect_mode=false)
218
+ if enabled? && config[:pager] && pager.activated_by?(output, inspect_mode)
219
+ pager.page(output, inspect_mode)
220
+ true
221
+ else
222
+ false
223
+ end
224
+ end
225
+
226
+ def pager
227
+ @pager ||= Pager.new(config[:width], config[:height], :pager_command=>config[:pager_command])
228
+ end
229
+
230
+ def pager=(value); @pager = value; end
231
+
232
+ def formatter(reload=false)
233
+ @formatter = reload || @formatter.nil? ? Formatter.new(config[:output]) : @formatter
234
+ end
235
+
236
+ def formatter=(value); @formatter = value; end
237
+
238
+ def merge_or_load_config(additional_config={})
239
+ if @config && (@new_config_file || !additional_config.empty?)
240
+ Hirb.config = nil
241
+ load_config Util.recursive_hash_merge(@config, additional_config)
242
+ @new_config_file = false
243
+ elsif !@enabled
244
+ load_config(additional_config)
245
+ end
246
+ end
247
+
248
+ def load_config(additional_config={})
249
+ @config = Util.recursive_hash_merge default_config, additional_config
250
+ formatter(true)
251
+ true
252
+ end
253
+
254
+ def config_loaded?; !!@config; end
255
+
256
+ def config
257
+ @config
258
+ end
259
+
260
+ def default_render_method
261
+ lambda {|output| page_output(output) || puts(output) }
262
+ end
263
+
264
+ def default_config
265
+ Util.recursive_hash_merge({:pager=>true, :formatter=>true}, Hirb.config || {})
266
+ end
267
+ #:startdoc:
268
+ end
269
+ end
270
+ end
@@ -0,0 +1,11 @@
1
+ module Hirb::Views::CouchDb #:nodoc:
2
+ def default_couch(obj)
3
+ {:fields=>([:_id] + obj.class.properties.map {|e| e.name }) }
4
+ end
5
+
6
+ alias_method :couch_rest__extended_document_view, :default_couch
7
+ alias_method :couch_foo__base_view, :default_couch
8
+ alias_method :couch_potato__persistence_view, :default_couch
9
+ end
10
+
11
+ Hirb::DynamicView.add Hirb::Views::CouchDb, :helper=>:auto_table
@@ -0,0 +1,15 @@
1
+ module Hirb::Views::MiscDb #:nodoc:
2
+ def friendly__document_view(obj)
3
+ {:fields=>obj.class.attributes.keys - [:id]}
4
+ end
5
+
6
+ def ripple__document_view(obj)
7
+ {:fields=>obj.class.properties.keys}
8
+ end
9
+
10
+ def d_b_i__row_view(obj)
11
+ {:fields=>obj.column_names, :table_class=>Hirb::Helpers::Table}
12
+ end
13
+ end
14
+
15
+ Hirb::DynamicView.add Hirb::Views::MiscDb, :helper=>:auto_table
@@ -0,0 +1,14 @@
1
+ module Hirb::Views::MongoDb #:nodoc:
2
+ def mongoid__document_view(obj)
3
+ {:fields=>['_id'] + obj.class.fields.keys}
4
+ end
5
+
6
+ def mongo_mapper__document_view(obj)
7
+ fields = obj.class.column_names
8
+ fields.delete('_id') && fields.unshift('_id')
9
+ {:fields=>fields}
10
+ end
11
+ alias_method :mongo_mapper__embedded_document_view, :mongo_mapper__document_view
12
+ end
13
+
14
+ Hirb::DynamicView.add Hirb::Views::MongoDb, :helper=>:auto_table
@@ -0,0 +1,11 @@
1
+ module Hirb::Views::ORM #:nodoc:
2
+ def data_mapper__resource_view(obj)
3
+ {:fields=>obj.class.properties.map {|e| e.name }}
4
+ end
5
+
6
+ def sequel__model_view(obj)
7
+ {:fields=>obj.class.columns}
8
+ end
9
+ end
10
+
11
+ Hirb::DynamicView.add Hirb::Views::ORM, :helper=>:auto_table
@@ -0,0 +1,19 @@
1
+ module Hirb::Views::Rails #:nodoc:
2
+ def active_record__base_view(obj)
3
+ {:fields=>get_active_record_fields(obj)}
4
+ end
5
+
6
+ def get_active_record_fields(obj)
7
+ fields = obj.class.column_names.map {|e| e.to_sym }
8
+ # if query used select
9
+ if obj.attributes.keys.sort != obj.class.column_names.sort
10
+ selected_columns = obj.attributes.keys
11
+ sorted_columns = obj.class.column_names.dup.delete_if {|e| !selected_columns.include?(e) }
12
+ sorted_columns += (selected_columns - sorted_columns)
13
+ fields = sorted_columns.map {|e| e.to_sym}
14
+ end
15
+ fields
16
+ end
17
+ end
18
+
19
+ Hirb::DynamicView.add Hirb::Views::Rails, :helper=>:auto_table
data/lib/hirb/views.rb ADDED
@@ -0,0 +1,8 @@
1
+ module Hirb
2
+ # Namespace for Helpers defining multiple views in a module i.e. via DynamicView.
3
+ module Views
4
+ module Single #:nodoc:
5
+ end
6
+ end
7
+ end
8
+ %w{rails orm mongo_db couch_db misc_db}.each {|e| require "hirb/views/#{e}" }
data/lib/hirb.rb ADDED
@@ -0,0 +1,82 @@
1
+ # Needed by Hirb::String to handle multibyte characters
2
+ $KCODE = 'u' if RUBY_VERSION < '1.9'
3
+
4
+ require 'yaml'
5
+ require 'hirb/util'
6
+ require 'hirb/string'
7
+ require 'hirb/formatter' # must come before helpers/auto_table
8
+ require 'hirb/dynamic_view'
9
+ require 'hirb/helpers'
10
+ require 'hirb/views'
11
+ require 'hirb/view'
12
+ require 'hirb/console'
13
+ require 'hirb/pager'
14
+ require 'hirb/menu'
15
+ require 'hirb/version'
16
+
17
+ # Most of Hirb's functionality is in Hirb::View.
18
+ # For a tutorial on configuring and creating views see Hirb::View. For a tutorial on dynamic views see Hirb::DynamicView.
19
+ #
20
+ # == Config Files
21
+ # Hirb can have multiple config files defined by config_files(). These config files
22
+ # have the following top level keys:
23
+ # [*:output*] This hash is used by the formatter object. See Hirb::Formatter.config for its format.
24
+ # [*:width*] Width of the terminal/console. Defaults to Hirb::View::DEFAULT_WIDTH or possibly autodetected when Hirb is enabled.
25
+ # [*:height*] Height of the terminal/console. Defaults to Hirb::View::DEFAULT_HEIGHT or possibly autodetected when Hirb is enabled.
26
+ # [*:formatter*] Boolean which determines if the formatter is enabled. Defaults to true.
27
+ # [*:pager*] Boolean which determines if the pager is enabled. Defaults to true.
28
+ # [*:pager_command*] Command to be used for paging. Command can have options after it i.e. 'less -r'.
29
+ # Defaults to common pagers i.e. less and more if detected.
30
+ # [*:ignore_errors*] Boolean which ignores internal view errors and continues with original view
31
+ # (i.e. #inspect for irb). Defaults to false.
32
+ module Hirb
33
+ class <<self
34
+ attr_accessor :config_files, :config
35
+
36
+ # Enables view functionality. See Hirb::View.enable for details.
37
+ def enable(options={}, &block)
38
+ View.enable(options, &block)
39
+ end
40
+
41
+ # Disables view functionality. See Hirb::View.disable for details.
42
+ def disable
43
+ View.disable
44
+ end
45
+
46
+ # Adds views. See Hirb::View.add for details.
47
+ def add_view(view, options, &block)
48
+ View.add(view, options, &block)
49
+ end
50
+
51
+ # Adds views. See Hirb::DynamicView.add for details.
52
+ def add_dynamic_view(view, options, &block)
53
+ DynamicView.add(view, options, &block)
54
+ end
55
+
56
+ # Array of config files which are merged sequentially to produce config.
57
+ # Defaults to config/hirb.yml and ~/.hirb_yml
58
+ def config_files
59
+ @config_files ||= default_config_files
60
+ end
61
+
62
+ #:stopdoc:
63
+ def default_config_files
64
+ [File.join(Util.find_home, ".hirb.yml")] +
65
+ (File.exists?('config/hirb.yml') ? ['config/hirb.yml'] : [])
66
+ end
67
+
68
+ def read_config_file(file=config_file)
69
+ File.exists?(file) ? YAML::load_file(file) : {}
70
+ end
71
+
72
+ def config(reload=false)
73
+ if (@config.nil? || reload)
74
+ @config = config_files.inject({}) {|acc,e|
75
+ Util.recursive_hash_merge(acc,read_config_file(e))
76
+ }
77
+ end
78
+ @config
79
+ end
80
+ #:startdoc:
81
+ end
82
+ end
data/lib/ripl/hirb.rb ADDED
@@ -0,0 +1,15 @@
1
+ require 'hirb'
2
+
3
+ module Ripl::Hirb
4
+ def before_loop
5
+ super
6
+ Hirb.enable(Ripl.config[:hirb] || {})
7
+ end
8
+
9
+ def format_result(result)
10
+ return super if !Hirb::View.enabled?
11
+ Hirb::View.view_or_page_output(result) || super
12
+ end
13
+ end
14
+
15
+ Ripl::Shell.include Ripl::Hirb
@@ -0,0 +1,30 @@
1
+ require File.join(File.dirname(__FILE__), 'test_helper')
2
+
3
+ describe "auto table" do
4
+ it "converts nonarrays to arrays and renders" do
5
+ require 'set'
6
+ expected_table = <<-TABLE.unindent
7
+ +-------+
8
+ | value |
9
+ +-------+
10
+ | 1 |
11
+ | 2 |
12
+ | 3 |
13
+ +-------+
14
+ 3 rows in set
15
+ TABLE
16
+ Helpers::AutoTable.render(::Set.new([1,2,3])).should == expected_table
17
+ end
18
+
19
+ it "renders hash" do
20
+ expected_table = <<-TABLE.unindent
21
+ +---+-------+
22
+ | 0 | 1 |
23
+ +---+-------+
24
+ | a | 12345 |
25
+ +---+-------+
26
+ 1 row in set
27
+ TABLE
28
+ Helpers::AutoTable.render({:a=>12345}).should == expected_table
29
+ end
30
+ end
@@ -0,0 +1,27 @@
1
+ require File.join(File.dirname(__FILE__), 'test_helper')
2
+
3
+ describe "Console" do
4
+ it "#table is called without Hirb enabled" do
5
+ extend Hirb::Console
6
+ reset_config
7
+ expected_table = <<-TABLE.unindent
8
+ +-------+
9
+ | value |
10
+ +-------+
11
+ | 5 |
12
+ | 3 |
13
+ +-------+
14
+ 2 rows in set
15
+ TABLE
16
+ capture_stdout {
17
+ table([5,3], :fields=>[:to_s])
18
+ }.should == expected_table +"\n"
19
+ end
20
+
21
+ it ".render_output sets config if it wasn't before" do
22
+ reset_config
23
+ View.expects(:render_output)
24
+ Console.render_output('blah')
25
+ View.config.is_a?(Hash).should == true
26
+ end
27
+ end
data/test/deps.rip ADDED
@@ -0,0 +1,4 @@
1
+ bacon >=1.1.0
2
+ mocha >=0.9.8
3
+ mocha-on-bacon >=0.1.1
4
+ bacon-bits >=0