Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
components
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
7
Issues
7
List
Boards
Labels
Service Desk
Milestones
Iterations
Merge Requests
0
Merge Requests
0
Requirements
Requirements
List
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Test Cases
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Operations
Operations
Incidents
Environments
Packages & Registries
Packages & Registries
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issue
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Wandelwerk-Software
libraries
components
Commits
359dadcb
Commit
359dadcb
authored
Sep 17, 2020
by
Bruno Burke
😁
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' into 15-evaluation-voting-components
parents
629c1446
c89b24e9
Pipeline
#47862
passed with stages
in 2 minutes
Changes
54
Pipelines
1
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
54 changed files
with
1722 additions
and
1694 deletions
+1722
-1694
.mailmap
.mailmap
+7
-0
project.clj
project.clj
+1
-1
src/clj/lernmeister/components/css.clj
src/clj/lernmeister/components/css.clj
+9
-15
src/cljc/lernmeister/components/exercise_types/calculation/build.cljc
...nmeister/components/exercise_types/calculation/build.cljc
+17
-0
src/cljc/lernmeister/components/exercise_types/calculation/check.cljc
...nmeister/components/exercise_types/calculation/check.cljc
+47
-231
src/cljc/lernmeister/components/exercise_types/calculation/core.cljc
...rnmeister/components/exercise_types/calculation/core.cljc
+4
-2
src/cljc/lernmeister/components/exercise_types/calculation/migrate.cljc
...eister/components/exercise_types/calculation/migrate.cljc
+39
-0
src/cljc/lernmeister/components/exercise_types/calculation/migrate_answer.cljc
...components/exercise_types/calculation/migrate_answer.cljc
+32
-0
src/cljc/lernmeister/components/exercise_types/calculation/prepare.cljc
...eister/components/exercise_types/calculation/prepare.cljc
+9
-6
src/cljc/lernmeister/components/exercise_types/calculation/spec.cljc
...rnmeister/components/exercise_types/calculation/spec.cljc
+1
-2
src/cljc/lernmeister/components/exercise_types/multistep_calculation/build.cljc
...omponents/exercise_types/multistep_calculation/build.cljc
+30
-17
src/cljc/lernmeister/components/exercise_types/multistep_calculation/check.cljc
...omponents/exercise_types/multistep_calculation/check.cljc
+55
-52
src/cljc/lernmeister/components/exercise_types/multistep_calculation/migrate.cljc
...ponents/exercise_types/multistep_calculation/migrate.cljc
+12
-6
src/cljc/lernmeister/components/exercise_types/multistep_calculation/prepare.cljc
...ponents/exercise_types/multistep_calculation/prepare.cljc
+4
-4
src/cljc/lernmeister/components/helper.cljc
src/cljc/lernmeister/components/helper.cljc
+59
-1
src/cljs/lernmeister/components/common.cljs
src/cljs/lernmeister/components/common.cljs
+40
-0
src/cljs/lernmeister/components/content_editor.cljs
src/cljs/lernmeister/components/content_editor.cljs
+138
-110
src/cljs/lernmeister/components/content_elements/section/show.cljs
...lernmeister/components/content_elements/section/show.cljs
+1
-1
src/cljs/lernmeister/components/exercise_editor/general.cljs
src/cljs/lernmeister/components/exercise_editor/general.cljs
+3
-7
src/cljs/lernmeister/components/exercise_types/calchelper.cljs
...ljs/lernmeister/components/exercise_types/calchelper.cljs
+18
-14
src/cljs/lernmeister/components/exercise_types/calculation/components/migration.cljs
...ents/exercise_types/calculation/components/migration.cljs
+6
-0
src/cljs/lernmeister/components/exercise_types/calculation/views/common.cljs
...r/components/exercise_types/calculation/views/common.cljs
+9
-0
src/cljs/lernmeister/components/exercise_types/calculation/views/edit.cljs
...ter/components/exercise_types/calculation/views/edit.cljs
+219
-133
src/cljs/lernmeister/components/exercise_types/calculation/views/helper.cljs
...r/components/exercise_types/calculation/views/helper.cljs
+0
-158
src/cljs/lernmeister/components/exercise_types/calculation/views/show.cljs
...ter/components/exercise_types/calculation/views/show.cljs
+167
-133
src/cljs/lernmeister/components/exercise_types/calculation/views/unit_input.cljs
...mponents/exercise_types/calculation/views/unit_input.cljs
+0
-168
src/cljs/lernmeister/components/exercise_types/calculation/views/value_input.cljs
...ponents/exercise_types/calculation/views/value_input.cljs
+0
-86
src/cljs/lernmeister/components/exercise_types/multistep_calculation/views/common.cljs
...ts/exercise_types/multistep_calculation/views/common.cljs
+84
-56
src/cljs/lernmeister/components/exercise_types/multistep_calculation/views/edit.cljs
...ents/exercise_types/multistep_calculation/views/edit.cljs
+33
-57
src/cljs/lernmeister/components/exercise_types/multistep_calculation/views/edit_assignment_categories.cljs
...ltistep_calculation/views/edit_assignment_categories.cljs
+2
-2
src/cljs/lernmeister/components/exercise_types/multistep_calculation/views/edit_assignments.cljs
...e_types/multistep_calculation/views/edit_assignments.cljs
+2
-2
src/cljs/lernmeister/components/exercise_types/multistep_calculation/views/edit_assocs.cljs
...ercise_types/multistep_calculation/views/edit_assocs.cljs
+2
-2
src/cljs/lernmeister/components/exercise_types/multistep_calculation/views/edit_params.cljs
...ercise_types/multistep_calculation/views/edit_params.cljs
+2
-2
src/cljs/lernmeister/components/exercise_types/multistep_calculation/views/edit_steps.cljs
...xercise_types/multistep_calculation/views/edit_steps.cljs
+4
-2
src/cljs/lernmeister/components/exercise_types/multistep_calculation/views/explain_result.cljs
...ise_types/multistep_calculation/views/explain_result.cljs
+4
-0
src/cljs/lernmeister/components/exercise_types/multistep_calculation/views/show.cljs
...ents/exercise_types/multistep_calculation/views/show.cljs
+50
-47
src/cljs/lernmeister/components/exercise_types/multistep_calculation/views/show_steps.cljs
...xercise_types/multistep_calculation/views/show_steps.cljs
+26
-7
src/cljs/lernmeister/components/jshelper.cljs
src/cljs/lernmeister/components/jshelper.cljs
+0
-15
src/cljs/lernmeister/components/modal_editor/builders.cljs
src/cljs/lernmeister/components/modal_editor/builders.cljs
+38
-27
src/cljs/lernmeister/components/modal_editor/editors/formula.cljs
.../lernmeister/components/modal_editor/editors/formula.cljs
+1
-0
src/cljs/lernmeister/components/modal_editor/editors/list.cljs
...ljs/lernmeister/components/modal_editor/editors/list.cljs
+1
-0
src/cljs/lernmeister/components/modal_editor/editors/number.cljs
...s/lernmeister/components/modal_editor/editors/number.cljs
+8
-3
src/cljs/lernmeister/components/modal_editor/editors/physical_value.cljs
...ister/components/modal_editor/editors/physical_value.cljs
+1
-0
src/cljs/lernmeister/components/modal_editor/editors/range.cljs
...js/lernmeister/components/modal_editor/editors/range.cljs
+1
-0
src/cljs/lernmeister/components/modal_editor/renderers.cljs
src/cljs/lernmeister/components/modal_editor/renderers.cljs
+2
-2
src/devcards/lernmeister/components/core_card.cljs
src/devcards/lernmeister/components/core_card.cljs
+1
-1
src/devcards/lernmeister/components/exercise_calculation.cljs
...devcards/lernmeister/components/exercise_calculation.cljs
+70
-0
src/devcards/lernmeister/components/exercise_calculation_card.cljs
...rds/lernmeister/components/exercise_calculation_card.cljs
+0
-77
src/devcards/lernmeister/components/exercise_multistep_calculation.cljs
...ernmeister/components/exercise_multistep_calculation.cljs
+5
-19
test/cljc/lernmeister/components/exercise_types/calculation/answer_migrater_test.cljc
...ents/exercise_types/calculation/answer_migrater_test.cljc
+41
-0
test/cljc/lernmeister/components/exercise_types/calculation/checker_test.cljc
...r/components/exercise_types/calculation/checker_test.cljc
+228
-215
test/cljc/lernmeister/components/exercise_types/calculation/migrater_test.cljc
.../components/exercise_types/calculation/migrater_test.cljc
+170
-0
test/cljc/lernmeister/components/exercise_types/multistep_calculation/checker_test.cljc
...ts/exercise_types/multistep_calculation/checker_test.cljc
+18
-10
test/cljc/lernmeister/components/exercise_types/multistep_calculation/migrater_test.cljc
...s/exercise_types/multistep_calculation/migrater_test.cljc
+1
-1
No files found.
.mailmap
0 → 100644
View file @
359dadcb
Bruno Burke <burke@fh-muenster.de> Bruno Burke <bb756626@fb11-nx-main.fh-muenster.de>
Bruno Burke <burke@fh-muenster.de> Bruno Burke <bb756626@fh-muenster.de>
Bruno Burke <burke@fh-muenster.de> Bruno Burke <brunoburke@googlemail.com>
Bruno Burke <burke@fh-muenster.de> Bruno Burke <burke@protonmail.ch>
Joachim Schunk <schunk@fh-muenster.de> schunk <schunk@linux.fritz.box>
Joachim Schunk <schunk@fh-muenster.de> schunk <schunk@localhost.localdomain>
Joachim Schunk <schunk@fh-muenster.de> schunk <schunk@solydxk>
project.clj
View file @
359dadcb
(
defproject
lernmeister.components
"1.0.0.
1
-evaluation"
(
defproject
lernmeister.components
"1.0.0.
7
-evaluation"
:repositories
[[
"internal"
{
:url
"https://lernmeister.fh-muenster.de:8082/artifactory/libs-release"
:username
"anonymous"
}]]
:dependencies
[[
org.clojure/clojure
"1.10.0"
]
...
...
src/clj/lernmeister/components/css.clj
View file @
359dadcb
...
...
@@ -52,13 +52,13 @@
[
:.prefix
{
:grid-column
"1 / 2"
:grid-row
"2 / 4"
}]
[
:.unit
{
:grid-column
"2 / 3"
:grid-row
"2 / 4"
}]
:grid-row
"2 / 4"
}]
[
:.exponent
{
:align-self
"end"
:grid-column
"3 / 4"
:grid-row
"1 / 3"
}]
[
:.action
{
:align-self
"end"
:grid-column
"4 / 5"
:grid-row
"1 / 3"
}]]
:grid-column
"4 / 5"
:grid-row
"1 / 3"
}]]
[
:.no-border
{
:border-bottom
"none !important"
}]
[
:div.col.unit-chip
{
:border
"1px solid grey"
:border-radius
"2px"
}
...
...
@@ -171,17 +171,14 @@
[
:
&
.right-icon
{
:padding
disc-phys-val-icon-padding
:border-top-right-radius
disc-phys-val-r
:border-bottom-right-radius
disc-phys-val-r
:border-top-style
"solid"
:border-right-style
"solid"
:border-bottom-style
"solid"
}]]]
[
:div.var-config
{
:display
"flex"
:align-items
"center"
}
[
:div.symbols
{
:margin-left
"10px"
}]]
[
:div.toastbox
{
:position
:fixed
:margin-right
"1rem"
:margin-top
"1rem"
:right
"0px"
:top
"0px"
:z-index
"1000"
}
]
:z-index
"1000"
}]
[
:div.toast
{
:opacity
0
:position
:relative
...
...
@@ -189,8 +186,7 @@
:margin-top
"1rem"
:z-index
"1000"
"-webkit-transition"
"opacity 1000ms linear"
:transition
"opacity 1000ms linear"
}
:transition
"opacity 1000ms linear"
}
[
:
&
.active
{
:opacity
1
}]]
[
:div.var-select
{
:cursor
"pointer"
}
...
...
@@ -218,9 +214,8 @@
:top
"0"
:pointer-events
"none"
;;:visibility "hidden"
:background-color
"#323232"
}
]
:background-color
"#323232"
}]
[
:div.card
{
:margin
".5rem 0 1rem 0"
}]
[
:div.collapsible-component
...
...
@@ -228,8 +223,7 @@
[
:div.card
{
:margin
"0px"
}]]
[
:div.vspace
{
:height
"1.6em"
}]
)
{
:height
"1.6em"
}])
;;; TODO ul / li innerhalb von ce-section mit list-style-type: initial
...
...
src/cljc/lernmeister/components/exercise_types/calculation/build.cljc
0 → 100644
View file @
359dadcb
(
ns
lernmeister.components.exercise-types.calculation.build
(
:require
[
lernmeister.components.exercise-types.build
:as
e-build
]
[
lernmeister.components.exercise-types.calculation.migrate
:refer
[
exercise-scheme-version
migrate-exercise
]]
[
lernmeister.components.helper
:refer
[
migrate-if-necessary
]]))
(
defn
build
[
exercise
]
(
if-let
[
migrated-exercise
(
migrate-if-necessary
exercise
:exercise-scheme
"calculation"
exercise-scheme-version
migrate-exercise
)]
migrated-exercise
(
->
exercise
(
select-keys
[
:title
:id
])
(
assoc
:debug-info
"unmigrateable"
))))
(
defmethod
e-build/build
:calculation
[
exercise
&
_
]
(
build
exercise
))
src/cljc/lernmeister/components/exercise_types/calculation/check.cljc
View file @
359dadcb
(
ns
lernmeister.components.exercise-types.calculation.check
(
:require
[
clojure.string
:as
string
]
(
:require
[
lernmeister.components.exercise-types.calculation.migrate-answer
:refer
[
answer-scheme-version
migrate-answer
]]
[
lernmeister.components.exercise-types.check
:as
e-check
]
[
clojure.tools.reader.edn
:as
edn
]
[
lernmeister.components.helper
:refer
[
math-abs
]]))
(
def
prefix-mapping
{
"Y"
24
"Z"
21
"E"
18
"P"
15
"T"
12
"G"
9
"M"
6
"k"
3
"h"
2
"d"
-1
"c"
-2
"m"
-3
"µ"
-6
"n"
-9
"p"
-12
"f"
-15
"a"
-18
"z"
-21
"y"
-24
""
0
nil
0
})
(
def
si-unit-mapping
{
"m"
[{
:factor
1
:oom
0
:unit
"m"
:expo
1
}]
"g"
[{
:factor
1
:oom
-3
:unit
"kg"
:expo
1
}]
"s"
[{
:factor
1
:oom
0
:unit
"s"
:expo
1
}]
"A"
[{
:factor
1
:oom
0
:unit
"A"
:expo
1
}]
"K"
[{
:factor
1
:oom
0
:unit
"K"
:expo
1
}]
"mol"
[{
:factor
1
:oom
0
:unit
"mol"
:expo
1
}]
"cd"
[{
:factor
1
:oom
0
:unit
"cd"
:expo
1
}]
"rad"
[]
"sr"
[]
"Hz"
[{
:factor
1
:oom
0
:unit
"s"
:expo
-1
}]
"N"
[{
:factor
1
:oom
0
:unit
"m"
:expo
1
}
{
:factor
1
:oom
0
:unit
"kg"
:expo
1
}
{
:factor
1
:oom
0
:unit
"s"
:expo
-2
}]
"Pa"
[{
:factor
1
:oom
0
:unit
"m"
:expo
-1
}
{
:factor
1
:oom
0
:unit
"kg"
:expo
1
}
{
:factor
1
:oom
0
:unit
"s"
:expo
-2
}]
"J"
[{
:factor
1
:oom
0
:unit
"m"
:expo
2
}
{
:factor
1
:oom
0
:unit
"kg"
:expo
1
}
{
:factor
1
:oom
0
:unit
"s"
:expo
-2
}]
"W"
[{
:factor
1
:oom
0
:unit
"m"
:expo
2
}
{
:factor
1
:oom
0
:unit
"kg"
:expo
1
}
{
:factor
1
:oom
0
:unit
"s"
:expo
-3
}]
"C"
[{
:factor
1
:oom
0
:unit
"s"
:expo
1
}
{
:factor
1
:oom
0
:unit
"A"
:expo
1
}]
"V"
[{
:factor
1
:oom
0
:unit
"m"
:expo
2
}
{
:factor
1
:oom
0
:unit
"kg"
:expo
1
}
{
:factor
1
:oom
0
:unit
"s"
:expo
-3
}
{
:factor
1
:oom
0
:unit
"A"
:expo
-1
}]
"F"
[{
:factor
1
:oom
0
:unit
"m"
:expo
-2
}
{
:factor
1
:oom
0
:unit
"kg"
:expo
-1
}
{
:factor
1
:oom
0
:unit
"s"
:expo
4
}
{
:factor
1
:oom
0
:unit
"A"
:expo
2
}]
"Ω"
[{
:factor
1
:oom
0
:unit
"m"
:expo
2
}
{
:factor
1
:oom
0
:unit
"kg"
:expo
1
}
{
:factor
1
:oom
0
:unit
"s"
:expo
-3
}
{
:factor
1
:oom
0
:unit
"A"
:expo
-2
}]
"S"
[{
:factor
1
:oom
0
:unit
"m"
:expo
-2
}
{
:factor
1
:oom
0
:unit
"kg"
:expo
-1
}
{
:factor
1
:oom
0
:unit
"s"
:expo
3
}
{
:factor
1
:oom
0
:unit
"A"
:expo
2
}]
"Wb"
[{
:factor
1
:oom
0
:unit
"m"
:expo
2
}
{
:factor
1
:oom
0
:unit
"kg"
:expo
1
}
{
:factor
1
:oom
0
:unit
"s"
:expo
-2
}
{
:factor
1
:oom
0
:unit
"A"
:expo
-2
}]
"T"
[{
:factor
1
:oom
0
:unit
"kg"
:expo
1
}
{
:factor
1
:oom
0
:unit
"s"
:expo
-2
}
{
:factor
1
:oom
0
:unit
"A"
:expo
-1
}]
"H"
[{
:factor
1
:oom
0
:unit
"m"
:expo
2
}
{
:factor
1
:oom
0
:unit
"kg"
:expo
1
}
{
:factor
1
:oom
0
:unit
"s"
:expo
-2
}
{
:factor
1
:oom
0
:unit
"A"
:expo
-2
}]
"lm"
[{
:factor
1
:oom
0
:unit
"cd"
:expo
1
}]
"lx"
[{
:factor
1
:oom
0
:unit
"m"
:expo
-2
}
{
:factor
1
:oom
0
:unit
"cd"
:expo
1
}]
"Bq"
[{
:factor
1
:oom
0
:unit
"s"
:expo
-1
}]
"Gy"
[{
:factor
1
:oom
0
:unit
"m"
:expo
2
}
{
:factor
1
:oom
0
:unit
"s"
:expo
-2
}]
"Sv"
[{
:factor
1
:oom
0
:unit
"m"
:expo
2
}
{
:factor
1
:oom
0
:unit
"s"
:expo
-2
}]
"kat"
[{
:factor
1
:oom
0
:unit
"s"
:expo
-1
}
{
:factor
1
:oom
0
:unit
"mol"
:expo
1
}]
"h"
[{
:factor
3.6
:oom
3
:unit
"s"
:expo
1
}]
"d"
[{
:factor
8.64
:oom
4
:unit
"s"
:expo
1
}]
"l"
[{
:factor
1
:oom
-1
:unit
"m"
:expo
3
}]})
(
def
additional-unit-mappings
{
"B"
[{
:factor
1
:oom
1
:unit
"dB"
:expo
1
}]
"°"
[{
:factor
1
:oom
0
:unit
"°"
:expo
1
}]})
(
def
base-unit-set
#
{
"m"
"kg"
"s"
"A"
"K"
"mol"
"cd"
"dB"
"°"
})
(
def
unit-replace-map
{
"kg"
{
:unit
"g"
:prefix
"k"
}
"dB"
{
:unit
"B"
:prefix
"d"
}})
(
def
unit-replace-set
(
set
(
keys
unit-replace-map
)))
(
def
base-unit-map
(
reduce
(
fn
[
res-map
base-unit
]
(
assoc
res-map
(
keyword
base-unit
)
0
))
{}
base-unit-set
))
(
def
unit-mapping
(
merge
si-unit-mapping
additional-unit-mappings
))
(
def
prefix-set
(
set
(
keys
prefix-mapping
)))
(
def
unit-set
(
set
(
keys
unit-mapping
)))
(
defn
not-empty-or-minus
[
number
]
((
every-pred
#
((
complement
empty?
)
%
)
#
(
not=
"-"
%
))
number
))
(
defn
get-number-part
[{
:keys
[
number
order-of-magnitude
]}
with-oom
target
result
]
(
when
(
not-empty-or-minus
number
)
(
let
[
parsed-number
(
edn/read-string
(
string/replace
number
","
"."
))]
(
if
with-oom
(
when
(
not-empty-or-minus
order-of-magnitude
)
(
let
[
parsed-oom
(
edn/read-string
order-of-magnitude
)]
(
assoc
result
target
{
:number
parsed-number
:oom
parsed-oom
})))
(
assoc
result
target
{
:number
parsed-number
:oom
0
})))))
(
defn
reduce-to-base-units
[
outer-multiplier
result
base-unit
]
(
let
[
multiplier
(
*
outer-multiplier
(
:expo
base-unit
))
unit-key
(
keyword
(
:unit
base-unit
))
unit-factor
(
:factor
base-unit
)
unit-oom
(
:oom
base-unit
)]
(
->
result
(
update
unit-key
+
multiplier
)
(
update
:factor
*
(
Math/pow
unit-factor
multiplier
))
(
update
:oom
+
(
*
multiplier
unit-oom
)))))
(
defn
reduce-unit-mapping
[
result-map
unit
]
(
let
[
parsed-expo
(
edn/read-string
(
:expo
unit
))
prefix-oom
(
get
prefix-mapping
(
:prefix
unit
))
calculated-oom
(
*
parsed-expo
prefix-oom
)]
(
let
[
reduce-fn
(
fn
[
result
base-unit
]
((
partial
reduce-to-base-units
parsed-expo
)
result
base-unit
))]
(
reduce
reduce-fn
(
update
result-map
:oom
+
calculated-oom
)
(
get
unit-mapping
(
:unit
unit
))))))
(
defn
reduce-units
[
units
]
(
let
[
result-map
(
merge
base-unit-map
{
:factor
1
:oom
0
})]
(
reduce
reduce-unit-mapping
result-map
units
)))
(
defn
get-units-part
[
units
with-units
target
result
]
(
if
with-units
(
let
[
reduced-units
(
reduce-units
units
)
base-units
(
select-keys
reduced-units
(
reduce
(
fn
[
res
base-unit
]
(
conj
res
(
keyword
base-unit
)))
[]
base-unit-set
))
units-factor
(
:factor
reduced-units
)
units-oom
(
:oom
reduced-units
)]
(
update
result
target
merge
{
:base-units
base-units
:units-factor
units-factor
:units-oom
units-oom
}))
result
))
(
defn
compare-base-units
[
with-units
result
]
(
if
with-units
(
let
[
calc-units
(
get-in
result
[
:calc
:base-units
])
ans-units
(
get-in
result
[
:ans
:base-units
])]
(
when
(
=
calc-units
ans-units
)
result
))
[
lernmeister.components.exercise-types.multistep-calculation.check
:refer
[
check-phys-vals
tolerable-error?
]]
[
lernmeister.components.helper
:refer
[
migrate-if-necessary
]]))
(
defn
get-calculation-ids
[
exercise
]
(
reduce
(
fn
[
res
item
]
(
conj
res
(
:id
item
)))
#
{}
(
get-in
exercise
[
:core
:calculations
])))
(
defn
no-negative-points
[
result
]
(
if
(
neg?
(
:points
result
))
(
assoc
result
:points
0
)
result
))
(
defn
compare-numbers
[
with-oom
with-units
error-factor
result
]
(
let
[
get-combined-number
(
fn
[
oom-key
]
(
let
[
number
(
get-in
result
[
oom-key
:number
])]
(
if
with-units
(
let
[
units-factor
(
get-in
result
[
oom-key
:units-factor
])]
(
*
number
units-factor
))
number
)))
get-combined-oom
(
fn
[
oom-key
]
(
let
[
units-oom
(
get-in
result
[
oom-key
:units-oom
]
0
)]
(
if
with-oom
(
let
[
oom
(
get-in
result
[
oom-key
:oom
])]
(
+
oom
units-oom
))
units-oom
)))]
(
let
[
calc-number
(
get-combined-number
:calc
)
ans-number
(
get-combined-number
:ans
)
calc-oom
(
get-combined-oom
:calc
)
ans-oom
(
get-combined-oom
:ans
)
oom-difference
(
-
calc-oom
ans-oom
)
calc-multiplier
(
Math/pow
10
oom-difference
)]
(
when
(
<=
(
math-abs
(
-
ans-number
(
*
calc-multiplier
calc-number
)))
(
math-abs
(
*
error-factor
ans-number
)))
true
))))
(
defn
check-answer
[
cur-calc
cur-ans
&
{
:keys
[
with-oom
with-units
]}]
(
let
[
error-factor
(
/
(
:error-relative
cur-calc
1
)
100
)]
;;is it okay to keep this as ratio-datatype?
(
some->>
{}
(
get-number-part
cur-calc
with-oom
:calc
)
(
get-number-part
cur-ans
with-oom
:ans
)
(
get-units-part
(
:units
cur-calc
)
with-units
:calc
)
(
get-units-part
(
:units
cur-ans
)
with-units
:ans
)
(
compare-base-units
with-units
)
(
compare-numbers
with-oom
with-units
error-factor
))))
(
defn
check-calculation
[
id
ans-obj
ex-obj
res-map
with-oom
with-units
]
(
let
[
phys-val-check-res
(
check-phys-vals
ex-obj
ans-obj
:with-oom
with-oom
:with-units
with-units
)
is-correct?
(
tolerable-error?
(
:calculation-error
phys-val-check-res
)
(
or
(
:error-relative
ex-obj
)
1
))]
(
assoc
res-map
id
{
:correct
is-correct?
:points
(
if
is-correct?
(
:correct-points
ex-obj
)
(
:incorrect-points
ex-obj
))
:points-max
(
:correct-points
ex-obj
)})))
(
defn
calculation-check
[
exercise
answer
callback
]
(
let
[
no-negative-points
(
fn
[
result
]
(
if
(
neg?
(
:points
result
))
(
assoc
result
:points
0
)
result
))]
(
let
[
core
(
:core
exercise
)
calculations
(
:calculations
core
)
with-oom
(
:with-oom
core
)
with-units
(
:with-units
core
)]
(
callback
)
(
->>
(
map
(
fn
[
calculation
]
(
let
[
cur-correct-points
(
:correct-points
calculation
)
cur-incorrect-points
(
:incorrect-points
calculation
)
cur-id
(
:id
calculation
)
cur-answer
(
get
answer
cur-id
)]
(
if
(
and
cur-answer
(
check-answer
calculation
cur-answer
:with-oom
with-oom
:with-units
with-units
))
{
:points
cur-correct-points
:points-max
cur-correct-points
:correct-id
cur-id
}
{
:points
cur-incorrect-points
:points-max
cur-correct-points
})))
calculations
)
(
reduce
(
fn
[
result
cur-result
]
(
let
[
update-correct-calculations
(
fn
[
result
]
(
if
(
contains?
cur-result
:correct-id
)
(
update
result
:correct-calculations
conj
(
:correct-id
cur-result
))
result
))]
(
->
result
(
update
:points
+
(
:points
cur-result
))
(
update
:points-max
+
(
:points-max
cur-result
))
update-correct-calculations
)))
{
:points
0
:points-max
0
:correct-calculations
#
{}})
no-negative-points
))))
(
let
[
answer-calculations
(
:calculations
answer
)
calculations
(
get-in
exercise
[
:core
:calculations
])
with-oom
(
get-in
exercise
[
:core
:with-oom
])
with-units
(
get-in
exercise
[
:core
:with-units
])
res-map
(
reduce
(
fn
[
r-map
calculation
]
(
let
[
id
(
:id
calculation
)
answer
(
get
answer-calculations
id
)]
(
check-calculation
id
answer
calculation
r-map
with-oom
with-units
)))
{}
calculations
)
update-correct-calcs
(
fn
[
result
id
calculation-check
]
(
if
(
:correct
calculation-check
)
(
update
result
:correct-calculations
conj
id
)
result
))]
(
callback
)
(
->>
res-map
(
reduce-kv
(
fn
[
result
k
v
]
(
->
result
(
update
:points
+
(
:points
v
))
(
update
:points-max
+
(
:points-max
v
))
(
update-correct-calcs
k
v
)))
{
:points
0
:points-max
0
:correct-calculations
#
{}})
no-negative-points
)))
(
defmethod
e-check/check-answer
:calculation
[
exercise
answer
callback
]
(
calculation-check
exercise
answer
callback
))
(
let
[
calculation-ids
(
get-calculation-ids
exercise
)
migrated-answer
(
migrate-if-necessary
answer
:answer-scheme
"calculation"
answer-scheme-version
(
partial
migrate-answer
calculation-ids
))]
(
calculation-check
exercise
migrated-answer
callback
)))
src/cljc/lernmeister/components/exercise_types/calculation/core.cljc
View file @
359dadcb
...
...
@@ -2,12 +2,14 @@
#
?
(
:clj
(
:require
[
lernmeister.components.exercise-types.calculation.spec
:as
spec
]
[
lernmeister.components.exercise-types.calculation.check
:as
check
]
[
lernmeister.components.exercise-types.calculation.prepare
:as
prepare
])
[
lernmeister.components.exercise-types.calculation.prepare
:as
prepare
]
[
lernmeister.components.exercise-types.calculation.build
:as
build
])
:cljs
(
:require
[
reagent.core
:as
reagent
]
[
lernmeister.components.content-elements.core
:as
content-manager
]
[
lernmeister.components.exercise-types.calculation.spec
:as
spec
]
[
lernmeister.components.exercise-types.calculation.prepare
:as
prepare
]
[
lernmeister.components.exercise-types.calculation.build
:as
build
]
[
lernmeister.components.exercise-types.calculation.check
:as
check
]
[
lernmeister.components.exercise-types.calculation.views.edit
:as
edit-view
]
[
lernmeister.components.exercise-types.calculation.views.show
:as
show-view
])))
...
...
@@ -17,7 +19,7 @@
:edit
{
:settings
#
?
(
:cljs
edit-view/settings
:clj
nil
)
:additional-forms
#
?
(
:cljs
edit-view/additional-forms
:clj
nil
)}
:prepare
prepare/prepare
:build
build/build
:renderer
#
?
(
:cljs
show-view/exercise-renderer
:clj
nil
)
:checker
check/calculation-check
:spec
::spec/calculation-question
})
src/cljc/lernmeister/components/exercise_types/calculation/migrate.cljc
0 → 100644
View file @
359dadcb
(
ns
lernmeister.components.exercise-types.calculation.migrate
(
:require
[
lernmeister.components.exercise-types.multistep-calculation.migrate
:refer
[
convert-number-to-object
modify-exercise-field-vec
set-current-scheme
]]))
(
def
exercise-scheme-version
"2020-09-07"
)
(
defn
modify-calculations
[
exercise
]
(
partial
modify-exercise-field-vec
exercise
[
:core
:calculations
]))
(
defn
set-missing-error-relative
[
exercise
]
((
modify-calculations
exercise
)
#
(
assoc
%
:error-relative
(
or
(
:error-relative
%
)
1
))))
(
defn
convert-numbers
[
exercise
]
((
modify-calculations
exercise
)
convert-number-to-object
))
(
defn
normalize-units
[
exercise
]
(
if
(
get-in
exercise
[
:core
:with-units
])
((
modify-calculations
exercise
)
#
(
assoc
%
:units
(
or
(
:units
%
)
[])))
((
modify-calculations
exercise
)
#
(
dissoc
%
:units
))))
(
defn
remove-unneeded-ooms
[
exercise
]
(
if-not
(
get-in
exercise
[
:core
:with-oom
])
((
modify-calculations
exercise
)
#
(
dissoc
%
:order-of-magnitude
))
exercise
))
(
defn
remove-unneeded-error-keys
[
exercise
]
((
modify-calculations
exercise
)
#
(
dissoc
%
:error
)))
(
defn
migrate-exercise
[
exercise
]
(
->>
exercise
remove-unneeded-error-keys
remove-unneeded-ooms
normalize-units
convert-numbers
set-missing-error-relative
(
set-current-scheme
"calculation"
exercise-scheme-version
)))
src/cljc/lernmeister/components/exercise_types/calculation/migrate_answer.cljc
0 → 100644
View file @
359dadcb
(
ns
lernmeister.components.exercise-types.calculation.migrate-answer
(
:require
[
clojure.set
:refer
[
difference
]]
[
lernmeister.components.exercise-types.multistep-calculation.migrate
:refer
[
convert-number-to-object
migrate-object
]]))
(
def
answer-scheme-version
"2020-09-07"
)
(
defn
set-current-scheme
[
answer
]
(
assoc
answer
:answer-scheme
{
:type
"calculation"
:version
answer-scheme-version
}))
(
defn
convert-calculation-numbers
[
answer
]
(
update
answer
:calculations
(
fn
[
calcs
]
(
migrate-object
convert-number-to-object
calcs
))))
(
defn
add-missing-calculation-objects
[
calculation-ids
answer
]
(
let
[
calculations
(
:calculations
answer
)
missing-ids
(
difference
calculation-ids
(
set
(
keys
calculations
)))]
(
update
answer
:calculations
(
fn
[
calcs
]
(
reduce
(
fn
[
res
k
]
(
assoc
res
k
{
:number
nil
}))
calcs
missing-ids
)))))
(
defn
wrap-answer-calculations
[
answer
]
(
if-not
(
contains?
answer
:calculations
)
(
let
[
wrapped-answer
{}]
(
assoc
wrapped-answer
:calculations
answer
))
answer
))
(
defn
migrate-answer
[
calculation-ids
answer
]
(
->>
answer
wrap-answer-calculations
(
add-missing-calculation-objects
calculation-ids
)
convert-calculation-numbers
set-current-scheme
))
src/cljc/lernmeister/components/exercise_types/calculation/prepare.cljc
View file @
359dadcb
...
...
@@ -2,8 +2,11 @@
(
:require
[
lernmeister.components.exercise-types.prepare
:as
e-prepare
]))
(
defn
select-exercise-keys
[
exercise
]
(
update-in
exercise
[
:core
]
#
(
select-keys
%
[
:with-oom
:with-units
:type
:task-description
:calculations
])))
(
select-keys
exercise
[
:title
:id
:type
:core
:exercise-scheme
]))
(
defn
select-core-keys
[
exercise
]
(
update
exercise
:core
#
(
select-keys
%
[
:with-oom
:with-units
:type
:task-description
:calculations
:unit-list
])))
(
defn
shuffle-calculations
[
exercise
]
(
if
(
get-in
exercise
[
:core
:shuffled
])
...
...
@@ -12,7 +15,7 @@
exercise
))
(
defn
prep-calc
[
calculation
]
(
select-keys
calculation
[
:id
:name
:number
:order-of-magnitude
:units
]))
(
select-keys
calculation
[
:id
:name
]))
(
defn
prep-calcs
[
exercise
]
(
let
[
preped-calcs
(
into
[]
(
map
prep-calc
(
get-in
exercise
[
:core
:calculations
])))]
...
...
@@ -23,8 +26,8 @@
exercise
prep-calcs
shuffle-calculations
select-core-keys
select-exercise-keys
))
(
defmethod
e-prepare/prepare
:calculation
[
exercise
&
[
options
]]
(
prepare
exercise
))
(
defmethod
e-prepare/prepare
:calculation
[
exercise-build
&
_
]
(
prepare
exercise-build
))
src/cljc/lernmeister/components/exercise_types/calculation/spec.cljc
View file @
359dadcb
(
ns
lernmeister.components.exercise-types.calculation.spec
(
:require
#
?
(
:cljs
[
cljs.spec.alpha
:as
s
]
:clj
[
clojure.spec.alpha
:as
s
])
[
lernmeister.components.exercise-types.calculation.check
:refer
[
prefix-set
unit-set
]]))
[
lernmeister.components.exercise-types.
multistep-
calculation.check
:refer
[
prefix-set
unit-set
]]))
(
s/def
:calculation/name
(
s/and
string?
#
(
not
(
empty?
%
))))
(
s/def
:calculation/number
(
s/and
string?
#
(
re-matches
#
"^\-?((((0\,)|([1-9]\d*\,?))\d*)|0)$"
%
)))
...
...
@@ -27,4 +27,3 @@
:exercise/task-description
:exercise/shuffled
]))
(
s/def
::calculation-question
(
s/keys
:req-un
[
:calculation-question/core
]))
src/cljc/lernmeister/components/exercise_types/multistep_calculation/build.cljc
View file @
359dadcb
(
ns
lernmeister.components.exercise-types.multistep-calculation.build
(
:require
[
lernmeister.components.exercise-types.multistep-calculation.check
:refer
[
mathjs-number-from-number-obj
mathjs-str-to-number-obj
mathjs-eval-and-format
number-obj
]]
[
lernmeister.components.exercise-types.build
:as
e-build
]))
(
:require
[
lernmeister.components.exercise-types.build
:as
e-build
]
[
lernmeister.components.exercise-types.multistep-calculation.check