How to provide plugin configuration?


I’m finalising a translation plugin I use in one app. I’d like the
plugin the be configurable but am not sure how to provide this
configurability. For example, there’s a setting for the cookie name to
use when saving user’s prefered language. I thought of having a class
TranslationConfig like this:

class TranslationsConfig
def self.cookie_name

But that implies that if you want to change this setting, you should
reopen the class somewhere (I’m not even sure that putting it in
environment.rb would work as I thought plugins are loaded last).

Also, how can write unit tests for different settings so I can check
that the right cookie name is used? Reopening a class in a method
doesn’t work.

Any advice on this?



You could always store your configuration in a Hash… some future
version of the Engines plugin will probably provide a class like this:

class HashWithStickyValues < Hash
alias :__store :store
def []=(key, value)
store(key, value) # ensure that []= uses our new #store. This
might not be needed.
def store(key, value)
__store(key, value) if !self.has_key?(key) # only store the value
if it’s not set already
def force(key, value)
__store(key, value) # always store the value
def method_missing(name, *args)
val = (args.length > 1) ? args : args[0]
if name.to_s["="]
store(name.to_s.gsub(/=/, ‘’).to_sym, val) # try to store the
fetch(name.to_sym, nil) # presume this was a method-style key

It mimics the behaviour of the config method I use with engines (see
the Engines plugin documentation for an explanation of this
behaviour). In tests, you can use the force method to set
configuration explicitly. This exact behaviour might not be useful
given the loading mechanism differences between plugins and engines,
but you might still consider something like this.

  • james

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs