...
 
Commits (11)
  • sinopsysHK's avatar
    [hsbchk] create new HSBC boobank module dedicated to HK accounts · 6e7d12cb
    sinopsysHK authored
    Despite looking close to French web site, it Hong Kong web site is
    completely different and need its own support.
    So far login, getting accounts and account history are working.
    There is no such "coming" entries in Hong Kong as all entries are
    recorded alnost in real time even for credit cards which are deferred
    toward parent account but real time toward own account.
    Profile might be added later.
    
    There is no support yet for investments, loans and deposits as I have no
    mean to test.
    
    There is an enhancement that could be considered: enrich entries from
    FPS (Fast Payment Service) additional details. Not yet supported
    6e7d12cb
  • Romain Bignon's avatar
    Revert "gitlab-ci.yml: use python3 in before_script" · 6451960f
    Romain Bignon authored
    This reverts commit 3b8cc43d.
    6451960f
  • Laurent Bachelier's avatar
    weboob_lint: Fix exit codes · 5b187f22
    Laurent Bachelier authored
    5b187f22
  • sinopsysHK's avatar
    [hsbchk] Cleanup · 3a9d0b88
    sinopsysHK authored
    - Remove debugging tweaks (log.debug, extra overrides,...)
    - Fix lint complains
    - Published as a python3 compatible module
    3a9d0b88
  • Laurent Bachelier's avatar
    config: Use the same logger · 67aaee03
    Laurent Bachelier authored
    This allows filtering and it is also nicer to have a prefix.
    67aaee03
  • Laurent Bachelier's avatar
    config: Better logging · a19af187
    Laurent Bachelier authored
    Shorter messages and to the point, also show when saved.
    a19af187
  • ntome's avatar
    move scripts/weboob to a dedicated dir in weboob/applications · f81d6ffa
    ntome authored
    This will allow setup.py to avoid the scripts dir and use entry-points
    f81d6ffa
  • ntome's avatar
    setup.py: remove "scripts", use "entry_points" · 5fa442eb
    ntome authored
    "scripts" folder contain files that can be easily generated by
    setuptools since they are merely wrappers to weboob.applications.*.
    
    The whole "scripts" is removed.
    It will require weboob developers not to simply point their PATH
    to the scripts dir.
    5fa442eb
  • ntome's avatar
    core: make some __init__.py namespaceable for qt for splitting repository · d3f3e35f
    ntome authored
    In setuptools, it's not possible to have an optional dependency
    triggering what files are installed and how to build certain files, we
    have to make 2 setup.py.
    Unfortunately, having 2 setup.py files does possible in one repository.
    So, we have to split the repository in 2.
    After this point, the repository will fork. One repository will take only
    qt stuff, and the other repository will contain browser framework, cli apps
    and modules.
    
    Qt apps are under the weboob.applications package though.
    To have 2 pip packages shipping files in the same root
    package (weboob.*), the package must be namespaced. This can be achieved
    by tweaking all ancestor __init__.py files.
    d3f3e35f
  • ntome's avatar
    remove modules and weboob core (except qt) · 03c8ca9b
    ntome authored
    From this point, the repository will fork. One repository will take only
    qt stuff, and the other repository will contain browser framework, cli apps
    and modules.
    This will be on the Qt repository with only only Qt core tools and
    applications.
    03c8ca9b
  • ntome's avatar
    84cdbffb

Too many changes to show.

To preserve performance only 1000 of 1000+ files are displayed.

