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, 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/hirb/view.rb', line 67

def config
  @config
end

.render_methodObject

Returns the value of attribute render_method.



66
67
68
# File 'lib/hirb/view.rb', line 66

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.



169
170
171
172
173
174
175
# File 'lib/hirb/view.rb', line 169

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

Returns:

  • (Boolean)


255
# File 'lib/hirb/view.rb', line 255

def config_loaded?; !!@config; end

.default_configObject



266
267
268
# File 'lib/hirb/view.rb', line 266

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

.default_render_methodObject



262
263
264
# File 'lib/hirb/view.rb', line 262

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

.determine_terminal_size(width, height) ⇒ Object



213
214
215
216
# File 'lib/hirb/view.rb', line 213

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.



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_methodObject



193
194
195
196
197
198
# File 'lib/hirb/view.rb', line 193

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 = {}) ⇒ 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(options={})
  Array(options.delete(:config_file)).each {|e|
    @new_config_file = true
    Hirb.config_files << e
  }
  enable_output_method unless @output_method
  merge_or_load_config options
  resize(config[:width], config[:height])
  @enabled = true
end

.enable_output_methodObject

:stopdoc:



178
179
180
181
182
183
184
185
186
187
188
189
190
191
# File 'lib/hirb/view.rb', line 178

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.

Returns:

  • (Boolean)


90
91
92
# File 'lib/hirb/view.rb', line 90

def enabled?
  @enabled || false
end

.formatter(reload = false) ⇒ Object



233
234
235
# File 'lib/hirb/view.rb', line 233

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

.formatter=(value) ⇒ Object



237
# File 'lib/hirb/view.rb', line 237

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

.formatter_configObject

Current formatter config, storing a hash of all static views



164
165
166
# File 'lib/hirb/view.rb', line 164

def formatter_config
  formatter.config
end

.heightObject

Current console height



159
160
161
# File 'lib/hirb/view.rb', line 159

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

.load_config(additional_config = {}) ⇒ Object



249
250
251
252
253
# File 'lib/hirb/view.rb', line 249

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



239
240
241
242
243
244
245
246
247
# File 'lib/hirb/view.rb', line 239

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



218
219
220
221
222
223
224
225
# File 'lib/hirb/view.rb', line 218

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



227
228
229
# File 'lib/hirb/view.rb', line 227

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

.pager=(value) ⇒ Object



231
# File 'lib/hirb/view.rb', line 231

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

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



204
205
206
207
208
209
210
211
# File 'lib/hirb/view.rb', line 204

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.



149
150
151
# File 'lib/hirb/view.rb', line 149

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.



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_formatterObject

Toggles formatter on or off.



107
108
109
# File 'lib/hirb/view.rb', line 107

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

.toggle_pagerObject

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



200
201
202
# File 'lib/hirb/view.rb', line 200

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, 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



154
155
156
# File 'lib/hirb/view.rb', line 154

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