Dirt
Make best practices easy. Come play in the Dirt.
Why Dirt
Good design is when the easiest usage and the correct usage are one in the same.
Best practices, however, are often an extra effort; many require configuration every time you start a new project. Newbies are too busy learning to put in that effort and that quickly develops into bad habits. Masters find best practices useful, but routine and boring. So we asked ourselves:
What if there was a tool to make best practices simple or even automatic?
Dirt is the answer to this question.
It exists because we wanted a toolset to automatically set us up for:
- Behaviour Driven Development (BDD)
- User Story Orientation
- A simple, standard project directory structure
- Clear separation of concerns - thin views, thin persistence, thick core.
- Use of modern version control systems
- Code analysis & metrics.
That's the goal of Dirt: make best practices dead easy.
Features
This is what Dirt gets you right now:
Helpful defaults Logical directory tree and some useful default meta files
Versioning Start with a git repository initialized, a populated .gitignore, and all default files already committed.
Ready BDD Working Cucumber test environments and a default Gemfile to support them.
Undead resistance +3 Great for those pesky lich infestations.
Roadmap
This is where we're headed. If you want to help make it a reality, get in touch!
- Face Generation Web, CLI, and simple mobile. All including integration tests to justify their existence.
- VCS independence Written around Git right now, other VCSes should be supported, especially distributed ones.
- Project Diffing Wouldn't it be nice to know what in your project is different form the standards, or the templates?
- Architectural linting Core files should only depend on core files.
- Licence Injection Applying the licence to all source files should be easy, and optional.
- Simple installation The language and Dirt should just work out of the box.
- Multilingual Support These concepts aren't Ruby specific. They can easily apply to any modern language. Where Cucumber and Gherkin go, Dirt may follow.
- ... Plus some other experimental ideas that BDD enable
Prerequisites
Dirt requires linux or unix, git, and ruby.
Usage
Project Generation
Generating a project will give you a project directory that looks like:
core/
├─── contexts/
│ └─────── roles/
├── models/
├── tests/
│ ├──── behaviours/
│ │ ├───────── step_definitions/
│ │ │ ├── given.rb
│ │ │ ├── then.rb
│ │ │ └── when.rb
│ │ └───────── support/
│ │ └────── env.rb
│ └───── isolations/
└── example_project.rb
faces/
persist/
Gemfile
.gitignore
We'll take a look at a couple of scenarios first: remote host and local host.
First, a note about git and dirt Usually, git stores history information in a .git file within your project directory. You can make a bare that is a folder with just the history information, and no actual project files. Then, you can point multiple regular git repository's to the bare, and it can act as a shared history.
Dirt has two intended modes: having a git bare on a remote machine, or on your local machine.
Remote Bare Host
Intended for teams, this scenario will not only create a local project and git repository, but will also create a Git bare in a remote location.
dirt generate project --name PROJECT_NAME --location PATH --host HOST_NAME --bare-path PATH
Example We would like a new project:
- called "Our Project"
- saved in
~/projects/our_project
- with a git bare repository saved on a machine called dresden, and in
/var/git/our_project.git
So we'd use:
dirt generate project --name "Our Project" --location ~/projects/ --host dresden --bare-path /var/git/
Local Bare Host
Even if you're building solo, you should have a bare repository to act as a sort of backup. Besides, you never know if you'll gain teammates, and having a bare ready to copy to a remote machine is very handy.
This is a lot like the remote machine scenario above, but we don't need to provide the --host
or --bare-path
.
dirt generate project --name PROJECT_NAME --location PATH
Example
To have a new project called "My New Project" in ~/projects/my_new_project
, use:
dirt generate project --name "My New Project" --location ~/projects/
Full Listing
dirt generate []
This is the full listing of generation flags.
Flag | Default Value | Description |
---|---|---|
-n, --name NAME |
The human-readable name of the new project. Put it in quotes if you want spaces. | |
-l, --location PATH |
Current directory | The parent directory of the new project on the local machine. |
-h, --host ADDRESS |
localhost |
The IP address or hostname of the machine where the bare repository will be kept. |
-b, --bare-path PATH |
n/a | The parent directory of the new git bare on the host machine. See also: --host |
-u, --user NAME |
Your username | The username to be used to log into the host device. See also: --host |
Template variables
In the template files, there are some times that you need dynamic data insertion.
These are the variables accessible to the template engine. Any instance of these tags will be replaced by the appropriate data.
Tag | Description | Default Value | Example |
---|---|---|---|
<project_name> |
The human-readable name of the project. | My Project | |
<project_directory> |
The snake-case name of the project. | my_project | |
<project_module> |
The module name of the project. | MyProject | |
<ruby_version> |
The version of ruby that your project should support. | ruby --version |
1.9.3 |
<user_name> |
The name of the user running dirt. | your name | Bob Guardian |
<user_website> |
The website to be associated with the project. | www.tenjin.ca |