cli: pretty++
This commit is contained in:
		@@ -15,13 +15,25 @@ def list_(ctx):
 | 
			
		||||
    for repo in ctx.obj['config'].repositories():
 | 
			
		||||
        click.echo("{} ({})".format(click.style(repo.name,bold=True), repo.path))
 | 
			
		||||
        rows = []
 | 
			
		||||
        currentPlugin = None
 | 
			
		||||
        pluginVersions = []
 | 
			
		||||
        for plugin in sorted(repo.plugins()):
 | 
			
		||||
            if currentPlugin != plugin.name:
 | 
			
		||||
                if currentPlugin is not None:
 | 
			
		||||
                    rows.append([
 | 
			
		||||
                        click.style(currentPlugin, fg='green'),
 | 
			
		||||
                        click.style(', '.join(pluginVersions), fg='yellow')
 | 
			
		||||
                    ])
 | 
			
		||||
                currentPlugin = plugin.name
 | 
			
		||||
                pluginVersions = []
 | 
			
		||||
            pluginVersions.append(str(plugin.version))
 | 
			
		||||
        if currentPlugin is not None:
 | 
			
		||||
            rows.append([
 | 
			
		||||
                click.style(plugin.name, fg='green'),
 | 
			
		||||
                click.style(str(plugin.version), fg='yellow')
 | 
			
		||||
                click.style(currentPlugin, fg='green'),
 | 
			
		||||
                click.style(', '.join(pluginVersions), fg='yellow')
 | 
			
		||||
            ])
 | 
			
		||||
        if len(rows) > 0:
 | 
			
		||||
            click.echo(columnar(rows, ['Plugin', 'Version'], no_borders=True))
 | 
			
		||||
            click.echo(columnar(rows, ['Plugin', 'Versions'], no_borders=True))
 | 
			
		||||
        else:
 | 
			
		||||
            click.echo("No plugins found.")
 | 
			
		||||
        for badFile in sorted(repo.badFiles()):
 | 
			
		||||
 
 | 
			
		||||
@@ -2,6 +2,7 @@ import click
 | 
			
		||||
from mpm.model import *
 | 
			
		||||
import pathlib
 | 
			
		||||
from mpm.config import ServerParamType
 | 
			
		||||
from columnar import columnar
 | 
			
		||||
 | 
			
		||||
@click.group(help='Add, remove, and synchronize Servers')
 | 
			
		||||
def server():
 | 
			
		||||
@@ -18,8 +19,11 @@ def add(ctx, name, path):
 | 
			
		||||
 | 
			
		||||
@server.command('list', help='List configured servers')
 | 
			
		||||
@click.pass_context
 | 
			
		||||
def list_(ctx):
 | 
			
		||||
    for server in ctx.obj['config'].servers():
 | 
			
		||||
@click.argument('servers', type=ServerParamType(), nargs=-1)
 | 
			
		||||
def list_(ctx, servers):
 | 
			
		||||
    if len(servers) == 0:
 | 
			
		||||
        servers = ctx.obj['config'].servers()
 | 
			
		||||
    for server in servers:
 | 
			
		||||
        click.echo('{} ({}):'.format(server.name, server.path))
 | 
			
		||||
        serverPath = pathlib.Path(server.path)
 | 
			
		||||
        if not serverPath.exists():
 | 
			
		||||
