This page contains automated test results for code from O'Reilly's Ruby Cookbook. If this code looks interesting or useful, you might want to buy the whole book.
Backing Up to Versioned Filenames | ||
---|---|---|
Code | Expected | Actual |
class File def File.versioned_filename(base, first_suffix='.0') suffix = nil filename = base while File.exists?(filename) suffix = (suffix ? suffix.succ : first_suffix) filename = base + suffix end return filename end end 5.times do |i| name = File.versioned_filename('filename.txt') open(name, 'w') { |f| f << "Contents for run #{i}" } puts "Created #{name}" end |
Created filename.txt Created filename.txt.0 Created filename.txt.1 Created filename.txt.2 Created filename.txt.3 |
Created filename.txt Created filename.txt.0 Created filename.txt.1 Created filename.txt.2 Created filename.txt.3 |
require 'ftools' class File def File.to_backup(filename, move=false) new_filename = nil if File.exists? filename new_filename = File.versioned_filename(filename) File.send(move ? :move : :copy, filename, new_filename) end return new_filename end end File.to_backup('filename.txt') |
"filename.txt.4" | "filename.txt.4" |
File.to_backup('filename.txt') |
"filename.txt.5" | "filename.txt.5" |
File.to_backup('filename.txt', true) |
"filename.txt.6" | "filename.txt.6" |
File.exists? 'filename.txt' |
false | false |
File.to_backup('filename.txt') |
nil | nil |
200.times do |i| name = File.versioned_filename('many_versions.txt', '.000') open(name, 'w') { |f| f << "Contents for run #{i}" } puts "Created #{name}" end |
Created many_versions.txt Created many_versions.txt.000 Created many_versions.txt.001 ... Created many_versions.txt.197 Created many_versions.txt.198 |
Created many_versions.txt Created many_versions.txt.000 Created many_versions.txt.001 Created many_versions.txt.002 Created many_versions.txt.003 Created many_versions.txt.004 Created many_versions.txt.005 Created many_versions.txt.006 Created many_versions.txt.007 Created many_versions.txt.008 Created many_versions.txt.009 Created many_versions.txt.010 Created many_versions.txt.011 Created many_versions.txt.012 Created many_versions.txt.013 Created many_versions.txt.014 Created many_versions.txt.015 Created many_versions.txt.016 Created many_versions.txt.017 Created many_versions.txt.018 Created many_versions.txt.019 Created many_versions.txt.020 Created many_versions.txt.021 Created many_versions.txt.022 Created many_versions.txt.023 Created many_versions.txt.024 Created many_versions.txt.025 Created many_versions.txt.026 Created many_versions.txt.027 Created many_versions.txt.028 Created many_versions.txt.029 Created many_versions.txt.030 Created many_versions.txt.031 Created many_versions.txt.032 Created many_versions.txt.033 Created many_versions.txt.034 Created many_versions.txt.035 Created many_versions.txt.036 Created many_versions.txt.037 Created many_versions.txt.038 Created many_versions.txt.039 Created many_versions.txt.040 Created many_versions.txt.041 Created many_versions.txt.042 Created many_versions.txt.043 Created many_versions.txt.044 Created many_versions.txt.045 Created many_versions.txt.046 Created many_versions.txt.047 Created many_versions.txt.048 Created many_versions.txt.049 Created many_versions.txt.050 Created many_versions.txt.051 Created many_versions.txt.052 Created many_versions.txt.053 Created many_versions.txt.054 Created many_versions.txt.055 Created many_versions.txt.056 Created many_versions.txt.057 Created many_versions.txt.058 Created many_versions.txt.059 Created many_versions.txt.060 Created many_versions.txt.061 Created many_versions.txt.062 Created many_versions.txt.063 Created many_versions.txt.064 Created many_versions.txt.065 Created many_versions.txt.066 Created many_versions.txt.067 Created many_versions.txt.068 Created many_versions.txt.069 Created many_versions.txt.070 Created many_versions.txt.071 Created many_versions.txt.072 Created many_versions.txt.073 Created many_versions.txt.074 Created many_versions.txt.075 Created many_versions.txt.076 Created many_versions.txt.077 Created many_versions.txt.078 Created many_versions.txt.079 Created many_versions.txt.080 Created many_versions.txt.081 Created many_versions.txt.082 Created many_versions.txt.083 Created many_versions.txt.084 Created many_versions.txt.085 Created many_versions.txt.086 Created many_versions.txt.087 Created many_versions.txt.088 Created many_versions.txt.089 Created many_versions.txt.090 Created many_versions.txt.091 Created many_versions.txt.092 Created many_versions.txt.093 Created many_versions.txt.094 Created many_versions.txt.095 Created many_versions.txt.096 Created many_versions.txt.097 Created many_versions.txt.098 Created many_versions.txt.099 Created many_versions.txt.100 Created many_versions.txt.101 Created many_versions.txt.102 Created many_versions.txt.103 Created many_versions.txt.104 Created many_versions.txt.105 Created many_versions.txt.106 Created many_versions.txt.107 Created many_versions.txt.108 Created many_versions.txt.109 Created many_versions.txt.110 Created many_versions.txt.111 Created many_versions.txt.112 Created many_versions.txt.113 Created many_versions.txt.114 Created many_versions.txt.115 Created many_versions.txt.116 Created many_versions.txt.117 Created many_versions.txt.118 Created many_versions.txt.119 Created many_versions.txt.120 Created many_versions.txt.121 Created many_versions.txt.122 Created many_versions.txt.123 Created many_versions.txt.124 Created many_versions.txt.125 Created many_versions.txt.126 Created many_versions.txt.127 Created many_versions.txt.128 Created many_versions.txt.129 Created many_versions.txt.130 Created many_versions.txt.131 Created many_versions.txt.132 Created many_versions.txt.133 Created many_versions.txt.134 Created many_versions.txt.135 Created many_versions.txt.136 Created many_versions.txt.137 Created many_versions.txt.138 Created many_versions.txt.139 Created many_versions.txt.140 Created many_versions.txt.141 Created many_versions.txt.142 Created many_versions.txt.143 Created many_versions.txt.144 Created many_versions.txt.145 Created many_versions.txt.146 Created many_versions.txt.147 Created many_versions.txt.148 Created many_versions.txt.149 Created many_versions.txt.150 Created many_versions.txt.151 Created many_versions.txt.152 Created many_versions.txt.153 Created many_versions.txt.154 Created many_versions.txt.155 Created many_versions.txt.156 Created many_versions.txt.157 Created many_versions.txt.158 Created many_versions.txt.159 Created many_versions.txt.160 Created many_versions.txt.161 Created many_versions.txt.162 Created many_versions.txt.163 Created many_versions.txt.164 Created many_versions.txt.165 Created many_versions.txt.166 Created many_versions.txt.167 Created many_versions.txt.168 Created many_versions.txt.169 Created many_versions.txt.170 Created many_versions.txt.171 Created many_versions.txt.172 Created many_versions.txt.173 Created many_versions.txt.174 Created many_versions.txt.175 Created many_versions.txt.176 Created many_versions.txt.177 Created many_versions.txt.178 Created many_versions.txt.179 Created many_versions.txt.180 Created many_versions.txt.181 Created many_versions.txt.182 Created many_versions.txt.183 Created many_versions.txt.184 Created many_versions.txt.185 Created many_versions.txt.186 Created many_versions.txt.187 Created many_versions.txt.188 Created many_versions.txt.189 Created many_versions.txt.190 Created many_versions.txt.191 Created many_versions.txt.192 Created many_versions.txt.193 Created many_versions.txt.194 Created many_versions.txt.195 Created many_versions.txt.196 Created many_versions.txt.197 Created many_versions.txt.198 |
class File def File.versioned_file(base, first_suffix='.0', access_mode='w') suffix = file = locked = nil filename = base begin suffix = (suffix ? suffix.succ : first_suffix) filename = base + suffix unless File.exists? filename file = open(filename, access_mode) locked = file.flock(File::LOCK_EX | File::LOCK_NB) file.close unless locked end end until locked return file end end File.versioned_file('contested_file') |
#<File:contested_file.0> | #<File:contested_file.0> |
File.versioned_file('contested_file') |
#<File:contested_file.1> | #<File:contested_file.1> |
File.versioned_file('contested_file') |
#<File:contested_file.2> | #<File:contested_file.2> |