use properties for setters

This commit is contained in:
Christophe Benz 2010-06-22 15:57:14 +02:00
commit af3ebade90
6 changed files with 141 additions and 84 deletions

View file

@ -1,26 +1,28 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" # Copyright(C) 2009-2010 Romain Bignon
Copyright(C) 2009-2010 Romain Bignon #
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, version 3 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, version 3 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
"""
from weboob.tools.browser import BasePage from weboob.tools.browser import BasePage
from weboob.capabilities.bank import Operation from weboob.capabilities.bank import Operation
__all__ = ['AccountComing']
class AccountComing(BasePage): class AccountComing(BasePage):
def on_loaded(self): def on_loaded(self):
@ -39,12 +41,12 @@ class AccountComing(BasePage):
if child.tail: label += child.tail if child.tail: label += child.tail
if tds[1].tail: label += tds[1].tail if tds[1].tail: label += tds[1].tail
label = label.strip() label = label.strip()
amount = tds[2].text.replace('.','').replace(',','.') amount = tds[2].text.replace('.', '').replace(',', '.')
operation = Operation() operation = Operation()
operation.setDate(date) operation.date = date
operation.setLabel(label) operation.label = label
operation.setAmount(float(amount)) operation.amount = float(amount)
self.operations.append(operation) self.operations.append(operation)
def get_operations(self): def get_operations(self):

View file

@ -37,11 +37,11 @@ class AccountsList(BasePage):
for td in tr.getiterator('td'): for td in tr.getiterator('td'):
if td.attrib.get('headers', '').startswith('Numero_'): if td.attrib.get('headers', '').startswith('Numero_'):
id = td.text id = td.text
account.setID(long(''.join(id.split(' ')))) account.id = ''.join(id.split(' '))
elif td.attrib.get('headers', '').startswith('Libelle_'): elif td.attrib.get('headers', '').startswith('Libelle_'):
a = td.findall('a') a = td.findall('a')
label = unicode(a[0].text) label = unicode(a[0].text)
account.setLabel(label) account.label = label
m = self.LINKID_REGEXP.match(a[0].attrib.get('href', '')) m = self.LINKID_REGEXP.match(a[0].attrib.get('href', ''))
if m: if m:
account.setLinkID(m.group(1)) account.setLinkID(m.group(1))
@ -49,7 +49,7 @@ class AccountsList(BasePage):
a = td.findall('a') a = td.findall('a')
balance = a[0].text balance = a[0].text
balance = balance.replace('.','').replace(',','.') balance = balance.replace('.','').replace(',','.')
account.setBalance(float(balance)) account.balance = float(balance)
elif td.attrib.get('headers', '').startswith('Avenir'): elif td.attrib.get('headers', '').startswith('Avenir'):
a = td.findall('a') a = td.findall('a')
coming = a[0].text coming = a[0].text

View file

@ -30,8 +30,8 @@ class AccountsList(CragrBasePage):
for div in self.document.getiterator('div'): for div in self.document.getiterator('div'):
if div.attrib.get('class', '') == 'dv' and div.getchildren()[0].tag == 'br': if div.attrib.get('class', '') == 'dv' and div.getchildren()[0].tag == 'br':
account = Account() account = Account()
account.setLabel(div.find('a').text.strip()) account.label = div.find('a').text.strip()
account.setID(long(div.findall('br')[1].tail.strip())) account.id = div.findall('br')[1].tail.strip()
s = div.find('div').find('span').find('b').text s = div.find('div').find('span').find('b').text
balance = u'' balance = u''
for c in s: for c in s:
@ -39,6 +39,6 @@ class AccountsList(CragrBasePage):
balance += c balance += c
if c == ',': if c == ',':
balance += '.' balance += '.'
account.setBalance(float(balance)) account.balance = float(balance)
l.append(account) l.append(account)
return l return l

View file

@ -1,51 +1,49 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" # Copyright(C) 2010 Romain Bignon
Copyright(C) 2010 Romain Bignon #
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, version 3 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, version 3 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
"""
from .cap import ICap from .cap import ICap
class AccountNotFound(Exception): pass class AccountNotFound(Exception):
pass
class Account(object): class Account(object):
def __init__(self): def __init__(self):
self.id = 0 self.id = 0
self.label = '' self.label = ''
self.balance = 0.0 self._balance = 0.0
self.coming = 0.0 self._coming = 0.0
self.link_id = '' self.link_id = ''
def setID(self, id): @property
assert isinstance(id, (int,long)) def balance(self):
self.id = id return self._balance
def setLabel(self, label): self.label = label @balance.setter
def balance(self, value):
self._balance = float(value)
def setBalance(self, balance): @property
assert isinstance(balance, float) def coming(self):
self.balance = balance return self._coming
def setComing(self, coming): @coming.setter
assert isinstance(coming, float) def coming(self, value):
self.coming = coming self._coming = float(value)
def setLinkID(self, link):
self.link_id = link
def __repr__(self): def __repr__(self):
return u"<Account id='%s' label='%s'>" % (self.id, self.label) return u"<Account id='%s' label='%s'>" % (self.id, self.label)
@ -54,22 +52,27 @@ class Account(object):
class Operation(object): class Operation(object):
def __init__(self): def __init__(self):
self.date = None self.date = None
self.label = u'' self._label = u''
self.amount = 0.0 self._amount = 0.0
def __repr__(self): def __repr__(self):
return "<Operation date='%s' label='%s' amount=%s>" % (self.date, self.label, self.amount) return "<Operation date='%s' label='%s' amount=%s>" % (self.date, self.label, self.amount)
def setDate(self, date): @property
#assert isinstance(date, datetime.datetime) def label(self):
self.date = date return self._label
def setLabel(self, label): @label.setter
self.label = str(label) def label(self, value):
self._label = str(value)
def setAmount(self, amount): @property
assert isinstance(amount, float) def amount(self):
self.amount = amount return self._amount
@amount.setter
def amount(self, value):
self._amount = float(value)
class ICapBank(ICap): class ICapBank(ICap):

