Skip to content

Commit

Permalink
Merge pull request #54 from bennylope/python-updates
Browse files Browse the repository at this point in the history
Update supported Python versions
  • Loading branch information
bennylope committed Dec 18, 2021
2 parents bc8a290 + b5ccf24 commit 7054b91
Show file tree
Hide file tree
Showing 16 changed files with 185 additions and 146 deletions.
2 changes: 2 additions & 0 deletions .git-blame-ignore-revs
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
c0db7215c95dbd31770ade1fc6ea65aa426d4590
0177c46356b9d0fc4b93f09aab7a224643a3685e
f6b4c02fc0f144dffc88cdd48b8261a69228d2f0
24 changes: 13 additions & 11 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: Tests

on: [push, pull_request]
on: [ push, pull_request ]

jobs:
test:
Expand All @@ -9,15 +9,17 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
py_version: [2.7, 3.5, 3.6, 3.7]
python-version: [ "3.7", "3.8", "3.9", "3.10" ]

steps:
- uses: actions/checkout@v1
- name: Set up Python ${{ matrix.py_version }}
uses: actions/setup-python@v1
with:
python-version: ${{ matrix.py_version }}
- name: Install mock for Python 2.7
run: pip install mock
- name: Run tests
run: python setup.py test
- uses: actions/checkout@v1
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v2
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install tox tox-gh-actions
- name: Test with tox
run: tox
11 changes: 0 additions & 11 deletions .travis.yml

This file was deleted.

5 changes: 0 additions & 5 deletions pydiscourse/__init__.py

This file was deleted.

17 changes: 0 additions & 17 deletions pydiscourse/exceptions.py

This file was deleted.

2 changes: 2 additions & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
pytest==6.2.5
pytest-cov==3.0.0
47 changes: 46 additions & 1 deletion setup.cfg
Original file line number Diff line number Diff line change
@@ -1,2 +1,47 @@
[wheel]
[metadata]
name = pydiscourse
version = attr: pydiscourse.__version__
author = "Marc Sibson and contributors"
author_email = "ben@benlopatin.com"
license = "BSD"
url = "https://github.com/bennylope/pydiscourse"
description = "A Python library for the Discourse API"
long_description = file: README.rst, HISTORY.rst
platforms =
OS Independent

[options]
zip_safe = False
include_package_data = True
packages = find:
package_dir =
=src
install_requires =
requests>=2.4.2
typing; python_version<"3.6"
classifiers =
Development Status :: 5 - Production/Stable
Environment :: Web Environment
Intended Audience :: Developers
License :: OSI Approved :: MIT License
Operating System :: OS Independent
Programming Language :: Python
Programming Language :: Python :: 3.7
Programming Language :: Python :: 3.8
Programming Language :: Python :: 3.9
Programming Language :: Python :: 3.10

[options.packages.find]
where=src

[options.entry_points]
console_scripts =
pydiscoursecli = pydiscourse.main:main

[bdist_wheel]
universal = 1

[build-system]
requires =
setuptools >= "40.9.0"
wheel
55 changes: 6 additions & 49 deletions setup.py
Original file line number Diff line number Diff line change
@@ -1,50 +1,7 @@
from setuptools import setup, find_packages
# -*- coding: utf-8 -*-
"""
See setup.cfg for packaging settings
"""


README = open('README.rst').read()
HISTORY = open('HISTORY.rst').read().replace('.. :changelog:', '')

with open("pydiscourse/__init__.py", "r") as module_file:
for line in module_file:
if line.startswith("__version__"):
version_string = line.split("=")[1]
VERSION = version_string.strip().replace("\"", "")


setup(
name="pydiscourse",
version=VERSION,
description="A Python library for the Discourse API",
long_description=README + '\n\n' + HISTORY,
author="Marc Sibson and contributors",
author_email="ben+pydiscourse@benlopatin.com",
license="BSD",
url="https://github.com/bennylope/pydiscourse",
packages=find_packages(exclude=["tests.*", "tests"]),
install_requires=[
'requests>=2.4.2',
],
tests_require=[
'mock',
],
test_suite='tests',
entry_points={
'console_scripts': [
'pydiscoursecli = pydiscourse.main:main'
]
},
classifiers=[
"Development Status :: 5 - Production/Stable",
"Environment :: Web Environment",
"Intended Audience :: Developers",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
"Programming Language :: Python",
"Programming Language :: Python :: 2.7",
"Programming Language :: Python :: 3.5",
"Programming Language :: Python :: 3.6",
"Programming Language :: Python :: 3.7",
'Programming Language :: Python :: Implementation :: PyPy',
],
zip_safe=False,
)
from setuptools import setup
setup()
10 changes: 10 additions & 0 deletions src/pydiscourse/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# -*- coding: utf-8 -*-

"""Python client for the Discourse API."""

__version__ = "1.2.0"

from pydiscourse.client import DiscourseClient


