Skip to content

Commit

Permalink
Add Black formatter (#20)
Browse files Browse the repository at this point in the history
- Also use 3.7.0 instead of 3.7-dev
  • Loading branch information
maroux committed Oct 4, 2018
1 parent 310ea38 commit e90c048
Show file tree
Hide file tree
Showing 26 changed files with 275 additions and 337 deletions.
6 changes: 5 additions & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,11 @@ language: python
python:
- '3.6'
- 3.6-dev
- 3.7-dev
matrix:
include:
- python: 3.7
dist: xenial
sudo: true
install:
- make test_setup
script:
Expand Down
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
PYTHON_VERSIONS:=3.6,3.6-dev,3.7-dev
PYTHON_VERSIONS:=3.6,3.6-dev,3.7

export PYTHON_VERSIONS

Expand Down
3 changes: 3 additions & 0 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ Hedwig Library for Python
.. image:: https://img.shields.io/pypi/implementation/authedwig.svg?style=flat-square
:target: https://pypi.python.org/pypi/authedwig

.. image:: https://img.shields.io/badge/code%20style-black-000000.svg
:target: https://github.com/ambv/black

Hedwig is a inter-service communication bus that works on AWS SQS/SNS, while keeping things pretty simple and
straight forward. It uses `json schema`_ `draft v4`_ for schema validation so all incoming
and outgoing messages are validated against pre-defined schema.
Expand Down
31 changes: 12 additions & 19 deletions docs/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,11 +44,7 @@
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = [
'sphinx.ext.autodoc',
'sphinx.ext.doctest',
'sphinx.ext.viewcode',
]
extensions = ['sphinx.ext.autodoc', 'sphinx.ext.doctest', 'sphinx.ext.viewcode']

# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
Expand Down Expand Up @@ -119,15 +115,12 @@
# The paper size ('letterpaper' or 'a4paper').
#
# 'papersize': 'letterpaper',

# The font size ('10pt', '11pt' or '12pt').
#
# 'pointsize': '10pt',

# Additional stuff for the LaTeX preamble.
#
# 'preamble': '',

# Latex figure (float) alignment
#
# 'figure_align': 'htbp',
Expand All @@ -136,20 +129,14 @@
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
(master_doc, 'Hedwig.tex', 'Hedwig Documentation',
'Aniruddha Maru', 'manual'),
]
latex_documents = [(master_doc, 'Hedwig.tex', 'Hedwig Documentation', 'Aniruddha Maru', 'manual')]


# -- Options for manual page output ------------------------------------------

# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
(master_doc, 'hedwig', 'Hedwig Documentation',
[author], 1)
]
man_pages = [(master_doc, 'hedwig', 'Hedwig Documentation', [author], 1)]


# -- Options for Texinfo output ----------------------------------------------
Expand All @@ -158,9 +145,15 @@
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
(master_doc, 'Hedwig', 'Hedwig Documentation',
author, 'Hedwig', 'One line description of project.',
'Miscellaneous'),
(
master_doc,
'Hedwig',
'Hedwig Documentation',
author,
'Hedwig',
'One line description of project.',
'Miscellaneous',
)
]


Expand Down
4 changes: 1 addition & 3 deletions hedwig/callback.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,4 @@ def find_by_message(cls, msg_type: MessageType, major_version: int) -> 'Callback
raise CallbackNotFound(msg_type, major_version)


_ALL_CALLBACKS = {
(MessageType(k[0]), k[1]): Callback(v) for k, v in settings.HEDWIG_CALLBACKS.items()
}
_ALL_CALLBACKS = {(MessageType(k[0]), k[1]): Callback(v) for k, v in settings.HEDWIG_CALLBACKS.items()}
24 changes: 7 additions & 17 deletions hedwig/commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ class PartialFailure(Exception):
"""
Error indicating either send_messages or delete_messages API call failed partially
"""

