`python setup.py test` results in 725 failures [Windows] #70

Closed
DawnPaladin opened this Issue May 23, 2016 · 25 comments

Projects

None yet

3 participants

@DawnPaladin
Contributor

Your contributor guide says "If you see any lines that end FAIL, ERROR, or unexpected success, [...] please get in touch, because you may have found a problem." So that's what I'm doing. Running python setup.py test results in "failures = 725, expected failures = 3403".

That page only lists instructions for doing this on OSX, Ubuntu, and Rasbperry Pi, and I'm doing this on Windows, so maybe that's the problem? I'm running Windows 10 build 14342 (just released onto the Slow ring), Python 3.5.1, and PhantomJS 2.1.1.

Am I doing something wrong? I want to contribute. How can I proceed?

@freakboy3742
Member

Something is clearly going wrong; it's almost certainly not your fault :-)

Your guess about it being a Windows-specific problem is a pretty good one. I haven't done any testing on Windows as I don't have a Windows machine handy for test purposes.

Can you provide a copy of the test output - or even just a sample of the output showing a couple of test failures? If you're getting that many failures, it's entirely likely that everything is failing at the same point, very early in the process.

@DawnPaladin
Contributor
DawnPaladin commented May 23, 2016 edited

As I scroll through the console output, all of the failed tests look similar to the following:

======================================================================                                         
FAIL: test_import_star (tests.structures.test_import.NativeImportTests)                                        
----------------------------------------------------------------------                                         
Traceback (most recent call last):                                                                             
  File "c:\users\compu\documents\repositories\batavia\tests\utils.py", line 529, in assertJavaScriptExecution  
    args=args                                                                                                  
  File "c:\users\compu\documents\repositories\batavia\tests\utils.py", line 256, in runAsJavaScript            
    build_batavia()                                                                                            
Exception: Error compiling batavia sources: 'make' is not recognized as an internal or external command,       
operable program or batch file.                                                                                


During handling of the above exception, another exception occurred:                                            

Traceback (most recent call last):                                                                             
  File "c:\users\compu\documents\repositories\batavia\tests\structures\test_import.py", line 880, in test_impor
t_star                                                                                                         
    run_in_function=False)                                                                                     
  File "c:\users\compu\documents\repositories\batavia\tests\utils.py", line 532, in assertJavaScriptExecution  
    self.fail(e)                                                                                               
AssertionError: Error compiling batavia sources: 'make' is not recognized as an internal or external command,  
operable program or batch file.                                                                                

======================================================================                                         

It looks like something is missing from my path. It's not python or phantomjs; both of those run from the command prompt just fine. (I'm using Cmder, which usually does a good job of imitating a *nix prompt.)

I'm not sure I have virtualenv set up correctly. . env/bin/activate doesn't work because I don't have a bin directory, but when I run pip install -e I get "Successfully installed batavia-3.4.0.dev1".

The first-time contributor guide says:

"...instead of running 'pip install batavia', I’d suggest forking the project on Github, checking out that fork, and then running pip install -e . from the root directory."

I did that, but I'm not sure which instructions those are intended to replace, because the "Contributing to Batavia" guide doesn't actually say to run 'pip install batavia' at any point. Isn't documentation fun?

@freakboy3742
Member

Ok - the problem is a relatively easy one: the first thing the test suite does is use the Unix "make" utility to build a single batavia.js and batavia.min.js. So - we either need to find a windows-compatible version of make, or we need to find a Windows alternative for that build process. I'm open to suggestions here.

The error about . env/bin/activate will definitely be off; as I recall, the script is called env/Scripts/activate on Windows, and the "." at the start isn't needed.

If you've run pip install -e without activating the virtualenv first, you'll have Batavia installed in your system Python install. That's not inherently a problem; it's just likely to get confusing later on if you ever have a need for 2 Batavia installations.

Lastly - the documentation thing: that looks like a case of documentation drift. Not that long ago, the project homepage suggested "pip install batavia"; I've since added the getting started guide, which says use "pip install -e .". I've just tweaked the first-time contributor to clarify this.

