Skip to content

interfaces

ILoadHost

Implementation requirements to be able use reference of representations.

The load plugins can do referencing even without implementation of methods here, but switch and removement of containers would not be possible.

Questions
  • Is list container dependency of host or load plugins?
  • Should this be directly in HostBase?
    • how to find out if referencing is available?
    • do we need to know that?
Source code in client/ayon_core/host/interfaces.py
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
class ILoadHost:
    """Implementation requirements to be able use reference of representations.

    The load plugins can do referencing even without implementation of methods
    here, but switch and removement of containers would not be possible.

    Questions:
        - Is list container dependency of host or load plugins?
        - Should this be directly in HostBase?
            - how to find out if referencing is available?
            - do we need to know that?
    """

    @staticmethod
    def get_missing_load_methods(host):
        """Look for missing methods on "old type" host implementation.

        Method is used for validation of implemented functions related to
        loading. Checks only existence of methods.

        Args:
            Union[ModuleType, HostBase]: Object of host where to look for
                required methods.

        Returns:
            list[str]: Missing method implementations for loading workflow.
        """

        if isinstance(host, ILoadHost):
            return []

        required = ["ls"]
        missing = []
        for name in required:
            if not hasattr(host, name):
                missing.append(name)
        return missing

    @staticmethod
    def validate_load_methods(host):
        """Validate implemented methods of "old type" host for load workflow.

        Args:
            Union[ModuleType, HostBase]: Object of host to validate.

        Raises:
            MissingMethodsError: If there are missing methods on host
                implementation.
        """
        missing = ILoadHost.get_missing_load_methods(host)
        if missing:
            raise MissingMethodsError(host, missing)

    @abstractmethod
    def get_containers(self):
        """Retrieve referenced containers from scene.

        This can be implemented in hosts where referencing can be used.

        Todo:
            Rename function to something more self explanatory.
                Suggestion: 'get_containers'

        Returns:
            list[dict]: Information about loaded containers.
        """

        pass

    # --- Deprecated method names ---
    def ls(self):
        """Deprecated variant of 'get_containers'.

        Todo:
            Remove when all usages are replaced.
        """

        return self.get_containers()

get_containers() abstractmethod

Retrieve referenced containers from scene.

This can be implemented in hosts where referencing can be used.

Todo

Rename function to something more self explanatory. Suggestion: 'get_containers'

Returns:

Type Description

list[dict]: Information about loaded containers.

Source code in client/ayon_core/host/interfaces.py
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
@abstractmethod
def get_containers(self):
    """Retrieve referenced containers from scene.

    This can be implemented in hosts where referencing can be used.

    Todo:
        Rename function to something more self explanatory.
            Suggestion: 'get_containers'

    Returns:
        list[dict]: Information about loaded containers.
    """

    pass

get_missing_load_methods(host) staticmethod

Look for missing methods on "old type" host implementation.

Method is used for validation of implemented functions related to loading. Checks only existence of methods.

Parameters:

Name Type Description Default
Union[ModuleType, HostBase]

Object of host where to look for required methods.

required

Returns:

Type Description

list[str]: Missing method implementations for loading workflow.

Source code in client/ayon_core/host/interfaces.py
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
@staticmethod
def get_missing_load_methods(host):
    """Look for missing methods on "old type" host implementation.

    Method is used for validation of implemented functions related to
    loading. Checks only existence of methods.

    Args:
        Union[ModuleType, HostBase]: Object of host where to look for
            required methods.

    Returns:
        list[str]: Missing method implementations for loading workflow.
    """

    if isinstance(host, ILoadHost):
        return []

    required = ["ls"]
    missing = []
    for name in required:
        if not hasattr(host, name):
            missing.append(name)
    return missing

ls()

Deprecated variant of 'get_containers'.

Todo

Remove when all usages are replaced.

Source code in client/ayon_core/host/interfaces.py
 98
 99