__all__ = ["DiscourseClient"]
70 changes: 51 additions & 19 deletions pydiscourse/client.py → src/pydiscourse/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ def user_by_id(self, pk):
Returns:
user
"""
return self._get('/admin/users/{0}.json'.format(pk))
return self._get("/admin/users/{0}.json".format(pk))

def user_by_email(self, email):
"""
Expand All @@ -150,7 +150,7 @@ def user_by_email(self, email):
Returns:
user
"""
return self._get('/admin/users/list/all.json?email={0}'.format(email))
return self._get("/admin/users/list/all.json?email={0}".format(email))

def create_user(self, name, username, email, password, **kwargs):
"""
Expand Down Expand Up @@ -539,7 +539,7 @@ def top_topics(self, **kwargs):
Returns:
List of top topics
"""
return self._get('/top.json', **kwargs)
return self._get("/top.json", **kwargs)

def latest_topics(self, **kwargs):
"""
Expand Down Expand Up @@ -631,7 +631,7 @@ def post_by_id(self, post_id, **kwargs):
Returns:
post
"""
return self._get('/posts/{0}.json'.format(post_id), **kwargs)
return self._get("/posts/{0}.json".format(post_id), **kwargs)

def posts(self, topic_id, post_ids=None, **kwargs):
"""
Expand Down Expand Up @@ -767,7 +767,7 @@ def reset_bump_date(self, topic_id, **kwargs):
See https://meta.discourse.org/t/what-is-a-bump/105562
"""
return self._put('/t/{0}/reset-bump-date'.format(topic_id), **kwargs)
return self._put("/t/{0}/reset-bump-date".format(topic_id), **kwargs)

def topics_by(self, username, **kwargs):
"""
Expand Down Expand Up @@ -946,15 +946,15 @@ def get_site_settings(self):
"""
Get site settings
"""
return self._get('/admin/site_settings.json')
return self._get("/admin/site_settings.json")

def category_latest_topics(self, name, parent=None, **kwargs):
"""
Get latest topics from a category
"""
if parent:
name = u'{0}/{1}'.format(parent, name)
return self._get(u'/c/{0}/l/latest.json'.format(name), **kwargs)
name = u"{0}/{1}".format(parent, name)
return self._get(u"/c/{0}/l/latest.json".format(name), **kwargs)

def site_settings(self, **kwargs):
"""
Expand Down Expand Up @@ -1382,7 +1382,9 @@ def data_explorer_query(self, query_id, **kwargs):
Requires discourse-data-explorer installed
https://github.com/discourse/discourse-data-explorer
"""
return self._post('/admin/plugins/explorer/queries/{}/run'.format(query_id), **kwargs)
return self._post(
"/admin/plugins/explorer/queries/{}/run".format(query_id), **kwargs
)

def notifications(self, category_id, **kwargs):
"""
Expand All @@ -1394,7 +1396,7 @@ def notifications(self, category_id, **kwargs):
notification_level=(int)
"""
return self._post('/category/{}/notifications'.format(category_id), **kwargs)
return self._post("/category/{}/notifications".format(category_id), **kwargs)

def _get(self, path, override_request_kwargs=None, **kwargs):
"""
Expand All @@ -1406,7 +1408,9 @@ def _get(self, path, override_request_kwargs=None, **kwargs):
Returns:
"""
return self._request(GET, path, params=kwargs, override_request_kwargs=override_request_kwargs)
return self._request(
GET, path, params=kwargs, override_request_kwargs=override_request_kwargs
)

def _put(self, path, json=False, override_request_kwargs=None, **kwargs):
"""
Expand All @@ -1419,12 +1423,18 @@ def _put(self, path, json=False, override_request_kwargs=None, **kwargs):
"""
if not json:
return self._request(PUT, path, data=kwargs, override_request_kwargs=override_request_kwargs)
return self._request(
PUT, path, data=kwargs, override_request_kwargs=override_request_kwargs
)

else:
return self._request(PUT, path, json=kwargs, override_request_kwargs=override_request_kwargs)
return self._request(
PUT, path, json=kwargs, override_request_kwargs=override_request_kwargs
)

def _post(self, path, files=None, json=False, override_request_kwargs=None, **kwargs):
def _post(
self, path, files=None, json=False, override_request_kwargs=None, **kwargs
):
"""
Args:
Expand All @@ -1435,10 +1445,22 @@ def _post(self, path, files=None, json=False, override_request_kwargs=None, **kw
"""
if not json:
return self._request(POST, path, files=files, data=kwargs, override_request_kwargs=override_request_kwargs)
return self._request(
POST,
path,
files=files,
data=kwargs,
override_request_kwargs=override_request_kwargs,
)

else:
return self._request(POST, path, files=files, json=kwargs, override_request_kwargs=override_request_kwargs)
return self._request(
POST,
path,
files=files,
json=kwargs,
override_request_kwargs=override_request_kwargs,
)

def _delete(self, path, override_request_kwargs=None, **kwargs):
"""
Expand All @@ -1450,10 +1472,19 @@ def _delete(self, path, override_request_kwargs=None, **kwargs):
Returns:
"""
return self._request(DELETE, path, params=kwargs, override_request_kwargs=override_request_kwargs)
return self._request(
DELETE, path, params=kwargs, override_request_kwargs=override_request_kwargs
)

def _request(
self, verb, path, params=None, files=None, data=None, json=None, override_request_kwargs=None
self,
verb,
path,
params=None,
files=None,
data=None,
json=None,
override_request_kwargs=None,
):
"""
Executes HTTP request to API and handles response
Expand All @@ -1462,7 +1493,8 @@ def _request(
verb: HTTP verb as string: GET, DELETE, PUT, POST
path: the path on the Discourse API
params: dictionary of parameters to include to the API
override_request_kwargs: dictionary of requests.request keyword arguments to override defaults
override_request_kwargs: dictionary of requests.request
keyword arguments to override defaults
Returns:
dictionary of response body data or None
Expand Down
19 changes: 19 additions & 0 deletions src/pydiscourse/exceptions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
"""API exceptions."""

from requests.exceptions import HTTPError


class DiscourseError(HTTPError):
"""A generic error while attempting to communicate with Discourse"""


class DiscourseServerError(DiscourseError):
"""The Discourse Server encountered an error while processing the request"""


class DiscourseClientError(DiscourseError):
"""An invalid request has been made"""


class DiscourseRateLimitedError(DiscourseError):
"""Request required more than the permissible number of retries"""
Loading

0 comments on commit 7054b91

Please sign in to comment.