From e51e92defe3ad577441eb005cc2be9217cbbfb55 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Thu, 13 Dec 2018 10:49:57 -0800 Subject: [PATCH] unresolve sass paths with package_dir --- sasstests.py | 44 +++++++++++++++++++------------------------- sassutils/builder.py | 9 +++++++-- sassutils/wsgi.py | 4 +++- 3 files changed, 29 insertions(+), 28 deletions(-) diff --git a/sasstests.py b/sasstests.py index 3d36f5bd..2c0f1ebe 100644 --- a/sasstests.py +++ b/sasstests.py @@ -143,6 +143,14 @@ def normalize_path(path): re_base64_data_uri = re.compile(r'^data:[^;]*?;base64,(.+)$') +def _map_in_output_dir(s): + def cb(match): + filename = os.path.basename(match.group(1)) + return '/*# sourceMappingURL={} */'.format(filename) + + return re_sourcemap_url.sub(cb, s) + + @pytest.fixture(autouse=True) def no_warnings(recwarn): yield @@ -696,12 +704,6 @@ def test_build_one(self): with tempdir() as d: src_path = os.path.join(d, 'test') - def test_source_path(*path): - return normalize_path(os.path.join(d, 'test', *path)) - - def replace_source_path(s, name): - return s.replace('SOURCE', test_source_path(name)) - shutil.copytree('test', src_path) with pytest.warns(FutureWarning): m = Manifest(sass_path='test', css_path='css') @@ -713,14 +715,11 @@ def replace_source_path(s, name): with io.open( os.path.join(d, 'css', 'b.scss.css'), encoding='UTF-8', ) as f: - self.assertEqual( - replace_source_path(B_EXPECTED_CSS_WITH_MAP, 'b.scss'), - f.read(), - ) + assert f.read() == _map_in_output_dir(B_EXPECTED_CSS_WITH_MAP) self.assert_source_map_file( { 'version': 3, - 'file': '../test/b.css', + 'file': 'b.scss.css', 'sources': ['../test/b.scss'], 'names': [], 'mappings': ( @@ -734,14 +733,11 @@ def replace_source_path(s, name): with io.open( os.path.join(d, 'css', 'd.scss.css'), encoding='UTF-8', ) as f: - assert ( - replace_source_path(D_EXPECTED_CSS_WITH_MAP, 'd.scss') == - f.read() - ) + assert f.read() == _map_in_output_dir(D_EXPECTED_CSS_WITH_MAP) self.assert_source_map_file( { 'version': 3, - 'file': '../test/d.css', + 'file': 'd.scss.css', 'sources': ['../test/d.scss'], 'names': [], 'mappings': ( @@ -799,7 +795,7 @@ def test_wsgi_sass_middleware(self): r = client.get('/static/a.scss.css') assert r.status_code == 200 self.assertEqual( - b(A_EXPECTED_CSS_WITH_MAP), + b(_map_in_output_dir(A_EXPECTED_CSS_WITH_MAP)), r.data, ) assert r.mimetype == 'text/css' @@ -825,20 +821,18 @@ def test_wsgi_sass_middleware_without_extension(self): client = Client(app, Response) r = client.get('/static/a.css') assert r.status_code == 200 - expected = A_EXPECTED_CSS_WITH_MAP.replace('.scss.css', '.css') + expected = A_EXPECTED_CSS_WITH_MAP + expected = expected.replace('.scss.css', '.css') + expected = _map_in_output_dir(expected) self.assertEqual(expected.encode(), r.data) assert r.mimetype == 'text/css' def test_wsgi_sass_middleware_without_extension_sass(self): with tempdir() as css_dir: - src_dir = os.path.join(css_dir, 'src') - os.makedirs(src_dir) - with open(os.path.join(src_dir, 'a.sass'), 'w') as f: - f.write('a\n\tb\n\t\tcolor: blue;') app = SassMiddleware( self.sample_wsgi_app, { __name__: { - 'sass_path': src_dir, + 'sass_path': 'test', 'css_path': css_dir, 'wsgi_path': '/static', 'strip_extension': True, @@ -846,11 +840,11 @@ def test_wsgi_sass_middleware_without_extension_sass(self): }, ) client = Client(app, Response) - r = client.get('/static/a.css') + r = client.get('/static/h.css') assert r.status_code == 200 expected = ( 'a b {\n color: blue; }\n\n' - '/*# sourceMappingURL=../a.css.map */' + '/*# sourceMappingURL=h.css.map */' ) self.assertEqual(expected.encode(), r.data) assert r.mimetype == 'text/css' diff --git a/sassutils/builder.py b/sassutils/builder.py index 4af08928..d08e8722 100644 --- a/sassutils/builder.py +++ b/sassutils/builder.py @@ -188,10 +188,12 @@ def resolve_filename(self, package_dir, filename): css_path = os.path.join(package_dir, self.css_path, css_filename) return sass_path, css_path - def unresolve_filename(self, filename): + def unresolve_filename(self, package_dir, filename): """Retrieves the probable source path from the output filename. Pass in a .css path to get out a .scss path. + :param package_dir: the path of the package directory + :type package_dir: :class:`str` :param filename: the css filename :type filename: :class:`str` :returns: the scss filename @@ -200,7 +202,9 @@ def unresolve_filename(self, filename): filename, _ = os.path.splitext(filename) if self.strip_extension: for ext in ('.scss', '.sass'): - test_path = os.path.join(self.sass_path, filename + ext) + test_path = os.path.join( + package_dir, self.sass_path, filename + ext, + ) if os.path.exists(test_path): return filename + ext else: # file not found, let it error with `.scss` extension @@ -268,6 +272,7 @@ def build_one(self, package_dir, filename, source_map=False): filename=sass_filename, include_paths=[root_path], source_map_filename=source_map_path, # FIXME + output_filename_hint=css_path, ) else: css = compile(filename=sass_filename, include_paths=[root_path]) diff --git a/sassutils/wsgi.py b/sassutils/wsgi.py index 29f5faf5..9b778ba5 100644 --- a/sassutils/wsgi.py +++ b/sassutils/wsgi.py @@ -125,7 +125,9 @@ def __call__(self, environ, start_response): if not path.startswith(prefix): continue css_filename = path[len(prefix):] - sass_filename = manifest.unresolve_filename(css_filename) + sass_filename = manifest.unresolve_filename( + package_dir, css_filename, + ) try: result = manifest.build_one( package_dir,