aboutsummaryrefslogtreecommitdiff
path: root/tests/entry_points/py_console_script_gen_test.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/entry_points/py_console_script_gen_test.py')
-rw-r--r--tests/entry_points/py_console_script_gen_test.py197
1 files changed, 197 insertions, 0 deletions
diff --git a/tests/entry_points/py_console_script_gen_test.py b/tests/entry_points/py_console_script_gen_test.py
new file mode 100644
index 0000000..a5fceb6
--- /dev/null
+++ b/tests/entry_points/py_console_script_gen_test.py
@@ -0,0 +1,197 @@
+#!/usr/bin/env python3
+# Copyright 2023 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import pathlib
+import tempfile
+import textwrap
+import unittest
+
+from python.private.py_console_script_gen import run
+
+
+class RunTest(unittest.TestCase):
+ def setUp(self):
+ self.maxDiff = None
+
+ def test_no_console_scripts_error(self):
+ with tempfile.TemporaryDirectory() as tmpdir:
+ tmpdir = pathlib.Path(tmpdir)
+ outfile = tmpdir / "out.py"
+ given_contents = (
+ textwrap.dedent(
+ """
+ [non_console_scripts]
+ foo = foo.bar:fizz
+ """
+ ).strip()
+ + "\n"
+ )
+ entry_points = tmpdir / "entry_points.txt"
+ entry_points.write_text(given_contents)
+
+ with self.assertRaises(RuntimeError) as cm:
+ run(
+ entry_points=entry_points,
+ out=outfile,
+ console_script=None,
+ console_script_guess="",
+ )
+
+ self.assertEqual(
+ "The package does not provide any console_scripts in its entry_points.txt",
+ cm.exception.args[0],
+ )
+
+ def test_no_entry_point_selected_error(self):
+ with tempfile.TemporaryDirectory() as tmpdir:
+ tmpdir = pathlib.Path(tmpdir)
+ outfile = tmpdir / "out.py"
+ given_contents = (
+ textwrap.dedent(
+ """
+ [console_scripts]
+ foo = foo.bar:fizz
+ """
+ ).strip()
+ + "\n"
+ )
+ entry_points = tmpdir / "entry_points.txt"
+ entry_points.write_text(given_contents)
+
+ with self.assertRaises(RuntimeError) as cm:
+ run(
+ entry_points=entry_points,
+ out=outfile,
+ console_script=None,
+ console_script_guess="bar-baz",
+ )
+
+ self.assertEqual(
+ "Tried to guess that you wanted 'bar-baz', but could not find it. Please select one of the following console scripts: foo",
+ cm.exception.args[0],
+ )
+
+ def test_incorrect_entry_point(self):
+ with tempfile.TemporaryDirectory() as tmpdir:
+ tmpdir = pathlib.Path(tmpdir)
+ outfile = tmpdir / "out.py"
+ given_contents = (
+ textwrap.dedent(
+ """
+ [console_scripts]
+ foo = foo.bar:fizz
+ bar = foo.bar:buzz
+ """
+ ).strip()
+ + "\n"
+ )
+ entry_points = tmpdir / "entry_points.txt"
+ entry_points.write_text(given_contents)
+
+ with self.assertRaises(RuntimeError) as cm:
+ run(
+ entry_points=entry_points,
+ out=outfile,
+ console_script="baz",
+ console_script_guess="",
+ )
+
+ self.assertEqual(
+ "The console_script 'baz' was not found, only the following are available: bar, foo",
+ cm.exception.args[0],
+ )
+
+ def test_a_single_entry_point(self):
+ with tempfile.TemporaryDirectory() as tmpdir:
+ tmpdir = pathlib.Path(tmpdir)
+ given_contents = (
+ textwrap.dedent(
+ """
+ [console_scripts]
+ foo = foo.bar:baz
+ """
+ ).strip()
+ + "\n"
+ )
+ entry_points = tmpdir / "entry_points.txt"
+ entry_points.write_text(given_contents)
+ out = tmpdir / "foo.py"
+
+ run(
+ entry_points=entry_points,
+ out=out,
+ console_script=None,
+ console_script_guess="foo",
+ )
+
+ got = out.read_text()
+
+ want = textwrap.dedent(
+ """\
+ import sys
+
+ # See @rules_python//python/private:py_console_script_gen.py for explanation
+ if getattr(sys.flags, "safe_path", False):
+ # We are running on Python 3.11 and we don't need this workaround
+ pass
+ elif ".runfiles" not in sys.path[0]:
+ sys.path = sys.path[1:]
+
+ try:
+ from foo.bar import baz
+ except ImportError:
+ entries = "\\n".join(sys.path)
+ print("Printing sys.path entries for easier debugging:", file=sys.stderr)
+ print(f"sys.path is:\\n{entries}", file=sys.stderr)
+ raise
+
+ if __name__ == "__main__":
+ sys.exit(baz())
+ """
+ )
+ self.assertEqual(want, got)
+
+ def test_a_second_entry_point_class_method(self):
+ with tempfile.TemporaryDirectory() as tmpdir:
+ tmpdir = pathlib.Path(tmpdir)
+ given_contents = (
+ textwrap.dedent(
+ """
+ [console_scripts]
+ foo = foo.bar:Bar.baz
+ bar = foo.baz:Bar.baz
+ """
+ ).strip()
+ + "\n"
+ )
+ entry_points = tmpdir / "entry_points.txt"
+ entry_points.write_text(given_contents)
+ out = tmpdir / "out.py"
+
+ run(
+ entry_points=entry_points,
+ out=out,
+ console_script="bar",
+ console_script_guess="",
+ )
+
+ got = out.read_text()
+
+ self.assertRegex(got, "from foo\.baz import Bar")
+ self.assertRegex(got, "sys\.exit\(Bar\.baz\(\)\)")
+
+
+if __name__ == "__main__":
+ unittest.main()