Ë
    sPêjá  ã                   ó”   — d Z ddgZddlmZ ddlmZ ddlmZ ddlmZm	Z	 dd	l
mZ erdd
lmZ ddlmZ  G d„ d«      Z G d„ d«      Zy)zBom related utilitiesÚBomRefDiscriminatorÚBomDependencyGraphFlatMergeré    )ÚIterable)Úchain)Úrandom)ÚTYPE_CHECKINGÚAnyé   ©Ú
Dependency)ÚBom©ÚBomRefc                   óˆ   — e Zd ZdZdded   deddfd„Zdd„Zd	ed
ededdfd„Z	dd„Z
dd„Zdefd„Zeddddedd fd„«       Zy)r   u¬  
    Ensure that a collection of BomRef objects
    has unique, nonâ€‘empty :attr:`cyclonedx.model.bom_ref.BomRef.value`.

    The discriminator inspects each provided BomRef and assigns a newly
    generated identifier to any instance whose ``value`` is missing or
    duplicates an earlier one.
    All original values are preserved and can be restored via :meth:`reset()`
    or by using this class as a context manager.
    r   ÚbomrefsÚprefixÚreturnNc                 ó@   — t        d„ |D «       «      | _        || _        y )Nc              3   ó8   K  — | ]  }||j                   f–— Œ y ­w©N)Úvalue)Ú.0Úbomrefs     ú`/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/cyclonedx/contrib/bom/utils.pyú	<genexpr>z/BomRefDiscriminator.__init__.<locals>.<genexpr>4   s   è ø€ ÒK¸˜v v§|¡|Ô4ÑKùs   ‚)ÚtupleÚ_bomrefsÚ_prefix)Úselfr   r   s      r   Ú__init__zBomRefDiscriminator.__init__1   s   € ô ÑKÀ7ÔKÓKˆŒØˆ�ó    c                 ó$   — | j                  «        y r   )Údiscriminate©r   s    r   Ú	__enter__zBomRefDiscriminator.__enter__7   s   € Ø×ÑÕr!   Úexc_typeÚexc_valÚexc_tbc                 ó$   — | j                  «        y r   ©Úreset©r   r&   r'   r(   s       r   Ú__exit__zBomRefDiscriminator.__exit__:   ó   € Ø�
‰
�r!   c                 ó¤   — g }| j                   D ]?  \  }}|j                  }|�||v r| j                  «       }||_        |j                  |«       ŒA y)zü
        Enforce uniqueness across all
        :attr:`cyclonedx.model.bom_ref.BomRef.value`s.

        Any BomRef whose ``value`` is ``None`` or duplicates a previously
        encountered value is assigned a newly generated unique identifier.
        N)r   r   Ú_make_uniqueÚappend)r   Úknown_valuesr   Ú_r   s        r   r#   z BomRefDiscriminator.discriminate=   sX   € ð ˆØŸ™ò 	'‰IˆF�AØ—L‘LˆEØˆ} ¨Ñ 5Ø×)Ñ)Ó+�Ø$�”Ø×Ñ Õ&ñ	'r!   c                 ó:   — | j                   D ]  \  }}||_        Œ y)zl
        Restore all :attr:`cyclonedx.model.bom_ref.BomRef.value`s to
        their original state.
        N)r   r   )r   r   Úoriginal_values      r   r+   zBomRefDiscriminator.resetM   s#   € ð
 '+§m¡mò 	*Ñ"ˆF�NØ)ˆF�Lñ	*r!   c                 óv   — | j                   › t        t        «       «      dd  › t        t        «       «      dd  › �S )Né   )r   Ústrr   r$   s    r   r0   z BomRefDiscriminator._make_uniqueU   s5   € Ø—,‘,�¤¤F£H£¨a¨bÐ 1Ð2´3´v³x³=ÀÀÐ3DÐ2EÐFÐFr!   Úbomr   c                 ó˜   —  | t        d„ |j                  «       D «       d„ |j                  D «       d„ |j                  D «       «      |«      S )aE  
        Create a discriminator for all :class:`cyclonedx.model.bom_ref.BomRefs`
        contained within a Bom.

        This includes BomRefs from
          * :attr:`cyclonedx.model.bom.Bom.components`
          * :attr:`cyclonedx.model.bom.Bom.services`
          * :attr:`cyclonedx.model.bom.Bom.vulnerabilities`
        c              3   ó4   K  — | ]  }|j                   –— Œ y ­wr   ©Úbom_ref)r   Úcs     r   r   z/BomRefDiscriminator.from_bom.<locals>.<genexpr>d   s   è ø€ Ò:˜1ˆQ�Y�YÑ:ùó   ‚c              3   ó4   K  — | ]  }|j                   –— Œ y ­wr   r<   )r   Úss     r   r   z/BomRefDiscriminator.from_bom.<locals>.<genexpr>e   s   è ø€ Ò-˜1ˆQ�Y�YÑ-ùr?   c              3   ó4   K  — | ]  }|j                   –— Œ y ­wr   r<   )r   Úvs     r   r   z/BomRefDiscriminator.from_bom.<locals>.<genexpr>f   s   è ø€ Ò4˜1ˆQ�Y�YÑ4ùr?   )r   Ú_get_all_componentsÚservicesÚvulnerabilities)Úclsr9   r   s      r   Úfrom_bomzBomRefDiscriminator.from_bomX   sH   € ñ ”5Ù: × 7Ñ 7Ó 9Ô:Ù- §¡Ô-Ù4 × 3Ñ 3Ô4ó
ð ó	ð 	r!   r   ©r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r8   r    r%   r	   r-   r#   r+   r0   ÚclassmethodrH   © r!   r   r   r   %   sŽ   „ ñ	ñ ¨Ñ 2ð ¸Cð Ètó óð ð ¨sð ¸Cð ÀDó ó'ó *ðG˜có Gð ñ˜5ð ¨#ð Ð=Rò ó ñr!   c                   ón   — e Zd ZdZdd„Zdd„Zdedededdfd	„Zdd
„Zdd„Z	e
dee   dee   fd„«       Zy)r   uh  
    Contextâ€‘manager utility that temporarily flattens and merges all
    :attr:`cyclonedx.model.bom.Bom.dependencies`.

    When used as a context manager, the :class:`cyclonedx.model.bom.Bom`'s
    dependency graph is replaced with a flattened, merged representation
    for the duration of the ``with`` block and automatically restored
    afterward.
    r   Nc                 óH   — || _         | j                   j                  | _        y r   )Ú_bomÚ_dependenciesÚ_deps)r   r9   s     r   r    z%BomDependencyGraphFlatMerger.__init__u   s   € ØˆŒ	à—Y‘Y×,Ñ,ˆ�
r!   c                 ó$   — | j                  «        y r   )Úflatten_merger$   s    r   r%   z&BomDependencyGraphFlatMerger.__enter__z   s   € Ø×ÑÕr!   r&   r'   r(   c                 ó$   — | j                  «        y r   r*   r,   s       r   r-   z%BomDependencyGraphFlatMerger.__exit__}   r.   r!   c                 óX   — | j                  | j                  «      | j                  _        y)um  
        Flatten and merge all :attr:`cyclonedx.model.bom.Bom.dependencies`.

        This produces a nonâ€‘recursive, merged representation of the entire
        dependency graph and assigns it to the Bom.

        .. note::
           The original dependency graph is not modified. A new, flattened
           dependency structure is assigned to the Bom.
        N)Ú_flatten_mergerT   rR   Údependenciesr$   s    r   rV   z*BomDependencyGraphFlatMerger.flatten_merge€   s   € ð "&×!4Ñ!4°T·Z±ZÓ!@ˆ�	‰	Õr!   c                 ó:   — | j                   | j                  _        y)a  
        Restore the :class:`cyclonedx.model.bom.Bom`'s dependency graph to
        its original state.

        .. note::
           This does not modify the dependency graph. It simply reassigns
           the original dependency collection back to the Bom.
        N)rT   rR   rS   r$   s    r   r+   z"BomDependencyGraphFlatMerger.reset�   s   € ð #'§*¡*ˆ�	‰	Õr!   Údepsc                 óp  — i }t        | «      }t        «       }|r‡|j                  «       }t        |«      x}|v rŒ"|j	                  |«       |j                  |j                  g «      }|j                  x}r)|j                  d„ |D «       «       |j                  |«       |rŒ‡d„ |j                  «       D «       S )Nc              3   ó4   K  — | ]  }|j                   –— Œ y ­wr   )Úref©r   Úds     r   r   z>BomDependencyGraphFlatMerger._flatten_merge.<locals>.<genexpr>§   s   è ø€ Ò3 A˜!Ÿ%�%Ñ3ùr?   c              3   óH   K  — | ]  \  }}t        |d „ |D «       «      –— Œ y­w)c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr   r   r`   s     r   r   zHBomDependencyGraphFlatMerger._flatten_merge.<locals>.<genexpr>.<genexpr>ª   s   è ø€ Ò6¨aœJ qŸMÑ6ùs   ‚Nr   )r   ÚbrÚdss      r   r   z>BomDependencyGraphFlatMerger._flatten_merge.<locals>.<genexpr>©   s)   è ø€ ò 
