diff --git a/setup.py b/setup.py index 1a9c080..2dc91c8 100644 --- a/setup.py +++ b/setup.py @@ -10,11 +10,11 @@ "Topic :: Software Development :: Libraries :: Python Modules" ], description="CS50 library for Python", - install_requires=["SQLAlchemy", "sqlparse", "termcolor"], + install_requires=["Flask>=1.0", "SQLAlchemy", "sqlparse", "termcolor"], keywords="cs50", name="cs50", package_dir={"": "src"}, packages=["cs50"], url="https://github.com/cs50/python-cs50", - version="2.4.1" + version="2.4.2" ) diff --git a/src/cs50/__init__.py b/src/cs50/__init__.py index d16e93c..206a03d 100644 --- a/src/cs50/__init__.py +++ b/src/cs50/__init__.py @@ -1,29 +1,6 @@ import os import sys - -class CustomImporter(object): - """ - Import cs50.SQL lazily so that rest of library can be used without SQLAlchemy installed. - - https://docs.python.org/3/library/imp.html - http://xion.org.pl/2012/05/06/hacking-python-imports/ - http://dangerontheranger.blogspot.com/2012/07/how-to-use-sysmetapath-with-python.html - """ - - def find_module(self, fullname, path=None): - if fullname == "cs50.SQL": - return self - return None - - def load_module(self, name): - if name in sys.modules: - return sys.modules[name] - from .sql import SQL - sys.modules[name] = SQL - return SQL - - try: # Save student's sys.path @@ -36,14 +13,14 @@ def load_module(self, name): from .cs50 import eprint, get_char, get_float, get_int, get_string try: from .cs50 import get_long - except Exception: + except ImportError: pass # Replace Flask's logger from . import flask - # Lazily load CS50.SQL - sys.meta_path.append(CustomImporter()) + # Wrap SQLAlchemy + from .sql import SQL finally: diff --git a/src/cs50/cs50.py b/src/cs50/cs50.py index 2fc4912..d9f0459 100644 --- a/src/cs50/cs50.py +++ b/src/cs50/cs50.py @@ -28,7 +28,25 @@ def write(self, x): self.f.flush() +class Reader: + """ + Disable buffering for input() as well. + + https://bugs.python.org/issue24402 + """ + + def __getattr__(self, name): + return getattr(sys.__stdin__, name) + + def fileno(): + raise OSError() + + def read(self, size): + return sys.__stdin__.read(size) + + sys.stderr = flushfile(sys.stderr) +sys.stdin = Reader() sys.stdout = flushfile(sys.stdout) diff --git a/src/cs50/flask.py b/src/cs50/flask.py index e55bf22..ad79283 100644 --- a/src/cs50/flask.py +++ b/src/cs50/flask.py @@ -6,28 +6,15 @@ # Try to monkey-patch Flask, if installed try: - # Only patch 0.12 (in case logging changes in 0.13) + # Only patch >= 1.0 version = StrictVersion(get_distribution("flask").version) - assert version >= StrictVersion("0.10") and version < StrictVersion("0.13") - - # Get default logger + assert version >= StrictVersion("1.0") import flask.logging - f = flask.logging.create_logger - - def create_logger(app): - """Wrap default logger""" - - # Create default logger - logger = f(app) - - # Reformat default logger's exceptions - # https://docs.python.org/3/library/logging.html#logging.Formatter.formatException - for handler in logger.handlers: - handler.formatter.formatException = lambda exc_info: formatException(*exc_info) - return logger - # Replace default logger - flask.logging.create_logger = create_logger + # Reformat logger's exceptions + # http://flask.pocoo.org/docs/1.0/logging/ + # https://docs.python.org/3/library/logging.html#logging.Formatter.formatException + flask.logging.default_handler.formatter.formatException = lambda exc_info: formatException(*exc_info) except: pass