Added cli for db and fixed error in labels model

pull/85/head
kompotkot 2021-08-09 14:58:48 +00:00
rodzic 55ac27689c
commit b63cdfe7fc
4 zmienionych plików z 87 dodań i 17 usunięć

Wyświetl plik

@ -1,8 +1,8 @@
"""Labels for addresses
Revision ID: 4d69885b673a
Revision ID: 40871a7807f6
Revises: 571f33ad7587
Create Date: 2021-08-09 12:18:54.670225
Create Date: 2021-08-09 14:50:46.163063
"""
from alembic import op
@ -10,7 +10,7 @@ import sqlalchemy as sa
from sqlalchemy.dialects import postgresql
# revision identifiers, used by Alembic.
revision = '4d69885b673a'
revision = '40871a7807f6'
down_revision = '571f33ad7587'
branch_labels = None
depends_on = None
@ -31,14 +31,15 @@ def upgrade():
op.create_table('ethereum_labels',
sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),
sa.Column('label', sa.VARCHAR(length=256), nullable=False),
sa.Column('address', sa.Integer(), nullable=False),
sa.Column('address_id', sa.Integer(), nullable=False),
sa.Column('label_data', postgresql.JSONB(astext_type=sa.Text()), nullable=True),
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text("TIMEZONE('utc', statement_timestamp())"), nullable=False),
sa.ForeignKeyConstraint(['address'], ['ethereum_addresses.id'], name=op.f('fk_ethereum_labels_address_ethereum_addresses'), ondelete='CASCADE'),
sa.ForeignKeyConstraint(['address_id'], ['ethereum_addresses.id'], name=op.f('fk_ethereum_labels_address_id_ethereum_addresses'), ondelete='CASCADE'),
sa.PrimaryKeyConstraint('id', name=op.f('pk_ethereum_labels')),
sa.UniqueConstraint('id', name=op.f('uq_ethereum_labels_id'))
sa.UniqueConstraint('id', name=op.f('uq_ethereum_labels_id')),
sa.UniqueConstraint('label', 'address_id', name=op.f('uq_ethereum_labels_label'))
)
op.create_index(op.f('ix_ethereum_labels_address'), 'ethereum_labels', ['address'], unique=False)
op.create_index(op.f('ix_ethereum_labels_address_id'), 'ethereum_labels', ['address_id'], unique=False)
op.create_index(op.f('ix_ethereum_labels_label'), 'ethereum_labels', ['label'], unique=False)
# ### end Alembic commands ###
@ -51,11 +52,11 @@ def downgrade():
op.execute("ALTER TABLE ethereum_addresses RENAME TO ethereum_smart_contracts;")
op.alter_column("ethereum_smart_contracts", "transaction_hash", nullable=False)
op.drop_column('ethereum_smart_contracts', 'created_at')
op.create_index('ix_ethereum_smart_contracts_transaction_hash', 'ethereum_smart_contracts', ['transaction_hash'], unique=False)
op.create_index('ix_ethereum_smart_contracts_address', 'ethereum_smart_contracts', ['address'], unique=False)
op.drop_index(op.f('ix_ethereum_labels_label'), table_name='ethereum_labels')
op.drop_index(op.f('ix_ethereum_labels_address'), table_name='ethereum_labels')
op.drop_index(op.f('ix_ethereum_labels_address_id'), table_name='ethereum_labels')
op.drop_table('ethereum_labels')
# ### end Alembic commands ###

Wyświetl plik

@ -1,11 +1,47 @@
import argparse
import json
from .db import yield_db_session_ctx
from .models import EthereumLabel
from .models import EthereumAddress, EthereumLabel
def labels_add_handler(args: argparse.Namespace) -> None:
pass
"""
Add new label for ethereum address.
"""
try:
label_data = json.loads(args.data)
except ValueError as err:
print(str(err))
raise ValueError("Unable to parse data as dictionary")
with yield_db_session_ctx() as db_session:
address = (
db_session.query(EthereumAddress)
.filter(EthereumAddress.address == str(args.address))
.one_or_none()
)
if address is None:
print(f"There is no {args.address} address")
return
label = EthereumLabel(
label=args.label, address_id=address.id, label_data=label_data
)
db_session.add(label)
db_session.commit()
print(
json.dumps(
{
"id": str(label.id),
"label": str(label.label),
"address_id": str(label.address_id),
"label_data": str(label.label_data),
"created_at": str(label.created_at),
}
)
)
def labels_list_handler(args: argparse.Namespace) -> None:
@ -13,9 +49,25 @@ def labels_list_handler(args: argparse.Namespace) -> None:
Return list of all labels.
"""
with yield_db_session_ctx() as db_session:
labels = db_session.query(EthereumLabel).all()
query = db_session.query(EthereumLabel).all()
if str(args.address) is not None:
query = query.filter(EthereumAddress.address == str(args.address))
labels = query.all()
print(labels.json())
print(
json.dumps(
[
{
"id": str(label.id),
"label": str(label.label),
"address_id": str(label.address_id),
"label_data": str(label.label_data),
"created_at": str(label.created_at),
}
for label in labels
]
)
)
def main():
@ -44,11 +96,21 @@ def main():
required=True,
help="New label name",
)
parser_labels_add.add_argument(
"-d",
"--data",
help="New label data",
)
parser_labels_add.set_defaults(func=labels_add_handler)
parser_labels_list = subcommands_labels.add_parser(
"list", description="List all meta labels command"
)
parser_labels_list.add_argument(
"-a",
"--address",
help="Filter address",
)
parser_labels_list.set_defaults(func=labels_list_handler)
args = parser.parse_args()

Wyświetl plik

@ -11,6 +11,7 @@ from sqlalchemy import (
Numeric,
Text,
VARCHAR,
UniqueConstraint,
)
from sqlalchemy.dialects.postgresql import JSONB, UUID
from sqlalchemy.sql import expression
@ -123,18 +124,19 @@ class EthereumLabel(Base): # type: ignore
Example of label_data:
{
"label": "ERC20",
"metadata": {
"label_data": {
"name": "Uniswap",
"symbol": "UNI"
}
},
{
"label": "Exchange"
"metadata": {...}
"label_data": {...}
}
"""
__tablename__ = "ethereum_labels"
__table_args__ = (UniqueConstraint("label", "address_id"),)
id = Column(
UUID(as_uuid=True),
@ -144,7 +146,7 @@ class EthereumLabel(Base): # type: ignore
nullable=False,
)
label = Column(VARCHAR(256), nullable=False, index=True)
address = Column(
address_id = Column(
Integer,
ForeignKey("ethereum_addresses.id", ondelete="CASCADE"),
nullable=False,

Wyświetl plik

@ -34,4 +34,9 @@ setup(
zip_safe=False,
install_requires=["alembic", "psycopg2-binary", "sqlalchemy"],
extras_require={"dev": ["black", "mypy"]},
entry_points={
"console_scripts": [
"moonstreamdb=moonstreamdb.cli:main",
]
},
)