Module: PoisePython::Resources::PythonPackage

Defined in:
lib/poise_python/resources/python_package.rb

Overview

A python_package resource to manage Python installations using pip.

Examples:

python_package 'django' do
  python '2'
  version '1.8.3'
end

Since:

  • 1.0.0

Provides:

  • python_package

Actions:

  • install

  • upgrade

  • uninstall

Defined Under Namespace

Classes: Provider, Resource

Constant Summary collapse

PIP_HACK_SCRIPT =

A Python snippet to check which versions of things pip would try to install. Probably not 100% bulletproof.

Since:

  • 1.0.0

"import json\nimport re\nimport sys\n\nimport pip\n# Don't use pkg_resources because I don't want to require it before this anyway.\nif re.match(r'0\\\\.|1\\\\.|6\\\\.0', pip.__version__):\n  sys.stderr.write('The python_package resource requires pip >= 6.1.0, currently '+pip.__version__+'\\\\n')\n  sys.exit(1)\n\ntry:\n  from pip.commands import InstallCommand\n  from pip.index import PackageFinder\n  from pip.req import InstallRequirement\nexcept ImportError:\n  # Pip 10 moved all internals to their own package.\n  from pip._internal.commands import InstallCommand\n  from pip._internal.index import PackageFinder\n  from pip._internal.req import InstallRequirement\n\npackages = {}\ncmd = InstallCommand()\noptions, args = cmd.parse_args(sys.argv[1:])\nwith cmd._build_session(options) as session:\n  if options.no_index:\n    index_urls = []\n  else:\n    index_urls = [options.index_url] + options.extra_index_urls\n  finder_options = dict(\n    find_links=options.find_links,\n    index_urls=index_urls,\n    allow_all_prereleases=options.pre,\n    process_dependency_links=options.process_dependency_links,\n    trusted_hosts=options.trusted_hosts,\n    session=session,\n  )\n  if getattr(options, 'format_control', None):\n    finder_options['format_control'] = options.format_control\n  finder = PackageFinder(**finder_options)\n  find_all = getattr(finder, 'find_all_candidates', getattr(finder, '_find_all_versions', None))\n  for arg in args:\n    req = InstallRequirement.from_line(arg)\n    found = finder.find_requirement(req, True)\n    all_candidates = find_all(req.name)\n    candidate = [c for c in all_candidates if c.location == found]\n    if candidate:\n      packages[candidate[0].project.lower()] = str(candidate[0].version)\njson.dump(packages, sys.stdout)\n"