Config.datadir during testing

  • Thread starter nikolai.weibull
  • Start date
N

nikolai.weibull

How do I deal with Config.datadir during testing? I don’t want it to
point to where the Gem will be, once it has been installed, but to the
”data” directory in my current work directory.

I figured that I’d override Config.datadir

module Config
def self.datadir(package)
parts = File.expand_path('.').split(/[#{Regexp.escape
(File::SEPARATOR + File::ALT_SEPARATOR)}]/)
until parts.empty?
break if parts.last == package
end
return <what>(package) if parts.empty?
parts.push 'data', package
File.join(*parts)
end
end

but the question is what I should replace <what> with. I first
figured I’d do

module ConfigWrapper
def self.datadir(package)
parts = File.expand_path('.').split(/[#{Regexp.escape
(File::SEPARATOR + File::ALT_SEPARATOR)}]/)
until parts.empty?
break if parts.last == package
end
return super(package) if parts.empty?
parts.push 'data', package
File.join(*parts)
end
end

Config.extend(ConfigWrapper),

but that won’t work, as that won’t put ConfigWrapper in the right
place in the call chain (obvious, in retrospect). So I figured I’d do

module Config
class << self
alias old_datadir datadir
end
def self.datadir(package)
parts = File.expand_path('.').split(/[#{Regexp.escape
(File::SEPARATOR + File::ALT_SEPARATOR)}]/)
until parts.empty?
break if parts.last == package
end
return old_datadir(package) if parts.empty?
parts.push 'data', package
File.join(*parts)
end
end

but that doesn’t work, as old_datadir will simply point to the current
Config.datadir implementation, thus resulting in an infinite loop.

I see no way around it.

What should I do?

(I’d be very pleased if I didn’t have to modify Config.datadir, so if
there’s a solution without it that would be nice. I would also like
to see a solution to the problem of overriding a module method.)

Thanks!
 
N

Nikolai Weibull

How do I deal with Config.datadir during testing?  I don’t want it to
point to where the Gem will be, once it has been installed, but to the
”data” directory in my current work directory.

OK, since no one has responded, can I perhaps limit the question to
how to deal with things like Config.datadir during testing for the
package that I’m testing? Before installation I want it to be local
to the package. Once installed I want it to use the path where the
files were installed.
 
N

Nikolai Weibull

How do I deal with Config.datadir during testing?  I don’t want it to
point to where the Gem will be, once it has been installed, but to the
”data” directory in my current work directory.

I figured that I’d override Config.datadir

module Config
  def self.datadir(package)
    parts = File.expand_path('.').split(/[#{Regexp.escape
(File::SEPARATOR + File::ALT_SEPARATOR)}]/)
    until parts.empty?
      break if parts.last == package
    end
    return <what>(package) if parts.empty?
    parts.push 'data', package
    File.join(*parts)
  end
end

but the question is what I should replace <what> with.  I first
figured I’d do

module ConfigWrapper
  def self.datadir(package)
    parts = File.expand_path('.').split(/[#{Regexp.escape
(File::SEPARATOR + File::ALT_SEPARATOR)}]/)
    until parts.empty?
      break if parts.last == package
    end
    return super(package) if parts.empty?
    parts.push 'data', package
    File.join(*parts)
  end
end

OK, I’m a fucking moron. That should be

while last = parts.pop
break if last == package
end

Still, it would be nice to see alternative solutions to this.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,774
Messages
2,569,598
Members
45,158
Latest member
Vinay_Kumar Nevatia
Top