diff --git a/libsass b/libsass index 31521ef3..62314f6a 160000 --- a/libsass +++ b/libsass @@ -1 +1 @@ -Subproject commit 31521ef3ece636892f395a80392448ceae449b90 +Subproject commit 62314f6a3cbc7dbed3878884504847edd7fecb7b diff --git a/pysass.cpp b/pysass.cpp index 01dda201..3dfc364c 100644 --- a/pysass.cpp +++ b/pysass.cpp @@ -417,7 +417,7 @@ PySass_compile_string(PyObject *self, PyObject *args) { struct Sass_Context *ctx; struct Sass_Data_Context *context; struct Sass_Options *options; - char *string, *include_paths, *image_path; + char *string, *include_paths; const char *error_message, *output_string; Sass_Output_Style output_style; int source_comments, error_status, precision; @@ -425,19 +425,18 @@ PySass_compile_string(PyObject *self, PyObject *args) { PyObject *result; if (!PyArg_ParseTuple(args, - PySass_IF_PY3("yiiyyiO", "siissiO"), + PySass_IF_PY3("yiiyiO", "siisiO"), &string, &output_style, &source_comments, - &include_paths, &image_path, &precision, + &include_paths, &precision, &custom_functions)) { return NULL; } - context = sass_make_data_context(string); + context = sass_make_data_context(strdup(string)); options = sass_data_context_get_options(context); sass_option_set_output_style(options, output_style); sass_option_set_source_comments(options, source_comments); sass_option_set_include_path(options, include_paths); - sass_option_set_image_path(options, image_path); sass_option_set_precision(options, precision); _add_custom_functions(options, custom_functions); @@ -461,16 +460,16 @@ PySass_compile_filename(PyObject *self, PyObject *args) { struct Sass_Context *ctx; struct Sass_File_Context *context; struct Sass_Options *options; - char *filename, *include_paths, *image_path; + char *filename, *include_paths; const char *error_message, *output_string, *source_map_string; Sass_Output_Style output_style; int source_comments, error_status, precision; PyObject *source_map_filename, *custom_functions, *result; if (!PyArg_ParseTuple(args, - PySass_IF_PY3("yiiyyiOO", "siissiOO"), + PySass_IF_PY3("yiiyiOO", "siisiOO"), &filename, &output_style, &source_comments, - &include_paths, &image_path, &precision, + &include_paths, &precision, &source_map_filename, &custom_functions)) { return NULL; } @@ -493,7 +492,6 @@ PySass_compile_filename(PyObject *self, PyObject *args) { sass_option_set_output_style(options, output_style); sass_option_set_source_comments(options, source_comments); sass_option_set_include_path(options, include_paths); - sass_option_set_image_path(options, image_path); sass_option_set_precision(options, precision); _add_custom_functions(options, custom_functions); diff --git a/sass.py b/sass.py index ee2f067c..cd4619f9 100644 --- a/sass.py +++ b/sass.py @@ -144,7 +144,7 @@ def __str__(self): def compile_dirname( search_path, output_path, output_style, source_comments, include_paths, - image_path, precision, custom_functions, + precision, custom_functions, ): fs_encoding = sys.getfilesystemencoding() or sys.getdefaultencoding() for dirpath, _, filenames in os.walk(search_path): @@ -159,7 +159,7 @@ def compile_dirname( input_filename = input_filename.encode(fs_encoding) s, v, _ = compile_filename( input_filename, output_style, source_comments, include_paths, - image_path, precision, None, custom_functions, + precision, None, custom_functions, ) if s: v = v.decode('UTF-8') @@ -192,8 +192,6 @@ def compile(**kwargs): :param include_paths: an optional list of paths to find ``@import``\ ed SASS/CSS source files :type include_paths: :class:`collections.Sequence`, :class:`str` - :param image_path: an optional path to find images - :type image_path: :class:`str` :param precision: optional precision for numbers. :const:`5` by default. :type precision: :class:`int` :param custom_functions: optional mapping of custom functions. @@ -229,8 +227,6 @@ def compile(**kwargs): :param include_paths: an optional list of paths to find ``@import``\ ed SASS/CSS source files :type include_paths: :class:`collections.Sequence`, :class:`str` - :param image_path: an optional path to find images - :type image_path: :class:`str` :param precision: optional precision for numbers. :const:`5` by default. :type precision: :class:`int` :param custom_functions: optional mapping of custom functions. @@ -269,8 +265,6 @@ def compile(**kwargs): :param include_paths: an optional list of paths to find ``@import``\ ed SASS/CSS source files :type include_paths: :class:`collections.Sequence`, :class:`str` - :param image_path: an optional path to find images - :type image_path: :class:`str` :param precision: optional precision for numbers. :const:`5` by default. :type precision: :class:`int` :param custom_functions: optional mapping of custom functions. @@ -424,16 +418,6 @@ def func_name(a, b): 'Windows) string, not ' + repr(include_paths)) if isinstance(include_paths, text_type): include_paths = include_paths.encode(fs_encoding) - try: - image_path = kwargs.pop('image_path') - except KeyError: - image_path = b'.' - else: - if not isinstance(image_path, string_types): - raise TypeError('image_path must be a string, not ' + - repr(image_path)) - elif isinstance(image_path, text_type): - image_path = image_path.encode(fs_encoding) custom_functions = kwargs.pop('custom_functions', ()) if isinstance(custom_functions, collections.Mapping): @@ -460,10 +444,10 @@ def func_name(a, b): string = kwargs.pop('string') if isinstance(string, text_type): string = string.encode('utf-8') - s, v = compile_string(string, - output_style, source_comments, - include_paths, image_path, precision, - custom_functions) + s, v = compile_string( + string, output_style, source_comments, include_paths, precision, + custom_functions, + ) if s: return v.decode('utf-8') elif 'filename' in modes: @@ -475,10 +459,8 @@ def func_name(a, b): elif isinstance(filename, text_type): filename = filename.encode(fs_encoding) s, v, source_map = compile_filename( - filename, - output_style, source_comments, - include_paths, image_path, precision, source_map_filename, - custom_functions, + filename, output_style, source_comments, include_paths, precision, + source_map_filename, custom_functions, ) if s: v = v.decode('utf-8') @@ -522,10 +504,8 @@ def func_name(a, b): raise ValueError('dirname must be a pair of (source_dir, ' 'output_dir)') s, v = compile_dirname( - search_path, output_path, - output_style, source_comments, - include_paths, image_path, precision, - custom_functions, + search_path, output_path, output_style, source_comments, + include_paths, precision, custom_functions, ) if s: return diff --git a/sassc.py b/sassc.py index 1bfd7774..85bf9b54 100755 --- a/sassc.py +++ b/sassc.py @@ -21,10 +21,6 @@ Optional directory path to find ``@import``\ ed (S)CSS files. Can be multiply used. -.. option:: -i , --image-path - - Path to find images. Default is the current directory (:file:`./`). - .. option:: -m, -g, --sourcemap Emit source map. Requires the second argument (output CSS filename). @@ -88,8 +84,6 @@ def main(argv=sys.argv, stdout=sys.stdout, stderr=sys.stderr): dest='include_paths', action='append', help='Path to find "@import"ed (S)CSS source files. ' 'Can be multiply used.') - parser.add_option('-i', '--image-path', metavar='DIR', default='./', - help='Path to find images. [default: %default]') parser.add_option('-w', '--watch', action='store_true', help='Watch file for changes. Requires the second ' 'argument (output css filename).') @@ -130,7 +124,6 @@ def main(argv=sys.argv, stdout=sys.stdout, stderr=sys.stderr): output_style=options.output_style, source_map_filename=source_map_filename, include_paths=options.include_paths, - image_path=options.image_path, precision=options.precision ) else: @@ -140,7 +133,6 @@ def main(argv=sys.argv, stdout=sys.stdout, stderr=sys.stderr): filename=filename, output_style=options.output_style, include_paths=options.include_paths, - image_path=options.image_path, precision=options.precision ) except (IOError, OSError) as e: diff --git a/sasstests.py b/sasstests.py index a24bd097..aed141bc 100644 --- a/sasstests.py +++ b/sasstests.py @@ -57,7 +57,7 @@ def normalize_path(path): 'sources': ['test/a.scss'], 'sourcesContent': [], 'names': [], - 'mappings': ';AAKA;EAHE,AAAkB;;EAKpB,AAAK;IACD,AAAO', + 'mappings': ';AAKA,IAAI,CAAC;EAHH,gBAAgB,EAAE,KAAM,GAGpB;;EAEJ,IAAI,CAAC,CAAC,CAAJ;IACA,KAAK,EAAE,IAAK,GADX', } B_EXPECTED_CSS = '''\ @@ -221,12 +221,6 @@ def test_compile_invalid_source_comments(self): string='a { color: blue; }', source_comments='invalid') - def test_compile_invalid_image_path(self): - self.assertRaises(TypeError, sass.compile, - string='a { color: blue; }', image_path=[]) - self.assertRaises(TypeError, sass.compile, - string='a { color: blue; }', image_path=123) - def test_compile_string(self): actual = sass.compile(string='a { b { color: blue; } }') assert actual == 'a b {\n color: blue; }\n' @@ -247,7 +241,8 @@ def test_compile_string(self): a { color: blue; } -/* 유니코드 */''', +/* 유니코드 */ +''', actual ) self.assertRaises(sass.CompileError, sass.compile, @@ -409,7 +404,7 @@ def test_output_style(self): self.assertEqual('a.scss.css', result_files['a.scss']) with open(os.path.join(css_path, 'a.scss.css'), **utf8_if_py3) as f: css = f.read() - self.assertEqual('body{background-color:green}body a{color:blue}', + self.assertEqual('body{background-color:green}body a{color:blue}\n', css) @@ -462,7 +457,7 @@ def test_build_one(self): 'sources': ['../test/b.scss'], 'sourcesContent': [], 'names': [], - 'mappings': ';AACA,AAAE;EACE,AAAW', + 'mappings': ';AACE,CAAC,CAAC,CAAC,CAAD;EACA,SAAS,EAAE,IAAI,GADd', }, os.path.join(d, 'css', 'b.scss.css.map') ) @@ -480,7 +475,7 @@ def test_build_one(self): 'sources': ['../test/d.scss'], 'sourcesContent': [], 'names': [], - 'mappings': ';AAKA;EAHE,AAAkB;;EAKpB,AAAK;IACD,AAAM', + 'mappings': ';;AAKA,IAAI,CAAC;EAHH,gBAAgB,EAAE,KAAM,GAGpB;;EAEJ,IAAI,CAAC,CAAC,CAAJ;IACA,IAAI,EAAE,0BAA2B,GADhC', }, os.path.join(d, 'css', 'd.scss.css.map') ) @@ -561,7 +556,7 @@ def test_build_sass(self): ) with open(self.css_path('a.scss.css')) as f: self.assertEqual( - 'p a {\n color: red; }\np b {\n color: blue; }\n', + 'p a {\n color: red; }\n\np b {\n color: blue; }\n', f.read() ) @@ -570,7 +565,7 @@ def test_output_style(self): self.assertEqual(0, rv) with open(self.css_path('a.scss.css')) as f: self.assertEqual( - 'p a{color:red}p b{color:blue}', + 'p a{color:red}p b{color:blue}\n', f.read() ) @@ -727,8 +722,8 @@ def test_error(self): assert False, 'Expected to raise' except sass.CompileError as e: msg, = e.args - assert msg.decode('UTF-8').endswith( - 'bad.scss:1: invalid property name\n' + assert msg.decode('UTF-8').startswith( + 'Error: invalid property name' ), msg return except Exception as e: @@ -1007,111 +1002,112 @@ class CustomFunctionsTest(unittest.TestCase): def test_raises(self): with assert_raises_compile_error(RegexMatcher( - r'^stdin:1: error in C function raises: \n' - r'Traceback \(most recent call last\):\n' + r'^Error: error in C function raises: \n' + r' Traceback \(most recent call last\):\n' r'.+' r'AssertionError: foo\n\n' - r'Backtrace:\n' - r'\tstdin:1, in function `raises`\n' - r'\tstdin:1\n$', + r' Backtrace:\n' + r' \tstdin:0, in function `raises`\n' + r' \tstdin:0\n' + r' on line 1 of stdin\n$' )): compile_with_func('a { content: raises(); }') def test_warning(self): with assert_raises_compile_error( - 'stdin:1: warning in C function returns-warning: ' + 'Error: warning in C function returns-warning: ' 'This is a warning\n' - 'Backtrace:\n' - '\tstdin:1, in function `returns-warning`\n' - '\tstdin:1\n' + ' Backtrace:\n' + ' \tstdin:0, in function `returns-warning`\n' + ' \tstdin:0\n' + ' on line 1 of stdin\n' ): compile_with_func('a { content: returns_warning(); }') def test_error(self): with assert_raises_compile_error( - 'stdin:1: error in C function returns-error: ' - 'This is an error\n' - 'Backtrace:\n' - '\tstdin:1, in function `returns-error`\n' - '\tstdin:1\n', + 'Error: error in C function returns-error: This is an error\n' + ' Backtrace:\n' + ' \tstdin:0, in function `returns-error`\n' + ' \tstdin:0\n' + ' on line 1 of stdin\n' ): compile_with_func('a { content: returns_error(); }') def test_returns_unknown_object(self): with assert_raises_compile_error( - 'stdin:1: error in C function returns-unknown: ' + 'Error: error in C function returns-unknown: ' 'Unexpected type: `tuple`.\n' - 'Expected one of:\n' - '- None\n' - '- bool\n' - '- str\n' - '- SassNumber\n' - '- SassColor\n' - '- SassList\n' - '- dict\n' - '- SassMap\n' - '- SassWarning\n' - '- SassError\n\n' - 'Backtrace:\n' - '\tstdin:1, in function `returns-unknown`\n' - '\tstdin:1\n', + ' Expected one of:\n' + ' - None\n' + ' - bool\n' + ' - str\n' + ' - SassNumber\n' + ' - SassColor\n' + ' - SassList\n' + ' - dict\n' + ' - SassMap\n' + ' - SassWarning\n' + ' - SassError\n\n' + ' Backtrace:\n' + ' \tstdin:0, in function `returns-unknown`\n' + ' \tstdin:0\n' + ' on line 1 of stdin\n' ): compile_with_func('a { content: returns_unknown(); }') def test_none(self): self.assertEqual( compile_with_func('a {color: #fff; content: returns_none();}'), - 'a{color:#fff}', + 'a{color:#fff}\n', ) def test_true(self): self.assertEqual( compile_with_func('a { content: returns_true(); }'), - 'a{content:true}', + 'a{content:true}\n', ) def test_false(self): self.assertEqual( compile_with_func('a { content: returns_false(); }'), - 'a{content:false}', + 'a{content:false}\n', ) def test_unicode(self): self.assertEqual( compile_with_func('a { content: returns_unicode(); }'), - u'@charset "UTF-8";\n' - u'a{content:☃}', + u'\ufeffa{content:☃}\n', ) def test_bytes(self): self.assertEqual( compile_with_func('a { content: returns_bytes(); }'), - u'@charset "UTF-8";\n' - u'a{content:☃}', + u'\ufeffa{content:☃}\n', ) def test_number(self): self.assertEqual( compile_with_func('a { width: returns_number(); }'), - 'a{width:5px}', + 'a{width:5px}\n', ) def test_color(self): self.assertEqual( compile_with_func('a { color: returns_color(); }'), - 'a{color:rgba(1,2,3,0.5)}', + 'a{color:rgba(1,2,3,0.5)}\n', ) def test_comma_list(self): self.assertEqual( compile_with_func('a { font-family: returns_comma_list(); }'), - 'a{font-family:Arial,sans-serif}', + 'a{font-family:Arial,sans-serif}\n', ) def test_space_list(self): self.assertEqual( compile_with_func('a { border-right: returns_space_list(); }'), - 'a{border-right:medium none}', + 'a{border-right:medium none}\n', ) def test_py_dict(self): @@ -1119,7 +1115,7 @@ def test_py_dict(self): compile_with_func( 'a { content: map-get(returns_py_dict(), foo); }', ), - 'a{content:bar}', + 'a{content:bar}\n', ) def test_map(self): @@ -1127,7 +1123,7 @@ def test_map(self): compile_with_func( 'a { content: map-get(returns_map(), foo); }', ), - 'a{content:bar}', + 'a{content:bar}\n', ) def test_identity_none(self): @@ -1135,38 +1131,37 @@ def test_identity_none(self): compile_with_func( 'a {color: #fff; content: identity(returns_none());}', ), - 'a{color:#fff}', + 'a{color:#fff}\n', ) def test_identity_true(self): self.assertEqual( compile_with_func('a { content: identity(returns_true()); }'), - 'a{content:true}', + 'a{content:true}\n', ) def test_identity_false(self): self.assertEqual( compile_with_func('a { content: identity(returns_false()); }'), - 'a{content:false}', + 'a{content:false}\n', ) def test_identity_strings(self): self.assertEqual( compile_with_func('a { content: identity(returns_unicode()); }'), - u'@charset "UTF-8";\n' - u'a{content:☃}', + u'\ufeffa{content:☃}\n', ) def test_identity_number(self): self.assertEqual( compile_with_func('a { width: identity(returns_number()); }'), - 'a{width:5px}', + 'a{width:5px}\n', ) def test_identity_color(self): self.assertEqual( compile_with_func('a { color: identity(returns_color()); }'), - 'a{color:rgba(1,2,3,0.5)}', + 'a{color:rgba(1,2,3,0.5)}\n', ) def test_identity_comma_list(self): @@ -1174,7 +1169,7 @@ def test_identity_comma_list(self): compile_with_func( 'a { font-family: identity(returns_comma_list()); }', ), - 'a{font-family:Arial,sans-serif}', + 'a{font-family:Arial,sans-serif}\n', ) def test_identity_space_list(self): @@ -1182,7 +1177,7 @@ def test_identity_space_list(self): compile_with_func( 'a { border-right: identity(returns_space_list()); }', ), - 'a{border-right:medium none}', + 'a{border-right:medium none}\n', ) def test_identity_py_dict(self): @@ -1190,7 +1185,7 @@ def test_identity_py_dict(self): compile_with_func( 'a { content: map-get(identity(returns_py_dict()), foo); }', ), - 'a{content:bar}', + 'a{content:bar}\n', ) def test_identity_map(self): @@ -1198,7 +1193,7 @@ def test_identity_map(self): compile_with_func( 'a { content: map-get(identity(returns_map()), foo); }', ), - 'a{content:bar}', + 'a{content:bar}\n', ) def test_list_with_map_item(self): @@ -1208,7 +1203,7 @@ def test_list_with_map_item(self): 'map-get(nth(identity(((foo: bar), (baz: womp))), 1), foo)' '}' ), - 'a{content:bar}' + 'a{content:bar}\n' ) def test_map_with_map_key(self): @@ -1216,7 +1211,7 @@ def test_map_with_map_key(self): compile_with_func( 'a{content: map-get(identity(((foo: bar): baz)), (foo: bar))}', ), - 'a{content:baz}', + 'a{content:baz}\n', )