
    *"hj                       d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	  ej                  e      Z ee      j                         j                  dz  Z G d d      Z G d	 d
      Z G d d      Z G d d      ZeZeZy)a  
Local filesystem bucket backend that mimics the ``oss2.Bucket`` API.

Historically this module only exposed ``MockBucket`` for ``--mock`` mode.
It now also serves as the generic local backend for evolve-server runs
that should read/write sessions + skills from a normal directory tree.
    )annotationsN)Path)Iteratormockc                       e Zd ZdZddZddZy)_LocalObjectz/Returned by :pymethod:`LocalBucket.get_object`.c                     || _         || _        y N)_datakey)selfdatar   s      </root/.hermes/SkillClaw/evolve_server/storage/mock_bucket.py__init__z_LocalObject.__init__   s    
    c                    | j                   S r
   )r   )r   s    r   readz_LocalObject.read   s    zzr   N)r   bytesr   strreturnNone)r   r   )__name__
__module____qualname____doc__r   r    r   r   r   r      s    9r   r   c                      e Zd ZdZddZy)_LocalObjectInfoz:Lightweight stand-in used by :class:`LocalObjectIterator`.c                    || _         y r
   )r   )r   r   s     r   r   z_LocalObjectInfo.__init__$   s	    r   Nr   r   r   r   )r   r   r   r   r   r   r   r   r   r   !   s
    Dr   r   c                  "    e Zd ZdZdddZddZy)LocalObjectIteratorzIterate over files in the local backend that start with *prefix*.

    Mimics ``oss2.ObjectIterator(bucket, prefix=...)``.
    c                     || _         || _        y r
   )_bucket_prefix)r   bucketprefixs      r   r   zLocalObjectIterator.__init__.   s    r   c              #    K   | j                   j                  }t        j                  |      D ]  \  }}}t	        |      D ]  }t        j
                  j                  ||      }t        j
                  j                  ||      j                  t        j                  d      }|j                  | j                        s}t        |         y w)N/)r$   _rootoswalksortedpathjoinrelpathreplacesep
startswithr%   r   )r   rootdirpath_dirs	filenamesfnfullrels           r   __iter__zLocalObjectIterator.__iter__2   s     ||!!)+ 	0%GUIY' 0ww||GR0ggoodD199"&&#F>>$,,/*3//	0	0s   B:C=CN) )r&   z'LocalBucket'r'   r   r   r   )r   zIterator[_LocalObjectInfo])r   r   r   r   r   r;   r   r   r   r"   r"   (   s    
0r   r"   c                  2    e Zd ZdZdddZd	dZd
dZddZy)LocalBucketzDrop-in replacement for ``oss2.Bucket`` backed by a local directory.

    Parameters
    ----------
    root:
        Local directory that acts as the "bucket root".  Defaults to
        ``evolve_server/mock/``.
    Nc                t    t        |xs t              | _        t        j	                  d| j                         y )Nz"[LocalBucket] using local root: %s)r   _DEFAULT_LOCAL_DIRr*   loggerinfo)r   r4   s     r   r   zLocalBucket.__init__F   s'    3!34
8$**Er   c                *   t         j                  j                  | j                  |      }t         j                  j	                  |      st        d|       t        |d      5 }|j                         }d d d        t        |      S # 1 sw Y   xY w)NzLocalBucket: key not found: rb)	r+   r.   r/   r*   isfileFileNotFoundErroropenr   r   )r   r   r.   fr   s        r   
get_objectzLocalBucket.get_objectJ   sv    ww||DJJ,ww~~d##&B3%$HII$ 	668D	D#&&	 	s   $B		Bc                   t         j                  j                  | j                  |      }t        j                  t         j                  j                  |      d       t        |t        t        f      r|}n2t        |t              r|j                  d      }n|j                         }t        |d      5 }|j                  |       d d d        t        j                  dt!        |      |       y # 1 sw Y   *xY w)NT)exist_okzutf-8wbu#   [LocalBucket] wrote %d bytes → %s)r+   r.   r/   r*   makedirsdirname
isinstancer   	bytearrayr   encoder   rG   writerA   rB   len)r   r   r   r.   rawrH   s         r   
put_objectzLocalBucket.put_objectR   s    ww||DJJ,
BGGOOD)D9dUI./Cc"++g&C))+C$ 	GGCL	93s8TJ	 	s   6C11C:c                    t         j                  j                  | j                  |      }t         j                  j	                  |      r,t        j
                  |       t        j                  d|       y y )Nz[LocalBucket] deleted %s)r+   r.   r/   r*   rE   removerA   rB   )r   r   r.   s      r   delete_objectzLocalBucket.delete_object_   sI    ww||DJJ,77>>$IIdOKK2D9  r   r
   )r4   zstr | Path | Noner   r   )r   r   r   r   )r   r   r   zbytes | str | io.IOBaser   r   r    )r   r   r   r   r   rI   rU   rX   r   r   r   r>   r>   <   s    F'K:r   r>   )r   
__future__r   iologgingr+   pathlibr   typingr   	getLoggerr   rA   __file__resolveparentr@   r   r   r"   r>   
MockBucketMockObjectIteratorr   r   r   <module>rd      s    # 	  	  			8	$(^++-44v=   0 0(': ':V 
( r   