From 86944abbabad62e53e644bd7375b9a56d66c1675 Mon Sep 17 00:00:00 2001
From: Andrew Murray <radarhere@users.noreply.github.com>
Date: Sat, 15 Jan 2022 16:08:37 +1100
Subject: [PATCH] Deprecated show_file "file" argument in favour of "path"

Conflict:NA
Reference:https://github.com/python-pillow/Pillow/commit/86944abbabad62e53e644bd7375b9a56d66c1675

---
 Tests/test_imageshow.py | 15 +++++++++++
 src/PIL/ImageShow.py    | 59 +++++++++++++++++++++++++++++++----------
 2 files changed, 60 insertions(+), 14 deletions(-)

diff --git a/Tests/test_imageshow.py b/Tests/test_imageshow.py
index 78e80f5..f79a531 100644
--- a/Tests/test_imageshow.py
+++ b/Tests/test_imageshow.py
@@ -63,3 +63,18 @@ def test_viewer():
 def test_viewers():
     for viewer in ImageShow._viewers:
         viewer.get_command("test.jpg")
+
+
+@pytest.mark.skipif(
+    not on_ci() or is_win32(),
+    reason="Only run on CIs; hangs on Windows CIs",
+)
+def test_file_deprecated():
+    for viewer in ImageShow._viewers:
+        with pytest.warns(DeprecationWarning):
+            try:
+                viewer.show_file(file="test.jpg")
+            except NotImplementedError:
+                pass
+        with pytest.raises(TypeError):
+            viewer.show_file()
diff --git a/src/PIL/ImageShow.py b/src/PIL/ImageShow.py
index 137135e..b3b9a5b 100644
--- a/src/PIL/ImageShow.py
+++ b/src/PIL/ImageShow.py
@@ -16,6 +16,7 @@ import shutil
 import subprocess
 import sys
 import tempfile
+import warnings
 from shlex import quote
 
 from PIL import Image
@@ -106,9 +107,19 @@ class Viewer:
         """Display the given image."""
         return self.show_file(self.save_image(image), **options)
 
-    def show_file(self, file, **options):
-        """Display the given file."""
-        os.system(self.get_command(file, **options))
+    def show_file(self, path=None, **options):
+        """Display given file."""
+        if path is None:
+            if "file" in options:
+                warnings.warn(
+                        "The 'file' argument is deprecated and will be removed in Pillow "
+                    "10 (2023-07-01). Use 'path' instead.",
+                    DeprecationWarning,
+                )
+                path = options.pop("file")
+            else:
+                raise TypeError("Missing required argument: 'path'")
+        os.system(self.get_command(path, **options))
         return 1
 
 
@@ -146,18 +157,28 @@ class MacViewer(Viewer):
         command = f"({command} {quote(file)}; sleep 20; rm -f {quote(file)})&"
         return command
 
-    def show_file(self, file, **options):
+    def show_file(self, path=None, **options):
         """Display given file"""
-        fd, path = tempfile.mkstemp()
+        if path is None:
+            if "file" in options:
+                warnings.warn(
+                    "The 'file' argument is deprecated and will be removed in Pillow "
+                    "10 (2023-07-01). Use 'path' instead.",
+                    DeprecationWarning,
+                )
+                path = options.pop("file")
+            else:
+                raise TypeError("Missing required argument: 'path'")
+        fd, temp_path = tempfile.mkstemp()
         with os.fdopen(fd, "w") as f:
-            f.write(file)
-        with open(path) as f:
+            f.write(path)
+        with open(temp_path) as f:
             subprocess.Popen(
                 ["im=$(cat); open -a Preview.app $im; sleep 20; rm -f $im"],
                 shell=True,
                 stdin=f,
             )
-        os.remove(path)
+        os.remove(temp_path)
         return 1
 
 
@@ -173,17 +194,27 @@ class UnixViewer(Viewer):
         command = self.get_command_ex(file, **options)[0]
         return f"({command} {quote(file)}; rm -f {quote(file)})&"
 
-    def show_file(self, file, **options):
+    def show_file(self, path=None, **options):
         """Display given file"""
-        fd, path = tempfile.mkstemp()
+        if path is None:
+            if "file" in options:
+                warnings.warn(
+                    "The 'file' argument is deprecated and will be removed in Pillow "
+                    "10 (2023-07-01). Use 'path' instead.",
+                    DeprecationWarning,
+                )
+                path = options.pop("file")
+            else:
+                raise TypeError("Missing required argument: 'path'")
+        fd, temp_path = tempfile.mkstemp()
         with os.fdopen(fd, "w") as f:
-            f.write(file)
-        with open(path) as f:
-            command = self.get_command_ex(file, **options)[0]
+            f.write(path)
+        with open(temp_path) as f:
+            command = self.get_command_ex(path, **options)[0]
             subprocess.Popen(
                 ["im=$(cat);" + command + " $im; rm -f $im"], shell=True, stdin=f
             )
-        os.remove(path)
+        os.remove(temp_path)
         return 1
 
 class XDGViewer(UnixViewer):
-- 
2.27.0

