~ubuntuone-pqm-team/django/stable

« back to all changes in this revision

Viewing changes to django/utils/autoreload.py

  • Committer: Natalia
  • Date: 2014-12-05 15:21:13 UTC
  • Revision ID: natalia.bidart@ubuntu.com-20141205152113-cchtmygjia45gb87
Tags: 1.6.8
- Imported Django 1.6.8 from released tarball.

Show diffs side-by-side

added added

removed removed

Lines of Context:
28
28
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29
29
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
30
 
31
 
import os, sys, time, signal
 
31
import os, sys, time, signal, traceback
32
32
 
33
33
try:
34
34
    from django.utils.six.moves import _thread as thread
52
52
_mtimes = {}
53
53
_win = (sys.platform == "win32")
54
54
 
 
55
_error_files = []
 
56
 
55
57
def code_changed():
56
58
    global _mtimes, _win
57
 
    filenames = [getattr(m, "__file__", None) for m in sys.modules.values()]
58
 
    for filename in filter(None, filenames):
 
59
    filenames = []
 
60
    for m in list(sys.modules.values()):
 
61
        try:
 
62
            filenames.append(m.__file__)
 
63
        except AttributeError:
 
64
            pass
 
65
    for filename in filenames + _error_files:
 
66
        if not filename:
 
67
            continue
59
68
        if filename.endswith(".pyc") or filename.endswith(".pyo"):
60
69
            filename = filename[:-1]
61
70
        if filename.endswith("$py.class"):
71
80
            continue
72
81
        if mtime != _mtimes[filename]:
73
82
            _mtimes = {}
 
83
            try:
 
84
                del _error_files[_error_files.index(filename)]
 
85
            except ValueError:
 
86
                pass
74
87
            return True
75
88
    return False
76
89
 
 
90
def check_errors(fn):
 
91
    def wrapper(*args, **kwargs):
 
92
        try:
 
93
            fn(*args, **kwargs)
 
94
        except (ImportError, IndentationError, NameError, SyntaxError,
 
95
                TypeError, AttributeError):
 
96
            et, ev, tb = sys.exc_info()
 
97
 
 
98
            if getattr(ev, 'filename', None) is None:
 
99
                # get the filename from the last item in the stack
 
100
                filename = traceback.extract_tb(tb)[-1][0]
 
101
            else:
 
102
                filename = ev.filename
 
103
 
 
104
            if filename not in _error_files:
 
105
                _error_files.append(filename)
 
106
 
 
107
            raise
 
108
 
 
109
    return wrapper
 
110
 
77
111
def ensure_echo_on():
78
112
    if termios:
79
113
        fd = sys.stdin
142
176
        reloader = jython_reloader
143
177
    else:
144
178
        reloader = python_reloader
145
 
    reloader(main_func, args, kwargs)
 
179
 
 
180
    wrapped_main_func = check_errors(main_func)
 
181
    reloader(wrapped_main_func, args, kwargs)
146
182