Skip to content

Commit b0e7436

Browse files
authored
Merge branch 'master' into AmozPay-typer-doc
2 parents 5127fa4 + 5e7c2bd commit b0e7436

File tree

7 files changed

+67
-18
lines changed

7 files changed

+67
-18
lines changed

docker/Dockerfile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@ RUN python3.9 -m venv /opt/venv
1616
ENV PATH="/opt/venv/bin:$PATH"
1717
ENV PATH="/opt/venv/bin:$PATH"
1818

19-
RUN pip install --upgrade pip wheel
19+
RUN pip install --upgrade pip wheel twine
2020

2121
# Preinstall dependencies for faster steps
2222
RUN pip install --upgrade secp256k1 coincurve aiohttp eciespy python-magic typer
23-
RUN pip install --upgrade aleph-message eth_account pynacl base58
23+
RUN pip install --upgrade 'aleph-message~=0.2.3' eth_account pynacl base58
2424
RUN pip install --upgrade pytest pytest-cov pytest-asyncio mypy types-setuptools pytest-asyncio fastapi requests
2525

2626
WORKDIR /opt/aleph-client/

scripts/build-to-publish.sh

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,5 @@ $DOCKER_COMMAND build -t aleph-client -f docker/Dockerfile .
1717
$DOCKER_COMMAND run -ti --rm \
1818
-w /opt/aleph-client \
1919
-v "$(pwd)/dist":/opt/aleph-client/dist \
20-
aleph-client bash
20+
--entrypoint /bin/bash \
21+
aleph-client

setup.cfg

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,17 +36,14 @@ install_requires =
3636
eciespy
3737
typing_extensions
3838
typer
39-
aleph-message@git+https://github.com/aleph-im/aleph-message.git@hoh-new-type-alephmessage
39+
aleph-message~=0.2.3
4040
eth_account>=0.4.0
4141
python-magic
4242
# The usage of test_requires is discouraged, see `Dependency Management` docs
4343
# tests_require = pytest; pytest-cov
4444
# Require a specific Python version, e.g. Python 2.7 or >= 3.4
4545
# python_requires = >=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*
4646

47-
dependency_links =
48-
https://github.com/aleph-im/aleph-message.git@hoh-new-type-alephmessage#aleph-message
49-
5047
[options.packages.find]
5148
where = src
5249
exclude =
@@ -67,7 +64,7 @@ testing =
6764
base58
6865
fastapi
6966
requests
70-
aleph-pytezos@git+https://github.com/aleph-im/aleph-pytezos.git@e584ede63c4302c6c22ac1777fda6676655d664a
67+
aleph-pytezos==0.1.0
7168
mqtt =
7269
aiomqtt
7370
certifi
@@ -85,7 +82,7 @@ solana =
8582
base58
8683
tezos =
8784
pynacl
88-
aleph-pytezos@git+https://github.com/aleph-im/aleph-pytezos.git@e584ede63c4302c6c22ac1777fda6676655d664a
85+
aleph-pytezos==0.1.0
8986
docs =
9087
sphinxcontrib-plantuml
9188

src/aleph_client/asynchronous.py

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,12 @@
2424
AggregateMessage,
2525
StoreMessage,
2626
ProgramMessage,
27-
MessagesResponse,
2827
)
28+
from pydantic import ValidationError
2929

3030
from aleph_client.types import Account, StorageEnum, GenericMessage
3131
from .exceptions import MessageNotFoundError, MultipleMessagesError
32+
from .models import MessagesResponse
3233
from .utils import get_message_type_value
3334

