Kronuz/pyScss

Conversion to number unsuccessful

trjordan opened this issue · 1 comments

I'm a bit new at Sass, so I'm not sure exactly what all this is called, but I believe this is a discrepancy between normal Sass and pyScss:

Input:

$spacing-unit:     30px;
.footer { width: -webkit-calc(100% - (#{$spacing-unit} / 2)); }

CSS output from

.footer {
  width: -webkit-calc(100% - (30px / 2));
}

Error produced by scss:

In [6]: c.compile_string("""
   ...: $spacing-unit:     30px;
   ...: .footer { width: -webkit-calc(100% - (#{$spacing-unit} / 2)); }
   ...: """)
ERROR: An unexpected error occurred while tokenizing input
The following traceback may be corrupted or invalid
The error message is: ('EOF in multi-line string', (1, 0))

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
//site-packages/scss/calculator.py in evaluate_expression(self, expr,
 divide)                                                                                                           
    140         try:
--> 141             return ast.evaluate(self, divide=divide)
    142         except Exception as e:

//site-packages/scss/ast.py in evaluate(self, calculator, divide)
    200         # work?
--> 201         args, kwargs = argspec_node.evaluate_call_args(calculator)
    202         argspec_len = len(args) + len(kwargs)

//site-packages/scss/ast.py in evaluate_call_args(self, calculator)
    476         for var_node, value_node in self.argpairs:
--> 477             value = value_node.evaluate(calculator, divide=True)
    478             if var_node is None:

//site-packages/scss/ast.py in evaluate(self, calculator, divide)
    138 
--> 139         return self.op(left, right)
    140 

TypeError: unsupported operand type(s) for -: 'Number' and 'String'

During handling of the above exception, another exception occurred:

SassEvaluationError                       Traceback (most recent call last)
<ipython-input-6-b871d0db8b89> in <module>()
      2 $spacing-unit:     30px;
      3 .footer { width: -webkit-calc(100% - (#{$spacing-unit} / 2)); }
----> 4 """)

//site-packages/scss/compiler.py in compile_string(self, string)
    208         compilation = self.make_compilation()
    209         compilation.add_source(source)
--> 210         return self.call_and_catch_errors(compilation.run)
    211 
    212 

//site-packages/scss/compiler.py in call_and_catch_errors(self, f, *a
rgs, **kwargs)                                                                                                     
    174         """
    175         try:
--> 176             return f(*args, **kwargs)
    177         except SassError as e:
    178             if self.live_errors:

//site-packages/scss/compiler.py in run(self)
    276     def run(self):
    277         # this will compile and manage rule: child objects inside of a node
--> 278         self.parse_children()
    279 
    280         # this will manage @extends

//site-packages/scss/compiler.py in parse_children(self, scope)
    350 
    351         for rule in children:
--> 352             self.manage_children(rule, scope)
    353 
    354         self._warn_unused_imports(self.rules[0])

//site-packages/scss/compiler.py in manage_children(self, rule, scope
)                                                                                                                  
    372     def manage_children(self, rule, scope):
    373         try:
--> 374             self._manage_children_impl(rule, scope)
    375         except SassBaseError as e:
    376             e.add_rule(rule)

//site-packages/scss/compiler.py in _manage_children_impl(self, rule,
 scope)                                                                                                            
    421             # Nested rules
    422             elif scope is None:  # needs to have no scope to crawl down the nested rules
--> 423                 self._nest_rules(rule, scope, block)
    424 
    425     def _at_warn(self, calculator, rule, scope, block):

//site-packages/scss/compiler.py in _nest_rules(self, rule, scope, bl
ock)                                                                                                               
   1225         self.rules.append(new_rule)
   1226         rule.namespace.use_import(rule.source_file)
-> 1227         self.manage_children(new_rule, scope)
   1228 
   1229         self._warn_unused_imports(new_rule)

//site-packages/scss/compiler.py in manage_children(self, rule, scope
)                                                                                                                  
    372     def manage_children(self, rule, scope):
    373         try:
--> 374             self._manage_children_impl(rule, scope)
    375         except SassBaseError as e:
    376             e.add_rule(rule)

//site-packages/scss/compiler.py in _manage_children_impl(self, rule,
 scope)                                                                                                            
    406             # Properties
    407             elif block.unparsed_contents is None:
