From 0fe273be5f04ba1e871e913f1f3f8584f77d6740 Mon Sep 17 00:00:00 2001 From: Jonathan Chang Date: Wed, 5 Sep 2018 23:01:52 -0400 Subject: [PATCH 1/2] language/python: support pypy --- Library/Homebrew/language/python.rb | 34 +++++++++++++++++------------ 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/Library/Homebrew/language/python.rb b/Library/Homebrew/language/python.rb index 3f840e72db..66d6bcabd4 100644 --- a/Library/Homebrew/language/python.rb +++ b/Library/Homebrew/language/python.rb @@ -9,13 +9,21 @@ module Language Version.create(version.to_s) end - def self.homebrew_site_packages(version = "3.7") - HOMEBREW_PREFIX/"lib/python#{version}/site-packages" + def self.homebrew_site_packages(python = "python3.7") + HOMEBREW_PREFIX/site_packages(python) + end + + def self.site_packages(python = "python3.7") + if python == "pypy" + "site-packages" + else + "lib/python#{major_minor_version python}/site-packages" + end end def self.each_python(build, &block) original_pythonpath = ENV["PYTHONPATH"] - { "python@3" => "python3", "python@2" => "python2.7" }.each do |python_formula, python| + { "python@3" => "python3", "python@2" => "python2.7", "pypy" => "pypy" }.each do |python_formula, python| python_formula = Formulary.factory(python_formula) next if build.without? python_formula.to_s @@ -23,7 +31,7 @@ module Language ENV["PYTHONPATH"] = if python_formula.installed? nil else - homebrew_site_packages(version) + homebrew_site_packages(python) end block&.call python, version end @@ -31,11 +39,10 @@ module Language end def self.reads_brewed_pth_files?(python) - version = major_minor_version python - return unless homebrew_site_packages(version).directory? - return unless homebrew_site_packages(version).writable_real? + return unless homebrew_site_packages(python).directory? + return unless homebrew_site_packages(python).writable_real? - probe_file = homebrew_site_packages(version)/"homebrew-pth-probe.pth" + probe_file = homebrew_site_packages(python)/"homebrew-pth-probe.pth" begin probe_file.atomic_write("import site; site.homebrew_was_here = True") with_homebrew_path { quiet_system python, "-c", "import site; assert(site.homebrew_was_here)" } @@ -69,6 +76,7 @@ module Language --no-user-cfg install --prefix=#{prefix} + --install-scripts=#{prefix}/bin --single-version-externally-managed --record=installed.txt ] @@ -101,17 +109,16 @@ module Language # Find any Python bindings provided by recursive dependencies formula_deps = formula.recursive_dependencies - xy = Language::Python.major_minor_version python pth_contents = formula_deps.map do |d| next if d.build? - dep_site_packages = Formula[d.name].opt_lib/"python#{xy}/site-packages" + dep_site_packages = Formula[d.name].opt_prefix/Language::Python.site_packages(python) next unless dep_site_packages.exist? "import site; site.addsitedir('#{dep_site_packages}')\n" end.compact unless pth_contents.empty? - (venv_root/"lib/python#{xy}/site-packages/homebrew_deps.pth").write pth_contents.join + (venv_root/Language::Python.site_packages(python)/"homebrew_deps.pth").write pth_contents.join end venv @@ -140,7 +147,7 @@ module Language def virtualenv_install_with_resources(options = {}) python = options[:using] if python.nil? - wanted = %w[python python@2 python2 python3 python@3].select { |py| needs_python?(py) } + wanted = %w[python python@2 python2 python3 python@3 pypy].select { |py| needs_python?(py) } raise FormulaAmbiguousPythonError, self if wanted.size > 1 python = wanted.first || "python2.7" @@ -177,9 +184,8 @@ module Language @formula.resource("homebrew-virtualenv").stage do |stage| old_pythonpath = ENV.delete "PYTHONPATH" begin - xy = Language::Python.major_minor_version(@python) staging = Pathname.new(stage.staging.tmpdir) - ENV.prepend_create_path "PYTHONPATH", staging/"target/lib/python#{xy}/site-packages" + ENV.prepend_create_path "PYTHONPATH", staging/"target"/Language::Python.site_packages(@python) @formula.system @python, *Language::Python.setup_install_args(staging/"target") @formula.system @python, "-s", staging/"target/bin/virtualenv", "-p", @python, @venv_root ensure From 3ce4caeb1aa8d5b9cd818bc114b4810b717ced3b Mon Sep 17 00:00:00 2001 From: Jonathan Chang Date: Mon, 24 Sep 2018 17:12:21 -0400 Subject: [PATCH 2/2] Add tests for language/python --- Library/Homebrew/test/language/python_spec.rb | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/Library/Homebrew/test/language/python_spec.rb b/Library/Homebrew/test/language/python_spec.rb index d384ce602e..fb2b924251 100644 --- a/Library/Homebrew/test/language/python_spec.rb +++ b/Library/Homebrew/test/language/python_spec.rb @@ -1,6 +1,35 @@ require "language/python" require "resource" +describe Language::Python, :needs_python do + describe "#major_minor_version" do + it "returns a Version for Python 2" do + expect(subject).to receive(:major_minor_version).and_return(Version) + subject.major_minor_version("python") + end + end + + describe "#site_packages" do + it "gives a different location between PyPy and Python 2" do + expect(subject.site_packages("python")).not_to eql(subject.site_packages("pypy")) + end + end + + describe "#homebrew_site_packages" do + it "returns the Homebrew site packages location" do + expect(subject).to receive(:site_packages).and_return(Pathname) + subject.site_packages("python") + end + end + + describe "#user_site_packages" do + it "can determine user site packages location" do + expect(subject).to receive(:user_site_packages).and_return(Pathname) + subject.user_site_packages("python") + end + end +end + describe Language::Python::Virtualenv::Virtualenv do subject { described_class.new(formula, dir, "python") }