§
    ƒØjÓ  ã                  ó
  — d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlmZ g d¢Zej        d„ ¦   «         Zdd„Zddd„Zej        ej        dœZd„ Zd„ Zd„ Zedk    rddlZ ej        ¦   «          dS dS )z
Tools for working with files
é    )ÚannotationsN)ÚMusic21Exception)ÚreadFileEncodingSafeÚreadPickleGzipÚcdÚpreparePathClassesForUnpicklingÚ!restorePathClassesAfterUnpicklingÚrunSubprocessCapturingStderrc              #  ó¼   K  — t          j        ¦   «         }	 t          j        | ¦  «         dV — t          j        |¦  «         dS # t          j        |¦  «         w xY w)zÁ
    Useful for a temporary cd for use in a `with` statement:

         with cd('/Library/'):
              os.system(make)

    will switch temporarily, and then switch back when leaving.
    N)ÚosÚgetcwdÚchdir)Ú	targetDirÚcwds     ú�/Users/tedpeters/Documents/Projects/Claude Projects/Misc Tools/notename-sheets/.venv/lib/python3.11/site-packages/music21/common/fileTools.pyr   r   &   sT   è è € õ Œ)‰+Œ+€CðÝ
Œ�ÑÔÐØˆˆˆå
Œ�‰Œˆˆˆø�Œ�‰Œˆˆøøøs   —A ÁAÚfilePathústr | pathlib.PathÚreturnút.Anyc                ón  — t          ¦   «          t          j        | d¦  «        5 }	 |                     ¦   «         }t	          j        |¦  «        }n@# t          $ r3}t          ¦   «          t          dt          | ¦  «        z   ¦  «        |‚d}~ww xY w	 ddd¦  «         n# 1 swxY w Y   t          ¦   «          |S )zf
    Read a gzip-compressed pickle file, uncompress it, unpickle it, and
    return the contents.
    ÚrbzCannot load file N)
r   ÚgzipÚopenÚreadÚpickleÚloadsÚ	Exceptionr	   r   Ústr)r   ÚpickledFileÚuncompressedÚnewMdbÚes        r   r   r   9   s  € õ
 $Ñ%Ô%Ð%Ý	Œ�8˜TÑ	"Ô	"ð 	O kð	OØ&×+Ò+Ñ-Ô-ˆLÝ”\ ,Ñ/Ô/ˆFˆFøÝð 	Oð 	Oð 	Oõ .Ñ/Ô/Ð/Ý"Ð#6½¸X¹¼Ñ#FÑGÔGÈQÐNøøøøð	Oøøøð ð	Oð 	Oð 	Oñ 	Oô 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oøøøð 	Oð 	Oð 	Oð 	Oõ &Ñ'Ô'Ð'Ø€Ms4   ¤B¦(AÁBÁ
BÁ.BÂBÂBÂB Â#B úutf-8r   c                ó¦  — 	 t          j        | d|¬¦  «        5 }|                     ¦   «         }|cddd¦  «         S # 1 swxY w Y   dS # t          $ r} ddl}t          j        | d¦  «        5 }|                     ¦   «         }|                     |¦  «        d         pd}t          j        ||¦  «        cddd¦  «         cY S # 1 swxY w Y   Y dS w xY w)ao  
    Slow, but will read a file of unknown encoding as safely as possible using
    the chardet package.  Mostly obsolete in the utf-8 world of today, but
    useful for older code

    Let's try to load the `music21.common.__init__.py` file as ascii --
    it has a copyright symbol near the top, so it won't load in Python3:

    >>> import os
    >>> c = str(common.getSourceFilePath() / 'common' / '__init__.py')
    >>> f = open(c, encoding='ascii')
    >>> data = f.read()
    Traceback (most recent call last):
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position ...:
        ordinal not in range(128)

    That won't do! Now I know that it is in utf-8, but maybe you don't. Or it could
    be an old Humdrum or Noteworthy file with Windows or unknown encoding.
    This will load it as safely as possible.

    >>> data = common.readFileEncodingSafe(c)
    >>> data[83:106]
    'Name:         common.py'

    Well, that's nothing, since the first guess here is utf-8, and it's right. So let's
    give a worse first guess:

    >>> data = common.readFileEncodingSafe(c, firstGuess='SHIFT_JIS')  # old Japanese standard
    >>> data[83:106]
    'Name:         common.py'

    It worked!

    Note that trying lots of encodings is slow enough when the first guess is wrong
    that the firstGuess should be set to something reasonable like 'utf-8' or 'ascii'.
    Úr)ÚencodingNr   r   r&   Úascii)Úior   r   ÚUnicodeDecodeErrorÚchardetÚdetectÚcodecsÚdecode)r   Ú
