With some help from Ned Batchelder I was able to confirm that this is a Python bug: http://bugs.python.org/issue1569356 that has been fixed since the 2.5.2 release. Ned confirmed that the fix is included in Python 2.6a3.
Doug On Sep 16, 5:28 pm, Doug Latornell <[EMAIL PROTECTED]> wrote: > Thanks, Jorge. > > I took this to the sqlalchemy > listhttp://groups.google.com/group/sqlalchemy/browse_thread/thread/66eea9... > and got a quick reply that it's not an sa issue, and that it has also > been seen with Bitten. I also got an even simpler test case that > isolates the problem to coverage:http://paste.turbogears.org/paste/7081 > > So, I guess the next stop > ishttp://nedbatchelder.com/code/modules/coverage.html > > Doug > > On Sep 16, 11:33 am, "Jorge Vargas" <[EMAIL PROTECTED]> wrote: > > > Awesome debugging on your part. I think we are almost certain at this > > point that this is an issue with SQLAlchemy's metaclass used to build > > the properties (or coverage not understanding them), I'll suggest you > > cc the sa mailing list so Michael Bayer will take a look at it. > > > On Tue, Sep 16, 2008 at 11:12 AM, Doug Latornell <[EMAIL PROTECTED]> wrote: > > > >http://paste.turbogears.org/paste/7051isolatesthe problem to an > > > interaction between sqlalchemy and coverage - takes nose out of the > > > picture. > > > >http://paste.turbogears.org/paste/7052showsthat the problem isn't > > > there for a plain Python property (in contrast to a sqlalchemy > > > synonym). > > > > Doug > > > > On Sep 15, 9:42 pm, Doug Latornell <[EMAIL PROTECTED]> wrote: > > >> I've reproduced this problem outside of > > >> TG2:http://paste.turbogears.org/paste/6992 > > > >> Looks to me like it's an issue in coverage, nose, or sqlalchemy, > > >> especially since it only appears when --with-coverage is used. > > > >> Doug > > > >> On Sep 15, 6:17 pm, Doug Latornell <[EMAIL PROTECTED]> wrote: > > > >> > I'm stumped. > > > >> > There's something weird happening to attribute calls in > > >> > identity.py:User._set_password() when nosetests --with-coverage is > > >> > used. But the weirdness goes away if you don't ask for coverage. > > >> > Attribute calls are being transferred on to property from the synonym > > >> > call. There's nothing special about __encrypt_password(); you can get > > >> > the same weirdness by changing: > > >> > self._password = self.__encrypt_password(algorithm, password) > > >> > to > > >> > self._password = password.upper() > > > >> > Doug > > > >> > On Sep 15, 10:03 am, Doug Latornell <[EMAIL PROTECTED]> wrote: > > > >> > > I can reproduce what you are seeing Stef. I've got a clean 1.9.7a4 > > >> > > virtualenv with coverage, WebTest, and BeautifulSoup added manually > > >> > > via easy_install. > > > >> > > It's interesting that the problem only arises when nose is run with > > >> > > the coverage plug-in. > > > >> > > I'll try to get some time later today to dig into this and reply here > > >> > > with what (if anything) I find. > > > >> > > Doug > > > >> > > On Sep 13, 9:30 am, Stef <[EMAIL PROTECTED]> wrote: > > > >> > > > Hello > > > >> > > > First of all, I want to say a big thank to all of you for > > >> > > > developing this > > >> > > > amazing framework. > > > >> > > > I've decided to take a look at TG2 to see all the new features > > >> > > > since TG1. > > >> > > > I've just made a fresh install and create a project named > > >> > > > 'tgtest' from > > >> > > > paster quickstart and answered 'yes' to identity question. > > > >> > > > As I want to use unit testing I've tried nosetests. If I'm simply > > >> > > > running > > >> > > > "nosetests" all tests pass, but if i'm trying the command > > >> > > > "nosetests > > >> > > > --with-coverage --cover-package=tgtest" it fails with one error > > >> > > > and give me > > >> > > > this traceback : > > > >> > > > > nosetests --with-coverage --cover-package=tgtest > > > >> > > > E > > >> > > > ====================================================================== > > >> > > > ERROR: Failure: AttributeError ('property' object has no attribute > > >> > > > '_User__encrypt_password') > > >> > > > ---------------------------------------------------------------------- > > >> > > > Traceback (most recent call last): > > >> > > > File > > >> > > > "/opt/local/lib/python2.5/site-packages/nose-0.10.3-py2.5.egg/nose/loader.py", > > >> > > > line 364, in loadTestsFromName > > >> > > > addr.filename, addr.module) > > >> > > > File > > >> > > > "/opt/local/lib/python2.5/site-packages/nose-0.10.3-py2.5.egg/nose/importer.py", > > >> > > > line 39, in importFromPath > > >> > > > return self.importFromDir(dir_path, fqname) > > >> > > > File > > >> > > > "/opt/local/lib/python2.5/site-packages/nose-0.10.3-py2.5.egg/nose/importer.py", > > >> > > > line 84, in importFromDir > > >> > > > mod = load_module(part_fqname, fh, filename, desc) > > >> > > > File > > >> > > > "/Developer/stef/work/perso/tgtest/tgtest/tests/__init__.py", line > > >> > > > 33, in <module> > > >> > > > cmd.run([test_file]) > > >> > > > File > > >> > > > "/opt/local/lib/python2.5/site-packages/PasteScript-1.6.3-py2.5.egg/paste/script/appinstall.py", > > >> > > > line 68, in run > > >> > > > return super(AbstractInstallCommand, self).run(new_args) > > >> > > > File > > >> > > > "/opt/local/lib/python2.5/site-packages/PasteScript-1.6.3-py2.5.egg/paste/script/command.py", > > >> > > > line 213, in run > > >> > > > result = self.command() > > >> > > > File > > >> > > > "/opt/local/lib/python2.5/site-packages/PasteScript-1.6.3-py2.5.egg/paste/script/appinstall.py", > > >> > > > line 456, in command > > >> > > > self, config_file, section, > > >> > > > self.sysconfig_install_vars(installer)) > > >> > > > File > > >> > > > "/opt/local/lib/python2.5/site-packages/PasteScript-1.6.3-py2.5.egg/paste/script/appinstall.py", > > >> > > > line 600, in setup_config > > >> > > > mod.setup_config(command, filename, section, vars) > > >> > > > File "/Developer/stef/work/perso/tgtest/tgtest/websetup.py", > > >> > > > line 21, in > > >> > > > setup_config > > >> > > > u = model.User() > > >> > > > File "<string>", line 4, in __init__ > > >> > > > File > > >> > > > "/opt/local/lib/python2.5/site-packages/SQLAlchemy-0.5.0rc1-py2.5.egg/sqlalchemy/orm/attributes.py", > > >> > > > line 815, in initialize_instance > > >> > > > fn(self, instance, args, kwargs) > > >> > > > File > > >> > > > "/opt/local/lib/python2.5/site-packages/SQLAlchemy-0.5.0rc1-py2.5.egg/sqlalchemy/orm/mapper.py", > > >> > > > line 1678, in _event_on_init > > >> > > > instrumenting_mapper.compile() > > >> > > > File > > >> > > > "/opt/local/lib/python2.5/site-packages/SQLAlchemy-0.5.0rc1-py2.5.egg/sqlalchemy/orm/mapper.py", > > >> > > > line 369, in compile > > >> > > > mapper.__initialize_properties() > > >> > > > File > > >> > > > "/opt/local/lib/python2.5/site-packages/SQLAlchemy-0.5.0rc1-py2.5.egg/sqlalchemy/orm/mapper.py", > > >> > > > line 390, in __initialize_properties > > >> > > > prop.init(key, self) > > >> > > > File > > >> > > > "/opt/local/lib/python2.5/site-packages/SQLAlchemy-0.5.0rc1-py2.5.egg/sqlalchemy/orm/interfaces.py", > > >> > > > line 384, in init > > >> > > > self.do_init() > > >> > > > File > > >> > > > "/opt/local/lib/python2.5/site-packages/SQLAlchemy-0.5.0rc1-py2.5.egg/sqlalchemy/orm/properties.py", > > >> > > > line 207, in do_init > > >> > > > None, None, False, comparator_callable, > > >> > > > proxy_property=self.descriptor) > > >> > > > File > > >> > > > "/opt/local/lib/python2.5/site-packages/SQLAlchemy-0.5.0rc1-py2.5.egg/sqlalchemy/orm/strategies.py", > > >> > > > line 45, in _register_attribute > > >> > > > active_history=active_history > > >> > > > File > > >> > > > "/opt/local/lib/python2.5/site-packages/SQLAlchemy-0.5.0rc1-py2.5.egg/sqlalchemy/orm/unitofwork.py", > > >> > > > line 87, in register_attribute > > >> > > > return attributes.register_attribute(class_, key, *args, > > >> > > > **kwargs) > > >> > > > File > > >> > > > "/opt/local/lib/python2.5/site-packages/SQLAlchemy-0.5.0rc1-py2.5.egg/sqlalchemy/orm/attributes.py", > > >> > > > line 1460, in register_attribute > > >> > > > descriptor = proxy_type(key, proxy_property, comparator, > > >> > > > parententity) > > >> > > > File > > >> > > > "/opt/local/lib/python2.5/site-packages/SQLAlchemy-0.5.0rc1-py2.5.egg/sqlalchemy/orm/attributes.py", > > >> > > > line 156, in __init__ > > >> > > > self.descriptor = self.user_prop = descriptor > > >> > > > File > > >> > > > "/Developer/stef/work/perso/tgtest/tgtest/model/identity.py", line > > >> > > > 102, in _set_password > > >> > > > self._password = self.__encrypt_password(algorithm, password) > > >> > > > File > > >> > > > "/opt/local/lib/python2.5/site-packages/SQLAlchemy-0.5.0rc1-py2.5.egg/sqlalchemy/orm/attributes.py", > > >> > > > line 184, in __getattr__ > > >> > > > return getattr(descriptor, attribute) > > >> > > > AttributeError: 'property' object has no attribute > > >> > > > '_User__encrypt_password' > > > >> > > > Name Stmts Exec Cover Missing > > >> > > > --------------------------------------------------------- > > >> > > > tgtest 0 0 100% > > >> > > > tgtest.config 0 0 100% > > >> > > > tgtest.config.app_cfg 21 21 100% > > >> > > > tgtest.config.environment 2 2 100% > > >> > > > tgtest.config.middleware 6 6 100% > > >> > > > tgtest.controllers 0 0 100% > > >> > > > tgtest.lib 0 0 100% > > >> > > > tgtest.lib.app_globals 3 3 100% > > >> > > > tgtest.lib.helpers 1 1 100% > > >> > > > tgtest.model 10 10 100% > > >> > > > tgtest.model.identity 68 43 63% 50, 72, 77-80, > > >> > > > 87, 94, > > >> > > > 107, 116-149, 154-158 > > >> > > > tgtest.templates 0 0 100% > > >> > > > tgtest.websetup 38 13 34% 22-55 > > >> > > > --------------------------------------------------------- > > >> > > > TOTAL 149 99 66% > > >> > > > ---------------------------------------------------------------------- > > ... > > read more » --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "TurboGears" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/turbogears?hl=en -~----------~----~----~----~------~----~------~--~---

