Democritus

Build Status APACHE 2 License Code Climate Test Coverage Documentation Status

Democritus is a plugin for building class from reusable components.

Democritus is inspired as followup of a common pattern that I saw in the development of Sipity's form objects. It also aims to address the needs of Sipity's yet to be developed sibling application; The dissemination of processed data.

I'm looking to apply the ideas put forward in Avdi Grimm's Naught gem.

Goal

I would like to be able to declare in Ruby the following:

ApprovalForm = Democritus.build(command_namespaces: ['Sipity::DemocritusCommands', 'Democritus::ClassBuilder::Commands']) do |builder|
  builder.form do
    attributes do
      attribute(name: 'agree_to_terms_of_service', type: 'Boolean', validates: 'acceptance')
    end
    action_name(name: 'approval')
  end
end

With an ApprovalForm, I could #submit if #valid? (i.e. the agree_to_terms_of_service has been accepted).

From that point forward, I would like to be able to create the class based on a JSON description:

{
  "#command_namespaces": ["Sipity::DemocritusCommands", "Democritus::ClassBuilder::Commands"],
  "#form": {
    "#attributes": {
      "#attribute": [
        { "name": "agree_to_terms_of_service", "type": "Boolean", "validates": "acceptance" }
      ]
    },
    "#action_name": { "name": "approval" }
  }
}
ApprovalForm = Demcritus.build_from_json(json)

Roadmap

  • [x] Rudimentary plugin command behavior
  • [ ] Create the commands that build a Sipity processing form
  • [X] Build class from JSON configuration
    • [X] Basic case for nested commands
    • [X] Allow for "constantization" of command_namespaces option.