Skip to content

Commit

Permalink
Add worker and card parsing task
Browse files Browse the repository at this point in the history
  • Loading branch information
Saluev committed Mar 9, 2019
1 parent 020c6dc commit 648f1a3
Show file tree
Hide file tree
Showing 9 changed files with 102 additions and 6 deletions.
4 changes: 4 additions & 0 deletions backend/dev_settings.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
MONGO_HOST = "mongo"
MONGO_PORT = 27017
MONGO_DATABASE = "core"
REDIS_HOST = "redis"
REDIS_PORT = 6379
REDIS_DB = 0
TASK_QUEUE_NAME = "tasks"
Empty file added backend/tasks/__init__.py
Empty file.
14 changes: 14 additions & 0 deletions backend/tasks/parse.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import mistune

from backend.storage.card import CardDAO
from backend.tasks.task import task


@task
def parse_card_markup(card_dao: CardDAO, card_id: str):
card = card_dao.get_by_id(card_id)
card.html = _parse_markdown(card.markdown)
card_dao.update(card)


_parse_markdown = mistune.Markdown(escape=True, hard_wrap=False)
19 changes: 19 additions & 0 deletions backend/tasks/task.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import functools
from typing import Callable

from backend.wiring import Wiring


def task(func: Callable):
varnames = func.__code__.co_varnames

@functools.wraps(func)
def result(*args, **kwargs):
wiring: Wiring = kwargs.pop("wiring")
wired_objects_by_name = wiring.__dict__
for arg_name in varnames:
if arg_name in wired_objects_by_name:
kwargs[arg_name] = wired_objects_by_name[arg_name]
return func(*args, **kwargs)

return result
10 changes: 10 additions & 0 deletions backend/wiring.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

from pymongo import MongoClient
from pymongo.database import Database
import redis
import rq

import backend.dev_settings
from backend.storage.card import CardDAO
Expand All @@ -22,3 +24,11 @@ def __init__(self, env=None):
port=self.settings.MONGO_PORT)
self.mongo_database: Database = self.mongo_client[self.settings.MONGO_DATABASE]
self.card_dao: CardDAO = MongoCardDAO(self.mongo_database)

self.redis: redis.Redis = redis.StrictRedis(
host=self.settings.REDIS_HOST,
port=self.settings.REDIS_PORT,
db=self.settings.REDIS_DB)
self.task_queue: rq.Queue = rq.Queue(
name=self.settings.TASK_QUEUE_NAME,
connection=self.redis)
3 changes: 3 additions & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,7 @@ flask
flask-cors
gevent
gunicorn
mistune
pymongo
redis
rq
19 changes: 13 additions & 6 deletions tools/add_test_content.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,18 @@
from backend.storage.card import Card
from backend.storage.card import Card, CardNotFound
from backend.tasks.parse import parse_card_markup
from backend.wiring import Wiring

wiring = Wiring()

wiring.card_dao.create(Card(
slug="helloworld",
name="Hello, world!",
markdown="""
try:
card = wiring.card_dao.get_by_slug("helloworld")
except CardNotFound:
card = wiring.card_dao.create(Card(
slug="helloworld",
name="Hello, world!",
markdown="""
This is a hello-world page.
"""))
"""))

wiring.task_queue.enqueue_call(
parse_card_markup, kwargs={"card_id": card.id})
Empty file added worker/__init__.py
Empty file.
39 changes: 39 additions & 0 deletions worker/__main__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import argparse
import uuid

import rq
from rq.job import Job

import backend.wiring

parser = argparse.ArgumentParser(description="Run worker.")
parser.add_argument(
"--burst",
action="store_const",
const=True,
default=False,
help="enable burst mode")
args = parser.parse_args()

wiring = backend.wiring.Wiring()


class JobWithWiring(Job):

@property
def kwargs(self):
result = dict(super().kwargs)
result["wiring"] = backend.wiring.Wiring()
return result

@kwargs.setter
def kwargs(self, value):
super().kwargs = value


with rq.Connection(wiring.redis):
w = rq.Worker(
queues=[wiring.settings.TASK_QUEUE_NAME],
name=uuid.uuid4().hex,
job_class=JobWithWiring)
w.work(burst=args.burst)

0 comments on commit 648f1a3

Please sign in to comment.