3435
logger = logging.getLogger(__name__)
@@ -308,6 +309,7 @@ async def create_program(
308309
memory: int = settings.DEFAULT_VM_MEMORY,
309310
vcpus: int = settings.DEFAULT_VM_VCPUS,
310311
timeout_seconds: float = settings.DEFAULT_VM_TIMEOUT,
312+
persistent: bool = False,
311313
encoding: Encoding = Encoding.zip,
312314
volumes: List[Dict] = None,
313315
subscriptions: Optional[List[Dict]] = None,
@@ -321,10 +323,10 @@ async def create_program(
321323
## Register the different ways to trigger a VM
322324
if subscriptions:
323325
# Trigger on HTTP calls and on Aleph message subscriptions.
324-
triggers = {"http": True, "message": subscriptions}
326+
triggers = {"http": True, "persistent": persistent, "message": subscriptions}
325327
else:
326328
# Trigger on HTTP calls.
327-
triggers = {"http": True}
329+
triggers = {"http": True, "persistent": persistent}
328330

329331
content = ProgramContent(
330332
**{
@@ -373,6 +375,9 @@ async def create_program(
373375
}
374376
)
375377

378+
# Ensure that the version of aleph-message used supports the field.
379+
assert content.on.persistent == persistent
380+
376381
return await submit(
377382
account=account,
378383
content=content.dict(exclude_none=True),
@@ -572,6 +577,8 @@ async def get_messages(
572577
end_date: Optional[Union[datetime, float]] = None,
573578
session: Optional[ClientSession] = None,
574579
api_server: str = settings.API_HOST,
580+
ignore_invalid_messages: bool = True,
581+
invalid_messages_log_level: int = logging.NOTSET,
575582
) -> MessagesResponse:
576583
session = session or get_fallback_session()
577584

@@ -607,8 +614,36 @@ async def get_messages(
607614

608615
async with session.get(f"{api_server}/api/v0/messages.json", params=params) as resp:
609616
resp.raise_for_status()
610-
messages_json = await resp.json()
611-
return MessagesResponse(**messages_json)
617+
response_json = await resp.json()
618+
messages_raw = response_json["messages"]
619+
620+
# All messages may not be valid according to the latest specification in
621+
# aleph-message. This allows the user to specify how errors should be handled.
622+
messages: List[AlephMessage] = []
623+
for message_raw in messages_raw:
624+
try:
625+
message = Message(**message_raw)
626+
messages.append(message)
627+
except KeyError as e:
628+
if not ignore_invalid_messages:
629+
raise e
630+
logger.log(
631+
level=invalid_messages_log_level,
632+
msg=f"KeyError: Field '{e.args[0]}' not found",
633+
)
634+
except ValidationError as e:
635+
if not ignore_invalid_messages:
636+
raise e
637+
if invalid_messages_log_level:
638+
logger.log(level=invalid_messages_log_level, msg=e)
639+
640+
return MessagesResponse(
641+
messages=messages,
642+
pagination_page=response_json["pagination_page"],
643+
pagination_total=response_json["pagination_total"],
644+
pagination_per_page=response_json["pagination_per_page"],
645+
pagination_item=response_json["pagination_item"],
646+
)
612647

613648

614649
async def get_message(

src/aleph_client/models.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
from typing import List
2+
3+
from aleph_message.models import AlephMessage
4+
from pydantic import BaseModel
5+
6+
7+
class MessagesResponse(BaseModel):
8+
"""Response from an Aleph node API on the path /api/v0/messages.json"""
9+
10+
messages: List[AlephMessage]
11+
pagination_page: int
12+
pagination_total: int
13+
pagination_per_page: int
14+
pagination_item: str

src/aleph_client/synchronous.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ def create_program(
7575
memory: int = settings.DEFAULT_VM_MEMORY,
7676
vcpus: int = settings.DEFAULT_VM_VCPUS,
7777
timeout_seconds: float = settings.DEFAULT_VM_TIMEOUT,
78+
persistent: bool = False,
7879
encoding: Encoding = Encoding.zip,
7980
volumes: List[Dict] = None,
8081
subscriptions: Optional[List[Dict]] = None,
@@ -93,6 +94,7 @@ def create_program(
9394
memory=memory,
9495
vcpus=vcpus,
9596
timeout_seconds=timeout_seconds,
97+
persistent=persistent,
9698
encoding=encoding,
9799
volumes=volumes,
98100
subscriptions=subscriptions,

tests/unit/test_asynchronous.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ async def test_create_store():
112112
mock_session = new_mock_session_with_post_success()
113113

114114
mock_ipfs_push_file = AsyncMock()
115-
mock_ipfs_push_file.return_value = "FAKE-HASH"
115+
mock_ipfs_push_file.return_value = "QmRTV3h1jLcACW4FRfdisokkQAk4E4qDhUzGpgdrd4JAFy"
116116

117117
with patch("aleph_client.asynchronous.ipfs_push_file", mock_ipfs_push_file):
118118

@@ -129,15 +129,15 @@ async def test_create_store():
129129
await create_store(
130130
account=account,
131131
# file_content=b"HELLO",
132-
file_hash="FAKE-HASH",
132+
file_hash="QmRTV3h1jLcACW4FRfdisokkQAk4E4qDhUzGpgdrd4JAFy",
133133
channel="TEST",
134134
storage_engine=StorageEnum.ipfs,
135135
session=mock_session,
136136
api_server="https://example.org",
137137
)
138138

139139
mock_storage_push_file = AsyncMock()
140-
mock_storage_push_file.return_value = "FAKE-HASH"
140+
mock_storage_push_file.return_value = "QmRTV3h1jLcACW4FRfdisokkQAk4E4qDhUzGpgdrd4JAFy"
141141

142142
with patch("aleph_client.asynchronous.storage_push_file", mock_storage_push_file):
143143

@@ -194,7 +194,7 @@ async def test_forget():
194194

195195
new_post = await forget(
196196
account=account,
197-
hashes=["FAKE-HASH"],
197+
hashes=["QmRTV3h1jLcACW4FRfdisokkQAk4E4qDhUzGpgdrd4JAFy"],
198198
reason="GDPR",
199199
channel="TEST",
200200
session=mock_session,

0 commit comments

Comments
 (0)