kaggle-environments 1.17.12__py2.py3-none-any.whl → 1.18.0__py2.py3-none-any.whl

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.

Potentially problematic release.


This version of kaggle-environments might be problematic. Click here for more details.

@@ -15,7 +15,7 @@
15
15
  import argparse
16
16
  import json
17
17
  import traceback
18
- from typing import *
18
+ from typing import Optional
19
19
  from . import errors, utils
20
20
  from .agent import Agent
21
21
  from .core import environments, evaluate, make
@@ -27,12 +27,9 @@ parser.add_argument(
27
27
  choices=["list", "evaluate", "run", "step", "load", "act", "dispose", "http-server"],
28
28
  help="List environments. Evaluate many episodes. Run a single episode. Step the environment. Load the environment. Start http server.",
29
29
  )
30
- parser.add_argument("--environment", type=str,
31
- help="Environment to run against.")
30
+ parser.add_argument("--environment", type=str, help="Environment to run against.")
32
31
  parser.add_argument("--debug", type=bool, help="Print debug statements.")
33
- parser.add_argument(
34
- "--agents", type=str, nargs="*", help="Agent(s) to run with the environment."
35
- )
32
+ parser.add_argument("--agents", type=str, nargs="*", help="Agent(s) to run with the environment.")
36
33
  parser.add_argument(
37
34
  "--configuration",
38
35
  type=json.loads,
@@ -58,9 +55,7 @@ parser.add_argument(
58
55
  type=json.loads,
59
56
  help="Single agent state used for evaluation (default={}).",
60
57
  )
61
- parser.add_argument(
62
- "--episodes", type=int, help="Number of episodes to evaluate (default=1)"
63
- )
58
+ parser.add_argument("--episodes", type=int, help="Number of episodes to evaluate (default=1)")
64
59
  parser.add_argument(
65
60
  "--render",
66
61
  type=json.loads,
@@ -71,28 +66,21 @@ parser.add_argument(
71
66
  type=str,
72
67
  help="Shortcut to the --render {mode=''} argument (default json).",
73
68
  )
74
- parser.add_argument(
75
- "--port", type=int, help="http-server Port (default=8000)."
76
- )
77
- parser.add_argument(
78
- "--host", type=str, help="http-server Host (default=127.0.0.1)."
79
- )
80
- parser.add_argument(
81
- "--in", type=str, help="Episode replay file to load. Only works when the action is load."
82
- )
69
+ parser.add_argument("--port", type=int, help="http-server Port (default=8000).")
70
+ parser.add_argument("--host", type=str, help="http-server Host (default=127.0.0.1).")
71
+ parser.add_argument("--in", type=str, help="Episode replay file to load. Only works when the action is load.")
83
72
  parser.add_argument(
84
73
  "--out", type=str, help="Output file to write the results of the episode. Does nothing in http-server mode."
85
74
  )
86
75
  parser.add_argument(
87
- "--log", type=str, help="Agent log file to write the std out, resource, and step timing for each agent. Also used to load logs from a file with the load action."
76
+ "--log",
77
+ type=str,
78
+ help="Agent log file to write the std out, resource, and step timing for each agent. Also used to load logs from a file with the load action.",
88
79
  )
89
80
 
90
81
 
91
82
  def render(args, env):
92
- mode = \
93
- args.display \
94
- if args.display is not None \
95
- else utils.get(args.render, str, "json", path=["mode"])
83
+ mode = args.display if args.display is not None else utils.get(args.render, str, "json", path=["mode"])
96
84
 
97
85
  if mode == "human" or mode == "ansi" or mode == "txt":
98
86
  args.render["mode"] = "ansi"
@@ -111,11 +99,7 @@ def action_list(args):
111
99
 
112
100
 
113
101
  def action_evaluate(args):
114
- return json.dumps(
115
- evaluate(
116
- args.environment, args.agents, args.configuration, args.steps, args.episodes
117
- )
118
- )
102
+ return json.dumps(evaluate(args.environment, args.agents, args.configuration, args.steps, args.episodes))
119
103
 
120
104
 
121
105
  cached_agent = None
@@ -183,7 +167,9 @@ def action_load(args):
183
167
  if args.in_path is not None:
184
168
  with open(args.in_path, mode="r") as replay_file:
185
169
  json_args = json.load(replay_file)
186
- env = make(json_args["name"], json_args["configuration"], json_args["info"], json_args["steps"], args.logs, args.debug)
170
+ env = make(
171
+ json_args["name"], json_args["configuration"], json_args["info"], json_args["steps"], args.logs, args.debug
172
+ )
187
173
  else:
188
174
  env = make(args.environment, args.configuration, args.info, args.steps, args.logs, args.debug)
189
175
  return render(args, env)
@@ -229,7 +215,7 @@ def parse_args(args):
229
215
  }
230
216
  )
231
217
 
232
-
218
+
233
219
  def action_handler(args):
234
220
  try:
235
221
  if args.action == "list":
@@ -269,21 +255,20 @@ def action_http(args):
269
255
  log_path = args.log_path
270
256
 
271
257
  # Setup logging to console for Flask
272
- dictConfig({
273
- 'version': 1,
274
- 'formatters': {'default': {
275
- 'format': '%(levelname)s: %(message)s',
276
- }},
277
- 'handlers': {'wsgi': {
278
- 'class': 'logging.StreamHandler',
279
- 'stream': 'ext://sys.stdout',
280
- 'formatter': 'default'
281
- }},
282
- 'root': {
283
- 'level': 'INFO',
284
- 'handlers': ['wsgi']
258
+ dictConfig(
259
+ {
260
+ "version": 1,
261
+ "formatters": {
262
+ "default": {
263
+ "format": "%(levelname)s: %(message)s",
264
+ }
265
+ },
266
+ "handlers": {
267
+ "wsgi": {"class": "logging.StreamHandler", "stream": "ext://sys.stdout", "formatter": "default"}
268
+ },
269
+ "root": {"level": "INFO", "handlers": ["wsgi"]},
285
270
  }
286
- })
271
+ )
287
272
 
288
273
  app = Flask(__name__, static_url_path="", static_folder="")
289
274
  app.route("/", methods=["GET", "POST"])(lambda: http_request(request))
@@ -124,44 +124,84 @@
124
124
 
125
125
  const Renderer = styled((props) => {
126
126
  const context = useContext(Context);
127
- const { animate, debug, playing, renderer, speed } = context;
128
- const ref = preact.createRef();
129
-
130
- useEffect(async () => {
131
- if (!ref.current) return;
132
- const renderFrame = async (start, step, lastFrame) => {
133
- if (step !== context.step) return;
134
- if (lastFrame === 1) {
127
+ const { animate, debug, playing, renderer, speed, step } = context;
128
+
129
+ const ref = useRef(null);
130
+ const animationFrameId = useRef();
131
+
132
+ useEffect(() => {
133
+ const element = ref.current;
134
+ if (!element) return;
135
+
136
+ // A single function to render a static frame (for resizes and step changes)
137
+ const renderStaticFrame = async () => {
138
+ if (!ref.current) return;
139
+ try {
140
+ // Pass a frame of 1 to indicate a final/static state
141
+ await renderer({
142
+ ...context,
143
+ frame: 1,
144
+ height: ref.current.clientHeight,
145
+ width: ref.current.clientWidth,
146
+ hooks: preactHooks,
147
+ parent: ref.current,
148
+ preact,
149
+ styled,
150
+ });
151
+ } catch (error) {
152
+ if (debug) console.error("Static render failed:", error);
153
+ }
154
+ };
155
+
156
+ // --- Resize Handling ---
157
+ const observer = new ResizeObserver(() => {
158
+ renderStaticFrame();
159
+ });
160
+ observer.observe(element);
161
+
162
+ // --- Animation Loop ---
163
+ let start = Date.now();
164
+ const renderAnimation = async () => {
165
+ // Stop the loop if the component unmounts or if animate is turned off
166
+ if (!ref.current || !animate) return;
167
+
168
+ const frame = Math.min((Date.now() - start) / speed, 1);
169
+ if (frame === 1) {
135
170
  start = Date.now();
136
171
  }
137
- const frame =
138
- playing || animate
139
- ? Math.min((Date.now() - start) / speed, 1)
140
- : 1;
172
+
141
173
  try {
142
- if (debug) console.time("render");
143
- if (typeof renderer === "function") {
144
- await renderer({
145
- ...context,
146
- frame,
147
- height: ref.current.clientHeight,
148
- hooks: preactHooks,
149
- parent: ref.current,
150
- preact,
151
- styled,
152
- width: ref.current.clientWidth,
153
- });
154
- }
174
+ await renderer({
175
+ ...context,
176
+ frame,
177
+ height: ref.current.clientHeight,
178
+ width: ref.current.clientWidth,
179
+ hooks: preactHooks,
180
+ parent: ref.current,
181
+ preact,
182
+ styled,
183
+ });
155
184
  } catch (error) {
156
- if (debug) console.error(error);
157
- console.log({ ...context, frame, error });
158
- } finally {
159
- if (debug) console.timeEnd("render");
185
+ if (debug) console.error("Animation render failed:", error);
160
186
  }
161
- window.requestAnimationFrame(() => renderFrame(start, step, frame));
187
+
188
+ animationFrameId.current = requestAnimationFrame(renderAnimation);
162
189
  };
163
190
 
164
- await renderFrame(Date.now(), context.step);
191
+ // --- Initial Action ---
192
+ if (animate) {
193
+ // If animate is on, start the animation loop
194
+ renderAnimation();
195
+ } else {
196
+ // Otherwise, just render a single static frame for the current step
197
+ renderStaticFrame();
198
+ }
199
+
200
+ // --- Cleanup ---
201
+ return () => {
202
+ observer.disconnect();
203
+ cancelAnimationFrame(animationFrameId.current);
204
+ };
165
205
  }, [ref.current, context.step, context.renderer]);
166
206
 
167
207
  return h`<div className=${props.className} ref=${ref} />`;
@@ -49,11 +49,11 @@ def has(o, classinfo=None, default=None, path=None, is_callable=None):
49
49
  for p in path:
50
50
  cur = cur[p]
51
51
  if classinfo is not None and not isinstance(cur, classinfo):
52
- raise "Not a match"
53
- if is_callable == True and not callable(cur):
54
- raise "Not callable"
55
- if is_callable == False and callable(cur):
56
- raise "Is callable"
52
+ raise ValueError("Not a match")
53
+ if is_callable and not callable(cur):
54
+ raise ValueError("Not callable")
55
+ if not is_callable and callable(cur):
56
+ raise ValueError("Is callable")
57
57
  return True
58
58
  except:
59
59
  if default is not None and o is not None and len(path) > 0:
@@ -137,7 +137,7 @@ def default_schema(schema, data):
137
137
  else:
138
138
  obj = data
139
139
  for k, v in default.items():
140
- if not k in obj:
140
+ if k not in obj:
141
141
  obj[k] = v
142
142
  properties = get(schema, dict, {}, ["properties"])
143
143
  for key, prop_schema in properties.items():
@@ -180,15 +180,11 @@ def get_player(window_kaggle, renderer):
180
180
  value = f"""
181
181
  window.kaggle = {json.dumps(window_kaggle, indent=2)};\n\n
182
182
  """
183
- return read_file(renderer[1]).replace(
184
- key, value
185
- )
183
+ return read_file(renderer[1]).replace(key, value)
186
184
 
187
185
  key = "/*window.kaggle*/"
188
186
  value = f"""
189
187
  window.kaggle = {json.dumps(window_kaggle, indent=2)};\n\n
190
188
  window.kaggle.renderer = {renderer.strip()};\n\n
191
189
  """
192
- return read_file(Path.joinpath(root_path, "static", "player.html")).replace(
193
- key, value
194
- )
190
+ return read_file(Path.joinpath(root_path, "static", "player.html")).replace(key, value)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kaggle-environments
3
- Version: 1.17.12
3
+ Version: 1.18.0
4
4
  Summary: Kaggle Environments
5
5
  Home-page: https://github.com/Kaggle/kaggle-environments
6
6
  Author: Kaggle
@@ -37,7 +37,7 @@ Dynamic: summary
37
37
  # [<img src="https://kaggle.com/static/images/site-logo.png" height="50" style="margin-bottom:-15px" />](https://kaggle.com) Environments
38
38
 
39
39
  ```bash
40
- pip install kaggle-environments
40
+ uv pip install kaggle-environments
41
41
  ```
42
42
 
43
43
  # TLDR;
@@ -320,72 +320,3 @@ The following rendering modes are supported:
320
320
  out = env.render(mode="ansi")
321
321
  print(out)
322
322
  ```
323
-
324
- # Command Line
325
-
326
- ```sh
327
- > python main.py -h
328
- ```
329
-
330
- ## List Registered Environments
331
-
332
- ```sh
333
- > python main.py list
334
- ```
335
-
336
- ## Evaluate Episode Rewards
337
-
338
- ```sh
339
- python main.py evaluate --environment tictactoe --agents random random --episodes 10
340
- ```
341
-
342
- ## Run an Episode
343
-
344
- ```sh
345
- > python main.py run --environment tictactoe --agents random /pathtomy/agent.py --debug True
346
- ```
347
-
348
- ## Load an Episode
349
-
350
- This is useful when converting an episode json output into html.
351
-
352
- ```sh
353
- python main.py load --environment tictactoe --steps [...] --render '{"mode": "html"}'
354
- ```
355
-
356
- # HTTP Server
357
-
358
- The HTTP server contains the same interface/actions as the CLI above merging both POST body and GET params.
359
-
360
- ## Setup
361
-
362
- ```bash
363
- python main.py http-server --port=8012 --host=0.0.0.0
364
- ```
365
-
366
- ### Running Agents on Separate Servers
367
-
368
- ```python
369
- # How to run agent on a separate server.
370
- import requests
371
- import json
372
-
373
- path_to_agent1 = "/home/ajeffries/git/playground/agent1.py"
374
- path_to_agent2 = "/home/ajeffries/git/playground/agent2.py"
375
-
376
- agent1_url = f"http://localhost:5001?agents[]={path_to_agent1}"
377
- agent2_url = f"http://localhost:5002?agents[]={path_to_agent2}"
378
-
379
- body = {
380
- "action": "run",
381
- "environment": "tictactoe",
382
- "agents": [agent1_url, agent2_url]
383
- }
384
- resp = requests.post(url="http://localhost:5000", data=json.dumps(body)).json()
385
-
386
- # Inflate the response replay to visualize.
387
- from kaggle_environments import make
388
- env = make("tictactoe", steps=resp["steps"], debug=True)
389
- env.render(mode="ipython")
390
- print(resp)
391
- ```
@@ -1,13 +1,21 @@
1
- kaggle_environments/__init__.py,sha256=zh-xNmwXXBfdG2cZpmn8RHybvKdHcaYyA86k8yMYw0I,2176
1
+ kaggle_environments/__init__.py,sha256=iRg6HLV8H1EaxsVF_maFrYK5REcSCG1A_dOHsRBzX3E,2175
2
2
  kaggle_environments/agent.py,sha256=IgRagzcTi6F73nPeViDdh9wvHnx8fQhFmXJNutovGZE,6706
3
- kaggle_environments/api.py,sha256=eLBKqr11Ku4tdsMUdUqy74FIVEA_hdV3_QUpX84x3Z8,798
3
+ kaggle_environments/api.py,sha256=kBC_2ezY7-6JWlgvv-Hi4law6Ilkk2FnV2u_4qEe_rc,745
4
4
  kaggle_environments/core.py,sha256=PzF9NR0rFfFikspJ3HE0uI8UOiv_tlDhGSbu11g9vQQ,27860
5
5
  kaggle_environments/errors.py,sha256=SzKjkZP7pJbf9g0GDjGq4XG194hCQXLMwrlMCcm7Ai8,3336
6
- kaggle_environments/helpers.py,sha256=xkOMXaOMifYHHstDZo8bexk-Qq9suPM7Gkfi2JbXu8M,10627
7
- kaggle_environments/main.py,sha256=10wtcEFcGIjdOd9AEps5WOAwslc6Wsx3eZ43LXJa8jE,11705
6
+ kaggle_environments/helpers.py,sha256=Qy49B35Ifks6P8r4L1kLQDpQ-OVdW6qUTnprQWFz6so,11160
7
+ kaggle_environments/main.py,sha256=3Z2Ew3_0Ve3s-rwBTz8aF0oygh6JOv5iFigeUt6ioYM,11656
8
8
  kaggle_environments/schemas.json,sha256=zGzLyhqPdH6QQ0d48SrP5LKbvupprrWvgfQBerLqmhw,3307
9
9
  kaggle_environments/status_codes.json,sha256=6a8HuS_Vth95W0f2fov21QLdRfA3KbizUvjKmJhYtBc,995
10
- kaggle_environments/utils.py,sha256=FcI17PA4QK2-hyNp0dryS0TQ2pFlH9K19zDUMmuF4-E,5713
10
+ kaggle_environments/utils.py,sha256=HUJ7vuTQ-NUxFHqjCEN3Cdcg34DuE4gYrSzLPnTFxp0,5700
11
+ kaggle_environments/envs/cabt/cabt.js,sha256=JOGgC7aw4L41-x0PdHvbYXoc0KqcEAIkqkKLFiVEZzU,4707
12
+ kaggle_environments/envs/cabt/cabt.json,sha256=dYQshH6VRK1AMgZYFv5g4XbGX1cJbdNPXmdILpolgQI,547
13
+ kaggle_environments/envs/cabt/cabt.py,sha256=HCT7f4M_QYbqjzWHriRnTazzAxjK4UvQknxfiYDkNpc,4011
14
+ kaggle_environments/envs/cabt/cg/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
+ kaggle_environments/envs/cabt/cg/cg.dll,sha256=enpFzyM9OYg8LT2SsJhbVkautkNhaaUALicB5WcENI8,1020416
16
+ kaggle_environments/envs/cabt/cg/game.py,sha256=PdJSPA95Vhq3ezyysEh4aDgfU9KqXfmEsd4AzbJwGNI,2150
17
+ kaggle_environments/envs/cabt/cg/libcg.so,sha256=XYncRauAGs5sv84-8bDCLoQVHZDcTBZQ-aN7xilkBlo,907616
18
+ kaggle_environments/envs/cabt/cg/sim.py,sha256=js-EX5EXEsFmnI5OLx2sI8B1jdHF9CPOdJ72L1mWC0g,1195
11
19
  kaggle_environments/envs/chess/chess.js,sha256=QYA1arYF_qOfchN8HHQ4hL5z3C9XeT5hYigT75CgvKo,274596
12
20
  kaggle_environments/envs/chess/chess.json,sha256=fc8Qa1IHWmYbiEgorXIjMj2JmqP95x_reqFe6Mon2Wk,1692
13
21
  kaggle_environments/envs/chess/chess.py,sha256=41LMA8--APQOhl6aeWgJvkSaRBjAch2FgS7ELIoOT3w,245361
@@ -191,12 +199,12 @@ kaggle_environments/envs/mab/mab.py,sha256=bkSIxkstS98Vr3eOA9kxQkseDqa1MlG2Egfze
191
199
  kaggle_environments/envs/open_spiel/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
192
200
  kaggle_environments/envs/open_spiel/html_playthrough_generator.py,sha256=qzvi9wMZKz1WfpaIpBxP5LPlVYKAk9npEtdKLXYHMWo,950
193
201
  kaggle_environments/envs/open_spiel/observation.py,sha256=yrJ_iZ9sBUTB6YOyEpKNwYiQEWmsPPtaDYtL4zsw1Ko,4834
194
- kaggle_environments/envs/open_spiel/open_spiel.py,sha256=HzN1ngjeOqxLoetI1g56PdlioRY26VoCJMQpbD4S-Vk,17517
202
+ kaggle_environments/envs/open_spiel/open_spiel.py,sha256=61hBT2JNyuPVH9aadik_ZXz248mRqqDAQA5XvxGV9hQ,19396
195
203
  kaggle_environments/envs/open_spiel/proxy.py,sha256=8Shane4KWYKvbP9nV3l8VQfAFOfFSUrS78h_4xQthVM,4881
196
204
  kaggle_environments/envs/open_spiel/proxy_test.py,sha256=QkmRo_uS0DgDDm2pbU2vwal5KOMCWKw92rC2_g3MziM,1837
197
- kaggle_environments/envs/open_spiel/test_open_spiel.py,sha256=MwyjH-e00-3SP8_r10drYTFvplacbo0cDCI0XKtE4wU,3596
205
+ kaggle_environments/envs/open_spiel/test_open_spiel.py,sha256=AOJzHOICB0SK27QKaFFsKFO_Ui3pqXgE-mWjlrH7IBQ,6080
198
206
  kaggle_environments/envs/open_spiel/games/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
199
- kaggle_environments/envs/open_spiel/games/chess/chess.js,sha256=1WEZrngIX-0zNltBg1lWj8aqTWTMGIzCLSR83sUXa3g,19277
207
+ kaggle_environments/envs/open_spiel/games/chess/chess.js,sha256=RAvh0cUTqg1b-drcP9RQFNDP17V8uGQoVSgJFF5uBjU,45639
200
208
  kaggle_environments/envs/open_spiel/games/connect_four/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
201
209
  kaggle_environments/envs/open_spiel/games/connect_four/connect_four.js,sha256=iO74ar3Hh64VYEx9v3eysgrPU-Mcokl9dkFxie6uISg,14893
202
210
  kaggle_environments/envs/open_spiel/games/connect_four/connect_four_proxy.py,sha256=2otG99felDYhNhWpsadbM9YUaHtrXqhV1GFNEHhuPwA,2348
@@ -223,10 +231,10 @@ kaggle_environments/envs/tictactoe/test_tictactoe.py,sha256=6CgQbRz-yxNoMfD5tzmC
223
231
  kaggle_environments/envs/tictactoe/tictactoe.js,sha256=NZDT-oSG0a6a-rso9Ldh9qkJwVrxrAsjKUC3_tJu3tw,8002
224
232
  kaggle_environments/envs/tictactoe/tictactoe.json,sha256=zMXZ8-fpT7FBhzz2FFBvRLn4XwtngjEqOieMvI6cCj8,1121
225
233
  kaggle_environments/envs/tictactoe/tictactoe.py,sha256=uq3sTHWNMg0dxX2v9pTbJAKM7fwerxQt7OQjCX96m-Y,3657
226
- kaggle_environments/static/player.html,sha256=HfXiMfIij7pafsCZq1zwiZRq1zCnmtq4i2ZGIOJV5xw,25561
227
- kaggle_environments-1.17.12.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
228
- kaggle_environments-1.17.12.dist-info/METADATA,sha256=eG1NSoDEsW_ylRhfCNM44T5YOlc98XgWVW5ej263ihg,10956
229
- kaggle_environments-1.17.12.dist-info/WHEEL,sha256=JNWh1Fm1UdwIQV075glCn4MVuCRs0sotJIq-J6rbxCU,109
230
- kaggle_environments-1.17.12.dist-info/entry_points.txt,sha256=HbVC-LKGQFV6lEEYBYyDTtrkHgdHJUWQ8_qt9KHGqz4,70
231
- kaggle_environments-1.17.12.dist-info/top_level.txt,sha256=v3MMWIPMQFcI-WuF_dJngHWe9Bb2yH_6p4wat1x4gAc,20
232
- kaggle_environments-1.17.12.dist-info/RECORD,,
234
+ kaggle_environments/static/player.html,sha256=ek33T_8ecmWuxE5dWKO7jlYWLTPXru-cs0PrkBlNjAM,26749
235
+ kaggle_environments-1.18.0.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
236
+ kaggle_environments-1.18.0.dist-info/METADATA,sha256=u5aIqDcf5OhVm9ObJ257CT7AHkgoIHVkAHKmPD9DqB0,9477
237
+ kaggle_environments-1.18.0.dist-info/WHEEL,sha256=7wAbZI8A1UjN-j4-aYf66qBxOZ0Ioy0QNykkY5NcGJo,109
238
+ kaggle_environments-1.18.0.dist-info/entry_points.txt,sha256=HbVC-LKGQFV6lEEYBYyDTtrkHgdHJUWQ8_qt9KHGqz4,70
239
+ kaggle_environments-1.18.0.dist-info/top_level.txt,sha256=v3MMWIPMQFcI-WuF_dJngHWe9Bb2yH_6p4wat1x4gAc,20
240
+ kaggle_environments-1.18.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.9.0)
2
+ Generator: setuptools (78.1.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py2-none-any
5
5
  Tag: py3-none-any