Kaydet (Commit) c89fc1dd authored tarafından Batuhan Osman TASKAYA's avatar Batuhan Osman TASKAYA

replace casting with __render__ protocol + tests

üst 37736e73
......@@ -5,21 +5,33 @@ from inspect import currentframe
from textwrap import indent
from colorsys import rgb_to_hls, rgb_to_hsv, rgb_to_yiq
class AutoAddSelectorNotFoundInScope(Exception):
pass
def render(obj):
if hasattr(obj, '__render__'):
return obj.__render__()
elif obj is None:
return "none" # None requires specific serialization.
else:
return f"{obj}" # Serialize to string
@dataclass
class ColorValue:
red: int
green: int
blue: int
typ: str = "rgb"
def __render__(self):
return f"rgb({self.red}, {self.green}, {self.blue})" if self.typ == "rgb" else f"#{self.red}{self.green}{self.blue}"
@dataclass
class NumericValue:
value: Union[float, int]
unit: str
def __render__(self):
return f"{self.value}{self.unit}"
@dataclass
class Style:
name: str
......@@ -27,13 +39,17 @@ class Style:
important: bool = False
def __post_init__(self):
self.value = CSS.cast(self.value)
f = currentframe().f_back.f_back.f_globals
if f.get("DARWCSS_AUTO", False):
self.value = render(self.value)
f = currentframe().f_back.f_back
l, g = f.f_locals, f.f_globals
if l.get("DARWCSS_AUTO", g.get("DARWCSS_AUTO", False)):
try:
f[f.get("DARWCSS_SELECTOR", 'selector')].append(self)
selector_name = l.get("DARWCSS_SELECTOR", g.get("DARWCSS_SELECTOR", "selector"))
selector = l[selector_name]
except KeyError as exc:
raise AutoAddSelectorNotFoundInScope from exc
raise NameError(f"Selector can not found in local namespace.") from exc
else:
selector.append(self)
@dataclass
class Selector:
......@@ -62,28 +78,5 @@ class CSS:
yield selector.styles
finally:
self.selectors.append(selector)
@staticmethod
def cast(value):
if isinstance(value, str):
return value
elif isinstance(value, float) or isinstance(value, int):
return f"{value}" # casts value to string with fstring's performance instead of str() call
elif isinstance(value, NumericValue):
return f"{value.value}{value.unit}"
elif isinstance(value, ColorValue):
if value.typ == "rgb":
return f"rgb({value.red}, {value.green}, {value.blue})"
elif value.typ == "hsl":
return f"hsl({value.red}, {value.green}%, {value.blue}%)"
elif value.typ == "hex":
return f"#{value.red}{value.green}{value.blue}"
else:
return "black"
else:
return "none"
__call__ = render
import unittest
from darwcss.darwcss import ColorValue, render
class TestColorValue(unittest.TestCase):
def test_output_rgb(self):
red = ColorValue(255, 0, 0)
blue = ColorValue(0, 0, 255, "rgb")
self.assertEqual(render(red), "rgb(255, 0, 0)")
self.assertEqual(render(blue), "rgb(0, 0, 255)")
def test_output_hex(self):
purple = ColorValue("fa", "ff", "ca", "hex")
self.assertEqual(render(purple), "#faffca")
if __name__ == '__main__':
unittest.main()
import unittest
from darwcss.darwcss import CSS, Style
class TestCSS(unittest.TestCase):
rendered_css = '.home{\n a: b;\n c: d;\n}\n'
def test_css_with(self):
css = CSS()
with css.selector('.home') as selector:
selector.append(Style('a', 'b'))
selector.append(Style('c', 'd'))
self.assertEqual(css.render(), self.rendered_css)
def test_css_auto_add(self):
css = CSS()
DARWCSS_AUTO = True
with css.selector('.home') as selector:
Style('a', 'b')
Style('c', 'd')
self.assertEqual(css.render(), self.rendered_css)
def test_css_auto_add_different_selector(self):
css = CSS()
DARWCSS_AUTO = True
DARWCSS_SELECTOR = 'test'
with css.selector('.home') as test:
Style('a', 'b')
Style('c', 'd')
self.assertEqual(css.render(), self.rendered_css)
def test_css_auto_add_different_selector_name_error(self):
css = CSS()
DARWCSS_AUTO = True
DARWCSS_SELECTOR = 'test'
with css.selector('.home') as selector:
with self.assertRaises(NameError):
Style('a', 'b')
if __name__ == '__main__':
unittest.main()
import unittest
from darwcss.darwcss import NumericValue, render
class TestNumericValue(unittest.TestCase):
def test_numeric_render(self):
t = NumericValue(5, "px")
self.assertEqual(render(t), "5px")
x = NumericValue(30, "%")
self.assertEqual(render(x), "30%")
if __name__ == '__main__':
unittest.main()
import unittest
from darwcss.darwcss import render
class TestRender(unittest.TestCase):
def test_render_string(self):
self.assertEqual(render("merhaba"), "merhaba")
self.assertEqual(render("T3est"), "T3est")
def test_render_none(self):
self.assertEqual(render(None), "none")
def test_render_renderable(self):
class RenderableObject:
def __render__(self) -> str:
return "ABC"
self.assertEqual(render(RenderableObject()), "ABC")
def test_render_string_converter(self):
self.assertEqual(render(32), "32")
if __name__ == '__main__':
unittest.main()
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment