openrewrite-remote 0.2.0__tar.gz

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.
@@ -0,0 +1,16 @@
1
+ Metadata-Version: 2.1
2
+ Name: openrewrite-remote
3
+ Version: 0.2.0
4
+ Summary: Remoting functionality for the OpenRewrite library.
5
+ License: Apache-2.0
6
+ Author: Moderne Inc.
7
+ Author-email: support@moderne.io
8
+ Requires-Python: >=3.9
9
+ Classifier: License :: OSI Approved :: Apache Software License
10
+ Classifier: Programming Language :: Python :: 3
11
+ Classifier: Programming Language :: Python :: 3.9
12
+ Classifier: Programming Language :: Python :: 3.10
13
+ Classifier: Programming Language :: Python :: 3.11
14
+ Classifier: Programming Language :: Python :: 3.12
15
+ Requires-Dist: cbor2 (>=5.6.4,<6.0.0)
16
+ Requires-Dist: openrewrite
@@ -0,0 +1,37 @@
1
+ [tool.poetry]
2
+ name = "openrewrite-remote"
3
+ version = "0.2.0" # This will be replaced by the GitHub Actions workflow
4
+ description = "Remoting functionality for the OpenRewrite library."
5
+ authors = ["Moderne Inc. <support@moderne.io>"]
6
+ license = "Apache-2.0"
7
+ packages = [
8
+ { include = "rewrite" }
9
+ ]
10
+
11
+ [tool.poetry.dependencies]
12
+ python = ">=3.9"
13
+ cbor2 = "^5.6.4"
14
+ openrewrite = "*"
15
+ #rewrite = { path = "../../../../openrewrite/rewrite-python/rewrite", develop = true }
16
+
17
+ [tool.poetry.group.dev.dependencies]
18
+ pytest = "^8.3.2"
19
+ mypy = "^1.11.1"
20
+ poethepoet = "^0.27.0"
21
+
22
+ [tool.mypy]
23
+ python_version = "3.9"
24
+ ignore_missing_imports = true
25
+ strict = true
26
+
27
+ warn_unused_ignores = true
28
+ warn_return_any = true
29
+ warn_unreachable = true
30
+
31
+ [tool.poe.tasks]
32
+ check-types = "mypy src"
33
+ test = "pytest"
34
+
35
+ [build-system]
36
+ requires = ["poetry-core>=1.0.0"]
37
+ build-backend = "poetry.core.masonry.api"
@@ -0,0 +1,7 @@
1
+ __path__ = __import__('pkgutil').extend_path(__path__, __name__)
2
+
3
+ from .receiver import *
4
+ from .sender import *
5
+ from .remoting import *
6
+
7
+ __all__ = [name for name in dir() if not name.startswith('_') and not isinstance(globals()[name], TypeVar)]
@@ -0,0 +1,40 @@
1
+ import socket
2
+ import tempfile
3
+ from pathlib import Path
4
+
5
+ import rewrite.java.tree as j
6
+ import rewrite.python.tree as py
7
+ from rewrite import Markers
8
+ from rewrite.python import Py
9
+ from rewrite.java import Space, JavaType
10
+
11
+ from rewrite import random_id, Cursor, PrintOutputCapture
12
+ from rewrite.remote import RemotingContext, RemotePrinterFactory, SenderContext, ReceiverContext
13
+ from rewrite.remote.python.receiver import PythonReceiver
14
+ from rewrite.remote.python.sender import PythonSender
15
+
16
+ SenderContext.register(Py, lambda: PythonSender())
17
+ ReceiverContext.register(Py, lambda: PythonReceiver())
18
+
19
+ # Path to the Unix domain socket
20
+ SOCKET_PATH = tempfile.gettempdir() + '/rewrite-java.sock'
21
+
22
+ # Create a Unix domain socket
23
+ client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
24
+
25
+ # Connect the socket to the path where the server is listening
26
+ client.connect(('localhost', 65432))
27
+ print(f'Connected to {SOCKET_PATH}')
28
+
29
+ try:
30
+ remoting = RemotingContext()
31
+ remoting.connect(client)
32
+ RemotePrinterFactory(remoting.client).set_current()
33
+
34
+ literal = j.Literal(random_id(), Space.SINGLE_SPACE, Markers.EMPTY, True, 'True', None, JavaType.Primitive())
35
+ assert_ = py.AssertStatement(random_id(), Space.EMPTY, Markers.EMPTY, [j.JRightPadded(literal, Space.EMPTY, Markers.EMPTY)])
36
+ cu = py.CompilationUnit(random_id(), Space.EMPTY, Markers.EMPTY, Path('/foo.py'), None, None, False, None, [], [j.JRightPadded(assert_, Space.EMPTY, Markers.EMPTY)], Space.EMPTY)
37
+ printed = cu.print(Cursor(None, Cursor.ROOT_VALUE), PrintOutputCapture(0))
38
+ assert printed == 'assert True'
39
+ finally:
40
+ client.close()
@@ -0,0 +1,20 @@
1
+ from dataclasses import dataclass
2
+ from enum import Enum
3
+ from typing import Optional
4
+
5
+
6
+ class EventType(Enum):
7
+ NoChange = 0
8
+ Update = 1
9
+ Add = 2
10
+ Delete = 3
11
+ Move = 4
12
+ StartList = 5
13
+ EndList = 6
14
+
15
+
16
+ @dataclass(frozen=True)
17
+ class DiffEvent:
18
+ event_type: EventType
19
+ concrete_type: Optional[str] = None
20
+ msg: Optional[any] = None
@@ -0,0 +1,176 @@
1
+ from functools import lru_cache
2
+ from operator import attrgetter
3
+ from typing import Type, Callable, TypeVar, Optional
4
+
5
+ from rewrite.java import *
6
+ from rewrite.remote import SenderContext, ReceiverContext
7
+
8
+ T = TypeVar('T')
9
+
10
+ def receive_container(container: Optional[JContainer[T]], _: Optional[str], ctx: ReceiverContext) -> JContainer[T]:
11
+ if container is not None:
12
+ container = container.with_before(ctx.receive_node(container.before, receive_space))
13
+ container = container.padding.with_elements(ctx.receive_nodes(container.padding.elements, receive_right_padded_tree))
14
+ container = container.with_markers(ctx.receive_node(container.markers, ctx.receive_markers))
15
+ else:
16
+ container = JContainer(
17
+ ctx.receive_node(None, receive_space),
18
+ ctx.receive_nodes(None, receive_right_padded_tree),
19
+ ctx.receive_node(None, ctx.receive_markers)
20
+ )
21
+ return container
22
+
23
+
24
+ def send_container(container: JContainer[T], ctx: SenderContext):
25
+ ctx.send_node(container, attrgetter('before'), send_space)
26
+ ctx.send_nodes(container, attrgetter('padding.elements'), send_right_padded, lambda t: t.element.id)
27
+ ctx.send_node(container, attrgetter('markers'), ctx.send_markers)
28
+
29
+
30
+ def send_left_padded(left_padded: JLeftPadded[T], ctx: SenderContext):
31
+ ctx.send_node(left_padded, attrgetter('before'), send_space)
32
+ if isinstance(left_padded.element, (J, Space)):
33
+ ctx.send_node(left_padded, attrgetter('element'), ctx.send_tree)
34
+ else:
35
+ ctx.send_value(left_padded, attrgetter('element'))
36
+ ctx.send_node(left_padded, attrgetter('markers'), ctx.send_markers)
37
+
38
+
39
+ def send_right_padded(right_padded: JRightPadded[T], ctx: SenderContext):
40
+ if isinstance(right_padded.element, J):
41
+ ctx.send_node(right_padded, attrgetter('element'), ctx.send_tree)
42
+ elif isinstance(right_padded.element, Space):
43
+ ctx.send_node(right_padded, attrgetter('element'), send_space)
44
+ else:
45
+ ctx.send_value(right_padded, attrgetter('element'))
46
+ ctx.send_node(right_padded, attrgetter('after'), send_space)
47
+ ctx.send_node(right_padded, attrgetter('markers'), ctx.send_markers)
48
+
49
+
50
+ def receive_space(space: Optional[Space], _: Optional[str], ctx: ReceiverContext) -> Space:
51
+ if space is not None:
52
+ space = space.with_comments(ctx.receive_nodes(space.comments, receive_comment))
53
+ space = space.with_whitespace(ctx.receive_value(space.whitespace, str))
54
+ else:
55
+ space = Space(
56
+ ctx.receive_values(None),
57
+ ctx.receive_value(None, str)
58
+ )
59
+
60
+ return space
61
+
62
+
63
+ def receive_comment(comment: Optional[Comment], _: Optional[str], ctx: ReceiverContext) -> Comment:
64
+ if comment:
65
+ comment = comment.with_multiline(ctx.receive_value(comment.multiline, bool))
66
+ comment = comment.with_text(ctx.receive_value(comment.text, str))
67
+ comment = comment.with_suffix(ctx.receive_value(comment.suffix, str))
68
+ comment = comment.with_markers(ctx.receive_node(comment.markers, ctx.receive_markers))
69
+ else:
70
+ comment = TextComment(
71
+ ctx.receive_value(None, bool),
72
+ ctx.receive_value(None, str),
73
+ ctx.receive_value(None, str),
74
+ ctx.receive_node(None, ctx.receive_markers)
75
+ )
76
+ return comment
77
+
78
+
79
+ def send_space(space: Space, ctx: SenderContext):
80
+ ctx.send_nodes(space, attrgetter('comments'), send_comment, lambda x: x)
81
+ ctx.send_value(space, attrgetter('whitespace'))
82
+
83
+
84
+ def send_comment(comment: Comment, ctx: SenderContext):
85
+ ctx.send_value(comment, attrgetter('multiline'))
86
+ ctx.send_value(comment, attrgetter('text'))
87
+ ctx.send_value(comment, attrgetter('suffix'))
88
+ ctx.send_node(comment, attrgetter('markers'), ctx.send_markers)
89
+
90
+
91
+ @lru_cache(maxsize=10)
92
+ def left_padded_value_receiver(type_: Type) -> Callable[[Optional[JLeftPadded[T]], Optional[str], ReceiverContext], JLeftPadded[T]]:
93
+ def receiver(left_padded: Optional[JLeftPadded[T]], _: Optional[str], ctx: ReceiverContext) -> JLeftPadded[T]:
94
+ if left_padded is not None:
95
+ left_padded = left_padded.with_before(ctx.receive_node(left_padded.before, receive_space))
96
+ left_padded = left_padded.with_element(ctx.receive_value(left_padded.element, type_))
97
+ left_padded = left_padded.with_markers(ctx.receive_node(left_padded.markers, ctx.receive_markers))
98
+ else:
99
+ left_padded = JLeftPadded(
100
+ ctx.receive_node(None, receive_space),
101
+ ctx.receive_value(None, type_),
102
+ ctx.receive_node(None, ctx.receive_markers)
103
+ )
104
+ return left_padded
105
+ return receiver
106
+
107
+
108
+ @lru_cache(maxsize=10)
109
+ def left_padded_node_receiver(type_: Type) -> Callable[[Optional[JLeftPadded[T]], Optional[str], ReceiverContext], JLeftPadded[T]]:
110
+ if type_ is Space:
111
+ def space_receiver(left_padded: Optional[JLeftPadded[T]], _: Optional[str], ctx: ReceiverContext) -> JLeftPadded[T]:
112
+ if left_padded is not None:
113
+ left_padded = left_padded.with_before(ctx.receive_node(left_padded.before, receive_space))
114
+ left_padded = left_padded.with_element(ctx.receive_node(left_padded.element, receive_space))
115
+ left_padded = left_padded.with_markers(ctx.receive_node(left_padded.markers, ctx.receive_markers))
116
+ else:
117
+ left_padded = JLeftPadded(
118
+ ctx.receive_node(None, receive_space),
119
+ ctx.receive_node(None, receive_space),
120
+ ctx.receive_node(None, ctx.receive_markers)
121
+ )
122
+ return left_padded
123
+ return space_receiver
124
+ else:
125
+ raise ValueError("Only Space is supported")
126
+
127
+
128
+ def receive_left_padded_tree(left_padded: Optional[JLeftPadded[T]], _: Optional[str], ctx: ReceiverContext) -> JLeftPadded[T]:
129
+ if left_padded is not None:
130
+ left_padded = left_padded.with_before(ctx.receive_node(left_padded.before, receive_space))
131
+ left_padded = left_padded.with_element(ctx.receive_node(left_padded.element, ctx.receive_tree))
132
+ left_padded = left_padded.with_markers(ctx.receive_node(left_padded.markers, ctx.receive_markers))
133
+ else:
134
+ left_padded = JLeftPadded(
135
+ ctx.receive_node(None, receive_space),
136
+ ctx.receive_node(None, ctx.receive_tree),
137
+ ctx.receive_node(None, ctx.receive_markers)
138
+ )
139
+ return left_padded
140
+
141
+
142
+ @lru_cache(maxsize=10)
143
+ def right_padded_value_receiver(type_: Type) -> Callable[[Optional[JRightPadded[T]], Optional[str], ReceiverContext], JRightPadded[T]]:
144
+ def receiver(right_padded: Optional[JRightPadded[T]], _: Optional[str], ctx: ReceiverContext) -> JRightPadded[T]:
145
+ if right_padded is not None:
146
+ right_padded = right_padded.with_element(ctx.receive_value(right_padded.element, type_))
147
+ right_padded = right_padded.with_after(ctx.receive_node(right_padded.after, receive_space))
148
+ right_padded = right_padded.with_markers(ctx.receive_node(right_padded.markers, ctx.receive_markers))
149
+ else:
150
+ right_padded = JRightPadded(
151
+ ctx.receive_value(None, type_),
152
+ ctx.receive_node(None, receive_space),
153
+ ctx.receive_node(None, ctx.receive_markers)
154
+ )
155
+ return right_padded
156
+ return receiver
157
+
158
+
159
+ @lru_cache(maxsize=10)
160
+ def right_padded_node_receiver(type_: Type) -> Callable[[Optional[JRightPadded[T]], Optional[str], ReceiverContext], JRightPadded[T]]:
161
+ raise ValueError("Not implemented")
162
+
163
+
164
+ def receive_right_padded_tree(right_padded: Optional[JRightPadded[T]], _: Optional[str],
165
+ ctx: ReceiverContext) -> JRightPadded[T]:
166
+ if right_padded is not None:
167
+ right_padded = right_padded.with_element(ctx.receive_node(right_padded.element, ctx.receive_tree))
168
+ right_padded = right_padded.with_after(ctx.receive_node(right_padded.after, receive_space))
169
+ right_padded = right_padded.with_markers(ctx.receive_node(right_padded.markers, ctx.receive_markers))
170
+ else:
171
+ right_padded = JRightPadded(
172
+ ctx.receive_node(None, ctx.receive_tree),
173
+ ctx.receive_node(None, receive_space),
174
+ ctx.receive_node(None, ctx.receive_markers)
175
+ )
176
+ return right_padded