Skip to content

Commit f5f8cc6

Browse files
authored
Flag to skip when evaluates to false (#413)
* skip when evaluates to false * mem check in docker, new event loop * info in test
1 parent 5de80d1 commit f5f8cc6

File tree

13 files changed

+230
-103
lines changed

13 files changed

+230
-103
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
# v1.7.6-alpha0
1+
# v1.7.6-alpha1
22

33
* Fixed maximum enumerators per collection, issue #412.
4+
* Added `!` prefix flag to exclude values which evaluate to `false`, pr #413.
45

56
# v1.7.5
67

inc/ti/field.t.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ enum
3030
TI_FIELD_FLAG_NO_IDS=TI_FLAGS_NO_IDS, /* 32 */
3131

3232
TI_FIELD_FLAG_SKIP_NIL=64, /* skip when prop is nil */
33+
TI_FIELD_FLAG_SKIP_FALSE=128, /* skip when prop evaluates to false */
3334
};
3435

3536
#define TI_FIELD_MIN_MAX (TI_FIELD_FLAG_MIN_DEEP|TI_FIELD_FLAG_MAX_DEEP)

inc/ti/val.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@ int ti_val_convert_to_int(ti_val_t ** val, ex_t * e);
6565
int ti_val_convert_to_float(ti_val_t ** val, ex_t * e);
6666
int ti_val_convert_to_array(ti_val_t ** val, ex_t * e);
6767
int ti_val_convert_to_set(ti_val_t ** val, ex_t * e);
68-
_Bool ti_val_as_bool(ti_val_t * val);
6968
size_t ti_val_get_len(ti_val_t * val);
7069
int ti_val_gen_ids(ti_val_t * val);
7170
_Bool ti_val_has_ids(ti_val_t * val);

inc/ti/val.inline.h

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,57 @@
3636
static inline int val__str_to_str(ti_val_t ** UNUSED(v), ex_t * UNUSED(e));
3737
static inline int val__no_to_str(ti_val_t ** val, ex_t * e);
3838

