ó
?ú¼Wc           @   s—   d  Z  d d l Z d d l Z d d l Z d d l Z d d l Z d d l Z d d l m Z d d l	 Z	 d f  d „  ƒ  YZ
 d e f d „  ƒ  YZ d S(   s   Common code for autogradersiÿÿÿÿN(   t   defaultdictt   Gradesc           B   s§   e  Z d  Z e e e d „ Z d „  Z i  e d „ Z d „  Z d „  Z d „  Z	 d „  Z
 e d „ Z d	 „  Z d
 „  Z d „  Z d e d „ Z e d „ Z d „  Z RS(   sO   A data structure for project grades, along with formatting code to display themc         C   sÑ   g  | D] } | d ^ q |  _  t | ƒ |  _ t ƒ  |  _ t g  |  j  D] } | g  f ^ qH ƒ |  _ | |  _ t j ƒ  d d !|  _	 t
 |  _ d |  _ | |  _ | |  _ | |  _ t t ƒ |  _ d |  j	 GHd S(   s¢   
    Defines the grading scheme for a project
      projectName: project name
      questionsAndMaxesDict: a list of (question name, max points per question)
    i    i   i   s!   Starting on %d-%d at %d:%02d:%02dN(   t	   questionst   dictt   maxest   Countert   pointst   messagest   projectt   timet	   localtimet   startt   Truet   sanet   Nonet   currentQuestiont	   edxOutputt   gsOutputt   muteR    t   sett   prereqs(   t   selft   projectNamet   questionsAndMaxesListR   R   t
   muteOutputt   elt   q(    (    sN   /Users/saia/public_html/classes/527-s18/proj/python_basics/tutorial/grading.pyt   __init__   s     +						c         C   s   |  j  | j | ƒ d  S(   N(   R   t   add(   R   t   questiont   prereq(    (    sN   /Users/saia/public_html/classes/527-s18/proj/python_basics/tutorial/grading.pyt	   addPrereq3   s    c   	      C   s\  t  g  ƒ } xz|  j D]o} d | GHd d t | ƒ GHH| |  _ |  j | j | ƒ } t | ƒ d k r‘ | j ƒ  } d | | | | f GHq n  |  j r§ t j	 ƒ  n  zz y# t j
 t | | ƒ d ƒ |  ƒ WnP t k
 r} |  j | | t ƒ |  j | | | d ƒ n |  j d ƒ n XWd	 |  j r:t j ƒ  n  X|  j | |  j | k re| j | ƒ n  d
 | |  j | |  j | f GHq Wd t j ƒ  d d !GHd GHx1 |  j D]& } d | |  j | |  j | f GHq®Wd GHd |  j j ƒ  t |  j j ƒ  ƒ f GH| r'|  j j ƒ  d k r'd GHn  d GH|  j rB|  j ƒ  n  |  j rX|  j ƒ  n  d	 S(   s‚   
    Grades each question
      gradingModule: the module with all the grading functions (pass in with sys.modules[__name__])
    s   
Question %st   =i	   i    sŒ   *** NOTE: Make sure to complete Question %s before working on Question %s,
*** because Question %s builds upon your answer for Question %s.
i  i   s)   FAIL: Terminated with a string exception.Ns   
### Question %s: %d/%d ###
s   
Finished at %d:%02d:%02di   i   s&   
Provisional grades
==================s   Question %s: %d/%ds   ------------------s   Total: %d/%di   sì  

                     ALL HAIL GRANDPAC.
              LONG LIVE THE GHOSTBUSTING KING.

                  ---      ----      ---
                  |  \    /  + \    /  |
                  | + \--/      \--/ + |
                  |   +     +          |
                  | +     +        +   |
                @@@@@@@@@@@@@@@@@@@@@@@@@@
              @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
            @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
            @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
            \   @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
             \ /  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
              V   \   @@@@@@@@@@@@@@@@@@@@@@@@@@@@
                   \ /  @@@@@@@@@@@@@@@@@@@@@@@@@@
                    V     @@@@@@@@@@@@@@@@@@@@@@@@
                            @@@@@@@@@@@@@@@@@@@@@@
                    /\      @@@@@@@@@@@@@@@@@@@@@@
                   /  \  @@@@@@@@@@@@@@@@@@@@@@@@@
              /\  /    @@@@@@@@@@@@@@@@@@@@@@@@@@@
             /  \ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
            /    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
            @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
            @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
              @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
                @@@@@@@@@@@@@@@@@@@@@@@@@@
                    @@@@@@@@@@@@@@@@@@

s“   
Your grades are NOT yet registered.  To register your grades, make sure
to follow your instructor's guidelines to receive credit on your project.
(   R   R   t   lenR   R   t
   differencet   popR   t   utilt	   mutePrintt   TimeoutFunctiont   getattrt	   Exceptiont   addExceptionMessaget	   tracebackt   addErrorHintst   failt   unmutePrintR   R   R   R	   R
   t
   totalCountt   sumt   valuesR   t   produceOutputR   t   produceGradeScopeOutput(	   R   t   gradingModulet   exceptionMapt   bonusPict   completedQuestionsR   t   incompletedR   t   inst(    (    sN   /Users/saia/public_html/classes/527-s18/proj/python_basics/tutorial/grading.pyt   grade6   sN    			  #	 $$' 		c         C   sO   |  j  d | ƒ |  j d ƒ x* | j ƒ  j d ƒ D] } |  j | ƒ q4 Wd S(   s    
    Method to format the exception message, this is more complicated because
    we need to cgi.escape the traceback but wrap the exception in a <pre> tag
    s   FAIL: Exception raised: %st    s   
N(   R,   t
   addMessaget
   format_exct   split(   R   R   R8   R*   t   line(    (    sN   /Users/saia/public_html/classes/527-s18/proj/python_basics/tutorial/grading.pyR)      s    c   	      C   sº   t  t | ƒ ƒ } d | } d } | j | ƒ rd | j | ƒ } | j | ƒ rd | j | ƒ } qd n  | j | ƒ r… | j | ƒ } n  | s d Sx$ | j d ƒ D] } |  j | ƒ qŸ Wd  S(   NR   R:   s   
(   t   strt   typet   getR=   R;   (	   R   R4   t   errorInstancet   questionNumt   typeOft   questionNamet	   errorHintt   questionMapR>   (    (    sN   /Users/saia/public_html/classes/527-s18/proj/python_basics/tutorial/grading.pyR+   š   s    
c   	   
   C   sc  i  } t  |  j j ƒ  ƒ } t  |  j j ƒ  ƒ } | | d <| | d <d | | f | d <g  } xÌ |  j D]Á } i  } | | d <|  j | | d <|  j | | d <|  j | |  j | k } d j d t | ƒ d k rß | d	 n | d
 | d d | d d | sd n d ƒ | d <g  | d <| j | ƒ qh W| | d <t d d ƒ  } t	 j
 | | ƒ Wd  QXd  S(   Nt   scoret	   max_scores   Total score (%d / %d)t   outputt   names+     Question {num} ({points}/{max}) {correct}t   numi   i   R   t   maxt   correctt   XR:   t   tagst   testss   gradescope_response.jsont   w(   R/   R   R0   R   R   t   formatR!   t   appendt   opent   jsont   dump(	   R   t   out_dctt   total_possiblet   total_scoret	   tests_outRK   t   test_outt
   is_correctt   outfile(    (    sN   /Users/saia/public_html/classes/527-s18/proj/python_basics/tutorial/grading.pyR2   °   s0    


	"



c   
      C   s  t  d d ƒ } | j d ƒ t |  j j ƒ  ƒ } t |  j j ƒ  ƒ } d } | | k ra d } n  d j d | d | d	 | ƒ } | j | ƒ x¾ |  j D]³ } t | ƒ d
 k r» | d } n | } d } |  j | |  j | k rê d } n  d d j	 |  j
 | ƒ } d j d | d |  j | d | d	 | d |  j | ƒ }	 | j |	 ƒ q– W| j d ƒ | j ƒ  t  d d ƒ } | j t |  j j ƒ  ƒ ƒ | j ƒ  d  S(   Ns   edx_response.htmlRR   s   <div>s   <span class="incorrect"/>s   <span class="correct"/>s[   
        <h3>
            Total score ({total_score} / {total_possible})
        </h3>
    RZ   RY   t   checkOrXi   i   s   <pre>%s</pre>s   
s  
        <div class="test">
          <section>
          <div class="shortform">
            Question {q} ({points}/{max}) {checkOrX}
          </div>
        <div class="longform">
          {messages}
        </div>
        </section>
      </div>
      R   RM   R   R   s   </div>t	   edx_grade(   RU   t   writeR/   R   R0   R   RS   R   R!   t   joinR   t   closeR?   R.   (
   R   R   RY   RZ   R_   t   headerR   RK   R   RJ   (    (    sN   /Users/saia/public_html/classes/527-s18/proj/python_basics/tutorial/grading.pyR1   Ô   s<    			
c         C   s'   t  |  _ |  j ƒ  |  j | | ƒ d S(   s4   Sets sanity check bit to false and outputs a messageN(   t   FalseR   t   assignZeroCreditR;   (   R   t   messaget   raw(    (    sN   /Users/saia/public_html/classes/527-s18/proj/python_basics/tutorial/grading.pyR,     s    	
c         C   s   d |  j  |  j <d  S(   Ni    (   R   R   (   R   (    (    sN   /Users/saia/public_html/classes/527-s18/proj/python_basics/tutorial/grading.pyRf     s    c         C   s   |  j  |  j c | 7<d  S(   N(   R   R   (   R   t   amt(    (    sN   /Users/saia/public_html/classes/527-s18/proj/python_basics/tutorial/grading.pyt	   addPoints  s    c         C   s   |  j  |  j c | 8<d  S(   N(   R   R   (   R   Ri   (    (    sN   /Users/saia/public_html/classes/527-s18/proj/python_basics/tutorial/grading.pyt   deductPoints  s    R:   c         C   s=   |  j  |  j |  j |  j <| d k r9 |  j | | ƒ n  d  S(   NR:   (   R   R   R   R;   (   R   Rg   Rh   (    (    sN   /Users/saia/public_html/classes/527-s18/proj/python_basics/tutorial/grading.pyt   assignFullCredit  s    c         C   sh   | sM |  j  r t j ƒ  n  d | GH|  j  r; t j ƒ  n  t j | ƒ } n  |  j |  j j | ƒ d  S(   Ns   *** (	   R   R$   R-   R%   t   cgit   escapeR   R   RT   (   R   Rg   Rh   (    (    sN   /Users/saia/public_html/classes/527-s18/proj/python_basics/tutorial/grading.pyR;      s    	 		 c         C   s'   d | GHx | j  d ƒ D] } q Wd  S(   Ns.   WARNING**** addMessageToEmail is deprecated %ss   
(   R=   (   R   Rg   R>   (    (    sN   /Users/saia/public_html/classes/527-s18/proj/python_basics/tutorial/grading.pyt   addMessageToEmail)  s    	(   t   __name__t
   __module__t   __doc__Re   R   R   R9   R)   R+   R2   R1   R,   Rf   Rj   Rk   Rl   R;   Ro   (    (    (    sN   /Users/saia/public_html/classes/527-s18/proj/python_basics/tutorial/grading.pyR      s   	Z	
		$	8				R   c           B   s    e  Z d  Z d „  Z d „  Z RS(   s   
  Dict with default 0
  c         C   s-   y t  j |  | ƒ SWn t k
 r( d SXd  S(   Ni    (   R   t   __getitem__t   KeyError(   R   t   idx(    (    sN   /Users/saia/public_html/classes/527-s18/proj/python_basics/tutorial/grading.pyRs   8  s    c         C   s   t  |  j ƒ  ƒ S(   s1   
    Returns the sum of counts for all keys.
    (   R/   R0   (   R   (    (    sN   /Users/saia/public_html/classes/527-s18/proj/python_basics/tutorial/grading.pyR.   >  s    (   Rp   Rq   Rr   Rs   R.   (    (    (    sN   /Users/saia/public_html/classes/527-s18/proj/python_basics/tutorial/grading.pyR   4  s   	(   Rr   Rm   R	   t   sysRV   R*   t   pdbt   collectionsR    R$   R   R   R   (    (    (    sN   /Users/saia/public_html/classes/527-s18/proj/python_basics/tutorial/grading.pyt   <module>   s   ÿ 