kopia lustrzana https://github.com/micropython/micropython-lib
top: Remove upip-related scripts.
Signed-off-by: Jim Mussared <jim.mussared@gmail.com>pull/376/head
rodzic
35e3c9e4ff
commit
3a6ab0b46d
16
Makefile
16
Makefile
|
@ -1,16 +0,0 @@
|
|||
PREFIX = ~/.micropython/lib
|
||||
|
||||
all:
|
||||
|
||||
# Installs all modules to a lib location, for development testing
|
||||
CMD="find . -maxdepth 1 -mindepth 1 \( -name '*.py' -not -name 'test_*' -not -name 'setup.py' \) -or \( -type d -not -name 'dist' -not -name '*.egg-info' -not -name '__pycache__' \)| xargs --no-run-if-empty cp -r -t $(PREFIX)"
|
||||
install:
|
||||
@mkdir -p $(PREFIX)
|
||||
@if [ -n "$(MOD)" ]; then \
|
||||
(cd $(MOD); sh -c $(CMD)); \
|
||||
else \
|
||||
for d in $$(find -maxdepth 1 -type d ! -name ".*"); do \
|
||||
echo $$d; \
|
||||
(cd $$d; sh -c $(CMD)); \
|
||||
done \
|
||||
fi
|
182
make_metadata.py
182
make_metadata.py
|
@ -1,182 +0,0 @@
|
|||
#!/usr/bin/env python3
|
||||
# MicroPython will pick up glob from the current dir otherwise.
|
||||
import sys
|
||||
|
||||
sys.path.pop(0)
|
||||
|
||||
import glob
|
||||
|
||||
|
||||
TEMPLATE = """\
|
||||
import sys
|
||||
# Remove current dir from sys.path, otherwise setuptools will peek up our
|
||||
# module instead of system's.
|
||||
sys.path.pop(0)
|
||||
from setuptools import setup
|
||||
sys.path.append("..")
|
||||
import sdist_upip
|
||||
|
||||
setup(name='micropython-%(dist_name)s',
|
||||
version='%(version)s',
|
||||
description=%(desc)r,
|
||||
long_description=%(long_desc)s,
|
||||
url='https://github.com/micropython/micropython-lib',
|
||||
author=%(author)r,
|
||||
author_email=%(author_email)r,
|
||||
maintainer=%(maintainer)r,
|
||||
maintainer_email='micro-python@googlegroups.com',
|
||||
license=%(license)r,
|
||||
cmdclass={'sdist': sdist_upip.sdist},
|
||||
%(_what_)s=[%(modules)s]%(_inst_req_)s)
|
||||
"""
|
||||
|
||||
DUMMY_DESC = """\
|
||||
This is a dummy implementation of a module for MicroPython standard library.
|
||||
It contains zero or very little functionality, and primarily intended to
|
||||
avoid import errors (using idea that even if an application imports a
|
||||
module, it may be not using it onevery code path, so may work at least
|
||||
partially). It is expected that more complete implementation of the module
|
||||
will be provided later. Please help with the development if you are
|
||||
interested in this module."""
|
||||
|
||||
CPYTHON_DESC = """\
|
||||
This is a module ported from CPython standard library to be compatible with
|
||||
MicroPython interpreter. Usually, this means applying small patches for
|
||||
features not supported (yet, or at all) in MicroPython. Sometimes, heavier
|
||||
changes are required. Note that CPython modules are written with availability
|
||||
of vast resources in mind, and may not work for MicroPython ports with
|
||||
limited heap. If you are affected by such a case, please help reimplement
|
||||
the module from scratch."""
|
||||
|
||||
PYPY_DESC = """\
|
||||
This is a module ported from PyPy standard library to be compatible with
|
||||
MicroPython interpreter. Usually, this means applying small patches for
|
||||
features not supported (yet, or at all) in MicroPython. Sometimes, heavier
|
||||
changes are required. Note that CPython modules are written with availability
|
||||
of vast resources in mind, and may not work for MicroPython ports with
|
||||
limited heap. If you are affected by such a case, please help reimplement
|
||||
the module from scratch."""
|
||||
|
||||
MICROPYTHON_LIB_DESC = """\
|
||||
This is a module reimplemented specifically for MicroPython standard library,
|
||||
with efficient and lean design in mind. Note that this module is likely work
|
||||
in progress and likely supports just a subset of CPython's corresponding
|
||||
module. Please help with the development if you are interested in this
|
||||
module."""
|
||||
|
||||
BACKPORT_DESC = """\
|
||||
This is MicroPython compatibility module, allowing applications using
|
||||
MicroPython-specific features to run on CPython.
|
||||
"""
|
||||
|
||||
MICROPYTHON_DEVELS = "micropython-lib Developers"
|
||||
MICROPYTHON_DEVELS_EMAIL = "micro-python@googlegroups.com"
|
||||
CPYTHON_DEVELS = "CPython Developers"
|
||||
CPYTHON_DEVELS_EMAIL = "python-dev@python.org"
|
||||
PYPY_DEVELS = "PyPy Developers"
|
||||
PYPY_DEVELS_EMAIL = "pypy-dev@python.org"
|
||||
|
||||
|
||||
def parse_metadata(f):
|
||||
data = {}
|
||||
for l in f:
|
||||
l = l.strip()
|
||||
if l[0] == "#":
|
||||
continue
|
||||
k, v = l.split("=", 1)
|
||||
data[k.strip()] = v.strip()
|
||||
return data
|
||||
|
||||
|
||||
def write_setup(fname, substs):
|
||||
with open(fname, "w") as f:
|
||||
f.write(TEMPLATE % substs)
|
||||
|
||||
|
||||
def main():
|
||||
for fname in glob.iglob("*/metadata.txt"):
|
||||
print(fname)
|
||||
with open(fname) as f:
|
||||
data = parse_metadata(f)
|
||||
|
||||
dirname = fname.split("/")[0]
|
||||
module = dirname
|
||||
if data["type"] == "module":
|
||||
data["_what_"] = "py_modules"
|
||||
elif data["type"] == "package":
|
||||
data["_what_"] = "packages"
|
||||
else:
|
||||
raise ValueError
|
||||
|
||||
if data["srctype"] == "dummy":
|
||||
data["author"] = MICROPYTHON_DEVELS
|
||||
data["author_email"] = MICROPYTHON_DEVELS_EMAIL
|
||||
data["maintainer"] = MICROPYTHON_DEVELS
|
||||
data["license"] = "MIT"
|
||||
data["desc"] = "Dummy %s module for MicroPython" % module
|
||||
data["long_desc"] = DUMMY_DESC
|
||||
elif data["srctype"] == "cpython":
|
||||
data["author"] = CPYTHON_DEVELS
|
||||
data["author_email"] = CPYTHON_DEVELS_EMAIL
|
||||
data["maintainer"] = MICROPYTHON_DEVELS
|
||||
data["license"] = "Python"
|
||||
data["desc"] = "CPython %s module ported to MicroPython" % module
|
||||
data["long_desc"] = CPYTHON_DESC
|
||||
elif data["srctype"] == "pypy":
|
||||
data["author"] = PYPY_DEVELS
|
||||
data["author_email"] = PYPY_DEVELS_EMAIL
|
||||
data["maintainer"] = MICROPYTHON_DEVELS
|
||||
data["license"] = "MIT"
|
||||
data["desc"] = "PyPy %s module ported to MicroPython" % module
|
||||
data["long_desc"] = PYPY_DESC
|
||||
elif data["srctype"] == "micropython-lib":
|
||||
if "author" not in data:
|
||||
data["author"] = MICROPYTHON_DEVELS
|
||||
if "author_email" not in data:
|
||||
data["author_email"] = MICROPYTHON_DEVELS_EMAIL
|
||||
if "maintainer" not in data:
|
||||
data["maintainer"] = MICROPYTHON_DEVELS
|
||||
if "desc" not in data:
|
||||
data["desc"] = "%s module for MicroPython" % module
|
||||
if "long_desc" not in data:
|
||||
data["long_desc"] = MICROPYTHON_LIB_DESC
|
||||
if "license" not in data:
|
||||
data["license"] = "MIT"
|
||||
elif data["srctype"] == "cpython-backport":
|
||||
assert module.startswith("cpython-")
|
||||
module = module[len("cpython-") :]
|
||||
data["author"] = MICROPYTHON_DEVELS
|
||||
data["author_email"] = MICROPYTHON_DEVELS_EMAIL
|
||||
data["maintainer"] = MICROPYTHON_DEVELS
|
||||
data["license"] = "Python"
|
||||
data["desc"] = "MicroPython module %s ported to CPython" % module
|
||||
data["long_desc"] = BACKPORT_DESC
|
||||
else:
|
||||
raise ValueError
|
||||
|
||||
if "dist_name" not in data:
|
||||
data["dist_name"] = dirname
|
||||
if "name" not in data:
|
||||
data["name"] = module
|
||||
if data["long_desc"] in ("README", "README.rst"):
|
||||
data["long_desc"] = "open(%r).read()" % data["long_desc"]
|
||||
else:
|
||||
data["long_desc"] = repr(data["long_desc"])
|
||||
|
||||
data["modules"] = "'" + data["name"].rsplit(".", 1)[0] + "'"
|
||||
if "extra_modules" in data:
|
||||
data["modules"] += ", " + ", ".join(
|
||||
["'" + x.strip() + "'" for x in data["extra_modules"].split(",")]
|
||||
)
|
||||
|
||||
if "depends" in data:
|
||||
deps = ["micropython-" + x.strip() for x in data["depends"].split(",")]
|
||||
data["_inst_req_"] = ",\n install_requires=['" + "', '".join(deps) + "']"
|
||||
else:
|
||||
data["_inst_req_"] = ""
|
||||
|
||||
write_setup(dirname + "/setup.py", data)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
123
optimize_upip.py
123
optimize_upip.py
|
@ -1,123 +0,0 @@
|
|||
#
|
||||
# This script optimizes a Python source distribution tarball as produced by
|
||||
# "python3 setup.py sdist" command for MicroPython's native package manager,
|
||||
# upip. Optimization includes:
|
||||
# * Removing metadata files not used by upip (this includes setup.py)
|
||||
# * Recompressing gzip archive with 4K dictionary size so it can be
|
||||
# installed even on low-heap targets.
|
||||
#
|
||||
import sys
|
||||
import os
|
||||
import zlib
|
||||
from subprocess import Popen, PIPE
|
||||
import glob
|
||||
import tarfile
|
||||
import re
|
||||
import io
|
||||
|
||||
|
||||
def gzip_4k(inf, fname):
|
||||
comp = zlib.compressobj(level=9, wbits=16 + 12)
|
||||
with open(fname + ".out", "wb") as outf:
|
||||
while 1:
|
||||
data = inf.read(1024)
|
||||
if not data:
|
||||
break
|
||||
outf.write(comp.compress(data))
|
||||
outf.write(comp.flush())
|
||||
os.rename(fname, fname + ".orig")
|
||||
os.rename(fname + ".out", fname)
|
||||
|
||||
|
||||
def recompress(fname):
|
||||
with Popen(["gzip", "-d", "-c", fname], stdout=PIPE).stdout as inf:
|
||||
gzip_4k(inf, fname)
|
||||
|
||||
|
||||
def find_latest(dir):
|
||||
res = []
|
||||
for fname in glob.glob(dir + "/*.gz"):
|
||||
st = os.stat(fname)
|
||||
res.append((st.st_mtime, fname))
|
||||
res.sort()
|
||||
latest = res[-1][1]
|
||||
return latest
|
||||
|
||||
|
||||
def recompress_latest(dir):
|
||||
latest = find_latest(dir)
|
||||
print(latest)
|
||||
recompress(latest)
|
||||
|
||||
|
||||
FILTERS = [
|
||||
# include, exclude, repeat
|
||||
(r".+\.egg-info/(PKG-INFO|requires\.txt)", r"setup.py$"),
|
||||
(r".+\.py$", r"[^/]+$"),
|
||||
(None, r".+\.egg-info/.+"),
|
||||
]
|
||||
|
||||
|
||||
outbuf = io.BytesIO()
|
||||
|
||||
|
||||
def filter_tar(name):
|
||||
fin = tarfile.open(name, "r:gz")
|
||||
fout = tarfile.open(fileobj=outbuf, mode="w")
|
||||
for info in fin:
|
||||
# print(info)
|
||||
if not "/" in info.name:
|
||||
continue
|
||||
fname = info.name.split("/", 1)[1]
|
||||
include = None
|
||||
|
||||
for inc_re, exc_re in FILTERS:
|
||||
if include is None and inc_re:
|
||||
if re.match(inc_re, fname):
|
||||
include = True
|
||||
|
||||
if include is None and exc_re:
|
||||
if re.match(exc_re, fname):
|
||||
include = False
|
||||
|
||||
if include is None:
|
||||
include = True
|
||||
|
||||
if include:
|
||||
print("Including:", fname)
|
||||
else:
|
||||
print("Excluding:", fname)
|
||||
continue
|
||||
|
||||
farch = fin.extractfile(info)
|
||||
fout.addfile(info, farch)
|
||||
fout.close()
|
||||
fin.close()
|
||||
|
||||
|
||||
from setuptools import Command
|
||||
|
||||
|
||||
class OptimizeUpip(Command):
|
||||
|
||||
user_options = []
|
||||
|
||||
def run(self):
|
||||
latest = find_latest("dist")
|
||||
filter_tar(latest)
|
||||
outbuf.seek(0)
|
||||
gzip_4k(outbuf, latest)
|
||||
|
||||
def initialize_options(self):
|
||||
pass
|
||||
|
||||
def finalize_options(self):
|
||||
pass
|
||||
|
||||
|
||||
# For testing only
|
||||
if __name__ == "__main__":
|
||||
# recompress_latest(sys.argv[1])
|
||||
filter_tar(sys.argv[1])
|
||||
outbuf.seek(0)
|
||||
gzip_4k(outbuf, sys.argv[1])
|
141
sdist_upip.py
141
sdist_upip.py
|
@ -1,141 +0,0 @@
|
|||
#
|
||||
# This module overrides distutils (also compatible with setuptools) "sdist"
|
||||
# command to perform pre- and post-processing as required for MicroPython's
|
||||
# upip package manager.
|
||||
#
|
||||
# Preprocessing steps:
|
||||
# * Creation of Python resource module (R.py) from each top-level package's
|
||||
# resources.
|
||||
# Postprocessing steps:
|
||||
# * Removing metadata files not used by upip (this includes setup.py)
|
||||
# * Recompressing gzip archive with 4K dictionary size so it can be
|
||||
# installed even on low-heap targets.
|
||||
#
|
||||
import sys
|
||||
import os
|
||||
import zlib
|
||||
from subprocess import Popen, PIPE
|
||||
import glob
|
||||
import tarfile
|
||||
import re
|
||||
import io
|
||||
|
||||
from distutils.filelist import FileList
|
||||
from setuptools.command.sdist import sdist as _sdist
|
||||
|
||||
|
||||
def gzip_4k(inf, fname):
|
||||
comp = zlib.compressobj(level=9, wbits=16 + 12)
|
||||
with open(fname + ".out", "wb") as outf:
|
||||
while 1:
|
||||
data = inf.read(1024)
|
||||
if not data:
|
||||
break
|
||||
outf.write(comp.compress(data))
|
||||
outf.write(comp.flush())
|
||||
os.rename(fname, fname + ".orig")
|
||||
os.rename(fname + ".out", fname)
|
||||
|
||||
|
||||
FILTERS = [
|
||||
# include, exclude, repeat
|
||||
(r".+\.egg-info/(PKG-INFO|requires\.txt)", r"setup.py$"),
|
||||
(r".+\.py$", r"[^/]+$"),
|
||||
(None, r".+\.egg-info/.+"),
|
||||
]
|
||||
|
||||
|
||||
outbuf = io.BytesIO()
|
||||
|
||||
|
||||
def filter_tar(name):
|
||||
fin = tarfile.open(name, "r:gz")
|
||||
fout = tarfile.open(fileobj=outbuf, mode="w")
|
||||
for info in fin:
|
||||
# print(info)
|
||||
if not "/" in info.name:
|
||||
continue
|
||||
fname = info.name.split("/", 1)[1]
|
||||
include = None
|
||||
|
||||
for inc_re, exc_re in FILTERS:
|
||||
if include is None and inc_re:
|
||||
if re.match(inc_re, fname):
|
||||
include = True
|
||||
|
||||
if include is None and exc_re:
|
||||
if re.match(exc_re, fname):
|
||||
include = False
|
||||
|
||||
if include is None:
|
||||
include = True
|
||||
|
||||
if include:
|
||||
print("including:", fname)
|
||||
else:
|
||||
print("excluding:", fname)
|
||||
continue
|
||||
|
||||
farch = fin.extractfile(info)
|
||||
fout.addfile(info, farch)
|
||||
fout.close()
|
||||
fin.close()
|
||||
|
||||
|
||||
def make_resource_module(manifest_files):
|
||||
resources = []
|
||||
# Any non-python file included in manifest is resource
|
||||
for fname in manifest_files:
|
||||
ext = fname.rsplit(".", 1)[1]
|
||||
if ext != "py":
|
||||
resources.append(fname)
|
||||
|
||||
if resources:
|
||||
print("creating resource module R.py")
|
||||
resources.sort()
|
||||
last_pkg = None
|
||||
r_file = None
|
||||
for fname in resources:
|
||||
try:
|
||||
pkg, res_name = fname.split("/", 1)
|
||||
except ValueError:
|
||||
print("not treating %s as a resource" % fname)
|
||||
continue
|
||||
if last_pkg != pkg:
|
||||
last_pkg = pkg
|
||||
if r_file:
|
||||
r_file.write("}\n")
|
||||
r_file.close()
|
||||
r_file = open(pkg + "/R.py", "w")
|
||||
r_file.write("R = {\n")
|
||||
|
||||
with open(fname, "rb") as f:
|
||||
r_file.write("%r: %r,\n" % (res_name, f.read()))
|
||||
|
||||
if r_file:
|
||||
r_file.write("}\n")
|
||||
r_file.close()
|
||||
|
||||
|
||||
class sdist(_sdist):
|
||||
def run(self):
|
||||
self.filelist = FileList()
|
||||
self.get_file_list()
|
||||
make_resource_module(self.filelist.files)
|
||||
|
||||
r = super().run()
|
||||
|
||||
assert len(self.archive_files) == 1
|
||||
print("filtering files and recompressing with 4K dictionary")
|
||||
filter_tar(self.archive_files[0])
|
||||
outbuf.seek(0)
|
||||
gzip_4k(outbuf, self.archive_files[0])
|
||||
|
||||
return r
|
||||
|
||||
|
||||
# For testing only
|
||||
if __name__ == "__main__":
|
||||
filter_tar(sys.argv[1])
|
||||
outbuf.seek(0)
|
||||
gzip_4k(outbuf, sys.argv[1])
|
Ładowanie…
Reference in New Issue