File: C:/Users/fred/anaconda3/Lib/site-packages/spyder/plugins/completion/providers/snippets/provider.py
# -*- coding: utf-8 -*-
# Copyright © Spyder Project Contributors
# Licensed under the terms of the MIT License
# (see spyder/__init__.py for details)
"""Custom text snippets completion plugin."""
# Standard library imports
import os
import bisect
import logging
# Local imports
from spyder.api.config.decorators import on_conf_change
from spyder.config.base import _, running_under_pytest
from spyder.config.snippets import SNIPPETS
from spyder.plugins.completion.api import (SpyderCompletionProvider,
SUPPORTED_LANGUAGES)
from spyder.plugins.completion.providers.snippets.actor import SnippetsActor
from spyder.plugins.completion.providers.snippets.conftabs import (
SnippetsConfigTab
)
PYTHON_POS = bisect.bisect_left(SUPPORTED_LANGUAGES, 'Python')
SUPPORTED_LANGUAGES_PY = list(SUPPORTED_LANGUAGES)
SUPPORTED_LANGUAGES_PY.insert(PYTHON_POS, 'Python')
SUPPORTED_LANGUAGES_PY = {x.lower() for x in SUPPORTED_LANGUAGES_PY}
logger = logging.getLogger(__name__)
class SnippetsProvider(SpyderCompletionProvider):
COMPLETION_PROVIDER_NAME = 'snippets'
DEFAULT_ORDER = 3
CONF_DEFAULTS = [(lang, SNIPPETS[lang]) for lang in SNIPPETS]
CONF_VERSION = "0.1.0"
CONF_TABS = [SnippetsConfigTab]
def __init__(self, parent, config):
SpyderCompletionProvider.__init__(self, parent, config)
self.snippets_actor = SnippetsActor(self)
self.snippets_actor.sig_snippets_ready.connect(
self.signal_provider_ready)
self.snippets_actor.sig_snippets_response.connect(
lambda _id, resp: self.sig_response_ready.emit(
self.COMPLETION_PROVIDER_NAME, _id, resp))
self.started = False
self.requests = {}
self.config = config
def get_name(self):
return _('Text snippets')
def start_completion_services_for_language(self, language):
return self.started
def start(self):
if not self.started:
self.snippets_actor.start()
self.started = True
def signal_provider_ready(self):
self.update_snippets(self.config)
self.sig_provider_ready.emit(self.COMPLETION_PROVIDER_NAME)
def shutdown(self):
if self.started:
self.snippets_actor.stop()
self.started = False
def send_request(self, language, req_type, req, req_id=None):
request = {
'type': req_type,
'file': req['file'],
'id': req_id,
'msg': req
}
req['language'] = language
self.snippets_actor.sig_mailbox.emit(request)
@on_conf_change
def update_snippets(self, snippets):
if running_under_pytest():
if not os.environ.get('SPY_TEST_USE_INTROSPECTION'):
return
self.config = snippets
snippet_info = {}
for language in SUPPORTED_LANGUAGES_PY:
snippet_info[language] = snippets.get(language, {})
self.snippets_actor.sig_update_snippets.emit(snippet_info)