Class: RSpecSystem::Helper Abstract

Inherits:
Object
  • Object
show all
Includes:
InternalHelpers
Defined in:
lib/rspec-system/helper.rb

Overview

This class is abstract.

Subclass and override methods to create a helper object

This class represents an abstract ‘helper’ object.

It provides some DSL and convenience helpers to create rspec-system compatible helper objects so others can create their own helper methods with the same syntactical sugar.

Start by sub-classing this feature and providing your own #execute method, name & properties declaration. See other sub-classes for examples on proper usage.

Class Attribute Summary collapse

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from InternalHelpers

#custom_prefabs_path, #nodeset, #rspec_destroy, #rspec_system_config, #rspec_system_node_set, #rspec_system_tmp, #rspec_virtual_env, #start_nodes, #stop_nodes

Constructor Details

#initialize(opts, clr, &block) ⇒ Helper

This method is abstract.

Override, but make sure you call super(opts, clr, &block)

Setup the helper object.

Here we establish laziness detection, provide the default :node setting and handle been called as a block automatically for the consumer. This is the main setup for the magic that is behind these helper objects.

This initialize method is usually not overridden for simple cases, but can be overridden for the purposes of munging options and providing defaults.



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/rspec-system/helper.rb', line 58

def initialize(opts, clr, &block)
  dn = default_node

  # This is a test for the context of how this command was called
  #
  # If clr is Class or Object then it could be called as a subject, and it
  # should lazy execute its action.
  lazy = nil
  if [Class, Object].include?(clr.class) # presumes being used as a subject
    lazy = true
  elsif clr.is_a? RSpec::Core::ExampleGroup # anything inside an 'it'
    lazy = false
  else
    # We presume everything else wants results immediately
    lazy = false
  end

  # Merge defaults and such
  @opts = {
    :node => opts[:n] || dn,
    :n => opts[:node] || dn,
    :timeout => opts[:timeout] || 0,
    :lazy => lazy,
  }.merge(opts)

  # Try to figure out :node using the node helper if a string is passed
  if @opts[:node].is_a? String
    @opts[:n] = @opts[:node] = get_node_by_name(@opts[:node])
  end

  # Try to lookup result_data now, unless we are lazy
  result_data unless @opts[:lazy]

  # If called as a block, yield the result as a block
  if block_given?
    yield(self)
  end
end

Class Attribute Details

.name_valueObject

Returns the value of attribute name_value.



29
30
31
# File 'lib/rspec-system/helper.rb', line 29

def name_value
  @name_value
end

Instance Attribute Details

#optsObject (readonly)

Options when called



26
27
28
# File 'lib/rspec-system/helper.rb', line 26

def opts
  @opts
end

#rdObject (readonly)

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Cache of previous result data



23
24
25
# File 'lib/rspec-system/helper.rb', line 23

def rd
  @rd
end

Class Method Details

.name(name) ⇒ Object

DSL method for setting the helper name



34
35
36
# File 'lib/rspec-system/helper.rb', line 34

def name(name)
  @name_value = name
end

.properties(*props) ⇒ Object

Accepts a list of properties to automatically create



41
42
43
44
45
# File 'lib/rspec-system/helper.rb', line 41

def properties(*props)
  props.each do |prop|
    define_method(prop) { result_data.send(prop) }
  end
end

Instance Method Details

#[](key) ⇒ Object

This allows the data to be treated as a hash



145
146
147
# File 'lib/rspec-system/helper.rb', line 145

def [](key)
  result_data[key]
end

#default_nodeObject

Return default node



171
172
173
# File 'lib/rspec-system/helper.rb', line 171

def default_node
  rspec_system_node_set.default_node
end

#executeHash <Symbol, Any>

This method is abstract.

Always override this method with your own execution routine.

This method is executed to retrieve the data for this helper. It is always overridden by sub-classes.

Here we perform the actual step to retrieve the helper data, returning the result as a basic hash which gets stored for later retrieval via the helper object.



106
107
108
# File 'lib/rspec-system/helper.rb', line 106

def execute
  raise "The #execute method has not be overridden in this class"
end

#get_node_by_name(name) ⇒ RSpecSystem::Node

Returns a node by its name.

To be used by helpers that wish to retrieve a node by its name.



181
182
183
# File 'lib/rspec-system/helper.rb', line 181

def get_node_by_name(name)
  rspec_system_node_set.nodes[name]
end

#nameString

Return the helper name of this helper object



159
160
161
# File 'lib/rspec-system/helper.rb', line 159

def name
  self.class.name_value
end

#refreshvoid Also known as: run

This method returns an undefined value.

Refresh the data, re-running the action associated with this helper.



133
134
135
136
137
# File 'lib/rspec-system/helper.rb', line 133

def refresh
  @rd = nil
  result_data
  nil
end

#result_dataRSpecSystem::Result

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Internal method to return any result data from resource execution time

If there are no previous results, it will execute the resource action and return those result. The action only runs once, so subsequent requests return the last result.



118
119
120
121
122
123
124
125
126
127
128
# File 'lib/rspec-system/helper.rb', line 118

def result_data
  return rd unless rd.nil?

  begin
    Timeout::timeout(opts[:timeout]) do
      @rd = RSpecSystem::Result.new(execute)
    end
  rescue Timeout::Error => e
    raise RSpecSystem::Exception::TimeoutError, e.message
  end
end

#to_hashHash

Retrieve the data from this helper object as a hash



152
153
154
# File 'lib/rspec-system/helper.rb', line 152

def to_hash
  result_data.to_hash
end

#to_sString

String representation of helper



166
167
168
# File 'lib/rspec-system/helper.rb', line 166

def to_s
  name + "(" + opts.inspect + ")"
end