Krita Source Code Documentation
Loading...
Searching...
No Matches
plugin_importer.plugin_importer.PluginImporter Class Reference

Public Member Functions

 __init__ (self, zip_filename, resources_dir, confirm_overwrite_callback)
 
 destination_actions (self)
 
 destination_pykrita (self)
 
 extract_actionfile (self, plugin)
 
 extract_desktop (self, plugin)
 
 extract_module (self, plugin)
 
 extract_plugin (self, plugin)
 
 get_destination_actionfile (self, plugin)
 
 get_destination_desktop (self, plugin)
 
 get_destination_module (self, plugin)
 
 get_plugin_info (self)
 
 get_source_actionfile (self, name)
 
 get_source_module (self, name)
 
 import_all (self)
 
 read_desktop_config (self, desktop_filename)
 

Public Attributes

 action_filenames
 
 archive
 
 confirm_overwrite_callback
 
 desktop_filenames
 
 destination_actions
 
 destination_pykrita
 
 resources_dir
 

Detailed Description

Import a Krita Python Plugin from a zip file into the given
directory.

The Importer makes barely any assumptions about the file structure
in the zip file. It will find one or more plugins with the
following strategy:

1. Find files with the ending `.desktop` and read the Python
   module name from them
2. Find directories that correspond to the Python module names
   and that contain an `__init__.py` file
3. Find files with ending `.action` that have matching
   `<Action name=...>` tags (these files are optional)
4. Extract the desktop- and action-files and the Python module
   directories into the corresponding pykrita and actions folders

Usage:

>>> importer = PluginImporter(
        '/path/to/plugin.zip',
        '/path/to/krita/resources/',
        confirm_overwrite_callback)
>>> imported = importer.import_all()

Definition at line 38 of file plugin_importer.py.

Constructor & Destructor Documentation

◆ __init__()

plugin_importer.plugin_importer.PluginImporter.__init__ ( self,
zip_filename,
resources_dir,
confirm_overwrite_callback )
Initialise the importer.

:param zip_filename: Filename of the zip archive containing the
  plugin(s)
:param resources_dir: The Krita resources directory into which
  to extract the plugin(s)
:param confirm_overwrite_callback: A function that gets called
  if a plugin already exists in the resources directory. It gets
  called with a dictionary of information about the plugin and
  should return whether the user wants to overwrite the plugin
  (True) or not (False).

Definition at line 65 of file plugin_importer.py.

66 confirm_overwrite_callback):
67
68 """Initialise the importer.
69
70 :param zip_filename: Filename of the zip archive containing the
71 plugin(s)
72 :param resources_dir: The Krita resources directory into which
73 to extract the plugin(s)
74 :param confirm_overwrite_callback: A function that gets called
75 if a plugin already exists in the resources directory. It gets
76 called with a dictionary of information about the plugin and
77 should return whether the user wants to overwrite the plugin
78 (True) or not (False).
79 """
80
81 self.resources_dir = resources_dir
82 self.confirm_overwrite_callback = confirm_overwrite_callback
83 try:
84 self.archive = zipfile.ZipFile(zip_filename)
85 except(zipfile.BadZipFile, zipfile.LargeZipFile, OSError) as e:
86 raise PluginReadError(str(e))
87
88 self.desktop_filenames = []
89 self.action_filenames = []
90 for filename in self.archive.namelist():
91 if filename.endswith('.desktop'):
92 self.desktop_filenames.append(filename)
93 if filename.endswith('.action'):
94 self.action_filenames.append(filename)
95

Member Function Documentation

◆ destination_actions()

plugin_importer.plugin_importer.PluginImporter.destination_actions ( self)

Definition at line 104 of file plugin_importer.py.

104 def destination_actions(self):
105 dest = os.path.join(self.resources_dir, 'actions')
106 if not os.path.exists(dest):
107 os.mkdir(dest)
108 return dest
109

References plugin_importer.plugin_importer.PluginImporter.resources_dir.

◆ destination_pykrita()

plugin_importer.plugin_importer.PluginImporter.destination_pykrita ( self)

Definition at line 97 of file plugin_importer.py.

97 def destination_pykrita(self):
98 dest = os.path.join(self.resources_dir, 'pykrita')
99 if not os.path.exists(dest):
100 os.mkdir(dest)
101 return dest
102

References plugin_importer.plugin_importer.PluginImporter.resources_dir.

◆ extract_actionfile()

plugin_importer.plugin_importer.PluginImporter.extract_actionfile ( self,
plugin )

Definition at line 185 of file plugin_importer.py.

185 def extract_actionfile(self, plugin):
186 with open(self.get_destination_actionfile(plugin), 'wb') as f:
187 f.write(self.archive.read(plugin['action']))
188

References KoQuaZipStore::Private.archive, plugin_importer.plugin_importer.PluginImporter.archive, and plugin_importer.plugin_importer.PluginImporter.get_destination_actionfile().

◆ extract_desktop()

plugin_importer.plugin_importer.PluginImporter.extract_desktop ( self,
plugin )

Definition at line 167 of file plugin_importer.py.

167 def extract_desktop(self, plugin):
168 with open(self.get_destination_desktop(plugin), 'wb') as f:
169 f.write(self.archive.read(plugin['desktop']))
170

References KoQuaZipStore::Private.archive, plugin_importer.plugin_importer.PluginImporter.archive, and plugin_importer.plugin_importer.PluginImporter.get_destination_desktop().

◆ extract_module()

plugin_importer.plugin_importer.PluginImporter.extract_module ( self,
plugin )

Definition at line 171 of file plugin_importer.py.

171 def extract_module(self, plugin):
172 with TemporaryDirectory() as tmp_dir:
173 for name in self.archive.namelist():
174 if name.startswith(plugin['module']):
175 self.archive.extract(name, tmp_dir)
176 module_dirname = os.path.join(
177 tmp_dir, *plugin['module'].split('/'))
178 try:
179 shutil.rmtree(self.get_destination_module(plugin))
180 except FileNotFoundError:
181 pass
182 shutil.copytree(module_dirname,
183 self.get_destination_module(plugin))
184

References KoQuaZipStore::Private.archive, plugin_importer.plugin_importer.PluginImporter.archive, and plugin_importer.plugin_importer.PluginImporter.get_destination_module().

◆ extract_plugin()

plugin_importer.plugin_importer.PluginImporter.extract_plugin ( self,
plugin )

Definition at line 189 of file plugin_importer.py.

189 def extract_plugin(self, plugin):
190 # Check if the plugin already exists in the source directory:
191 if (os.path.exists(self.get_destination_desktop(plugin))
192 or os.path.exists(self.get_destination_module(plugin))):
193 confirmed = self.confirm_overwrite_callback(plugin)
194 if not confirmed:
195 return False
196
197 self.extract_desktop(plugin)
198 self.extract_module(plugin)
199 if plugin['action']:
200 self.extract_actionfile(plugin)
201 return True
202

References plugin_importer.plugin_importer.PluginImporter.confirm_overwrite_callback, plugin_importer.plugin_importer.PluginImporter.extract_actionfile(), plugin_importer.plugin_importer.PluginImporter.extract_desktop(), plugin_importer.plugin_importer.PluginImporter.extract_module(), plugin_importer.plugin_importer.PluginImporter.get_destination_desktop(), and plugin_importer.plugin_importer.PluginImporter.get_destination_module().

◆ get_destination_actionfile()

plugin_importer.plugin_importer.PluginImporter.get_destination_actionfile ( self,
plugin )

Definition at line 117 of file plugin_importer.py.

117 def get_destination_actionfile(self, plugin):
118 return os.path.join(
119 self.destination_actions, '%s.action' % plugin['name'])
120

◆ get_destination_desktop()

plugin_importer.plugin_importer.PluginImporter.get_destination_desktop ( self,
plugin )

Definition at line 113 of file plugin_importer.py.

113 def get_destination_desktop(self, plugin):
114 return os.path.join(
115 self.destination_pykrita, '%s.desktop' % plugin['name'])
116

References plugin_importer.plugin_importer.PluginImporter.destination_pykrita(), and plugin_importer.plugin_importer.PluginImporter.destination_pykrita.

◆ get_destination_module()

plugin_importer.plugin_importer.PluginImporter.get_destination_module ( self,
plugin )

Definition at line 110 of file plugin_importer.py.

110 def get_destination_module(self, plugin):
111 return os.path.join(self.destination_pykrita, plugin['name'])
112

◆ get_plugin_info()

plugin_importer.plugin_importer.PluginImporter.get_plugin_info ( self)

Definition at line 146 of file plugin_importer.py.

146 def get_plugin_info(self):
147 names = []
148 for filename in self.desktop_filenames:
149 config = self.read_desktop_config(filename)
150 try:
151 name = config['Desktop Entry']['X-KDE-Library']
152 ui_name = config['Desktop Entry']['Name']
153 except KeyError as e:
154 raise PluginReadError(
155 'Desktop file: Key %s not found' % str(e))
156 module = self.get_source_module(name)
157 if module:
158 names.append({
159 'name': name,
160 'ui_name': ui_name,
161 'desktop': filename,
162 'module': module,
163 'action': self.get_source_actionfile(name)
164 })
165 return names
166

References plugin_importer.plugin_importer.PluginImporter.desktop_filenames, plugin_importer.plugin_importer.PluginImporter.get_source_actionfile(), plugin_importer.plugin_importer.PluginImporter.get_source_module(), and plugin_importer.plugin_importer.PluginImporter.read_desktop_config().

◆ get_source_actionfile()

plugin_importer.plugin_importer.PluginImporter.get_source_actionfile ( self,
name )

Definition at line 130 of file plugin_importer.py.

130 def get_source_actionfile(self, name):
131 for filename in self.action_filenames:
132 _, actionfilename = os.path.split(filename)
133 if actionfilename == '%s.action' % name:
134 return filename
135

References plugin_importer.plugin_importer.PluginImporter.action_filenames.

◆ get_source_module()

plugin_importer.plugin_importer.PluginImporter.get_source_module ( self,
name )

Definition at line 121 of file plugin_importer.py.

121 def get_source_module(self, name):
122 namelist = self.archive.namelist()
123 for filename in namelist:
124 if (filename.endswith('/%s/' % name)
125 or filename == '%s/' % name):
126 # Sanity check: There should be an __init__.py inside
127 if ('%s__init__.py' % filename) in namelist:
128 return filename
129

References KoQuaZipStore::Private.archive, and plugin_importer.plugin_importer.PluginImporter.archive.

◆ import_all()

plugin_importer.plugin_importer.PluginImporter.import_all ( self)
Imports all plugins from the zip archive.

Returns a list of imported plugins.

Definition at line 203 of file plugin_importer.py.

203 def import_all(self):
204 """Imports all plugins from the zip archive.
205
206 Returns a list of imported plugins.
207 """
208
209 plugins = self.get_plugin_info()
210 if not plugins:
211 raise NoPluginsFoundException(i18n('No plugins found in archive'))
212
213 imported = []
214 for plugin in plugins:
215 success = self.extract_plugin(plugin)
216 if success:
217 imported.append(plugin)
218
219 return imported
220
221

References plugin_importer.plugin_importer.PluginImporter.extract_plugin(), and plugin_importer.plugin_importer.PluginImporter.get_plugin_info().

◆ read_desktop_config()

plugin_importer.plugin_importer.PluginImporter.read_desktop_config ( self,
desktop_filename )

Definition at line 136 of file plugin_importer.py.

136 def read_desktop_config(self, desktop_filename):
137 config = ConfigParser()
138 try:
139 config.read_string(
140 self.archive.read(desktop_filename).decode('utf-8'))
141 except ConfigParserError as e:
142 raise PluginReadError(
143 '%s: %s' % (i18n('Desktop file'), str(e)))
144 return config
145

References KoQuaZipStore::Private.archive, and plugin_importer.plugin_importer.PluginImporter.archive.

Member Data Documentation

◆ action_filenames

plugin_importer.plugin_importer.PluginImporter.action_filenames

Definition at line 89 of file plugin_importer.py.

◆ archive

plugin_importer.plugin_importer.PluginImporter.archive

Definition at line 84 of file plugin_importer.py.

◆ confirm_overwrite_callback

plugin_importer.plugin_importer.PluginImporter.confirm_overwrite_callback

Definition at line 82 of file plugin_importer.py.

◆ desktop_filenames

plugin_importer.plugin_importer.PluginImporter.desktop_filenames

Definition at line 88 of file plugin_importer.py.

◆ destination_actions

plugin_importer.plugin_importer.PluginImporter.destination_actions

Definition at line 119 of file plugin_importer.py.

◆ destination_pykrita

plugin_importer.plugin_importer.PluginImporter.destination_pykrita

Definition at line 111 of file plugin_importer.py.

◆ resources_dir

plugin_importer.plugin_importer.PluginImporter.resources_dir

Definition at line 81 of file plugin_importer.py.


The documentation for this class was generated from the following file: