diff --git a/pynecone/app.py b/pynecone/app.py index 42539d06e..9a455f3c1 100644 --- a/pynecone/app.py +++ b/pynecone/app.py @@ -513,31 +513,26 @@ def upload(app: App): # get handler function func = getattr(state, handler.split(".")[-1]) - # check if there exists any handler args with annotation UploadFile or List[UploadFile] + # check if there exists any handler args with annotation, List[UploadFile] for k, v in inspect.getfullargspec( func.fn if isinstance(func, EventHandler) else func ).annotations.items(): - if ( - types.is_generic_alias(v) - and types._issubclass(v.__args__[0], UploadFile) - or types._issubclass(v, UploadFile) + if types.is_generic_alias(v) and types._issubclass( + v.__args__[0], UploadFile ): handler_upload_param = (k, v) break if not handler_upload_param: raise ValueError( - f"`{handler}` handler should have a parameter annotated with one of the following: List[" - f"pc.UploadFile], pc.UploadFile " + f"`{handler}` handler should have a parameter annotated as List[" + f"pc.UploadFile]" ) - # check if handler supports multi-upload - multi_upload = types._issubclass(handler_upload_param[1], List) - event = Event( token=token, name=handler, - payload={handler_upload_param[0]: files if multi_upload else files[0]}, + payload={handler_upload_param[0]: files}, ) update = await state.process(event) return update diff --git a/tests/conftest.py b/tests/conftest.py index 732178af5..8058ed01b 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -141,18 +141,7 @@ def dict_mutation_state(): class UploadState(pc.State): """The base state for uploading a file.""" - img: str - img_list: List[str] - - async def handle_upload1(self, file: pc.UploadFile): - """Handle the upload of a file. - - Args: - file: The uploaded file. - """ - pass - - async def multi_handle_upload(self, files: List[pc.UploadFile]): + async def handle_upload1(self, files: List[pc.UploadFile]): """Handle the upload of a file. Args: @@ -172,25 +161,15 @@ class SubUploadState(BaseState): img: str - async def handle_upload(self, file: pc.UploadFile): + async def handle_upload(self, files: List[pc.UploadFile]): """Handle the upload of a file. Args: - file: The uploaded file. + files: The uploaded files. """ pass -@pytest.fixture -def upload_event_spec(): - """Create an event Spec for a base state. - - Returns: - Event Spec. - """ - return EventSpec(handler=UploadState.handle_upload1, upload=True) # type: ignore - - @pytest.fixture def upload_sub_state_event_spec(): """Create an event Spec for a substate. @@ -202,13 +181,13 @@ def upload_sub_state_event_spec(): @pytest.fixture -def multi_upload_event_spec(): +def upload_event_spec(): """Create an event Spec for a multi-upload base state. Returns: Event Spec. """ - return EventSpec(handler=UploadState.multi_handle_upload, upload=True) # type: ignore + return EventSpec(handler=UploadState.handle_upload1, upload=True) # type: ignore @pytest.fixture @@ -226,24 +205,24 @@ def upload_state(tmp_path): class FileUploadState(pc.State): """The base state for uploading a file.""" - img: str img_list: List[str] - async def handle_upload2(self, file): + async def handle_upload2(self, files): """Handle the upload of a file. Args: - file: The uploaded file. + files: The uploaded files. """ - upload_data = await file.read() - outfile = f"{tmp_path}/{file.filename}" + for file in files: + upload_data = await file.read() + outfile = f"{tmp_path}/{file.filename}" - # Save the file. - with open(outfile, "wb") as file_object: - file_object.write(upload_data) + # Save the file. + with open(outfile, "wb") as file_object: + file_object.write(upload_data) - # Update the img var. - self.img = file.filename + # Update the img var. + self.img_list.append(file.filename) async def multi_handle_upload(self, files: List[pc.UploadFile]): """Handle the upload of a file. diff --git a/tests/test_app.py b/tests/test_app.py index 62199f209..d57f20eff 100644 --- a/tests/test_app.py +++ b/tests/test_app.py @@ -474,6 +474,5 @@ async def test_upload_file_without_annotation(upload_state): await fn([file1, file2]) assert ( err.value.args[0] - == "`upload_state.handle_upload2` handler should have a parameter annotated with one of the following: " - "List[pc.UploadFile], pc.UploadFile " + == "`upload_state.handle_upload2` handler should have a parameter annotated as List[pc.UploadFile]" ) diff --git a/tests/test_utils.py b/tests/test_utils.py index f4e1d5762..c541f9b94 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -287,20 +287,6 @@ def test_issubclass(cls: type, cls_check: type, expected: bool): assert types._issubclass(cls, cls_check) == expected -def test_format_upload_event(upload_event_spec): - """Test formatting an upload event spec. - - Args: - upload_event_spec: The event spec fixture. - """ - assert ( - format.format_upload_event(upload_event_spec) - == "uploadFiles(upload_state, result, setResult, " - 'upload_state.files, "upload_state.handle_upload1",' - "UPLOAD)" - ) - - def test_format_sub_state_event(upload_sub_state_event_spec): """Test formatting an upload event spec of substate. @@ -314,15 +300,15 @@ def test_format_sub_state_event(upload_sub_state_event_spec): ) -def test_format_multi_upload_event(multi_upload_event_spec): +def test_format_upload_event(upload_event_spec): """Test formatting an upload event spec. Args: - multi_upload_event_spec: The event spec fixture. + upload_event_spec: The event spec fixture. """ assert ( - format.format_upload_event(multi_upload_event_spec) + format.format_upload_event(upload_event_spec) == "uploadFiles(upload_state, result, setResult, " - 'upload_state.files, "upload_state.multi_handle_upload",' + 'upload_state.files, "upload_state.handle_upload1",' "UPLOAD)" )