22from __future__ import with_statement
33
44import collections
5+ import io
56import json
67import os
78import os .path
1011import tempfile
1112import unittest
1213
13- from six import StringIO , b , text_type
14+ from six import PY3 , StringIO , b , text_type
1415from werkzeug .test import Client
1516from werkzeug .wrappers import Response
1617
6566 font: '나눔고딕', sans-serif; }
6667'''
6768
69+ utf8_if_py3 = {'encoding' : 'utf-8' } if PY3 else {}
70+
6871
6972class SassTestCase (unittest .TestCase ):
7073
@@ -221,26 +224,26 @@ def test_regression_issue_11(self):
221224class BuilderTestCase (unittest .TestCase ):
222225
223226 def test_builder_build_directory (self ):
224- temp_path = tempfile .mkdtemp ()
227+ temp_path = tempfile .mkdtemp ()
225228 sass_path = os .path .join (temp_path , 'sass' )
226229 css_path = os .path .join (temp_path , 'css' )
227230 shutil .copytree ('test' , sass_path )
228231 result_files = build_directory (sass_path , css_path )
229232 assert len (result_files ) == 4
230233 assert result_files ['a.scss' ] == 'a.scss.css'
231- with open (os .path .join (css_path , 'a.scss.css' )) as f :
234+ with open (os .path .join (css_path , 'a.scss.css' ), ** utf8_if_py3 ) as f :
232235 css = f .read ()
233236 assert css == A_EXPECTED_CSS
234237 assert result_files ['b.scss' ] == 'b.scss.css'
235- with open (os .path .join (css_path , 'b.scss.css' )) as f :
238+ with open (os .path .join (css_path , 'b.scss.css' ), ** utf8_if_py3 ) as f :
236239 css = f .read ()
237240 assert css == B_EXPECTED_CSS
238241 assert result_files ['c.scss' ] == 'c.scss.css'
239- with open (os .path .join (css_path , 'c.scss.css' )) as f :
242+ with open (os .path .join (css_path , 'c.scss.css' ), ** utf8_if_py3 ) as f :
240243 css = f .read ()
241244 assert css == C_EXPECTED_CSS
242245 assert result_files ['d.scss' ] == 'd.scss.css'
243- with open (os .path .join (css_path , 'd.scss.css' )) as f :
246+ with open (os .path .join (css_path , 'd.scss.css' ), ** utf8_if_py3 ) as f :
244247 css = f .read ()
245248 self .assertEqual (D_EXPECTED_CSS , css )
246249 shutil .rmtree (temp_path )
@@ -267,51 +270,68 @@ def test_normalize_manifests(self):
267270
268271 def test_build_one (self ):
269272 d = tempfile .mkdtemp ()
273+ src_path = os .path .join (d , 'test' )
274+ if os .sep != '/' and os .altsep :
275+ normalize = lambda p : os .path .abspath (
276+ os .path .normpath (os .path .join (src_path , p ))
277+ ).replace (os .sep , os .altsep )
278+ else :
279+ normalize = lambda p : p
270280 try :
271- shutil .copytree ('test' , os . path . join ( d , 'test' ) )
281+ shutil .copytree ('test' , src_path )
272282 m = Manifest (sass_path = 'test' , css_path = 'css' )
273283 m .build_one (d , 'a.scss' )
274284 with open (os .path .join (d , 'css' , 'a.scss.css' )) as f :
275285 self .assertEqual (A_EXPECTED_CSS , f .read ())
276286 m .build_one (d , 'b.scss' , source_map = True )
277- with open (os .path .join (d , 'css' , 'b.scss.css' )) as f :
287+ with open (os .path .join (d , 'css' , 'b.scss.css' ),
288+ ** utf8_if_py3 ) as f :
278289 self .assertEqual (
279290 B_EXPECTED_CSS +
280291 '\n /*# sourceMappingURL=b.scss.css.map */' ,
281292 f .read ()
282293 )
283- with open (os .path .join (d , 'css' , 'b.scss.css.map' )) as f :
284- self .assertEqual (
285- {
286- 'version' : 3 ,
287- 'file' : '' ,
288- 'sources' : ['../test/b.scss' ],
289- 'names' : [],
290- 'mappings' : 'AAAA,EAAE;EAEE,WAAW'
291- },
292- json .load (f )
293- )
294+ self .assert_json_file (
295+ {
296+ 'version' : 3 ,
297+ 'file' : '' ,
298+ 'sources' : [normalize ('../test/b.scss' )],
299+ 'names' : [],
300+ 'mappings' : 'AAAA,EAAE;EAEE,WAAW'
301+ },
302+ os .path .join (d , 'css' , 'b.scss.css.map' )
303+ )
294304 m .build_one (d , 'd.scss' , source_map = True )
295- with open (os .path .join (d , 'css' , 'd.scss.css' )) as f :
305+ with open (os .path .join (d , 'css' , 'd.scss.css' ),
306+ ** utf8_if_py3 ) as f :
296307 self .assertEqual (
297308 D_EXPECTED_CSS +
298309 '\n /*# sourceMappingURL=d.scss.css.map */' ,
299310 f .read ()
300311 )
301- with open (os .path .join (d , 'css' , 'd.scss.css.map' )) as f :
302- self .assertEqual (
303- {
304- 'version' : 3 ,
305- 'file' : '' ,
306- 'sources' : ['../test/d.scss' ],
307- 'names' : [],
308- 'mappings' : 'AAKA;EAHE,kBAAkB;EAIpB,KAAK;IAED,MAAM'
309- },
310- json .load (f )
311- )
312+ self .assert_json_file (
313+ {
314+ 'version' : 3 ,
315+ 'file' : '' ,
316+ 'sources' : [normalize ('../test/d.scss' )],
317+ 'names' : [],
318+ 'mappings' : 'AAKA;EAHE,kBAAkB;EAIpB,KAAK;IAED,MAAM'
319+ },
320+ os .path .join (d , 'css' , 'd.scss.css.map' )
321+ )
312322 finally :
313323 shutil .rmtree (d )
314324
325+ def assert_json_file (self , expected , filename ):
326+ with open (filename ) as f :
327+ try :
328+ tree = json .load (f )
329+ except ValueError as e :
330+ f .seek (0 )
331+ msg = '{0!s}\n \n {1}:\n \n {2}' .format (e , filename , f .read ())
332+ raise ValueError (msg )
333+ self .assertEqual (expected , tree )
334+
315335
316336class WsgiTestCase (unittest .TestCase ):
317337
@@ -329,19 +349,24 @@ def test_wsgi_sass_middleware(self):
329349 client = Client (app , Response )
330350 r = client .get ('/asdf' )
331351 self .assertEqual (200 , r .status_code )
332- self .assertEqual (b'/asdf' , r .data )
352+ self .assert_bytes_equal (b'/asdf' , r .data )
333353 self .assertEqual ('text/plain' , r .mimetype )
334354 r = client .get ('/static/a.scss.css' )
335355 self .assertEqual (200 , r .status_code )
336- self .assertEqual (b (A_EXPECTED_CSS_WITH_MAP ), r .data )
356+ self .assert_bytes_equal (b (A_EXPECTED_CSS_WITH_MAP ), r .data )
337357 self .assertEqual ('text/css' , r .mimetype )
338358 r = client .get ('/static/not-exists.sass.css' )
339359 self .assertEqual (200 , r .status_code )
340- self .assertEqual (b'/static/not-exists.sass.css' , r .data )
360+ self .assert_bytes_equal (b'/static/not-exists.sass.css' , r .data )
341361 self .assertEqual ('text/plain' , r .mimetype )
342362 finally :
343363 shutil .rmtree (css_dir )
344364
365+ def assert_bytes_equal (self , expected , actual , * args ):
366+ self .assertEqual (expected .replace (b'\r \n ' , b'\n ' ),
367+ actual .replace (b'\r \n ' , b'\n ' ),
368+ * args )
369+
345370
346371class SasscTestCase (unittest .TestCase ):
347372
@@ -397,7 +422,7 @@ def test_sassc_output_unicode(self):
397422 self .assertEqual (0 , exit_code )
398423 self .assertEqual ('' , self .err .getvalue ())
399424 self .assertEqual ('' , self .out .getvalue ())
400- with open (tmp ) as f :
425+ with open (tmp , ** utf8_if_py3 ) as f :
401426 self .assertEqual (
402427 D_EXPECTED_CSS .strip (),
403428 f .read ().strip ()
0 commit comments