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

pulibrary / bibdata / 1dcebae2-3318-4e77-bc53-82276e293354

02 May 2025 04:45PM UTC coverage: 28.256% (-63.9%) from 92.189%
1dcebae2-3318-4e77-bc53-82276e293354

push

circleci

sandbergja
Add basic infrastructure for compiling rust code

* Add a rake compile task to compile
* Run the rake task in CI
* Run the rake task before rspec tests with the rust tag, to provide quick feedback on rust changes in TDD cycles

2 of 7 new or added lines in 2 files covered. (28.57%)

2467 existing lines in 97 files now uncovered.

1089 of 3854 relevant lines covered (28.26%)

0.29 hits per line

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

41.54
/app/jobs/import/alma.rb
1
require 'net/sftp'
1✔
2

3
module Import
1✔
4
  class Alma
1✔
5
    # Downloads the files from the sftp server and attaches them to Event, Dump,
6
    # DumpFile objects. Kicks off further processing if necessary
7
    include Sidekiq::Job
1✔
8
    queue_as :default
1✔
9
    attr_reader :dump_file_type
1✔
10

11
    def perform(dump_id, job_id)
1✔
UNCOV
12
      dump = Dump.find(dump_id)
×
UNCOV
13
      @dump_file_type = find_dump_file_type(dump)
×
UNCOV
14
      AlmaDownloader.files_for(job_id:, dump_file_type:).each do |file|
×
UNCOV
15
        dump.dump_files << file
×
16
      end
17

UNCOV
18
      dump.save
×
19

UNCOV
20
      IndexManager.for(Rails.application.config.solr['url']).index_remaining! if incremental_dump?
×
21
    end
22

23
    def incremental_dump?
1✔
UNCOV
24
      dump_file_type == :updated_records
×
25
    end
26

27
    def find_dump_file_type(dump)
1✔
UNCOV
28
      job_config = find_job_configuration(dump:)
×
UNCOV
29
      job_config['dump_file_type'].downcase.to_sym
×
30
    end
31

32
    class AlmaDownloader
1✔
33
      def self.files_for(job_id:, dump_file_type:)
1✔
UNCOV
34
        new(job_id:, dump_file_type:).files_for
×
35
      end
36

37
      attr_reader :job_id, :dump_file_type
1✔
38

39
      def initialize(job_id:, dump_file_type:)
1✔
UNCOV
40
        @job_id = job_id
×
UNCOV
41
        @dump_file_type = dump_file_type
×
42
      end
43

44
      def files_for
1✔
UNCOV
45
        dump_files = []
×
UNCOV
46
        Net::SFTP.start(sftp_host, sftp_username, password: sftp_password) do |sftp|
×
UNCOV
47
          downloads = []
×
UNCOV
48
          remote_paths(sftp_session: sftp).each do |remote_path|
×
UNCOV
49
            df = DumpFile.create(dump_file_type:, path: dump_file_path(remote_path))
×
UNCOV
50
            dump_files << df
×
UNCOV
51
            download = transfer_file(sftp_session: sftp, remote_path:, local_path: df.path)
×
UNCOV
52
            downloads << download
×
53
          end
54

55
          # wait for all asynchronous downloads to complete before closing sftp
56
          # session
UNCOV
57
          downloads.each(&:wait)
×
58
        end
59

UNCOV
60
        dump_files
×
61
      end
62

63
      # look to sftp server and identify the desired files using job_id
64
      def remote_paths(sftp_session:)
1✔
UNCOV
65
        sftp_session.dir.entries(remote_base_path).select { |entry| parse_job_id(entry.name) == job_id }.map { |entry| File.join(remote_base_path, entry.name) }
×
66
      end
67

68
      def remote_base_path
1✔
UNCOV
69
        Rails.configuration.alma['sftp_alma_base_path']
×
70
      end
71

72
      def dump_file_path(remote_path)
1✔
UNCOV
73
        File.join(MARC_LIBERATION_CONFIG['data_dir'], File.basename(remote_path))
×
74
      end
75

76
      # By default alma puts the timestamp before the job_id in filenames, and the
77
      #   default timestamp used differed from the documented timestamp
78
      #
79
      # So we configured the job_id to come before the timestamp to
80
      # protect against future variation in the timestamp format.
81
      # configured form is:
82
      # fulldump_<job ID>_<time stamp>_<new or update or delete>_<counter>.xml.tar.gz
83
      #
84
      # documentation is at
85
      # https://knowledge.exlibrisgroup.com/Alma/Product_Documentation/010Alma_Online_Help_(English)/090Integrations_with_External_Systems/030Resource_Management/080Publishing_and_Inventory_Enrichment#File_name
86
      def parse_job_id(name)
1✔
UNCOV
87
        name.split('_')[1]
×
88
      end
89

90
      # Do the actual download from the sftp server
91
      def transfer_file(sftp_session:, remote_path:, local_path:)
1✔
UNCOV
92
        File.truncate(local_path, 0) if File.exist?(local_path)
×
UNCOV
93
        sftp_session.download(remote_path, local_path)
×
94
      end
95

96
      def sftp_options
1✔
97
        {
98
          username: sftp_username,
×
99
          password: sftp_password,
100
          passive: true,
101
          ssl: true
102
        }
103
      end
104

105
      def sftp_username
1✔
UNCOV
106
        Rails.configuration.alma['sftp_username']
×
107
      end
108

109
      def sftp_password
1✔
UNCOV
110
        Rails.configuration.alma['sftp_password']
×
111
      end
112

113
      def sftp_host
1✔
UNCOV
114
        Rails.configuration.alma['sftp_host']
×
115
      end
116
    end
117

118
    private
1✔
119

120
      def event_message(dump:)
1✔
UNCOV
121
        event = dump.event
×
UNCOV
122
        return {} if event.nil?
×
123

UNCOV
124
        JSON.parse(event.message_body)
×
125
      end
126

127
      def jobs_configuration
1✔
UNCOV
128
        Rails.configuration.alma[:jobs] || {}
×
129
      end
130

131
      def find_job_configuration(dump:)
1✔
UNCOV
132
        job_name = event_message(dump:).dig('job_instance', 'name')
×
133

UNCOV
134
        jobs_configuration[job_name] || {}
×
135
      end
136
  end
137
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