From 877a8e0d42b2aa95ec5309a53ef0f7aa1e6c15ff Mon Sep 17 00:00:00 2001
From: Tue Herlau <tuhe@win.dtu.dk>
Date: Wed, 20 Jan 2021 17:06:12 +0100
Subject: [PATCH] updates

---
 unitgrade/__pycache__/__init__.cpython-36.pyc | Bin 998 -> 998 bytes
 .../__pycache__/unitgrade.cpython-36.pyc      | Bin 11574 -> 11636 bytes
 .../unitgrade_helpers.cpython-36.pyc          | Bin 5460 -> 5594 bytes
 unitgrade/unitgrade.py                        |   7 ++++++-
 unitgrade/unitgrade_helpers.py                |   5 +++--
 5 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/unitgrade/__pycache__/__init__.cpython-36.pyc b/unitgrade/__pycache__/__init__.cpython-36.pyc
index 845822da1bc18d27e8c2481f064c69b63907c5ec..41c8cae17ecac0b36d54439732f20e778a3e90b0 100644
GIT binary patch
delta 199
zcmaFH{*0a7n3tEUs_6ej_CiL>jg?A_+_#ug@@_Gvtz;+?p1h1Pl~Hsu50fjmFarZa
z5ttB}9K$5bC^or@DU9*f<cmxe0zz;(r~*l5MMlZV*36m-x47fu%TkMqGxPJ}<BM29
z3VA?;D2NaP5t0lH3{k?Rd6^~YMTse?dT>^e6i8YcM96>$Sr7rX06~aMKEkX707~#J
AcK`qY

delta 199
zcmaFH{*0a7n3tF98|S}??1hXL8!MF<xucj;@@_Gvtz;+?n!JoLl~H6e50fjm5Ca24
z5ttC39K$5bC_1@{DU2~{@<k>K0YSJNRDmS3BBS_ZYi7-aDDL?9vecsD%>2Cg_##%2
zLLLwy0wP2~gg65OLzHl7US>&pQDRD}9-LJq0g{#k5mF#R8bp9CKoG){k1#6%0D@gB
A>;M1&

diff --git a/unitgrade/__pycache__/unitgrade.cpython-36.pyc b/unitgrade/__pycache__/unitgrade.cpython-36.pyc
index 650192ef2a15d66101d9b6ed2d8900ed8fe6506d..4fdacefd982002048b628fb9e4ce082fe99b01ed 100644
GIT binary patch
delta 2781
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

delta 2842
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

diff --git a/unitgrade/__pycache__/unitgrade_helpers.cpython-36.pyc b/unitgrade/__pycache__/unitgrade_helpers.cpython-36.pyc
index b1ef9dc6b9b3154d2cebad1295e20b940d1909eb..4ec59209cb632db45b779350e883f1da9136585c 100644
GIT binary patch
delta 2199
zcmcbjbxT{tn3tEU-HIh4MTUXlF#{6dU|?WyU|?V<{=_g*MYo<Mhc%ZiiY=EtianPj
ziX)dZij$Ecg&~DChc%ZgiVMtU%;ApWPGLx4%;AaR0n@xuykMFyiZ7Kni$8@eg*}xw
zOCW`#mpMu>RWM5^g)@aKRXBw)g*%0(mz9wLEXJF{m%^VS(8~<v3#RaSr3fJj2&eF+
zh#>JrQ}|NEAp8{h6p0kc7RD%%6sZ*H7KSL%6onMo6uB10D6tgAU<OUa$y$tQj5{_@
zWZcfE=9XWikeOFpl9-pAs-uvZrcjcRs!)_#kY7}ykd~Q~s*qW%keN3*mpPO}2PBuL
zkUaS)vkG%jY2M@y%w3EcldD-|SyJ`V^)}CDk!3V@OJ;)xAvXg90~Z4WgEJ@yH5eHf
zN*J;jn;B}^Y8X=(vN?*pYS^-vQW&y1L9EH|Sgp8t7>dejSV81uEjHQumKwG!?po#=
z7O?V3HEdZtwJasPH4HV3HB2dNH7qr3S$s8YS^PE3DeS!*F-*1WwH#2xAC(BCa5OVA
zGL#6`faw~JTFw%I62ThIW=62MKnf?6<^t0~S;8ekSt890&5SABk_=g*TD4py0x3Kt
ztXXVXVl`aNj42E$0<BDv3@Lo#49!f83?%|7{2;A0?34enEnqa;JeQr9Y4S!+9rjzS
z1x1;8C6n)RIx=!kmgkZc5zb7{%P&fe&&@0@&df`X2L<h9Yc4+}Lr~}#fP##XgHec)
zjgf;<iiv|sj8Tk<1I%Nayp~IX(RT7Nu1Ac)lUH(Q*9U^MfJ2!{h>?r2$en?KAtad-
zWCjBRgBk+^11RN!gZ&&cJlHu)n6j8t7*m*1n0uLOxl&lNSW;M1*jgBBxUyKA8C)1Z
z;Zn<8!dAnb!Y<BG!Y<AL_8eyx2Ph<Kc}mz)IBR&s8S25p3|XADyfqA2T;Lcis^LxH
z0`bHd%o%EVOW0DlYk0*OYB-9TQh4&1Qh34P#g@WX!;r<D!qUvl$dJxZ%a_7m%b&?m
zD=>knVonK94MP@hGouT`1g6-Y7^Ygm7^YgGTHzAD8lf!y5`ku>S`l#M)^ip;s1ZyN
z5ND`i%w{fnP`IIlEkzI_GMgbqs75G@b2h_V7LYSb*iwXR_(i}zNfD_LiWdZvLYWM;
zq7xV^JW6<KgtCOemNLd##4y#0#W2;1*GklY6XpcQq9m}DoM4tX$g2|=>x+_V#K6`w
zWix{$CNLJNq=>>DAO?}0&5$BqBMx>7Tdiabe~N?zL#<SaNR4DOV~tcc!vw~nH8qkc
zVl_}P2?h~R*h!Y~)rdp=D_tW!fwA~h30sY13U7*JFDT84X4Q*ji8nJaGNg#4Fyu(o
z%GAhYNi;Lm%GQWyN!GB|u+^~FFsDfMvcxde%GJu(NYu#J$kj-fNY#jENjEd5NY7!d
z5v>ukVJMNwl7;B4k(FRbk!fbCRRCM4QX^L*pUpIZsmLZpHjgPqu2!-}GDW^bsz#xi
zQJkSZMFAYkk|1}10vY80aE21O8qsFP80K2VTKQU~68Rd%8hHVRX2x21Fk1=CR;rOt
z5y@tmz*MxVM7~6!M7~D2MoEOBMqV16{F)i_m{LS)m1=}R;x(c*A}NY<SZf4o1Z@~<
zlxl?Hg=*w$>Orxn1PkuDOts1>$~8h+LbDlCRBD7lF<+}v!d9c4B38p+B2uH=%qYQ7
zB2uFQqD2_Q8ERA@DZ7L%MH%G$8on&W6jg+IC}uIIGlA3;ZUB2w0OY}Xm=8;oYUIJ0
zM!rP8M5#sz%vP$AuVIK6tWm0Ah!=vEc$_t$Or+M#2+l<6piBfZ6l}3Z3U7&24MUa?
zC}>ku#2LUmK@bmOb&XPud>T`YK#JxZrdrh+)f#rbG^St%O|8jS`MVh7CMO6qGu>jC
z{8+$uvXP)df*k_`Ly<j*099SL*fKIxQd0A7aU|#G7L=BxrW83bFfc^11ULo<S8-`+
zX(_lldiuD!R52-NRB<X4rzYp;r4(ywvKFBk#F|->np<2HG<lw21f%lg?}BEG29x!K
zqIBVQ6@`Fo^<rRPxW!ytS$vDFxFjXNwB#0RT25(k#x0hT%-qz;>xEP_T|i1$i}FkJ
zQov<bktj$bD@c?rv7jI|FQo`nx@oFS{vf0w6vbDZkzXF4k(yHwpO%xDUKBA|N?4iE
zYO<ZMIHTR<Fk$u3Advnvkbc(UlEk8tTkOfDMMbH3CE$RFVl637O)kF0R9;*J4ilzg
z!&^+nMn#q&Z6a_&0>sh>g$}5EZJE4ZSe#L8@^xWD0S-nEMlnVyMiCY^Mj=KK#>qk=
z`uZT1nyh|)etvG69DaUoAP}M{ev37)G`FC#2;|8kCXkWLAR=;dnTQQz^5o4TwgMR-
b0b39OD!GgFCyA<Yf=g{i9!8$Y#-fS<4lfUm

delta 2126
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

diff --git a/unitgrade/unitgrade.py b/unitgrade/unitgrade.py
index 8b6496e..e9fd63a 100644
--- a/unitgrade/unitgrade.py
+++ b/unitgrade/unitgrade.py
@@ -69,11 +69,16 @@ class Capturing(list):
 
 class QItem(unittest.TestCase):
     title = None
-    testfun = unittest.TestCase.assertEqual
+    testfun = None
     tol = 0
 
     _computed_answer = None # Internal helper to later get results.
     def __init__(self, working_directory=None, correct_answer_payload=None, *args, **kwargs):
+        if self.tol > 0 and self.testfun is None:
+            self.testfun = self.assertL2Relative
+        else:
+            self.testfun = unittest.TestCase.assertEqual
+
         self.name = self.__class__.__name__
         self._correct_answer_payload = correct_answer_payload
         super().__init__(*args, **kwargs)
diff --git a/unitgrade/unitgrade_helpers.py b/unitgrade/unitgrade_helpers.py
index 4db4c2b..3af947a 100644
--- a/unitgrade/unitgrade_helpers.py
+++ b/unitgrade/unitgrade_helpers.py
@@ -46,7 +46,7 @@ parser.add_argument('--passall',  action="store_true",  help='Automatically pass
 #                     const=sum, default=max,
 #                     help='sum the integers (default: find the max)')
 
-def evaluate_report_student(report, question=None, qitem=None, unmute=None, passall=None):
+def evaluate_report_student(report, question=None, qitem=None, unmute=None, passall=None, ignore_missing_file=False):
     args = parser.parse_args()
     if question is None and args.q is not None:
         question = args.q
@@ -54,7 +54,8 @@ def evaluate_report_student(report, question=None, qitem=None, unmute=None, pass
             question, qitem = [int(v) for v in question.split(".")]
         else:
             question = int(question)
-    if not os.path.isfile(report.computed_answers_file):
+
+    if not os.path.isfile(report.computed_answers_file) and not ignore_missing_file:
         raise Exception("> Error: The pre-computed answer file", os.path.abspath(report.computed_answers_file), "does not exist. Check your package installation")
 
     if unmute is None:
-- 
GitLab