before_script:
- "pip3 install -r .ci/requirements.txt"
- "REQUIREMENTS=$(mktemp) && python3 setup.py requirements > ${REQUIREMENTS} && pip3 install -r ${REQUIREMENTS} && rm ${REQUIREMENTS}"
- "pip3 install -r .ci/requirements_modules.txt"
- "pip install -r .ci/requirements.txt"
- "REQUIREMENTS=$(mktemp) && python setup.py requirements > ${REQUIREMENTS} && pip install -r ${REQUIREMENTS} && rm ${REQUIREMENTS}"
- "pip install -r .ci/requirements_modules.txt"
build:2.7:
image: "python:2.7"
......
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v2.0.22 (GNU/Linux)
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
g+aY0iqx
=aGSj
-----END PGP PUBLIC KEY BLOCK-----
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v2.0.22 (GNU/Linux)
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
FHIy6Bn5CTgFpVA=
=Rjwq
-----END PGP PUBLIC KEY BLOCK-----
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v2.0.17 (GNU/Linux)
mQENBEoOr78BCADAsCwWXDvedstjc9L3YSlXJ6KDd12WVD+iEiVGUqToJkWwp05k
uVvvibhNxjDJzZqfWxBvfhFXkf/APF8PoTvkA4l51WOfPGSZejiKMcenij+3HjKa
GCPjLlY9rlTUjA5Alw533WP4Wja0EILXy0xjS9eXN2/Vbtrh7sbwU3cs9KOgDjEH
dcR/ZgRGrqiLuVd83L2rlyoWZ5KM2KCkMjtpPBFUXOf5pyCV683wd+grdsHzL8Lm
MAyVPPCmwrCKdkrG4/xjlBo0Ghjwq4gH6ShclcdJlwjfBY/CLtv5voM+TxKZ2wg0
6FIwyZdh0F8G4c5PhiL+TXKrAV76WNwgwE1VABEBAAG0I1JvbWFpbiBCaWdub24g
PHJvbWFpbkBwZWVyZnVzZS5vcmc+iQE2BBMBAgAgBQJKDq+/AhsvBgsJCAcDAgQV
AggDBBYCAwECHgECF4AACgkQ8a5sCGs03G3Djwf7B8CKV9ZOvarZlQsaqzzA5AVM
/jB+oi86tjCDvTB4pgdbVUcni4MxWzTCU5OUXPbjzaFr+liB8tsGbSSFCJxMSdMu
DMhCcjU48XB3aSTXfvrKRqf/7kBdIqRqNB4KvmXGQI6NQl68O/BNQ8zX++M39GXR
tCzKS9VcWOdra8KN45ADVjVx3v8MCBguc9GTXM5EXxdoIUjU9ClWAklfWWJZBHGB
9NnPITfup28rjxXoITgXjF5Irk3uOEyleQ3fDM1uzLw5u/EHNh+uQJgV5Y5YHY9g
b9VT97iIfimw4vJ5stCKCwf7wz9VbGdBpNRMNepGV+/wVOg37nl2nFLZV9pCtLQg
Um9tYWluIEJpZ25vbiA8cm9tYWluQGJpZ25vbi5tZT6JATgEEwECACIFAk1ytV4C
Gy8GCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEPGubAhrNNxtHVwH+wTw7zcC
Xx+pQPR+s4gbtKwb0L95psuN5fUl2f9jEnAWwOSvkYoBmbA0+dYCtokFGIbFNmzU
ajBXwFkVEdphyVYxH4DnIwmwmafMA/QjYiQB91zRPpZQKCG1ioKlM/He9wJsrskl
zaqUEs3BuAx4n45vsiuERjJFwejbfqlI3PYSnS1/ncVpvn1pREn3a+QJ2hDMx2Ns
Znh0HkhJ6LLB8F2Z5bFSDcpTAiNgECRc3eleiTQT+89RrbvpPUi8iIFUcWmGxYBU
Atk6miGgjKpy98Ezc1LWfPOSaZjNBxhvtlicx+bDqkcMYPakZ1gLNWWyW2iNljDF
KiLhXstA/eNC3qC0IVJvbWFpbiBCaWdub24gPHJvbWFpbkBzeW1saW5rLm1lPokB
OAQTAQIAIgUCTXK1SgIbLwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQ8a5s
CGs03G2b6Qf/VjmEs0pBdpg/Ewj7HmikxIQ7lvX5um1YHjLyLNdp6W6wylmzh3u5
dsaajEWmPbUhaDre7gTtxPNJFs6FXksfquUiZySXA45R+XH8Qh/TWJAY8FjdaZwB
tgOn4rka+n0rQeG1fklHw4Z3AREm/GmfeA63nkmS5SvdXskAz1iXB20Hyb6bGy5b
Y7ZJNhJ8Ocz2THizc2od3Bx8Pzw3DHs+NaW5sK/NJJN9QgpdLA4lo0KeidCALEXF
CReDEaT4Cs/Ds3u8QkuR+s+8qN5BOYcIWz79T/hLFw46SezEz9gjJ+NR1nIMd2um
bwnyciYEGVOfG4DsU/IRwnbk+HWcLNTFnw==
=mTlW
-----END PGP PUBLIC KEY BLOCK-----
# -*- coding: utf-8 -*-
# Copyright(C) 2013 Julien Veyssier
#
# This file is part of a weboob module.
#
# This weboob module is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This weboob module 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 Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this weboob module. If not, see <http://www.gnu.org/licenses/>.
from .module import SevenFiftyGramsModule
__all__ = ['SevenFiftyGramsModule']
# -*- coding: utf-8 -*-
# Copyright(C) 2013 Julien Veyssier
#
# This file is part of a weboob module.
#
# This weboob module is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This weboob module 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 Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this weboob module. If not, see <http://www.gnu.org/licenses/>.
from weboob.browser.exceptions import BrowserHTTPNotFound
from weboob.browser import PagesBrowser, URL
from .pages import RecipePage, ResultsPage
__all__ = ['SevenFiftyGramsBrowser']
class SevenFiftyGramsBrowser(PagesBrowser):
BASEURL = 'https://www.750g.com'
search = URL('/recettes_(?P<pattern>.*).htm', ResultsPage)
recipe = URL('/(?P<id>.*).htm', RecipePage)
def iter_recipes(self, pattern):
try:
self.search.go(pattern=pattern.replace(' ', '_'))
except BrowserHTTPNotFound:
return []
if isinstance(self.page, ResultsPage):
return self.page.iter_recipes()
return [self.get_recipe_content()]
def get_recipe(self, id, recipe=None):
try:
self.recipe.go(id=id)
return self.get_recipe_content(recipe)
except BrowserHTTPNotFound:
return
def get_recipe_content(self, recipe=None):
recipe = self.page.get_recipe(obj=recipe)
comments = list(self.page.get_comments())
if comments:
recipe.comments = comments
return recipe
# -*- coding: utf-8 -*-
# Copyright(C) 2013 Julien Veyssier
#
# This file is part of a weboob module.
#
# This weboob module is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This weboob module 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 Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this weboob module. If not, see <http://www.gnu.org/licenses/>.
from weboob.capabilities.recipe import CapRecipe, Recipe
from weboob.tools.backend import Module
from weboob.tools.compat import unicode
from .browser import SevenFiftyGramsBrowser
import unicodedata
def strip_accents(s):
return ''.join(c for c in unicodedata.normalize('NFD', s) if unicodedata.category(c) != 'Mn')
__all__ = ['SevenFiftyGramsModule']
class SevenFiftyGramsModule(Module, CapRecipe):
NAME = '750g'
MAINTAINER = u'Julien Veyssier'
EMAIL = 'julien.veyssier@aiur.fr'
VERSION = '1.6'
DESCRIPTION = u'750g French recipe website'
LICENSE = 'AGPLv3+'
BROWSER = SevenFiftyGramsBrowser
def get_recipe(self, id):
return self.browser.get_recipe(id)
def iter_recipes(self, pattern):
return self.browser.iter_recipes(strip_accents(unicode(pattern)).encode('utf-8'))
def fill_recipe(self, recipe, fields):
if 'nb_person' in fields or 'instructions' in fields:
recipe = self.browser.get_recipe(recipe.id, recipe)
return recipe
OBJECTS = {
Recipe: fill_recipe,
}
# -*- coding: utf-8 -*-
# Copyright(C) 2013 Julien Veyssier
#
# This file is part of a weboob module.
#
# This weboob module is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This weboob module 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 Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this weboob module. If not, see <http://www.gnu.org/licenses/>.
from weboob.capabilities.recipe import Recipe, Comment
from weboob.capabilities.base import NotAvailable
from weboob.capabilities.image import BaseImage, Thumbnail
from weboob.browser.pages import HTMLPage, pagination
from weboob.browser.elements import ItemElement, ListElement, method
from weboob.browser.filters.standard import CleanText, Regexp, Env, CleanDecimal, Eval
from weboob.browser.filters.json import Dict, NotFound
from datetime import datetime, date, time
from dateutil.parser import parse as parse_date
from weboob.tools.json import json
class Time(Dict):
def filter(self, el):
if el and not isinstance(el, NotFound):
el = el.replace('PT', '')
if el == u'P':
return NotAvailable
_time = parse_date(el, dayfirst=False, fuzzy=False)
_time = _time - datetime.combine(date.today(), time(0))
return _time.seconds // 60
class ResultsPage(HTMLPage):
""" Page which contains results as a list of recipies
"""
@pagination
@method
class iter_recipes(ListElement):
item_xpath = '//section[has-class("c-recipe-row")]'
def next_page(self):
return CleanText('//li[@class="suivante"]/a/@href')(self)
class item(ItemElement):
klass = Recipe
def condition(self):
return not CleanText('./div[@class="c-recipe-row__media"]/span[@class="c-recipe-row__video"]/@class',
default=None)(self) and CleanText('./div/h2/a/@href')(self)
obj_id = Regexp(CleanText('./div/h2/a/@href'),
'/(.*).htm')
obj_title = CleanText('./div/h2/a')
class obj_picture(ItemElement):
klass = BaseImage
obj_thumbnail = Eval(Thumbnail, CleanText('./div/img/@src'))
obj_short_description = CleanText('./div/p')
class RecipePage(HTMLPage):
""" Page which contains a recipe
"""
@method
class get_comments(ListElement):
item_xpath = '//div[has-class("c-comment__row")]'
class item(ItemElement):
klass = Comment
def validate(self, obj):
return obj.id
obj_id = CleanText('./@data-id')
obj_author = CleanText('./article/div/header/strong/span[@itemprop="author"]')
obj_text = CleanText('./article/div/div/p')
@method
class get_recipe(ItemElement):
klass = Recipe
def parse(self, el):
json_content = CleanText('//head/script[@type="application/ld+json"]')(el)
self.el = json.loads(json_content)
obj_id = Env('id')
obj_title = Dict('name')
obj_ingredients = Dict('recipeIngredient')
obj_cooking_time = Time('cookTime')
obj_preparation_time = Time('prepTime')
def obj_nb_person(self):
return [CleanDecimal(Dict('recipeYield'), default=0)(self)]
obj_instructions = Dict('recipeInstructions')
obj_author = Dict('author/name', default=NotAvailable)
def obj_picture(self):
img = BaseImage()
try:
img.url = self.el['image']
except KeyError:
return
return img
# -*- coding: utf-8 -*-
# Copyright(C) 2013 Julien Veyssier
#
# This file is part of a weboob module.
#
# This weboob module is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This weboob module 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 Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this weboob module. If not, see <http://www.gnu.org/licenses/>.
from weboob.tools.test import BackendTest
import itertools
class SevenFiftyGramsTest(BackendTest):
MODULE = '750g'
def test_recipe(self):
recipes = list(itertools.islice(self.backend.iter_recipes('fondue'), 0, 20))
for recipe in recipes:
full_recipe = self.backend.get_recipe(recipe.id)
self.assertTrue(full_recipe.instructions, 'No instructions for %s' % recipe.id)
self.assertTrue(full_recipe.ingredients, 'No ingredients for %s' % recipe.id)
self.assertTrue(full_recipe.title, 'No title for %s' % recipe.id)
self.assertTrue(full_recipe.preparation_time, 'No preparation time for %s' % recipe.id)
# -*- coding: utf-8 -*-
# Copyright(C) 2013 Bezleputh
#
# This file is part of a weboob module.
#
# This weboob module is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This weboob module 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 Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this weboob module. If not, see <http://www.gnu.org/licenses/>.
from .module import AdeccoModule
__all__ = ['AdeccoModule']
# -*- coding: utf-8 -*-
# Copyright(C) 2013 Bezleputh
#
# This file is part of a weboob module.
#
# This weboob module is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This weboob module 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 Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this weboob module. If not, see <http://www.gnu.org/licenses/>.
from weboob.browser import PagesBrowser, URL
from weboob.tools.compat import quote_plus
from .pages import SearchPage, AdvertPage, AdvertsJsonPage
from datetime import date, timedelta
__all__ = ['AdeccoBrowser']
class AdeccoBrowser(PagesBrowser):
BASEURL = 'https://www.adecco.fr'
TIMEOUT = 30
search_page = URL('/resultats-offres-emploi/\?k=(?P<job>.*)&l=(?P<town>.*)&display=50',
'/resultats-offres-emploi/(?P<q>.*)/\?display=50',
SearchPage)
json_page = URL('/AdeccoGroup.Global/api/Job/AsynchronousJobSearch/', AdvertsJsonPage)
advert_page = URL('/offres-d-emploi/\?ID=(?P<_id>.*)',
'/offres-d-emploi/.*',
AdvertPage)
def call_json(self, params, date_min=None):
self.session.headers.update({"Accept": "application/json, text/javascript, */*; q=0.01",
"X-Requested-With": "XMLHttpRequest"})
return self.json_page.go(data=params).iter_job_adverts(data=params, date_min=date_min)
def search_job(self, pattern=None):
if pattern:
return self.advanced_search_job(job=pattern)
return []
def advanced_search_job(self, publication_date=0, contract_type=None, conty=None, activity_domain=None,
job='', town=''):
params = self.search_page.go(job=quote_plus(job.encode('utf-8')),
town=quote_plus(town.encode('utf-8'))).get_post_params()
if contract_type:
self.page.url += '&employmenttype=%s' % contract_type