From 9ce8421316e56cf0fd0fda2fb2a4369ec6fa8d43 Mon Sep 17 00:00:00 2001 From: Benedek Racz Date: Fri, 1 Nov 2019 16:43:43 +0100 Subject: [PATCH] [FIX] Refactored readConsole() fixes issue #10. --- issues/i10_parent.py | 52 ++++++++++++++++++++++--------------- issues/long_printer.py | 46 ++++++++++++++++---------------- wexpect.py | 59 +++++++++++++++++++----------------------- 3 files changed, 80 insertions(+), 77 deletions(-) diff --git a/issues/i10_parent.py b/issues/i10_parent.py index f43765b..5ffb479 100644 --- a/issues/i10_parent.py +++ b/issues/i10_parent.py @@ -18,36 +18,46 @@ child_script = here + '\\long_printer.py' def main(): longPrinter = python_executable + ' ' + child_script - prompt = '> ' + prompt = 'puskas> ' # Start the child process p = wexpect.spawn(longPrinter) # Wait for prompt p.expect(prompt) - for i in range(10): - p.sendline('0') - p.expect(prompt) - if p.before.splitlines()[1] != puskas_wiki[0]: - print(p.before.splitlines()[1]) - raise Exception() - - p.sendline('all') - p.expect(prompt) - for a,b in zip(p.before.splitlines()[1:-1], puskas_wiki): - if a!=b: - print(p.before.splitlines()[1:-1]) + try: + for i in range(10): + print('.', end='') + p.sendline('0') + p.expect(prompt) + if p.before.splitlines()[1] != puskas_wiki[0]: + print(p.before.splitlines()[1]) raise Exception() - for j, paragraph in enumerate(puskas_wiki): - p.sendline(str(j)) + p.sendline('all') p.expect(prompt) - if p.before.splitlines()[1] != paragraph: - print(p.before.splitlines()[1]) - print(i) - print(j) - print(paragraph) - raise Exception() + for a,b in zip(p.before.splitlines()[1:], puskas_wiki): + if a!=b: + print(a) + print(b) + raise Exception() + + for j, paragraph in enumerate(puskas_wiki): + p.sendline(str(j)) + p.expect(prompt) + if p.before.splitlines()[1] != paragraph: + print(p.before.splitlines()[1]) + print(i) + print(j) + print(paragraph) + raise Exception() + except: + p.interact() + time.sleep(5) + else: + print('') + print('[PASS]') + main() diff --git a/issues/long_printer.py b/issues/long_printer.py index 53523fa..6dcea86 100644 --- a/issues/long_printer.py +++ b/issues/long_printer.py @@ -5,53 +5,53 @@ This is is a very basic stdio handler script. This is used by python.py example. import time puskas_wiki = ['''Ferenc Puskas was a Hungarian footballer and manager, widely regarded as one of \ -the greatest players of all time. He is the son of former footballer Ferenc Puskás Senior. A \ +the greatest players of all time. He is the son of former footballer Ferenc Puskas Senior. A \ prolific forward, he scored 84 goals in 85 international matches for Hungary, played 4 \ international matches for Spain and scored 514 goals in 529 matches in the Hungarian and Spanish \ leagues. He became an Olympic champion in 1952 and led his nation to the final of the 1954 World \ Cup where he was named the tournament's best player. He won three European Cups (1959, 1960, 1966),\ - 10 national championships (5 Hungarian and 5 Spanish Primera División) and 8 top individual \ + 10 national championships (5 Hungarian and 5 Spanish Primera Division) and 8 top individual \ scoring honors. In 1995, he was recognized as the top scorer of the 20th century by the IFFHS.''', -'''Puskás started his career in Hungary playing for Kispest and Budapest Honvéd. He was the top scorer\ +'''Puskas started his career in Hungary playing for Kispest and Budapest Honved. He was the top scorer\ in the Hungarian League on four occasions, and in 1948, he was the top goal scorer in Europe. \ During the 1950s, he was both a prominent member and captain of the Hungarian national team, known\ as the Mighty Magyars. In 1958, two years after the Hungarian Revolution, he emigrated to Spain \ - where he played for Real Madrid. While playing with Real Madrid, Puskás won four Pichichis and \ + where he played for Real Madrid. While playing with Real Madrid, Puskas won four Pichichis and \ scored seven goals in two European Champions Cup finals.''', '''After retiring as a player, he became a coach. The highlight of his coaching career came in 1971 \ -when he guided Panathinaikos to the European Cup final, where they lost 2–0 to AFC Ajax. In 1993, \ +when he guided Panathinaikos to the European Cup final, where they lost 2-0 to AFC Ajax. In 1993, \ he returned to Hungary and took temporary charge of the Hungarian national team. In 1998, he \ -became one of the first ever FIFA/SOS Charity ambassadors. In 2002, the Népstadion in Budapest \ -was renamed the Puskás Ferenc Stadion in his honor. He was also declared the best Hungarian \ +became one of the first ever FIFA/SOS Charity ambassadors. In 2002, the Nepstadion in Budapest \ +was renamed the Puskas Ferenc Stadion in his honor. He was also declared the best Hungarian \ player of the last 50 years by the Hungarian Football Federation in the UEFA Jubilee Awards in \ -November 2003. In October 2009, FIFA announced the introduction of the FIFA Puskás Award, \ +November 2003. In October 2009, FIFA announced the introduction of the FIFA Puskas Award, \ awarded to the player who has scored the "most beautiful goal" over the past year. He was also \ -listed in Pelé's FIFA 100.''', +listed in Pele's FIFA 100.''', '''Ferenc Purczeld was born on 2 April 1927 to a German (Danube Swabian) family in Budapest and \ -brought up in Kispest, then a suburb, today part of the city. His mother, Margit Biró \ -(1904–1976), was a seamstress. He began his career as a junior with Kispest AC,[10] where his \ +brought up in Kispest, then a suburb, today part of the city. His mother, Margit Biro \ +(1904-1976), was a seamstress. He began his career as a junior with Kispest AC,[10] where his \ father, who had previously played for the club, was a coach. He had grandchildren, who were the \ children of his brothers son[clarification needed]; the two sons of his brother are Zoltan and \ -Istvan, the first one have 3 children; Ilonka, Camila and Andrés, and the second one have two.''', -'''He changed his name to Puskás. He initially used the pseudonym "Miklós Kovács" to help \ +Istvan, the first one have 3 children; Ilonka, Camila and Andres, and the second one have two.''', +'''He changed his name to Puskas. He initially used the pseudonym "Miklos Kovacs" to help \ circumvent the minimum age rules[12] before officially signing at the age of 12. Among his early \ -teammates was his childhood friend and future international teammate József Bozsik. He made his \ -first senior appearance for Kispest in November 1943 in a match against Nagyváradi AC.[13] It was \ -here where he got the nickname "Öcsi" or "Buddy".[14]''', +teammates was his childhood friend and future international teammate Jozsef Bozsik. He made his \ +first senior appearance for Kispest in November 1943 in a match against Nagyvaradi AC.[13] It was \ +here where he got the nickname "Ocsi" or "Buddy".[14]''', '''Kispest was taken over by the Hungarian Ministry of Defence in 1949, becoming the Hungarian Army \ -team and changing its name to Budapest Honvéd. As a result, football players were given military \ -ranks. Puskás eventually became a major (Hungarian: Őrnagy), which led to the nickname "The \ -Galloping Major".[15] As the army club, Honvéd used conscription to acquire the best Hungarian \ -players, leading to the recruitment of Zoltán Czibor and Sándor Kocsis.[16] During his career at \ -Budapest Honvéd, Puskás helped the club win five Hungarian League titles. He also finished as top \ -goal scorer in the league in 1947–48, 1949–50, 1950 and 1953, scoring 50, 31, 25 and 27 goals, \ +team and changing its name to Budapest Honved. As a result, football players were given military \ +ranks. Puskas eventually became a major (Hungarian: Ornagy), which led to the nickname "The \ +Galloping Major".[15] As the army club, Honved used conscription to acquire the best Hungarian \ +players, leading to the recruitment of Zoltan Czibor and Sandor Kocsis.[16] During his career at \ +Budapest Honved, Puskas helped the club win five Hungarian League titles. He also finished as top \ +goal scorer in the league in 1947-48, 1949-50, 1950 and 1953, scoring 50, 31, 25 and 27 goals, \ respectively. In 1948, he was the top goal scorer in Europe.[17]''' ] def main(): print('Welcome!') while True: - print('> ', end='') + print('puskas> ', end='') num = input() if num == 'exit': diff --git a/wexpect.py b/wexpect.py index e9778a0..42cc8ad 100644 --- a/wexpect.py +++ b/wexpect.py @@ -130,8 +130,8 @@ if 'dev' in __version__ : logger.setLevel(logging.DEBUG) else: logger.setLevel(logging.INFO) -fh = logging.FileHandler('wexpect.log') -formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') +fh = logging.FileHandler('wexpect.log', 'w', 'utf-8') +formatter = logging.Formatter('%(asctime)s - %(filename)s::%(funcName)s - %(levelname)s - %(message)s') fh.setFormatter(formatter) logger.addHandler(fh) @@ -2142,57 +2142,49 @@ class Wtty: self.switchBack() return wrote - def getPoint(self, offset): + def getCoord(self, offset): """Converts an offset to a point represented as a tuple.""" x = offset % self.__consSize[0] y = offset // self.__consSize[0] - return (x, y) + return win32console.PyCOORDType(x, y) - def getOffset(self, x, y): + def getOffset(self, coord): """Converts a tuple-point to an offset.""" - return x + y * self.__consSize[0] + return coord.X + coord.Y * self.__consSize[0] def readConsole(self, startCo, endCo): """Reads the console area from startCo to endCo and returns it as a string.""" + logger.info("STARTED") buff = [] self.lastRead = 0 - startX = startCo.X - startY = startCo.Y - endX = endCo.X - endY = endCo.Y - while True: - startOff = self.getOffset(startX, startY) - logger.info("startOff %s" % startOff) - endOff = self.getOffset(endX, endY) - logger.info("endOff %s" % endOff) + startOff = self.getOffset(startCo) + endOff = self.getOffset(endCo) readlen = endOff - startOff - logger.info("readlen %s" % readlen) - + + if readlen <= 0: + break + + logger.info("startOff: %d endOff: %d readlen: %d", startOff, endOff, readlen) + if readlen > 4000: readlen = 4000 - endPoint = self.getPoint(startOff + 4000) - logger.info("endPoint {}".format(endPoint)) - else: - endPoint = self.getPoint(endOff) - logger.info("endPoint {}".format(endPoint)) + endPoint = self.getCoord(startOff + readlen) + logger.info("endPoint {}".format(endPoint)) s = self.__consout.ReadConsoleOutputCharacter(readlen, startCo) - ln = len(s) - self.lastRead += ln - self.totalRead += ln + logger.info("len {}".format(len(s))) + self.lastRead += len(s) + self.totalRead += len(s) buff.append(s) - - startX, startY = endPoint[0], endPoint[1] - logger.info("startX %s startY %s" % (startX, startY)) - logger.info("endX %s endY %s" % (endX, endY)) - if readlen <= 0 or (startX >= endX and startY >= endY): - break + logger.info(s.replace(screenbufferfillchar, '*')) + + startCo = endPoint return ''.join(buff) @@ -2204,7 +2196,7 @@ class Wtty: strlist = [] for i, c in enumerate(s): if c == screenbufferfillchar: - if (self.totalRead - self.lastRead + i + 1) % 80 == 0: + if (self.totalRead - self.lastRead + i + 1) % self.__consSize[0] == 0: strlist.append('\r\n') else: strlist.append(c) @@ -2249,6 +2241,7 @@ class Wtty: raw = raw[self.__consSize[0]:] raw = ''.join(rawlist) s = self.parseData(raw) + logger.info(s) for i, line in enumerate(reversed(rawlist)): if line.endswith(screenbufferfillchar): # Record the Y offset where the most recent line break was detected @@ -2268,7 +2261,7 @@ class Wtty: if s: lastReadData = self.lastReadData - pos = self.getOffset(self.__currentReadCo.X, self.__currentReadCo.Y) + pos = self.getOffset(self.__currentReadCo) self.lastReadData = s if isSameY or not lastReadData.endswith('\r\n'): # Detect changed lines