@rowstile/cli-linux-x64 0.1.0-alpha.2
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.
- package/LICENSE +202 -0
- package/README.md +5 -0
- package/package.json +26 -0
- package/python/bin/python3.13 +0 -0
- package/python/bin/python3.13-config +122 -0
- package/python/lib/libpython3.13.so.1.0 +0 -0
- package/python/lib/libpython3.so +0 -0
- package/python/lib/python3.13/LICENSE.txt +277 -0
- package/python/lib/python3.13/__future__.py +147 -0
- package/python/lib/python3.13/__hello__.py +16 -0
- package/python/lib/python3.13/_aix_support.py +108 -0
- package/python/lib/python3.13/_android_support.py +192 -0
- package/python/lib/python3.13/_apple_support.py +66 -0
- package/python/lib/python3.13/_collections_abc.py +1187 -0
- package/python/lib/python3.13/_colorize.py +119 -0
- package/python/lib/python3.13/_compat_pickle.py +251 -0
- package/python/lib/python3.13/_compression.py +162 -0
- package/python/lib/python3.13/_ios_support.py +71 -0
- package/python/lib/python3.13/_markupbase.py +396 -0
- package/python/lib/python3.13/_opcode_metadata.py +343 -0
- package/python/lib/python3.13/_osx_support.py +579 -0
- package/python/lib/python3.13/_py_abc.py +147 -0
- package/python/lib/python3.13/_pydatetime.py +2640 -0
- package/python/lib/python3.13/_pydecimal.py +6356 -0
- package/python/lib/python3.13/_pyio.py +2714 -0
- package/python/lib/python3.13/_pylong.py +363 -0
- package/python/lib/python3.13/_pyrepl/__init__.py +19 -0
- package/python/lib/python3.13/_pyrepl/__main__.py +10 -0
- package/python/lib/python3.13/_pyrepl/_minimal_curses.py +68 -0
- package/python/lib/python3.13/_pyrepl/_threading_handler.py +74 -0
- package/python/lib/python3.13/_pyrepl/base_eventqueue.py +110 -0
- package/python/lib/python3.13/_pyrepl/commands.py +492 -0
- package/python/lib/python3.13/_pyrepl/completing_reader.py +295 -0
- package/python/lib/python3.13/_pyrepl/console.py +229 -0
- package/python/lib/python3.13/_pyrepl/curses.py +33 -0
- package/python/lib/python3.13/_pyrepl/fancy_termios.py +82 -0
- package/python/lib/python3.13/_pyrepl/historical_reader.py +419 -0
- package/python/lib/python3.13/_pyrepl/input.py +114 -0
- package/python/lib/python3.13/_pyrepl/keymap.py +213 -0
- package/python/lib/python3.13/_pyrepl/main.py +59 -0
- package/python/lib/python3.13/_pyrepl/mypy.ini +29 -0
- package/python/lib/python3.13/_pyrepl/pager.py +175 -0
- package/python/lib/python3.13/_pyrepl/reader.py +764 -0
- package/python/lib/python3.13/_pyrepl/readline.py +599 -0
- package/python/lib/python3.13/_pyrepl/simple_interact.py +180 -0
- package/python/lib/python3.13/_pyrepl/trace.py +21 -0
- package/python/lib/python3.13/_pyrepl/types.py +10 -0
- package/python/lib/python3.13/_pyrepl/unix_console.py +852 -0
- package/python/lib/python3.13/_pyrepl/unix_eventqueue.py +76 -0
- package/python/lib/python3.13/_pyrepl/utils.py +83 -0
- package/python/lib/python3.13/_pyrepl/windows_console.py +687 -0
- package/python/lib/python3.13/_pyrepl/windows_eventqueue.py +42 -0
- package/python/lib/python3.13/_sitebuiltins.py +91 -0
- package/python/lib/python3.13/_strptime.py +800 -0
- package/python/lib/python3.13/_sysconfigdata__linux_x86_64-linux-gnu.py +1079 -0
- package/python/lib/python3.13/_threading_local.py +120 -0
- package/python/lib/python3.13/_weakrefset.py +205 -0
- package/python/lib/python3.13/abc.py +188 -0
- package/python/lib/python3.13/antigravity.py +17 -0
- package/python/lib/python3.13/argparse.py +2690 -0
- package/python/lib/python3.13/ast.py +1865 -0
- package/python/lib/python3.13/asyncio/__init__.py +47 -0
- package/python/lib/python3.13/asyncio/__main__.py +211 -0
- package/python/lib/python3.13/asyncio/base_events.py +2086 -0
- package/python/lib/python3.13/asyncio/base_futures.py +67 -0
- package/python/lib/python3.13/asyncio/base_subprocess.py +312 -0
- package/python/lib/python3.13/asyncio/base_tasks.py +94 -0
- package/python/lib/python3.13/asyncio/constants.py +41 -0
- package/python/lib/python3.13/asyncio/coroutines.py +109 -0
- package/python/lib/python3.13/asyncio/events.py +885 -0
- package/python/lib/python3.13/asyncio/exceptions.py +62 -0
- package/python/lib/python3.13/asyncio/format_helpers.py +84 -0
- package/python/lib/python3.13/asyncio/futures.py +425 -0
- package/python/lib/python3.13/asyncio/locks.py +617 -0
- package/python/lib/python3.13/asyncio/log.py +7 -0
- package/python/lib/python3.13/asyncio/mixins.py +21 -0
- package/python/lib/python3.13/asyncio/proactor_events.py +891 -0
- package/python/lib/python3.13/asyncio/protocols.py +216 -0
- package/python/lib/python3.13/asyncio/queues.py +309 -0
- package/python/lib/python3.13/asyncio/runners.py +217 -0
- package/python/lib/python3.13/asyncio/selector_events.py +1328 -0
- package/python/lib/python3.13/asyncio/sslproto.py +929 -0
- package/python/lib/python3.13/asyncio/staggered.py +174 -0
- package/python/lib/python3.13/asyncio/streams.py +787 -0
- package/python/lib/python3.13/asyncio/subprocess.py +229 -0
- package/python/lib/python3.13/asyncio/taskgroups.py +278 -0
- package/python/lib/python3.13/asyncio/tasks.py +1121 -0
- package/python/lib/python3.13/asyncio/threads.py +26 -0
- package/python/lib/python3.13/asyncio/timeouts.py +185 -0
- package/python/lib/python3.13/asyncio/transports.py +337 -0
- package/python/lib/python3.13/asyncio/trsock.py +98 -0
- package/python/lib/python3.13/asyncio/unix_events.py +1550 -0
- package/python/lib/python3.13/asyncio/windows_events.py +906 -0
- package/python/lib/python3.13/asyncio/windows_utils.py +181 -0
- package/python/lib/python3.13/base64.py +628 -0
- package/python/lib/python3.13/bdb.py +973 -0
- package/python/lib/python3.13/bisect.py +118 -0
- package/python/lib/python3.13/bz2.py +352 -0
- package/python/lib/python3.13/cProfile.py +197 -0
- package/python/lib/python3.13/calendar.py +813 -0
- package/python/lib/python3.13/cmd.py +409 -0
- package/python/lib/python3.13/code.py +386 -0
- package/python/lib/python3.13/codecs.py +1132 -0
- package/python/lib/python3.13/codeop.py +155 -0
- package/python/lib/python3.13/collections/__init__.py +1603 -0
- package/python/lib/python3.13/colorsys.py +166 -0
- package/python/lib/python3.13/compileall.py +470 -0
- package/python/lib/python3.13/concurrent/__init__.py +1 -0
- package/python/lib/python3.13/concurrent/futures/__init__.py +54 -0
- package/python/lib/python3.13/concurrent/futures/_base.py +660 -0
- package/python/lib/python3.13/concurrent/futures/process.py +892 -0
- package/python/lib/python3.13/concurrent/futures/thread.py +240 -0
- package/python/lib/python3.13/configparser.py +1396 -0
- package/python/lib/python3.13/contextlib.py +814 -0
- package/python/lib/python3.13/contextvars.py +4 -0
- package/python/lib/python3.13/copy.py +306 -0
- package/python/lib/python3.13/copyreg.py +217 -0
- package/python/lib/python3.13/csv.py +527 -0
- package/python/lib/python3.13/ctypes/__init__.py +605 -0
- package/python/lib/python3.13/ctypes/_aix.py +327 -0
- package/python/lib/python3.13/ctypes/_endian.py +78 -0
- package/python/lib/python3.13/ctypes/macholib/README.ctypes +7 -0
- package/python/lib/python3.13/ctypes/macholib/__init__.py +9 -0
- package/python/lib/python3.13/ctypes/macholib/dyld.py +165 -0
- package/python/lib/python3.13/ctypes/macholib/dylib.py +42 -0
- package/python/lib/python3.13/ctypes/macholib/fetch_macholib +2 -0
- package/python/lib/python3.13/ctypes/macholib/fetch_macholib.bat +1 -0
- package/python/lib/python3.13/ctypes/macholib/framework.py +42 -0
- package/python/lib/python3.13/ctypes/util.py +387 -0
- package/python/lib/python3.13/ctypes/wintypes.py +202 -0
- package/python/lib/python3.13/curses/__init__.py +101 -0
- package/python/lib/python3.13/curses/ascii.py +99 -0
- package/python/lib/python3.13/curses/has_key.py +192 -0
- package/python/lib/python3.13/curses/panel.py +6 -0
- package/python/lib/python3.13/curses/textpad.py +236 -0
- package/python/lib/python3.13/dataclasses.py +1679 -0
- package/python/lib/python3.13/datetime.py +9 -0
- package/python/lib/python3.13/dbm/__init__.py +194 -0
- package/python/lib/python3.13/dbm/dumb.py +319 -0
- package/python/lib/python3.13/dbm/gnu.py +3 -0
- package/python/lib/python3.13/dbm/ndbm.py +3 -0
- package/python/lib/python3.13/dbm/sqlite3.py +144 -0
- package/python/lib/python3.13/decimal.py +109 -0
- package/python/lib/python3.13/difflib.py +2058 -0
- package/python/lib/python3.13/dis.py +1075 -0
- package/python/lib/python3.13/doctest.py +2919 -0
- package/python/lib/python3.13/email/__init__.py +61 -0
- package/python/lib/python3.13/email/_encoded_words.py +233 -0
- package/python/lib/python3.13/email/_header_value_parser.py +3153 -0
- package/python/lib/python3.13/email/_parseaddr.py +563 -0
- package/python/lib/python3.13/email/_policybase.py +382 -0
- package/python/lib/python3.13/email/architecture.rst +216 -0
- package/python/lib/python3.13/email/base64mime.py +115 -0
- package/python/lib/python3.13/email/charset.py +396 -0
- package/python/lib/python3.13/email/contentmanager.py +254 -0
- package/python/lib/python3.13/email/encoders.py +65 -0
- package/python/lib/python3.13/email/errors.py +117 -0
- package/python/lib/python3.13/email/feedparser.py +536 -0
- package/python/lib/python3.13/email/generator.py +530 -0
- package/python/lib/python3.13/email/header.py +582 -0
- package/python/lib/python3.13/email/headerregistry.py +618 -0
- package/python/lib/python3.13/email/iterators.py +68 -0
- package/python/lib/python3.13/email/message.py +1217 -0
- package/python/lib/python3.13/email/mime/__init__.py +0 -0
- package/python/lib/python3.13/email/mime/application.py +37 -0
- package/python/lib/python3.13/email/mime/audio.py +97 -0
- package/python/lib/python3.13/email/mime/base.py +29 -0
- package/python/lib/python3.13/email/mime/image.py +152 -0
- package/python/lib/python3.13/email/mime/message.py +33 -0
- package/python/lib/python3.13/email/mime/multipart.py +47 -0
- package/python/lib/python3.13/email/mime/nonmultipart.py +21 -0
- package/python/lib/python3.13/email/mime/text.py +40 -0
- package/python/lib/python3.13/email/parser.py +127 -0
- package/python/lib/python3.13/email/policy.py +232 -0
- package/python/lib/python3.13/email/quoprimime.py +300 -0
- package/python/lib/python3.13/email/utils.py +497 -0
- package/python/lib/python3.13/encodings/__init__.py +179 -0
- package/python/lib/python3.13/encodings/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/lib/python3.13/encodings/__pycache__/aliases.cpython-313.pyc +0 -0
- package/python/lib/python3.13/encodings/__pycache__/utf_8.cpython-313.pyc +0 -0
- package/python/lib/python3.13/encodings/aliases.py +560 -0
- package/python/lib/python3.13/encodings/ascii.py +50 -0
- package/python/lib/python3.13/encodings/base64_codec.py +55 -0
- package/python/lib/python3.13/encodings/big5.py +39 -0
- package/python/lib/python3.13/encodings/big5hkscs.py +39 -0
- package/python/lib/python3.13/encodings/bz2_codec.py +78 -0
- package/python/lib/python3.13/encodings/charmap.py +69 -0
- package/python/lib/python3.13/encodings/cp037.py +307 -0
- package/python/lib/python3.13/encodings/cp1006.py +307 -0
- package/python/lib/python3.13/encodings/cp1026.py +307 -0
- package/python/lib/python3.13/encodings/cp1125.py +698 -0
- package/python/lib/python3.13/encodings/cp1140.py +307 -0
- package/python/lib/python3.13/encodings/cp1250.py +307 -0
- package/python/lib/python3.13/encodings/cp1251.py +307 -0
- package/python/lib/python3.13/encodings/cp1252.py +307 -0
- package/python/lib/python3.13/encodings/cp1253.py +307 -0
- package/python/lib/python3.13/encodings/cp1254.py +307 -0
- package/python/lib/python3.13/encodings/cp1255.py +307 -0
- package/python/lib/python3.13/encodings/cp1256.py +307 -0
- package/python/lib/python3.13/encodings/cp1257.py +307 -0
- package/python/lib/python3.13/encodings/cp1258.py +307 -0
- package/python/lib/python3.13/encodings/cp273.py +307 -0
- package/python/lib/python3.13/encodings/cp424.py +307 -0
- package/python/lib/python3.13/encodings/cp437.py +698 -0
- package/python/lib/python3.13/encodings/cp500.py +307 -0
- package/python/lib/python3.13/encodings/cp720.py +309 -0
- package/python/lib/python3.13/encodings/cp737.py +698 -0
- package/python/lib/python3.13/encodings/cp775.py +697 -0
- package/python/lib/python3.13/encodings/cp850.py +698 -0
- package/python/lib/python3.13/encodings/cp852.py +698 -0
- package/python/lib/python3.13/encodings/cp855.py +698 -0
- package/python/lib/python3.13/encodings/cp856.py +307 -0
- package/python/lib/python3.13/encodings/cp857.py +694 -0
- package/python/lib/python3.13/encodings/cp858.py +698 -0
- package/python/lib/python3.13/encodings/cp860.py +698 -0
- package/python/lib/python3.13/encodings/cp861.py +698 -0
- package/python/lib/python3.13/encodings/cp862.py +698 -0
- package/python/lib/python3.13/encodings/cp863.py +698 -0
- package/python/lib/python3.13/encodings/cp864.py +690 -0
- package/python/lib/python3.13/encodings/cp865.py +698 -0
- package/python/lib/python3.13/encodings/cp866.py +698 -0
- package/python/lib/python3.13/encodings/cp869.py +689 -0
- package/python/lib/python3.13/encodings/cp874.py +307 -0
- package/python/lib/python3.13/encodings/cp875.py +307 -0
- package/python/lib/python3.13/encodings/cp932.py +39 -0
- package/python/lib/python3.13/encodings/cp949.py +39 -0
- package/python/lib/python3.13/encodings/cp950.py +39 -0
- package/python/lib/python3.13/encodings/euc_jis_2004.py +39 -0
- package/python/lib/python3.13/encodings/euc_jisx0213.py +39 -0
- package/python/lib/python3.13/encodings/euc_jp.py +39 -0
- package/python/lib/python3.13/encodings/euc_kr.py +39 -0
- package/python/lib/python3.13/encodings/gb18030.py +39 -0
- package/python/lib/python3.13/encodings/gb2312.py +39 -0
- package/python/lib/python3.13/encodings/gbk.py +39 -0
- package/python/lib/python3.13/encodings/hex_codec.py +55 -0
- package/python/lib/python3.13/encodings/hp_roman8.py +314 -0
- package/python/lib/python3.13/encodings/hz.py +39 -0
- package/python/lib/python3.13/encodings/idna.py +387 -0
- package/python/lib/python3.13/encodings/iso2022_jp.py +39 -0
- package/python/lib/python3.13/encodings/iso2022_jp_1.py +39 -0
- package/python/lib/python3.13/encodings/iso2022_jp_2.py +39 -0
- package/python/lib/python3.13/encodings/iso2022_jp_2004.py +39 -0
- package/python/lib/python3.13/encodings/iso2022_jp_3.py +39 -0
- package/python/lib/python3.13/encodings/iso2022_jp_ext.py +39 -0
- package/python/lib/python3.13/encodings/iso2022_kr.py +39 -0
- package/python/lib/python3.13/encodings/iso8859_1.py +307 -0
- package/python/lib/python3.13/encodings/iso8859_10.py +307 -0
- package/python/lib/python3.13/encodings/iso8859_11.py +307 -0
- package/python/lib/python3.13/encodings/iso8859_13.py +307 -0
- package/python/lib/python3.13/encodings/iso8859_14.py +307 -0
- package/python/lib/python3.13/encodings/iso8859_15.py +307 -0
- package/python/lib/python3.13/encodings/iso8859_16.py +307 -0
- package/python/lib/python3.13/encodings/iso8859_2.py +307 -0
- package/python/lib/python3.13/encodings/iso8859_3.py +307 -0
- package/python/lib/python3.13/encodings/iso8859_4.py +307 -0
- package/python/lib/python3.13/encodings/iso8859_5.py +307 -0
- package/python/lib/python3.13/encodings/iso8859_6.py +307 -0
- package/python/lib/python3.13/encodings/iso8859_7.py +307 -0
- package/python/lib/python3.13/encodings/iso8859_8.py +307 -0
- package/python/lib/python3.13/encodings/iso8859_9.py +307 -0
- package/python/lib/python3.13/encodings/johab.py +39 -0
- package/python/lib/python3.13/encodings/koi8_r.py +307 -0
- package/python/lib/python3.13/encodings/koi8_t.py +308 -0
- package/python/lib/python3.13/encodings/koi8_u.py +307 -0
- package/python/lib/python3.13/encodings/kz1048.py +307 -0
- package/python/lib/python3.13/encodings/latin_1.py +50 -0
- package/python/lib/python3.13/encodings/mac_arabic.py +698 -0
- package/python/lib/python3.13/encodings/mac_croatian.py +307 -0
- package/python/lib/python3.13/encodings/mac_cyrillic.py +307 -0
- package/python/lib/python3.13/encodings/mac_farsi.py +307 -0
- package/python/lib/python3.13/encodings/mac_greek.py +307 -0
- package/python/lib/python3.13/encodings/mac_iceland.py +307 -0
- package/python/lib/python3.13/encodings/mac_latin2.py +312 -0
- package/python/lib/python3.13/encodings/mac_roman.py +307 -0
- package/python/lib/python3.13/encodings/mac_romanian.py +307 -0
- package/python/lib/python3.13/encodings/mac_turkish.py +307 -0
- package/python/lib/python3.13/encodings/mbcs.py +47 -0
- package/python/lib/python3.13/encodings/oem.py +41 -0
- package/python/lib/python3.13/encodings/palmos.py +308 -0
- package/python/lib/python3.13/encodings/ptcp154.py +312 -0
- package/python/lib/python3.13/encodings/punycode.py +253 -0
- package/python/lib/python3.13/encodings/quopri_codec.py +56 -0
- package/python/lib/python3.13/encodings/raw_unicode_escape.py +46 -0
- package/python/lib/python3.13/encodings/rot_13.py +113 -0
- package/python/lib/python3.13/encodings/shift_jis.py +39 -0
- package/python/lib/python3.13/encodings/shift_jis_2004.py +39 -0
- package/python/lib/python3.13/encodings/shift_jisx0213.py +39 -0
- package/python/lib/python3.13/encodings/tis_620.py +307 -0
- package/python/lib/python3.13/encodings/undefined.py +49 -0
- package/python/lib/python3.13/encodings/unicode_escape.py +46 -0
- package/python/lib/python3.13/encodings/utf_16.py +155 -0
- package/python/lib/python3.13/encodings/utf_16_be.py +42 -0
- package/python/lib/python3.13/encodings/utf_16_le.py +42 -0
- package/python/lib/python3.13/encodings/utf_32.py +150 -0
- package/python/lib/python3.13/encodings/utf_32_be.py +37 -0
- package/python/lib/python3.13/encodings/utf_32_le.py +37 -0
- package/python/lib/python3.13/encodings/utf_7.py +38 -0
- package/python/lib/python3.13/encodings/utf_8.py +42 -0
- package/python/lib/python3.13/encodings/utf_8_sig.py +130 -0
- package/python/lib/python3.13/encodings/uu_codec.py +103 -0
- package/python/lib/python3.13/encodings/zlib_codec.py +77 -0
- package/python/lib/python3.13/enum.py +2183 -0
- package/python/lib/python3.13/filecmp.py +320 -0
- package/python/lib/python3.13/fileinput.py +442 -0
- package/python/lib/python3.13/fnmatch.py +192 -0
- package/python/lib/python3.13/fractions.py +1043 -0
- package/python/lib/python3.13/ftplib.py +975 -0
- package/python/lib/python3.13/functools.py +1036 -0
- package/python/lib/python3.13/genericpath.py +200 -0
- package/python/lib/python3.13/getopt.py +215 -0
- package/python/lib/python3.13/getpass.py +192 -0
- package/python/lib/python3.13/gettext.py +657 -0
- package/python/lib/python3.13/glob.py +572 -0
- package/python/lib/python3.13/graphlib.py +250 -0
- package/python/lib/python3.13/gzip.py +693 -0
- package/python/lib/python3.13/hashlib.py +255 -0
- package/python/lib/python3.13/heapq.py +603 -0
- package/python/lib/python3.13/hmac.py +220 -0
- package/python/lib/python3.13/html/__init__.py +132 -0
- package/python/lib/python3.13/html/entities.py +2513 -0
- package/python/lib/python3.13/html/parser.py +583 -0
- package/python/lib/python3.13/http/__init__.py +202 -0
- package/python/lib/python3.13/http/client.py +1598 -0
- package/python/lib/python3.13/http/cookiejar.py +2122 -0
- package/python/lib/python3.13/http/cookies.py +635 -0
- package/python/lib/python3.13/http/server.py +1355 -0
- package/python/lib/python3.13/imaplib.py +1769 -0
- package/python/lib/python3.13/importlib/__init__.py +136 -0
- package/python/lib/python3.13/importlib/_abc.py +39 -0
- package/python/lib/python3.13/importlib/_bootstrap.py +1559 -0
- package/python/lib/python3.13/importlib/_bootstrap_external.py +1826 -0
- package/python/lib/python3.13/importlib/abc.py +243 -0
- package/python/lib/python3.13/importlib/machinery.py +21 -0
- package/python/lib/python3.13/importlib/metadata/__init__.py +1093 -0
- package/python/lib/python3.13/importlib/metadata/_adapters.py +89 -0
- package/python/lib/python3.13/importlib/metadata/_collections.py +30 -0
- package/python/lib/python3.13/importlib/metadata/_functools.py +104 -0
- package/python/lib/python3.13/importlib/metadata/_itertools.py +73 -0
- package/python/lib/python3.13/importlib/metadata/_meta.py +67 -0
- package/python/lib/python3.13/importlib/metadata/_text.py +99 -0
- package/python/lib/python3.13/importlib/metadata/diagnose.py +21 -0
- package/python/lib/python3.13/importlib/readers.py +12 -0
- package/python/lib/python3.13/importlib/resources/__init__.py +43 -0
- package/python/lib/python3.13/importlib/resources/_adapters.py +168 -0
- package/python/lib/python3.13/importlib/resources/_common.py +211 -0
- package/python/lib/python3.13/importlib/resources/_functional.py +81 -0
- package/python/lib/python3.13/importlib/resources/_itertools.py +38 -0
- package/python/lib/python3.13/importlib/resources/abc.py +173 -0
- package/python/lib/python3.13/importlib/resources/readers.py +203 -0
- package/python/lib/python3.13/importlib/resources/simple.py +106 -0
- package/python/lib/python3.13/importlib/simple.py +14 -0
- package/python/lib/python3.13/importlib/util.py +274 -0
- package/python/lib/python3.13/inspect.py +3479 -0
- package/python/lib/python3.13/io.py +99 -0
- package/python/lib/python3.13/ipaddress.py +2440 -0
- package/python/lib/python3.13/json/__init__.py +365 -0
- package/python/lib/python3.13/json/decoder.py +364 -0
- package/python/lib/python3.13/json/encoder.py +446 -0
- package/python/lib/python3.13/json/scanner.py +73 -0
- package/python/lib/python3.13/json/tool.py +90 -0
- package/python/lib/python3.13/keyword.py +64 -0
- package/python/lib/python3.13/lib-dynload/.empty +0 -0
- package/python/lib/python3.13/lib-dynload/_dbm.cpython-313-x86_64-linux-gnu.so +0 -0
- package/python/lib/python3.13/linecache.py +236 -0
- package/python/lib/python3.13/locale.py +1987 -0
- package/python/lib/python3.13/logging/__init__.py +2330 -0
- package/python/lib/python3.13/logging/config.py +1080 -0
- package/python/lib/python3.13/logging/handlers.py +1629 -0
- package/python/lib/python3.13/lzma.py +364 -0
- package/python/lib/python3.13/mailbox.py +2219 -0
- package/python/lib/python3.13/mimetypes.py +679 -0
- package/python/lib/python3.13/modulefinder.py +671 -0
- package/python/lib/python3.13/multiprocessing/__init__.py +37 -0
- package/python/lib/python3.13/multiprocessing/connection.py +1216 -0
- package/python/lib/python3.13/multiprocessing/context.py +383 -0
- package/python/lib/python3.13/multiprocessing/dummy/__init__.py +126 -0
- package/python/lib/python3.13/multiprocessing/dummy/connection.py +75 -0
- package/python/lib/python3.13/multiprocessing/forkserver.py +373 -0
- package/python/lib/python3.13/multiprocessing/heap.py +337 -0
- package/python/lib/python3.13/multiprocessing/managers.py +1397 -0
- package/python/lib/python3.13/multiprocessing/pool.py +957 -0
- package/python/lib/python3.13/multiprocessing/popen_fork.py +97 -0
- package/python/lib/python3.13/multiprocessing/popen_forkserver.py +74 -0
- package/python/lib/python3.13/multiprocessing/popen_spawn_posix.py +76 -0
- package/python/lib/python3.13/multiprocessing/popen_spawn_win32.py +147 -0
- package/python/lib/python3.13/multiprocessing/process.py +436 -0
- package/python/lib/python3.13/multiprocessing/queues.py +399 -0
- package/python/lib/python3.13/multiprocessing/reduction.py +281 -0
- package/python/lib/python3.13/multiprocessing/resource_sharer.py +154 -0
- package/python/lib/python3.13/multiprocessing/resource_tracker.py +499 -0
- package/python/lib/python3.13/multiprocessing/shared_memory.py +544 -0
- package/python/lib/python3.13/multiprocessing/sharedctypes.py +240 -0
- package/python/lib/python3.13/multiprocessing/spawn.py +307 -0
- package/python/lib/python3.13/multiprocessing/synchronize.py +404 -0
- package/python/lib/python3.13/multiprocessing/util.py +562 -0
- package/python/lib/python3.13/netrc.py +199 -0
- package/python/lib/python3.13/ntpath.py +872 -0
- package/python/lib/python3.13/nturl2path.py +69 -0
- package/python/lib/python3.13/numbers.py +427 -0
- package/python/lib/python3.13/opcode.py +115 -0
- package/python/lib/python3.13/operator.py +467 -0
- package/python/lib/python3.13/optparse.py +1681 -0
- package/python/lib/python3.13/os.py +1184 -0
- package/python/lib/python3.13/pathlib/__init__.py +12 -0
- package/python/lib/python3.13/pathlib/_abc.py +930 -0
- package/python/lib/python3.13/pathlib/_local.py +861 -0
- package/python/lib/python3.13/pdb.py +2550 -0
- package/python/lib/python3.13/pickle.py +1860 -0
- package/python/lib/python3.13/pickletools.py +2904 -0
- package/python/lib/python3.13/pkgutil.py +529 -0
- package/python/lib/python3.13/platform.py +1454 -0
- package/python/lib/python3.13/plistlib.py +948 -0
- package/python/lib/python3.13/poplib.py +477 -0
- package/python/lib/python3.13/posixpath.py +578 -0
- package/python/lib/python3.13/pprint.py +658 -0
- package/python/lib/python3.13/profile.py +616 -0
- package/python/lib/python3.13/pstats.py +778 -0
- package/python/lib/python3.13/pty.py +211 -0
- package/python/lib/python3.13/py_compile.py +212 -0
- package/python/lib/python3.13/pyclbr.py +314 -0
- package/python/lib/python3.13/pydoc.py +2861 -0
- package/python/lib/python3.13/queue.py +383 -0
- package/python/lib/python3.13/quopri.py +237 -0
- package/python/lib/python3.13/random.py +1078 -0
- package/python/lib/python3.13/re/__init__.py +428 -0
- package/python/lib/python3.13/re/_casefix.py +106 -0
- package/python/lib/python3.13/re/_compiler.py +768 -0
- package/python/lib/python3.13/re/_constants.py +222 -0
- package/python/lib/python3.13/re/_parser.py +1081 -0
- package/python/lib/python3.13/reprlib.py +230 -0
- package/python/lib/python3.13/rlcompleter.py +222 -0
- package/python/lib/python3.13/runpy.py +326 -0
- package/python/lib/python3.13/sched.py +167 -0
- package/python/lib/python3.13/secrets.py +71 -0
- package/python/lib/python3.13/selectors.py +603 -0
- package/python/lib/python3.13/shelve.py +250 -0
- package/python/lib/python3.13/shlex.py +345 -0
- package/python/lib/python3.13/shutil.py +1569 -0
- package/python/lib/python3.13/signal.py +94 -0
- package/python/lib/python3.13/site.py +773 -0
- package/python/lib/python3.13/smtplib.py +1123 -0
- package/python/lib/python3.13/socket.py +988 -0
- package/python/lib/python3.13/socketserver.py +863 -0
- package/python/lib/python3.13/sqlite3/__init__.py +70 -0
- package/python/lib/python3.13/sqlite3/__main__.py +139 -0
- package/python/lib/python3.13/sqlite3/dbapi2.py +108 -0
- package/python/lib/python3.13/sqlite3/dump.py +118 -0
- package/python/lib/python3.13/sre_compile.py +7 -0
- package/python/lib/python3.13/sre_constants.py +7 -0
- package/python/lib/python3.13/sre_parse.py +7 -0
- package/python/lib/python3.13/ssl.py +1541 -0
- package/python/lib/python3.13/stat.py +212 -0
- package/python/lib/python3.13/statistics.py +1817 -0
- package/python/lib/python3.13/string.py +314 -0
- package/python/lib/python3.13/stringprep.py +272 -0
- package/python/lib/python3.13/struct.py +15 -0
- package/python/lib/python3.13/subprocess.py +2258 -0
- package/python/lib/python3.13/symtable.py +414 -0
- package/python/lib/python3.13/sysconfig/__init__.py +734 -0
- package/python/lib/python3.13/sysconfig/__main__.py +248 -0
- package/python/lib/python3.13/tabnanny.py +340 -0
- package/python/lib/python3.13/tarfile.py +3136 -0
- package/python/lib/python3.13/tempfile.py +958 -0
- package/python/lib/python3.13/textwrap.py +497 -0
- package/python/lib/python3.13/this.py +28 -0
- package/python/lib/python3.13/threading.py +1602 -0
- package/python/lib/python3.13/timeit.py +381 -0
- package/python/lib/python3.13/token.py +141 -0
- package/python/lib/python3.13/tokenize.py +592 -0
- package/python/lib/python3.13/tomllib/__init__.py +10 -0
- package/python/lib/python3.13/tomllib/_parser.py +703 -0
- package/python/lib/python3.13/tomllib/_re.py +107 -0
- package/python/lib/python3.13/tomllib/_types.py +10 -0
- package/python/lib/python3.13/tomllib/mypy.ini +15 -0
- package/python/lib/python3.13/trace.py +754 -0
- package/python/lib/python3.13/traceback.py +1639 -0
- package/python/lib/python3.13/tracemalloc.py +560 -0
- package/python/lib/python3.13/tty.py +73 -0
- package/python/lib/python3.13/types.py +346 -0
- package/python/lib/python3.13/typing.py +3846 -0
- package/python/lib/python3.13/unittest/__init__.py +80 -0
- package/python/lib/python3.13/unittest/__main__.py +18 -0
- package/python/lib/python3.13/unittest/_log.py +86 -0
- package/python/lib/python3.13/unittest/async_case.py +146 -0
- package/python/lib/python3.13/unittest/case.py +1478 -0
- package/python/lib/python3.13/unittest/loader.py +460 -0
- package/python/lib/python3.13/unittest/main.py +280 -0
- package/python/lib/python3.13/unittest/mock.py +3189 -0
- package/python/lib/python3.13/unittest/result.py +256 -0
- package/python/lib/python3.13/unittest/runner.py +292 -0
- package/python/lib/python3.13/unittest/signals.py +71 -0
- package/python/lib/python3.13/unittest/suite.py +379 -0
- package/python/lib/python3.13/unittest/util.py +170 -0
- package/python/lib/python3.13/urllib/__init__.py +0 -0
- package/python/lib/python3.13/urllib/error.py +74 -0
- package/python/lib/python3.13/urllib/parse.py +1264 -0
- package/python/lib/python3.13/urllib/request.py +2796 -0
- package/python/lib/python3.13/urllib/response.py +84 -0
- package/python/lib/python3.13/urllib/robotparser.py +363 -0
- package/python/lib/python3.13/uuid.py +784 -0
- package/python/lib/python3.13/warnings.py +735 -0
- package/python/lib/python3.13/wave.py +665 -0
- package/python/lib/python3.13/weakref.py +674 -0
- package/python/lib/python3.13/webbrowser.py +724 -0
- package/python/lib/python3.13/wsgiref/__init__.py +25 -0
- package/python/lib/python3.13/wsgiref/handlers.py +575 -0
- package/python/lib/python3.13/wsgiref/headers.py +192 -0
- package/python/lib/python3.13/wsgiref/simple_server.py +161 -0
- package/python/lib/python3.13/wsgiref/types.py +54 -0
- package/python/lib/python3.13/wsgiref/util.py +159 -0
- package/python/lib/python3.13/wsgiref/validate.py +438 -0
- package/python/lib/python3.13/xml/__init__.py +20 -0
- package/python/lib/python3.13/xml/dom/NodeFilter.py +27 -0
- package/python/lib/python3.13/xml/dom/__init__.py +140 -0
- package/python/lib/python3.13/xml/dom/domreg.py +99 -0
- package/python/lib/python3.13/xml/dom/expatbuilder.py +962 -0
- package/python/lib/python3.13/xml/dom/minicompat.py +109 -0
- package/python/lib/python3.13/xml/dom/minidom.py +2024 -0
- package/python/lib/python3.13/xml/dom/pulldom.py +336 -0
- package/python/lib/python3.13/xml/dom/xmlbuilder.py +389 -0
- package/python/lib/python3.13/xml/etree/ElementInclude.py +186 -0
- package/python/lib/python3.13/xml/etree/ElementPath.py +430 -0
- package/python/lib/python3.13/xml/etree/ElementTree.py +2116 -0
- package/python/lib/python3.13/xml/etree/__init__.py +33 -0
- package/python/lib/python3.13/xml/etree/cElementTree.py +3 -0
- package/python/lib/python3.13/xml/parsers/__init__.py +8 -0
- package/python/lib/python3.13/xml/parsers/expat.py +8 -0
- package/python/lib/python3.13/xml/sax/__init__.py +94 -0
- package/python/lib/python3.13/xml/sax/_exceptions.py +127 -0
- package/python/lib/python3.13/xml/sax/expatreader.py +454 -0
- package/python/lib/python3.13/xml/sax/handler.py +387 -0
- package/python/lib/python3.13/xml/sax/saxutils.py +369 -0
- package/python/lib/python3.13/xml/sax/xmlreader.py +378 -0
- package/python/lib/python3.13/xmlrpc/__init__.py +1 -0
- package/python/lib/python3.13/xmlrpc/client.py +1503 -0
- package/python/lib/python3.13/xmlrpc/server.py +1002 -0
- package/python/lib/python3.13/zipapp.py +229 -0
- package/python/lib/python3.13/zipfile/__init__.py +2391 -0
- package/python/lib/python3.13/zipfile/__main__.py +4 -0
- package/python/lib/python3.13/zipfile/_path/__init__.py +452 -0
- package/python/lib/python3.13/zipfile/_path/glob.py +113 -0
- package/python/lib/python3.13/zipimport.py +803 -0
- package/python/lib/python3.13/zoneinfo/__init__.py +34 -0
- package/python/lib/python3.13/zoneinfo/_common.py +172 -0
- package/python/lib/python3.13/zoneinfo/_tzpath.py +189 -0
- package/python/lib/python3.13/zoneinfo/_zoneinfo.py +779 -0
- package/python/licenses/LICENSE.bdb.txt +126 -0
- package/python/licenses/LICENSE.bzip2.txt +37 -0
- package/python/licenses/LICENSE.cpython.txt +771 -0
- package/python/licenses/LICENSE.expat.txt +21 -0
- package/python/licenses/LICENSE.libX11.txt +942 -0
- package/python/licenses/LICENSE.libXau.txt +21 -0
- package/python/licenses/LICENSE.libedit.txt +29 -0
- package/python/licenses/LICENSE.libffi.txt +21 -0
- package/python/licenses/LICENSE.liblzma.txt +13 -0
- package/python/licenses/LICENSE.libuuid.txt +27 -0
- package/python/licenses/LICENSE.libxcb.txt +30 -0
- package/python/licenses/LICENSE.mpdecimal.txt +24 -0
- package/python/licenses/LICENSE.ncurses.txt +29 -0
- package/python/licenses/LICENSE.openssl-1.1.txt +124 -0
- package/python/licenses/LICENSE.openssl-3.txt +177 -0
- package/python/licenses/LICENSE.sqlite.txt +23 -0
- package/python/licenses/LICENSE.tcl.txt +40 -0
- package/python/licenses/LICENSE.tix.txt +54 -0
- package/python/licenses/LICENSE.zlib.txt +21 -0
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Lib/ctypes.util.find_library() support for AIX
|
|
3
|
+
Similar approach as done for Darwin support by using separate files
|
|
4
|
+
but unlike Darwin - no extension such as ctypes.macholib.*
|
|
5
|
+
|
|
6
|
+
dlopen() is an interface to AIX initAndLoad() - primary documentation at:
|
|
7
|
+
https://www.ibm.com/support/knowledgecenter/en/ssw_aix_61/com.ibm.aix.basetrf1/dlopen.htm
|
|
8
|
+
https://www.ibm.com/support/knowledgecenter/en/ssw_aix_61/com.ibm.aix.basetrf1/load.htm
|
|
9
|
+
|
|
10
|
+
AIX supports two styles for dlopen(): svr4 (System V Release 4) which is common on posix
|
|
11
|
+
platforms, but also a BSD style - aka SVR3.
|
|
12
|
+
|
|
13
|
+
From AIX 5.3 Difference Addendum (December 2004)
|
|
14
|
+
2.9 SVR4 linking affinity
|
|
15
|
+
Nowadays, there are two major object file formats used by the operating systems:
|
|
16
|
+
XCOFF: The COFF enhanced by IBM and others. The original COFF (Common
|
|
17
|
+
Object File Format) was the base of SVR3 and BSD 4.2 systems.
|
|
18
|
+
ELF: Executable and Linking Format that was developed by AT&T and is a
|
|
19
|
+
base for SVR4 UNIX.
|
|
20
|
+
|
|
21
|
+
While the shared library content is identical on AIX - one is located as a filepath name
|
|
22
|
+
(svr4 style) and the other is located as a member of an archive (and the archive
|
|
23
|
+
is located as a filepath name).
|
|
24
|
+
|
|
25
|
+
The key difference arises when supporting multiple abi formats (i.e., 32 and 64 bit).
|
|
26
|
+
For svr4 either only one ABI is supported, or there are two directories, or there
|
|
27
|
+
are different file names. The most common solution for multiple ABI is multiple
|
|
28
|
+
directories.
|
|
29
|
+
|
|
30
|
+
For the XCOFF (aka AIX) style - one directory (one archive file) is sufficient
|
|
31
|
+
as multiple shared libraries can be in the archive - even sharing the same name.
|
|
32
|
+
In documentation the archive is also referred to as the "base" and the shared
|
|
33
|
+
library object is referred to as the "member".
|
|
34
|
+
|
|
35
|
+
For dlopen() on AIX (read initAndLoad()) the calls are similar.
|
|
36
|
+
Default activity occurs when no path information is provided. When path
|
|
37
|
+
information is provided dlopen() does not search any other directories.
|
|
38
|
+
|
|
39
|
+
For SVR4 - the shared library name is the name of the file expected: libFOO.so
|
|
40
|
+
For AIX - the shared library is expressed as base(member). The search is for the
|
|
41
|
+
base (e.g., libFOO.a) and once the base is found the shared library - identified by
|
|
42
|
+
member (e.g., libFOO.so, or shr.o) is located and loaded.
|
|
43
|
+
|
|
44
|
+
The mode bit RTLD_MEMBER tells initAndLoad() that it needs to use the AIX (SVR3)
|
|
45
|
+
naming style.
|
|
46
|
+
"""
|
|
47
|
+
__author__ = "Michael Felt <aixtools@felt.demon.nl>"
|
|
48
|
+
|
|
49
|
+
import re
|
|
50
|
+
from os import environ, path
|
|
51
|
+
from sys import executable
|
|
52
|
+
from ctypes import c_void_p, sizeof
|
|
53
|
+
from subprocess import Popen, PIPE, DEVNULL
|
|
54
|
+
|
|
55
|
+
# Executable bit size - 32 or 64
|
|
56
|
+
# Used to filter the search in an archive by size, e.g., -X64
|
|
57
|
+
AIX_ABI = sizeof(c_void_p) * 8
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
from sys import maxsize
|
|
61
|
+
def _last_version(libnames, sep):
|
|
62
|
+
def _num_version(libname):
|
|
63
|
+
# "libxyz.so.MAJOR.MINOR" => [MAJOR, MINOR]
|
|
64
|
+
parts = libname.split(sep)
|
|
65
|
+
nums = []
|
|
66
|
+
try:
|
|
67
|
+
while parts:
|
|
68
|
+
nums.insert(0, int(parts.pop()))
|
|
69
|
+
except ValueError:
|
|
70
|
+
pass
|
|
71
|
+
return nums or [maxsize]
|
|
72
|
+
return max(reversed(libnames), key=_num_version)
|
|
73
|
+
|
|
74
|
+
def get_ld_header(p):
|
|
75
|
+
# "nested-function, but placed at module level
|
|
76
|
+
ld_header = None
|
|
77
|
+
for line in p.stdout:
|
|
78
|
+
if line.startswith(('/', './', '../')):
|
|
79
|
+
ld_header = line
|
|
80
|
+
elif "INDEX" in line:
|
|
81
|
+
return ld_header.rstrip('\n')
|
|
82
|
+
return None
|
|
83
|
+
|
|
84
|
+
def get_ld_header_info(p):
|
|
85
|
+
# "nested-function, but placed at module level
|
|
86
|
+
# as an ld_header was found, return known paths, archives and members
|
|
87
|
+
# these lines start with a digit
|
|
88
|
+
info = []
|
|
89
|
+
for line in p.stdout:
|
|
90
|
+
if re.match("[0-9]", line):
|
|
91
|
+
info.append(line)
|
|
92
|
+
else:
|
|
93
|
+
# blank line (separator), consume line and end for loop
|
|
94
|
+
break
|
|
95
|
+
return info
|
|
96
|
+
|
|
97
|
+
def get_ld_headers(file):
|
|
98
|
+
"""
|
|
99
|
+
Parse the header of the loader section of executable and archives
|
|
100
|
+
This function calls /usr/bin/dump -H as a subprocess
|
|
101
|
+
and returns a list of (ld_header, ld_header_info) tuples.
|
|
102
|
+
"""
|
|
103
|
+
# get_ld_headers parsing:
|
|
104
|
+
# 1. Find a line that starts with /, ./, or ../ - set as ld_header
|
|
105
|
+
# 2. If "INDEX" in occurs in a following line - return ld_header
|
|
106
|
+
# 3. get info (lines starting with [0-9])
|
|
107
|
+
ldr_headers = []
|
|
108
|
+
p = Popen(["/usr/bin/dump", f"-X{AIX_ABI}", "-H", file],
|
|
109
|
+
universal_newlines=True, stdout=PIPE, stderr=DEVNULL)
|
|
110
|
+
# be sure to read to the end-of-file - getting all entries
|
|
111
|
+
while ld_header := get_ld_header(p):
|
|
112
|
+
ldr_headers.append((ld_header, get_ld_header_info(p)))
|
|
113
|
+
p.stdout.close()
|
|
114
|
+
p.wait()
|
|
115
|
+
return ldr_headers
|
|
116
|
+
|
|
117
|
+
def get_shared(ld_headers):
|
|
118
|
+
"""
|
|
119
|
+
extract the shareable objects from ld_headers
|
|
120
|
+
character "[" is used to strip off the path information.
|
|
121
|
+
Note: the "[" and "]" characters that are part of dump -H output
|
|
122
|
+
are not removed here.
|
|
123
|
+
"""
|
|
124
|
+
shared = []
|
|
125
|
+
for (line, _) in ld_headers:
|
|
126
|
+
# potential member lines contain "["
|
|
127
|
+
# otherwise, no processing needed
|
|
128
|
+
if "[" in line:
|
|
129
|
+
# Strip off trailing colon (:)
|
|
130
|
+
shared.append(line[line.index("["):-1])
|
|
131
|
+
return shared
|
|
132
|
+
|
|
133
|
+
def get_one_match(expr, lines):
|
|
134
|
+
"""
|
|
135
|
+
Must be only one match, otherwise result is None.
|
|
136
|
+
When there is a match, strip leading "[" and trailing "]"
|
|
137
|
+
"""
|
|
138
|
+
# member names in the ld_headers output are between square brackets
|
|
139
|
+
expr = rf'\[({expr})\]'
|
|
140
|
+
matches = list(filter(None, (re.search(expr, line) for line in lines)))
|
|
141
|
+
if len(matches) == 1:
|
|
142
|
+
return matches[0].group(1)
|
|
143
|
+
else:
|
|
144
|
+
return None
|
|
145
|
+
|
|
146
|
+
# additional processing to deal with AIX legacy names for 64-bit members
|
|
147
|
+
def get_legacy(members):
|
|
148
|
+
"""
|
|
149
|
+
This routine provides historical aka legacy naming schemes started
|
|
150
|
+
in AIX4 shared library support for library members names.
|
|
151
|
+
e.g., in /usr/lib/libc.a the member name shr.o for 32-bit binary and
|
|
152
|
+
shr_64.o for 64-bit binary.
|
|
153
|
+
"""
|
|
154
|
+
if AIX_ABI == 64:
|
|
155
|
+
# AIX 64-bit member is one of shr64.o, shr_64.o, or shr4_64.o
|
|
156
|
+
expr = r'shr4?_?64\.o'
|
|
157
|
+
member = get_one_match(expr, members)
|
|
158
|
+
if member:
|
|
159
|
+
return member
|
|
160
|
+
else:
|
|
161
|
+
# 32-bit legacy names - both shr.o and shr4.o exist.
|
|
162
|
+
# shr.o is the preferred name so we look for shr.o first
|
|
163
|
+
# i.e., shr4.o is returned only when shr.o does not exist
|
|
164
|
+
for name in ['shr.o', 'shr4.o']:
|
|
165
|
+
member = get_one_match(re.escape(name), members)
|
|
166
|
+
if member:
|
|
167
|
+
return member
|
|
168
|
+
return None
|
|
169
|
+
|
|
170
|
+
def get_version(name, members):
|
|
171
|
+
"""
|
|
172
|
+
Sort list of members and return highest numbered version - if it exists.
|
|
173
|
+
This function is called when an unversioned libFOO.a(libFOO.so) has
|
|
174
|
+
not been found.
|
|
175
|
+
|
|
176
|
+
Versioning for the member name is expected to follow
|
|
177
|
+
GNU LIBTOOL conventions: the highest version (x, then X.y, then X.Y.z)
|
|
178
|
+
* find [libFoo.so.X]
|
|
179
|
+
* find [libFoo.so.X.Y]
|
|
180
|
+
* find [libFoo.so.X.Y.Z]
|
|
181
|
+
|
|
182
|
+
Before the GNU convention became the standard scheme regardless of
|
|
183
|
+
binary size AIX packagers used GNU convention "as-is" for 32-bit
|
|
184
|
+
archive members but used an "distinguishing" name for 64-bit members.
|
|
185
|
+
This scheme inserted either 64 or _64 between libFOO and .so
|
|
186
|
+
- generally libFOO_64.so, but occasionally libFOO64.so
|
|
187
|
+
"""
|
|
188
|
+
# the expression ending for versions must start as
|
|
189
|
+
# '.so.[0-9]', i.e., *.so.[at least one digit]
|
|
190
|
+
# while multiple, more specific expressions could be specified
|
|
191
|
+
# to search for .so.X, .so.X.Y and .so.X.Y.Z
|
|
192
|
+
# after the first required 'dot' digit
|
|
193
|
+
# any combination of additional 'dot' digits pairs are accepted
|
|
194
|
+
# anything more than libFOO.so.digits.digits.digits
|
|
195
|
+
# should be seen as a member name outside normal expectations
|
|
196
|
+
exprs = [rf'lib{name}\.so\.[0-9]+[0-9.]*',
|
|
197
|
+
rf'lib{name}_?64\.so\.[0-9]+[0-9.]*']
|
|
198
|
+
for expr in exprs:
|
|
199
|
+
versions = []
|
|
200
|
+
for line in members:
|
|
201
|
+
m = re.search(expr, line)
|
|
202
|
+
if m:
|
|
203
|
+
versions.append(m.group(0))
|
|
204
|
+
if versions:
|
|
205
|
+
return _last_version(versions, '.')
|
|
206
|
+
return None
|
|
207
|
+
|
|
208
|
+
def get_member(name, members):
|
|
209
|
+
"""
|
|
210
|
+
Return an archive member matching the request in name.
|
|
211
|
+
Name is the library name without any prefix like lib, suffix like .so,
|
|
212
|
+
or version number.
|
|
213
|
+
Given a list of members find and return the most appropriate result
|
|
214
|
+
Priority is given to generic libXXX.so, then a versioned libXXX.so.a.b.c
|
|
215
|
+
and finally, legacy AIX naming scheme.
|
|
216
|
+
"""
|
|
217
|
+
# look first for a generic match - prepend lib and append .so
|
|
218
|
+
expr = rf'lib{name}\.so'
|
|
219
|
+
member = get_one_match(expr, members)
|
|
220
|
+
if member:
|
|
221
|
+
return member
|
|
222
|
+
elif AIX_ABI == 64:
|
|
223
|
+
expr = rf'lib{name}64\.so'
|
|
224
|
+
member = get_one_match(expr, members)
|
|
225
|
+
if member:
|
|
226
|
+
return member
|
|
227
|
+
# since an exact match with .so as suffix was not found
|
|
228
|
+
# look for a versioned name
|
|
229
|
+
# If a versioned name is not found, look for AIX legacy member name
|
|
230
|
+
member = get_version(name, members)
|
|
231
|
+
if member:
|
|
232
|
+
return member
|
|
233
|
+
else:
|
|
234
|
+
return get_legacy(members)
|
|
235
|
+
|
|
236
|
+
def get_libpaths():
|
|
237
|
+
"""
|
|
238
|
+
On AIX, the buildtime searchpath is stored in the executable.
|
|
239
|
+
as "loader header information".
|
|
240
|
+
The command /usr/bin/dump -H extracts this info.
|
|
241
|
+
Prefix searched libraries with LD_LIBRARY_PATH (preferred),
|
|
242
|
+
or LIBPATH if defined. These paths are appended to the paths
|
|
243
|
+
to libraries the python executable is linked with.
|
|
244
|
+
This mimics AIX dlopen() behavior.
|
|
245
|
+
"""
|
|
246
|
+
libpaths = environ.get("LD_LIBRARY_PATH")
|
|
247
|
+
if libpaths is None:
|
|
248
|
+
libpaths = environ.get("LIBPATH")
|
|
249
|
+
if libpaths is None:
|
|
250
|
+
libpaths = []
|
|
251
|
+
else:
|
|
252
|
+
libpaths = libpaths.split(":")
|
|
253
|
+
objects = get_ld_headers(executable)
|
|
254
|
+
for (_, lines) in objects:
|
|
255
|
+
for line in lines:
|
|
256
|
+
# the second (optional) argument is PATH if it includes a /
|
|
257
|
+
path = line.split()[1]
|
|
258
|
+
if "/" in path:
|
|
259
|
+
libpaths.extend(path.split(":"))
|
|
260
|
+
return libpaths
|
|
261
|
+
|
|
262
|
+
def find_shared(paths, name):
|
|
263
|
+
"""
|
|
264
|
+
paths is a list of directories to search for an archive.
|
|
265
|
+
name is the abbreviated name given to find_library().
|
|
266
|
+
Process: search "paths" for archive, and if an archive is found
|
|
267
|
+
return the result of get_member().
|
|
268
|
+
If an archive is not found then return None
|
|
269
|
+
"""
|
|
270
|
+
for dir in paths:
|
|
271
|
+
# /lib is a symbolic link to /usr/lib, skip it
|
|
272
|
+
if dir == "/lib":
|
|
273
|
+
continue
|
|
274
|
+
# "lib" is prefixed to emulate compiler name resolution,
|
|
275
|
+
# e.g., -lc to libc
|
|
276
|
+
base = f'lib{name}.a'
|
|
277
|
+
archive = path.join(dir, base)
|
|
278
|
+
if path.exists(archive):
|
|
279
|
+
members = get_shared(get_ld_headers(archive))
|
|
280
|
+
member = get_member(re.escape(name), members)
|
|
281
|
+
if member is not None:
|
|
282
|
+
return (base, member)
|
|
283
|
+
else:
|
|
284
|
+
return (None, None)
|
|
285
|
+
return (None, None)
|
|
286
|
+
|
|
287
|
+
def find_library(name):
|
|
288
|
+
"""AIX implementation of ctypes.util.find_library()
|
|
289
|
+
Find an archive member that will dlopen(). If not available,
|
|
290
|
+
also search for a file (or link) with a .so suffix.
|
|
291
|
+
|
|
292
|
+
AIX supports two types of schemes that can be used with dlopen().
|
|
293
|
+
The so-called SystemV Release4 (svr4) format is commonly suffixed
|
|
294
|
+
with .so while the (default) AIX scheme has the library (archive)
|
|
295
|
+
ending with the suffix .a
|
|
296
|
+
As an archive has multiple members (e.g., 32-bit and 64-bit) in one file
|
|
297
|
+
the argument passed to dlopen must include both the library and
|
|
298
|
+
the member names in a single string.
|
|
299
|
+
|
|
300
|
+
find_library() looks first for an archive (.a) with a suitable member.
|
|
301
|
+
If no archive+member pair is found, look for a .so file.
|
|
302
|
+
"""
|
|
303
|
+
|
|
304
|
+
libpaths = get_libpaths()
|
|
305
|
+
(base, member) = find_shared(libpaths, name)
|
|
306
|
+
if base is not None:
|
|
307
|
+
return f"{base}({member})"
|
|
308
|
+
|
|
309
|
+
# To get here, a member in an archive has not been found
|
|
310
|
+
# In other words, either:
|
|
311
|
+
# a) a .a file was not found
|
|
312
|
+
# b) a .a file did not have a suitable member
|
|
313
|
+
# So, look for a .so file
|
|
314
|
+
# Check libpaths for .so file
|
|
315
|
+
# Note, the installation must prepare a link from a .so
|
|
316
|
+
# to a versioned file
|
|
317
|
+
# This is common practice by GNU libtool on other platforms
|
|
318
|
+
soname = f"lib{name}.so"
|
|
319
|
+
for dir in libpaths:
|
|
320
|
+
# /lib is a symbolic link to /usr/lib, skip it
|
|
321
|
+
if dir == "/lib":
|
|
322
|
+
continue
|
|
323
|
+
shlib = path.join(dir, soname)
|
|
324
|
+
if path.exists(shlib):
|
|
325
|
+
return soname
|
|
326
|
+
# if we are here, we have not found anything plausible
|
|
327
|
+
return None
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
from ctypes import Array, Structure, Union
|
|
3
|
+
|
|
4
|
+
_array_type = type(Array)
|
|
5
|
+
|
|
6
|
+
def _other_endian(typ):
|
|
7
|
+
"""Return the type with the 'other' byte order. Simple types like
|
|
8
|
+
c_int and so on already have __ctype_be__ and __ctype_le__
|
|
9
|
+
attributes which contain the types, for more complicated types
|
|
10
|
+
arrays and structures are supported.
|
|
11
|
+
"""
|
|
12
|
+
# check _OTHER_ENDIAN attribute (present if typ is primitive type)
|
|
13
|
+
if hasattr(typ, _OTHER_ENDIAN):
|
|
14
|
+
return getattr(typ, _OTHER_ENDIAN)
|
|
15
|
+
# if typ is array
|
|
16
|
+
if isinstance(typ, _array_type):
|
|
17
|
+
return _other_endian(typ._type_) * typ._length_
|
|
18
|
+
# if typ is structure or union
|
|
19
|
+
if issubclass(typ, (Structure, Union)):
|
|
20
|
+
return typ
|
|
21
|
+
raise TypeError("This type does not support other endian: %s" % typ)
|
|
22
|
+
|
|
23
|
+
class _swapped_meta:
|
|
24
|
+
def __setattr__(self, attrname, value):
|
|
25
|
+
if attrname == "_fields_":
|
|
26
|
+
fields = []
|
|
27
|
+
for desc in value:
|
|
28
|
+
name = desc[0]
|
|
29
|
+
typ = desc[1]
|
|
30
|
+
rest = desc[2:]
|
|
31
|
+
fields.append((name, _other_endian(typ)) + rest)
|
|
32
|
+
value = fields
|
|
33
|
+
super().__setattr__(attrname, value)
|
|
34
|
+
class _swapped_struct_meta(_swapped_meta, type(Structure)): pass
|
|
35
|
+
class _swapped_union_meta(_swapped_meta, type(Union)): pass
|
|
36
|
+
|
|
37
|
+
################################################################
|
|
38
|
+
|
|
39
|
+
# Note: The Structure metaclass checks for the *presence* (not the
|
|
40
|
+
# value!) of a _swappedbytes_ attribute to determine the bit order in
|
|
41
|
+
# structures containing bit fields.
|
|
42
|
+
|
|
43
|
+
if sys.byteorder == "little":
|
|
44
|
+
_OTHER_ENDIAN = "__ctype_be__"
|
|
45
|
+
|
|
46
|
+
LittleEndianStructure = Structure
|
|
47
|
+
|
|
48
|
+
class BigEndianStructure(Structure, metaclass=_swapped_struct_meta):
|
|
49
|
+
"""Structure with big endian byte order"""
|
|
50
|
+
__slots__ = ()
|
|
51
|
+
_swappedbytes_ = None
|
|
52
|
+
|
|
53
|
+
LittleEndianUnion = Union
|
|
54
|
+
|
|
55
|
+
class BigEndianUnion(Union, metaclass=_swapped_union_meta):
|
|
56
|
+
"""Union with big endian byte order"""
|
|
57
|
+
__slots__ = ()
|
|
58
|
+
_swappedbytes_ = None
|
|
59
|
+
|
|
60
|
+
elif sys.byteorder == "big":
|
|
61
|
+
_OTHER_ENDIAN = "__ctype_le__"
|
|
62
|
+
|
|
63
|
+
BigEndianStructure = Structure
|
|
64
|
+
|
|
65
|
+
class LittleEndianStructure(Structure, metaclass=_swapped_struct_meta):
|
|
66
|
+
"""Structure with little endian byte order"""
|
|
67
|
+
__slots__ = ()
|
|
68
|
+
_swappedbytes_ = None
|
|
69
|
+
|
|
70
|
+
BigEndianUnion = Union
|
|
71
|
+
|
|
72
|
+
class LittleEndianUnion(Union, metaclass=_swapped_union_meta):
|
|
73
|
+
"""Union with little endian byte order"""
|
|
74
|
+
__slots__ = ()
|
|
75
|
+
_swappedbytes_ = None
|
|
76
|
+
|
|
77
|
+
else:
|
|
78
|
+
raise RuntimeError("Invalid byteorder")
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
Files in this directory come from Bob Ippolito's py2app.
|
|
2
|
+
|
|
3
|
+
License: Any components of the py2app suite may be distributed under
|
|
4
|
+
the MIT or PSF open source licenses.
|
|
5
|
+
|
|
6
|
+
This is version 1.0, SVN revision 789, from 2006/01/25.
|
|
7
|
+
The main repository is http://svn.red-bean.com/bob/macholib/trunk/macholib/
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"""
|
|
2
|
+
dyld emulation
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import os
|
|
6
|
+
from ctypes.macholib.framework import framework_info
|
|
7
|
+
from ctypes.macholib.dylib import dylib_info
|
|
8
|
+
from itertools import *
|
|
9
|
+
try:
|
|
10
|
+
from _ctypes import _dyld_shared_cache_contains_path
|
|
11
|
+
except ImportError:
|
|
12
|
+
def _dyld_shared_cache_contains_path(*args):
|
|
13
|
+
raise NotImplementedError
|
|
14
|
+
|
|
15
|
+
__all__ = [
|
|
16
|
+
'dyld_find', 'framework_find',
|
|
17
|
+
'framework_info', 'dylib_info',
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
# These are the defaults as per man dyld(1)
|
|
21
|
+
#
|
|
22
|
+
DEFAULT_FRAMEWORK_FALLBACK = [
|
|
23
|
+
os.path.expanduser("~/Library/Frameworks"),
|
|
24
|
+
"/Library/Frameworks",
|
|
25
|
+
"/Network/Library/Frameworks",
|
|
26
|
+
"/System/Library/Frameworks",
|
|
27
|
+
]
|
|
28
|
+
|
|
29
|
+
DEFAULT_LIBRARY_FALLBACK = [
|
|
30
|
+
os.path.expanduser("~/lib"),
|
|
31
|
+
"/usr/local/lib",
|
|
32
|
+
"/lib",
|
|
33
|
+
"/usr/lib",
|
|
34
|
+
]
|
|
35
|
+
|
|
36
|
+
def dyld_env(env, var):
|
|
37
|
+
if env is None:
|
|
38
|
+
env = os.environ
|
|
39
|
+
rval = env.get(var)
|
|
40
|
+
if rval is None:
|
|
41
|
+
return []
|
|
42
|
+
return rval.split(':')
|
|
43
|
+
|
|
44
|
+
def dyld_image_suffix(env=None):
|
|
45
|
+
if env is None:
|
|
46
|
+
env = os.environ
|
|
47
|
+
return env.get('DYLD_IMAGE_SUFFIX')
|
|
48
|
+
|
|
49
|
+
def dyld_framework_path(env=None):
|
|
50
|
+
return dyld_env(env, 'DYLD_FRAMEWORK_PATH')
|
|
51
|
+
|
|
52
|
+
def dyld_library_path(env=None):
|
|
53
|
+
return dyld_env(env, 'DYLD_LIBRARY_PATH')
|
|
54
|
+
|
|
55
|
+
def dyld_fallback_framework_path(env=None):
|
|
56
|
+
return dyld_env(env, 'DYLD_FALLBACK_FRAMEWORK_PATH')
|
|
57
|
+
|
|
58
|
+
def dyld_fallback_library_path(env=None):
|
|
59
|
+
return dyld_env(env, 'DYLD_FALLBACK_LIBRARY_PATH')
|
|
60
|
+
|
|
61
|
+
def dyld_image_suffix_search(iterator, env=None):
|
|
62
|
+
"""For a potential path iterator, add DYLD_IMAGE_SUFFIX semantics"""
|
|
63
|
+
suffix = dyld_image_suffix(env)
|
|
64
|
+
if suffix is None:
|
|
65
|
+
return iterator
|
|
66
|
+
def _inject(iterator=iterator, suffix=suffix):
|
|
67
|
+
for path in iterator:
|
|
68
|
+
if path.endswith('.dylib'):
|
|
69
|
+
yield path[:-len('.dylib')] + suffix + '.dylib'
|
|
70
|
+
else:
|
|
71
|
+
yield path + suffix
|
|
72
|
+
yield path
|
|
73
|
+
return _inject()
|
|
74
|
+
|
|
75
|
+
def dyld_override_search(name, env=None):
|
|
76
|
+
# If DYLD_FRAMEWORK_PATH is set and this dylib_name is a
|
|
77
|
+
# framework name, use the first file that exists in the framework
|
|
78
|
+
# path if any. If there is none go on to search the DYLD_LIBRARY_PATH
|
|
79
|
+
# if any.
|
|
80
|
+
|
|
81
|
+
framework = framework_info(name)
|
|
82
|
+
|
|
83
|
+
if framework is not None:
|
|
84
|
+
for path in dyld_framework_path(env):
|
|
85
|
+
yield os.path.join(path, framework['name'])
|
|
86
|
+
|
|
87
|
+
# If DYLD_LIBRARY_PATH is set then use the first file that exists
|
|
88
|
+
# in the path. If none use the original name.
|
|
89
|
+
for path in dyld_library_path(env):
|
|
90
|
+
yield os.path.join(path, os.path.basename(name))
|
|
91
|
+
|
|
92
|
+
def dyld_executable_path_search(name, executable_path=None):
|
|
93
|
+
# If we haven't done any searching and found a library and the
|
|
94
|
+
# dylib_name starts with "@executable_path/" then construct the
|
|
95
|
+
# library name.
|
|
96
|
+
if name.startswith('@executable_path/') and executable_path is not None:
|
|
97
|
+
yield os.path.join(executable_path, name[len('@executable_path/'):])
|
|
98
|
+
|
|
99
|
+
def dyld_default_search(name, env=None):
|
|
100
|
+
yield name
|
|
101
|
+
|
|
102
|
+
framework = framework_info(name)
|
|
103
|
+
|
|
104
|
+
if framework is not None:
|
|
105
|
+
fallback_framework_path = dyld_fallback_framework_path(env)
|
|
106
|
+
for path in fallback_framework_path:
|
|
107
|
+
yield os.path.join(path, framework['name'])
|
|
108
|
+
|
|
109
|
+
fallback_library_path = dyld_fallback_library_path(env)
|
|
110
|
+
for path in fallback_library_path:
|
|
111
|
+
yield os.path.join(path, os.path.basename(name))
|
|
112
|
+
|
|
113
|
+
if framework is not None and not fallback_framework_path:
|
|
114
|
+
for path in DEFAULT_FRAMEWORK_FALLBACK:
|
|
115
|
+
yield os.path.join(path, framework['name'])
|
|
116
|
+
|
|
117
|
+
if not fallback_library_path:
|
|
118
|
+
for path in DEFAULT_LIBRARY_FALLBACK:
|
|
119
|
+
yield os.path.join(path, os.path.basename(name))
|
|
120
|
+
|
|
121
|
+
def dyld_find(name, executable_path=None, env=None):
|
|
122
|
+
"""
|
|
123
|
+
Find a library or framework using dyld semantics
|
|
124
|
+
"""
|
|
125
|
+
for path in dyld_image_suffix_search(chain(
|
|
126
|
+
dyld_override_search(name, env),
|
|
127
|
+
dyld_executable_path_search(name, executable_path),
|
|
128
|
+
dyld_default_search(name, env),
|
|
129
|
+
), env):
|
|
130
|
+
|
|
131
|
+
if os.path.isfile(path):
|
|
132
|
+
return path
|
|
133
|
+
try:
|
|
134
|
+
if _dyld_shared_cache_contains_path(path):
|
|
135
|
+
return path
|
|
136
|
+
except NotImplementedError:
|
|
137
|
+
pass
|
|
138
|
+
|
|
139
|
+
raise ValueError("dylib %s could not be found" % (name,))
|
|
140
|
+
|
|
141
|
+
def framework_find(fn, executable_path=None, env=None):
|
|
142
|
+
"""
|
|
143
|
+
Find a framework using dyld semantics in a very loose manner.
|
|
144
|
+
|
|
145
|
+
Will take input such as:
|
|
146
|
+
Python
|
|
147
|
+
Python.framework
|
|
148
|
+
Python.framework/Versions/Current
|
|
149
|
+
"""
|
|
150
|
+
error = None
|
|
151
|
+
try:
|
|
152
|
+
return dyld_find(fn, executable_path=executable_path, env=env)
|
|
153
|
+
except ValueError as e:
|
|
154
|
+
error = e
|
|
155
|
+
fmwk_index = fn.rfind('.framework')
|
|
156
|
+
if fmwk_index == -1:
|
|
157
|
+
fmwk_index = len(fn)
|
|
158
|
+
fn += '.framework'
|
|
159
|
+
fn = os.path.join(fn, os.path.basename(fn[:fmwk_index]))
|
|
160
|
+
try:
|
|
161
|
+
return dyld_find(fn, executable_path=executable_path, env=env)
|
|
162
|
+
except ValueError:
|
|
163
|
+
raise error
|
|
164
|
+
finally:
|
|
165
|
+
error = None
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Generic dylib path manipulation
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import re
|
|
6
|
+
|
|
7
|
+
__all__ = ['dylib_info']
|
|
8
|
+
|
|
9
|
+
DYLIB_RE = re.compile(r"""(?x)
|
|
10
|
+
(?P<location>^.*)(?:^|/)
|
|
11
|
+
(?P<name>
|
|
12
|
+
(?P<shortname>\w+?)
|
|
13
|
+
(?:\.(?P<version>[^._]+))?
|
|
14
|
+
(?:_(?P<suffix>[^._]+))?
|
|
15
|
+
\.dylib$
|
|
16
|
+
)
|
|
17
|
+
""")
|
|
18
|
+
|
|
19
|
+
def dylib_info(filename):
|
|
20
|
+
"""
|
|
21
|
+
A dylib name can take one of the following four forms:
|
|
22
|
+
Location/Name.SomeVersion_Suffix.dylib
|
|
23
|
+
Location/Name.SomeVersion.dylib
|
|
24
|
+
Location/Name_Suffix.dylib
|
|
25
|
+
Location/Name.dylib
|
|
26
|
+
|
|
27
|
+
returns None if not found or a mapping equivalent to:
|
|
28
|
+
dict(
|
|
29
|
+
location='Location',
|
|
30
|
+
name='Name.SomeVersion_Suffix.dylib',
|
|
31
|
+
shortname='Name',
|
|
32
|
+
version='SomeVersion',
|
|
33
|
+
suffix='Suffix',
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
Note that SomeVersion and Suffix are optional and may be None
|
|
37
|
+
if not present.
|
|
38
|
+
"""
|
|
39
|
+
is_dylib = DYLIB_RE.match(filename)
|
|
40
|
+
if not is_dylib:
|
|
41
|
+
return None
|
|
42
|
+
return is_dylib.groupdict()
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
svn export --force http://svn.red-bean.com/bob/macholib/trunk/macholib/ .
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Generic framework path manipulation
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import re
|
|
6
|
+
|
|
7
|
+
__all__ = ['framework_info']
|
|
8
|
+
|
|
9
|
+
STRICT_FRAMEWORK_RE = re.compile(r"""(?x)
|
|
10
|
+
(?P<location>^.*)(?:^|/)
|
|
11
|
+
(?P<name>
|
|
12
|
+
(?P<shortname>\w+).framework/
|
|
13
|
+
(?:Versions/(?P<version>[^/]+)/)?
|
|
14
|
+
(?P=shortname)
|
|
15
|
+
(?:_(?P<suffix>[^_]+))?
|
|
16
|
+
)$
|
|
17
|
+
""")
|
|
18
|
+
|
|
19
|
+
def framework_info(filename):
|
|
20
|
+
"""
|
|
21
|
+
A framework name can take one of the following four forms:
|
|
22
|
+
Location/Name.framework/Versions/SomeVersion/Name_Suffix
|
|
23
|
+
Location/Name.framework/Versions/SomeVersion/Name
|
|
24
|
+
Location/Name.framework/Name_Suffix
|
|
25
|
+
Location/Name.framework/Name
|
|
26
|
+
|
|
27
|
+
returns None if not found, or a mapping equivalent to:
|
|
28
|
+
dict(
|
|
29
|
+
location='Location',
|
|
30
|
+
name='Name.framework/Versions/SomeVersion/Name_Suffix',
|
|
31
|
+
shortname='Name',
|
|
32
|
+
version='SomeVersion',
|
|
33
|
+
suffix='Suffix',
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
Note that SomeVersion and Suffix are optional and may be None
|
|
37
|
+
if not present
|
|
38
|
+
"""
|
|
39
|
+
is_framework = STRICT_FRAMEWORK_RE.match(filename)
|
|
40
|
+
if not is_framework:
|
|
41
|
+
return None
|
|
42
|
+
return is_framework.groupdict()
|