Skip to content
Snippets Groups Projects
Commit 04946d7a authored by inso's avatar inso
Browse files

Add Transaction entity

parent 28aabd0c
No related branches found
No related tags found
No related merge requests found
from .identity import Identity
from .community import Community
from .certification import Certification
from .transaction import Transaction
import attr
from duniterpy.documents import block_uid
@attr.s()
class Transaction:
currency = attr.ib(convert=str, cmp=False)
sha_hash = attr.ib(convert=str)
written_on = attr.ib(convert=block_uid, cmp=False)
blockstamp = attr.ib(convert=block_uid, cmp=False)
timestamp = attr.ib(convert=int, cmp=False)
signature = attr.ib(convert=str, cmp=False)
issuer = attr.ib(convert=str, cmp=False)
receiver = attr.ib(convert=str, cmp=False)
amount = attr.ib(convert=int, cmp=False)
amount_base = attr.ib(convert=int, cmp=False)
comment = attr.ib(convert=str, cmp=False)
txid = attr.ib(convert=int, cmp=False)
......@@ -2,3 +2,4 @@ from .identities import IdentitiesRepo
from .communities import CommunitiesRepo
from .meta import MetaDatabase
from .certifications import CertificationsRepo
from .transactions import TransactionsRepo
......@@ -37,7 +37,9 @@ CREATE TABLE IF NOT EXISTS communities(
currency VARCHAR(30),
PRIMARY KEY (currency)
);
-- IDENTITY TABLE
-- CERTIFICATIONS TABLE
CREATE TABLE IF NOT EXISTS certifications(
currency VARCHAR(30),
certifier VARCHAR(50),
......@@ -48,3 +50,21 @@ CREATE TABLE IF NOT EXISTS certifications(
written_on VARCHAR(100),
PRIMARY KEY (currency, certifier, certified, blockstamp)
);
-- TRANSACTIONS TABLE
CREATE TABLE IF NOT EXISTS transactions(
currency VARCHAR(30),
sha_hash VARCHAR(50),
written_on VARCHAR(100),
blockstamp VARCHAR(100),
ts INT,
signature VARCHAR(100),
issuer VARCHAR(50),
receiver VARCHAR(50),
amount INT,
amountbase INT,
comment VARCHAR(255),
txid INT,
PRIMARY KEY (sha_hash)
);
import attr
from ..entities import Transaction
@attr.s(frozen=True)
class TransactionsRepo:
"""The repository for Communities entities.
"""
_conn = attr.ib() # :type sqlite3.Connection
_primary_keys = (Transaction.sha_hash,)
def insert(self, transaction):
"""
Commit a transaction to the database
:param sakia.data.entities.Transaction transaction: the transaction to commit
"""
with self._conn:
transaction_tuple = attr.astuple(transaction)
values = ",".join(['?'] * len(transaction_tuple))
self._conn.execute("INSERT INTO transactions VALUES ({0})".format(values), transaction_tuple)
def update(self, transaction):
"""
Update an existing transaction in the database
:param sakia.data.entities.Transaction transaction: the transaction to update
"""
with self._conn:
updated_fields = attr.astuple(transaction, filter=attr.filters.exclude(*TransactionsRepo._primary_keys))
where_fields = attr.astuple(transaction, filter=attr.filters.include(*TransactionsRepo._primary_keys))
self._conn.execute("""UPDATE transactions SET
currency=?,
written_on=?,
blockstamp=?,
ts=?,
signature=?,
issuer = ?,
receiver = ?,
amount = ?,
amountbase = ?,
comment = ?,
txid = ?
WHERE
sha_hash=?""",
updated_fields + where_fields)
def get_one(self, **search):
"""
Get an existing transaction in the database
:param dict search: the criterions of the lookup
:rtype: sakia.data.entities.Transaction
"""
with self._conn:
filters = []
values = []
for k, v in search.items():
filters.append("{k}=?".format(k=k))
values.append(v)
request = "SELECT * FROM transactions WHERE {filters}".format(filters=" AND ".join(filters))
c = self._conn.execute(request, tuple(values))
data = c.fetchone()
if data:
return Transaction(*data)
def get_all(self, **search):
"""
Get all existing transaction in the database corresponding to the search
:param dict search: the criterions of the lookup
:rtype: sakia.data.entities.Transaction
"""
with self._conn:
filters = []
values = []
for k, v in search.items():
value = v
filters.append("{key} = ?".format(key=k))
values.append(value)
request = "SELECT * FROM transactions WHERE {filters}".format(filters=" AND ".join(filters))
c = self._conn.execute(request, tuple(values))
datas = c.fetchall()
if datas:
return [Transaction(*data) for data in datas]
return []
def drop(self, transaction):
"""
Drop an existing transaction from the database
:param sakia.data.entities.Transaction transaction: the transaction to update
"""
with self._conn:
where_fields = attr.astuple(transaction, filter=attr.filters.include(*TransactionsRepo._primary_keys))
self._conn.execute("""DELETE FROM transactions
WHERE
sha_hash=?""", where_fields)
from sakia.data.repositories import TransactionsRepo, MetaDatabase
from sakia.data.entities import Transaction
from duniterpy.documents import BlockUID
import unittest
import sqlite3
class TestTransactionsRepo(unittest.TestCase):
def setUp(self):
sqlite3.register_adapter(BlockUID, str)
sqlite3.register_adapter(bool, int)
sqlite3.register_converter("BOOLEAN", lambda v: bool(int(v)))
self.con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_DECLTYPES)
def tearDown(self):
self.con.close()
def test_add_get_drop_transaction(self):
meta_repo = MetaDatabase(self.con)
meta_repo.prepare()
meta_repo.upgrade_database()
transactions_repo = TransactionsRepo(self.con)
transactions_repo.insert(Transaction("testcurrency",
"FCAD5A388AC8A811B45A9334A375585E77071AA9F6E5B6896582961A6C66F365",
"20-7518C700E78B56CC21FB1DDC6CBAB24E0FACC9A798F5ED8736EA007F38617D67",
"15-76543400E78B56CC21FB1DDC6CBAB24E0FACC9A798F5ED8736EA007F38617D67",
1473108382,
"H41/8OGV2W4CLKbE35kk5t1HJQsb3jEM0/QGLUf80CwJvGZf3HvVCcNtHPUFoUBKEDQO9mPK3KJkqOoxHpqHCw==",
"7Aqw6Efa9EzE7gtsc8SveLLrM7gm6NEGoywSv4FJx6pZ",
"FADxcH5LmXGmGFgdixSes6nWnC4Vb4pRUBYT81zQRhjn",
1565,
1,
"",
0))
transaction = transactions_repo.get_one(sha_hash="FCAD5A388AC8A811B45A9334A375585E77071AA9F6E5B6896582961A6C66F365")
self.assertEqual(transaction.currency, "testcurrency")
self.assertEqual(transaction.sha_hash, "FCAD5A388AC8A811B45A9334A375585E77071AA9F6E5B6896582961A6C66F365")
self.assertEqual(transaction.written_on.number, 20)
self.assertEqual(transaction.written_on.sha_hash, "7518C700E78B56CC21FB1DDC6CBAB24E0FACC9A798F5ED8736EA007F38617D67")
self.assertEqual(transaction.blockstamp.number, 15)
self.assertEqual(transaction.blockstamp.sha_hash, "76543400E78B56CC21FB1DDC6CBAB24E0FACC9A798F5ED8736EA007F38617D67")
self.assertEqual(transaction.timestamp, 1473108382)
self.assertEqual(transaction.signature, "H41/8OGV2W4CLKbE35kk5t1HJQsb3jEM0/QGLUf80CwJvGZf3HvVCcNtHPUFoUBKEDQO9mPK3KJkqOoxHpqHCw==")
self.assertEqual(transaction.amount, 1565)
self.assertEqual(transaction.amount_base, 1)
self.assertEqual(transaction.issuer, "7Aqw6Efa9EzE7gtsc8SveLLrM7gm6NEGoywSv4FJx6pZ")
self.assertEqual(transaction.receiver, "FADxcH5LmXGmGFgdixSes6nWnC4Vb4pRUBYT81zQRhjn")
self.assertEqual(transaction.comment, "")
self.assertEqual(transaction.txid, 0)
transactions_repo.drop(transaction)
transaction = transactions_repo.get_one(sha_hash="FCAD5A388AC8A811B45A9334A375585E77071AA9F6E5B6896582961A6C66F365")
self.assertIsNone(transaction)
def test_add_get_multiple_transaction(self):
meta_repo = MetaDatabase(self.con)
meta_repo.prepare()
meta_repo.upgrade_database()
transactions_repo = TransactionsRepo(self.con)
transactions_repo.insert(Transaction("testcurrency",
"A0AC57E2E4B24D66F2D25E66D8501D8E881D9E6453D1789ED753D7D426537ED5",
"12-AAEFCCE0E78B56CC21FB1DDC6CBAB24E0FACC9A798F5ED8736EA007F38617D67",
"543-76543400E78B56CC21FB1DDC6CBAB24E0FACC9A798F5ED8736EA007F38617D67",
1473108382,
"H41/8OGV2W4CLKbE35kk5t1HJQsb3jEM0/QGLUf80CwJvGZf3HvVCcNtHPUFoUBKEDQO9mPK3KJkqOoxHpqHCw==",
"FADxcH5LmXGmGFgdixSes6nWnC4Vb4pRUBYT81zQRhjn",
"7Aqw6Efa9EzE7gtsc8SveLLrM7gm6NEGoywSv4FJx6pZ",
14,
2,
"Test",
2))
transactions_repo.insert(Transaction("testcurrency",
"FCAD5A388AC8A811B45A9334A375585E77071AA9F6E5B6896582961A6C66F365",
"20-7518C700E78B56CC21FB1DDC6CBAB24E0FACC9A798F5ED8736EA007F38617D67",
"15-76543400E78B56CC21FB1DDC6CBAB24E0FACC9A798F5ED8736EA007F38617D67",
1473108382,
"H41/8OGV2W4CLKbE35kk5t1HJQsb3jEM0/QGLUf80CwJvGZf3HvVCcNtHPUFoUBKEDQO9mPK3KJkqOoxHpqHCw==",
"7Aqw6Efa9EzE7gtsc8SveLLrM7gm6NEGoywSv4FJx6pZ",
"FADxcH5LmXGmGFgdixSes6nWnC4Vb4pRUBYT81zQRhjn",
1565,
1,
"",
0))
transactions = transactions_repo.get_all(currency="testcurrency")
self.assertIn("testcurrency", [t.currency for t in transactions])
self.assertIn("7Aqw6Efa9EzE7gtsc8SveLLrM7gm6NEGoywSv4FJx6pZ", [t.receiver for t in transactions])
self.assertIn("FADxcH5LmXGmGFgdixSes6nWnC4Vb4pRUBYT81zQRhjn", [t.issuer for t in transactions])
def test_add_update_transaction(self):
meta_repo = MetaDatabase(self.con)
meta_repo.prepare()
meta_repo.upgrade_database()
transactions_repo = TransactionsRepo(self.con)
transaction = Transaction("testcurrency",
"FCAD5A388AC8A811B45A9334A375585E77071AA9F6E5B6896582961A6C66F365",
"20-7518C700E78B56CC21FB1DDC6CBAB24E0FACC9A798F5ED8736EA007F38617D67",
"15-76543400E78B56CC21FB1DDC6CBAB24E0FACC9A798F5ED8736EA007F38617D67",
1473108382,
"H41/8OGV2W4CLKbE35kk5t1HJQsb3jEM0/QGLUf80CwJvGZf3HvVCcNtHPUFoUBKEDQO9mPK3KJkqOoxHpqHCw==",
"7Aqw6Efa9EzE7gtsc8SveLLrM7gm6NEGoywSv4FJx6pZ",
"FADxcH5LmXGmGFgdixSes6nWnC4Vb4pRUBYT81zQRhjn",
1565,
1,
"",
0)
transactions_repo.insert(transaction)
transaction.written_on = None
transactions_repo.update(transaction)
transaction2 = transactions_repo.get_one(sha_hash="FCAD5A388AC8A811B45A9334A375585E77071AA9F6E5B6896582961A6C66F365")
self.assertEqual(transaction2.written_on, BlockUID.empty())
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment