aboutsummaryrefslogtreecommitdiffstats
path: root/nikola/plugins/command/install_theme.py
diff options
context:
space:
mode:
Diffstat (limited to 'nikola/plugins/command/install_theme.py')
-rw-r--r--nikola/plugins/command/install_theme.py76
1 files changed, 30 insertions, 46 deletions
diff --git a/nikola/plugins/command/install_theme.py b/nikola/plugins/command/install_theme.py
index 5397772..4937509 100644
--- a/nikola/plugins/command/install_theme.py
+++ b/nikola/plugins/command/install_theme.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
-# Copyright © 2012-2014 Roberto Alsina and others.
+# Copyright © 2012-2015 Roberto Alsina and others.
# Permission is hereby granted, free of charge, to any
# person obtaining a copy of this software and associated
@@ -28,42 +28,18 @@ from __future__ import print_function
import os
import io
import json
-import shutil
+import requests
import pygments
from pygments.lexers import PythonLexer
from pygments.formatters import TerminalFormatter
-try:
- import requests
-except ImportError:
- requests = None # NOQA
-
from nikola.plugin_categories import Command
from nikola import utils
LOGGER = utils.get_logger('install_theme', utils.STDERR_HANDLER)
-# Stolen from textwrap in Python 3.3.2.
-def indent(text, prefix, predicate=None): # NOQA
- """Adds 'prefix' to the beginning of selected lines in 'text'.
-
- If 'predicate' is provided, 'prefix' will only be added to the lines
- where 'predicate(line)' is True. If 'predicate' is not provided,
- it will default to adding 'prefix' to all non-empty lines that do not
- consist solely of whitespace characters.
- """
- if predicate is None:
- def predicate(line):
- return line.strip()
-
- def prefixed_lines():
- for line in text.splitlines(True):
- yield (prefix + line if predicate(line) else line)
- return ''.join(prefixed_lines())
-
-
class CommandInstallTheme(Command):
"""Install a theme."""
@@ -86,16 +62,21 @@ class CommandInstallTheme(Command):
'long': 'url',
'type': str,
'help': "URL for the theme repository (default: "
- "http://themes.getnikola.com/v7/themes.json)",
- 'default': 'http://themes.getnikola.com/v7/themes.json'
+ "https://themes.getnikola.com/v7/themes.json)",
+ 'default': 'https://themes.getnikola.com/v7/themes.json'
+ },
+ {
+ 'name': 'getpath',
+ 'short': 'g',
+ 'long': 'get-path',
+ 'type': bool,
+ 'default': False,
+ 'help': "Print the path for installed theme",
},
]
def _execute(self, options, args):
"""Install theme into current site."""
- if requests is None:
- utils.req_missing(['requests'], 'install themes')
-
listing = options['list']
url = options['url']
if args:
@@ -103,6 +84,14 @@ class CommandInstallTheme(Command):
else:
name = None
+ if options['getpath'] and name:
+ path = utils.get_theme_path(name)
+ if path:
+ print(path)
+ else:
+ print('not installed')
+ return 0
+
if name is None and not listing:
LOGGER.error("This command needs either a theme name or the -l option.")
return False
@@ -135,36 +124,31 @@ class CommandInstallTheme(Command):
def do_install(self, name, data):
if name in data:
utils.makedirs(self.output_dir)
- LOGGER.info('Downloading: ' + data[name])
+ LOGGER.info("Downloading '{0}'".format(data[name]))
zip_file = io.BytesIO()
zip_file.write(requests.get(data[name]).content)
- LOGGER.info('Extracting: {0} into themes'.format(name))
+ LOGGER.info("Extracting '{0}' into themes/".format(name))
utils.extract_all(zip_file)
- dest_path = os.path.join('themes', name)
+ dest_path = os.path.join(self.output_dir, name)
else:
+ dest_path = os.path.join(self.output_dir, name)
try:
theme_path = utils.get_theme_path(name)
- except:
- LOGGER.error("Can't find theme " + name)
- return False
+ LOGGER.error("Theme '{0}' is already installed in {1}".format(name, theme_path))
+ except Exception:
+ LOGGER.error("Can't find theme {0}".format(name))
- utils.makedirs(self.output_dir)
- dest_path = os.path.join(self.output_dir, name)
- if os.path.exists(dest_path):
- LOGGER.error("{0} is already installed".format(name))
- return False
+ return False
- LOGGER.info('Copying {0} into themes'.format(theme_path))
- shutil.copytree(theme_path, dest_path)
confpypath = os.path.join(dest_path, 'conf.py.sample')
if os.path.exists(confpypath):
LOGGER.notice('This theme has a sample config file. Integrate it with yours in order to make this theme work!')
print('Contents of the conf.py.sample file:\n')
with io.open(confpypath, 'r', encoding='utf-8') as fh:
if self.site.colorful:
- print(indent(pygments.highlight(
+ print(utils.indent(pygments.highlight(
fh.read(), PythonLexer(), TerminalFormatter()),
4 * ' '))
else:
- print(indent(fh.read(), 4 * ' '))
+ print(utils.indent(fh.read(), 4 * ' '))
return True