Module: Legion::Registry

Defined in:
lib/legion/registry.rb,
lib/legion/registry/governance.rb,
lib/legion/registry/persistence.rb,
lib/legion/registry/security_scanner.rb

Defined Under Namespace

Modules: Governance, Persistence Classes: Entry, SecurityScanner

Constant Summary collapse

VALID_STATUSES =
%i[pending_review approved rejected deprecated sunset active].freeze

Class Method Summary collapse

Class Method Details

.allObject



62
63
64
# File 'lib/legion/registry.rb', line 62

def all
  store.values
end

.approve(name, notes: nil) ⇒ Object



94
95
96
97
98
99
100
101
102
# File 'lib/legion/registry.rb', line 94

def approve(name, notes: nil)
  entry = find_or_raise(name)
  update_entry(name, entry,
               status:       :approved,
               airb_status:  'approved',
               review_notes: notes,
               approved_at:  Time.now.utc)
  true
end

.approvedObject



74
75
76
# File 'lib/legion/registry.rb', line 74

def approved
  store.values.select(&:approved?)
end

.by_risk_tier(tier) ⇒ Object



78
79
80
# File 'lib/legion/registry.rb', line 78

def by_risk_tier(tier)
  store.values.select { |e| e.risk_tier == tier.to_s }
end

.clear!Object



82
83
84
# File 'lib/legion/registry.rb', line 82

def clear!
  @store = {}
end

.deprecate(name, successor: nil, sunset_date: nil) ⇒ Object



113
114
115
116
117
118
119
120
121
# File 'lib/legion/registry.rb', line 113

def deprecate(name, successor: nil, sunset_date: nil)
  entry = find_or_raise(name)
  update_entry(name, entry,
               status:        :deprecated,
               successor:     successor,
               sunset_date:   sunset_date,
               deprecated_at: Time.now.utc)
  true
end

.lookup(name) ⇒ Object



58
59
60
# File 'lib/legion/registry.rb', line 58

def lookup(name)
  store[name.to_s]
end

.pending_reviewsObject



123
124
125
# File 'lib/legion/registry.rb', line 123

def pending_reviews
  store.values.select(&:pending_review?)
end

.register(entry) ⇒ Object

Raises:

  • (ArgumentError)


42
43
44
45
46
47
48
49
50
51
52
# File 'lib/legion/registry.rb', line 42

def register(entry)
  raise ArgumentError, "Extension name '#{entry.name}' violates naming convention" if defined?(Governance) && !Governance.check_name(entry.name)

  store[entry.name] = entry

  if defined?(Governance) && Governance.auto_approve?(entry.risk_tier)
    update_entry(entry.name, entry, status: :approved, airb_status: 'approved', approved_at: Time.now.utc)
  end

  Persistence.persist(store[entry.name]) if defined?(Persistence)
end

.reject(name, reason: nil) ⇒ Object



104
105
106
107
108
109
110
111
# File 'lib/legion/registry.rb', line 104

def reject(name, reason: nil)
  entry = find_or_raise(name)
  update_entry(name, entry,
               status:        :rejected,
               reject_reason: reason,
               rejected_at:   Time.now.utc)
  true
end

.search(query) ⇒ Object



66
67
68
69
70
71
72
# File 'lib/legion/registry.rb', line 66

def search(query)
  pattern = query.to_s.downcase
  store.values.select do |e|
    e.name.downcase.include?(pattern) ||
      (e.description || '').downcase.include?(pattern)
  end
end

.submit_for_review(name) ⇒ Object

Review workflow



88
89
90
91
92
# File 'lib/legion/registry.rb', line 88

def submit_for_review(name)
  entry = find_or_raise(name)
  update_entry(name, entry, status: :pending_review, submitted_at: Time.now.utc)
  true
end

.unregister(name) ⇒ Object



54
55
56
# File 'lib/legion/registry.rb', line 54

def unregister(name)
  store.delete(name.to_s)
end

.usage_stats(name) ⇒ Object



127
128
129
130
131
132
133
134
135
136
137
138
139
140
# File 'lib/legion/registry.rb', line 127

def usage_stats(name)
  entry = lookup(name.to_s)
  return nil unless entry

  {
    name:             entry.name,
    version:          entry.version,
    install_count:    0,
    active_instances: 0,
    last_updated:     nil,
    downloads_7d:     0,
    downloads_30d:    0
  }
end