[Pythonmac-SIG] py2app standalone options
Bob Ippolito
bob at redivi.com
Wed Dec 22 00:07:06 CET 2004
On Dec 21, 2004, at 5:42 PM, has wrote:
> Chris Barker wrote:
>
>> I originally came down on Has' side of this debate, but now think Bob
>> has made the right choices, so I thought I'd add a couple comments.
>>
>> First, I'm a little unclear on what exactly Has wants. Could you
>> clarify?
>
> Freedom, basically. It's easier to assemble a workflow by mixing and
> matching small, single-purpose components than to strip down a great
> big monolithic lump to get the pieces you want/need. If you're going
> to protect the end user from doing stupid things, that's great, but it
> should be done by the next layer up. Users who work at the top layer
> are protected; users who want/need to route around the 'dummy mode'
> restrictions can go in at the layer beneath. After all, it's the
> user's foot, and if they want to shoot holes in it in full knowledge
> of what they're doing then far be it for anyone or anything else to
> stand in their way.
>
> For example, appscript currently takes this approach. The lower-level
> aem package provides a comprehensive wrapper around the AEM; appscript
> builds on this to provide a nice, safe, friendly-looking user
> interface for application scripting. Most folks'll just use appscript
> for all their application scripting, but geeks who need access to the
> full AEM, e.g. to send asynchronous events, can use aem. Prior to
> 0.6.0 appscript was a monolithic system, which meant you were SOOL if
> you wanted to do async events, for example - an issue Bob also
> happened to raise at the time.
The lower levels at this point, similar to appscript / aem are
py2app.create_appbundle / modulegraph.find_modules /
macholib.MachOGraph. You can do all the foot shooting you want with
them!
> To give a practical example, let's say I want to write a GUI interface
> to py2app. My main dialog has some text fields and checkboxes for
> basic setup info, plus a table view listing all dependencies, allowing
> users to check/uncheck the items they want/don't want included. The
> obvious way to implement this would be to call modulegraph to generate
> the table content, then take the list of checked items and feed it to
> py2app's package-building function via an 'includeitems' argument. I
> really don't want or need py2app to run modulegraph a second time just
> because it's been welded into the basemost layer.
That's sort of a backwards way to get at it.. given a proper
refactoring of py2app, the "dependency finding" and "application
building" would simply be split into two separate build phases (which
means two command classes and a mess of additional code), so you'd run
the dependency resolution phase, manipulate the py2app instance, and
then run the build application phase. This is not currently the case,
because py2app._run does both. For 0.1.7 I'll at least split this up
into more pieces, so it has more useful hooks for subclasses.
> If nothing else, a more loosely-coupled architecture takes pressure
> off the developer to anticipate and support every single possible use
> to which a user might want/need to put their system and/or its
> components now or in the future.
Distutils is the antithesis of loosely-coupled architecture. py2app is
slowly being split apart into orthogonal components, but this
flexibility would add a lot of complexity that I don't want to deal
with at this point.
-bob
More information about the Pythonmac-SIG
mailing list