View file

@ -1,32 +1,34 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" # Copyright(C) 2010 Romain Bignon
Copyright(C) 2010 Romain Bignon #
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, version 3 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, version 3 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
"""
from __future__ import with_statement from __future__ import with_statement
import os
from logging import warning from logging import warning
import os
import sys
from weboob.bcall import BackendsCall, CallErrors from weboob.bcall import BackendsCall, CallErrors
from weboob.modules import ModulesLoader, BackendsConfig from weboob.modules import ModulesLoader, BackendsConfig
from weboob.scheduler import Scheduler from weboob.scheduler import Scheduler
if sys.version_info[:2] <= (2, 5):
import weboob.tools.property
__all__ = ['Weboob', 'CallErrors'] __all__ = ['Weboob', 'CallErrors']

50
weboob/tools/property.py Normal file
View file

@ -0,0 +1,50 @@
# -*- coding: utf-8 -*-
# For Python 2.5-, this will enable the simliar property mechanism as in
# Python 2.6+/3.0+. The code is based on
# http://bruynooghe.blogspot.com/2008/04/xsetter-syntax-in-python-25.html
# Copyright(C) 2010 Christophe Benz
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, version 3 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
import sys
import __builtin__
class property(property):
def __init__(self, fget, *args, **kwargs):
self.__doc__ = fget.__doc__
super(property, self).__init__(fget, *args, **kwargs)
def setter(self, fset):
cls_ns = sys._getframe(1).f_locals
for k, v in cls_ns.iteritems():
if v == self:
propname = k
break
cls_ns[propname] = property(self.fget, fset, self.fdel, self.__doc__)
return cls_ns[propname]
def deleter(self, fdel):
cls_ns = sys._getframe(1).f_locals
for k, v in cls_ns.iteritems():
if v == self:
propname = k
break
cls_ns[propname] = property(self.fget, self.fset, fdel, self.__doc__)
return cls_ns[propname]
__builtin__.property = property