def asxnd(self, model="simple"):
     e = xnd.Element(None, str(self[name][0].content))
     empty = None
     node = misc.first(self[bodycontent], None)
     if node is not None:
         value = str(node[0].content)
         if value in ("tagdependent", "JSP"):
             empty = False
         elif value == "empty":
             empty = True
         else:
             raise ValueError(
                 "value {!r} is not allowed for tag <bodycontent>".format(
                     value))
     if model != "none":
         if model == "simple":
             e.modeltype = not empty
         else:
             e.modeltype = "sims.Empty" if empty else "sims.Any"
     node = misc.first(self[info], None)
     if node is not None:
         e.doc = node.asxnd(model=model)
     for attr in self[attribute]:
         e += attr.asxnd(model=model)
     return e
Beispiel #2
0
 def asxnd(self, model="simple"):
     ns = xnd.Module()
     node = misc.first(self[uri], None)
     xmlns = str(node[0].content) if node is not None else None
     node = misc.first(self[info], None)
     if node is not None:
         ns.doc = node.asxnd(model=model)
     for node in self[tag]:
         e = node.asxnd(model=model)
         if xmlns is not None and isinstance(e, xnd.Element):
             e.xmlns = xmlns
         ns += e
     return ns
	def asxnd(self, model="simple"):
		ns = xnd.Module()
		node = misc.first(self[uri], None)
		xmlns = str(node[0].content) if node is not None else None
		node = misc.first(self[info], None)
		if node is not None:
			ns.doc = node.asxnd(model=model)
		for node in self[tag]:
			e = node.asxnd(model=model)
			if xmlns is not None and isinstance(e, xnd.Element):
				e.xmlns = xmlns
			ns += e
		return ns
	def asxnd(self, model="simple"):
		isrequired = False
		node = misc.first(self[required], None)
		if node is not None:
			value = str(node).strip()
			if value in ("true", "yes"):
				isrequired = True
			elif value not in ("false", "no"):
				raise ValueError(f"value {value!r} not allowed for tag <required>")
		return xnd.Attr(str(self[name][0].content), "xsc.TextAttr", isrequired)
Beispiel #5
0
 def asxnd(self, model="simple"):
     isrequired = False
     node = misc.first(self[required], None)
     if node is not None:
         value = str(node).strip()
         if value in ("true", "yes"):
             isrequired = True
         elif value not in ("false", "no"):
             raise ValueError(
                 f"value {value!r} not allowed for tag <required>")
     return xnd.Attr(str(self[name][0].content), "xsc.TextAttr", isrequired)
	def asxnd(self, model="simple"):
		e = xnd.Element(None, str(self[name][0].content))
		empty = None
		node = misc.first(self[bodycontent], None)
		if node is not None:
			value = str(node[0].content)
			if value in ("tagdependent", "JSP"):
				empty = False
			elif value == "empty":
				empty = True
			else:
				raise ValueError(f"value {value!r} is not allowed for tag <bodycontent>")
		if model != "none":
			if model == "simple":
				e.modeltype = not empty
			else:
				e.modeltype = "sims.Empty" if empty else "sims.Any"
		node = misc.first(self[info], None)
		if node is not None:
			e.doc = node.asxnd(model=model)
		for attr in self[attribute]:
			e += attr.asxnd(model=model)
		return e
Beispiel #7
0
def test_walkgetitem():
    e = html.div(1, html.div(2, html.div(3)))
    isdiv = xfind.selector(html.div)

    # Test ``walknodes``
    assert str(misc.first(e.walknodes(isdiv))) == "123"
    assert str(misc.last(e.walknodes(isdiv))) == "3"
    misc.item(e.walknodes(isdiv), 3) is None
    misc.item(e.walknodes(isdiv), -4) is None

    # Test ``walkpaths``
    assert str(misc.item(e.walkpaths(isdiv), (0, -1))) == "123"
    assert str(misc.item(e.walkpaths(isdiv), (-1, -1))) == "3"
    misc.item(e.walkpaths(isdiv), 3) is None
    misc.item(e.walkpaths(isdiv), -4) is None
def makexnd(stream, encoding=None, shareattrs="dupes", model="simple"):
	# :obj:`stream` can be a stream, an :class:`URL` or ``str``/``bytes``
	encoding = None
	if isinstance(stream, str):
		encoding = "utf-8"
		stream = stream.encode(encoding)
	node = parse.tree(stream, parse.Expat(encoding=encoding), parse.NS(tld), parse.Node())

	# get and convert the taglib object
	xnd = misc.first(node.walknodes(tld.taglib)).asxnd(model=model)

	if shareattrs=="dupes":
		xnd.shareattrs(False)
	elif shareattrs=="all":
		xnd.shareattrs(True)
	return xnd
