From 842185179d2b89f895281b0b4077a8eabeba6f83 Mon Sep 17 00:00:00 2001 From: Miguel Grinberg Date: Wed, 10 Jun 2020 23:30:39 +0100 Subject: [PATCH] various code and test improvements, also add python 3.7 and 3.8 to build --- .travis.yml | 10 ++-- flask_moment.py | 101 ++++++++++++++++++----------------- tests/test_flask_moment.py | 105 ++++++++++++++++++------------------- 3 files changed, 110 insertions(+), 106 deletions(-) diff --git a/.travis.yml b/.travis.yml index 9e86ad1..98905c1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,18 +1,22 @@ language: python matrix: include: - - python: 3.6 + - python: 3.7 env: TOXENV=flake8 - python: 2.7 env: TOXENV=py27 - - python: 3.4 - env: TOXENV=py34 - python: 3.5 env: TOXENV=py35 - python: 3.6 env: TOXENV=py36 + - python: 3.7 + env: TOXENV=py37 + - python: 3.8 + env: TOXENV=py38 - python: pypy env: TOXENV=pypy + - python: pypy3 + env: TOXENV=pypy3 install: - pip install tox script: diff --git a/flask_moment.py b/flask_moment.py index 16ddcb8..da77cd1 100644 --- a/flask_moment.py +++ b/flask_moment.py @@ -3,13 +3,15 @@ from jinja2 import Markup from flask import current_app -# //code.jquery.com/jquery-3.4.1.min.js -default_jquery_version = '3.4.1' -default_jquery_sri = 'sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=' +# //code.jquery.com/jquery-3.5.1.min.js +default_jquery_version = '3.5.1' +default_jquery_sri = ('sha384-ZvpUoO/+PpLXR1lu4jmpXWu80pZlYUAfxl5NsBMWOEPSjUn' + '/6Z/hRTt8+pR6L4N2') -# //cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment-with-locales.min.js -default_moment_version = '2.24.0' -default_moment_sri = 'sha256-AdQN98MVZs44Eq2yTwtoKufhnU+uZ7v2kXnD5vqzZVo=' +# //cdnjs.cloudflare.com/ajax/libs/moment.js/2.26.0/moment-with-locales.min.js +default_moment_version = '2.26.0' +default_moment_sri = ('sha384-WxkyfzCCre+H1hXpoMH2JOqSotIuNoiH5KQ4zCQxIxOSHo4' + '9PeKFlgftAkREuLTR') class _moment(object): @@ -23,32 +25,32 @@ def include_moment(version=default_moment_version, local_js=None, if not no_js: if local_js is not None: if not sri: - js = '\n' % local_js + js = '\n'.format(local_js) else: - js = ('\n' - % (local_js, sri)) + js = ('\n').format( + local_js, sri) elif version is not None: js_filename = 'moment-with-locales.min.js' \ if StrictVersion(version) >= StrictVersion('2.8.0') \ else 'moment-with-langs.min.js' if not sri: - js = '\n' \ - % (version, js_filename) + js = ('\n').format( + version, js_filename) else: - js = '\n' \ - % (version, js_filename, sri) + js = ('\n').format( + version, js_filename, sri) default_format = '' if 'MOMENT_DEFAULT_FORMAT' in current_app.config: - default_format = '\nmoment.defaultFormat = "%s";' % \ - current_app.config['MOMENT_DEFAULT_FORMAT'] - return Markup('''%s''' % (js, default_format)) # noqa: E501 +}}); +'''.format(js, default_format)) # noqa: E501 @staticmethod def include_jquery(version=default_jquery_version, local_js=None, @@ -86,19 +88,20 @@ def include_jquery(version=default_jquery_version, local_js=None, sri = default_jquery_sri if local_js is not None: if not sri: - js = '\n' % local_js + js = '\n'.format(local_js) else: - js = ('\n' % (local_js, sri)) + js = ('\n').format( + local_js, sri) else: if not sri: js = ('') % version + 'jquery-{}.min.js">').format(version) else: - js = ('' - % (version, sri)) + js = ('').format(version, sri) return Markup(js) @staticmethod @@ -110,10 +113,10 @@ def locale(language='en', auto_detect=False, customization=None): 'moment.locale(locale);\n') if customization: return Markup( - '' % ( + ''.format( language, customization)) return Markup( - '' % language) + ''.format(language)) @staticmethod def lang(language): @@ -134,17 +137,17 @@ def _timestamp_as_iso_8601(self, timestamp): def _render(self, func, format=None, timestamp2=None, no_suffix=None, refresh=False): t = self._timestamp_as_iso_8601(self.timestamp) - data_values = 'data-function="%s"' % func + data_values = 'data-function="{}"'.format(func) if format: - data_values += ' data-format="%s"' % format + data_values += ' data-format="{}"'.format(format) if timestamp2: - data_values += ' data-timestamp2="%s"' % timestamp2 + data_values += ' data-timestamp2="{}"'.format(timestamp2) if no_suffix: data_values += ' data-nosuffix="1"' - return Markup(('%s') % - (t, data_values, int(refresh) * 60000, t)) + return Markup(('{}').format( + t, data_values, int(refresh) * 60000, t)) def format(self, fmt=None, refresh=False): return self._render("format", format=(fmt or ''), refresh=refresh) diff --git a/tests/test_flask_moment.py b/tests/test_flask_moment.py index 6864918..e6f0eb5 100644 --- a/tests/test_flask_moment.py +++ b/tests/test_flask_moment.py @@ -62,37 +62,37 @@ def test_include_moment_directly(self): include_moment = _moment.include_moment() assert isinstance(include_moment, Markup) - assert "" in str( + assert '' in str( include_moment) def test_include_moment_renders_properly(self, app, moment): - ts = str(render_template_string("{{ moment.include_moment() }}")) + ts = str(render_template_string('{{ moment.include_moment() }}')) - assert " 0 - assert rts.find( - "data-refresh=\"" + str(int(refresh) * 60000) + "\"") > 0 + assert rts.find('data-timestamp="') > 0 + assert rts.find('data-function="format" data-refresh="0"') > 0 def test__render_refresh(self): mom = _moment_mock() - refresh = True - rts = mom._render(func="format", refresh=refresh) + rts = mom._render(func='format', refresh=True) assert isinstance(rts, Markup) - assert not rts.find("thisisnotinthemarkup") > 0 - assert rts.find("\"format\"") > 0 - assert rts.find( - "data-refresh=\"" + str(int(refresh) * 60000) + "\"") > 0 + assert rts.find('data-timestamp="') > 0 + assert rts.find('data-function="format" data-refresh="60000"') > 0 def test_format_default(self): mom = _moment_mock() - rts = mom.format("this-format-please") + rts = mom.format('this-format-please') - assert rts.find("this-format-please") > 0 + assert rts.find( + 'data-format="this-format-please" data-refresh="0"') > 0 def test_fromNow_default(self): mom = _moment_mock() rts = mom.fromNow() - assert rts.find("data-function=\"fromNow\"") > 0 + assert rts.find('data-function="fromNow" data-refresh="0"') > 0 def test_fromNow_no_suffix(self): mom = _moment_mock() - no_suffix = True - rts = mom.fromNow(no_suffix=no_suffix) + rts = mom.fromNow(no_suffix=True) - assert rts.find("data-function=\"fromNow\" data-nosuffix=\"1\"") > 0 + assert rts.find('data-function="fromNow" data-nosuffix="1" ' + 'data-refresh="0"') > 0 def test_fromTime_default(self): mom = _moment_mock() ts = datetime(2017, 1, 15, 22, 47, 6, 479898) rts = mom.fromTime(timestamp=ts) - assert rts.find("data-function=\"from\" data-timestamp2=\"%s\"" - % mom._timestamp_as_iso_8601(ts)) > 0 - assert rts.find("%s" % mom._timestamp_as_iso_8601( + assert rts.find('data-function="from" data-timestamp2="{}" ' + 'data-refresh="0"'.format( + mom._timestamp_as_iso_8601(ts))) > 0 + assert rts.find(mom._timestamp_as_iso_8601( timestamp=mom.timestamp)) > 0 def test_fromTime_no_suffix(self): mom = _moment_mock() ts = datetime(2017, 1, 15, 22, 47, 6, 479898) - no_suffix = True - rts = mom.fromTime(timestamp=ts, no_suffix=no_suffix) + rts = mom.fromTime(timestamp=ts, no_suffix=True) - assert rts.find("data-function=\"from\" data-timestamp2=\"%s\" " - "data-nosuffix=\"1\"" - % mom._timestamp_as_iso_8601(ts)) > 0 - assert rts.find("%s" % mom._timestamp_as_iso_8601( + assert rts.find('data-function="from" data-timestamp2="{}" ' + 'data-nosuffix="1" data-refresh="0"'.format( + mom._timestamp_as_iso_8601(ts))) > 0 + assert rts.find(mom._timestamp_as_iso_8601( timestamp=mom.timestamp)) > 0 def test_toNow_default(self): mom = _moment_mock() rts = mom.toNow() - assert rts.find("data-function=\"toNow\"") > 0 + assert rts.find('data-function="toNow" data-refresh="0"') > 0 def test_toNow_no_suffix(self): mom = _moment_mock() no_suffix = True rts = mom.toNow(no_suffix=no_suffix) - assert rts.find("data-function=\"toNow\" data-nosuffix=\"1\"") > 0 + assert rts.find('data-function="toNow" data-nosuffix="1" ' + 'data-refresh="0"') > 0 def test_toTime_default(self): mom = _moment_mock() ts = datetime(2020, 1, 15, 22, 47, 6, 479898) rts = mom.toTime(timestamp=ts) - assert rts.find("data-function=\"to\" data-timestamp2=\"%s\"" - % mom._timestamp_as_iso_8601(ts)) > 0 - assert rts.find("%s" % mom._timestamp_as_iso_8601( + assert rts.find('data-function="to" data-timestamp2="{}" ' + 'data-refresh="0"'.format( + mom._timestamp_as_iso_8601(ts))) > 0 + assert rts.find(mom._timestamp_as_iso_8601( timestamp=mom.timestamp)) > 0 def test_toTime_no_suffix(self): @@ -242,33 +239,33 @@ def test_toTime_no_suffix(self): no_suffix = True rts = mom.toTime(timestamp=ts, no_suffix=no_suffix) - assert rts.find("data-function=\"to\" data-timestamp2=\"%s\" " - "data-nosuffix=\"1\"" - % mom._timestamp_as_iso_8601(ts)) > 0 - assert rts.find("%s" % mom._timestamp_as_iso_8601( + assert rts.find('data-function="to" data-timestamp2="{}" ' + 'data-nosuffix="1" data-refresh="0"'.format( + mom._timestamp_as_iso_8601(ts))) > 0 + assert rts.find(mom._timestamp_as_iso_8601( timestamp=mom.timestamp)) > 0 def test_calendar_default(self): mom = _moment_mock() rts = mom.calendar() - assert rts.find("data-function=\"calendar\"") > 0 + assert rts.find('data-function="calendar" data-refresh="0"') > 0 def test_valueOf_default(self): mom = _moment_mock() rts = mom.valueOf() - assert rts.find("data-function=\"valueOf\"") > 0 + assert rts.find('data-function="valueOf" data-refresh="0"') > 0 def test_unix_default(self): mom = _moment_mock() rts = mom.unix() - assert rts.find("data-function=\"unix\"") > 0 + assert rts.find('data-function="unix" data-refresh="0"') > 0 class TestPublicMomentClass(object): - '''Public refers to the Moment class''' + """Tests for the Moment class""" def test_create_default_no_timestamp(self, app): moment = _Moment()