--> 408                 self._get_properties(rule, scope, block)
    409 
    410             # Nested properties

//site-packages/scss/compiler.py in _get_properties(self, rule, scope
, block)                                                                                                           
   1114                 value = None
   1115             else:
-> 1116                 value = calculator.calculate(raw_value)
   1117 
   1118             if value is None:

//site-packages/scss/calculator.py in calculate(self, expression, div
ide)                                                                                                               
    114 
    115     def calculate(self, expression, divide=False):
--> 116         result = self.evaluate_expression(expression, divide=divide)
    117 
    118         if result is None:

//site-packages/scss/calculator.py in evaluate_expression(self, expr,
 divide)                                                                                                           
    141             return ast.evaluate(self, divide=divide)
    142         except Exception as e:
--> 143             six.reraise(SassEvaluationError, SassEvaluationError(e, expression=expr), sys.exc_info()[2])
    144 
    145     def parse_expression(self, expr, target='goal'):

//site-packages/six.py in reraise(tp, value, tb)
    656             value = tp()
    657         if value.__traceback__ is not tb:
--> 658             raise value.with_traceback(tb)
    659         raise value
    660 

//site-packages/scss/calculator.py in evaluate_expression(self, expr,
 divide)                                                                                                           
    139 
    140         try:
--> 141             return ast.evaluate(self, divide=divide)
    142         except Exception as e:
    143             six.reraise(SassEvaluationError, SassEvaluationError(e, expression=expr), sys.exc_info()[2])

//site-packages/scss/ast.py in evaluate(self, calculator, divide)
    199         # TODO unclear whether this is correct -- how does arg, kwarg, arg
    200         # work?
--> 201         args, kwargs = argspec_node.evaluate_call_args(calculator)
    202         argspec_len = len(args) + len(kwargs)
    203 

//site-packages/scss/ast.py in evaluate_call_args(self, calculator)
    475         kwargs = OrderedDict()  # Sass kwargs preserve order
    476         for var_node, value_node in self.argpairs:
--> 477             value = value_node.evaluate(calculator, divide=True)
    478             if var_node is None:
    479                 # Positional

//site-packages/scss/ast.py in evaluate(self, calculator, divide)
    137             return String.unquoted(left.render() + op + right.render())
    138 
--> 139         return self.op(left, right)
    140 
    141 

SassEvaluationError: Error evaluating expression:
    -webkit-calc(100% - (#{$spacing-unit} / 2))

on line 3 of 'string:1c352021e6b47bfa:\n$spacing-unit:     30px;\n.footer { width: -webkit-calc(100% - (#{$spacing-u
nit} / 2)); }\n'                                                                                                   
Traceback:
  File "//site-packages/scss/calculator.py", line 141, in evaluate_ex
pression                                                                                                           
    return ast.evaluate(self, divide=divide)
  File "//site-packages/scss/ast.py", line 201, in evaluate
    args, kwargs = argspec_node.evaluate_call_args(calculator)
  File "//site-packages/scss/ast.py", line 477, in evaluate_call_args
    value = value_node.evaluate(calculator, divide=True)
  File "//site-packages/scss/ast.py", line 139, in evaluate
    return self.op(left, right)
TypeError: unsupported operand type(s) for -: 'Number' and 'String'
eevee commented

calc was recognized as a CSS function taking an expression, but -webkit-calc and -moz-calc weren't. Fixed in 1.3.5. (If you're even still using the prefixed versions by now, ha.)