autopkg-wrapper 2024.7.1__py3-none-any.whl → 2025.6.1__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 +0,0 @@
1
- __version__ = "2024.7.1"
@@ -33,10 +33,14 @@ class Recipe(object):
33
33
 
34
34
  return name
35
35
 
36
- def verify_trust_info(self, debug):
37
- verbose_output = ["-vvvv"]
36
+ def verify_trust_info(self, args):
37
+ verbose_output = ["-vvvv"] if args.debug else None
38
+ prefs_file = (
39
+ ["--prefs", args.autopkg_prefs.as_posix()] if args.autopkg_prefs else None
40
+ )
38
41
  cmd = ["/usr/local/bin/autopkg", "verify-trust-info", self.filename]
39
- cmd = cmd + verbose_output if debug else cmd
42
+ cmd = cmd + verbose_output if verbose_output else cmd
43
+ cmd = cmd + prefs_file if prefs_file else cmd
40
44
  cmd = " ".join(cmd)
41
45
  logging.debug(f"cmd: {str(cmd)}")
42
46
 
@@ -53,8 +57,12 @@ class Recipe(object):
53
57
  self.verified = False
54
58
  return self.verified
55
59
 
56
- def update_trust_info(self):
60
+ def update_trust_info(self, args):
61
+ prefs_file = (
62
+ ["--prefs", args.autopkg_prefs.as_posix()] if args.autopkg_prefs else None
63
+ )
57
64
  cmd = ["/usr/local/bin/autopkg", "update-trust-info", self.filename]
65
+ cmd = cmd + prefs_file if prefs_file else cmd
58
66
  cmd = " ".join(cmd)
59
67
  logging.debug(f"cmd: {str(cmd)}")
60
68
 
@@ -80,7 +88,7 @@ class Recipe(object):
80
88
 
81
89
  return {"imported": imported_items, "failed": failed_items}
82
90
 
83
- def run(self, debug):
91
+ def run(self, args):
84
92
  if self.verified is False:
85
93
  self.error = True
86
94
  self.results["failed"] = True
@@ -95,8 +103,24 @@ class Recipe(object):
95
103
  report.touch(exist_ok=True)
96
104
 
97
105
  try:
98
- post_processor_cmd = list(chain.from_iterable([("--post", processor) for processor in self.post_processors])) if self.post_processors else None
99
- verbose_output = ["-vvvv"]
106
+ prefs_file = (
107
+ ["--prefs", args.autopkg_prefs.as_posix()]
108
+ if args.autopkg_prefs
109
+ else None
110
+ )
111
+ verbose_output = ["-vvvv"] if args.debug else None
112
+ post_processor_cmd = (
113
+ list(
114
+ chain.from_iterable(
115
+ [
116
+ ("--post", processor)
117
+ for processor in self.post_processors
118
+ ]
119
+ )
120
+ )
121
+ if self.post_processors
122
+ else None
123
+ )
100
124
  cmd = [
101
125
  "/usr/local/bin/autopkg",
102
126
  "run",
@@ -105,7 +129,8 @@ class Recipe(object):
105
129
  str(report),
106
130
  ]
107
131
  cmd = cmd + post_processor_cmd if post_processor_cmd else cmd
108
- cmd = cmd + verbose_output if debug else cmd
132
+ cmd = cmd + verbose_output if verbose_output else cmd
133
+ cmd = cmd + prefs_file if prefs_file else cmd
109
134
  cmd = " ".join(cmd)
110
135
 
111
136
  logging.debug(f"cmd: {str(cmd)}")
@@ -129,12 +154,28 @@ def get_override_repo_info(args):
129
154
 
130
155
  else:
131
156
  logging.debug("Trying to determine overrides dir from default paths")
132
- user_home = Path.home()
133
- autopkg_prefs_path = user_home / "Library/Preferences/com.github.autopkg.plist"
134
157
 
135
- if autopkg_prefs_path.is_file():
136
- autopkg_prefs = plistlib.loads(autopkg_prefs_path.resolve().read_bytes())
158
+ if args.autopkg_prefs:
159
+ autopkg_prefs_path = Path(args.autopkg_prefs).resolve()
137
160
 
