cannam@147: --- cannam@147: layout: post cannam@147: title: "Cap'n Proto v0.3: Python, tools, new features" cannam@147: author: kentonv cannam@147: --- cannam@147: cannam@147: The first release of Cap'n Proto came three months after the project was announced. The second cannam@147: release came six weeks after that. And the third release is three weeks later. If the pattern cannam@147: holds, there will be an infinite number of releases before the end of this month. cannam@147: cannam@147: Version 0.3 is not a paradigm-shifting release, but rather a slew of new features largely made cannam@147: possible by building on the rewritten compiler from the last release. Let's go through the cannam@147: list... cannam@147: cannam@147: ### Python Support! cannam@147: cannam@147: Thanks to the tireless efforts of contributor [Jason Paryani](https://github.com/jparyani), I can cannam@147: now comfortably claim that Cap'n Proto supports multiple languages. [His Python cannam@147: implementation](http://jparyani.github.io/pycapnp/) wraps the C++ library and exposes cannam@147: most of its features in a nice, easy-to-use way. cannam@147: cannam@147: And I have to say, it's _way_ better than the old Python Protobuf implementation that I helped put cannam@147: together at Google. Here's why: cannam@147: cannam@147: * Jason's implementation parses Cap'n Proto schema files at runtime. There is no need to run a cannam@147: compiler to generate code every time you update your schema, as with protobufs. So, you get cannam@147: to use Python the way Python was intended to be used. In fact, he's hooked into the Python cannam@147: import mechanism, so you can basically import a `.capnp` schema file as if it were a `.py` cannam@147: module. It's even convenient to load schema files and play with Cap'n Proto messages from the cannam@147: interactive interpreter prompt. cannam@147: * It's _fast_. Whereas the Python Protobuf implementation -- which we made the mistake of cannam@147: implementing in pure-Python -- is _slow_. And while technically there is an experimental cannam@147: C-extension-based Python Protobuf implementation (which isn't enabled by default due to various cannam@147: obscure problems), Jason's Cap'n Proto implementation is faster than that, too. cannam@147: cannam@147: Go [check it out](http://jparyani.github.io/pycapnp/)! cannam@147: cannam@147: By the way, there is also a budding [Erlang implementation](http://ecapnp.astekk.se/) cannam@147: (by Andreas Stenius), and work cannam@147: continues on [Rust](https://github.com/dwrensha/capnproto-rust) (David Renshaw) and cannam@147: [Ruby](https://github.com/cstrahan/capnp-ruby) (Charles Strahan) implementations. cannam@147: cannam@147: ### Tools: Cap'n Proto on the Command Line cannam@147: cannam@147: The `capnp` command-line tool previously served mostly to generate code, via the `capnp compile` cannam@147: command. It now additionally supports converting encoded Cap'n Proto messages to a human-readable cannam@147: text format via `capnp decode`, and converting that format back to binary with `capnp encode`. cannam@147: These tools are, of course, critical for debugging. cannam@147: cannam@147: You can also use the new `capnp eval` command to do something interesting: given a schema file and cannam@147: the name of a constant defined therein, it will print out the value of that constant, or optionally cannam@147: encode it to binary. This is more interesting than it sounds because the schema language supports cannam@147: variable substitution in the definitions of these constants. This means you can build a large cannam@147: structure by importing smaller bits from many different files. This may make it convenient to cannam@147: use Cap'n Proto schemas as a config format: define your service configuration as a constant in cannam@147: a schema file, importing bits specific to each client from other files that those clients submit cannam@147: to you. Use `capnp eval` to "compile" the whole thing to binary for deployment. (This has always cannam@147: been a common use case for Protobuf text format, which doesn't even support variable substitution cannam@147: or imports.) cannam@147: cannam@147: Anyway, check out the [full documentation]({{ site.baseurl }}capnp-tool.html) for cannam@147: more. cannam@147: cannam@147: ### New Features cannam@147: cannam@147: The core product has been updated as well: cannam@147: cannam@147: * Support for unnamed [unions]({{ site.baseurl }}language.html#unions) reduces the cannam@147: need for noise-words, improving code readability. Additionally, the syntax for unions has been cannam@147: simplified by removing the unnecessary ordinal number. cannam@147: * [Groups]({{ site.baseurl }}language.html#groups) pair nicely with unions. cannam@147: * [Constants]({{ site.baseurl }}language.html#constants) are now cannam@147: [implemented in C++]({{ site.baseurl }}cxx.html#constants). Additionally, they cannam@147: can now be defined in terms of other constants (variable substitution), as described earlier. cannam@147: * The schema API and `schema.capnp` have been radically refactored, in particular to take advantage cannam@147: of the new union and group features, making the code more readable. cannam@147: * More and better tests, bug fixes, etc. cannam@147: cannam@147: ### Users! cannam@147: cannam@147: Some news originating outside of the project itself: cannam@147: cannam@147: * [Debian Unstable (sid)](http://www.debian.org/releases/sid/) now features cannam@147: [a Cap'n Proto package](http://packages.debian.org/sid/capnproto), thanks to cannam@147: [Tom Lee](https://github.com/thomaslee). Of course, since package updates take some time, this cannam@147: package is still v0.2.1 as of this writing, but it will be updated to v0.3 soon enough. cannam@147: * Popular OSX-based text editor [TextMate](http://macromates.com/) now cannam@147: [uses Cap'n Proto internally](https://github.com/textmate/textmate/commit/5c02b4ff5cc0c7c319d3d4f127c8ee19b81f80b7), cannam@147: and the developer's feedback lead directly to several usability improvements included in this cannam@147: release. cannam@147: * Many people using Cap'n Proto _haven't bothered to tell us about it_! Please, if you use it, cannam@147: [let us know](https://groups.google.com/group/capnproto) about your experience, both what you like cannam@147: and especially what you don't like. This is the critical time where the system is usable but cannam@147: can still be changed if it's not right, so your feedback is critical to our long-term success. cannam@147: * I have revenue! A whopping [$1.25 per week](https://www.gittip.com/kentonv/)! >_> It's cannam@147: totally worth it; I love this project. (But thanks for the tips!)