Skip to content

Commit

Permalink
Merge pull request #1104 from glensc/installed
Browse files Browse the repository at this point in the history
  • Loading branch information
glensc authored Oct 17, 2022
2 parents cb6a79b + edc560a commit 09bf3ad
Show file tree
Hide file tree
Showing 4 changed files with 132 additions and 44 deletions.
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

0 comments on commit 09bf3ad

Please sign in to comment.