Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# v1.7.6-alpha0
# v1.7.6-alpha1

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

# v1.7.5

Expand Down
1 change: 1 addition & 0 deletions inc/ti/field.t.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ enum
TI_FIELD_FLAG_NO_IDS=TI_FLAGS_NO_IDS, /* 32 */

TI_FIELD_FLAG_SKIP_NIL=64, /* skip when prop is nil */
TI_FIELD_FLAG_SKIP_FALSE=128, /* skip when prop evaluates to false */
};

#define TI_FIELD_MIN_MAX (TI_FIELD_FLAG_MIN_DEEP|TI_FIELD_FLAG_MAX_DEEP)
Expand Down
1 change: 0 additions & 1 deletion inc/ti/val.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,6 @@ int ti_val_convert_to_int(ti_val_t ** val, ex_t * e);
int ti_val_convert_to_float(ti_val_t ** val, ex_t * e);
int ti_val_convert_to_array(ti_val_t ** val, ex_t * e);
int ti_val_convert_to_set(ti_val_t ** val, ex_t * e);
_Bool ti_val_as_bool(ti_val_t * val);
size_t ti_val_get_len(ti_val_t * val);
int ti_val_gen_ids(ti_val_t * val);
_Bool ti_val_has_ids(ti_val_t * val);
Expand Down
84 changes: 84 additions & 0 deletions inc/ti/val.inline.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,57 @@
static inline int val__str_to_str(ti_val_t ** UNUSED(v), ex_t * UNUSED(e));
static inline int val__no_to_str(ti_val_t ** val, ex_t * e);

static inline _Bool val__as_bool_false(ti_val_t * UNUSED(val))
{
return false;
}
static inline _Bool val__as_bool_true(ti_val_t * UNUSED(val))
{
return true;
}
static inline _Bool val__as_bool_int(ti_val_t * val)
{
return !!VINT(val);;
}
static inline _Bool val__as_bool_float(ti_val_t * val)
{
return !!VFLOAT(val);
}
static inline _Bool val__as_bool_bool(ti_val_t * val)
{
return VBOOL(val);
}
static inline _Bool val__as_bool_raw(ti_val_t * val)
{
return !!((ti_raw_t *) val)->n;
}
static inline _Bool val__as_bool_arr(ti_val_t * val)
{
return !!VARR(val)->n;
}
static inline _Bool val__as_bool_set(ti_val_t * val)
{
return !!VSET(val)->n;
}
static inline _Bool val__as_bool_thing(ti_val_t * val)
{
return !!ti_thing_n((ti_thing_t *) val);
}
static inline _Bool val__as_bool_wrap(ti_val_t * val)
{
return !!ti_thing_n(((ti_wrap_t *) val)->thing);
}
static inline _Bool val__as_bool_room(ti_val_t * val)
{
return !!((ti_room_t *) val)->id;
}
static inline _Bool val__as_bool_task(ti_val_t * val)
{
return !!((ti_vtask_t *) val)->run_at;
}
static inline _Bool val__as_bool_member(ti_val_t * val); /* defined later */


