ó
1QíXc           @   së   d  Z  d d l Z d d l m Z d d l m Z d j d e j d d e j d	 d
 g ƒ Z	 e j
 e	 ƒ Z d „  Z d „  Z d „  Z d „  Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d S(   sD   
Classes representing how filesystem trees should match convention.
iÿÿÿÿNi   (   t
   exceptions(   t	   scan_itemt    s   (?:s   )?s   )*t   $c         C   sG   t  j |  ƒ j ƒ  } | t |  ƒ k r. |  g S|  d | !|  | g Sd S(   sÔ   
    Version numbers followed by parens end file name conventions.
    A "stop point" must come before the version number lest a preceeding
    <something> sort of pattern component match the version number.
    i    N(   t	   SUFFIX_REt   searcht   startt   len(   t   datat	   break_pos(    (    sx   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/fstree.pyt   breakon_version_parens2   s    c         C   s   |  d j  | ƒ S(   NR   (   t   join(   R   t   more(    (    sx   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/fstree.pyt
   reassemble?   s    c         C   s"   x | D] } |  j  | ƒ q Wd  S(   N(   t   add(   t   patternst   more_patternst   pat(    (    sx   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/fstree.pyt   _extend_patternsG   s    c         C   s   g  |  D] } | j  ^ q S(   N(   t   rownum(   R   t   pattern(    (    sx   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/fstree.pyt   _rows_of_patternsL   s    t
   PatternLocc           B   s)   e  Z d  Z d „  Z d „  Z d „  Z RS(   s   Track where patterns matchc         C   sb   t  t |  ƒ j ƒ  | |  _ | |  _ | d  k	 rU t | ƒ | k  rU t | ƒ |  _ n	 | |  _ d  S(   N(   t   superR   t   __init__R   R   t   NoneR   t   pos(   t   selfR   R   R   (    (    sx   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/fstree.pyR   U   s    		c         C   s"   |  j  | j  k o! |  j | j k S(   N(   R   R   (   R   t   other(    (    sx   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/fstree.pyt   __eq__e   s    c         C   s   t  |  j |  j f ƒ S(   N(   t   hashR   R   (   R   (    (    sx   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/fstree.pyt   __hash__h   s    (   t   __name__t
   __module__t   __doc__R   R   R   (    (    (    sx   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/fstree.pyR   S   s   		t   DecisionNodec           B   s€   e  Z d d  „ Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 d „  Z d	 „  Z d
 „  Z d „  Z d „  Z RS(   c         C   s5   t  t |  ƒ j ƒ  i  |  _ t ƒ  |  _ | |  _ d  S(   N(   R   R#   R   t   branchest   setR   R   (   R   R   (    (    sx   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/fstree.pyR   m   s    	c         C   s    |  j  j t | | | ƒ ƒ d  S(   N(   R   R   R   (   R   R   R   R   (    (    sx   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/fstree.pyt   attach_patternt   s    c         C   s"   d  |  j k r |  j d  Sd  Sd  S(   N(   R   R$   (   R   (    (    sx   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/fstree.pyt   _leaf_childx   s    c         C   sH   |  j  ƒ  } | rD t j t j d j t | j ƒ | g ƒ ƒ ƒ n  d  S(   Ns   The rows are {0}(   R'   t   ext   expresst   ExtraRuleWarningt   formatR   R   (   R   R   t   leaf(    (    sx   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/fstree.pyt   _existing_pattern_check~   s
    c         C   sK   | d } | j  } | j | ƒ |  j | | | ƒ |  j | | | ƒ d  S(   Ni   (   t   valuet   extendt   extend_w_scan_items(   R   t	   next_itemR   R   t
   scan_itemst
   next_itemst
   opt_branch(    (    sx   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/fstree.pyt   _extend_w_optional_item…   s
    

c         C   sv   | |  j  k r |  j  | } n& |  j | ƒ t | ƒ } | |  j  | <| j | | | j ƒ | j | | | d ƒ d  S(   Ni   (   R$   R-   R#   R&   R   R0   (   R   R1   R   R   R2   t	   next_node(    (    sx   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/fstree.pyt   _extend_w_regular_itemŒ   s    c         C   sL   | d } | j  d k r2 |  j | | | | ƒ n |  j | | | | ƒ d S(   s,   Extend decision tree with the next scan itemi    t   optionalN(   t   typeR5   R7   (   R   R   R   R2   R1   (    (    sx   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/fstree.pyt   _extend_w_next_item–   s    
c         C   sR   |  j  d  } | j | | t | ƒ ƒ t j t j d j t | j	 ƒ ƒ ƒ ƒ d  S(   Ns   The duplicate rows are {0}(
   R$   R   R&   R   R(   R)   t   DuplicateRuleWarningR+   R   R   (   R   R   R   R6   (    (    sx   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/fstree.pyt   _reuse_terminal    s
    c         C   sv   t  d  ƒ } | |  j d  <| j | | t | ƒ ƒ t |  j ƒ d k rr t j t j d j	 t
 | j ƒ ƒ ƒ ƒ n  d  S(   Ni   s   The rows are {0}(   R#   R   R$   R&   R   R   R(   R)   R*   R+   R   (   R   R   R   R6   (    (    sx   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/fstree.pyt   _make_new_terminal§   s    c         C   s6   d |  j k r" |  j | | ƒ n |  j | | ƒ d S(   s   Terminate decision treeN(   R   R$   R<   R=   (   R   R   R   (    (    sx   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/fstree.pyt   _terminate_scan°   s    c         C   s0   | r |  j  | | | ƒ n |  j | | ƒ d S(   s)   Extend the decision tree using scan_itemsN(   R:   R>   (   R   R   R   R2   (    (    sx   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/fstree.pyR0   ·   s    c         C   s;  t  | ƒ t d „  | Dƒ ƒ } d } x|  j j ƒ  D]ô } | j | | ƒ \ } } }	 | d k r} |	 j | ƒ | | |	 f S| t k rÆ | }
 | d k r· | d k	 r· t | | ƒ q*d } | } q6 t  | ƒ } | | k  ró | }
 | } | } q6 | | k r6 | d k r| }
 | } q*t | | ƒ q6 q6 W|
 | g  f S(   s2   Merge results of calling invalid() on branch nodesc         s   s   |  ] } t  | ƒ Vq d  S(   N(   R   (   t   .0R   (    (    sx   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/fstree.pys	   <genexpr>À   s    R   i    N(	   R   t   sumR   R$   t   valuest   invalidR/   t   TrueR   (   R   t	   remaindert   report_itemsR   t   ret_lent   ret_patst   brancht	   unmatchedt   unpatst   child_report_itemst   ret_datat   br_len(    (    sx   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/fstree.pyt   match_branches¾   s2     			c         C   sÍ   |  j  d k r( t | | ƒ |  j g  f S| d k rq t | ƒ d k rV t |  j g  f S|  j | d | d ƒ SnX |  j  j | ƒ \ } } | r° | j ƒ  |  j	 | | | | ƒ St | | ƒ |  j g  f Sd S(   s6  Return pattern(s) that "fail the least".

        This means the pattern that matches the most characters
        in the input.  All characters in valid input are matched
        by some pattern.

        The original file name input is broken into a sequence of strings.
        Matching of an individual decision tree node ends with the end
        of an individual string.  The remaining strings are then
        matched against the remaining pattern components.

        Input:
        data  File name portion to match against this decision tree branch.
        more  Sequence of additional pieces of the file name.

        Returns:  (unmatched, patlocs, report_items)
           unmatched  That portion of the data which did not match,
                      or True when all the data matched but no
                      convention was exhausted.  The empty string ('')
                      when the data matches one or more patterns.
           patlocs    Iterable (really, a set) of the PatternLoc
                      instances which match "the most".
           report_items List of "things" (at the moment unusual
                        parentheticals) to be reported when
                        the data matches, or the empty list when
                        the data does not exhaustively match any pattern.
        R   i    i   N(
   R   R   R   R   R   RC   RB   t   matchest   reverseRN   (   R   R   R   t	   match_lenRE   (    (    sx   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/fstree.pyRB   à   s    
N(   R    R!   R   R   R&   R'   R-   R5   R7   R:   R<   R=   R>   R0   RN   RB   (    (    (    sx   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/fstree.pyR#   l   s   					
	
						"t   DecisionTreec           B   s)   e  Z d  Z d „  Z d „  Z d „  Z RS(   s6   File system object names test against a decision tree.c         C   s    t  t |  ƒ j ƒ  | |  _ d  S(   N(   R   RR   R   t   fsdir(   R   RS   (    (    sx   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/fstree.pyR     s    c         C   s<   |  j  | | d ƒ t t |  ƒ j | | t j | ƒ ƒ d S(   s6   Extend the decision tree with with the scanned patternN(   R&   R   R   RR   R0   R   t   to_scan_items(   R   R   R   t   scan(    (    sx   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/fstree.pyR/     s    c         C   sI   t  | ƒ } |  j | d g  | d ƒ \ } } } | j ƒ  | | | f S(   Ni    i   (   R
   RN   RP   (   R   R   t
   data_partsRI   t   patlocsRE   (    (    sx   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/fstree.pyRB     s
     
(   R    R!   R"   R   R/   RB   (    (    (    sx   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/fstree.pyRR     s   		t   FSDirc           B   sJ   e  Z d  Z d d d „ Z d „  Z d „  Z d „  Z d „  Z d „  Z	 RS(   s<   The properties of a directory as specified by the rule file.c         C   s7   | |  _  | |  _ | |  _ i  |  _ | |  ƒ |  _ d  S(   N(   t   name_patternt   parentR   t   childrent   decision_tree(   R   t
   tree_classRY   RZ   R   (    (    sx   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/fstree.pyR   '  s
    				c         C   s   |  |  _  d  S(   N(   RZ   (   R   (    (    sx   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/fstree.pyt   set_root.  s    c         C   s   |  j  |  k S(   N(   RZ   (   R   (    (    sx   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/fstree.pyt   is_root1  s    c         C   s   | |  j  | <d  S(   N(   R[   (   R   R   t   child(    (    sx   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/fstree.pyt	   add_child4  s    c         C   s£   y | j  | ƒ } Wnv t j k
 r= } t j | | ƒ ‚ nO t j k
 rd } t j | | ƒ ‚ n( t j k
 r‹ } t j | | ƒ ‚ n X| j | | | ƒ d  S(   N(	   t   parseR(   t   LexErrort	   ScanErrort	   YaccErrort
   ParseErrort   YaccEOFErrort   ParseEOFErrorR/   (   R   t   treet   parserR   R   RU   t   err(    (    sx   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/fstree.pyt   add_content7  s    c         C   s   |  j  j | ƒ S(   N(   R\   RB   (   R   R   (    (    sx   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/fstree.pyRB   C  s    N(
   R    R!   R"   R   R   R^   R_   Ra   Rl   RB   (    (    (    sx   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/fstree.pyRX   $  s   				(   R"   t   reR   R    R(   R   R   t   VERSION_RE_STRt   PAREN_RE_STRt   SUFFIX_RE_STRt   compileR   R
   R   R   R   t   objectR   R#   RR   RX   (    (    (    sx   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/fstree.pyt   <module>   s(   				¢