Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| edeec37c40 | |||
| ef4a28f40c | |||
| a2ffd83ca1 | |||
| 8312589ab4 | |||
| 84510530ce | |||
| f9c78e8892 | |||
| 9a45b0a205 | |||
| 7f1337e412 |
@@ -37,6 +37,7 @@ jobs:
|
|||||||
- run:
|
- run:
|
||||||
command: |
|
command: |
|
||||||
sudo pip install -r requirements.txt
|
sudo pip install -r requirements.txt
|
||||||
sudo pip install pytest
|
sudo pip install pytest pytest-cov coveralls
|
||||||
python -m pytest ./tests/unit
|
pytest ./tests --cov=meme_otron
|
||||||
name: Unit tests
|
coveralls
|
||||||
|
name: Tests
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
service_name: circle-ci
|
||||||
|
parallel: true
|
||||||
@@ -6,3 +6,4 @@ tmp
|
|||||||
.key*
|
.key*
|
||||||
*.pyc
|
*.pyc
|
||||||
.pytest_cache
|
.pytest_cache
|
||||||
|
.coverage
|
||||||
@@ -1,3 +1,7 @@
|
|||||||
|
[](https://lgtm.com/projects/g/Klemek/meme-otron/alerts/)
|
||||||
|
[](https://lgtm.com/projects/g/Klemek/meme-otron/context:python)
|
||||||
|
[](https://coveralls.io/github/Klemek/meme-otron?branch=master)
|
||||||
|
|
||||||
# Meme-Otron
|
# Meme-Otron
|
||||||
|
|
||||||
*When making a meme need to be instantaneous*
|
*When making a meme need to be instantaneous*
|
||||||
|
|||||||
@@ -68,7 +68,6 @@ def build_text_only(texts: List[Text], debug: bool = False) -> Image.Image:
|
|||||||
range_factor = heights[i] / max_height
|
range_factor = heights[i] / max_height
|
||||||
start = sum(heights[:i]) / max_height
|
start = sum(heights[:i]) / max_height
|
||||||
text.y_range = (start + text.y_range[0] * range_factor, start + text.y_range[1] * range_factor)
|
text.y_range = (start + text.y_range[0] * range_factor, start + text.y_range[1] * range_factor)
|
||||||
pass
|
|
||||||
txt_img = Image.new('RGBA', (TEXT_IMAGE_WIDTH, max_height), (255, 255, 255))
|
txt_img = Image.new('RGBA', (TEXT_IMAGE_WIDTH, max_height), (255, 255, 255))
|
||||||
return apply_texts(txt_img, texts, debug=debug)
|
return apply_texts(txt_img, texts, debug=debug)
|
||||||
|
|
||||||
|
|||||||
@@ -91,8 +91,8 @@ def load_item(i: int, item: dict):
|
|||||||
meme.texts_len = current_text - 1
|
meme.texts_len = current_text - 1
|
||||||
except TypeError as e:
|
except TypeError as e:
|
||||||
logger.warning(f"Item '{item_id}'({i + 1}) / Text {j + 1}: {e}")
|
logger.warning(f"Item '{item_id}'({i + 1}) / Text {j + 1}: {e}")
|
||||||
for text in meme.texts:
|
for text in meme.texts:
|
||||||
text.update(meme.text_base)
|
text.update(meme.text_base)
|
||||||
else:
|
else:
|
||||||
DATA[item_id] = meme
|
DATA[item_id] = meme
|
||||||
if not meme.abstract:
|
if not meme.abstract:
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
from typing import Optional, Tuple, List
|
from typing import Optional, Tuple, List
|
||||||
import re
|
|
||||||
from PIL import Image
|
from PIL import Image
|
||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,31 @@
|
|||||||
|
from unittest import TestCase
|
||||||
|
from meme_otron import utils
|
||||||
|
|
||||||
|
|
||||||
|
class TestUtilsLang(TestCase):
|
||||||
|
def test_find_nearest(self):
|
||||||
|
self.assertEqual("test", utils.find_nearest("tost", ["test", "example", "what"]))
|
||||||
|
self.assertIsNone(utils.find_nearest("unknown", ["test", "example", "what"], threshold=2))
|
||||||
|
self.assertEqual("test", utils.find_nearest("unknown", ["test", "example", "what"], threshold=200))
|
||||||
|
|
||||||
|
|
||||||
|
class TestUtilsWeb(TestCase):
|
||||||
|
def test_read_web_file(self):
|
||||||
|
out, err = utils.read_web_file("http:invalid.url")
|
||||||
|
self.assertIsNone(out)
|
||||||
|
self.assertEqual('Invalid URL', err)
|
||||||
|
out, err = utils.read_web_file("http://unknown.domain/")
|
||||||
|
self.assertIsNone(out)
|
||||||
|
self.assertEqual('Could not connect to server', err)
|
||||||
|
out, err = utils.read_web_file("http://httpbin.org/status/418")
|
||||||
|
self.assertIsNone(out)
|
||||||
|
self.assertEqual('Could not connect: HTTP Error 418: I\'M A TEAPOT', err)
|
||||||
|
out, err = utils.read_web_file("http://httpbin.org/bytes/1024", max_file_size=1000)
|
||||||
|
self.assertIsNone(out)
|
||||||
|
self.assertEqual('File too big', err)
|
||||||
|
# out, err = utils.read_web_file("http://httpbin.org/delay/1", timeout=0.1)
|
||||||
|
# self.assertIsNone(out)
|
||||||
|
# self.assertEqual('Could not connect to server', err)
|
||||||
|
out, err = utils.read_web_file("http://httpbin.org/base64/dGVzdA==")
|
||||||
|
self.assertIsNone(err)
|
||||||
|
self.assertEqual('test', out.decode("utf-8"))
|
||||||
@@ -88,11 +88,6 @@ class TestUtilsDict(TestCase):
|
|||||||
|
|
||||||
|
|
||||||
class TestUtilsLang(TestCase):
|
class TestUtilsLang(TestCase):
|
||||||
def test_find_nearest(self):
|
|
||||||
self.assertEqual("test", utils.find_nearest("tost", ["test", "example", "what"]))
|
|
||||||
self.assertIsNone(utils.find_nearest("unknown", ["test", "example", "what"], threshold=2))
|
|
||||||
self.assertEqual("test", utils.find_nearest("unknown", ["test", "example", "what"], threshold=200))
|
|
||||||
|
|
||||||
def test_sanitize_input(self):
|
def test_sanitize_input(self):
|
||||||
self.assertEqual("", utils.sanitize_input(""))
|
self.assertEqual("", utils.sanitize_input(""))
|
||||||
self.assertEqual("a b_c", utils.sanitize_input(" A+=¤$ bé_cè:* "))
|
self.assertEqual("a b_c", utils.sanitize_input(" A+=¤$ bé_cè:* "))
|
||||||
@@ -173,23 +168,3 @@ class TestUtilsWeb(TestCase):
|
|||||||
self.assertFalse(utils.validate_url("https:google.com/page#anchor?key=value&query"))
|
self.assertFalse(utils.validate_url("https:google.com/page#anchor?key=value&query"))
|
||||||
self.assertFalse(utils.validate_url(""))
|
self.assertFalse(utils.validate_url(""))
|
||||||
self.assertFalse(utils.validate_url("google.com"))
|
self.assertFalse(utils.validate_url("google.com"))
|
||||||
|
|
||||||
def test_read_web_file(self):
|
|
||||||
out, err = utils.read_web_file("http:invalid.url")
|
|
||||||
self.assertIsNone(out)
|
|
||||||
self.assertEqual('Invalid URL', err)
|
|
||||||
out, err = utils.read_web_file("http://unknown.domain/")
|
|
||||||
self.assertIsNone(out)
|
|
||||||
self.assertEqual('Could not connect to server', err)
|
|
||||||
out, err = utils.read_web_file("http://httpbin.org/status/418")
|
|
||||||
self.assertIsNone(out)
|
|
||||||
self.assertEqual('Could not connect: HTTP Error 418: I\'M A TEAPOT', err)
|
|
||||||
out, err = utils.read_web_file("http://httpbin.org/bytes/1024", max_file_size=1000)
|
|
||||||
self.assertIsNone(out)
|
|
||||||
self.assertEqual('File too big', err)
|
|
||||||
# out, err = utils.read_web_file("http://httpbin.org/delay/1", timeout=0.1)
|
|
||||||
# self.assertIsNone(out)
|
|
||||||
# self.assertEqual('Could not connect to server', err)
|
|
||||||
out, err = utils.read_web_file("http://httpbin.org/base64/dGVzdA==")
|
|
||||||
self.assertIsNone(err)
|
|
||||||
self.assertEqual('test', out.decode("utf-8"))
|
|
||||||
|
|||||||
+11
-8
@@ -8,12 +8,15 @@ try:
|
|||||||
y0 = int(input("y0:"))
|
y0 = int(input("y0:"))
|
||||||
w1 = int(input("w1:"))
|
w1 = int(input("w1:"))
|
||||||
h1 = int(input("h1:"))
|
h1 = int(input("h1:"))
|
||||||
x1 = round(x0/w, 2)
|
x1 = round(x0 / w, 2)
|
||||||
y1 = round(y0/h, 2)
|
y1 = round(y0 / h, 2)
|
||||||
x2 = round((x0+w1)/w, 2)
|
x2 = round((x0 + w1) / w, 2)
|
||||||
y2 = round((y0+h1)/h, 2)
|
y2 = round((y0 + h1) / h, 2)
|
||||||
print(',{\n "x_range": '+f"[{x1:.2f}, {x2:.2f}]"+',\n "y_range": '+f"[{y1:.2f}, {y2:.2f}]"+'\n }')
|
print(
|
||||||
except:
|
',{\n "x_range": ' + f"[{x1:.2f}, {x2:.2f}]" + ',\n "y_range": ' + f"[{y1:.2f}, {y2:.2f}]" + '\n }')
|
||||||
|
except ValueError:
|
||||||
pass
|
pass
|
||||||
except:
|
except ValueError:
|
||||||
pass
|
pass
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
pass
|
||||||
|
|||||||
+2
-3
@@ -3,7 +3,6 @@ import stat
|
|||||||
import time
|
import time
|
||||||
import datetime
|
import datetime
|
||||||
import logging
|
import logging
|
||||||
from os import path
|
|
||||||
from meme_otron import img_factory
|
from meme_otron import img_factory
|
||||||
from meme_otron import meme_db
|
from meme_otron import meme_db
|
||||||
from meme_otron import utils
|
from meme_otron import utils
|
||||||
@@ -16,7 +15,7 @@ db_file = utils.relative_path(__file__, "..", meme_db.DATA_FILE)
|
|||||||
templates_dir = utils.relative_path(__file__, "..", "templates")
|
templates_dir = utils.relative_path(__file__, "..", "templates")
|
||||||
dst_dir = utils.relative_path(__file__, "tmp")
|
dst_dir = utils.relative_path(__file__, "tmp")
|
||||||
|
|
||||||
if not path.exists(dst_dir):
|
if not os.path.exists(dst_dir):
|
||||||
os.mkdir(dst_dir)
|
os.mkdir(dst_dir)
|
||||||
|
|
||||||
last = None
|
last = None
|
||||||
@@ -32,6 +31,6 @@ while True:
|
|||||||
meme = meme_db.get_meme(meme_id)
|
meme = meme_db.get_meme(meme_id)
|
||||||
img = img_factory.build_from_template(meme.template, meme.texts, debug=True)
|
img = img_factory.build_from_template(meme.template, meme.texts, debug=True)
|
||||||
if img is not None:
|
if img is not None:
|
||||||
img.save(path.join(dst_dir, meme.template))
|
img.save(os.path.join(dst_dir, meme.template))
|
||||||
count += 1
|
count += 1
|
||||||
print(f"{datetime.datetime.now():%H:%M:%S} / {count} registered templates / {len(os.listdir(templates_dir))} files")
|
print(f"{datetime.datetime.now():%H:%M:%S} / {count} registered templates / {len(os.listdir(templates_dir))} files")
|
||||||
|
|||||||
Reference in New Issue
Block a user