Skip to content

Commit 1f97b66

Browse files
authored
Merge pull request #2393 from kernc/from_url
io, OWFile: if URL without scheme, assume http by default
2 parents 51896d3 + 53262f5 commit 1f97b66

File tree

4 files changed

+44
-3
lines changed

4 files changed

+44
-3
lines changed

Orange/data/io.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -923,6 +923,12 @@ def write(cls, filename, tree):
923923

924924

925925
class UrlReader(FileFormat):
926+
def __init__(self, filename):
927+
filename = filename.strip()
928+
if not urlparse(filename).scheme:
929+
filename = 'http://' + filename
930+
super().__init__(filename)
931+
926932
@staticmethod
927933
def urlopen(url):
928934
req = Request(

Orange/tests/test_table.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1368,6 +1368,22 @@ def test_calling_new_with_keyword_argument_filename_calls_read_data(
13681368

13691369

13701370
class CreateTableWithUrl(TableTests):
1371+
def test_url_no_scheme(self):
1372+
1373+
class SkipRest(Exception):
1374+
pass
1375+
1376+
mock_urlopen = Mock(side_effect=SkipRest())
1377+
url = 'www.foo.bar/xx.csv'
1378+
1379+
with patch('Orange.data.io.UrlReader.urlopen', mock_urlopen):
1380+
try:
1381+
Table.from_url(url)
1382+
except SkipRest:
1383+
pass
1384+
1385+
mock_urlopen.assert_called_once_with('http://' + url)
1386+
13711387
class _MockUrlOpen(MagicMock):
13721388
headers = {'content-disposition': 'attachment; filename="Something-FormResponses.tsv"; '
13731389
'filename*=UTF-8''Something%20%28Responses%29.tsv'}

Orange/widgets/data/owfile.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import os
22
import logging
33
from warnings import catch_warnings
4+
from urllib.parse import urlparse
45

56
import numpy as np
67
from AnyQt.QtWidgets import \
@@ -240,6 +241,15 @@ def select_sheet(self):
240241
self.load_data()
241242

242243
def _url_set(self):
244+
url = self.url_combo.currentText()
245+
pos = self.recent_urls.index(url)
246+
url = url.strip()
247+
248+
if not urlparse(url).scheme:
249+
url = 'http://' + url
250+
self.url_combo.setItemText(pos, url)
251+
self.recent_urls[pos] = url
252+
243253
self.source = self.URL
244254
self.load_data()
245255

Orange/widgets/data/tests/test_owfile.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
# Test methods with long descriptive names can omit docstrings
22
# pylint: disable=missing-docstring
33
from os import path, remove
4-
from unittest.mock import Mock
5-
from unittest import TestCase
4+
from unittest.mock import Mock, patch
65
import pickle
76
import tempfile
87

@@ -40,7 +39,7 @@ class TestOWFile(WidgetTest):
4039
event_data = None
4140

4241
def setUp(self):
43-
self.widget = self.create_widget(OWFile)
42+
self.widget = self.create_widget(OWFile) # type: OWFile
4443

4544
def test_dragEnterEvent_accepts_urls(self):
4645
event = self._drag_enter_event(QUrl.fromLocalFile(TITANIC_PATH))
@@ -274,3 +273,13 @@ def test_domain_editor_conversions(self):
274273
self.assertEqual(len(data2[0].metas[0]), 1)
275274
# discrete integer values should stay the same after conversion to continuous
276275
self.assertAlmostEqual(float(data1[0][2].value), data2[0][1])
276+
277+
def test_url_no_scheme(self):
278+
mock_urlreader = Mock(side_effect=ValueError())
279+
url = 'foo.bar/xxx.csv'
280+
281+
with patch('Orange.widgets.data.owfile.UrlReader', mock_urlreader):
282+
self.widget.url_combo.insertItem(0, url)
283+
self.widget.url_combo.activated.emit(0)
284+
285+
mock_urlreader.assert_called_once_with('http://' + url)

0 commit comments

Comments
 (0)