This weekend, I created library to aid developers in creating neat little embedded DSLs when using python, without having to do any complex parsing or anything like that. The resulting DSLs look a bit more like english than python does.
The idea for this was inspired by some ruby stuff that I’ve been using lately. I’ve been using ruby quite a bit lately, and while I am still not a huge fan of the language, I do like the idea of easy to code up DSLs that I can use to populate objects without too much effort. Since I wanted a DSL for a python project I was working on, I played with a few ideas and ended up with this tool.First, create some very basic python objects, and a file with the DSL to pass to dsltool. Here’s a sample recipe DSL for baking yummy cookies.
   author = 'Mom'
   level = 'Easy'
   with Instructions('Yummy cookies'):
      preheat_oven = '375F'
      with Ingredients:
          add += '2 1/4 cups', 'flour'
          add += '1 tsp', 'baking soda'
          add += '1 tsp', 'salt'
          add += '1 cup', 'butter'
          add += '3/4 cup', 'sugar'
          add += '3/4 cup', 'brown sugar'
          add += '1 tsp', 'vanilla extract'
          add += '2', 'eggs'
          add += '2 cups', 'chocolate chips'
          add += '1 cup', 'nuts'
And the implementation to parse that dsl is super simple:
   import dsltool
   class Ingredients(object):
      def __init__(self):
          self._items = []
      @property
      def add(self):
          return dsltool.add_to_list(self._items)
      @add.setter
      def add(self, value):
          self._items = value
   class Instructions(object):
      preheat_oven = None
      ingredients = Ingredients
      steps = Steps
      def __init__(self, name):
          self.name = name
   class Recipe(object):
      author = None
      level = None
      def __init__(self):
          self.instructions = Instructions
   if __name__ == '__main__':
      obj = dsltool.parse_dsl_file('cookies.pydsl', Recipe)
The source distribution comes with an example recipe DSL that you can play with to make tasty cookies. Submit bug reports/pull requests on github, or you can download it from pypi, or even via pip:
pip install pydsltool
Let me know if you find it useful!