100
101
102
103
104
105
def ls(self):
    """Deprecated variant of 'get_containers'.

    Todo:
        Remove when all usages are replaced.
    """

    return self.get_containers()

validate_load_methods(host) staticmethod

Validate implemented methods of "old type" host for load workflow.

Parameters:

Name Type Description Default
Union[ModuleType, HostBase]

Object of host to validate.

required

Raises:

Type Description
MissingMethodsError

If there are missing methods on host implementation.

Source code in client/ayon_core/host/interfaces.py
66
67
68
69
70
71
72
73
74
75
76
77
78
79
@staticmethod
def validate_load_methods(host):
    """Validate implemented methods of "old type" host for load workflow.

    Args:
        Union[ModuleType, HostBase]: Object of host to validate.

    Raises:
        MissingMethodsError: If there are missing methods on host
            implementation.
    """
    missing = ILoadHost.get_missing_load_methods(host)
    if missing:
        raise MissingMethodsError(host, missing)

INewPublisher

Bases: IPublishHost

Legacy interface replaced by 'IPublishHost'.

Deprecated

'INewPublisher' is replaced by 'IPublishHost' please change your imports. There is no "reasonable" way hot mark these classes as deprecated to show warning of wrong import. Deprecated since 3.14. will be removed in 3.15.

Source code in client/ayon_core/host/interfaces.py
373
374
375
376
377
378
379
380
381
382
383
384
class INewPublisher(IPublishHost):
    """Legacy interface replaced by 'IPublishHost'.

    Deprecated:
        'INewPublisher' is replaced by 'IPublishHost' please change your
        imports.
        There is no "reasonable" way hot mark these classes as deprecated
        to show warning of wrong import. Deprecated since 3.14.* will be
        removed in 3.15.*
    """

    pass

IPublishHost

Functions related to new creation system in new publisher.

New publisher is not storing information only about each created instance but also some global data. At this moment are data related only to context publish plugins but that can extend in future.

Source code in client/ayon_core/host/interfaces.py
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
class IPublishHost:
    """Functions related to new creation system in new publisher.

    New publisher is not storing information only about each created instance
    but also some global data. At this moment are data related only to context
    publish plugins but that can extend in future.
    """

    @staticmethod
    def get_missing_publish_methods(host):
        """Look for missing methods on "old type" host implementation.

        Method is used for validation of implemented functions related to
        new publish creation. Checks only existence of methods.

        Args:
            Union[ModuleType, HostBase]: Host module where to look for
                required methods.

        Returns:
            list[str]: Missing method implementations for new publisher
                workflow.
        """

        if isinstance(host, IPublishHost):
            return []

        required = [
            "get_context_data",
            "update_context_data",
            "get_context_title",
            "get_current_context",
        ]
        missing = []
        for name in required:
            if not hasattr(host, name):
                missing.append(name)
        return missing

    @staticmethod
    def validate_publish_methods(host):
        """Validate implemented methods of "old type" host.

        Args:
            Union[ModuleType, HostBase]: Host module to validate.

        Raises:
            MissingMethodsError: If there are missing methods on host
                implementation.
        """
        missing = IPublishHost.get_missing_publish_methods(host)
        if missing:
            raise MissingMethodsError(host, missing)

    @abstractmethod
    def get_context_data(self):
        """Get global data related to creation-publishing from workfile.

        These data are not related to any created instance but to whole
        publishing context. Not saving/returning them will cause that each
        reset of publishing resets all values to default ones.

        Context data can contain information about enabled/disabled publish
        plugins or other values that can be filled by artist.

        Returns:
            dict: Context data stored using 'update_context_data'.
        """

        pass

    @abstractmethod
    def update_context_data(self, data, changes):
        """Store global context data to workfile.

        Called when some values in context data has changed.

        Without storing the values in a way that 'get_context_data' would
        return them will each reset of publishing cause loose of filled values
        by artist. Best practice is to store values into workfile, if possible.

        Args:
            data (dict): New data as are.
            changes (dict): Only data that has been changed. Each value has
                tuple with '(<old>, <new>)' value.
        """

        pass

get_context_data() abstractmethod

Get global data related to creation-publishing from workfile.

These data are not related to any created instance but to whole publishing context. Not saving/returning them will cause that each reset of publishing resets all values to default ones.

Context data can contain information about enabled/disabled publish plugins or other values that can be filled by artist.

Returns:

Name Type Description
dict

Context data stored using 'update_context_data'.

Source code in client/ayon_core/host/interfaces.py
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
@abstractmethod
def get_context_data(self):
    """Get global data related to creation-publishing from workfile.

    These data are not related to any created instance but to whole
    publishing context. Not saving/returning them will cause that each
    reset of publishing resets all values to default ones.

    Context data can contain information about enabled/disabled publish
    plugins or other values that can be filled by artist.

    Returns:
        dict: Context data stored using 'update_context_data'.
    """

    pass

get_missing_publish_methods(host) staticmethod

Look for missing methods on "old type" host implementation.

Method is used for validation of implemented functions related to new publish creation. Checks only existence of methods.

Parameters:

Name Type Description Default
Union[ModuleType, HostBase]

Host module where to look for required methods.

required

Returns:

Type Description

list[str]: Missing method implementations for new publisher workflow.

Source code in client/ayon_core/host/interfaces.py
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
@staticmethod
def get_missing_publish_methods(host):
    """Look for missing methods on "old type" host implementation.

    Method is used for validation of implemented functions related to
    new publish creation. Checks only existence of methods.

    Args:
        Union[ModuleType, HostBase]: Host module where to look for
            required methods.

    Returns:
        list[str]: Missing method implementations for new publisher
            workflow.
    """

    if isinstance(host, IPublishHost):
        return []

    required = [
        "get_context_data",
        "update_context_data",
        "get_context_title",
        "get_current_context",
    ]
    missing = []
    for name in required:
        if not hasattr(host, name):
            missing.append(name)
    return missing

update_context_data(data, changes) abstractmethod

Store global context data to workfile.

Called when some values in context data has changed.

Without storing the values in a way that 'get_context_data' would return them will each reset of publishing cause loose of filled values by artist. Best practice is to store values into workfile, if possible.

Parameters:

Name Type Description Default
data dict

New data as are.

required
changes dict

Only data that has been changed. Each value has tuple with '(, )' value.

required
Source code in client/ayon_core/host/interfaces.py
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
@abstractmethod
def update_context_data(self, data, changes):
    """Store global context data to workfile.

    Called when some values in context data has changed.

    Without storing the values in a way that 'get_context_data' would
    return them will each reset of publishing cause loose of filled values
    by artist. Best practice is to store values into workfile, if possible.

    Args:
        data (dict): New data as are.
        changes (dict): Only data that has been changed. Each value has
            tuple with '(<old>, <new>)' value.
    """

    pass

validate_publish_methods(host) staticmethod

Validate implemented methods of "old type" host.

Parameters:

Name Type Description Default
Union[ModuleType, HostBase]

Host module to validate.

required

Raises:

Type Description
MissingMethodsError

If there are missing methods on host implementation.

Source code in client/ayon_core/host/interfaces.py
322
323
324
325
326
327
328
329
330
331
332
333
334
335
@staticmethod
def validate_publish_methods(host):
    """Validate implemented methods of "old type" host.

    Args:
        Union[ModuleType, HostBase]: Host module to validate.

    Raises:
        MissingMethodsError: If there are missing methods on host
            implementation.
    """
    missing = IPublishHost.get_missing_publish_methods(host)
    if missing:
        raise MissingMethodsError(host, missing)

IWorkfileHost

Bases: ABC

Implementation requirements to be able use workfile utils and tool.

Source code in client/ayon_core/host/interfaces.py
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
class IWorkfileHost(ABC):
    """Implementation requirements to be able use workfile utils and tool."""

    @staticmethod
    def get_missing_workfile_methods(host):
        """Look for missing methods on "old type" host implementation.

        Method is used for validation of implemented functions related to
        workfiles. Checks only existence of methods.

        Args:
            Union[ModuleType, HostBase]: Object of host where to look for
                required methods.

        Returns:
            list[str]: Missing method implementations for workfiles workflow.
        """

        if isinstance(host, IWorkfileHost):
            return []

        required = [
            "open_file",
            "save_file",
            "current_file",
            "has_unsaved_changes",
            "file_extensions",
            "work_root",
        ]
        missing = []
        for name in required:
            if not hasattr(host, name):
                missing.append(name)
        return missing

    @staticmethod
    def validate_workfile_methods(host):
        """Validate methods of "old type" host for workfiles workflow.

        Args:
            Union[ModuleType, HostBase]: Object of host to validate.

        Raises:
            MissingMethodsError: If there are missing methods on host
                implementation.
        """

        missing = IWorkfileHost.get_missing_workfile_methods(host)
        if missing:
            raise MissingMethodsError(host, missing)

    @abstractmethod
    def get_workfile_extensions(self):
        """Extensions that can be used as save.

        Questions:
            This could potentially use 'HostDefinition'.
        """

        return []

    @abstractmethod
    def save_workfile(self, dst_path=None):
        """Save currently opened scene.

        Args:
            dst_path (str): Where the current scene should be saved. Or use
                current path if 'None' is passed.
        """

        pass

    @abstractmethod
    def open_workfile(self, filepath):
        """Open passed filepath in the host.

        Args:
            filepath (str): Path to workfile.
        """

        pass

    @abstractmethod
    def get_current_workfile(self):
        """Retrieve path to current opened file.

        Returns:
            str: Path to file which is currently opened.
            None: If nothing is opened.
        """

        return None

    def workfile_has_unsaved_changes(self):
        """Currently opened scene is saved.

        Not all hosts can know if current scene is saved because the API of
        DCC does not support it.

        Returns:
            bool: True if scene is saved and False if has unsaved
                modifications.
            None: Can't tell if workfiles has modifications.
        """

        return None

    def work_root(self, session):
        """Modify workdir per host.

        Default implementation keeps workdir untouched.

        Warnings:
            We must handle this modification with more sophisticated way
            because this can't be called out of DCC so opening of last workfile
            (calculated before DCC is launched) is complicated. Also breaking
            defined work template is not a good idea.
            Only place where it's really used and can make sense is Maya. There
            workspace.mel can modify subfolders where to look for maya files.

        Args:
            session (dict): Session context data.

        Returns:
            str: Path to new workdir.
        """

        return session["AYON_WORKDIR"]

    # --- Deprecated method names ---
    def file_extensions(self):
        """Deprecated variant of 'get_workfile_extensions'.

        Todo:
            Remove when all usages are replaced.
        """
        return self.get_workfile_extensions()

    def save_file(self, dst_path=None):
        """Deprecated variant of 'save_workfile'.

        Todo:
            Remove when all usages are replaced.
        """

        self.save_workfile(dst_path)

    def open_file(self, filepath):
        """Deprecated variant of 'open_workfile'.

        Todo:
            Remove when all usages are replaced.
        """

        return self.open_workfile(filepath)

    def current_file(self):
        """Deprecated variant of 'get_current_workfile'.

        Todo:
            Remove when all usages are replaced.
        """

        return self.get_current_workfile()

    def has_unsaved_changes(self):
        """Deprecated variant of 'workfile_has_unsaved_changes'.

        Todo:
            Remove when all usages are replaced.
        """

        return self.workfile_has_unsaved_changes()

current_file()

Deprecated variant of 'get_current_workfile'.

Todo

Remove when all usages are replaced.

Source code in client/ayon_core/host/interfaces.py
264
265
266
267
268
269
270
271
def current_file(self):
    """Deprecated variant of 'get_current_workfile'.

    Todo:
        Remove when all usages are replaced.
    """

    return self.get_current_workfile()

