Go to file
joeduffy 370b0a1406 Implement property binding and typechecking
This is an initial pass at property binding.  For all stack instantiations,
we must verify that the set of properties supplied are correct.  We also must
remember the bound property information so that code-generation has all of
the information it needs to generate correct code (including capability refs).

This entails:

* Ensuring required properties are provided.

* Expanding missing properties that have Default values.

* Type-checking that supplied properties are of the right type.

* Expanding property values into AST literal nodes.

To do this requires a third AST pass in the semantic analysis part of the
compiler.  In the 1st pass, dependencies aren't even known yet; in the 2nd
pass, dependencies have not yet been bound; therefore, we need a 3rd pass,
which can depend on the full binding information for the transitive closure
of AST nodes and dependencies to have been populated with types.

There are a few loose ends in here:

* We don't yet validate top-level stack properties.

* We don't yet validate top-level stack base type properties.

* We don't yet support complex schema property types.

* We don't yet support even "simple" complex property types, like `[ string ]`.

* We don't yet support strongly typed capability property types (just `service`).

That said, I am going to turn to writing a few tests for the basic cases, and then
resume to finishing this afterwards (tracked by marapongo/mu#25).
2016-12-02 13:23:18 -08:00
cmd Rename --arch (-a) build switch to --target (-t) 2016-12-01 11:03:48 -08:00
docs Clean up workspace file naming 2016-11-29 20:07:27 -08:00
examples Add a Mu.yaml to the MongoDB/Twilio example 2016-11-23 16:28:00 -08:00
lib Fix a YAML problem 2016-12-01 09:13:00 -08:00
pkg Implement property binding and typechecking 2016-12-02 13:23:18 -08:00
.gitignore Gitignore *.swp files 2016-11-16 09:28:46 -08:00
.gitmodules Add Docker Compose and Kubernetes conversions as submodules 2016-11-01 10:30:39 -07:00
glide.lock Add rudimentary template expansion 2016-11-25 12:58:29 -08:00
glide.yaml Add rudimentary template expansion 2016-11-25 12:58:29 -08:00
main.go Move glogging into Mu command startup/teardown 2016-11-19 16:42:27 -08:00
Makefile Test packages when making the project 2016-11-15 19:25:06 -08:00
README.md Mention ln -s for the Mu runtime/library 2016-11-23 14:22:42 -08:00

Mu

Mu is a framework and toolset for creating reusable stacks of services.

Building and Testing

To build Mu, first clone it into a standard Go workspace:

$ mkdir -p $GOPATH/src/github.com/marapongo
$ git clone git@github.com:marapongo/mu $GOPATH/src/github.com/marapongo/mu

A good default value for GOPATH is ~/go.

Mu needs to know where to look for its runtime, library, etc. By default, it will look in /usr/local/mu, however you can override this with the MUPATH variable. Normally it's easiest just to create a symlink:

$ ln -s $GOPATH/src/github.com/marapongo/mu /usr/local/mu

There is one additional build-time dependency, golint, which can be installed using:

$ go get -u github.com/golang/lint/golint

And placed on your path by:

$ export PATH=$PATH:$GOPATH/bin

At this point you should be able to build and run tests from the root directory:

$ cd $GOPATH/src/github.com/marapongo/mu
$ make

This installs the mu binary into $GOPATH/bin, which may now be run provided make exited successfully.