Files | Admin

Notes:

Release Name: 0.4.2

Notes:
= Caesars - v0.4

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:

* git clone git://github.com/delano/caesar.git
* gem sources -a http://gems.github.com (you only have to do this once, ever...), then:
  * gem install delano-caesar

== 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
     p @staff_fte.splashdown.keys


== 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(:path => conffile)
     
     p @config.food.order.call   # => 8kg
     p @config[:drink][:wine]    # => 12L
     p @config                   # => <PartyConfig:0x3f780c ...>
     p @config.keys              # => [:food, :drink]

== More Info

* GitHub[http://github.com/delano/caesar]
* Inspiration[http://www.youtube.com/watch?v=ycElb0tB9_U]
* Recipe[http://twitter.com/solutious/status/1264327499]

== Credits

* Delano Mandelbaum (delano@solutious.com)

== Thanks

* Clams, Tomatoes, Vodka, and the rest of the crew. 

== License

See: LICENSE.txt


Changes: CAESAR -- CHANGES #### 0.4.2 (2009-03-05) ############################### * FIX: missing bin/party.conf in gem release * FIX: Now works with Ruby 1.8+ * NEW: Cleaner rdocs. * TODO: Fix support for top level methods with names: food :extra do; end; # => food_extra #### 0.4.0 (2009-03-05) ############################### * CHANGE: Removed bloody method. We now parse blocks immediately. * CHANGE: Renamed virgin method to chill. * NEW: Caesar::Config class for loading DSLs as config files. See Example 3. * NEW: Added find_deferred method to automatically jump up the heirarchy when looking for a specific attribute. * NEW: Added to_hash and [] methods to Caesar::Glass to make it more hashlike. * FIX: "chilled" attributes weren't available by method name #### 0.3.2 (2009-03-04) ############################### * FIX: Added file and line info for eval code (better debugging). * CHANGE: The top level DSL method names are now determined by by the class name. Some::ClassName becomes classname. This is less confusing than allowing it to be anything and makes it possible to use several DSLs in the same namespace. #### 0.3.1 (2009-03-04) ############################### * NEW: Accept instances without a name * CHANGE: Updated examples. * NEW: More rdocs. #### 0.3 (2009-03-04) ############################### Initial public release