file_extensions()

Deprecated variant of 'get_workfile_extensions'.

Todo

Remove when all usages are replaced.

Source code in client/ayon_core/host/interfaces.py
238
239
240
241
242
243
244
def file_extensions(self):
    """Deprecated variant of 'get_workfile_extensions'.

    Todo:
        Remove when all usages are replaced.
    """
    return self.get_workfile_extensions()

get_current_workfile() abstractmethod

Retrieve path to current opened file.

Returns:

Name Type Description
str

Path to file which is currently opened.

None

If nothing is opened.

Source code in client/ayon_core/host/interfaces.py
190
191
192
193
194
195
196
197
198
199
@abstractmethod
def get_current_workfile(self):
    """Retrieve path to current opened file.

    Returns:
        str: Path to file which is currently opened.
        None: If nothing is opened.
    """

    return None

get_missing_workfile_methods(host) staticmethod

Look for missing methods on "old type" host implementation.

Method is used for validation of implemented functions related to workfiles. Checks only existence of methods.

Parameters:

Name Type Description Default
Union[ModuleType, HostBase]

Object of host where to look for required methods.

required

Returns:

Type Description

list[str]: Missing method implementations for workfiles workflow.

Source code in client/ayon_core/host/interfaces.py
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
@staticmethod
def get_missing_workfile_methods(host):
    """Look for missing methods on "old type" host implementation.

    Method is used for validation of implemented functions related to
    workfiles. Checks only existence of methods.

    Args:
        Union[ModuleType, HostBase]: Object of host where to look for
            required methods.

    Returns:
        list[str]: Missing method implementations for workfiles workflow.
    """

    if isinstance(host, IWorkfileHost):
        return []

    required = [
        "open_file",
        "save_file",
        "current_file",
        "has_unsaved_changes",
        "file_extensions",
        "work_root",
    ]
    missing = []
    for name in required:
        if not hasattr(host, name):
            missing.append(name)
    return missing

get_workfile_extensions() abstractmethod

Extensions that can be used as save.

Questions

This could potentially use 'HostDefinition'.

Source code in client/ayon_core/host/interfaces.py
159
160
161
162
163
164
165
166
167
@abstractmethod
def get_workfile_extensions(self):
    """Extensions that can be used as save.

    Questions:
        This could potentially use 'HostDefinition'.
    """

    return []

has_unsaved_changes()

Deprecated variant of 'workfile_has_unsaved_changes'.

Todo

Remove when all usages are replaced.

Source code in client/ayon_core/host/interfaces.py
273
274
275
276
277
278
279
280
def has_unsaved_changes(self):
    """Deprecated variant of 'workfile_has_unsaved_changes'.

    Todo:
        Remove when all usages are replaced.
    """

    return self.workfile_has_unsaved_changes()

open_file(filepath)

Deprecated variant of 'open_workfile'.

Todo

Remove when all usages are replaced.

Source code in client/ayon_core/host/interfaces.py
255
256
257
258
259
260
261
262
def open_file(self, filepath):
    """Deprecated variant of 'open_workfile'.

    Todo:
        Remove when all usages are replaced.
    """

    return self.open_workfile(filepath)

open_workfile(filepath) abstractmethod

Open passed filepath in the host.

Parameters:

Name Type Description Default
filepath str

Path to workfile.

required
Source code in client/ayon_core/host/interfaces.py
180
181
182
183
184
185
186
187
188
@abstractmethod
def open_workfile(self, filepath):
    """Open passed filepath in the host.

    Args:
        filepath (str): Path to workfile.
    """

    pass

save_file(dst_path=None)

Deprecated variant of 'save_workfile'.

Todo

Remove when all usages are replaced.

Source code in client/ayon_core/host/interfaces.py
246
247
248
249
250
251
252
253
def save_file(self, dst_path=None):
    """Deprecated variant of 'save_workfile'.

    Todo:
        Remove when all usages are replaced.
    """

    self.save_workfile(dst_path)

save_workfile(dst_path=None) abstractmethod

Save currently opened scene.

Parameters:

Name Type Description Default
dst_path str

Where the current scene should be saved. Or use current path if 'None' is passed.

None
Source code in client/ayon_core/host/interfaces.py
169
170
171
172
173
174
175
176
177
178
@abstractmethod
def save_workfile(self, dst_path=None):
    """Save currently opened scene.

    Args:
        dst_path (str): Where the current scene should be saved. Or use
            current path if 'None' is passed.
    """

    pass

validate_workfile_methods(host) staticmethod

Validate methods of "old type" host for workfiles workflow.

Parameters:

Name Type Description Default
Union[ModuleType, HostBase]

Object of host to validate.

required

Raises:

Type Description
MissingMethodsError

If there are missing methods on host implementation.

Source code in client/ayon_core/host/interfaces.py
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
@staticmethod
def validate_workfile_methods(host):
    """Validate methods of "old type" host for workfiles workflow.

    Args:
        Union[ModuleType, HostBase]: Object of host to validate.

    Raises:
        MissingMethodsError: If there are missing methods on host
            implementation.
    """

    missing = IWorkfileHost.get_missing_workfile_methods(host)
    if missing:
        raise MissingMethodsError(host, missing)

work_root(session)

Modify workdir per host.

Default implementation keeps workdir untouched.

Parameters:

Name Type Description Default
session dict

Session context data.

required

Returns:

Name Type Description
str

Path to new workdir.

Source code in client/ayon_core/host/interfaces.py
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
def work_root(self, session):
    """Modify workdir per host.

    Default implementation keeps workdir untouched.

    Warnings:
        We must handle this modification with more sophisticated way
        because this can't be called out of DCC so opening of last workfile
        (calculated before DCC is launched) is complicated. Also breaking
        defined work template is not a good idea.
        Only place where it's really used and can make sense is Maya. There
        workspace.mel can modify subfolders where to look for maya files.

    Args:
        session (dict): Session context data.

    Returns:
        str: Path to new workdir.
    """

    return session["AYON_WORKDIR"]

workfile_has_unsaved_changes()

Currently opened scene is saved.

Not all hosts can know if current scene is saved because the API of DCC does not support it.

Returns:

Name Type Description
bool

True if scene is saved and False if has unsaved modifications.

None

Can't tell if workfiles has modifications.

Source code in client/ayon_core/host/interfaces.py
201
202
203
204
205
206
207
208
209
210
211
212
213
def workfile_has_unsaved_changes(self):
    """Currently opened scene is saved.

    Not all hosts can know if current scene is saved because the API of
    DCC does not support it.

    Returns:
        bool: True if scene is saved and False if has unsaved
            modifications.
        None: Can't tell if workfiles has modifications.
    """

    return None

MissingMethodsError

Bases: ValueError

Exception when host miss some required methods for specific workflow.

Parameters:

Name Type Description Default
host HostBase

Host implementation where are missing methods.

required
missing_methods list[str]

List of missing methods.

required
Source code in client/ayon_core/host/interfaces.py
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class MissingMethodsError(ValueError):
    """Exception when host miss some required methods for specific workflow.

    Args:
        host (HostBase): Host implementation where are missing methods.
        missing_methods (list[str]): List of missing methods.
    """

    def __init__(self, host, missing_methods):
        joined_missing = ", ".join(
            ['"{}"'.format(item) for item in missing_methods]
        )
        host_name = getattr(host, "name", None)
        if not host_name:
            try:
                host_name = host.__file__.replace("\\", "/").split("/")[-3]
            except Exception:
                host_name = str(host)
        message = (
            "Host \"{}\" miss methods {}".format(host_name, joined_missing)
        )
        super(MissingMethodsError, self).__init__(message)