Config.datadir during testing

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!

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.

···

On Oct 1, 8:12 pm, I wrote:

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, 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.

···

On Oct 1, 8:12 pm, "nikolai.weib...@gmail.com" <nikolai.weib...@gmail.com> wrote:

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