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