161
+ if autopkg_prefs_path.suffix == ".json":
162
+ with open(autopkg_prefs_path, "r") as f:
163
+ autopkg_prefs = json.load(f)
164
+ elif autopkg_prefs_path.suffix == ".plist":
165
+ autopkg_prefs = plistlib.loads(autopkg_prefs_path.read_bytes())
166
+ else:
167
+ user_home = Path.home()
168
+ autopkg_prefs_path = (
169
+ user_home / "Library/Preferences/com.github.autopkg.plist"
170
+ )
171
+
172
+ if autopkg_prefs_path.is_file():
173
+ autopkg_prefs = plistlib.loads(
174
+ autopkg_prefs_path.resolve().read_bytes()
175
+ )
176
+
177
+ logging.debug(f"autopkg prefs path: {autopkg_prefs_path}")
178
+ logging.debug(f"autopkg prefs: {autopkg_prefs}")
138
179
  recipe_override_dirs = Path(autopkg_prefs["RECIPE_OVERRIDE_DIRS"]).resolve()
139
180
 
140
181
  if Path(recipe_override_dirs / ".git").is_dir():
@@ -145,8 +186,10 @@ def get_override_repo_info(args):
145
186
  logging.debug(f"Override Repo Path: {override_repo_path}")
146
187
 
147
188
  override_repo_git_work_tree = f"--work-tree={override_repo_path}"
148
- override_repo_git_git_dir = f"--git-dir={override_repo_path / ".git"}"
149
- override_repo_url, override_repo_remote_ref = git.get_repo_info(override_repo_git_git_dir)
189
+ override_repo_git_git_dir = f"--git-dir={override_repo_path / '.git'}"
190
+ override_repo_url, override_repo_remote_ref = git.get_repo_info(
191
+ override_repo_git_git_dir
192
+ )
150
193
 
