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
-
#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
-
#compile_files ⇒ Object
Returns a hash mapping file type names to File objects.
-
#initialize(sample) ⇒ Submission
constructor
A new instance of Submission.
-
#submit_accession(event_user) ⇒ Object
rubocop:disable Metrics/MethodLength,Metrics/AbcSize.
Methods included from Accessionable
#date, #ebi_alias_datestamped, #filename, #schema_type, #to_file, #to_xml
Constructor Details
#initialize(sample) ⇒ Submission
Returns a new instance of Submission.
16 17 18 19 |
# File 'lib/accession/submission.rb', line 16 def initialize(sample) @sample = sample @service = sample&.service end |
Instance Attribute Details
#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
22 23 24 |
# File 'lib/accession/submission.rb', line 22 def self.client HTTPClients::AccessioningV1Client.new end |
Instance Method Details
#build_xml(xml) ⇒ Object
26 27 28 29 30 31 32 33 34 35 36 |
# File 'lib/accession/submission.rb', line 26 def build_xml(xml) xml.SUBMISSION( XML_NAMESPACE, center_name: CENTER_NAME, broker_name: service.broker, alias: sample.ebi_alias_datestamped, submission_date: date ) do actions(xml) 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 }
71 72 73 74 75 76 77 |
# File 'lib/accession/submission.rb', line 71 def compile_files {}.tap do |f| [self, sample].each do |accessionable| f[accessionable.schema_type.upcase] = accessionable.to_file end end end |
#submit_accession(event_user) ⇒ Object
rubocop:disable Metrics/MethodLength,Metrics/AbcSize
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
# File 'lib/accession/submission.rb', line 38 def submit_accession(event_user) # rubocop:disable Metrics/MethodLength,Metrics/AbcSize # Rubocop metrics disabled as refactoring this method would reduce clarity unless valid? raise Accession::InternalValidationError, "Accessionable submission is invalid: #{errors..join(', ')}" end client = self.class.client login = service.login files = compile_files if accessioned? client.submit_and_fetch_accession_number(login, files) sample.sample.events.('sample', event_user) Rails.logger.info("Sample '#{sample.sample.name}' " \ "with alias '#{sample.ebi_alias}' " \ "and accession number '#{sample.ebi_accession_number}' " \ "has had it's accession metadata successfully updated.") else accession_number = client.submit_and_fetch_accession_number(login, files) sample.update_accession_number(accession_number, event_user) end ensure # Ensure all opened files are closed files&.each_value(&:close!) end |