Apologies for all the hurdles you're hitting here; it's really helpful having someone report all the stuff that doesn't work on Windows. As I said, I don't have a windows box available for testing, but that doesn't mean I'm ignoring Windows as a platform.

@DawnPaladin
Contributor

Hmm. I found a GNU make for Windows. When I put it in a PATH-accessible directory, the error I get changed to this:

======================================================================
FAIL: test_import_star (tests.structures.test_import.NativeImportTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "c:\users\compu\documents\repositories\batavia\tests\utils.py", line 529, in assertJavaScriptExecution
    args=args
  File "c:\users\compu\documents\repositories\batavia\tests\utils.py", line 275, in runAsJavaScript
    on_fail="Unable to create webpage."
Exception: Unable to create webpage.: undefined

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "c:\users\compu\documents\repositories\batavia\tests\structures\test_import.py", line 880, in test_import_star
    run_in_function=False)
  File "c:\users\compu\documents\repositories\batavia\tests\utils.py", line 532, in assertJavaScriptExecution
    self.fail(e)
AssertionError: Unable to create webpage.: undefined

I don't know whether that helps or not. 😄

I figured documentation drift was likely to be the culprit. Thank you for being so helpful!

@DawnPaladin
Contributor

I also tried the Make utility included with MinGW, with the same results. So now I'm a little more confident that I didn't get a broken version of make.

@freakboy3742
Member

Ok - we're definitely getting closer.

This new error suggests that make is now being run successfully; however, the PhantomJS environment isn't being successfully created. Here are the next debugging steps:

  1. First, confirm that from the command line, if you're in the root directory of the github checkout, you can run phantomjs and a PhantomJS session starts.
  2. If it does; confirm that you can run the command var page = require('webpage').create(), and that this responds with undefined
  3. If that works, the problem will be with the way the test suite is waiting for responses. The test suite works by starting a copy of PhantomJS in a subprocess, and piping commands and responses back and forth to check that response to input is as expected. The code driving this is in tests/utils.py;you're looking for sendPhantomCommand, around line 133. There's a couple of debug lines commented out; if you make them live (and/or add some of your own), you might be able to get an idea what is going on. My best guess will be that it is newline related - line 151 tries to split the response read from PhantomJS on newlines, but if that isn't matching the output you're seeing, the "undefined" response might not be matching.

If you want to run a single test (rather than the entire suite), you can use the -s option to python setup.py test - e.g., python setup.py test -s tests.datatypes.test_str.BinaryStrOperationTests.test_add_str will test adding two strings, which should pass.

I hope that helps get you a little further; if you need any more suggestions, pointers or help, let me know!

@DawnPaladin
Contributor

phantomjs runs successfully from the repository folder; so does var page = require('webpage').create(). Here's what I get when I run python setup.py test -s tests.datatypes.test_str.BinaryStrOperationTests.test_add_str:

running test
running egg_info
writing dependency_links to batavia.egg-info\dependency_links.txt
writing batavia.egg-info\PKG-INFO
writing requirements to batavia.egg-info\requires.txt
writing top-level names to batavia.egg-info\top_level.txt
reading manifest file 'batavia.egg-info\SOURCES.txt'
reading manifest template 'MANIFEST.in'
warning: no files found matching 'requirements*.txt'
writing manifest file 'batavia.egg-info\SOURCES.txt'
running build_ext
test_add_str (tests.datatypes.test_str.BinaryStrOperationTests) ... FAIL

