portable-python 1.10.2__py3-none-any.whl → 2.0.1__py3-none-any.whl

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.
@@ -222,7 +222,9 @@ class BuildSetup:
222
222
  runez.abort("Please provide full desired version: %s is not good enough" % runez.red(python_spec))
223
223
 
224
224
  self.python_spec = python_spec
225
- self.folders = PPG.get_folders(base=os.getcwd(), family=python_spec.family, version=python_spec.version)
225
+ self.folders = PPG.get_folders(
226
+ base=os.getcwd(), family=python_spec.family, version=python_spec.version, abi_suffix=python_spec.abi_suffix
227
+ )
226
228
  self.desired_modules = modules
227
229
  prefix = self.folders.formatted(prefix)
228
230
  self.prefix = prefix
@@ -237,7 +239,9 @@ class BuildSetup:
237
239
  self.tarball_name = PPG.target.composed_basename(dest, extension=ext)
238
240
 
239
241
  else:
240
- self.tarball_name = PPG.target.composed_basename(python_spec.family, python_spec.version, extension=ext)
242
+ self.tarball_name = PPG.target.composed_basename(
243
+ python_spec.family, python_spec.version, abi_suffix=python_spec.abi_suffix, extension=ext
244
+ )
241
245
 
242
246
  builder = PPG.family(python_spec.family).get_builder()
243
247
  self.python_builder = builder(self) # type: PythonBuilder
@@ -605,10 +609,12 @@ class ModuleBuilder:
605
609
 
606
610
  def run_make(self, *args, program="make", cpu_count=None):
607
611
  cmd = program.split()
608
- if cpu_count and cpu_count < 0:
612
+ if cpu_count is None:
609
613
  available = multiprocessing.cpu_count()
614
+ # If we can't retrieve the number of cores, leave cpu_count as None
615
+ # and we'll omit -j below.
610
616
  if available and available > 0:
611
- cpu_count += available
617
+ cpu_count = available
612
618
 
613
619
  if cpu_count and cpu_count > 1:
614
620
  cmd.append("-j%s" % cpu_count)
portable_python/config.py CHANGED
@@ -17,7 +17,7 @@ folders:
17
17
  destdir: "{build}"
18
18
  dist: dist
19
19
  logs: "{build}/logs"
20
- ppp-marker: /ppp-marker/{version}
20
+ ppp-marker: /ppp-marker/{version}{abi_suffix}
21
21
  sources: build/sources
22
22
 
23
23
  manifest:
@@ -8,7 +8,7 @@ import yaml
8
8
  from runez.pyenv import Version
9
9
 
10
10
  from portable_python import LOG, patch_file, patch_folder, PPG, PythonBuilder
11
- from portable_python.external.xcpython import Bdb, Bzip2, Gdbm, LibFFI, Openssl, Readline, Sqlite, Uuid, Xz, Zlib
11
+ from portable_python.external.xcpython import Bdb, Bzip2, Gdbm, LibFFI, Mpdec, Openssl, Readline, Sqlite, Uuid, Xz, Zlib, Zstd
12
12
  from portable_python.external.xtkinter import TkInter
13
13
  from portable_python.inspector import LibAutoCorrect, PythonInspector
14
14
 
@@ -96,7 +96,7 @@ class Cpython(PythonBuilder):
96
96
 
97
97
  @classmethod
98
98
  def candidate_modules(cls):
99
- return [LibFFI, Zlib, Xz, Bzip2, Readline, Openssl, Sqlite, Bdb, Gdbm, Uuid, TkInter]
99
+ return [LibFFI, Zlib, Zstd, Xz, Bzip2, Readline, Openssl, Sqlite, Bdb, Gdbm, Uuid, TkInter, Mpdec]
100
100
 
101
101
  @property
102
102
  def url(self):
@@ -172,10 +172,37 @@ class Cpython(PythonBuilder):
172
172
  yield f"-ltcl{version.mm}"
173
173
  yield f"-ltk{version.mm}"
174
174
 
