Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Rapid and delicious DSL prototyping in Ruby (NOT MAINTAINED)

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.
bin
lib
CHANGES.txt
LICENSE.txt
README.rdoc
Rakefile
caesars.gemspec

README.rdoc

Caesars - v0.5

A simple class for rapid DSL prototyping in Ruby.

Installation

One of:

  • gem install caesars

  • copy lib/caesars.rb into your lib directory.

Or for GitHub fans:

  • gem install delano-caesars –source gems.github.com

  • git clone git://github.com/delano/caesar.git

EXAMPLE 1 – Flavour

require 'caesars'

class Flavour < Caesars  # Subclass Caesars. 
end

extend Flavour::DSL     # Bring the DSL into the current namespace. 
                        # This module is created dynamically based
                        # on the name of the subclass.

flavour do              # Start drinking! I mean, start writing your
  spicy true            # domain specific language! 
  clamy true            # Use any attribute name you want.
  salty true
  vodka :very_true      # And any value you want. 
end

p @flavour              # => #<Flavour:0x3f56b0 ...>
p @flavour.spicy        # => true

EXAMPLE 2 – Staff

require 'caesars'

class Staff < Caesars

  chill :calculate      # Delay execution of the blocks for the calculate
                        # attribute. They will be stored as Procs.                      
end

extend Staff::DSL

# The top level method is the lower case name of the class. For deeper
# names like Class::SecondLevel it will use the final name 
# (i.e. secondlevel). You can supply an optional modifier name which 
# will be included in the instance variable (@staff_fte).
staff :fte do
  desc 'Our hard-working, "full-time" staff'

  location :splashdown do
    town :tsawwassen

    person :steve, :sheila do
      role :manager
    end

    person :steve do
      role :cook
      anger :high
      hours 25
      catchphrase "Rah! [strokes goatee]"
    end

    person :sheila do
      catchphrase "This gravy tastes like food I ate in a Mexican prison."
      hours rand(20)
      rate "9.35/h"
      calculate :salary do |gumption|
        ("%.2f" % [gumption * self.splashdown.sheila.rate.to_f]).to_f
      end
    end

    person :delano do
      role :cook
      rate "8.35/h"
      hours 57
      satisfaction :low
      calculate :salary do 
        self.splashdown.delano.rate.to_f * self.splashdown.delano.hours
      end
    end

  end
end

p @staff_fte                    # => #<Staff: ...>
p @staff_fte.desc               # => Our hard-working, "full-time" staff

# Deeper attributes are also available via instance methods
p @staff_fte.splashdown.delano  # => {:role=>:cook, :rate=>"$8.35/h", :satisfaction=>:low}
p @staff_fte.splashdown.sheila  # => {:role=>:manager, :catchphrase=>"This gravy tastes like food I ate in a Mexican prison."}
p @staff_fte.splashdown.steve   # => {:role=>[:manager, :cook], :anger=>:high, :catchphrase=>"Rah! [strokes goatee]"}
p @staff_fte.splashdown.delano.satisfaction   # => :low

# You can also access them using hash syntax
p @staff_fte.splashdown[:steve][:role]  # => [:manager, :cook]

# The "chilled" attributes store their blocks as Procs and are not executed automatically. 
# You can call them manually and send arguments like you normally would. 
p @staff_fte.splashdown.delano.salary.call             # => 475.95
p @staff_fte.splashdown.sheila.salary.call(rand(100))  # => 549.77

EXAMPLE 3 – External Config file

require 'caesars'

class Food < Caesars
  chill :order
end
class Drink < Caesars
end

class PartyConfig < Caesars::Config
  dsl Food::DSL
  dsl Drink::DSL
end

conffile = File.join(File.dirname(__FILE__), 'party.conf')
@config = PartyConfig.new(conffile)

p @config.food.order.call   # => 10kg
p @config[:drink][:wine]    # => 12L
p @config                   # => <PartyConfig:0x3f780c ...>
p @config.keys              # => [:food, :drink]

# [... make changes to party.conf ...]

@config.refresh

party.conf

food do 
  oysters "10kg"
  order do
    self.oysters
  end
end

drink do
  wine "12L"
end

More Info

Credits

  • Delano Mandelbaum (delano@solutious.com)

Thanks

  • Clams, Tomatoes, Grey Goose, and the rest of the crew.

  • Caleb Buxton (cpb.ca) for early feedback.

  • Solutious Inc (solutious.com)

License

See: LICENSE.txt

Something went wrong with that request. Please try again.