Class: Petticoat::Document

Inherits:
Object
  • Object
show all
Defined in:
lib/petticoat/document.rb

Constant Summary collapse

SCHEMA_VERSION =
1
VIEWS =
%w[resources actions].freeze
DEFAULT_ACTIONS =
%w[read index show create new update edit destroy manage].freeze

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(subjects:, actions: DEFAULT_ACTIONS) ⇒ Document

Returns a new instance of Document.



11
12
13
14
15
# File 'lib/petticoat/document.rb', line 11

def initialize(subjects:, actions: DEFAULT_ACTIONS)
  @subjects = subjects
  @actions = actions
  @observations = {}
end

Class Method Details

.lookup(payload, **query) ⇒ Object



62
63
64
65
66
67
68
69
70
71
# File 'lib/petticoat/document.rb', line 62

def self.lookup(payload, **query)
  return 'unknown' unless payload.is_a?(Hash)
  return 'unknown' unless compatible_query?(payload, query)
  return 'unknown' unless registered_subject?(payload, query.fetch(:subject))

  context = payload['contexts']&.dig(query.fetch(:context))
  return 'unknown' unless context.is_a?(Hash)

  payload.fetch('view') == 'resources' ? lookup_resource(context, query) : lookup_actions(context, query)
end

Instance Method Details

#add(context:, role:, scenario:, snapshot:, scope: 'individual') ⇒ Object

One document represents one caller-selected construction population.

Raises:



18
19
20
21
22
23
24
# File 'lib/petticoat/document.rb', line 18

def add(context:, role:, scenario:, snapshot:, scope: 'individual')
  entry = (@observations[context] ||= { scope:, snapshots: {} })
  raise Error, 'Conflicting context scope' unless entry[:scope] == scope
  raise Error, 'Duplicate scenario in context' if entry[:snapshots].key?(scenario)

  entry[:snapshots][scenario] = { role:, snapshot: }
end

#evidence ⇒ Object

Developer evidence, not another frontend catalogue. Values stay redacted.



47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/petticoat/document.rb', line 47

def evidence
  actions = all_actions
  observations =
    @observations.flat_map do |context, entry|
      entry[:snapshots].map do |scenario, observation|
        payload = snapshot_payload(observation, actions)
        payload.merge('context' => context,
                      'scope' => entry[:scope],
                      'scenario' => scenario,
                      'states' => sparse_states(payload.fetch('states')))
      end
    end
  Petticoat.canonical(observations.sort_by { |item| item.values_at('context', 'scenario') })
end

#to_h(view: 'resources') ⇒ Object

Raises:



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/petticoat/document.rb', line 26

def to_h(view: 'resources')
  raise Error, 'Unsupported catalogue view' unless VIEWS.include?(view)

  actions = all_actions
  payload = {
    'schema_version' => SCHEMA_VERSION,
    'view' => view,
    'adapter' => Adapter::ID,
    'scope' => 'observed_ability_construction',
    'basis' => 'observed_scenarios',
    'defaults' => DEFAULTS,
    'subjects' => @subjects.keys.sort,
    'contexts' => @observations.transform_values do |entry|
      context_payload(entry[:scope], entry[:snapshots], actions, view)
    end
  }
  payload['digest'] = Digest::SHA256.hexdigest(Petticoat.canonical_json(payload))
  Petticoat.canonical(payload)
end