I started on PollyReports yesterday morning, and as of right now, it’s usable. It’s true, PollyReports lacks some functionality from Geraldo Reports, but as I said in my post yesterday, that was the plan. Keep it simple, Stanley, or something to that effect.
Using Robin Parmar’s lines-of-code counter found here, I’ve counted the code lines in both projects. Geraldo Reports consists of 90,138 lines of code (in my current fork, which is pretty close to the standard in terms of length), while PollyReports has just 1,345 lines. These are the “minimal” numbers, with comments and blank lines ignored, and they include all the Python files in each of the respective directories. This includes the sample data file for PollyReports… which is 1002 code-lines long.
The actual PollyReports.py is 382 lines long, including comments and blank lines!
I’m pretty proud of Polly. She’s managed to mature nicely while keeping her girlish figure. I’m sure, as time goes by, she’ll gain a little more weight, but hopefully she’ll never get close to the mass of Geraldo.
Okay, enough silliness. What is still missing? Two things come to mind:
1. A means of adding fonts other than the standard PDF fonts. Geraldo Reports handled this internally… but Polly doesn’t “know” you are using Reportlab, nor import any parts of it directly. Therefore, if you want nonstandard fonts, register them with Reportlab before you pass your canvas to PollyReports. You’ll be able to call on those fonts using whatever names you have registered, just as normal when using Reportlab directly.
What does this buy me? The ability to use a wrapper and run PollyReports with something other than Reportlab. The less of Reportlab’s API the wrapper has to replicate, the easier it will be. Here’s the whole list of Canvas methods and attributes PollyReports uses:
canvas.drawRightString()
canvas.drawString()
canvas.line()
canvas._pagesize
canvas.restoreState()
canvas.saveState()
canvas.setFont()
canvas.setLineWidth()
canvas.setStrokeGray()
canvas.showPage()
canvas.translate()
There’s just no need to add anything to that list, other than perhaps the rect() method at some point (for a Box class, no doubt).
2. Subreports. I can’t think of a clean way to handle subreports, since there must be some way to retrieve the external recordset. Perhaps an Element subclass where you register a callback to get the data? Hmm. Might do it just that way.
Anyway, I’m very pleased with this project. I expect to be using PollyReports for several of my custom software clients very soon.
Are you interested in PollyReports? Let me know!