Module: Hirb::View
- Defined in:
- lib/hirb/view.rb
Overview
This class is responsible for managing all view-related functionality.
Create a View
Let's create a simple view for Hash objects:
$ irb -rubygems
>> require 'hirb'
=>true
>> Hirb.enable
=>nil
>> require 'yaml'
=>true
# A view method is the smallest view
>> def yaml(output); output.to_yaml; end
=> nil
# Add the view
>> Hirb.add_view Hash, :method=>:yaml
=> true
# Hashes now appear as yaml
>> {:a=>1, :b=>{:c=>3}}
---
:a : 1
:b :
:c : 3
=> true
Another way of creating a view is a Helper class:
# Create yaml view class
>> class Hirb::Helpers::Yaml; def self.render(output, ={}); output.to_yaml; end ;end
=>nil
# Add the view
>> Hirb.add_view Hash, :class=>Hirb::Helpers::Yaml
=>true
# Hashes appear as yaml like above ...
Configure a View
To configure the above Helper class as a view, either pass Hirb.enable a hash:
# In .irbrc
require 'hirb'
# View class needs to come before enable()
class Hirb::Helpers::Yaml; def self.render(output, ={}); output.to_yaml; end ;end
Hirb.enable :output=>{"Hash"=>{:class=>"Hirb::Helpers::Yaml"}}
Or create a config file at config/hirb.yml or ~/.hirb.yml:
# The config file for the yaml example would look like:
# ---
# :output :
# Hash :
# :class : Hirb::Helpers::Yaml
# In .irbrc
require 'hirb'
# View class needs to come before enable()
class Hirb::Helpers::Yaml; def self.render(output, ={}); output.to_yaml; end ;end
Hirb.enable
For more about configuring Hirb, see the Config Files section in Hirb.
Constant Summary collapse
- DEFAULT_WIDTH =
120- DEFAULT_HEIGHT =
40
Class Attribute Summary collapse
-
.config ⇒ Object
readonly
Returns the value of attribute config.
-
.render_method ⇒ Object
A lambda or proc which handles the final formatted object.
Class Method Summary collapse
-
.add(klass, view_config) ⇒ Object
Adds a view when View is enabled.
-
.capture_and_render(&block) ⇒ Object
Captures STDOUT and renders it using render_method().
- .config_loaded? ⇒ Boolean
- .default_config ⇒ Object
- .default_render_method ⇒ Object
- .determine_terminal_size(width, height) ⇒ Object
-
.disable ⇒ Object
Disable's Hirb's output and revert's irb's output method if irb exists.
- .disable_output_method ⇒ Object
-
.enable(options = {}, &block) ⇒ Object
This activates view functionality i.e.
-
.enable_output_method ⇒ Object
:stopdoc:.
-
.enabled? ⇒ Boolean
Indicates if Hirb::View is enabled.
- .formatter(reload = false) ⇒ Object
- .formatter=(value) ⇒ Object
-
.formatter_config ⇒ Object
Current formatter config, storing a hash of all static views.
-
.height ⇒ Object
Current console height.
- .load_config(additional_config = {}) ⇒ Object
- .merge_or_load_config(additional_config = {}) ⇒ Object
- .page_output(output, inspect_mode = false) ⇒ Object
- .pager ⇒ Object
- .pager=(value) ⇒ Object
- .render_output(output, options = {}) ⇒ Object
-
.reset_render_method ⇒ Object
Resets render_method back to its default.
-
.resize(width = nil, height = nil) ⇒ Object
Resizes the console width and height for use with the table and pager i.e.
-
.toggle_formatter ⇒ Object
Toggles formatter on or off.
-
.toggle_pager ⇒ Object
Toggles pager on or off.
- .view_or_page_output(str) ⇒ Object
-
.view_output(output, options = {}) ⇒ Object
This is the main method of this class.
-
.width ⇒ Object
Current console width.
Class Attribute Details
.config ⇒ Object (readonly)
Returns the value of attribute config.
67 68 69 |
# File 'lib/hirb/view.rb', line 67 def config @config end |
.render_method ⇒ Object
A lambda or proc which handles the final formatted object. Although this pages/puts the object by default, it could be set to do other things i.e. write the formatted object to a file.
143 144 145 |
# File 'lib/hirb/view.rb', line 143 def render_method @render_method end |
Class Method Details
.add(klass, view_config) ⇒ Object
Adds a view when View is enabled. See Formatter.add_view for more details.
168 169 170 171 172 173 174 |
# File 'lib/hirb/view.rb', line 168 def add(klass, view_config) if enabled? formatter.add_view(klass, view_config) else puts "View must be enabled to add a view" end end |
.capture_and_render(&block) ⇒ Object
Captures STDOUT and renders it using render_method(). The main use case is to conditionally page captured stdout.
136 137 138 |
# File 'lib/hirb/view.rb', line 136 def capture_and_render(&block) render_method.call Util.capture_stdout(&block) end |
.config_loaded? ⇒ Boolean
254 |
# File 'lib/hirb/view.rb', line 254 def config_loaded?; !!@config; end |
.default_config ⇒ Object
264 265 266 |
# File 'lib/hirb/view.rb', line 264 def default_config Util.recursive_hash_merge({:pager=>true, :formatter=>true}, Hirb.config || {}) end |
.default_render_method ⇒ Object
260 261 262 |
# File 'lib/hirb/view.rb', line 260 def default_render_method lambda {|output| page_output(output) || puts(output) } end |
.determine_terminal_size(width, height) ⇒ Object
212 213 214 215 |
# File 'lib/hirb/view.rb', line 212 def determine_terminal_size(width, height) detected = (width.nil? || height.nil?) ? Util.detect_terminal_size || [] : [] [width || detected[0] || DEFAULT_WIDTH , height || detected[1] || DEFAULT_HEIGHT] end |
.disable ⇒ Object
Disable's Hirb's output and revert's irb's output method if irb exists.
95 96 97 98 99 |
# File 'lib/hirb/view.rb', line 95 def disable @enabled = false disable_output_method if @output_method false end |
.disable_output_method ⇒ Object
192 193 194 195 196 197 |
# File 'lib/hirb/view.rb', line 192 def disable_output_method if defined?(IRB::Irb) && !defined? Ripl ::IRB::Irb.send :alias_method, :output_value, :non_hirb_view_output end @output_method = nil end |
.enable(options = {}, &block) ⇒ Object
This activates view functionality i.e. the formatter, pager and size detection. If irb exists, it overrides irb's output method with Hirb::View.view_output. When called multiple times, new configs are merged into the existing config. If using Wirble, you should call this after it. The view configuration can be specified in a hash via a config file, or as options to this method. In addition to the config keys mentioned in Hirb, options also take the following keys:
Options:
- config_file: Name of config file(s) that are merged into existing config Examples: Hirb.enable Hirb.enable :formatter=>false
78 79 80 81 82 83 84 85 86 87 |
# File 'lib/hirb/view.rb', line 78 def enable(={}, &block) Array(.delete(:config_file)).each {|e| @new_config_file = true Hirb.config_files << e } enable_output_method unless @output_method merge_or_load_config resize(config[:width], config[:height]) @enabled = true end |
.enable_output_method ⇒ Object
:stopdoc:
177 178 179 180 181 182 183 184 185 186 187 188 189 190 |
# File 'lib/hirb/view.rb', line 177 def enable_output_method if defined?(Ripl) && Ripl.respond_to?(:started?) && Ripl.started? @output_method = true require 'ripl/hirb' unless defined? Ripl::Hirb elsif defined? IRB::Irb @output_method = true ::IRB::Irb.class_eval do alias_method :non_hirb_view_output, :output_value def output_value #:nodoc: Hirb::View.view_or_page_output(@context.last_value) || non_hirb_view_output end end end end |
.enabled? ⇒ Boolean
Indicates if Hirb::View is enabled.
90 91 92 |
# File 'lib/hirb/view.rb', line 90 def enabled? @enabled || false end |
.formatter(reload = false) ⇒ Object
232 233 234 |
# File 'lib/hirb/view.rb', line 232 def formatter(reload=false) @formatter = reload || @formatter.nil? ? Formatter.new(config[:output]) : @formatter end |
.formatter=(value) ⇒ Object
236 |
# File 'lib/hirb/view.rb', line 236 def formatter=(value); @formatter = value; end |
.formatter_config ⇒ Object
Current formatter config, storing a hash of all static views
163 164 165 |
# File 'lib/hirb/view.rb', line 163 def formatter_config formatter.config end |
.height ⇒ Object
Current console height
158 159 160 |
# File 'lib/hirb/view.rb', line 158 def height config && config[:height] ? config[:height] : DEFAULT_HEIGHT end |
.load_config(additional_config = {}) ⇒ Object
248 249 250 251 252 |
# File 'lib/hirb/view.rb', line 248 def load_config(additional_config={}) @config = Util.recursive_hash_merge default_config, additional_config formatter(true) true end |
.merge_or_load_config(additional_config = {}) ⇒ Object
238 239 240 241 242 243 244 245 246 |
# File 'lib/hirb/view.rb', line 238 def merge_or_load_config(additional_config={}) if @config && (@new_config_file || !additional_config.empty?) Hirb.config = nil load_config Util.recursive_hash_merge(@config, additional_config) @new_config_file = false elsif !@enabled load_config(additional_config) end end |
.page_output(output, inspect_mode = false) ⇒ Object
217 218 219 220 221 222 223 224 |
# File 'lib/hirb/view.rb', line 217 def page_output(output, inspect_mode=false) if enabled? && config[:pager] && pager.activated_by?(output, inspect_mode) pager.page(output, inspect_mode) true else false end end |
.pager ⇒ Object
226 227 228 |
# File 'lib/hirb/view.rb', line 226 def pager @pager ||= Pager.new(config[:width], config[:height], :pager_command=>config[:pager_command]) end |
.pager=(value) ⇒ Object
230 |
# File 'lib/hirb/view.rb', line 230 def pager=(value); @pager = value; end |
.render_output(output, options = {}) ⇒ Object
203 204 205 206 207 208 209 210 |
# File 'lib/hirb/view.rb', line 203 def render_output(output, ={}) if (formatted_output = formatter.format_output(output, )) render_method.call(formatted_output) true else false end end |
.reset_render_method ⇒ Object
Resets render_method back to its default.
148 149 150 |
# File 'lib/hirb/view.rb', line 148 def reset_render_method @render_method = default_render_method end |
.resize(width = nil, height = nil) ⇒ Object
Resizes the console width and height for use with the table and pager i.e. after having resized the console window. *nix users should only have to call this method. Non-nix users should call this method with explicit width and height. If you don't know your width and height, in irb play with "a" width to find width and puts "a\n" * height to find height.
114 115 116 117 |
# File 'lib/hirb/view.rb', line 114 def resize(width=nil, height=nil) config[:width], config[:height] = determine_terminal_size(width, height) pager.resize(config[:width], config[:height]) end |
.toggle_formatter ⇒ Object
Toggles formatter on or off.
107 108 109 |
# File 'lib/hirb/view.rb', line 107 def toggle_formatter config[:formatter] = !config[:formatter] end |
.toggle_pager ⇒ Object
Toggles pager on or off. The pager only works while Hirb::View is enabled.
102 103 104 |
# File 'lib/hirb/view.rb', line 102 def toggle_pager config[:pager] = !config[:pager] end |
.view_or_page_output(str) ⇒ Object
199 200 201 |
# File 'lib/hirb/view.rb', line 199 def view_or_page_output(str) view_output(str) || page_output(str.inspect, true) end |
.view_output(output, options = {}) ⇒ Object
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 successful renders it using render_method(). The options this method takes are helper config hashes as described in Hirb::Formatter.format_output(). Returns true if successful and false if no formatting is done or if not enabled.
122 123 124 125 126 127 128 129 130 131 132 133 |
# File 'lib/hirb/view.rb', line 122 def view_output(output, ={}) enabled? && config[:formatter] && render_output(output, ) rescue Exception=>e if config[:ignore_errors] $stderr.puts "Hirb Error: #{e.message}" false else index = (obj = e.backtrace.find {|f| f =~ /^\(eval\)/}) ? e.backtrace.index(obj) : e.backtrace.length $stderr.puts "Hirb Error: #{e.message}", e.backtrace.slice(0,index).map {|e| " " + e } true end end |
.width ⇒ Object
Current console width
153 154 155 |
# File 'lib/hirb/view.rb', line 153 def width config && config[:width] ? config[:width] : DEFAULT_WIDTH end |