ó
‹ãXc           @   s¹   d  Z  d d l Z d d l m Z d d l m Z d d l m Z d d l m Z e j Z d „  Z	 d	 „  Z
 d
 „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d S(   s/   
Parse and compile file structure conventions.
iÿÿÿÿNi   (   t
   exceptions(   t	   get_rules(   t   fstree(   t
   rules_yaccc         C   s'   |  d t  j k r |  d S|  d Sd  S(   Nt   rules_sourcet
   rules_patht   spreadsheet_name(   R   t   FILE_SOURCE(   t   config(    (    s}   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/parse_rules.pyt   get_file_id&   s    c         C   s:   t  | ƒ | k r6 t j d j | t |  ƒ ƒ ƒ ‚ n  d  S(   Ns   Row {0} of file {1} has no data(   t   lent   ext   EmptyRowErrort   formatR	   (   R   t   rownumt   rowt   depth(    (    s}   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/parse_rules.pyt   check_empty_row-   s    c         C   s8   | | d k r4 t  j d j | t |  ƒ ƒ ƒ ‚ n  d  S(   Ni   s+   Row {0} of file {1} skips a directory level(   R   t   SkippedSubDirErrorR   R	   (   R   R   t	   cur_deptht	   new_depth(    (    s}   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/parse_rules.pyt   check_skipped_sub_dir3   s    c         C   sM   xF | | d D]6 } | d k r t  j d j | t |  ƒ ƒ ƒ ‚ q q Wd  S(   Ni   t    s)   Row {0} of file {1} has 2 non-empty cells(   R   t   ParentWithChildErrorR   R	   (   R   R   R   R   t   cell(    (    s}   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/parse_rules.pyt   check_parent_with_child:   s
    c         C   s5   d } x( |  D]  } | d k r# | S| d 7} q W| S(   s/   First non-empty cell is the (zero based) depth.i    R   i   (    (   R   R   R   (    (    s}   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/parse_rules.pyt	   get_depthB   s    c         C   sÇ   t  j | ƒ } t } d } g  } xq | D]i } | sT | d |  d k r‡ t } q‡ n3 | d |  d !} t | ƒ } | j | | | f ƒ | d 7} q( W| sÃ t j d j |  d t	 |  ƒ ƒ ƒ ‚ n  | S(   s>   Return tokens representing the fs structure in the rules file.i   i    t   begin_markert	   max_depthsT   The beginning of rule marker "{0}" is not in the storage conventions rule file "{1}"(
   t   csvt   readert   Falset   TrueR   t   appendR   t   NoMarkerErrorR   R	   (   R   t	   rule_filet   rule_readert   marker_seenR   t	   fs_tokensR   R   (    (    s}   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/parse_rules.pyt   lex_rules_fs_structL   s"    c         C   sL   | \ } } } t  |  | | | ƒ t |  | | | ƒ t |  | | | ƒ d S(   s1   Validate nested directory properties of the rulesN(   R   R   R   (   R   t
   parent_dirt   fs_tokent
   last_depthR   R   R   (    (    s}   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/parse_rules.pyt   raise_bad_rowf   s    c   	      C   sU   | \ } } } y t  | | | | ƒ Wn$ t j k
 rL } |  j | ƒ t SXt Sd S(   s1   Validate nested directory properties of the rulesN(   R+   R   t   BadRowErrort   expressR   R    (	   t   emR   R(   R)   R*   R   R   R   t   err(    (    s}   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/parse_rules.pyt   validate_rowq   s    c      	   C   sm  | s t  j ƒ  ‚ n  t j |  d d ƒ} | j ƒ  | } d } d  } x | D]} | \ }	 }
 } t | | | | |
 ƒ rM |
 | k rÜ | r| \ } } } t j |  d | | d | d | ƒ} | j | | ƒ | } qn3 |
 | k  rx$ t | |
 ƒ D] } | j	 } qù Wn  y! | j
 | j t |	 | |
 ƒ Wn# t  j k
 rU} | j | ƒ n X| } |
 } qM qM W| S(   Nt   name_patternt   .iÿÿÿÿt   parentR   (   R   t   NoRulesErrorR   t   FSDirt   set_roott   NoneR0   t	   add_childt   rangeR3   t   add_contentt   decision_treet   parsert	   RuleErrorR-   (   t
   tree_classR.   R   R&   t   root_dirR(   R*   t   prior_tokenR)   R   R   R   t   prior_rownumt   prior_deptht	   prior_rowt   new_dirt   stepR/   (    (    s}   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/parse_rules.pyt   parse_rules_fs_struct}   s<    

	c         C   s5   t  | | ƒ } |  j ƒ  t t j |  | | ƒ } | S(   N(   R'   t   exit_if_erroredRF   R   t   DecisionTree(   R.   R   R#   R&   t   analyzer(    (    s}   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/parse_rules.pyt   compile¤   s
    
(   t   __doc__R   R   R    R   R   R   R   R<   R	   R   R   R   R   R'   R+   R0   RF   RJ   (    (    (    s}   /home/kop/biz/barnett/enforcer_project/BRIEF-Script/Enforcer/devel/pytest/lib/python2.7/site-packages/enforcer/parse_rules.pyt   <module>   s    						
				'