Beispiel #9
0
def makexnd(stream, encoding=None, shareattrs="dupes", model="simple"):
	# :obj:`stream` can be a stream, an :class:`URL` or ``str``/``bytes``
	encoding = None
	if isinstance(stream, str):
		encoding = "utf-8"
		stream = stream.encode(encoding)
	node = parse.tree(stream, parse.Expat(encoding=encoding), parse.NS(tld), parse.Node())

	# get and convert the taglib object
	xnd = misc.first(node.walknodes(tld.taglib)).asxnd(model=model)

	if shareattrs=="dupes":
		xnd.shareattrs(False)
	elif shareattrs=="all":
		xnd.shareattrs(True)
	return xnd
	def _alarm_fork(self, signum, frame):
		pids = self._kill_children()
		maxtime = self.getmaxtime()
		self.endtime = datetime.datetime.now()
		exc = RuntimeError(f"maximum runtime {maxtime} exceeded in forked child (pid {misc.sysinfo.pid})")
		if self.noisykills:
			self.log.email(exc)
		else:
			self.log(exc)
		if len(pids) == 1:
			pid = misc.first(pids)
			self.log.sisyphus.result.kill(f"Terminated child {pid} after {maxtime}")
		else:
			pids = ", ".join(str(pid) for pid in pids)
			self.log.sisyphus.result.kill(f"Terminated children {pids} after {maxtime}")
		for logger in self._loggers:
			logger.close()
		os._exit(1)
def test_walkgetitem():
	e = html.div(
		1,
		html.div(
			2,
			html.div(
				3
			)
		)
	)
	isdiv = xfind.selector(html.div)

	# Test ``walknodes``
	assert str(misc.first(e.walknodes(isdiv))) == "123"
	assert str(misc.last(e.walknodes(isdiv))) == "3"
	misc.item(e.walknodes(isdiv), 3) is None
	misc.item(e.walknodes(isdiv), -4) is None

	# Test ``walkpaths``
	assert str(misc.item(e.walkpaths(isdiv), (0, -1))) == "123"
	assert str(misc.item(e.walkpaths(isdiv), (-1, -1))) == "3"
	misc.item(e.walkpaths(isdiv), 3) is None
	misc.item(e.walkpaths(isdiv), -4) is None
def main(args=None):
	p = argparse.ArgumentParser(description="Check Oracle database schema for cyclic foreign key references", epilog="For more info see http://python.livinglogic.de/orasql_scripts_oracycles.html")
	p.add_argument("connectstring", help="Oracle connect string")
	p.add_argument("-v", "--verbose", dest="verbose", help="Give a progress report? (default %(default)s)", action=misc.FlagAction, default=False)
	p.add_argument("-c", "--color", dest="color", help="Color output (default %(default)s)", default="auto", choices=("yes", "no", "auto"))

	args = p.parse_args(args)

	if args.color == "yes":
		color = True
	elif args.color == "no":
		color = False
	else:
		color = None

	stdout = astyle.Stream(sys.stdout, color)
	stderr = astyle.Stream(sys.stderr, color)

	connection = orasql.connect(args.connectstring)

	cs = s4connectstring(connection.connectstring())

	refs = {} # type: Dict[Table, Tuple[ForeignKey, Table]]

	# Collect tables
	tables = list(connection.tables())

	# Collect foreign keys from tables
	for (i, table) in enumerate(tables, 1):
		if args.verbose:
			stderr.writeln("oracycles.py: ", cs, f": Collecting fks from table #{i:,}/{len(tables):,} ", s4object(table.name), f" -> {len(refs):,} found")
		for constraint in list(table.constraints()):
			if isinstance(constraint, orasql.ForeignKey):
				pk = constraint.refconstraint()
				if isinstance(pk, orasql.PrimaryKey):
					if table not in refs:
						refs[table] = []
					reftable = pk.table()
					refs[table].append((constraint, reftable))

	# Find cycles in foreign keys
	cycles = {}

	def collect(path):
		for i in range(len(path)-2, 0, -1):
			if path[i] == path[-1]:
				cyclepath  = path[i:]
				pathkey = frozenset(cyclepath)
				if pathkey not in cycles:
					cycles[pathkey] = cyclepath
				return

	def findcycles(path):
		table = path[-1]
		if table in refs:
			for (constraint, reftable) in refs[table]:
				path.append(constraint)
				cycle = reftable in path
				path.append(reftable)
				if cycle:
					collect(path)
				else:
					findcycles(path)
				path.pop()
				path.pop()

	for (i, table) in enumerate(tables, 1):
		if args.verbose:
			stderr.writeln("oracycles.py: ", cs, f": Testing table #{i:,}/{len(tables):,} ", s4object(table.name), f" for cycles -> {len(cycles):,} found")
		findcycles([table])

	# Sort and output result
	def pathstr(path):
		v = []
		for obj in path:
			if isinstance(obj, orasql.ForeignKey):
				v.append(f"{misc.first(obj.columns()).name}({obj.name})")
			else:
				v.append(obj.name)
		return " -> ".join(v)

	cycles = sorted(cycles.values(), key=pathstr)

	for path in cycles:
		for (i, obj) in enumerate(path):
			if i:
				stdout.write(" -> ")
			if isinstance(obj, orasql.ForeignKey):
				stdout.write(s4object(misc.first(obj.columns()).name), "(", s4object(obj.name), ")")
			else:
				stdout.write(s4object(obj.name))
		stdout.writeln()
