flyte 0.2.0b3__py3-none-any.whl → 0.2.0b5__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 flyte might be problematic. Click here for more details.

Files changed (50) hide show
  1. flyte/_build.py +3 -2
  2. flyte/_deploy.py +4 -4
  3. flyte/_initialize.py +17 -3
  4. flyte/_internal/controllers/remote/_core.py +5 -4
  5. flyte/_internal/controllers/remote/_service_protocol.py +6 -6
  6. flyte/_protos/logs/dataplane/payload_pb2.py +28 -24
  7. flyte/_protos/logs/dataplane/payload_pb2.pyi +11 -2
  8. flyte/_protos/workflow/common_pb2.py +27 -0
  9. flyte/_protos/workflow/common_pb2.pyi +14 -0
  10. flyte/_protos/workflow/common_pb2_grpc.py +4 -0
  11. flyte/_protos/workflow/queue_service_pb2.py +39 -41
  12. flyte/_protos/workflow/queue_service_pb2.pyi +30 -28
  13. flyte/_protos/workflow/queue_service_pb2_grpc.py +15 -15
  14. flyte/_protos/workflow/run_definition_pb2.py +14 -14
  15. flyte/_protos/workflow/run_definition_pb2.pyi +4 -2
  16. flyte/_protos/workflow/task_definition_pb2.py +14 -13
  17. flyte/_protos/workflow/task_definition_pb2.pyi +7 -3
  18. flyte/_run.py +7 -5
  19. flyte/_trace.py +1 -6
  20. flyte/_version.py +2 -2
  21. flyte/cli/__init__.py +10 -0
  22. flyte/cli/_abort.py +26 -0
  23. flyte/{_cli → cli}/_common.py +2 -0
  24. flyte/{_cli → cli}/_create.py +1 -1
  25. flyte/{_cli → cli}/_delete.py +1 -1
  26. flyte/{_cli → cli}/_get.py +12 -3
  27. flyte/{_cli → cli}/_run.py +49 -16
  28. flyte/{_cli → cli}/main.py +10 -1
  29. flyte/config/_config.py +2 -0
  30. flyte/errors.py +9 -0
  31. flyte/io/_dir.py +2 -2
  32. flyte/io/_file.py +1 -4
  33. flyte/remote/_data.py +3 -3
  34. flyte/remote/_logs.py +80 -27
  35. flyte/remote/_project.py +8 -9
  36. flyte/remote/_run.py +194 -107
  37. flyte/remote/_secret.py +12 -12
  38. flyte/remote/_task.py +3 -3
  39. flyte/report/_report.py +4 -4
  40. flyte/syncify/__init__.py +5 -0
  41. flyte/syncify/_api.py +277 -0
  42. {flyte-0.2.0b3.dist-info → flyte-0.2.0b5.dist-info}/METADATA +2 -3
  43. {flyte-0.2.0b3.dist-info → flyte-0.2.0b5.dist-info}/RECORD +48 -43
  44. {flyte-0.2.0b3.dist-info → flyte-0.2.0b5.dist-info}/entry_points.txt +1 -1
  45. flyte/_api_commons.py +0 -3
  46. flyte/_cli/__init__.py +0 -0
  47. /flyte/{_cli → cli}/_deploy.py +0 -0
  48. /flyte/{_cli → cli}/_params.py +0 -0
  49. {flyte-0.2.0b3.dist-info → flyte-0.2.0b5.dist-info}/WHEEL +0 -0
  50. {flyte-0.2.0b3.dist-info → flyte-0.2.0b5.dist-info}/top_level.txt +0 -0
flyte/report/_report.py CHANGED
@@ -4,10 +4,10 @@ import string
4
4
  from dataclasses import dataclass, field
5
5
  from typing import TYPE_CHECKING, Dict, List, Union
6
6
 
7
- from flyte._api_commons import syncer
8
7
  from flyte._internal.runtime import io
9
8
  from flyte._logging import logger
10
9
  from flyte._tools import ipython_check
10
+ from flyte.syncify import syncify
11
11
 
12
12
  if TYPE_CHECKING:
13
13
  from IPython.core.display import HTML
@@ -112,7 +112,7 @@ def get_tab(name: str, /, create_if_missing: bool = True) -> Tab:
112
112
  return report.get_tab(name, create_if_missing=create_if_missing)
113
113
 
114
114
 
115
- @syncer.wrap
115
+ @syncify
116
116
  async def log(content: str, do_flush: bool = False):
117
117
  """
118
118
  Log content to the main tab. The content should be a valid HTML string, but not a complete HTML document,
@@ -126,7 +126,7 @@ async def log(content: str, do_flush: bool = False):
126
126
  await flush.aio()
127
127
 
128
128
 
129
- @syncer.wrap
129
+ @syncify
130
130
  async def flush():
131
131
  """
132
132
  Flush the report.
@@ -149,7 +149,7 @@ async def flush():
149
149
  logger.debug(f"Report flushed to {final_path}")
150
150
 
151
151
 
152
- @syncer.wrap
152
+ @syncify
153
153
  async def replace(content: str, do_flush: bool = False):
154
154
  """
155
155
  Get the report. Replaces the content of the main tab.
@@ -0,0 +1,5 @@
1
+ from flyte.syncify._api import Syncify
2
+
3
+ syncify = Syncify()
4
+
5
+ __all__ = ["Syncify", "syncify"]
flyte/syncify/_api.py ADDED
@@ -0,0 +1,277 @@
1
+ from __future__ import annotations
2
+
3
+ import asyncio
4
+ import atexit
5
+ import concurrent.futures
6
+ import inspect
7
+ import threading
8
+ from typing import (
9
+ Any,
10
+ AsyncIterator,
11
+ Awaitable,
12
+ Callable,
13
+ Coroutine,
14
+ Iterator,
15
+ ParamSpec,
16
+ Protocol,
17
+ Type,
18
+ TypeVar,
19
+ Union,
20
+ cast,
21
+ overload,
22
+ )
23
+
24
+ P = ParamSpec("P")
25
+ R_co = TypeVar("R_co", covariant=True)
26
+ T = TypeVar("T")
27
+
28
+
29
+ class SyncFunction(Protocol[P, R_co]):
30
+ """
31
+ A protocol that defines the interface for synchronous functions or methods that can be converted from asynchronous
32
+ ones.
33
+ """
34
+
35
+ def __call__(self, *args: Any, **kwargs: Any) -> R_co: ...
36
+
37
+ def aio(self, *args: Any, **kwargs: Any) -> Awaitable[R_co]: ...
38
+
39
+
40
+ class SyncGenFunction(Protocol[P, R_co]):
41
+ """
42
+ A protocol that defines the interface for synchronous functions or methods that can be converted from asynchronous
43
+ ones.
44
+ """
45
+
46
+ def __call__(self, *args: Any, **kwargs: Any) -> Iterator[R_co]: ...
47
+
48
+ def aio(self, *args: Any, **kwargs: Any) -> AsyncIterator[R_co]: ...
49
+
50
+
51
+ class _BackgroundLoop:
52
+ """
53
+ A background event loop that runs in a separate thread and used the the Syncify decorator to run asynchronous
54
+ functions or methods synchronously.
55
+ """
56
+
57
+ def __init__(self):
58
+ self.loop = None
59
+ self.thread = threading.Thread(name="syncify_bg", target=self._run, daemon=True)
60
+ self.thread.start()
61
+ atexit.register(self.stop)
62
+
63
+ def _run(self):
64
+ self.loop = asyncio.new_event_loop()
65
+ asyncio.set_event_loop(self.loop)
66
+ self.loop.run_forever()
67
+
68
+ def stop(self):
69
+ # stop the loop and wait briefly for thread to exit
70
+ self.loop.call_soon_threadsafe(self.loop.stop)
71
+ self.thread.join(timeout=1)
72
+
73
+ def is_in_loop(self) -> bool:
74
+ """
75
+ Check if the current thread is the background loop thread.
76
+ """
77
+ # If the current thread is not the background loop thread, return False
78
+ if threading.current_thread() != self.thread:
79
+ return False
80
+
81
+ if not self.thread.is_alive():
82
+ # If the thread is not alive, we cannot be in the loop
83
+ return False
84
+
85
+ # Lets get the current event loop and check if it matches the background loop
86
+ loop = None
87
+ try:
88
+ loop = asyncio.get_running_loop()
89
+ except RuntimeError:
90
+ pass
91
+
92
+ return loop == self.loop
93
+
94
+ def iterate_in_loop_sync(self, async_gen: AsyncIterator[R_co]) -> Iterator[R_co]:
95
+ # Create an iterator that pulls items from the async generator
96
+ assert self.thread.name != threading.current_thread().name, "Cannot run coroutine in the same thread"
97
+ while True:
98
+ try:
99
+ # use __anext__() and cast to Coroutine so mypy is happy
100
+ future: concurrent.futures.Future[R_co] = asyncio.run_coroutine_threadsafe(
101
+ cast(Coroutine[Any, Any, R_co], async_gen.__anext__()),
102
+ self.loop,
103
+ )
104
+ yield future.result()
105
+ except (StopAsyncIteration, StopIteration):
106
+ break
107
+
108
+ def call_in_loop_sync(self, coro: Coroutine[Any, Any, R_co]) -> R_co:
109
+ """
110
+ Run the given coroutine in the background loop and return its result.
111
+ """
112
+ future: concurrent.futures.Future[R_co] = asyncio.run_coroutine_threadsafe(coro, self.loop)
113
+ return future.result()
114
+
115
+ async def iterate_in_loop(self, async_gen: AsyncIterator[R_co]) -> AsyncIterator[R_co]:
116
+ """
117
+ Run the given async iterator in the background loop and yield its results.
118
+ """
119
+ if self.is_in_loop():
120
+ # If we are already in the background loop, just return the async iterator
121
+ async for r in async_gen:
122
+ yield r
123
+ return
124
+
125
+ while True:
126
+ try:
127
+ # same replacement here for the async path
128
+ future: concurrent.futures.Future[R_co] = asyncio.run_coroutine_threadsafe(
129
+ cast(Coroutine[Any, Any, R_co], async_gen.__anext__()),
130
+ self.loop,
131
+ )
132
+ # Wrap the future in an asyncio Future to yield it in an async context
133
+ aio_future: asyncio.Future[R_co] = asyncio.wrap_future(future)
134
+ # await for the future to complete and yield its result
135
+ yield await aio_future
136
+ except StopAsyncIteration:
137
+ break
138
+
139
+ async def aio(self, coro: Coroutine[Any, Any, R_co]) -> R_co:
140
+ """
141
+ Run the given coroutine in the background loop and return its result.
142
+ """
143
+ if self.is_in_loop():
144
+ # If we are already in the background loop, just run the coroutine
145
+ return await coro
146
+ # Otherwise, run it in the background loop and wait for the result
147
+ future: concurrent.futures.Future[R_co] = asyncio.run_coroutine_threadsafe(coro, self.loop)
148
+ # Wrap the future in an asyncio Future to await it in an async context
149
+ aio_future: asyncio.Future[R_co] = asyncio.wrap_future(future)
150
+ # await for the future to complete and return its result
151
+ return await aio_future
152
+
153
+
154
+ class _SyncWrapper:
155
+ """
156
+ A wrapper class that the Syncify decorator uses to convert asynchronous functions or methods into synchronous ones.
157
+ """
158
+
159
+ def __init__(
160
+ self,
161
+ fn: Any,
162
+ bg_loop: _BackgroundLoop,
163
+ instance: Any = None,
164
+ owner: Type | None = None,
165
+ underlying_obj: Any = None,
166
+ ):
167
+ self.fn = fn
168
+ self._bg_loop = bg_loop
169
+ self._underlying_obj = underlying_obj
170
+
171
+ def __call__(self, *args: Any, **kwargs: Any) -> Any:
172
+ # bind method if needed
173
+ coro_fn = self.fn
174
+
175
+ if inspect.isasyncgenfunction(coro_fn):
176
+ # Handle async iterator by converting to sync iterator
177
+ async_gen = coro_fn(*args, **kwargs)
178
+ return self._bg_loop.iterate_in_loop_sync(async_gen)
179
+ else:
180
+ return self._bg_loop.call_in_loop_sync(coro_fn(*args, **kwargs))
181
+
182
+ def __get__(self, instance: Any, owner: Any) -> Any:
183
+ """
184
+ This method is called when the wrapper is accessed as a method of a class instance.
185
+ :param instance:
186
+ :param owner:
187
+ :return:
188
+ """
189
+ fn: Any = self.fn
190
+ if instance is not None:
191
+ # If we have an instance, we need to bind the method to the instance (for instance methods)
192
+ fn = self.fn.__get__(instance, owner)
193
+
194
+ if instance is None and owner is not None and self._underlying_obj is not None:
195
+ # If we have an owner, we need to bind the method to the owner (for classmethods or staticmethods)
196
+ fn = self._underlying_obj.__get__(None, owner)
197
+
198
+ return _SyncWrapper(fn, bg_loop=self._bg_loop, underlying_obj=self._underlying_obj)
199
+
200
+ def aio(self, *args: Any, **kwargs: Any) -> Any:
201
+ fn = self.fn
202
+
203
+ if inspect.isasyncgenfunction(fn):
204
+ # If the function is an async generator, we need to handle it differently
205
+ async_iter = fn(*args, **kwargs)
206
+ return self._bg_loop.iterate_in_loop(async_iter)
207
+ else:
208
+ # If we are already in the background loop, just return the coroutine
209
+ coro = fn(*args, **kwargs)
210
+ if hasattr(coro, "__aiter__"):
211
+ # If the coroutine is an async iterator, we need to handle it differently
212
+ return self._bg_loop.iterate_in_loop(coro)
213
+ return self._bg_loop.aio(coro)
214
+
215
+
216
+ class Syncify:
217
+ """
218
+ A decorator to convert asynchronous functions or methods into synchronous ones.
219
+
220
+ This is useful for integrating async code into synchronous contexts.
221
+
222
+ Example::
223
+
224
+ ```python
225
+ syncer = Syncify()
226
+
227
+ @syncer
228
+ async def async_function(x: str) -> str:
229
+ return f"Hello, Async World {x}!"
230
+
231
+
232
+ # now you can call it synchronously
233
+ result = async_function("Async World")
234
+ print(result)
235
+ # Output: Hello, Async World Async World!
236
+
237
+ # or call it asynchronously
238
+ async def main():
239
+ result = await async_function.aio("World")
240
+ print(result)
241
+ ```
242
+
243
+ """
244
+
245
+ def __init__(self):
246
+ self._bg_loop = _BackgroundLoop()
247
+
248
+ @overload
249
+ def __call__(self, func: Callable[P, Awaitable[R_co]]) -> Any: ...
250
+
251
+ # def __call__(self, func: Callable[P, Awaitable[R_co]]) -> SyncFunction[P, R_co]: ...
252
+
253
+ @overload
254
+ def __call__(self, func: Callable[P, Iterator[R_co] | AsyncIterator[R_co]]) -> SyncGenFunction[P, R_co]: ...
255
+
256
+ # def __call__(self, func: Callable[[Type[T], *P.args, *P.kwargs], Awaitable[R_co]])
257
+ # -> SyncFunction[[Type[T], *P.args, *P.kwargs], R_co]: ...
258
+ @overload
259
+ def __call__(self, func: classmethod) -> Union[SyncFunction[P, R_co], SyncGenFunction[P, R_co]]: ...
260
+
261
+ @overload
262
+ def __call__(self, func: staticmethod) -> staticmethod: ...
263
+
264
+ def __call__(self, obj):
265
+ if isinstance(obj, classmethod):
266
+ return _SyncWrapper(obj.__func__, bg_loop=self._bg_loop, underlying_obj=obj)
267
+ if isinstance(obj, staticmethod):
268
+ return staticmethod(cast(Any, _SyncWrapper(obj.__func__, bg_loop=self._bg_loop)))
269
+ if inspect.isasyncgenfunction(obj):
270
+ # If the function is an async generator, we need to handle it differently
271
+ return cast(Callable[P, Iterator[R_co]], _SyncWrapper(obj, bg_loop=self._bg_loop))
272
+ if inspect.iscoroutinefunction(obj):
273
+ # If the function is a coroutine, we can wrap it directly
274
+ return _SyncWrapper(obj, bg_loop=self._bg_loop)
275
+ raise TypeError(
276
+ "Syncify can only be applied to async functions, async generators, async classmethods or staticmethods."
277
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flyte
3
- Version: 0.2.0b3
3
+ Version: 0.2.0b5
4
4
  Summary: Add your description here
5
5
  Author-email: Ketan Umare <kumare3@users.noreply.github.com>
6
6
  Requires-Python: >=3.10
@@ -15,10 +15,9 @@ Requires-Dist: obstore>=0.6.0
15
15
  Requires-Dist: protobuf>=6.30.1
16
16
  Requires-Dist: pydantic>=2.10.6
17
17
  Requires-Dist: pyyaml>=6.0.2
18
- Requires-Dist: rich-click>=1.8.8
18
+ Requires-Dist: rich-click>=1.8.9
19
19
  Requires-Dist: httpx>=0.28.1
20
20
  Requires-Dist: keyring>=25.6.0
21
- Requires-Dist: synchronicity>=0.9.11
22
21
  Requires-Dist: msgpack>=1.1.0
23
22
  Requires-Dist: toml>=0.10.2
24
23
  Requires-Dist: async-lru>=2.0.5
@@ -1,29 +1,28 @@
1
1
  flyte/__init__.py,sha256=5rPeSCWYJSKbqbiCx4cjPW0728c7ow-aogoXLaHGhFg,1340
2
- flyte/_api_commons.py,sha256=9drgP2Qgr8rdDmZlI31TEpa056zCBiI1tAMO001SQ8o,64
3
- flyte/_build.py,sha256=MVBM-i2rCxHhIFQCR-Tc0JMA2XuJ5r4UZBW4M7HRvSw,580
2
+ flyte/_build.py,sha256=MkgfLAPeL56YeVrGRNZUCZgbwzlEzVP3wLbl5Qru4yk,578
4
3
  flyte/_context.py,sha256=pYa43ut8gp6i-Y_zOy1WW_N2IbP9Vd-zIORO11vqK1E,4995
5
- flyte/_deploy.py,sha256=xYSSA5Sqj79ePCLNid07-j3L28hn2arLAnK15FigE28,7725
4
+ flyte/_deploy.py,sha256=hHZKLU3U7t1ZF_8x6LykkPu_KSDyaHL3f2WzyjLj9BQ,7723
6
5
  flyte/_doc.py,sha256=_OPCf3t_git6UT7kSJISFaWO9cfNzJhhoe6JjVdyCJo,706
7
6
  flyte/_docstring.py,sha256=SsG0Ab_YMAwy2ABJlEo3eBKlyC3kwPdnDJ1FIms-ZBQ,1127
8
7
  flyte/_environment.py,sha256=ft0EsyFg6OnoIFPFbwkABLcq676veIH3TTR4SNilrj8,1499
9
8
  flyte/_group.py,sha256=64q2GFDp3koIkx3IV4GBeGEbu4v-GPUxTlxU_sV2fPk,743
10
9
  flyte/_hash.py,sha256=Of_Zl_DzzzF2jp4ZsLm-3o-xJFCCJ8_GubmLI1htx78,504
11
10
  flyte/_image.py,sha256=8xEGmAALY6jQAsLfJQH9NweeVUaSTWivFEQt-JchN24,29068
12
- flyte/_initialize.py,sha256=l7nSK7yZwJtmt4mBphFUUq4GDElrFyAMia7uxaC8O9o,15204
11
+ flyte/_initialize.py,sha256=hdu-7p56KLCq3xFf-ErGuActhoJMA_iqggjU2MOQm2Y,15758
13
12
  flyte/_interface.py,sha256=MP5o_qpIwfBNtAc7zo_cLSjMugsPyanuO6EgUSk4fBE,3644
14
13
  flyte/_logging.py,sha256=FQvF3W1kkFypbARcOQ7WZVXO0XJasXp8EhozF6E6-aQ,3379
15
14
  flyte/_resources.py,sha256=UOLyEVhdxolvrHhddiBbYdJuE1RkM_l7xeS9G1abe6M,7583
16
15
  flyte/_retry.py,sha256=rfLv0MvWxzPByKESTglEmjPsytEAKiIvvmzlJxXwsfE,941
17
16
  flyte/_reusable_environment.py,sha256=P4FBATVKAYcIKpdFN98sI8acPyKy8eIGx6V0kUb9YdM,1289
18
- flyte/_run.py,sha256=s3m3VChDj4ge3pYoGx-QBlRqyizUBA9tDWMdvy3LlVE,17630
17
+ flyte/_run.py,sha256=2ugAk4tpvSAnNAlfhx4YysSrdFoce-hZHQ6XMHYxp0A,17783
19
18
  flyte/_secret.py,sha256=SqIHs6mi8hEkIIBZe3bI9jJsPt65Mt6dV5uh9_op1ME,2392
20
19
  flyte/_task.py,sha256=cqWfbMDMkEg1Q0sOkaSi1h_9Vn81DbGCOgNFZo8bMfI,14622
21
20
  flyte/_task_environment.py,sha256=svSJJMEiiYsqz403s_urMgPdjguHJJSGVuBobT3uwVo,8403
22
21
  flyte/_timeout.py,sha256=zx5sFcbYmjJAJbZWSGzzX-BpC9HC7Jfs35T7vVhKwkk,1571
23
22
  flyte/_tools.py,sha256=JewkQZBR_M85tS6QY8e4xXue75jbOE48nID4ZHnc9jY,632
24
- flyte/_trace.py,sha256=sXSlOvHsT32YhNjgCCLAY8lwmzXGSAgaS7nvoy9msWU,5441
25
- flyte/_version.py,sha256=Z1N7oGzKZRF2f0T3kLgDOXvNT_dEF6I0XUajA-kd-A4,519
26
- flyte/errors.py,sha256=ulVzQ3TncddYOqQ3gvauDJAHTShWTpY0XZpqNqBZyOY,4036
23
+ flyte/_trace.py,sha256=7OQtQNosIlycTwaMjdc3GW4h3T3N0bYTsY6og4clPl8,5234
24
+ flyte/_version.py,sha256=o929JDYrvIu0qnHyRbZTFJje2DxGPT9DaVUyysEN3SA,519
25
+ flyte/errors.py,sha256=m2JUNqLC6anVW6UiDK_ihuA06q_Hkw1mIUMDskb2OW8,4289
27
26
  flyte/models.py,sha256=GTRuR6GXc0RAbLmPEnnH54oRF7__2TNFhmYjFoYMjZA,12660
28
27
  flyte/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
28
  flyte/_bin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -32,15 +31,6 @@ flyte/_cache/__init__.py,sha256=zhdO5UuHQRdzn8GHmSN40nrxfAmI4ihDRuHZM11U84Y,305
32
31
  flyte/_cache/cache.py,sha256=ErhWzzJdEjTIuEF4f-r6IBgko-3Al9iUs1Eq4O42TUE,5021
33
32
  flyte/_cache/defaults.py,sha256=gzJZW0QJPUfd2OPnGpv3tzIfwPtgFjAKoie3NP1P97U,217
34
33
  flyte/_cache/policy_function_body.py,sha256=_AcyN6XKRXq16yV5lWuRJYCIVUlmyPvvWuYRxfU-Ldo,1507
35
- flyte/_cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
- flyte/_cli/_common.py,sha256=ru0ScwPp1JkICnOFbT_2019FchKf0UasWyHHYIGlLBk,10299
37
- flyte/_cli/_create.py,sha256=BtA8zKqrq-IEucIXHIpVwvl330PS9R5WnHyz-rlyE3o,2378
38
- flyte/_cli/_delete.py,sha256=MVxMKIgQC3R-EKDEYSySCqHTLHhQrhjwo4sdv5TynEA,498
39
- flyte/_cli/_deploy.py,sha256=u30rb6KfZnr52M6zHlLueaOkgdCGoS2pIpfb0wFoTvY,4371
40
- flyte/_cli/_get.py,sha256=EfxLRSLr9snseFpcicu1Qw7zjQ5Z4yMbxP3LWRCFUqA,7185
41
- flyte/_cli/_params.py,sha256=X3GpuftXmtfIsYQ7vBilD4kmlkXTc7_AxpaxohRjSuY,19458
42
- flyte/_cli/_run.py,sha256=8FDBpLKQStPlKsBqhvpBBLCQ9BfjxqEFj3UrmISbTbw,5806
43
- flyte/_cli/main.py,sha256=NDT0A3p13utLfZzPxYu5h-kr_U5FaHf6-igs0eJ0--k,2450
44
34
  flyte/_code_bundle/__init__.py,sha256=G7DJTQ0UN_ETvdh55pYcWsTrZJKXEcyQl9iQQNQOBXQ,328
45
35
  flyte/_code_bundle/_ignore.py,sha256=Tfaoa62CQVTH17kBHD6Xv6xEh1FhcAyvXivl9m-MEE0,3853
46
36
  flyte/_code_bundle/_packaging.py,sha256=_wEozcQTYgqvAAaKQYna9ptvShIMlXk3vEdccwAOYn8,6873
@@ -54,9 +44,9 @@ flyte/_internal/controllers/remote/__init__.py,sha256=9_azH1eHLqY6VULpDugXi7Kf1k
54
44
  flyte/_internal/controllers/remote/_action.py,sha256=w6vE1vPz1BwxvwfotDWjTNbDXfGEPrRBA8N3UVQ6P0w,4905
55
45
  flyte/_internal/controllers/remote/_client.py,sha256=HPbzbfaWZVv5wpOvKNtFXR6COiZDwd1cUJQqi60A7oU,1421
56
46
  flyte/_internal/controllers/remote/_controller.py,sha256=uqZYQDGG70DeJiqAU4y7n7VhXQ0gvD4ktWu15-zg86I,17387
57
- flyte/_internal/controllers/remote/_core.py,sha256=P3hJPGtqnMt38oRjXD2IxZUh4evS2H6oCmxzVY0i69s,17999
47
+ flyte/_internal/controllers/remote/_core.py,sha256=-EJEu3D4QFXtRmLBUBIKucWsYeuRbSLHmwllTgs3HAs,18091
58
48
  flyte/_internal/controllers/remote/_informer.py,sha256=6WPaT1EmDcIwQ3VlujGWICzHy-kaGhMut_zBh2ShZnE,14186
59
- flyte/_internal/controllers/remote/_service_protocol.py,sha256=-p5FXdo5pp5xmr9fJ0sGB9aE7mimeC6x13bqwyIR77k,1345
49
+ flyte/_internal/controllers/remote/_service_protocol.py,sha256=B9qbIg6DiGeac-iSccLmX_AL2xUgX4ezNUOiAbSy4V0,1357
60
50
  flyte/_internal/imagebuild/__init__.py,sha256=cLXVxkAyFpbdC1y-k3Rb6FRW9f_xpoRQWVn__G9IqKs,354
61
51
  flyte/_internal/imagebuild/docker_builder.py,sha256=bkr2fs9jInTq8jqU8ka7NGvp0RPfYhbTfX1RqtqTvvs,13986
62
52
  flyte/_internal/imagebuild/image_builder.py,sha256=q-TRcF_t2nS8FqBOtIIdnSo1Jrq378jqzceYDPzne8Q,9902
@@ -95,8 +85,8 @@ flyte/_protos/common/role_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXq
95
85
  flyte/_protos/common/runtime_version_pb2.py,sha256=djTmB3fRv2V0IV6Jzz4mtmHvEuEK4KPCkJWdRcW3DUQ,2012
96
86
  flyte/_protos/common/runtime_version_pb2.pyi,sha256=pPQ9qVtfvE1sGhdZo47aThk2quLtXOOywRhYXFp-Kzg,1132
97
87
  flyte/_protos/common/runtime_version_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
98
- flyte/_protos/logs/dataplane/payload_pb2.py,sha256=ni5wgcOTYaqCPz4BgYzruJ6eOC_h0xYJ_m4MXspEmyQ,11549
99
- flyte/_protos/logs/dataplane/payload_pb2.pyi,sha256=AVk0TgCJ0hRHjGuwdgAWMyj7125ch353jg2GcNCNzfY,9208
88
+ flyte/_protos/logs/dataplane/payload_pb2.py,sha256=3AqZl3EzNtGZcc5hDxPoP_QQRz1pbCeI-vCcoUyT_U4,12114
89
+ flyte/_protos/logs/dataplane/payload_pb2.pyi,sha256=KuuIIpTUpXR-HVwKc9kqUvs1cRyMQzFhERdr3GUGTeA,9714
100
90
  flyte/_protos/logs/dataplane/payload_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
101
91
  flyte/_protos/secret/definition_pb2.py,sha256=OCV8zbPz9nxKJM215_3J4sbT0YVx5z_p6vCoYNHFZo4,4904
102
92
  flyte/_protos/secret/definition_pb2.pyi,sha256=EQPG_os98mnRT3Hfn3kHHgI-ZYrIV6ZUmo2PgY4vAFM,4412
@@ -109,14 +99,17 @@ flyte/_protos/secret/secret_pb2.pyi,sha256=gQ2SbW8J93TB2i4c7FjsrJdj38rlhLmdY1T3k
109
99
  flyte/_protos/secret/secret_pb2_grpc.py,sha256=3DOSlIwXhKUn_Kvsv3V6Hmnge1NgtZUI2V_wYOl3aak,9085
110
100
  flyte/_protos/secret/secret_pb2_grpc_grpc.py,sha256=3DOSlIwXhKUn_Kvsv3V6Hmnge1NgtZUI2V_wYOl3aak,9085
111
101
  flyte/_protos/validate/validate/validate_pb2.py,sha256=yJOyUdZVPAVOSvo8uNgynvObiS-fQFYJE97KilJnLZA,13409
102
+ flyte/_protos/workflow/common_pb2.py,sha256=NmukAKm8cxBvxYrZ7VuARExi5M5SB0mcP1AxSkq7n5E,1812
103
+ flyte/_protos/workflow/common_pb2.pyi,sha256=h69_9esVb6NRD5QNC-ahv7IbjxH77UrT9M9wvqbcjSA,652
104
+ flyte/_protos/workflow/common_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
112
105
  flyte/_protos/workflow/node_execution_service_pb2.py,sha256=IOLg3tNikY7n00kLOVsC69yyXc5Ttnx-_-xUuc0q05Q,1654
113
106
  flyte/_protos/workflow/node_execution_service_pb2.pyi,sha256=C7VVuw_bnxp68qemD3SLoGIL-Hmno6qkIoq3l6W2qb8,135
114
107
  flyte/_protos/workflow/node_execution_service_pb2_grpc.py,sha256=2JJDS3Aww3FFDW-qYdTaxC75gRpsgnn4an6LPZmF9uA,947
115
- flyte/_protos/workflow/queue_service_pb2.py,sha256=jR1AEczpIWtM_UGiOYIiBKzJgRXCSveDFp7kIfLjiuw,12160
116
- flyte/_protos/workflow/queue_service_pb2.pyi,sha256=6ShNYyrUZuwSWOlBrhT4vjkgEfqiyT67dYbnX5TUtnw,7673
117
- flyte/_protos/workflow/queue_service_pb2_grpc.py,sha256=TnK6wx8LTOCl2UrCA4_RxCU163vxFIfsfvGiEOv8N6E,7881
118
- flyte/_protos/workflow/run_definition_pb2.py,sha256=fpQ5VYWAlOFN4cnH4BRh64xpXHUed8r4NgQr5OlZ27c,16019
119
- flyte/_protos/workflow/run_definition_pb2.pyi,sha256=toTdsCzHF2aIei6d_r0bwEUkUpMy1u0c9pMsBfL-wfY,15140
108
+ flyte/_protos/workflow/queue_service_pb2.py,sha256=FuphK-Fy5kCjk9rLmQpD45-P9YS4B4aG8v7DEoF2XtE,11993
109
+ flyte/_protos/workflow/queue_service_pb2.pyi,sha256=qSCS0NyNRfNSjPuAlmVRprD4Be9d9rJNP6Of8lNsKGM,7819
110
+ flyte/_protos/workflow/queue_service_pb2_grpc.py,sha256=6KK87jYXrmK0jacf4AKhHp21QU9JFJPOiEBjbDRkBm0,7839
111
+ flyte/_protos/workflow/run_definition_pb2.py,sha256=U8n2q4G63sxdbdYXtIV65Kpjx3Q-ZDAagjt_qEsPKiI,16078
112
+ flyte/_protos/workflow/run_definition_pb2.pyi,sha256=ttY8nwp6Jq_8C_VpE08KSF2N9lZhnXYRH5sG1iNSTi8,15259
120
113
  flyte/_protos/workflow/run_definition_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
121
114
  flyte/_protos/workflow/run_logs_service_pb2.py,sha256=MKG9keauunf7EmIrlthQKgXrQAfMjbX9LyeBMlLhK30,3358
122
115
  flyte/_protos/workflow/run_logs_service_pb2.pyi,sha256=88_Qp-qQh9PSUUPSsyuawc9gBi9_4OEbnp37cgH1VGE,1534
@@ -127,8 +120,8 @@ flyte/_protos/workflow/run_service_pb2_grpc.py,sha256=tO1qnrD5_0KrtToCIcuseVhkQN
127
120
  flyte/_protos/workflow/state_service_pb2.py,sha256=xDEak38Egukk2yR4kr7Y7y-SsL4Y1rCnPN-FiGmmYsM,5785
128
121
  flyte/_protos/workflow/state_service_pb2.pyi,sha256=S3oEFSPHem-t7ySb2UGcWjmf-QK7gFG2rNCWAiIwzGk,3545
129
122
  flyte/_protos/workflow/state_service_pb2_grpc.py,sha256=E5yH8ZHNWUBFJkvsvqgX7ZmVU45UmbaHZynHGcQUd70,5801
130
- flyte/_protos/workflow/task_definition_pb2.py,sha256=x-q44ATxHCswazGEHUbWfpvsl4UoMcs49FvZBx4v58M,6567
131
- flyte/_protos/workflow/task_definition_pb2.pyi,sha256=sw1JLQR7Rz1PUogtbPlp4VPGkNZeOmc_aNAqlZdPIFA,2917
123
+ flyte/_protos/workflow/task_definition_pb2.py,sha256=CmAhYoED4Dms4bxPxC-_9_dXvlyAtqxPTnJ4n-A1Irg,6786
124
+ flyte/_protos/workflow/task_definition_pb2.pyi,sha256=f1H0pTLvqlUTCtXVyPWgJ4HSNtAtJ6BgP2N6XbArRfY,3312
132
125
  flyte/_protos/workflow/task_definition_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
133
126
  flyte/_protos/workflow/task_service_pb2.py,sha256=lY1MamKB9kNprHpBm1zQkeg25aTItXARu7Ta7rxzlB8,3787
134
127
  flyte/_protos/workflow/task_service_pb2.pyi,sha256=YY9pajzA_eF_xMHgVQMvThNI0QYulgfLn1741IYo8tI,1495
@@ -141,16 +134,26 @@ flyte/_utils/file_handling.py,sha256=iU4TxW--fCho_Eg5xTMODn96P03SxzF-V-5f-7bZAZY
141
134
  flyte/_utils/helpers.py,sha256=Ntrs1WilJS7a4oLmcIPLXMi0cuzRDiCr_wwgtpV30uk,3953
142
135
  flyte/_utils/lazy_module.py,sha256=fvXPjvZLzCfcI8Vzs4pKedUDdY0U_RQ1ZVrp9b8qBQY,1994
143
136
  flyte/_utils/uv_script_parser.py,sha256=PxqD8lSMi6xv0uDd1s8LKB2IPZr4ttZJCUweqlyMTKk,1483
137
+ flyte/cli/__init__.py,sha256=Hx_mrERToVkrvORPB56ZnUED86T4S50ac1nwLQfvsgo,278
138
+ flyte/cli/_abort.py,sha256=WkXmjAOcrBU9NXXndcwF7YW7QcUTJzyUrvIRW0fjpSE,580
139
+ flyte/cli/_common.py,sha256=dW4C9YwPapLp6-ebjQDet8BcSM4S2pFi37o5xy2Shbg,10432
140
+ flyte/cli/_create.py,sha256=8g9LgrjhpJiusUkmWeIRB3XviTVmMfo1dGCEt8Hna00,2377
141
+ flyte/cli/_delete.py,sha256=xOZN7Y13AQjAEQvdEod9qk1MQPU9l7bjQCkYzf_l4uY,497
142
+ flyte/cli/_deploy.py,sha256=u30rb6KfZnr52M6zHlLueaOkgdCGoS2pIpfb0wFoTvY,4371
143
+ flyte/cli/_get.py,sha256=u5PNAeJTPkGzdcz5gd2oiFrNvIfm8oRGK3MsjyY4Dzc,7553
144
+ flyte/cli/_params.py,sha256=X3GpuftXmtfIsYQ7vBilD4kmlkXTc7_AxpaxohRjSuY,19458
145
+ flyte/cli/_run.py,sha256=eOmLayNwKVAnBMBaa9dCteS-L5oHpYm0F91lE7HiMEc,7000
146
+ flyte/cli/main.py,sha256=dYjh-YchlAIpfVF77ggnTRzUaxCCWD6Fv1Mh84zU0bQ,2878
144
147
  flyte/config/__init__.py,sha256=Za3haz4wHCN51e07obqpe7nbRgk9WTIl9F9FXu2IcrM,8602
145
- flyte/config/_config.py,sha256=FxQ3X5oq0tanR7lT1QY81aBpiy72kpOSAxxYH1SWFpI,7104
148
+ flyte/config/_config.py,sha256=feuToNukIUnAQNYBDbwrG4MiiZ8hyP1HvQVES7tys3U,7157
146
149
  flyte/config/_internal.py,sha256=ylQN6RKxlUVQsgOLSR2a_4lgZ0k99xRj8o-MNTfsgWE,2836
147
150
  flyte/connectors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
148
151
  flyte/extras/__init__.py,sha256=FhB0uK7H1Yo5De9vOuF7UGnezTKncj3u2Wo5uQdWN0g,74
149
152
  flyte/extras/_container.py,sha256=JM-JNsj9-Mjf7E4OQcAS2Z5IJBXhB-HtQkGn_mu7gvk,11249
150
153
  flyte/io/__init__.py,sha256=e2wHVEoZ84TGOtOPrtTg6hJpeuxiYI56Sg011yq6nUQ,236
151
154
  flyte/io/_dataframe.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
152
- flyte/io/_dir.py,sha256=K3tz3pHKmpMppgX2HtI6Bz0H6EIdHFj96-7Ub47TJO8,15328
153
- flyte/io/_file.py,sha256=Ek40PN-Qo30HZvUKetXUGZKYooevtF-LoPtxMZGBa3I,15533
155
+ flyte/io/_dir.py,sha256=rih9CY1YjNX05bcAu5LG62Xoyij5GXAlv7jLyVF0je8,15310
156
+ flyte/io/_file.py,sha256=eL48TwJjPDyN9tPG9Hfs22P4qqc-GBsTm3E5e-JmfdY,15430
154
157
  flyte/io/pickle/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
155
158
  flyte/io/pickle/transformer.py,sha256=b7vAxLHgi-HMHy3vOG0sGMeDf6LimFmU_jAcvNOZI1o,4047
156
159
  flyte/io/structured_dataset/__init__.py,sha256=69ixVV9OEXiLiQ6SV2S8tEC7dVQe7YTt9NV1OotlG64,4524
@@ -158,12 +161,12 @@ flyte/io/structured_dataset/basic_dfs.py,sha256=lrcALNYke_gSmmAhIiUN5afqhA-W5bSu
158
161
  flyte/io/structured_dataset/structured_dataset.py,sha256=DrRIHA3zbkfLBekw3pPTF_SM0Rbn_BGBp1YJPyd9zY0,52644
159
162
  flyte/remote/__init__.py,sha256=zBWV88VF-L8430xVrOyk07EmLsOKhOUMVBsqFUDtO6Q,565
160
163
  flyte/remote/_console.py,sha256=avmELJPx8nQMAVPrHlh6jEIRPjrMwFpdZjJsWOOa9rE,660
161
- flyte/remote/_data.py,sha256=qNZwB_cCXBojP6nSIwp8_x0idxhbPFXvmv0SoKwvENE,5791
162
- flyte/remote/_logs.py,sha256=xuRKYbgzfUWKqu_YHl2niCtTfPCvhBS9m1tC6OSlk0s,4241
163
- flyte/remote/_project.py,sha256=shAs9Hw0e5PAOciTAEOGVsdvo70PunxBXdOylHSyWw8,2834
164
- flyte/remote/_run.py,sha256=I4SveRxh6F5FO_LCv0W-4Vu4xAqmIjpZ1THJm5IEAao,27913
165
- flyte/remote/_secret.py,sha256=3fPx3RIuRJ0h15gj2CF9xKcAfTSCvhW3i0v4YqPMcCk,4394
166
- flyte/remote/_task.py,sha256=-cvXVrRB1Zjz-n4OTqFrzJxS7Exnuz7SY_Vk4tuPvxc,7916
164
+ flyte/remote/_data.py,sha256=DPK85gB6M71RjxqIh1Q5PdZ9xcJ0m1w_3cT2lAO0r7w,5795
165
+ flyte/remote/_logs.py,sha256=CzhHaPq-1nZn0yxZQPRjPpoEWmfWYBxPdAAp8zcHchU,6138
166
+ flyte/remote/_project.py,sha256=dTBYqORDAbLvh9WnPO1Ytuzw2vxNYZwwNsKE2_b0o14,2807
167
+ flyte/remote/_run.py,sha256=u42FCF837FVywdHgajHH6sZw5FVacyqVPH178rXKpio,30666
168
+ flyte/remote/_secret.py,sha256=l5xeMS83uMcWWeSSTRsSZUNhS0N--1Dze09C-thSOQs,4341
169
+ flyte/remote/_task.py,sha256=6TBdjPWgxHmdY9OJMMPGZax8h7Qs7q9dprNktjnZ77E,7904
167
170
  flyte/remote/_client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
168
171
  flyte/remote/_client/_protocols.py,sha256=RVlVpX0jNg9kIf80lgtYimIWlqv30HOiFAdmDAROXCs,5481
169
172
  flyte/remote/_client/controlplane.py,sha256=FsOfj4rO4MIMnYrpAT53F8q588VVf5t4sDuwoPuc840,3102
@@ -186,21 +189,23 @@ flyte/remote/_client/auth/_grpc_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCe
186
189
  flyte/remote/_client/auth/_grpc_utils/auth_interceptor.py,sha256=JCjdoWV41sjdvfJcUmrJdIfQ0meuGFwv2ArU7FQGDDA,12403
187
190
  flyte/remote/_client/auth/_grpc_utils/default_metadata_interceptor.py,sha256=IoMGWM42_VyzxqIVYe458o0uKsqhH-mcERUs9CY1L5U,6194
188
191
  flyte/report/__init__.py,sha256=yLbeUxYaVaDlgBod3Oh34zGBSotl1UlXq1vUkb9q7cs,152
189
- flyte/report/_report.py,sha256=36e0qikyY-Wsv4OzvTqkl23pk5ekrXIuhA4qsm_RRQs,5191
192
+ flyte/report/_report.py,sha256=jZXl-dqkZHiVAPBuUCmE4e1vE9FpHLkermOeZehi8Tc,5175
190
193
  flyte/report/_template.html,sha256=YehmLJG3QMYQ10UT1YZBu2ncVmAJ4iyqVp5hF3sXRAs,3458
191
194
  flyte/storage/__init__.py,sha256=kkOyqBXJVZSKt3ALitGn9zK6bkchy1-c3TOPB4QhPxk,499
192
195
  flyte/storage/_config.py,sha256=xVibWJaioOnkeTb_M30azgiUe1jvmQaOWRZEkpdoTao,8680
193
196
  flyte/storage/_remote_fs.py,sha256=kM_iszbccjVD5VtVdgfkl1FHS8NPnY__JOo_CPQUE4c,1124
194
197
  flyte/storage/_storage.py,sha256=mBy7MKII2M1UTVm_EUUDwVb7uT1_AOPzQr2wCJ-fgW0,9873
195
198
  flyte/storage/_utils.py,sha256=8oLCM-7D7JyJhzUi1_Q1NFx8GBUPRfou0T_5tPBmPbE,309
199
+ flyte/syncify/__init__.py,sha256=tmGOUw3XvDXpaxQk95oRmUTObcIzjEvBFaceSzrXATU,94
200
+ flyte/syncify/_api.py,sha256=Ayq9xzb1IJJrlHuTJ160C3k7tdrAjhX4z-FgQM-3T8M,9799
196
201
  flyte/types/__init__.py,sha256=xMIYOolT3Vq0qXy7unw90IVdYztdMDpKg0oG0XAPC9o,364
197
202
  flyte/types/_interface.py,sha256=mY7mb8v2hJPGk7AU99gdOWl4_jArA1VFtjYGlE31SK0,953
198
203
  flyte/types/_renderer.py,sha256=ygcCo5l60lHufyQISFddZfWwLlQ8kJAKxUT_XnR_6dY,4818
199
204
  flyte/types/_string_literals.py,sha256=NlG1xV8RSA-sZ-n-IFQCAsdB6jXJOAKkHWtnopxVVDk,4231
200
205
  flyte/types/_type_engine.py,sha256=QxyoDWRG_whfLCz88YqEVVoTTnca0FZv9eHeLLT0_-s,93645
201
206
  flyte/types/_utils.py,sha256=pbts9E1_2LTdLygAY0UYTLYJ8AsN3BZyviSXvrtcutc,2626
202
- flyte-0.2.0b3.dist-info/METADATA,sha256=Y0hyKBs_dOcuqW6I6JY2f0LhiT9yLt5MprRAUYpZH44,10271
203
- flyte-0.2.0b3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
204
- flyte-0.2.0b3.dist-info/entry_points.txt,sha256=xitFzPlyODadzpIwr-x1mFIpz0IFKpMUJl3dnmxgyPc,76
205
- flyte-0.2.0b3.dist-info/top_level.txt,sha256=7dkyFbikvA12LEZEqawx8oDG1CMod6hTliPj7iWzgYo,6
206
- flyte-0.2.0b3.dist-info/RECORD,,
207
+ flyte-0.2.0b5.dist-info/METADATA,sha256=k8vAmgiVFmkpS_8iz8AAnTAmsXTFVcSmXU2Lge-OnX8,10234
208
+ flyte-0.2.0b5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
209
+ flyte-0.2.0b5.dist-info/entry_points.txt,sha256=MIq2z5dBurdCJfpXfMKzgBv7sJOakKRYxr8G0cMiTrg,75
210
+ flyte-0.2.0b5.dist-info/top_level.txt,sha256=7dkyFbikvA12LEZEqawx8oDG1CMod6hTliPj7iWzgYo,6
211
+ flyte-0.2.0b5.dist-info/RECORD,,
@@ -1,3 +1,3 @@
1
1
  [console_scripts]
2
2
  a0 = flyte._bin.runtime:main
3
- flyte = flyte._cli.main:main
3
+ flyte = flyte.cli.main:main
flyte/_api_commons.py DELETED
@@ -1,3 +0,0 @@
1
- from synchronicity import Synchronizer
2
-
3
- syncer = Synchronizer()
flyte/_cli/__init__.py DELETED
File without changes
File without changes
File without changes