+
    2j                        R t ^ RIHt ^ RIt^ RIHt ^ RIHtH	t	 ^ RI
Ht ^ RIHtHt ^ RIt^RIHt ^RIHtHt ^R	IHtHt ]'       d   ^R
IHt . R#Ot]! RR04      tR R ltR R lt]! RR04      tR$t R R lt!]! RR7      R R l4       t"]! RR7      R R l4       t#]! RR7      R R l4       t$] ! R  R4      4       t%R! R" lt&R# )%aU  Minimal METADATA parser for nab-python.

Extracts only the fields needed for dependency resolution from PEP
566/643 METADATA files (RFC 822 format).  Lighter than
:class:`packaging.metadata.Metadata` (no validation pass) and reuses
:class:`packaging.requirements.Requirement` parsing through an
LRU cache so repeated dep strings parse once.
)annotationsN)suppress)	dataclassfield)	lru_cache)TYPE_CHECKINGAny)Requirement)InvalidSpecifierSpecifierSet)InvalidVersionVersion)MarkerWheelMetadatadependencieszoptional-dependenciesc                    V ^8  d   QhRRRR/# )   textstrreturnzdict[str, Any] | None )formats   "^/home/user/billing-ledger-validation/.venv/lib/python3.14/site-packages/nab_python/metadata.py__annotate__r   ,   s      c &;     c                    \         P                  ! V 4      pTP                  R4      p\	        T\
        4      '       g   R# TP                  R4      p\	        T\        4      '       d?   T Uu0 uF  p\	        T\        4      '       g   K  TkK  	  pp\        T,          '       d   R# T#   \         P                   d     R# i ; iu upi )a+  Return the ``[project]`` table when it can be trusted as static.

