fancy-subprocess 2.0__tar.gz → 2.2__tar.gz

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,8 @@
1
+ root = true
2
+
1
3
  [*]
4
+ charset = utf-8
2
5
  trim_trailing_whitespace = true
3
6
  insert_final_newline = true
4
- indent_style = "space"
7
+ indent_style = space
5
8
  indent_size = 4
6
-
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
- Name: fancy_subprocess
3
- Version: 2.0
2
+ Name: fancy-subprocess
3
+ Version: 2.2
4
4
  Summary: subprocess.run() with formatted output, detailed error messages and retry capabilities
5
5
  Project-URL: Homepage, https://github.com/petamas/python-fancy-subprocess
6
6
  Project-URL: Bug Tracker, https://github.com/petamas/python-fancy-subprocess/issues
@@ -18,9 +18,9 @@ Classifier: Programming Language :: Python :: 3.11
18
18
  Classifier: Programming Language :: Python :: 3.12
19
19
  Classifier: Programming Language :: Python :: 3.13
20
20
  Requires-Python: >=3.10
21
- Requires-Dist: ntstatus<2
22
- Requires-Dist: oslex<2
23
- Requires-Dist: pathext<2,>=1.2
21
+ Requires-Dist: ntstatus<2,>=1.1
22
+ Requires-Dist: oslex<2,>=0.1.3
23
+ Requires-Dist: pathext<2,>=1.5
24
24
  Requires-Dist: typeguard<5,>=4.4.2
25
25
  Requires-Dist: typing-extensions<5,>=4.14
26
26
  Description-Content-Type: text/markdown
@@ -45,14 +45,14 @@ Key differences compared to `subprocess.run()`:
45
45
  Arguments (all of them except `cmd` are optional):
46
46
  - `cmd: Sequence[str | Path]` - Command to run. See `subprocess.run()`'s documentation for the interpretation of `cmd[0]`. It is recommended to use `fancy_subprocess.which()` to produce `cmd[0]`.
47
47
  - `print_message: Callable[[str], None]` - Function used to print informational messages. If unspecified or set to `None`, defaults to `fancy_subprocess.default_print`. Use `message_quiet=True` to disable printing informational messages.
48
- - The type of this argument is also aliased as `fancy_subprocess.PrintFunction`.
48
+ - The type of this argument is also aliased as `fancy_subprocess.PrintFunction`.
49
49
  - `print_output: Callable[[str], None]` - Function used to print a line of the output of the command. If unspecified or set to `None`, defaults to `fancy_subprocess.default_print`. Use `output_quiet=True` to disable printing the command's output.
50
- - The type of this argument is also aliased as `fancy_subprocess.PrintFunction`.
50
+ - The type of this argument is also aliased as `fancy_subprocess.PrintFunction`.
51
51
  - `message_quiet: bool` - If `True`, `print_message` is ignored, and no informational messages are printed. If unspecified or set to `None`, defaults to `False`.
52
52
  - `output_quiet: bool` - If `True`, `print_output` is ignored, and the command's output it not printed. If unspecified or set to `None`, defaults to `False`. Note that this parameter also affects the default value of `description`.
53
53
  - `description: str` - Description printed before running the command. If unspecified or set to `None`, defaults to `Running command: ...` when `output_quiet` is `False`, and `Running command (output silenced): ...` when `output_quiet` is `True`.
54
54
  - `success: Sequence[int] | AnyExitCode` - List of exit codes that should be considered successful. If set to `fancy_subprocess.ANY_EXIT_CODE`, then all exit codes are considered successful. If unspecified or set to `None`, defaults to `[0]`. Note that 0 is not automatically included in the list of successful exit codes, so if a list without 0 is specified, then the function will consider 0 a failure.
55
- - The type of this argument is also aliased as `fancy_subprocess.Success`.
55
+ - The type of this argument is also aliased as `fancy_subprocess.Success`.
56
56
  - `flush_before_subprocess: bool` - If `True`, flushes both the standard output and error streams before running the command. If unspecified or set to `None`, defaults to `True`.
57
57
  - `trim_output_lines: bool` - If `True`, remove trailing whitespace from the lines of the output of the command before calling `print_output` and adding them to the `output` field of `RunResult`. If unspecified or set to `None`, defaults to `True`.
58
58
  - `max_output_size: int` - Maximum number of characters to be recorded in the `output` field of `RunResult`. If the command produces more than `max_output_size` characters, only the last `max_output_size` will be recorded. If unspecified or set to `None`, defaults to 10,000,000.
