Skip to content

Commit 87d9dc9

Browse files
authored
Merge pull request #285 from janezd/update-for-py3.14
Updates for Python 3.14
2 parents c35c2fb + fddd441 commit 87d9dc9

File tree

7 files changed

+52
-9
lines changed

7 files changed

+52
-9
lines changed

i18n/si/msgs.jaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ network/community.py:
1515
def `label_propagation_hop_attenuation`:
1616
Undirected graph expected: false
1717
network/embeddings.py:
18+
'gensim library is required to use Node2Vec embedding. ': false
1819
class `Node2Vec`:
1920
def `__init__`:
2021
n2v: false
@@ -281,6 +282,8 @@ widgets/OWNxEmbeddings.py:
281282
Network: Mreža
282283
class `Outputs`:
283284
Items: Elementi
285+
class `Error`:
286+
This widget requires gensim, which is unsupported in Python>=3.14.: Ta gradnik zahteva gensim, ki ni podprt v Pythonu >= 3.14.
284287
def `__init__`:
285288
p: false
286289
'Return parameter (p): ': 'Parameter vrnitve (p): '

orangecontrib/network/network/embeddings.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
import numpy as np
2-
import gensim
2+
try:
3+
import gensim
4+
except:
5+
raise ValueError("gensim library is required to use Node2Vec embedding. ")
6+
37
from gensim.models import Word2Vec
48
from Orange.data import ContinuousVariable, Table, Domain
59

orangecontrib/network/tests/test_embeddings.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,31 @@
11
import unittest
2+
import datetime
23

34
import numpy as np
45
import scipy.sparse as sp
56
from Orange.data import Table, ContinuousVariable, Domain
67

78
from orangecontrib.network import Network
89
from orangecontrib.network.network.base import DirectedEdges, UndirectedEdges
9-
from orangecontrib.network.network.embeddings import Node2Vec
10-
10+
try:
11+
import gensim
12+
except ImportError:
13+
gensim = None
14+
else:
15+
from orangecontrib.network.network.embeddings import Node2Vec
1116

1217
class TestEmbeddings(unittest.TestCase):
18+
@classmethod
19+
def setUpClass(cls):
20+
if gensim is None:
21+
if datetime.date.today() < datetime.date(2026, 6, 1):
22+
raise unittest.SkipTest(
23+
"gensim library is required to run these tests.")
24+
else:
25+
raise RuntimeError(
26+
"Check whether gensim is supported "
27+
"and either update setup.py or change the above date.")
28+
1329
def setUp(self):
1430
row, col, w = zip(*((1, 2, 1.0), (1, 3, 3.0), (2, 3, 1.0), (2, 6, 0.5), (3, 4, 1.0), (4, 5, 1.0), (4, 7, -1.0),
1531
(5, 6, 0.0), (6, 5, 0.1), (6, 2, 0.1)))

orangecontrib/network/widgets/OWNxEmbeddings.py

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,22 @@
1+
from orangewidget.widget import Msg
2+
3+
try:
4+
from gensim.models.callbacks import CallbackAny2Vec
5+
except ImportError:
6+
CallbackAny2Vec = None
7+
8+
19
from AnyQt.QtCore import Qt, QThread
210
from Orange.data import Table
311
from Orange.widgets.widget import OWWidget
4-
from gensim.models.callbacks import CallbackAny2Vec
512
from orangewidget import gui, settings
613
from orangewidget.utils.signals import Input, Output
14+
from orangewidget.utils.widgetpreview import WidgetPreview
715

816
from orangecontrib.network import Network
9-
from orangecontrib.network.network import embeddings, readwrite
10-
from orangewidget.utils.widgetpreview import WidgetPreview
17+
from orangecontrib.network.network import readwrite
18+
if CallbackAny2Vec is not None:
19+
from orangecontrib.network.network import embeddings
1120

1221

1322
class EmbedderThread(QThread):
@@ -23,7 +32,7 @@ def run(self):
2332
self.result = self.func()
2433

2534

26-
class ProgressBarUpdater(CallbackAny2Vec):
35+
class ProgressBarUpdater(CallbackAny2Vec or object):
2736
def __init__(self, widget, num_epochs):
2837
self.widget = widget
2938
self.curr_epoch = 0
@@ -51,6 +60,10 @@ class Inputs:
5160
class Outputs:
5261
items = Output("Items", Table)
5362

63+
class Error(OWWidget.Error):
64+
unsupported_gensim = Msg(
65+
"This widget requires gensim, which is unsupported in Python>=3.14.")
66+
5467
resizing_enabled = False
5568
want_main_area = False
5669

@@ -95,12 +108,18 @@ def commit():
95108
checkbox_label="Auto-commit", orientation=Qt.Horizontal)
96109
commit()
97110

111+
if CallbackAny2Vec is None:
112+
self.Error.unsupported_gensim()
113+
self.controlArea.setDisabled(True)
114+
98115
@Inputs.network
99116
def set_network(self, net):
100117
self.network = net
101118
self.commit()
102119

103120
def commit(self):
121+
if CallbackAny2Vec is None:
122+
return
104123
self.Warning.clear()
105124

106125
# cancel existing computation if running

orangecontrib/network/widgets/OWNxGroups.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ def _map_network(self):
159159
else:
160160
weights = None
161161
if self.normalize:
162+
weights = weights.copy() if weights is not None else None
162163
self._normalize_weights(row, col, weights)
163164
row, col = self._map_into_feature_values(row, col)
164165
return Network(

orangecontrib/network/widgets/tests/test_OWNxGroups.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import unittest
22
from unittest.mock import Mock
33
from math import sqrt
4+
import datetime
45

56
import numpy as np
67
from scipy import sparse as sp
@@ -173,6 +174,5 @@ def test_weights(self):
173174
expected[3, 4] = 6 / sqrt(14 * 13) + 8 / sqrt(14 * 15)
174175
np.testing.assert_equal(groups.edges[0].edges.todense(), expected)
175176

176-
177177
if __name__ == "__main__":
178178
unittest.main()

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@
6969

7070
INSTALL_REQUIRES = (
7171
'anyqt',
72-
'gensim',
72+
'gensim; python_version < "3.14"',
7373
'Orange3>=3.38.1',
7474
'orange-widget-base',
7575
'pyqtgraph',

0 commit comments

Comments
 (0)