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.
- openrewrite_remote-0.2.0/PKG-INFO +16 -0
- openrewrite_remote-0.2.0/pyproject.toml +37 -0
- openrewrite_remote-0.2.0/rewrite/remote/__init__.py +7 -0
- openrewrite_remote-0.2.0/rewrite/remote/client.py +40 -0
- openrewrite_remote-0.2.0/rewrite/remote/event.py +20 -0
- openrewrite_remote-0.2.0/rewrite/remote/java/extensions.py +176 -0
- openrewrite_remote-0.2.0/rewrite/remote/java/receiver.py +1376 -0
- openrewrite_remote-0.2.0/rewrite/remote/java/sender.py +659 -0
- openrewrite_remote-0.2.0/rewrite/remote/python/extensions.py +179 -0
- openrewrite_remote-0.2.0/rewrite/remote/python/receiver.py +1873 -0
- openrewrite_remote-0.2.0/rewrite/remote/python/sender.py +894 -0
- openrewrite_remote-0.2.0/rewrite/remote/receiver.py +386 -0
- openrewrite_remote-0.2.0/rewrite/remote/remote_utils.py +280 -0
- openrewrite_remote-0.2.0/rewrite/remote/remoting.py +342 -0
- openrewrite_remote-0.2.0/rewrite/remote/sender.py +424 -0
- openrewrite_remote-0.2.0/rewrite/remote/server.py +188 -0
- openrewrite_remote-0.2.0/rewrite/remote/type_utils.py +60 -0
@@ -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,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
|