Skip to content

Commit 81704d3

Browse files
authored
Hot fix 0.3.4 (#36)
- TItkcetPrice now has a lock (multiple threads creating multiple TicketPrice's) - Empty UpdateMessage now is possible - reduce on __str__ methods
1 parent f21fdf2 commit 81704d3

4 files changed

Lines changed: 46 additions & 21 deletions

File tree

db/ticket.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import logging
2+
from threading import Lock
23

34
import pendulum
45
from mongoengine import (
@@ -16,6 +17,7 @@
1617

1718

1819
class TicketPrice(Document):
20+
lock = Lock()
1921
endpoint = "stake/diff"
2022

2123
price = FloatField(required=True)
@@ -49,6 +51,7 @@ def _fetch_new_ticket_price(cls):
4951

5052
@classmethod
5153
def get_last(cls):
54+
cls.lock.acquire()
5255
last_ticket_price = cls.objects.order_by('-datetime').first()
5356

5457
try:
@@ -59,4 +62,5 @@ def get_last(cls):
5962
finally:
6063
last_ticket_price.save()
6164

65+
cls.lock.release()
6266
return last_ticket_price

db/update_message.py

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from json import loads
2+
from functools import reduce
23

34
import pendulum
45
from mongoengine import (
@@ -19,6 +20,11 @@ class Amount(EmbeddedDocument):
1920
def __str__(self):
2021
return f"{self.value} DCR"
2122

23+
def __add__(self, other):
24+
if not isinstance(other, Amount):
25+
raise TypeError('Cannot add!')
26+
return Amount(self._value + other._value)
27+
2228
def equal(self, other):
2329
if not isinstance(other, Amount):
2430
raise TypeError(f"Other must be {Amount}")
@@ -41,12 +47,9 @@ class Session(EmbeddedDocument):
4147

4248
def __str__(self):
4349
string = f"{self.hash[:32]}:\t["
44-
total = 0
45-
for index, amount in enumerate(self.amounts):
46-
total += amount.value
47-
string += f"{amount}"
48-
string += ", " if index != len(self.amounts)-1 else "]"
49-
string += f"\nTotal: {total} DCR"
50+
string += ", ".join([f"{amount}" for amount in self.amounts])
51+
total = reduce(lambda a, b: a+b, self.amounts, Amount(0))
52+
string += f"]\nTotal: {total}"
5053
return string
5154

5255
def equal(self, other):
@@ -69,7 +72,7 @@ def from_data(cls, data):
6972

7073
class UpdateMessage(Document):
7174
subject = ReferenceField(Subject, required=True)
72-
sessions = EmbeddedDocumentListField(Session, required=True)
75+
sessions = EmbeddedDocumentListField(Session)
7376
datetime = DateTimeField(default=pendulum.now, required=True)
7477

7578
meta = {
@@ -81,11 +84,10 @@ class UpdateMessage(Document):
8184

8285
def __str__(self):
8386
string = f"<b>{self.subject.header}</b>\n\n"
84-
string += f"<i>Default session: {self.subject.default_session}</i>\n\n"
8587
string += f"Ticket price: {TicketPrice.get_last()}\n\n"
86-
for index, msg in enumerate(self.sessions):
87-
string += f"<code>{msg}</code>"
88-
string += "\n\n" if index != len(self.sessions) - 1 else ""
88+
string += f"<i>Default session: {self.subject.default_session}</i>\n\n"
89+
string += "\n\n".join([f"<code>{session}</code>"
90+
for session in self.sessions])
8991
return string
9092

9193
def equal(self, other):

sws/client.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
from threading import Thread, Lock
44

55
from websocket import WebSocketApp
6-
from mongoengine.errors import ValidationError
76

87
from bot.jack import JackBot
98
from db.subject import Subject
@@ -80,7 +79,7 @@ def on_message(ws: WebSocketApp, data):
8079
sws.subject.notify(msg)
8180
sws.lock.release()
8281
logger.info(f'{sws.name} released lock!')
83-
except (ValidationError, DuplicatedUpdateMessageError) as e:
82+
except DuplicatedUpdateMessageError as e:
8483
logger.info(f"Supress {e} for creating {UpdateMessage} "
8584
f"from {data} on {sws}")
8685

tests/db/test_update_message.py

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
from unittest import TestCase
1+
from unittest import TestCase, mock
22

33
import pytest
44

55
from tests.fixtures import mongo # noqa F401
66
from db.update_message import UpdateMessage, Session, Amount
77
from db.subject import Subject
8+
from db.ticket import TicketPrice
89
from utils.exceptions import DuplicatedUpdateMessageError
910

1011

@@ -28,29 +29,48 @@ def setUp(self) -> None:
2829
def test_init(self):
2930
self.assertEqual(UpdateMessage.objects.count(), 0)
3031

31-
UpdateMessage(self.subject, [Session('test', [Amount(10)])]).save()
32+
UpdateMessage(self.subject,
33+
[Session('test', [Amount(1000000000)])]).save()
3234
self.assertEqual(UpdateMessage.objects.count(), 1)
3335

3436
instance = UpdateMessage.objects.first()
3537
self.assertEqual(instance.subject, self.subject)
3638
self.assertIsInstance(instance, UpdateMessage)
3739

40+
@mock.patch('db.ticket.TicketPrice.get_last')
41+
def test_str(self, mocked_get_last):
42+
ticket_price = TicketPrice(10)
43+
mocked_get_last.return_value = ticket_price
44+
45+
instance = UpdateMessage(self.subject,
46+
[Session('test', [Amount(1000000000)])]).save()
47+
self.assertEqual(instance.__str__(),
48+
f"<b>🇧🇷 Decred Brasil</b>\n\n"
49+
f"Ticket price: 10.00 DCR\n\n"
50+
f"<i>Default session: dcrbr1</i>\n\n"
51+
f"<code>test:\t[10.0 DCR]\nTotal: 10.0 DCR</code>")
52+
3853
def test_equal(self):
39-
instance = UpdateMessage(self.subject, [Session('test', [Amount(10)])])
40-
other = UpdateMessage(self.subject, [Session('test', [Amount(10)])])
54+
instance = UpdateMessage(self.subject,
55+
[Session('test', [Amount(1000000000)])])
56+
other = UpdateMessage(self.subject,
57+
[Session('test', [Amount(1000000000)])])
4158

4259
self.assertTrue(instance.equal(other))
4360

4461
def test_equal_false(self):
45-
instance = UpdateMessage(self.subject, [Session('test', [Amount(10)])])
46-
other = UpdateMessage(self.subject, [Session('test', [Amount(11)])])
62+
instance = UpdateMessage(self.subject,
63+
[Session('test', [Amount(1000000000)])])
64+
other = UpdateMessage(self.subject,
65+
[Session('test', [Amount(1100000000)])])
4766

4867
self.assertFalse(instance.equal(other))
4968

5069
def test_get_last_by_subject(self):
51-
UpdateMessage(self.subject, [Session('test', [Amount(10)])]).save()
70+
UpdateMessage(self.subject, [Session('test',
71+
[Amount(1000000000)])]).save()
5272
other = UpdateMessage(self.subject,
53-
[Session('test', [Amount(11)])]).save()
73+
[Session('test', [Amount(1100000000)])]).save()
5474

5575
last = UpdateMessage.get_last_by_subject(self.subject)
5676
self.assertEqual(other, last)

0 commit comments

Comments
 (0)