Skip to content

Commit aa54265

Browse files
committed
Deps bump, black formatted, gh actions test, typo fix on Issue template
1 parent 985cc75 commit aa54265

File tree

11 files changed

+398
-141
lines changed

11 files changed

+398
-141
lines changed

.github/ISSUE_TEMPLATE/bug_report.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ assignees: ''
1717
<!-- A clear and concise description of what the bug is. -->
1818

1919
## To Reproduce
20-
<!-- Steps to take to reproduce this issue. Please describe then in details and **feel free to include screenshots** -->
20+
<!-- Steps to take to reproduce this issue. Please describe then in details and **feel free to include screenshots**. -->
2121

2222
## Expected behavior
2323
<!-- A clear and concise description of what you expected to happen. -->

.github/workflows/analyze.yml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
name: Analyze
2+
3+
on:
4+
pull_request:
5+
push:
6+
schedule:
7+
- cron: "0 0 * * 0"
8+
9+
jobs:
10+
job:
11+
name: Analyze
12+
runs-on: ubuntu-latest
13+
14+
steps:
15+
- name: Checkout
16+
uses: actions/checkout@v2
17+
18+
- name: Init CodeQL
19+
uses: github/codeql-action/init@v1
20+
21+
- name: Analyze
22+
uses: github/codeql-action/analyze@v1

.github/workflows/lint.yml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
name: Linting
2+
3+
on: [pull_request, push]
4+
5+
jobs:
6+
linter:
7+
name: Linting
8+
runs-on: ubuntu-latest
9+
10+
steps:
11+
- name: Checkout source
12+
uses: actions/checkout@v2
13+
14+
- name: Lint
15+
uses: github/super-linter@v3
16+
env:
17+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
18+
VALIDATE_PYTHON_BLACK: true

.github/workflows/publish.yml

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
name: Publish to PyPi
2+
3+
on:
4+
push:
5+
tags:
6+
- "v*"
7+
8+
jobs:
9+
publish:
10+
name: Publish
11+
runs-on: ubuntu-latest
12+
13+
steps:
14+
- name: Checkout source
15+
uses: actions/checkout@v2
16+
17+
- name: Set up Python
18+
uses: actions/setup-python@v1
19+
with:
20+
python-version: [3.8, 3.9]
21+
22+
- name: Set up Poetry
23+
uses: Gr1N/setup-poetry@v4
24+
25+
- name: Install Python deps
26+
run: |
27+
poetry install --no-dev
28+
29+
- name: Build & release
30+
run: |
31+
poetry config pypi-token.pypi ${{ secrets.PYPI_TOKEN }}
32+
poetry publish --build

mystbin/__init__.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,9 @@
2424

2525
from collections import namedtuple
2626

27-
from .client import Client
27+
from .client import HTTPClient as Client
2828
from .errors import *
2929

3030
__version__ = "1.0.1"
31-
VersionInfo = namedtuple(
32-
"VersionInfo", "major minor micro releaselevel serial")
33-
version_info = VersionInfo(major=1, minor=0, micro=1,
34-
releaselevel='final', serial=0)
31+
VersionInfo = namedtuple("VersionInfo", "major minor micro releaselevel serial")
32+
version_info = VersionInfo(major=1, minor=0, micro=1, releaselevel="final", serial=0)

mystbin/__main__.py

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -41,30 +41,36 @@ def show_version():
4141
entries = []
4242

4343
entries.append(
44-
'- Python v{0.major}.{0.minor}.{0.micro}-{0.releaselevel}'.format(sys.version_info))
44+
"- Python v{0.major}.{0.minor}.{0.micro}-{0.releaselevel}".format(
45+
sys.version_info
46+
)
47+
)
4548
version_info = mystbin.version_info
4649
entries.append(
47-
'- mystbin.py v{0.major}.{0.minor}.{0.micro}-{0.releaselevel}'.format(version_info))
48-
if version_info.releaselevel != 'final':
49-
pkg = pkg_resources.get_distribution('mystbin.py')
50+
"- mystbin.py v{0.major}.{0.minor}.{0.micro}-{0.releaselevel}".format(
51+
version_info
52+
)
53+
)
54+
if version_info.releaselevel != "final":
55+
pkg = pkg_resources.get_distribution("mystbin.py")
5056
if pkg:
51-
entries.append(
52-
' - mystbin.py pkg_resources: v{0}'.format(pkg.version))
57+
entries.append(" - mystbin.py pkg_resources: v{0}".format(pkg.version))
5358

54-
entries.append('- aiohttp v{0.__version__}'.format(aiohttp))
59+
entries.append("- aiohttp v{0.__version__}".format(aiohttp))
5560
if requests is not None:
56-
entries.append(' - [requests] v{0.__version__}'.format(requests))
61+
entries.append(" - [requests] v{0.__version__}".format(requests))
5762
uname = platform.uname()
58-
entries.append(
59-
'- system info: {0.system} {0.release} {0.version}'.format(uname))
60-
print('\n'.join(entries))
63+
entries.append("- system info: {0.system} {0.release} {0.version}".format(uname))
64+
print("\n".join(entries))
6165

6266

