Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix: Add support to detect pipx install from a pr #1104

Merged
merged 6 commits into from
Oct 17, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 2 additions & 27 deletions plextraktsync/commands/self_update.py
Original file line number Diff line number Diff line change
@@ -1,36 +1,11 @@
import json
from json import JSONDecodeError
from os import system

import click

from plextraktsync.util.execx import execx


def pipx_installed(package: str):
try:
output = execx("pipx list --json")
except FileNotFoundError:
return None
if not output:
return None

try:
install_data = json.loads(output)
except JSONDecodeError:
return None
if install_data is None:
return None

try:
package = install_data["venvs"][package]["metadata"]["main_package"]
except KeyError:
return None

return package


def enable_self_update():
from plextraktsync.util.packaging import pipx_installed

package = pipx_installed("plextraktsync")

return package is not None
Expand Down
9 changes: 2 additions & 7 deletions plextraktsync/path.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import site
from os import getenv, makedirs
from os.path import abspath, dirname, exists, join

Expand Down Expand Up @@ -44,13 +43,9 @@ def app_dir(self):

@cached_property
def installed(self):
"""
Return true if this package is installed to site-packages
"""
absdir = dirname(dirname(__file__))
paths = site.getsitepackages()
from plextraktsync.util.packaging import installed

return absdir in paths
return installed()

@staticmethod
def ensure_dir(directory):
Expand Down
77 changes: 77 additions & 0 deletions plextraktsync/util/packaging.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
import json
import site
from json import JSONDecodeError
from os.path import dirname

from plextraktsync.util.execx import execx


def installed():
"""
Return true if this package is installed to site-packages
"""
absdir = dirname(dirname(dirname(__file__)))
paths = site.getsitepackages()

return absdir in paths


def pip_installed(name: str):
import sys
try:
output = execx(f"{sys.executable} -m pip inspect")
except FileNotFoundError:
return None

try:
inspect = json.loads(output)
except JSONDecodeError:
return None

for package in inspect["installed"]:
if package["metadata"]["name"] != name:
continue
return package

return None


def pipx_installed(package: str):
try:
output = execx("pipx list --json")
except FileNotFoundError:
return None
if not output:
return None

try:
install_data = json.loads(output)
except JSONDecodeError:
return None
if install_data is None:
return None

try:
package = install_data["venvs"][package]["metadata"]["main_package"]
except KeyError:
return None

return package


def vcs_info(package: str):
"""
Return vcs_info from direct_url.json of a .dist-info for the package
"""
data = pip_installed(package)
if not data:
return None
try:
v = data["direct_url"]["vcs_info"]
except KeyError:
return None

v["pr"] = v["requested_revision"][10:-5]
v["short_commit_id"] = v["commit_id"][:8]

return v
61 changes: 51 additions & 10 deletions plextraktsync/version.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,51 @@
from plextraktsync.decorators.cached_property import cached_property


class Version:
@cached_property
def version(self):
from plextraktsync import __version__

# Released in PyPI
if not __version__.endswith(".0dev0"):
return __version__

# Print version from pip
if self.pipx_installed:
v = self.vcs_info
return f'{__version__[0:-4]}@pr/{v["pr"]}#{v["short_commit_id"]}'

# If installed with Git
gv = git_version_info()
if gv:
return f"{__version__}: {gv}"

return __version__

@property
def vcs_info(self):
from plextraktsync.util.packaging import vcs_info

return vcs_info("PlexTraktSync")

@property
def pipx_installed(self):
if not self.installed:
return False

from plextraktsync.util.packaging import pipx_installed

package = pipx_installed("plextraktsync")

return package is not None

@property
def installed(self):
from plextraktsync.util.packaging import installed

return installed()


def git_version_info():
try:
from gitinfo import get_git_info
Expand All @@ -13,15 +61,8 @@ def git_version_info():
return f"{commit['commit'][0:8]}: {message} @{commit['author_date']}"


def version():
from plextraktsync import __version__
VERSION = Version()

# Released in PyPI
if not __version__.endswith(".0dev0"):
return __version__

gv = git_version_info()
if gv:
return f"{__version__}: {gv}"

return __version__
def version():
return VERSION.version