Returns ``None`` when the TOML cannot be parsed, the
``[project]`` table is missing or malformed, or
``project.dynamic`` includes ``dependencies`` /
``optional-dependencies`` (in which case the static reader can
not provide either).
Nprojectdynamic)	tomliloadsTOMLDecodeErrorget
isinstancedictlistr   _DYNAMIC_FIELD_BLOCKERS)r   datar   dynamic_rawddynamic_sets   &     r   load_static_projectr*   ,   s    {{4  hhy!Ggt$$++i(K+t$$"-D+QAs1Cqq+D"[00N     Es   B( ,C	C(C Cc                    V ^8  d   QhRRRR/# )r   specifier_setr   r   Noner   )r   s   "r   r   r   D   s     7 7| 7 7r   c                   V  Fo  pVP                   R8X  d8   \        \        4      ;_uu_ 4        \        VP                  4       RRR4       KK  \        VP                  P                  R4      4       Kq  	  R#   + '       g   i     K  ; i)a  Convert every clause's version, raising when one will not parse.

A :class:`SpecifierSet` keeps its clause versions as strings and
converts them only when something compares against it, so a digit run
past CPython's int-from-string limit is accepted here and raises a
bare ``ValueError`` from the comparison much later.  An arbitrary
equality (``===``) literal need not be a PEP 440 version, so only a
failure other than :class:`InvalidVersion` rejects one.
z===Nz.*)operatorr   r   r   versionremovesuffix)r,   clauses   & r   validate_specifier_versionsr3   D   s\      ??e#.))' *) FNN//56  )))s   A88B	zrequires-distzprovides-extrac                    V ^8  d   QhRRRR/# )r   metadatar   r   boolr   )r   s   "r   r   r   `   s     6 6} 6 6r   c                    V P                   f   R#  R V P                   P                  R4      R,           4       w  rY3\        8  d   R# \        T P
                  ,          '       * #   \         d     R# i ; i)a  Return True when a distribution's dependency fields are final.

Per :pep:`643` the values are trustworthy only at Metadata-Version
2.2 or later with no dependency field marked ``Dynamic``. Below 2.2
an sdist's declared dependencies may change when it is built.
Fc              3  8   "   T F  p\        V4      x  K  	  R # 5iN)int).0ps   & r   	<genexpr>+metadata_deps_are_static.<locals>.<genexpr>j   s     Q(P1A(Ps   .:Nr   N)metadata_versionsplit
ValueError_MIN_STATIC_METADATA_VERSIONDEPENDENCY_FIELDSr   )r5   majorminors   &  r   metadata_deps_are_staticrG   `   sr       (Q(A(A(G(G(LR(PQ 	~44!H$4$4455	  s   +A' 'A65A6i    )maxsizec                    V ^8  d   QhRRRR/# )r   markerr   r   r   )r   s   "r   r   r   s   s      6 f r   c                    V # )a   Return a shared :class:`Marker` for an equal marker expression.

``Marker`` hashes and compares by its text, so a single marker like
``extra == "test"`` recurs across hundreds of distinct dep strings
(``pytest; extra == "test"``, ``coverage; extra == "test"``, ...),
each parsing to its own object.  The provider caches marker
evaluation by ``id(marker)``, so sharing one object per distinct
expression lets that cache hit across every candidate instead of
re-evaluating the same expression per dep.  Markers are read-only,
so sharing is safe.
r   )rJ   s   &r   _intern_markerrL   r   s	     Mr   i @  c                    V ^8  d   QhRRRR/# )r   req_strr   r   r	   r   )r   s   "r   r   r      s      s { r   c                l    \        V 4      pVP                  e   \        VP                  4      Vn        V# )a  Cache ``Requirement(req_str)`` parsing across wheel metadata.

The same dep strings (``numpy>=1.26``, ``pydantic<3``, etc.) recur
across many wheels in a dependency graph.  ``Requirement`` exposes
only read operations (specifier, marker, extras, name) so sharing
parsed objects is safe.
)r	   rJ   rL   )rN   reqs   & r   _parse_requirement_cachedrQ      s-     g
C
zz#CJJ/
Jr   i   c                    V ^8  d   QhRRRR/# )r   version_strr   r   r   r   )r   s   "r   r   r      s     	  	  	  	 r   c                    \        V 4      # )aM  Return a shared :class:`Version` for ``version_str``.

The same version string recurs across the per-platform wheels of a
project (and across projects that publish the same number).  Sharing
the parsed object saves the PEP 440 regex walk on every duplicate.
``Version`` is immutable in ``packaging``, so the shared instance
is safe.
)r   )rS   s   &r   intern_versionrU      s     ;r   c                      ] tR t^t$ RtR]R&   R]R&   RtR]R&   ]! ]R	7      t	R
]R&   ]! ]R	7      t
R]R&   RtR]R&   ]! ]R	7      tR]R&   RtR# )r   z+Parsed fields from a wheel's METADATA file.r   namer   r0   NzSpecifierSet | Nonerequires_python)default_factoryzlist[Requirement]requires_distz	list[str]provides_extraz
str | Noner@   zfrozenset[str]r   r   )__name__
__module____qualname____firstlineno____doc____annotations__rX   r   r$   rZ   r[   r@   	frozensetr   __static_attributes__r   r   r   r   r      sT    5
I+/O(/',T'BM$B %d ;NI;#'j'#I>G^>r   c                    V ^8  d   QhRRRR/# )r   r&   zstr | bytesr   r   r   )r   s   "r   r   r      s     6 6 6 6r   c           
        \        V \        4      '       d   V P                  R4      p \        P                  P                  4       P                  V 4      pVP                  R4      pVf   Rp\        V4      hVP                  4       pVP                  R4      pVf   Rp\        V4      hVP                  R4      pRpV'       d    \        V4      pVP                  R4      ;'       g    .  Uu. uF  p\        V4      NK  	  p	pVP                  R4      ;'       g    .  U
u. uF  qP                  4       NK  	  pp
VP                  R4      p\        R VP                  R4      ;'       g    .  4       4      p\        V\!        V4      VV	VVVR7      #   \         d   pRT R	T R
T: 2p\        T4      ThRp?ii ; iu upi u up
i )zBParse a METADATA file and return the fields needed for resolution.zutf-8NameNz$METADATA missing required Name fieldr   z'METADATA missing required Version fieldzRequires-PythonzMETADATA for z==z! has an invalid Requires-Python: zRequires-DistzProvides-ExtrazMetadata-Versionc              3  \   "   T F"  qP                  4       P                  4       x  K$  	  R # 5ir9   )striplower)r;   r(   s   & r   r=   !parse_metadata.<locals>.<genexpr>   s      P3Oa	))3Os   *,Dynamic)rW   r0   rX   rZ   r[   r@   r   )r"   bytesdecodeemailparserParserparsestrr!   rB   rh   r   r
   get_allrQ   rb   r   rU   )r&   msgrW   errrS   requires_python_strrX   excrrZ   er[   r@   r   s   &             r   parse_metadatary      s   ${{7#
,,



(
(
.C776?D|4o::<D'')$K7o''"34O
	+*+>?O /2kk/.J.P.Pb.P.P!!$.P   *-5E)F)L)L")LM)LAggi)LNMww12 P3;;y3I3O3OR3OPPG{+'#%) -   	+
  vR} 5$$7#:<  S/s*	+ Ns$   F -F< GF9F44F9)rD   r   rU   r*   rG   ry   r3   )r   r   )'r`   
__future__r   email.parserrn   
contextlibr   dataclassesr   r   	functoolsr   typingr   r   r   _vendor.packaging.requirementsr	   _vendor.packaging.specifiersr
   r   _vendor.packaging.versionr   r   _vendor.packaging.markersr   __all__rb   r%   r*   r3   rD   rC   rG   rL   rQ   rU   r   ry   r   r   r   <module>r      s    #   (  %  7 H >1 $^5L$MN 07* 0@AB   & 6$ 4  5  5	  	  	? 	? 	?6r   