2024-03-05 22:58:01 -06:00

103 lines
2.9 KiB
Python
Executable File

#!/usr/bin/python
"""
Packs/Unpacks `All-in-One WP Migration` packages. For more information:
https://wordpress.org/plugins/all-in-one-wp-migration/
"""
import json
import os
from .exception import Ai1wmError
from .packer import Ai1wmPacker
from .unpacker import Ai1wmUnpacker
class Ai1wmPackage(object):
""" An unpacked All-in-One WP Migration package. """
DATABASE_FILE = 'database.sql'
INFO_FILE = 'package.json'
LOG_FILE = 'migration.log'
def __init__(self, base_dir):
""" Constructor. """
self.base_dir = base_dir
self._details = None
self._plugins = None
@property
def info_file(self):
""" Path to the migration information file. """
return os.path.join(self.base_dir, self.INFO_FILE)
@property
def database_file(self):
""" Path to the database dump file. """
return os.path.join(self.base_dir, self.DATABASE_FILE)
@property
def log_file(self):
""" Path to the migration log file. """
return os.path.join(self.base_dir, self.LOG_FILE)
@property
def details(self):
""" Details of the package. """
if self._details is None:
try:
with open(self.info_file, 'r') as fp:
self._details = json.load(fp)
except IOError:
raise Ai1wmError('error reading package information file: {}'.format(self.info_file))
return self._details
@property
def plugins(self):
""" A list of active plugins. """
if self._plugins is None:
try:
self._plugins = [i.split('/', 1)[0] for i in self.details['Plugins']]
except (KeyError, TypeError, ValueError):
raise Ai1wmError('error retrieving plugin list from package information: {}'.format(self.details))
return self._plugins
@property
def stylesheet(self):
""" The active style sheet. """
return self.details.get('Stylesheet', None)
@property
def template(self):
""" The active template. """
return self.details.get('Template', None)
def validate(self):
""" Validates the package. """
if not os.path.isfile(self.info_file):
raise Ai1wmError('package information file is missing: {}'.format(self.info_file))
if not os.path.isfile(self.database_file):
raise Ai1wmError('database dump file is missing: {}'.format(self.database_file))
return self
def unpack_from(self, source_file):
""" Unpacks a package. """
if not os.path.isfile(source_file):
raise Ai1wmError('not a file: {}'.format(source_file))
Ai1wmUnpacker.unpack(source_file, self.base_dir)
return self.validate()
def pack_to(self, target_file):
""" Packs a package. """
return Ai1wmPacker.pack(self.validate().base_dir, target_file)