Source code for meta_package_manager.managers.apm

# -*- coding: utf-8 -*-
#
# Copyright (c) 2016-2017 Kevin Deldycke <kevin@deldycke.com>
#                         and contributors.
# All Rights Reserved.
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

from __future__ import (
    absolute_import,
    division,
    print_function,
    unicode_literals
)

import json

from boltons.cacheutils import cachedproperty

from ..base import PackageManager
from ..platform import MACOS


[docs]class APM(PackageManager): cli_path = '/usr/local/bin/apm' platforms = frozenset([MACOS])
[docs] def get_version(self): """ Fetch version from ``apm --version`` output.""" return self.run([self.cli_path, '--version']).split('\n')[0].split()[1]
name = "Atom's apm" @cachedproperty def installed(self): """ Fetch installed packages from ``apm list`` output. Raw CLI output sample: .. code-block:: shell-session $ apm list --json | jq { "core": [ { "_args": [ [ { "raw": "/private/var/folders/(...)/package.tgz", "scope": null, "escapedName": null, "name": null, "rawSpec": "/private/var/folders/(...)/package.tgz", "spec": "/private/var/folders/(...)/package.tgz", "type": "local" }, "/Users/distiller/atom" ] ], "_inCache": true, "_installable": true, "_location": "/background-tips", "_phantomChildren": {}, "_requested": { "raw": "/private/var/folders/(...)/package.tgz", "scope": null, "escapedName": null, "name": null, "rawSpec": "/private/var/folders/(...)/package.tgz", "spec": "/private/var/folders/(...)/package.tgz", "type": "local" }, "_requiredBy": [ "#USER" ], "_resolved": "file:../../../private/var/(...)/package.tgz", "_shasum": "7978e4fdab3b162d93622fc64d012df7a92aa569", "_shrinkwrap": null, "_spec": "/private/var/folders/(...)/package.tgz", "_where": "/Users/distiller/atom", "bugs": { "url": "https://github.com/atom/background-tips/issues" }, "dependencies": { "underscore-plus": "1.x" }, "description": "Displays tips about Atom in the background.", "devDependencies": { "coffeelint": "^1.9.7" }, "engines": { "atom": ">0.42.0" }, "homepage": "https://github.com/atom/background-tips#readme", "license": "MIT", "main": "./lib/background-tips", "name": "background-tips", "optionalDependencies": {}, "private": true, "repository": { "type": "git", "url": "https://github.com/atom/background-tips.git" }, "version": "0.26.1", "_atomModuleCache": { "version": 1, "dependencies": [], "extensions": { ".js": [ "lib/background-tips-view.js", "lib/background-tips.js", "lib/tips.js" ] }, "folders": [ { "paths": [ "lib", "" ], "dependencies": { "underscore-plus": "1.x" } } ] } }, (...) ] } """ installed = {} installed_cmd = [self.cli_path] + self.cli_args + ['list', '--json'] output = self.run(installed_cmd) if output: for package_list in json.loads(output).values(): for package in package_list: package_id = package['name'] installed[package_id] = { 'id': package_id, 'name': package_id, 'installed_version': package['version']} return installed @cachedproperty def outdated(self): """ Fetch outdated packages from ``apm outdated`` output. Raw CLI output sample: .. code-block:: shell-session $ apm outdated --compatible --json | jq [ { "_args": [ [ { "raw": "/private/var/folders/(...)/package.tgz", "scope": null, "escapedName": null, "name": null, "rawSpec": "/private/var/folders/(...)/package.tgz", "spec": "/private/var/folders/(...)/package.tgz", "type": "local" }, "/private/var/folders/(...)/apm-install-dir-117017" ] ], "_from": "../d-117017-63877-vcgh4t/package.tgz", "_id": "file-icons@2.0.9", "_inCache": true, "_installable": true, "_location": "/file-icons", "_phantomChildren": {}, "_requested": { "raw": "/private/var/folders/(...)/package.tgz", "scope": null, "escapedName": null, "name": null, "rawSpec": "/private/var/folders/(...)/package.tgz", "spec": "/private/var/folders/(...)/package.tgz", "type": "local" }, "_requiredBy": [ "#USER" ], "_resolved": "file:../d-117017-63877-vcgh4t/package.tgz", "_shasum": "8b2df93ad752af1676d91c12afa068f2000b864c", "_shrinkwrap": null, "_spec": "/private/var/folders/(...)/package.tgz", "_where": "/private/var/folders/(...)/apm-install-dir-117017", "atom-mocha": { "interactive": { "mocha": { "bail": true } } }, "atomTestRunner": "./node_modules/.bin/atom-mocha", "bugs": { "url": "https://github.com/file-icons/atom/issues" }, "configSchema": { "coloured": { "type": "boolean", "default": true, "description": "Untick this for colourless icons", "order": 1 }, "onChanges": { "type": "boolean", "default": false, "title": "Only colour when changed", "description": "Show different icon.", "order": 2 }, "tabPaneIcon": { "type": "boolean", "default": true, "title": "Show icons in file tabs", "order": 3 }, "defaultIconClass": { "type": "string", "default": "default-icon", "title": "Default icon class", "description": "CSS added to files that lack an icon.", "order": 4 }, "strategies": { "type": "object", "title": "Match strategies", "description": "Advanced settings for icon assignment.", "order": 5, "properties": { "grammar": { "type": "boolean", "default": true, "order": 1, "title": "Change on grammar override", "description": "Change a file's icon when setting." }, "hashbangs": { "type": "boolean", "default": true, "order": 2, "title": "Check hashbangs", "description": "Allow lines like `#!/usr/bin/perl`." } } } }, "dependencies": { "micromatch": "*" }, "description": "Assign file extension icons", "devDependencies": { "atom-mocha": "*", "coffee-script": "*", "get-options": "*", "rimraf": "*", "tmp": "*", "unzip": "*" }, "engines": { "atom": ">1.11.0" }, "homepage": "https://github.com/file-icons/atom", "license": "MIT", "main": "lib/main.js", "name": "file-icons", "optionalDependencies": {}, "private": true, "providedServices": { "file-icons.element-icons": { "versions": { "1.0.0": "provideService" } }, "atom.file-icons": { "versions": { "1.0.0": "suppressFOUC" } } }, "readme": "Blah blah", "readmeFilename": "README.md", "repository": { "type": "git", "url": "git+https://github.com/file-icons/atom.git" }, "version": "2.0.9", "latestVersion": "2.0.10" } ] """ outdated = {} outdated_cmd = [self.cli_path] + self.cli_args + [ 'outdated', '--compatible', '--json'] output = self.run(outdated_cmd) if output: for package in json.loads(output): package_id = package['name'] outdated[package_id] = { 'id': package_id, 'name': package_id, 'installed_version': package['version'], 'latest_version': package['latestVersion']} return outdated
[docs] def upgrade_cli(self, package_id=None): cmd = [self.cli_path] + self.cli_args + ['update', '--no-confirm'] if package_id: cmd.append(package_id) return cmd
[docs] def upgrade_all_cli(self): return self.upgrade_cli()