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.
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env python3
2
2
 
3
- # Copyright (c) 2000-2023, Board of Trustees of Leland Stanford Jr. University
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
- import importlib.resources
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 lockss.turtles.plugin import Plugin
39
- import lockss.turtles.resources
40
- from lockss.turtles.util import _load_and_validate, _path
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 = _path(plugin_set_catalog_path)
50
- with importlib.resources.path(lockss.turtles.resources, PluginSetCatalog.PLUGIN_SET_CATALOG_SCHEMA) as plugin_set_catalog_schema_path:
51
- parsed = _load_and_validate(plugin_set_catalog_schema_path, plugin_set_catalog_path)
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
- def __init__(self, parsed):
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
- def get_plugin_set_files(self):
59
- return self._parsed['plugin-set-files']
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
- class PluginSet(object):
85
+ def get_id(self) -> str:
86
+ return self._parsed['id']
63
87
 
64
- PLUGIN_SET_SCHEMA = 'plugin-set-schema.json'
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 = _path(plugin_set_file_path)
69
- with importlib.resources.path(lockss.turtles.resources, PluginSet.PLUGIN_SET_SCHEMA) as plugin_set_schema_path:
70
- lst = _load_and_validate(plugin_set_schema_path, plugin_set_file_path, multiple=True)
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, path):
125
+ def __init__(self, parsed: YamlT, fpath: Path) -> None:
116
126
  super().__init__(parsed)
117
- self._built = False
118
- self._root = path.parent
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 Path(self.get_root()).expanduser().resolve()
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 (jar_path, plugin)
211
+ return jar_path, orig_plugin
202
212
 
203
- def _plugin_path(self, plugin_id):
204
- return Path(self.get_main_path()).joinpath(Plugin.id_to_file(plugin_id))
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 = 0
209
- for i in range(len(cmd)):
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, path):
233
+ def __init__(self, parsed: YamlT, root: Path) -> None:
225
234
  super().__init__(parsed)
226
- self._built = False
227
- self._root = path.parent
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 Path(self.get_root()).expanduser().resolve()
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 = Path(self.get_root_path(), 'target', 'pluginjars', f'{plugin_id}.jar')
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 (jar_path, Plugin.from_jar(jar_path))
285
+ return jar_path, Plugin.from_jar(jar_path)
277
286
 
278
- def _plugin_path(self, plugin_id):
279
- return Path(self.get_main_path()).joinpath(Plugin.id_to_file(plugin_id))
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-2023, Board of Trustees of Leland Stanford Jr. University
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-2023, Board of Trustees of Leland Stanford Jr. University
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
- def _load_and_validate(schema_path, instance_path, multiple=False):
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-2023, Board of Trustees of Leland Stanford Jr. University
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
1
+ Metadata-Version: 2.3
2
2
  Name: lockss-turtles
3
- Version: 0.5.0.dev3
4
- Summary: Tool to manage LOCKSS plugin sets and LOCKSS plugin registries
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
- Requires-Python: >=3.8,<4.0
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: Operating System :: POSIX :: Linux
16
- Classifier: Programming Language :: Python :: 3
17
- Classifier: Programming Language :: Python :: 3.8
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.0)
24
- Requires-Dist: jsonschema (>=4.23.0,<5.0.0)
25
- Requires-Dist: pyyaml (>=6.0.2,<7.0.0)
26
- Requires-Dist: rich-argparse (>=1.5.2,<2.0.0)
27
- Requires-Dist: tabulate (>=0.9.0,<0.10.0)
28
- Requires-Dist: xdg (>=6.0.0,<7.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.5.0-dev1
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,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 1.9.0
2
+ Generator: poetry-core 2.1.3
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
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,,