diff --git a/weboob/backends/pastealacon/__init__.py b/weboob/backends/pastealacon/__init__.py new file mode 100644 index 00000000..87a01991 --- /dev/null +++ b/weboob/backends/pastealacon/__init__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2011 Laurent Bachelier +# +# This file is part of weboob. +# +# weboob 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. +# +# weboob 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 weboob. If not, see . + +from .backend import PastealaconBackend + +__all__ = ['PastealaconBackend'] diff --git a/weboob/backends/pastealacon/backend.py b/weboob/backends/pastealacon/backend.py new file mode 100644 index 00000000..2843fc8d --- /dev/null +++ b/weboob/backends/pastealacon/backend.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2011 Laurent Bachelier +# +# This file is part of weboob. +# +# weboob 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. +# +# weboob 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 weboob. If not, see . + + +from weboob.capabilities.paste import ICapPaste +from weboob.tools.backend import BaseBackend +from weboob.capabilities.base import NotLoaded + +from .browser import PastealaconBrowser +from .paste import PastealaconPaste + + +__all__ = ['PastealaconBackend'] + + +class PastealaconBackend(BaseBackend, ICapPaste): + NAME = 'pastealacon' + MAINTAINER = 'Laurent Bachelier' + EMAIL = 'laurent@bachelier.name' + VERSION = '0.8' + DESCRIPTION = 'Paste a la con paste tool' + LICENSE = 'AGPLv3+' + BROWSER = PastealaconBrowser + + def get_paste(self, _id): + return PastealaconPaste(_id) + + def fill_paste(self, paste, fields): + # if we only want the contents + if fields == ['contents']: + if paste.contents is NotLoaded: + contents = self.browser.get_contents(paste.id) + paste.contents = contents + elif fields: + self.browser.fill_paste(paste) + return paste + + OBJECTS = {PastealaconPaste: fill_paste} diff --git a/weboob/backends/pastealacon/browser.py b/weboob/backends/pastealacon/browser.py new file mode 100644 index 00000000..a065af42 --- /dev/null +++ b/weboob/backends/pastealacon/browser.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2011 Laurent Bachelier +# +# This file is part of weboob. +# +# weboob 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. +# +# weboob 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 weboob. If not, see . + + +from weboob.tools.browser import BaseBrowser + +from .pages import PastePage + +__all__ = ['PastealaconBrowser'] + +class PastealaconBrowser(BaseBrowser): + DOMAIN = 'pastealacon.com' + ENCODING = 'ISO-8859-1' + PAGES = {'http://%s/(?P\d+)' % DOMAIN: PastePage} + + def fill_paste(self, paste): + """ + Get as much as information possible from the paste page + """ + self.location(paste.page_url) + return self.page.fill_paste(paste) + + def get_contents(self, _id): + """ + Get the contents from the raw URL + This is the fastest and safest method if you only want the content. + Returns unicode. + """ + return self.readurl('http://%s/pastebin.php?dl=%s' % (self.DOMAIN, _id)).decode(self.ENCODING) diff --git a/weboob/backends/pastealacon/pages.py b/weboob/backends/pastealacon/pages.py new file mode 100644 index 00000000..cca63963 --- /dev/null +++ b/weboob/backends/pastealacon/pages.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2011 Laurent Bachelier +# +# This file is part of weboob. +# +# weboob 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. +# +# weboob 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 weboob. If not, see . + + +from weboob.tools.browser import BasePage + +from urlparse import urlparse +import re + +__all__ = ['PastePage'] + +class PastePage(BasePage): + def fill_paste(self, paste): + root = self.document.getroot() + header = self.parser.select(root, 'id("content")//h3', 1, 'xpath') + matches = re.match(r'Posted by (?P.+) on (?P.+) \(', header.text) + paste.title = matches.groupdict().get('author') + paste.contents = self.parser.select(root, '//textarea[@id="code"]', 1, 'xpath').text + return paste + + def get_id(self): + """ + Find out the ID from the URL + """ + path = urlparse(self.url).path + return path[1:] diff --git a/weboob/backends/pastealacon/paste.py b/weboob/backends/pastealacon/paste.py new file mode 100644 index 00000000..7b7c2a1e --- /dev/null +++ b/weboob/backends/pastealacon/paste.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2011 Laurent Bachelier +# +# This file is part of weboob. +# +# weboob 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. +# +# weboob 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 weboob. If not, see . + + +from weboob.capabilities.paste import BasePaste + + +__all__ = ['PastealaconPaste'] + + +class PastealaconPaste(BasePaste): + @classmethod + def id2url(cls, _id): + return 'http://pastealacon.com/%s' % _id diff --git a/weboob/backends/pastealacon/test.py b/weboob/backends/pastealacon/test.py new file mode 100644 index 00000000..6847f6f9 --- /dev/null +++ b/weboob/backends/pastealacon/test.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- + +# Copyright(C) 2011 Laurent Bachelier +# +# This file is part of weboob. +# +# weboob 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. +# +# weboob 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 weboob. If not, see . + +from weboob.tools.test import BackendTest +from weboob.capabilities.base import NotLoaded + +class PastealaconTest(BackendTest): + BACKEND = 'pastealacon' + + def test_get_paste(self): + # html method + p = self.backend.get_paste('27184') + self.backend.fillobj(p, ['title']) + assert p.title == 'ouiboube' + assert p.page_url == 'http://pastealacon.com/27184' + assert u'coucou\r\ncoucou\r\nhéhéhé' == p.contents + + # raw method + p = self.backend.get_paste('27184') + self.backend.fillobj(p, ['contents']) + assert p.title is NotLoaded + assert p.page_url == 'http://pastealacon.com/27184' + assert u'coucou\r\ncoucou\r\nhéhéhé' == p.contents