á��Bô �rÑ6°2Ô6×7ñ
ùs   ‚ ")
ÚlistÚsetÚpopÚidÚaddÚ
setdefaultr_   rZ   ÚextendÚitems)r\   ÚflatÚtodosÚseenÚtodoÚtodo_idre   Ú	todo_depss           r   rY   z+BomDependencyGraphFlatMerger._flatten_merge›   s§   € à/1ˆÜ�T“
ˆÜ‹uˆÙØ—9‘9“;ˆDÜ˜d›8Ð#�¨Ñ,ØØ�H‰H�WÔØ—‘ §¡¨2Ó.ˆBØ ×-Ñ-Ð-ˆyÐ-Ø—	‘	Ñ3¨Ô3Ô3Ø—‘˜YÔ'ò ñ
ð �z‰z‹|ô
ð 	
r!   )r9   r   r   NrI   )rJ   rK   rL   rM   r    r%   r	   r-   rV   r+   Ústaticmethodr   r   rY   rO   r!   r   r   r   j   si   „ ñó-ó
ð ð ¨sð ¸Cð ÀDó óAó-ð ð
˜X jÑ1ð 
°h¸zÑ6Jò 
ó ñ
r!   N)rM   Ú__all__Úcollections.abcr   Ú	itertoolsr   r   Útypingr   r	   Úmodel.dependencyr   Ú	model.bomr   Úmodel.bom_refr   r   r   rO   r!   r   ú<module>r|      sL   ðñ$ ð Ø"ð€õ
 %Ý Ý ß %å *áÝ Ý'÷Bñ B÷JC
ò C
r!   