Method: Atomos.atomic_write

Defined in:
lib/atomos.rb

.atomic_write(dest, contents = nil, tmpdir: nil, &block) ⇒ Object

rubocop:disable Metrics/MethodLength



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/atomos.rb', line 9

def atomic_write(dest, contents = nil, tmpdir: nil, &block)
  unless contents.nil? ^ block.nil?
    raise ArgumentError, 'must provide either contents or a block'
  end

  tmpdir = Atomos.default_tmpdir_for_file(dest, tmpdir)

  require 'tempfile'
  Tempfile.open(".atomos.#{File.basename(dest)}", tmpdir) do |tmpfile|
    if contents
      tmpfile << contents
    else
      retval = yield tmpfile
    end

    tmpfile.close

    File.rename(tmpfile.path, dest)

    retval
  end
end