Last Friday I decided to skip trying to use node.js to parse spreadsheet files and instead stick with my existing perl solution based on
Spreadsheet::Read. Because the code was really old, I had no proper tests, so I just started over from scratch. Poking around Modern Perl 2014 I found a note about using dzil to setup packages.
So I followed along with the choose-your-own-adventure style documentation at http://dzil.org/tutorial/start.html and had good success with setting things up. I rewrote my old code using Moose and immutable state and all that great stuff, and wrote pretty thorough test coverage of the various conditions and edge cases I can think of at the moment.
All was going well until I tried to set up the
When asked to compute the dependencies automatically, dzil choked on my binary spreadsheet files stored in the
ParseStatusSpreadsheeets[master]$ dzil listdeps Could not decode UTF-8 t/files/07-2009.xls; filename set by GatherDir (Dist::Zilla::Plugin::GatherDir line 215); encoded_content added by GatherDir (Dist::Zilla::Plugin::GatherDir line 216); error was: utf8 "xD0" does not map to Unicode at /usr/lib64/perl5/Encode.pm line 176.
I can easily set the
[Prereqs] configuration to list my dependencies manually, but I wanted to do it automatically. I couldn’t believe I was the only person to have binary files mucking up the AutoPrereqs plugin, but the documentation was not helpful at all. The only hints given were to use a custom FileFinder (), but no help on what exactly a FileFinder was or how to set one up in the config file.
Eventually I searched for “binary file” in the Github issues, and found this old bug: https://github.com/rjbs/Dist-Zilla/issues/407. The solution I found there is to tell dzil to ignore files as being binary by listing them in the config file. In my case, that fix works out to be:
[Encoding] encoding = bytes match = xls ; these are all spreadsheet test files [AutoPrereqs]
(Another thing not mentioned in the dzil docs is that when they say that “match” is a regex, they don’t mean that you should write
match = /xls/i because that won’t work! The config file isn’t perl, it is text that gets manipulated by perl.)
Anyway, with that fix to my
dist.ini file, the
AutoPrereqs plugin works as expected:
ParseStatusSpreadsheeets[master]$ dzil listdeps Carp Data::Dumper DateTime::Format::DateParse DateTime::Format::Pg ExtUtils::MakeMaker Moose namespace::autoclean Spreadsheet::Read strict Test::More warnings