From 870a0bcb1cef8624277b9a6eabe885a30b669504 Mon Sep 17 00:00:00 2001 From: adrianliaw Date: Fri, 21 Nov 2014 14:57:07 +0800 Subject: [PATCH] delete tests --- pycuber/__init__.py | 2 +- setup.py | 79 ++++++++++++--- solver/{cfop/tests => }/__init__.py | 0 solver/cfop/algo_fetcher.py | 150 ---------------------------- solver/cfop/tests/cross_tests.py | 35 ------- solver/cfop/tests/f2l_tests.py | 47 --------- solver/cfop/tests/oll_tests.py | 38 ------- solver/cfop/tests/pll_tests.py | 45 --------- 8 files changed, 64 insertions(+), 332 deletions(-) rename solver/{cfop/tests => }/__init__.py (100%) delete mode 100644 solver/cfop/algo_fetcher.py delete mode 100644 solver/cfop/tests/cross_tests.py delete mode 100644 solver/cfop/tests/f2l_tests.py delete mode 100644 solver/cfop/tests/oll_tests.py delete mode 100644 solver/cfop/tests/pll_tests.py diff --git a/pycuber/__init__.py b/pycuber/__init__.py index 69131c9..7ea46db 100644 --- a/pycuber/__init__.py +++ b/pycuber/__init__.py @@ -3,6 +3,6 @@ __all__ = ["Cube", "Cubie", "Centre", "Corner", "Edge", "Square", "Step", "Algo"] __title__ = "PyCuber" -__version__ = "0.1b2" +__version__ = "0.1b3" __author__ = "Adrian Liaw" __license__ = "MIT" diff --git a/setup.py b/setup.py index 9ba749c..9ade986 100644 --- a/setup.py +++ b/setup.py @@ -1,23 +1,70 @@ from setuptools import setup -import os -def read(*paths): - """Build a file path from *paths* and return the contents.""" - with open(os.path.join(*paths), 'r') as f: - return f.read() +long_desc = """ +PyCuber +======= + +PyCuber is a Rubik’s Cube simulator in Python 2/3. +-------------------------------------------------- + +The cube can be revealed as expanded view in the terminal, so it’s easy +to visualise the cube, just inside the terminal. + +.. code:: python + + + import pycuber as pc + + # Create a Cube object + mycube = pc.Cube() + + # Do something at the cube. + mycube("R U R' U'") + + print(mycube) + +.. figure:: https://raw.github.com/adrianliaw/PyCuber/v0.1b/static/img/terminal.png + :alt: alt tag + + alt tag +We also provided some useful tools to deal with Rubik’s Cube algorithms. + +.. code:: python + + + import pycuber as pc + + # Create an Algo object + myalg = pc.Algo("R U R' U' R' F R2 U' R' U' R U R' F'") + + # Reversing an Algo + myalg.reverse() + print(myalg) + + # Mirroring an Algo object + myalg.mirror("LR") + print(myalg) + +:: + + F R U' R' U R U R2 F' R U R U' R' + F' L' U L U' L' U' L2 F L' U' L' U L + +I’ll add some documentations later. +""" setup( - name="pycuber", - version="0.1b2", - description="Rubik's Cube in Python", - long_description="See http://github.com/adrianliaw/PyCuber", - url="http://github.com/adrianliaw/PyCuber", - license="MIT", - author="Adrian Liaw", - author_email="adrianliaw2000@gmail.com", - packages=["pycuber"], - package_dir={"pycuber":"pycuber"}, - classifiers=[ + name = "pycuber", + version = "0.1b3", + description = "Rubik's Cube in Python", + long_description = long_desc, + url = "http://github.com/adrianliaw/PyCuber", + license = "MIT", + author = "Adrian Liaw", + author_email = "adrianliaw2000@gmail.com", + packages = ["pycuber"], + package_dir = {"pycuber":"pycuber"}, + classifiers = [ "Development Status :: 4 - Beta", "Environment :: Console", "Intended Audience :: Science/Research", diff --git a/solver/cfop/tests/__init__.py b/solver/__init__.py similarity index 100% rename from solver/cfop/tests/__init__.py rename to solver/__init__.py diff --git a/solver/cfop/algo_fetcher.py b/solver/cfop/algo_fetcher.py deleted file mode 100644 index 1dcc02c..0000000 --- a/solver/cfop/algo_fetcher.py +++ /dev/null @@ -1,150 +0,0 @@ -from io import BytesIO -from PIL import Image -from bs4 import BeautifulSoup -import requests -import csv - -prefix = "http://cubewhiz.com/" - -def get_oll_algos(soup): - tbodies = soup.find_all("tbody") - result = [] - for tbody in tbodies: - algos = tbody.find_all("tr")[1:] - for a in algos: - print("Algorithm found: O{0:02d}".format(int(a.td.get_text()))) - info = a.find_all("td") - entry = [] - entry.append(int(info[0].get_text())) - entry.append(oll_case_identifier(oll_img(str(info[1].img["src"])))) - print(info[2].get_text()) - if entry[0] == 19: - entry.append(str(info[2].b.get_text().replace("(", "", 10).replace(")", "", 10)) + " x'") - elif entry[0] == 31: - entry.append("R' U' F U R U' R' F' R") - else: - entry.append(str(info[2].b.get_text().replace("(", "", 10).replace(")", "", 10))) - result.append(tuple(entry)) - result.sort() - return result - -def oll_img(url): - pic = requests.get(prefix + url) - while pic.status_code >= 500: - pic = requests.get(prefix + url) - while True: - try: - image = Image.open(BytesIO(pic.content)) - image = image.convert("RGB") - print("Image loaded: {0}".format(url)) - return image - except IOError: - continue - -def oll_case_identifier(image): - result = "" - for point in [(0, 13), (0, 38), (0, 63), (13, 75), (38, 75), (63, 75), (75, 63), (75, 38), (75, 13), (63, 0), (38, 0), (13, 0)]: - result += str(int(image.getpixel(point) == (255, 255, 0))) - print("Result case identifier: {0}".format(result)) - return result - -def write_oll_file(algoset, filename): - with open(filename, "w") as f: - writer = csv.writer(f, delimiter=",") - print("Writing into {0}...".format(filename)) - for a in algoset: - writer.writerow(["O{0:02d}".format(a[0])] + list(a[1:])) - print("Successfully wrote into file.") - return True - -def oll_algos(): - print("Starting...") - page = requests.get(prefix + "oll.php") - print("Page loaded.") - soup = BeautifulSoup(page.text) - print("Page parsed.") - algoset = get_oll_algos(soup) - print("Algorithm set:") - for alg in algoset: - print(alg) - write_oll_file(algoset, "oll_algos.csv") - print("Ended.") - -def get_pll_algos(soup1, soup2): - tbodies1 = soup1.find_all("tbody") - tbodies2 = soup2.find_all("tbody") - result = [] - for i in range(len(tbodies1)): - tbody1 = tbodies1[i] - tbody2 = tbodies2[i] - algos = tbody1.find_all("tr")[1:] - views = tbody2.find_all("tr")[1:] - for j in range(len(algos)): - a = algos[j] - v = views[j] - print("Algorithm found: {0}-perm".format(a.td.get_text())) - info = a.find_all("td") - entry = [] - entry.append(info[0].get_text()) - entry.append(pll_case_identifier(info[0].get_text())) - print(info[2].get_text()) - entry.append(str(info[2].b.get_text().replace("(", "", 10).replace(")", "", 10).split("\r\n")[0])) - result.append(tuple(entry)) - result.sort() - return result - -def pll_case_identifier(case_name): - views = [] - for i in range(1, 5): - if len(views) < i: - img = requests.get(prefix + "images/pllrec/{0}view{1}.gif".format(case_name, (i if case_name not in "AaAbE" else i%4+1))) - while img.status_code >= 500: - img = requests.get(prefix + "images/pllrec/{0}view{1}.gif".format(case_name, (i if case_name not in "AaAbE" else i%4+1))) - while True: - try: - views.append(Image.open(BytesIO(img.content)).convert("RGB")) - print("Image loaded: {0}".format("images/pllrec/{0}view{1}.gif".format(case_name, (i if case_name not in "AaAbE" else i%4+1)))) - except IOError: - continue - else: - break - result = "" - for img in views: - for point in [(20, 50), (35, 60), (55, 70)]: - colour = img.getpixel(point) - if colour == (237, 0, 0): result += "F" if case_name not in "AaAbE" else "L" - elif colour == (0, 216, 0): result += "R" if case_name not in "AaAbE" else "F" - elif colour == (254, 160, 0): result += "B" if case_name not in "AaAbE" else "R" - elif colour == (0, 0, 241): result += "L" if case_name not in "AaAbE" else "B" - result = result[-3:] + result[:-3] - print("Result case identifier: {0}".format(result)) - return result - -def write_pll_file(algoset, filename): - with open(filename, "w") as f: - writer = csv.writer(f, delimiter=",") - print("Writing into {0}...".format(filename)) - for a in algoset: - writer.writerow(["{0}-perm".format(a[0])] + list(a[1:])) - print("Successfully wrote into file.") - return True - -def pll_algos(): - print("Starting...") - page = requests.get(prefix + "pll.php") - print("Page1 loaded") - rec_page = requests.get(prefix + "pllrecognition.php") - print("Page2 loaded") - soup1 = BeautifulSoup(page.content) - print("Page1 parsed") - soup2 = BeautifulSoup(rec_page.content) - print("Page2 parsed") - algoset = get_pll_algos(soup1, soup2) - print("Algorithm set:") - for algo in algoset: - print(algo) - write_pll_file(algoset, "pll_algos.csv") - print("Ended.") - - - diff --git a/solver/cfop/tests/cross_tests.py b/solver/cfop/tests/cross_tests.py deleted file mode 100644 index f76aac8..0000000 --- a/solver/cfop/tests/cross_tests.py +++ /dev/null @@ -1,35 +0,0 @@ -from pycuber import * -from .. import cross -import sys - -class CrossTester(object): - """ - Tester for CrossSolver. - """ - def __init__(self): - self.history = [] - - def test(self): - scramble = Algo().random() - cube = Cube()(scramble) - solver = cross.CrossSolver(cube) - record = (cube.copy(), ) - result = solver.solve() - record += (result, solver.is_solved()) - try: - assert record[-1] - except AssertionError: - print("TEST DIDN'T PASS : ") - print(record[0]) - print(record[1]) - print(cube) - raise AssertionError() - self.history.append(record) - return True - - def suite(self, n=10): - for i in range(n): - self.test() - print("TEST#{0} PASSED".format(n+1)) - print("TEST PASSED") - return True diff --git a/solver/cfop/tests/f2l_tests.py b/solver/cfop/tests/f2l_tests.py deleted file mode 100644 index c7636e6..0000000 --- a/solver/cfop/tests/f2l_tests.py +++ /dev/null @@ -1,47 +0,0 @@ -from pycuber import * -from .. import f2l -import random -from collections import OrderedDict - -class F2LTester(object): - """ - Tester for F2LSolver. - """ - def __init__(self): - self.history = [] - @staticmethod - def random_cube(): - result = Cube() - algos = [ - "R U R'", "R U2 R'", "R U' R'", "R' U R", "R' U2 R", "R' U' R", - "L U L'", "L U2 L'", "L U' L'", "L' U L", "L' U2 L", "L' U' L", - "F U F'", "F U2 F'", "F U' F'", "F' U F", "F' U2 F", "F' U' F", - "B U B'", "B U2 B'", "B U' B'", "B' U B", "B' U2 B", "B' U' B", - ] - for i in range(10): - result(random.choice(algos)) - return result - def test(self): - cube = self.random_cube() - record = (cube.copy(), OrderedDict()) - solver = f2l.F2LSolver(cube) - for slot, res in solver.solve(): - record[1][slot] = res - record += (solver.is_solved(), ) - try: - assert record[-1] - except AssertionError: - print("TEST DIDN'T PASS : ") - print(record[0]) - print(record[1]) - print(cube) - raise AssertionError() - self.history.append(record) - return True - def suite(self, n=10): - for i in range(n): - self.test() - print("TEST PASSED") - return True - - diff --git a/solver/cfop/tests/oll_tests.py b/solver/cfop/tests/oll_tests.py deleted file mode 100644 index 57f52d3..0000000 --- a/solver/cfop/tests/oll_tests.py +++ /dev/null @@ -1,38 +0,0 @@ -from pycuber import * -from .. import oll -import random - -class OLLTester(object): - def __init__(self): - self.history = [] - @staticmethod - def random_cube(): - result = Cube() - algos = list(oll.algo_dict.values()) - for i in range(10): - result(Algo(random.choice(algos))) - return result - def test(self): - solver = oll.OLLSolver() - record = () - cube = self.random_cube() - record += (cube.copy(),) - solver.feed(cube) - record += (solver.solve(),) - record += (solver.is_solved(),) - try: - assert record[-1] - self.history.append(record) - except AssertionError: - print("TEST DIDN'T PASS : ") - print(record[0]) - print(record[1]) - print(cube) - raise AssertionError() - return True - def suite(self, n=100): - for i in range(n): - self.test() - print("TEST PASSED") - return True - diff --git a/solver/cfop/tests/pll_tests.py b/solver/cfop/tests/pll_tests.py deleted file mode 100644 index 49a192e..0000000 --- a/solver/cfop/tests/pll_tests.py +++ /dev/null @@ -1,45 +0,0 @@ -from pycuber import * -from .. import pll -import random - -class PLLTester(object): - def __init__(self): - self.history = [] - @staticmethod - def random_cube(): - result = Cube() - choices = ["R U' R U R U R U' R' U' R2", - "R2 U R U R' U' R' U' R' U R'", - "R B' R F2 R' B R F2 R2", - "L' B L' F2 L B' L' F2 L2", - ] - for i in range(10): - result(random.choice([None, "U", "U2", "U'"]) or []) - result(random.choice([None, "y", "y2", "y'"]) or []) - result(random.choice(choices)) - return result - def test(self): - solver = pll.PLLSolver() - record = () - cube = self.random_cube() - record += (cube.copy(), ) - solver.feed(cube) - record += (solver.solve(), ) - record += (solver.is_solved(), ) - try: - assert record[-1] - self.history.append(record) - except AssertionError: - print("TEST DIDN'T PASS : ") - print(record[0]) - print(record[1]) - print(cube) - raise AssertionError() - return True - def suite(self, n=100): - for i in range(n): - self.test() - print("TEST PASSED") - return True - -