def test_replace_underscore_with_decimal(self): # '_' becomes '.' example: '1_32rem' --> '1.32rem' test_values = ['1_32rem', '0_0435p', 'none'] expected = ['1.32rem', '0.0435p', 'none'] property_parser = CSSPropertyValueParser() for i, value in enumerate(test_values): self.assertEquals(property_parser.replace_underscore_with_decimal(value=value), expected[i])
def test_decode_property_value_font_family(self): valid_property_name = 'font-family' encoded_property_values = [ 'serif', 'sans-serif', 'monospace', 'fantasy', 'cambria', 'didot', 'garamond', 'arial', 'helvetica', 'gadget', 'courier', 'monaco', 'consolas', 'copperplate', 'papyrus', 'invalid', 'wrong', # These just pass through. ] expected_property_values = [ 'serif', 'sans-serif', 'monospace', 'fantasy', 'cambria, serif', 'didot, serif', 'garamond, serif', 'arial, sans-serif', 'helvetica, sans-serif', 'gadget, sans-serif', 'courier, monospace', 'monaco, monospace', 'consolas, monospace', 'copperplate, fantasy', 'papyrus, fantasy', 'invalid', 'wrong', # These just pass through. ] property_parser = CSSPropertyValueParser(property_name=valid_property_name) for i, value in enumerate(encoded_property_values): self.assertEquals( property_parser.decode_property_value(value=value), expected_property_values[i], msg=value )
def test_is_built_in_invalid(self): property_names = ['font-weight', 'color', 'padding', 'color', 'inValid2'] input_values = ['-bold', 'white-', '1-5-1-5', 'h0ff48f', '24px'] property_parser = CSSPropertyValueParser() for i, value in enumerate(input_values): property_parser.property_name = property_names[i] self.assertFalse(property_parser.is_built_in(value=value))
def test_property_is_valid_false(self): property_name = 'color' invalid_values = ['a pm', 'bold-50', 'whatever', '1% 5% 1% 5%', '-12.7rem', '5u5', '5pxrem', 'p12px', 'b1 a5 c1% e5', '1a% 10x% 3q% 1mp3', ] # The last two raise SyntaxErr property_parser = CSSPropertyValueParser() for value in invalid_values: self.assertFalse(property_parser.property_is_valid(name=property_name, value=value, priority=''))
def test_is_built_in_valid(self): property_names = ['font-weight', 'color', 'azimuth', 'background-repeat'] input_values = ['bold', 'white', 'left-side', 'no-repeat'] property_parser = CSSPropertyValueParser() for i, value in enumerate(input_values): property_parser.property_name = property_names[i] self.assertTrue(property_parser.is_built_in(value=value))
def test_replace_dashes(self): # Delete leading example: '-bold' --> 'bold' # Delete trailing example: 'white-' --> 'white' # Replace internal example: '1-5-1-5' --> '1 5 1 5' input_values = ['-bold', 'white-', '1-5-1-5', 'h0ff48f'] expected_values = ['bold', 'white', '1 5 1 5', 'h0ff48f'] property_parser = CSSPropertyValueParser() for i, value in enumerate(input_values): self.assertEquals(property_parser.replace_dashes(value=value), expected_values[i])
def test_decode_property_value_pass_through_invalid_patterns(self): valid_property_name = 'color' encoded_property_values = ['bold-50', '5u5', 'b1-a5-c1p-e5', '5pxrem', '1ap-10xp-3qp-1mp3', 'p12px'] expected_property_values = ['bold 50', '5u5', 'b1 a5 c1% e5', '5pxrem', '1a% 10x% 3q% 1mp3', 'p12px'] property_parser = CSSPropertyValueParser(property_name=valid_property_name) for i, value in enumerate(encoded_property_values): self.assertEquals( property_parser.decode_property_value(value=value), expected_property_values[i], msg=value )
def test_decode_property_value_px_to_em(self): valid_property_name = 'padding' encoded_property_values = [ '55', '1-5-1-5', '1_32rem', '1p-10p-3p-1p', 'n12px', 'n5_25in-n6_1in', 'n0_0435p', ] expected_property_values = [ '3.4375em', '0.0625em 0.3125em 0.0625em 0.3125em', '1.32rem', '1% 10% 3% 1%', '-0.75em', '-5.25in -6.1in', '-0.0435%', ] property_parser = CSSPropertyValueParser(property_name=valid_property_name) for i, value in enumerate(encoded_property_values): self.assertEquals( property_parser.decode_property_value(value=value), expected_property_values[i], msg=value )
def test_decode_property_value(self): valid_property_name = 'color' encoded_property_values = [ 'bold', '55', '1-5-1-5', '1_32rem', '1p-10p-3p-1p', 'n12px', 'n5_25in-n6_1in', 'n0_0435p', 'h0ff48f', 'hfff', 'rgba-255-0-0-0_5', 'hsla-120-60p-70p-0_3', ] expected_property_values = [ 'bold', '55', '1 5 1 5', '1.32rem', '1% 10% 3% 1%', '-12px', '-5.25in -6.1in', '-0.0435%', '#0ff48f', '#fff', 'rgba(255, 0, 0, 0.5)', 'hsla(120, 60%, 70%, 0.3)', ] property_parser = CSSPropertyValueParser(property_name=valid_property_name) for i, value in enumerate(encoded_property_values): self.assertEquals( property_parser.decode_property_value(value=value), expected_property_values[i], msg=value )
def get_property_value(self, property_name='', encoded_property_value=''): """ Accepts an encoded_property_value that's been stripped of it's property named and priority Uses CSSPropertyValueParser, and returns a valid css property value or ''. Usage Note: Invalid CSS values can be returned by this method. CSS validation occurs at a later step. :raises ValueError: If either property_name or css_class are empty or only contain whitespace values. :type property_name: str :type encoded_property_value: str :param property_name: Name of CSS property that matches a key in ``property_alias_dict``. :param encoded_property_value: A property value that may or may not contain dashes and underscores. :return: (str) -- An unvalidated / potential CSS property value. **Examples:** >>> property_parser = ClassPropertyParser(set(), False) # Turn OFF unit conversion. >>> property_parser.get_property_value('font-weight', 'bold') # Special case: alias == property value 'bold' >>> property_parser.get_property_value('padding', '1-10-10-5') # Multi-value encoding contains dashes. '1px 10px 10px 5px' >>> property_parser.get_property_value('width', '7_25rem') # Single value contains underscores. '7.25rem' >>> property_parser.get_property_value('margin', '1ap-10xp-3qp-1mp3') # Invalid CSS returned. '1a% 10x% 3q% 1mp3' >>> property_parser.get_property_value('', 'c-lime') ValueError >>> property_parser.get_property_value('color', ' ') ValueError """ deny_empty_or_whitespace(string=property_name, variable_name='property_name') deny_empty_or_whitespace(string=encoded_property_value, variable_name='encoded_property_value') value_parser = CSSPropertyValueParser(property_name=property_name) value = value_parser.decode_property_value(value=encoded_property_value) return value
def test_replace_n_with_minus(self): test_values = ['n5cm n6cm', 'n12rem', 'n0.0435%', 'n1p n2p n1p n2p', 'n9in', 'none'] expected = ['-5cm -6cm', '-12rem', '-0.0435%', '-1p -2p -1p -2p', '-9in', 'none'] property_parser = CSSPropertyValueParser() for i, value in enumerate(test_values): self.assertEquals(property_parser.replace_n_with_minus(value=value), expected[i])
def test_replace_p_with_percent(self): test_values = ['1_32p', '0.0435p', '1p 2p 1p 2p', 'none'] expected = ['1_32%', '0.0435%', '1% 2% 1% 2%', 'none'] property_parser = CSSPropertyValueParser() for i, value in enumerate(test_values): self.assertEquals(property_parser.replace_p_with_percent(value=value), expected[i])
def test_property_is_valid_true(self): property_name = 'color' valid_values = ['blue', 'white', '#fff', '#0ff48f', 'rgba(255, 0, 0, 0.5)', 'hsla(120, 60%, 70%, 0.3)'] property_parser = CSSPropertyValueParser() for value in valid_values: self.assertTrue(property_parser.property_is_valid(name=property_name, value=value, priority=''))