From: "James B. Byrne" Date: 2006-02-18T06:15:06+09:00 Subject: Re: Ruby script to Module/Class refactor This class seems to provide all but one element of the functionality that I was seeking. I would very much appreciate a critique how it varies from OOP ideals and how those weaknesses should be corrected. I would also like a few pointers on how I would go about using Test::Unit and Fixtures to test drive this class. There appears to be something wrong with either my appreciation of how Syslog is supposed to work, with its implementation, or with how I understand class variables are preserved. The problem is that given these three lines: test1 = Mv2Dir.new("./").log test2 = Mv2Dir.new("./").log test1 = Mv2Dir.new("./").log The third line that reassigns a new instance of Mv2Dir to test1 results in @@logid being treated as nil in .log and the subsequent @@logid.info calls fail. However, when I test for @@logid == nil and open syslog when true then the third line fails with the error that syslog is already opened. There seems to be a problem with Mv2Dir and Syslog when a particular object name is reused. I cannot see what the problem is though. Can anyone provide me with some ideas? #------------------------------------------------------------------------------ class Mv2Dir require 'fileutils' require 'syslog' attr_reader :path, :message def get(sourcedir,globspec,ext=nil) # given a valid source dir and file globbing spec get # all the files in source dir that match and move them # to @path, appending ext if given. (See: put) sourcedir = File.expand_path(sourcedir.to_s) if self.validpath?(sourcedir) then Dir.glob(File.join(sourcedir.to_s,globspec.to_s)).each do |ff| fo = File.join(@path,File.basename(ff)) + ext.to_s @message = "Moving #{ff} to #{fo}" FileUtils.mv(ff,fo) self.log end end return self end def initialize(path="./") @path = File.expand_path(path.to_s) @message = nil @@logid = nil self.validpath?(@path) return self end def log(*message) # Singleton check for open logging proces, # open one if none exists. Log message to syslog. # This has problems if an instance name is reused. if !@@logid then @@logid = Syslog.open($0) end if message.size > 0 then message.each { |m| @@logid.info(m.to_s) } else @@logid.info(@message.to_s) end return self end def put(targetdir,globspec,ext=nil) # given a valid target dir and file globbing spec get # all the files in @path that match and move them to # target dir appending ext if given. (See: get) targetdir = File.expand_path(targetdir.to_s) if self.validpath?(targetdir) then Dir.glob(File.join(@path,globspec.to_s)).each do |ff| fo = File.join(targetdir,File.basename(ff)) + ext.to_s puts "Moving #{ff} to #{fo}" @message = "Moving #{ff} to #{fo}" FileUtils.mv(ff,fo) self.log end end return self end def readable? if !File.readable?(@path) then @message = "#{@path} is not readable." FALSE else @message = "#{@path} is readable." TRUE end end def trim(filename,ext) File.basename(filename.to_s, ext.to_s) end def validpath?(path) if !File.exists?(path) then @message = "#{path} does not exist on this system." FALSE elsif !File.directory?(path) then @message = "#{path} exists but is not a directory." FALSE else @message = "#{path} is a valid directory." TRUE end end def writable? if !File.writable?(@path) then @message = "#{@path} is not writeable." FALSE else @message = "#{@path} is writeable." TRUE end end def writeable? self.writable? end end # End class Mv2Dir #------------------------------------------------------------------------------ if __FILE__ == $0 test_in = Mv2Dir.new("~/ruby/data/source").log test_out = Mv2Dir.new("~/ruby/data/target").log test_glob = "QPCCCMR*" test_in.put(test_out.path,test_glob,".csv").log #or this will do the same thing. #test_out.get(test_in.path,test_glob,".csv").log -- Posted via http://www.ruby-forum.com/.