Class: InspecRspecCli::Control

Inherits:
Object
  • Object
show all
Includes:
Comparable
Defined in:
lib/inspec/rspec_json_formatter.rb

Overview

This class wraps a control hash object to provide a useful inteface for maintaining the associated profile, ids, results, title, etc.

Constant Summary collapse

STATUS_TYPES =
{
  'unknown'  => -3,
  'passed'   => -2,
  'skipped'  => -1,
  'minor'    => 1,
  'major'    => 2,
  'failed'   => 2.5,
  'critical' => 3,
}.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(control, profile) ⇒ Control

Returns a new instance of Control.



601
602
603
604
605
# File 'lib/inspec/rspec_json_formatter.rb', line 601

def initialize(control, profile)
  @control = control
  @profile = profile
  summary_calculation_is_needed
end

Instance Attribute Details

#controlObject (readonly) Also known as: as_hash

Returns the value of attribute control.



607
608
609
# File 'lib/inspec/rspec_json_formatter.rb', line 607

def control
  @control
end

#profileObject (readonly)

Returns the value of attribute profile.



607
608
609
# File 'lib/inspec/rspec_json_formatter.rb', line 607

def profile
  @profile
end

Instance Method Details

#<=>(other) ⇒ Object

We are interested in comparing controls against other controls. It is important to compare their id values and the id values of their profiles. In the event that a control has the same id in a different profile we do not want them to be considered the same.

Controls are never ordered so we don’t care about the remaining implementation of the spaceship operator.



695
696
697
698
699
700
701
# File 'lib/inspec/rspec_json_formatter.rb', line 695

def <=>(other)
  if id == other.id && profile_id == other.profile_id
    0
  else
    -1
  end
end

#add_example(example) ⇒ Object



632
633
634
635
636
637
638
639
640
641
642
643
# File 'lib/inspec/rspec_json_formatter.rb', line 632

def add_example(example)
  control[:id] = example[:id]
  control[:profile_id] = example[:profile_id]

  example[:status_type] = status_type(example)
  example.delete(:id)
  example.delete(:profile_id)

  control[:results] ||= []
  control[:results].push(example)
  summary_calculation_is_needed
end

#anonymous?Boolean

Returns:

  • (Boolean)


615
616
617
# File 'lib/inspec/rspec_json_formatter.rb', line 615

def anonymous?
  control[:id].to_s.start_with? '(generated from '
end

#examplesObject



623
624
625
# File 'lib/inspec/rspec_json_formatter.rb', line 623

def examples
  control[:results]
end

#idObject



611
612
613
# File 'lib/inspec/rspec_json_formatter.rb', line 611

def id
  control[:id]
end

#profile_idObject



619
620
621
# File 'lib/inspec/rspec_json_formatter.rb', line 619

def profile_id
  control[:profile_id]
end

#summaryObject

Return summary of the control which is usually a title with fails and skips



670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
# File 'lib/inspec/rspec_json_formatter.rb', line 670

def summary
  calculate_summary! if summary_calculation_needed?
  suffix =
    if examples.length == 1
      # Single test - be nice and just print the exception message if the test
      # failed. No need to say "1 failed".
      examples[0][:message].to_s
    else
      [
        !fails.empty? ? "#{fails.uniq.length} failed" : nil,
        !skips.empty? ? "#{skips.uniq.length} skipped" : nil,
      ].compact.join(' ')
    end

  suffix == '' ? title : title + ' (' + suffix + ')'
end

#summary_indicatorObject



627
628
629
630
# File 'lib/inspec/rspec_json_formatter.rb', line 627

def summary_indicator
  calculate_summary! if summary_calculation_needed?
  STATUS_TYPES.key(@summary_status)
end

#titleObject

Determine title for control given current_control. Called from current_control_summary.



647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
# File 'lib/inspec/rspec_json_formatter.rb', line 647

def title
  title = control[:title]
  if title
    title
  elsif examples.length == 1
    # If it's an anonymous control, just go with the only description
    # available for the underlying test.
    examples[0][:code_desc].to_s
  elsif examples.empty?
    # Empty control block - if it's anonymous, there's nothing we can do.
    # Is this case even possible?
    'Empty anonymous control'
  else
    # Multiple tests - but no title. Do our best and generate some form of
    # identifier or label or name.
    title = (examples.map { |example| example[:code_desc] }).join('; ')
    max_len = MULTI_TEST_CONTROL_SUMMARY_MAX_LEN
    title = title[0..(max_len-1)] + '...' if title.length > max_len
    title
  end
end