======================================================================
FAIL: test_add_str (tests.datatypes.test_str.BinaryStrOperationTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "c:\users\compu\documents\repositories\batavia\tests\utils.py", line 429, in assertCodeExecution
    args=args
  File "c:\users\compu\documents\repositories\batavia\tests\utils.py", line 275, in runAsJavaScript
    on_fail="Unable to create webpage."
  File "c:\users\compu\documents\repositories\batavia\tests\utils.py", line 178, in sendPhantomCommand
    raise Exception(on_fail + ": %s" % response)
Exception: Unable to create webpage.: undefined

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "c:\users\compu\documents\repositories\batavia\tests\utils.py", line 637, in func
    self.assertBinaryOperation(x=value, y=example, operation=operation, format=self.format)
  File "c:\users\compu\documents\repositories\batavia\tests\utils.py", line 658, in assertBinaryOperation
    """ % kwargs, "Error running %(operation)s with x=%(x)s and y=%(y)s" % kwargs)
  File "c:\users\compu\documents\repositories\batavia\tests\utils.py", line 432, in assertCodeExecution
    self.fail(e)
AssertionError: Unable to create webpage.: undefined

----------------------------------------------------------------------
Ran 1 test in 1.430s

FAILED (failures=1)

I'm investigating utils.py, uncommenting various lines and getting a feel for it. Hang tight.

@DawnPaladin
Contributor
DawnPaladin commented May 24, 2016 edited

Trying to get python setup.py test -s tests.datatypes.test_str.BinaryStrOperationTests.test_add_str to pass.

In tests\datatypes\test_str.py is class BinaryStrOperationTests. In the not_implemented array are various tests such as test_add_set and test_add_tuple; test_add_str is not among them. When I add it to the array, the above command gives "expected failure" instead of "FAIL"! So the problem was that test_add_str wasn't on the list of tests. That's why it was returning undefined.

@DawnPaladin
Contributor

Now I'm looking at test\structures\test_assignment.py, specifically test_simple_assignment, which is fully implemented, not a dummy test. Here's the code:

    def test_simple_assignment(self):
        self.assertCodeExecution("""
            x = 42
            print(x)
            print('Done.')
            """)

And here's what I get when I run it:

running test
running egg_info
writing requirements to batavia.egg-info\requires.txt
writing batavia.egg-info\PKG-INFO
writing top-level names to batavia.egg-info\top_level.txt
writing dependency_links to batavia.egg-info\dependency_links.txt
reading manifest file 'batavia.egg-info\SOURCES.txt'
reading manifest template 'MANIFEST.in'
warning: no files found matching 'requirements*.txt'
writing manifest file 'batavia.egg-info\SOURCES.txt'
running build_ext
test_simple_assignment (tests.structures.test_assignment.AssignmentTests) ... <<< var page = require('webpage').create()
FAIL

======================================================================
FAIL: test_simple_assignment (tests.structures.test_assignment.AssignmentTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "c:\users\compu\documents\repositories\batavia\tests\utils.py", line 429, in assertCodeExecution
    args=args
  File "c:\users\compu\documents\repositories\batavia\tests\utils.py", line 275, in runAsJavaScript
    on_fail="Unable to create webpage."
Exception: Unable to create webpage.: undefined

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "c:\users\compu\documents\repositories\batavia\tests\structures\test_assignment.py", line 10, in test_simple_assignment
    """)
  File "c:\users\compu\documents\repositories\batavia\tests\utils.py", line 432, in assertCodeExecution
    self.fail(e)
AssertionError: Unable to create webpage.: undefined

----------------------------------------------------------------------
Ran 1 test in 1.417s

FAILED (failures=1)

Even though the tests don't pass, I am able to run the Batavia server as described in Tutorial 0. When I run

x = 42
print(x)
print('Done.')

the expected output appears under "Console output". However, when I copy-and-paste

            x = 42
            print(x)
            print('Done.')

into the input box, I get no output at all, even though the only difference is indentation. Could indentation be messing up the test somehow, or is that a red herring?

@freakboy3742
Member

test_add_str is intentionally not on the list - the list isn't a list of tests to run, it's a "not implemented" list of tests that are known to fail. The add operator for String has been implemented, hence the test should pass.

In your case, you're getting the same error as before. I suspect the cause will be what I flagged in point (3) above - Windows style line endings preventing the test system from correctly identifying the success condition in terminal output.

My first stab at a fix: Around line 154 (in sendPhantomCommand()), is the following:

            else:
                out[-1] += ch

Modify that to read:

            elif ch != '\r':
                out[-1] += ch

This will instruct the test runner to ignore \r characters, which should bring Windows output into alignment with Unix/OS X output, and allow the test suite to complete.

As for the indentation - the test suite strips left indentation before executing code, so that isn't a problem. However, if you cut and paste code into the test server window, you'll need to strip that indentation. If you open the debug console for your browser, you should see a SyntaxError indicating that the code provided couldn't be compiled.

