Skip to content

Commit 6d4431e

Browse files
committed
patch 7.4.1769
Problem: No "closed", "errors" and "encoding" attribute on Python output. Solution: Add attributes and more tests. (Roland Puntaier, closes #622)
1 parent d106e5b commit 6d4431e

8 files changed

Lines changed: 33 additions & 3 deletions

File tree

src/if_py_both.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -503,6 +503,7 @@ static struct PyMethodDef OutputMethods[] = {
503503
{"readable", (PyCFunction)AlwaysFalse, METH_NOARGS, ""},
504504
{"seekable", (PyCFunction)AlwaysFalse, METH_NOARGS, ""},
505505
{"writable", (PyCFunction)AlwaysTrue, METH_NOARGS, ""},
506+
{"closed", (PyCFunction)AlwaysFalse, METH_NOARGS, ""},
506507
{"__dir__", (PyCFunction)OutputDir, METH_NOARGS, ""},
507508
{ NULL, NULL, 0, NULL}
508509
};

src/if_python.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1195,7 +1195,10 @@ OutputGetattr(PyObject *self, char *name)
11951195
return PyInt_FromLong(((OutputObject *)(self))->softspace);
11961196
else if (strcmp(name, "__members__") == 0)
11971197
return ObjectDir(NULL, OutputAttrs);
1198-
1198+
else if (strcmp(name, "errors") == 0)
1199+
return PyString_FromString("strict");
1200+
else if (strcmp(name, "encoding") == 0)
1201+
return PyString_FromString(ENC_OPT);
11991202
return Py_FindMethod(OutputMethods, self, name);
12001203
}
12011204

src/if_python3.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1100,6 +1100,10 @@ OutputGetattro(PyObject *self, PyObject *nameobj)
11001100

11011101
if (strcmp(name, "softspace") == 0)
11021102
return PyLong_FromLong(((OutputObject *)(self))->softspace);
1103+
else if (strcmp(name, "errors") == 0)
1104+
return PyString_FromString("strict");
1105+
else if (strcmp(name, "encoding") == 0)
1106+
return PyString_FromString(ENC_OPT);
11031107

11041108
return PyObject_GenericGetAttr(self, nameobj);
11051109
}

src/testdir/test86.in

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1289,6 +1289,11 @@ ee('assert sys.stdout.writable()==True')
12891289
ee('assert sys.stdout.readable()==False')
12901290
ee('assert sys.stderr.writable()==True')
12911291
ee('assert sys.stderr.readable()==False')
1292+
ee('assert sys.stdout.closed()==False')
1293+
ee('assert sys.stderr.closed()==False')
1294+
ee('assert sys.stdout.errors=="strict"')
1295+
ee('assert sys.stderr.errors=="strict"')
1296+
ee('assert sys.stdout.encoding==sys.stderr.encoding')
12921297
ee('sys.stdout.write(None)')
12931298
cb.append(">> OutputWriteLines")
12941299
ee('sys.stdout.writelines(None)')

src/testdir/test86.ok

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -449,7 +449,7 @@ range:__dir__,__members__,append,end,start
449449
dictionary:__dir__,__members__,get,has_key,items,keys,locked,pop,popitem,scope,update,values
450450
list:__dir__,__members__,extend,locked
451451
function:__dir__,__members__,args,self,softspace
452-
output:__dir__,__members__,close,flush,isatty,readable,seekable,softspace,writable,write,writelines
452+
output:__dir__,__members__,close,closed,flush,isatty,readable,seekable,softspace,writable,write,writelines
453453
{}
454454
{'a': 1}
455455
{'a': 1}
@@ -600,6 +600,11 @@ assert sys.stdout.writable()==True:NOT FAILED
600600
assert sys.stdout.readable()==False:NOT FAILED
601601
assert sys.stderr.writable()==True:NOT FAILED
602602
assert sys.stderr.readable()==False:NOT FAILED
603+
assert sys.stdout.closed()==False:NOT FAILED
604+
assert sys.stderr.closed()==False:NOT FAILED
605+
assert sys.stdout.errors=="strict":NOT FAILED
606+
assert sys.stderr.errors=="strict":NOT FAILED
607+
assert sys.stdout.encoding==sys.stderr.encoding:NOT FAILED
603608
sys.stdout.write(None):TypeError:('coercing to Unicode: need string or buffer, NoneType found',)
604609
>> OutputWriteLines
605610
sys.stdout.writelines(None):TypeError:("'NoneType' object is not iterable",)

src/testdir/test87.in

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1283,6 +1283,11 @@ ee('assert sys.stdout.writable()==True')
12831283
ee('assert sys.stdout.readable()==False')
12841284
ee('assert sys.stderr.writable()==True')
12851285
ee('assert sys.stderr.readable()==False')
1286+
ee('assert sys.stdout.closed()==False')
1287+
ee('assert sys.stderr.closed()==False')
1288+
ee('assert sys.stdout.errors=="strict"')
1289+
ee('assert sys.stderr.errors=="strict"')
1290+
ee('assert sys.stdout.encoding==sys.stderr.encoding')
12861291
ee('sys.stdout.write(None)')
12871292
cb.append(">> OutputWriteLines")
12881293
ee('sys.stdout.writelines(None)')

src/testdir/test87.ok

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -449,7 +449,7 @@ range:__dir__,append,end,start
449449
dictionary:__dir__,get,has_key,items,keys,locked,pop,popitem,scope,update,values
450450
list:__dir__,extend,locked
451451
function:__dir__,args,self,softspace
452-
output:__dir__,close,flush,isatty,readable,seekable,softspace,writable,write,writelines
452+
output:__dir__,close,closed,flush,isatty,readable,seekable,softspace,writable,write,writelines
453453
{}
454454
{'a': 1}
455455
{'a': 1}
@@ -600,6 +600,11 @@ assert sys.stdout.writable()==True:NOT FAILED
600600
assert sys.stdout.readable()==False:NOT FAILED
601601
assert sys.stderr.writable()==True:NOT FAILED
602602
assert sys.stderr.readable()==False:NOT FAILED
603+
assert sys.stdout.closed()==False:NOT FAILED
604+
assert sys.stderr.closed()==False:NOT FAILED
605+
assert sys.stdout.errors=="strict":NOT FAILED
606+
assert sys.stderr.errors=="strict":NOT FAILED
607+
assert sys.stdout.encoding==sys.stderr.encoding:NOT FAILED
603608
sys.stdout.write(None):(<class 'TypeError'>, TypeError("Can't convert 'NoneType' object to str implicitly",))
604609
>> OutputWriteLines
605610
sys.stdout.writelines(None):(<class 'TypeError'>, TypeError("'NoneType' object is not iterable",))

src/version.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -748,6 +748,8 @@ static char *(features[]) =
748748

749749
static int included_patches[] =
750750
{ /* Add new patch number below this line */
751+
/**/
752+
1769,
751753
/**/
752754
1768,
753755
/**/

0 commit comments

Comments
 (0)