firstGuessÚthisFileÚdatar*   ÚthisFileBinaryÚ
dataBinaryr&   s           r   r   r   M   ss  € ðL	7ÝŒW�X˜s¨ZÐ8Ñ8Ô8ð 	¸HØ—=’=‘?”?ˆDØð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	øõ ð 7ð 7ð 7ØˆˆˆÝŒW�X˜tÑ$Ô$ð 	7¨Ø'×,Ò,Ñ.Ô.ˆJØ—~’~ jÑ1Ô1°*Ô=ÐHÀˆHÝ”= ¨XÑ6Ô6ð	7ð 	7ð 	7ð 	7ñ 	7ô 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7øøøð 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð7øøøsV   ‚A	 ™<¯A	 ¼A Á A	 ÁA ÁA	 Á	#CÁ,ACÂ2CÃC	ÃCÃC	Ã	CÃC)Ú	posixPathÚwindowsPathc                 óŽ   — ddl m}   | ¦   «         }|dk    rt          j        t          _        dS t          j        t          _        dS )zÏ
    When we need to unpickle a function that might have relative paths
    (like some music21 stream options), Windows chokes if the PosixPath
    is not defined, but usually can still unpickle easily.
    r   ©ÚgetPlatformÚwinN)Úmusic21.common.miscr7   ÚpathlibÚWindowsPathÚ	PosixPath©r7   Úplatforms     r   r   r   ‚   sN   € ð 0Ð/Ð/Ð/Ð/Ð/Øˆ{‰}Œ}€HØ�5ÒÐÝ#Ô/�ÔÐÐå%Ô/�ÔÐÐó    c                 ó’   — ddl m}   | ¦   «         }|dk    rt          d         t          _        dS t          d         t          _        dS )z0
    After unpickling, leave pathlib alone.
    r   r6   r8   r3   r4   N)r9   r7   Ú_storedPathlibClassesr:   r<   r;   r=   s     r   r	   r	   �   sR   € ð 0Ð/Ð/Ð/Ð/Ð/Øˆ{‰}Œ}€HØ�5ÒÐÝ1°+Ô>�ÔÐÐå3°MÔB�ÔÐÐr?   c                ó"  — t          j        | dd¬¦  «        }|j        dk    rl|j        }	 ddl}|                     |                     d¬¦  «        ¦  «        }n'# t          $ r |                     dd¬	¦  «        }Y nw xY wt          |¦  «        ‚dS )
zk
    Run a subprocess command, capturing stderr and
    only show the error if an exception is raised.
    TF)Úcapture_outputÚcheckr   N)Údo_setlocaler'   Úignore)Úerrors)	Ú
subprocessÚrunÚ
returncodeÚstderrÚlocaler-   Úgetpreferredencodingr)   ÚIOError)ÚsubprocessCommandÚcompleted_processÚstderr_bytesrL   Ú
stderr_strs        r   r
   r
   œ   s¾   € õ
 #œÐ'8ÈÐUZÐ[Ñ[Ô[ÐØÔ# qÒ(Ð(ð )Ô/ˆð	GØˆMˆMˆMØ%×,Ò,¨V×-HÒ-HÐV[Ð-HÑ-\Ô-\Ñ]Ô]ˆJˆJøÝ!ð 	Gð 	Gð 	Gà%×,Ò,¨W¸XÐ,ÑFÔFˆJˆJˆJð	Gøøøõ �jÑ!Ô!Ð!ð )Ð(s   «-A Á!A=Á<A=Ú__main__)r   r   r   r   )r#   )r   r   )Ú__doc__Ú
__future__r   r,   Ú
contextlibr   r(   r:   r   r   rH   ÚtypingÚtÚmusic21.exceptions21r   Ú__all__Úcontextmanagerr   r   r   r<   r;   rA   r   r	   r
   Ú__name__Úmusic21ÚmainTest© r?   r   ú<module>r`      sh  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ø €€€Ø 	€	€	€	Ø €€€Ø €€€Ø 	€	€	€	Ø Ð Ð Ð Ø Ð Ð Ð à 1Ð 1Ð 1Ð 1Ð 1Ð 1ðð ð €ð Ôðð ñ Ôðð$ð ð ð ð(/7ð /7ð /7ð /7ð /7ðf '.Ô&7ÈÔH[Ð\Ð\Ð ð0ð 0ð 0ð	Cð 	Cð 	Cð"ð "ð "ð( ˆzÒÐØ€N€N€NØ€GÔÑÔÐÐÐð Ðr?   