175
+ if self.setup.python_spec.freethreading:
176
+ yield "--disable-gil"
177
+
178
+ def xenv_LIBZSTD_CFLAGS(self):
179
+ if self.version >= "3.14" and PPG.target.is_macos:
180
+ # Normally ./configure will autodetect using pkg-config, but
181
+ # this doesn't typically work on Mac (the pkg-config binary is
182
+ # in homebrew, which we omit from path) so we have to provide
183
+ # some hints about how to staticly include it.
184
+ yield f"-I{self.deps}/include"
185
+
186
+ def xenv_LIBZSTD_LIBS(self):
187
+ if self.version >= "3.14" and PPG.target.is_macos:
188
+ yield f"{self.deps_lib_dir}/libzstd.a"
189
+
190
+ def xenv_LIBMPDEC_CFLAGS(self):
191
+ if self.version >= "3.14" and PPG.target.is_macos:
192
+ # Normally ./configure will autodetect using pkg-config, but
193
+ # this doesn't typically work on Mac (the pkg-config binary is
194
+ # in homebrew, which we omit from path) so we have to provide
195
+ # some hints about how to staticly include it.
196
+ yield f"-I{self.deps}/include"
197
+
198
+ def xenv_LIBMPDEC_LIBS(self):
199
+ if self.version >= "3.14" and PPG.target.is_macos:
200
+ yield f"{self.deps_lib_dir}/libmpdec.a"
201
+
175
202
  @runez.cached_property
176
203
  def prefix_lib_folder(self):
177
204
  """Path to <prefix>/lib/pythonM.m folder"""
178
- return self.install_folder / f"lib/python{self.version.mm}"
205
+ return self.install_folder / f"lib/python{self.version.mm}{self.setup.python_spec.abi_suffix}"
179
206
 
180
207
  @runez.cached_property
181
208
  def prefix_config_folder(self):
@@ -10,6 +10,7 @@ class GettextTiny(ModuleBuilder):
10
10
 
11
11
  @property
12
12
  def version(self):
13
+ # Check https://github.com/sabotage-linux/gettext-tiny/releases
13
14
  return self.cfg_version("0.3.2")
14
15
 
15
16
  def _do_linux_compile(self):
@@ -10,6 +10,7 @@ INSIGHTS = {
10
10
  "_tkinter": "TCL_VERSION TK_VERSION",
11
11
  "_sqlite3": "sqlite_version version",
12
12
  "_ssl": "OPENSSL_VERSION",
13
+ "_zstd": "zstd_version",
13
14
  "dbm.gnu": "_GDBM_VERSION",
14
15
  "ensurepip": "_PIP_VERSION",
15
16
  "pyexpat": "version_info",
@@ -1,3 +1,4 @@
1
+ import os.path
1
2
  from typing import ClassVar
2
3
 
3
4
  import runez
@@ -25,6 +26,8 @@ class Bdb(ModuleBuilder):
25
26
 
26
27
  @property
27
28
  def version(self):
29
+ # Oracle stopped releasing new versions in May 2020 (18.1.40 was last under AGPL)
30
+ # Check https://www.oracle.com/database/technologies/related/berkeleydb-downloads.html
28
31
  return self.cfg_version("6.2.32")
29
32
 
30
33
  def c_configure_args(self):
@@ -60,6 +63,8 @@ class Bzip2(ModuleBuilder):
60
63
 
61
64
  @property
62
65
  def version(self):
66
+ # Last release was 1.0.8 in 2019, project has very infrequent updates
67
+ # Check https://sourceware.org/bzip2/downloads.html
63
68
  return self.cfg_version("1.0.8")
64
69
 
65
70
  def _do_linux_compile(self):
@@ -84,6 +89,7 @@ class Gdbm(ModuleBuilder):
84
89
 
85
90
  @property
86
91
  def version(self):
92
+ # Check https://www.gnu.org.ua/software/gdbm/
87
93
  return self.cfg_version("1.26")
88
94
 
89
95
  def c_configure_args(self):
@@ -130,6 +136,7 @@ class LibFFI(ModuleBuilder):
130
136
 
131
137
  @property
132
138
  def version(self):
139
+ # Check https://github.com/libffi/libffi/releases
133
140
  return self.cfg_version("3.5.2")
134
141
 
135
142
  def c_configure_args(self):
@@ -175,9 +182,10 @@ class Openssl(ModuleBuilder):
175
182
 
176
183
  @property
177
184
  def version(self):
178
- # See https://endoflife.date/openssl
179
- # This default here picks the most conservative longest supported version
180
- return self.cfg_version("3.0.17")
185
+ # 3.5 is LTS, supported until Apr 2030 (3.0 EOL Sept 2026)
186
+ # Stay on the 3.5 LTS line for now: 3.6 / 4.0 not yet verified for cpython builds
187
+ # Check https://github.com/openssl/openssl/releases and https://endoflife.date/openssl
188
+ return self.cfg_version("3.5.7")
181
189
 
182
190
  def c_configure_args(self):
183
191
  if config_args := self.cfg_configure(self.deps_lib_dir, self.deps_lib64_dir):
@@ -206,7 +214,8 @@ class Ncurses(ModuleBuilder):
206
214
 
207
215
  @property
208
216
  def version(self):
209
- return self.cfg_version("6.5")
217
+ # Check https://invisible-island.net/ncurses/announce.html
218
+ return self.cfg_version("6.6")
210
219
 
211
220
  def c_configure_args(self):
212
221
  if config_args := self.cfg_configure(self.deps_lib_dir, self.deps_lib64_dir):
@@ -263,7 +272,9 @@ class Readline(ModuleBuilder):
263
272
 
264
273
  @property
265
274
  def version(self):
266
- return self.cfg_version("8.2.13")
275
+ # Patched tarballs (e.g. "8.2.13") are available on the GNU FTP when patches accumulate
276
+ # Check https://ftpmirror.gnu.org/gnu/readline/ for available tarballs
277
+ return self.cfg_version("8.3")
267
278
 
268
279
  def c_configure_args(self):
269
280
  if config_args := self.cfg_configure(self.deps_lib_dir, self.deps_lib64_dir):
@@ -307,7 +318,8 @@ class Sqlite(ModuleBuilder):
307
318
 
308
319
  @property
309
320
  def version(self):
310
- return self.cfg_version("3.50.4")
321
+ # Keep current; check https://sqlite.org/changes.html (avoid withdrawn releases like 3.52.0)
322
+ return self.cfg_version("3.53.2")
311
323
 
312
324
  def c_configure_args(self):
313
325
  if config_args := self.cfg_configure(self.deps_lib_dir, self.deps_lib64_dir):
@@ -342,6 +354,8 @@ class Uuid(ModuleBuilder):
342
354
 
343
355
  @property
344
356
  def version(self):
357
+ # Standalone libuuid (not util-linux), project is mostly dormant
358
+ # Check https://sourceforge.net/projects/libuuid/files/
345
359
  return self.cfg_version("1.0.3")
346
360
 
347
361
  def c_configure_args(self):
@@ -372,7 +386,8 @@ class Xz(ModuleBuilder):
372
386
 
373
387
  @property
374
388
  def version(self):
375
- return self.cfg_version("5.8.1")
389
+ # Check https://github.com/tukaani-project/xz/releases
390
+ return self.cfg_version("5.8.3")
376
391
 
377
392
  def c_configure_args(self):
378
393
  if config_args := self.cfg_configure(self.deps_lib_dir, self.deps_lib64_dir):
@@ -415,7 +430,8 @@ class Zlib(ModuleBuilder):
415
430
 
416
431
  @property
417
432
  def version(self):
418
- return self.cfg_version("1.3.1")
433
+ # Check https://zlib.net/ and https://github.com/madler/zlib/releases
434
+ return self.cfg_version("1.3.2")
419
435
 
420
436
  def c_configure_args(self):
421
437
  if config_args := self.cfg_configure(self.deps_lib_dir, self.deps_lib64_dir):
@@ -428,3 +444,80 @@ class Zlib(ModuleBuilder):
428
444
  self.run_configure("./configure", self.c_configure_args())
429
445
  self.run_make()
430
446
  self.run_make("install")
447
+
448
+
449
+ class Zstd(ModuleBuilder):
450
+ """
451
+ Newer compression format present in most 3.14+ builds
452
+ """
453
+
454
+ m_debian = "!libzstd-dev"
455
+ m_telltale = "{include}/zstd.h"
456
+
457
+ xenv_CFLAGS = "-fPIC"
458
+
459
+ def auto_select_reason(self):
460
+ if self.setup.python_spec.version >= "3.14":
461
+ if PPG.target.is_macos:
462
+ return "Required for 3.14 and up" # Well, "expected" anyway
463
+ if not self.resolved_telltale:
464
+ return "Required for 3.14 and up"
465
+
466
+ @property
467
+ def url(self):
468
+ return (
469
+ self.cfg_url(self.version) or f"https://github.com/facebook/zstd/releases/download/v{self.version}/zstd-{self.version}.tar.gz"
470
+ )
471
+
472
+ @property
473
+ def version(self):
474
+ # Check https://github.com/facebook/zstd/releases
475
+ return self.cfg_version("1.5.7")
476
+
477
+ def _do_linux_compile(self):
478
+ # Notably, this does not build when given a relative path.
479
+ self.run_make(f"prefix={os.path.abspath(self.deps)}")
480
+ # the libdir on the resulting .dylib on Mac is wrong, but as long as we
481
+ # staticly compile this doesn't need a fixup. I got as far as:
482
+ # "libdir=\\$(executable_path)/../lib")
483
+ self.run_make("install", f"prefix={os.path.abspath(self.deps)}")
484
+
485
+
486
+ class Mpdec(ModuleBuilder):
487
+ """
488
+ Prevent falling back to bundled libmpdec (deprecated and scheduled for removal in Python 3.16)
489
+ """
490
+
491
+ m_debian = "!libmpdec-dev"
492
+ m_telltale = "{include}/mpdecimal.h"
493
+
494
+ xenv_CFLAGS = "-fPIC"
495
+
496
+ def auto_select_reason(self):
497
+ if self.setup.python_spec.version >= "3.16":
498
+ if PPG.target.is_macos:
499
+ return "Required for 3.16 and up"
500
+ if not self.resolved_telltale:
501
+ return "Required for 3.16 and up"
502
+
503
+ @property
504
+ def url(self):
505
+ return self.cfg_url(self.version) or f"https://www.bytereef.org/software/mpdecimal/releases/mpdecimal-{self.version}.tar.gz"
506
+
507
+ @property
508
+ def version(self):
509
+ # Check https://www.bytereef.org/mpdecimal/download.html
510
+ return self.cfg_version("4.0.1")
511
+
512
+ def c_configure_args(self):
513
+ if config_args := self.cfg_configure(self.deps_lib_dir, self.deps_lib64_dir):
514
+ yield config_args
515
+
516
+ else:
517
+ pass # yield "--static"
518
+ yield "--disable-cxx"
519
+
520
+ def _do_linux_compile(self):
521
+ self.run_configure("./configure", self.c_configure_args())
522
+ self.run_make()
523
+ self.run_make("install")
@@ -77,6 +77,8 @@ class Tix(ModuleBuilder):
77
77
 
78
78
  @property
79
79
  def version(self):
80
+ # Effectively dead project, no updates expected
81
+ # Check https://github.com/python/cpython-source-deps (tix-* tags)
80
82
  return self.cfg_version("8.4.3.6")
81
83
 
82
84
  # noinspection PyPep8Naming
@@ -116,4 +118,7 @@ class TkInter(ModuleBuilder):
116
118
 
117
119
  @property
118
120
  def version(self):
119
- return self.cfg_version("8.6.15")
121
+ # This is the Tcl/Tk version used by Tcl, Tk, and Tix sub-modules
122
+ # Staying on 8.6.x branch (9.0+ is a major rewrite)
123
+ # Check https://www.tcl-lang.org/software/tcltk/8.6.html
124
+ return self.cfg_version("8.6.18")
@@ -397,7 +397,7 @@ def get_lib_type(install_folder, path, basename):
397
397
 
398
398
 
399
399
  class PythonInspector:
400
- default = "_bz2,_ctypes,_curses,_decimal,_dbm,_gdbm,_lzma,_tkinter,_sqlite3,_ssl,_uuid,pip,readline,pyexpat,setuptools,zlib"
400
+ default = "_bz2,_ctypes,_curses,_decimal,_dbm,_gdbm,_lzma,_tkinter,_sqlite3,_ssl,_uuid,_zstd,pip,readline,pyexpat,setuptools,zlib"
401
401
  additional = "_asyncio,_functools,_tracemalloc,dbm.gnu,ensurepip,ossaudiodev,spwd,sys,tkinter,venv,wheel"
402
402
 
403
403
  def __init__(self, spec, modules=None):
@@ -117,13 +117,13 @@ class CPythonFamily(VersionFamily):
117
117
 
118
118
 
119
119
  class Folders:
120
- def __init__(self, config: Config, base=None, family=None, version=None):
120
+ def __init__(self, config: Config, base=None, family=None, version=None, abi_suffix=None):
121
121
  self.config = config
122
122
  self.base_folder = runez.resolved_path(base)
123
123
  self.family = family
124
124
  self.version = Version.from_object(version)
125
125
  self.mm = self.version and self.version.mm
126
- self.completions = config.completions(family=family, version=version, mm=self.mm)
126
+ self.completions = config.completions(family=family, version=version, mm=self.mm, abi_suffix=abi_suffix or "")
127
127
  self.build_folder = self._get_path("build")
128
128
  self.completions["build"] = self.build_folder
129
129
  self.components = self.build_folder / "components"
@@ -197,9 +197,9 @@ class PPG:
197
197
  cls.target = cls.config.target
198
198
 
199
199
  @classmethod
200
- def get_folders(cls, base=None, family="cpython", version=None):
200
+ def get_folders(cls, base=None, family="cpython", version=None, abi_suffix=None):
201
201
  config = cls.config or Config()
202
- return Folders(config, base=base, family=family, version=version)
202
+ return Folders(config, base=base, family=family, version=version, abi_suffix=abi_suffix)
203
203
 
204
204
  @classmethod
205
205
  def family(cls, family_name, fatal=True) -> VersionFamily:
@@ -1,13 +1,9 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: portable-python
3
- Version: 1.10.2
3
+ Version: 2.0.1
4
4
  Summary: Portable python binaries
5
- Home-page: https://github.com/codrsquad/portable-python
6
- Author: Zoran Simic
7
- Author-email: zoran@simicweb.com
8
- License: MIT
9
- Project-URL: Documentation, https://github.com/codrsquad/portable-python/wiki
10
- Project-URL: Release notes, https://github.com/codrsquad/portable-python/wiki/Release-notes
5
+ Author-email: Zoran Simic <zoran@simicweb.com>
6
+ License-Expression: MIT
11
7
  Project-URL: Source, https://github.com/codrsquad/portable-python
12
8
  Keywords: python,portable,binary
13
9
  Classifier: Development Status :: 5 - Production/Stable
@@ -18,37 +14,25 @@ Classifier: Operating System :: POSIX
18
14
  Classifier: Operating System :: Unix
19
15
  Classifier: Programming Language :: Python
20
16
  Classifier: Programming Language :: Python :: 3
21
- Classifier: Programming Language :: Python :: 3.9
22
17
  Classifier: Programming Language :: Python :: 3.10
23
18
  Classifier: Programming Language :: Python :: 3.11
24
19
  Classifier: Programming Language :: Python :: 3.12
25
20
  Classifier: Programming Language :: Python :: 3.13
21
+ Classifier: Programming Language :: Python :: 3.14
26
22
  Classifier: Programming Language :: Python :: Implementation :: CPython
27
23
  Classifier: Topic :: Software Development :: Build Tools
28
24
  Classifier: Topic :: System :: Installation/Setup
29
25
  Classifier: Topic :: System :: Software Distribution
30
26
  Classifier: Topic :: Utilities
31
- Requires-Python: >=3.9
27
+ Requires-Python: >=3.10
32
28
  Description-Content-Type: text/x-rst
33
29
  License-File: LICENSE
34
- Requires-Dist: click~=8.0
35
- Requires-Dist: pyyaml~=6.0
36
- Requires-Dist: requests<3.0
37
- Requires-Dist: runez~=5.0
38
- Requires-Dist: urllib3~=1.26
39
- Dynamic: author
40
- Dynamic: author-email
41
- Dynamic: classifier
42
- Dynamic: description
43
- Dynamic: description-content-type
44
- Dynamic: home-page
45
- Dynamic: keywords
46
- Dynamic: license
30
+ Requires-Dist: click<9
31
+ Requires-Dist: pyyaml<7
32
+ Requires-Dist: requests<3
33
+ Requires-Dist: runez<6
34
+ Requires-Dist: urllib3<3
47
35
  Dynamic: license-file
48
- Dynamic: project-url
49
- Dynamic: requires-dist
50
- Dynamic: requires-python
51
- Dynamic: summary
52
36
 
53
37
  Portable python binaries
54
38
  ========================
@@ -61,8 +45,8 @@ Portable python binaries
61
45
  :target: https://github.com/codrsquad/portable-python/actions
62
46
  :alt: Tested with Github Actions
63
47
 
64
- .. image:: https://codecov.io/gh/codrsquad/portable-python/branch/main/graph/badge.svg
65
- :target: https://codecov.io/gh/codrsquad/portable-python
48
+ .. image:: https://coveralls.io/repos/github/codrsquad/portable-python/badge.svg?branch=main
49
+ :target: https://coveralls.io/github/codrsquad/portable-python?branch=main
66
50
  :alt: Test coverage
67
51
 
68
52
  .. image:: https://img.shields.io/pypi/pyversions/portable-python.svg
@@ -180,6 +164,64 @@ Note that you can use ``--dryrun`` mode to inspect what would be done without do
180
164
  Would tar build/3.9.7 -> dist/cpython-3.9.7-macos-x86_64.tar.gz
181
165
 
182
166
 
167
+ CLI reference
168
+ -------------
169
+
170
+ Main entry point::
171
+
172
+ portable-python [OPTIONS] COMMAND [ARGS]
173
+
174
+ **Global options**:
175
+
176
+ - ``--config PATH``: Config file (default: ``portable-python.yml``)
177
+ - ``--quiet``: Turn off DEBUG logging
178
+ - ``--dryrun`` / ``-n``: Show what would be done
179
+ - ``--target PLATFORM``: Override detected platform (for testing)
180
+
181
+
182
+ **build** ``<PYTHON_SPEC>`` - Build a portable Python binary::
183
+
184
+ portable-python build 3.13.2 -m openssl,zlib
185
+
186
+ - ``--modules, -m CSV``: External modules to include
187
+ - ``--prefix, -p PATH``: Use ``--prefix`` (non-portable)
188
+
189
+
190
+ **build-report** ``[PYTHON_SPEC]`` - Show module status and what will be compiled:
191
+
192
+ - ``--modules, -m CSV``: Specific modules to check
193
+ - Validates that modules can be built
194
+
195
+
196
+ **inspect** ``<PATH>`` - Check if a Python installation is portable::
197
+
198
+ portable-python inspect /usr/bin/python3
199
+
200
+ - ``--modules, -m MODULES``: Which modules to inspect
201
+ - ``--verbose, -v``: Show full ``.so`` report
202
+ - ``--prefix, -p``: Built with ``--prefix`` (not portable)
203
+ - ``--skip-so, -s``: Don't check all ``.so`` files
204
+
205
+
206
+ **list** ``[FAMILY]`` - List available versions (default: cpython)::
207
+
208
+ portable-python list cpython
209
+
210
+ - ``--json``: Output as JSON
211
+
212
+
213
+ **diagnostics** - Show system diagnostics
214
+
215
+
216
+ **recompress** ``<PATH> <EXT>`` - Re-compress existing binary tarball (for comparing compression sizes)
217
+
218
+
219
+ **lib-auto-correct** ``<PATH>`` - Auto-correct exes/libs to use relative paths:
220
+
221
+ - ``--commit``: Actually perform changes (dryrun by default)
222
+ - ``--prefix, -p PATH``: Expected ``--prefix`` from build
223
+
224
+
183
225
  Library
184
226
  -------
185
227
 
@@ -0,0 +1,20 @@
1
+ portable_python/__init__.py,sha256=bVZVIcF1oq_-Lb5pZm665bd12oDmyIbFfM48NyZvL8U,31601
2
+ portable_python/__main__.py,sha256=fjtkudRFxLSLTSqzkWYnQLMGRG0BRUc6GeqY201taCE,149
3
+ portable_python/cli.py,sha256=hml834t9RMjQ1s5-DwiEJhdjI8IfsObTLzU8jMbhze0,7610
4
+ portable_python/config.py,sha256=D-Fr1VV-KKFMHzhrqselEMujHoErSYZ_zWmK_TKsua4,13726
5
+ portable_python/cpython.py,sha256=V0_B2nWv0H8enXGdU38yRgZyO7d-JkC0DWlTMsI9K9M,18214
6
+ portable_python/inspector.py,sha256=LvGhat2rqwgse0r90dZxEExRYWSW4TrxsMXxYScrF3k,21355
7
+ portable_python/tracking.py,sha256=308K--adSivstOqnD9oczlY77FZV_cgNy7xL8BS9ROg,1978
8
+ portable_python/versions.py,sha256=BTxYrH6xGFQIXZ8Xv8rHMpVT76TKmE_J7AXOepCE5Tc,7171
9
+ portable_python/external/__init__.py,sha256=jQCp0sEgj7ZjuWYc2zJ3Bm_W5qdT0OPNAe4JIPaQLY8,801
10
+ portable_python/external/_inspect.py,sha256=ASminI7HBuHAuFcvX3mkBYf7lCDILqiPrKkhKkQ8w94,3744
11
+ portable_python/external/xcpython.py,sha256=AnelZlU5_Z08dp0Itej3AZ9KLcIE07Fidlrp3WWs87k,16744
12
+ portable_python/external/xtkinter.py,sha256=rvIHeaUmp2O7fJeYxu4FH2tzFA8Ajw55Nhqg2yFOt8I,3832
13
+ portable_python-2.0.1.dist-info/licenses/LICENSE,sha256=BB27gUWIcmc-bauY_M6COCMtiy4hN2mou1RdadlbXbs,1068
14
+ portable_python-2.0.1.dist-info/METADATA,sha256=KXL6TT3WrqOGEcmfrOcaGOOQXENK8PXve4UBPIaUOJ4,9850
15
+ portable_python-2.0.1.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
16
+ portable_python-2.0.1.dist-info/entry_points.txt,sha256=Zo8HR39evgAgm4e2UhenD7kkpJvEXp_VB4aIrL_3_VY,66
17
+ portable_python-2.0.1.dist-info/scm_file_list.json,sha256=JEWL2bgKhM5MfDey6Ck0z28f5QpCpC_rsqh4pXnOQHo,2862
18
+ portable_python-2.0.1.dist-info/scm_version.json,sha256=NLVXUR8TKaY95dqXtJYGWJutY6pngwPq1sEo-b8In2Y,160
19
+ portable_python-2.0.1.dist-info/top_level.txt,sha256=S203pfaAC8FDZvrHsCWWua_9ZfSDEDCD1w90zzYFhOU,16
20
+ portable_python-2.0.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.9.0)
2
+ Generator: setuptools (82.0.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -0,0 +1,93 @@
1
+ {
2
+ "files": [
3
+ "tox.ini",
4
+ "Dockerfile",
5
+ "LICENSE",
6
+ "pyproject.toml",
7
+ "lock-deps.sh",
8
+ "requirements.txt",
9
+ "portable-python.yml",
10
+ "SECURITY.md",
11
+ "README.rst",
12
+ ".dockerignore",
13
+ "CLAUDE.md",
14
+ "MANIFEST.in",
15
+ ".gitignore",
16
+ "scripts/portable-python.sh",
17
+ "scripts/bashrc.sh",
18
+ "scripts/check_okf.py",
19
+ "docs/overview.md",
20
+ "docs/log.md",
21
+ "docs/changelog.md",
22
+ "docs/release.md",
23
+ "docs/index.md",
24
+ "docs/configuration/portable-python-yml.md",
25
+ "docs/configuration/index.md",
26
+ "docs/architecture/cpython.md",
27
+ "docs/architecture/config.md",
28
+ "docs/architecture/python-builder.md",
29
+ "docs/architecture/ppg.md",
30
+ "docs/architecture/build-setup.md",
31
+ "docs/architecture/python-inspector.md",
32
+ "docs/architecture/module-builder.md",
33
+ "docs/architecture/index.md",
34
+ "docs/modules/external-modules.md",
35
+ "docs/modules/index.md",
36
+ "docs/guides/bump-python-support.md",
37
+ "docs/guides/local-development.md",
38
+ "docs/guides/ci-cd.md",
39
+ "docs/guides/fix-a-portability-issue.md",
40
+ "docs/guides/add-an-external-module.md",
41
+ "docs/guides/bump-components.md",
42
+ "docs/guides/index.md",
43
+ "docs/guides/add-a-config-option.md",
44
+ "docs/guides/build-a-portable-python.md",
45
+ "docs/concepts/ppp-marker.md",
46
+ "docs/concepts/folder-masking.md",
47
+ "docs/concepts/build-layout.md",
48
+ "docs/concepts/portability.md",
49
+ "docs/concepts/telltale-detection.md",
50
+ "docs/concepts/index.md",
51
+ "docs/concepts/static-linking.md",
52
+ "docs/cli/lib-auto-correct.md",
53
+ "docs/cli/diagnostics.md",
54
+ "docs/cli/inspect.md",
55
+ "docs/cli/list.md",
56
+ "docs/cli/recompress.md",
57
+ "docs/cli/build.md",
58
+ "docs/cli/index.md",
59
+ "docs/cli/build-report.md",
60
+ "src/portable_python/__init__.py",
61
+ "src/portable_python/versions.py",
62
+ "src/portable_python/config.py",
63
+ "src/portable_python/cpython.py",
64
+ "src/portable_python/inspector.py",
65
+ "src/portable_python/tracking.py",
66
+ "src/portable_python/cli.py",
67
+ "src/portable_python/__main__.py",
68
+ "src/portable_python/external/__init__.py",
69
+ "src/portable_python/external/xtkinter.py",
70
+ "src/portable_python/external/xcpython.py",
71
+ "src/portable_python/external/_inspect.py",
72
+ "retired/README.md",
73
+ "retired/toolchain.py",
74
+ ".claude/settings.json",
75
+ "tests/test_failed.py",
76
+ "tests/__init__.py",
77
+ "tests/sample-config2.yml",
78
+ "tests/test_prefix.py",
79
+ "tests/test_cleanup.py",
80
+ "tests/test_build.py",
81
+ "tests/test_recompress.py",
82
+ "tests/test_setup.py",
83
+ "tests/sample-config1.yml",
84
+ "tests/test_invoker.py",
85
+ "tests/test_report.py",
86
+ "tests/conftest.py",
87
+ "tests/test_list.py",
88
+ "tests/sample-incomplete.yml",
89
+ "tests/test_inspector.py",
90
+ ".github/workflows/release.yml",
91
+ ".github/workflows/tests.yml"
92
+ ]
93
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "2.0.1",
3
+ "distance": 0,
4
+ "node": "g2543c9f61b50974c844452484758fafeb52551a9",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-06-24"
8
+ }
@@ -1,18 +0,0 @@
1
- portable_python/__init__.py,sha256=ffdX5dFrePz_3Uvvn5zwz8RGvLlPxsJaBsTqHx5Nrmc,31371
2
- portable_python/__main__.py,sha256=fjtkudRFxLSLTSqzkWYnQLMGRG0BRUc6GeqY201taCE,149
3
- portable_python/cli.py,sha256=hml834t9RMjQ1s5-DwiEJhdjI8IfsObTLzU8jMbhze0,7610
4
- portable_python/config.py,sha256=9mo4uCJ77-mXZNc9tvOngPlCu6gcMMEbVDmeiKi0W2Y,13714
5
- portable_python/cpython.py,sha256=GH99cTgrC9V5WoDw6OtT9X2dEiBu9i6QclLfQq70Cd8,16940
6
- portable_python/inspector.py,sha256=4nyGuTFbY1X3wfj9TPTQe69ABzshMvY4RjUat4y_9BU,21349
7
- portable_python/tracking.py,sha256=308K--adSivstOqnD9oczlY77FZV_cgNy7xL8BS9ROg,1978
8
- portable_python/versions.py,sha256=oHFbo_eWbr1yQuVUER2VTVTo7nvVC8qqLD_DcrKfRyg,7085
9
- portable_python/external/__init__.py,sha256=3KgdTIZG1x-Sm0nPMKl4c3elCtBy6spD6qASpvdR8ZI,729
10
- portable_python/external/_inspect.py,sha256=Z1WKcYB-m-fx7nW3n1tvpEgZ02ajCyC-_MfY6Bb_7SE,3715
11
- portable_python/external/xcpython.py,sha256=_WL_Tn5v4VxQn8ODLdvryLj2cyQdMQp1BfjtZ0Xr8Ys,13076
12
- portable_python/external/xtkinter.py,sha256=KlhFUvIXWy7gX6FrZBieekrULx4kF12H2Q010GZEj20,3502
13
- portable_python-1.10.2.dist-info/licenses/LICENSE,sha256=BB27gUWIcmc-bauY_M6COCMtiy4hN2mou1RdadlbXbs,1068
14
- portable_python-1.10.2.dist-info/METADATA,sha256=qxtdoNzDiwV5787vF5j7p-YDgG7z223tQhEQ4PEI3Ik,8758
15
- portable_python-1.10.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
16
- portable_python-1.10.2.dist-info/entry_points.txt,sha256=Zo8HR39evgAgm4e2UhenD7kkpJvEXp_VB4aIrL_3_VY,66
17
- portable_python-1.10.2.dist-info/top_level.txt,sha256=S203pfaAC8FDZvrHsCWWua_9ZfSDEDCD1w90zzYFhOU,16
18
- portable_python-1.10.2.dist-info/RECORD,,