One last thing - I've just committed a couple of big updates; before you start in on anything new, you'll want to make sure you've got the most current version of the code.

@DawnPaladin
Contributor

Thanks for the heads-up. Nuked my repo and forked a fresh copy.

I got a new error message! Making progress. I uncommented all the lines between 133 and 154 and ran python setup.py test -s tests.datatypes.test_str.BinaryStrOperationTests.test_add_str to get this:

C:\Users\compu\Documents\Repositories\batavia (master)
λ python setup.py test -s tests.datatypes.test_str.BinaryStrOperationTests.test_add_str
running test
running egg_info
writing top-level names to batavia.egg-info\top_level.txt
writing batavia.egg-info\PKG-INFO
writing requirements to batavia.egg-info\requires.txt
writing dependency_links to batavia.egg-info\dependency_links.txt
reading manifest file 'batavia.egg-info\SOURCES.txt'
reading manifest template 'MANIFEST.in'
warning: no files found matching 'requirements*.txt'
writing manifest file 'batavia.egg-info\SOURCES.txt'
running build_ext
test_add_str (tests.datatypes.test_str.BinaryStrOperationTests) ... WAIT FOR PROMPT...
<<< var page = require('webpage').create()
WAIT FOR PROMPT...
>>> undefined
<<< page.onConsoleMessage = function (msg) {    console.log(msg);}
WAIT FOR PROMPT...
>>> undefined
<<< page.injectJs('polyfill.js')
WAIT FOR PROMPT...
>>> true
<<< page.injectJs('../batavia.min.js')
WAIT FOR PROMPT...
>>> true
<<< page.injectJs('temp\modules.js')
WAIT FOR PROMPT...
>>> false
FAIL

======================================================================
FAIL: test_add_str (tests.datatypes.test_str.BinaryStrOperationTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "c:\users\compu\documents\repositories\batavia\tests\utils.py", line 429, in assertCodeExecution
    args=args
  File "c:\users\compu\documents\repositories\batavia\tests\utils.py", line 305, in runAsJavaScript
    on_fail="Unable to inject modules"
  File "c:\users\compu\documents\repositories\batavia\tests\utils.py", line 172, in sendPhantomCommand
    raise Exception(on_fail + ": %s" % response)
Exception: Unable to inject modules: false

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "c:\users\compu\documents\repositories\batavia\tests\utils.py", line 637, in func
    self.assertBinaryOperation(x=value, y=example, operation=operation, format=self.format)
  File "c:\users\compu\documents\repositories\batavia\tests\utils.py", line 658, in assertBinaryOperation
    """ % kwargs, "Error running %(operation)s with x=%(x)s and y=%(y)s" % kwargs)
  File "c:\users\compu\documents\repositories\batavia\tests\utils.py", line 432, in assertCodeExecution
    self.fail(e)
AssertionError: Unable to inject modules: false

----------------------------------------------------------------------
Ran 1 test in 1.485s

FAILED (failures=1)

It looks like we made it through var page = require('webpage').create() and got stuck on page.injectJs('temp\modules.js'). (Maybe it doesn't like the backslash?)

When I run the full test file I see several files and folders being repeatedly created and deleted. I assume temp\modules.js is one of those. Is there a way for me to pause execution so I can check this file?

@freakboy3742
Member

The slash might be the problem - if you check the code (line 303 of tests/utils.py), you'll see that it uses os.path.join, which is why you see a backslash, but I see a forward slash. One possibility is that it actually requires a forward slash, even though you're running on windows - if you replace the os.path.join() call with "/".join(), does that fix the problem?

As for the files being created and deleted - yes, temp/modules.js is one of those. If you want to preserve the output, you'll need to comment out the cleanup code on line 435 of temp/utils.py.

@DawnPaladin
Contributor
DawnPaladin commented May 25, 2016 edited

Success! I changed line 303 from

"page.injectJs('%s')" % os.path.join('temp', 'modules.js'),

to

"page.injectJs('%s')" % 'temp/modules.js', 

and the test passes!

Now I'm running python setup.py test and getting much fewer failures than before--only 19, instead of the 725 I was getting earlier.

The ones that are still failing look like this:

======================================================================                                        
FAIL: test_symbol_import_class (tests.structures.test_import.NativeImportTests)                               
----------------------------------------------------------------------                                        
Traceback (most recent call last):                                                                            
  File "c:\users\compu\documents\repositories\batavia\tests\utils.py", line 529, in assertJavaScriptExecution 
    args=args                                                                                                 
  File "c:\users\compu\documents\repositories\batavia\tests\utils.py", line 316, in runAsJavaScript           
    on_fail="Unable to inject native module %s" % mod                                                         
Exception: Unable to inject native module example: false                                                      

During handling of the above exception, another exception occurred:                                           

Traceback (most recent call last):                                                                            
  File "c:\users\compu\documents\repositories\batavia\tests\structures\test_import.py", line 922, in test_symb
l_import_class                                                                                                
    """)                                                                                                      
  File "c:\users\compu\documents\repositories\batavia\tests\utils.py", line 532, in assertJavaScriptExecution 
    self.fail(e)                                                                                              
