lockss-turtles 0.5.0.dev3__py3-none-any.whl → 0.6.0.dev1__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.
- lockss/turtles/__init__.py +7 -30
- lockss/turtles/__main__.py +3 -3
- lockss/turtles/app.py +82 -75
- lockss/turtles/cli.py +159 -320
- lockss/turtles/plugin.py +64 -55
- lockss/turtles/plugin_registry.py +90 -79
- lockss/turtles/plugin_set.py +95 -87
- lockss/turtles/resources/__init__.py +1 -1
- lockss/turtles/util.py +8 -10
- {lockss_turtles-0.5.0.dev3.dist-info → lockss_turtles-0.6.0.dev1.dist-info}/LICENSE +1 -1
- {lockss_turtles-0.5.0.dev3.dist-info → lockss_turtles-0.6.0.dev1.dist-info}/METADATA +17 -19
- lockss_turtles-0.6.0.dev1.dist-info/RECORD +19 -0
- {lockss_turtles-0.5.0.dev3.dist-info → lockss_turtles-0.6.0.dev1.dist-info}/WHEEL +1 -1
- CHANGELOG.rst +0 -113
- lockss_turtles-0.5.0.dev3.dist-info/RECORD +0 -20
- {lockss_turtles-0.5.0.dev3.dist-info → lockss_turtles-0.6.0.dev1.dist-info}/entry_points.txt +0 -0
lockss/turtles/plugin_set.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
|
|
3
|
-
# Copyright (c) 2000-
|
|
3
|
+
# Copyright (c) 2000-2025, Board of Trustees of Leland Stanford Jr. University
|
|
4
4
|
#
|
|
5
5
|
# Redistribution and use in source and binary forms, with or without
|
|
6
6
|
# modification, are permitted provided that the following conditions are met:
|
|
@@ -28,50 +28,83 @@
|
|
|
28
28
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
29
29
|
# POSSIBILITY OF SUCH DAMAGE.
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
# Remove in Python 3.14
|
|
32
|
+
# See https://stackoverflow.com/questions/33533148/how-do-i-type-hint-a-method-with-the-type-of-the-enclosing-class/33533514#33533514
|
|
33
|
+
from __future__ import annotations
|
|
34
|
+
|
|
35
|
+
from abc import ABC, abstractmethod
|
|
36
|
+
import importlib.resources as IR
|
|
32
37
|
import os
|
|
33
|
-
from pathlib import Path
|
|
38
|
+
from pathlib import Path, PurePath
|
|
34
39
|
import shlex
|
|
35
40
|
import subprocess
|
|
36
41
|
import sys
|
|
42
|
+
from typing import List, Tuple, Union
|
|
43
|
+
|
|
44
|
+
from lockss.pybasic.fileutil import path
|
|
37
45
|
|
|
38
|
-
from
|
|
39
|
-
import
|
|
40
|
-
from
|
|
46
|
+
from . import resources as __resources__
|
|
47
|
+
from .plugin import Plugin
|
|
48
|
+
from .util import YamlT, load_and_validate
|
|
41
49
|
|
|
42
50
|
|
|
43
51
|
class PluginSetCatalog(object):
|
|
44
52
|
|
|
45
53
|
PLUGIN_SET_CATALOG_SCHEMA = 'plugin-set-catalog-schema.json'
|
|
46
54
|
|
|
55
|
+
def __init__(self, parsed: YamlT) -> None:
|
|
56
|
+
super().__init__()
|
|
57
|
+
self._parsed: YamlT = parsed
|
|
58
|
+
|
|
59
|
+
def get_plugin_set_files(self) -> List[str]:
|
|
60
|
+
return self._parsed['plugin-set-files']
|
|
61
|
+
|
|
47
62
|
@staticmethod
|
|
48
|
-
def from_path(plugin_set_catalog_path):
|
|
49
|
-
plugin_set_catalog_path =
|
|
50
|
-
with
|
|
51
|
-
parsed =
|
|
63
|
+
def from_path(plugin_set_catalog_path: Union[PurePath, str]) -> PluginSetCatalog:
|
|
64
|
+
plugin_set_catalog_path = path(plugin_set_catalog_path)
|
|
65
|
+
with IR.path(__resources__, PluginSetCatalog.PLUGIN_SET_CATALOG_SCHEMA) as plugin_set_catalog_schema_path:
|
|
66
|
+
parsed = load_and_validate(plugin_set_catalog_schema_path, plugin_set_catalog_path)
|
|
52
67
|
return PluginSetCatalog(parsed)
|
|
53
68
|
|
|
54
|
-
|
|
69
|
+
|
|
70
|
+
class PluginSet(ABC):
|
|
71
|
+
|
|
72
|
+
PLUGIN_SET_SCHEMA = 'plugin-set-schema.json'
|
|
73
|
+
|
|
74
|
+
def __init__(self, parsed: YamlT) -> None:
|
|
55
75
|
super().__init__()
|
|
56
|
-
self._parsed = parsed
|
|
76
|
+
self._parsed: YamlT = parsed
|
|
57
77
|
|
|
58
|
-
|
|
59
|
-
|
|
78
|
+
@abstractmethod
|
|
79
|
+
def build_plugin(self, plugin_id, keystore_path, keystore_alias, keystore_password=None) -> Tuple[Path, Plugin]:
|
|
80
|
+
pass
|
|
60
81
|
|
|
82
|
+
def get_builder_type(self) -> str:
|
|
83
|
+
return self._parsed['builder']['type']
|
|
61
84
|
|
|
62
|
-
|
|
85
|
+
def get_id(self) -> str:
|
|
86
|
+
return self._parsed['id']
|
|
63
87
|
|
|
64
|
-
|
|
88
|
+
def get_name(self) -> str:
|
|
89
|
+
return self._parsed['name']
|
|
90
|
+
|
|
91
|
+
@abstractmethod
|
|
92
|
+
def has_plugin(self, plugin_id: str) -> bool:
|
|
93
|
+
pass
|
|
94
|
+
|
|
95
|
+
@abstractmethod
|
|
96
|
+
def make_plugin(self, plugin_id: str) -> Plugin:
|
|
97
|
+
pass
|
|
65
98
|
|
|
66
99
|
@staticmethod
|
|
67
|
-
def from_path(plugin_set_file_path):
|
|
68
|
-
plugin_set_file_path =
|
|
69
|
-
with
|
|
70
|
-
lst =
|
|
100
|
+
def from_path(plugin_set_file_path) -> List[PluginSet]:
|
|
101
|
+
plugin_set_file_path = path(plugin_set_file_path)
|
|
102
|
+
with IR.path(__resources__, PluginSet.PLUGIN_SET_SCHEMA) as plugin_set_schema_path:
|
|
103
|
+
lst = load_and_validate(plugin_set_schema_path, plugin_set_file_path, multiple=True)
|
|
71
104
|
return [PluginSet._from_obj(parsed, plugin_set_file_path) for parsed in lst]
|
|
72
105
|
|
|
73
106
|
@staticmethod
|
|
74
|
-
def _from_obj(parsed, plugin_set_file_path):
|
|
107
|
+
def _from_obj(parsed: YamlT, plugin_set_file_path: Path) -> PluginSet:
|
|
75
108
|
typ = parsed['builder']['type']
|
|
76
109
|
if typ == AntPluginSet.TYPE:
|
|
77
110
|
return AntPluginSet(parsed, plugin_set_file_path)
|
|
@@ -80,29 +113,6 @@ class PluginSet(object):
|
|
|
80
113
|
else:
|
|
81
114
|
raise Exception(f'{plugin_set_file_path!s}: unknown builder type: {typ}')
|
|
82
115
|
|
|
83
|
-
def __init__(self, parsed):
|
|
84
|
-
super().__init__()
|
|
85
|
-
self._parsed = parsed
|
|
86
|
-
|
|
87
|
-
# Returns (jar_path, plugin)
|
|
88
|
-
def build_plugin(self, plugin_id, keystore_path, keystore_alias, keystore_password=None):
|
|
89
|
-
raise NotImplementedError('build_plugin')
|
|
90
|
-
|
|
91
|
-
def get_builder_type(self):
|
|
92
|
-
return self._parsed['builder']['type']
|
|
93
|
-
|
|
94
|
-
def get_id(self):
|
|
95
|
-
return self._parsed['id']
|
|
96
|
-
|
|
97
|
-
def get_name(self):
|
|
98
|
-
return self._parsed['name']
|
|
99
|
-
|
|
100
|
-
def has_plugin(self, plugin_id):
|
|
101
|
-
raise NotImplementedError('has_plugin')
|
|
102
|
-
|
|
103
|
-
def make_plugin(self, plugin_id):
|
|
104
|
-
raise NotImplementedError('make_plugin')
|
|
105
|
-
|
|
106
116
|
|
|
107
117
|
class AntPluginSet(PluginSet):
|
|
108
118
|
|
|
@@ -112,13 +122,13 @@ class AntPluginSet(PluginSet):
|
|
|
112
122
|
|
|
113
123
|
DEFAULT_TEST = 'plugins/test/src'
|
|
114
124
|
|
|
115
|
-
def __init__(self, parsed,
|
|
125
|
+
def __init__(self, parsed: YamlT, fpath: Path) -> None:
|
|
116
126
|
super().__init__(parsed)
|
|
117
|
-
self._built = False
|
|
118
|
-
self._root =
|
|
127
|
+
self._built: bool = False
|
|
128
|
+
self._root: Path = fpath.parent
|
|
119
129
|
|
|
120
130
|
# Returns (jar_path, plugin)
|
|
121
|
-
def build_plugin(self, plugin_id, keystore_path, keystore_alias, keystore_password=None):
|
|
131
|
+
def build_plugin(self, plugin_id, keystore_path, keystore_alias, keystore_password=None) -> Tuple[Path, Plugin]:
|
|
122
132
|
# Prerequisites
|
|
123
133
|
if 'JAVA_HOME' not in os.environ:
|
|
124
134
|
raise Exception('error: JAVA_HOME must be set in your environment')
|
|
@@ -127,31 +137,31 @@ class AntPluginSet(PluginSet):
|
|
|
127
137
|
# Little build
|
|
128
138
|
return self._little_build(plugin_id, keystore_path, keystore_alias, keystore_password=keystore_password)
|
|
129
139
|
|
|
130
|
-
def get_main(self):
|
|
140
|
+
def get_main(self) -> str:
|
|
131
141
|
return self._parsed.get('main', AntPluginSet.DEFAULT_MAIN)
|
|
132
142
|
|
|
133
|
-
def get_main_path(self):
|
|
143
|
+
def get_main_path(self) -> Path:
|
|
134
144
|
return self.get_root_path().joinpath(self.get_main())
|
|
135
145
|
|
|
136
|
-
def get_root(self):
|
|
146
|
+
def get_root(self) -> Path:
|
|
137
147
|
return self._root
|
|
138
148
|
|
|
139
|
-
def get_root_path(self):
|
|
140
|
-
return
|
|
149
|
+
def get_root_path(self) -> Path:
|
|
150
|
+
return self.get_root().expanduser().resolve()
|
|
141
151
|
|
|
142
|
-
def get_test(self):
|
|
152
|
+
def get_test(self) -> str:
|
|
143
153
|
return self._parsed.get('test', AntPluginSet.DEFAULT_TEST)
|
|
144
154
|
|
|
145
|
-
def get_test_path(self):
|
|
155
|
+
def get_test_path(self) -> Path:
|
|
146
156
|
return self.get_root_path().joinpath(self.get_test())
|
|
147
157
|
|
|
148
|
-
def has_plugin(self, plugin_id):
|
|
158
|
+
def has_plugin(self, plugin_id: str) -> bool:
|
|
149
159
|
return self._plugin_path(plugin_id).is_file()
|
|
150
160
|
|
|
151
|
-
def make_plugin(self, plugin_id):
|
|
161
|
+
def make_plugin(self, plugin_id: str) -> Plugin:
|
|
152
162
|
return Plugin.from_path(self._plugin_path(plugin_id))
|
|
153
163
|
|
|
154
|
-
def _big_build(self):
|
|
164
|
+
def _big_build(self) -> None:
|
|
155
165
|
if not self._built:
|
|
156
166
|
# Do build
|
|
157
167
|
subprocess.run('ant load-plugins',
|
|
@@ -159,7 +169,7 @@ class AntPluginSet(PluginSet):
|
|
|
159
169
|
self._built = True
|
|
160
170
|
|
|
161
171
|
# Returns (jar_path, plugin)
|
|
162
|
-
def _little_build(self, plugin_id, keystore_path, keystore_alias, keystore_password=None):
|
|
172
|
+
def _little_build(self, plugin_id: str, keystore_path: Path, keystore_alias: str, keystore_password: str=None) -> Tuple[Path, Plugin]:
|
|
163
173
|
orig_plugin = None
|
|
164
174
|
cur_id = plugin_id
|
|
165
175
|
# Get all directories for jarplugin -d
|
|
@@ -198,16 +208,15 @@ class AntPluginSet(PluginSet):
|
|
|
198
208
|
raise self._sanitize(cpe)
|
|
199
209
|
if not jar_path.is_file():
|
|
200
210
|
raise FileNotFoundError(str(jar_path))
|
|
201
|
-
return
|
|
211
|
+
return jar_path, orig_plugin
|
|
202
212
|
|
|
203
|
-
def _plugin_path(self, plugin_id):
|
|
204
|
-
return
|
|
213
|
+
def _plugin_path(self, plugin_id: str) -> Path:
|
|
214
|
+
return self.get_main_path().joinpath(Plugin.id_to_file(plugin_id))
|
|
205
215
|
|
|
206
|
-
def _sanitize(self, called_process_error):
|
|
216
|
+
def _sanitize(self, called_process_error: subprocess.CalledProcessError) -> subprocess.CalledProcessError:
|
|
207
217
|
cmd = called_process_error.cmd[:]
|
|
208
|
-
i
|
|
209
|
-
|
|
210
|
-
if i > 1 and cmd[i - 1] == '--password':
|
|
218
|
+
for i in range(1, len(cmd)):
|
|
219
|
+
if cmd[i - 1] == '--password':
|
|
211
220
|
cmd[i] = '<password>'
|
|
212
221
|
called_process_error.cmd = ' '.join([shlex.quote(c) for c in cmd])
|
|
213
222
|
return called_process_error
|
|
@@ -221,41 +230,41 @@ class MavenPluginSet(PluginSet):
|
|
|
221
230
|
|
|
222
231
|
DEFAULT_TEST = 'src/test/java'
|
|
223
232
|
|
|
224
|
-
def __init__(self, parsed,
|
|
233
|
+
def __init__(self, parsed: YamlT, root: Path) -> None:
|
|
225
234
|
super().__init__(parsed)
|
|
226
|
-
self._built = False
|
|
227
|
-
self._root =
|
|
235
|
+
self._built: bool = False
|
|
236
|
+
self._root: Path = root.parent
|
|
228
237
|
|
|
229
238
|
# Returns (jar_path, plugin)
|
|
230
|
-
def build_plugin(self, plugin_id, keystore_path, keystore_alias, keystore_password=None):
|
|
239
|
+
def build_plugin(self, plugin_id: str, keystore_path: Path, keystore_alias: str, keystore_password=None) -> Tuple[Path, Plugin]:
|
|
231
240
|
self._big_build(keystore_path, keystore_alias, keystore_password=keystore_password)
|
|
232
241
|
return self._little_build(plugin_id)
|
|
233
242
|
|
|
234
|
-
def get_main(self):
|
|
243
|
+
def get_main(self) -> str:
|
|
235
244
|
return self._parsed.get('main', MavenPluginSet.DEFAULT_MAIN)
|
|
236
245
|
|
|
237
|
-
def get_main_path(self):
|
|
246
|
+
def get_main_path(self) -> Path:
|
|
238
247
|
return self.get_root_path().joinpath(self.get_main())
|
|
239
248
|
|
|
240
|
-
def get_root(self):
|
|
249
|
+
def get_root(self) -> Path:
|
|
241
250
|
return self._root
|
|
242
251
|
|
|
243
|
-
def get_root_path(self):
|
|
244
|
-
return
|
|
252
|
+
def get_root_path(self) -> Path:
|
|
253
|
+
return self.get_root().expanduser().resolve()
|
|
245
254
|
|
|
246
|
-
def get_test(self):
|
|
255
|
+
def get_test(self) -> str:
|
|
247
256
|
return self._parsed.get('test', MavenPluginSet.DEFAULT_TEST)
|
|
248
257
|
|
|
249
|
-
def get_test_path(self):
|
|
258
|
+
def get_test_path(self) -> Path:
|
|
250
259
|
return self.get_root_path().joinpath(self.get_test())
|
|
251
260
|
|
|
252
|
-
def has_plugin(self, plugin_id):
|
|
261
|
+
def has_plugin(self, plugin_id) -> bool:
|
|
253
262
|
return self._plugin_path(plugin_id).is_file()
|
|
254
263
|
|
|
255
|
-
def make_plugin(self, plugin_id):
|
|
264
|
+
def make_plugin(self, plugin_id) -> Plugin:
|
|
256
265
|
return Plugin.from_path(self._plugin_path(plugin_id))
|
|
257
266
|
|
|
258
|
-
def _big_build(self, keystore_path, keystore_alias, keystore_password=None):
|
|
267
|
+
def _big_build(self, keystore_path: Path, keystore_alias: str, keystore_password: str=None) -> None:
|
|
259
268
|
if not self._built:
|
|
260
269
|
# Do build
|
|
261
270
|
cmd = ['mvn', 'package',
|
|
@@ -269,18 +278,17 @@ class MavenPluginSet(PluginSet):
|
|
|
269
278
|
self._built = True
|
|
270
279
|
|
|
271
280
|
# Returns (jar_path, plugin)
|
|
272
|
-
def _little_build(self, plugin_id):
|
|
273
|
-
jar_path =
|
|
281
|
+
def _little_build(self, plugin_id: str) -> Tuple[Path, Plugin]:
|
|
282
|
+
jar_path = self.get_root_path().joinpath('target', 'pluginjars', f'{plugin_id}.jar')
|
|
274
283
|
if not jar_path.is_file():
|
|
275
284
|
raise Exception(f'{plugin_id}: built JAR not found: {jar_path!s}')
|
|
276
|
-
return
|
|
285
|
+
return jar_path, Plugin.from_jar(jar_path)
|
|
277
286
|
|
|
278
|
-
def _plugin_path(self, plugin_id):
|
|
279
|
-
return
|
|
287
|
+
def _plugin_path(self, plugin_id) -> Path:
|
|
288
|
+
return self.get_main_path().joinpath(Plugin.id_to_file(plugin_id))
|
|
280
289
|
|
|
281
|
-
def _sanitize(self, called_process_error):
|
|
290
|
+
def _sanitize(self, called_process_error: subprocess.CalledProcessError) -> subprocess.CalledProcessError:
|
|
282
291
|
cmd = called_process_error.cmd[:]
|
|
283
|
-
i = 0
|
|
284
292
|
for i in range(len(cmd)):
|
|
285
293
|
if cmd[i].startswith('-Dkeystore.password='):
|
|
286
294
|
cmd[i] = '-Dkeystore.password=<password>'
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
|
|
3
|
-
# Copyright (c) 2000-
|
|
3
|
+
# Copyright (c) 2000-2024, Board of Trustees of Leland Stanford Jr. University
|
|
4
4
|
#
|
|
5
5
|
# Redistribution and use in source and binary forms, with or without
|
|
6
6
|
# modification, are permitted provided that the following conditions are met:
|
lockss/turtles/util.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
|
|
3
|
-
# Copyright (c) 2000-
|
|
3
|
+
# Copyright (c) 2000-2025, Board of Trustees of Leland Stanford Jr. University
|
|
4
4
|
#
|
|
5
5
|
# Redistribution and use in source and binary forms, with or without
|
|
6
6
|
# modification, are permitted provided that the following conditions are met:
|
|
@@ -28,28 +28,26 @@
|
|
|
28
28
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
29
29
|
# POSSIBILITY OF SUCH DAMAGE.
|
|
30
30
|
|
|
31
|
-
from pathlib import Path, PurePath
|
|
32
31
|
import json
|
|
32
|
+
from pathlib import Path
|
|
33
|
+
from typing import Any, List, TypeAlias, Union
|
|
33
34
|
|
|
34
35
|
import jsonschema
|
|
35
36
|
import jsonschema.exceptions
|
|
36
37
|
import yaml
|
|
37
38
|
|
|
38
39
|
|
|
39
|
-
|
|
40
|
+
YamlT: TypeAlias = Any
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def load_and_validate(schema_path: Path, instance_path: Path, multiple: bool=False) -> Union[List[YamlT], YamlT]:
|
|
40
44
|
with schema_path.open('r') as f:
|
|
41
45
|
schema = json.load(f)
|
|
42
46
|
with instance_path.open('r') as f:
|
|
43
|
-
ret = list(yaml.safe_load_all(f) if multiple else [yaml.safe_load(f)]
|
|
47
|
+
ret = list(yaml.safe_load_all(f)) if multiple else [yaml.safe_load(f)]
|
|
44
48
|
for instance in ret:
|
|
45
49
|
try:
|
|
46
50
|
jsonschema.validate(instance, schema)
|
|
47
51
|
except jsonschema.exceptions.ValidationError as validation_exception:
|
|
48
52
|
raise Exception(validation_exception.message) from validation_exception
|
|
49
53
|
return ret if multiple else ret[0]
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
def _path(purepath_or_string):
|
|
53
|
-
if not issubclass(type(purepath_or_string), PurePath):
|
|
54
|
-
purepath_or_string = Path(purepath_or_string)
|
|
55
|
-
return purepath_or_string.expanduser().resolve()
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
Copyright (c) 2000-
|
|
1
|
+
Copyright (c) 2000-2025, Board of Trustees of Leland Stanford Jr. University
|
|
2
2
|
|
|
3
3
|
Redistribution and use in source and binary forms, with or without
|
|
4
4
|
modification, are permitted provided that the following conditions are met:
|
|
@@ -1,31 +1,29 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.3
|
|
2
2
|
Name: lockss-turtles
|
|
3
|
-
Version: 0.
|
|
4
|
-
Summary:
|
|
5
|
-
Home-page: https://www.lockss.org/
|
|
3
|
+
Version: 0.6.0.dev1
|
|
4
|
+
Summary: Library and command line tool to manage LOCKSS plugin sets and LOCKSS plugin registries
|
|
6
5
|
License: BSD-3-Clause
|
|
7
6
|
Author: Thib Guicherd-Callin
|
|
8
7
|
Author-email: thib@cs.stanford.edu
|
|
9
|
-
|
|
8
|
+
Maintainer: Thib Guicherd-Callin
|
|
9
|
+
Maintainer-email: thib@cs.stanford.edu
|
|
10
|
+
Requires-Python: >=3.9,<4.0
|
|
10
11
|
Classifier: Development Status :: 5 - Production/Stable
|
|
11
12
|
Classifier: Environment :: Console
|
|
13
|
+
Classifier: Framework :: Pydantic :: 2
|
|
12
14
|
Classifier: Intended Audience :: Developers
|
|
13
15
|
Classifier: Intended Audience :: System Administrators
|
|
14
16
|
Classifier: License :: OSI Approved :: BSD License
|
|
15
|
-
Classifier:
|
|
16
|
-
Classifier:
|
|
17
|
-
Classifier:
|
|
18
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
19
|
-
Classifier: Programming Language :: Python :: 3.10
|
|
20
|
-
Classifier: Programming Language :: Python :: 3.11
|
|
21
|
-
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Programming Language :: Python
|
|
18
|
+
Classifier: Topic :: Software Development :: Libraries
|
|
19
|
+
Classifier: Topic :: System :: Archiving
|
|
22
20
|
Classifier: Topic :: Utilities
|
|
23
|
-
Requires-Dist: java-manifest (>=1.1.0,<2.0
|
|
24
|
-
Requires-Dist: jsonschema (>=4.
|
|
25
|
-
Requires-Dist:
|
|
26
|
-
Requires-Dist:
|
|
27
|
-
Requires-Dist:
|
|
28
|
-
Requires-Dist: xdg (>=6.0.0,<
|
|
21
|
+
Requires-Dist: java-manifest (>=1.1.0,<1.2.0)
|
|
22
|
+
Requires-Dist: jsonschema (>=4.24.0,<4.25.0)
|
|
23
|
+
Requires-Dist: lockss-pybasic (>=0.1.0,<0.2.0)
|
|
24
|
+
Requires-Dist: pydantic (>=2.11.7,<3.0.0)
|
|
25
|
+
Requires-Dist: pyyaml (>=6.0.0,<6.1.0)
|
|
26
|
+
Requires-Dist: xdg (>=6.0.0,<6.1.0)
|
|
29
27
|
Project-URL: Repository, https://github.com/lockss/lockss-turtles
|
|
30
28
|
Description-Content-Type: text/x-rst
|
|
31
29
|
|
|
@@ -33,7 +31,7 @@ Description-Content-Type: text/x-rst
|
|
|
33
31
|
Turtles
|
|
34
32
|
=======
|
|
35
33
|
|
|
36
|
-
.. |RELEASE| replace:: 0.
|
|
34
|
+
.. |RELEASE| replace:: 0.6.0-dev1
|
|
37
35
|
.. |RELEASE_DATE| replace:: ?
|
|
38
36
|
|
|
39
37
|
.. |HELP| replace:: ``--help/-h``
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
lockss/turtles/__init__.py,sha256=XtVZv5yj1ZTzv20WxZo--7Cu4axe8CjwIL71k0dOwxw,1743
|
|
2
|
+
lockss/turtles/__main__.py,sha256=825geLIwXS0LKRqxifJXlLaAZrY8nllXfHzw5ch5ysM,1624
|
|
3
|
+
lockss/turtles/app.py,sha256=Ez2erWSvyiOEusuGzPghTybJmzjEQxBX4eqQ2ZAdISc,10166
|
|
4
|
+
lockss/turtles/cli.py,sha256=yOuvoTMHsG72x6857jIQwei8ch5R2dhkFI1Zj3yCyHI,15894
|
|
5
|
+
lockss/turtles/plugin.py,sha256=saZZW_oLkL6YXi1INRZSOyH43UrAay22eZptF-RwEQg,5303
|
|
6
|
+
lockss/turtles/plugin_registry.py,sha256=6wqO2wAaC33oOHQrembzsbhYh6mkRa4z9UlVD2yoi24,10397
|
|
7
|
+
lockss/turtles/plugin_set.py,sha256=VtVr5MXcP9ps6CDQPsBPSbEdJ5ZuTumGhVGlv6iLQcY,11615
|
|
8
|
+
lockss/turtles/resources/__init__.py,sha256=uEuqtibBLM9fuwA_xFvzUmLRJsSoVrW-2YM8iyBiLuE,1579
|
|
9
|
+
lockss/turtles/resources/plugin-registry-catalog-schema.json,sha256=etH0ytEXTw1QFFRaxJySCNX9fWP63BXo8n91Snv5Yjc,685
|
|
10
|
+
lockss/turtles/resources/plugin-registry-schema.json,sha256=dvNSxkU0McAe-fYIYBMJ9ezBvRSAW3kvhCcfESq5BrY,2766
|
|
11
|
+
lockss/turtles/resources/plugin-set-catalog-schema.json,sha256=UbB0BCd9jdROGyXf2pZg4GV4lxToM9uBgN5WVyndK4w,650
|
|
12
|
+
lockss/turtles/resources/plugin-set-schema.json,sha256=EeptOiipJdWwfLIxUHXap59Hbq32UXzT2MpI2eADM1U,2338
|
|
13
|
+
lockss/turtles/resources/plugin-signing-credentials-schema.json,sha256=VLld14jOMG8V_ru0jtQD5GunNDNLp2MoRGMSZg9xVn8,753
|
|
14
|
+
lockss/turtles/util.py,sha256=nl3EovLik6EBzXRgFSQenAWSr5qps1ICfszTFBnrcfU,2339
|
|
15
|
+
lockss_turtles-0.6.0.dev1.dist-info/LICENSE,sha256=O9ONND4uDxY_jucI4jZDf2liAk05ScEJaYu-Al7EOdQ,1506
|
|
16
|
+
lockss_turtles-0.6.0.dev1.dist-info/METADATA,sha256=HdOK6Byp-NQIohYT3X8CED1piGNafaOUoR5DTQ5utpY,39418
|
|
17
|
+
lockss_turtles-0.6.0.dev1.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
|
18
|
+
lockss_turtles-0.6.0.dev1.dist-info/entry_points.txt,sha256=25BAVFSBRKWAWiXIGZgcr1ypt2mV7nj31Jl8WcNZZOk,51
|
|
19
|
+
lockss_turtles-0.6.0.dev1.dist-info/RECORD,,
|
CHANGELOG.rst
DELETED
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
=============
|
|
2
|
-
Release Notes
|
|
3
|
-
=============
|
|
4
|
-
|
|
5
|
-
-----
|
|
6
|
-
0.5.0
|
|
7
|
-
-----
|
|
8
|
-
|
|
9
|
-
Released: ?
|
|
10
|
-
|
|
11
|
-
* **Features**
|
|
12
|
-
|
|
13
|
-
-----
|
|
14
|
-
0.4.0
|
|
15
|
-
-----
|
|
16
|
-
|
|
17
|
-
Released: 2023-05-17
|
|
18
|
-
|
|
19
|
-
* **Features**
|
|
20
|
-
|
|
21
|
-
* ``directory`` plugin registry layout now has the same file naming convention option as ``rcs``.
|
|
22
|
-
|
|
23
|
-
* New ``directory``/``rcs`` file naming convention ``underscore``: replace ``.`` in the plugin identifier by ``_`` and add ``.jar``.
|
|
24
|
-
|
|
25
|
-
* CLI improvements.
|
|
26
|
-
|
|
27
|
-
* **Changes**
|
|
28
|
-
|
|
29
|
-
* The ``--output-format`` option is now only available in the context of commands where it makes sense.
|
|
30
|
-
|
|
31
|
-
-----
|
|
32
|
-
0.3.1
|
|
33
|
-
-----
|
|
34
|
-
|
|
35
|
-
Released: 2023-03-07
|
|
36
|
-
|
|
37
|
-
* **Bug Fixes**
|
|
38
|
-
|
|
39
|
-
* Fixed use of the ``importlib.resources`` library.
|
|
40
|
-
|
|
41
|
-
-----
|
|
42
|
-
0.3.0
|
|
43
|
-
-----
|
|
44
|
-
|
|
45
|
-
Released: 2023-03-07
|
|
46
|
-
|
|
47
|
-
* **Features**
|
|
48
|
-
|
|
49
|
-
* Completely refactored to be in the package ``lockss.turtles``.
|
|
50
|
-
|
|
51
|
-
* Using Poetry to make uploadable to and installable from PyPI as `lockss-turtles <https://pypi.org/project/lockss-turtles>`_. Removed the requirements file.
|
|
52
|
-
|
|
53
|
-
* Validate the various YAML objects (like a ``PluginSet``) against a `JSON Schema <https://json-schema.org/>`_.
|
|
54
|
-
|
|
55
|
-
* **Changes**
|
|
56
|
-
|
|
57
|
-
* Temporarily disabled the ``analyze-registry`` command.
|
|
58
|
-
|
|
59
|
-
* ``$XDG_CONFIG_HOME/turtles`` (by default ``$HOME/.config/turtles``) is now ``$XDG_CONFIG_HOME/lockss.turtles`` (by default ``$HOME/.config/lockss.turtles``) or ``/etc/lockss.turtles`` (formerly ``turtles``).
|
|
60
|
-
|
|
61
|
-
* ``settings.yaml`` is now ``plugin-signing.yaml`` and its ``kind`` is now ``PluginSigning``. The corresponding command line option ``--settings`` is now ``--plugin-signing``.
|
|
62
|
-
|
|
63
|
-
* ``plugin-sets.yaml``, its kind ``PluginSets``, its key ``plugin-sets``, and the command line option ``--plugin-sets`` are now ``plugin-set-catalog.yaml``, ``PluginSetCatalog``, ``plugin-set-files`` and ``--plugin-set-catalog``, respectively. The builder ``options`` key is deprecated.
|
|
64
|
-
|
|
65
|
-
* ``plugin-registries.yaml``, its kind ``PluginRegistries``, its key ``plugin-registries``, and the command line option ``--plugin-registries`` are now ``plugin-registry-catalog.yaml``, ``PluginRegistryCatalog``, ``plugin-registry-files`` and ``--plugin-registry-catalog``, respectively. The ``file-naming-convention`` key is now directly under ``layout`` and the value ``full`` is now ``identifier``. The layout ``options`` key is deprecated.
|
|
66
|
-
|
|
67
|
-
-----
|
|
68
|
-
0.2.0
|
|
69
|
-
-----
|
|
70
|
-
|
|
71
|
-
Released: 2022-10-26
|
|
72
|
-
|
|
73
|
-
* **Features**
|
|
74
|
-
|
|
75
|
-
* ``MavenPluginSet``, for Maven projects inheriting from ``org.lockss:lockss-plugins-parent-pom``.
|
|
76
|
-
|
|
77
|
-
* ``RcsPluginRegistry``: file naming convention layout option.
|
|
78
|
-
|
|
79
|
-
* Tabular output now includes the plugin version.
|
|
80
|
-
|
|
81
|
-
* **Bug Fixes**
|
|
82
|
-
|
|
83
|
-
* ``AntPluginSet``: run ``ant load-plugins`` before building plugins.
|
|
84
|
-
|
|
85
|
-
-----
|
|
86
|
-
0.1.1
|
|
87
|
-
-----
|
|
88
|
-
|
|
89
|
-
Released: 2022-10-23
|
|
90
|
-
|
|
91
|
-
* **Bug Fixes**
|
|
92
|
-
|
|
93
|
-
* ``RcsPluginRegistry``: Better handle incompletely managed RCS areas.
|
|
94
|
-
|
|
95
|
-
* ``DirectoryPluginRegistry``: Better file handling with ``cp``.
|
|
96
|
-
|
|
97
|
-
-----
|
|
98
|
-
0.1.0
|
|
99
|
-
-----
|
|
100
|
-
|
|
101
|
-
Released: 2022-10-10
|
|
102
|
-
|
|
103
|
-
* **Features**
|
|
104
|
-
|
|
105
|
-
* Initial release.
|
|
106
|
-
|
|
107
|
-
* ``AntPluginSet``, based on the classic ``lockss-daemon`` Ant builder.
|
|
108
|
-
|
|
109
|
-
* ``DirectoryPluginRegistry``, for a simple layout.
|
|
110
|
-
|
|
111
|
-
* ``RcsPluginRegistry``, based on the classic RCS layout.
|
|
112
|
-
|
|
113
|
-
* Tabular output by `tabulate <https://pypi.org/project/tabulate/>`_.
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
CHANGELOG.rst,sha256=RQtaT4SvQQhwh-CyUyliviGFoqVd1aXRMErRO3v8bu4,3216
|
|
2
|
-
lockss/turtles/__init__.py,sha256=FH3zmqgrF7A_J5tIKZ5-yFDnx7ypO2nRVkixnNqEAIQ,3201
|
|
3
|
-
lockss/turtles/__main__.py,sha256=57NMiI-NAibLExMX0Y6QApQhaDUblHTQqCDSiWBVt6k,1633
|
|
4
|
-
lockss/turtles/app.py,sha256=X6AoOPPJEKrhcT9kwNXp7J7XO3KLoXdLdozgKf49Ajw,9074
|
|
5
|
-
lockss/turtles/cli.py,sha256=yZqmRrGSY_4aMAv6nvx-ax6Lab_ckoNg1BVsOuoGm1U,22476
|
|
6
|
-
lockss/turtles/plugin.py,sha256=gdJCRvUO3C8iy_8AnrVjWrnd6lifv5dSdWe-l6O63gE,4709
|
|
7
|
-
lockss/turtles/plugin_registry.py,sha256=cgsGSlhNnAuJUOnPeHxRMkJdI_Wmha79Z2cG_Lpq_lw,9441
|
|
8
|
-
lockss/turtles/plugin_set.py,sha256=fq3tZ5-fhe60DWD65Y6wnu_FOTVBdff11hmFUfAWj20,10771
|
|
9
|
-
lockss/turtles/resources/__init__.py,sha256=qHJYdSSUBYvd4Ib_RPqN0P5G2nHFYrf9UqLsHaN0J8U,1579
|
|
10
|
-
lockss/turtles/resources/plugin-registry-catalog-schema.json,sha256=etH0ytEXTw1QFFRaxJySCNX9fWP63BXo8n91Snv5Yjc,685
|
|
11
|
-
lockss/turtles/resources/plugin-registry-schema.json,sha256=dvNSxkU0McAe-fYIYBMJ9ezBvRSAW3kvhCcfESq5BrY,2766
|
|
12
|
-
lockss/turtles/resources/plugin-set-catalog-schema.json,sha256=UbB0BCd9jdROGyXf2pZg4GV4lxToM9uBgN5WVyndK4w,650
|
|
13
|
-
lockss/turtles/resources/plugin-set-schema.json,sha256=EeptOiipJdWwfLIxUHXap59Hbq32UXzT2MpI2eADM1U,2338
|
|
14
|
-
lockss/turtles/resources/plugin-signing-credentials-schema.json,sha256=VLld14jOMG8V_ru0jtQD5GunNDNLp2MoRGMSZg9xVn8,753
|
|
15
|
-
lockss/turtles/util.py,sha256=g3pGADgnmaQce3pNrpA1VjuSlNUJUAITyPyM6pNdVOA,2430
|
|
16
|
-
lockss_turtles-0.5.0.dev3.dist-info/LICENSE,sha256=ArAnVWK-WhSxCVQWDF_PWBETwjSZ35HfugnUJPqPXyg,1506
|
|
17
|
-
lockss_turtles-0.5.0.dev3.dist-info/METADATA,sha256=KdVIBLBrcTJbxiYbSUDXnyki4Mf_oTKJR5zHDnW2DPs,39524
|
|
18
|
-
lockss_turtles-0.5.0.dev3.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
|
19
|
-
lockss_turtles-0.5.0.dev3.dist-info/entry_points.txt,sha256=25BAVFSBRKWAWiXIGZgcr1ypt2mV7nj31Jl8WcNZZOk,51
|
|
20
|
-
lockss_turtles-0.5.0.dev3.dist-info/RECORD,,
|
{lockss_turtles-0.5.0.dev3.dist-info → lockss_turtles-0.6.0.dev1.dist-info}/entry_points.txt
RENAMED
|
File without changes
|