Skip to content

Commit d424747

Browse files
committed
patch 7.4.905
Problem: Python interface can produce error "vim.message' object has no attribute 'isatty'". Solution: Add dummy isatty(), readable(), etc. (closes #464)
1 parent 6407b3e commit d424747

6 files changed

Lines changed: 75 additions & 4 deletions

File tree

src/if_py_both.h

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -465,20 +465,41 @@ OutputWritelines(OutputObject *self, PyObject *seq)
465465
}
466466

467467
static PyObject *
468-
OutputFlush(PyObject *self UNUSED)
468+
AlwaysNone(PyObject *self UNUSED)
469469
{
470470
/* do nothing */
471471
Py_INCREF(Py_None);
472472
return Py_None;
473473
}
474474

475+
static PyObject *
476+
AlwaysFalse(PyObject *self UNUSED)
477+
{
478+
/* do nothing */
479+
Py_INCREF(Py_False);
480+
return Py_False;
481+
}
482+
483+
static PyObject *
484+
AlwaysTrue(PyObject *self UNUSED)
485+
{
486+
/* do nothing */
487+
Py_INCREF(Py_True);
488+
return Py_True;
489+
}
490+
475491
/***************/
476492

477493
static struct PyMethodDef OutputMethods[] = {
478494
/* name, function, calling, doc */
479495
{"write", (PyCFunction)OutputWrite, METH_O, ""},
480496
{"writelines", (PyCFunction)OutputWritelines, METH_O, ""},
481-
{"flush", (PyCFunction)OutputFlush, METH_NOARGS, ""},
497+
{"flush", (PyCFunction)AlwaysNone, METH_NOARGS, ""},
498+
{"close", (PyCFunction)AlwaysNone, METH_NOARGS, ""},
499+
{"isatty", (PyCFunction)AlwaysFalse, METH_NOARGS, ""},
500+
{"readable", (PyCFunction)AlwaysFalse, METH_NOARGS, ""},
501+
{"seekable", (PyCFunction)AlwaysFalse, METH_NOARGS, ""},
502+
{"writable", (PyCFunction)AlwaysTrue, METH_NOARGS, ""},
482503
{"__dir__", (PyCFunction)OutputDir, METH_NOARGS, ""},
483504
{ NULL, NULL, 0, NULL}
484505
};

src/testdir/test86.in

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1094,8 +1094,20 @@ cb.append(">> OutputSetattr")
10941094
ee('del sys.stdout.softspace')
10951095
number_test('sys.stdout.softspace = %s', unsigned=True)
10961096
number_test('sys.stderr.softspace = %s', unsigned=True)
1097+
ee('assert sys.stdout.isatty()==False')
1098+
ee('assert sys.stdout.seekable()==False')
1099+
ee('sys.stdout.close()')
1100+
ee('sys.stdout.flush()')
1101+
ee('assert sys.stderr.isatty()==False')
1102+
ee('assert sys.stderr.seekable()==False')
1103+
ee('sys.stderr.close()')
1104+
ee('sys.stderr.flush()')
10971105
ee('sys.stdout.attr = None')
10981106
cb.append(">> OutputWrite")
1107+
ee('assert sys.stdout.writable()==True')
1108+
ee('assert sys.stdout.readable()==False')
1109+
ee('assert sys.stderr.writable()==True')
1110+
ee('assert sys.stderr.readable()==False')
10991111
ee('sys.stdout.write(None)')
11001112
cb.append(">> OutputWriteLines")
11011113
ee('sys.stdout.writelines(None)')

