ruby-changes:22620
From: tenderlove <ko1@a...>
Date: Sat, 18 Feb 2012 03:00:50 +0900 (JST)
Subject: [ruby-changes:22620] tenderlove:r34669 (trunk): * lib/fileutils.rb: refactored FileUtil methods to use the
tenderlove 2012-02-18 02:59:47 +0900 (Sat, 18 Feb 2012) New Revision: 34669 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=34669 Log: * lib/fileutils.rb: refactored FileUtil methods to use the `define_command` API. Patch from 7rans <transfire@g...> * test/fileutils/test_dryrun.rb: corresponding test refactoring * test/fileutils/test_nowrite.rb: ditto * test/fileutils/test_verbose.rb: ditto Modified files: trunk/ChangeLog trunk/lib/fileutils.rb trunk/test/fileutils/test_dryrun.rb trunk/test/fileutils/test_nowrite.rb trunk/test/fileutils/test_verbose.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 34668) +++ ChangeLog (revision 34669) @@ -1,3 +1,11 @@ +Sat Feb 18 02:48:39 2012 Aaron Patterson <aaron@t...> + + * lib/fileutils.rb: refactored FileUtil methods to use the + `define_command` API. Patch from 7rans <transfire@g...> + * test/fileutils/test_dryrun.rb: corresponding test refactoring + * test/fileutils/test_nowrite.rb: ditto + * test/fileutils/test_verbose.rb: ditto + Fri Feb 17 21:39:36 2012 Tanaka Akira <akr@f...> * ext/dbm/extconf.rb: remove dbm. Index: lib/fileutils.rb =================================================================== --- lib/fileutils.rb (revision 34668) +++ lib/fileutils.rb (revision 34669) @@ -83,16 +83,96 @@ # module FileUtils + @fileutils_output = $stderr + @fileutils_label = '' + extend self - def self.private_module_function(name) #:nodoc: - module_function name - private_class_method name + # + # This module has all methods of FileUtils module, but it outputs messages + # before acting. This equates to passing the <tt>:verbose</tt> flag to + # methods in FileUtils. + # + module Verbose + include FileUtils + @fileutils_output = $stderr + @fileutils_label = '' + extend self end + # + # This module has all methods of FileUtils module, but never changes + # files/directories. This equates to passing the <tt>:noop</tt> flag + # to methods in FileUtils. + # + module NoWrite + include FileUtils + @fileutils_output = $stderr + @fileutils_label = '' + extend self + end + + # + # This module has all methods of FileUtils module, but never changes + # files/directories, with printing message before acting. + # This equates to passing the <tt>:noop</tt> and <tt>:verbose</tt> flag + # to methods in FileUtils. + # + module DryRun + include FileUtils + @fileutils_output = $stderr + @fileutils_label = '' + extend self + end + # This hash table holds command options. OPT_TABLE = {} #:nodoc: internal use only # + def self.define_command(name, *options) + OPT_TABLE[name.to_s] = options + + if options.include?(:verbose) + Verbose.module_eval(<<-EOS, __FILE__, __LINE__ + 1) + def #{name}(*args) + super(*fu_update_option(args, :verbose => true)) + end + EOS + end + if options.include?(:noop) + NoWrite.module_eval(<<-EOS, __FILE__, __LINE__ + 1) + def #{name}(*args) + super(*fu_update_option(args, :noop => true)) + end + EOS + DryRun.module_eval(<<-EOS, __FILE__, __LINE__ + 1) + def #{name}(*args) + super(*fu_update_option(args, :noop => true, :verbose => true)) + end + EOS + else + NoWrite.module_eval(<<-EOS, __FILE__, __LINE__ + 1) + def #{name}(*); end + EOS + DryRun.module_eval(<<-EOS, __FILE__, __LINE__ + 1) + def #{name}(*); end + EOS + end + + [self, Verbose, DryRun, NoWrite].each do |mod| + mod.module_eval(<<-EOS, __FILE__, __LINE__ + 1) + private :#{name} + class << self; public :#{name}; end + EOS + end + end + + class << self + private :define_command + end + +public + + # # Options: (none) # # Returns the name of the current directory. @@ -100,11 +180,12 @@ def pwd Dir.pwd end - module_function :pwd alias getwd pwd - module_function :getwd + define_command('pwd') + define_command('getwd') + # # Options: verbose # @@ -125,13 +206,11 @@ Dir.chdir(dir, &block) fu_output_message 'cd -' if options[:verbose] and block end - module_function :cd alias chdir cd - module_function :chdir - OPT_TABLE['cd'] = - OPT_TABLE['chdir'] = [:verbose] + define_command('cd', :verbose) + define_command('chdir', :verbose) # # Options: (none) @@ -154,8 +233,9 @@ end true end - module_function :uptodate? + define_command('uptodate?') + # # Options: mode noop verbose # @@ -176,9 +256,8 @@ fu_mkdir dir, options[:mode] end end - module_function :mkdir - OPT_TABLE['mkdir'] = [:mode, :noop, :verbose] + define_command('mkdir', :mode, :noop, :verbose) # # Options: mode noop verbose @@ -227,17 +306,16 @@ return *list end - module_function :mkdir_p alias mkpath mkdir_p alias makedirs mkdir_p - module_function :mkpath - module_function :makedirs - OPT_TABLE['mkdir_p'] = - OPT_TABLE['mkpath'] = - OPT_TABLE['makedirs'] = [:mode, :noop, :verbose] + define_command('mkdir_p', :mode, :noop, :verbose) + define_command('mkpath', :mode, :noop, :verbose) + define_command('makedirs', :mode, :noop, :verbose) +private + def fu_mkdir(path, mode) #:nodoc: path = path.sub(%r</\z>, '') if mode @@ -247,8 +325,9 @@ Dir.mkdir path end end - private_module_function :fu_mkdir +public + # # Options: noop, verbose # @@ -277,9 +356,8 @@ end end end - module_function :rmdir - OPT_TABLE['rmdir'] = [:parents, :noop, :verbose] + define_command('rmdir', :parents, :noop, :verbose) # # Options: force noop verbose @@ -312,13 +390,11 @@ File.link s, d end end - module_function :ln alias link ln - module_function :link - OPT_TABLE['ln'] = - OPT_TABLE['link'] = [:force, :noop, :verbose] + define_command('ln', :force, :noop, :verbose) + define_command('link', :force, :noop, :verbose) # # Options: force noop verbose @@ -351,13 +427,11 @@ File.symlink s, d end end - module_function :ln_s alias symlink ln_s - module_function :symlink - OPT_TABLE['ln_s'] = - OPT_TABLE['symlink'] = [:force, :noop, :verbose] + define_command('ln_s', :force, :noop, :verbose) + define_command('symlink', :force, :noop, :verbose) # # Options: noop verbose @@ -371,9 +445,8 @@ options[:force] = true ln_s src, dest, options end - module_function :ln_sf - OPT_TABLE['ln_sf'] = [:noop, :verbose] + define_command('ln_sf', :noop, :verbose) # # Options: preserve noop verbose @@ -396,13 +469,11 @@ copy_file s, d, options[:preserve] end end - module_function :cp alias copy cp - module_function :copy - OPT_TABLE['cp'] = - OPT_TABLE['copy'] = [:preserve, :noop, :verbose] + define_command('cp', :preserve, :noop, :verbose) + define_command('copy', :preserve, :noop, :verbose) # # Options: preserve noop verbose dereference_root remove_destination @@ -437,10 +508,8 @@ copy_entry s, d, options[:preserve], options[:dereference_root], options[:remove_destination] end end - module_function :cp_r - OPT_TABLE['cp_r'] = [:preserve, :noop, :verbose, - :dereference_root, :remove_destination] + define_command('cp_r', :preserve, :noop, :verbose, :dereference_root, :remove_destination) # # Copies a file system entry +src+ to +dest+. @@ -466,8 +535,9 @@ ent.copy_metadata destent.path if preserve end end - module_function :copy_entry + define_command(:copy_entry) + # # Copies file contents of +src+ to +dest+. # Both of +src+ and +dest+ must be a path name. @@ -477,8 +547,9 @@ ent.copy_file dest ent.copy_metadata dest if preserve end - module_function :copy_file + define_command(:copy_file) + # # Copies stream +src+ to +dest+. # +src+ must respond to #read(n) and @@ -487,8 +558,9 @@ def copy_stream(src, dest) IO.copy_stream(src, dest) end - module_function :copy_stream + define_command(:copy_stream) + # # Options: force noop verbose # @@ -530,19 +602,20 @@ end end end - module_function :mv alias move mv - module_function :move - OPT_TABLE['mv'] = - OPT_TABLE['move'] = [:force, :noop, :verbose, :secure] + define_command('mv', :force, :noop, :verbose, :secure) + define_command('move', :force, :noop, :verbose, :secure) +private + def rename_cannot_overwrite_file? #:nodoc: /cygwin|mswin|mingw|bccwin|emx/ =~ RUBY_PLATFORM end - private_module_function :rename_cannot_overwrite_file? +public + # # Options: force noop verbose # @@ -563,13 +636,11 @@ remove_file path, options[:force] end end - module_function :rm alias remove rm - module_function :remove - OPT_TABLE['rm'] = - OPT_TABLE['remove'] = [:force, :noop, :verbose] + define_command('rm', :force, :noop, :verbose) + define_command('remove', :force, :noop, :verbose) # # Options: noop verbose @@ -584,13 +655,11 @@ options[:force] = true rm list, options end - module_function :rm_f alias safe_unlink rm_f - module_function :safe_unlink - OPT_TABLE['rm_f'] = - OPT_TABLE['safe_unlink'] = [:noop, :verbose] + define_command('rm_f', :noop, :verbose) + define_command('safe_unlink', :noop, :verbose) # # Options: force noop verbose secure @@ -627,9 +696,8 @@ end end end - module_function :rm_r - OPT_TABLE['rm_r'] = [:force, :noop, :verbose, :secure] + define_command('rm_r', :force, :noop, :verbose, :secure) # # Options: noop verbose secure @@ -647,13 +715,11 @@ options[:force] = true rm_r list, options end - module_function :rm_rf alias rmtree rm_rf - module_function :rmtree - OPT_TABLE['rm_rf'] = - OPT_TABLE['rmtree'] = [:noop, :verbose, :secure] + define_command('rm_rf', :noop, :verbose, :secure) + define_command('rmtree', :noop, :verbose, :secure) # # This method removes a file system entry +path+. +path+ shall be a @@ -741,8 +807,11 @@ rescue raise unless force end - module_function :remove_entry_secure + define_command(:remove_entry_secure) + +private + def fu_have_symlink? #:nodoc: File.symlink nil, nil rescue NotImplementedError @@ -750,13 +819,13 @@ rescue return true end - private_module_function :fu_have_symlink? def fu_stat_identical_entry?(a, b) #:nodoc: a.dev == b.dev and a.ino == b.ino end - private_module_function :fu_stat_identical_entry? +public + # # This method removes a file system entry +path+. # +path+ might be a regular file, a directory, or something. @@ -775,8 +844,9 @@ rescue raise unless force end - module_function :remove_entry + define_command(:remove_entry) + # # Removes a file +path+. # This method ignores StandardError if +force+ is true. @@ -786,8 +856,9 @@ rescue raise unless force end - module_function :remove_file + define_command(:remove_file) + # # Removes a directory +dir+ and its contents recursively. # This method ignores StandardError if +force+ is true. @@ -795,8 +866,9 @@ def remove_dir(path, force = false) remove_entry path, force # FIXME?? check if it is a directory end - module_function :remove_dir + define_command(:remove_dir) + # # Returns true if the contents of a file A and a file B are identical. # @@ -811,29 +883,34 @@ } } end - module_function :compare_file alias identical? compare_file alias cmp compare_file - module_function :identical? - module_function :cmp + define_command(:compare_file) + define_command(:identical?) + define_command(:cmp) + # # Returns true if the contents of a stream +a+ and +b+ are identical. # def compare_stream(a, b) bsize = fu_stream_blksize(a, b) - sa = "" - sb = "" - begin - a.read(bsize, sa) - b.read(bsize, sb) - return true if sa.empty? && sb.empty? - end while sa == sb + sa = sb = nil + while sa == sb + sa = a.read(bsize) + sb = b.read(bsize) + unless sa and sb + if sa.nil? and sb.nil? + return true + end + end + end false end - module_function :compare_stream + define_command(:compare_stream) + # # Options: mode preserve noop verbose # @@ -857,10 +934,11 @@ end end end - module_function :install - OPT_TABLE['install'] = [:mode, :preserve, :noop, :verbose] + define_command('install', :mode, :preserve, :noop, :verbose) +private + def user_mask(target) #:nodoc: mask = 0 target.each_byte do |byte_chr| @@ -877,7 +955,6 @@ end mask end - private_module_function :user_mask def mode_mask(mode, path) #:nodoc: mask = 0 @@ -899,7 +976,6 @@ end mask end - private_module_function :mode_mask def symbolic_modes_to_i(modes, path) #:nodoc: current_mode = (File.stat(path).mode & 07777) @@ -920,13 +996,13 @@ end end end - private_module_function :symbolic_modes_to_i def fu_mode(mode, path) #:nodoc: mode.is_a?(String) ? symbolic_modes_to_i(mode, path) : mode end - private_module_function :fu_mode +public + # # Options: noop verbose # @@ -967,9 +1043,8 @@ Entry_.new(path).chmod(fu_mode(mode, path)) end end - module_function :chmod - OPT_TABLE['chmod'] = [:noop, :verbose] + define_command('chmod', :noop, :verbose) # # Options: noop verbose force @@ -997,9 +1072,8 @@ end end end - module_function :chmod_R - OPT_TABLE['chmod_R'] = [:noop, :verbose, :force] + define_command('chmod_R', :noop, :verbose, :force) # # Options: noop verbose @@ -1026,9 +1100,8 @@ Entry_.new(path).chown uid, gid end end - module_function :chown - OPT_TABLE['chown'] = [:noop, :verbose] + define_command('chown', :noop, :verbose) # # Options: noop verbose force @@ -1063,10 +1136,11 @@ end end end - module_function :chown_R - OPT_TABLE['chown_R'] = [:noop, :verbose, :force] + define_command('chown_R', :noop, :verbose, :force) +private + begin require 'etc' @@ -1081,7 +1155,6 @@ Etc.getpwnam(user).uid end end - private_module_function :fu_get_uid def fu_get_gid(group) #:nodoc: return nil unless group @@ -1094,7 +1167,6 @@ Etc.getgrnam(group).gid end end - private_module_function :fu_get_gid rescue LoadError # need Win32 support??? @@ -1102,14 +1174,14 @@ def fu_get_uid(user) #:nodoc: user # FIXME end - private_module_function :fu_get_uid def fu_get_gid(group) #:nodoc: group # FIXME end - private_module_function :fu_get_gid end +public + # # Options: noop verbose # @@ -1142,11 +1214,10 @@ end end end - module_function :touch - OPT_TABLE['touch'] = [:noop, :verbose, :mtime, :nocreate] + define_command('touch', :noop, :verbose, :mtime, :nocreate) - private +private module StreamUtils_ private @@ -1271,7 +1342,7 @@ def entries opts = {} - opts[:encoding] = ::Encoding::UTF_8 if fu_windows? + opts[:encoding] = "UTF-8" if /mswin|mignw/ =~ RUBY_PLATFORM Dir.entries(path(), opts)\ .reject {|n| n == '.' or n == '..' }\ .map {|n| Entry_.new(prefix(), join(rel(), n.untaint)) } @@ -1445,7 +1516,7 @@ yield self end - private + private $fileutils_rb_have_lchmod = nil @@ -1501,10 +1572,11 @@ end end # class Entry_ +private + def fu_list(arg) #:nodoc: [arg].flatten.map {|path| File.path(path) } end - private_module_function :fu_list def fu_each_src_dest(src, dest) #:nodoc: fu_each_src_dest0(src, dest) do |s, d| @@ -1512,7 +1584,6 @@ yield s, d, File.stat(s) end end - private_module_function :fu_each_src_dest def fu_each_src_dest0(src, dest) #:nodoc: if tmp = Array.try_convert(src) @@ -1529,12 +1600,10 @@ end end end - private_module_function :fu_each_src_dest0 def fu_same?(a, b) #:nodoc: File.identical?(a, b) end - private_module_function :fu_same? def fu_check_options(options, optdecl) #:nodoc: h = options.dup @@ -1543,7 +1612,6 @@ end raise ArgumentError, "no such option: #{h.keys.join(' ')}" unless h.empty? end - private_module_function :fu_check_options def fu_update_option(args, new) #:nodoc: if tmp = Hash.try_convert(args.last) @@ -1553,17 +1621,12 @@ end args end - private_module_function :fu_update_option - @fileutils_output = $stderr - @fileutils_label = '' - def fu_output_message(msg) #:nodoc: @fileutils_output ||= $stderr @fileutils_label ||= '' @fileutils_output.puts @fileutils_label + msg end - private_module_function :fu_output_message # # Returns an Array of method names which have any options. @@ -1613,91 +1676,27 @@ OPT_TABLE.keys.select {|m| OPT_TABLE[m].include?(opt) } end - LOW_METHODS = singleton_methods(false) - collect_method(:noop).map(&:intern) - module LowMethods - module_eval("private\n" + ::FileUtils::LOW_METHODS.map {|name| "def #{name}(*)end"}.join("\n"), - __FILE__, __LINE__) - end - - METHODS = singleton_methods() - [:private_module_function, - :commands, :options, :have_option?, :options_of, :collect_method] - + # LOW_METHODS # - # This module has all methods of FileUtils module, but it outputs messages - # before acting. This equates to passing the <tt>:verbose</tt> flag to - # methods in FileUtils. + # :pwd, :getwd, :cd, :chdir, + # :uptodate?, :copy_entry, :copy_file, :copy_stream, :remove_entry_secure, + # :remove_entry, :remove_file, :remove_dir, :compare_file, :identical?, + # :cmp, :compare_stream # - module Verbose - include FileUtils - @fileutils_output = $stderr - @fileutils_label = '' - ::FileUtils.collect_method(:verbose).each do |name| - module_eval(<<-EOS, __FILE__, __LINE__ + 1) - def #{name}(*args) - super(*fu_update_option(args, :verbose => true)) - end - private :#{name} - EOS - end - extend self - class << self - ::FileUtils::METHODS.each do |m| - public m - end - end - end + # DEPRECATED - Only here for backward compatibility. + LOW_METHODS = (commands - collect_method(:noop)).map(&:to_sym) - # - # This module has all methods of FileUtils module, but never changes - # files/directories. This equates to passing the <tt>:noop</tt> flag - # to methods in FileUtils. - # - module NoWrite - include FileUtils - include LowMethods - @fileutils_output = $stderr - @fileutils_label = '' - ::FileUtils.collect_method(:noop).each do |name| - module_eval(<<-EOS, __FILE__, __LINE__ + 1) - def #{name}(*args) - super(*fu_update_option(args, :noop => true)) - end - private :#{name} - EOS - end - extend self - class << self - ::FileUtils::METHODS.each do |m| - public m - end - end - end + # METHODS # - # This module has all methods of FileUtils module, but never changes - # files/directories, with printing message before acting. - # This equates to passing the <tt>:noop</tt> and <tt>:verbose</tt> flag - # to methods in FileUtils. + # :pwd, :getwd, :cd, :chdir, :uptodate?, :mkdir, :mkdir_p, :mkpath, :makedirs, + # :rmdir, :ln, :link, :ln_s, :symlink, :ln_sf, :cp, :copy, :cp_r, :copy_entry, + # :copy_file, :copy_stream, :mv, :move, :rm, :remove, :rm_f, :safe_unlink, + # :rm_r, :rm_rf, :rmtree, :remove_entry_secure, :remove_entry, :remove_file, + # :remove_dir, :compare_file, :identical?, :cmp, :compare_stream, :install, + # :chmod, :chmod_R, :chown, :chown_R, :touch # - module DryRun - include FileUtils - include LowMethods - @fileutils_output = $stderr - @fileutils_label = '' - ::FileUtils.collect_method(:noop).each do |name| - module_eval(<<-EOS, __FILE__, __LINE__ + 1) - def #{name}(*args) - super(*fu_update_option(args, :noop => true, :verbose => true)) - end - private :#{name} - EOS - end - extend self - cl (... truncated) -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/