cherrypy-foundation 1.0.0a8__tar.gz → 1.0.0a9__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. {cherrypy_foundation-1.0.0a8/src/cherrypy_foundation.egg-info → cherrypy_foundation-1.0.0a9}/PKG-INFO +1 -1
  2. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/Field.jinja +2 -0
  3. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/Fields.jinja +0 -2
  4. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/tools/i18n.py +14 -8
  5. cherrypy_foundation-1.0.0a9/src/cherrypy_foundation/tools/tests/locales/de/LC_MESSAGES/messages.mo +0 -0
  6. cherrypy_foundation-1.0.0a9/src/cherrypy_foundation/tools/tests/locales/de/LC_MESSAGES/messages.po +15 -0
  7. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/tools/tests/test_i18n.py +46 -3
  8. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9/src/cherrypy_foundation.egg-info}/PKG-INFO +1 -1
  9. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation.egg-info/SOURCES.txt +2 -0
  10. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/.gitignore +0 -0
  11. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/.gitlab-ci.yml +0 -0
  12. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/LICENSE.md +0 -0
  13. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/README.md +0 -0
  14. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/debian/TODO +0 -0
  15. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/debian/changelog +0 -0
  16. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/debian/control +0 -0
  17. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/debian/copyright +0 -0
  18. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/debian/python3-cherrypy-foundation.docs +0 -0
  19. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/debian/python3-cherrypy-foundation.links +0 -0
  20. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/debian/rules +0 -0
  21. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/debian/source/format +0 -0
  22. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/debian/source/options +0 -0
  23. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/debian/upstream/metadata +0 -0
  24. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/pyproject.toml +0 -0
  25. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/setup.cfg +0 -0
  26. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/sonar-project.properties +0 -0
  27. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/__init__.py +0 -0
  28. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/ColorModes.jinja +0 -0
  29. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/Datatable.css +0 -0
  30. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/Datatable.jinja +0 -0
  31. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/Datatable.js +0 -0
  32. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/Field.css +0 -0
  33. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/Field.js +0 -0
  34. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/Flash.jinja +0 -0
  35. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/Icon.jinja +0 -0
  36. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/SideBySideMultiSelect.css +0 -0
  37. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/SideBySideMultiSelect.jinja +0 -0
  38. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/SideBySideMultiSelect.js +0 -0
  39. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/Typeahead.css +0 -0
  40. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/Typeahead.jinja +0 -0
  41. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/Typeahead.js +0 -0
  42. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/__init__.py +0 -0
  43. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/tests/__init__.py +0 -0
  44. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/tests/test_static.py +0 -0
  45. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/bootstrap-icons/bootstrap-icons.css +0 -0
  46. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/bootstrap-icons/bootstrap-icons.min.css +0 -0
  47. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/bootstrap-icons/fonts/bootstrap-icons.woff +0 -0
  48. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/bootstrap-icons/fonts/bootstrap-icons.woff2 +0 -0
  49. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/bootstrap5/css/bootstrap.css +0 -0
  50. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/bootstrap5/css/bootstrap.css.map +0 -0
  51. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/bootstrap5/css/bootstrap.min.css +0 -0
  52. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/bootstrap5/css/bootstrap.min.css.map +0 -0
  53. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/bootstrap5/js/bootstrap.js +0 -0
  54. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/bootstrap5/js/bootstrap.js.map +0 -0
  55. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/bootstrap5/js/bootstrap.min.js +0 -0
  56. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/bootstrap5/js/bootstrap.min.js.map +0 -0
  57. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/bootstrap5/js/color-modes.js +0 -0
  58. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/datatables/css/dataTables.dataTables.css +0 -0
  59. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/datatables/css/dataTables.dataTables.min.css +0 -0
  60. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/datatables/images/sort_asc.png +0 -0
  61. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/datatables/images/sort_asc_disabled.png +0 -0
  62. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/datatables/images/sort_both.png +0 -0
  63. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/datatables/images/sort_desc.png +0 -0
  64. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/datatables/images/sort_desc_disabled.png +0 -0
  65. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/datatables/js/dataTables.js +0 -0
  66. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/datatables/js/dataTables.min.js +0 -0
  67. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/datatables-extensions/Buttons/css/buttons.dataTables.css +0 -0
  68. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/datatables-extensions/Buttons/css/buttons.dataTables.min.css +0 -0
  69. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/datatables-extensions/Buttons/js/buttons.html5.js +0 -0
  70. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/datatables-extensions/Buttons/js/buttons.html5.min.js +0 -0
  71. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/datatables-extensions/Buttons/js/dataTables.buttons.js +0 -0
  72. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/datatables-extensions/Buttons/js/dataTables.buttons.min.js +0 -0
  73. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/datatables-extensions/FixedHeader/css/fixedHeader.dataTables.css +0 -0
  74. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/datatables-extensions/FixedHeader/css/fixedHeader.dataTables.min.css +0 -0
  75. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/datatables-extensions/FixedHeader/js/dataTables.fixedHeader.js +0 -0
  76. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/datatables-extensions/FixedHeader/js/dataTables.fixedHeader.min.js +0 -0
  77. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/datatables-extensions/JSZip/jszip.js +0 -0
  78. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/datatables-extensions/JSZip/jszip.min.js +0 -0
  79. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/datatables-extensions/Responsive/css/responsive.dataTables.css +0 -0
  80. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/datatables-extensions/Responsive/css/responsive.dataTables.min.css +0 -0
  81. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/datatables-extensions/Responsive/js/dataTables.responsive.js +0 -0
  82. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/datatables-extensions/Responsive/js/dataTables.responsive.min.js +0 -0
  83. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/datatables-extensions/pdfmake/build/pdfmake.js +0 -0
  84. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/datatables-extensions/pdfmake/build/pdfmake.min.js +0 -0
  85. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/datatables-extensions/pdfmake/build/vfs_fonts.js +0 -0
  86. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/datatables-extensions/rowgroup/css/rowGroup.dataTables.css +0 -0
  87. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/datatables-extensions/rowgroup/css/rowGroup.dataTables.min.css +0 -0
  88. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/datatables-extensions/rowgroup/js/dataTables.rowGroup.js +0 -0
  89. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/datatables-extensions/rowgroup/js/dataTables.rowGroup.min.js +0 -0
  90. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/jquery/jquery.min.js +0 -0
  91. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/multi/LICENSE +0 -0
  92. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/multi/README.md +0 -0
  93. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/multi/multi.css +0 -0
  94. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/multi/multi.js +0 -0
  95. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/popper/popper.js +0 -0
  96. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/popper/popper.min.js +0 -0
  97. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/typeahead/jquery.typeahead.min.css +0 -0
  98. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/components/vendor/typeahead/jquery.typeahead.min.js +0 -0
  99. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/error_page.py +0 -0
  100. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/flash.py +0 -0
  101. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/form.py +0 -0
  102. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/logging.py +0 -0
  103. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/passwd.py +0 -0
  104. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/plugins/__init__.py +0 -0
  105. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/plugins/db.py +0 -0
  106. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/plugins/ldap.py +0 -0
  107. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/plugins/restapi.py +0 -0
  108. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/plugins/scheduler.py +0 -0
  109. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/plugins/smtp.py +0 -0
  110. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/plugins/tests/__init__.py +0 -0
  111. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/plugins/tests/test_db.py +0 -0
  112. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/plugins/tests/test_ldap.py +0 -0
  113. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/plugins/tests/test_scheduler.py +0 -0
  114. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/plugins/tests/test_smtp.py +0 -0
  115. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/tests/__init__.py +0 -0
  116. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/tests/templates/test_flash.html +0 -0
  117. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/tests/templates/test_form.html +0 -0
  118. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/tests/templates/test_url.html +0 -0
  119. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/tests/test_error_page.py +0 -0
  120. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/tests/test_flash.py +0 -0
  121. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/tests/test_form.py +0 -0
  122. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/tests/test_passwd.py +0 -0
  123. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/tests/test_url.py +0 -0
  124. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/tools/__init__.py +0 -0
  125. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/tools/auth.py +0 -0
  126. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/tools/auth_mfa.py +0 -0
  127. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/tools/errors.py +0 -0
  128. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/tools/jinja2.py +0 -0
  129. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/tools/ratelimit.py +0 -0
  130. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/tools/secure_headers.py +0 -0
  131. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/tools/sessions_timeout.py +0 -0
  132. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/tools/tests/__init__.py +0 -0
  133. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/tools/tests/components/Button.jinja +0 -0
  134. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/tools/tests/locales/en/LC_MESSAGES/messages.mo +0 -0
  135. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/tools/tests/locales/en/LC_MESSAGES/messages.po +0 -0
  136. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/tools/tests/locales/fr/LC_MESSAGES/messages.mo +0 -0
  137. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/tools/tests/locales/fr/LC_MESSAGES/messages.po +0 -0
  138. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/tools/tests/locales/messages.pot +0 -0
  139. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/tools/tests/templates/test_jinja2.html +0 -0
  140. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/tools/tests/templates/test_jinja2_i18n.html +0 -0
  141. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/tools/tests/templates/test_jinjax.html +0 -0
  142. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/tools/tests/test_auth.py +0 -0
  143. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/tools/tests/test_auth_mfa.py +0 -0
  144. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/tools/tests/test_jinja2.py +0 -0
  145. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/tools/tests/test_ratelimit.py +0 -0
  146. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/url.py +0 -0
  147. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation/widgets.py +0 -0
  148. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation.egg-info/dependency_links.txt +0 -0
  149. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation.egg-info/requires.txt +0 -0
  150. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/src/cherrypy_foundation.egg-info/top_level.txt +0 -0
  151. {cherrypy_foundation-1.0.0a8 → cherrypy_foundation-1.0.0a9}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cherrypy-foundation