def __init__(self, result):
self.success_count = len(result['Successful'])
self.failure_count = len(result['Failed'])
Expand All @@ -22,14 +23,9 @@ def _enqueue_messages(queue, queue_messages) -> None:
result = queue.send_messages(
Entries=[
funcy.merge(
{
'Id': queue_message.message_id,
'MessageBody': queue_message.body,
},
{
'MessageAttributes': queue_message.message_attributes
} if queue_message.message_attributes else {},
params
{'Id': queue_message.message_id, 'MessageBody': queue_message.body},
{'MessageAttributes': queue_message.message_attributes} if queue_message.message_attributes else {},
params,
)
for queue_message in queue_messages
]
Expand All @@ -43,7 +39,7 @@ def get_dead_letter_queue(queue):
return get_queue(queue_name)


def requeue_dead_letter(num_messages: int=10, visibility_timeout: int=None) -> None:
def requeue_dead_letter(num_messages: int = 10, visibility_timeout: int = None) -> None:
"""
Re-queues everything in the Hedwig DLQ back into the Hedwig queue.
Expand All @@ -58,7 +54,7 @@ def requeue_dead_letter(num_messages: int=10, visibility_timeout: int=None) -> N
logging.info("Re-queueing messages from {} to {}".format(dead_letter_queue.url, queue.url))
while True:
queue_messages = get_queue_messages(
dead_letter_queue, num_messages=num_messages, visibility_timeout=visibility_timeout, wait_timeout_s=1,
dead_letter_queue, num_messages=num_messages, visibility_timeout=visibility_timeout, wait_timeout_s=1
)
if not queue_messages:
break
Expand All @@ -67,13 +63,7 @@ def requeue_dead_letter(num_messages: int=10, visibility_timeout: int=None) -> N

_enqueue_messages(queue, queue_messages)
dead_letter_queue.delete_messages(
Entries=[
{
'Id': message.message_id,
'ReceiptHandle': message.receipt_handle
}
for message in queue_messages
]
Entries=[{'Id': message.message_id, 'ReceiptHandle': message.receipt_handle} for message in queue_messages]
)

logging.info("Re-queued {} messages".format(len(queue_messages)))
12 changes: 7 additions & 5 deletions hedwig/conf/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
from django.conf import settings as django_settings
from django.dispatch import receiver
from django.test import signals

HAVE_DJANGO = True
except ImportError:
HAVE_DJANGO = False
Expand Down Expand Up @@ -47,9 +48,7 @@
)

# List of settings that will be dicts with values as string import notation.
_IMPORT_DICT_VALUES = (
'HEDWIG_CALLBACKS',
)
_IMPORT_DICT_VALUES = ('HEDWIG_CALLBACKS',)


def default_headers_hook(*args, **kwargs) -> typing.Dict[str, str]:
Expand All @@ -69,6 +68,7 @@ class _LazySettings:
Any setting with string import paths will be automatically resolved
and return the class, rather than the string literal.
"""

def __init__(self) -> None:
self._defaults = _DEFAULTS
self._import_strings = _IMPORT_STRINGS
Expand All @@ -84,8 +84,9 @@ def __init__(self) -> None:
raise ImportError("No settings module found to import")

@staticmethod
def _import_string(dotted_path_or_callable: typing.Union[typing.Callable, str]) -> \
typing.Union[typing.Callable, typing.Type]:
def _import_string(
dotted_path_or_callable: typing.Union[typing.Callable, str]
) -> typing.Union[typing.Callable, typing.Type]:
"""
Import a dotted module path and return the attribute/class designated by the
last name in the path. Raise ImportError if the import failed.
Expand Down Expand Up @@ -136,6 +137,7 @@ def clear_cache(self) -> None:


if HAVE_DJANGO:

@receiver(signals.setting_changed)
def clear_cache_on_setting_override(sender, setting, value, enter, **kwargs):
settings.clear_cache()
Expand Down
29 changes: 17 additions & 12 deletions hedwig/consumer.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,15 +32,11 @@ def get_default_queue_name() -> str:


def log_received_message(message_body: dict) -> None:
logger.debug('Received message', extra={
'message_body': message_body,
})
logger.debug('Received message', extra={'message_body': message_body})


def log_invalid_message(message_json: str) -> None:
logger.debug('Received invalid message', extra={
'message_json': message_json,
})
logger.debug('Received invalid message', extra={'message_json': message_json})


def _load_and_validate_message(data: dict) -> Message:
Expand Down Expand Up @@ -104,8 +100,12 @@ def get_queue(queue_name: str):
return sqs.get_queue_by_name(QueueName=queue_name)


def get_queue_messages(queue, num_messages: int, wait_timeout_s: typing.Optional[int] = None,
visibility_timeout: typing.Optional[int] = None) -> list:
def get_queue_messages(
queue,
num_messages: int,
wait_timeout_s: typing.Optional[int] = None,
visibility_timeout: typing.Optional[int] = None,
) -> list:
params = {
'MaxNumberOfMessages': num_messages,
'WaitTimeSeconds': wait_timeout_s or WAIT_TIME_SECONDS,
Expand All @@ -117,7 +117,8 @@ def get_queue_messages(queue, num_messages: int, wait_timeout_s: typing.Optional


def fetch_and_process_messages(
queue_name: str, queue, num_messages: int = 1, visibility_timeout: typing.Optional[int] = None) -> None:
queue_name: str, queue, num_messages: int = 1, visibility_timeout: typing.Optional[int] = None
) -> None:

for queue_message in get_queue_messages(queue, num_messages=num_messages, visibility_timeout=visibility_timeout):
settings.HEDWIG_PRE_PROCESS_HOOK(sqs_queue_message=queue_message)
Expand All @@ -141,8 +142,11 @@ def process_messages_for_lambda_consumer(lambda_event: dict) -> None:


def listen_for_messages(
num_messages: int = 10, visibility_timeout_s: typing.Optional[int] = None,
loop_count: typing.Optional[int] = None, shutdown_event: threading.Event = None) -> None:
num_messages: int = 10,
visibility_timeout_s: typing.Optional[int] = None,
loop_count: typing.Optional[int] = None,
shutdown_event: threading.Event = None,
) -> None:
"""
Starts a Hedwig listener for message types provided and calls the callback handlers like so:
Expand Down Expand Up @@ -171,6 +175,7 @@ def listen_for_messages(
for count in itertools.count():
if (loop_count is None or count < loop_count) and not shutdown_event.is_set():
fetch_and_process_messages(
queue_name, queue, num_messages=num_messages, visibility_timeout=visibility_timeout_s)
queue_name, queue, num_messages=num_messages, visibility_timeout=visibility_timeout_s
)
else:
break
8 changes: 7 additions & 1 deletion hedwig/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ class RetryException(Exception):
Special exception that does not log an exception when it is received.
This is a retryable error.
"""

def __init__(self, *args, **kwargs) -> None:
pass

Expand All @@ -15,7 +16,8 @@ class LoggingException(Exception):
An exception that allows passing additional logging info. `extra` must be a dict that will be passed to
`logging.exception` and can be used by a logging adaptor etc.
"""
def __init__(self, message, extra: typing.Optional[typing.Dict]=None) -> None:

def __init__(self, message, extra: typing.Optional[typing.Dict] = None) -> None:
super().__init__(message)
self.extra = extra

Expand All @@ -24,25 +26,29 @@ class IgnoreException(Exception):
"""
Indicates that this task should be ignored.
"""

pass


class ValidationError(Exception):
"""
Message failed JSON schema validation
"""

pass


class ConfigurationError(Exception):
"""
There was some problem with settings
"""

pass


class CallbackNotFound(Exception):
"""
No callback found that can handle the given message. Check your `CALLBACKS` settings.
"""

pass

0 comments on commit e90c048

Please sign in to comment.