39+
static inline _Bool val__as_bool_false(ti_val_t * UNUSED(val))
40+
{
41+
return false;
42+
}
43+
static inline _Bool val__as_bool_true(ti_val_t * UNUSED(val))
44+
{
45+
return true;
46+
}
47+
static inline _Bool val__as_bool_int(ti_val_t * val)
48+
{
49+
return !!VINT(val);;
50+
}
51+
static inline _Bool val__as_bool_float(ti_val_t * val)
52+
{
53+
return !!VFLOAT(val);
54+
}
55+
static inline _Bool val__as_bool_bool(ti_val_t * val)
56+
{
57+
return VBOOL(val);
58+
}
59+
static inline _Bool val__as_bool_raw(ti_val_t * val)
60+
{
61+
return !!((ti_raw_t *) val)->n;
62+
}
63+
static inline _Bool val__as_bool_arr(ti_val_t * val)
64+
{
65+
return !!VARR(val)->n;
66+
}
67+
static inline _Bool val__as_bool_set(ti_val_t * val)
68+
{
69+
return !!VSET(val)->n;
70+
}
71+
static inline _Bool val__as_bool_thing(ti_val_t * val)
72+
{
73+
return !!ti_thing_n((ti_thing_t *) val);
74+
}
75+
static inline _Bool val__as_bool_wrap(ti_val_t * val)
76+
{
77+
return !!ti_thing_n(((ti_wrap_t *) val)->thing);
78+
}
79+
static inline _Bool val__as_bool_room(ti_val_t * val)
80+
{
81+
return !!((ti_room_t *) val)->id;
82+
}
83+
static inline _Bool val__as_bool_task(ti_val_t * val)
84+
{
85+
return !!((ti_vtask_t *) val)->run_at;
86+
}
87+
static inline _Bool val__as_bool_member(ti_val_t * val); /* defined later */
88+
89+
3990
static inline const char * val__nil_type_str(ti_val_t * UNUSED(val))
4091
{
4192
return TI_VAL_NIL_S;
@@ -247,6 +298,7 @@ typedef int (*ti_val_to_arr_cb) (ti_val_t ** v, ti_varr_t * varr, ex_t * e);
247298
typedef int (*ti_val_to_client_pk_cb) (ti_val_t *, ti_vp_t *, int, int);
248299
typedef int (*ti_val_to_store_pk_cb) (ti_val_t *, msgpack_packer * pk);
249300
typedef const char * (*ti_val_type_str_cb) (ti_val_t *);
301+
typedef _Bool (*ti_val_as_bool_cb) (ti_val_t *);
250302

251303
typedef struct
252304
{
@@ -256,6 +308,7 @@ typedef struct
256308
ti_val_to_client_pk_cb to_client_pk;
257309
ti_val_to_store_pk_cb to_store_pk;
258310
ti_val_type_str_cb get_type_str;
311+
ti_val_as_bool_cb as_bool;
259312
_Bool allowed_as_vtask_arg; /* allowed in the @thingsdb scope */
260313
} ti_val_type_t;
261314

@@ -269,6 +322,7 @@ static ti_val_type_t ti_val_type_props[22] = {
269322
.to_client_pk = val__nil_to_client_pk,
270323
.to_store_pk = val__nil_to_store_pk,
271324
.get_type_str = val__nil_type_str,
325+
.as_bool = val__as_bool_false,
272326
.allowed_as_vtask_arg = true,
273327
},
274328
/* TI_VAL_INT */
@@ -279,6 +333,7 @@ static ti_val_type_t ti_val_type_props[22] = {
279333
.to_client_pk = val__int_to_client_pk,
280334
.to_store_pk = val__int_to_store_pk,
281335
.get_type_str = val__int_type_str,
336+
.as_bool = val__as_bool_int,
282337
.allowed_as_vtask_arg = true,
283338
},
284339
/* TI_VAL_FLOAT */
@@ -289,6 +344,7 @@ static ti_val_type_t ti_val_type_props[22] = {
289344
.to_client_pk = val__float_to_client_pk,
290345
.to_store_pk = val__float_to_store_pk,
291346
.get_type_str = val__float_type_str,
347+
.as_bool = val__as_bool_float,
292348
.allowed_as_vtask_arg = true,
293349
},
294350
/* TI_VAL_BOOL */
@@ -299,6 +355,7 @@ static ti_val_type_t ti_val_type_props[22] = {
299355
.to_client_pk = val__bool_to_client_pk,
300356
.to_store_pk = (ti_val_to_store_pk_cb) ti_vbool_to_pk,
301357
.get_type_str = val__bool_type_str,
358+
.as_bool = val__as_bool_bool,
302359
.allowed_as_vtask_arg = true,
303360
},
304361
/* TI_VAL_DATETIME */
@@ -309,6 +366,7 @@ static ti_val_type_t ti_val_type_props[22] = {
309366
.to_client_pk = val__datetime_to_client_pk,
310367
.to_store_pk = (ti_val_to_store_pk_cb) ti_datetime_to_store_pk,
311368
.get_type_str = val__datetime_type_str,
369+
.as_bool = val__as_bool_true,
312370
.allowed_as_vtask_arg = true,
313371
},
314372
/* TI_VAL_NAME */
@@ -319,6 +377,7 @@ static ti_val_type_t ti_val_type_props[22] = {
319377
.to_client_pk = val__str_to_client_pk,
320378
.to_store_pk = (ti_val_to_store_pk_cb) ti_name_to_pk,
321379
.get_type_str = val__str_type_str,
380+
.as_bool = val__as_bool_raw,
322381
.allowed_as_vtask_arg = true,
323382
},
324383
/* TI_VAL_STR */
@@ -329,6 +388,7 @@ static ti_val_type_t ti_val_type_props[22] = {
329388
.to_client_pk = val__str_to_client_pk,
330389
.to_store_pk = (ti_val_to_store_pk_cb) ti_raw_str_to_pk,
331390
.get_type_str = val__str_type_str,
391+
.as_bool = val__as_bool_raw,
332392
.allowed_as_vtask_arg = true,
333393
},
334394
/* TI_VAL_BYTES */
@@ -339,6 +399,7 @@ static ti_val_type_t ti_val_type_props[22] = {
339399
.to_client_pk = val__bytes_to_client_pk,
340400
.to_store_pk = (ti_val_to_store_pk_cb) ti_raw_bytes_to_pk,
341401
.get_type_str = val__bytes_type_str,
402+
.as_bool = val__as_bool_raw,
342403
.allowed_as_vtask_arg = true,
343404
},
344405
/* TI_VAL_REGEX */
@@ -349,6 +410,7 @@ static ti_val_type_t ti_val_type_props[22] = {
349410
.to_client_pk = val__regex_to_client_pk,
350411
.to_store_pk = (ti_val_to_store_pk_cb) ti_regex_to_store_pk,
351412
.get_type_str = val__regex_type_str,
413+
.as_bool = val__as_bool_true,
352414
.allowed_as_vtask_arg = true,
353415
},
354416
/* TI_VAL_THING */
@@ -359,6 +421,7 @@ static ti_val_type_t ti_val_type_props[22] = {
359421
.to_client_pk = (ti_val_to_client_pk_cb) ti_thing_to_client_pk,
360422
.to_store_pk = (ti_val_to_store_pk_cb) ti_thing_to_store_pk,
361423
.get_type_str = val__thing_type_str,
424+
.as_bool = val__as_bool_thing,
362425
.allowed_as_vtask_arg = false,
363426
},
364427
/* TI_VAL_WRAP */
@@ -369,6 +432,7 @@ static ti_val_type_t ti_val_type_props[22] = {
369432
.to_client_pk = (ti_val_to_client_pk_cb) ti_wrap_to_client_pk,
370433
.to_store_pk = (ti_val_to_store_pk_cb) ti_wrap_to_store_pk,
371434
.get_type_str = val__wrap_type_str,
435+
.as_bool = val__as_bool_wrap,
372436
.allowed_as_vtask_arg = false,
373437
},
374438
/* TI_VAL_ROOM */
@@ -379,6 +443,7 @@ static ti_val_type_t ti_val_type_props[22] = {
379443
.to_client_pk = val__room_to_client_pk,
380444
.to_store_pk = (ti_val_to_store_pk_cb) ti_room_to_store_pk,
381445
.get_type_str = val__room_type_str,
446+
.as_bool = val__as_bool_room,
382447
.allowed_as_vtask_arg = false,
383448
},
384449
/* TI_VAL_TASK */
@@ -389,6 +454,7 @@ static ti_val_type_t ti_val_type_props[22] = {
389454
.to_client_pk = val__task_to_client_pk,
390455
.to_store_pk = (ti_val_to_store_pk_cb) ti_vtask_to_store_pk,
391456
.get_type_str = val__task_type_str,
457+
.as_bool = val__as_bool_task,
392458
.allowed_as_vtask_arg = false,
393459
},
394460
/* TI_VAL_ARR */
@@ -399,6 +465,7 @@ static ti_val_type_t ti_val_type_props[22] = {
399465
.to_client_pk = (ti_val_to_client_pk_cb) val__varr_to_client_pk,
400466
.to_store_pk = (ti_val_to_store_pk_cb) val__varr_to_store_pk,
401467
.get_type_str = val__arr_type_str,
468+
.as_bool = val__as_bool_arr,
402469
.allowed_as_vtask_arg = false,
403470
},
404471
/* TI_VAL_SET */
@@ -409,6 +476,7 @@ static ti_val_type_t ti_val_type_props[22] = {
409476
.to_client_pk = (ti_val_to_client_pk_cb) ti_vset_to_client_pk,
410477
.to_store_pk = (ti_val_to_store_pk_cb) ti_vset_to_store_pk,
411478
.get_type_str = val__set_type_str,
479+
.as_bool = val__as_bool_set,
412480
.allowed_as_vtask_arg = false,
413481
},
414482
/* TI_VAL_ERROR */
@@ -419,6 +487,7 @@ static ti_val_type_t ti_val_type_props[22] = {
419487
.to_client_pk = val__error_to_client_pk,
420488
.to_store_pk = (ti_val_to_store_pk_cb) ti_verror_to_store_pk,
421489
.get_type_str = val__error_type_str,
490+
.as_bool = val__as_bool_false,
422491
.allowed_as_vtask_arg = false,
423492
},
424493
/* TI_VAL_MEMBER */
@@ -429,6 +498,7 @@ static ti_val_type_t ti_val_type_props[22] = {
429498
.to_client_pk = (ti_val_to_client_pk_cb) val__member_to_client_pk,
430499
.to_store_pk = (ti_val_to_store_pk_cb) val__member_to_store_pk,
431500
.get_type_str = val__member_type_str,
501+
.as_bool = val__as_bool_member,
432502
.allowed_as_vtask_arg = false,
433503
},
434504
/* TI_VAL_MPDATA */
@@ -439,6 +509,7 @@ static ti_val_type_t ti_val_type_props[22] = {
439509
.to_client_pk = val__mpdata_to_client_pk,
440510
.to_store_pk = (ti_val_to_store_pk_cb) ti_raw_mpdata_to_store_pk,
441511
.get_type_str = val__mpdata_type_str,
512+
.as_bool = val__as_bool_raw,
442513
.allowed_as_vtask_arg = false,
443514
},
444515
/* TI_VAL_CLOSURE */
@@ -449,6 +520,7 @@ static ti_val_type_t ti_val_type_props[22] = {
449520
.to_client_pk = val__closure_to_client_pk,
450521
.to_store_pk = (ti_val_to_store_pk_cb) ti_closure_to_store_pk,
451522
.get_type_str = val__closure_type_str,
523+
.as_bool = val__as_bool_true,
452524
.allowed_as_vtask_arg = false,
453525
},
454526
/* TI_VAL_FUTURE */
@@ -458,6 +530,7 @@ static ti_val_type_t ti_val_type_props[22] = {
458530
.to_arr_cb = val__future_to_arr,
459531
.to_client_pk = (ti_val_to_client_pk_cb) val__future_to_client_pk,
460532
.get_type_str = val__future_type_str,
533+
.as_bool = val__as_bool_true,
461534
.allowed_as_vtask_arg = false,
462535
},
463536
/* TI_VAL_MODULE */
@@ -467,6 +540,7 @@ static ti_val_type_t ti_val_type_props[22] = {
467540
.to_arr_cb = val__module_to_arr,
468541
.to_client_pk = (ti_val_to_client_pk_cb) val__module_to_client_pk,
469542
.get_type_str = val__module_type_str,
543+
.as_bool = val__as_bool_true,
470544
.allowed_as_vtask_arg = false,
471545
},
472546
/* TI_VAL_TEMPLATE */
@@ -478,6 +552,16 @@ static ti_val_type_t ti_val_type_props[22] = {
478552

479553
#define ti_val(__val) (&ti_val_type_props[(__val)->tp])
480554

555+
static inline _Bool val__as_bool_member(ti_val_t * val)
556+
{
557+
return ti_val(VMEMBER(val))->as_bool(VMEMBER(val));
558+
}
559+
560+
static inline _Bool ti_val_as_bool(ti_val_t * val)
561+
{
562+
return ti_val(val)->as_bool(val);
563+
}
564+
481565
static inline const char * ti_val_str(ti_val_t * val)
482566
{
483567
return ti_val(val)->get_type_str(val);

inc/ti/version.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
* "-rc0"
2626
* ""
2727
*/
28-
#define TI_VERSION_PRE_RELEASE "-alpha0"
28+
#define TI_VERSION_PRE_RELEASE "-alpha1"
2929

3030
#define TI_MAINTAINER \
3131
"Jeroen van der Heijden <jeroen@cesbit.com>"

itest/Dockerfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,5 @@ COPY ./memleak.supp /memleak.supp
3030
WORKDIR /itest
3131
RUN pip install -r requirements.txt
3232
ENV THINGSDB_BIN=/thingsdb
33+
ENV THINGSDB_MEMCHECK=1
3334
CMD [ "python", "run_all_tests.py" ]

itest/lib/__init__.py

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import asyncio
22
import logging
33
import random
4+
import subprocess
45
from .testbase import TestBase
56
from .task import Task
67
from .cleanup import cleanup as clean
78
from .cleanup import killall
89
from .node import Node
10+
from .color import Color
911
from .vars import THINGSDB_BIN
1012
from .vars import THINGSDB_KEEP_ON_ERROR
1113
from .vars import THINGSDB_LOGLEVEL
@@ -39,11 +41,27 @@ async def wrapped(self):
3941
return wrapper
4042

4143

42-
async def _run_test(test):
44+
async def _run_test(test, hide_version: bool = False):
4345
logger = logging.getLogger()
4446
logger.setLevel(THINGSDB_LOGLEVEL)
4547
task = Task(test.title)
4648

49+
if not hide_version:
50+
try:
51+
result = subprocess.run(
52+
[THINGSDB_BIN, '--version'],
53+
capture_output=True,
54+
text=True,
55+
check=True
56+
)
57+
out = result.stdout.strip()
58+
lines = out.splitlines()
59+
lines[0] = f' {lines[0]}'
60+
out = '\n'.join(lines[:5])
61+
print(Color.info(out))
62+
except Exception:
63+
pass
64+
4765
logging.info(f"""
4866
Test Settings:
4967
THINGSDB_BIN: {THINGSDB_BIN}
@@ -70,10 +88,10 @@ async def _run_test(test):
7088
await task.task
7189

7290

73-
def run_test(test: TestBase):
74-
loop = asyncio.get_event_loop()
91+
def run_test(test: TestBase, hide_version: bool = False):
92+
loop = asyncio.new_event_loop()
7593
clean()
76-
loop.run_until_complete(_run_test(test))
94+
loop.run_until_complete(_run_test(test, hide_version))
7795

7896

7997
INT_MIN = -9223372036854775808

0 commit comments

Comments
 (0)