Comment rendre un Gem Ruby Configurable

Dans l’écosystème Ruby, la flexibilité est essentielle, et l’une des façons d’atteindre cet objectif est de rendre vos gems configurables. Ce processus, souvent réalisé à l’aide de blocs de configuration, permet aux utilisateurs d’ajuster le comportement d’une gem selon leurs besoins spécifiques. Plongeons dans ce processus en explorant la création d’une classe de configuration, son exposition aux utilisateurs, et l’utilisation de lambdas pour une personnalisation encore plus poussée.

Création de la Classe de Configuration

La première étape consiste à définir une classe de configuration responsable de la gestion des options. Prenons un exemple concret où nous configurons un instrument de musique et le son qu’il produit. Pour assurer la cohérence, nous ajoutons une validation personnalisée.

module MonGemme
  class Configuration
    class SonInstrumentNonCorrespondant < StandardError; end

    INSTRUMENT_SOUND_MAP = {
      "Guitare" => "Acoustique",
      "Saxophone" => "Jazz"
    }

    attr_accessor :instrument
    attr_reader :son

    def initialize
      @instrument = "Guitare"
      @son = "Acoustique"
    end

    def son=(son)
      raise SonInstrumentNonCorrespondant, "Un #{@instrument} ne peut pas produire ce son" if INSTRUMENT_SOUND_MAP[@instrument] != son

      @son = son
    end
  end
end

Exposition de la Configuration

L’exposition de la configuration se fait à travers un singleton de la classe de Configuration. Les utilisateurs peuvent ainsi ajuster les valeurs selon leurs besoins.

module MonGemme
  class << self
    def configuration
      @configuration ||= Configuration.new
    end

    def configure
      yield(configuration)
    end
  end

end

Utilisation de la Configuration dans le Gem

Avec la configuration exposée, nous pouvons maintenant l’utiliser dans notre gem pour adapter son comportement en fonction des choix de l’utilisateur.

module MonGemme
  class SonInstrument
    def initialize
      @instrument = MonGemme.configuration.instrument
      @son = MonGemme.configuration.son
    end

    def jouer_son
      "Le #{@instrument} produit le son #{@son}"
    end
  end
end

Configuration par les Utilisateurs

Les utilisateurs peuvent désormais configurer les paramètres de la gemme selon leurs préférences. Par exemple :

MonGemme.configure do |config|    #Remarquez que l'argument du bloc de configuration   #est le singleton retourné par Configuration.   #Fondamentalement, tout ce que nous faisons, c'est utiliser   #les accesseurs que nous avons définis dans la classe Configuration      config.instrument = "Saxophone"  config.son = "Jazz"end

Utilisation de Lambdas pour une Personnalisation Avancée

Dans des situations nécessitant une personnalisation plus avancée, l’utilisation de lambdas peut s’avérer puissante. Prenons l’exemple de la configuration d’une catégorie en utilisant une lambda.

module MonGemme
  class Configuration
    attr_reader :nom_categorie

    def initialize
      @nom_categorie = nil
    end

    def nom_categorie=(lambda)
      raise ArgumentError, "nom_categorie doit être une lambda" unless lambda.is_a?(Proc)

      @nom_categorie = lambda
    end
  end
end

Vous pouvez configurer la lambda comme suit :

MonGemme.configure do |config|
  config.nom_categorie = ->(nom_du_modele) { nom_du_modele == "Article" ? :categorie_articles : :categorie_generale }

end

Et l’utiliser dans le gem :

MonGemme.configuration.nom_categorie&.call("Article")
# => :categorie_articles

Conclusion

La capacité à configurer un gem en Ruby est un élément essentiel pour rendre vos solutions plus adaptables et modulables. En permettant aux utilisateurs de personnaliser le comportement de votre gem, vous rendez votre code plus polyvalent et capable de répondre à une variété de besoins. Que vous utilisiez des blocs de configuration, des classes dédiées, ou même des lambdas, l’art de la configuration en Ruby est une compétence précieuse pour tout développeur souhaitant créer des solutions robustes et flexibles. Alors, avez-vous déjà utilisé ces techniques pour rendre vos gems plus personnalisables ? Partagez vos expériences dans les commentaires !