Class: Legion::Extensions::MindGrowth::Helpers::ConceptProposal

Inherits:
Object
  • Object
show all
Defined in:
lib/legion/extensions/mind_growth/helpers/concept_proposal.rb

Constant Summary collapse

FIELDS =
%i[
  id name module_name category description metaphor helpers runner_methods
  rationale scores status origin created_at evaluated_at built_at
].freeze

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name:, module_name:, category:, description:, metaphor: nil, helpers: [], runner_methods: [], rationale: nil, origin: :proposer) ⇒ ConceptProposal

rubocop:disable Metrics/ParameterLists



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/legion/extensions/mind_growth/helpers/concept_proposal.rb', line 17

def initialize(name:, module_name:, category:, description:, metaphor: nil, helpers: [], # rubocop:disable Metrics/ParameterLists
               runner_methods: [], rationale: nil, origin: :proposer)
  @id             = SecureRandom.uuid
  @name           = name
  @module_name    = module_name
  @category       = category.to_sym
  @description    = description
  @metaphor       = metaphor
  @helpers        = helpers         # array of { name:, methods: [] }
  @runner_methods = runner_methods  # array of { name:, params: [], returns: '' }
  @rationale      = rationale
  @scores         = {}              # { novelty: 0.0..1.0, fit: 0.0..1.0, ... }
  @status         = :proposed
  @origin         = origin
  @created_at     = Time.now.utc
  @evaluated_at   = nil
  @built_at       = nil
end

Class Method Details

.from_h(hash) ⇒ Object



64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/legion/extensions/mind_growth/helpers/concept_proposal.rb', line 64

def self.from_h(hash)
  h = hash.transform_keys(&:to_sym)
  proposal = allocate
  proposal.instance_variable_set(:@id,             h[:id])
  proposal.instance_variable_set(:@name,           h[:name])
  proposal.instance_variable_set(:@module_name,    h[:module_name])
  proposal.instance_variable_set(:@category,       h[:category]&.to_sym)
  proposal.instance_variable_set(:@description,    h[:description])
  proposal.instance_variable_set(:@metaphor,       h[:metaphor])
  proposal.instance_variable_set(:@helpers,        h[:helpers] || [])
  proposal.instance_variable_set(:@runner_methods, h[:runner_methods] || [])
  proposal.instance_variable_set(:@rationale,      h[:rationale])
  proposal.instance_variable_set(:@scores,         (h[:scores] || {}).transform_keys(&:to_sym))
  proposal.instance_variable_set(:@status,         h[:status]&.to_sym || :proposed)
  proposal.instance_variable_set(:@origin,         h[:origin]&.to_sym || :proposer)
  proposal.instance_variable_set(:@created_at,     h[:created_at] ? Time.parse(h[:created_at].to_s) : Time.now.utc)
  proposal.instance_variable_set(:@evaluated_at,   h[:evaluated_at] ? Time.parse(h[:evaluated_at].to_s) : nil)
  proposal.instance_variable_set(:@built_at,       h[:built_at] ? Time.parse(h[:built_at].to_s) : nil)
  proposal
end

Instance Method Details

#auto_approvable?Boolean

Returns:

  • (Boolean)


48
49
50
51
52
# File 'lib/legion/extensions/mind_growth/helpers/concept_proposal.rb', line 48

def auto_approvable?
  return false if @scores.empty?

  Helpers::Constants::EVALUATION_DIMENSIONS.all? { |dim| (@scores[dim] || 0) >= Helpers::Constants::AUTO_APPROVE_THRESHOLD }
end

#evaluate!(scores) ⇒ Object



36
37
38
39
40
# File 'lib/legion/extensions/mind_growth/helpers/concept_proposal.rb', line 36

def evaluate!(scores)
  @scores       = scores
  @evaluated_at = Time.now.utc
  @status       = passing_evaluation? ? :approved : :rejected
end

#passing_evaluation?Boolean

Returns:

  • (Boolean)


42
43
44
45
46
# File 'lib/legion/extensions/mind_growth/helpers/concept_proposal.rb', line 42

def passing_evaluation?
  return false if @scores.empty?

  Helpers::Constants::EVALUATION_DIMENSIONS.all? { |dim| (@scores[dim] || 0) >= Helpers::Constants::MIN_DIMENSION_SCORE }
end

#to_hObject



85
86
87
# File 'lib/legion/extensions/mind_growth/helpers/concept_proposal.rb', line 85

def to_h
  FIELDS.to_h { |f| [f, send(f)] }
end

#transition!(new_status) ⇒ Object



54
55
56
57
58
59
60
61
62
# File 'lib/legion/extensions/mind_growth/helpers/concept_proposal.rb', line 54

def transition!(new_status)
  new_status = new_status.to_sym
  unless Helpers::Constants::PROPOSAL_STATUSES.include?(new_status)
    raise ArgumentError, "invalid status: #{new_status} (valid: #{Helpers::Constants::PROPOSAL_STATUSES.join(', ')})"
  end

  @status   = new_status
  @built_at = Time.now.utc if new_status == :passing
end