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

pulibrary / pdc_describe / 3453062d-fc36-4443-940d-ef7f6c0aac17

09 Sep 2025 06:51PM UTC coverage: 95.463% (-0.05%) from 95.512%
3453062d-fc36-4443-940d-ef7f6c0aac17

push

circleci

web-flow
Allow diacritics in file names (#2158)

8 of 10 new or added lines in 3 files covered. (80.0%)

3535 of 3703 relevant lines covered (95.46%)

396.93 hits per line

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

93.75
/app/services/s3_move_service.rb
1
# frozen_string_literal: true
2

3
class S3MoveService
2✔
4
  attr_reader :source_bucket, :source_key, :target_bucket, :target_key, :size, :service, :copy_source
2✔
5

6
  def initialize(work_id:, source_bucket:, source_key:, target_bucket:, target_key:, size:)
2✔
7
    @copy_source = [source_bucket, source_key].join("/")
22✔
8
    @source_key = source_key
22✔
9
    @source_bucket = source_bucket
22✔
10
    @target_bucket = target_bucket
22✔
11
    @target_key = target_key
22✔
12
    @size = size
22✔
13
    @service = S3QueryService.new(Work.find(work_id), bucket_name: source_bucket)
22✔
14
  end
15

16
  def move
2✔
17
    etag = copy_file # will raise exception if there is an error
22✔
18
    check_file # will raise exception if there is an error
18✔
19
    service.delete_s3_object(source_key, bucket: source_bucket)
12✔
20
    etag
12✔
21
  end
22

23
  private
2✔
24

25
    def copy_file
2✔
26
      resp = service.copy_file(source_key: copy_source, target_bucket:, target_key:, size:)
22✔
27
      unless resp.successful?
20✔
28
        raise "Error copying #{copy_source} to #{target_bucket}/#{target_key} Response #{resp.to_json}"
2✔
29
      end
30
      etag(resp)
18✔
31
    rescue Aws::S3::Errors::NoSuchKey => error
32
      if service.check_file(bucket: target_bucket, key: target_key)
2✔
NEW
33
        Rails.logger.warn("Trying to move a file that was already moved... #{copy_source} can not copy to #{target_bucket}/#{target_key}")
×
34
      else
35
        raise "Missing source file #{copy_source} can not copy to #{target_bucket}/#{target_key} Error: #{error}"
2✔
36
      end
37
    end
38

39
    def check_file
2✔
40
      status = service.check_file(bucket: target_bucket, key: target_key)
18✔
41
      unless status
18✔
42
        raise "File check was not valid #{copy_source} to #{target_bucket}/#{target_key} Response #{status.to_json}"
6✔
43
      end
44
    end
45

46
    def etag(resp)
2✔
47
      if resp.respond_to? :copy_object_result
18✔
48
        resp.copy_object_result.etag
18✔
49
      else
50
        resp.etag
×
51
      end.delete('"')
52
    end
53
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