151
194
  git_info = {
152
195
  "override_repo_path": override_repo_path,
@@ -179,22 +222,28 @@ def update_recipe_repo(recipe, git_info, disable_recipe_trust_check, args):
179
222
  current_branch = git.get_current_branch(git_info)
180
223
 
181
224
  if args.disable_git_commands:
182
- logging.info("Not runing git commands as --disable-git-commands has been set")
225
+ logging.info(
226
+ "Not runing git commands as --disable-git-commands has been set"
227
+ )
183
228
  return
184
229
 
185
230
  if current_branch != git_info["override_trust_branch"]:
186
- logging.debug(f"override_trust_branch: {git_info["override_trust_branch"]}")
231
+ logging.debug(
232
+ f"override_trust_branch: {git_info['override_trust_branch']}"
233
+ )
187
234
  git.create_branch(git_info)
188
235
 
189
236
  git.stage_recipe(git_info)
190
- git.commit_recipe(git_info, message=f"Updating Trust Info for {recipe.name}")
237
+ git.commit_recipe(
238
+ git_info, message=f"Updating Trust Info for {recipe.name}"
239
+ )
191
240
  git.pull_branch(git_info)
192
241
  git.push_branch(git_info)
193
242
 
194
243
  return
195
244
 
196
245
 
197
- def parse_recipe_list(recipes, recipe_file, post_processors):
246
+ def parse_recipe_list(recipes, recipe_file, post_processors, args):
198
247
  """Parsing list of recipes into a common format"""
199
248
  recipe_list = None
200
249
 
@@ -214,10 +263,14 @@ def parse_recipe_list(recipes, recipe_file, post_processors):
214
263
  elif isinstance(recipes, str):
215
264
  if recipes.find(",") != -1:
216
265
  # Assuming recipes separated by commas
217
- recipe_list = [recipe.strip() for recipe in recipes.split(",") if recipe]
266
+ recipe_list = [
267
+ recipe.strip() for recipe in recipes.split(",") if recipe
268
+ ]
218
269
  else:
219
270
  # Assuming recipes separated by space
220
- recipe_list = [recipe.strip() for recipe in recipes.split(" ") if recipe]
271
+ recipe_list = [
272
+ recipe.strip() for recipe in recipes.split(" ") if recipe
273
+ ]
221
274
 
222
275
  if recipe_list is None:
223
276
  logging.error(
@@ -233,6 +286,7 @@ def parse_recipe_list(recipes, recipe_file, post_processors):
233
286
 
234
287
  return recipe_map
235
288
 
289
+
236
290
  def parse_post_processors(post_processors):
237
291
  """Parsing list of post_processors"""
238
292
  logging.debug("Parsing post processors")
@@ -247,32 +301,42 @@ def parse_post_processors(post_processors):
247
301
  case list():
248
302
  post_processors_list = post_processors
249
303
  case str() if post_processors.find(",") != -1:
250
- post_processors_list = [post_processor.strip() for post_processor in post_processors.split(",") if post_processor.strip()]
304
+ post_processors_list = [
305
+ post_processor.strip()
306
+ for post_processor in post_processors.split(",")
307
+ if post_processor.strip()
308
+ ]
251
309
  case str():
252
- post_processors_list = [post_processor.strip() for post_processor in post_processors.split(" ") if post_processor.strip()]
310
+ post_processors_list = [
311
+ post_processor.strip()
312
+ for post_processor in post_processors.split(" ")
313
+ if post_processor.strip()
314
+ ]
253
315
 
254
- logging.info(f"Post Processors List: {post_processors_list}") if post_processors_list else None
316
+ logging.info(
317
+ f"Post Processors List: {post_processors_list}"
318
+ ) if post_processors_list else None
255
319
 
256
320
  return post_processors_list
257
321
 
258
322
 
259
- def process_recipe(recipe, disable_recipe_trust_check, debug):
323
+ def process_recipe(recipe, disable_recipe_trust_check, args):
260
324
  if disable_recipe_trust_check:
261
325
  logging.debug("Setting Recipe verification to None")
262
326
  recipe.verified = None
263
327
  else:
264
328
  logging.debug("Checking Recipe verification")
265
- recipe.verify_trust_info(debug)
329
+ recipe.verify_trust_info(args)
266
330
 
267
331
  match recipe.verified:
268
332
  case False | None if disable_recipe_trust_check:
269
333
  logging.debug("Running Recipe without verification")
270
- recipe.run(debug)
334
+ recipe.run(args)
271
335
  case True:
272
336
  logging.debug("Running Recipe after successful verification")
273
- recipe.run(debug)
337
+ recipe.run(args)
274
338
  case False:
275
- recipe.update_trust_info()
339
+ recipe.update_trust_info(args)
276
340
 
277
341
  return recipe
278
342
 
@@ -285,15 +349,35 @@ def main():
285
349
  override_repo_info = get_override_repo_info(args)
286
350
 
287
351
  post_processors_list = parse_post_processors(post_processors=args.post_processors)
288
- recipe_list = parse_recipe_list(recipes=args.recipes, recipe_file=args.recipe_file, post_processors=post_processors_list)
352
+ recipe_list = parse_recipe_list(
353
+ recipes=args.recipes,
354
+ recipe_file=args.recipe_file,
355
+ post_processors=post_processors_list,
356
+ args=args,
357
+ )
289
358
 
290
359
  for recipe in recipe_list:
291
360
  logging.info(f"Processing Recipe: {recipe.name}")
292
- process_recipe(recipe=recipe, disable_recipe_trust_check=args.disable_recipe_trust_check, debug=args.debug)
293
- update_recipe_repo(git_info=override_repo_info, recipe=recipe, disable_recipe_trust_check=args.disable_recipe_trust_check, args=args)
294
- slack.send_notification(recipe=recipe, token=args.slack_token) if args.slack_token else None
295
-
296
- recipe.pr_url = git.create_pull_request(git_info=override_repo_info, recipe=recipe) if args.create_pr else None
361
+ process_recipe(
362
+ recipe=recipe,
363
+ disable_recipe_trust_check=args.disable_recipe_trust_check,
364
+ args=args,
365
+ )
366
+ update_recipe_repo(
367
+ git_info=override_repo_info,
368
+ recipe=recipe,
369
+ disable_recipe_trust_check=args.disable_recipe_trust_check,
370
+ args=args,
371
+ )
372
+ slack.send_notification(
373
+ recipe=recipe, token=args.slack_token
374
+ ) if args.slack_token else None
375
+
376
+ recipe.pr_url = (
377
+ git.create_pull_request(git_info=override_repo_info, recipe=recipe)
378
+ if args.create_pr
379
+ else None
380
+ )
297
381
 
298
382
 
299
383
  if __name__ == "__main__":
@@ -1 +0,0 @@
1
- __version__ = "0.0.0"
@@ -19,7 +19,7 @@ def send_notification(recipe, token):
19
19
  if not recipe.results["failed"]:
20
20
  task_description = "Unknown error"
21
21
  else:
22
- task_description = ("Error: {} \n" "Traceback: {} \n").format(
22
+ task_description = ("Error: {} \nTraceback: {} \n").format(
23
23
  recipe.results["failed"][0]["message"],
24
24
  recipe.results["failed"][0]["traceback"],
25
25
  )
@@ -1 +0,0 @@
1
- __version__ = "0.0.0"
@@ -14,6 +14,7 @@ def validate_file(arg):
14
14
  message = f"Error! This is not valid file: {arg}"
15
15
  raise argparse.ArgumentTypeError(message)
16
16
 
17
+
17
18
  def validate_directory(arg):
18
19
  dir_path = Path(arg).resolve()
19
20
  dir_exists = dir_path.is_dir()
@@ -24,14 +25,25 @@ def validate_directory(arg):
24
25
  message = f"Error! This is not valid directory: {arg}"
25
26
  raise argparse.ArgumentTypeError(message)
26
27
 
28
+
27
29
  def validate_bool(arg):
28
30
  if isinstance(arg, bool):
29
31
  return arg
30
- elif isinstance(arg, str) and arg.lower() in ['0','false','no', 'f']:
32
+ elif isinstance(arg, str) and arg.lower() in ["0", "false", "no", "f"]:
31
33
  return False
32
- elif isinstance(arg, str) and arg.lower() in ['1','true','yes', 't']:
34
+ elif isinstance(arg, str) and arg.lower() in ["1", "true", "yes", "t"]:
33
35
  return True
34
36
 
37
+
38
+ def find_github_token():
39
+ if os.getenv("GITHUB_TOKEN", None):
40
+ return os.getenv("GITHUB_TOKEN")
41
+ elif os.getenv("GH_TOKEN", None):
42
+ return os.getenv("GH_TOKEN")
43
+ else:
44
+ return None
45
+
46
+
35
47
  def setup_args():
36
48
  parser = argparse.ArgumentParser(description="Run autopkg recipes")
37
49
  recipe_arguments = parser.add_mutually_exclusive_group()
@@ -78,11 +90,18 @@ def setup_args():
78
90
  If this option is used, git commands won't be run
79
91
  """,
80
92
  )
81
- parser.add_argument("--slack-token", default=os.getenv("SLACK_WEBHOOK_TOKEN", None), help=argparse.SUPPRESS)
82
- parser.add_argument("--github-token", default=os.getenv("GITHUB_TOKEN", None))
93
+ parser.add_argument(
94
+ "--slack-token",
95
+ default=os.getenv("SLACK_WEBHOOK_TOKEN", None),
96
+ help=argparse.SUPPRESS,
97
+ )
98
+ parser.add_argument("--github-token", default=find_github_token())
83
99
  parser.add_argument(
84
100
  "--branch-name",
85
- default=os.getenv("AW_TRUST_BRANCH", f"fix/update_trust_information/{datetime.now().strftime("%Y-%m-%dT%H-%M-%S")}"),
101
+ default=os.getenv(
102
+ "AW_TRUST_BRANCH",
103
+ f"fix/update_trust_information/{datetime.now().strftime('%Y-%m-%dT%H-%M-%S')}",
104
+ ),
86
105
  help="""
87
106
  Branch name to be used recipe overrides have failed their trust verification and need to be updated.
88
107
  By default, this will be in the format of \"fix/update_trust_information/YYYY-MM-DDTHH-MM-SS\"
@@ -111,5 +130,13 @@ def setup_args():
111
130
  One or more autopkg post processors to run after each recipe execution
112
131
  """,
113
132
  )
133
+ parser.add_argument(
134
+ "--autopkg-prefs",
135
+ default=os.getenv("AW_AUTOPKG_PREFS_FILE", None),
136
+ type=validate_file,
137
+ help="""
138
+ Path to the autopkg preferences you'd like to use
139
+ """,
140
+ )
114
141
 
115
142
  return parser.parse_args()
@@ -102,8 +102,10 @@ Please review and merge the updated trust information for this override.
102
102
 
103
103
  g = Github(git_info["github_token"])
104
104
  repo = g.get_repo(git_info["override_repo_remote_ref"])
105
- pr = repo.create_pull(title=title, body=body, head=git_info["override_trust_branch"], base="main")
106
- pr_url = f"{git_info["override_repo_url"]}/pull/{pr.number}"
105
+ pr = repo.create_pull(
106
+ title=title, body=body, head=git_info["override_trust_branch"], base="main"
107
+ )
108
+ pr_url = f"{git_info['override_repo_url']}/pull/{pr.number}"
107
109
 
108
110
  logging.debug(f"PR URL: {pr_url}")
109
111
  return pr_url
@@ -1,23 +1,19 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: autopkg-wrapper
3
- Version: 2024.7.1
3
+ Version: 2025.6.1
4
4
  Summary: A package used to execute some autopkg functions, primarily within the context of a GitHub Actions runner.
5
- Home-page: https://github.com/smithjw/autopkg-wrapper
6
- License: BSD-3-Clause
7
- Author: James Smith
8
- Author-email: james@smithjw.me
9
- Requires-Python: >=3.12,<4.0
10
- Classifier: License :: OSI Approved :: BSD License
11
- Classifier: Programming Language :: Python :: 3
12
- Classifier: Programming Language :: Python :: 3.12
13
- Requires-Dist: chardet (>=5)
14
- Requires-Dist: idna (>=3)
15
- Requires-Dist: pygithub (>=2)
16
- Requires-Dist: requests (>=2)
17
- Requires-Dist: ruamel-yaml (>=0.18)
18
- Requires-Dist: toml (>=0.10)
19
- Requires-Dist: urllib3 (>=2)
20
5
  Project-URL: Repository, https://github.com/smithjw/autopkg-wrapper
6
+ Author-email: James Smith <james@smithjw.me>
7
+ License-Expression: BSD-3-Clause
8
+ License-File: LICENSE
9
+ Requires-Python: ~=3.12
10
+ Requires-Dist: chardet>=5
11
+ Requires-Dist: idna>=3
12
+ Requires-Dist: pygithub>=2
13
+ Requires-Dist: requests>=2
14
+ Requires-Dist: ruamel-yaml>=0.18
15
+ Requires-Dist: toml>=0.10
16
+ Requires-Dist: urllib3>=2
21
17
  Description-Content-Type: text/markdown
22
18
 
23
19
  # autopkg-wrapper
@@ -42,6 +38,8 @@ pip install autopkg-wrapper
42
38
  --branch-name BRANCH_NAME Branch name to be used where recipe overrides have failed their trust verification and need to be updated.
43
39
  By default, this will be in the format of "fix/update_trust_information/YYYY-MM-DDTHH-MM-SS"
44
40
  --create-pr If enabled, autopkg_wrapper will open a PR for updated trust information
41
+ --autopkg-prefs AW_AUTOPKG_PREFS_FILE
42
+ Path to the autopkg preferences you'd like to use
45
43
  --autopkg-overrides-repo-path AUTOPKG_OVERRIDES_REPO_PATH
46
44
  The path on disk to the git repository containing the autopkg overrides directory. If none is provided, we will try to determine it for you.
47
45
  ```
@@ -54,4 +52,3 @@ An example folder structure and GitHub Actions Workflow is available within the
54
52
 
55
53
  - [`autopkg_tools` from Facebook](https://github.com/facebook/IT-CPE/tree/main/legacy/autopkg_tools)
56
54
  - [`autopkg_tools` from Facebook, modified by Gusto](https://github.com/Gusto/it-cpe-opensource/tree/main/autopkg)
57
-
@@ -0,0 +1,13 @@
1
+ autopkg_wrapper/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ autopkg_wrapper/autopkg_wrapper.py,sha256=FGZW6o9V-YHlh521BesRstWo-wKg94L5uhylV6KoGAM,13042
3
+ autopkg_wrapper/notifier/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
+ autopkg_wrapper/notifier/slack.py,sha256=aPxQDGd5zPxSsu3mEqalNOF0ly0QnYog0ieHokd5-OY,1979
5
+ autopkg_wrapper/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
+ autopkg_wrapper/utils/args.py,sha256=sWZgTL4c4MSC8k33tH7RIp_TQxQFcaIUmQo5MMoA_sY,4718
7
+ autopkg_wrapper/utils/git_functions.py,sha256=LIQ3SEnPOn1srGrhQuR1pVeurupJXDVaAsmO3pjcRwc,2989
8
+ autopkg_wrapper/utils/logging.py,sha256=3knpMViO_zAU8WM5bSImQaz5M01vMFk_raB4lt1cbvo,324
9
+ autopkg_wrapper-2025.6.1.dist-info/METADATA,sha256=WsZ3Vc2D_UU2XknijbgVpBYatMWgvBunJnoeQq0Sn78,2552
10
+ autopkg_wrapper-2025.6.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
11
+ autopkg_wrapper-2025.6.1.dist-info/entry_points.txt,sha256=TVIcOt7OozzX1c00pwMGbBysaHg_v_N3mO3juoFqPpo,73
12
+ autopkg_wrapper-2025.6.1.dist-info/licenses/LICENSE,sha256=PpNOQjZGcsKFuA0wU16YU7PueVxqPX4OnyZ7TlLQlq4,1602
13
+ autopkg_wrapper-2025.6.1.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 1.9.0
2
+ Generator: hatchling 1.27.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ autopkg_wrapper = autopkg_wrapper.autopkg_wrapper:main
@@ -1,13 +0,0 @@
1
- autopkg_wrapper/__init__.py,sha256=OovimejbaceC1u-RsIy7LN71TIsA01SsZrro76hfSc8,25
2
- autopkg_wrapper/autopkg_wrapper.py,sha256=9t3d58w24P2yU3jZGsmO_hjPK4vFlW4meJ_hBuHgcuo,10940
3
- autopkg_wrapper/notifier/__init__.py,sha256=ShXQBVjyiSOHxoQJS2BvNG395W4KZfqMxZWBAR0MZrE,22
4
- autopkg_wrapper/notifier/slack.py,sha256=nKHeSmgDaTaSUo19ZgnjjjKzeWgg34fMHUwNj9C5FMY,1982
5
- autopkg_wrapper/utils/__init__.py,sha256=ShXQBVjyiSOHxoQJS2BvNG395W4KZfqMxZWBAR0MZrE,22
6
- autopkg_wrapper/utils/args.py,sha256=RW7h5hx6cXfAjXn-Q2w5PRjLHMV8A5vcSWJD_Zjg_2Y,4212
7
- autopkg_wrapper/utils/git_functions.py,sha256=zMMzwRG9V2VFaQk3y_o1H63_hzI1qohwBKaetNDS2mY,2975
8
- autopkg_wrapper/utils/logging.py,sha256=3knpMViO_zAU8WM5bSImQaz5M01vMFk_raB4lt1cbvo,324
9
- autopkg_wrapper-2024.7.1.dist-info/LICENSE,sha256=PpNOQjZGcsKFuA0wU16YU7PueVxqPX4OnyZ7TlLQlq4,1602
10
- autopkg_wrapper-2024.7.1.dist-info/METADATA,sha256=KlvGDQp2b2w8hbel56SiQa4GyKdAit3icpZZqiyiAaU,2636
11
- autopkg_wrapper-2024.7.1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
12
- autopkg_wrapper-2024.7.1.dist-info/entry_points.txt,sha256=-whajEGfgetm2CroLN1IMolYlyM9QqUPM7oJZWQrVfE,72
13
- autopkg_wrapper-2024.7.1.dist-info/RECORD,,
@@ -1,3 +0,0 @@
1
- [console_scripts]
2
- autopkg_wrapper=autopkg_wrapper.autopkg_wrapper:main
3
-