cmd2 2.6.1__py3-none-any.whl → 2.7.0__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.
cmd2/argparse_custom.py CHANGED
@@ -229,14 +229,17 @@ from argparse import (
229
229
  ZERO_OR_MORE,
230
230
  ArgumentError,
231
231
  )
232
- from collections.abc import Callable, Iterable, Sequence
233
- from gettext import (
234
- gettext,
232
+ from collections.abc import (
233
+ Callable,
234
+ Iterable,
235
+ Sequence,
235
236
  )
237
+ from gettext import gettext
236
238
  from typing import (
237
239
  IO,
238
240
  TYPE_CHECKING,
239
241
  Any,
242
+ ClassVar,
240
243
  NoReturn,
241
244
  Optional,
242
245
  Protocol,
@@ -245,6 +248,8 @@ from typing import (
245
248
  runtime_checkable,
246
249
  )
247
250
 
251
+ from rich_argparse import RawTextRichHelpFormatter
252
+
248
253
  from . import (
249
254
  ansi,
250
255
  constants,
@@ -991,9 +996,25 @@ setattr(argparse._SubParsersAction, 'remove_parser', _SubParsersAction_remove_pa
991
996
  ############################################################################################################
992
997
 
993
998
 
994
- class Cmd2HelpFormatter(argparse.RawTextHelpFormatter):
999
+ class Cmd2HelpFormatter(RawTextRichHelpFormatter):
995
1000
  """Custom help formatter to configure ordering of help text."""
996
1001
 
1002
+ # rich-argparse formats all group names with str.title().
1003
+ # Override their formatter to do nothing.
1004
+ group_name_formatter: ClassVar[Callable[[str], str]] = str
1005
+
1006
+ # Disable automatic highlighting in the help text.
1007
+ highlights: ClassVar[list[str]] = []
1008
+
1009
+ # Disable markup rendering in usage, help, description, and epilog text.
1010
+ # cmd2's built-in commands do not escape opening brackets in their help text
1011
+ # and therefore rely on these settings being False. If you desire to use
1012
+ # markup in your help text, inherit from Cmd2HelpFormatter and override
1013
+ # these settings in that child class.
1014
+ usage_markup: ClassVar[bool] = False
1015
+ help_markup: ClassVar[bool] = False
1016
+ text_markup: ClassVar[bool] = False
1017
+
997
1018
  def _format_usage(
998
1019
  self,
999
1020
  usage: Optional[str],
@@ -1215,42 +1236,30 @@ class Cmd2ArgumentParser(argparse.ArgumentParser):
1215
1236
  behavior on this parser. If this is None or not present, then cmd2 will use
1216
1237
  argparse_completer.DEFAULT_AP_COMPLETER when tab completing this parser's arguments
1217
1238
  """
1239
+ kwargs: dict[str, bool] = {}
1218
1240
  if sys.version_info >= (3, 14):
1219
1241
  # Python >= 3.14 so pass new arguments to parent argparse.ArgumentParser class
1220
- super().__init__(
1221
- prog=prog,
1222
- usage=usage,
1223
- description=description,
1224
- epilog=epilog,
1225
- parents=parents if parents else [],
1226
- formatter_class=formatter_class, # type: ignore[arg-type]
1227
- prefix_chars=prefix_chars,
1228
- fromfile_prefix_chars=fromfile_prefix_chars,
1229
- argument_default=argument_default,
1230
- conflict_handler=conflict_handler,
1231
- add_help=add_help,
1232
- allow_abbrev=allow_abbrev,
1233
- exit_on_error=exit_on_error, # added in Python 3.9
1234
- suggest_on_error=suggest_on_error, # added in Python 3.14
1235
- color=color, # added in Python 3.14
1236
- )
1237
- else:
1238
- # Python < 3.14, so don't pass new arguments to parent argparse.ArgumentParser class
1239
- super().__init__(
1240
- prog=prog,
1241
- usage=usage,
1242
- description=description,
1243
- epilog=epilog,
1244
- parents=parents if parents else [],
1245
- formatter_class=formatter_class, # type: ignore[arg-type]
1246
- prefix_chars=prefix_chars,
1247
- fromfile_prefix_chars=fromfile_prefix_chars,
1248
- argument_default=argument_default,
1249
- conflict_handler=conflict_handler,
1250
- add_help=add_help,
1251
- allow_abbrev=allow_abbrev,
1252
- exit_on_error=exit_on_error, # added in Python 3.9
1253
- )
1242
+ kwargs = {
1243
+ "suggest_on_error": suggest_on_error,
1244
+ "color": color,
1245
+ }
1246
+
1247
+ super().__init__(
1248
+ prog=prog,
1249
+ usage=usage,
1250
+ description=description,
1251
+ epilog=epilog,
1252
+ parents=parents if parents else [],
1253
+ formatter_class=formatter_class, # type: ignore[arg-type]
1254
+ prefix_chars=prefix_chars,
1255
+ fromfile_prefix_chars=fromfile_prefix_chars,
1256
+ argument_default=argument_default,
1257
+ conflict_handler=conflict_handler,
1258
+ add_help=add_help,
1259
+ allow_abbrev=allow_abbrev,
1260
+ exit_on_error=exit_on_error, # added in Python 3.9
1261
+ **kwargs, # added in Python 3.14
1262
+ )
1254
1263
 
1255
1264
  self.set_ap_completer_type(ap_completer_type) # type: ignore[attr-defined]
1256
1265
 
cmd2/cmd2.py CHANGED
@@ -42,14 +42,16 @@ import re
42
42
  import sys
43
43
  import tempfile
44
44
  import threading
45
- from code import (
46
- InteractiveConsole,
47
- )
45
+ from code import InteractiveConsole
48
46
  from collections import (
49
47
  OrderedDict,
50
48
  namedtuple,
51
49
  )
52
- from collections.abc import Callable, Iterable, Mapping
50
+ from collections.abc import (
51
+ Callable,
52
+ Iterable,
53
+ Mapping,
54
+ )
53
55
  from types import (
54
56
  FrameType,
55
57
  ModuleType,
@@ -254,17 +256,11 @@ class _CommandParsers:
254
256
  command = command_method.__name__[len(COMMAND_FUNC_PREFIX) :]
255
257
 
256
258
  parser_builder = getattr(command_method, constants.CMD_ATTR_ARGPARSER, None)
257
- parent = self._cmd.find_commandset_for_command(command) or self._cmd
258
- parser = self._cmd._build_parser(parent, parser_builder)
259
- if parser is None:
259
+ if parser_builder is None:
260
260
  return None
261
261
 
262
- # argparser defaults the program name to sys.argv[0], but we want it to be the name of our command
263
- from .decorators import (
264
- _set_parser_prog,
265
- )
266
-
267
- _set_parser_prog(parser, command)
262
+ parent = self._cmd.find_commandset_for_command(command) or self._cmd
263
+ parser = self._cmd._build_parser(parent, parser_builder, command)
268
264
 
269
265
  # If the description has not been set, then use the method docstring if one exists
270
266
  if parser.description is None and hasattr(command_method, '__wrapped__') and command_method.__wrapped__.__doc__:
@@ -758,24 +754,39 @@ class Cmd(cmd.Cmd):
758
754
  def _build_parser(
759
755
  self,
760
756
  parent: CommandParent,
761
- parser_builder: Optional[
762
- Union[
763
- argparse.ArgumentParser,
764
- Callable[[], argparse.ArgumentParser],
765
- StaticArgParseBuilder,
766
- ClassArgParseBuilder,
767
- ]
757
+ parser_builder: Union[
758
+ argparse.ArgumentParser,
759
+ Callable[[], argparse.ArgumentParser],
760
+ StaticArgParseBuilder,
761
+ ClassArgParseBuilder,
768
762
  ],
769
- ) -> Optional[argparse.ArgumentParser]:
770
- parser: Optional[argparse.ArgumentParser] = None
763
+ prog: str,
764
+ ) -> argparse.ArgumentParser:
765
+ """Build argument parser for a command/subcommand.
766
+
767
+ :param parent: CommandParent object which owns the command using the parser.
768
+ When parser_builder is a classmethod, this function passes
769
+ parent's class to it.
770
+ :param parser_builder: means used to build the parser
771
+ :param prog: prog value to set in new parser
772
+ :return: new parser
773
+ :raises TypeError: if parser_builder is invalid type
774
+ """
771
775
  if isinstance(parser_builder, staticmethod):
772
776
  parser = parser_builder.__func__()
773
777
  elif isinstance(parser_builder, classmethod):
774
- parser = parser_builder.__func__(parent if not None else self) # type: ignore[arg-type]
778
+ parser = parser_builder.__func__(parent.__class__)
775
779
  elif callable(parser_builder):
776
780
  parser = parser_builder()
777
781
  elif isinstance(parser_builder, argparse.ArgumentParser):
778
782
  parser = copy.deepcopy(parser_builder)
783
+ else:
784
+ raise TypeError(f"Invalid type for parser_builder: {type(parser_builder)}")
785
+
786
+ from .decorators import _set_parser_prog
787
+
788
+ _set_parser_prog(parser, prog)
789
+
779
790
  return parser
780
791
 
781
792
  def _install_command_function(self, command_func_name: str, command_method: CommandFunc, context: str = '') -> None:
@@ -963,12 +974,7 @@ class Cmd(cmd.Cmd):
963
974
 
964
975
  target_parser = find_subcommand(command_parser, subcommand_names)
965
976
 
966
- subcmd_parser = cast(argparse.ArgumentParser, self._build_parser(cmdset, subcmd_parser_builder))
967
- from .decorators import (
968
- _set_parser_prog,
969
- )
970
-
971
- _set_parser_prog(subcmd_parser, f'{command_name} {subcommand_name}')
977
+ subcmd_parser = self._build_parser(cmdset, subcmd_parser_builder, f'{command_name} {subcommand_name}')
972
978
  if subcmd_parser.description is None and method.__doc__:
973
979
  subcmd_parser.description = strip_doc_annotations(method.__doc__)
974
980
 
@@ -2610,7 +2616,7 @@ class Cmd(cmd.Cmd):
2610
2616
  # caused by certain binary characters having been printed to it.
2611
2617
  import subprocess
2612
2618
 
2613
- proc = subprocess.Popen(['stty', 'sane']) # noqa: S603, S607
2619
+ proc = subprocess.Popen(['stty', 'sane']) # noqa: S607
2614
2620
  proc.communicate()
2615
2621
 
2616
2622
  data = plugin.CommandFinalizationData(stop, statement)
cmd2/decorators.py CHANGED
@@ -393,6 +393,14 @@ def with_argparser(
393
393
 
394
394
  command_name = func.__name__[len(constants.COMMAND_FUNC_PREFIX) :]
395
395
 
396
+ if isinstance(parser, argparse.ArgumentParser):
397
+ # Set parser's prog value for backward compatibility within the cmd2 2.0 family.
398
+ # This will be removed in cmd2 3.0 since we never reference this parser object's prog value.
399
+ # Since it's possible for the same parser object to be passed into multiple with_argparser()
400
+ # calls, we only set prog on the deep copies of this parser based on the specific do_xxxx
401
+ # instance method they are associated with.
402
+ _set_parser_prog(parser, command_name)
403
+
396
404
  # Set some custom attributes for this command
397
405
  setattr(cmd_wrapper, constants.CMD_ATTR_ARGPARSER, parser)
398
406
  setattr(cmd_wrapper, constants.CMD_ATTR_PRESERVE_QUOTES, preserve_quotes)
@@ -1,11 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cmd2
3
- Version: 2.6.1
3
+ Version: 2.7.0
4
4
  Summary: cmd2 - quickly build feature-rich and user-friendly interactive command line applications in Python
5
5
  Author: cmd2 Contributors
6
6
  License: The MIT License (MIT)
7
7
 
8
- Copyright (c) 2008-2024 Catherine Devlin and others
8
+ Copyright (c) 2008-2025 Catherine Devlin and others
9
9
 
10
10
  Permission is hereby granted, free of charge, to any person obtaining a copy
11
11
  of this software and associated documentation files (the "Software"), to deal
@@ -39,6 +39,7 @@ Classifier: Programming Language :: Python :: 3.11
39
39
  Classifier: Programming Language :: Python :: 3.12
40
40
  Classifier: Programming Language :: Python :: 3.13
41
41
  Classifier: Programming Language :: Python :: 3.14
42
+ Classifier: Programming Language :: Python :: Free Threading :: 3 - Stable
42
43
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
43
44
  Requires-Python: >=3.9
44
45
  Description-Content-Type: text/markdown
@@ -46,6 +47,7 @@ License-File: LICENSE
46
47
  Requires-Dist: gnureadline>=8; platform_system == "Darwin"
47
48
  Requires-Dist: pyperclip>=1.8
48
49
  Requires-Dist: pyreadline3>=3.4; platform_system == "Windows"
50
+ Requires-Dist: rich-argparse>=1.7.1
49
51
  Requires-Dist: wcwidth>=0.2.10
50
52
  Dynamic: license-file
51
53
 
@@ -80,22 +82,22 @@ when using cmd.
80
82
 
81
83
  ![system schema](https://raw.githubusercontent.com/python-cmd2/cmd2/master/.github/images/graph.drawio.png)
82
84
 
83
- When creating solutions developers have no shortage of tools to create rich and smart user interfaces.
84
- System administrators have long been duct taping together brittle workflows based on a menagerie of simple command line
85
- tools created by strangers on github and the guy down the hall.
86
- Unfortunately, when CLIs become significantly complex the ease of command discoverability tends to fade quickly.
87
- On the other hand, Web and traditional desktop GUIs are first in class when it comes to easily discovering
88
- functionality.
89
- The price we pay for beautifully colored displays is complexity required to aggregate disperate applications into larger
90
- systems.
91
- `cmd2` fills the niche between high [ease of command discovery](https://clig.dev/#ease-of-discovery) applications and
92
- smart workflow automation systems.
93
-
94
- The `cmd2` framework provides a great mixture of both worlds. Application designers can easily create complex
95
- applications and rely on the cmd2 library to offer effortless user facing help and extensive tab completion.
96
- When users become comfortable with functionality, cmd2 turns into a feature rich library enabling a smooth transition to
97
- full automation. If designed with enough forethought, a well implemented cmd2 application can serve as a boutique
98
- workflow tool. `cmd2` pulls off this flexibility based on two pillars of philosophy:
85
+ When creating solutions developers have no shortage of tools to create rich and smart user
86
+ interfaces. System administrators have long been duct taping together brittle workflows based on a
87
+ menagerie of simple command line tools created by strangers on github and the guy down the hall.
88
+ Unfortunately, when CLIs become significantly complex the ease of command discoverability tends to
89
+ fade quickly. On the other hand, Web and traditional desktop GUIs are first in class when it comes
90
+ to easily discovering functionality. The price we pay for beautifully colored displays is complexity
91
+ required to aggregate disperate applications into larger systems. `cmd2` fills the niche between
92
+ high [ease of command discovery](https://clig.dev/#ease-of-discovery) applications and smart
93
+ workflow automation systems.
94
+
95
+ The `cmd2` framework provides a great mixture of both worlds. Application designers can easily
96
+ create complex applications and rely on the cmd2 library to offer effortless user facing help and
97
+ extensive tab completion. When users become comfortable with functionality, cmd2 turns into a
98
+ feature rich library enabling a smooth transition to full automation. If designed with enough
99
+ forethought, a well implemented cmd2 application can serve as a boutique workflow tool. `cmd2` pulls
100
+ off this flexibility based on two pillars of philosophy:
99
101
 
100
102
  - Tab Completion
101
103
  - Automation Transition
@@ -104,8 +106,8 @@ workflow tool. `cmd2` pulls off this flexibility based on two pillars of philoso
104
106
 
105
107
  <a href="https://imgflip.com/i/63h03x"><img src="https://i.imgflip.com/63h03x.jpg" title="made at imgflip.com" width="70%" height="%70"/></a>
106
108
 
107
- Deep extensive tab completion and help text generation based on the argparse library create the first pillar of 'ease of
108
- command discovery'. The following is a list of features in this category.
109
+ Deep extensive tab completion and help text generation based on the argparse library create the
110
+ first pillar of 'ease of command discovery'. The following is a list of features in this category.
109
111
 
110
112
  - Great tab completion of commands, subcommands, file system paths, and shell commands.
111
113
  - Custom tab completion for user designed commands via simple function overloading.
@@ -116,13 +118,15 @@ command discovery'. The following is a list of features in this category.
116
118
 
117
119
  <a href="https://imgflip.com/i/66t0y0"><img src="https://i.imgflip.com/66t0y0.jpg" title="made at imgflip.com" width="70%" height="70%"/></a>
118
120
 
119
- cmd2 creates the second pillar of 'ease of transition to automation' through alias/macro creation, command line argument
120
- parsing and execution of cmd2 scripting.
121
+ cmd2 creates the second pillar of 'ease of transition to automation' through alias/macro creation,
122
+ command line argument parsing and execution of cmd2 scripting.
121
123
 
122
124
  - Flexible alias and macro creation for quick abstraction of commands.
123
125
  - Text file scripting of your application with `run_script` (`@`) and `_relative_run_script` (`@@`)
124
- - Powerful and flexible built-in Python scripting of your application using the `run_pyscript` command
125
- - Transcripts for use with built-in regression can be automatically generated from `history -t` or `run_script -t`
126
+ - Powerful and flexible built-in Python scripting of your application using the `run_pyscript`
127
+ command
128
+ - Transcripts for use with built-in regression can be automatically generated from `history -t` or
129
+ `run_script -t`
126
130
 
127
131
  ## Installation
128
132
 
@@ -132,11 +136,12 @@ On all operating systems, the latest stable version of `cmd2` can be installed u
132
136
  pip install -U cmd2
133
137
  ```
134
138
 
135
- cmd2 works with Python 3.9+ on Windows, macOS, and Linux. It is pure Python code with few 3rd-party dependencies.
139
+ cmd2 works with Python 3.9+ on Windows, macOS, and Linux. It is pure Python code with few 3rd-party
140
+ dependencies. It works with both conventional CPython and free-threaded variants.
136
141
 
137
142
  For information on other installation options, see
138
- [Installation Instructions](https://cmd2.readthedocs.io/en/latest/overview/installation.html) in the cmd2
139
- documentation.
143
+ [Installation Instructions](https://cmd2.readthedocs.io/en/latest/overview/installation.html) in the
144
+ cmd2 documentation.
140
145
 
141
146
  ## Documentation
142
147
 
@@ -144,7 +149,8 @@ The latest documentation for cmd2 can be read online here: https://cmd2.readthed
144
149
 
145
150
  It is available in HTML, PDF, and ePub formats.
146
151
 
147
- The best way to learn the cmd2 api is to delve into the example applications located in source under examples.
152
+ The best way to learn the cmd2 api is to delve into the example applications located in source under
153
+ examples.
148
154
 
149
155
  ## Tutorials
150
156
 
@@ -153,13 +159,15 @@ The best way to learn the cmd2 api is to delve into the example applications loc
153
159
  - [slides](https://github.com/python-cmd2/talks/blob/master/PyOhio_2019/cmd2-PyOhio_2019.pdf)
154
160
  - [example code](https://github.com/python-cmd2/talks/tree/master/PyOhio_2019/examples)
155
161
  - [Cookiecutter](https://github.com/cookiecutter/cookiecutter) Templates from community
156
- - Basic cookiecutter template for cmd2 application : https://github.com/jayrod/cookiecutter-python-cmd2
157
- - Advanced cookiecutter template with external plugin
158
- support : https://github.com/jayrod/cookiecutter-python-cmd2-ext-plug
162
+ - Basic cookiecutter template for cmd2 application :
163
+ https://github.com/jayrod/cookiecutter-python-cmd2
164
+ - Advanced cookiecutter template with external plugin support :
165
+ https://github.com/jayrod/cookiecutter-python-cmd2-ext-plug
159
166
  - [cmd2 example applications](https://github.com/python-cmd2/cmd2/tree/master/examples)
160
167
  - Basic cmd2 examples to demonstrate how to use various features
161
168
  - [Advanced Examples](https://github.com/jayrod/cmd2-example-apps)
162
- - More complex examples that demonstrate more featuers about how to put together a complete application
169
+ - More complex examples that demonstrate more featuers about how to put together a complete
170
+ application
163
171
 
164
172
  ## Hello World
165
173
 
@@ -187,10 +195,10 @@ if __name__ == '__main__':
187
195
 
188
196
  ## Found a bug?
189
197
 
190
- If you think you've found a bug, please first read through the
191
- open [Issues](https://github.com/python-cmd2/cmd2/issues). If you're confident it's a new bug, go ahead and create a new
192
- GitHub issue. Be sure to include as much information as possible so we can reproduce the bug. At a minimum, please state
193
- the following:
198
+ If you think you've found a bug, please first read through the open
199
+ [Issues](https://github.com/python-cmd2/cmd2/issues). If you're confident it's a new bug, go ahead
200
+ and create a new GitHub issue. Be sure to include as much information as possible so we can
201
+ reproduce the bug. At a minimum, please state the following:
194
202
 
195
203
  - `cmd2` version
196
204
  - Python version
@@ -232,4 +240,5 @@ Possibly defunct but still good examples
232
240
  | [FLASHMINGO](https://github.com/mandiant/flashmingo) | Automatic analysis of SWF files based on some heuristics. Extensible via plugins. | [Mandiant](https://github.com/mandiant) |
233
241
  | [psiTurk](https://github.com/NYUCCL/psiTurk) | An open platform for science on Amazon Mechanical Turk | [NYU Computation and Cognition Lab](https://github.com/NYUCCL) |
234
242
 
235
- Note: If you have created an application based on `cmd2` that you would like us to mention here, please get in touch.
243
+ Note: If you have created an application based on `cmd2` that you would like us to mention here,
244
+ please get in touch.
@@ -1,12 +1,12 @@
1
1
  cmd2/__init__.py,sha256=xRXcr4HzJrZbouMEP8AkWwxjW1lqXYLFG0SlWiw5_9g,2502
2
2
  cmd2/ansi.py,sha256=XwBvFnB51LYYjIpfEge6mcr5X63dUxiV0aJlOOJ_2tQ,31965
3
3
  cmd2/argparse_completer.py,sha256=F_5hiX9fYpEhV42mz7v7qeS7KuInAS6xU6KekLxYzsQ,35863
4
- cmd2/argparse_custom.py,sha256=Q7N-2TSctfjn3TEZezQNaT5y0w8sdGpmUA5_DCPa_Pk,59131
4
+ cmd2/argparse_custom.py,sha256=uGCQ3MG_iTBvwZ6MKmZOoCjlgF8OvWJg2DMs2myHZf4,59201
5
5
  cmd2/clipboard.py,sha256=HLZWY-W3mkpF_OqQet-F8pS3rlXpiE5vxUyPV_yHvIU,507
6
- cmd2/cmd2.py,sha256=y2gqtQaHG4Oy5MB1VTCX6Tlgvji6NGuypS9x2dPFrUI,261541
6
+ cmd2/cmd2.py,sha256=8HKnMWhtY0qJUtQZr0ByrMnfYKnavQu7tT6G7wrsZVk,261697
7
7
  cmd2/command_definition.py,sha256=_wF39nig5MP0grSOZ1hFehP5fCGusUNHMn9PIs6pmcU,7648
8
8
  cmd2/constants.py,sha256=duEqGhhvdUV7AYxE8VGZ4wyFBcN2y2bLPd5iefW4tSU,1943
9
- cmd2/decorators.py,sha256=9Jiml8HGc-UyUtWTns3TwW8ZHte4NchfGgHe-_1CcDM,20075
9
+ cmd2/decorators.py,sha256=t0gBy3aRz5ke0jHyP5YOszdQ61t5aV8j0eNyLPX6hmg,20644
10
10
  cmd2/exceptions.py,sha256=fYciAnLCpvPYkXCtmADhxtcvjbxVagRjhp41eYwAQo8,3444
11
11
  cmd2/history.py,sha256=elJPuvV7BnUEgpWnixNyl2yGtR6sz3nwvpyFwaeFqRA,14800
12
12
  cmd2/parsing.py,sha256=BsyQTTkuEg4FiQP9o2O28KjXodFgXkXmvk_VkAe-Ryw,28057
@@ -17,8 +17,8 @@ cmd2/rl_utils.py,sha256=sWapqwDR_GvOgy5NJ7c-i6nUU4dqpKpGQ8-Olwi3tuU,11335
17
17
  cmd2/table_creator.py,sha256=nF3VEgGHvfhHBh_yoMAiV1WaDdR8hIareIAogzIPq5M,47177
18
18
  cmd2/transcript.py,sha256=Ws0lW_oBFxCQCKSwvnDUS1x3ya163YXnV-O5aTU0z7k,9207
19
19
  cmd2/utils.py,sha256=NqDIkY4LiAlnv_Un7MFHxszoH2KgEWQ7NJOwQurIn_E,50698
20
- cmd2-2.6.1.dist-info/licenses/LICENSE,sha256=QXrW0Z0merk9mncyUkn-sgRxhT8_o1dL5HEaBNH47Q4,1099
21
- cmd2-2.6.1.dist-info/METADATA,sha256=JNWrp7MjHaU-kJjMoklgq_EyEHbkSd4QscQs5x3YswA,17133
22
- cmd2-2.6.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
23
- cmd2-2.6.1.dist-info/top_level.txt,sha256=gJbOJmyrARwLhm5diXAtzlNQdxbDZ8iRJ8HJi65_5hg,5
24
- cmd2-2.6.1.dist-info/RECORD,,
20
+ cmd2-2.7.0.dist-info/licenses/LICENSE,sha256=9qPeHY4u2fkSz0JQGT-P4T3QqTWTqnQJ_8LkZUhSdFY,1099
21
+ cmd2-2.7.0.dist-info/METADATA,sha256=HOqT-x9vnZ21-fCTSbT7HC-BQo6fPY1hyCXtS_b6GHw,17328
22
+ cmd2-2.7.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
23
+ cmd2-2.7.0.dist-info/top_level.txt,sha256=gJbOJmyrARwLhm5diXAtzlNQdxbDZ8iRJ8HJi65_5hg,5
24
+ cmd2-2.7.0.dist-info/RECORD,,
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2008-2024 Catherine Devlin and others
3
+ Copyright (c) 2008-2025 Catherine Devlin and others
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
File without changes