Class: Ast::Crispr::OperationProfile

Inherits:
Object
  • Object
show all
Includes:
ProfileReportCompatibility
Defined in:
lib/ast/crispr.rb,
lib/ast/crispr.rb

Constant Summary collapse

KNOWN_OPERATION_KINDS =
{
  replace: {
    family: :rewrite,
    description: 'Replace selected content with explicit replacement text'
  },
  merge_replace: {
    family: :rewrite,
    description: 'Replace selected content with the result of a merge-gem slice merge'
  },
  delete: {
    family: :removal,
    description: 'Delete selected content without inserting replacement text'
  },
  delete_batch: {
    family: :removal,
    description: 'Delete content selected by multiple structural selectors in one source pass'
  },
  insert: {
    family: :insertion,
    description: 'Insert explicit text at a destination anchor or append fallback'
  },
  move: {
    family: :relocation,
    description: 'Relocate selected content or explicit replacement text to a destination anchor'
  }
}.freeze
KNOWN_REQUIREMENTS =
%i[none optional required].freeze
KNOWN_REPLACEMENT_SOURCES =
%i[none explicit_text captured_text_or_explicit merge_template_text].freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(operation_kind:, source_requirement:, destination_requirement:, replacement_source:, captures_source_text: false, supports_if_missing: false, metadata: {}, **options) ⇒ OperationProfile

Returns a new instance of OperationProfile.



600
601
602
603
604
605
606
607
608
609
# File 'lib/ast/crispr.rb', line 600

def initialize(operation_kind:, source_requirement:, destination_requirement:, replacement_source:,
               captures_source_text: false, supports_if_missing: false, metadata: {}, **options)
  @operation_kind = operation_kind&.to_sym
  @source_requirement = normalize_requirement(source_requirement, :source_requirement)
  @destination_requirement = normalize_requirement(destination_requirement, :destination_requirement)
  @replacement_source = normalize_replacement_source(replacement_source)
  @captures_source_text = captures_source_text ? true : false
  @supports_if_missing = supports_if_missing ? true : false
  @metadata = .merge(options).freeze
end

Instance Attribute Details

#destination_requirementObject (readonly)

Returns the value of attribute destination_requirement.



598
599
600
# File 'lib/ast/crispr.rb', line 598

def destination_requirement
  @destination_requirement
end

#metadataObject (readonly)

Returns the value of attribute metadata.



598
599
600
# File 'lib/ast/crispr.rb', line 598

def 
  @metadata
end

#operation_kindObject (readonly)

Returns the value of attribute operation_kind.



598
599
600
# File 'lib/ast/crispr.rb', line 598

def operation_kind
  @operation_kind
end

#replacement_sourceObject (readonly)

Returns the value of attribute replacement_source.



598
599
600
# File 'lib/ast/crispr.rb', line 598

def replacement_source
  @replacement_source
end

#source_requirementObject (readonly)

Returns the value of attribute source_requirement.



598
599
600
# File 'lib/ast/crispr.rb', line 598

def source_requirement
  @source_requirement
end

Instance Method Details

#captures_source_text?Boolean

Returns:

  • (Boolean)


639
640
641
# File 'lib/ast/crispr.rb', line 639

def captures_source_text?
  @captures_source_text
end

#explicit_replacement?Boolean

Returns:

  • (Boolean)


647
648
649
# File 'lib/ast/crispr.rb', line 647

def explicit_replacement?
  replacement_source == :explicit_text
end

#known_operation_kind?Boolean

Returns:

  • (Boolean)


619
620
621
# File 'lib/ast/crispr.rb', line 619

def known_operation_kind?
  KNOWN_OPERATION_KINDS.key?(operation_kind)
end

#may_reuse_captured_text?Boolean

Returns:

  • (Boolean)


651
652
653
# File 'lib/ast/crispr.rb', line 651

def may_reuse_captured_text?
  replacement_source == :captured_text_or_explicit
end

#operation_familyObject



615
616
617
# File 'lib/ast/crispr.rb', line 615

def operation_family
  &.fetch(:family, nil)
end

#operation_kind_metadataObject



611
612
613
# File 'lib/ast/crispr.rb', line 611

def 
  KNOWN_OPERATION_KINDS[operation_kind]&.dup&.freeze
end

#reportObject



1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
# File 'lib/ast/crispr.rb', line 1660

def report
  data = to_h.merge(
    operation_family: operation_family || :unknown,
    known_source_requirement: KNOWN_REQUIREMENTS.include?(source_requirement),
    known_destination_requirement: KNOWN_REQUIREMENTS.include?(destination_requirement),
    known_replacement_source: KNOWN_REPLACEMENT_SOURCES.include?(replacement_source),
    selects_source: selects_source?,
    requires_source: requires_source?,
    supports_destination: supports_destination?,
    requires_destination: requires_destination?,
    explicit_replacement: explicit_replacement?,
    may_reuse_captured_text: may_reuse_captured_text?
  )
  stringified_report(data)
end

#requires_destination?Boolean

Returns:

  • (Boolean)


635
636
637
# File 'lib/ast/crispr.rb', line 635

def requires_destination?
  destination_requirement == :required
end

#requires_source?Boolean

Returns:

  • (Boolean)


627
628
629
# File 'lib/ast/crispr.rb', line 627

def requires_source?
  source_requirement == :required
end

#selects_source?Boolean

Returns:

  • (Boolean)


623
624
625
# File 'lib/ast/crispr.rb', line 623

def selects_source?
  source_requirement != :none
end

#supports_destination?Boolean

Returns:

  • (Boolean)


631
632
633
# File 'lib/ast/crispr.rb', line 631

def supports_destination?
  destination_requirement != :none
end

#supports_if_missing?Boolean

Returns:

  • (Boolean)


643
644
645
# File 'lib/ast/crispr.rb', line 643

def supports_if_missing?
  @supports_if_missing
end

#to_hObject



655
656
657
658
659
660
661
662
663
664
665
666
667
# File 'lib/ast/crispr.rb', line 655

def to_h
  {
    operation_kind: operation_kind,
    operation_family: operation_family,
    known_operation_kind: known_operation_kind?,
    source_requirement: source_requirement,
    destination_requirement: destination_requirement,
    replacement_source: replacement_source,
    captures_source_text: captures_source_text?,
    supports_if_missing: supports_if_missing?,
    metadata: 
  }
end