Hello community, here is the log from the commit of package python-Flask-Babel for openSUSE:Factory checked in at 2020-02-18 13:29:19 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-Flask-Babel (Old) and /work/SRC/openSUSE:Factory/.python-Flask-Babel.new.26092 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-Flask-Babel" Tue Feb 18 13:29:19 2020 rev:4 rq:774993 version:1.0.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-Flask-Babel/python-Flask-Babel.changes 2018-11-08 09:48:37.205090649 +0100 +++ /work/SRC/openSUSE:Factory/.python-Flask-Babel.new.26092/python-Flask-Babel.changes 2020-02-18 13:29:21.684697381 +0100 @@ -1,0 +2,13 @@ +Sun Feb 16 05:57:42 UTC 2020 - Arun Persaud <[email protected]> + +- specfile: + * update copyright year + +- update to version 1.0.0: + * pytz is an explicit dependency. (#14) + * pytz.gae, used for Google App Engine, is no longer necessary and + has been removed. (#153) + * Fixed a deprecated werkzeug import (#158). + * Fix issues switching locales in threaded contexts (#125). + +------------------------------------------------------------------- Old: ---- Flask-Babel-0.12.2.tar.gz New: ---- Flask-Babel-1.0.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-Flask-Babel.spec ++++++ --- /var/tmp/diff_new_pack.u1JLB9/_old 2020-02-18 13:29:22.176698339 +0100 +++ /var/tmp/diff_new_pack.u1JLB9/_new 2020-02-18 13:29:22.176698339 +0100 @@ -1,7 +1,7 @@ # # spec file for package python-Flask-Babel # -# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2020 SUSE LLC # Copyright (c) 2014 Dr. Axel Braun # # All modifications and additions to the file contributed by third parties @@ -19,7 +19,7 @@ %{?!python_module:%define python_module() python-%{**} python3-%{**}} Name: python-Flask-Babel -Version: 0.12.2 +Version: 1.0.0 Release: 0 Summary: i18n and l10n support for Flask License: BSD-3-Clause ++++++ Flask-Babel-0.12.2.tar.gz -> Flask-Babel-1.0.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Flask-Babel-0.12.2/Flask_Babel.egg-info/PKG-INFO new/Flask-Babel-1.0.0/Flask_Babel.egg-info/PKG-INFO --- old/Flask-Babel-0.12.2/Flask_Babel.egg-info/PKG-INFO 2018-10-25 17:45:46.000000000 +0200 +++ new/Flask-Babel-1.0.0/Flask_Babel.egg-info/PKG-INFO 2020-02-06 17:38:13.000000000 +0100 @@ -1,12 +1,12 @@ Metadata-Version: 2.1 Name: Flask-Babel -Version: 0.12.2 +Version: 1.0.0 Summary: Adds i18n/l10n support to Flask applications Home-page: http://github.com/python-babel/flask-babel Author: Armin Ronacher Author-email: [email protected] License: BSD -Description: # Flask Babel - 0.12.2 +Description: # Flask Babel - 1.0.0 [](https://travis-ci.org/python-babel/flask-babel) [](https://pypi.python.org/pypi/Flask-Babel) @@ -21,9 +21,25 @@ The latest documentation is available [here][docs]. + # Changelog + + ## v1.0.0 - 06/02/2020 + + Starting with version 1, flask-babel has changed to + [Semantic Versioning][semver]. + + ### Changed + + - pytz is an explicit dependency. (#14) + - pytz.gae, used for Google App Engine, is no longer necessary and has been + removed. (#153) + - Fixed a deprecated werkzeug import (#158). + - Fix issues switching locales in threaded contexts (#125). + [babel]: https://github.com/python-babel/babel [pytz]: https://pypi.python.org/pypi/pytz/ [docs]: https://pythonhosted.org/Flask-Babel/ + [semver]: https://semver.org/ Platform: any Classifier: Development Status :: 4 - Beta diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Flask-Babel-0.12.2/Flask_Babel.egg-info/SOURCES.txt new/Flask-Babel-1.0.0/Flask_Babel.egg-info/SOURCES.txt --- old/Flask-Babel-0.12.2/Flask_Babel.egg-info/SOURCES.txt 2018-10-25 17:45:47.000000000 +0200 +++ new/Flask-Babel-1.0.0/Flask_Babel.egg-info/SOURCES.txt 2020-02-06 17:38:13.000000000 +0100 @@ -15,6 +15,19 @@ docs/index.rst docs/make.bat docs/_static/flask-babel.png +docs/_themes/.git +docs/_themes/.gitignore +docs/_themes/LICENSE +docs/_themes/README +docs/_themes/flask_theme_support.py +docs/_themes/flask/layout.html +docs/_themes/flask/relations.html +docs/_themes/flask/theme.conf +docs/_themes/flask/static/flasky.css_t +docs/_themes/flask/static/small_flask.css +docs/_themes/flask_small/layout.html +docs/_themes/flask_small/theme.conf +docs/_themes/flask_small/static/flasky.css_t flask_babel/__init__.py flask_babel/_compat.py flask_babel/speaklater.py diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Flask-Babel-0.12.2/Flask_Babel.egg-info/requires.txt new/Flask-Babel-1.0.0/Flask_Babel.egg-info/requires.txt --- old/Flask-Babel-0.12.2/Flask_Babel.egg-info/requires.txt 2018-10-25 17:45:46.000000000 +0200 +++ new/Flask-Babel-1.0.0/Flask_Babel.egg-info/requires.txt 2020-02-06 17:38:13.000000000 +0100 @@ -1,3 +1,4 @@ +pytz Flask Babel>=2.3 Jinja2>=2.5 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Flask-Babel-0.12.2/PKG-INFO new/Flask-Babel-1.0.0/PKG-INFO --- old/Flask-Babel-0.12.2/PKG-INFO 2018-10-25 17:45:47.000000000 +0200 +++ new/Flask-Babel-1.0.0/PKG-INFO 2020-02-06 17:38:13.000000000 +0100 @@ -1,12 +1,12 @@ Metadata-Version: 2.1 Name: Flask-Babel -Version: 0.12.2 +Version: 1.0.0 Summary: Adds i18n/l10n support to Flask applications Home-page: http://github.com/python-babel/flask-babel Author: Armin Ronacher Author-email: [email protected] License: BSD -Description: # Flask Babel - 0.12.2 +Description: # Flask Babel - 1.0.0 [](https://travis-ci.org/python-babel/flask-babel) [](https://pypi.python.org/pypi/Flask-Babel) @@ -21,9 +21,25 @@ The latest documentation is available [here][docs]. + # Changelog + + ## v1.0.0 - 06/02/2020 + + Starting with version 1, flask-babel has changed to + [Semantic Versioning][semver]. + + ### Changed + + - pytz is an explicit dependency. (#14) + - pytz.gae, used for Google App Engine, is no longer necessary and has been + removed. (#153) + - Fixed a deprecated werkzeug import (#158). + - Fix issues switching locales in threaded contexts (#125). + [babel]: https://github.com/python-babel/babel [pytz]: https://pypi.python.org/pypi/pytz/ [docs]: https://pythonhosted.org/Flask-Babel/ + [semver]: https://semver.org/ Platform: any Classifier: Development Status :: 4 - Beta diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Flask-Babel-0.12.2/README.md new/Flask-Babel-1.0.0/README.md --- old/Flask-Babel-0.12.2/README.md 2018-10-25 17:31:05.000000000 +0200 +++ new/Flask-Babel-1.0.0/README.md 2020-02-06 17:32:24.000000000 +0100 @@ -1,4 +1,4 @@ -# Flask Babel - 0.12.2 +# Flask Babel - 1.0.0 [](https://travis-ci.org/python-babel/flask-babel) [](https://pypi.python.org/pypi/Flask-Babel) @@ -13,6 +13,22 @@ The latest documentation is available [here][docs]. +# Changelog + +## v1.0.0 - 06/02/2020 + +Starting with version 1, flask-babel has changed to +[Semantic Versioning][semver]. + +### Changed + +- pytz is an explicit dependency. (#14) +- pytz.gae, used for Google App Engine, is no longer necessary and has been + removed. (#153) +- Fixed a deprecated werkzeug import (#158). +- Fix issues switching locales in threaded contexts (#125). + [babel]: https://github.com/python-babel/babel [pytz]: https://pypi.python.org/pypi/pytz/ [docs]: https://pythonhosted.org/Flask-Babel/ +[semver]: https://semver.org/ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Flask-Babel-0.12.2/docs/_themes/.git new/Flask-Babel-1.0.0/docs/_themes/.git --- old/Flask-Babel-0.12.2/docs/_themes/.git 1970-01-01 01:00:00.000000000 +0100 +++ new/Flask-Babel-1.0.0/docs/_themes/.git 2018-10-25 01:23:38.000000000 +0200 @@ -0,0 +1 @@ +gitdir: ../../.git/modules/docs/_themes diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Flask-Babel-0.12.2/docs/_themes/.gitignore new/Flask-Babel-1.0.0/docs/_themes/.gitignore --- old/Flask-Babel-0.12.2/docs/_themes/.gitignore 1970-01-01 01:00:00.000000000 +0100 +++ new/Flask-Babel-1.0.0/docs/_themes/.gitignore 2018-10-25 01:23:38.000000000 +0200 @@ -0,0 +1,3 @@ +*.pyc +*.pyo +.DS_Store diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Flask-Babel-0.12.2/docs/_themes/LICENSE new/Flask-Babel-1.0.0/docs/_themes/LICENSE --- old/Flask-Babel-0.12.2/docs/_themes/LICENSE 1970-01-01 01:00:00.000000000 +0100 +++ new/Flask-Babel-1.0.0/docs/_themes/LICENSE 2018-10-25 01:23:38.000000000 +0200 @@ -0,0 +1,37 @@ +Copyright (c) 2010 by Armin Ronacher. + +Some rights reserved. + +Redistribution and use in source and binary forms of the theme, with or +without modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + +* The names of the contributors may not be used to endorse or + promote products derived from this software without specific + prior written permission. + +We kindly ask you to only use these themes in an unmodified manner just +for Flask and Flask-related products, not for unrelated projects. If you +like the visual style and want to use it for your own projects, please +consider making some larger changes to the themes (such as changing +font faces, sizes, colors or margins). + +THIS THEME IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS THEME, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Flask-Babel-0.12.2/docs/_themes/README new/Flask-Babel-1.0.0/docs/_themes/README --- old/Flask-Babel-0.12.2/docs/_themes/README 1970-01-01 01:00:00.000000000 +0100 +++ new/Flask-Babel-1.0.0/docs/_themes/README 2018-10-25 01:23:38.000000000 +0200 @@ -0,0 +1,31 @@ +Flask Sphinx Styles +=================== + +This repository contains sphinx styles for Flask and Flask related +projects. To use this style in your Sphinx documentation, follow +this guide: + +1. put this folder as _themes into your docs folder. Alternatively + you can also use git submodules to check out the contents there. +2. add this to your conf.py: + + sys.path.append(os.path.abspath('_themes')) + html_theme_path = ['_themes'] + html_theme = 'flask' + +The following themes exist: + +- 'flask' - the standard flask documentation theme for large + projects +- 'flask_small' - small one-page theme. Intended to be used by + very small addon libraries for flask. + +The following options exist for the flask_small theme: + + [options] + index_logo = '' filename of a picture in _static + to be used as replacement for the + h1 in the index.rst file. + index_logo_height = 120px height of the index logo + github_fork = '' repository name on github for the + "fork me" badge diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Flask-Babel-0.12.2/docs/_themes/flask/layout.html new/Flask-Babel-1.0.0/docs/_themes/flask/layout.html --- old/Flask-Babel-0.12.2/docs/_themes/flask/layout.html 1970-01-01 01:00:00.000000000 +0100 +++ new/Flask-Babel-1.0.0/docs/_themes/flask/layout.html 2018-10-25 01:23:38.000000000 +0200 @@ -0,0 +1,25 @@ +{%- extends "basic/layout.html" %} +{%- block extrahead %} + {{ super() }} + {% if theme_touch_icon %} + <link rel="apple-touch-icon" href="{{ pathto('_static/' ~ theme_touch_icon, 1) }}" /> + {% endif %} + <link media="only screen and (max-device-width: 480px)" href="{{ + pathto('_static/small_flask.css', 1) }}" type= "text/css" rel="stylesheet" /> +{% endblock %} +{%- block relbar2 %}{% endblock %} +{% block header %} + {{ super() }} + {% if pagename == 'index' %} + <div class=indexwrapper> + {% endif %} +{% endblock %} +{%- block footer %} + <div class="footer"> + © Copyright {{ copyright }}. + Created using <a href="http://sphinx.pocoo.org/">Sphinx</a>. + </div> + {% if pagename == 'index' %} + </div> + {% endif %} +{%- endblock %} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Flask-Babel-0.12.2/docs/_themes/flask/relations.html new/Flask-Babel-1.0.0/docs/_themes/flask/relations.html --- old/Flask-Babel-0.12.2/docs/_themes/flask/relations.html 1970-01-01 01:00:00.000000000 +0100 +++ new/Flask-Babel-1.0.0/docs/_themes/flask/relations.html 2018-10-25 01:23:38.000000000 +0200 @@ -0,0 +1,19 @@ +<h3>Related Topics</h3> +<ul> + <li><a href="{{ pathto(master_doc) }}">Documentation overview</a><ul> + {%- for parent in parents %} + <li><a href="{{ parent.link|e }}">{{ parent.title }}</a><ul> + {%- endfor %} + {%- if prev %} + <li>Previous: <a href="{{ prev.link|e }}" title="{{ _('previous chapter') + }}">{{ prev.title }}</a></li> + {%- endif %} + {%- if next %} + <li>Next: <a href="{{ next.link|e }}" title="{{ _('next chapter') + }}">{{ next.title }}</a></li> + {%- endif %} + {%- for parent in parents %} + </ul></li> + {%- endfor %} + </ul></li> +</ul> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Flask-Babel-0.12.2/docs/_themes/flask/static/flasky.css_t new/Flask-Babel-1.0.0/docs/_themes/flask/static/flasky.css_t --- old/Flask-Babel-0.12.2/docs/_themes/flask/static/flasky.css_t 1970-01-01 01:00:00.000000000 +0100 +++ new/Flask-Babel-1.0.0/docs/_themes/flask/static/flasky.css_t 2018-10-25 01:23:38.000000000 +0200 @@ -0,0 +1,395 @@ +/* + * flasky.css_t + * ~~~~~~~~~~~~ + * + * :copyright: Copyright 2010 by Armin Ronacher. + * :license: Flask Design License, see LICENSE for details. + */ + +{% set page_width = '940px' %} +{% set sidebar_width = '220px' %} + +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: 'Georgia', serif; + font-size: 17px; + background-color: white; + color: #000; + margin: 0; + padding: 0; +} + +div.document { + width: {{ page_width }}; + margin: 30px auto 0 auto; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 {{ sidebar_width }}; +} + +div.sphinxsidebar { + width: {{ sidebar_width }}; +} + +hr { + border: 1px solid #B1B4B6; +} + +div.body { + background-color: #ffffff; + color: #3E4349; + padding: 0 30px 0 30px; +} + +img.floatingflask { + padding: 0 0 10px 10px; + float: right; +} + +div.footer { + width: {{ page_width }}; + margin: 20px auto 30px auto; + font-size: 14px; + color: #888; + text-align: right; +} + +div.footer a { + color: #888; +} + +div.related { + display: none; +} + +div.sphinxsidebar a { + color: #444; + text-decoration: none; + border-bottom: 1px dotted #999; +} + +div.sphinxsidebar a:hover { + border-bottom: 1px solid #999; +} + +div.sphinxsidebar { + font-size: 14px; + line-height: 1.5; +} + +div.sphinxsidebarwrapper { + padding: 18px 10px; +} + +div.sphinxsidebarwrapper p.logo { + padding: 0 0 20px 0; + margin: 0; + text-align: center; +} + +div.sphinxsidebar h3, +div.sphinxsidebar h4 { + font-family: 'Garamond', 'Georgia', serif; + color: #444; + font-size: 24px; + font-weight: normal; + margin: 0 0 5px 0; + padding: 0; +} + +div.sphinxsidebar h4 { + font-size: 20px; +} + +div.sphinxsidebar h3 a { + color: #444; +} + +div.sphinxsidebar p.logo a, +div.sphinxsidebar h3 a, +div.sphinxsidebar p.logo a:hover, +div.sphinxsidebar h3 a:hover { + border: none; +} + +div.sphinxsidebar p { + color: #555; + margin: 10px 0; +} + +div.sphinxsidebar ul { + margin: 10px 0; + padding: 0; + color: #000; +} + +div.sphinxsidebar input { + border: 1px solid #ccc; + font-family: 'Georgia', serif; + font-size: 1em; +} + +/* -- body styles ----------------------------------------------------------- */ + +a { + color: #004B6B; + text-decoration: underline; +} + +a:hover { + color: #6D4100; + text-decoration: underline; +} + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: 'Garamond', 'Georgia', serif; + font-weight: normal; + margin: 30px 0px 10px 0px; + padding: 0; +} + +{% if theme_index_logo %} +div.indexwrapper h1 { + text-indent: -999999px; + background: url({{ theme_index_logo }}) no-repeat center center; + height: {{ theme_index_logo_height }}; +} +{% endif %} + +div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; } +div.body h2 { font-size: 180%; } +div.body h3 { font-size: 150%; } +div.body h4 { font-size: 130%; } +div.body h5 { font-size: 100%; } +div.body h6 { font-size: 100%; } + +a.headerlink { + color: #ddd; + padding: 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + color: #444; + background: #eaeaea; +} + +div.body p, div.body dd, div.body li { + line-height: 1.4em; +} + +div.admonition { + background: #fafafa; + margin: 20px -30px; + padding: 10px 30px; + border-top: 1px solid #ccc; + border-bottom: 1px solid #ccc; +} + +div.admonition tt.xref, div.admonition a tt { + border-bottom: 1px solid #fafafa; +} + +dd div.admonition { + margin-left: -60px; + padding-left: 60px; +} + +div.admonition p.admonition-title { + font-family: 'Garamond', 'Georgia', serif; + font-weight: normal; + font-size: 24px; + margin: 0 0 10px 0; + padding: 0; + line-height: 1; +} + +div.admonition p.last { + margin-bottom: 0; +} + +div.highlight { + background-color: white; +} + +dt:target, .highlight { + background: #FAF3E8; +} + +div.note { + background-color: #eee; + border: 1px solid #ccc; +} + +div.seealso { + background-color: #ffc; + border: 1px solid #ff6; +} + +div.topic { + background-color: #eee; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre, tt { + font-family: 'Consolas', 'Menlo', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 0.9em; +} + +img.screenshot { +} + +tt.descname, tt.descclassname { + font-size: 0.95em; +} + +tt.descname { + padding-right: 0.08em; +} + +img.screenshot { + -moz-box-shadow: 2px 2px 4px #eee; + -webkit-box-shadow: 2px 2px 4px #eee; + box-shadow: 2px 2px 4px #eee; +} + +table.docutils { + border: 1px solid #888; + -moz-box-shadow: 2px 2px 4px #eee; + -webkit-box-shadow: 2px 2px 4px #eee; + box-shadow: 2px 2px 4px #eee; +} + +table.docutils td, table.docutils th { + border: 1px solid #888; + padding: 0.25em 0.7em; +} + +table.field-list, table.footnote { + border: none; + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +table.footnote { + margin: 15px 0; + width: 100%; + border: 1px solid #eee; + background: #fdfdfd; + font-size: 0.9em; +} + +table.footnote + table.footnote { + margin-top: -15px; + border-top: none; +} + +table.field-list th { + padding: 0 0.8em 0 0; +} + +table.field-list td { + padding: 0; +} + +table.footnote td.label { + width: 0px; + padding: 0.3em 0 0.3em 0.5em; +} + +table.footnote td { + padding: 0.3em 0.5em; +} + +dl { + margin: 0; + padding: 0; +} + +dl dd { + margin-left: 30px; +} + +blockquote { + margin: 0 0 0 30px; + padding: 0; +} + +ul, ol { + margin: 10px 0 10px 30px; + padding: 0; +} + +pre { + background: #eee; + padding: 7px 30px; + margin: 15px -30px; + line-height: 1.3em; +} + +dl pre, blockquote pre, li pre { + margin-left: -60px; + padding-left: 60px; +} + +dl dl pre { + margin-left: -90px; + padding-left: 90px; +} + +tt { + background-color: #ecf0f3; + color: #222; + /* padding: 1px 2px; */ +} + +tt.xref, a tt { + background-color: #FBFBFB; + border-bottom: 1px solid white; +} + +a.reference { + text-decoration: none; + border-bottom: 1px dotted #004B6B; +} + +a.reference:hover { + border-bottom: 1px solid #6D4100; +} + +a.footnote-reference { + text-decoration: none; + font-size: 0.7em; + vertical-align: top; + border-bottom: 1px dotted #004B6B; +} + +a.footnote-reference:hover { + border-bottom: 1px solid #6D4100; +} + +a:hover tt { + background: #EEE; +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Flask-Babel-0.12.2/docs/_themes/flask/static/small_flask.css new/Flask-Babel-1.0.0/docs/_themes/flask/static/small_flask.css --- old/Flask-Babel-0.12.2/docs/_themes/flask/static/small_flask.css 1970-01-01 01:00:00.000000000 +0100 +++ new/Flask-Babel-1.0.0/docs/_themes/flask/static/small_flask.css 2018-10-25 01:23:38.000000000 +0200 @@ -0,0 +1,70 @@ +/* + * small_flask.css_t + * ~~~~~~~~~~~~~~~~~ + * + * :copyright: Copyright 2010 by Armin Ronacher. + * :license: Flask Design License, see LICENSE for details. + */ + +body { + margin: 0; + padding: 20px 30px; +} + +div.documentwrapper { + float: none; + background: white; +} + +div.sphinxsidebar { + display: block; + float: none; + width: 102.5%; + margin: 50px -30px -20px -30px; + padding: 10px 20px; + background: #333; + color: white; +} + +div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, +div.sphinxsidebar h3 a { + color: white; +} + +div.sphinxsidebar a { + color: #aaa; +} + +div.sphinxsidebar p.logo { + display: none; +} + +div.document { + width: 100%; + margin: 0; +} + +div.related { + display: block; + margin: 0; + padding: 10px 0 20px 0; +} + +div.related ul, +div.related ul li { + margin: 0; + padding: 0; +} + +div.footer { + display: none; +} + +div.bodywrapper { + margin: 0; +} + +div.body { + min-height: 0; + padding: 0; +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Flask-Babel-0.12.2/docs/_themes/flask/theme.conf new/Flask-Babel-1.0.0/docs/_themes/flask/theme.conf --- old/Flask-Babel-0.12.2/docs/_themes/flask/theme.conf 1970-01-01 01:00:00.000000000 +0100 +++ new/Flask-Babel-1.0.0/docs/_themes/flask/theme.conf 2018-10-25 01:23:38.000000000 +0200 @@ -0,0 +1,9 @@ +[theme] +inherit = basic +stylesheet = flasky.css +pygments_style = flask_theme_support.FlaskyStyle + +[options] +index_logo = '' +index_logo_height = 120px +touch_icon = diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Flask-Babel-0.12.2/docs/_themes/flask_small/layout.html new/Flask-Babel-1.0.0/docs/_themes/flask_small/layout.html --- old/Flask-Babel-0.12.2/docs/_themes/flask_small/layout.html 1970-01-01 01:00:00.000000000 +0100 +++ new/Flask-Babel-1.0.0/docs/_themes/flask_small/layout.html 2018-10-25 01:23:38.000000000 +0200 @@ -0,0 +1,22 @@ +{% extends "basic/layout.html" %} +{% block header %} + {{ super() }} + {% if pagename == 'index' %} + <div class=indexwrapper> + {% endif %} +{% endblock %} +{% block footer %} + {% if pagename == 'index' %} + </div> + {% endif %} +{% endblock %} +{# do not display relbars #} +{% block relbar1 %}{% endblock %} +{% block relbar2 %} + {% if theme_github_fork %} + <a href="http://github.com/{{ theme_github_fork }}"><img style="position: fixed; top: 0; right: 0; border: 0;" + src="http://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub" /></a> + {% endif %} +{% endblock %} +{% block sidebar1 %}{% endblock %} +{% block sidebar2 %}{% endblock %} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Flask-Babel-0.12.2/docs/_themes/flask_small/static/flasky.css_t new/Flask-Babel-1.0.0/docs/_themes/flask_small/static/flasky.css_t --- old/Flask-Babel-0.12.2/docs/_themes/flask_small/static/flasky.css_t 1970-01-01 01:00:00.000000000 +0100 +++ new/Flask-Babel-1.0.0/docs/_themes/flask_small/static/flasky.css_t 2018-10-25 01:23:38.000000000 +0200 @@ -0,0 +1,287 @@ +/* + * flasky.css_t + * ~~~~~~~~~~~~ + * + * Sphinx stylesheet -- flasky theme based on nature theme. + * + * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: 'Georgia', serif; + font-size: 17px; + color: #000; + background: white; + margin: 0; + padding: 0; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 40px auto 0 auto; + width: 700px; +} + +hr { + border: 1px solid #B1B4B6; +} + +div.body { + background-color: #ffffff; + color: #3E4349; + padding: 0 30px 30px 30px; +} + +img.floatingflask { + padding: 0 0 10px 10px; + float: right; +} + +div.footer { + text-align: right; + color: #888; + padding: 10px; + font-size: 14px; + width: 650px; + margin: 0 auto 40px auto; +} + +div.footer a { + color: #888; + text-decoration: underline; +} + +div.related { + line-height: 32px; + color: #888; +} + +div.related ul { + padding: 0 0 0 10px; +} + +div.related a { + color: #444; +} + +/* -- body styles ----------------------------------------------------------- */ + +a { + color: #004B6B; + text-decoration: underline; +} + +a:hover { + color: #6D4100; + text-decoration: underline; +} + +div.body { + padding-bottom: 40px; /* saved for footer */ +} + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: 'Garamond', 'Georgia', serif; + font-weight: normal; + margin: 30px 0px 10px 0px; + padding: 0; +} + +{% if theme_index_logo %} +div.indexwrapper h1 { + text-indent: -999999px; + background: url({{ theme_index_logo }}) no-repeat center center; + height: {{ theme_index_logo_height }}; +} +{% endif %} + +div.body h2 { font-size: 180%; } +div.body h3 { font-size: 150%; } +div.body h4 { font-size: 130%; } +div.body h5 { font-size: 100%; } +div.body h6 { font-size: 100%; } + +a.headerlink { + color: white; + padding: 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + color: #444; + background: #eaeaea; +} + +div.body p, div.body dd, div.body li { + line-height: 1.4em; +} + +div.admonition { + background: #fafafa; + margin: 20px -30px; + padding: 10px 30px; + border-top: 1px solid #ccc; + border-bottom: 1px solid #ccc; +} + +div.admonition p.admonition-title { + font-family: 'Garamond', 'Georgia', serif; + font-weight: normal; + font-size: 24px; + margin: 0 0 10px 0; + padding: 0; + line-height: 1; +} + +div.admonition p.last { + margin-bottom: 0; +} + +div.highlight{ + background-color: white; +} + +dt:target, .highlight { + background: #FAF3E8; +} + +div.note { + background-color: #eee; + border: 1px solid #ccc; +} + +div.seealso { + background-color: #ffc; + border: 1px solid #ff6; +} + +div.topic { + background-color: #eee; +} + +div.warning { + background-color: #ffe4e4; + border: 1px solid #f66; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre, tt { + font-family: 'Consolas', 'Menlo', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 0.85em; +} + +img.screenshot { +} + +tt.descname, tt.descclassname { + font-size: 0.95em; +} + +tt.descname { + padding-right: 0.08em; +} + +img.screenshot { + -moz-box-shadow: 2px 2px 4px #eee; + -webkit-box-shadow: 2px 2px 4px #eee; + box-shadow: 2px 2px 4px #eee; +} + +table.docutils { + border: 1px solid #888; + -moz-box-shadow: 2px 2px 4px #eee; + -webkit-box-shadow: 2px 2px 4px #eee; + box-shadow: 2px 2px 4px #eee; +} + +table.docutils td, table.docutils th { + border: 1px solid #888; + padding: 0.25em 0.7em; +} + +table.field-list, table.footnote { + border: none; + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +table.footnote { + margin: 15px 0; + width: 100%; + border: 1px solid #eee; +} + +table.field-list th { + padding: 0 0.8em 0 0; +} + +table.field-list td { + padding: 0; +} + +table.footnote td { + padding: 0.5em; +} + +dl { + margin: 0; + padding: 0; +} + +dl dd { + margin-left: 30px; +} + +pre { + padding: 0; + margin: 15px -30px; + padding: 8px; + line-height: 1.3em; + padding: 7px 30px; + background: #eee; + border-radius: 2px; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; +} + +dl pre { + margin-left: -60px; + padding-left: 60px; +} + +tt { + background-color: #ecf0f3; + color: #222; + /* padding: 1px 2px; */ +} + +tt.xref, a tt { + background-color: #FBFBFB; +} + +a:hover tt { + background: #EEE; +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Flask-Babel-0.12.2/docs/_themes/flask_small/theme.conf new/Flask-Babel-1.0.0/docs/_themes/flask_small/theme.conf --- old/Flask-Babel-0.12.2/docs/_themes/flask_small/theme.conf 1970-01-01 01:00:00.000000000 +0100 +++ new/Flask-Babel-1.0.0/docs/_themes/flask_small/theme.conf 2018-10-25 01:23:38.000000000 +0200 @@ -0,0 +1,10 @@ +[theme] +inherit = basic +stylesheet = flasky.css +nosidebar = true +pygments_style = flask_theme_support.FlaskyStyle + +[options] +index_logo = '' +index_logo_height = 120px +github_fork = '' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Flask-Babel-0.12.2/docs/_themes/flask_theme_support.py new/Flask-Babel-1.0.0/docs/_themes/flask_theme_support.py --- old/Flask-Babel-0.12.2/docs/_themes/flask_theme_support.py 1970-01-01 01:00:00.000000000 +0100 +++ new/Flask-Babel-1.0.0/docs/_themes/flask_theme_support.py 2018-10-25 01:23:38.000000000 +0200 @@ -0,0 +1,86 @@ +# flasky extensions. flasky pygments style based on tango style +from pygments.style import Style +from pygments.token import Keyword, Name, Comment, String, Error, \ + Number, Operator, Generic, Whitespace, Punctuation, Other, Literal + + +class FlaskyStyle(Style): + background_color = "#f8f8f8" + default_style = "" + + styles = { + # No corresponding class for the following: + #Text: "", # class: '' + Whitespace: "underline #f8f8f8", # class: 'w' + Error: "#a40000 border:#ef2929", # class: 'err' + Other: "#000000", # class 'x' + + Comment: "italic #8f5902", # class: 'c' + Comment.Preproc: "noitalic", # class: 'cp' + + Keyword: "bold #004461", # class: 'k' + Keyword.Constant: "bold #004461", # class: 'kc' + Keyword.Declaration: "bold #004461", # class: 'kd' + Keyword.Namespace: "bold #004461", # class: 'kn' + Keyword.Pseudo: "bold #004461", # class: 'kp' + Keyword.Reserved: "bold #004461", # class: 'kr' + Keyword.Type: "bold #004461", # class: 'kt' + + Operator: "#582800", # class: 'o' + Operator.Word: "bold #004461", # class: 'ow' - like keywords + + Punctuation: "bold #000000", # class: 'p' + + # because special names such as Name.Class, Name.Function, etc. + # are not recognized as such later in the parsing, we choose them + # to look the same as ordinary variables. + Name: "#000000", # class: 'n' + Name.Attribute: "#c4a000", # class: 'na' - to be revised + Name.Builtin: "#004461", # class: 'nb' + Name.Builtin.Pseudo: "#3465a4", # class: 'bp' + Name.Class: "#000000", # class: 'nc' - to be revised + Name.Constant: "#000000", # class: 'no' - to be revised + Name.Decorator: "#888", # class: 'nd' - to be revised + Name.Entity: "#ce5c00", # class: 'ni' + Name.Exception: "bold #cc0000", # class: 'ne' + Name.Function: "#000000", # class: 'nf' + Name.Property: "#000000", # class: 'py' + Name.Label: "#f57900", # class: 'nl' + Name.Namespace: "#000000", # class: 'nn' - to be revised + Name.Other: "#000000", # class: 'nx' + Name.Tag: "bold #004461", # class: 'nt' - like a keyword + Name.Variable: "#000000", # class: 'nv' - to be revised + Name.Variable.Class: "#000000", # class: 'vc' - to be revised + Name.Variable.Global: "#000000", # class: 'vg' - to be revised + Name.Variable.Instance: "#000000", # class: 'vi' - to be revised + + Number: "#990000", # class: 'm' + + Literal: "#000000", # class: 'l' + Literal.Date: "#000000", # class: 'ld' + + String: "#4e9a06", # class: 's' + String.Backtick: "#4e9a06", # class: 'sb' + String.Char: "#4e9a06", # class: 'sc' + String.Doc: "italic #8f5902", # class: 'sd' - like a comment + String.Double: "#4e9a06", # class: 's2' + String.Escape: "#4e9a06", # class: 'se' + String.Heredoc: "#4e9a06", # class: 'sh' + String.Interpol: "#4e9a06", # class: 'si' + String.Other: "#4e9a06", # class: 'sx' + String.Regex: "#4e9a06", # class: 'sr' + String.Single: "#4e9a06", # class: 's1' + String.Symbol: "#4e9a06", # class: 'ss' + + Generic: "#000000", # class: 'g' + Generic.Deleted: "#a40000", # class: 'gd' + Generic.Emph: "italic #000000", # class: 'ge' + Generic.Error: "#ef2929", # class: 'gr' + Generic.Heading: "bold #000080", # class: 'gh' + Generic.Inserted: "#00A000", # class: 'gi' + Generic.Output: "#888", # class: 'go' + Generic.Prompt: "#745334", # class: 'gp' + Generic.Strong: "bold #000000", # class: 'gs' + Generic.Subheading: "bold #800080", # class: 'gu' + Generic.Traceback: "bold #a40000", # class: 'gt' + } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Flask-Babel-0.12.2/docs/conf.py new/Flask-Babel-1.0.0/docs/conf.py --- old/Flask-Babel-0.12.2/docs/conf.py 2018-10-25 17:31:05.000000000 +0200 +++ new/Flask-Babel-1.0.0/docs/conf.py 2020-02-06 17:32:24.000000000 +0100 @@ -49,9 +49,9 @@ # built documents. # # The short X.Y version. -version = '0.12.2' +version = '1.0.0' # The full version, including alpha/beta/rc tags. -release = '0.12.2' +release = '1.0.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Flask-Babel-0.12.2/docs/index.rst new/Flask-Babel-1.0.0/docs/index.rst --- old/Flask-Babel-0.12.2/docs/index.rst 2018-10-25 17:31:05.000000000 +0200 +++ new/Flask-Babel-1.0.0/docs/index.rst 2020-02-06 17:20:12.000000000 +0100 @@ -28,7 +28,7 @@ Configuration ------------- -To get started all you need to do is to instanciate a :class:`Babel` +To get started all you need to do is to instantiate a :class:`Babel` object after configuring the application:: from flask import Flask diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Flask-Babel-0.12.2/flask_babel/__init__.py new/Flask-Babel-1.0.0/flask_babel/__init__.py --- old/Flask-Babel-0.12.2/flask_babel/__init__.py 2018-10-25 17:31:05.000000000 +0200 +++ new/Flask-Babel-1.0.0/flask_babel/__init__.py 2020-02-06 17:20:31.000000000 +0100 @@ -16,14 +16,8 @@ from flask import current_app, request from flask.ctx import has_request_context from babel import dates, numbers, support, Locale -from werkzeug import ImmutableDict -try: - from pytz.gae import pytz -except ImportError: - from pytz import timezone, UTC -else: - timezone = pytz.timezone - UTC = pytz.UTC +from pytz import timezone, UTC +from werkzeug.datastructures import ImmutableDict from flask_babel._compat import string_types from flask_babel.speaklater import LazyString @@ -305,6 +299,9 @@ if hasattr(ctx, key): delattr(ctx, key) + if hasattr(ctx, 'forced_babel_locale'): + ctx.babel_locale = ctx.forced_babel_locale + @contextmanager def force_locale(locale): @@ -325,20 +322,19 @@ yield return - babel = current_app.extensions['babel'] - - orig_locale_selector_func = babel.locale_selector_func orig_attrs = {} for key in ('babel_translations', 'babel_locale'): orig_attrs[key] = getattr(ctx, key, None) try: - babel.locale_selector_func = lambda: locale - for key in orig_attrs: - setattr(ctx, key, None) + ctx.babel_locale = Locale.parse(locale) + ctx.forced_babel_locale = ctx.babel_locale + ctx.babel_translations = None yield finally: - babel.locale_selector_func = orig_locale_selector_func + if hasattr(ctx, 'forced_babel_locale'): + del ctx.forced_babel_locale + for key, value in orig_attrs.items(): setattr(ctx, key, value) @@ -620,6 +616,21 @@ return LazyString(gettext, string, **variables) +def lazy_ngettext(singular, plural, num, **variables): + """Like :func:`ngettext` but the string returned is lazy which means + it will be translated when it is used as an actual string. + + Example:: + + apples = lazy_ngettext(u'%(num)d Apple', u'%(num)d Apples', num=len(apples)) + + @app.route('/') + def index(): + return unicode(apples) + """ + return LazyString(ngettext, singular, plural, num, **variables) + + def lazy_pgettext(context, string, **variables): """Like :func:`pgettext` but the string returned is lazy which means it will be translated when it is used as an actual string. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Flask-Babel-0.12.2/setup.py new/Flask-Babel-1.0.0/setup.py --- old/Flask-Babel-0.12.2/setup.py 2018-10-25 17:36:17.000000000 +0200 +++ new/Flask-Babel-1.0.0/setup.py 2020-02-06 17:32:24.000000000 +0100 @@ -8,7 +8,7 @@ setup( name='Flask-Babel', - version='0.12.2', + version='1.0.0', url='http://github.com/python-babel/flask-babel', license='BSD', author='Armin Ronacher', @@ -20,6 +20,7 @@ zip_safe=False, platforms='any', install_requires=[ + 'pytz', 'Flask', 'Babel>=2.3', 'Jinja2>=2.5' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Flask-Babel-0.12.2/tests/tests.py new/Flask-Babel-1.0.0/tests/tests.py --- old/Flask-Babel-0.12.2/tests/tests.py 2018-10-25 17:31:05.000000000 +0200 +++ new/Flask-Babel-1.0.0/tests/tests.py 2020-02-06 17:20:31.000000000 +0100 @@ -6,13 +6,14 @@ sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..')) import pickle +from threading import Thread, Semaphore import unittest from decimal import Decimal import flask from datetime import datetime, timedelta import flask_babel as babel -from flask_babel import gettext, ngettext, lazy_gettext, get_translations +from flask_babel import gettext, ngettext, lazy_gettext, lazy_ngettext, get_translations from babel.support import NullTranslations from flask_babel._compat import text_type @@ -204,6 +205,46 @@ assert str(babel.get_locale()) == 'en_US' assert str(babel.get_locale()) == 'de_DE' + def test_force_locale_with_threading(self): + app = flask.Flask(__name__) + b = babel.Babel(app) + + @b.localeselector + def select_locale(): + return 'de_DE' + + semaphore = Semaphore(value=0) + + def first_request(): + with app.test_request_context(): + with babel.force_locale('en_US'): + assert str(babel.get_locale()) == 'en_US' + semaphore.acquire() + + thread = Thread(target=first_request) + thread.start() + + try: + with app.test_request_context(): + assert str(babel.get_locale()) == 'de_DE' + finally: + semaphore.release() + thread.join() + + def test_refresh_during_force_locale(self): + app = flask.Flask(__name__) + b = babel.Babel(app) + + @b.localeselector + def select_locale(): + return 'de_DE' + + with app.test_request_context(): + with babel.force_locale('en_US'): + assert str(babel.get_locale()) == 'en_US' + babel.refresh() + assert str(babel.get_locale()) == 'en_US' + class NumberFormattingTestCase(unittest.TestCase): @@ -266,6 +307,18 @@ assert text_type(yes) == 'Yes' assert yes.__html__() == 'Yes' + def test_lazy_ngettext(self): + app = flask.Flask(__name__) + babel.Babel(app, default_locale='de_DE') + one_apple = lazy_ngettext(u'%(num)s Apple', u'%(num)s Apples', 1) + with app.test_request_context(): + assert text_type(one_apple) == '1 Apfel' + assert one_apple.__html__() == '1 Apfel' + two_apples = lazy_ngettext(u'%(num)s Apple', u'%(num)s Apples', 2) + with app.test_request_context(): + assert text_type(two_apples) == u'2 Äpfel' + assert two_apples.__html__() == u'2 Äpfel' + def test_list_translations(self): app = flask.Flask(__name__) b = babel.Babel(app, default_locale='de_DE')
