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

pulibrary / bibdata / cdc23dd4-7656-4660-bfe1-6a9fb1bebcca

07 Jun 2024 06:22PM UTC coverage: 91.315% (+0.06%) from 91.26%
cdc23dd4-7656-4660-bfe1-6a9fb1bebcca

Pull #2388

circleci

maxkadel
Remove redundant s3_bucket
Pull Request #2388: Do not process full dumps with private records

164 of 169 new or added lines in 5 files covered. (97.04%)

3438 of 3765 relevant lines covered (91.31%)

349.75 hits per line

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

95.35
/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
15✔
7
        @dump = dump
15✔
8
        @dump_file_type = dump_file_type
15✔
9
        @s3_bucket = Scsb::S3Bucket.partner_transfer_client
15✔
10
        @scsb_file_dir = ENV['SCSB_FILE_DIR']
15✔
11
        @update_directory = ENV['SCSB_PARTNER_UPDATE_DIRECTORY'] || '/tmp/updates'
15✔
12
        @inv_xml = []
15✔
13
        @tab_newline = []
15✔
14
        @leader = []
15✔
15
        @composed_chars = []
15✔
16
        @bad_utf8 = []
15✔
17
      end
18

19
      def attach_dump_file(filepath, dump_file_type: nil)
1✔
20
        dump_file_type ||= @dump_file_type
43✔
21
        df = DumpFile.create(dump_file_type:, path: filepath)
43✔
22
        df.zip
43✔
23
        df.save
43✔
24
        @dump.dump_files << df
43✔
25
        @dump.save
43✔
26
      end
27

28
      def process_partner_updates(files:, file_prefix: 'scsb_update_')
1✔
29
        xml_files = []
11✔
30
        files.each do |file|
11✔
31
          filename = File.basename(file, '.zip')
11✔
32
          filename.gsub!(/^[^_]+_([0-9]+)_([0-9]+).*$/, '\1_\2')
11✔
33
          file_increment = 1
11✔
34
          Zip::File.open(file) do |zip_file|
11✔
35
            zip_file.each do |entry|
11✔
36
              target = "#{@update_directory}/#{filename}_#{file_increment}.xml"
22✔
37
              xml_files << target
22✔
38
              entry.extract(target)
22✔
39
              file_increment += 1
22✔
40
            end
41
          end
42
          File.unlink(file)
11✔
43
        end
44
        xml_files.each do |file|
11✔
45
          filename = File.basename(file)
22✔
46
          reader = MARC::XMLReader.new(file.to_s, external_encoding: 'UTF-8')
22✔
47
          filepath = "#{@scsb_file_dir}/#{file_prefix}#{filename}"
22✔
48
          writer = MARC::XMLWriter.new(filepath)
22✔
49
          reader.each { |record| writer.write(process_record(record)) }
66✔
50
          writer.close
22✔
51
          File.unlink(file)
22✔
52
          attach_dump_file(filepath)
22✔
53
        end
54
      end
55

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

83
      def add_error(message:)
1✔
84
        error = Array.wrap(@dump.event.error)
8✔
85
        error << message
8✔
86
        @dump.event.error = error.join("; ")
8✔
87
        @dump.event.save
8✔
88
      end
89

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

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

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

111
      def date_strings
1✔
112
        @dump.dump_files.map do |df|
8✔
113
          if df.dump_file_type == "recap_records_full_metadata"
32✔
114
            File.basename(df.path).split("_")[3]
10✔
115
          else
116
            File.basename(df.path).split("_")[2]
22✔
117
          end
118
        end
119
      end
120

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