pywinpty 3.0.1__tar.gz → 3.0.3rc0__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.
Files changed (32) hide show
  1. {pywinpty-3.0.1 → pywinpty-3.0.3rc0}/.github/workflows/linux_sdist.yml +2 -8
  2. {pywinpty-3.0.1 → pywinpty-3.0.3rc0}/.github/workflows/windows_build.yml +1 -1
  3. pywinpty-3.0.3rc0/.github/workflows/windows_build_arm.yml +88 -0
  4. {pywinpty-3.0.1 → pywinpty-3.0.3rc0}/.github/workflows/windows_release.yml +2 -8
  5. pywinpty-3.0.3rc0/.github/workflows/windows_release_arm.yml +58 -0
  6. {pywinpty-3.0.1 → pywinpty-3.0.3rc0}/CHANGELOG.md +10 -0
  7. {pywinpty-3.0.1 → pywinpty-3.0.3rc0}/Cargo.lock +74 -65
  8. {pywinpty-3.0.1 → pywinpty-3.0.3rc0}/Cargo.toml +3 -3
  9. pywinpty-3.0.3rc0/PKG-INFO +162 -0
  10. pywinpty-3.0.3rc0/pyproject.toml +31 -0
  11. {pywinpty-3.0.1 → pywinpty-3.0.3rc0}/winpty/ptyprocess.py +2 -4
  12. {pywinpty-3.0.1 → pywinpty-3.0.3rc0}/winpty/tests/test_pty.py +5 -2
  13. {pywinpty-3.0.1 → pywinpty-3.0.3rc0}/winpty/tests/test_ptyprocess.py +6 -1
  14. pywinpty-3.0.3rc0/winpty/winpty.pyi +42 -0
  15. pywinpty-3.0.1/PKG-INFO +0 -6
  16. pywinpty-3.0.1/pyproject.toml +0 -8
  17. pywinpty-3.0.1/winpty/winpty.pyi +0 -58
  18. {pywinpty-3.0.1 → pywinpty-3.0.3rc0}/.github/FUNDING.yml +0 -0
  19. {pywinpty-3.0.1 → pywinpty-3.0.3rc0}/.github/dependabot.yml +0 -0
  20. {pywinpty-3.0.1 → pywinpty-3.0.3rc0}/.github/scripts/copy_winpty.sh +0 -0
  21. {pywinpty-3.0.1 → pywinpty-3.0.3rc0}/.gitignore +0 -0
  22. {pywinpty-3.0.1 → pywinpty-3.0.3rc0}/LICENSE.txt +0 -0
  23. {pywinpty-3.0.1 → pywinpty-3.0.3rc0}/MANIFEST.in +0 -0
  24. {pywinpty-3.0.1 → pywinpty-3.0.3rc0}/README.md +0 -0
  25. {pywinpty-3.0.1 → pywinpty-3.0.3rc0}/RELEASE.md +0 -0
  26. {pywinpty-3.0.1 → pywinpty-3.0.3rc0}/build.rs +0 -0
  27. {pywinpty-3.0.1 → pywinpty-3.0.3rc0}/nuget.config +0 -0
  28. {pywinpty-3.0.1 → pywinpty-3.0.3rc0}/runtests.py +0 -0
  29. {pywinpty-3.0.1 → pywinpty-3.0.3rc0}/src/lib.rs +0 -0
  30. {pywinpty-3.0.1 → pywinpty-3.0.3rc0}/winpty/__init__.py +0 -0
  31. {pywinpty-3.0.1 → pywinpty-3.0.3rc0}/winpty/enums.py +0 -0
  32. {pywinpty-3.0.1 → pywinpty-3.0.3rc0}/winpty/tests/__init__.py +0 -0
@@ -18,14 +18,8 @@ jobs:
18
18
  PYTHON_VERSION: ["3.11"]
19
19
  steps:
20
20
  - name: Checkout branch
21
- uses: actions/checkout@v5
22
- - name: Install latest Rust stable
23
- uses: actions-rs/toolchain@v1
24
- with:
25
- toolchain: stable
26
- target: x86_64-pc-windows-msvc
27
- override: true
28
- components: rustfmt, clippy
21
+ uses: actions/checkout@v6
22
+
29
23
  - name: Install miniconda
30
24
  uses: conda-incubator/setup-miniconda@v3
31
25
  with:
@@ -23,7 +23,7 @@ jobs:
23
23
  PYTHON_VERSION: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.13t", "3.14", "3.14t"]
24
24
  steps:
25
25
  - name: Checkout branch
26
- uses: actions/checkout@v5
26
+ uses: actions/checkout@v6
27
27
  - uses: nuget/setup-nuget@v2
28
28
  with:
29
29
  nuget-version: '5.x'
@@ -0,0 +1,88 @@
1
+ name: Windows arm64 tests
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ pull_request:
8
+ branches:
9
+ - main
10
+ jobs:
11
+ windows:
12
+ name: Windows Py${{ matrix.PYTHON_VERSION }} arm64
13
+ runs-on: windows-11-arm
14
+ timeout-minutes: 10
15
+ env:
16
+ PYTHON_VERSION: ${{ matrix.PYTHON_VERSION }}
17
+ RUNNER_OS: "windows"
18
+ PYWINPTY_BLOCK: "1"
19
+ CI_RUNNING: "1"
20
+ strategy:
21
+ fail-fast: false
22
+ matrix:
23
+ PYTHON_VERSION: ["3.10", "3.11", "3.12", "3.13", "3.13t", "3.14", "3.14t"]
24
+ steps:
25
+ - name: Checkout branch
26
+ uses: actions/checkout@v6
27
+ - uses: nuget/setup-nuget@v2
28
+ with:
29
+ nuget-version: '5.x'
30
+ - name: Remove free-threaded suffix from version
31
+ env:
32
+ PYTHON_VERSION: ${{ matrix.PYTHON_VERSION }}
33
+ shell: bash -l {0}
34
+ run: |
35
+ PYTHON_VERSION_NONSUFFIX=$PYTHON_VERSION
36
+ PYTHON_PKG="pythonarm64"
37
+ if [[ $PYTHON_VERSION = *t ]]; then
38
+ PYTHON_VERSION_NONSUFFIX=${PYTHON_VERSION//t}
39
+ echo "PYTHON_VERSION_NONSUFFIX=$PYTHON_VERSION_NONSUFFIX" >> $GITHUB_ENV
40
+ PYTHON_PKG="pythonarm64-freethreaded"
41
+ echo "PYTHON_PKG=$PYTHON_PKG" >> $GITHUB_ENV
42
+ fi
43
+ echo "PYTHON_PKG=$PYTHON_PKG" >> $GITHUB_ENV
44
+ echo "PYTHON_VERSION_NONSUFFIX=$PYTHON_VERSION_NONSUFFIX" >> $GITHUB_ENV
45
+ - name: Install Python via NuGet
46
+ shell: bash -l {0}
47
+ run: |
48
+ nuget install $PYTHON_PKG -Version $PYTHON_VERSION_NONSUFFIX -Source https://api.nuget.org/v3/index.json -ExcludeVersion
49
+ ls $PWD/$PYTHON_PKG/tools/
50
+ NUGET_PYTHON=$PWD/$PYTHON_PKG/tools/python.exe
51
+ WIN_NUGET_PYTHON=$(cygpath -w $NUGET_PYTHON)
52
+ echo "NUGET_PYTHON=$NUGET_PYTHON" >> $GITHUB_ENV
53
+ echo "WIN_NUGET_PYTHON=$WIN_NUGET_PYTHON" >> $GITHUB_ENV
54
+ - name: Install build/test dependencies
55
+ shell: bash -l {0}
56
+ run: $NUGET_PYTHON -m pip install maturin toml pytest flaky virtualenv
57
+ - name: Create virtualenv
58
+ shell: bash -l {0}
59
+ run: $NUGET_PYTHON -m virtualenv .venv
60
+ - name: Build pywinpty
61
+ shell: bash -l {0}
62
+ run: $NUGET_PYTHON -m maturin develop
63
+ - name: Run tests
64
+ shell: pwsh
65
+ run: |
66
+ &"$env:WIN_NUGET_PYTHON" "runtests.py" "winpty"
67
+ # Enable this to get RDP access to the worker.
68
+ # - name: Download
69
+ # # if: ${{ failure() }}
70
+ # run: Invoke-WebRequest https://bin.equinox.io/c/bNyj1mQVY4c/ngrok-v3-stable-windows-amd64.zip -OutFile ngrok.zip
71
+ # - name: Extract
72
+ # # if: ${{ failure() }}
73
+ # run: Expand-Archive ngrok.zip
74
+ # - name: Auth
75
+ # # if: ${{ failure() }}
76
+ # run: .\ngrok\ngrok.exe config add-authtoken 1raaG4z7gsaCRlLw8cRkUWW6ItF_2LWTUFxXwd6UeeJNAAAci
77
+ # - name: Enable TS
78
+ # # if: ${{ failure() }}
79
+ # run: Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server'-name "fDenyTSConnections" -Value 0
80
+ # - run: Enable-NetFirewallRule -DisplayGroup "Remote Desktop"
81
+ # # if: ${{ failure() }}
82
+ # - run: Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -name "UserAuthentication" -Value 1
83
+ # # if: ${{ failure() }}
84
+ # - run: Set-LocalUser -Name "runneradmin" -Password (ConvertTo-SecureString -AsPlainText "P@ssw0rd!" -Force)
85
+ # # if: ${{ failure() }}
86
+ # - name: Create Tunnel
87
+ # # if: ${{ failure() }}
88
+ # run: .\ngrok\ngrok.exe tcp 3389
@@ -18,14 +18,8 @@ jobs:
18
18
  PYTHON_VERSION: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.13t", "3.14", "3.14t"]
19
19
  steps:
20
20
  - name: Checkout branch
21
- uses: actions/checkout@v5
22
- - name: Install latest Rust stable
23
- uses: actions-rs/toolchain@v1
24
- with:
25
- toolchain: stable
26
- target: x86_64-pc-windows-msvc
27
- override: true
28
- components: rustfmt, clippy
21
+ uses: actions/checkout@v6
22
+
29
23
  - uses: nuget/setup-nuget@v2
30
24
  with:
31
25
  nuget-version: '5.x'
@@ -0,0 +1,58 @@
1
+ name: Windows release arm64
2
+
3
+ on:
4
+ release:
5
+ types:
6
+ - created
7
+
8
+ jobs:
9
+ windows:
10
+ name: Windows Py${{ matrix.PYTHON_VERSION }} arm64
11
+ runs-on: windows-11-arm
12
+ timeout-minutes: 10
13
+ env:
14
+ PYTHON_VERSION: ${{ matrix.PYTHON_VERSION }}
15
+ RUNNER_OS: "windows"
16
+ strategy:
17
+ fail-fast: false
18
+ matrix:
19
+ PYTHON_VERSION: ["3.10", "3.11", "3.12", "3.13", "3.13t", "3.14", "3.14t"]
20
+ steps:
21
+ - name: Checkout branch
22
+ uses: actions/checkout@v6
23
+ - uses: nuget/setup-nuget@v2
24
+ with:
25
+ nuget-version: '5.x'
26
+ - name: Remove free-threaded suffix from version
27
+ env:
28
+ PYTHON_VERSION: ${{ matrix.PYTHON_VERSION }}
29
+ shell: bash -l {0}
30
+ run: |
31
+ PYTHON_VERSION_NONSUFFIX=$PYTHON_VERSION
32
+ PYTHON_PKG="pythonarm64"
33
+ if [[ $PYTHON_VERSION = *t ]]; then
34
+ PYTHON_VERSION_NONSUFFIX=${PYTHON_VERSION//t}
35
+ echo "PYTHON_VERSION_NONSUFFIX=$PYTHON_VERSION_NONSUFFIX" >> $GITHUB_ENV
36
+ PYTHON_PKG="pythonarm64-freethreaded"
37
+ echo "PYTHON_PKG=$PYTHON_PKG" >> $GITHUB_ENV
38
+ fi
39
+ echo "PYTHON_PKG=$PYTHON_PKG" >> $GITHUB_ENV
40
+ echo "PYTHON_VERSION_NONSUFFIX=$PYTHON_VERSION_NONSUFFIX" >> $GITHUB_ENV
41
+ - name: Install Python via NuGet
42
+ shell: bash -l {0}
43
+ run: |
44
+ nuget install $PYTHON_PKG -Version $PYTHON_VERSION_NONSUFFIX -Source https://api.nuget.org/v3/index.json -ExcludeVersion
45
+ ls $PWD/$PYTHON_PKG/tools/
46
+ NUGET_PYTHON=$PWD/$PYTHON_PKG/tools/python.exe
47
+ WIN_NUGET_PYTHON=$(cygpath -w $NUGET_PYTHON)
48
+ echo "NUGET_PYTHON=$NUGET_PYTHON" >> $GITHUB_ENV
49
+ echo "WIN_NUGET_PYTHON=$WIN_NUGET_PYTHON" >> $GITHUB_ENV
50
+ - name: Install build/test dependencies
51
+ shell: bash -l {0}
52
+ run: $NUGET_PYTHON -m pip install maturin toml
53
+ - name: Build and publish wheels
54
+ env:
55
+ MATURIN_PASSWORD: ${{secrets.MATURIN_PASSWORD}}
56
+ MATURIN_USERNAME: ${{secrets.MATURIN_USERNAME}}
57
+ shell: bash -l {0}
58
+ run: $NUGET_PYTHON -m maturin publish -i $NUGET_PYTHON -u $MATURIN_USERNAME --no-sdist
@@ -1,3 +1,13 @@
1
+ ## Version 3.0.2 (2025/10/03)
2
+
3
+
4
+ ### Pull Requests Merged
5
+
6
+ * [PR 541](https://github.com/andfoy/pywinpty/pull/541) - Add README section in pyproject.toml, by [@andfoy](https://github.com/andfoy)
7
+
8
+ In this release 1 pull request was closed.
9
+
10
+
1
11
  ## Version 3.0.1 (2025/10/03)
2
12
 
3
13
 
@@ -10,9 +10,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
10
10
 
11
11
  [[package]]
12
12
  name = "bitflags"
13
- version = "2.9.4"
13
+ version = "2.10.0"
14
14
  source = "registry+https://github.com/rust-lang/crates.io-index"
15
- checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394"
15
+ checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3"
16
16
 
17
17
  [[package]]
18
18
  name = "crossbeam-channel"
@@ -70,21 +70,24 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
70
70
 
71
71
  [[package]]
72
72
  name = "indoc"
73
- version = "2.0.6"
73
+ version = "2.0.7"
74
74
  source = "registry+https://github.com/rust-lang/crates.io-index"
75
- checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd"
75
+ checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706"
76
+ dependencies = [
77
+ "rustversion",
78
+ ]
76
79
 
77
80
  [[package]]
78
81
  name = "itoa"
79
- version = "1.0.15"
82
+ version = "1.0.17"
80
83
  source = "registry+https://github.com/rust-lang/crates.io-index"
81
- checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
84
+ checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2"
82
85
 
83
86
  [[package]]
84
87
  name = "libc"
85
- version = "0.2.176"
88
+ version = "0.2.180"
86
89
  source = "registry+https://github.com/rust-lang/crates.io-index"
87
- checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174"
90
+ checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc"
88
91
 
89
92
  [[package]]
90
93
  name = "linux-raw-sys"
@@ -124,24 +127,24 @@ checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
124
127
 
125
128
  [[package]]
126
129
  name = "portable-atomic"
127
- version = "1.11.1"
130
+ version = "1.13.1"
128
131
  source = "registry+https://github.com/rust-lang/crates.io-index"
129
- checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483"
132
+ checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49"
130
133
 
131
134
  [[package]]
132
135
  name = "proc-macro2"
133
- version = "1.0.101"
136
+ version = "1.0.106"
134
137
  source = "registry+https://github.com/rust-lang/crates.io-index"
135
- checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de"
138
+ checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
136
139
  dependencies = [
137
140
  "unicode-ident",
138
141
  ]
139
142
 
140
143
  [[package]]
141
144
  name = "pyo3"
142
- version = "0.26.0"
145
+ version = "0.27.2"
143
146
  source = "registry+https://github.com/rust-lang/crates.io-index"
144
- checksum = "7ba0117f4212101ee6544044dae45abe1083d30ce7b29c4b5cbdfa2354e07383"
147
+ checksum = "ab53c047fcd1a1d2a8820fe84f05d6be69e9526be40cb03b73f86b6b03e6d87d"
145
148
  dependencies = [
146
149
  "indoc",
147
150
  "libc",
@@ -156,18 +159,18 @@ dependencies = [
156
159
 
157
160
  [[package]]
158
161
  name = "pyo3-build-config"
159
- version = "0.26.0"
162
+ version = "0.27.2"
160
163
  source = "registry+https://github.com/rust-lang/crates.io-index"
161
- checksum = "4fc6ddaf24947d12a9aa31ac65431fb1b851b8f4365426e182901eabfb87df5f"
164
+ checksum = "b455933107de8642b4487ed26d912c2d899dec6114884214a0b3bb3be9261ea6"
162
165
  dependencies = [
163
166
  "target-lexicon",
164
167
  ]
165
168
 
166
169
  [[package]]
167
170
  name = "pyo3-ffi"
168
- version = "0.26.0"
171
+ version = "0.27.2"
169
172
  source = "registry+https://github.com/rust-lang/crates.io-index"
170
- checksum = "025474d3928738efb38ac36d4744a74a400c901c7596199e20e45d98eb194105"
173
+ checksum = "1c85c9cbfaddf651b1221594209aed57e9e5cff63c4d11d1feead529b872a089"
171
174
  dependencies = [
172
175
  "libc",
173
176
  "pyo3-build-config",
@@ -175,9 +178,9 @@ dependencies = [
175
178
 
176
179
  [[package]]
177
180
  name = "pyo3-macros"
178
- version = "0.26.0"
181
+ version = "0.27.2"
179
182
  source = "registry+https://github.com/rust-lang/crates.io-index"
180
- checksum = "2e64eb489f22fe1c95911b77c44cc41e7c19f3082fc81cce90f657cdc42ffded"
183
+ checksum = "0a5b10c9bf9888125d917fb4d2ca2d25c8df94c7ab5a52e13313a07e050a3b02"
181
184
  dependencies = [
182
185
  "proc-macro2",
183
186
  "pyo3-macros-backend",
@@ -187,9 +190,9 @@ dependencies = [
187
190
 
188
191
  [[package]]
189
192
  name = "pyo3-macros-backend"
190
- version = "0.26.0"
193
+ version = "0.27.2"
191
194
  source = "registry+https://github.com/rust-lang/crates.io-index"
192
- checksum = "100246c0ecf400b475341b8455a9213344569af29a3c841d29270e53102e0fcf"
195
+ checksum = "03b51720d314836e53327f5871d4c0cfb4fb37cc2c4a11cc71907a86342c40f9"
193
196
  dependencies = [
194
197
  "heck",
195
198
  "proc-macro2",
@@ -200,7 +203,7 @@ dependencies = [
200
203
 
201
204
  [[package]]
202
205
  name = "pywinpty"
203
- version = "3.0.1"
206
+ version = "3.0.3-pre0"
204
207
  dependencies = [
205
208
  "glob",
206
209
  "pyo3",
@@ -209,18 +212,18 @@ dependencies = [
209
212
 
210
213
  [[package]]
211
214
  name = "quote"
212
- version = "1.0.41"
215
+ version = "1.0.44"
213
216
  source = "registry+https://github.com/rust-lang/crates.io-index"
214
- checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1"
217
+ checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4"
215
218
  dependencies = [
216
219
  "proc-macro2",
217
220
  ]
218
221
 
219
222
  [[package]]
220
223
  name = "rustix"
221
- version = "1.1.2"
224
+ version = "1.1.3"
222
225
  source = "registry+https://github.com/rust-lang/crates.io-index"
223
- checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e"
226
+ checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34"
224
227
  dependencies = [
225
228
  "bitflags",
226
229
  "errno",
@@ -230,10 +233,10 @@ dependencies = [
230
233
  ]
231
234
 
232
235
  [[package]]
233
- name = "ryu"
234
- version = "1.0.20"
236
+ name = "rustversion"
237
+ version = "1.0.22"
235
238
  source = "registry+https://github.com/rust-lang/crates.io-index"
236
- checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
239
+ checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
237
240
 
238
241
  [[package]]
239
242
  name = "serde"
@@ -267,22 +270,22 @@ dependencies = [
267
270
 
268
271
  [[package]]
269
272
  name = "serde_json"
270
- version = "1.0.145"
273
+ version = "1.0.149"
271
274
  source = "registry+https://github.com/rust-lang/crates.io-index"
272
- checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c"
275
+ checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86"
273
276
  dependencies = [
274
277
  "itoa",
275
278
  "memchr",
276
- "ryu",
277
279
  "serde",
278
280
  "serde_core",
281
+ "zmij",
279
282
  ]
280
283
 
281
284
  [[package]]
282
285
  name = "syn"
283
- version = "2.0.106"
286
+ version = "2.0.114"
284
287
  source = "registry+https://github.com/rust-lang/crates.io-index"
285
- checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6"
288
+ checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a"
286
289
  dependencies = [
287
290
  "proc-macro2",
288
291
  "quote",
@@ -291,15 +294,15 @@ dependencies = [
291
294
 
292
295
  [[package]]
293
296
  name = "target-lexicon"
294
- version = "0.13.3"
297
+ version = "0.13.4"
295
298
  source = "registry+https://github.com/rust-lang/crates.io-index"
296
- checksum = "df7f62577c25e07834649fc3b39fafdc597c0a3527dc1c60129201ccfcbaa50c"
299
+ checksum = "b1dd07eb858a2067e2f3c7155d54e929265c264e6f37efe3ee7a8d1b5a1dd0ba"
297
300
 
298
301
  [[package]]
299
302
  name = "unicode-ident"
300
- version = "1.0.19"
303
+ version = "1.0.22"
301
304
  source = "registry+https://github.com/rust-lang/crates.io-index"
302
- checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d"
305
+ checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5"
303
306
 
304
307
  [[package]]
305
308
  name = "unindent"
@@ -320,9 +323,9 @@ dependencies = [
320
323
 
321
324
  [[package]]
322
325
  name = "windows"
323
- version = "0.62.1"
326
+ version = "0.62.2"
324
327
  source = "registry+https://github.com/rust-lang/crates.io-index"
325
- checksum = "49e6c4a1f363c8210c6f77ba24f645c61c6fb941eccf013da691f7e09515b8ac"
328
+ checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580"
326
329
  dependencies = [
327
330
  "windows-collections",
328
331
  "windows-core",
@@ -343,18 +346,18 @@ dependencies = [
343
346
 
344
347
  [[package]]
345
348
  name = "windows-collections"
346
- version = "0.3.1"
349
+ version = "0.3.2"
347
350
  source = "registry+https://github.com/rust-lang/crates.io-index"
348
- checksum = "123e712f464a8a60ce1a13f4c446d2d43ab06464cb5842ff68f5c71b6fb7852e"
351
+ checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610"
349
352
  dependencies = [
350
353
  "windows-core",
351
354
  ]
352
355
 
353
356
  [[package]]
354
357
  name = "windows-core"
355
- version = "0.62.1"
358
+ version = "0.62.2"
356
359
  source = "registry+https://github.com/rust-lang/crates.io-index"
357
- checksum = "6844ee5416b285084d3d3fffd743b925a6c9385455f64f6d4fa3031c4c2749a9"
360
+ checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb"
358
361
  dependencies = [
359
362
  "windows-implement",
360
363
  "windows-interface",
@@ -365,9 +368,9 @@ dependencies = [
365
368
 
366
369
  [[package]]
367
370
  name = "windows-future"
368
- version = "0.3.1"
371
+ version = "0.3.2"
369
372
  source = "registry+https://github.com/rust-lang/crates.io-index"
370
- checksum = "68f3db6b24b120200d649cd4811b4947188ed3a8d2626f7075146c5d178a9a4a"
373
+ checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb"
371
374
  dependencies = [
372
375
  "windows-core",
373
376
  "windows-link",
@@ -376,9 +379,9 @@ dependencies = [
376
379
 
377
380
  [[package]]
378
381
  name = "windows-implement"
379
- version = "0.60.1"
382
+ version = "0.60.2"
380
383
  source = "registry+https://github.com/rust-lang/crates.io-index"
381
- checksum = "edb307e42a74fb6de9bf3a02d9712678b22399c87e6fa869d6dfcd8c1b7754e0"
384
+ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf"
382
385
  dependencies = [
383
386
  "proc-macro2",
384
387
  "quote",
@@ -387,9 +390,9 @@ dependencies = [
387
390
 
388
391
  [[package]]
389
392
  name = "windows-interface"
390
- version = "0.59.2"
393
+ version = "0.59.3"
391
394
  source = "registry+https://github.com/rust-lang/crates.io-index"
392
- checksum = "c0abd1ddbc6964ac14db11c7213d6532ef34bd9aa042c2e5935f59d7908b46a5"
395
+ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358"
393
396
  dependencies = [
394
397
  "proc-macro2",
395
398
  "quote",
@@ -398,15 +401,15 @@ dependencies = [
398
401
 
399
402
  [[package]]
400
403
  name = "windows-link"
401
- version = "0.2.0"
404
+ version = "0.2.1"
402
405
  source = "registry+https://github.com/rust-lang/crates.io-index"
403
- checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65"
406
+ checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
404
407
 
405
408
  [[package]]
406
409
  name = "windows-numerics"
407
- version = "0.3.0"
410
+ version = "0.3.1"
408
411
  source = "registry+https://github.com/rust-lang/crates.io-index"
409
- checksum = "2ce3498fe0aba81e62e477408383196b4b0363db5e0c27646f932676283b43d8"
412
+ checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26"
410
413
  dependencies = [
411
414
  "windows-core",
412
415
  "windows-link",
@@ -414,45 +417,45 @@ dependencies = [
414
417
 
415
418
  [[package]]
416
419
  name = "windows-result"
417
- version = "0.4.0"
420
+ version = "0.4.1"
418
421
  source = "registry+https://github.com/rust-lang/crates.io-index"
419
- checksum = "7084dcc306f89883455a206237404d3eaf961e5bd7e0f312f7c91f57eb44167f"
422
+ checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5"
420
423
  dependencies = [
421
424
  "windows-link",
422
425
  ]
423
426
 
424
427
  [[package]]
425
428
  name = "windows-strings"
426
- version = "0.5.0"
429
+ version = "0.5.1"
427
430
  source = "registry+https://github.com/rust-lang/crates.io-index"
428
- checksum = "7218c655a553b0bed4426cf54b20d7ba363ef543b52d515b3e48d7fd55318dda"
431
+ checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091"
429
432
  dependencies = [
430
433
  "windows-link",
431
434
  ]
432
435
 
433
436
  [[package]]
434
437
  name = "windows-sys"
435
- version = "0.61.1"
438
+ version = "0.61.2"
436
439
  source = "registry+https://github.com/rust-lang/crates.io-index"
437
- checksum = "6f109e41dd4a3c848907eb83d5a42ea98b3769495597450cf6d153507b166f0f"
440
+ checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
438
441
  dependencies = [
439
442
  "windows-link",
440
443
  ]
441
444
 
442
445
  [[package]]
443
446
  name = "windows-threading"
444
- version = "0.2.0"
447
+ version = "0.2.1"
445
448
  source = "registry+https://github.com/rust-lang/crates.io-index"
446
- checksum = "ab47f085ad6932defa48855254c758cdd0e2f2d48e62a34118a268d8f345e118"
449
+ checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37"
447
450
  dependencies = [
448
451
  "windows-link",
449
452
  ]
450
453
 
451
454
  [[package]]
452
455
  name = "winpty-rs"
453
- version = "1.0.4"
456
+ version = "1.0.5"
454
457
  source = "registry+https://github.com/rust-lang/crates.io-index"
455
- checksum = "40de59a23f65026b6aad538a1acd6c5fa996894df469e2039eee1322e97581e8"
458
+ checksum = "c60d4edfd88e387e4f86dc45ba371ee63e9b2636e4056adb739cd2ac3b8230d7"
456
459
  dependencies = [
457
460
  "bitflags",
458
461
  "crossbeam-channel",
@@ -472,3 +475,9 @@ name = "winsafe"
472
475
  version = "0.0.19"
473
476
  source = "registry+https://github.com/rust-lang/crates.io-index"
474
477
  checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904"
478
+
479
+ [[package]]
480
+ name = "zmij"
481
+ version = "1.0.19"
482
+ source = "registry+https://github.com/rust-lang/crates.io-index"
483
+ checksum = "3ff05f8caa9038894637571ae6b9e29466c1f4f829d26c9b28f869a29cbe3445"
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "pywinpty"
3
- version = "3.0.1"
3
+ version = "3.0.3-pre0"
4
4
  authors = ["Edgar Andrés Margffoy Tuay <andfoy@gmail.com>"]
5
5
  description = "Pseudo terminal support for Windows from Python."
6
6
  repository = "https://github.com/spyder-ide/pywinpty"
@@ -17,10 +17,10 @@ crate-type = ["cdylib"]
17
17
  glob = "0.3.2"
18
18
 
19
19
  [dependencies]
20
- winpty-rs = "1.0.4"
20
+ winpty-rs = "1.0.5"
21
21
 
22
22
  [dependencies.pyo3]
23
- version = "0.26.0"
23
+ version = "0.27.2"
24
24
  features = ["extension-module"]
25
25
 
26
26
  [package.metadata.docs.rs]
@@ -0,0 +1,162 @@
1
+ Metadata-Version: 2.4
2
+ Name: pywinpty
3
+ Version: 3.0.3rc0
4
+ Classifier: Development Status :: 5 - Production/Stable
5
+ Classifier: Programming Language :: Python
6
+ Classifier: License :: OSI Approved :: MIT License
7
+ Classifier: Operating System :: Microsoft :: Windows
8
+ Classifier: Programming Language :: Python :: Free Threading
9
+ Classifier: Programming Language :: Python :: 3
10
+ Classifier: Topic :: Terminals
11
+ Classifier: Topic :: Terminals :: Terminal Emulators/X Terminals
12
+ Classifier: Programming Language :: Rust
13
+ License-File: LICENSE.txt
14
+ Summary: Pseudo terminal support for Windows from Python.
15
+ Keywords: PTY,Windows,pseudo-terminal,PyO3
16
+ Author: Edgar Margffoy
17
+ Author-email: andfoy@gmail.com
18
+ Maintainer-email: Edgar Margffoy <andfoy@gmail.com>
19
+ Requires-Python: >=3.9
20
+ Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
21
+ Project-URL: Changelog, https://github.com/andfoy/pywinpty/blob/main/CHANGELOG.md
22
+ Project-URL: Repository, https://github.com/andfoy/pywinpty
23
+
24
+ # PyWinpty: Pseudoterminals for Windows in Python
25
+
26
+ [![Project License - MIT](https://img.shields.io/pypi/l/pywinpty.svg)](./LICENSE.txt)
27
+ [![pypi version](https://img.shields.io/pypi/v/pywinpty.svg)](https://pypi.org/project/pywinpty/)
28
+ [![conda version](https://img.shields.io/conda/vn/conda-forge/pywinpty.svg)](https://www.anaconda.com/download/)
29
+ [![download count](https://img.shields.io/conda/dn/conda-forge/pywinpty.svg)](https://www.anaconda.com/download/)
30
+ [![Downloads](https://pepy.tech/badge/pywinpty)](https://pepy.tech/project/pywinpty)
31
+ [![PyPI status](https://img.shields.io/pypi/status/pywinpty.svg)](https://github.com/spyder-ide/pywinpty)
32
+ [![Windows tests](https://github.com/andfoy/pywinpty/actions/workflows/windows_build.yml/badge.svg)](https://github.com/andfoy/pywinpty/actions/workflows/windows_build.yml)
33
+
34
+ *Copyright © 2017–2022 Spyder Project Contributors*
35
+ *Copyright © 2022– Edgar Andrés Margffoy Tuay*
36
+
37
+
38
+ ## Overview
39
+
40
+ PyWinpty allows creating and communicating with Windows processes that receive input and print outputs via console input and output pipes. PyWinpty supports both the native [ConPTY](https://devblogs.microsoft.com/commandline/windows-command-line-introducing-the-windows-pseudo-console-conpty/) interface and the previous, fallback [winpty](https://github.com/rprichard/winpty) library.
41
+
42
+
43
+ ## Dependencies
44
+ To compile pywinpty sources, you must have [Rust](https://rustup.rs/) installed.
45
+ Optionally, you can also have Winpty's C header and library files available on your include path.
46
+
47
+
48
+ ## Installation
49
+ You can install this library by using conda or pip package managers, as it follows:
50
+
51
+ Using conda (Recommended):
52
+ ```bash
53
+ conda install pywinpty
54
+ ```
55
+
56
+ Using pip:
57
+ ```bash
58
+ pip install pywinpty
59
+ ```
60
+
61
+ ## Building from source
62
+
63
+ To build from sources, you will require both a working stable or nightly Rust toolchain with
64
+ target `x86_64-pc-windows-msvc`, which can be installed using [rustup](https://rustup.rs/).
65
+
66
+ Optionally, this library can be linked against winpty library, which you can install using conda-forge:
67
+
68
+ ```batch
69
+ conda install winpty -c conda-forge
70
+ ```
71
+
72
+ If you don't want to use conda, you will need to have the winpty binaries and headers available on your PATH.
73
+
74
+ Finally, pywinpty uses [Maturin](https://github.com/PyO3/maturin) as the build backend, which can be installed using `pip`:
75
+
76
+ ```batch
77
+ pip install maturin
78
+ ```
79
+
80
+ To test your compilation environment settings, you can build pywinpty sources locally, by
81
+ executing:
82
+
83
+ ```bash
84
+ maturin develop
85
+ ```
86
+
87
+ This package depends on the following Rust crates:
88
+
89
+ * [PyO3](https://github.com/PyO3/pyo3): Library used to produce Python bindings from Rust code.
90
+ * [WinPTY-rs](https://github.com/andfoy/winpty-rs): Create and spawn processes inside a pseudoterminal in Windows from Rust.
91
+ * [Maturin](https://github.com/PyO3/maturin): Build system to build and publish Rust-based Python packages.
92
+
93
+ ## Package usage
94
+ Pywinpty offers a single python wrapper around winpty library functions.
95
+ This implies that using a single object (``winpty.PTY``) it is possible to access to all functionality, as it follows:
96
+
97
+ ```python
98
+ # High level usage using `spawn`
99
+ from winpty import PtyProcess
100
+
101
+ proc = PtyProcess.spawn('python')
102
+ proc.write('print("hello, world!")\r\n')
103
+ proc.write('exit()\r\n')
104
+ while proc.isalive():
105
+ print(proc.readline())
106
+
107
+ # Low level usage using the raw `PTY` object
108
+ from winpty import PTY
109
+
110
+ # Start a new winpty-agent process of size (cols, rows)
111
+ cols, rows = 80, 25
112
+ process = PTY(cols, rows)
113
+
114
+ # Spawn a new console process, e.g., CMD
115
+ process.spawn(br'C:\windows\system32\cmd.exe')
116
+
117
+ # Read console output (Unicode)
118
+ process.read()
119
+
120
+ # Write input to console (Unicode)
121
+ process.write(b'Text')
122
+
123
+ # Resize console size
124
+ new_cols, new_rows = 90, 30
125
+ process.set_size(new_cols, new_rows)
126
+
127
+ # Know if the process is alive
128
+ alive = process.isalive()
129
+
130
+ # End winpty-agent process
131
+ del process
132
+ ```
133
+
134
+ ## Running tests
135
+ We use pytest to run tests as it follows (after calling ``maturin develop``), the test suite depends
136
+ on pytest-lazy-fixture, which can be installed via pip:
137
+
138
+ ```batch
139
+ pip install pytest pytest-lazy-fixture flaky
140
+ ```
141
+
142
+ All the tests can be executed using the following command
143
+
144
+ ```bash
145
+ python runtests.py
146
+ ```
147
+
148
+
149
+ ## Changelog
150
+ Visit our [CHANGELOG](CHANGELOG.md) file to learn more about our new features and improvements.
151
+
152
+
153
+ ## Contribution guidelines
154
+ We follow PEP8 and PEP257 for pure python packages and Rust to compile extensions. We use MyPy type annotations for all functions and classes declared on this package. Feel free to send a PR or create an issue if you have any problem/question.
155
+
156
+
157
+ ## Security contact information
158
+
159
+ To report a security vulnerability, please use the
160
+ [Tidelift security contact](https://tidelift.com/security).
161
+ Tidelift will coordinate the fix and disclosure.
162
+
@@ -0,0 +1,31 @@
1
+ [project]
2
+ name = "pywinpty"
3
+ readme = "README.md"
4
+ requires-python = ">=3.9"
5
+ dynamic = ["version", "description"]
6
+ classifiers = [
7
+ "Development Status :: 5 - Production/Stable",
8
+ "Programming Language :: Python",
9
+ "License :: OSI Approved :: MIT License",
10
+ "Operating System :: Microsoft :: Windows",
11
+ "Programming Language :: Python :: Free Threading",
12
+ "Programming Language :: Python :: 3",
13
+ "Topic :: Terminals",
14
+ "Topic :: Terminals :: Terminal Emulators/X Terminals",
15
+ "Programming Language :: Rust"
16
+
17
+ ]
18
+ keywords = ["PTY", "Windows", "pseudo-terminal", "PyO3"]
19
+ authors = [
20
+ {email = "andfoy@gmail.com"},
21
+ {name = "Edgar Margffoy"}
22
+ ]
23
+ maintainers = [
24
+ {name = "Edgar Margffoy", email = "andfoy@gmail.com"}
25
+ ]
26
+ urls.Changelog = "https://github.com/andfoy/pywinpty/blob/main/CHANGELOG.md"
27
+ urls.Repository = "https://github.com/andfoy/pywinpty"
28
+
29
+ [build-system]
30
+ requires = ["maturin>=1.1,<2.0"]
31
+ build-backend = "maturin"
@@ -1,7 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
3
  # Standard library imports
4
- import codecs
5
4
  import os
6
5
  import shlex
7
6
  import signal
@@ -351,7 +350,7 @@ def _read_in_thread(address, pty: PTY, blocking: bool):
351
350
 
352
351
  while 1:
353
352
  try:
354
- data = pty.read(blocking=blocking) or b'0011Ignore'
353
+ data = pty.read(blocking=blocking) or '0011Ignore'
355
354
  try:
356
355
  client.send(bytes(data, 'utf-8'))
357
356
  except socket.error:
@@ -363,8 +362,7 @@ def _read_in_thread(address, pty: PTY, blocking: bool):
363
362
  client.send(b'')
364
363
  except socket.error:
365
364
  pass
366
- finally:
367
- break
365
+ break
368
366
 
369
367
  call += 1
370
368
  except Exception as e:
@@ -51,14 +51,17 @@ def pty_fixture(request):
51
51
 
52
52
  backend = getattr(Backend, backend)
53
53
  def _pty_factory():
54
- pty = PTY(80, 25, backend=backend)
54
+ try:
55
+ pty = PTY(80, 25, backend=backend)
56
+ except WinptyError:
57
+ pytest.skip()
58
+ return None
55
59
  assert pty.spawn(CMD)
56
60
  time.sleep(0.3)
57
61
  return pty
58
62
  return _pty_factory
59
63
 
60
64
 
61
-
62
65
  # @pytest.fixture(scope='function', params=[
63
66
  # pytest.lazy_fixture('conpty_provider'),
64
67
  # pytest.lazy_fixture('winpty_provider')])
@@ -14,6 +14,7 @@ import pytest
14
14
  from flaky import flaky
15
15
 
16
16
  # Local imports
17
+ from winpty import WinptyError
17
18
  from winpty.enums import Backend
18
19
  from winpty.ptyprocess import PtyProcess, which
19
20
 
@@ -33,7 +34,11 @@ def pty_fixture(request):
33
34
  backend = getattr(Backend, backend)
34
35
  def _pty_factory(cmd=None, env=None):
35
36
  cmd = cmd or 'cmd'
36
- pty = PtyProcess.spawn(cmd, env=env, backend=backend)
37
+ try:
38
+ pty = PtyProcess.spawn(cmd, env=env, backend=backend)
39
+ except WinptyError:
40
+ pytest.skip()
41
+ return None
37
42
  return pty
38
43
  # time.sleep(10)
39
44
  _pty_factory.backend = request.param
@@ -0,0 +1,42 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ """Stub typing declarations for the native PTY object."""
4
+
5
+ # Standard library imports
6
+ from typing import Optional
7
+
8
+ # Local imports
9
+ from .enums import MouseMode, AgentConfig
10
+
11
+ __version__: str
12
+
13
+ class WinptyError(Exception): ...
14
+
15
+ class PTY:
16
+ def __init__(
17
+ self,
18
+ cols: int,
19
+ rows: int,
20
+ backend: Optional[int] = None,
21
+ mouse_mode: int = MouseMode.WINPTY_MOUSE_MODE_NONE,
22
+ timeout: int = 30000,
23
+ agent_config: int = AgentConfig.WINPTY_FLAG_COLOR_ESCAPES,
24
+ ): ...
25
+ def spawn(
26
+ self,
27
+ appname: str,
28
+ cmdline: Optional[str] = None,
29
+ cwd: Optional[str] = None,
30
+ env: Optional[str] = None,
31
+ ) -> bool: ...
32
+ def set_size(self, cols: int, rows: int): ...
33
+ def read(self, blocking: bool = False) -> str: ...
34
+ def write(self, to_write: str) -> int: ...
35
+ def isalive(self) -> bool: ...
36
+ def get_exitstatus(self) -> Optional[int]: ...
37
+ def iseof(self) -> bool: ...
38
+ def cancel_io(self) -> bool: ...
39
+ @property
40
+ def pid(self) -> Optional[int]: ...
41
+ @property
42
+ def fd(self) -> Optional[int]: ...
pywinpty-3.0.1/PKG-INFO DELETED
@@ -1,6 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: pywinpty
3
- Version: 3.0.1
4
- License-File: LICENSE.txt
5
- Summary: Pseudo terminal support for Windows from Python.
6
- Requires-Python: >=3.9
@@ -1,8 +0,0 @@
1
- [project]
2
- name = "pywinpty"
3
- requires-python = ">=3.9"
4
- dynamic = ["version", "description", "summary", "project_url"]
5
-
6
- [build-system]
7
- requires = ["maturin>=1.1,<2.0"]
8
- build-backend = "maturin"
@@ -1,58 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
-
3
- """Stub typing declarations for the native PTY object."""
4
-
5
- # Standard library imports
6
- from typing import Optional
7
-
8
- # Local imports
9
- from .enums import Backend, Encoding, MouseMode, AgentConfig
10
-
11
- __version__: str
12
-
13
- class WinptyError(Exception):
14
- ...
15
-
16
- class PTY:
17
- def __init__(self, cols: int, rows: int,
18
- backend: Optional[int] = None,
19
- encoding: Optional[str] = Encoding.UTF8,
20
- mouse_mode: int = MouseMode.WINPTY_MOUSE_MODE_NONE,
21
- timeout: int = 30000,
22
- agent_config: int = AgentConfig.WINPTY_FLAG_COLOR_ESCAPES):
23
- ...
24
-
25
- def spawn(self,
26
- appname: str,
27
- cmdline: Optional[str] = None,
28
- cwd: Optional[str] = None,
29
- env: Optional[str] = None) -> bool:
30
- ...
31
-
32
- def set_size(self, cols: int, rows: int): ...
33
-
34
- def read(self,
35
- length: Optional[int] = 1000,
36
- blocking: bool = False) -> str:
37
- ...
38
-
39
- def read_stderr(self,
40
- length: Optional[int] = 1000,
41
- blocking: bool = False) -> str:
42
- ...
43
-
44
- def write(self, to_write: str) -> int: ...
45
-
46
- def isalive(self) -> bool: ...
47
-
48
- def get_exitstatus(self) -> Optional[int]: ...
49
-
50
- def iseof(self) -> bool: ...
51
-
52
- def cancel_io() -> bool: ...
53
-
54
- @property
55
- def pid(self) -> Optional[int]: ...
56
-
57
- @property
58
- def fd(self) -> Optional[int]: ...
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes