{"action":"closed","issue":{"url":"https://api.github.com/repos/ufora/ufora/issues/229","repository_url":"https://api.github.com/repos/ufora/ufora","labels_url":"https://api.github.com/repos/ufora/ufora/issues/229/labels{/name}","comments_url":"https://api.github.com/repos/ufora/ufora/issues/229/comments","events_url":"https://api.github.com/repos/ufora/ufora/issues/229/events","html_url":"https://github.com/ufora/ufora/issues/229","id":137269778,"number":229,"title":"we assume that base class expressions in classDefs are just names","user":{"login":"tdp2110","id":993053,"avatar_url":"https://avatars.githubusercontent.com/u/993053?v=3","gravatar_id":"","url":"https://api.github.com/users/tdp2110","html_url":"https://github.com/tdp2110","followers_url":"https://api.github.com/users/tdp2110/followers","following_url":"https://api.github.com/users/tdp2110/following{/other_user}","gists_url":"https://api.github.com/users/tdp2110/gists{/gist_id}","starred_url":"https://api.github.com/users/tdp2110/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tdp2110/subscriptions","organizations_url":"https://api.github.com/users/tdp2110/orgs","repos_url":"https://api.github.com/users/tdp2110/repos","events_url":"https://api.github.com/users/tdp2110/events{/privacy}","received_events_url":"https://api.github.com/users/tdp2110/received_events","type":"User","site_admin":false},"labels":[{"url":"https://api.github.com/repos/ufora/ufora/labels/bug","name":"bug","color":"fc2929"}],"state":"closed","locked":false,"assignee":{"login":"ronenh","id":624188,"avatar_url":"https://avatars.githubusercontent.com/u/624188?v=3","gravatar_id":"","url":"https://api.github.com/users/ronenh","html_url":"https://github.com/ronenh","followers_url":"https://api.github.com/users/ronenh/followers","following_url":"https://api.github.com/users/ronenh/following{/other_user}","gists_url":"https://api.github.com/users/ronenh/gists{/gist_id}","starred_url":"https://api.github.com/users/ronenh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ronenh/subscriptions","organizations_url":"https://api.github.com/users/ronenh/orgs","repos_url":"https://api.github.com/users/ronenh/repos","events_url":"https://api.github.com/users/ronenh/events{/privacy}","received_events_url":"https://api.github.com/users/ronenh/received_events","type":"User","site_admin":false},"milestone":null,"comments":1,"created_at":"2016-02-29T14:29:27Z","updated_at":"2016-03-08T20:32:49Z","closed_at":"2016-03-08T20:32:49Z","body":"Consider two files: main.py and B.py:\r\n\r\n(B.py)\r\n```\r\nclass B(object):\r\n  pass\r\n```\r\n\r\n(main.py)\r\n```\r\nimport pyfora\r\nimport B\r\n\r\nclass A(B.B):\r\n  pass\r\n\r\nufora = pyfora.connect(...)\r\nwith ufora.remotely:\r\n  A()\r\n```\r\n\r\nrunning main.py gives the following unclear traceback:\r\n\r\n```\r\npython main.py                                                                                                                                                                                                                                                           [tom@lemon 9:27:42]\r\nERROR:root:Re-raising exception after amending lineno.\r\nTraceback (most recent call last):\r\n  File \"/home/tom/volumes/src/packages/python/pyfora/WithBlockExecutor.py\", line 239, in trace\r\n    globalsToSet = self.blockOperation(frame)\r\n  File \"/home/tom/volumes/src/packages/python/pyfora/WithBlockExecutor.py\", line 201, in blockOperation\r\n    f_proxy = self.executor.define(withBlock).resultWithWakeup()\r\n  File \"/home/tom/volumes/src/packages/python/pyfora/Executor.py\", line 181, in define\r\n    ).walkPyObject(obj)\r\n  File \"/home/tom/volumes/src/packages/python/pyfora/PyObjectWalker.py\", line 200, in walkPyObject\r\n    self._walkPyObject(pyObject, objectId)\r\n  File \"/home/tom/volumes/src/packages/python/pyfora/PyObjectWalker.py\", line 224, in _walkPyObject\r\n    self._registerWithBlock(objectId, pyObject)\r\n  File \"/home/tom/volumes/src/packages/python/pyfora/PyObjectWalker.py\", line 452, in _registerWithBlock\r\n    self.walkPyObject(resolution)\r\n  File \"/home/tom/volumes/src/packages/python/pyfora/PyObjectWalker.py\", line 200, in walkPyObject\r\n    self._walkPyObject(pyObject, objectId)\r\n  File \"/home/tom/volumes/src/packages/python/pyfora/PyObjectWalker.py\", line 238, in _walkPyObject\r\n    self._registerClass(objectId, pyObject)\r\n  File \"/home/tom/volumes/src/packages/python/pyfora/PyObjectWalker.py\", line 504, in _registerClass\r\n    classOrFunction=_ClassDefinition\r\n  File \"/home/tom/volumes/src/packages/python/pyfora/PyObjectWalker.py\", line 558, in _classOrFunctionDefinition\r\n    pyObject, pyAst\r\n  File \"/home/tom/volumes/src/packages/python/pyfora/PyObjectWalker.py\", line 787, in _computeAndResolveFreeVariableMemberAccessChainsInAst\r\n    chainWithPosition, pyObject, pyAst\r\n  File \"/home/tom/volumes/src/packages/python/pyfora/PyObjectWalker.py\", line 635, in _resolveChainInPyObject\r\n    self._subchainAndResolutionOrNone(pyObject, pyAst, chainWithPosition)\r\n  File \"/home/tom/volumes/src/packages/python/pyfora/PyObjectWalker.py\", line 654, in _subchainAndResolutionOrNone\r\n    return self._lookupChainInClass(pyObject, pyAst, chainWithPosition)\r\n  File \"/home/tom/volumes/src/packages/python/pyfora/PyObjectWalker.py\", line 681, in _lookupChainInClass\r\n    pyClass, pyAst, chainWithPosition\r\n  File \"/home/tom/volumes/src/packages/python/pyfora/PyObjectWalker.py\", line 695, in _lookupChainInBaseClasses\r\n    baseClassNames = [name.id for name in pyAst.bases]\r\nAttributeError: 'Attribute' object has no attribute 'id'\r\n\r\nTraceback (most recent call last):\r\n  File \"main.py\", line 10, in <module>\r\n    with ufora.remotely.downloadAll():\r\n  File \"main.py\", line 10, in <module>\r\n    with ufora.remotely.downloadAll():\r\n  File \"/home/tom/volumes/src/packages/python/pyfora/WithBlockExecutor.py\", line 239, in trace\r\n    globalsToSet = self.blockOperation(frame)\r\n  File \"/home/tom/volumes/src/packages/python/pyfora/WithBlockExecutor.py\", line 201, in blockOperation\r\n    f_proxy = self.executor.define(withBlock).resultWithWakeup()\r\n  File \"/home/tom/volumes/src/packages/python/pyfora/Executor.py\", line 181, in define\r\n    ).walkPyObject(obj)\r\n  File \"/home/tom/volumes/src/packages/python/pyfora/PyObjectWalker.py\", line 200, in walkPyObject\r\n    self._walkPyObject(pyObject, objectId)\r\n  File \"/home/tom/volumes/src/packages/python/pyfora/PyObjectWalker.py\", line 224, in _walkPyObject\r\n    self._registerWithBlock(objectId, pyObject)\r\n  File \"/home/tom/volumes/src/packages/python/pyfora/PyObjectWalker.py\", line 452, in _registerWithBlock\r\n    self.walkPyObject(resolution)\r\n  File \"/home/tom/volumes/src/packages/python/pyfora/PyObjectWalker.py\", line 200, in walkPyObject\r\n    self._walkPyObject(pyObject, objectId)\r\n  File \"/home/tom/volumes/src/packages/python/pyfora/PyObjectWalker.py\", line 238, in _walkPyObject\r\n    self._registerClass(objectId, pyObject)\r\n  File \"/home/tom/volumes/src/packages/python/pyfora/PyObjectWalker.py\", line 504, in _registerClass\r\n    classOrFunction=_ClassDefinition\r\n  File \"/home/tom/volumes/src/packages/python/pyfora/PyObjectWalker.py\", line 558, in _classOrFunctionDefinition\r\n    pyObject, pyAst\r\n  File \"/home/tom/volumes/src/packages/python/pyfora/PyObjectWalker.py\", line 787, in _computeAndResolveFreeVariableMemberAccessChainsInAst\r\n    chainWithPosition, pyObject, pyAst\r\n  File \"/home/tom/volumes/src/packages/python/pyfora/PyObjectWalker.py\", line 635, in _resolveChainInPyObject\r\n    self._subchainAndResolutionOrNone(pyObject, pyAst, chainWithPosition)\r\n  File \"/home/tom/volumes/src/packages/python/pyfora/PyObjectWalker.py\", line 654, in _subchainAndResolutionOrNone\r\n    return self._lookupChainInClass(pyObject, pyAst, chainWithPosition)\r\n  File \"/home/tom/volumes/src/packages/python/pyfora/PyObjectWalker.py\", line 681, in _lookupChainInClass\r\n    pyClass, pyAst, chainWithPosition\r\n  File \"/home/tom/volumes/src/packages/python/pyfora/PyObjectWalker.py\", line 695, in _lookupChainInBaseClasses\r\n    baseClassNames = [name.id for name in pyAst.bases]\r\nAttributeError: 'Attribute' object has no attribute 'id'\r\n```\r\n\r\n"}}