summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2023-03-09 15:34:17 +0000
committerCoprDistGit <infra@openeuler.org>2023-03-09 15:34:17 +0000
commit5a7f0ca154ea217c7c7bf7601e863886ec69e8bc (patch)
treedc76762d71cfe2595eddccee51ff62982664457c
parent6eb00f24f3a2711b61794576efb938c03586afa8 (diff)
automatic import of python-pyicu
-rw-r--r--.gitignore1
-rw-r--r--python-pyicu.spec1113
-rw-r--r--sources1
3 files changed, 1115 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index e69de29..83e5cb2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -0,0 +1 @@
+/PyICU-2.10.2.tar.gz
diff --git a/python-pyicu.spec b/python-pyicu.spec
new file mode 100644
index 0000000..c6bc1b5
--- /dev/null
+++ b/python-pyicu.spec
@@ -0,0 +1,1113 @@
+%global _empty_manifest_terminate_build 0
+Name: python-PyICU
+Version: 2.10.2
+Release: 1
+Summary: Python extension wrapping the ICU C++ API
+License: MIT
+URL: https://gitlab.pyicu.org/main/pyicu
+Source0: https://mirrors.nju.edu.cn/pypi/web/packages/64/00/a531e119a97e54601f616f5061879ec2d4bb058d225014f9acf94b2970c3/PyICU-2.10.2.tar.gz
+BuildArch: noarch
+
+
+%description
+# README file for PyICU
+
+## Welcome
+
+Welcome to PyICU, a Python extension wrapping the ICU C++ libraries.
+
+ICU stands for "International Components for Unicode".
+These are the i18n libraries of the Unicode Consortium.
+They implement much of the Unicode Standard,
+many of its companion Unicode Technical Standards,
+and much of Unicode CLDR.
+
+The PyICU source code is hosted at https://gitlab.pyicu.org/main/pyicu.
+
+The ICU homepage is https://icu.unicode.org/
+
+See also the CLDR homepage at http://cldr.unicode.org/
+
+## Installing PyICU
+
+PyICU is a python extension implemented in C++ that wraps the C/C++ ICU library.
+It is known to also work as a [PyPy](https://www.pypy.org/) extension.
+Unless ``pkg-config`` and the ICU libraries and headers are already installed,
+building PyICU from the sources on [PyPI](https://pypi.org/project/PyICU/)
+involves more than just a ``pip`` call. Many operating systems distribute
+pre-built binary packages of ICU and PyICU, see below.
+
+ - Mac OS X
+ - Ensure ICU is installed and can be found by `pkg-config` (as `icu-config` was [deprecated](https://unicode-org.github.io/icu/userguide/icu/howtouseicu.html#c-makefiles) as of ICU 63.1), either by following [ICU build instructions](https://unicode-org.github.io/icu/userguide/icu4c/build.html), or by using Homebrew:
+ ```sh
+ # install libicu (keg-only)
+ brew install pkg-config icu4c
+
+ # let setup.py discover keg-only icu4c via pkg-config
+ export PATH="/usr/local/opt/icu4c/bin:/usr/local/opt/icu4c/sbin:$PATH"
+ export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/usr/local/opt/icu4c/lib/pkgconfig"
+ ```
+ - Install PyICU **with the same C++ compiler as your Python distribution**
+ ([more info](https://gitlab.pyicu.org/main/pyicu/merge_requests/140#issuecomment-782283491)):
+ ```sh
+ # EITHER - when using a gcc-built CPython (e.g. from Homebrew)
+ export CC="$(which gcc)" CXX="$(which g++)"
+ # OR - when using system CPython or another clang-based CPython, ensure system clang is used (for proper libstdc++ https://gitlab.pyicu.org/main/pyicu/issues/5#issuecomment-291631507):
+ unset CC CXX
+
+ # avoid wheels from previous runs or PyPI
+ pip install --no-binary=:pyicu: pyicu
+ ```
+
+ - ICU and PyICU binaries are both available via [Macports](https://www.macports.org/) as well. The same limitations about mixing binaries may apply.
+ ```sh
+ # see versions available
+ /opt/local/bin/port search pyicu
+ sudo /opt/local/bin/port install ...
+ ```
+
+ - Debian
+ ```sh
+ apt-get update
+
+ # EITHER - from apt directly https://packages.debian.org/source/stable/pyicu
+ apt-get install python3-icu
+ # OR - from source
+ apt-get install pkg-config libicu-dev
+ pip install --no-binary=:pyicu: pyicu
+ ```
+
+ - Ubuntu: similar to Debian, there is a pyicu
+ [package](https://packages.ubuntu.com/source/xenial/python/pyicu)
+ available via ``apt``.
+
+ - Alpine Linux: there is a pyicu
+ [package](https://pkgs.alpinelinux.org/package/edge/community/x86/py3-icu)
+ available via ``apk``.
+
+ - NetBSD: there is a pyicu [package](https://pkgsrc.se/textproc/py-ICU)
+ available via ``pkg_add``.
+
+ - OpenBSD: there is a pyicu [package](https://openports.se/textproc/py-ICU)
+ available via ``pkg_add``.
+
+ - Other operating systems: see below.
+
+## Building PyICU
+
+*Please, refer to [next section](#building-pyicu-python-3-and-icu-from-sources) for building Python, ICU and PyICU from sources.
+The current section is about building only PyICU from sources, with all dependencies such as Python and ICU already present.*
+
+Before building PyICU the ICU libraries must be built and installed. Refer
+to each system's [instructions](https://unicode-org.github.io/icu/userguide/icu4c/build.html) for more information.
+
+PyICU is built from sources with ``setuptools`` or with ``build`` and ``pip``:
+
+ - verify that ``pkg-config`` is available (the ``icu-config`` program is
+ [deprecated](https://unicode-org.github.io/icu/userguide/icu/howtouseicu.html#c-makefiles)
+ as of ICU 63.1)
+ ```sh
+ pkg-config --cflags --libs icu-i18n
+ ```
+ If this command returns an error or doesn't return the paths expected
+ then ensure that the ``INCLUDES``, ``LFLAGS``, ``CFLAGS`` and ``LIBRARIES``
+ dictionaries in ``setup.py`` contain correct values for your platform.
+ Starting with ICU 60, ``-std=c++11`` must appear in your CFLAGS or be the
+ default for your C++ compiler.
+
+ - **either** build and install PyICU with ``setuptools``
+ ```sh
+ python setup.py build
+ sudo python setup.py install
+ ```
+
+ - **or** build PyICU with ``build`` and install it with ``pip``
+ ```sh
+ python -m build
+ sudo python -m pip install dist/PyICU-<version>-<platform>.whl
+ ```
+
+ - **either** test PyICU with ``setuptools``
+ ```sh
+ python setup.py test
+ ```
+
+ - **or** test PyICU with ``pytest``
+ ```sh
+ python -m pytest
+ ```
+
+
+## Building PyICU, Python 3 and ICU from sources
+
+The instructions at [note_855](https://gitlab.pyicu.org/main/pyicu/-/issues/153#note_855) contain the complete steps for building everything from sources into
+a self-contained directory, without modifying any system directories. They were
+made and tested on an M1 Mac but they can be modified and reused for any unix
+environment. In particular, they outline how to build PyICU from sources
+without icu-config or pkg-config being present.
+
+
+## Running PyICU
+
+ - Mac OS X
+ Make sure that ``DYLD_LIBRARY_PATH`` contains paths to the directory(ies)
+ containing the ICU libs.
+
+ - Linux & Solaris
+ Make sure that ``LD_LIBRARY_PATH`` contains paths to the directory(ies)
+ containing the ICU libs or that you added the corresponding ``-rpath``
+ argument to ``LFLAGS``.
+
+ - Windows
+ Make sure that ``PATH`` contains paths to the directory(ies)
+ containing the ICU DLLs.
+
+
+## What's available
+
+See the [CHANGES](https://gitlab.pyicu.org/main/pyicu/blob/main/CHANGES) file
+for an up to date log of changes and additions.
+
+
+## API Documentation
+
+There is no API documentation for PyICU. The API for ICU is documented at
+https://unicode-org.github.io/icu-docs/apidoc/released/icu4c/ and the
+following patterns can be used to translate from the C++ APIs to the
+corresponding Python APIs.
+
+### strings
+
+The ICU string type, [UnicodeString](https://unicode-org.github.io/icu-docs/apidoc/dev/icu4c/classicu_1_1UnicodeString.html), is a type pointing at a mutable array of [UChar](https://unicode-org.github.io/icu-docs/apidoc/dev/icu4c/umachine_8h.html#a6bb9fad572d65b305324ef288165e2ac) Unicode 16-bit wide characters and is described [here](https://unicode-org.github.io/icu-docs/apidoc/dev/icu4c/classicu_1_1UnicodeString.html#details). The Python 3 [str](https://docs.python.org/3/library/stdtypes.html#str) type is described [here](https://docs.python.org/3/library/stdtypes.html#index-26) and [here](https://docs.python.org/3/howto/unicode.html). The Python 2 [unicode](https://docs.python.org/2.7/reference/datamodel.html#index-23) type is described [here](https://docs.python.org/2.7/library/stdtypes.html#sequence-types-str-unicode-list-tuple-bytearray-buffer-xrange).
+
+Because of their differences, ICU's and Python's string objects are not merged
+into the same type when crossing the C++ boundary but converted.
+
+ICU APIs taking ``UnicodeString`` arguments have been overloaded to also
+accept arguments that are Python 3 ``str`` or Python 2 ``unicode`` objects.
+Python 2 ``str`` objects are auto-decoded into ICU strings using the ``utf-8``
+encoding.
+
+To convert a Python 3 ``bytes`` or a Python 2 ``str`` object encoded in an
+encoding other than ``utf-8`` to an ICU ``UnicodeString`` use the
+``UnicodeString(str, encodingName)`` constructor.
+
+ICU's C++ APIs accept and return ``UnicodeString`` arguments in several
+ways: by value, by pointer or by reference.
+When an ICU C++ API is documented to accept a ``UnicodeString`` reference
+parameter, it is safe to assume that there are several corresponding
+PyICU python APIs making it accessible in simpler ways:
+
+For example, the ``'UnicodeString &Locale::getDisplayName(UnicodeString &)'``
+API, documented
+[here](https://unicode-org.github.io/icu-docs/apidoc/released/icu4c/classicu_1_1Locale.html#a61def321a9cfd9904b59e3f1897f835e),
+can be invoked from Python in several ways:
+
+1. The ICU way
+
+ >>> from icu import UnicodeString, Locale
+ >>> locale = Locale('pt_BR')
+ >>> string = UnicodeString()
+ >>> name = locale.getDisplayName(string)
+ >>> name
+ <UnicodeString: 'Portuguese (Brazil)'>
+ >>> name is string
+ True <-- string arg was returned, modified in place
+
+2. The Python way
+
+ >>> from icu import Locale
+ >>> locale = Locale('pt_BR')
+ >>> name = locale.getDisplayName()
+ >>> name
+ 'Portuguese (Brazil)'
+
+ A ``UnicodeString`` object was allocated and converted to a Python
+ ``str`` object.
+
+A UnicodeString can be converted to a Python unicode string with Python 3's
+``str()`` or Python 2's ``unicode()`` constructor. The usual ``len()``,
+comparison, `[]`` and ``[:]`` operators are all available, with the additional
+twists that slicing is not read-only and that ``+=`` is also available since a
+UnicodeString is mutable. For example:
+
+ >>> name = locale.getDisplayName()
+ 'Portuguese (Brazil)'
+ >>> name = UnicodeString(name)
+ >>> name
+ <UnicodeString: 'Portuguese (Brazil)'>
+ >>> str(name)
+ 'Portuguese (Brazil)'
+ >>> len(name)
+ 19
+ >>> str(name)
+ 'Portuguese (Brazil)'
+ >>> name[3]
+ 't'
+ >>> name[12:18]
+ <UnicodeString: 'Brazil'>
+ >>> name[12:18] = 'the country of Brasil'
+ >>> name
+ <UnicodeString: 'Portuguese (the country of Brasil)'>
+ >>> name += ' oh joy'
+ >>> name
+ <UnicodeString: 'Portuguese (the country of Brasil) oh joy'>
+
+### error reporting
+
+The C++ ICU library does not use C++ exceptions to report errors. ICU
+C++ APIs return errors via a ``UErrorCode`` reference argument. All such
+APIs are wrapped by Python APIs that omit this argument and throw an
+``ICUError`` Python exception instead. The same is true for ICU APIs
+taking both a ``ParseError`` and a ``UErrorCode``, they are both to be
+omitted.
+
+For example, the ``'UnicodeString &DateFormat::format(const Formattable &, UnicodeString &, FieldPosition &, UErrorCode &)'`` API, documented [here](https://unicode-org.github.io/icu-docs/apidoc/released/icu4c/classicu_1_1DateFormat.html#aae63209f1202550c91e2beed5691b062) is invoked from Python with:
+
+ >>> from icu import DateFormat, Formattable
+ >>> df = DateFormat.createInstance()
+ >>> df
+ <SimpleDateFormat: M/d/yy h:mm a>
+ >>> f = Formattable(940284258.0, Formattable.kIsDate)
+ >>> df.format(f)
+ '10/18/99 3:04 PM'
+
+Of course, the simpler ``'UnicodeString &DateFormat::format(UDate, UnicodeString &)'`` documented [here](https://unicode-org.github.io/icu-docs/apidoc/released/icu4c/classicu_1_1DateFormat.html#a5940ccf5676d3fa043d8255c55b7ddd1) can be used too:
+
+ >>> from icu import DateFormat
+ >>> df = DateFormat.createInstance()
+ >>> df
+ <SimpleDateFormat: M/d/yy h:mm a>
+ >>> df.format(940284258.0)
+ '10/18/99 3:04 PM'
+
+### dates
+
+ICU uses a double floating point type called ``UDate`` that represents the
+number of milliseconds elapsed since 1970-jan-01 UTC for dates.
+
+In Python, the value returned by the ``time`` module's ``time()``
+function is the number of seconds since 1970-jan-01 UTC. Because of this
+difference, floating point values are multiplied by 1000 when passed to
+APIs taking ``UDate`` and divided by 1000 when returned as ``UDate``.
+
+Python's ``datetime`` objects, with or without timezone information, can
+also be used with APIs taking ``UDate`` arguments. The ``datetime``
+objects get converted to ``UDate`` when crossing into the C++ layer.
+
+### arrays
+
+Many ICU API take array arguments. A list of elements of the array
+element types is to be passed from Python.
+
+### StringEnumeration
+
+An ICU ``StringEnumeration`` has three ``next`` methods: ``next()`` which
+returns ``str`` objects, ``unext()`` which returns ``str`` objects in Python 3
+or ``unicode`` objects in Python 2 and ``snext()`` which returns
+``UnicodeString`` objects. Any of these methods can be used as an iterator,
+using the Python built-in ``iter`` function.
+
+For example, let ``e`` be a ``StringEnumeration`` instance:
+
+```python
+e = TimeZone.createEnumeration()
+[s for s in e] # a list of 'str' objects
+[s for s in iter(e.unext, '')] # a list of 'str' or 'unicode' objects
+[s for s in iter(e.snext, '')] # a list of 'UnicodeString' objects
+```
+
+### timezones
+
+The ICU ``TimeZone`` type may be wrapped with an ``ICUtzinfo`` type for
+usage with Python's ``datetime`` type. For example:
+
+```python
+from datetime import datetime
+tz = ICUtzinfo(TimeZone.createTimeZone('US/Mountain'))
+datetime.now(tz)
+```
+
+or, even simpler:
+
+```python
+tz = ICUtzinfo.getInstance('Pacific/Fiji')
+datetime.now(tz)
+```
+
+To get the default time zone use:
+
+```python
+defaultTZ = ICUtzinfo.getDefault()
+```
+
+To get the time zone's id, use the ``tzid`` attribute or coerce the time
+zone to a string:
+
+```python
+ICUtzinfo.getInstance('Pacific/Fiji').tzid -> 'Pacific/Fiji'
+str(ICUtzinfo.getInstance('Pacific/Fiji')) -> 'Pacific/Fiji'
+```
+
+## Further Reading
+
+The [unit tests](https://gitlab.pyicu.org/main/pyicu/-/tree/main/test) have
+more examples of actual PyICU usage.
+
+There are also a few
+[samples](https://gitlab.pyicu.org/main/pyicu/-/tree/main/samples) ported from
+ICU C/C++.
+
+
+%package -n python3-PyICU
+Summary: Python extension wrapping the ICU C++ API
+Provides: python-PyICU
+BuildRequires: python3-devel
+BuildRequires: python3-setuptools
+BuildRequires: python3-pip
+%description -n python3-PyICU
+# README file for PyICU
+
+## Welcome
+
+Welcome to PyICU, a Python extension wrapping the ICU C++ libraries.
+
+ICU stands for "International Components for Unicode".
+These are the i18n libraries of the Unicode Consortium.
+They implement much of the Unicode Standard,
+many of its companion Unicode Technical Standards,
+and much of Unicode CLDR.
+
+The PyICU source code is hosted at https://gitlab.pyicu.org/main/pyicu.
+
+The ICU homepage is https://icu.unicode.org/
+
+See also the CLDR homepage at http://cldr.unicode.org/
+
+## Installing PyICU
+
+PyICU is a python extension implemented in C++ that wraps the C/C++ ICU library.
+It is known to also work as a [PyPy](https://www.pypy.org/) extension.
+Unless ``pkg-config`` and the ICU libraries and headers are already installed,
+building PyICU from the sources on [PyPI](https://pypi.org/project/PyICU/)
+involves more than just a ``pip`` call. Many operating systems distribute
+pre-built binary packages of ICU and PyICU, see below.
+
+ - Mac OS X
+ - Ensure ICU is installed and can be found by `pkg-config` (as `icu-config` was [deprecated](https://unicode-org.github.io/icu/userguide/icu/howtouseicu.html#c-makefiles) as of ICU 63.1), either by following [ICU build instructions](https://unicode-org.github.io/icu/userguide/icu4c/build.html), or by using Homebrew:
+ ```sh
+ # install libicu (keg-only)
+ brew install pkg-config icu4c
+
+ # let setup.py discover keg-only icu4c via pkg-config
+ export PATH="/usr/local/opt/icu4c/bin:/usr/local/opt/icu4c/sbin:$PATH"
+ export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/usr/local/opt/icu4c/lib/pkgconfig"
+ ```
+ - Install PyICU **with the same C++ compiler as your Python distribution**
+ ([more info](https://gitlab.pyicu.org/main/pyicu/merge_requests/140#issuecomment-782283491)):
+ ```sh
+ # EITHER - when using a gcc-built CPython (e.g. from Homebrew)
+ export CC="$(which gcc)" CXX="$(which g++)"
+ # OR - when using system CPython or another clang-based CPython, ensure system clang is used (for proper libstdc++ https://gitlab.pyicu.org/main/pyicu/issues/5#issuecomment-291631507):
+ unset CC CXX
+
+ # avoid wheels from previous runs or PyPI
+ pip install --no-binary=:pyicu: pyicu
+ ```
+
+ - ICU and PyICU binaries are both available via [Macports](https://www.macports.org/) as well. The same limitations about mixing binaries may apply.
+ ```sh
+ # see versions available
+ /opt/local/bin/port search pyicu
+ sudo /opt/local/bin/port install ...
+ ```
+
+ - Debian
+ ```sh
+ apt-get update
+
+ # EITHER - from apt directly https://packages.debian.org/source/stable/pyicu
+ apt-get install python3-icu
+ # OR - from source
+ apt-get install pkg-config libicu-dev
+ pip install --no-binary=:pyicu: pyicu
+ ```
+
+ - Ubuntu: similar to Debian, there is a pyicu
+ [package](https://packages.ubuntu.com/source/xenial/python/pyicu)
+ available via ``apt``.
+
+ - Alpine Linux: there is a pyicu
+ [package](https://pkgs.alpinelinux.org/package/edge/community/x86/py3-icu)
+ available via ``apk``.
+
+ - NetBSD: there is a pyicu [package](https://pkgsrc.se/textproc/py-ICU)
+ available via ``pkg_add``.
+
+ - OpenBSD: there is a pyicu [package](https://openports.se/textproc/py-ICU)
+ available via ``pkg_add``.
+
+ - Other operating systems: see below.
+
+## Building PyICU
+
+*Please, refer to [next section](#building-pyicu-python-3-and-icu-from-sources) for building Python, ICU and PyICU from sources.
+The current section is about building only PyICU from sources, with all dependencies such as Python and ICU already present.*
+
+Before building PyICU the ICU libraries must be built and installed. Refer
+to each system's [instructions](https://unicode-org.github.io/icu/userguide/icu4c/build.html) for more information.
+
+PyICU is built from sources with ``setuptools`` or with ``build`` and ``pip``:
+
+ - verify that ``pkg-config`` is available (the ``icu-config`` program is
+ [deprecated](https://unicode-org.github.io/icu/userguide/icu/howtouseicu.html#c-makefiles)
+ as of ICU 63.1)
+ ```sh
+ pkg-config --cflags --libs icu-i18n
+ ```
+ If this command returns an error or doesn't return the paths expected
+ then ensure that the ``INCLUDES``, ``LFLAGS``, ``CFLAGS`` and ``LIBRARIES``
+ dictionaries in ``setup.py`` contain correct values for your platform.
+ Starting with ICU 60, ``-std=c++11`` must appear in your CFLAGS or be the
+ default for your C++ compiler.
+
+ - **either** build and install PyICU with ``setuptools``
+ ```sh
+ python setup.py build
+ sudo python setup.py install
+ ```
+
+ - **or** build PyICU with ``build`` and install it with ``pip``
+ ```sh
+ python -m build
+ sudo python -m pip install dist/PyICU-<version>-<platform>.whl
+ ```
+
+ - **either** test PyICU with ``setuptools``
+ ```sh
+ python setup.py test
+ ```
+
+ - **or** test PyICU with ``pytest``
+ ```sh
+ python -m pytest
+ ```
+
+
+## Building PyICU, Python 3 and ICU from sources
+
+The instructions at [note_855](https://gitlab.pyicu.org/main/pyicu/-/issues/153#note_855) contain the complete steps for building everything from sources into
+a self-contained directory, without modifying any system directories. They were
+made and tested on an M1 Mac but they can be modified and reused for any unix
+environment. In particular, they outline how to build PyICU from sources
+without icu-config or pkg-config being present.
+
+
+## Running PyICU
+
+ - Mac OS X
+ Make sure that ``DYLD_LIBRARY_PATH`` contains paths to the directory(ies)
+ containing the ICU libs.
+
+ - Linux & Solaris
+ Make sure that ``LD_LIBRARY_PATH`` contains paths to the directory(ies)
+ containing the ICU libs or that you added the corresponding ``-rpath``
+ argument to ``LFLAGS``.
+
+ - Windows
+ Make sure that ``PATH`` contains paths to the directory(ies)
+ containing the ICU DLLs.
+
+
+## What's available
+
+See the [CHANGES](https://gitlab.pyicu.org/main/pyicu/blob/main/CHANGES) file
+for an up to date log of changes and additions.
+
+
+## API Documentation
+
+There is no API documentation for PyICU. The API for ICU is documented at
+https://unicode-org.github.io/icu-docs/apidoc/released/icu4c/ and the
+following patterns can be used to translate from the C++ APIs to the
+corresponding Python APIs.
+
+### strings
+
+The ICU string type, [UnicodeString](https://unicode-org.github.io/icu-docs/apidoc/dev/icu4c/classicu_1_1UnicodeString.html), is a type pointing at a mutable array of [UChar](https://unicode-org.github.io/icu-docs/apidoc/dev/icu4c/umachine_8h.html#a6bb9fad572d65b305324ef288165e2ac) Unicode 16-bit wide characters and is described [here](https://unicode-org.github.io/icu-docs/apidoc/dev/icu4c/classicu_1_1UnicodeString.html#details). The Python 3 [str](https://docs.python.org/3/library/stdtypes.html#str) type is described [here](https://docs.python.org/3/library/stdtypes.html#index-26) and [here](https://docs.python.org/3/howto/unicode.html). The Python 2 [unicode](https://docs.python.org/2.7/reference/datamodel.html#index-23) type is described [here](https://docs.python.org/2.7/library/stdtypes.html#sequence-types-str-unicode-list-tuple-bytearray-buffer-xrange).
+
+Because of their differences, ICU's and Python's string objects are not merged
+into the same type when crossing the C++ boundary but converted.
+
+ICU APIs taking ``UnicodeString`` arguments have been overloaded to also
+accept arguments that are Python 3 ``str`` or Python 2 ``unicode`` objects.
+Python 2 ``str`` objects are auto-decoded into ICU strings using the ``utf-8``
+encoding.
+
+To convert a Python 3 ``bytes`` or a Python 2 ``str`` object encoded in an
+encoding other than ``utf-8`` to an ICU ``UnicodeString`` use the
+``UnicodeString(str, encodingName)`` constructor.
+
+ICU's C++ APIs accept and return ``UnicodeString`` arguments in several
+ways: by value, by pointer or by reference.
+When an ICU C++ API is documented to accept a ``UnicodeString`` reference
+parameter, it is safe to assume that there are several corresponding
+PyICU python APIs making it accessible in simpler ways:
+
+For example, the ``'UnicodeString &Locale::getDisplayName(UnicodeString &)'``
+API, documented
+[here](https://unicode-org.github.io/icu-docs/apidoc/released/icu4c/classicu_1_1Locale.html#a61def321a9cfd9904b59e3f1897f835e),
+can be invoked from Python in several ways:
+
+1. The ICU way
+
+ >>> from icu import UnicodeString, Locale
+ >>> locale = Locale('pt_BR')
+ >>> string = UnicodeString()
+ >>> name = locale.getDisplayName(string)
+ >>> name
+ <UnicodeString: 'Portuguese (Brazil)'>
+ >>> name is string
+ True <-- string arg was returned, modified in place
+
+2. The Python way
+
+ >>> from icu import Locale
+ >>> locale = Locale('pt_BR')
+ >>> name = locale.getDisplayName()
+ >>> name
+ 'Portuguese (Brazil)'
+
+ A ``UnicodeString`` object was allocated and converted to a Python
+ ``str`` object.
+
+A UnicodeString can be converted to a Python unicode string with Python 3's
+``str()`` or Python 2's ``unicode()`` constructor. The usual ``len()``,
+comparison, `[]`` and ``[:]`` operators are all available, with the additional
+twists that slicing is not read-only and that ``+=`` is also available since a
+UnicodeString is mutable. For example:
+
+ >>> name = locale.getDisplayName()
+ 'Portuguese (Brazil)'
+ >>> name = UnicodeString(name)
+ >>> name
+ <UnicodeString: 'Portuguese (Brazil)'>
+ >>> str(name)
+ 'Portuguese (Brazil)'
+ >>> len(name)
+ 19
+ >>> str(name)
+ 'Portuguese (Brazil)'
+ >>> name[3]
+ 't'
+ >>> name[12:18]
+ <UnicodeString: 'Brazil'>
+ >>> name[12:18] = 'the country of Brasil'
+ >>> name
+ <UnicodeString: 'Portuguese (the country of Brasil)'>
+ >>> name += ' oh joy'
+ >>> name
+ <UnicodeString: 'Portuguese (the country of Brasil) oh joy'>
+
+### error reporting
+
+The C++ ICU library does not use C++ exceptions to report errors. ICU
+C++ APIs return errors via a ``UErrorCode`` reference argument. All such
+APIs are wrapped by Python APIs that omit this argument and throw an
+``ICUError`` Python exception instead. The same is true for ICU APIs
+taking both a ``ParseError`` and a ``UErrorCode``, they are both to be
+omitted.
+
+For example, the ``'UnicodeString &DateFormat::format(const Formattable &, UnicodeString &, FieldPosition &, UErrorCode &)'`` API, documented [here](https://unicode-org.github.io/icu-docs/apidoc/released/icu4c/classicu_1_1DateFormat.html#aae63209f1202550c91e2beed5691b062) is invoked from Python with:
+
+ >>> from icu import DateFormat, Formattable
+ >>> df = DateFormat.createInstance()
+ >>> df
+ <SimpleDateFormat: M/d/yy h:mm a>
+ >>> f = Formattable(940284258.0, Formattable.kIsDate)
+ >>> df.format(f)
+ '10/18/99 3:04 PM'
+
+Of course, the simpler ``'UnicodeString &DateFormat::format(UDate, UnicodeString &)'`` documented [here](https://unicode-org.github.io/icu-docs/apidoc/released/icu4c/classicu_1_1DateFormat.html#a5940ccf5676d3fa043d8255c55b7ddd1) can be used too:
+
+ >>> from icu import DateFormat
+ >>> df = DateFormat.createInstance()
+ >>> df
+ <SimpleDateFormat: M/d/yy h:mm a>
+ >>> df.format(940284258.0)
+ '10/18/99 3:04 PM'
+
+### dates
+
+ICU uses a double floating point type called ``UDate`` that represents the
+number of milliseconds elapsed since 1970-jan-01 UTC for dates.
+
+In Python, the value returned by the ``time`` module's ``time()``
+function is the number of seconds since 1970-jan-01 UTC. Because of this
+difference, floating point values are multiplied by 1000 when passed to
+APIs taking ``UDate`` and divided by 1000 when returned as ``UDate``.
+
+Python's ``datetime`` objects, with or without timezone information, can
+also be used with APIs taking ``UDate`` arguments. The ``datetime``
+objects get converted to ``UDate`` when crossing into the C++ layer.
+
+### arrays
+
+Many ICU API take array arguments. A list of elements of the array
+element types is to be passed from Python.
+
+### StringEnumeration
+
+An ICU ``StringEnumeration`` has three ``next`` methods: ``next()`` which
+returns ``str`` objects, ``unext()`` which returns ``str`` objects in Python 3
+or ``unicode`` objects in Python 2 and ``snext()`` which returns
+``UnicodeString`` objects. Any of these methods can be used as an iterator,
+using the Python built-in ``iter`` function.
+
+For example, let ``e`` be a ``StringEnumeration`` instance:
+
+```python
+e = TimeZone.createEnumeration()
+[s for s in e] # a list of 'str' objects
+[s for s in iter(e.unext, '')] # a list of 'str' or 'unicode' objects
+[s for s in iter(e.snext, '')] # a list of 'UnicodeString' objects
+```
+
+### timezones
+
+The ICU ``TimeZone`` type may be wrapped with an ``ICUtzinfo`` type for
+usage with Python's ``datetime`` type. For example:
+
+```python
+from datetime import datetime
+tz = ICUtzinfo(TimeZone.createTimeZone('US/Mountain'))
+datetime.now(tz)
+```
+
+or, even simpler:
+
+```python
+tz = ICUtzinfo.getInstance('Pacific/Fiji')
+datetime.now(tz)
+```
+
+To get the default time zone use:
+
+```python
+defaultTZ = ICUtzinfo.getDefault()
+```
+
+To get the time zone's id, use the ``tzid`` attribute or coerce the time
+zone to a string:
+
+```python
+ICUtzinfo.getInstance('Pacific/Fiji').tzid -> 'Pacific/Fiji'
+str(ICUtzinfo.getInstance('Pacific/Fiji')) -> 'Pacific/Fiji'
+```
+
+## Further Reading
+
+The [unit tests](https://gitlab.pyicu.org/main/pyicu/-/tree/main/test) have
+more examples of actual PyICU usage.
+
+There are also a few
+[samples](https://gitlab.pyicu.org/main/pyicu/-/tree/main/samples) ported from
+ICU C/C++.
+
+
+%package help
+Summary: Development documents and examples for PyICU
+Provides: python3-PyICU-doc
+%description help
+# README file for PyICU
+
+## Welcome
+
+Welcome to PyICU, a Python extension wrapping the ICU C++ libraries.
+
+ICU stands for "International Components for Unicode".
+These are the i18n libraries of the Unicode Consortium.
+They implement much of the Unicode Standard,
+many of its companion Unicode Technical Standards,
+and much of Unicode CLDR.
+
+The PyICU source code is hosted at https://gitlab.pyicu.org/main/pyicu.
+
+The ICU homepage is https://icu.unicode.org/
+
+See also the CLDR homepage at http://cldr.unicode.org/
+
+## Installing PyICU
+
+PyICU is a python extension implemented in C++ that wraps the C/C++ ICU library.
+It is known to also work as a [PyPy](https://www.pypy.org/) extension.
+Unless ``pkg-config`` and the ICU libraries and headers are already installed,
+building PyICU from the sources on [PyPI](https://pypi.org/project/PyICU/)
+involves more than just a ``pip`` call. Many operating systems distribute
+pre-built binary packages of ICU and PyICU, see below.
+
+ - Mac OS X
+ - Ensure ICU is installed and can be found by `pkg-config` (as `icu-config` was [deprecated](https://unicode-org.github.io/icu/userguide/icu/howtouseicu.html#c-makefiles) as of ICU 63.1), either by following [ICU build instructions](https://unicode-org.github.io/icu/userguide/icu4c/build.html), or by using Homebrew:
+ ```sh
+ # install libicu (keg-only)
+ brew install pkg-config icu4c
+
+ # let setup.py discover keg-only icu4c via pkg-config
+ export PATH="/usr/local/opt/icu4c/bin:/usr/local/opt/icu4c/sbin:$PATH"
+ export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/usr/local/opt/icu4c/lib/pkgconfig"
+ ```
+ - Install PyICU **with the same C++ compiler as your Python distribution**
+ ([more info](https://gitlab.pyicu.org/main/pyicu/merge_requests/140#issuecomment-782283491)):
+ ```sh
+ # EITHER - when using a gcc-built CPython (e.g. from Homebrew)
+ export CC="$(which gcc)" CXX="$(which g++)"
+ # OR - when using system CPython or another clang-based CPython, ensure system clang is used (for proper libstdc++ https://gitlab.pyicu.org/main/pyicu/issues/5#issuecomment-291631507):
+ unset CC CXX
+
+ # avoid wheels from previous runs or PyPI
+ pip install --no-binary=:pyicu: pyicu
+ ```
+
+ - ICU and PyICU binaries are both available via [Macports](https://www.macports.org/) as well. The same limitations about mixing binaries may apply.
+ ```sh
+ # see versions available
+ /opt/local/bin/port search pyicu
+ sudo /opt/local/bin/port install ...
+ ```
+
+ - Debian
+ ```sh
+ apt-get update
+
+ # EITHER - from apt directly https://packages.debian.org/source/stable/pyicu
+ apt-get install python3-icu
+ # OR - from source
+ apt-get install pkg-config libicu-dev
+ pip install --no-binary=:pyicu: pyicu
+ ```
+
+ - Ubuntu: similar to Debian, there is a pyicu
+ [package](https://packages.ubuntu.com/source/xenial/python/pyicu)
+ available via ``apt``.
+
+ - Alpine Linux: there is a pyicu
+ [package](https://pkgs.alpinelinux.org/package/edge/community/x86/py3-icu)
+ available via ``apk``.
+
+ - NetBSD: there is a pyicu [package](https://pkgsrc.se/textproc/py-ICU)
+ available via ``pkg_add``.
+
+ - OpenBSD: there is a pyicu [package](https://openports.se/textproc/py-ICU)
+ available via ``pkg_add``.
+
+ - Other operating systems: see below.
+
+## Building PyICU
+
+*Please, refer to [next section](#building-pyicu-python-3-and-icu-from-sources) for building Python, ICU and PyICU from sources.
+The current section is about building only PyICU from sources, with all dependencies such as Python and ICU already present.*
+
+Before building PyICU the ICU libraries must be built and installed. Refer
+to each system's [instructions](https://unicode-org.github.io/icu/userguide/icu4c/build.html) for more information.
+
+PyICU is built from sources with ``setuptools`` or with ``build`` and ``pip``:
+
+ - verify that ``pkg-config`` is available (the ``icu-config`` program is
+ [deprecated](https://unicode-org.github.io/icu/userguide/icu/howtouseicu.html#c-makefiles)
+ as of ICU 63.1)
+ ```sh
+ pkg-config --cflags --libs icu-i18n
+ ```
+ If this command returns an error or doesn't return the paths expected
+ then ensure that the ``INCLUDES``, ``LFLAGS``, ``CFLAGS`` and ``LIBRARIES``
+ dictionaries in ``setup.py`` contain correct values for your platform.
+ Starting with ICU 60, ``-std=c++11`` must appear in your CFLAGS or be the
+ default for your C++ compiler.
+
+ - **either** build and install PyICU with ``setuptools``
+ ```sh
+ python setup.py build
+ sudo python setup.py install
+ ```
+
+ - **or** build PyICU with ``build`` and install it with ``pip``
+ ```sh
+ python -m build
+ sudo python -m pip install dist/PyICU-<version>-<platform>.whl
+ ```
+
+ - **either** test PyICU with ``setuptools``
+ ```sh
+ python setup.py test
+ ```
+
+ - **or** test PyICU with ``pytest``
+ ```sh
+ python -m pytest
+ ```
+
+
+## Building PyICU, Python 3 and ICU from sources
+
+The instructions at [note_855](https://gitlab.pyicu.org/main/pyicu/-/issues/153#note_855) contain the complete steps for building everything from sources into
+a self-contained directory, without modifying any system directories. They were
+made and tested on an M1 Mac but they can be modified and reused for any unix
+environment. In particular, they outline how to build PyICU from sources
+without icu-config or pkg-config being present.
+
+
+## Running PyICU
+
+ - Mac OS X
+ Make sure that ``DYLD_LIBRARY_PATH`` contains paths to the directory(ies)
+ containing the ICU libs.
+
+ - Linux & Solaris
+ Make sure that ``LD_LIBRARY_PATH`` contains paths to the directory(ies)
+ containing the ICU libs or that you added the corresponding ``-rpath``
+ argument to ``LFLAGS``.
+
+ - Windows
+ Make sure that ``PATH`` contains paths to the directory(ies)
+ containing the ICU DLLs.
+
+
+## What's available
+
+See the [CHANGES](https://gitlab.pyicu.org/main/pyicu/blob/main/CHANGES) file
+for an up to date log of changes and additions.
+
+
+## API Documentation
+
+There is no API documentation for PyICU. The API for ICU is documented at
+https://unicode-org.github.io/icu-docs/apidoc/released/icu4c/ and the
+following patterns can be used to translate from the C++ APIs to the
+corresponding Python APIs.
+
+### strings
+
+The ICU string type, [UnicodeString](https://unicode-org.github.io/icu-docs/apidoc/dev/icu4c/classicu_1_1UnicodeString.html), is a type pointing at a mutable array of [UChar](https://unicode-org.github.io/icu-docs/apidoc/dev/icu4c/umachine_8h.html#a6bb9fad572d65b305324ef288165e2ac) Unicode 16-bit wide characters and is described [here](https://unicode-org.github.io/icu-docs/apidoc/dev/icu4c/classicu_1_1UnicodeString.html#details). The Python 3 [str](https://docs.python.org/3/library/stdtypes.html#str) type is described [here](https://docs.python.org/3/library/stdtypes.html#index-26) and [here](https://docs.python.org/3/howto/unicode.html). The Python 2 [unicode](https://docs.python.org/2.7/reference/datamodel.html#index-23) type is described [here](https://docs.python.org/2.7/library/stdtypes.html#sequence-types-str-unicode-list-tuple-bytearray-buffer-xrange).
+
+Because of their differences, ICU's and Python's string objects are not merged
+into the same type when crossing the C++ boundary but converted.
+
+ICU APIs taking ``UnicodeString`` arguments have been overloaded to also
+accept arguments that are Python 3 ``str`` or Python 2 ``unicode`` objects.
+Python 2 ``str`` objects are auto-decoded into ICU strings using the ``utf-8``
+encoding.
+
+To convert a Python 3 ``bytes`` or a Python 2 ``str`` object encoded in an
+encoding other than ``utf-8`` to an ICU ``UnicodeString`` use the
+``UnicodeString(str, encodingName)`` constructor.
+
+ICU's C++ APIs accept and return ``UnicodeString`` arguments in several
+ways: by value, by pointer or by reference.
+When an ICU C++ API is documented to accept a ``UnicodeString`` reference
+parameter, it is safe to assume that there are several corresponding
+PyICU python APIs making it accessible in simpler ways:
+
+For example, the ``'UnicodeString &Locale::getDisplayName(UnicodeString &)'``
+API, documented
+[here](https://unicode-org.github.io/icu-docs/apidoc/released/icu4c/classicu_1_1Locale.html#a61def321a9cfd9904b59e3f1897f835e),
+can be invoked from Python in several ways:
+
+1. The ICU way
+
+ >>> from icu import UnicodeString, Locale
+ >>> locale = Locale('pt_BR')
+ >>> string = UnicodeString()
+ >>> name = locale.getDisplayName(string)
+ >>> name
+ <UnicodeString: 'Portuguese (Brazil)'>
+ >>> name is string
+ True <-- string arg was returned, modified in place
+
+2. The Python way
+
+ >>> from icu import Locale
+ >>> locale = Locale('pt_BR')
+ >>> name = locale.getDisplayName()
+ >>> name
+ 'Portuguese (Brazil)'
+
+ A ``UnicodeString`` object was allocated and converted to a Python
+ ``str`` object.
+
+A UnicodeString can be converted to a Python unicode string with Python 3's
+``str()`` or Python 2's ``unicode()`` constructor. The usual ``len()``,
+comparison, `[]`` and ``[:]`` operators are all available, with the additional
+twists that slicing is not read-only and that ``+=`` is also available since a
+UnicodeString is mutable. For example:
+
+ >>> name = locale.getDisplayName()
+ 'Portuguese (Brazil)'
+ >>> name = UnicodeString(name)
+ >>> name
+ <UnicodeString: 'Portuguese (Brazil)'>
+ >>> str(name)
+ 'Portuguese (Brazil)'
+ >>> len(name)
+ 19
+ >>> str(name)
+ 'Portuguese (Brazil)'
+ >>> name[3]
+ 't'
+ >>> name[12:18]
+ <UnicodeString: 'Brazil'>
+ >>> name[12:18] = 'the country of Brasil'
+ >>> name
+ <UnicodeString: 'Portuguese (the country of Brasil)'>
+ >>> name += ' oh joy'
+ >>> name
+ <UnicodeString: 'Portuguese (the country of Brasil) oh joy'>
+
+### error reporting
+
+The C++ ICU library does not use C++ exceptions to report errors. ICU
+C++ APIs return errors via a ``UErrorCode`` reference argument. All such
+APIs are wrapped by Python APIs that omit this argument and throw an
+``ICUError`` Python exception instead. The same is true for ICU APIs
+taking both a ``ParseError`` and a ``UErrorCode``, they are both to be
+omitted.
+
+For example, the ``'UnicodeString &DateFormat::format(const Formattable &, UnicodeString &, FieldPosition &, UErrorCode &)'`` API, documented [here](https://unicode-org.github.io/icu-docs/apidoc/released/icu4c/classicu_1_1DateFormat.html#aae63209f1202550c91e2beed5691b062) is invoked from Python with:
+
+ >>> from icu import DateFormat, Formattable
+ >>> df = DateFormat.createInstance()
+ >>> df
+ <SimpleDateFormat: M/d/yy h:mm a>
+ >>> f = Formattable(940284258.0, Formattable.kIsDate)
+ >>> df.format(f)
+ '10/18/99 3:04 PM'
+
+Of course, the simpler ``'UnicodeString &DateFormat::format(UDate, UnicodeString &)'`` documented [here](https://unicode-org.github.io/icu-docs/apidoc/released/icu4c/classicu_1_1DateFormat.html#a5940ccf5676d3fa043d8255c55b7ddd1) can be used too:
+
+ >>> from icu import DateFormat
+ >>> df = DateFormat.createInstance()
+ >>> df
+ <SimpleDateFormat: M/d/yy h:mm a>
+ >>> df.format(940284258.0)
+ '10/18/99 3:04 PM'
+
+### dates
+
+ICU uses a double floating point type called ``UDate`` that represents the
+number of milliseconds elapsed since 1970-jan-01 UTC for dates.
+
+In Python, the value returned by the ``time`` module's ``time()``
+function is the number of seconds since 1970-jan-01 UTC. Because of this
+difference, floating point values are multiplied by 1000 when passed to
+APIs taking ``UDate`` and divided by 1000 when returned as ``UDate``.
+
+Python's ``datetime`` objects, with or without timezone information, can
+also be used with APIs taking ``UDate`` arguments. The ``datetime``
+objects get converted to ``UDate`` when crossing into the C++ layer.
+
+### arrays
+
+Many ICU API take array arguments. A list of elements of the array
+element types is to be passed from Python.
+
+### StringEnumeration
+
+An ICU ``StringEnumeration`` has three ``next`` methods: ``next()`` which
+returns ``str`` objects, ``unext()`` which returns ``str`` objects in Python 3
+or ``unicode`` objects in Python 2 and ``snext()`` which returns
+``UnicodeString`` objects. Any of these methods can be used as an iterator,
+using the Python built-in ``iter`` function.
+
+For example, let ``e`` be a ``StringEnumeration`` instance:
+
+```python
+e = TimeZone.createEnumeration()
+[s for s in e] # a list of 'str' objects
+[s for s in iter(e.unext, '')] # a list of 'str' or 'unicode' objects
+[s for s in iter(e.snext, '')] # a list of 'UnicodeString' objects
+```
+
+### timezones
+
+The ICU ``TimeZone`` type may be wrapped with an ``ICUtzinfo`` type for
+usage with Python's ``datetime`` type. For example:
+
+```python
+from datetime import datetime
+tz = ICUtzinfo(TimeZone.createTimeZone('US/Mountain'))
+datetime.now(tz)
+```
+
+or, even simpler:
+
+```python
+tz = ICUtzinfo.getInstance('Pacific/Fiji')
+datetime.now(tz)
+```
+
+To get the default time zone use:
+
+```python
+defaultTZ = ICUtzinfo.getDefault()
+```
+
+To get the time zone's id, use the ``tzid`` attribute or coerce the time
+zone to a string:
+
+```python
+ICUtzinfo.getInstance('Pacific/Fiji').tzid -> 'Pacific/Fiji'
+str(ICUtzinfo.getInstance('Pacific/Fiji')) -> 'Pacific/Fiji'
+```
+
+## Further Reading
+
+The [unit tests](https://gitlab.pyicu.org/main/pyicu/-/tree/main/test) have
+more examples of actual PyICU usage.
+
+There are also a few
+[samples](https://gitlab.pyicu.org/main/pyicu/-/tree/main/samples) ported from
+ICU C/C++.
+
+
+%prep
+%autosetup -n PyICU-2.10.2
+
+%build
+%py3_build
+
+%install
+%py3_install
+install -d -m755 %{buildroot}/%{_pkgdocdir}
+if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi
+if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi
+if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi
+if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi
+pushd %{buildroot}
+if [ -d usr/lib ]; then
+ find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/lib64 ]; then
+ find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/bin ]; then
+ find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/sbin ]; then
+ find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+touch doclist.lst
+if [ -d usr/share/man ]; then
+ find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst
+fi
+popd
+mv %{buildroot}/filelist.lst .
+mv %{buildroot}/doclist.lst .
+
+%files -n python3-PyICU -f filelist.lst
+%dir %{python3_sitelib}/*
+
+%files help -f doclist.lst
+%{_docdir}/*
+
+%changelog
+* Thu Mar 09 2023 Python_Bot <Python_Bot@openeuler.org> - 2.10.2-1
+- Package Spec generated
diff --git a/sources b/sources
new file mode 100644
index 0000000..67fff0d
--- /dev/null
+++ b/sources
@@ -0,0 +1 @@
+4090ebb98702338cac3dbed2d72c2fd7 PyICU-2.10.2.tar.gz