static inline const char * val__nil_type_str(ti_val_t * UNUSED(val))
{
return TI_VAL_NIL_S;
Expand Down Expand Up @@ -247,6 +298,7 @@ typedef int (*ti_val_to_arr_cb) (ti_val_t ** v, ti_varr_t * varr, ex_t * e);
typedef int (*ti_val_to_client_pk_cb) (ti_val_t *, ti_vp_t *, int, int);
typedef int (*ti_val_to_store_pk_cb) (ti_val_t *, msgpack_packer * pk);
typedef const char * (*ti_val_type_str_cb) (ti_val_t *);
typedef _Bool (*ti_val_as_bool_cb) (ti_val_t *);

typedef struct
{
Expand All @@ -256,6 +308,7 @@ typedef struct
ti_val_to_client_pk_cb to_client_pk;
ti_val_to_store_pk_cb to_store_pk;
ti_val_type_str_cb get_type_str;
ti_val_as_bool_cb as_bool;
_Bool allowed_as_vtask_arg; /* allowed in the @thingsdb scope */
} ti_val_type_t;

Expand All @@ -269,6 +322,7 @@ static ti_val_type_t ti_val_type_props[22] = {
.to_client_pk = val__nil_to_client_pk,
.to_store_pk = val__nil_to_store_pk,
.get_type_str = val__nil_type_str,
.as_bool = val__as_bool_false,
.allowed_as_vtask_arg = true,
},
/* TI_VAL_INT */
Expand All @@ -279,6 +333,7 @@ static ti_val_type_t ti_val_type_props[22] = {
.to_client_pk = val__int_to_client_pk,
.to_store_pk = val__int_to_store_pk,
.get_type_str = val__int_type_str,
.as_bool = val__as_bool_int,
.allowed_as_vtask_arg = true,
},
/* TI_VAL_FLOAT */
Expand All @@ -289,6 +344,7 @@ static ti_val_type_t ti_val_type_props[22] = {
.to_client_pk = val__float_to_client_pk,
.to_store_pk = val__float_to_store_pk,
.get_type_str = val__float_type_str,
.as_bool = val__as_bool_float,
.allowed_as_vtask_arg = true,
},
/* TI_VAL_BOOL */
Expand All @@ -299,6 +355,7 @@ static ti_val_type_t ti_val_type_props[22] = {
.to_client_pk = val__bool_to_client_pk,
.to_store_pk = (ti_val_to_store_pk_cb) ti_vbool_to_pk,
.get_type_str = val__bool_type_str,
.as_bool = val__as_bool_bool,
.allowed_as_vtask_arg = true,
},
/* TI_VAL_DATETIME */
Expand All @@ -309,6 +366,7 @@ static ti_val_type_t ti_val_type_props[22] = {
.to_client_pk = val__datetime_to_client_pk,
.to_store_pk = (ti_val_to_store_pk_cb) ti_datetime_to_store_pk,
.get_type_str = val__datetime_type_str,
.as_bool = val__as_bool_true,
.allowed_as_vtask_arg = true,
},
/* TI_VAL_NAME */
Expand All @@ -319,6 +377,7 @@ static ti_val_type_t ti_val_type_props[22] = {
.to_client_pk = val__str_to_client_pk,
.to_store_pk = (ti_val_to_store_pk_cb) ti_name_to_pk,
.get_type_str = val__str_type_str,
.as_bool = val__as_bool_raw,
.allowed_as_vtask_arg = true,
},
/* TI_VAL_STR */
Expand All @@ -329,6 +388,7 @@ static ti_val_type_t ti_val_type_props[22] = {
.to_client_pk = val__str_to_client_pk,
.to_store_pk = (ti_val_to_store_pk_cb) ti_raw_str_to_pk,
.get_type_str = val__str_type_str,
.as_bool = val__as_bool_raw,
.allowed_as_vtask_arg = true,
},
/* TI_VAL_BYTES */
Expand All @@ -339,6 +399,7 @@ static ti_val_type_t ti_val_type_props[22] = {
.to_client_pk = val__bytes_to_client_pk,
.to_store_pk = (ti_val_to_store_pk_cb) ti_raw_bytes_to_pk,
.get_type_str = val__bytes_type_str,
.as_bool = val__as_bool_raw,
.allowed_as_vtask_arg = true,
},
/* TI_VAL_REGEX */
Expand All @@ -349,6 +410,7 @@ static ti_val_type_t ti_val_type_props[22] = {
.to_client_pk = val__regex_to_client_pk,
.to_store_pk = (ti_val_to_store_pk_cb) ti_regex_to_store_pk,
.get_type_str = val__regex_type_str,
.as_bool = val__as_bool_true,
.allowed_as_vtask_arg = true,
},
/* TI_VAL_THING */
Expand All @@ -359,6 +421,7 @@ static ti_val_type_t ti_val_type_props[22] = {
.to_client_pk = (ti_val_to_client_pk_cb) ti_thing_to_client_pk,
.to_store_pk = (ti_val_to_store_pk_cb) ti_thing_to_store_pk,
.get_type_str = val__thing_type_str,
.as_bool = val__as_bool_thing,
.allowed_as_vtask_arg = false,
},
/* TI_VAL_WRAP */
Expand All @@ -369,6 +432,7 @@ static ti_val_type_t ti_val_type_props[22] = {
.to_client_pk = (ti_val_to_client_pk_cb) ti_wrap_to_client_pk,
.to_store_pk = (ti_val_to_store_pk_cb) ti_wrap_to_store_pk,
.get_type_str = val__wrap_type_str,
.as_bool = val__as_bool_wrap,
.allowed_as_vtask_arg = false,
},
/* TI_VAL_ROOM */
Expand All @@ -379,6 +443,7 @@ static ti_val_type_t ti_val_type_props[22] = {
.to_client_pk = val__room_to_client_pk,
.to_store_pk = (ti_val_to_store_pk_cb) ti_room_to_store_pk,
.get_type_str = val__room_type_str,
.as_bool = val__as_bool_room,
.allowed_as_vtask_arg = false,
},
/* TI_VAL_TASK */
Expand All @@ -389,6 +454,7 @@ static ti_val_type_t ti_val_type_props[22] = {
.to_client_pk = val__task_to_client_pk,
.to_store_pk = (ti_val_to_store_pk_cb) ti_vtask_to_store_pk,
.get_type_str = val__task_type_str,
.as_bool = val__as_bool_task,
.allowed_as_vtask_arg = false,
},
/* TI_VAL_ARR */
Expand All @@ -399,6 +465,7 @@ static ti_val_type_t ti_val_type_props[22] = {
.to_client_pk = (ti_val_to_client_pk_cb) val__varr_to_client_pk,
.to_store_pk = (ti_val_to_store_pk_cb) val__varr_to_store_pk,
.get_type_str = val__arr_type_str,
.as_bool = val__as_bool_arr,
.allowed_as_vtask_arg = false,
},
/* TI_VAL_SET */
Expand All @@ -409,6 +476,7 @@ static ti_val_type_t ti_val_type_props[22] = {
.to_client_pk = (ti_val_to_client_pk_cb) ti_vset_to_client_pk,
.to_store_pk = (ti_val_to_store_pk_cb) ti_vset_to_store_pk,
.get_type_str = val__set_type_str,
.as_bool = val__as_bool_set,
.allowed_as_vtask_arg = false,
},
/* TI_VAL_ERROR */
Expand All @@ -419,6 +487,7 @@ static ti_val_type_t ti_val_type_props[22] = {
.to_client_pk = val__error_to_client_pk,
.to_store_pk = (ti_val_to_store_pk_cb) ti_verror_to_store_pk,
.get_type_str = val__error_type_str,
.as_bool = val__as_bool_false,
.allowed_as_vtask_arg = false,
},
/* TI_VAL_MEMBER */
Expand All @@ -429,6 +498,7 @@ static ti_val_type_t ti_val_type_props[22] = {
.to_client_pk = (ti_val_to_client_pk_cb) val__member_to_client_pk,
.to_store_pk = (ti_val_to_store_pk_cb) val__member_to_store_pk,
.get_type_str = val__member_type_str,
.as_bool = val__as_bool_member,
.allowed_as_vtask_arg = false,
},
/* TI_VAL_MPDATA */
Expand All @@ -439,6 +509,7 @@ static ti_val_type_t ti_val_type_props[22] = {
.to_client_pk = val__mpdata_to_client_pk,
.to_store_pk = (ti_val_to_store_pk_cb) ti_raw_mpdata_to_store_pk,
.get_type_str = val__mpdata_type_str,
.as_bool = val__as_bool_raw,
.allowed_as_vtask_arg = false,
},
/* TI_VAL_CLOSURE */
Expand All @@ -449,6 +520,7 @@ static ti_val_type_t ti_val_type_props[22] = {
.to_client_pk = val__closure_to_client_pk,
.to_store_pk = (ti_val_to_store_pk_cb) ti_closure_to_store_pk,
.get_type_str = val__closure_type_str,
.as_bool = val__as_bool_true,
.allowed_as_vtask_arg = false,
},
/* TI_VAL_FUTURE */
Expand All @@ -458,6 +530,7 @@ static ti_val_type_t ti_val_type_props[22] = {
.to_arr_cb = val__future_to_arr,
.to_client_pk = (ti_val_to_client_pk_cb) val__future_to_client_pk,
.get_type_str = val__future_type_str,
.as_bool = val__as_bool_true,
.allowed_as_vtask_arg = false,
},
/* TI_VAL_MODULE */
Expand All @@ -467,6 +540,7 @@ static ti_val_type_t ti_val_type_props[22] = {
.to_arr_cb = val__module_to_arr,
.to_client_pk = (ti_val_to_client_pk_cb) val__module_to_client_pk,
.get_type_str = val__module_type_str,
.as_bool = val__as_bool_true,
.allowed_as_vtask_arg = false,
},
/* TI_VAL_TEMPLATE */
Expand All @@ -478,6 +552,16 @@ static ti_val_type_t ti_val_type_props[22] = {

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

static inline _Bool val__as_bool_member(ti_val_t * val)
{
return ti_val(VMEMBER(val))->as_bool(VMEMBER(val));
}

static inline _Bool ti_val_as_bool(ti_val_t * val)
{
return ti_val(val)->as_bool(val);
}

static inline const char * ti_val_str(ti_val_t * val)
{
return ti_val(val)->get_type_str(val);
Expand Down
2 changes: 1 addition & 1 deletion inc/ti/version.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
* "-rc0"
* ""
*/
#define TI_VERSION_PRE_RELEASE "-alpha0"
#define TI_VERSION_PRE_RELEASE "-alpha1"

#define TI_MAINTAINER \
"Jeroen van der Heijden <[email protected]>"
Expand Down
1 change: 1 addition & 0 deletions itest/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,5 @@ COPY ./memleak.supp /memleak.supp
WORKDIR /itest
RUN pip install -r requirements.txt
ENV THINGSDB_BIN=/thingsdb
ENV THINGSDB_MEMCHECK=1
CMD [ "python", "run_all_tests.py" ]
26 changes: 22 additions & 4 deletions itest/lib/__init__.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
import asyncio
import logging
import random
import subprocess
from .testbase import TestBase
from .task import Task
from .cleanup import cleanup as clean
from .cleanup import killall
from .node import Node
from .color import Color
from .vars import THINGSDB_BIN
from .vars import THINGSDB_KEEP_ON_ERROR
from .vars import THINGSDB_LOGLEVEL
Expand Down Expand Up @@ -39,11 +41,27 @@ async def wrapped(self):
return wrapper


async def _run_test(test):
async def _run_test(test, hide_version: bool = False):
logger = logging.getLogger()
logger.setLevel(THINGSDB_LOGLEVEL)
task = Task(test.title)

if not hide_version:
try:
result = subprocess.run(
[THINGSDB_BIN, '--version'],
capture_output=True,
text=True,
check=True
)
out = result.stdout.strip()
lines = out.splitlines()
lines[0] = f' {lines[0]}'
out = '\n'.join(lines[:5])
print(Color.info(out))
except Exception:
pass

logging.info(f"""
Test Settings:
THINGSDB_BIN: {THINGSDB_BIN}
Expand All @@ -70,10 +88,10 @@ async def _run_test(test):
await task.task


def run_test(test: TestBase):
loop = asyncio.get_event_loop()
def run_test(test: TestBase, hide_version: bool = False):
loop = asyncio.new_event_loop()
clean()
loop.run_until_complete(_run_test(test))
loop.run_until_complete(_run_test(test, hide_version))


INT_MIN = -9223372036854775808
Expand Down
Loading