Module: Hirb::View

Defined in:
lib/bbcloud/vendor/hirb-0.3.4/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, options={}); 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, options={}); 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, options={}); 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

Class Method Summary collapse

Class Attribute Details

.configObject (readonly)

Returns the value of attribute config.



67
68
69
# File 'lib/bbcloud/vendor/hirb-0.3.4/lib/hirb/view.rb', line 67

def config
  @config
end

.render_methodObject

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.



146
147
148
# File 'lib/bbcloud/vendor/hirb-0.3.4/lib/hirb/view.rb', line 146

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.



171
172
173
174
175
176
177
# File 'lib/bbcloud/vendor/hirb-0.3.4/lib/hirb/view.rb', line 171

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

.alias_output_method(output_method) ⇒ Object



197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
# File 'lib/bbcloud/vendor/hirb-0.3.4/lib/hirb/view.rb', line 197

def alias_output_method(output_method)
  klass, klass_method = output_method.split(".")
  eval %[
    ::#{klass}.class_eval do
      alias_method :non_hirb_view_output, :#{klass_method}
      if '#{klass}' == "IRB::Irb"
        def #{klass_method} #:nodoc:
          Hirb::View.view_output(@context.last_value) || Hirb::View.page_output(@context.last_value.inspect, true) ||
            non_hirb_view_output
        end
      else
        def #{klass_method}(output_string) #:nodoc:
          Hirb::View.view_output(output_string) || Hirb::View.page_output(output_string.inspect, true) ||
            non_hirb_view_output(output_string)
        end
      end
    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.



139
140
141
# File 'lib/bbcloud/vendor/hirb-0.3.4/lib/hirb/view.rb', line 139

def capture_and_render(&block)
  render_method.call Util.capture_stdout(&block)
end

.config_loaded?Boolean

Returns:

  • (Boolean)


268
# File 'lib/bbcloud/vendor/hirb-0.3.4/lib/hirb/view.rb', line 268

def config_loaded?; !!@config; end

.default_configObject



278
279
280
# File 'lib/bbcloud/vendor/hirb-0.3.4/lib/hirb/view.rb', line 278

def default_config
  Util.recursive_hash_merge({:pager=>true, :formatter=>true}, Hirb.config || {})
end

.default_render_methodObject



274
275
276
# File 'lib/bbcloud/vendor/hirb-0.3.4/lib/hirb/view.rb', line 274

def default_render_method
  lambda {|output| page_output(output) || puts(output) }
end

.determine_terminal_size(width, height) ⇒ Object



226
227
228
229
# File 'lib/bbcloud/vendor/hirb-0.3.4/lib/hirb/view.rb', line 226

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

.disableObject

Disable’s Hirb’s output and revert’s irb’s output method if irb exists.



98
99
100
101
102
# File 'lib/bbcloud/vendor/hirb-0.3.4/lib/hirb/view.rb', line 98

def disable
  @enabled = false
  unalias_output_method(@output_method) if @output_method
  false
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

  • output_method: Specify an object’s class and instance method (separated by a period) to be realiased with hirb’s view system. The instance method should take a string to be output. Default is IRB::Irb.output_value if using irb.

Examples:

Hirb.enable
Hirb.enable :formatter=>false, :output_method=>"Mini.output"


81
82
83
84
85
86
87
88
89
90
# File 'lib/bbcloud/vendor/hirb-0.3.4/lib/hirb/view.rb', line 81

def enable(options={}, &block)
  Array(options.delete(:config_file)).each {|e|
    @new_config_file = true
    Hirb.config_files << e
  }
  enable_output_method(options.delete(:output_method))
  merge_or_load_config options
  resize(config[:width], config[:height])
  @enabled = true
end

.enable_output_method(meth) ⇒ Object

:stopdoc:



180
181
182
183
184
185
# File 'lib/bbcloud/vendor/hirb-0.3.4/lib/hirb/view.rb', line 180

def enable_output_method(meth)
  if (meth ||= Object.const_defined?(:IRB) ? "IRB::Irb.output_value" : false) && !@output_method
    @output_method = meth
    alias_output_method(@output_method)
  end
end

.enabled?Boolean

Indicates if Hirb::View is enabled.

Returns:

  • (Boolean)


93
94
95
# File 'lib/bbcloud/vendor/hirb-0.3.4/lib/hirb/view.rb', line 93

def enabled?
  @enabled || false
end

.formatter(reload = false) ⇒ Object



246
247
248
# File 'lib/bbcloud/vendor/hirb-0.3.4/lib/hirb/view.rb', line 246

def formatter(reload=false)
  @formatter = reload || @formatter.nil? ? Formatter.new(config[:output]) : @formatter
end

.formatter=(value) ⇒ Object



250
# File 'lib/bbcloud/vendor/hirb-0.3.4/lib/hirb/view.rb', line 250

def formatter=(value); @formatter = value; end

.formatter_configObject

Current formatter config, storing a hash of all static views



166
167
168
# File 'lib/bbcloud/vendor/hirb-0.3.4/lib/hirb/view.rb', line 166

def formatter_config
  formatter.config
end

.heightObject

Current console height



161
162
163
# File 'lib/bbcloud/vendor/hirb-0.3.4/lib/hirb/view.rb', line 161

def height
  config && config[:height] ? config[:height] : DEFAULT_HEIGHT
end

.load_config(additional_config = {}) ⇒ Object



262
263
264
265
266
# File 'lib/bbcloud/vendor/hirb-0.3.4/lib/hirb/view.rb', line 262

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



252
253
254
255
256
257
258
259
260
# File 'lib/bbcloud/vendor/hirb-0.3.4/lib/hirb/view.rb', line 252

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



231
232
233
234
235
236
237
238
# File 'lib/bbcloud/vendor/hirb-0.3.4/lib/hirb/view.rb', line 231

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

.pagerObject



240
241
242
# File 'lib/bbcloud/vendor/hirb-0.3.4/lib/hirb/view.rb', line 240

def pager
  @pager ||= Pager.new(config[:width], config[:height], :pager_command=>config[:pager_command])
end

.pager=(value) ⇒ Object



244
# File 'lib/bbcloud/vendor/hirb-0.3.4/lib/hirb/view.rb', line 244

def pager=(value); @pager = value; end

.render_output(output, options = {}) ⇒ Object



217
218
219
220
221
222
223
224
# File 'lib/bbcloud/vendor/hirb-0.3.4/lib/hirb/view.rb', line 217

def render_output(output, options={})
  if (formatted_output = formatter.format_output(output, options))
    render_method.call(formatted_output)
    true
  else
    false
  end
end

.reset_render_methodObject

Resets render_method back to its default.



151
152
153
# File 'lib/bbcloud/vendor/hirb-0.3.4/lib/hirb/view.rb', line 151

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 “an” * height to find height.



117
118
119
120
# File 'lib/bbcloud/vendor/hirb-0.3.4/lib/hirb/view.rb', line 117

def resize(width=nil, height=nil)
  config[:width], config[:height] = determine_terminal_size(width, height)
  pager.resize(config[:width], config[:height])
end

.toggle_formatterObject

Toggles formatter on or off.



110
111
112
# File 'lib/bbcloud/vendor/hirb-0.3.4/lib/hirb/view.rb', line 110

def toggle_formatter
  config[:formatter] = !config[:formatter]
end

.toggle_pagerObject

Toggles pager on or off. The pager only works while Hirb::View is enabled.



105
106
107
# File 'lib/bbcloud/vendor/hirb-0.3.4/lib/hirb/view.rb', line 105

def toggle_pager
  config[:pager] = !config[:pager]
end

.unalias_output_method(output_method) ⇒ Object



187
188
189
190
191
192
193
194
195
# File 'lib/bbcloud/vendor/hirb-0.3.4/lib/hirb/view.rb', line 187

def unalias_output_method(output_method)
  klass, klass_method = output_method.split(".")
  eval %[
    ::#{klass}.class_eval do
      alias_method :#{klass_method}, :non_hirb_view_output
    end
  ]
  @output_method = nil
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.



125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/bbcloud/vendor/hirb-0.3.4/lib/hirb/view.rb', line 125

def view_output(output, options={})
  enabled? && config[:formatter] && render_output(output, options)
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

.widthObject

Current console width



156
157
158
# File 'lib/bbcloud/vendor/hirb-0.3.4/lib/hirb/view.rb', line 156

def width
  config && config[:width] ? config[:width] : DEFAULT_WIDTH
end