3
- Version: 1.0.0a8
3
+ Version: 1.0.0a9
4
4
  Summary: CherryPy Foundation
5
5
  Author-email: Patrik Dufresne <patrik@ikus-soft.com>
6
6
  License: GPLv3
@@ -1,4 +1,6 @@
1
1
  {# def field, floating=False #}
2
+ {#css vendor/bootstrap5/css/bootstrap.min.css #}
3
+ {#js vendor/jquery/jquery.min.js, vendor/popper/popper.min.js, vendor/bootstrap5/js/bootstrap.min.js #}
2
4
  {# djlint:off #}
3
5
  {% set bootstrap_class_table = {
4
6
  "CheckboxInput": ("form-check-input", "form-check-label", False, True),
@@ -1,6 +1,4 @@
1
1
  {# def form, floating=False #}
2
- {#css vendor/bootstrap5/css/bootstrap.min.css #}
3
- {#js vendor/jquery/jquery.min.js, vendor/popper/popper.min.js, vendor/bootstrap5/js/bootstrap.min.js #}
4
2
  <div class="row">
5
3
  {% for id, field in form._fields.items() %}<Field field={{ field }} floating={{ floating }} />{% endfor %}
6
4
  </div>
@@ -162,7 +162,7 @@ def preferred_timezone(timezone):
162
162
 
163
163
 
164
164
  @lru_cache(maxsize=10)
165
- def _search_translation(dirname, domain, *langs):
165
+ def _search_translation(dirname, domain, *locales):
166
166
  """
167
167
  Loads the first existing translations for known locale.
168
168
 
@@ -177,15 +177,19 @@ def _search_translation(dirname, domain, *langs):
177
177
 
178
178
  :returns: Translations, the corresponding Locale object.
179
179
  """
180
- if not isinstance(langs, (list, tuple)):
181
- langs = [langs]
182
- t = Translations.load(dirname, langs, domain)
180
+ if not isinstance(locales, (list, tuple)):
181
+ locales = [locales]
182
+ t = Translations.load(dirname, locales, domain)
183
183
  # Ignore null translation
184
184
  if t.__class__ is NullTranslations:
185
185
  return None
186
- # Get Locale from file name
187
- lang = t.files[0].split('/')[-3]
188
- t.locale = Locale.parse(lang)
186
+ # Assign prefered local to this translation to know the current locale.
187
+ trans_locale = Locale.parse(t.files[0].split('/')[-3])
188
+ for locale in locales:
189
+ locale = Locale.parse(locale)
190
+ if trans_locale == locale or trans_locale.language == locale.language:
191
+ t.locale = locale
192
+ break
189
193
  return t
190
194
 
191
195
 
@@ -424,7 +428,9 @@ def _set_content_language(**kwargs):
424
428
  language of `cherrypy.response.i18n.locale`.
425
429
  """
426
430
  if 'Content-Language' not in cherrypy.response.headers:
427
- cherrypy.response.headers['Content-Language'] = str(get_translation().locale)
431
+ locale = get_translation().locale
432
+ language_tag = f"{locale.language}-{locale.territory}" if locale.territory else locale.language
433
+ cherrypy.response.headers['Content-Language'] = language_tag
428
434
 
429
435
 
430
436
  class I18nTool(cherrypy.Tool):
@@ -0,0 +1,15 @@
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: \n"
4
+ "POT-Creation-Date: \n"
5
+ "PO-Revision-Date: \n"
6
+ "Last-Translator: \n"
7
+ "Language-Team: \n"
8
+ "Language: de\n"
9
+ "MIME-Version: 1.0\n"
10
+ "Content-Type: text/plain; charset=UTF-8\n"
11
+ "Content-Transfer-Encoding: 8bit\n"
12
+ "X-Generator: Poedit 3.6\n"
13
+
14
+ msgid "Some text to translate"
15
+ msgstr "Einige zu übersetzende Texte"
@@ -83,6 +83,13 @@ class AbstractI18nTest(helper.CPWebCase):
83
83
 
84
84
  class TestI18nWebCase(AbstractI18nTest):
85
85
 
86
+ def test_language_with_invalid(self):
87
+ # Query the page without login-in
88
+ self.getPage("/", headers=[("Accept-Language", "invalid")])
89
+ self.assertStatus('200 OK')
90
+ self.assertHeaderItemValue("Content-Language", "en")
91
+ self.assertInBody(TEXT_EN)
92
+
86
93
  def test_language_with_unknown(self):
87
94
  # Query the page without login-in
88
95
  self.getPage("/", headers=[("Accept-Language", "it")])
@@ -93,13 +100,13 @@ class TestI18nWebCase(AbstractI18nTest):
93
100
  def test_language_en(self):
94
101
  self.getPage("/", headers=[("Accept-Language", "en-US,en;q=0.8")])
95
102
  self.assertStatus('200 OK')
96
- self.assertHeaderItemValue("Content-Language", "en")
103
+ self.assertHeaderItemValue("Content-Language", "en-US")
97
104
  self.assertInBody(TEXT_EN)
98
105
 
99
106
  def test_language_en_fr(self):
100
107
  self.getPage("/", headers=[("Accept-Language", "en-US,en;q=0.8,fr-CA;q=0.8")])
101
108
  self.assertStatus('200 OK')
102
- self.assertHeaderItemValue("Content-Language", "en")
109
+ self.assertHeaderItemValue("Content-Language", "en-US")
103
110
  self.assertInBody(TEXT_EN)
104
111
 
105
112
  def test_language_fr(self):
@@ -107,7 +114,7 @@ class TestI18nWebCase(AbstractI18nTest):
107
114
  self.assertInBody(TEXT_EN)
108
115
  self.getPage("/", headers=[("Accept-Language", "fr-CA;q=0.8,fr;q=0.6")])
109
116
  self.assertStatus('200 OK')
110
- self.assertHeaderItemValue("Content-Language", "fr")
117
+ self.assertHeaderItemValue("Content-Language", "fr-CA")
111
118
  self.assertInBody(TEXT_FR)
112
119
 
113
120
  def test_with_preferred_lang(self):
@@ -125,6 +132,42 @@ class TestI18nWebCase(AbstractI18nTest):
125
132
  self.assertEqual(TEXT_EN, i18n.ugettext(TEXT_EN))
126
133
  self.assertIn('March', i18n.format_datetime(date, format='long'))
127
134
 
135
+ def test_format_datetime_locales(self):
136
+ date = datetime.fromtimestamp(1680111611, timezone.utc)
137
+ with i18n.preferred_timezone('utc'):
138
+ with i18n.preferred_lang('fr'):
139
+ self.assertEqual('29 mars 2023, 17:40:11 TU', i18n.format_datetime(date, format='long'))
140
+ with i18n.preferred_lang('en'):
141
+ self.assertEqual('March 29, 2023, 5:40:11\u202fPM UTC', i18n.format_datetime(date, format='long'))
142
+ with i18n.preferred_lang('en_US'):
143
+ self.assertEqual('March 29, 2023, 5:40:11\u202fPM UTC', i18n.format_datetime(date, format='long'))
144
+ with i18n.preferred_lang('en_GB'):
145
+ self.assertEqual('29 March 2023, 17:40:11 UTC', i18n.format_datetime(date, format='long'))
146
+ with i18n.preferred_lang('en_CH'):
147
+ self.assertEqual('29 March 2023, 17:40:11 UTC', i18n.format_datetime(date, format='long'))
148
+ with i18n.preferred_lang('de'):
149
+ self.assertEqual('29. März 2023, 17:40:11 UTC', i18n.format_datetime(date, format='long'))
150
+ with i18n.preferred_lang('de_CH'):
151
+ self.assertEqual('29. März 2023, 17:40:11 UTC', i18n.format_datetime(date, format='long'))
152
+
153
+ with i18n.preferred_timezone('CET'):
154
+ with i18n.preferred_lang('fr'):
155
+ self.assertEqual('29 mars 2023, 19:40:11 +0200', i18n.format_datetime(date, format='long'))
156
+ with i18n.preferred_lang('fr_CH'):
157
+ self.assertEqual('29 mars 2023, 19:40:11 +0200', i18n.format_datetime(date, format='long'))
158
+ with i18n.preferred_lang('en'):
159
+ self.assertEqual('March 29, 2023, 7:40:11\u202fPM +0200', i18n.format_datetime(date, format='long'))
160
+ with i18n.preferred_lang('en_US'):
161
+ self.assertEqual('March 29, 2023, 7:40:11\u202fPM +0200', i18n.format_datetime(date, format='long'))
162
+ with i18n.preferred_lang('en_GB'):
163
+ self.assertEqual('29 March 2023, 19:40:11 CEST', i18n.format_datetime(date, format='long'))
164
+ with i18n.preferred_lang('en_CH'):
165
+ self.assertEqual('29 March 2023, 19:40:11 CEST', i18n.format_datetime(date, format='long'))
166
+ with i18n.preferred_lang('de'):
167
+ self.assertEqual('29. März 2023, 19:40:11 MESZ', i18n.format_datetime(date, format='long'))
168
+ with i18n.preferred_lang('de_CH'):
169
+ self.assertEqual('29. März 2023, 19:40:11 MESZ', i18n.format_datetime(date, format='long'))
170
+
128
171
 
129
172
  class TestI18nDefaultLangWebCase(AbstractI18nTest):
130
173
  default_lang = 'FR'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cherrypy-foundation
3
- Version: 1.0.0a8
3
+ Version: 1.0.0a9
4
4
  Summary: CherryPy Foundation
5
5
  Author-email: Patrik Dufresne <patrik@ikus-soft.com>
6
6
  License: GPLv3
@@ -138,6 +138,8 @@ src/cherrypy_foundation/tools/tests/test_jinja2.py
138
138
  src/cherrypy_foundation/tools/tests/test_ratelimit.py
139
139
  src/cherrypy_foundation/tools/tests/components/Button.jinja
140
140
  src/cherrypy_foundation/tools/tests/locales/messages.pot
141
+ src/cherrypy_foundation/tools/tests/locales/de/LC_MESSAGES/messages.mo
142
+ src/cherrypy_foundation/tools/tests/locales/de/LC_MESSAGES/messages.po
141
143
  src/cherrypy_foundation/tools/tests/locales/en/LC_MESSAGES/messages.mo
142
144
  src/cherrypy_foundation/tools/tests/locales/en/LC_MESSAGES/messages.po
143
145
  src/cherrypy_foundation/tools/tests/locales/fr/LC_MESSAGES/messages.mo