Last active
January 18, 2024 19:55
-
-
Save jeremyf/01d00ed58d9cf6f8237851fcc4a817a0 to your computer and use it in GitHub Desktop.
Create a graph of Hyrax Transactions
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--- | |
- 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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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