About Batavia

The idea behind Batavia is to take Python bytecode, and ship it to a browser where it runs in a Javascript implementation of the Python virtual machine.

This means it is possible to write web applications 100% in Python - so those new to web development don't need to learn multiple languages to develop web apps.

Before you start

In the following instructions, we're going to assume you’re familiar with Github and making pull requests. We're also going to assume some entry level Python and JavaScript; if anything we describe here doesn’t make sense, don’t worry - we're more than happy to fill in the gaps. At this point, we don’t know what you don’t know :-)

This tutorial is also going to focus on code contributions. If your interests/skills are elsewhere (e.g., testing, documentation), let me know, and I can make some other suggestions.

Before you make your first contribution, take Batavia for a spin. The instructions in the getting started guide should be enough to get going. If you get stuck, let me know, and I’ll help you out. If you get stuck, that will also point to your first contribution - work out what instructions would have made you not get stuck, and contribute an update to the README.

Your first contribution

Once you’ve got Batavia working, you’ll be ready to make your first code contribution. The contribution guide will guide you through the process of setting up your development environment. Work through that guide until you can run the Batavia test suite. Once you've been able to run the test suite without any failures, you're ready to add some new code to the Batavia codebase.

In order to implement a full Python virtual machine, Batavia needs to implement all the eccentricities of Python behaviour. For example, Python allows you to multiply a string by an integer, resulting in a duplicated string (e.g., “foo” * 3 => “foofoofoo”). Javascript behavior can be quite different, depending on circumstances - so we need to provide a library that implements the desired Python behavior.

That particular example (string times number) is already implemented - see the definition of the __mul__() function. This implements the multiply operator. It’s implemented in Javascript, but it implements Python behavior - for some data types.

If you then look at tests/datatypes/test_str.py, you’ll see the tests for this behaviour. We’ve already written a test suite that tries to perform every operation on every data type. However, all of the names listed in that file are the examples that are known to fail (because the implementation doesn’t exist yet). The tests work by writing a short program that implements one mathematical operation, running the program under normal Python, and then running it again under Batavia. The test passes when the two executions produce identical output.

So - your first open source contribution: Pick a test that is currently listed in the test_str.py test file (e.g., test_multiply_float is the test of multiplying a string by a float), and modify the implementation of Str until you get the same output from CPython program as you do from the Batavia version of the same program. This includes error messages - if CPython raises a TypeError for a particular operation (e.g., “foo” * 3.1415), then so should Batavia - and the error message should be the same too, right down to the punctuation.

Before you start work, visit ticket #46 and register which function you're working on - that way we won't end up with 2 people working on the same one.

Once you've written your implementation, run the tests. If you get an “unexpected success” from the test suite, and you don’t get any failures, you’ve done it! Delete the line from the test_str.py file corresponding to the test you’ve fixed (because the test is no longer expected to fail), and submit a pull request!


Then break out a celebratory beverage of your choice! You’re an open source contributor!

Best of luck - and I can’t wait to see your first contribution!