def _parse_default(cls, cmd): return for sub in cmd(sd.AlterObjectProperty): if sub.property == 'default': if isinstance(sub.new_value, sexpr.ExpressionText): expr = edgeql.parse(sub.new_value) if expr.op == qlast.UNION: candidates = [] cls._extract_union_operands(expr, candidates) deflt = [] for candidate in candidates: cexpr = candidate.result if isinstance(cexpr, qlast.Constant): deflt.append(cexpr.value) else: text = edgeql.generate_source(candidate, pretty=False) deflt.append(sexpr.ExpressionText(text)) else: deflt = [sub.new_value] else: deflt = [sub.new_value] sub.new_value = deflt
def _get_ast(self, schema, context): value = self.new_value new_value_empty = \ (value is None or (isinstance(value, collections.abc.Container) and not value)) old_value_empty = \ (self.old_value is None or (isinstance(self.old_value, collections.abc.Container) and not self.old_value)) if new_value_empty and not old_value_empty: op = qlast.DropAttributeValue( name=qlast.ObjectRef(module='', name=self.property)) return op if new_value_empty and old_value_empty: return if isinstance(value, s_expr.ExpressionText): value = edgeql.parse(str(value)) elif utils.is_nontrivial_container(value): value = qlast.Tuple(elements=[ qlast.BaseConstant.from_python(el) for el in value ]) else: value = qlast.BaseConstant.from_python(value) as_expr = isinstance(value, qlast.ExpressionText) op = qlast.SetField( name=qlast.ObjectRef(module='', name=self.property), value=value, as_expr=as_expr) return op
def parse_edgeql(expr: str, ctx, *, offset_column=0, indent=0): try: node = edgeql.parse(expr) except parsing.ParserError as err: context.rebase_context( ctx, get_context(err, parsing.ParserContext), offset_column=offset_column, indent=indent) raise err from None context.rebase_ast_context(ctx, node, offset_column=offset_column, indent=indent) return node
def _get_ast(self, context): value = self.new_value new_value_empty = \ (value is None or (isinstance(value, collections.Container) and not value)) old_value_empty = \ (self.old_value is None or (isinstance(self.old_value, collections.Container) and not self.old_value)) if new_value_empty and not old_value_empty: op = qlast.DropAttributeValue( name=qlast.ObjectRef(module='', name=self.property)) return op if new_value_empty and old_value_empty: return if isinstance(value, s_expr.ExpressionText): value = edgeql.parse(str(value)) elif utils.is_nontrivial_container(value): value = qlast.Tuple(elements=[ qlast.Constant(value=el) for el in value ]) elif isinstance(value, nlang.WordCombination): forms = value.as_dict() if len(forms) > 1: items = [] for k, v in forms.items(): items.append(( qlast.Constant(value=k), qlast.Constant(value=v) )) value = qlast.Array(elements=[ qlast.Tuple(elements=[k, v]) for k, v in items ]) else: value = qlast.Constant(value=str(value)) else: value = qlast.Constant(value=value) as_expr = isinstance(value, qlast.ExpressionText) op = qlast.CreateAttributeValue( name=qlast.ObjectRef(module='', name=self.property), value=value, as_expr=as_expr) return op