<MFen> hmm <MFen> needs some work <exarkun> how close does it come to working? <MFen> i get this <MFen> File "win32serviceutil.pyo", line 670, in SvcRun File "__service__.pyo", line 44, in SvcDoRun File "twisted\application\service.pyo", line 293, in loadApplication File "twisted\persisted\sob.pyo", line 182, in load File "imputil.pyo", line 103, in _import_hook File "<string>", line 52, in _import_top_module File "imputil.pyo", line 216, in import_top File "imputil.pyo", line 271, in _import_one File "<string>", line 128, in _process_result F <MFen> ile "atop\__init__.pyo", line 10, in ? File "atop\regadapt.pyo", line 30, in justDoIt File "twisted\python\plugin.pyo", line 305, in getPlugIns File "twisted\python\plugin.pyo", line 191, in getPluginFileList exceptions.IOError Couldn't find a plugins file! <exarkun> ahh <MFen> i've been mostly working with tacs so far <MFen> i need to figure out how to automatically add the mktap plugin parts <radix> MFen: have you tap2ntsvc-ed anything that uses plugins? <MFen> however <radix> MFen: those aren't tap plugins <radix> well, rather <MFen> the fact that mktap quotient has side effects worries me <radix> atop isn't trying to get tap plugins <MFen> hmm, ok <radix> it's trying to get plugins that are used elsewhere in the system <radix> not that it matters; the important bit is that you need to support inclusion of the plugins.tml <MFen> is this something that tap2deb understands? <radix> MFen: well, tap2deb assumes that the python package is installed already <itamar> tap2deb doesn't package python source code <MFen> the plugins.tml has to be in sys.path, is that correct? <radix> MFen: no <radix> MFen: it has to be in a top-level python package <MFen> um <radix> MFen: which means it has to be in a directory inside a directory in sys.path as long as it has an __init__.* <MFen> i hope it doesn't have to be in the same python package that i'm running, because i can't stick it into the exe <itamar> i.e. inside folder /foo/bar where /foo is in sys.path and there's a /foo/bar/__init__.py <MFen> ok <MFen> so if i sys.path.insert(0, sibpath(sys.executable, '')) and make a foobar/{__init__.py,plugins.tml} <MFen> it should work? <radix> MFen: hrm, something like that <exarkun> MFen: while that would work, fixing it at a higher level might be nicer <itamar> ooh, an email from Pavel <radix> MFen: just so you know, btw, quotient has three top-level packages and they all have plugins.tml files :) <MFen> oh good grief <radix> oh wait, only two of them have plugins.tml <MFen> there's no way in hell i'm going to be able to figure this all out programmatically <exarkun> MFen: If you can find all the plugins.tml files at tap2ntsvc time, then you *know* what files getPlugIns() should be examining <itamar> there ought to be code in twisted.python.plugins that returns list of plugisn files <itamar> may need a bit refactoring <exarkun> MFen: you don't have to monkey the filesystem at all <exarkun> itamar: There is. <radix> itamar: i think that's already how it works <radix> in fact, i think i'm the one that refactored it to be so!! <radix> because I am a genius <MFen> so.. in order to get the list <MFen> i have to basically start the application <radix> eh <radix> you don't want to use that function to do what exarkun said <radix> because you will get all the plugins.tml everywhere on the system <radix> you should search all the top-level packages that are being packaged and grab their plugins.tmls <exarkun> no! <exarkun> wrong! <radix> what <exarkun> you want to do both. <radix> exarkun: why? <exarkun> unless you want to utterly cripple the plugin system and make it completely worthless. <exarkun> radix: repeat after me <exarkun> radix: "plugin" <itamar> yes! <radix> exarkun: please explain coherently <exarkun> radix: "plug" <exarkun> radix: "in" <itamar> however, that still won't help with packaging thosepackages <exarkun> radix: "pluuuuuuggg iiiinnnnn" <MFen> it doesn't matter. i can't search anything. as it is, you have to manually inject modules to be packaged, and after that point it's out of my hands. if py2exe can't figure it out, i can't either <itamar> it's Zombie Jean-Paul <radix> MFen: you have to specify all modules, not just packages? <exarkun> MFen: so you can't package plugins.tml? <radix> oh, you use py2exe for figuring out what modules to take? <MFen> radix: no. for example, with quotient, all it seems to need is -i atop <radix> or rather, i guess you just use py2exe :) <radix> MFen: that's a py2exe parameter, or a tap2ntsvc parameter? <MFen> tap2ntsvc, but it gets passed on to py2exe inchanged <MFen> un <radix> MFen: right <radix> MFen: so look in the packages that are passed to -i for plugins.tml files <radix> ? <MFen> and do what with them? that's the question <radix> MFen: well, make sure getPlugins will search them at runtime :) <MFen> loading a plugin implies loading a bunch of modules <MFen> i have to include those modules somehow <radix> MFen: those are already in the packages that py2exe grabbed <radix> MFen: at least, that's what you can assume <radix> reasonably <MFen> i don't know that i can <radix> MFen: why not? <MFen> py2exe grabs whatever the script depends on <radix> MFen: well it's up to the user to make sure all their modules are included <MFen> essentially, that's win32 stuff, some twisted stuff and whatever the -i requires <radix> same as if they were using py2exe itself <radix> of course, if you want to parse the .tml file yourself and make sure the modules it references are included, that would be nice <radix> :) <MFen> yucky <MFen> well that would be a minimum <radix> but i wouldn't bother <radix> ok! heh <exarkun> MFen: Can't you pass it to modulefinder? <radix> so you're trying to be nicer than py2exe is :) <exarkun> It's just Python source <radix> modulefinder finds modules that are in strings? <MFen> modulefinder isn't that smart <exarkun> modulefinder sucks <radix> .tml just does register('module.name') <exarkun> just rewrite it w/ AST <MFen> AST? <exarkun> radix: often. <exarkun> radix: sometimes not. <radix> there's no reason that should reasonably include the module <exarkun> MFen: compiler.compile(file("foo.tml")) <exarkun> MFen: then walk the tree and look for imports <exarkun> it shouldn't be very hard <radix> ?? <radix> the .tml file doesn't actually do imports! <exarkun> radix: it is a python source file <exarkun> radix: it does whatever it bloody wants <radix> exarkun: the whole _point_ of the .tml mechanism is to avoid imports <exarkun> no it isn't <exarkun> the point is to avoid _some_ imports <radix> exarkun: so you need better support than that <radix> most <radix> look at twisted/plugins.tml <exarkun> ok, you're talking about different modules than I am <exarkun> in this case, just load it <radix> how many imports do you see there? <exarkun> it *tells* you what modules it wants <exarkun> it couldn't possibly be any easier <radix> yes. <MFen> hell, it'd be easier to just walk the filesystem looking for .py and include all of it <radix> you'll have to actually have special support for the .tml, not using basic introspection <radix> MFen: heh <exarkun> hardly special <exarkun> just load it and look .module attributes <radix> that's support that is specific to the twisted plugin system :) <radix> i.e., "special" <exarkun> ok <radix> so <radix> why does he need to call getPlugins at package-time? <exarkun> So he knows what modules to include <radix> sorry, "loadPlugin" <radix> s <radix> exarkun: oh, you mean, passing the list of plugins.tml files that we've found explicitly <exarkun> yes <MFen> ok, so i load the plugin, *implement modulefinder*, and use my new modulefinder to collect all the .py that the plugin needs <radix> MFen: nah <radix> MFen: it's trivial <radix> it's nothing like modulefinder <radix> hrm <MFen> if it's so trivial why doesn't modulefinder do it? <radix> MFen: modulefinder doesn't know about twisted :) <exarkun> it only applies to .tml files <MFen> it has nothing to do with .tml files <radix> actually, loadPlugins isn't quite sufficient.... <radix> MFen: yes, it does. <MFen> at some point in the future, the runtime needs a bunch of modules that aren't directly referenced by the script <radix> you know which modules to include by looking at the .tml files <MFen> no! you don't. you only know at best which modules the .tml file loads directly <MFen> what about all the modules that get loaded indirectly <radix> MFen: this is what we have been talking about <radix> MFen: it will be easy to write support for .tml files to *know which files they load indirectly* <radix> well, apart from the fact that loadPlugins requiresa "pluginType" argument :-( <radix> and that there's no catch-all <exarkun> Yes there is <radix> unless you want to implement an object that has a special __eq__ <radix> that always returns True <MFen> ok, i don't want to know about what pluginType means.. i want to know why you think a plugin can ever know what modules it loads indirectly <radix> MFen: because plugins.tml tells you <radix> register("Lore Slides", <radix> "twisted.lore.slides", <radix> description="Lore for slides", <radix> type="lore", <radix> tapname="lore-slides") <radix> see the second argument? <MFen> that's not what i mean <exarkun> MFen: just import it <exarkun> MFen: and use modulefinder on it <MFen> i mean the files that twisted.lore.slides imports <MFen> exarkun: you'd think that would work. in fact, it doesn't. py2exe does load the scripts it's finding modules on, and it still doesn't find stuff like that <radix> wait, wait <MFen> it's not looking for import opcodes or anything smart like that, it's doing something much weirder <radix> MFen: py2exe takes arguments for this, doesn't it? <MFen> yes <radix> MFen: you will pass "twisted.lore.slides" to py2exe as a module to require <MFen> hmm <MFen> all right, now look at nevow/plugins.tml <exarkun> Right, that's why I was talking about walking the AST. <radix> hurrk <itamar> evil <radix> well <radix> this is what I suggested before, I'll suggest it again <itamar> personally I'd just rely oh passing lists of package names to package <radix> forget the whole thing and let people worry about what modules they want to include themselves :) <radix> and just make sure the plugins.tml files are there