Class: Accession::Submission
- Inherits:
-
Object
- Object
- Accession::Submission
- Includes:
- Accessionable, ActiveModel::Model
- Defined in:
- lib/accession/submission.rb
Overview
Made up of a sample, user and service Used by Request to extract relevant information to send to appropriate accessioning service
Instance Attribute Summary collapse
-
#contact ⇒ Object
readonly
Returns the value of attribute contact.
-
#sample ⇒ Object
readonly
Returns the value of attribute sample.
-
#service ⇒ Object
readonly
Returns the value of attribute service.
Attributes included from Accessionable
Class Method Summary collapse
-
.client ⇒ Object
Define the client as a class method for easy test mocking.
Instance Method Summary collapse
-
#build_xml(xml) ⇒ Object
rubocop:disable Metrics/AbcSize.
-
#compile_files ⇒ Object
Returns a hash mapping file type names to File objects.
-
#initialize(contact_user, sample) ⇒ Submission
constructor
A new instance of Submission.
- #submit_and_update_accession_number(event_user) ⇒ Object
Methods included from Accessionable
#date, #ebi_alias_datestamped, #filename, #schema_type, #to_file, #to_xml
Constructor Details
#initialize(contact_user, sample) ⇒ Submission
Returns a new instance of Submission.
16 17 18 19 20 |
# File 'lib/accession/submission.rb', line 16 def initialize(contact_user, sample) @sample = sample @service = sample&.service @contact = contact_user ? Contact.new(contact_user) : nil # only create Contact if user is present end |
Instance Attribute Details
#contact ⇒ Object (readonly)
Returns the value of attribute contact.
9 10 11 |
# File 'lib/accession/submission.rb', line 9 def contact @contact end |
#sample ⇒ Object (readonly)
Returns the value of attribute sample.
9 10 11 |
# File 'lib/accession/submission.rb', line 9 def sample @sample end |
#service ⇒ Object (readonly)
Returns the value of attribute service.
9 10 11 |
# File 'lib/accession/submission.rb', line 9 def service @service end |
Class Method Details
.client ⇒ Object
Define the client as a class method for easy test mocking
23 24 25 |
# File 'lib/accession/submission.rb', line 23 def self.client HTTPClients::AccessioningV1Client.new end |
Instance Method Details
#build_xml(xml) ⇒ Object
rubocop:disable Metrics/AbcSize
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
# File 'lib/accession/submission.rb', line 27 def build_xml(xml) # rubocop:disable Metrics/AbcSize xml.SUBMISSION( XML_NAMESPACE, center_name: CENTER_NAME, broker_name: service.broker, alias: sample.ebi_alias_datestamped, submission_date: date ) do xml.CONTACTS { xml.CONTACT(contact.to_h) } xml.ACTIONS do xml.ACTION { xml.ADD(source: sample.filename, schema: sample.schema_type) } xml.ACTION { xml.tag!(service.visibility) } end end end |
#compile_files ⇒ Object
Returns a hash mapping file type names to File objects. Files should be closed or unlinked after use. { 'SUBMISSION' => open_temp_submission_file, 'SAMPLE' => open_temp_sample_file }
63 64 65 66 67 68 69 |
# File 'lib/accession/submission.rb', line 63 def compile_files {}.tap do |f| [self, sample].each do |accessionable| f[accessionable.schema_type.upcase] = accessionable.to_file end end end |
#submit_and_update_accession_number(event_user) ⇒ Object
44 45 46 47 48 49 50 51 52 53 54 55 |
# File 'lib/accession/submission.rb', line 44 def submit_and_update_accession_number(event_user) raise StandardError, "Accessionable submission is invalid: #{errors..join(', ')}" unless valid? client = self.class.client login = service.login files = compile_files accession_number = client.submit_and_fetch_accession_number(login, files) sample.update_accession_number(accession_number, event_user) ensure # Ensure all opened files are closed files&.each_value(&:close!) end |