From a41c7cef5ba7c9034e0cfc56ed694d1f8de52d8d Mon Sep 17 00:00:00 2001 From: Gasper Leskovec Date: Wed, 30 Jul 2025 09:54:37 +0200 Subject: [PATCH 1/2] distinguish server vs internet issues --- .../text/widgets/owdocumentembedding.py | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/orangecontrib/text/widgets/owdocumentembedding.py b/orangecontrib/text/widgets/owdocumentembedding.py index 5445e3db8..21ebd86fc 100644 --- a/orangecontrib/text/widgets/owdocumentembedding.py +++ b/orangecontrib/text/widgets/owdocumentembedding.py @@ -1,11 +1,12 @@ from typing import Dict, Optional, Any - from AnyQt.QtCore import Qt from AnyQt.QtWidgets import QVBoxLayout, QPushButton, QStyle from Orange.misc.utils.embedder_utils import EmbeddingConnectionError from Orange.widgets import gui from Orange.widgets.settings import Setting from Orange.widgets.widget import Msg, Output, OWWidget +import os +import socket from orangecontrib.text.corpus import Corpus from orangecontrib.text.language import ( @@ -50,8 +51,10 @@ class Outputs(OWBaseVectorizer.Outputs): class Error(OWWidget.Error): no_connection = Msg( - "No internet connection. Please establish a connection or use " - "another vectorizer." + "No internet connection. Please establish a connection or use another vectorizer." + ) + server_unresponsive = Msg( + "The server at {server} is not responding. Please check the address or try again later." ) unexpected_error = Msg("Embedding error: {}") @@ -150,8 +153,23 @@ def on_done(self, result): def on_exception(self, ex: Exception): self.cancel_button.setDisabled(True) if isinstance(ex, EmbeddingConnectionError): - self.Error.no_connection() + # check basic internet connectivity (attempt connection to 8.8.8.8:53) + internet_available = False + try: + socket.create_connection(("8.8.8.8", 53), timeout=3) + internet_available = True + except OSError: + internet_available = False + + if internet_available: + # internet works → the server may be invalid or unresponsive + server_url = os.getenv("ORANGE_EMBEDDING_API_URL", "https://api.garaza.io") + self.Error.server_unresponsive(server=server_url) + else: + # general lack of internet connection + self.Error.no_connection() else: + # delegate other errors to the original handler self.Error.unexpected_error(str(ex)) self.cancel() @@ -190,4 +208,4 @@ def send_report(self): if __name__ == "__main__": from orangewidget.utils.widgetpreview import WidgetPreview - WidgetPreview(OWDocumentEmbedding).run(Corpus.from_file("book-excerpts")) + WidgetPreview(OWDocumentEmbedding).run(Corpus.from_file("book-excerpts")) \ No newline at end of file From a9bc628cf7c2464d1653eb6b86bf4fa51e17fe97 Mon Sep 17 00:00:00 2001 From: Gasper Leskovec Date: Mon, 4 Aug 2025 09:08:23 +0200 Subject: [PATCH 2/2] fix test_search type mismatch --- orangecontrib/text/widgets/tests/test_owcorpusviewer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/orangecontrib/text/widgets/tests/test_owcorpusviewer.py b/orangecontrib/text/widgets/tests/test_owcorpusviewer.py index 4b22c6365..c0edecee0 100644 --- a/orangecontrib/text/widgets/tests/test_owcorpusviewer.py +++ b/orangecontrib/text/widgets/tests/test_owcorpusviewer.py @@ -122,7 +122,7 @@ def test_search(self): self.process_events() out_corpus = self.get_output(self.widget.Outputs.matching_docs) self.assertEqual(len(out_corpus), 1) - self.assertEqual(self.widget.n_matches, 7) + self.assertEqual(int(self.widget.n_matches), 7) # first document is selected, when filter with word that is not in # selected document, first of shown documents is selected @@ -131,7 +131,7 @@ def test_search(self): self.process_events() self.assertEqual(1, len(self.get_output(self.widget.Outputs.matching_docs))) # word count doesn't depend on selection - self.assertEqual(self.widget.n_matches, 7) + self.assertEqual(int(self.widget.n_matches), 7) # when filter is removed, matched words is 0 self.widget.regexp_filter = ""