rubybowerdsl

What does Rails DSL configuration mean and what does a DSL configuration look like?


I have the following Bower file:

group :vendor, assets_path: 'assets/shop' do
  asset 'jquery', '2.2.1'
  asset 'lodash', '4.6.1'
  ...
end

Now I see the output in the folder vendor/assets/shop, which is as specified in the docs.

What I'm trying to understand is what does "Rails DSL configuration" really mean? And what does a "Rails DSL configuration" or even "DSL configuration" look like? I looked around and couldn't find a definition to what exactly this statement means.


Solution

  • DSL is Domain Specific Language. "Domain Specific" here meaning the language is for a very particular use, in this case it is only for configuring Bower. In contrast, a General Purpose Language like Ruby or JSON can be used for anything.

    DSLs are used to make writing code or configurations more natural and convenient and less error prone for humans in that domain. It makes it more declarative, fills in defaults, and constrains you to what you need for the domain.

    This is a Bower DSL configuration.

    resolution "angular", "1.2.22"
    

    It is equivalent to this JSON configuration.

    {
      "name" : "dsl-generated-dependencies",
      "dependencies": {
        "angular": "1.2.22"
      },
      "resolutions": {
        "angular": "1.2.22"
      }
    }
    

    Bower offers both options for configuration. You can use the DSL to generate the JSON config, or you can write the JSON by hand.


    While sometimes DSLs are their own complete languages with their own grammar and parser, in Ruby DSLs are usually just Ruby. resolution "angular", "1.2.22" is just a method call: self.resolution("angular", "1.2.22"). resolution knows how to turn that into complete Bower configuration.

    Your example code is a method call to group passing in a Proc.

    self.group(:vendor, assets_path: 'assets/shop') do
      self.asset('jquery', '2.2.1')
      self.asset('lodash', '4.6.1')
      ...
    end
    

    Other examples of Ruby DSLs include config/routes.rb in Rails,

    get '/patients/:id', to: 'patients#show', as: 'patient'
    

    Gemfiles,

    gem "nokogiri", ">= 1.4.2"
    

    And FactoryBot.

    factory :user do
      first_name { "John" }
      last_name  { "Doe" }
      admin { false }
    end
    

    They're all fancy Ruby method calls and blocks.