@@ -46,22 +50,50 @@ def list_(ctx):
 | 
			
		||||
            elif isinstance(state, SymlinkConflict):
 | 
			
		||||
                conflicts.append(state)
 | 
			
		||||
 | 
			
		||||
        click.echo("Installed plugins:")
 | 
			
		||||
        rows = []
 | 
			
		||||
        for state in sorted(installed):
 | 
			
		||||
            click.echo("\t{} {}: {}".format(state.plugin.name, state.plugin.versionSpec, state.currentVersion))
 | 
			
		||||
        click.echo("Oudated symlinks:")
 | 
			
		||||
            rows.append([
 | 
			
		||||
                state.plugin.name,
 | 
			
		||||
                str(state.plugin.versionSpec),
 | 
			
		||||
                str(state.currentVersion),
 | 
			
		||||
                str(state.currentVersion),
 | 
			
		||||
            ])
 | 
			
		||||
        for state in sorted(outdatedLinks):
 | 
			
		||||
            click.echo("\t{} {}: Current: {} Wanted: {}".format(state.plugin.name, state.plugin.versionSpec, state.currentVersion, state.wantedVersion))
 | 
			
		||||
        click.echo("Missing plugins:")
 | 
			
		||||
            rows.append([
 | 
			
		||||
                state.plugin.name,
 | 
			
		||||
                click.style(str(state.wantedVersion), fg='green'),
 | 
			
		||||
                click.style(str(state.currentVersion), fg='yellow'),
 | 
			
		||||
                click.style(str(state.plugin.versionSpec), fg='green')
 | 
			
		||||
            ])
 | 
			
		||||
        for state in sorted(missing):
 | 
			
		||||
            click.echo("\t{}: {}".format(state.plugin.name, state.plugin.versionSpec))
 | 
			
		||||
        click.echo("Unmanaged files:")
 | 
			
		||||
            rows.append([
 | 
			
		||||
                click.style(state.plugin.name, fg='red'),
 | 
			
		||||
                click.style(str(state.plugin.versionSpec), fg='yellow'),
 | 
			
		||||
                click.style('Missing', fg='red'),
 | 
			
		||||
                click.style('Missing', fg='red')
 | 
			
		||||
            ])
 | 
			
		||||
        for state in sorted(unmanaged):
 | 
			
		||||
            click.echo("\t{}".format(state.filename))
 | 
			
		||||
        click.echo("Symlink Conflicts:")
 | 
			
		||||
            rows.append([
 | 
			
		||||
                click.style(state.filename, fg='yellow'),
 | 
			
		||||
                '?',
 | 
			
		||||
                click.style('Unmanaged', fg='yellow', bold=True),
 | 
			
		||||
                ''
 | 
			
		||||
            ])
 | 
			
		||||
        for state in sorted(conflicts):
 | 
			
		||||
            rows.append([
 | 
			
		||||
                state.plugin.name,
 | 
			
		||||
                click.style(str(state.plugin.versionSpec), fg='yellow'),
 | 
			
		||||
                click.style('Symlink Conflict', fg='red', bold=True),
 | 
			
		||||
                click.style(str(state.plugin.versionSpec), fg='yellow'),
 | 
			
		||||
            ])
 | 
			
		||||
            click.echo("\t{}.jar".format(state.plugin.name))
 | 
			
		||||
 | 
			
		||||
        if len(rows) > 0:
 | 
			
		||||
            click.echo(columnar(rows, ['Plugin', 'Wanted', 'Installed',
 | 
			
		||||
                                       'Available'], no_borders=True))
 | 
			
		||||
        else:
 | 
			
		||||
            click.echo(click.style('No plugins configured!', fg='yellow'))
 | 
			
		||||
 | 
			
		||||
@server.command(help='Add a plugin to a server')
 | 
			
		||||
@click.pass_context
 | 
			
		||||
@click.argument('server', type=ServerParamType())
 | 
			
		||||
@@ -100,10 +132,9 @@ def add_plugin(ctx, server, plugins):
 | 
			
		||||
    else:
 | 
			
		||||
        click.echo("Cancelled.")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@server.command(help="Synchronize a server's plugins")
 | 
			
		||||
@click.pass_context
 | 
			
		||||
@click.argument('servers', type=ServerParamType, nargs=-1)
 | 
			
		||||
@click.argument('servers', type=ServerParamType(), nargs=-1)
 | 
			
		||||
def sync(ctx, servers):
 | 
			
		||||
    allServers = ctx.obj['config'].servers()
 | 
			
		||||
    if len(servers) > 0:
 | 
			
		||||
@@ -121,17 +152,37 @@ def sync(ctx, servers):
 | 
			
		||||
            elif isinstance(state, MissingVersions):
 | 
			
		||||
                missing.append(state)
 | 
			
		||||
 | 
			
		||||
        click.echo("Plugins to update:")
 | 
			
		||||
        rows = []
 | 
			
		||||
 | 
			
		||||
        for state in sorted(outdatedLinks):
 | 
			
		||||
            click.echo("\t{} {}: Current: {} Wanted: {}".format(state.plugin.name, state.plugin.versionSpec, state.currentVersion, state.wantedVersion))
 | 
			
		||||
        click.echo("New plugins to install:")
 | 
			
		||||
            rows.append([
 | 
			
		||||
                state.plugin.name,
 | 
			
		||||
                click.style(str(state.wantedVersion), fg='green'),
 | 
			
		||||
                click.style(str(state.currentVersion), fg='yellow'),
 | 
			
		||||
                click.style(str(state.plugin.versionSpec), fg='green')
 | 
			
		||||
            ])
 | 
			
		||||
 | 
			
		||||
        for state in sorted(available):
 | 
			
		||||
            click.echo("\t{}: {}".format(state.plugin.name, state.plugin.version))
 | 
			
		||||
            rows.append([
 | 
			
		||||
                state.plugin.name,
 | 
			
		||||
                click.style(str(state.wantedVersion), fg='green'),
 | 
			
		||||
                click.style('Missing', fg='red'),
 | 
			
		||||
                click.style(str(state.plugin.version), fg='green')
 | 
			
		||||
            ])
 | 
			
		||||
 | 
			
		||||
        click.echo("Missing plugins:")
 | 
			
		||||
        for state in sorted(missing):
 | 
			
		||||
            click.echo("\t{} {}".format(click.style(state.plugin.name, fg='red'),
 | 
			
		||||
                                   click.style(str(state.plugin.versionSpec),
 | 
			
		||||
                                   fg='yellow')))
 | 
			
		||||
            rows.append([
 | 
			
		||||
                click.style(state.plugin.name, fg='red'),
 | 
			
		||||
                click.style(str(state.plugin.versionSpec), fg='yellow'),
 | 
			
		||||
                click.style('Missing', fg='red'),
 | 
			
		||||
                click.style('Missing', fg='red')
 | 
			
		||||
            ])
 | 
			
		||||
 | 
			
		||||
        if len(rows) > 0:
 | 
			
		||||
            click.echo(columnar(rows, ['Plugin', 'Wanted', 'Installed',
 | 
			
		||||
                                       'Available'], no_borders=True))
 | 
			
		||||
 | 
			
		||||
        if len(outdatedLinks) > 0 or len(available) > 0:
 | 
			
		||||
            click.echo("Apply changes? [y/N]", nl=False)
 | 
			
		||||
            answer = click.getchar().lower()
 | 
			
		||||
 
 | 
			
		||||
@@ -83,6 +83,9 @@ class OutdatedSymlink(PluginState):
 | 
			
		||||
        self.currentVersion = currentVersion
 | 
			
		||||
        self.wantedVersion = wantedVersion
 | 
			
		||||
 | 
			
		||||
    def __str__(self):
 | 
			
		||||
        return 'OutdatedSymlink({})'.format(self.plugin)
 | 
			
		||||
 | 
			
		||||
class SymlinkConflict(PluginState):
 | 
			
		||||
    pass
 | 
			
		||||
 | 
			
		||||
@@ -90,10 +93,17 @@ class MissingVersions(PluginState):
 | 
			
		||||
    pass
 | 
			
		||||
 | 
			
		||||
class Available(PluginState):
 | 
			
		||||
    def __init__(self, repoPlugin):
 | 
			
		||||
    def __init__(self, repoPlugin, wantedVersion):
 | 
			
		||||
        super().__init__(repoPlugin)
 | 
			
		||||
        self.wantedVersion = wantedVersion
 | 
			
		||||
 | 
			
		||||
    def __str__(self):
 | 
			
		||||
        return 'Available({})'.format(self.plugin)
 | 
			
		||||
 | 
			
		||||
class Installed(PluginState):
 | 
			
		||||
    def __init__(self, plugin, currentVersion):
 | 
			
		||||
        super().__init__(plugin)
 | 
			
		||||
        self.currentVersion = currentVersion
 | 
			
		||||
 | 
			
		||||
    def __str__(self):
 | 
			
		||||
        return 'Installed({} @ )'.format(self.plugin, self.currentVersion)
 | 
			
		||||
 
 | 
			
		||||
@@ -42,7 +42,7 @@ class Server:
 | 
			
		||||
                    yield MissingVersions(plugin)
 | 
			
		||||
                else:
 | 
			
		||||
                    preferredVersion = list(reversed(sorted(compatibleVersions)))[0]
 | 
			
		||||
                    yield Available(preferredVersion)
 | 
			
		||||
                    yield Available(preferredVersion, plugin.versionSpec)
 | 
			
		||||
            else:
 | 
			
		||||
                preferredVersion = list(reversed(sorted(compatibleVersions)))[0]
 | 
			
		||||
                currentVersion = self.currentVersionForPlugin(plugin.name)
 | 
			
		||||
@@ -97,4 +97,7 @@ class Server:
 | 
			
		||||
        if not os.path.exists(os.path.join(self.pluginPath, 'versions')):
 | 
			
		||||
            os.path.mkdir(os.path.join(self.pluginPath, 'versions'))
 | 
			
		||||
        dest = os.path.join(self.pluginPath, 'versions/{}-{}.jar'.format(plugin.name, plugin.version))
 | 
			
		||||
        shutil.copyfile(plugin.path, dest)
 | 
			
		||||
        try:
 | 
			
		||||
            os.link(plugin.path, dest)
 | 
			
		||||
        except Exception:
 | 
			
		||||
            shutil.copyfile(plugin.path, dest)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user