@@ -60,10 +60,11 @@ Arguments (all of them except `cmd` are optional):
60
60
  - `retry_initial_sleep_seconds: float` - Number of seconds to wait before retrying for the first time. If unspecified or set to `None`, defaults to 10.
61
61
  - `retry_backoff: float` - Factor used to increase wait times before subsequent retries. If unspecified or set to `None`, defaults to 2.
62
62
  - `env_overrides: Mapping[str, str]` - Dictionary used to set environment variables. Note that unline the `env` argument of `subprocess.run()`, `env_overrides` does not need to contain all environment variables, only the ones you want to add/modify compared to os.environ. If unspecified or set to `None`, defaults to empty dictionary, i.e. no change to the environment.
63
- - The type of this argument is also aliased as `fancy_subprocess.EnvOverrides`.
63
+ - The type of this argument is also aliased as `fancy_subprocess.EnvOverrides`.
64
64
  - `cwd: str | Path` - If not `None`, change current working directory to `cwd` before running the command.
65
65
  - `encoding: str` - This encoding will be used to open stdout and stderr of the command. If unspecified or set to `None`, see default behaviour in `io.TextIOWrapper`'s documentation.
66
- - `errors: str` - This specifies how text decoding errors will be handled. See details (including what happens if unspecified or set to `None`) in `io.TextIOWrapper`'s documentation.
66
+ - `errors: str` - This specifies how text decoding errors will be handled. (See possible options in `io.TextIOWrapper`'s documentation.) If unspecified or set to `None`, defaults to `replace`. Note that this differs from `io.TextIOWrapper`'s default behaviour, which is to use `strict`.
67
+ - `replace_fffd_with_question_mark: bool` - Replace Unicode Replacement Character U+FFFD (`�`, usually introduced by `errors='replace'`) with ASCII question mark (`?`) in lines of the output of the command before calling `print_output` and adding them to the `output` field of `RunResult`. If unspecified or set to `None`, defaults to `True`.
67
68
 
68
69
  ### Return value: `fancy_subprocess.RunResult`
69
70
 
@@ -119,7 +120,7 @@ import fancy_subprocess
119
120
  from typing import Unpack
120
121
 
121
122
  def grab_output(cmd: list[str], **kwargs: Unpack[fancy_subprocess.RunParams]) -> str:
122
- # Raises ValueError if there are unknown parameters in kwargs or if a keyword argument's type is incorrect
123
+ # Raises ValueError if there are unknown parameters in kwargs or if a keyword argument's type is incorrect
123
124
  fancy_subprocess.check_run_params(**kwargs)
124
125
 
125
126
  # Make a copy of keyword arguments to be edited
@@ -127,7 +128,7 @@ def grab_output(cmd: list[str], **kwargs: Unpack[fancy_subprocess.RunParams]) ->
127
128
  # Make sure nothing's printed, raise ValueError if caller tries to specify "output_quiet" or "message_quiet"
128
129
  fancy_subprocess.force_run_params(forwarded_args, message_quiet=True, output_quiet=True)
129
130
  # Handle encoding/decoding errors by replacing them with placeholder character by default, but allow callers to still customize behaviour
130
- fancy_subprocess.change_default_run_params(forwarded_args, errors='replace')
131
+ fancy_subprocess.change_default_run_params(forwarded_args, errors='backslashreplace')
131
132
 
132
133
  # Run command, raise fancy_subprocess.RunError on failure
133
134
  result = fancy_subprocess.run(cmd, **forwarded_args)
@@ -136,7 +137,7 @@ def grab_output(cmd: list[str], **kwargs: Unpack[fancy_subprocess.RunParams]) ->
136
137
  return result.output
137
138
  ```
138
139
 
139
- The `grab_output()` function supports all `fancy_subprocess.run()` arguments (eg. `retry`), except for `message_quiet` and `output_quiet`. If `errors` is unspecified or set to `None`, it uses `errors='replace'` instead of the default `errors='strict'` behaviour. It also passes `mypy --strict`.
140
+ The `grab_output()` function supports all `fancy_subprocess.run()` arguments (eg. `retry`), except for `message_quiet` and `output_quiet`. If `errors` is unspecified or set to `None`, it uses `errors='backslashreplace'` instead of the default `errors='replace'` behaviour. It also passes `mypy --strict`.
140
141
 
141
142
  (Using `typing.Unpack` requires Python 3.11 or later. In Python 3.10, use the `typing_extensions` module from PyPI.)
142
143
 
@@ -18,14 +18,14 @@ Key differences compared to `subprocess.run()`:
18
18
  Arguments (all of them except `cmd` are optional):
19
19
  - `cmd: Sequence[str | Path]` - Command to run. See `subprocess.run()`'s documentation for the interpretation of `cmd[0]`. It is recommended to use `fancy_subprocess.which()` to produce `cmd[0]`.
20
20
  - `print_message: Callable[[str], None]` - Function used to print informational messages. If unspecified or set to `None`, defaults to `fancy_subprocess.default_print`. Use `message_quiet=True` to disable printing informational messages.
21
- - The type of this argument is also aliased as `fancy_subprocess.PrintFunction`.
21
+ - The type of this argument is also aliased as `fancy_subprocess.PrintFunction`.
22
22
  - `print_output: Callable[[str], None]` - Function used to print a line of the output of the command. If unspecified or set to `None`, defaults to `fancy_subprocess.default_print`. Use `output_quiet=True` to disable printing the command's output.
23
- - The type of this argument is also aliased as `fancy_subprocess.PrintFunction`.
23
+ - The type of this argument is also aliased as `fancy_subprocess.PrintFunction`.
24
24
  - `message_quiet: bool` - If `True`, `print_message` is ignored, and no informational messages are printed. If unspecified or set to `None`, defaults to `False`.
25
25
  - `output_quiet: bool` - If `True`, `print_output` is ignored, and the command's output it not printed. If unspecified or set to `None`, defaults to `False`. Note that this parameter also affects the default value of `description`.
26
26
  - `description: str` - Description printed before running the command. If unspecified or set to `None`, defaults to `Running command: ...` when `output_quiet` is `False`, and `Running command (output silenced): ...` when `output_quiet` is `True`.
27
27
  - `success: Sequence[int] | AnyExitCode` - List of exit codes that should be considered successful. If set to `fancy_subprocess.ANY_EXIT_CODE`, then all exit codes are considered successful. If unspecified or set to `None`, defaults to `[0]`. Note that 0 is not automatically included in the list of successful exit codes, so if a list without 0 is specified, then the function will consider 0 a failure.
28
- - The type of this argument is also aliased as `fancy_subprocess.Success`.
28
+ - The type of this argument is also aliased as `fancy_subprocess.Success`.
29
29
  - `flush_before_subprocess: bool` - If `True`, flushes both the standard output and error streams before running the command. If unspecified or set to `None`, defaults to `True`.
30
30
  - `trim_output_lines: bool` - If `True`, remove trailing whitespace from the lines of the output of the command before calling `print_output` and adding them to the `output` field of `RunResult`. If unspecified or set to `None`, defaults to `True`.
31
31
  - `max_output_size: int` - Maximum number of characters to be recorded in the `output` field of `RunResult`. If the command produces more than `max_output_size` characters, only the last `max_output_size` will be recorded. If unspecified or set to `None`, defaults to 10,000,000.
@@ -33,10 +33,11 @@ Arguments (all of them except `cmd` are optional):
33
33
  - `retry_initial_sleep_seconds: float` - Number of seconds to wait before retrying for the first time. If unspecified or set to `None`, defaults to 10.
34
34
  - `retry_backoff: float` - Factor used to increase wait times before subsequent retries. If unspecified or set to `None`, defaults to 2.
35
35
  - `env_overrides: Mapping[str, str]` - Dictionary used to set environment variables. Note that unline the `env` argument of `subprocess.run()`, `env_overrides` does not need to contain all environment variables, only the ones you want to add/modify compared to os.environ. If unspecified or set to `None`, defaults to empty dictionary, i.e. no change to the environment.
36
- - The type of this argument is also aliased as `fancy_subprocess.EnvOverrides`.
36
+ - The type of this argument is also aliased as `fancy_subprocess.EnvOverrides`.
37
37
  - `cwd: str | Path` - If not `None`, change current working directory to `cwd` before running the command.
38
38
  - `encoding: str` - This encoding will be used to open stdout and stderr of the command. If unspecified or set to `None`, see default behaviour in `io.TextIOWrapper`'s documentation.
39
- - `errors: str` - This specifies how text decoding errors will be handled. See details (including what happens if unspecified or set to `None`) in `io.TextIOWrapper`'s documentation.
39
+ - `errors: str` - This specifies how text decoding errors will be handled. (See possible options in `io.TextIOWrapper`'s documentation.) If unspecified or set to `None`, defaults to `replace`. Note that this differs from `io.TextIOWrapper`'s default behaviour, which is to use `strict`.
40
+ - `replace_fffd_with_question_mark: bool` - Replace Unicode Replacement Character U+FFFD (`�`, usually introduced by `errors='replace'`) with ASCII question mark (`?`) in lines of the output of the command before calling `print_output` and adding them to the `output` field of `RunResult`. If unspecified or set to `None`, defaults to `True`.
40
41
 
41
42
  ### Return value: `fancy_subprocess.RunResult`
42
43
 
@@ -92,7 +93,7 @@ import fancy_subprocess
92
93
  from typing import Unpack
93
94
 
94
95
  def grab_output(cmd: list[str], **kwargs: Unpack[fancy_subprocess.RunParams]) -> str:
95
- # Raises ValueError if there are unknown parameters in kwargs or if a keyword argument's type is incorrect
96
+ # Raises ValueError if there are unknown parameters in kwargs or if a keyword argument's type is incorrect
96
97
  fancy_subprocess.check_run_params(**kwargs)
97
98
 
98
99
  # Make a copy of keyword arguments to be edited
@@ -100,7 +101,7 @@ def grab_output(cmd: list[str], **kwargs: Unpack[fancy_subprocess.RunParams]) ->
100
101
  # Make sure nothing's printed, raise ValueError if caller tries to specify "output_quiet" or "message_quiet"
101
102
  fancy_subprocess.force_run_params(forwarded_args, message_quiet=True, output_quiet=True)
102
103
  # Handle encoding/decoding errors by replacing them with placeholder character by default, but allow callers to still customize behaviour
103
- fancy_subprocess.change_default_run_params(forwarded_args, errors='replace')
104
+ fancy_subprocess.change_default_run_params(forwarded_args, errors='backslashreplace')
104
105
 
105
106
  # Run command, raise fancy_subprocess.RunError on failure
106
107
  result = fancy_subprocess.run(cmd, **forwarded_args)
@@ -109,7 +110,7 @@ def grab_output(cmd: list[str], **kwargs: Unpack[fancy_subprocess.RunParams]) ->
109
110
  return result.output
110
111
  ```
111
112
 
112
- The `grab_output()` function supports all `fancy_subprocess.run()` arguments (eg. `retry`), except for `message_quiet` and `output_quiet`. If `errors` is unspecified or set to `None`, it uses `errors='replace'` instead of the default `errors='strict'` behaviour. It also passes `mypy --strict`.
113
+ The `grab_output()` function supports all `fancy_subprocess.run()` arguments (eg. `retry`), except for `message_quiet` and `output_quiet`. If `errors` is unspecified or set to `None`, it uses `errors='backslashreplace'` instead of the default `errors='replace'` behaviour. It also passes `mypy --strict`.
113
114
 
114
115
  (Using `typing.Unpack` requires Python 3.11 or later. In Python 3.10, use the `typing_extensions` module from PyPI.)
115
116
 
@@ -132,7 +132,8 @@ def run(
132
132
  - `env_overrides: Mapping[str, str]` - Dictionary used to set environment variables. Note that unline the `env` argument of `subprocess.run()`, `env_overrides` does not need to contain all environment variables, only the ones you want to add/modify compared to os.environ. If unspecified or set to `None`, defaults to empty dictionary, i.e. no change to the environment.
133
133
  - `cwd: str | Path` - If not `None`, change current working directory to `cwd` before running the command.
134
134
  - `encoding: str` - This encoding will be used to open stdout and stderr of the command. If unspecified or set to `None`, see default behaviour in `io.TextIOWrapper`'s documentation.
135
- - `errors: str` - This specifies how text decoding errors will be handled. See details (including what happens if unspecified or set to `None`) in `io.TextIOWrapper`'s documentation.
135
+ - `errors: str` - This specifies how text decoding errors will be handled. (See possible options in `io.TextIOWrapper`'s documentation.) If unspecified or set to `None`, defaults to `replace`. Note that this differs from `io.TextIOWrapper`'s default behaviour, which is to use `strict`.
136
+ - `replace_fffd_with_question_mark: bool` - Replace Unicode Replacement Character U+FFFD (`�`, usually introduced by `errors='replace'`) with ASCII question mark (`?`) in lines of the output of the command before calling `print_output` and adding them to the `output` field of `RunResult`. If unspecified or set to `None`, defaults to `True`.
136
137
  """
137
138
 
138
139
  check_run_params(**kwargs)
@@ -154,7 +155,8 @@ def run(
154
155
  env_overrides = value_or(kwargs.get('env_overrides'), dict())
155
156
  cwd = kwargs.get('cwd')
156
157
  encoding = kwargs.get('encoding')
157
- errors = kwargs.get('errors')
158
+ errors = value_or(kwargs.get('errors'), 'replace')
159
+ replace_fffd_with_question_mark = value_or(kwargs.get('replace_fffd_with_question_mark'), True)
158
160
 
159
161
  if message_quiet:
160
162
  print_message = silenced_print
@@ -188,6 +190,8 @@ def run(
188
190
  line = line.removesuffix('\n')
189
191
  if trim_output_lines:
190
192
  line = line.rstrip()
193
+ if replace_fffd_with_question_mark:
194
+ line = line.replace('\ufffd', '?')
191
195
 
192
196
  print_output(line)
193
197
 
@@ -44,6 +44,7 @@ class RunParams(TypedDict, total=False):
44
44
  cwd: Optional[str | Path]
45
45
  encoding: Optional[str]
46
46
  errors: Optional[str]
47
+ replace_fffd_with_question_mark: Optional[bool]
47
48
 
48
49
  def check_run_params(**kwargs: Unpack[RunParams]) -> None:
49
50
  try:
@@ -2,7 +2,7 @@ import fancy_subprocess
2
2
  from typing import Unpack
3
3
 
4
4
  def grab_output(cmd: list[str], **kwargs: Unpack[fancy_subprocess.RunParams]) -> str:
5
- # Raises ValueError if there are unknown parameters in kwargs or if a keyword argument's type is incorrect
5
+ # Raises ValueError if there are unknown parameters in kwargs or if a keyword argument's type is incorrect
6
6
  fancy_subprocess.check_run_params(**kwargs)
7
7
 
8
8
  # Make a copy of keyword arguments to be edited
@@ -3,8 +3,8 @@ requires = ["hatchling"]
3
3
  build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
- name = "fancy_subprocess"
7
- version = "2.0"
6
+ name = "fancy-subprocess"
7
+ version = "2.2"
8
8
  authors = [
9
9
  { name="Tamás PEREGI", email="petamas@gmail.com" },
10
10
  ]
@@ -26,11 +26,11 @@ classifiers = [
26
26
  license = "MIT"
27
27
  license-files = ["LICENSE"]
28
28
  dependencies = [
29
- "ntstatus<2",
30
- "oslex<2",
31
- "pathext>=1.2,<2",
32
- "typing_extensions>=4.14,<5",
33
- "typeguard>=4.4.2,<5",
29
+ "ntstatus>=1.1,<2",
30
+ "oslex>=0.1.3,<2",
31
+ "pathext>=1.5,<2",
32
+ "typeguard>=4.4.2,<5",
33
+ "typing_extensions>=4.14,<5",
34
34
  ]
35
35
 
36
36
  [project.urls]
@@ -4,7 +4,7 @@ requires-python = ">=3.10"
4
4
 
5
5
  [[package]]
6
6
  name = "fancy-subprocess"
7
- version = "2.0"
7
+ version = "2.2"
8
8
  source = { editable = "." }
9
9
  dependencies = [
10
10
  { name = "ntstatus" },
@@ -16,13 +16,22 @@ dependencies = [
16
16
 
17
17
  [package.metadata]
18
18
  requires-dist = [
19
- { name = "ntstatus", specifier = "<2" },
20
- { name = "oslex", specifier = "<2" },
21
- { name = "pathext", specifier = ">=1.2,<2" },
19
+ { name = "ntstatus", specifier = ">=1.1,<2" },
20
+ { name = "oslex", specifier = ">=0.1.3,<2" },
21
+ { name = "pathext", specifier = ">=1.5,<2" },
22
22
  { name = "typeguard", specifier = ">=4.4.2,<5" },
23
23
  { name = "typing-extensions", specifier = ">=4.14,<5" },
24
24
  ]
25
25
 
26
+ [[package]]
27
+ name = "more-itertools"
28
+ version = "10.7.0"
29
+ source = { registry = "https://pypi.org/simple" }
30
+ sdist = { url = "https://files.pythonhosted.org/packages/ce/a0/834b0cebabbfc7e311f30b46c8188790a37f89fc8d756660346fe5abfd09/more_itertools-10.7.0.tar.gz", hash = "sha256:9fddd5403be01a94b204faadcff459ec3568cf110265d3c54323e1e866ad29d3", size = 127671 }
31
+ wheels = [
32
+ { url = "https://files.pythonhosted.org/packages/2b/9f/7ba6f94fc1e9ac3d2b853fdff3035fb2fa5afbed898c4a72b8a020610594/more_itertools-10.7.0-py3-none-any.whl", hash = "sha256:d43980384673cb07d2f7d2d918c616b30c659c089ee23953f601d6609c67510e", size = 65278 },
33
+ ]
34
+
26
35
  [[package]]
27
36
  name = "mslex"
28
37
  version = "1.3.0"
@@ -34,11 +43,11 @@ wheels = [
34
43
 
35
44
  [[package]]
36
45
  name = "ntstatus"
37
- version = "1.0"
46
+ version = "1.1"
38
47
  source = { registry = "https://pypi.org/simple" }
39
- sdist = { url = "https://files.pythonhosted.org/packages/ae/da/cb1da91d387a7fd6a41cd7d93e43e37dace1893a0b95f903957d14bcfab1/ntstatus-1.0.tar.gz", hash = "sha256:02213e4f0a94a7db2576f564a9db6c568424d45df91ff905ba72991be1090069", size = 37616 }
48
+ sdist = { url = "https://files.pythonhosted.org/packages/b5/99/41f6934b2dc1b02c6366b9b5d5211f3dc8eb08c9f9d8813e58fe4f09f9b4/ntstatus-1.1.tar.gz", hash = "sha256:542069b3d0d654a37b9e068caaf4d29c8e3f9c1a2a4991ed0ec8c7a858022ee2", size = 37824 }
40
49
  wheels = [
41
- { url = "https://files.pythonhosted.org/packages/c1/d7/a7c7059d08115fa0b1a10640e3cf976b571af8a40893d8c19487ac66203b/ntstatus-1.0-py3-none-any.whl", hash = "sha256:cf64988a31880379061d6e9a7c85b938b8c8e50d392852017a4d68d1923bc72a", size = 36590 },
50
+ { url = "https://files.pythonhosted.org/packages/a5/cc/c9493a2a64dd9cfa8edf554028571f29398cb6fc693e6f4919f762994768/ntstatus-1.1-py3-none-any.whl", hash = "sha256:303239b3286fc0529fc8fd2daad6465ab7f5b2e0bc6abfdf785d48fbab1f2a54", size = 36674 },
42
51
  ]
43
52
 
44
53
  [[package]]
@@ -55,11 +64,14 @@ wheels = [
55
64
 
56
65
  [[package]]
57
66
  name = "pathext"
58
- version = "1.2"
67
+ version = "1.5"
59
68
  source = { registry = "https://pypi.org/simple" }
60
- sdist = { url = "https://files.pythonhosted.org/packages/53/33/304454ff8a1cb51596834bd05e015b7b363c4fd546b8070c825d3613c976/pathext-1.2.tar.gz", hash = "sha256:937f993f60e36726c4f5fbaac1bef9ff7c072b6d1feb0da00a9dae16ee30f88f", size = 4406 }
69
+ dependencies = [
70
+ { name = "more-itertools" },
71
+ ]
72
+ sdist = { url = "https://files.pythonhosted.org/packages/09/b3/cd7d7282c1640300630e963b84b6e202862206f5ac24959015d83372e16c/pathext-1.5.tar.gz", hash = "sha256:cbfd6f697a4874be7ea37109dbf60f108d451b44bb3df290f1560c75fa16bb87", size = 6424 }
61
73
  wheels = [
62
- { url = "https://files.pythonhosted.org/packages/15/d0/a5e951eab19896b4521d8c57ab7ac7fb3793f119d50dd3b399ca5d28a670/pathext-1.2-py3-none-any.whl", hash = "sha256:0de8a1e7f741150b15315a281ff5ccaa67767ed0ad985a8b0b6eeabd9c9e1d74", size = 4327 },
74
+ { url = "https://files.pythonhosted.org/packages/d0/d0/aab254e2ba1e2a390261ef746c4129ef81b2d13289850380c5273026915d/pathext-1.5-py3-none-any.whl", hash = "sha256:3aedc261736dc714881676847dcc20ce2246b09d331ec09276b478477a469530", size = 7325 },
63
75
  ]
64
76
 
65
77
  [[package]]
File without changes