code-battles 1.7.0 → 1.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/dist/cjs/index.js +2153 -1954
  2. package/dist/cjs/styles.css +2 -1
  3. package/dist/cjs/types/components/DataTable.d.ts +21 -0
  4. package/dist/cjs/types/components/ResultStaticsTable.d.ts +3 -0
  5. package/dist/cjs/types/configuration.d.ts +0 -1
  6. package/dist/code_battles/battles.py +22 -9
  7. package/dist/code_battles/utilities.py +5 -1
  8. package/dist/esm/index.js +2154 -1955
  9. package/dist/esm/styles.css +2 -1
  10. package/dist/esm/types/components/DataTable.d.ts +21 -0
  11. package/dist/esm/types/components/ResultStaticsTable.d.ts +3 -0
  12. package/dist/esm/types/configuration.d.ts +0 -1
  13. package/dist/index.d.ts +0 -1
  14. package/dist/pyscript/codemirror-eKulCBrd.js +2 -0
  15. package/dist/pyscript/codemirror-eKulCBrd.js.map +1 -0
  16. package/dist/pyscript/codemirror_commands-BVu_0Pnj.js +2 -0
  17. package/dist/pyscript/codemirror_commands-BVu_0Pnj.js.map +1 -0
  18. package/dist/pyscript/codemirror_lang-python-a2LxSo5G.js +2 -0
  19. package/dist/pyscript/codemirror_lang-python-a2LxSo5G.js.map +1 -0
  20. package/dist/pyscript/codemirror_language-_2pXlKJ9.js +2 -0
  21. package/dist/pyscript/codemirror_language-_2pXlKJ9.js.map +1 -0
  22. package/dist/pyscript/codemirror_view-DMW9kQlJ.js +2 -0
  23. package/dist/pyscript/codemirror_view-DMW9kQlJ.js.map +1 -0
  24. package/dist/pyscript/core-DezwbZpG.js +4 -0
  25. package/dist/pyscript/core-DezwbZpG.js.map +1 -0
  26. package/dist/pyscript/core.js +1 -1
  27. package/dist/pyscript/deprecations-manager-B1bDno27.js +2 -0
  28. package/dist/pyscript/deprecations-manager-B1bDno27.js.map +1 -0
  29. package/dist/pyscript/donkey-DNl0ASkM.js +2 -0
  30. package/dist/pyscript/donkey-DNl0ASkM.js.map +1 -0
  31. package/dist/pyscript/error-DmRE4Y-7.js +2 -0
  32. package/dist/pyscript/error-DmRE4Y-7.js.map +1 -0
  33. package/dist/pyscript/index-DkgvWIf-.js +2 -0
  34. package/dist/pyscript/index-DkgvWIf-.js.map +1 -0
  35. package/dist/pyscript/mpy-BoY0tVRD.js +2 -0
  36. package/dist/pyscript/mpy-BoY0tVRD.js.map +1 -0
  37. package/dist/pyscript/py-DsQqgZuM.js +2 -0
  38. package/dist/pyscript/py-DsQqgZuM.js.map +1 -0
  39. package/dist/pyscript/py-editor-DZkG_or6.js +2 -0
  40. package/dist/pyscript/py-editor-DZkG_or6.js.map +1 -0
  41. package/dist/pyscript/py-game-D0Z4YnzZ.js +2 -0
  42. package/dist/pyscript/py-game-D0Z4YnzZ.js.map +1 -0
  43. package/dist/pyscript/py-terminal-DYHK7LJ0.js +2 -0
  44. package/dist/pyscript/py-terminal-DYHK7LJ0.js.map +1 -0
  45. package/dist/pyscript/service-worker.js +1 -0
  46. package/dist/pyscript/storage.js +1 -1
  47. package/dist/pyscript/storage.js.map +1 -1
  48. package/dist/pyscript/xterm-CVv2fC4I.js +2 -0
  49. package/dist/pyscript/xterm-CVv2fC4I.js.map +1 -0
  50. package/dist/pyscript/zip-D13-hp9W.js +2 -0
  51. package/dist/pyscript/zip-D13-hp9W.js.map +1 -0
  52. package/package.json +14 -14
