crackerjack 0.22.3__py3-none-any.whl → 0.22.4__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.

Potentially problematic release.


This version of crackerjack might be problematic. Click here for more details.

@@ -84,7 +84,7 @@ class CodeCleaner(BaseModel, arbitrary_types_allowed=True):
84
84
  code = self.remove_line_comments(code)
85
85
  except Exception as e:
86
86
  self.console.print(
87
- f"[yellow]Warning: Failed to remove line comments from {file_path}: {e}[/yellow]"
87
+ f"[bright_yellow]⚠️ Warning: Failed to remove line comments from {file_path}: {e}[/bright_yellow]"
88
88
  )
89
89
  code = original_code
90
90
  cleaning_failed = True
@@ -92,7 +92,7 @@ class CodeCleaner(BaseModel, arbitrary_types_allowed=True):
92
92
  code = self.remove_docstrings(code)
93
93
  except Exception as e:
94
94
  self.console.print(
95
- f"[yellow]Warning: Failed to remove docstrings from {file_path}: {e}[/yellow]"
95
+ f"[bright_yellow]⚠️ Warning: Failed to remove docstrings from {file_path}: {e}[/bright_yellow]"
96
96
  )
97
97
  code = original_code
98
98
  cleaning_failed = True
@@ -100,7 +100,7 @@ class CodeCleaner(BaseModel, arbitrary_types_allowed=True):
100
100
  code = self.remove_extra_whitespace(code)
101
101
  except Exception as e:
102
102
  self.console.print(
103
- f"[yellow]Warning: Failed to remove extra whitespace from {file_path}: {e}[/yellow]"
103
+ f"[bright_yellow]⚠️ Warning: Failed to remove extra whitespace from {file_path}: {e}[/bright_yellow]"
104
104
  )
105
105
  code = original_code
106
106
  cleaning_failed = True
@@ -108,20 +108,22 @@ class CodeCleaner(BaseModel, arbitrary_types_allowed=True):
108
108
  code = self.reformat_code(code)
109
109
  except Exception as e:
110
110
  self.console.print(
111
- f"[yellow]Warning: Failed to reformat {file_path}: {e}[/yellow]"
111
+ f"[bright_yellow]⚠️ Warning: Failed to reformat {file_path}: {e}[/bright_yellow]"
112
112
  )
113
113
  code = original_code
114
114
  cleaning_failed = True
115
115
  file_path.write_text(code, encoding="utf-8")
116
116
  if cleaning_failed:
117
117
  self.console.print(
118
- f"[yellow]⚠️ Partially cleaned: {file_path}[/yellow]"
118
+ f"[bright_yellow]⚠️ Partially cleaned: {file_path}[/bright_yellow]"
119
119
  )
120
120
  else:
121
- self.console.print(f"[green]✅ Cleaned: {file_path}[/green]")
121
+ self.console.print(
122
+ f"[bright_green]🧹 Cleaned: {file_path}[/bright_green]"
123
+ )
122
124
  except PermissionError as e:
123
125
  self.console.print(
124
- f"[red]❌ Failed to clean: {file_path} (Permission denied)[/red]"
126
+ f"[bright_red]❌ Failed to clean: {file_path} (Permission denied)[/bright_red]"
125
127
  )