def test_first():
    e = iter(range(10))
    assert misc.first(e) == 0
    assert misc.first(e) == 1
    assert misc.first([]) is None
    assert misc.first([], 42) == 42
Beispiel #14
0
def main(args=None):
    p = argparse.ArgumentParser(
        description=
        "Check Oracle database schema for cyclic foreign key references",
        epilog=
        "For more info see http://python.livinglogic.de/orasql_scripts_oracycles.html"
    )
    p.add_argument("connectstring", help="Oracle connect string")
    p.add_argument("-v",
                   "--verbose",
                   dest="verbose",
                   help="Give a progress report? (default %(default)s)",
                   action=misc.FlagAction,
                   default=False)
    p.add_argument("-c",
                   "--color",
                   dest="color",
                   help="Color output (default %(default)s)",
                   default="auto",
                   choices=("yes", "no", "auto"))

    args = p.parse_args(args)

    if args.color == "yes":
        color = True
    elif args.color == "no":
        color = False
    else:
        color = None

    stdout = astyle.Stream(sys.stdout, color)
    stderr = astyle.Stream(sys.stderr, color)

    connection = orasql.connect(args.connectstring)

    cs = s4connectstring(connection.connectstring())

    refs = {}  # type: Dict[Table, Tuple[ForeignKey, Table]]

    # Collect tables
    tables = list(connection.tables())

    # Collect foreign keys from tables
    for (i, table) in enumerate(tables, 1):
        if args.verbose:
            stderr.writeln(
                "oracycles.py: ", cs,
                f": Collecting fks from table #{i:,}/{len(tables):,} ",
                s4object(table.name), f" -> {len(refs):,} found")
        for constraint in list(table.constraints()):
            if isinstance(constraint, orasql.ForeignKey):
                pk = constraint.refconstraint()
                if isinstance(pk, orasql.PrimaryKey):
                    if table not in refs:
                        refs[table] = []
                    reftable = pk.table()
                    refs[table].append((constraint, reftable))

    # Find cycles in foreign keys
    cycles = {}

    def collect(path):
        for i in range(len(path) - 2, 0, -1):
            if path[i] == path[-1]:
                cyclepath = path[i:]
                pathkey = frozenset(cyclepath)
                if pathkey not in cycles:
                    cycles[pathkey] = cyclepath
                return

    def findcycles(path):
        table = path[-1]
        if table in refs:
            for (constraint, reftable) in refs[table]:
                path.append(constraint)
                cycle = reftable in path
                path.append(reftable)
                if cycle:
                    collect(path)
                else:
                    findcycles(path)
                path.pop()
                path.pop()

    for (i, table) in enumerate(tables, 1):
        if args.verbose:
            stderr.writeln("oracycles.py: ", cs,
                           f": Testing table #{i:,}/{len(tables):,} ",
                           s4object(table.name),
                           f" for cycles -> {len(cycles):,} found")
        findcycles([table])

    # Sort and output result
    def pathstr(path):
        v = []
        for obj in path:
            if isinstance(obj, orasql.ForeignKey):
                v.append(f"{misc.first(obj.columns()).name}({obj.name})")
            else:
                v.append(obj.name)
        return " -> ".join(v)

    cycles = sorted(cycles.values(), key=pathstr)

    for path in cycles:
        for (i, obj) in enumerate(path):
            if i:
                stdout.write(" -> ")
            if isinstance(obj, orasql.ForeignKey):
                stdout.write(s4object(misc.first(obj.columns()).name), "(",
                             s4object(obj.name), ")")
            else:
                stdout.write(s4object(obj.name))
        stdout.writeln()