• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

pulibrary / bibdata / 83785282-b493-4102-b828-c01dc1ed4e60

31 Dec 2024 07:48PM UTC coverage: 91.93% (+0.07%) from 91.859%
83785282-b493-4102-b828-c01dc1ed4e60

Pull #2563

circleci

maxkadel
Create more nested batches
Pull Request #2563: I2321 Shift SCSB full index tasks into separate background jobs

184 of 188 new or added lines in 11 files covered. (97.87%)

4 existing lines in 1 file now uncovered.

3497 of 3804 relevant lines covered (91.93%)

366.53 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

91.49
/app/models/scsb/partner_updates/update.rb
1
module Scsb
1✔
2
  class PartnerUpdates
1✔
3
    class Update
1✔
4
      attr_accessor :dump
1✔
5

6
      def initialize(dump:, dump_file_type:, timestamp:)
1✔
7
        @last_dump = timestamp
11✔
8
        @dump = dump
11✔
9
        @dump_file_type = dump_file_type
11✔
10
        @s3_bucket = Scsb::S3Bucket.partner_transfer_client
11✔
11
        @scsb_file_dir = ENV['SCSB_FILE_DIR']
11✔
12
        @update_directory = ENV['SCSB_PARTNER_UPDATE_DIRECTORY'] || '/tmp/updates'
11✔
13
      end
14

15
      def process_partner_updates(files:, file_prefix: 'scsb_update_')
1✔
16
        xml_files = []
3✔
17
        files.each do |file|
3✔
18
          xml_files << Scsb::PartnerUpdates::Update.extract_files(file:, update_directory: @update_directory)
3✔
19
        end
20
        xml_files.flatten.each do |file|
3✔
21
          Scsb::PartnerUpdates::Update.attach_cleaned_dump_file(file:, dump_id: @dump.id, file_prefix:, dump_file_type: @dump_file_type)
6✔
22
        end
23
      end
24

25
      def self.extract_files(file:, update_directory:)
1✔
26
        extracted_files = []
19✔
27
        filename = File.basename(file, '.zip')
19✔
28
        filename.gsub!(/^[^_]+_([0-9]+)_([0-9]+).*$/, '\1_\2')
19✔
29
        file_increment = 1
19✔
30
        Zip::File.open(file) do |zip_file|
19✔
31
          zip_file.each do |entry|
16✔
32
            target = "#{update_directory}/#{filename}_#{file_increment}.xml"
32✔
33
            extracted_files << target
32✔
34
            entry.extract(target)
32✔
35
            file_increment += 1
32✔
36
          end
37
        end
38
        File.unlink(file)
18✔
39
        extracted_files
18✔
40
      end
41

42
      def self.attach_cleaned_dump_file(file:, dump_id:, file_prefix:, dump_file_type: :recap_records_full)
1✔
43
        scsb_file_dir = ENV['SCSB_FILE_DIR']
32✔
44
        @inv_xml = []
32✔
45
        @tab_newline = []
32✔
46
        @leader = []
32✔
47
        @composed_chars = []
32✔
48
        @bad_utf8 = []
32✔
49
        original_filename = File.basename(file)
32✔
50
        reader = MARC::XMLReader.new(file.to_s, external_encoding: 'UTF-8')
32✔
51
        new_filepath = "#{scsb_file_dir}/#{file_prefix}#{original_filename}"
32✔
52
        writer = MARC::XMLWriter.new(new_filepath)
32✔
53
        reader.each { |record| writer.write(process_record(record)) }
96✔
54
        writer.close
32✔
55
        File.unlink(file) if dump_file_type == :recap_records
32✔
56
        Dump.attach_dump_file(dump_id:, filepath: new_filepath, dump_file_type:)
32✔
57
      end
58

59
      def self.process_record(record)
1✔
60
        record = field_delete(['856', '959'], record)
65✔
61
        record.leader[5] = 'c' if record.leader[5].eql?('d')
65✔
62
        if bad_utf8?(record)
65✔
63
          @bad_utf8 << record['001']
×
64
          record = bad_utf8_fix(record)
×
65
        end
66
        if invalid_xml_chars?(record)
65✔
67
          @inv_xml << record['001']
×
68
          record = invalid_xml_fix(record)
×
69
        end
70
        if tab_newline_char?(record)
65✔
71
          @tab_newline << record['001']
3✔
72
          record = tab_newline_fix(record)
3✔
73
        end
74
        if leader_errors?(record)
65✔
75
          @leader << record['001']
10✔
76
          record = leaderfix(record)
10✔
77
        end
78
        if composed_chars_errors?(record)
65✔
79
          @composed_chars << record['001']
19✔
80
          record = composed_chars_normalize(record)
19✔
81
        end
82
        record = extra_space_fix(record)
65✔
83
        empty_subfield_fix(record)
65✔
84
      end
85

86
      def add_error(message:)
1✔
UNCOV
87
        error = Array.wrap(@dump.event.error)
×
UNCOV
88
        error << message
×
UNCOV
89
        @dump.event.error = error.join('; ')
×
UNCOV
90
        @dump.event.save
×
91
      end
92

93
      def log_record_fixes
1✔
94
        log_file = {
95
          inv_xml: @inv_xml,
8✔
96
          tab_newline: @tab_newline,
97
          leader: @leader,
98
          composed_chars: @composed_chars,
99
          bad_utf8: @bad_utf8
100
        }
101
        filepath = log_file_name
8✔
102
        File.write(filepath, log_file.to_json.to_s)
8✔
103
        Dump.attach_dump_file(dump_id: @dump.id, filepath:, dump_file_type: :log_file)
8✔
104
      end
105

106
      def log_file_name
1✔
107
        "#{@scsb_file_dir}/fixes_#{@last_dump.to_time.strftime('%Y_%m_%d')}.json"
8✔
108
      end
109

110
      def self.generated_date(dump_id:)
1✔
111
        dump = Dump.find(dump_id)
1✔
112
        dump.generated_date = date_strings(dump:).map { |str| DateTime.parse(str) }.sort.first
10✔
113
      end
114

115
      def self.date_strings(dump:)
1✔
116
        dump.dump_files.map do |df|
1✔
117
          if df.dump_file_type == 'recap_records_full_metadata'
9✔
118
            File.basename(df.path).split('_')[3]
3✔
119
          else
120
            File.basename(df.path).split('_')[2]
6✔
121
          end
122
        end
123
      end
124

125
      def set_generated_date
1✔
126
        @dump.generated_date = date_strings.map { |str| DateTime.parse(str) }.sort.first
40✔
127
      end
128

129
      def date_strings
1✔
130
        @dump.dump_files.map do |df|
8✔
131
          if df.dump_file_type == 'recap_records_full_metadata'
32✔
132
            File.basename(df.path).split('_')[3]
10✔
133
          else
134
            File.basename(df.path).split('_')[2]
22✔
135
          end
136
        end
137
      end
138

139
      def prepare_directory
1✔
140
        FileUtils.mkdir_p(@update_directory)
8✔
141
      end
142
    end
143
  end
144
end
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc