Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemathinc
GitHub Repository: sagemathinc/wapython
Path: blob/main/python/cpython/src/__pycache__/cowasm_importer.cpython-311.pyc
1067 views
�

��c9��4�dZddlZddlZddlZddlZddlZddlZddlZddlmZiZ	dej
�dd��vZdZ
erd�Znd	�Zdad
�Zd�ZGd�d
ejj��ZGd�dejj��Zdedefd�Zdefd�Zd�ZdS)a]
This tiny simple custom importer makes it so we can if you have a
tarball foo.tar.xz somewhere in your sys.path that contains a Python
module, then this works:

    import foo

This even works with .so extension module code. It's reasonably
efficient too, in some ways.  How is this possible?  This works in a
very different way than Python's own zipfile importer and to me it
is both much simpler and much better.  At
   https://docs.python.org/3/library/zipfile.html#pyzipfile-objects
there are docs about turning a Python module (without extension code)
into a zip file which can then be exported.   It works for that
application, but has drawbacks because zip files are much larger than
.tar.xz files; also, it seems like importing is a bit slower.  What
we do here instead is much simpler -- we just automaticlaly extract
the .tar.xz file to a temporary folder, which we add to sys.path.
That's it!  It's ridiculously simple, but works well for our application
to WebAssembly where small size is very important.

NOTES:

- See https://dev.to/dangerontheranger/dependency-injection-with-import-hooks-in-python-3-5hap

- When working on this, here's how to update things after a change:

~/cowasm/packages/cpython$  rm dist/wasm/.install-data && cp src/cowasm_importer.py dist/wasm/lib/python3.11/site-packages/ && make && cd ../python-wasm/ && make && cd ../cpython/

�N)�timezcowasm:importer�DEBUG�z.tar.xzc��t|�dS�N)�print��argss ��/Users/wstein/build/cocalc/src/data/projects/2c9318d1-4f8b-4910-8da7-68a965514c95/cowasm-python/packages/cpython/src/cowasm_importer.py�logr1s��
�t�����c��dSr�r	s rrr5����r
c���tjD]}|�d��r|cS�tjD]8}|�d��r!tj�|��cS�9dS)Nz/site-packagesz/lib-dynload)�sys�path�endswith�os�dirname)rs r�site_packages_directoryr<s���������=�=�)�*�*�	��K�K�K�	���)�)���=�=��(�(�	)��7�?�?�4�(�(�(�(�(�	)�)�)r
c��t�=tj��atj�dtj��tjS)Nr)�temporary_directory�tempfile�TemporaryDirectoryrr�insert�namerr
r�get_package_directoryrHs>���5�&�9�;�;�������.�3�4�4�4��#�#r
c�"�eZdZd�Zdd�Zd�ZdS)�CoWasmPackageFinderc��||_dSr)�_loader)�self�loaders  r�__init__zCoWasmPackageFinder.__init__\s
������r
Nc��td|||��|j�|��r|�|��SdS)z�
        - fullname is the fully-qualified name of the module,
        - path is set to __path__ for sub-modules/packages, or None otherwise.
        - target can be a module object, but is unused in this example.
        z
find_spec:N)rr"�provides�	_gen_spec)r#�fullnamer�targets    r�	find_speczCoWasmPackageFinder.find_spec_sL��	�L�(�D�&�1�1�1��<� � ��*�*�	,��>�>�(�+�+�+�	,�	,r
c�L�tj�||j��Sr)�	importlib�	machinery�
ModuleSpecr"�r#r)s  rr(zCoWasmPackageFinder._gen_specis���"�-�-�h���E�E�Er
r)�__name__�
__module__�__qualname__r%r+r(rr
rr r ZsK���������,�,�,�,�F�F�F�F�Fr
r c�D�eZdZdefd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
d	�Zd
S)�CoWasmPackageLoaderr)c�$�t|��duSr)�path_to_bundler0s  rr'zCoWasmPackageLoader.providesos���h�'�'�t�3�3r
c�`�td||��t||��}|j|_|S)N�
_do_import)r�extract_archive_and_import�__spec__�_spec)r#rr�mods    rr9zCoWasmPackageLoader._do_importrs3���L�$��%�%�%�(��t�4�4��
�\��
��
r
c��td|��t|j��}|�|j|��S)N�
create_module)rr7rr9)r#�specrs   rr?z!CoWasmPackageLoader.create_module|s7���O�T�"�"�"��d�i�(�(�����t�y�$�/�/�/r
c��dSrr)r#�modules  r�exec_modulezCoWasmPackageLoader.exec_module�rr
c���td|��t|d��s%t|��}|�||��|jj�|��S)N�get_coder<)r�hasattrr7r9r<r$rE�r#r)rs   rrEzCoWasmPackageLoader.get_code�s^���J��!�!�!��t�W�%�%�	,�!�(�+�+�D��O�O�H�d�+�+�+��z� �)�)�(�3�3�3r
c��t|d��s%t|��}|�||��|jj�|��S�Nr<)rFr7r9r<r$�get_datarGs   rrJzCoWasmPackageLoader.get_data�sN���t�W�%�%�	,�!�(�+�+�D��O�O�H�d�+�+�+��z� �)�)�(�3�3�3r
c��t|d��s%t|��}|�||��|jj�|��SrI)rFr7r9r<r$�get_filenamerGs   rrLz CoWasmPackageLoader.get_filename�sN���t�W�%�%�	,�!�(�+�+�D��O�O�H�d�+�+�+��z� �-�-�h�7�7�7r
c��t|d��s%t|��}|�||��|jj�|��SrI)rFr7r9r<r$�
get_sourcerGs   rrNzCoWasmPackageLoader.get_source�sN���t�W�%�%�	,�!�(�+�+�D��O�O�H�d�+�+�+��z� �+�+�H�5�5�5r
N)r1r2r3�strr'r9r?rCrErJrLrNrr
rr5r5ms�������4��4�4�4�4����0�0�0�

�
�
�4�4�4�4�4�4�8�8�8�6�6�6�6�6r
r5r�archive_pathc���t|}t��}tr t��}t	d|d|��	|�d��r(t
j|���|��n'tj
|���|��t|=n
#t|=wxYwddl}|�|���
��tj��trt	t��|z
|��trt��}tj|��}tr t	|dt��|z
��|S)Nzextracting archivez toz.ziprz
import time: )�cowasm_modulesr�verboserrr�zipfile�ZipFile�
extractall�tarfile�open�pathlib�Path�touchr-�invalidate_caches�
import_module)rrP�package_dirname�trYr=s      rr:r:�sY��!�$�'�L�+�-�-�O��H��F�F��� �,���G�G�G�!�� � ��(�(�	C��O�L�)�)�4�4�_�E�E�E�E��L��&�&�1�1�/�B�B�B�
�4� � ��N�4� � � � � ��N�N�N��L�L��!�!�'�'�)�)�)���!�!�!��)��D�F�F�Q�J��(�(�(���D�F�F��
�
!�$�
'�
'�C��/��D�/�4�6�6�A�:�.�.�.��Js
�A$B1�1
B;�module_namec��|tvr
t|S|tz}tjD]_}tj�||��}tj�|��rtd|��|t|<|cS�`dS)Nzpath_to_bundle: found)rR�	EXTENSIONrrr�join�existsr)r`�filename�segmentrs    rr7r7�s����n�$�+��k�*�*��Y�&�H��8�����w�|�|�G�X�.�.��
�7�>�>�$���	��'��.�.�.�*.�N�;�'��K�K�K�	��4r
c��dtjvrdSdtjvrdSt��}t|��}tj�|��dS)N�PYTHONREGRTEST_UNICODE_GUARD�COWASM_DISABLE_IMPORTER)r�environr5r r�	meta_path�append)r$�finders  r�initrn�s`��%���3��	�� �B�J�.����
 �
"�
"�F�
 ��
(�
(�F��M���� � � � � r
)�__doc__r-�
importlib.abcrrrrTrWrrRrj�getrSrbrrrr�abc�MetaPathFinderr �Loaderr5rOr:r7rnrr
r�<module>rus�����>��������	�	�	�	�
�
�
�
���������������������
�r�z�~�~�g�r�:�:�
:���	�
�
�����
�
�
���	)�	)�	)�$�$�$�$F�F�F�F�F�)�-�6�F�F�F�&.6�.6�.6�.6�.6�)�-�.�.6�.6�.6�`'�S�'��'�'�'�'�T������"!�!�!�!�!r