Quick Start

2 Your First LFE Project

A project? Already?! It sounds daunting, but it's just one command :-)

Head over to your favorite workspace in an open terminal and do this:

$ lfetool new library my-test-lib

As you watch the output crank away, read on to find out what it's doing:

  • lfetool created a skeleton project (of the "library" type)
  • rebar downloaded all the dependencies listed in the new rebar.config file that was created for your project
  • All the downloaded dependendencies were then compiled
  • During the first step, a failing test case was created for you; now, that test case has been run in the test suite and the error has been revealed (TDD!)

2.1 Tests First!

First things first: let's get that failing unit test passing.

Here's the output we saw:

**error:{assertEqual_failed,[{module,'my-test-lib_tests'},
                     {line,11},
                     {expression,"(: my-test-lib my-adder 2 2)"},
                     {expected,4},
                     {value,5}]}

We can see that our test expected 4 but it got 5.

Before we go further, be sure you are in your project directory:

$ cd my-test-lib

Let's look at the test by opening up test/my-test-lib_tests.lfe.

Well, things there look good -- we should get 4 when 2 and 2 are added.

Let's take a look at the source module: src/my-test-lib.lfe. Ah-ha! a bug :-) There's an extra operation that's being done which we don't want.

To fix it, change this line:

  (+ x (+ y 1)))

to this:

  (+ x y))

Now re-run the unit tests:

$ make check-unit

And you should get a passing test:

==> my-test-lib (eunit)
======================== EUnit ========================
my-test-lib_tests: my-adder_test (module 'my-test-lib_tests')...[0.031 s] ok
=======================================================
  Test passed.

We'll talk about the make targets in a bit, but our target above run the unit tests without recompiling all the deps; just our project files and our unit tests.

2.2 Project Inventory

Okay, we've got our tests passing and our project looks healthy. But what does it have in it?

  • a README file in ReStructured Text
  • a Makefile
  • the rebar.config file we mentioned earlier (this has all your project dependencies in it)
  • a package.exs file for uploading your project to expm.co
  • the src directory which holds your project code, and
  • the test directory which holds the tests

There are some other things there (e.g., the deps directory created by rebar and the ebin directory that's created when everything is compiled).

2.3 Repo Ready to Go

lfetool also did one more thing for you: inited the project in git and added all the files:

$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   .gitignore
#   new file:   Makefile
#   new file:   README.rst
#   new file:   package.exs
#   new file:   rebar.config
#   new file:   src/my-test-lib.app.src
#   new file:   src/my-test-lib.lfe
#   new file:   test/my-test-lib_tests.lfe
#

All you need to do it git commit -a && git push --all to wherever you want to put your project :-)

Next Stop

You can taste it, can't you? That LFE flavor coming your way? Yup, you're right. You're going to be looking at LFE code next ...