New features
============
This release fixes regressions introduced in 3.14.1 and many other bugs
(special thanks to Florent Gallaire).

A new Javascript coding style is adopted for Brython scripts, closer to the
most popular guidelines.


Implementation
==============
- reduce the number of functions defined in py_dict.js
- set attribute $factory to user-defined classes to speed up instance creation
- fix O(N²) in bytearray slice assignment (by Florent Gallaire)
- replace all "forEach" by "for(x of y)"
- new JS guidelines : spaces before and after braces in function
  definitions, if / while / for / try / catch / switch etc.
- create a new entry in unicode_data.js for titlecase letters, use it in
  str.title(). Extends PR #2717.
- set minimal version of aiohttp to 3.13.4

Internal tools
==============


Bug fixes
=========
- regression in detection of DOMEvent type in web workers
- bugs in range.mp_subscript
- bug in adapt_grammar_actions.py
- bugs in python_tokenizer.js. Add tests
- define Set.prototype.difference for browsers where it is missing (cf.
  discussion #2696)
- make _operator._compare_digest() a staticmethod. Related to PR #2699
- fix sequence iterator. Related to PR #2715.
- in warning.warns(message, warn_type), if message is a string, the attribute
  `message` of the warning object is an instance of warn_type. Solves the
  issue reported in PR #2740

Issues
- #2680 : aio.Future just crashes in current 3.14 (but OK in 3.13 and before):
  AttributeError: 'Future' object has no attribute 'set_result'
- #2681 : dictionaries passed to console.debug are afterwards JavaScript
  objects and no longer Python dictionaries
- #2682 : using the ajax.get function with a method as a callback results in
  an error
- #2683 : unexpected error with 'inspect.getfullargspec(…)'
- #2686 : set RegExp.escape if it not supported
- #2687 : another unexpected error with 'inspect.getfullargspec(…)'
- #2691 : JavascriptError associated with
  hashlib.sha256(data).update(random.randbytes(16))
- #2693 : parser: f-string containing escaped \" fails with "missing ) after
  argument list"
- #2694 : intLiteral.to_bytes(...) rejected as "invalid decimal literal" when
  literal is hex/oct/bin
- #2712 : nonlocal does not work as expected
- #2747 : str subclasses are not working properly

PRs
(by Florent Gallaire)
- #2697 : fix str.istitle — call str_funcs.title (str.title is undefined)
- #2698 : fix str[bool] — coerce bool to int in mp_subscript
- #2700 : fix weakref ProxyType — forward dunder operators (len, iter, ==,
  repr, …)
- #2701 : fix JSFunction.tp_getattro — expose .name as __name__/__qualname__
- #2702 : fix bound-method — propagate $function_infos through .bind() in
  tp_descr_get
- #2703 : fix type.tp_call — guard against undefined tp_init
- #2704 : fix set_func_names — also iterate tp_funcs (bound methods need
  $function_infos)
- #2705 : fix memoryview — accept bf_getbuffer/$buffer_protocol, tobytes via
  tp_funcs
- #2706 : fix array.tp_new — drop redundant arguments re-destructure shadowing
  args
- #2707 : fix reversed() — init counter in factory/tp_new, drop tp_iter reset
- #2708 : fix range.mp_subscript — use range.mp_length not range.__len__
  (undefined)
- #2709 : fix $delitem — check mp_ass_subscript/sq_ass_item slots (symmetric
  with $setitem)
- #2711 : fix name mangling for parameters of functions nested inside a class
- #2714 : fix float.fromhex() of a negative value (float.__neg__ undefined)
- #2717 : str.title(): titlecase the first letter, not uppercase (fixes
  DŽ/LJ/NJ/DZ digraphs)
- #2718 : jsobj2pyobj: don't re-wrap an already-Python callable
- #2719 : reversed.__reduce__/__setstate__: make reversed picklable
- #2720 : JavascriptArray.__reduce_ex__: make it picklable as a list
- #2721 : str.istitle(): scan the title pattern (CPython algorithm)
- #2722 : str.isalnum(): match CPython (isalpha|isdecimal|isdigit|isnumeric)
- #2723 : memoryview: fix contiguity reporting (.c_contiguous / .f_contiguous
  / .contiguous)
- #2724 : JavascriptArray: support slice subscripts and negative indices
- #2725 : math: isinf coerces via __float__ like isnan/isfinite; fsum handles
  special values (-inf + inf raises ValueError)
- #2726 : math.isinf: coerce the argument via __float__, like isnan and
  isfinite
- #2727 : math.fsum: handle special values (inf, nan); -inf + inf raises
  ValueError
- #2728 : bool: bitwise ops use real bitwise operators and check both
  operands (2 | True returned 2)
- #2729 : object.__reduce_ex__: honor a Python-level __reduce__ override
  (the guard only recognized method_descriptor overrides)
- #2730 : object.__reduce_ex__: dictitems (5th reduce item) must be an
  iterator, not the dict_items view
- #2731 : open(): resolve os.PathLike arguments via __fspath__
- #2734 : bytes/bytearray repeat: handle reflected argument order
  (46 * b'x' raised TypeError)
- #2735 : locals(): return a dict snapshot — the raw frame object is not a
  Python mapping ('x' in locals() raised TypeError)
- #2736 : float binary ops accept only int/float — no __float__ coercion
  (Decimal(5) + 2.2 computed 7.2 instead of raising TypeError)
- #2737 : readinto(bytearray) works: is_buffer walks tp_mro, bytearray gets
  the buffer-protocol flag, BufferedReader reads fd-backed raws, array module
  calls its own funcs table
- #2738 : BufferedReader exposes its raw stream (tp_getset)
- #2739 : Array typecodes
- #2741 : __slots__: '__dict__' and '__weakref__' entries are markers, not
  slots ('__dict__' keeps the per-instance dict)
- #2742 : __slots__: mangle private slot names at class creation (self.__priv
  never found its slot)
- #2743 : object.__getstate__: return (dict-or-None, {slot: value}) when
  __slots__ are filled (CPython 3.11+ pickle protocol)
- #2744 : bytes.__contains__: fix swapped indices (multi-byte needles never
  matched) and use native String.indexOf
- #2745 : int.from_bytes: don't pre-complement the low byte (signed values
  with a high low-byte came out 256 short)
- #2746 : class comparison honors a custom metaclass __eq__/__ne__ (identity
  shortcut only under plain type)

(by dgrilawidbanana)
- #2710 : Fix false syntax errors for OR patterns

(by lphuc2250gma)
- #2716 : chore: improve brython maintenance path

Brython site
============


Github site
===========


Demos
=====


Standard distribution
=====================


Documentation
=============