126
128
  handle_error(
127
129
  ExecutionError(
@@ -135,7 +137,7 @@ class CodeCleaner(BaseModel, arbitrary_types_allowed=True):
135
137
  )
136
138
  except OSError as e:
137
139
  self.console.print(
138
- f"[red]❌ Failed to clean: {file_path} (File system error)[/red]"
140
+ f"[bright_red]❌ Failed to clean: {file_path} (File system error)[/bright_red]"
139
141
  )
140
142
  handle_error(
141
143
  ExecutionError(
@@ -149,7 +151,7 @@ class CodeCleaner(BaseModel, arbitrary_types_allowed=True):
149
151
  )
150
152
  except UnicodeDecodeError as e:
151
153
  self.console.print(
152
- f"[red]❌ Failed to clean: {file_path} (Encoding error)[/red]"
154
+ f"[bright_red]❌ Failed to clean: {file_path} (Encoding error)[/bright_red]"
153
155
  )
154
156
  handle_error(
155
157
  ExecutionError(
@@ -163,7 +165,7 @@ class CodeCleaner(BaseModel, arbitrary_types_allowed=True):
163
165
  )
164
166
  except Exception as e:
165
167
  self.console.print(
166
- f"[red]❌ Failed to clean: {file_path} (Unexpected error)[/red]"
168
+ f"[bright_red]❌ Failed to clean: {file_path} (Unexpected error)[/bright_red]"
167
169
  )
168
170
  handle_error(
169
171
  ExecutionError(
@@ -613,7 +615,7 @@ class CodeCleaner(BaseModel, arbitrary_types_allowed=True):
613
615
  formatted_code = temp_path.read_text()
614
616
  else:
615
617
  self.console.print(
616
- f"[yellow]Ruff formatting failed: {result.stderr}[/yellow]"
618
+ f"[bright_yellow]⚠️ Ruff formatting failed: {result.stderr}[/bright_yellow]"
617
619
  )
618
620
  handle_error(
619
621
  ExecutionError(
@@ -627,7 +629,9 @@ class CodeCleaner(BaseModel, arbitrary_types_allowed=True):
627
629
  )
628
630
  formatted_code = code
629
631
  except Exception as e:
630
- self.console.print(f"[red]Error running Ruff: {e}[/red]")
632
+ self.console.print(
633
+ f"[bright_red]❌ Error running Ruff: {e}[/bright_red]"
634
+ )
631
635
  handle_error(
632
636
  ExecutionError(
633
637
  message="Error running Ruff",
@@ -644,7 +648,9 @@ class CodeCleaner(BaseModel, arbitrary_types_allowed=True):
644
648
  temp_path.unlink()
645
649
  return formatted_code
646
650
  except Exception as e:
647
- self.console.print(f"[red]Error during reformatting: {e}[/red]")
651
+ self.console.print(
652
+ f"[bright_red]❌ Error during reformatting: {e}[/bright_red]"
653
+ )
648
654
  handle_error(
649
655
  ExecutionError(
650
656
  message="Error during reformatting",
@@ -816,7 +822,7 @@ class ConfigManager(BaseModel, arbitrary_types_allowed=True):
816
822
  self, cmd: list[str], **kwargs: t.Any
817
823
  ) -> subprocess.CompletedProcess[str]:
818
824
  if self.dry_run:
819
- self.console.print(f"[yellow]Would run: {' '.join(cmd)}[/yellow]")
825
+ self.console.print(f"[dim cyan]🔍 Would run: {' '.join(cmd)}[/dim cyan]")
820
826
  return CompletedProcess(cmd, 0, "", "")
821
827
  return execute(cmd, **kwargs)
822
828
 
@@ -838,7 +844,7 @@ class ProjectManager(BaseModel, arbitrary_types_allowed=True):
838
844
  ["pdm", "list", "--freeze"], capture_output=True, text=True
839
845
  ).stdout.splitlines()
840
846
  if not len([pkg for pkg in installed_pkgs if "pre-commit" in pkg]):
841
- self.console.print("Initializing project...")
847
+ self.console.print("[bright_blue]🚀 Initializing project...[/bright_blue]")
842
848
  self.execute_command(["pdm", "self", "add", "keyring"])
843
849
  self.execute_command(["pdm", "config", "python.use_uv", "true"])
844
850
  self.execute_command(["git", "init"])
@@ -853,7 +859,9 @@ class ProjectManager(BaseModel, arbitrary_types_allowed=True):
853
859
  self.config_manager.update_pyproject_configs()
854
860
 
855
861
  def run_pre_commit(self) -> None:
856
- self.console.print("\nRunning pre-commit hooks...\n")
862
+ self.console.print(
863
+ "\n[bright_blue]🔍 Running pre-commit hooks...[/bright_blue]\n"
864
+ )
857
865
  cmd = ["pre-commit", "run", "--all-files"]
858
866
  if hasattr(self, "options") and getattr(self.options, "ai_agent", False):
859
867
  cmd.extend(["-c", ".pre-commit-config-ai.yaml"])
@@ -861,14 +869,16 @@ class ProjectManager(BaseModel, arbitrary_types_allowed=True):
861
869
  if check_all.returncode > 0:
862
870
  check_all = self.execute_command(cmd)
863
871
  if check_all.returncode > 0:
864
- self.console.print("\n\nPre-commit failed. Please fix errors.\n")
872
+ self.console.print(
873
+ "\n\n[bright_red]❌ Pre-commit failed. Please fix errors.[/bright_red]\n"
874
+ )
865
875
  raise SystemExit(1)
866
876
 
867
877
  def execute_command(
868
878
  self, cmd: list[str], **kwargs: t.Any
869
879
  ) -> subprocess.CompletedProcess[str]:
870
880
  if self.dry_run:
871
- self.console.print(f"[yellow]Would run: {' '.join(cmd)}[/yellow]")
881
+ self.console.print(f"[dim cyan]🔍 Would run: {' '.join(cmd)}[/dim cyan]")
872
882
  return CompletedProcess(cmd, 0, "", "")
873
883
  return execute(cmd, **kwargs)
874
884
 
@@ -911,7 +921,7 @@ class Crackerjack(BaseModel, arbitrary_types_allowed=True):
911
921
  self.pkg_name = self.pkg_path.stem.lower().replace("-", "_")
912
922
  self.pkg_dir = self.pkg_path / self.pkg_name
913
923
  self.pkg_dir.mkdir(exist_ok=True)
914
- self.console.print("\nCrackerjacking...\n")
924
+ self.console.print("\n[bright_magenta]🎯 Crackerjacking...[/bright_magenta]\n")
915
925
  self.config_manager.pkg_name = self.pkg_name
916
926
  self.project_manager.pkg_name = self.pkg_name
917
927
  self.project_manager.pkg_dir = self.pkg_dir
@@ -923,9 +933,11 @@ class Crackerjack(BaseModel, arbitrary_types_allowed=True):
923
933
  ["pdm", "install"], capture_output=True, text=True
924
934
  )
925
935
  if result.returncode == 0:
926
- self.console.print("PDM installed: ✅\n")
936
+ self.console.print("[bright_green]✅ PDM installed[/bright_green]\n")
927
937
  self.execute_command(["pdm", "lock"])
928
- self.console.print("Lock file updated: ✅\n")
938
+ self.console.print(
939
+ "[bright_green]✅ Lock file updated[/bright_green]\n"
940
+ )
929
941
  else:
930
942
  self.console.print(
931
943
  "\n\n❌ PDM installation failed. Is PDM is installed? Run `pipx install pdm` and try again.\n\n"
@@ -945,7 +957,9 @@ class Crackerjack(BaseModel, arbitrary_types_allowed=True):
945
957
  if self.pkg_path.stem == "crackerjack":
946
958
  tests_dir = self.pkg_path / "tests"
947
959
  if tests_dir.exists() and tests_dir.is_dir():
948
- self.console.print("\nCleaning tests directory...\n")
960
+ self.console.print(
961
+ "\n[bright_blue]🧹 Cleaning tests directory...[/bright_blue]\n"
962
+ )
949
963
  self.code_cleaner.clean_files(tests_dir)
950
964
 
951
965
  def _get_test_timeout(self, options: OptionsProtocol, project_size: str) -> int:
@@ -1042,26 +1056,34 @@ class Crackerjack(BaseModel, arbitrary_types_allowed=True):
1042
1056
 
1043
1057
  def _print_ai_agent_files(self, options: t.Any) -> None:
1044
1058
  if getattr(options, "ai_agent", False):
1045
- self.console.print("📄 Structured test results: test-results.xml")
1046
- self.console.print("📊 Coverage report: coverage.json")
1059
+ self.console.print(
1060
+ "[dim cyan]📄 Structured test results: test-results.xml[/dim cyan]"
1061
+ )
1062
+ self.console.print("[dim cyan]📊 Coverage report: coverage.json[/dim cyan]")
1047
1063
  if options.benchmark or options.benchmark_regression:
1048
- self.console.print("⏱️ Benchmark results: benchmark.json")
1064
+ self.console.print(
1065
+ "[dim cyan]⏱️ Benchmark results: benchmark.json[/dim cyan]"
1066
+ )
1049
1067
 
1050
1068
  def _handle_test_failure(self, result: t.Any, options: t.Any) -> None:
1051
1069
  if result.stderr:
1052
1070
  self.console.print(result.stderr)
1053
- self.console.print("\n\n❌ Tests failed. Please fix errors.\n")
1071
+ self.console.print(
1072
+ "\n\n[bright_red]❌ Tests failed. Please fix errors.[/bright_red]\n"
1073
+ )
1054
1074
  self._print_ai_agent_files(options)
1055
1075
  raise SystemExit(1)
1056
1076
 
1057
1077
  def _handle_test_success(self, options: t.Any) -> None:
1058
- self.console.print("\n\n✅ Tests passed successfully!\n")
1078
+ self.console.print(
1079
+ "\n\n[bright_green]✅ Tests passed successfully![/bright_green]\n"
1080
+ )
1059
1081
  self._print_ai_agent_files(options)
1060
1082
 
1061
1083
  def _run_tests(self, options: t.Any) -> None:
1062
1084
  if not options.test:
1063
1085
  return
1064
- self.console.print("\n\nRunning tests...\n")
1086
+ self.console.print("\n\n[bright_blue]🧪 Running tests...[/bright_blue]\n")
1065
1087
  test_command = self._prepare_pytest_command(options)
1066
1088
  result = self.execute_command(test_command, capture_output=True, text=True)
1067
1089
  if result.stdout:
@@ -1082,7 +1104,7 @@ class Crackerjack(BaseModel, arbitrary_types_allowed=True):
1082
1104
  default=False,
1083
1105
  ):
1084
1106
  self.console.print(
1085
- f"[yellow]Skipping {option} version bump[/yellow]"
1107
+ f"[dim yellow]⏭️ Skipping {option} version bump[/dim yellow]"
1086
1108
  )
1087
1109
  return
1088
1110
  self.execute_command(["pdm", "bump", option])
@@ -1096,7 +1118,9 @@ class Crackerjack(BaseModel, arbitrary_types_allowed=True):
1096
1118
  self.console.print(build.stdout)
1097
1119
  if build.returncode > 0:
1098
1120
  self.console.print(build.stderr)
1099
- self.console.print("\n\nBuild failed. Please fix errors.\n")
1121
+ self.console.print(
1122
+ "\n\n[bright_red]❌ Build failed. Please fix errors.[/bright_red]\n"
1123
+ )
1100
1124
  raise SystemExit(1)
1101
1125
  self.execute_command(["pdm", "publish", "--no-build"])
1102
1126
 
@@ -1112,7 +1136,7 @@ class Crackerjack(BaseModel, arbitrary_types_allowed=True):
1112
1136
  self, cmd: list[str], **kwargs: t.Any
1113
1137
  ) -> subprocess.CompletedProcess[str]:
1114
1138
  if self.dry_run:
1115
- self.console.print(f"[yellow]Would run: {' '.join(cmd)}[/yellow]")
1139
+ self.console.print(f"[dim cyan]🔍 Would run: {' '.join(cmd)}[/dim cyan]")
1116
1140
  return CompletedProcess(cmd, 0, "", "")
1117
1141
  return execute(cmd, **kwargs)
1118
1142
 
@@ -1130,12 +1154,12 @@ class Crackerjack(BaseModel, arbitrary_types_allowed=True):
1130
1154
  if not options.skip_hooks:
1131
1155
  self.project_manager.run_pre_commit()
1132
1156
  else:
1133
- self.console.print("Skipping pre-commit hooks")
1157
+ self.console.print("[dim yellow]⏭️ Skipping pre-commit hooks[/dim yellow]")
1134
1158
  self._run_tests(options)
1135
1159
  self._bump_version(options)
1136
1160
  self._publish_project(options)
1137
1161
  self._commit_and_push(options)
1138
- self.console.print("\n🍺 Crackerjack complete!\n")
1162
+ self.console.print("\n[bright_green]🍺 Crackerjack complete![/bright_green]\n")
1139
1163
 
1140
1164
 
1141
1165
  crackerjack_it = Crackerjack().process
@@ -4,7 +4,7 @@ requires = [ "pdm-backend" ]
4
4
 
5
5
  [project]
6
6
  name = "crackerjack"
7
- version = "0.22.2"
7
+ version = "0.22.3"
8
8
  description = "Crackerjack: code quality toolkit"
9
9
  readme = "README.md"
10
10
  keywords = [
@@ -43,7 +43,7 @@ classifiers = [
43
43
  dependencies = [
44
44
  "autotyping>=24.9",
45
45
  "keyring>=25.6",
46
- "pdm>=2.25.3",
46
+ "pdm>=2.25.4",
47
47
  "pdm-bump>=0.9.12",
48
48
  "pre-commit>=4.2",
49
49
  "pydantic>=2.11.7",
@@ -53,12 +53,12 @@ dependencies = [
53
53
  "pytest-cov>=6.2.1",
54
54
  "pytest-mock>=3.14.1",
55
55
  "pytest-timeout>=2.4",
56
- "pytest-xdist>=3.7",
56
+ "pytest-xdist>=3.8",
57
57
  "pyyaml>=6.0.2",
58
58
  "rich>=14",
59
59
  "tomli-w>=1.2",
60
60
  "typer>=0.16",
61
- "uv>=0.7.15",
61
+ "uv>=0.7.20",
62
62
  ]
63
63
  urls.documentation = "https://github.com/lesleslie/crackerjack"
64
64
  urls.homepage = "https://github.com/lesleslie/crackerjack"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: crackerjack
3
- Version: 0.22.3
3
+ Version: 0.22.4
4
4
  Summary: Crackerjack: code quality toolkit
5
5
  Keywords: bandit,black,creosote,mypy,pyright,pytest,refurb,ruff
6
6
  Author-Email: lesleslie <les@wedgwoodwebworks.com>
@@ -24,7 +24,7 @@ Project-URL: repository, https://github.com/lesleslie/crackerjack
24
24
  Requires-Python: >=3.13
25
25
  Requires-Dist: autotyping>=24.9
26
26
  Requires-Dist: keyring>=25.6
27
- Requires-Dist: pdm>=2.25.3
27
+ Requires-Dist: pdm>=2.25.4
28
28
  Requires-Dist: pdm-bump>=0.9.12
29
29
  Requires-Dist: pre-commit>=4.2
30
30
  Requires-Dist: pydantic>=2.11.7
@@ -34,12 +34,12 @@ Requires-Dist: pytest-benchmark>=5.1
34
34
  Requires-Dist: pytest-cov>=6.2.1
35
35
  Requires-Dist: pytest-mock>=3.14.1
36
36
  Requires-Dist: pytest-timeout>=2.4
37
- Requires-Dist: pytest-xdist>=3.7
37
+ Requires-Dist: pytest-xdist>=3.8
38
38
  Requires-Dist: pyyaml>=6.0.2
39
39
  Requires-Dist: rich>=14
40
40
  Requires-Dist: tomli-w>=1.2
41
41
  Requires-Dist: typer>=0.16
42
- Requires-Dist: uv>=0.7.15
42
+ Requires-Dist: uv>=0.7.20
43
43
  Description-Content-Type: text/markdown
44
44
 
45
45
  # Crackerjack: Elevate Your Python Development
@@ -1,7 +1,7 @@
1
- crackerjack-0.22.3.dist-info/METADATA,sha256=ggtMKWafl4ETtwOLPdkthHOMYdwx-DEKEMR_AqKBWf4,26251
2
- crackerjack-0.22.3.dist-info/WHEEL,sha256=tSfRZzRHthuv7vxpI4aehrdN9scLjk-dCJkPLzkHxGg,90
3
- crackerjack-0.22.3.dist-info/entry_points.txt,sha256=6OYgBcLyFCUgeqLgnvMyOJxPCWzgy7se4rLPKtNonMs,34
4
- crackerjack-0.22.3.dist-info/licenses/LICENSE,sha256=fDt371P6_6sCu7RyqiZH_AhT1LdN3sN1zjBtqEhDYCk,1531
1
+ crackerjack-0.22.4.dist-info/METADATA,sha256=WMHYumnD1Kl_1rLqLanKNdol_L_cssLyLBThAoe9-WE,26251
2
+ crackerjack-0.22.4.dist-info/WHEEL,sha256=9P2ygRxDrTJz3gsagc0Z96ukrxjr-LFBGOgv3AuKlCA,90
3
+ crackerjack-0.22.4.dist-info/entry_points.txt,sha256=6OYgBcLyFCUgeqLgnvMyOJxPCWzgy7se4rLPKtNonMs,34
4
+ crackerjack-0.22.4.dist-info/licenses/LICENSE,sha256=fDt371P6_6sCu7RyqiZH_AhT1LdN3sN1zjBtqEhDYCk,1531
5
5
  crackerjack/.gitignore,sha256=n8cD6U16L3XZn__PvhYm_F7-YeFHFucHCyxWj2NZCGs,259
6
6
  crackerjack/.libcst.codemod.yaml,sha256=a8DlErRAIPV1nE6QlyXPAzTOgkB24_spl2E9hphuf5s,772
7
7
  crackerjack/.pdm.toml,sha256=dZe44HRcuxxCFESGG8SZIjmc-cGzSoyK3Hs6t4NYA8w,23
@@ -34,7 +34,7 @@ crackerjack/.ruff_cache/0.11.7/10386934055395314831,sha256=lBNwN5zAgM4OzbkXIOzCc
34
34
  crackerjack/.ruff_cache/0.11.7/3557596832929915217,sha256=fKlwUbsvT3YIKV6UR-aA_i64lLignWeVfVu-MMmVbU0,207
35
35
  crackerjack/.ruff_cache/0.11.8/530407680854991027,sha256=xAMAL3Vu_HR6M-h5ojCTaak0By5ii8u-14pXULLgLqw,224
36
36
  crackerjack/.ruff_cache/0.12.0/5056746222905752453,sha256=MqrIT5qymJcgAOBZyn-TvYoGCFfDFCgN9IwSULq8n14,256
37
- crackerjack/.ruff_cache/0.12.1/5056746222905752453,sha256=w6K32ODLraqFeqklpoWynnxmcbqihCgEeiyksQJjkFE,256
37
+ crackerjack/.ruff_cache/0.12.1/5056746222905752453,sha256=UxoFQP8tlpGMcB9BbAm1BAjoFw-gY9SUtnIPU9SUbl0,256
38
38
  crackerjack/.ruff_cache/0.2.0/10047773857155985907,sha256=j9LNa_RQ4Plor7go1uTYgz17cEENKvZQ-dP6b9MX0ik,248
39
39
  crackerjack/.ruff_cache/0.2.1/8522267973936635051,sha256=u_aPBMibtAp_iYvLwR88GMAECMcIgHezxMyuapmU2P4,248
40
40
  crackerjack/.ruff_cache/0.2.2/18053836298936336950,sha256=Xb_ebP0pVuUfSqPEZKlhQ70so_vqkEfMYpuHQ06iR5U,248
@@ -64,9 +64,9 @@ crackerjack/.ruff_cache/0.9.9/8843823720003377982,sha256=e4ymkXfQsUg5e_mtO34xTsa
64
64
  crackerjack/.ruff_cache/CACHEDIR.TAG,sha256=WVMVbX4MVkpCclExbq8m-IcOZIOuIZf5FrYw5Pk-Ma4,43
65
65
  crackerjack/__init__.py,sha256=8tBSPAru_YDuPpjz05cL7pNbZjYFoRT_agGd_FWa3gY,839
66
66
  crackerjack/__main__.py,sha256=lEyi83ChuehqEJgUQ6Ib4ByOofvmhi_0M7oFamMC_1I,6407
67
- crackerjack/crackerjack.py,sha256=2-Q0L3BtKt3Kpe8-uGCdl0sH9pRkgNZDaFBrhTUn-70,43997
67
+ crackerjack/crackerjack.py,sha256=aHoaWB2FLNv_2v80xyS4AUcy1LNY5hwIAg1s2UwQLo0,45130
68
68
  crackerjack/errors.py,sha256=QEPtVuMtKtQHuawgr1ToMaN1KbUg5h9-4mS33YB5Znk,4062
69
69
  crackerjack/interactive.py,sha256=y5QbyR2Wp8WkC_iC89ZqETm-wjAN9X5DK1L3yetpjN4,16153
70
70
  crackerjack/py313.py,sha256=buYE7LO11Q64ffowEhTZRFQoAGj_8sg3DTlZuv8M9eo,5890
71
- crackerjack/pyproject.toml,sha256=pkv-YPO6tkEM6gBjqEDp08t4u5-wa-oqgvYpKYFCKQQ,4988
72
- crackerjack-0.22.3.dist-info/RECORD,,
71
+ crackerjack/pyproject.toml,sha256=e67970DPfSc_zOpg6G6OpahVa3fQy40WU649Rcr5DaU,4988
72
+ crackerjack-0.22.4.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: pdm-backend (2.4.4)
2
+ Generator: pdm-backend (2.4.5)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any