Module: Docscribe::Infer::Behavior

Defined in:
lib/docscribe/infer/behavior.rb

Overview

Analyzes method behavior (predicates, side effects, mutating calls).

Constant Summary collapse

MUTATING_METHODS =
%i[<< push pop delete merge update write save create destroy
insert update_all delete_all].freeze

Class Method Summary collapse

Class Method Details

.analyze(body, method_name) ⇒ Hash<Symbol, Object>

Parameters:

  • body (Object)
  • method_name (Object)

Returns:

  • (Hash<Symbol, Object>)


14
15
16
17
18
19
20
21
# File 'lib/docscribe/infer/behavior.rb', line 14

def analyze(body, method_name)
  result = default_result(method_name)

  return result unless body.is_a?(Parser::AST::Node)

  analyze_body(body, result)
  result
end

.default_result(method_name) ⇒ Hash<Symbol, Object>

Parameters:

  • method_name (Object)

Returns:

  • (Hash<Symbol, Object>)


25
26
27
28
29
30
31
32
33
34
# File 'lib/docscribe/infer/behavior.rb', line 25

def default_result(method_name)
  {
    predicate: method_name&.to_s&.end_with?('?') || false,
    bang: method_name&.to_s&.end_with?('!') || false,
    has_side_effects: false,
    delegates: nil,
    returns_self: false,
    returns_boolean: false
  }
end

.infer_description(analysis, _method_name) ⇒ String?

Parameters:

  • analysis (Hash<Symbol, Object>)
  • _method_name (Object)

Returns:

  • (String?)


39
40
41
42
43
44
45
46
47
48
49
# File 'lib/docscribe/infer/behavior.rb', line 39

def infer_description(analysis, _method_name)
  return nil unless analysis[:has_side_effects] || analysis[:predicate]

  if analysis[:predicate]
    'Returns true if the condition is met, false otherwise'
  elsif analysis[:returns_self]
    'Returns self to allow method chaining'
  elsif analysis[:has_side_effects]
    nil
  end
end