Skip to content

Instantly share code, notes, and snippets.

@jeremyf
Last active January 18, 2024 19:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jeremyf/01d00ed58d9cf6f8237851fcc4a817a0 to your computer and use it in GitHub Desktop.
Save jeremyf/01d00ed58d9cf6f8237851fcc4a817a0 to your computer and use it in GitHub Desktop.
Create a graph of Hyrax Transactions
---
- name: change_set.apply
class_name: Hyrax::Transactions::ApplyChangeSet
events: []
steps:
- class_name: Hyrax::Transactions::Steps::SetModifiedDate
steps: []
events: []
name: change_set.set_modified_date
- class_name: Hyrax::Transactions::Steps::SetUploadedDateUnlessPresent
steps: []
events: []
name: change_set.set_uploaded_date_unless_present
- class_name: Hyrax::Transactions::Steps::Validate
steps: []
events: []
name: change_set.validate
- class_name: Hyrax::Transactions::Steps::Save
steps: []
events:
- collection.metadata.updated
- object.deposited
- object.metadata.updated
- collection.membership.updated
name: change_set.save
- name: change_set.create_admin_set
class_name: Hyrax::Transactions::AdminSetCreate
events: []
steps:
- class_name: Hyrax::Transactions::Steps::SetUserAsCreator
steps: []
events: []
name: change_set.set_user_as_creator
- class_name: Hyrax::Transactions::ApplyChangeSet
steps:
- class_name: Hyrax::Transactions::Steps::SetModifiedDate
steps: []
events: []
name: change_set.set_modified_date
- class_name: Hyrax::Transactions::Steps::SetUploadedDateUnlessPresent
steps: []
events: []
name: change_set.set_uploaded_date_unless_present
- class_name: Hyrax::Transactions::Steps::Validate
steps: []
events: []
name: change_set.validate
- class_name: Hyrax::Transactions::Steps::Save
steps: []
events:
- collection.metadata.updated
- object.deposited
- object.metadata.updated
- collection.membership.updated
name: change_set.save
events: []
name: change_set.apply
- class_name: Hyrax::Transactions::Steps::ApplyCollectionTypePermissions
steps: []
events: []
name: admin_set_resource.apply_collection_type_permissions
- class_name: Hyrax::Transactions::Steps::SaveAccessControl
steps: []
events: []
name: admin_set_resource.save_acl
- name: change_set.create_collection
class_name: Hyrax::Transactions::CollectionCreate
events: []
steps:
- class_name: Hyrax::Transactions::Steps::SetUserAsDepositor
steps: []
events: []
name: change_set.set_user_as_depositor
- class_name: Hyrax::Transactions::Steps::SetCollectionTypeGid
steps: []
events: []
name: change_set.set_collection_type_gid
- class_name: Hyrax::Transactions::Steps::AddToCollections
steps: []
events: []
name: change_set.add_to_collections
- class_name: Hyrax::Transactions::ApplyChangeSet
steps:
- class_name: Hyrax::Transactions::Steps::SetModifiedDate
steps: []
events: []
name: change_set.set_modified_date
- class_name: Hyrax::Transactions::Steps::SetUploadedDateUnlessPresent
steps: []
events: []
name: change_set.set_uploaded_date_unless_present
- class_name: Hyrax::Transactions::Steps::Validate
steps: []
events: []
name: change_set.validate
- class_name: Hyrax::Transactions::Steps::Save
steps: []
events:
- collection.metadata.updated
- object.deposited
- object.metadata.updated
- collection.membership.updated
name: change_set.save
events: []
name: change_set.apply
- class_name: Hyrax::Transactions::Steps::ApplyCollectionTypePermissions
steps: []
events: []
name: collection_resource.apply_collection_type_permissions
- class_name: Hyrax::Transactions::Steps::SaveAccessControl
steps: []
events: []
name: collection_resource.save_acl
- name: change_set.create_work
class_name: Hyrax::Transactions::WorkCreate
events: []
steps:
- class_name: Hyrax::Transactions::Steps::SetDefaultAdminSet
steps: []
events: []
name: change_set.set_default_admin_set
- class_name: Hyrax::Transactions::Steps::EnsureAdminSet
steps: []
events: []
name: change_set.ensure_admin_set
- class_name: Hyrax::Transactions::Steps::SetUserAsDepositor
steps: []
events: []
name: change_set.set_user_as_depositor
- class_name: Hyrax::Transactions::ApplyChangeSet
steps:
- class_name: Hyrax::Transactions::Steps::SetModifiedDate
steps: []
events: []
name: change_set.set_modified_date
- class_name: Hyrax::Transactions::Steps::SetUploadedDateUnlessPresent
steps: []
events: []
name: change_set.set_uploaded_date_unless_present
- class_name: Hyrax::Transactions::Steps::Validate
steps: []
events: []
name: change_set.validate
- class_name: Hyrax::Transactions::Steps::Save
steps: []
events:
- collection.metadata.updated
- object.deposited
- object.metadata.updated
- collection.membership.updated
name: change_set.save
events: []
name: change_set.apply
- class_name: Hyrax::Transactions::Steps::ApplyPermissionTemplate
steps: []
events: []
name: work_resource.apply_permission_template
- class_name: Hyrax::Transactions::Steps::SaveAccessControl
steps: []
events: []
name: work_resource.save_acl
- class_name: Hyrax::Transactions::Steps::AddFileSets
steps: []
events: []
name: work_resource.add_file_sets
- class_name: Hyrax::Transactions::Steps::ChangeDepositor
steps: []
events: []
name: work_resource.change_depositor
- class_name: Hyrax::Transactions::Steps::AddToParent
steps: []
events:
- object.metadata.updated
name: work_resource.add_to_parent
- name: change_set.update_collection
class_name: Hyrax::Transactions::CollectionUpdate
events: []
steps:
- class_name: Hyrax::Transactions::ApplyChangeSet
steps:
- class_name: Hyrax::Transactions::Steps::SetModifiedDate
steps: []
events: []
name: change_set.set_modified_date
- class_name: Hyrax::Transactions::Steps::SetUploadedDateUnlessPresent
steps: []
events: []
name: change_set.set_uploaded_date_unless_present
- class_name: Hyrax::Transactions::Steps::Validate
steps: []
events: []
name: change_set.validate
- class_name: Hyrax::Transactions::Steps::Save
steps: []
events:
- collection.metadata.updated
- object.deposited
- object.metadata.updated
- collection.membership.updated
name: change_set.save
events: []
name: change_set.apply
- class_name: Hyrax::Transactions::Steps::SaveCollectionBanner
steps: []
events: []
name: collection_resource.save_collection_banner
- class_name: Hyrax::Transactions::Steps::SaveCollectionLogo
steps: []
events: []
name: collection_resource.save_collection_logo
- class_name: Hyrax::Transactions::Steps::SaveAccessControl
steps: []
events: []
name: collection_resource.save_acl
- name: change_set.update_file_set
class_name: Hyrax::Transactions::FileSetUpdate
events: []
steps:
- class_name: Hyrax::Transactions::ApplyChangeSet
steps:
- class_name: Hyrax::Transactions::Steps::SetModifiedDate
steps: []
events: []
name: change_set.set_modified_date
- class_name: Hyrax::Transactions::Steps::SetUploadedDateUnlessPresent
steps: []
events: []
name: change_set.set_uploaded_date_unless_present
- class_name: Hyrax::Transactions::Steps::Validate
steps: []
events: []
name: change_set.validate
- class_name: Hyrax::Transactions::Steps::Save
steps: []
events:
- collection.metadata.updated
- object.deposited
- object.metadata.updated
- collection.membership.updated
name: change_set.save
events: []
name: change_set.apply
- class_name: Hyrax::Transactions::Steps::SaveAccessControl
steps: []
events: []
name: file_set.save_acl
- name: change_set.update_work
class_name: Hyrax::Transactions::WorkUpdate
events: []
steps:
- class_name: Hyrax::Transactions::ApplyChangeSet
steps:
- class_name: Hyrax::Transactions::Steps::SetModifiedDate
steps: []
events: []
name: change_set.set_modified_date
- class_name: Hyrax::Transactions::Steps::SetUploadedDateUnlessPresent
steps: []
events: []
name: change_set.set_uploaded_date_unless_present
- class_name: Hyrax::Transactions::Steps::Validate
steps: []
events: []
name: change_set.validate
- class_name: Hyrax::Transactions::Steps::Save
steps: []
events:
- collection.metadata.updated
- object.deposited
- object.metadata.updated
- collection.membership.updated
name: change_set.save
events: []
name: change_set.apply
- class_name: Hyrax::Transactions::Steps::SaveAccessControl
steps: []
events: []
name: work_resource.save_acl
- class_name: Hyrax::Transactions::Steps::AddFileSets
steps: []
events: []
name: work_resource.add_file_sets
- class_name: Hyrax::Transactions::Steps::UpdateWorkMembers
steps: []
events:
- object.metadata.updated
name: work_resource.update_work_members
- name: file_metadata.destroy
class_name: Hyrax::Transactions::FileMetadataDestroy
events: []
steps:
- class_name: Hyrax::Transactions::Steps::FileMetadataDelete
steps: []
events:
- file.metadata.deleted
name: file_metadata.delete
- name: file_set.delete_all_file_metadata
class_name: Hyrax::Transactions::Steps::DeleteAllFileMetadata
events: []
steps:
- class_name: Hyrax::Transactions::FileMetadataDestroy
steps:
- class_name: Hyrax::Transactions::Steps::FileMetadataDelete
steps: []
events:
- file.metadata.deleted
name: file_metadata.delete
events: []
name: file_metadata.destroy
- name: file_set.destroy
class_name: Hyrax::Transactions::FileSetDestroy
events: []
steps:
- class_name: Hyrax::Transactions::Steps::DeleteAllFileMetadata
steps:
- class_name: Hyrax::Transactions::FileMetadataDestroy
steps:
- class_name: Hyrax::Transactions::Steps::FileMetadataDelete
steps: []
events:
- file.metadata.deleted
name: file_metadata.delete
events: []
name: file_metadata.destroy
events: []
name: file_set.delete_all_file_metadata
- class_name: Hyrax::Transactions::Steps::RemoveFileSetFromWork
steps: []
events:
- object.metadata.updated
name: file_set.remove_from_work
- class_name: Hyrax::Transactions::Steps::DeleteAccessControl
steps: []
events: []
name: file_set.delete_acl
- class_name: Hyrax::Transactions::Steps::DeleteResource
steps: []
events:
- collection.deleted
- object.deleted
name: file_set.delete
- name: admin_set_resource.destroy
class_name: Hyrax::Transactions::AdminSetDestroy
events: []
steps:
- class_name: Hyrax::Transactions::Steps::CheckForEmptyAdminSet
steps: []
events: []
name: admin_set_resource.check_empty
- class_name: Hyrax::Transactions::Steps::DeleteResource
steps: []
events:
- collection.deleted
- object.deleted
name: admin_set_resource.delete
- class_name: Hyrax::Transactions::Steps::DeleteAccessControl
steps: []
events: []
name: admin_set_resource.delete_acl
- name: admin_set_resource.update
class_name: Hyrax::Transactions::AdminSetUpdate
events: []
steps:
- class_name: Hyrax::Transactions::ApplyChangeSet
steps:
- class_name: Hyrax::Transactions::Steps::SetModifiedDate
steps: []
events: []
name: change_set.set_modified_date
- class_name: Hyrax::Transactions::Steps::SetUploadedDateUnlessPresent
steps: []
events: []
name: change_set.set_uploaded_date_unless_present
- class_name: Hyrax::Transactions::Steps::Validate
steps: []
events: []
name: change_set.validate
- class_name: Hyrax::Transactions::Steps::Save
steps: []
events:
- collection.metadata.updated
- object.deposited
- object.metadata.updated
- collection.membership.updated
name: change_set.save
events: []
name: change_set.apply
- class_name: Hyrax::Transactions::Steps::SaveAccessControl
steps: []
events: []
name: admin_set_resource.save_acl
- name: collection_resource.destroy
class_name: Hyrax::Transactions::CollectionDestroy
events: []
steps:
- class_name: Hyrax::Transactions::Steps::DeleteAccessControl
steps: []
events: []
name: collection_resource.delete_acl
- class_name: Hyrax::Transactions::Steps::RemoveFromMembership
steps: []
events:
- collection.membership.updated
name: collection_resource.remove_from_membership
- class_name: Hyrax::Transactions::Steps::DeleteResource
steps: []
events:
- collection.deleted
- object.deleted
name: collection_resource.delete
- name: work_resource.delete_all_file_sets
class_name: Hyrax::Transactions::Steps::DeleteAllFileSets
events: []
steps:
- class_name: Hyrax::Transactions::FileSetDestroy
steps:
- class_name: Hyrax::Transactions::Steps::DeleteAllFileMetadata
steps:
- class_name: Hyrax::Transactions::FileMetadataDestroy
steps:
- class_name: Hyrax::Transactions::Steps::FileMetadataDelete
steps: []
events:
- file.metadata.deleted
name: file_metadata.delete
events: []
name: file_metadata.destroy
events: []
name: file_set.delete_all_file_metadata
- class_name: Hyrax::Transactions::Steps::RemoveFileSetFromWork
steps: []
events:
- object.metadata.updated
name: file_set.remove_from_work
- class_name: Hyrax::Transactions::Steps::DeleteAccessControl
steps: []
events: []
name: file_set.delete_acl
- class_name: Hyrax::Transactions::Steps::DeleteResource
steps: []
events:
- collection.deleted
- object.deleted
name: file_set.delete
events: []
name: file_set.destroy
- name: work_resource.destroy
class_name: Hyrax::Transactions::WorkDestroy
events: []
steps:
- class_name: Hyrax::Transactions::Steps::DeleteAllFileSets
steps:
- class_name: Hyrax::Transactions::FileSetDestroy
steps:
- class_name: Hyrax::Transactions::Steps::DeleteAllFileMetadata
steps:
- class_name: Hyrax::Transactions::FileMetadataDestroy
steps:
- class_name: Hyrax::Transactions::Steps::FileMetadataDelete
steps: []
events:
- file.metadata.deleted
name: file_metadata.delete
events: []
name: file_metadata.destroy
events: []
name: file_set.delete_all_file_metadata
- class_name: Hyrax::Transactions::Steps::RemoveFileSetFromWork
steps: []
events:
- object.metadata.updated
name: file_set.remove_from_work
- class_name: Hyrax::Transactions::Steps::DeleteAccessControl
steps: []
events: []
name: file_set.delete_acl
- class_name: Hyrax::Transactions::Steps::DeleteResource
steps: []
events:
- collection.deleted
- object.deleted
name: file_set.delete
events: []
name: file_set.destroy
events: []
name: work_resource.delete_all_file_sets
- class_name: Hyrax::Transactions::Steps::DeleteAccessControl
steps: []
events: []
name: work_resource.delete_acl
- class_name: Hyrax::Transactions::Steps::DeleteResource
steps: []
events:
- collection.deleted
- object.deleted
name: work_resource.delete
module Hyrax
module Transactions
##
# The purpose of this support class is to generate a tree of transactions and events.
#
# @example
# irb: Hyrax::Transactions::Grapher.call
# => {"publish" => {
# "class_name" => "Publish",
# "events" => ["on_publish"],
# "steps" => {
# "send_notice" => {
# "class_name" => "SendNotice",
# "events" => [],
# "steps" => [] }}}}
class Grapher
# A best guess at how to find the published events within the source code of the transactions.
REGEXP_FOR_PUBLISH = %r{\.publish[\(\s]?['"]([\w\.]+)['"]}.freeze
# Because some transactions launch other transactions within their 'call'
REGEXP_FOR_INNER_STEPS = %r{ontainer\[['"]([\w\.]+)['"]\]}.freeze
##
# @return [Hash<String, Hash>] a graph of the transaction steps.
def self.call(container: Hyrax::Transactions::Container)
new(container: container).call
end
def initialize(container: )
@container = container
end
attr_reader :container
##
# @return [Hash<String,Hash>]
def call
steps = extract_steps
treeify(steps: steps)
end
def extract_steps
# First we gather all of the registered transactions.
steps = {}
container.keys.each do |key|
step = container[key]
step_source = File.read(step.method(:call).source_location[0])
events = Set.new
sub_steps = step.try(:steps) || []
step_source.scan(REGEXP_FOR_INNER_STEPS) do |match|
sub_steps << match[0]
end
step_source.scan(REGEXP_FOR_PUBLISH) do |match|
events << match[0]
end
steps[key] = { "class_name" => step.class.to_s, "steps" => sub_steps, "events" => events.to_a }
end
steps
end
def treeify(steps:)
unvisited_transactions = steps.keys.deep_dup
# Now we want to tree-ify the steps; so that we can see the graph of transactions and events
# published.
tree = []
steps.each_pair do |key, details|
next if details["steps"].empty?
unvisited_transactions.delete(key)
sub_steps = []
details["steps"].each do |step|
sub_steps << extract_substeps_from(dictionary: steps, current_step: step, unvisited_transactions: unvisited_transactions)
end
tree << { "name" => key, "class_name" => details["class_name"], "events" => details["events"], "steps" => sub_steps }
end
unvisited_transactions.each do |key|
tree << steps[key].merge("name" => key)
end
tree
end
def extract_substeps_from(dictionary:, current_step:, unvisited_transactions:)
# We want to avoid changing the dictionary as we're looping through points of reference
sub_step = dictionary.fetch(current_step).deep_dup
sub_step["name"] = current_step
unvisited_transactions.delete(current_step)
if sub_step["steps"].present?
sub_step_steps = []
sub_step["steps"].each_with_object(sub_step_steps) do |st, array|
array << extract_substeps_from(dictionary: dictionary, current_step: st, unvisited_transactions: unvisited_transactions)
end
sub_step["steps"] = sub_step_steps
end
sub_step
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment