Codebase list python-livereload / 7fc4d7b
Update upstream source from tag 'upstream/2.6.3' Update to upstream version '2.6.3' with Debian dir c9638a728d82f50d1ea027ece5d35c41384d9617 Pierre-Elliott Bécue 3 years ago
7 changed file(s) with 124 addition(s) and 20 deletion(s). Raw diff Collapse all Expand all
0 # These are supported funding model platforms
1
2 github: [lepture]
3 patreon: lepture
4 tidelift: pypi/livereload
5 custom: https://lepture.com/donate
11 =========
22
33 The full list of changes between each Python LiveReload release.
4
5 Version 2.6.3
6 -------------
7
8 Released on August 22, 2020
9
10 1. Support for custom default filenames.
11
12
13 Version 2.6.2
14 -------------
15
16 Released on June 6, 2020
17
18 1. Support for Python 2.8
19 2. Enable adding custom headers to response.
20 3. Updates for Python 2.7 support.
21 4. Support for use with a reverse proxy.
22 5. Other bug fixes.
23
424
525 Version 2.6.1
626 -------------
106106 # delay 2 seconds for reloading
107107 server.watch('path/to/file', delay=2)
108108
109 server.setHeader
110 ~~~~~~~~~~~~~~~~
111
112 ```server.setHeader``` can be used to add one or more headers to the HTTP
113 response::
114
115 server.setHeader('Access-Control-Allow-Origin', '*')
116 server.setHeader('Access-Control-Allow-Methods', '*')
117
109118
110119 server.serve
111120 ~~~~~~~~~~~~
124133
125134 # open the web browser on startup, based on $BROWSER environment variable
126135 server.serve(open_url_delay=5, debug=False)
136
137 # set a custom default file to open
138 server.serve(default_filename='example.html')
127139
128140
129141 shell
195207 server = Server(app)
196208 # server.watch
197209 server.serve()
210
211 Security Report
212 ---------------
213
214 To report a security vulnerability, please use the
215 `Tidelift security contact <https://tidelift.com/security>`_.
216 Tidelift will coordinate the fix and disclosure.
77 :license: BSD, see LICENSE for more details.
88 """
99
10 __version__ = '2.6.1'
10 __version__ = '2.6.3'
1111 __author__ = 'Hsiaoming Yang <me@lepture.com>'
1212 __homepage__ = 'https://github.com/lepture/python-livereload'
1313
2828 from .watcher import get_watcher_class
2929 from six import string_types, PY3
3030
31 import sys
32
33 if sys.version_info >= (3, 7) or sys.version_info.major == 2:
34 import errno
35 else:
36 from os import errno
37
38 if sys.version_info >= (3, 8) and sys.platform == 'win32':
39 import asyncio
40 asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
41
3142 logger = logging.getLogger('livereload')
3243
3344 HEAD_END = b'</head>'
45
46
47 def set_header(fn, name, value):
48 """Helper Function to Add HTTP headers to the server"""
49 def set_default_headers(self, *args, **kwargs):
50 fn(self, *args, **kwargs)
51 self.set_header(name, value)
52 return set_default_headers
3453
3554
3655 def shell(cmd, output=None, mode='w', cwd=None, shell=False):
6685 shell=shell)
6786 except OSError as e:
6887 logger.error(e)
69 if e.errno == os.errno.ENOENT: # file (command) not found
88 if e.errno == errno.ENOENT: # file (command) not found
7089 logger.error("maybe you haven't installed %s", cmd[0])
7190 return e
7291 stdout, stderr = p.communicate()
176195 watcher_cls = get_watcher_class()
177196 watcher = watcher_cls()
178197 self.watcher = watcher
198 self.SFH = StaticFileHandler
199
200 def setHeader(self, name, value):
201 """Add or override HTTP headers at the at the beginning of the
202 request.
203
204 Once you have intialized a server, you can add one or more
205 headers before starting the server::
206
207 server.setHeader('Access-Control-Allow-Origin', '*')
208 server.setHeader('Access-Control-Allow-Methods', '*')
209 server.serve()
210
211 :param name: The name of the header field to be defined.
212 :param value: The value of the header field to be defined.
213 """
214 StaticFileHandler.set_default_headers = set_header(
215 StaticFileHandler.set_default_headers, name, value)
216 self.SFH = StaticFileHandler
179217
180218 def watch(self, filepath, func=None, delay=None, ignore=None):
181219 """Add the given filepath for watcher list.
235273 if liveport:
236274 live_script = escape.utf8(live_script % liveport)
237275 else:
238 live_script = escape.utf8(live_script % 'window.location.port')
276 live_script = escape.utf8(live_script % "(window.location.port || (window.location.protocol == 'https:' ? 443: 80))")
239277
240278 web_handlers = self.get_web_handlers(live_script)
241279
265303 fallback = LiveScriptContainer(self.app, script)
266304 return [(r'.*', web.FallbackHandler, {'fallback': fallback})]
267305 return [
268 (r'/(.*)', StaticFileHandler, {
306 (r'/(.*)', self.SFH, {
269307 'path': self.root or '.',
270 'default_filename': 'index.html',
308 'default_filename': self.default_filename,
271309 }),
272310 ]
273311
274312 def serve(self, port=5500, liveport=None, host=None, root=None, debug=None,
275313 open_url=False, restart_delay=2, open_url_delay=None,
276 live_css=True):
314 live_css=True, default_filename='index.html'):
277315 """Start serve the server with the given port.
278316
279317 :param port: serve on this port, default is 5500
286324 :param open_url_delay: open webbrowser after the delay seconds
287325 :param live_css: whether to use live css or force reload on css.
288326 Defaults to True
327 :param default_filename: launch this file from the selected root on startup
289328 """
290329 host = host or '127.0.0.1'
291330 if root is not None:
294333 self._setup_logging()
295334 logger.info('Serving on http://%s:%s' % (host, port))
296335
336 self.default_filename = default_filename
337
297338 self.application(
298339 port, host, liveport=liveport, debug=debug, live_css=live_css)
299340
300341 # Async open web browser after 5 sec timeout
301 if open_url or open_url_delay:
302 if open_url:
303 logger.warn('Use `open_url_delay` instead of `open_url`')
304 sleep = open_url_delay or 5
342 if open_url:
343 logger.error('Use `open_url_delay` instead of `open_url`')
344 if open_url_delay is not None:
305345
306346 def opener():
307 time.sleep(sleep)
347 time.sleep(open_url_delay)
308348 webbrowser.open('http://%s:%s' % (host, port))
309349 threading.Thread(target=opener).start()
310350
1212 import logging
1313 import os
1414 import time
15 import sys
16
17 if sys.version_info.major < 3:
18 import inspect
19 else:
20 from inspect import signature
1521
1622 try:
1723 import pyinotify
9096 for path in self._tasks:
9197 item = self._tasks[path]
9298 self._task_mtimes = item['mtimes']
93 if self.is_changed(path, item['ignore']):
99 changed = self.is_changed(path, item['ignore'])
100 if changed:
94101 func = item['func']
95102 delay = item['delay']
96103 if delay and isinstance(delay, float):
101108 name = getattr(func, '__name__', 'anonymous')
102109 logger.info(
103110 "Running task: {} (delay: {})".format(name, delay))
104 func()
111 if sys.version_info.major < 3:
112 sig_len = len(inspect.getargspec(func)[0])
113 else:
114 sig_len = len(signature(func).parameters)
115 if sig_len > 0 and isinstance(changed, list):
116 func(changed)
117 else:
118 func()
105119
106120 if delays:
107121 delay = max(delays)
122136 elif os.path.isdir(path):
123137 changed = self.is_folder_changed(path, ignore)
124138 else:
125 changed = self.is_glob_changed(path, ignore)
139 changed = self.get_changed_glob_files(path, ignore)
126140
127141 if not changed:
128142 changed = self.is_file_removed()
189203 return True
190204 return False
191205
192 def is_glob_changed(self, path, ignore=None):
206 def get_changed_glob_files(self, path, ignore=None):
193207 """Check if glob path has any changed filepaths."""
194 for f in glob.glob(path):
195 if self.is_file_changed(f, ignore):
196 return True
197 return False
208 if sys.version_info[0] >=3 and sys.version_info[1] >=5:
209 files = glob.glob(path, recursive=True)
210 else:
211 files = glob.glob(path)
212 changed_files = [f for f in files if self.is_file_changed(f, ignore)]
213 return changed_files
198214
199215
200216 class INotifyWatcher(Watcher):
2424 url='https://github.com/lepture/python-livereload',
2525 packages=['livereload', 'livereload.management.commands'],
2626 description='Python LiveReload is an awesome tool for web developers',
27 long_description_content_type='text/x-rst',
2728 long_description=fread('README.rst'),
2829 entry_points={
2930 'console_scripts': [
3132 ]
3233 },
3334 install_requires=[
34 'tornado',
35 'tornado;python_version>"2.7"',
36 'tornado<6;python_version=="2.7"',
3537 'six',
3638 ],
3739 license='BSD',
5254 'Programming Language :: Python :: 3.5',
5355 'Programming Language :: Python :: 3.6',
5456 'Programming Language :: Python :: 3.7',
57 'Programming Language :: Python :: 3.8',
5558 'Programming Language :: Python :: Implementation :: CPython',
5659 'Programming Language :: Python :: Implementation :: PyPy',
5760 'Topic :: Software Development :: Build Tools',