From 8b7ec8e5f36e5e2838562f530de46e83e1d6bdaa Mon Sep 17 00:00:00 2001 From: James Turk Date: Wed, 13 May 2009 23:22:37 -0400 Subject: [PATCH] a work in progress --- LICENSE | 31 +++++++++++++++++ MANIFEST.in | 1 + README.rst | 37 ++++++++++++++++++++ disqus.py | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++ setup.py | 26 ++++++++++++++ 5 files changed, 192 insertions(+) create mode 100644 LICENSE create mode 100644 MANIFEST.in create mode 100644 README.rst create mode 100644 disqus.py create mode 100644 setup.py diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..cbd1c0c --- /dev/null +++ b/LICENSE @@ -0,0 +1,31 @@ +BSD-style license +================= + +Copyright (c) 2008, Sunlight Labs + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of Sunlight Labs nor the names of its contributors may be + used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..42c7f3d --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1 @@ +include LICENSE *.rst *.py diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..03bcaf9 --- /dev/null +++ b/README.rst @@ -0,0 +1,37 @@ +================== +python-sunlightapi +================== + +Python library for interacting with the Disqus API. + +Documentation for the Disqus API is available at http://wiki.disqus.net/API + +Written by James Turk . + +All code is under a BSD-style license, see LICENSE for details. + +Homepage: http://pypi.python.org/pypi/python-disqus/ + +Source: http://github.com/jamesturk/python-disqus/ + + +Requirements +============ + +python >= 2.4 + +simplejson >= 1.8 (not required with python 2.6, will use built in json module) + + +Installation +============ +To install run + + ``python setup.py install`` + +which will install the bindings into python's site-packages directory. + +Usage +===== + +I promise, I'll write this soon, bug me if you need docs. diff --git a/disqus.py b/disqus.py new file mode 100644 index 0000000..0e4f20d --- /dev/null +++ b/disqus.py @@ -0,0 +1,97 @@ +""" Python library for interacting with the Disqus API. + +The Disqus API (http://wiki.disqus.net/API) allows for interaction with +the Disqus comment system. +""" + +__author__ = "James Turk (james.p.turk@gmail.com)" +__version__ = "0.0.1" +__copyright__ = "Copyright (c) 2009 James Turk" +__license__ = "BSD" + +import urllib, urllib2 +try: + import json +except ImportError: + import simplejson as json + +api_url = 'http://disqus.com/api/%s/' + +def apicall(method, params, http_method='GET'): + params = urllib.urlencode(params) + if http_method == 'GET': + url = '?'.join((api_url % method, params)) + response = urllib2.urlopen(url).read() + else: + response = urllib2.urlopen(api_url % method, params).read() + msg = json.loads(response)['message'] + return msg + +class Thread(object): + def __init__(self, d, forum_api_key): + for k,v in d.iteritems(): + setattr(self, k, v) + self.forum_api_key = forum_api_key + + def get_posts(self): + return apicall('get_thread_posts', {'forum_api_key': self.forum_api_key, + 'thread_id': self.id}) + + def update(self, title=None, slug=None, url=None, allow_comments=None): + params = {'forum_api_key': self.forum_api_key, 'thread_id': self.id} + if title: + params['title'] = title + if slug: + params['slug'] = slug + if url: + params['url'] = url + if allow_comments is not None: + params['allow_comments'] = allow_comments + return apicall('update_thread', params, 'POST') + +class Forum(object): + def __init__(self, d): + for k,v in d.iteritems(): + setattr(self, k, v) + self._api_key = None + + @property + def api_key(self): + if not self._api_key: + msg = apicall('get_forum_api_key', {'user_api_key':user_key, + 'forum_id':self.id}) + self._api_key = msg + return self._api_key + + def create_post(thread_id, message, author_name, author_email, parent_post=None, + created_at=None, author_url=None, ip_address=None): + params = {'forum_api_key': self.api_key, 'thread_id':thread_id, 'message':message, 'author_name':author_name, 'author_email':author_email} + if parent_post: + params['parent_post'] = parent_post + if created_at: + params['created_at'] = created_at + if author_url: + params['author_url'] = author_url + if ip_address: + params['ip_address'] = ip_address + return apicall('create_post', params, 'POST') + + def get_thread_list(self): + msg = apicall('get_thread_list', {'forum_api_key':self.api_key}) + return [Thread(t, self.api_key) for t in msg] + + def get_num_posts(self, *thread_ids): + params = {'forum_api_key': self.api_key, 'thread_ids': ','.join(thread_ids)} + return apicall('get_num_posts', params) + + def get_thread_by_url(self, url): + msg = apicall('get_thread_by_url', {'forum_api_key': self.api_key, 'url': url}) + return Thread(msg, self.api_key) + + def thread_by_identifier(self, title, identifier): + msg = apicall('thread_by_identifier', {'forum_api_key': self.api_key, 'title': title, 'identifier': identifier}, 'POST') + return Thread(msg['thread'], self.api_key), msg['created'] + +def get_forum_list(user_key): + msg = apicall('get_forum_list', {'user_api_key':user_key}) + return [Forum(f) for f in msg] diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..e30bdd8 --- /dev/null +++ b/setup.py @@ -0,0 +1,26 @@ +from distutils.core import setup +from disqus import __version__,__license__,__doc__ + +license_text = open('LICENSE').read() +long_description = open('README.rst').read() + +setup(name="python-disqus", + version=__version__, + py_modules=["disqus"], + description="Libraries for interacting with the Disqus API", + author="James Turk", + author_email = "james.p.turk@gmail.com", + license=license_text, + url="http://github.com/jamesturk/python-disqus/", + long_description=long_description, + platforms=["any"], + classifiers=["Development Status :: 3 - Alpha", + "Intended Audience :: Developers", + "License :: OSI Approved :: BSD License", + "Natural Language :: English", + "Operating System :: OS Independent", + "Programming Language :: Python", + "Topic :: Software Development :: Libraries :: Python Modules", + ], + install_requires=["simplejson >= 1.8"] + )