src/testdir/test86.ok

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -447,7 +447,7 @@ range:__dir__,__members__,append,end,start
447447
dictionary:__dir__,__members__,get,has_key,items,keys,locked,pop,popitem,scope,update,values
448448
list:__dir__,__members__,extend,locked
449449
function:__dir__,__members__,softspace
450-
output:__dir__,__members__,flush,softspace,write,writelines
450+
output:__dir__,__members__,close,flush,isatty,readable,seekable,softspace,writable,write,writelines
451451
{}
452452
{'a': 1}
453453
{'a': 1}
@@ -488,8 +488,20 @@ sys.stderr.softspace = []:TypeError:('expected int(), long() or something suppor
488488
sys.stderr.softspace = None:TypeError:('expected int(), long() or something supporting coercing to long(), but got NoneType',)
489489
sys.stderr.softspace = -1:ValueError:('number must be greater or equal to zero',)
490490
<<< Finished
491+
assert sys.stdout.isatty()==False:NOT FAILED
492+
assert sys.stdout.seekable()==False:NOT FAILED
493+
sys.stdout.close():NOT FAILED
494+
sys.stdout.flush():NOT FAILED
495+
assert sys.stderr.isatty()==False:NOT FAILED
496+
assert sys.stderr.seekable()==False:NOT FAILED
497+
sys.stderr.close():NOT FAILED
498+
sys.stderr.flush():NOT FAILED
491499
sys.stdout.attr = None:AttributeError:('invalid attribute: attr',)
492500
>> OutputWrite
501+
assert sys.stdout.writable()==True:NOT FAILED
502+
assert sys.stdout.readable()==False:NOT FAILED
503+
assert sys.stderr.writable()==True:NOT FAILED
504+
assert sys.stderr.readable()==False:NOT FAILED
493505
sys.stdout.write(None):TypeError:('coercing to Unicode: need string or buffer, NoneType found',)
494506
>> OutputWriteLines
495507
sys.stdout.writelines(None):TypeError:("'NoneType' object is not iterable",)

src/testdir/test87.in

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1071,8 +1071,20 @@ cb.append(">> OutputSetattr")
10711071
ee('del sys.stdout.softspace')
10721072
number_test('sys.stdout.softspace = %s', unsigned=True)
10731073
number_test('sys.stderr.softspace = %s', unsigned=True)
1074+
ee('assert sys.stdout.isatty()==False')
1075+
ee('assert sys.stdout.seekable()==False')
1076+
ee('sys.stdout.close()')
1077+
ee('sys.stdout.flush()')
1078+
ee('assert sys.stderr.isatty()==False')
1079+
ee('assert sys.stderr.seekable()==False')
1080+
ee('sys.stderr.close()')
1081+
ee('sys.stderr.flush()')
10741082
ee('sys.stdout.attr = None')
10751083
cb.append(">> OutputWrite")
1084+
ee('assert sys.stdout.writable()==True')
1085+
ee('assert sys.stdout.readable()==False')
1086+
ee('assert sys.stderr.writable()==True')
1087+
ee('assert sys.stderr.readable()==False')
10761088
ee('sys.stdout.write(None)')
10771089
cb.append(">> OutputWriteLines")
10781090
ee('sys.stdout.writelines(None)')

src/testdir/test87.ok

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -447,7 +447,7 @@ range:__dir__,append,end,start
447447
dictionary:__dir__,get,has_key,items,keys,locked,pop,popitem,scope,update,values
448448
list:__dir__,extend,locked
449449
function:__dir__,softspace
450-
output:__dir__,flush,softspace,write,writelines
450+
output:__dir__,close,flush,isatty,readable,seekable,softspace,writable,write,writelines
451451
{}
452452
{'a': 1}
453453
{'a': 1}
@@ -488,8 +488,20 @@ sys.stderr.softspace = []:(<class 'TypeError'>, TypeError('expected int() or som
488488
sys.stderr.softspace = None:(<class 'TypeError'>, TypeError('expected int() or something supporting coercing to int(), but got NoneType',))
489489
sys.stderr.softspace = -1:(<class 'ValueError'>, ValueError('number must be greater or equal to zero',))
490490
<<< Finished
491+
assert sys.stdout.isatty()==False:NOT FAILED
492+
assert sys.stdout.seekable()==False:NOT FAILED
493+
sys.stdout.close():NOT FAILED
494+
sys.stdout.flush():NOT FAILED
495+
assert sys.stderr.isatty()==False:NOT FAILED
496+
assert sys.stderr.seekable()==False:NOT FAILED
497+
sys.stderr.close():NOT FAILED
498+
sys.stderr.flush():NOT FAILED
491499
sys.stdout.attr = None:(<class 'AttributeError'>, AttributeError('invalid attribute: attr',))
492500
>> OutputWrite
501+
assert sys.stdout.writable()==True:NOT FAILED
502+
assert sys.stdout.readable()==False:NOT FAILED
503+
assert sys.stderr.writable()==True:NOT FAILED
504+
assert sys.stderr.readable()==False:NOT FAILED
493505
sys.stdout.write(None):(<class 'TypeError'>, TypeError("Can't convert 'NoneType' object to str implicitly",))
494506
>> OutputWriteLines
495507
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
@@ -741,6 +741,8 @@ static char *(features[]) =
741741

742742
static int included_patches[] =
743743
{ /* Add new patch number below this line */
744+
/**/
745+
905,
744746
/**/
745747
904,
746748
/**/

0 commit comments

Comments
 (0)