class XMLCompareTestCase(unittest.TestCase): def setUp(self): self.tinfo = etree.parse(os.path.join(mydir, "worker-testinfo1.xml")).getroot() self.start = copy.deepcopy(self.tinfo.xpath("status[@id='start']")[0]) del self.start.attrib['id'] self.desired = copy.deepcopy(self.tinfo.xpath("status[@id='desired']")[0]) del self.desired.attrib['id'] self.xmlc = XMLCompare(self.start, self.desired) def test_constructor(self): print() # pprint.pprint(self.xmlc.byxpath) self.assertIn("/status/worker[@id='test']/orderedItems/item[@id='2']", self.xmlc.bystate['right']) def test_find_work(self): work = self.xmlc.find_work() print() pprint.pprint(self.xmlc.actions()) self.assertIn('/status/worker[@id=\'test\']/iniFile', work) self.assertNotIn("/status/worker[@id='test']/orderedItems", work) # quick memoization test work2 = self.xmlc.find_work() self.assertEqual(work, work2) def test_actions(self): print() pprint.pprint(self.xmlc.actions())
class Testinfo1Case(unittest.TestCase): def setUp(self): self.wdesc = WorkerDescription('test') self.rng = etree.RelaxNG(self.wdesc.desc) self.tinfo = etree.parse(os.path.join(mydir, "worker-testinfo1.xml")).getroot() # self.actions = {'add': set(), 'remove': set(), 'modify': set()} self.start = copy.deepcopy(self.tinfo.xpath("status[@id='start']")[0]) del self.start.attrib['id'] self.desired = copy.deepcopy(self.tinfo.xpath("status[@id='desired']")[0]) del self.desired.attrib['id'] self.comp = XMLCompare(self.start, self.desired) def populate_todo(self, setid): self.todo = set() for i in self.tinfo.xpath("todosets[@id='%s']" % setid)[0]: self.todo.add(MRXpath(t.get("id")).to_xpath()) def test_010_statuses_valid(self): self.rng.assertValid(self.start.xpath("worker[@id='test']")[0]) self.rng.assertValid(self.desired.xpath("worker[@id='test']")[0]) def test_020_wuwus_correct(self): self.assertFalse(self.wdesc.is_workunit("/worker")) self.assertTrue(self.wdesc.is_workunit("/worker/iniFile")) self.assertFalse(self.wdesc.is_workunit("/worker/iniFile/section")) self.assertFalse(self.wdesc.is_workunit("/worker/iniFile/section/keyvalue")) # self.assertFalse(self.wdesc.is_workunit("/worker/orderedItems")) self.assertTrue(self.wdesc.is_workunit("/worker/orderedItems/item")) # self.assertFalse(self.wdesc.is_workunit("/worker/unordered")) self.assertTrue(self.wdesc.is_workunit("/worker/unordered/item")) def test_030_generate_wus(self): # self.populate_actions(1) # start_st = Status(self.start, worker_prefix='/status') print() pprint.pprint(self.comp.actions()) mrx = MRXpath("/status/worker[@id='test']/orderedItems/item[@id='1']") for k in self.comp.bystate.keys(): if mrx.to_xpath() in self.comp.bystate[k]: print(k) wus, working = generate_wus(self.comp.find_work(), self.comp) for wu in wus: print() print(etree.tostring(wu)) # print() # print(etree.tostring(working)) def test_040_transform_deps(self): deps = self.desired.xpath('/status/deps')[0] wudeps = self.comp.wudeps(deps.iterchildren(etree.Element)) print() pprint.pprint(wudeps) import topsort wudeps.extend([["", x] for x in self.comp.find_work()]) i = 0 for lev in iter(topsort.topsort_levels(wudeps)): if lev == ['']: continue i += 1 wus, working = generate_wus(set(lev), self.comp) print("*********************************") print("* LEVEL: %d" % i) print("*********************************") for wu in wus: print(etree.tostring(wu))
from machination.xmltools import XMLCompare from machination.xmltools import generate_wus from machination.xmltools import mc14n import sys from lxml import etree import pprint left = mc14n(etree.parse(sys.argv[1])) right = mc14n(etree.parse(sys.argv[2])) # print(etree.tostring(left, pretty_print = True).decode()) # print(etree.tostring(right, pretty_print = True).decode()) deps = etree.fromstring("<status><deps/></status>")[0] comp = XMLCompare(left, right) wudeps = comp.wudeps(deps.iterchildren(tag=etree.Element)) pprint.pprint(comp.bystate) pprint.pprint(comp.actions()) pprint.pprint(comp.find_work()) wus, working = generate_wus(comp.find_work(), comp) for wu in wus: print(etree.tostring(wu, pretty_print=True).decode()) print(etree.tostring(working, pretty_print=True).decode())