AssertionError: Unable to inject native module example: false                                                 

Investigating...

@freakboy3742
Member

Awesome - I'm gonna bet that all 19 failures are native javascript tests, and it will be a similar problem, but with the path of a native script that is being injected. If you apply the same fix to the path construction on line 313, that should do the job.

@DawnPaladin
Contributor

Yep, line 313 was the culprit. Changing it to "page.injectJs('%s.js')" % "/".join(('temp', mod)), fixed 14 more tests.

Here are the 5 failing tests which remain:

======================================================================
FAIL: test_list (tests.builtins.test_iter.BuiltinIterFunctionTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "c:\users\compu\documents\repositories\batavia\tests\utils.py", line 730, in func
    self.assertBuiltinFunction(x=example, f=function, operation=operation, format=self.format)
  File "c:\users\compu\documents\repositories\batavia\tests\utils.py", line 750, in assertBuiltinFunction
    """ % kwargs, "Error running %(operation)s with x=%(x)s" % kwargs)
  File "c:\users\compu\documents\repositories\batavia\tests\utils.py", line 448, in assertCodeExecution
    self.assertEqual(js_out, py_out, context)
AssertionError: '<list_iterator object at 0xXXXXXXXX>\n' != '<list_iterator object at 0xXXXXXXXXF50>\n'
- <list_iterator object at 0xXXXXXXXX>
+ <list_iterator object at 0xXXXXXXXXF50>
?                                    +++
 : Global context: Error running f(x) with x=[]

======================================================================
FAIL: test_str (tests.builtins.test_iter.BuiltinIterFunctionTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "c:\users\compu\documents\repositories\batavia\tests\utils.py", line 730, in func
    self.assertBuiltinFunction(x=example, f=function, operation=operation, format=self.format)
  File "c:\users\compu\documents\repositories\batavia\tests\utils.py", line 750, in assertBuiltinFunction
    """ % kwargs, "Error running %(operation)s with x=%(x)s" % kwargs)
  File "c:\users\compu\documents\repositories\batavia\tests\utils.py", line 448, in assertCodeExecution
    self.assertEqual(js_out, py_out, context)
AssertionError: '<str_iterator object at 0xXXXXXXXX>\n' != '<str_iterator object at 0x01DE5F50>\n'
- <str_iterator object at 0xXXXXXXXX>
?                           ^^^^^^^^
+ <str_iterator object at 0x01DE5F50>
?                           ^^^^^^^^
 : Global context: Error running f(x) with x=""

