def test_complex_labeling(): conv1 = (c.this().add_label("input").pipe( c.filter(c.this() % 3 == 0), label_input={ "input_type": c.call_func(type, c.this()) }, ).pipe( c.list_comp(c.this().as_type(str)), label_output={ "list_length": c.call_func(len, c.this()), "separator": c.if_(c.label("list_length") > 10, ",", ";"), }, ).pipe({ "result": c.label("separator").call_method("join", c.this()), "input_type": c.label("input_type"), "input_data": c.label("input"), }).gen_converter(debug=False)) assert conv1(range(30)) == { "result": "0;3;6;9;12;15;18;21;24;27", "input_type": range, "input_data": range(0, 30), } assert conv1(range(40)) == { "result": "0,3,6,9,12,15,18,21,24,27,30,33,36,39", "input_type": range, "input_data": range(0, 40), }
def test_mutation_item(): now = datetime.now() assert c.list_comp( { "name": c.item("fullName"), "age": c.item("age").as_type(int), "to_del": 1, } ).pipe( c.list_comp( c.call_func(lambda d: d, c.this).tap( c.Mut.set_item( "name_before", c.label("_input").item(0, "name") ), c.Mut.set_item("name", c.item("name").call_method("lower")), c.Mut.set_item( "name_after", c.label("_input").item(0, "name") ), c.Mut.set_item("_updated", c.input_arg("now")), c.Mut.set_item(c.item("age"), c.item("age") >= 18), c.Mut.del_item("to_del"), c.Mut.custom(c.this.call_method("update", {"to_add": 2})), c.this.call_method("update", {"to_add2": 4}), ) ), label_input="_input", ).execute( [{"fullName": "John", "age": "28"}], debug=False, now=now ) == [ { "name": "john", "name_after": "john", "name_before": "John", "age": 28, "_updated": now, 28: True, "to_add": 2, "to_add2": 4, } ] with pytest.raises(Exception): c.item(c.Mut.set_item("abc", "cde")) with pytest.raises(Exception): conversion = c.item(1) conversion.ensure_conversion( c.Mut.set_item("abc", "cde"), explicitly_allowed_cls=GetItem )
def test_memory_freeing(): converter = ( c.this() .pipe( c.list_comp(c.this() + c.label("input_data").item(0)), label_input=dict(input_data=c.this()), ) .gen_converter(debug=True) ) sizes = [] sizes.append(total_size(converter.__dict__)) for i in range(100): l_input = [i + j for j in range(3)] l_out = [j + l_input[0] for j in l_input] assert converter(l_input) == l_out sizes.append(total_size(converter.__dict__)) assert all(sizes[0] == size for size in sizes[1:]), sizes conv2 = ( c.inline_expr("globals().__setitem__('a', {}) or 1") .pass_args(c.this()) .gen_converter() ) with pytest.raises(AssertionError): # should raise because of a memory leak conv2(123)
def test_simple_label(): conv1 = (c.tuple(c.item(2).add_label("a"), c.this()).pipe( c.item(1).pipe(c.list_comp( (c.this(), c.label("a"))))).gen_converter(debug=False)) assert conv1([1, 2, 3, 4]) == [(1, 3), (2, 3), (3, 3), (4, 3)] conv2 = (c.tuple(c.item(1).add_label("a"), c.this()).pipe( c.item(1), label_input={ "aa": c.item(0), "bb": c.item(0) }, label_output="collection1", ).pipe( c.label("collection1").pipe( c.aggregate( c.ReduceFuncs.Sum( c.this() + c.label("a") + c.label("aa") + c.input_arg("x") + c.label("collection1").item(0), ))), label_output="b", ).pipe(c.this() + c.label("b")).gen_converter(debug=False)) assert conv2([1, 2, 3, 4], x=10) == 140 conv3 = (c.tuple(c.item("default").add_label("default"), c.this()).pipe( c.item(1).pipe(c.item( "abc", default=c.label("default")))).gen_converter(debug=False)) assert conv3({"default": 1}) == 1 with pytest.raises(c.ConversionException): c.this().pipe(c.this(), label_input=1)
def test_labels(): conv1 = c.if_( 1, c.input_arg("y").item("abc").add_label("abc").pipe( c.input_arg("x").pipe( c.inline_expr("{cde} + 10").pass_args( cde=c.this.item("cde")))).pipe( c.inline_expr("{this} + {abc}").pass_args( this=c.this, abc=c.label("abc"))), 2, ).gen_converter(debug=False) assert conv1(data_=1, x={"cde": 2}, y={"abc": 3}) == 15 list(c.generator_comp(c.this.add_label("a")).execute([1, 2])) c.list_comp(c.this.add_label("a")).execute([1, 2]) with pytest.raises(c.ConversionException): c.this.add_label(123) with pytest.raises(ValueError): c.label(123)
def test_is_independent(): assert c(0).is_independent() assert c(int).is_independent() assert c(int).call().is_independent() assert c.label("a").is_independent() assert c.inline_expr("{}()").pass_args(int).is_independent() assert c.escaped_string("int()").is_independent() assert c({"a": c.input_arg("key")}).is_independent() assert not c.iter({"a": 1}).is_independent() assert not c.this.is_independent() assert not c({"a": 1}).item("a").is_independent() assert not c({"a": 1}).item(c.item("a")).is_independent() assert not c.inline_expr("{}()").pass_args(c.this).is_independent() assert not c.aggregate({"a": 1}).is_independent() assert not c.this.add_label("a").is_independent() assert not c(int).call(c.item(0)).is_independent()