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

pulibrary / bibdata / 381ebe8c-8717-4a37-93a5-7a9a805ad9de

20 Dec 2024 07:43PM UTC coverage: 91.859% (-0.05%) from 91.904%
381ebe8c-8717-4a37-93a5-7a9a805ad9de

Pull #2563

circleci

maxkadel
Test for idempotency
Pull Request #2563: I2321 Shift SCSB full index tasks into separate background jobs

91 of 92 new or added lines in 6 files covered. (98.91%)

5 existing lines in 1 file now uncovered.

3419 of 3722 relevant lines covered (91.86%)

375.43 hits per line

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

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

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

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

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

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

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

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

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

109
      def set_generated_date
1✔
110
        @dump.generated_date = date_strings.map { |str| DateTime.parse(str) }.sort.first
16✔
111
      end
112

113
      def date_strings
1✔
114
        @dump.dump_files.map do |df|
10✔
115
          if df.dump_file_type == "recap_records_full_metadata"
6✔
UNCOV
116
            File.basename(df.path).split("_")[3]
×
117
          else
118
            File.basename(df.path).split("_")[2]
6✔
119
          end
120
        end
121
      end
122

123
      def prepare_directory
1✔
124
        FileUtils.mkdir_p(@update_directory)
10✔
125
      end
126
    end
127
  end
128
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