Skip to content

Commit 4b4b89e

Browse files
authored
Fix regression resolving absolute path with fragment identifier. (#736)
* Fix regression resolving absolute path with fragment identifier.
1 parent 39d0b63 commit 4b4b89e

File tree

2 files changed

+36
-6
lines changed

2 files changed

+36
-6
lines changed

cwltool/resolver.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,15 @@
1414

1515

1616
def resolve_local(document_loader, uri):
17-
if uri.startswith("/") and os.path.exists(uri):
18-
return Path(uri).as_uri()
19-
if os.path.exists(urllib.parse.urlparse(
20-
urllib.parse.urldefrag(
21-
"{}/{}".format(Path.cwd().as_uri(), uri))[0])[2]):
22-
return "{}/{}".format(Path.cwd().as_uri(), uri)
17+
pathpart, frag = urllib.parse.urldefrag(uri)
18+
pathobj = Path(pathpart).resolve()
19+
20+
if pathobj.is_file():
21+
if frag:
22+
return "{}#{}".format(pathobj.as_uri(), frag)
23+
else:
24+
return pathobj.as_uri()
25+
2326
sharepaths = [os.environ.get("XDG_DATA_HOME", os.path.join(
2427
os.path.expanduser('~'), ".local", "share"))]
2528
sharepaths.extend(os.environ.get(

tests/test_fetch.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
from __future__ import absolute_import
22
import unittest
3+
import sys
4+
import os
35

46
from six.moves import urllib
57

@@ -9,7 +11,14 @@
911
from cwltool.load_tool import load_tool
1012
from cwltool.main import main
1113
from cwltool.workflow import defaultMakeTool
14+
from cwltool.resolver import resolve_local
1215

16+
if sys.version_info < (3, 4):
17+
from pathlib2 import Path
18+
else:
19+
from pathlib import Path
20+
21+
from .util import get_data
1322

1423
class FetcherTest(unittest.TestCase):
1524
def test_fetcher(self):
@@ -56,3 +65,21 @@ def test_resolver(d, a):
5665

5766
self.assertEquals(0, main(["--print-pre", "--debug", "foo.cwl"], resolver=test_resolver,
5867
fetcher_constructor=TestFetcher))
68+
69+
70+
class ResolverTest(unittest.TestCase):
71+
def test_resolve_local(self):
72+
origpath = os.getcwd()
73+
os.chdir(os.path.join(get_data("")))
74+
try:
75+
root = Path.cwd()
76+
rooturi = root.as_uri()
77+
self.assertEqual(rooturi+"/tests/echo.cwl", resolve_local(None, os.path.join("tests", "echo.cwl")))
78+
self.assertEqual(rooturi+"/tests/echo.cwl#main", resolve_local(None, os.path.join("tests", "echo.cwl")+"#main"))
79+
self.assertEqual(rooturi+"/tests/echo.cwl", resolve_local(None, str(root / "tests" / "echo.cwl")))
80+
# On Windows and Python 2.7, the left side of this test returns
81+
# file:///C:/ (uppercase drive letter) and the right side returns
82+
# file:///c:/ (lowercase drive letter) so force a lowercase comparison.
83+
self.assertEqual((rooturi+"/tests/echo.cwl#main").lower(), resolve_local(None, str(root / "tests" / "echo.cwl")+"#main").lower())
84+
finally:
85+
os.chdir(origpath)

0 commit comments

Comments
 (0)