Open evandrocoan opened 6 years ago
@evandrocoan are you still seeing this issue?
Yes. But now it is so frequently that I just kill the language server process and do not start it anymore. I cannot have my work stopping randomly and frequently for such long periods.
In my opinion the worst part of this issue is the LSP plugin for Sublime Text completely freeze the Sublime Text Graphical User Interface (other times not the User Interface but all Sublime Text Async Tasks running in the background) until the language server respond.
i'm sorry to hear that! I think theres two problems to address here.
Blocking behaviour in pyls: We can solve this somewhat easily by augmenting the hover endpoint to support async callbacks and by changing https://github.com/palantir/python-language-server/blob/develop/pyls/plugins/hover.py#L9 to be an async handler
Blocking behaviour in Sublime: Need to get the client to support asynchronous, out of order delivery of responses. I don't know the solution to that. Honestly, this hinders any performance improvements you would see from async pyls and it might make it worse in some cases
What are your thoughts? Would you be interested in tackling either of those?
My first though would be to understand: why pyls would take so long to respond to a request?
I do not think it is a big problem taking long as 2 minutes to answer a request, as long as pyls
is performing useful work, instead of being locked in some kind of while True
performing nothing useful.
My first approach to solve this will be updating my fork of LSP to time out the requests after something like 0.1
seconds, perhaps 0.3
seconds. Just because it is unacceptable to block my work because something could go wrong or take a big time. If pyls
or any other language server do not respond after this timeout, consider the answer as not found or inexistente.
After solving this on the LSP plugin, I would dig in into what the pyls
is doing and taking so long.
Blocking behaviour in pyls: We can solve this somewhat easily by augmenting the hover endpoint to support async callbacks and by changing https://github.com/palantir/python-language-server/blob/develop/pyls/plugins/hover.py#L9 to be an async handler
I am not sure about what are the implications of an async hover call backs. How would they respond accordingly to the time out I am implementing on the LSP plugin? If I understand correctly, currently pyls
will not accept any other hover
calls until the first one have been answered. This have some fallbacks on the LSP timeout because:
pyls
server respond, the answer will be invalid and rejected by LSP due the timeout.pyls
is accepting async hover calls, LSP can start doing several hover requests and:
i. If each one of these requests take 2 minutes long.
ii. Or if several of these requests are the same request and take 2 minutes long.
All requests are going to be invalid due the LSP timeout of 0.3
, and they will exhaust the server CPU by creating several different threads into doing the same thing. Or by just by doing discarded work by the LSP plugin timeout of 0.3
.However, it can be actually required by the pyls
server to take 2 minutes long to process the first hover request. Therefore, we cannot implement async hover request because this will only cause the LSP plugin into creating several hovers requests, which will take 2 minutes long, i.e., several thread eating my computer CPU doing the same thing.
This is very similar to this problem on the languagetool
server:
I would suggest to not implement async hover requests, before investigate what is causing or can cause to a request take so long to be finished. After learning this, we can correctly think about a implementation strategy to correctly create async hover requests, without:
0.3
seconds.0.3
seconds.Hence, if the server implements async hover requests:
0.3
seconds. Unless the server need to do some extra job before, like caching the hover results. Then, only then the server can continue working.Blocking behaviour in Sublime: Need to get the client to support asynchronous, out of order delivery of responses. I don't know the solution to that. Honestly, this hinders any performance improvements you would see from async pyls and it might make it worse in some cases
The solution to this, is to implement async requests on the LSP plugin. But first, fix it blocking the Sublime Text interface. Adding support to async requests is also on the way of fixing LSP. If the LSP plugin is doing and receiving async requests, it should be able to not block Sublime Text until some request being completed after they being created.
Even with an async LSP plugin, there will be still existing discarded requests after the time out. For example, the LSP plugin does the request A, and do not wait for its answer, it starts doing other stuff. Then when the requests A timeout comes, and the request A have not yet being fulfilled, then it considers it invalid or not found and display to the user this result.
Hey sorry for the slow response!
With regards to the LSP changes: As a quick fix to get things running it seems reasonable. But as a long term solution I don't think the approach is correct. Clients should not drop
requests. The approach I would recommend is to do something similar to what I did for pyls and make the message handling async. This would make the client robust to slow networks and misbehaving servers. I'm not familiar with the implementation of LSP, but in an async world you could enforce your timeout through the use of cancel messages,
pyls hover: Sure, perhaps making it async isn't a complete solution to your problem but I do think that it is the correct thing to do long term. Since a client can cancel a hover request we are basically using users patience as an upper bound on computation time. Furthermore, it adds overall responsiveness to the server. Also important to note, the async requests may operate on multiple threads
within the python interpreter but the entire language server will only execute on a single OS level thread.
@evandrocoan can you paste the output of pip list
? I've seen similar slow behaviour when using jedi-vim (not pyls) when importing large modules. Albeit never as long as 2 minutes.
I agree that async might not be the correct answer here, as we'll very quickly just end up starving the executor pool and blocking all requests! Let's try and find the root cause.
Would be happy to add some log lines into the hover provider to help with timings.
Albeit never as long as 2 minutes.
My computer is like 5 times slower than the usual, then we could recude these 2 minutes to 24 seconds on today's machines.
``` asn1crypto (0.22.0) astroid (1.6.1) beautifulsoup4 (4.6.0) bs4 (0.0.1) CacheControl (0.12.3) certifi (2017.7.27.1) cffi (1.10.0) chardet (3.0.4) click (6.7) colorama (0.3.9) concurrent-log-handler (0.9.7) conda (4.4.8) configparser (3.5.0) cryptography (2.0.3) debug-tools (3.0.0, f:\sublimetext\data\packages\debugtools\all) decorator (4.2.1) distlib (0.2.5) dnspython (1.15.0) ecdsa (0.13) electrum (3.0.1) future (0.16.0) html5lib (0.999999999) idna (2.6) isort (4.3.3) jedi (0.11.1) Jinja2 (2.10) json-rpc (1.10.8) jsonrpclib-pelix (0.3.1) keyboard (0.11.0) lazy-object-proxy (1.3.1) libnacl (1.6.1) livereload (2.5.1) lockfile (0.12.2) Markdown (2.6.11) MarkupSafe (1.0) mccabe (0.6.1) menuinst (1.4.10) mkdocs (0.17.2) msgpack-python (0.4.8) mutagen (1.39) mypy (0.560) numpy (1.13.3) packaging (16.8) parso (0.1.1) pbkdf2 (1.3) picard (2.0.0.dev2) pip (9.0.1) pluggy (0.6.0) portalocker (1.1.0) progress (1.3) protobuf (3.4.0) psutil (5.4.3) py (1.5.2) py2exe (0.9.2.2) pyaes (1.6.1) PyAudio (0.2.11) pycodestyle (2.3.1, d:\pycodestyle) pycosat (0.6.3) pycparser (2.18) pydoc-markdown (2.0.1) pydocstyle (2.1.1) pyflakes (1.6.0) pylint (1.8.2) pyOpenSSL (17.2.0) pyparsing (2.2.0) pypiwin32 (220) PyQt5 (5.9.2) PySocks (1.6.7) python-language-server (0.13.0+9.g7337e37, d:\python-language-server) pywin32 (222) PyYAML (3.12) qrcode (5.3) requests (2.18.4) rope (0.10.7, d:\python-rope) ruamel-yaml (0.11.14) Send2Trash (1.5.0) setuptools (36.5.0.post20170921) sip (4.19.8) six (1.11.0) snowballstemmer (1.2.1) tornado (4.5.3) tox (2.9.1) typed-ast (1.1.0) urllib3 (1.22) virtualenv (15.1.0) webencodings (0.5.1) wheel (0.29.0) win-inet-pton (1.0.1) wincertstore (0.2) wrapt (1.10.11) yapf (0.20.1) ```
``` reloading plugin Default.arithmetic reloading plugin Default.auto_indent_tag reloading plugin Default.block reloading plugin Default.colors reloading plugin Default.comment reloading plugin Default.convert_color_scheme reloading plugin Default.convert_syntax reloading plugin Default.copy_path reloading plugin Default.delete_word reloading plugin Default.detect_indentation reloading plugin Default.duplicate_line reloading plugin Default.echo reloading plugin Default.exec reloading plugin Default.fold reloading plugin Default.font reloading plugin Default.goto_line reloading plugin Default.history_list reloading plugin Default.indentation reloading plugin Default.install_package_control reloading plugin Default.kill_ring reloading plugin Default.mark reloading plugin Default.new_templates reloading plugin Default.open_context_url reloading plugin Default.open_in_browser reloading plugin Default.pane reloading plugin Default.paragraph reloading plugin Default.paste_from_history reloading plugin Default.profile reloading plugin Default.quick_panel reloading plugin Default.rename reloading plugin Default.run_syntax_tests reloading plugin Default.save_on_focus_lost reloading plugin Default.scroll reloading plugin Default.set_unsaved_view_name reloading plugin Default.settings reloading plugin Default.show_scope_name reloading plugin Default.side_bar reloading plugin Default.sort reloading plugin Default.swap_line reloading plugin Default.switch_file reloading plugin Default.symbol reloading plugin Default.transform reloading plugin Default.transpose reloading plugin Default.trim_trailing_white_space reloading plugin Default.ui reloading plugin CSS.css_completions reloading plugin Diff.diff reloading plugin HTML.encode_html_entities reloading plugin HTML.html_completions reloading plugin ShellScript.ShellScript reloading plugin 0_packages_manager_loader.00-package_control reloading plugin 0_packages_manager_loader.01-package_setting_context reloading plugin 0_packages_manager_loader.01-pygments reloading plugin 0_packages_manager_loader.08-PortalockerFiles reloading plugin 0_packages_manager_loader.09-ConcurrentLogHandler reloading plugin 0_packages_manager_loader.10-DebugTools reloading plugin 0_packages_manager_loader.15-coverage reloading plugin 0_packages_manager_loader.20-EstimatedTimeLeft reloading plugin 0_packages_manager_loader.30-ChannelManager reloading plugin 0_packages_manager_loader.50-backrefs reloading plugin 0_packages_manager_loader.50-markupsafe reloading plugin 0_packages_manager_loader.50-PlantUmlConnection reloading plugin 0_packages_manager_loader.50-pymdownx reloading plugin 0_packages_manager_loader.50-python-markdown reloading plugin 0_packages_manager_loader.50-python-pywin32 reloading plugin win32com reloading plugin win32 reloading plugin win32/lib reloading plugin win32comext reloading plugin 0_packages_manager_loader.50-pyyaml reloading plugin 0_packages_manager_loader.50-regex reloading plugin 0_packages_manager_loader.51-python-jinja2 reloading plugin 0_packages_manager_loader.55-jsonschema reloading plugin 0_packages_manager_loader.55-mdpopups reloading plugin tests reloading plugin 0_settings_loader.install_package_control_extended reloading plugin 0_settings_loader.synced_side_bar_watcher reloading plugin A File Icon.A File Icon reloading plugin AceJump.ace_jump reloading plugin ActiveViewJumpBack.active_view_jump_back reloading plugin AddFolderToProject.AddFolderToProject reloading plugin AdvancedCSV.csvplugin reloading plugin Alignment.Alignment reloading plugin AlignTab.aligner reloading plugin AlignTab.aligntab reloading plugin AlignTab.hist reloading plugin AlignTab.parser reloading plugin AlignTab.table reloading plugin AlignTab.utils reloading plugin AlignTab.wclen reloading plugin AllAutocomplete.all_views_completions reloading plugin AltUp.run_multiple_commands reloading plugin Amxmodx.Amxmodx reloading plugin AmxxChannel.commands reloading plugin AmxxChannel.fix_main_menus reloading plugin AmxxChannel.settings reloading plugin ANSIescape.ansi reloading plugin AutomaticPackageReloader.package_reloader reloading plugin AutoRefresh.AutoRefresh reloading plugin AutoWrap.autowrap reloading plugin BetterCoffeeScript.CoffeeScript reloading plugin BetterFindBuffer.find_results reloading plugin BufferScroll.BufferScroll reloading plugin CaseConversion.case_conversion reloading plugin CaseConversion.case_parse reloading plugin CaseConversion.ToggleTitleCase reloading plugin ChainOfCommand.chain reloading plugin ChangeQuotes.change_quotes reloading plugin ChannelRepositoryTools.ordereddict reloading plugin ChannelRepositoryTools.tests reloading plugin ChannelRepositoryTools.upgrade reloading plugin ClearCursorsCarets.clear_cursors_carets reloading plugin ClickableURLs.clickable_urls reloading plugin ClipboardScopeCopy.clipboard_scope_copy reloading plugin Color Highlighter.color_converter reloading plugin Color Highlighter.color_highlighter reloading plugin Color Highlighter.color_hover_listener reloading plugin Color Highlighter.color_scheme reloading plugin Color Highlighter.color_scheme_color_highlighter reloading plugin Color Highlighter.color_searcher reloading plugin Color Highlighter.color_selection_listener reloading plugin Color Highlighter.colors reloading plugin Color Highlighter.content_listener reloading plugin Color Highlighter.convert_color_command reloading plugin Color Highlighter.css_colors reloading plugin Color Highlighter.dummy_event_listener reloading plugin Color Highlighter.gutter_icons_color_highlighter reloading plugin Color Highlighter.load_resource reloading plugin Color Highlighter.main reloading plugin Color Highlighter.path reloading plugin Color Highlighter.phantoms_color_highlighter reloading plugin Color Highlighter.pick_color_command reloading plugin Color Highlighter.regex_compiler reloading plugin Color Highlighter.regions reloading plugin Color Highlighter.set_setting_command reloading plugin Color Highlighter.settings reloading plugin Color Highlighter.st_helper reloading plugin Color Highlighter.topsort reloading plugin ColorSchemeEditor.ColorSchemeEditor-ST2 reloading plugin ColorSchemeUnit.plugin reloading plugin ColumnSelect.column_select reloading plugin ConcurrentLogHandler.setup reloading plugin ConvertToUTF8.ConvertToUTF8 reloading plugin CopyFilepathWithLineNumbers.CopyFilepathWithLineNumbers reloading plugin CopyWithLineNumbersReloaded.copy_with_line_numbers reloading plugin DebugTools.setup reloading plugin DefaultSyntax.default_syntax reloading plugin DeleteCurrentFile.DeleteCurrentFile reloading plugin DistractionFreeWindow.distraction_free_window reloading plugin DocBlockr.jsdocs reloading plugin DocBlockr.test_runner reloading plugin DuplicateSelections.duplicate_selections reloading plugin EditPreferences.__init__ reloading plugin EditPreferences.commands_base reloading plugin EditPreferences.edit_package_files reloading plugin EditPreferences.extract_snippets reloading plugin EditPreferences.helper_commands reloading plugin EditPreferences.helpers reloading plugin EditPreferences.insert_binding_repr reloading plugin EditPreferences.jsonix reloading plugin EditPreferences.list_commands reloading plugin EditPreferences.list_menu_bindings reloading plugin EditPreferences.list_settings reloading plugin EditPreferences.list_shortcut_keys reloading plugin EditPreferences.list_theme_selectors reloading plugin EditPreferences.package_resources reloading plugin EditPreferences.quick_panel_cols reloading plugin EditPreferences.scheduler reloading plugin Emmet.emmet-plugin reloading plugin EvaluateInlinePython.inline_python reloading plugin EvaluatePrinter.EvalPrinter reloading plugin EvaluatePrinter.KillableCmd reloading plugin EvaluateShell.evaluate reloading plugin ExpandRegion.__init__ reloading plugin ExpandRegion.expand_region_handler reloading plugin ExpandRegion.expand_to_indent reloading plugin ExpandRegion.expand_to_line reloading plugin ExpandRegion.expand_to_quotes reloading plugin ExpandRegion.expand_to_regex_set reloading plugin ExpandRegion.expand_to_semantic_unit reloading plugin ExpandRegion.expand_to_subword reloading plugin ExpandRegion.expand_to_symbols reloading plugin ExpandRegion.expand_to_word reloading plugin ExpandRegion.expand_to_word_with_dots reloading plugin ExpandRegion.expand_to_xml_node reloading plugin ExpandRegion.ExpandRegion reloading plugin ExpandRegion.html reloading plugin ExpandRegion.javascript reloading plugin ExpandRegion.latex reloading plugin ExpandRegion.python reloading plugin ExpandRegion.utils reloading plugin ExportHtml.ExportBbcode reloading plugin ExportHtml.ExportHtml reloading plugin ExportHtml.HtmlAnnotations reloading plugin ExportHtml.support reloading plugin ExtendedTabSwitcher.ExtendedSwitcher reloading plugin ExtractText.clean_save_file_modifications reloading plugin ExtractText.extract_to_file reloading plugin FileDiffs.file_diffs reloading plugin FileHistory.file_history reloading plugin FileRename.file_rename reloading plugin FindKeyConflicts.find_key_conflicts reloading plugin FixProjectSwitchRestartBug.fix_project_switch_restart_bug reloading plugin FixSelectionAfterIndent.fix_selection_after_indent reloading plugin ForceRewriteSublimeSettings.force_rewrite_sublime_settings reloading plugin FuzzyFileNav.fuzzy_file_nav reloading plugin FuzzyFileNav.multiconf reloading plugin FuzzyFileNav.notify reloading plugin Glue.__init__ reloading plugin Glue.Glue reloading plugin Glue.GlueBrowser reloading plugin Glue.GlueCmds reloading plugin Glue.GlueIO reloading plugin Glue.GlueSidebarOpener reloading plugin GoogleSpellCheck.google-spell-check reloading plugin HighlightBuildErrors.HighlightBuildErrors reloading plugin HighlightWords.HighlightWords reloading plugin HorizontalScroll.scroll_width reloading plugin HungryBackspace.hungry_backspace reloading plugin Incrementor.incrementor reloading plugin IncrementSelection.IncrementSelection reloading plugin IndentAndBraces.indent-and-braces reloading plugin IndentSize.IndentSizeCommand reloading plugin InsertNums.InsertNums reloading plugin InvertSelection.invertselection reloading plugin JumpAlongIndent.file_scanner reloading plugin JumpAlongIndent.jump_along_indent reloading plugin JumpAlongIndent.view_helper reloading plugin KeepPastedTextSelected.keep_pasted_text_selected reloading plugin LanguageTool.LanguageList reloading plugin LanguageTool.LanguageTool reloading plugin LanguageTool.LTServer reloading plugin LaTeXSmartQuotes.getTeXRoot reloading plugin LaTeXSmartQuotes.smartquotes reloading plugin LaTeXTools.01_reload_submodules reloading plugin LaTeXTools.02_temp_file_cleanup reloading plugin LaTeXTools.03_reset_phantoms reloading plugin LaTeXTools.auto_label reloading plugin LaTeXTools.biblatex_crossref_completions reloading plugin LaTeXTools.biblatex_field_name_completions reloading plugin LaTeXTools.biblatex_name_completions reloading plugin LaTeXTools.biblatex_snippet_completions reloading plugin LaTeXTools.biblatex_syntax_listener reloading plugin LaTeXTools.change_environment reloading plugin LaTeXTools.context_provider reloading plugin LaTeXTools.create_mousemap reloading plugin LaTeXTools.delete_temp_files reloading plugin LaTeXTools.detect_spellcheck reloading plugin LaTeXTools.getTeXRoot reloading plugin LaTeXTools.jumpto_anywhere reloading plugin LaTeXTools.jumpto_tex_file reloading plugin LaTeXTools.jumpToPDF reloading plugin LaTeXTools.kpsewhich reloading plugin LaTeXTools.latex_cite_completions reloading plugin LaTeXTools.latex_cwl_completions reloading plugin LaTeXTools.latex_directive_completions reloading plugin LaTeXTools.latex_env_completions reloading plugin LaTeXTools.latex_fill_all reloading plugin LaTeXTools.latex_glossary_completions reloading plugin LaTeXTools.latex_input_completions reloading plugin LaTeXTools.latex_installed_packages reloading plugin LaTeXTools.latex_own_command_completions reloading plugin LaTeXTools.latex_ref_completions reloading plugin LaTeXTools.latexCommand reloading plugin LaTeXTools.latexDocumentationViewer reloading plugin LaTeXTools.latexEnvCloser reloading plugin LaTeXTools.latexEnvironment reloading plugin LaTeXTools.latextools_cache_listener reloading plugin LaTeXTools.latextools_default_settings reloading plugin LaTeXTools.latextools_plugin reloading plugin LaTeXTools.makePDF reloading plugin LaTeXTools.migrate reloading plugin LaTeXTools.open_detexify reloading plugin LaTeXTools.parseTeXlog reloading plugin LaTeXTools.reveal_folders reloading plugin LaTeXTools.search_commands reloading plugin LaTeXTools.smart_paste reloading plugin LaTeXTools.system_check reloading plugin LaTeXTools.texcount reloading plugin LaTeXTools.texMacro reloading plugin LaTeXTools.texSections reloading plugin LaTeXTools.texSyntaxListener reloading plugin LaTeXTools.toc_quickpanel reloading plugin LaTeXTools.toggle_settings reloading plugin LaTeXWordCount.WordCount reloading plugin LESS.less_completions reloading plugin LineEndingsUnify.LineEndingsUnify reloading plugin LinesMultisets.choose_view reloading plugin LinesMultisets.execute_operation reloading plugin LSP.boot reloading plugin MarkdownPreview.helper reloading plugin MarkdownPreview.markdown_settings reloading plugin MarkdownPreview.markdown_wrapper reloading plugin MarkdownPreview.MarkdownPreview reloading plugin MarkdownToBBCode.MarkdownToBBCode reloading plugin Maven.config_generator reloading plugin Maven.import reloading plugin Maven.maven reloading plugin MaxPane.layouts_doc reloading plugin MaxPane.max_pane reloading plugin MoveText.move_text reloading plugin MultiEditUtils.MultiEditUtils reloading plugin MultiEditUtils.selection_fields reloading plugin NumberKing.king reloading plugin Origami.origami reloading plugin OverrideAudit.override_audit reloading plugin OverrideCommitCompletion.overwrite_commit_completion reloading plugin OverrideEditSettingsDefaultContents.override_edit_settings_default_contents reloading plugin OverrideUnpackedPackages.override_unpacked_packages reloading plugin package_setting_context.__init__ reloading plugin PackageDev._logging reloading plugin PackageDev.main reloading plugin PackageResourceViewer.package_resource_viewer reloading plugin PackageResourceViewer.package_resources reloading plugin PackagesManager.1_reloader reloading plugin PackagesManager.2_bootstrap reloading plugin PackagesManager.PackagesManager reloading plugin PanelManager.main reloading plugin PathTranslator.PathTranslator reloading plugin PlantUmlConnection.setup reloading plugin PlantUmlDiagrams.diagram_plugin Removing all handlers from PlantUmlDiagrams.diagram.plantuml... Removing all handlers from PlantUmlDiagrams.diagram.base... Removing all handlers from PlantUmlDiagrams.diagram... Removing all handlers from PlantUmlDiagrams.diagram.plantuml... Removing all handlers from PlantUmlDiagrams.diagram.base... reloading plugin PowerCursors.power_cursors reloading plugin PrettyJSON.PrettyJson reloading plugin PrettyJSON.PrettyJsonListeners reloading plugin QuickSettings.quick_settings reloading plugin RandomEverything.__init__ reloading plugin RandomEverything.random reloading plugin REG.jumptoregkey reloading plugin ReIndent.ReIndent reloading plugin RememberCommandPaletteInput.fixed_command_palette_input_history reloading plugin REPL.__init__ reloading plugin REPL.completions reloading plugin REPL.lang_integration reloading plugin REPL.run_existing_command reloading plugin REPL.sublimerepl reloading plugin REPL.sublimerepl_build_system_hack reloading plugin REPL.text_transfer reloading plugin ScopeHunter.scope_hunter reloading plugin ScopeHunter.scope_hunter_notify reloading plugin ScopeHunter.support reloading plugin SelectAll.select_all_by_current_scope reloading plugin SelectAllSpellingErrors.select_all_spelling_errors reloading plugin SelectUntil.edit reloading plugin SelectUntil.select-until reloading plugin SemanticLineWrap.semantic_wrap reloading plugin SideBarEnhancements.SideBar reloading plugin SideBarEnhancements.SideBarAPI reloading plugin SideBarEnhancements.SideBarDefaultDisable reloading plugin SideBySideCompare.sbs_compare reloading plugin SideBySideSettings.sxs_settings reloading plugin SQLExec.SQLExec reloading plugin SQLKeywordUppercase.sql_keyword_uppercase reloading plugin SQLTools.SQLTools reloading plugin StickySearch.StickySearch reloading plugin StudioChannel.commands reloading plugin StudioChannel.settings reloading plugin SublimeLinter.__init__ reloading plugin SublimeLinter.busy_indicator_view reloading plugin SublimeLinter.commands reloading plugin SublimeLinter.goto_commands reloading plugin SublimeLinter.highlight_view reloading plugin SublimeLinter.log_handler reloading plugin SublimeLinter.message_view reloading plugin SublimeLinter.panel_view reloading plugin SublimeLinter.status_bar_view reloading plugin SublimeLinter.sublime_linter reloading plugin SublimeLinter.tooltips_view reloading plugin SublimeTutorial.sublime_tutor reloading plugin SyncViewScroll.syncscroll reloading plugin SyntaxManager.syntaxmgr reloading plugin TabsExtra.support reloading plugin TabsExtra.tab_menu reloading plugin TabsExtra.tab_sort_helper reloading plugin TabsExtra.tabs_extra reloading plugin TerminalShortcuts.Terminal reloading plugin TextPastry.text_pastry reloading plugin TextPastry.text_pastry_addons reloading plugin TextPastry.text_pastry_clipboard reloading plugin TextPastry.text_pastry_selection reloading plugin ToggleWords.ToggleWords reloading plugin Trimmer.Trimmer reloading plugin TypeScript.main reloading plugin UnitTesting.ut reloading plugin ViewSettingsFreely.view_settings_freely reloading plugin Whitespace.Whitespace reloading plugin WordCount.WordCount reloading plugin WordHighlight.word_highlight reloading plugin WrapPlus.wrap_plus plugins loaded ```
Originally posted on: https://github.com/tomv564/LSP/issues/255 python-language-server hanged Sublime Text by several seconds on file close event
This caused the LSP plugin for Sublime Text to hang completely for the 2 minutes the server did not responded to the
on_hover
request. I do not think there is an issue here if that is what does take to compute everything. Unless it doesn't.This was the LSP for Sublime Text log. Sadly it does not have the timestamp. I am going to open a feature request for:
Log:
``` 2018-02-04 15:56:14,325 DEBUG pyls.config.config:processmessage:137 pyls_completions [hook] config: Config. _root_path: f:\SublimeText\Data, _root_uri: file:///F:/SublimeText/Data, _init_opts: None, _settings: {'plugins': {'pydocstyle': {'enabled': True, 'ignore': ['D202', 'D208']}, 'rope': {'create_folder': False}, 'pycodestyle': {'enabled': False}}}, _plugin_settings: {'plugins': {'rope_completion': {'enabled': False}, 'pydocstyle': {'enabled': False}}}, _disabled_plugins: [], _config_sources(flake8): Flake8Config. root_path: f:\SublimeText\Data, is_windows: True, xdg_home: C:\Users\Professional/.config, _modified_times: {}, _config_sources(pycodestyle): PyCodeStyleConfig. root_path: f:\SublimeText\Data, is_windows: True, xdg_home: C:\Users\Professional/.config, _modified_times: {(): ()}, _configs_cache(()): []
workspace: Workspace. _root_path: f:\SublimeText\Data, _root_uri: file:///F:/SublimeText/Data, _root_uri_scheme: file, _lang_server: PythonLanguageServer. config: Config. _root_path: f:\SublimeText\Data, _root_uri: file:///F:/SublimeText/Data, _init_opts: None, _settings: {'plugins': {'pydocstyle': {'enabled': True, 'ignore': ['D202', 'D208']}, 'rope': {'create_folder': False}, 'pycodestyle': {'enabled': False}}}, _plugin_settings: {'plugins': {'rope_completion': {'enabled': False}, 'pydocstyle': {'enabled': False}}}, _disabled_plugins: [], _config_sources(flake8): Flake8Config. root_path: f:\SublimeText\Data, is_windows: True, xdg_home: C:\Users\Professional/.config, _modified_times: {}, _config_sources(pycodestyle): PyCodeStyleConfig. root_path: f:\SublimeText\Data, is_windows: True, xdg_home: C:\Users\Professional/.config, _modified_times: {(): ()}, _configs_cache(()): [], _dispatchers: [], __rope: Project. _address: f:\SublimeText\Data, _ropefolder_name: None, ignored: _ResourceMatcher. patterns: [], file_list: None, prefs: Prefs. {'extension_modules': ['numpy', 'os', 'array', 'audioop', 'binascii', 'cmath', 'collections', 'datetime', 'errno', 'gc', 'imp', 'itertools', 'marshal', 'math', 'mmap', 'msvcrt', 'nt', 'operator', 'parser', 'signal', 'sys', 'time', 'xxsubtype', 'zipimport', 'zlib']}, callbacks: {'ignored_resources': >}, _docs(file:///F:/SublimeText/Data/Packages/LSP/plugin/core/clients.py): Document. uri: file:///F:/SublimeText/Data/Packages/LSP/plugin/core/clients.py, version: 4, path: f:\SublimeText\Data\Packages\LSP\plugin\core\clients.py, filename: clients.py, _local: True, _extra_sys_path: [], _rope_project: Project. _address: f:\SublimeText\Data, _ropefolder_name: None, ignored: _ResourceMatcher. patterns: [], file_list: None, prefs: Prefs. {'extension_modules': ['numpy', 'os', 'array', 'audioop', 'binascii', 'cmath', 'collections', 'datetime', 'errno', 'gc', 'imp', 'itertools', 'marshal', 'math', 'mmap', 'msvcrt', 'nt', 'operator', 'parser', 'signal', 'sys', 'time', 'xxsubtype', 'zipimport', 'zlib']}, callbacks: {'ignored_resources': >}
document: Document. uri: file:///F:/SublimeText/Data/Packages/LSP/plugin/core/clients.py, version: 4, path: f:\SublimeText\Data\Packages\LSP\plugin\core\clients.py, filename: clients.py, _local: True, _extra_sys_path: [], _rope_project: Project. _address: f:\SublimeText\Data, _ropefolder_name: None, ignored: _ResourceMatcher. patterns: [], file_list: None, prefs: Prefs. {'extension_modules': ['numpy', 'os', 'array', 'audioop', 'binascii', 'cmath', 'collections', 'datetime', 'errno', 'gc', 'imp', 'itertools', 'marshal', 'math', 'mmap', 'msvcrt', 'nt', 'operator', 'parser', 'signal', 'sys', 'time', 'xxsubtype', 'zipimport', 'zlib']}, callbacks: {'ignored_resources': >}
position: {'line': 49, 'character': 20}
2018-02-04 15:58:37,344 DEBUG pyls.config.config:processmessage:137 finish pyls_completions --> [[{'label': 'self', 'kind': 18, 'detail': 'local self', 'documentation': '', 'sortText': 'aself'}, {'label': 'set_config_ready', 'kind': 3, 'detail': 'global set_config_ready', 'documentation': '', 'sortText': 'aset_config_ready'}, {'label': 'set_config_starting', 'kind': 3, 'detail': 'global set_config_starting', 'documentation': '', 'sortText': 'aset_config_starting'}, {'label': 'set_config_stopping', 'kind': 3, 'detail': 'global set_config_stopping', 'documentation': '', 'sortText': 'aset_config_stopping'}, {'label': 'sublime', 'kind': 9, 'detail': 'imported sublime', 'documentation': '', 'sortText': 'asublime'}, {'label': 'set', 'kind': 7, 'detail': 'builtin set', 'documentation': 'set() -> new empty set object\nset(iterable) -> new set object\n\nBuild an unordered collection of unique elements.', 'sortText': 'yset'}, {'label': 'slice', 'kind': 7, 'detail': 'builtin slice', 'documentation': 'slice(stop)\nslice(start, stop[, step])\n\nCreate a slice object. This is used for extended slicing (e.g. a[0:10:2]).', 'sortText': 'yslice'}, {'label': 'staticmethod', 'kind': 7, 'detail': 'builtin staticmethod', 'documentation': 'staticmethod(function) -> method\n\nConvert a function to be a static method.\n\nA static method does not receive an implicit first argument.\nTo declare a static method, use this idiom:\n\n class C:\n @staticmethod\n def f(arg1, arg2, ...):\n ...\n\nIt can be called either on the class (e.g. C.f()) or on an instance\n(e.g. C().f()). The instance is ignored except for its class.\n\nStatic methods in Python are similar to those found in Java or C++.\nFor a more advanced concept, see the classmethod builtin.', 'sortText': 'ystaticmethod'}, {'label': 'str', 'kind': 7, 'detail': 'builtin str', 'documentation': "str(object='') -> str\nstr(bytes_or_buffer[, encoding[, errors]]) -> str\n\nCreate a new string object from the given object. If encoding or\nerrors is specified, then the object must expose a data buffer\nthat will be decoded using the given encoding and error handler.\nOtherwise, returns the result of object.__str__() (if defined)\nor repr(object).\nencoding defaults to sys.getdefaultencoding().\nerrors defaults to 'strict'.", 'sortText': 'ystr'}, {'label': 'setattr', 'kind': 3, 'detail': 'builtin setattr', 'documentation': "Sets the named attribute on the given object to the specified value.\n\nsetattr(x, 'y', v) is equivalent to ``x.y = v''", 'sortText': 'ysetattr'}, {'label': 'sorted', 'kind': 3, 'detail': 'builtin sorted', 'documentation': 'Return a new list containing all items from the iterable in ascending order.\n\nA custom key function can be supplied to customize the sort order, and the\nreverse flag can be set to request the result in descending order.', 'sortText': 'ysorted'}, {'label': 'sum', 'kind': 3, 'detail': 'builtin sum', 'documentation': "Return the sum of a 'start' value (default: 0) plus an iterable of numbers\n\nWhen the iterable is empty, return the start value.\nThis function is intended specifically for use with numeric values and may\nreject non-numeric types.", 'sortText': 'ysum'}, {'label': 'super', 'kind': 3, 'detail': 'builtin super', 'documentation': 'super() -> same as super(__class__, )\nsuper(type) -> unbound super object\nsuper(type, obj) -> bound super object; requires isinstance(obj, type)\nsuper(type, type2) -> bound super object; requires issubclass(type2, type)\nTypical use to call a cooperative superclass method:\nclass C(B):\n def meth(self, arg):\n super().meth(arg)\nThis works for class methods too:\nclass C(B):\n @classmethod\n def cmeth(cls, arg):\n super().cmeth(arg)\n', 'sortText': 'ysuper'}], [{'label': 'self', 'kind': 6, 'detail': '__main__.has_client_with_capability', 'documentation': "LspTextCommand(self, view, capability='')\n\n", 'sortText': 'aself', 'insertText': 'self'}, {'label': 'Set', 'kind': 7, 'detail': '__main__', 'documentation': '', 'sortText': 'aSet', 'insertText': 'Set'}, {'label': 'set', 'kind': 7, 'detail': '', 'documentation': 'set() -> new empty set object\nset(iterable) -> new set object\n\nBuild an unordered collection of unique elements.', 'sortText': 'aset', 'insertText': 'set'}, {'label': 'set_config_ready(window, config_name, client)', 'kind': 3, 'detail': '__main__', 'documentation': "set_config_ready(window: sublime.Window, config_name: str, client:\n'Client')\n\n", 'sortText': 'aset_config_ready', 'insertText': 'set_config_ready'}, {'label': 'set_config_starting(window, config_name)', 'kind': 3, 'detail': '__main__', 'documentation': 'set_config_starting(window: sublime.Window, config_name: str)\n\n', 'sortText': 'aset_config_starting', 'insertText': 'set_config_starting'}, {'label': 'set_config_stopping(window, config_name)', 'kind': 3, 'detail': '__main__', 'documentation': 'set_config_stopping(window: sublime.Window, config_name: str)\n\n', 'sortText': 'aset_config_stopping', 'insertText': 'set_config_stopping'}, {'label': 'setattr(obj, name, value)', 'kind': 3, 'detail': '', 'documentation': "Sets the named attribute on the given object to the specified value.\n\nsetattr(x, 'y', v) is equivalent to ``x.y = v''", 'sortText': 'asetattr', 'insertText': 'setattr'}, {'label': 'slice', 'kind': 7, 'detail': '', 'documentation': 'slice(stop)\nslice(start, stop[, step])\n\nCreate a slice object.\xa0\xa0This is used for extended slicing (e.g. a[0:10:2]).', 'sortText': 'aslice', 'insertText': 'slice'}, {'label': 'sorted(iterable, cmp, key, reverse)', 'kind': 3, 'detail': '', 'documentation': "sorted(iterable, cmp=None, key=None, reverse=False)\n\nBuilt-in functions, exceptions, and other objects.\n\nNoteworthy: None is the `nil' object; Ellipsis represents `...' in slices.", 'sortText': 'asorted', 'insertText': 'sorted'}, {'label': 'staticmethod', 'kind': 7, 'detail': '', 'documentation': 'staticmethod(function) -> method\n\nConvert a function to be a static method.\n\nA static method does not receive an implicit first argument.\nTo declare a static method, use this idiom:\n\n\xa0\xa0\xa0\xa0 class C:\n\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0 @staticmethod\n\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0 def f(arg1, arg2, ...):\n\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0 ...\n\nIt can be called either on the class (e.g. C.f()) or on an instance\n(e.g. C().f()).\xa0\xa0The instance is ignored except for its class.\n\nStatic methods in Python are similar to those found in Java or C++.\nFor a more advanced concept, see the classmethod builtin.', 'sortText': 'astaticmethod', 'insertText': 'staticmethod'}, {'label': 'StopAsyncIteration', 'kind': 7, 'detail': '', 'documentation': 'Signal the end from iterator.__anext__().', 'sortText': 'aStopAsyncIteration', 'insertText': 'StopAsyncIteration'}, {'label': 'StopIteration', 'kind': 7, 'detail': '', 'documentation': 'Signal the end from iterator.__next__().', 'sortText': 'aStopIteration', 'insertText': 'StopIteration'}, {'label': 'str', 'kind': 7, 'detail': '', 'documentation': "str(object='') -> str\nstr(bytes_or_buffer[, encoding[, errors]]) -> str\n\nCreate a new string object from the given object. If encoding or\nerrors is specified, then the object must expose a data buffer\nthat will be decoded using the given encoding and error handler.\nOtherwise, returns the result of object.__str__() (if defined)\nor repr(object).\nencoding defaults to sys.getdefaultencoding().\nerrors defaults to 'strict'.", 'sortText': 'astr', 'insertText': 'str'}, {'label': 'sublime', 'kind': 9, 'detail': '__main__', 'documentation': '', 'sortText': 'asublime', 'insertText': 'sublime'}, {'label': 'sum(iterable, start)', 'kind': 3, 'detail': '', 'documentation': "Return the sum of a 'start' value (default: 0) plus an iterable of numbers\n\nWhen the iterable is empty, return the start value.\nThis function is intended specifically for use with numeric values and may\nreject non-numeric types.", 'sortText': 'asum', 'insertText': 'sum'}, {'label': 'super', 'kind': 7, 'detail': '', 'documentation': 'super() -> same as super(__class__, )\nsuper(type) -> unbound super object\nsuper(type, obj) -> bound super object; requires isinstance(obj, type)\nsuper(type, type2) -> bound super object; requires issubclass(type2, type)\nTypical use to call a cooperative superclass method:\nclass C(B):\n\xa0\xa0\xa0\xa0def meth(self, arg):\n\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0super().meth(arg)\nThis works for class methods too:\nclass C(B):\n\xa0\xa0\xa0\xa0@classmethod\n\xa0\xa0\xa0\xa0def cmeth(cls, arg):\n\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0super().cmeth(arg)', 'sortText': 'asuper', 'insertText': 'super'}, {'label': 'SyntaxError', 'kind': 7, 'detail': '', 'documentation': 'Invalid syntax.', 'sortText': 'aSyntaxError', 'insertText': 'SyntaxError'}, {'label': 'SyntaxWarning', 'kind': 7, 'detail': '', 'documentation': 'Base class for warnings about dubious syntax.', 'sortText': 'aSyntaxWarning', 'insertText': 'SyntaxWarning'}, {'label': 'SystemError', 'kind': 7, 'detail': '', 'documentation': 'Internal error in the Python interpreter.\n\nPlease report this to the Python maintainer, along with the traceback,\nthe Python version, and the hardware/OS platform and version.', 'sortText': 'aSystemError', 'insertText': 'SystemError'}, {'label': 'SystemExit', 'kind': 7, 'detail': '', 'documentation': 'Request to exit from the interpreter.', 'sortText': 'aSystemExit', 'insertText': 'SystemExit'}]] [hook]
2018-02-04 15:58:37,349 DEBUG pyls.server:handle:35 Got message: b'{"jsonrpc": "2.0", "method": "textDocument/didChange", "params": {"textDocument": {"uri": "file:///F:/SublimeText/Data/Packages/LSP/plugin/core/clients.py", "version": 5}, "contentChanges": [{"text": "import sublime\\n\\nfrom sublime_plugin import TextCommand\\n\\nfrom .logging import debug, exception_log\\nfrom .configurations import config_for_scope, is_supported_view\\nfrom .protocol import Request\\nfrom .workspace import get_project_path\\n\\n# typing only\\nfrom .rpc import Client\\nfrom .settings import ClientConfig\\nassert Client and ClientConfig\\n\\n\\ntry:\\n from typing import Any, List, Dict, Tuple, Callable, Optional, Set\\n assert Any and List and Dict and Tuple and Callable and Optional and Set\\nexcept ImportError:\\n pass\\n\\n\\nclients_by_window = {} # type: Dict[int, Dict[str, ConfigState]]\\n\\n\\nclass ClientStates(object):\\n STARTING = 0\\n READY = 1\\n STOPPING = 2\\n\\n\\nclass ConfigState(object):\\n\\n def __init__(self, state=ClientStates.STARTING, client=None):\\n self.state = state\\n self.client = client\\n\\n\\nclass LspTextCommand(TextCommand):\\n def __init__(self, view, capability=\'\'):\\n super().__init__(view)\\n self.capability = capability\\n\\n def is_visible(self):\\n return is_supported_view(self.view)\\n\\n def has_client_with_capability(self):\\n client = client_for_view(self.view)\\n if client and client.has_capability(self.capability):\\n return tr\\n return False\\n\\n\\ndef window_configs(window: sublime.Window) -> \'Dict[str, ConfigState]\':\\n if window.id() in clients_by_window:\\n return clients_by_window[window.id()]\\n else:\\n # debug(\\"no configs found for window\\", window.id())\\n return {}\\n\\n\\ndef is_ready_window_config(window: sublime.Window, config_name: str):\\n configs = window_configs(window)\\n\\n if config_name not in configs:\\n return False\\n\\n if configs[config_name].state == ClientStates.READY:\\n return True\\n\\n return False\\n\\n\\n# Startup\\n\\ndef can_start_config(window: sublime.Window, config_name: str):\\n return config_name not in window_configs(window)\\n\\n\\ndef set_config_starting(window: sublime.Window, config_name: str):\\n clients_by_window.setdefault(window.id(), {})[config_name] = ConfigState()\\n\\n\\ndef clear_config_state(window: sublime.Window, config_name: str):\\n configs = window_configs(window)\\n del configs[config_name]\\n\\n\\ndef set_config_ready(window: sublime.Window, config_name: str, client: \'Client\'):\\n window_configs(window)[config_name] = ConfigState(ClientStates.READY, client)\\n debug(\\"{} client registered for window {}\\".format(config_name, window.id()))\\n\\n\\ndef set_config_stopping(window: sublime.Window, config_name: str):\\n window_configs(window)[config_name].state = ClientStates.STOPPING\\n\\n\\ndef client_for_closed_view(view: sublime.View) -> \'Optional[Client]\':\\n return _client_for_view_and_window(view, sublime.active_window())\\n\\n\\ndef client_for_view(view: sublime.View) -> \'Optional[Client]\':\\n return _client_for_view_and_window(view, view.window())\\n\\n\\ndef _client_for_view_and_window(view: sublime.View, window: \'Optional[sublime.Window]\') -> \'Optional[Client]\':\\n if not window:\\n debug(\\"no window for view\\", view.file_name())\\n return None\\n\\n config = config_for_scope(view)\\n if not config:\\n debug(\\"config not available for view\\", view.file_name())\\n return None\\n\\n window_config_states = window_configs(window)\\n if config.name not in window_config_states:\\n debug(config.name, \\"not available for view\\",\\n view.file_name(), \\"in window\\", window.id())\\n return None\\n else:\\n config_state = window_config_states[config.name]\\n if config_state.client:\\n return config_state.client\\n else:\\n debug(config.name, \\"in state\\", config_state.state, \\" for view\\",\\n view.file_name(), \\"in window\\", window.id())\\n return None\\n\\n\\n# Shutdown\\n\\ndef remove_window_client(window: sublime.Window, config_name: str):\\n del clients_by_window[window.id()][config_name]\\n\\n\\ndef unload_all_clients():\\n for window in sublime.windows():\\n for config_name, config_state in window_configs(window).items():\\n if config_state.client:\\n if config_state.state == ClientStates.STARTING:\\n unload_client(config_state.client, window.id(), config_name)\\n else:\\n debug(\'ignoring unload of config in state\', config_state.state)\\n else:\\n debug(\'ignoring unload of config without client\')\\n\\n\\nclosing_window_ids = set() # type: Set[int]\\n\\n\\ndef check_window_unloaded():\\n global clients_by_window\\n open_window_ids = list(window.id() for window in sublime.windows())\\n iterable_clients_by_window = clients_by_window.copy()\\n for id, window_clients in iterable_clients_by_window.items():\\n if id not in open_window_ids and window_clients:\\n if id not in closing_window_ids:\\n closing_window_ids.add(id)\\n debug(\\"window closed\\", id)\\n for closed_window_id in closing_window_ids:\\n unload_window_clients(closed_window_id)\\n closing_window_ids.clear()\\n\\n\\ndef unload_window_clients(window_id: int):\\n if window_id in clients_by_window:\\n window_configs = clients_by_window[window_id]\\n for config_name, state in window_configs.items():\\n window_configs[config_name].state = ClientStates.STOPPING\\n debug(\\"unloading client\\", config_name, state.client)\\n unload_client(state.client, window_id, config_name)\\n\\n\\ndef unload_old_clients(window: sublime.Window):\\n project_path = get_project_path(window)\\n configs = window_configs(window)\\n clients_to_unload = {}\\n for config_name, state in configs.items():\\n if state.client and state.state == ClientStates.READY and state.client.get_project_path() != project_path:\\n debug(\'unload\', config_name, \'project path changed from\',\\n state.client.get_project_path(), \'to\', project_path)\\n clients_to_unload[config_name] = state.client\\n\\n for config_name, client in clients_to_unload.items():\\n set_config_stopping(window, config_name)\\n unload_client(client, window.id(), config_name)\\n\\n\\nclients_unloaded_handler = None # type: Optional[Callable]\\n\\n\\ndef register_clients_unloaded_handler(handler: \'Callable\'):\\n global clients_unloaded_handler\\n clients_unloaded_handler = handler\\n\\n\\ndef on_shutdown(client: Client, window_id: int, config_name: str, response):\\n try:\\n client.exit()\\n del clients_by_window[window_id][config_name]\\n\\n if not clients_by_window[window_id]:\\n debug(\\"all clients unloaded\\")\\n if clients_unloaded_handler:\\n clients_unloaded_handler(window_id)\\n\\n except Exception as err:\\n exception_log(\\"Error exiting server\\", err)\\n\\n\\ndef unload_client(client: Client, window_id: int, config_name: str):\\n client.send_request(Request.shutdown(), lambda response: on_shutdown(client, window_id, config_name, response))\\n"}]}}'
2018-02-04 15:58:37,364 DEBUG pyls.server:handle:35 Got message: b'{"jsonrpc": "2.0", "id": 25, "method": "textDocument/hover", "params": {"textDocument": {"uri": "file:///F:/SublimeText/Data/Packages/LSP/plugin/core/clients.py"}, "position": {"line": 48, "character": 11}}}'
2018-02-04 15:58:37,368 DEBUG pyls.python_ls:_hook:48 PythonLanguageServer, self.config: Config. _root_path: f:\SublimeText\Data, _root_uri: file:///F:/SublimeText/Data, _init_opts: None, _settings: {'plugins': {'pydocstyle': {'enabled': True, 'ignore': ['D202', 'D208']}, 'rope': {'create_folder': False}, 'pycodestyle': {'enabled': False}}}, _plugin_settings: {'plugins': {'rope_completion': {'enabled': False}, 'pydocstyle': {'enabled': False}}}, _disabled_plugins: [], _config_sources(flake8): Flake8Config. root_path: f:\SublimeText\Data, is_windows: True, xdg_home: C:\Users\Professional/.config, _modified_times: {}, _config_sources(pycodestyle): PyCodeStyleConfig. root_path: f:\SublimeText\Data, is_windows: True, xdg_home: C:\Users\Professional/.config, _modified_times: {(): ()}, _configs_cache(()): []
2018-02-04 15:58:37,376 DEBUG pyls.config.config:processmessage:137 pyls_hover [hook]
config: Config. _root_path: f:\SublimeText\Data, _root_uri: file:///F:/SublimeText/Data, _init_opts: None, _settings: {'plugins': {'pydocstyle': {'enabled': True, 'ignore': ['D202', 'D208']}, 'rope': {'create_folder': False}, 'pycodestyle': {'enabled': False}}}, _plugin_settings: {'plugins': {'rope_completion': {'enabled': False}, 'pydocstyle': {'enabled': False}}}, _disabled_plugins: [], _config_sources(flake8): Flake8Config. root_path: f:\SublimeText\Data, is_windows: True, xdg_home: C:\Users\Professional/.config, _modified_times: {}, _config_sources(pycodestyle): PyCodeStyleConfig. root_path: f:\SublimeText\Data, is_windows: True, xdg_home: C:\Users\Professional/.config, _modified_times: {(): ()}, _configs_cache(()): []
workspace: Workspace. _root_path: f:\SublimeText\Data, _root_uri: file:///F:/SublimeText/Data, _root_uri_scheme: file, _lang_server: PythonLanguageServer. config: Config. _root_path: f:\SublimeText\Data, _root_uri: file:///F:/SublimeText/Data, _init_opts: None, _settings: {'plugins': {'pydocstyle': {'enabled': True, 'ignore': ['D202', 'D208']}, 'rope': {'create_folder': False}, 'pycodestyle': {'enabled': False}}}, _plugin_settings: {'plugins': {'rope_completion': {'enabled': False}, 'pydocstyle': {'enabled': False}}}, _disabled_plugins: [], _config_sources(flake8): Flake8Config. root_path: f:\SublimeText\Data, is_windows: True, xdg_home: C:\Users\Professional/.config, _modified_times: {}, _config_sources(pycodestyle): PyCodeStyleConfig. root_path: f:\SublimeText\Data, is_windows: True, xdg_home: C:\Users\Professional/.config, _modified_times: {(): ()}, _configs_cache(()): [], _dispatchers: [], __rope: Project. _address: f:\SublimeText\Data, _ropefolder_name: None, ignored: _ResourceMatcher. patterns: [], file_list: None, prefs: Prefs. {'extension_modules': ['numpy', 'os', 'array', 'audioop', 'binascii', 'cmath', 'collections', 'datetime', 'errno', 'gc', 'imp', 'itertools', 'marshal', 'math', 'mmap', 'msvcrt', 'nt', 'operator', 'parser', 'signal', 'sys', 'time', 'xxsubtype', 'zipimport', 'zlib']}, callbacks: {'ignored_resources': >}, _docs(file:///F:/SublimeText/Data/Packages/LSP/plugin/core/clients.py): Document. uri: file:///F:/SublimeText/Data/Packages/LSP/plugin/core/clients.py, version: 5, path: f:\SublimeText\Data\Packages\LSP\plugin\core\clients.py, filename: clients.py, _local: True, _extra_sys_path: [], _rope_project: Project. _address: f:\SublimeText\Data, _ropefolder_name: None, ignored: _ResourceMatcher. patterns: [], file_list: None, prefs: Prefs. {'extension_modules': ['numpy', 'os', 'array', 'audioop', 'binascii', 'cmath', 'collections', 'datetime', 'errno', 'gc', 'imp', 'itertools', 'marshal', 'math', 'mmap', 'msvcrt', 'nt', 'operator', 'parser', 'signal', 'sys', 'time', 'xxsubtype', 'zipimport', 'zlib']}, callbacks: {'ignored_resources': >}
document: Document. uri: file:///F:/SublimeText/Data/Packages/LSP/plugin/core/clients.py, version: 5, path: f:\SublimeText\Data\Packages\LSP\plugin\core\clients.py, filename: clients.py, _local: True, _extra_sys_path: [], _rope_project: Project. _address: f:\SublimeText\Data, _ropefolder_name: None, ignored: _ResourceMatcher. patterns: [], file_list: None, prefs: Prefs. {'extension_modules': ['numpy', 'os', 'array', 'audioop', 'binascii', 'cmath', 'collections', 'datetime', 'errno', 'gc', 'imp', 'itertools', 'marshal', 'math', 'mmap', 'msvcrt', 'nt', 'operator', 'parser', 'signal', 'sys', 'time', 'xxsubtype', 'zipimport', 'zlib']}, callbacks: {'ignored_resources': >}
position: {'line': 48, 'character': 11}
2018-02-04 15:58:37,392 DEBUG parso.python.diff:update:121 diff parser start
2018-02-04 15:58:37,397 DEBUG parso.python.diff:update:132 diff parser calculated
2018-02-04 15:58:37,410 DEBUG parso.python.diff:update:133 diff: line_lengths old: 214, new: 214
2018-02-04 15:58:37,414 DEBUG parso.python.diff:update:137 diff equal old[1:49] new[1:49]
2018-02-04 15:58:37,418 DEBUG parso.python.diff:_copy_from_old_parser:208 diff actually copy 1 to 48
2018-02-04 15:58:37,441 DEBUG parso.python.diff:_parse:257 parse_part from 49 to 51 (to 51 in part parser)
2018-02-04 15:58:37,445 DEBUG parso.python.diff:update:137 diff replace old[50:50] new[50:50]
2018-02-04 15:58:37,447 DEBUG parso.python.diff:update:137 diff equal old[51:214] new[51:214]
2018-02-04 15:58:37,459 DEBUG parso.python.diff:_copy_from_old_parser:208 diff actually copy 52 to 213
2018-02-04 15:58:37,463 DEBUG parso.python.diff:update:166 diff parser end
2018-02-04 15:58:37,874 DEBUG pyls.python_ls:_hook:48 PythonLanguageServer, self.config: Config. _root_path: f:\SublimeText\Data, _root_uri: file:///F:/SublimeText/Data, _init_opts: None, _settings: {'plugins': {'pydocstyle': {'enabled': True, 'ignore': ['D202', 'D208']}, 'rope': {'create_folder': False}, 'pycodestyle': {'enabled': False}}}, _plugin_settings: {'plugins': {'rope_completion': {'enabled': False}, 'pydocstyle': {'enabled': False}}}, _disabled_plugins: [], _config_sources(flake8): Flake8Config. root_path: f:\SublimeText\Data, is_windows: True, xdg_home: C:\Users\Professional/.config, _modified_times: {}, _config_sources(pycodestyle): PyCodeStyleConfig. root_path: f:\SublimeText\Data, is_windows: True, xdg_home: C:\Users\Professional/.config, _modified_times: {(): ()}, _configs_cache(()): []
2018-02-04 15:58:37,883 DEBUG pyls.config.config:processmessage:137 pyls_lint [hook]
config: Config. _root_path: f:\SublimeText\Data, _root_uri: file:///F:/SublimeText/Data, _init_opts: None, _settings: {'plugins': {'pydocstyle': {'enabled': True, 'ignore': ['D202', 'D208']}, 'rope': {'create_folder': False}, 'pycodestyle': {'enabled': False}}}, _plugin_settings: {'plugins': {'rope_completion': {'enabled': False}, 'pydocstyle': {'enabled': False}}}, _disabled_plugins: [], _config_sources(flake8): Flake8Config. root_path: f:\SublimeText\Data, is_windows: True, xdg_home: C:\Users\Professional/.config, _modified_times: {}, _config_sources(pycodestyle): PyCodeStyleConfig. root_path: f:\SublimeText\Data, is_windows: True, xdg_home: C:\Users\Professional/.config, _modified_times: {(): ()}, _configs_cache(()): []
workspace: Workspace. _root_path: f:\SublimeText\Data, _root_uri: file:///F:/SublimeText/Data, _root_uri_scheme: file, _lang_server: PythonLanguageServer. config: Config. _root_path: f:\SublimeText\Data, _root_uri: file:///F:/SublimeText/Data, _init_opts: None, _settings: {'plugins': {'pydocstyle': {'enabled': True, 'ignore': ['D202', 'D208']}, 'rope': {'create_folder': False}, 'pycodestyle': {'enabled': False}}}, _plugin_settings: {'plugins': {'rope_completion': {'enabled': False}, 'pydocstyle': {'enabled': False}}}, _disabled_plugins: [], _config_sources(flake8): Flake8Config. root_path: f:\SublimeText\Data, is_windows: True, xdg_home: C:\Users\Professional/.config, _modified_times: {}, _config_sources(pycodestyle): PyCodeStyleConfig. root_path: f:\SublimeText\Data, is_windows: True, xdg_home: C:\Users\Professional/.config, _modified_times: {(): ()}, _configs_cache(()): [], _dispatchers: [], __rope: Project. _address: f:\SublimeText\Data, _ropefolder_name: None, ignored: _ResourceMatcher. patterns: [], file_list: None, prefs: Prefs. {'extension_modules': ['numpy', 'os', 'array', 'audioop', 'binascii', 'cmath', 'collections', 'datetime', 'errno', 'gc', 'imp', 'itertools', 'marshal', 'math', 'mmap', 'msvcrt', 'nt', 'operator', 'parser', 'signal', 'sys', 'time', 'xxsubtype', 'zipimport', 'zlib']}, callbacks: {'ignored_resources': >}, _docs(file:///F:/SublimeText/Data/Packages/LSP/plugin/core/clients.py): Document. uri: file:///F:/SublimeText/Data/Packages/LSP/plugin/core/clients.py, version: 5, path: f:\SublimeText\Data\Packages\LSP\plugin\core\clients.py, filename: clients.py, _local: True, _extra_sys_path: [], _rope_project: Project. _address: f:\SublimeText\Data, _ropefolder_name: None, ignored: _ResourceMatcher. patterns: [], file_list: None, prefs: Prefs. {'extension_modules': ['numpy', 'os', 'array', 'audioop', 'binascii', 'cmath', 'collections', 'datetime', 'errno', 'gc', 'imp', 'itertools', 'marshal', 'math', 'mmap', 'msvcrt', 'nt', 'operator', 'parser', 'signal', 'sys', 'time', 'xxsubtype', 'zipimport', 'zlib']}, callbacks: {'ignored_resources': >}
document: Document. uri: file:///F:/SublimeText/Data/Packages/LSP/plugin/core/clients.py, version: 5, path: f:\SublimeText\Data\Packages\LSP\plugin\core\clients.py, filename: clients.py, _local: True, _extra_sys_path: [], _rope_project: Project. _address: f:\SublimeText\Data, _ropefolder_name: None, ignored: _ResourceMatcher. patterns: [], file_list: None, prefs: Prefs. {'extension_modules': ['numpy', 'os', 'array', 'audioop', 'binascii', 'cmath', 'collections', 'datetime', 'errno', 'gc', 'imp', 'itertools', 'marshal', 'math', 'mmap', 'msvcrt', 'nt', 'operator', 'parser', 'signal', 'sys', 'time', 'xxsubtype', 'zipimport', 'zlib']}, callbacks: {'ignored_resources': >}
2018-02-04 15:58:38,271 DEBUG pyls.config.config:processmessage:137 finish pyls_hover --> [hook]
contents:
2018-02-04 15:58:38,375 DEBUG pyls.plugins.pydocstyle_lint:pyls_lint:46 Got pydocstyle errors: [{'source': 'pydocstyle', 'code': 'D100', 'message': 'D100: Missing docstring in public module', 'severity': 2, 'range': {'start': {'line': 0, 'character': 0}, 'end': {'line': 0, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D101', 'message': 'D101: Missing docstring in public class', 'severity': 2, 'range': {'start': {'line': 25, 'character': 0}, 'end': {'line': 25, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D101', 'message': 'D101: Missing docstring in public class', 'severity': 2, 'range': {'start': {'line': 31, 'character': 0}, 'end': {'line': 31, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D107', 'message': 'D107: Missing docstring in __init__', 'severity': 2, 'range': {'start': {'line': 33, 'character': 0}, 'end': {'line': 33, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D101', 'message': 'D101: Missing docstring in public class', 'severity': 2, 'range': {'start': {'line': 38, 'character': 0}, 'end': {'line': 38, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D107', 'message': 'D107: Missing docstring in __init__', 'severity': 2, 'range': {'start': {'line': 39, 'character': 0}, 'end': {'line': 39, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D102', 'message': 'D102: Missing docstring in public method', 'severity': 2, 'range': {'start': {'line': 43, 'character': 0}, 'end': {'line': 43, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D102', 'message': 'D102: Missing docstring in public method', 'severity': 2, 'range': {'start': {'line': 46, 'character': 0}, 'end': {'line': 46, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 53, 'character': 0}, 'end': {'line': 53, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 61, 'character': 0}, 'end': {'line': 61, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 75, 'character': 0}, 'end': {'line': 75, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 79, 'character': 0}, 'end': {'line': 79, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 83, 'character': 0}, 'end': {'line': 83, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 88, 'character': 0}, 'end': {'line': 88, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 93, 'character': 0}, 'end': {'line': 93, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 97, 'character': 0}, 'end': {'line': 97, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 101, 'character': 0}, 'end': {'line': 101, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 132, 'character': 0}, 'end': {'line': 132, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 136, 'character': 0}, 'end': {'line': 136, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 151, 'character': 0}, 'end': {'line': 151, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 165, 'character': 0}, 'end': {'line': 165, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 174, 'character': 0}, 'end': {'line': 174, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 192, 'character': 0}, 'end': {'line': 192, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 197, 'character': 0}, 'end': {'line': 197, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 211, 'character': 0}, 'end': {'line': 211, 'character': 15}}}]
2018-02-04 15:58:38,381 DEBUG pyls.config.source:read_config_from_files:52 Using cached configuration for ()
2018-02-04 15:58:38,409 DEBUG pyls.config.config:settings:87 Got user config from PyCodeStyleConfig: {}
2018-02-04 15:58:38,412 DEBUG pyls.config.config:settings:89 With user configuration: {}
2018-02-04 15:58:38,423 DEBUG pyls.config.config:settings:92 With plugin configuration: {'plugins': {'rope_completion': {'enabled': False}, 'pydocstyle': {'enabled': False}}}
2018-02-04 15:58:38,427 DEBUG pyls.config.config:settings:95 With lsp configuration: {'plugins': {'rope': {'create_folder': False}, 'rope_completion': {'enabled': False}, 'pycodestyle': {'enabled': False}, 'pydocstyle': {'ignore': ['D202', 'D208'], 'enabled': True}}}
2018-02-04 15:58:38,440 DEBUG pyls.config.source:read_config_from_files:52 Using cached configuration for ()
2018-02-04 15:58:38,447 DEBUG pyls.config.config:settings:100 Got project config from PyCodeStyleConfig: {}
2018-02-04 15:58:38,460 DEBUG pyls.config.config:settings:102 With project configuration: {'plugins': {'rope': {'create_folder': False}, 'rope_completion': {'enabled': False}, 'pycodestyle': {'enabled': False}, 'pydocstyle': {'ignore': ['D202', 'D208'], 'enabled': True}}}
2018-02-04 15:58:38,466 DEBUG pyls.plugins.mccabe_lint:pyls_lint:16 Running mccabe lint with threshold: 15
2018-02-04 15:58:38,508 DEBUG pyls.config.config:processmessage:137 finish pyls_lint --> [[{'source': 'pyflakes', 'range': {'start': {'line': 49, 'character': 19}, 'end': {'line': 49, 'character': 22}}, 'message': "undefined name 'tr'", 'severity': 2}], [{'source': 'pydocstyle', 'code': 'D100', 'message': 'D100: Missing docstring in public module', 'severity': 2, 'range': {'start': {'line': 0, 'character': 0}, 'end': {'line': 0, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D101', 'message': 'D101: Missing docstring in public class', 'severity': 2, 'range': {'start': {'line': 25, 'character': 0}, 'end': {'line': 25, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D101', 'message': 'D101: Missing docstring in public class', 'severity': 2, 'range': {'start': {'line': 31, 'character': 0}, 'end': {'line': 31, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D107', 'message': 'D107: Missing docstring in __init__', 'severity': 2, 'range': {'start': {'line': 33, 'character': 0}, 'end': {'line': 33, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D101', 'message': 'D101: Missing docstring in public class', 'severity': 2, 'range': {'start': {'line': 38, 'character': 0}, 'end': {'line': 38, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D107', 'message': 'D107: Missing docstring in __init__', 'severity': 2, 'range': {'start': {'line': 39, 'character': 0}, 'end': {'line': 39, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D102', 'message': 'D102: Missing docstring in public method', 'severity': 2, 'range': {'start': {'line': 43, 'character': 0}, 'end': {'line': 43, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D102', 'message': 'D102: Missing docstring in public method', 'severity': 2, 'range': {'start': {'line': 46, 'character': 0}, 'end': {'line': 46, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 53, 'character': 0}, 'end': {'line': 53, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 61, 'character': 0}, 'end': {'line': 61, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 75, 'character': 0}, 'end': {'line': 75, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 79, 'character': 0}, 'end': {'line': 79, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 83, 'character': 0}, 'end': {'line': 83, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 88, 'character': 0}, 'end': {'line': 88, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 93, 'character': 0}, 'end': {'line': 93, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 97, 'character': 0}, 'end': {'line': 97, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 101, 'character': 0}, 'end': {'line': 101, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 132, 'character': 0}, 'end': {'line': 132, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 136, 'character': 0}, 'end': {'line': 136, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 151, 'character': 0}, 'end': {'line': 151, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 165, 'character': 0}, 'end': {'line': 165, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 174, 'character': 0}, 'end': {'line': 174, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 192, 'character': 0}, 'end': {'line': 192, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 197, 'character': 0}, 'end': {'line': 197, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 211, 'character': 0}, 'end': {'line': 211, 'character': 15}}}], []] [hook]
2018-02-04 15:58:38,512 DEBUG pyls.server:notify:81 Sending notification textDocument/publishDiagnostics: {'uri': 'file:///F:/SublimeText/Data/Packages/LSP/plugin/core/clients.py', 'diagnostics': [{'source': 'pyflakes', 'range': {'start': {'line': 49, 'character': 19}, 'end': {'line': 49, 'character': 22}}, 'message': "undefined name 'tr'", 'severity': 2}, {'source': 'pydocstyle', 'code': 'D100', 'message': 'D100: Missing docstring in public module', 'severity': 2, 'range': {'start': {'line': 0, 'character': 0}, 'end': {'line': 0, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D101', 'message': 'D101: Missing docstring in public class', 'severity': 2, 'range': {'start': {'line': 25, 'character': 0}, 'end': {'line': 25, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D101', 'message': 'D101: Missing docstring in public class', 'severity': 2, 'range': {'start': {'line': 31, 'character': 0}, 'end': {'line': 31, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D107', 'message': 'D107: Missing docstring in __init__', 'severity': 2, 'range': {'start': {'line': 33, 'character': 0}, 'end': {'line': 33, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D101', 'message': 'D101: Missing docstring in public class', 'severity': 2, 'range': {'start': {'line': 38, 'character': 0}, 'end': {'line': 38, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D107', 'message': 'D107: Missing docstring in __init__', 'severity': 2, 'range': {'start': {'line': 39, 'character': 0}, 'end': {'line': 39, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D102', 'message': 'D102: Missing docstring in public method', 'severity': 2, 'range': {'start': {'line': 43, 'character': 0}, 'end': {'line': 43, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D102', 'message': 'D102: Missing docstring in public method', 'severity': 2, 'range': {'start': {'line': 46, 'character': 0}, 'end': {'line': 46, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 53, 'character': 0}, 'end': {'line': 53, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 61, 'character': 0}, 'end': {'line': 61, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 75, 'character': 0}, 'end': {'line': 75, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 79, 'character': 0}, 'end': {'line': 79, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 83, 'character': 0}, 'end': {'line': 83, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 88, 'character': 0}, 'end': {'line': 88, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 93, 'character': 0}, 'end': {'line': 93, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 97, 'character': 0}, 'end': {'line': 97, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 101, 'character': 0}, 'end': {'line': 101, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 132, 'character': 0}, 'end': {'line': 132, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 136, 'character': 0}, 'end': {'line': 136, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 151, 'character': 0}, 'end': {'line': 151, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 165, 'character': 0}, 'end': {'line': 165, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 174, 'character': 0}, 'end': {'line': 174, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 192, 'character': 0}, 'end': {'line': 192, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 197, 'character': 0}, 'end': {'line': 197, 'character': 15}}}, {'source': 'pydocstyle', 'code': 'D103', 'message': 'D103: Missing docstring in public function', 'severity': 2, 'range': {'start': {'line': 211, 'character': 0}, 'end': {'line': 211, 'character': 15}}}]}
```