Class: Petticoat::Document
- Inherits:
-
Object
- Object
- Petticoat::Document
- 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
-
#add(context:, role:, scenario:, snapshot:, scope: 'individual') ⇒ Object
One document represents one caller-selected construction population.
-
#evidence ⇒ Object
Developer evidence, not another frontend catalogue.
-
#initialize(subjects:, actions: DEFAULT_ACTIONS) ⇒ Document
constructor
A new instance of Document.
- #to_h(view: 'resources') ⇒ Object
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.
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
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 |