@@ -2,4 +2,5 @@
2
2
  pre[class*="language-"].line-numbers{position:relative;padding-left:3.8em;counter-reset:linenumber;}pre[class*="language-"].line-numbers>code{position:relative;white-space:inherit;}.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:0;font-size:100%;left:-3.8em;width:3em;letter-spacing:-1px;border-right:1px solid #999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;}.line-numbers-rows>span{display:block;counter-increment:linenumber;}.line-numbers-rows>span:before{content:counter(linenumber);color:#999;display:block;padding-right:0.8em;text-align:right;}
3
3
  code[class*="language-"],pre[class*="language-"]{color:black;background:none;text-shadow:0 1px white;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;}pre[class*="language-"]::-moz-selection,pre[class*="language-"] ::-moz-selection,code[class*="language-"]::-moz-selection,code[class*="language-"] ::-moz-selection{text-shadow:none;background:#b3d4fc;}pre[class*="language-"]::selection,pre[class*="language-"] ::selection,code[class*="language-"]::selection,code[class*="language-"] ::selection{text-shadow:none;background:#b3d4fc;}@media print{code[class*="language-"],pre[class*="language-"]{text-shadow:none;}}pre[class*="language-"]{padding:1em;margin:.5em 0;overflow:auto;}:not(pre)>code[class*="language-"],pre[class*="language-"]{background:#f5f2f0;}:not(pre)>code[class*="language-"]{padding:.1em;border-radius:.3em;white-space:normal;}.token.comment,.token.prolog,.token.doctype,.token.cdata{color:slategray;}.token.punctuation{color:#999;}.token.namespace{opacity:.7;}.token.property,.token.tag,.token.boolean,.token.number,.token.constant,.token.symbol,.token.deleted{color:#905;}.token.selector,.token.attr-name,.token.string,.token.char,.token.builtin,.token.inserted{color:#690;}.token.operator,.token.entity,.token.url,.language-css .token.string,.style .token.string{color:#9a6e3a;background:hsla(0,0%,100%,.5);}.token.atrule,.token.attr-value,.token.keyword{color:#07a;}.token.function,.token.class-name{color:#DD4A68;}.token.regex,.token.important,.token.variable{color:#e90;}.token.important,.token.bold{font-weight:bold;}.token.italic{font-style:italic;}.token.entity{cursor:help;}
4
4
  py-config,py-script,py-splashscreen,.py-error{display:none;}h1,h2,h3,h4,h5,h6,p{margin:0;}
5
- .token.operator{background:inherit !important;}pre[class*="language-"],code[class*="language-"]{color:#d4d4d4;font-size:13px;text-shadow:none;font-family:Menlo,Monaco,Consolas,"Andale Mono","Ubuntu Mono","Courier New",monospace;direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;}pre[class*="language-"]::selection,code[class*="language-"]::selection,pre[class*="language-"] *::selection,code[class*="language-"] *::selection{text-shadow:none;background:#264f78;}@media print{pre[class*="language-"],code[class*="language-"]{text-shadow:none;}}pre[class*="language-"]{padding:1em;margin:0.5em 0;overflow:auto;background:#1e1e1e;}:not(pre)>code[class*="language-"]{padding:0.1em 0.3em;border-radius:0.3em;color:#db4c69;background:#1e1e1e;}.namespace{opacity:0.7;}.token.doctype .token.doctype-tag{color:#569cd6;}.token.doctype .token.name{color:#9cdcfe;}.token.comment,.token.prolog{color:#6a9955;}.token.punctuation,.language-html .language-css .token.punctuation,.language-html .language-javascript .token.punctuation{color:#d4d4d4;}.token.property,.token.tag,.token.boolean,.token.number,.token.constant,.token.symbol,.token.inserted,.token.unit{color:#b5cea8;}.token.selector,.token.attr-name,.token.string,.token.char,.token.builtin,.token.deleted{color:#ce9178;}.language-css .token.string.url{text-decoration:underline;}.token.operator,.token.entity{color:#d4d4d4;}.token.operator.arrow{color:#569cd6;}.token.atrule{color:#ce9178;}.token.atrule .token.rule{color:#c586c0;}.token.atrule .token.url{color:#9cdcfe;}.token.atrule .token.url .token.function{color:#dcdcaa;}.token.atrule .token.url .token.punctuation{color:#d4d4d4;}.token.keyword{color:#569cd6;}.token.keyword.module,.token.keyword.control-flow{color:#c586c0;}.token.function,.token.function .token.maybe-class-name{color:#dcdcaa;}.token.regex{color:#d16969;}.token.important{color:#569cd6;}.token.italic{font-style:italic;}.token.constant{color:#9cdcfe;}.token.class-name,.token.maybe-class-name{color:#4ec9b0;}.token.console{color:#9cdcfe;}.token.parameter{color:#9cdcfe;}.token.interpolation{color:#9cdcfe;}.token.punctuation.interpolation-punctuation{color:#569cd6;}.token.boolean{color:#569cd6;}.token.property,.token.variable,.token.imports .token.maybe-class-name,.token.exports .token.maybe-class-name{color:#9cdcfe;}.token.selector{color:#d7ba7d;}.token.escape{color:#d7ba7d;}.token.tag{color:#569cd6;}.token.tag .token.punctuation{color:#808080;}.token.cdata{color:#808080;}.token.attr-name{color:#9cdcfe;}.token.attr-value,.token.attr-value .token.punctuation{color:#ce9178;}.token.attr-value .token.punctuation.attr-equals{color:#d4d4d4;}.token.entity{color:#569cd6;}.token.namespace{color:#4ec9b0;}pre[class*="language-javascript"],code[class*="language-javascript"],pre[class*="language-jsx"],code[class*="language-jsx"],pre[class*="language-typescript"],code[class*="language-typescript"],pre[class*="language-tsx"],code[class*="language-tsx"]{color:#9cdcfe;}pre[class*="language-css"],code[class*="language-css"]{color:#ce9178;}pre[class*="language-html"],code[class*="language-html"]{color:#d4d4d4;}.language-regex .token.anchor{color:#dcdcaa;}.language-html .token.punctuation{color:#808080;}pre[class*="language-"]>code[class*="language-"]{position:relative;z-index:1;}.line-highlight.line-highlight{background:#f7ebc6;box-shadow:inset 5px 0 0 #f7d87c;z-index:0;}
5
+ .token.operator{background:inherit !important;}pre[class*="language-"],code[class*="language-"]{color:#d4d4d4;font-size:13px;text-shadow:none;font-family:Menlo,Monaco,Consolas,"Andale Mono","Ubuntu Mono","Courier New",monospace;direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;}pre[class*="language-"]::selection,code[class*="language-"]::selection,pre[class*="language-"] *::selection,code[class*="language-"] *::selection{text-shadow:none;background:#264f78;}@media print{pre[class*="language-"],code[class*="language-"]{text-shadow:none;}}pre[class*="language-"]{padding:1em;margin:0.5em 0;overflow:auto;background:#1e1e1e;}:not(pre)>code[class*="language-"]{padding:0.1em 0.3em;border-radius:0.3em;color:#db4c69;background:#1e1e1e;}.namespace{opacity:0.7;}.token.doctype .token.doctype-tag{color:#569cd6;}.token.doctype .token.name{color:#9cdcfe;}.token.comment,.token.prolog{color:#6a9955;}.token.punctuation,.language-html .language-css .token.punctuation,.language-html .language-javascript .token.punctuation{color:#d4d4d4;}.token.property,.token.tag,.token.boolean,.token.number,.token.constant,.token.symbol,.token.inserted,.token.unit{color:#b5cea8;}.token.selector,.token.attr-name,.token.string,.token.char,.token.builtin,.token.deleted{color:#ce9178;}.language-css .token.string.url{text-decoration:underline;}.token.operator,.token.entity{color:#d4d4d4;}.token.operator.arrow{color:#569cd6;}.token.atrule{color:#ce9178;}.token.atrule .token.rule{color:#c586c0;}.token.atrule .token.url{color:#9cdcfe;}.token.atrule .token.url .token.function{color:#dcdcaa;}.token.atrule .token.url .token.punctuation{color:#d4d4d4;}.token.keyword{color:#569cd6;}.token.keyword.module,.token.keyword.control-flow{color:#c586c0;}.token.function,.token.function .token.maybe-class-name{color:#dcdcaa;}.token.regex{color:#d16969;}.token.important{color:#569cd6;}.token.italic{font-style:italic;}.token.constant{color:#9cdcfe;}.token.class-name,.token.maybe-class-name{color:#4ec9b0;}.token.console{color:#9cdcfe;}.token.parameter{color:#9cdcfe;}.token.interpolation{color:#9cdcfe;}.token.punctuation.interpolation-punctuation{color:#569cd6;}.token.boolean{color:#569cd6;}.token.property,.token.variable,.token.imports .token.maybe-class-name,.token.exports .token.maybe-class-name{color:#9cdcfe;}.token.selector{color:#d7ba7d;}.token.escape{color:#d7ba7d;}.token.tag{color:#569cd6;}.token.tag .token.punctuation{color:#808080;}.token.cdata{color:#808080;}.token.attr-name{color:#9cdcfe;}.token.attr-value,.token.attr-value .token.punctuation{color:#ce9178;}.token.attr-value .token.punctuation.attr-equals{color:#d4d4d4;}.token.entity{color:#569cd6;}.token.namespace{color:#4ec9b0;}pre[class*="language-javascript"],code[class*="language-javascript"],pre[class*="language-jsx"],code[class*="language-jsx"],pre[class*="language-typescript"],code[class*="language-typescript"],pre[class*="language-tsx"],code[class*="language-tsx"]{color:#9cdcfe;}pre[class*="language-css"],code[class*="language-css"]{color:#ce9178;}pre[class*="language-html"],code[class*="language-html"]{color:#d4d4d4;}.language-regex .token.anchor{color:#dcdcaa;}.language-html .token.punctuation{color:#808080;}pre[class*="language-"]>code[class*="language-"]{position:relative;z-index:1;}.line-highlight.line-highlight{background:#f7ebc6;box-shadow:inset 5px 0 0 #f7d87c;z-index:0;}
6
+ .control{width:100%;padding:10px;cursor:pointer;}.control:hover{background-color:light-dark(var(--mantine-color-gray-0),var(--mantine-color-dark-6));}
@@ -0,0 +1,21 @@
1
+ import React from "react";
2
+ import "./DataTable.css";
3
+ export interface DataTableData {
4
+ head: string[];
5
+ body: string[][];
6
+ }
7
+ declare const DataTable: ({ tableName, data, renderValue, renderHead, disableSort, hideIfEmpty, selectable, selectedRows, setSelectedRows, defaultSort, defaultReversed, stickyFirstColumn, }: {
8
+ tableName: string;
9
+ data: DataTableData;
10
+ renderValue?: (rowIndex: number, columnName: string, value: string) => React.ReactNode;
11
+ renderHead?: (columnName: string, columnIndex: number) => React.ReactNode;
12
+ disableSort?: boolean;
13
+ hideIfEmpty?: boolean;
14
+ selectable?: boolean;
15
+ selectedRows?: number[];
16
+ setSelectedRows?: React.Dispatch<React.SetStateAction<number[]>>;
17
+ defaultSort?: number;
18
+ defaultReversed?: boolean;
19
+ stickyFirstColumn?: boolean;
20
+ }) => React.JSX.Element;
21
+ export default DataTable;
@@ -0,0 +1,3 @@
1
+ import React from "react";
2
+ declare const ResultStatisticsTable: () => React.JSX.Element;
3
+ export default ResultStatisticsTable;
@@ -9,7 +9,6 @@ interface CodeBattlesDatesConfiguration {
9
9
  locale?: string;
10
10
  firstDayOfWeek?: DayOfWeek;
11
11
  weekendDays?: DayOfWeek[];
12
- timezone?: string;
13
12
  }
14
13
  interface CodeBattlesOptionalConfiguration {
15
14
  primaryColor: string;
@@ -10,7 +10,7 @@ import traceback
10
10
  import typing
11
11
  from dataclasses import dataclass
12
12
  from random import Random
13
- from typing import Any, Dict, Generic, List, Optional, Set, Tuple, TypeVar
13
+ from typing import Any, Dict, Generic, List, Optional, Set, Tuple, TypeVar, Union
14
14
  from urllib.parse import quote
15
15
 
16
16
  from code_battles.utilities import (
@@ -235,6 +235,15 @@ class CodeBattles(
235
235
 
236
236
  pass
237
237
 
238
+ def get_statistics(self) -> Dict[str, Union[int, float]]:
239
+ """
240
+ Optional method to return statistics, called after the game ends.
241
+
242
+ When running multiple no UI simulations, you can use this to view the simulations in a table.
243
+ """
244
+
245
+ return {}
246
+
238
247
  def configure_extra_width(self) -> int:
239
248
  """Optionally add extra height to the right of the boards. 0 by default."""
240
249
 
@@ -1015,15 +1024,13 @@ class CodeBattles(
1015
1024
  document.getElementById("playpause").click()
1016
1025
 
1017
1026
  @web_only
1018
- def _step(self):
1019
- from js import document, setTimeout
1020
- from pyscript.ffi import create_proxy
1027
+ async def _step(self):
1028
+ from js import document
1021
1029
 
1022
1030
  if not self.over:
1023
1031
  if len(self._decisions) == self._decision_index:
1024
- print("Warning: sleeping because decisions were not made yet!")
1025
- setTimeout(create_proxy(self._step), 100)
1026
- return
1032
+ await asyncio.sleep(0.01)
1033
+ return await self._step()
1027
1034
  else:
1028
1035
  logs = self._logs[self._decision_index]
1029
1036
  for log in logs:
@@ -1045,7 +1052,12 @@ class CodeBattles(
1045
1052
  if len(self.active_players) == 1:
1046
1053
  self._eliminated.append(self.active_players[0])
1047
1054
  set_results(
1048
- self.player_names, self._eliminated[::-1], self.parameters, self.verbose
1055
+ self.player_names,
1056
+ self._seed,
1057
+ self._eliminated[::-1],
1058
+ self.get_statistics(),
1059
+ self.parameters,
1060
+ self.verbose,
1049
1061
  )
1050
1062
  if not self.background:
1051
1063
  self.render()
@@ -1123,9 +1135,10 @@ class CodeBattles(
1123
1135
  while self._should_play():
1124
1136
  start = time.time()
1125
1137
  try:
1126
- self._step()
1138
+ await self._step()
1127
1139
  except Exception:
1128
1140
  traceback.print_exc()
1141
+
1129
1142
  if not self.background:
1130
1143
  await asyncio.sleep(
1131
1144
  max(
@@ -75,7 +75,9 @@ def show_alert(
75
75
  @web_only
76
76
  def set_results(
77
77
  player_names: List[str],
78
+ seed: int,
78
79
  places: List[int],
80
+ statistics: Dict[str, Union[float, int]],
79
81
  parameters: Dict[str, str],
80
82
  verbose: bool,
81
83
  ):
@@ -83,7 +85,9 @@ def set_results(
83
85
 
84
86
  if hasattr(window, "setResults"):
85
87
  try:
86
- window.setResults(player_names, places, parameters, verbose)
88
+ window.setResults(
89
+ player_names, str(seed), places, statistics, parameters, verbose
90
+ )
87
91
  except Exception as e:
88
92
  print(e)
89
93