======================================================================
FAIL: test_tuple (tests.builtins.test_iter.BuiltinIterFunctionTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "c:\users\compu\documents\repositories\batavia\tests\utils.py", line 730, in func
    self.assertBuiltinFunction(x=example, f=function, operation=operation, format=self.format)
  File "c:\users\compu\documents\repositories\batavia\tests\utils.py", line 750, in assertBuiltinFunction
    """ % kwargs, "Error running %(operation)s with x=%(x)s" % kwargs)
  File "c:\users\compu\documents\repositories\batavia\tests\utils.py", line 448, in assertCodeExecution
    self.assertEqual(js_out, py_out, context)
AssertionError: '<tuple_iterator object at 0xXXXXXXXX>\n' != '<tuple_iterator object at 0x03A2E830>\n'
- <tuple_iterator object at 0xXXXXXXXX>
?                             ^^^^^^^^
+ <tuple_iterator object at 0x03A2E830>
?                             ^^^^^^^^
 : Global context: Error running f(x) with x=(1, 2.3456, 'another')

======================================================================
FAIL: test_creation (tests.datatypes.test_dict.DictTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "c:\users\compu\documents\repositories\batavia\tests\datatypes\test_dict.py", line 33, in test_creation
    """)
  File "c:\users\compu\documents\repositories\batavia\tests\utils.py", line 448, in assertCodeExecution
    self.assertEqual(js_out, py_out, context)
AssertionError: '{}\n' != "{'a': 1}\n"
- {}
+ {'a': 1}
 : Global context

======================================================================
FAIL: test_getitem (tests.datatypes.test_dict.DictTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "c:\users\compu\documents\repositories\batavia\tests\datatypes\test_dict.py", line 43, in test_getitem
    """)
  File "c:\users\compu\documents\repositories\batavia\tests\utils.py", line 448, in assertCodeExecution
    self.assertEqual(js_out, py_out, context)
AssertionError: "False\nTrue\n### EXCEPTION ###\nKeyError: 'a'\n    test.py:5\n" != 'True\nFalse\n1\n'
+ True
  False
+ 1
- True
- ### EXCEPTION ###
- KeyError: 'a'
-     test.py:5
 : Global context

----------------------------------------------------------------------
Ran 4143 tests in 592.479s
@funkybob
Contributor

Wouldn't it be better to use posixpath.join to ensure it's done cleanly?
For the same reasons you used os.path.join in the first place?

On 25/05/16 14:04, Russell Keith-Magee wrote:

Awesome - I'm gonna bet that all 19 failures are native javascript
tests, and it will be a similar problem, but with the path of a native
script that is being injected. If you apply the same fix to the path
construction on line 313, that should do the job.


You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub
#70 (comment)

@freakboy3742
Member

@DawnPaladin Ok - the first three are part of the output normalisation; for some reason, it appears that Windows outputs memory addresses in upper case. If you modify the regex on line 313 to be up to 16 characters, including uppercase A-F, those two should pass.

The last two are a bit harder to explain - unless you're using Python 3.5. Python 3.5 made a very small but subtle change to the format of bytecode for loading dictionaries; for the moment, Batavia is targeting Python 3.4.

If you're not using Python 3.5, then more investigation will be required - you'll probably need to step through the code in your browser to check exactly where the test is going wrong.

@freakboy3742
Member

@funkybob Couldn't hurt - although, I'm not sure what posixpath.join would catch other than the separator join. I thought posixpath.join just existed as a proxy for os.path.join on posix platforms.

@DawnPaladin
Contributor

I downloaded Python 3.4.4 and now I'm down to 3 failures. Can you double-check where the regex is? I don't see one on line 313.

@freakboy3742
Member

Sorry - mistake - line 350. The line in question is:

MEMORY_REFERENCE = re.compile('0x[\dabcdef]{4,12}')
@funkybob
Contributor

Perhaps I didn't read the thread closely enough... I figured if you were using os.path.join, and it was b0rking on Windows because of platform-dependent backend selection, why not just select the proper backend...

@DawnPaladin
Contributor

Got it! Changing line 350 to MEMORY_REFERENCE = re.compile('0x[\dABCDEF]{4,16}') caused a few other tests to fail because they were expecting lowercase; MEMORY_REFERENCE = re.compile('0x[\dABCDEFabcdef]{4,16}') does the job.

----------------------------------------------------------------------
Ran 4143 tests in 626.425s

OK (expected failures=3278)

What's next? Should I submit a pull request?

@freakboy3742
Member

Hooray! 🎉

Yes, a pull request would be fantastic. In addition to the software changes needed to get the code running, If you can add a section to the documentation about what you had to do/install to get this running under Windows, that would be amazing.

@DawnPaladin
Contributor
@freakboy3742
Member

Fixed by #72, committed in 036e10c

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment