Add a basic script to compare the db_schema to the fs_schema.
Allow SchemaViewer to be used without a request object Most use of self.req have
been hidden in method that fallback on a simple behaviour when no req are
provided.
Several element have been sorted to ease comparison.
"""Fake objects to ease testing of cubicweb without a fully working environment:organization: Logilab:copyright: 2001-2010 LOGILAB S.A. (Paris, FRANCE), license is LGPL v2.:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr:license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses"""__docformat__="restructuredtext en"fromlogilab.databaseimportget_db_helperfromcubicweb.reqimportRequestSessionBasefromcubicweb.cwvregimportCubicWebVRegistryfromcubicweb.web.requestimportCubicWebRequestBasefromcubicweb.devtoolsimportBASE_URL,BaseApptestConfigurationclassFakeConfig(dict,BaseApptestConfiguration):translations={}apphome=Nonedef__init__(self,appid='data',apphome=None,cubes=()):self.appid=appidself.apphome=apphomeself._cubes=cubesself['auth-mode']='cookie'self['uid']=Noneself['base-url']=BASE_URLself['rql-cache-size']=100defcubes(self,expand=False):returnself._cubesdefsources(self):return{}classFakeRequest(CubicWebRequestBase):"""test implementation of an cubicweb request object"""def__init__(self,*args,**kwargs):ifnot(argsor'vreg'inkwargs):kwargs['vreg']=CubicWebVRegistry(FakeConfig(),initlog=False)kwargs['https']=Falseself._url=kwargs.pop('url','view?rql=Blop&vid=blop')super(FakeRequest,self).__init__(*args,**kwargs)self._session_data={}self._headers={}defheader_accept_language(self):"""returns an ordered list of preferred languages"""return('en',)defheader_if_modified_since(self):returnNonedefbase_url(self):"""return the root url of the instance"""returnBASE_URLdefrelative_path(self,includeparams=True):"""return the normalized path of the request (ie at least relative to the instance's root, but some other normalization may be needed so that the returned path may be used to compare to generated urls """ifself._url.startswith(BASE_URL):url=self._url[len(BASE_URL):]else:url=self._urlifincludeparams:returnurlreturnurl.split('?',1)[0]defset_content_type(self,content_type,filename=None,encoding=None):"""set output content type for this request. An optional filename may be given """passdefset_header(self,header,value,raw=True):"""set an output HTTP header"""self._headers[header]=valuedefadd_header(self,header,value):"""set an output HTTP header"""self._headers[header]=value# XXXdefremove_header(self,header):"""remove an output HTTP header"""self._headers.pop(header,None)defget_header(self,header,default=None):"""return the value associated with the given input header, raise KeyError if the header is not set """returnself._headers.get(header,default)defset_cookie(self,cookie,key,maxage=300,expires=None):"""set / update a cookie key by default, cookie will be available for the next 5 minutes """morsel=cookie[key]ifmaxageisnotNone:morsel['Max-Age']=maxageifexpires:morsel['expires']=expires.strftime('%a, %d %b %Y %H:%M:%S %z')# make sure cookie is set on the correct pathmorsel['path']=self.base_url_path()self.add_header('Set-Cookie',morsel.OutputString())self.add_header('Cookie',morsel.OutputString())defremove_cookie(self,cookie,key):self.remove_header('Set-Cookie')self.remove_header('Cookie')defvalidate_cache(self):passclassFakeUser(object):login='toto'eid=0defin_groups(self,groups):returnTrueclassFakeSession(RequestSessionBase):read_security=write_security=Trueset_read_security=set_write_security=lambda*args,**kwargs:Nonedef__init__(self,repo=None,user=None):self.repo=repoself.vreg=getattr(self.repo,'vreg',CubicWebVRegistry(FakeConfig(),initlog=False))self.pool=FakePool()self.user=userorFakeUser()self.is_internal_session=Falseself.transaction_data={}defexecute(self,*args,**kwargs):passdefcommit(self,*args):self.transaction_data.clear()defclose(self,*args):passdefsystem_sql(self,sql,args=None):passdefset_entity_cache(self,entity):passclassFakeRepo(object):querier=Nonedef__init__(self,schema,vreg=None,config=None):self.extids={}self.eids={}self._count=0self.schema=schemaself.config=configorFakeConfig()self.vreg=vregorCubicWebVRegistry(self.config,initlog=False)self.vreg.schema=schemadefinternal_session(self):returnFakeSession(self)defextid2eid(self,source,extid,etype,session,insert=True,recreate=False):try:returnself.extids[extid]exceptKeyError:ifnotinsert:returnNoneself._count+=1eid=self._countentity=source.before_entity_insertion(session,extid,etype,eid)self.extids[extid]=eidself.eids[eid]=extidsource.after_entity_insertion(session,extid,entity)returneiddefeid2extid(self,source,eid,session=None):returnself.eids[eid]classFakeSource(object):dbhelper=get_db_helper('sqlite')def__init__(self,uri):self.uri=uriclassFakePool(object):defsource(self,uri):returnFakeSource(uri)