6367
def parse_args():
6468
parser = argparse.ArgumentParser(
65-
prog='mystbin', description='Tools for helping with mystbin.py')
66-
parser.add_argument('-v', '--version', action='store_true',
67-
help='shows the wrapper version')
69+
prog="mystbin", description="Tools for helping with mystbin.py"
70+
)
71+
parser.add_argument(
72+
"-v", "--version", action="store_true", help="shows the wrapper version"
73+
)
6874
parser.set_defaults(func=core)
6975

7076
return parser, parser.parse_args()

mystbin/client.py

Lines changed: 48 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -22,65 +22,73 @@
2222
DEALINGS IN THE SOFTWARE.
2323
"""
2424

25-
import asyncio
2625
import json
27-
from typing import TYPE_CHECKING, Awaitable, Callable, Optional, Type, Union
26+
from typing import TYPE_CHECKING, Awaitable, Optional, Type, Union
2827

2928
import aiohttp
3029

3130
if TYPE_CHECKING:
3231
import requests
3332

34-
from .constants import *
35-
from .errors import *
36-
from .objects import *
33+
from .constants import API_BASE_URL, CLIENT_TIMEOUT, MB_URL_RE
34+
from .errors import APIError, BadPasteID
35+
from .objects import Paste, PasteData
3736

38-
__all__ = ("Client", )
37+
__all__ = ("HTTPClient",)
3938

4039

41-
class Client:
40+
class HTTPClient:
4241
"""
4342
Client for interacting with the Mystb.in API.
4443
4544
Attributes
4645
----------
4746
api_key: Optional[:class:`str`]
4847
Your private API token to access the Mystb.in API.
49-
Can be obtained via: #TODO
48+
Currently unobtainable.
5049
session: Optional[Union[:class:`aiohttp.ClientSession`, :class:`requests.Session`]]
5150
Optional session to be passed to the creation of the client.
5251
"""
52+
5353
__slots__ = ("api_key", "session", "_are_we_async")
5454

5555
def __init__(
56-
self, *,
56+
self,
57+
*,
5758
api_key: str = None,
58-
session: Optional[Union[aiohttp.ClientSession,
59-
Type["requests.Session"]]] = None
59+
session: Optional[Union[aiohttp.ClientSession, Type["requests.Session"]]] = None,
6060
) -> None:
6161
self.api_key = api_key
6262
self._are_we_async = session is None or isinstance(
63-
session, aiohttp.ClientSession)
64-
self.session = self._generate_sync_session(
65-
session) if not self._are_we_async else None
63+
session, aiohttp.ClientSession
64+
)
65+
self.session = (
66+
self._generate_sync_session(session) if not self._are_we_async else None
67+
)
6668

67-
def _generate_sync_session(self, session: Type["requests.Session"]) -> Type["requests.Session"]:
69+
def _generate_sync_session(
70+
self, session: Type["requests.Session"]
71+
) -> Type["requests.Session"]:
6872
""" We will update a :class:`requests.Session` instance with the auth we require. """
6973
# the passed session was found to be 'sync'.
7074
if self.api_key:
7175
session.headers.update(
72-
{"Authorization": self.api_key, "User-Agent": f"Mystbin.py"})
76+
{"Authorization": self.api_key, "User-Agent": "Mystbin.py"}
77+
)
7378

7479
return session
7580

76-
async def _generate_async_session(self, session: Optional[aiohttp.ClientSession] = None) -> aiohttp.ClientSession:
81+
async def _generate_async_session(
82+
self, session: Optional[aiohttp.ClientSession] = None
83+
) -> aiohttp.ClientSession:
7784
""" We will update (or create) a :class:`aiohttp.ClientSession` instance with the auth we require. """
7885
if not session:
7986
session = aiohttp.ClientSession(raise_for_status=False)
8087

8188
if self.api_key:
8289
session._default_headers.update(
83-
{"Authorization": self.api_key, "User-Agent": f"Mystbin.py"})
90+
{"Authorization": self.api_key, "User-Agent": "Mystbin.py"}
91+
)
8492

8593
session._timeout = aiohttp.ClientTimeout(CLIENT_TIMEOUT)
8694
return session
@@ -103,9 +111,15 @@ def post(self, content: str, syntax: str = None) -> Union[Paste, Awaitable]:
103111

104112
def _perform_sync_post(self, content: str, syntax: str = None) -> Paste:
105113
""" Sync post request. """
106-
payload = {'meta': [{'index': 0, 'syntax': syntax}]}
107-
response: Type["requests.Response"] = self.session.post(API_BASE_URL, files={
108-
'data': content, 'meta': (None, json.dumps(payload), 'application/json')}, timeout=CLIENT_TIMEOUT)
114+
payload = {"meta": [{"index": 0, "syntax": syntax}]}
115+
response: Type["requests.Response"] = self.session.post(
116+
API_BASE_URL,
117+
files={
118+
"data": content,
119+
"meta": (None, json.dumps(payload), "application/json"),
120+
},
121+
timeout=CLIENT_TIMEOUT,
122+
)
109123

110124
if response.status_code not in [200, 201]:
111125
raise APIError(response.status_code, response.text)
@@ -121,14 +135,14 @@ async def _perform_async_post(self, content: str, syntax: str = None) -> Paste:
121135
paste_content = multi_part_write.append(content)
122136
paste_content.set_content_disposition("form-data", name="data")
123137
paste_content = multi_part_write.append_json(
124-
{'meta': [{'index': 0, 'syntax': syntax}]}
138+
{"meta": [{"index": 0, "syntax": syntax}]}
125139
)
126140
paste_content.set_content_disposition("form-data", name="meta")
127141

128142
async with self.session.post(API_BASE_URL, data=multi_part_write) as response:
129143
status_code = response.status
130144
response_text = await response.text()
131-
if status_code not in (200, ):
145+
if status_code not in (200,):
132146
raise APIError(status_code, response_text)
133147
response_data = await response.json()
134148

@@ -149,8 +163,8 @@ def get(self, paste_id: str) -> Union[PasteData, Awaitable]:
149163
if not paste_id_match:
150164
raise BadPasteID("This is an invalid Mystb.in paste ID.")
151165

152-
paste_id = paste_id_match.group('ID')
153-
syntax = paste_id_match.group('syntax')
166+
paste_id = paste_id_match.group("ID")
167+
syntax = paste_id_match.group("syntax")
154168

155169
if not self._are_we_async:
156170
return self._perform_sync_get(paste_id, syntax)
@@ -160,9 +174,10 @@ def get(self, paste_id: str) -> Union[PasteData, Awaitable]:
160174
def _perform_sync_get(self, paste_id: str, syntax: str = None) -> PasteData:
161175
""" Sync get request. """
162176
response: Type["requests.Response"] = self.session.get(
163-
f"{API_BASE_URL}/{paste_id}", timeout=CLIENT_TIMEOUT)
177+
f"{API_BASE_URL}/{paste_id}", timeout=CLIENT_TIMEOUT
178+
)
164179

165-
if response.status_code not in (200, ):
180+
if response.status_code not in (200,):
166181
raise BadPasteID("This is an invalid Mystb.in paste ID.")
167182

168183
paste_data = response.json()
@@ -173,8 +188,12 @@ async def _perform_async_get(self, paste_id: str, syntax: str = None) -> PasteDa
173188
if not self.session:
174189
self.session: aiohttp.ClientSession = await self._generate_async_session()
175190

176-
async with self.session.get(f"{API_BASE_URL}/{paste_id}", timeout=aiohttp.ClientTimeout(CLIENT_TIMEOUT)) as response:
177-
if response.status not in (200, ):
191+
self.session: aiohttp.ClientSession
192+
193+
async with self.session.get(
194+
f"{API_BASE_URL}/{paste_id}", timeout=aiohttp.ClientTimeout(CLIENT_TIMEOUT)
195+
) as response:
196+
if response.status not in (200,):
178197
raise BadPasteID("This is an invalid Mystb.in paste ID.")
179198
paste_data = await response.json()
180199

mystbin/constants.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,5 @@
3333

3434
# grab the paste id: https://regex101.com/r/qkluDh/6
3535
MB_URL_RE = compile(
36-
r"(?:(?:https?://)?mystb\.in/)?(?P<ID>[a-zA-Z]+)(?:\.(?P<syntax>[a-zA-Z0-9]+))?")
36+
r"(?:(?:https?://)?mystb\.in/)?(?P<ID>[a-zA-Z]+)(?:\.(?P<syntax>[a-zA-Z0-9]+))?"
37+
)

mystbin/objects.py

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ class Paste:
4545
__slots__ = ("paste_id", "nick", "syntax")
4646

4747
def __init__(self, json_data: dict, syntax: str = None):
48-
self.paste_id = json_data['pastes'][0]['id']
49-
self.nick = json_data['pastes'][0]['nick']
48+
self.paste_id = json_data["pastes"][0]["id"]
49+
self.nick = json_data["pastes"][0]["nick"]
5050
self.syntax = syntax
5151

5252
def __str__(self) -> str:
@@ -92,16 +92,22 @@ class PasteData:
9292
The date this paste was created on the API.
9393
"""
9494

95-
__slots__ = ("paste_id", "_paste_data", "paste_content",
96-
"paste_syntax", "paste_nick", "paste_date")
95+
__slots__ = (
96+
"paste_id",
97+
"_paste_data",
98+
"paste_content",
99+
"paste_syntax",
100+
"paste_nick",
101+
"paste_date",
102+
)
97103

98104
def __init__(self, paste_id: str, paste_data: dict):
99105
self.paste_id = paste_id
100106
self._paste_data = paste_data
101-
self.paste_content = paste_data['data']
102-
self.paste_syntax = paste_data['syntax']
103-
self.paste_nick = paste_data['nick']
104-
self.paste_date = paste_data['created_at']
107+
self.paste_content = paste_data["data"]
108+
self.paste_syntax = paste_data["syntax"]
109+
self.paste_nick = paste_data["nick"]
110+
self.paste_date = paste_data["created_at"]
105111

106112
def __str__(self) -> str:
107113
return self.content

0 commit comments

Comments
 (0)