From 7ae6d01a560dea221e20363630f621f715f6d9f7 Mon Sep 17 00:00:00 2001
From: martmists <martmists@gmail.com>
Date: Tue, 20 Jun 2017 18:43:18 +0000
Subject: [PATCH] Travis, Tests and Code Style

---
 .travis.yml      |   8 ++++++++
 README.md        |   1 +
 owo-logo.png     | Bin 0 -> 22113 bytes
 owo/aiohttp2.py  |   7 ++++---
 owo/async_owo.py |   3 ---
 owo/bg.py        |  11 ++++++-----
 owo/owo.py       |  11 +++++------
 owo/utils.py     |  11 +++++++----
 test_code.py     |  20 ++++++++++++++++++++
 test_style.py    |  48 +++++++++++++++++++++++++++++++++++++++++++++++
 10 files changed, 99 insertions(+), 21 deletions(-)
 create mode 100644 .travis.yml
 create mode 100644 owo-logo.png
 create mode 100644 test_code.py
 create mode 100644 test_style.py

diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..93754b4
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,8 @@
+language: python
+
+python:
+  - "3.6"
+
+install: "pip install flake8 pylint requests aiohttp"
+script: pytest
+cache: pip
\ No newline at end of file
diff --git a/README.md b/README.md
index d017b0d..05d6aac 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,5 @@
 # owo.py
+![](https://travis-ci.org/whats-this/owo.py.svg?branch=master)
 
 A wrapper that was written inside of Python that allows for you to upload images to the owo.whats-th.is and shorten URLs through uwu.whats-th.is. Allows for both methods through Async and Non-Async. (Suppports py2)
 
diff --git a/owo-logo.png b/owo-logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..b4b55344b585f2886a44523f87ad500f704ed333
GIT binary patch
literal 22113
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

literal 0
HcmV?d00001

diff --git a/owo/aiohttp2.py b/owo/aiohttp2.py
index d8449c7..5b7211c 100644
--- a/owo/aiohttp2.py
+++ b/owo/aiohttp2.py
@@ -2,9 +2,10 @@
 # because it's shit and PR #916 has been open for about a year
 # Thanks to Leovoel for helping me with this
 
+from urllib.parse import quote
+
 from aiohttp.multipart import TOKEN
 from aiohttp.hdrs import CONTENT_DISPOSITION
-from urllib.parse import quote
 
 import aiohttp
 
@@ -12,14 +13,14 @@ import aiohttp
 class BodyPartWriter(aiohttp.BodyPartWriter):
     def set_content_disposition(self, disposition_type,
                                 should_quote=True, **params):
-        if not disposition_type or not (TOKEN > set(disposition_type)):
+        if not disposition_type or not TOKEN > set(disposition_type):
             raise ValueError('bad content disposition type '
                              '{!r}'.format(disposition_type))
         value = disposition_type
         if params:
             lparams = []
             for key, val in params.items():
-                if not key or not (TOKEN > set(key)):
+                if not key or not TOKEN > set(key):
                     raise ValueError('bad content disposition parameter '
                                      '{!r}={!r}'.format(key, val))
                 qval = quote(val, '') if should_quote else val
diff --git a/owo/async_owo.py b/owo/async_owo.py
index 6bf2875..66f51b1 100644
--- a/owo/async_owo.py
+++ b/owo/async_owo.py
@@ -1,12 +1,10 @@
 import asyncio
-from functools import lru_cache
 
 from .utils import check_size, BASE_URL, MAX_FILES,\
     UPLOAD_PATH, SHORTEN_PATH, UPLOAD_STANDARD,\
     SHORTEN_STANDARD, UPLOAD_BASES, SHORTEN_BASES
 
 
-
 @asyncio.coroutine
 def async_upload_files(key, *files, **kwargs):
     verbose = kwargs.get("verbose", False)
@@ -62,7 +60,6 @@ def async_upload_files(key, *files, **kwargs):
     return results
 
 
-
 @asyncio.coroutine
 def async_shorten_urls(key, *urls, **kwargs):
     verbose = kwargs.get("verbose", False)
diff --git a/owo/bg.py b/owo/bg.py
index b87f34e..d929e18 100644
--- a/owo/bg.py
+++ b/owo/bg.py
@@ -9,12 +9,13 @@ usage: `$ owo-bg -p path -k API_KEY`
 from __future__ import print_function
 
 import argparse
-import owo
 import os
 import sys
-import time
 import shlex
 import subprocess
+import time
+
+import owo
 
 
 def print_v(text):
@@ -75,7 +76,7 @@ def main():
                         os.system('termux-tts-speak "Upload failed"')
                     else:
                         os.system('termux-toast "Upload failed"')
-                except:
+                except FileNotFoundError:
                     pass
 
             except OverflowError:
@@ -87,7 +88,7 @@ def main():
                         os.system('termux-tts-speak "Upload too big"')
                     else:
                         os.system('termux-toast "Upload too big"')
-                except:
+                except FileNotFoundError:
                     pass
                 sent_files.append(file)
 
@@ -130,4 +131,4 @@ def main():
 
 
 if __name__ == "__main__":
-    main()
\ No newline at end of file
+    main()
diff --git a/owo/owo.py b/owo/owo.py
index 582039f..1fab787 100644
--- a/owo/owo.py
+++ b/owo/owo.py
@@ -8,6 +8,8 @@ except ImportError:
     # Create a dummy wrapper instead
 
     def lru_cache(maxsize=None):
+        del maxsize
+
         def wrapper(func):
             def inner(*args, **kwargs):
                 return func(*args, **kwargs)
@@ -47,12 +49,9 @@ def upload_files(key, *files, **kwargs):
 
     multipart = [(
         "files[]",
-        (
-            file.lower(),
-            open(file, "rb"),
-            mimetypes.guess_type(file)[0]
-        ))
-        for file in files]
+        (file.lower(), open(file, "rb"),
+         mimetypes.guess_type(file)[0])
+        ) for file in files]
 
     response = requests.post(BASE_URL+UPLOAD_PATH, files=multipart,
                              params={"key": key})
diff --git a/owo/utils.py b/owo/utils.py
index 1ca355b..a12a7a1 100644
--- a/owo/utils.py
+++ b/owo/utils.py
@@ -1,9 +1,10 @@
 import os.path
 import re
+import requests
 
-DOMAINS_URL = "https://raw.githubusercontent.com/whats-this/landing/master/public-cdn-domains.txt"
+DOMAINS_URL = ("https://raw.githubusercontent.com/whats-this/landing/"
+               "master/public-cdn-domains.txt")
 
-import requests
 resp = requests.get(DOMAINS_URL)
 content = resp.text
 
@@ -17,9 +18,11 @@ SHORTEN_PATH = "/shorten/polr"
 UPLOAD_STANDARD = "https://owo.whats-th.is/"
 SHORTEN_STANDARD = "https://uwu.whats-th.is/"
 
-UPLOAD_BASES = ["https://{}/".format(url) for url in re.findall("files:(.+)", content)]
+UPLOAD_BASES = ["https://{}/".format(url) for url in re.findall("files:(.+)",
+                                                                content)]
 
-SHORTEN_BASES = ["https://{}/".format(url) for url in re.findall("link:(.+)", content)]
+SHORTEN_BASES = ["https://{}/".format(url) for url in re.findall("link:(.+)",
+                                                                 content)]
 
 
 def check_size(file):
diff --git a/test_code.py b/test_code.py
new file mode 100644
index 0000000..68f53e0
--- /dev/null
+++ b/test_code.py
@@ -0,0 +1,20 @@
+import asyncio
+import os
+
+import owo
+
+
+key = os.environ["TRAVIS-KEY"]
+loop = asyncio.get_event_loop()
+
+
+def test_upload():
+    fname = owo.upload_files(key, "owo-logo.png")
+    print(fname)
+
+
+def test_shorten():
+    hlink = owo.shorten_urls(key, "https://google.com")
+    print(hlink)
+
+# TODO: add more test cases
diff --git a/test_style.py b/test_style.py
new file mode 100644
index 0000000..70eea80
--- /dev/null
+++ b/test_style.py
@@ -0,0 +1,48 @@
+from re import match
+from subprocess import Popen, PIPE
+
+
+def test_flake8():
+    proc = Popen("flake8 owo --exclude=__init__.py".split(),
+                 stdout=PIPE)
+
+    out = proc.stdout.read().decode()
+
+    lines = [l for l in out.split("\n")if l]
+
+    print(out)
+
+    assert not bool(lines)
+
+
+def test_pylint():
+    proc = Popen(("pylint --disable=missing-docstring,too-many-branches,fixme,"
+                  "invalid-name,redefined-builtin,too-many-statements,"
+                  "no-name-in-module,protected-access,too-many-arguments,"
+                  "attribute-defined-outside-init,arguments-differ,no-member,"
+                  "too-many-instance-attributes,import-error,too-many-locals,"
+                  "parse-error,too-few-public-methods,exec-used,"
+                  "cell-var-from-loop,wildcard-import,duplicate-code,"
+                  "function-redefined"
+                  " owo").split(),
+                 stdout=PIPE)
+
+    proc.wait()
+
+    out = proc.stdout.read().decode()
+
+    last_line = [l for l in out.split("\n")if l][-1]
+
+    print(out)
+
+    m = match("Your code has been rated at 10\.00\/10", last_line)
+
+    assert m is not None
+
+
+if __name__ == "__main__":
+    test_flake8()
+    print("Flake8 success!")
+
+    test_pylint()
+    print("Pylint success!")
-- 
GitLab