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