From 56c81a07fd7ec5a87ca064764175214bb52b76bf Mon Sep 17 00:00:00 2001 From: Piotr Mitros Date: Mon, 16 Jan 2012 12:33:29 -0500 Subject: [PATCH 1/6] Fixed -.33 bug in calculator from gjs --- courseware/capa/calc.py | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/courseware/capa/calc.py b/courseware/capa/calc.py index a51ea94da2..ef34e186e2 100644 --- a/courseware/capa/calc.py +++ b/courseware/capa/calc.py @@ -19,6 +19,9 @@ def evaluator(variables, functions, string): "+" : operator.add, "-" : operator.sub, } + # We eliminated extreme ones, since they're rarely used, and potentially + # confusing. They may also conflict with variables if we ever allow e.g. + # 5R instead of 5*R suffixes={'%':0.01,'k':1e3,'M':1e6,'G':1e9, 'T':1e12,#'P':1e15,'E':1e18,'Z':1e21,'Y':1e24, 'c':1e-2,'m':1e-3,'u':1e-6, @@ -66,16 +69,18 @@ def evaluator(variables, functions, string): def func_parse_action(x): return [functions[x[0]](x[1])] - number_suffix=reduce(lambda a,b:a|b, map(Literal,suffixes.keys()), NoMatch()) + number_suffix=reduce(lambda a,b:a|b, map(Literal,suffixes.keys()), NoMatch()) # SI suffixes and percent (dot,minus,plus,times,div,lpar,rpar,exp)=map(Literal,".-+*/()^") number_part=Word(nums) - number=Optional(minus | plus)+number_part+Optional("."+number_part)+ \ + inner_number = ( number_part+Optional("."+number_part) ) | ("."+number_part) # 0.33 or 7 or .34 + number=Optional(minus | plus)+ inner_number + \ Optional(CaselessLiteral("E")+Optional("-")+number_part)+ \ - Optional(number_suffix) - number=number.setParseAction( number_parse_action ) + Optional(number_suffix) # 0.33k or -17 + number=number.setParseAction( number_parse_action ) # Convert to number - expr = Forward() + # Predefine recursive variables + expr = Forward() factor = Forward() def sreduce(f, l): @@ -86,24 +91,28 @@ def evaluator(variables, functions, string): return l[0] return reduce(f, l) + # Handle variables passed in. E.g. if we have {'R':0.5}, we make the substitution. + # Special case for no variables because of how we understand PyParsing is put together if len(variables)>0: varnames = sreduce(lambda x,y:x|y, map(lambda x: CaselessLiteral(x), variables.keys())) varnames.setParseAction(lambda x:map(lambda y:variables[y], x)) else: varnames=NoMatch() - if len(variables)>0: + # Same thing for functions. + if len(functions)>0: funcnames = sreduce(lambda x,y:x|y, map(lambda x: CaselessLiteral(x), functions.keys())) function = funcnames+lpar.suppress()+expr+rpar.suppress() function.setParseAction(func_parse_action) else: function = NoMatch() + atom = number | varnames | lpar+expr+rpar | function - factor << (atom + ZeroOrMore(exp+atom)).setParseAction(exp_parse_action) - paritem = factor + ZeroOrMore(Literal('||')+factor) + factor << (atom + ZeroOrMore(exp+atom)).setParseAction(exp_parse_action) # 7^6 + paritem = factor + ZeroOrMore(Literal('||')+factor) # 5k || 4k paritem=paritem.setParseAction(parallel) - term = paritem + ZeroOrMore((times|div)+paritem) + term = paritem + ZeroOrMore((times|div)+paritem) # 7 * 5 / 4 - 3 term = term.setParseAction(prod_parse_action) - expr << Optional((plus|minus)) + term + ZeroOrMore((plus|minus)+term) + expr << Optional((plus|minus)) + term + ZeroOrMore((plus|minus)+term) # -5 + 4 - 3 expr=expr.setParseAction(sum_parse_action) return (expr+stringEnd).parseString(string)[0] @@ -117,4 +126,6 @@ if __name__=='__main__': print evaluator({'a': 2.2997471478310274, 'k': 9, 'm': 8, 'x': 0.66009498411213041}, {}, "5") print evaluator({},{}, "-1") print evaluator({},{}, "-(7+5)") + print evaluator({},{}, "-0.33") + print evaluator({},{}, "-.33") print evaluator({},{}, "5+7 QWSEKO") From 1fb47e9cdd1fddcbfd7275556d86fe1bfe26137a Mon Sep 17 00:00:00 2001 From: Piotr Mitros Date: Mon, 16 Jan 2012 15:58:50 -0500 Subject: [PATCH 2/6] settings.py had textbook. Worked on dev machines because .pyc files stuck around; didn't work on staging --- settings.py | 1 - 1 file changed, 1 deletion(-) diff --git a/settings.py b/settings.py index 9a75434228..8cd9498b31 100644 --- a/settings.py +++ b/settings.py @@ -96,7 +96,6 @@ INSTALLED_APPS = ( 'auth', 'django.contrib.humanize', 'static_template_view', - 'textbook', 'staticbook', 'simplewiki', 'track', From 851bf3e692d2d1621c16dd78098fb5dab744c4e4 Mon Sep 17 00:00:00 2001 From: Piotr Mitros Date: Mon, 16 Jan 2012 18:19:27 -0500 Subject: [PATCH 3/6] Fixed revery in settings.py --- settings.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/settings.py b/settings.py index 8cd9498b31..a201c5e519 100644 --- a/settings.py +++ b/settings.py @@ -1,5 +1,6 @@ COURSEWARE_ENABLED = True -ASKBOT_ENABLED = False +if 'TRACK_DIR' not in locals(): + ASKBOT_ENABLED = True if not COURSEWARE_ENABLED: ASKBOT_ENABLED = False From 5859f466ecab7ec6d03a813649df1ed693518cca Mon Sep 17 00:00:00 2001 From: Piotr Mitros Date: Mon, 16 Jan 2012 20:39:50 -0500 Subject: [PATCH 4/6] Run without courseware with --settings --- settings.py | 3 ++- settings_no_courseware.py | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 settings_no_courseware.py diff --git a/settings.py b/settings.py index a201c5e519..53cfae6a6a 100644 --- a/settings.py +++ b/settings.py @@ -1,4 +1,5 @@ -COURSEWARE_ENABLED = True +if 'COURSEWARE_ENABLED' not in locals(): + COURSEWARE_ENABLED = True if 'TRACK_DIR' not in locals(): ASKBOT_ENABLED = True if not COURSEWARE_ENABLED: diff --git a/settings_no_courseware.py b/settings_no_courseware.py new file mode 100644 index 0000000000..704afa17fc --- /dev/null +++ b/settings_no_courseware.py @@ -0,0 +1,2 @@ +COURSEWARE_ENABLED = False +execfile("settings.py") From 9682aea995dd6d5f41361f70b7528f896277e44f Mon Sep 17 00:00:00 2001 From: Piotr Mitros Date: Mon, 16 Jan 2012 21:34:16 -0500 Subject: [PATCH 5/6] Stupid typo in settings.py --- settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.py b/settings.py index 53cfae6a6a..8ab2a98df8 100644 --- a/settings.py +++ b/settings.py @@ -1,6 +1,6 @@ if 'COURSEWARE_ENABLED' not in locals(): COURSEWARE_ENABLED = True -if 'TRACK_DIR' not in locals(): +if 'ASKBOT_ENABLED' not in locals(): ASKBOT_ENABLED = True if not COURSEWARE_ENABLED: ASKBOT_ENABLED = False From 9155eedda35ad32301d7da35e5a8e2d38a3311db Mon Sep 17 00:00:00 2001 From: Piotr Mitros Date: Tue, 17 Jan 2012 13:39:49 -0500 Subject: [PATCH 6/6] manage.py has execute permissions --- manage.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 manage.py diff --git a/manage.py b/manage.py old mode 100644 new mode 100755