11 Commits

Author SHA1 Message Date
b50471276f Added exception for incorrect answer 2025-11-07 15:52:51 +03:00
1d55e08c15 Fixed individual report 2025-11-07 15:28:16 +03:00
71596d9cec Bump version 2025-11-07 13:45:39 +03:00
71cd6ddfcd Small fix 2025-11-07 13:44:19 +03:00
d53c05df19 Updated docs and version 2025-11-07 13:13:10 +03:00
68921de31f Fixed reports response 2025-11-07 12:54:51 +03:00
de881f4d15 Added new methods, new version 2025-11-06 13:31:49 +03:00
4cc7d0ac7b Fixed search_global_company_profiles_id method
New response and fixed query parameter
2025-10-03 19:04:30 +03:00
1be43c827f New versioning, INN now is not requirement for FC 2025-09-30 11:17:14 +03:00
9a9ffda4ac Generated docs 2025-07-22 18:28:16 +03:00
f229c309c4 Updated foreign agents method 2025-07-22 18:04:09 +03:00
90 changed files with 9025 additions and 11 deletions

View File

@@ -38,6 +38,8 @@
.. autofunction:: kontur_focus.FocusCompliance.legal_entity_profile_report(profile_id_list, path) .. autofunction:: kontur_focus.FocusCompliance.legal_entity_profile_report(profile_id_list, path)
.. autofunction:: kontur_focus.FocusCompliance.full_company_report(model, path)
Пример вывода результат по отчету: Пример вывода результат по отчету:
.. code-block:: python .. code-block:: python
@@ -49,3 +51,5 @@
--------------- ---------------
.. autofunction:: kontur_focus.FocusCompliance.person_is_foreign_agent() .. autofunction:: kontur_focus.FocusCompliance.person_is_foreign_agent()
.. autofunction:: kontur_focus.FocusCompliance.full_individual_report(path, passport, fio)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

4
docs/out/html/.buildinfo Normal file
View File

@@ -0,0 +1,4 @@
# Sphinx build info version 1
# This file records the configuration used when building these files. When it is not found, a full rebuild will be done.
config: efdb4d1baf9a7408e2f9188275d85035
tags: 645f666f9bcd5a90fca523b33c5a78b7

View File

@@ -0,0 +1,4 @@
# Sphinx build info version 1
# This file records the configuration used when building these files. When it is not found, a full rebuild will be done.
config: 3a7299b0099bb3e771f87abcb181d65d
tags: 645f666f9bcd5a90fca523b33c5a78b7

View File

@@ -0,0 +1,105 @@
<!DOCTYPE html>
<html class="writer-html5" lang="ru" data-content_root="../">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Обзор: исходный код модуля &mdash; документация Kontur Focus Library 0.1.0</title>
<link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=b86133f3" />
<link rel="stylesheet" type="text/css" href="../_static/css/theme.css?v=e59714d7" />
<script src="../_static/jquery.js?v=5d32c60e"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
<script src="../_static/documentation_options.js?v=6ff560e8"></script>
<script src="../_static/doctools.js?v=9bcbadda"></script>
<script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="../_static/translations.js?v=cd1d70c9"></script>
<script src="../_static/js/theme.js"></script>
<link rel="index" title="Алфавитный указатель" href="../genindex.html" />
<link rel="search" title="Поиск" href="../search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../index.html" class="icon icon-home">
Kontur Focus Library
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../search.html" method="get">
<input type="text" name="q" placeholder="Поиск в документации" aria-label="Поиск в документации" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Меню навигации">
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../setup.html">Установка</a></li>
<li class="toctree-l1"><a class="reference internal" href="../focus.html">Фокус</a></li>
<li class="toctree-l1"><a class="reference internal" href="../focus-compliance.html">Фокус.Комплаенс</a></li>
<li class="toctree-l1"><a class="reference internal" href="../open-api.html">Open API specification</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Меню навигации для мобильных устройств" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../index.html">Kontur Focus Library</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="Навигация по страницам">
<ul class="wy-breadcrumbs">
<li><a href="../index.html" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item active">Обзор: исходный код модуля</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<h1>Все модули, в которых есть код</h1>
<ul><li><a href="kontur_focus/focus_compliance.html">kontur_focus.focus_compliance</a></li>
</ul>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>&#169; Авторские права 2025, Ilya Sapunov. </p>
</div>
Собрано при помощи <a href="https://www.sphinx-doc.org/">Sphinx</a> с использованием
<a href="https://github.com/readthedocs/sphinx_rtd_theme">темы,</a>
предоставленной <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

View File

@@ -0,0 +1,354 @@
<!DOCTYPE html>
<html class="writer-html5" lang="ru" data-content_root="../../">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>kontur_focus.focus_compliance &mdash; документация Kontur Focus Library 0.1.0</title>
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=b86133f3" />
<link rel="stylesheet" type="text/css" href="../../_static/css/theme.css?v=e59714d7" />
<script src="../../_static/jquery.js?v=5d32c60e"></script>
<script src="../../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
<script src="../../_static/documentation_options.js?v=6ff560e8"></script>
<script src="../../_static/doctools.js?v=9bcbadda"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="../../_static/translations.js?v=cd1d70c9"></script>
<script src="../../_static/js/theme.js"></script>
<link rel="index" title="Алфавитный указатель" href="../../genindex.html" />
<link rel="search" title="Поиск" href="../../search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../../index.html" class="icon icon-home">
Kontur Focus Library
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Поиск в документации" aria-label="Поиск в документации" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Меню навигации">
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../setup.html">Установка</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../focus.html">Фокус</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../focus-compliance.html">Фокус.Комплаенс</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../open-api.html">Open API specification</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Меню навигации для мобильных устройств" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../index.html">Kontur Focus Library</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="Навигация по страницам">
<ul class="wy-breadcrumbs">
<li><a href="../../index.html" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item"><a href="../index.html">Код модуля</a></li>
<li class="breadcrumb-item active">kontur_focus.focus_compliance</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<h1>Исходный код kontur_focus.focus_compliance</h1><div class="highlight"><pre>
<span></span><span class="kn">from</span><span class="w"> </span><span class="nn">kontur_focus.req</span><span class="w"> </span><span class="kn">import</span> <span class="n">Request</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">dotenv</span><span class="w"> </span><span class="kn">import</span> <span class="n">load_dotenv</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">os</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">datetime</span><span class="w"> </span><span class="kn">import</span> <span class="n">datetime</span>
<span class="k">class</span><span class="w"> </span><span class="nc">FocusCompliance</span><span class="p">(</span><span class="n">Request</span><span class="p">):</span>
<span class="n">_basedir</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="vm">__file__</span><span class="p">))</span>
<span class="n">_focus_base_url</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">check_models</span> <span class="o">=</span> <span class="p">[</span>
<span class="p">{</span>
<span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;corporate&#39;</span><span class="p">,</span>
<span class="s1">&#39;description&#39;</span><span class="p">:</span> <span class="s1">&#39;Корпоративный сегмент&#39;</span><span class="p">,</span>
<span class="s1">&#39;risk_model_id&#39;</span><span class="p">:</span> <span class="s1">&#39;a9457161-0454-448a-bc2c-83a89cd51b42&#39;</span>
<span class="p">},</span>
<span class="p">{</span>
<span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="s1">&#39;115-fz&#39;</span><span class="p">,</span>
<span class="s1">&#39;description&#39;</span><span class="p">:</span> <span class="s1">&#39;115 ФЗ для некредитных финансовых организаций&#39;</span><span class="p">,</span>
<span class="s1">&#39;risk_model_id&#39;</span><span class="p">:</span> <span class="s1">&#39;887ee87c-3a43-48d7-a4ad-05c0a64ff53a&#39;</span>
<span class="p">}</span>
<span class="p">]</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">inn</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> <span class="n">ogrn</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">):</span>
<span class="n">load_dotenv</span><span class="p">()</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span>
<span class="n">base_url</span><span class="o">=</span><span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;FOCUS_COMPLIANCE_BASE_URL&#39;</span><span class="p">),</span>
<span class="n">api_key</span><span class="o">=</span><span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;FOCUS_COMPLIANCE_ACCESS_KEY&#39;</span><span class="p">),</span>
<span class="n">inn</span><span class="o">=</span><span class="n">inn</span><span class="p">,</span>
<span class="n">ogrn</span><span class="o">=</span><span class="n">ogrn</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_focus_base_url</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;/banks/</span><span class="si">{</span><span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;FOCUS_COMPLIANCE_BANK_ID&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_save_file</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filename</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">content</span><span class="p">,</span> <span class="n">file_type</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s1">&#39;pdf&#39;</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
<span class="n">current_datetime</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">%d</span><span class="s1">-%m-%Y_%H-%M&#39;</span><span class="p">)</span>
<span class="n">f_name</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="n">filename</span><span class="si">}</span><span class="s1">_</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">inn</span><span class="si">}</span><span class="s1">_</span><span class="si">{</span><span class="n">current_datetime</span><span class="si">}</span><span class="s1">.</span><span class="si">{</span><span class="n">file_type</span><span class="si">}</span><span class="s1">&#39;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">path</span><span class="p">:</span>
<span class="n">file_path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_basedir</span><span class="p">,</span> <span class="n">f_name</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">file_path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">f_name</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">file_path</span><span class="p">,</span> <span class="n">mode</span><span class="o">=</span><span class="s1">&#39;wb&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">file</span><span class="p">:</span>
<span class="n">file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">content</span><span class="p">)</span>
<span class="k">return</span> <span class="p">{</span><span class="s1">&#39;success&#39;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span> <span class="s1">&#39;filename&#39;</span><span class="p">:</span> <span class="n">f_name</span><span class="p">,</span> <span class="s1">&#39;path&#39;</span><span class="p">:</span> <span class="n">file_path</span><span class="p">}</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">return</span> <span class="p">{</span><span class="s1">&#39;success&#39;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span> <span class="s1">&#39;message&#39;</span><span class="p">:</span> <span class="n">e</span><span class="p">}</span>
<span class="c1"># Компании</span>
<span class="k">def</span><span class="w"> </span><span class="nf">company_is_foreign_agent</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Вхождение организации и ее руководителей в список иностранных агентов</span>
<span class="sd"> :return: Дата формирования реестра, а также признаки присутствия или отсутствия в списках иностранных агентов</span>
<span class="sd"> :rtype: dict</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">_focus_base_url</span><span class="si">}</span><span class="s1">/companies/lists&#39;</span><span class="p">)</span>
<span class="n">foreign_agent_list</span> <span class="o">=</span> <span class="n">response</span><span class="p">[</span><span class="s1">&#39;foreignAgentList&#39;</span><span class="p">]</span>
<span class="n">company_in_list</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">persons_in_company_in_list</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">foreign_agent_list</span><span class="p">[</span><span class="s1">&#39;uls&#39;</span><span class="p">]:</span>
<span class="k">if</span> <span class="n">item</span><span class="p">[</span><span class="s1">&#39;listItemStatus&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;NotInList&#39;</span><span class="p">:</span>
<span class="k">continue</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">company_in_list</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
<span class="k">for</span> <span class="n">person</span> <span class="ow">in</span> <span class="n">foreign_agent_list</span><span class="p">[</span><span class="s1">&#39;fls&#39;</span><span class="p">]:</span>
<span class="k">if</span> <span class="n">person</span><span class="p">[</span><span class="s1">&#39;listItemStatus&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;NotInList&#39;</span><span class="p">:</span>
<span class="k">continue</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">persons_in_company_in_list</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">person</span><span class="p">)</span>
<span class="n">fal_data</span> <span class="o">=</span> <span class="p">{</span>
<span class="s1">&#39;list_date&#39;</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="n">foreign_agent_list</span><span class="p">[</span><span class="s1">&#39;actualListDate&#39;</span><span class="p">])</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;T&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">],</span>
<span class="s1">&#39;company_in_list&#39;</span><span class="p">:</span> <span class="kc">True</span> <span class="k">if</span> <span class="n">company_in_list</span> <span class="k">else</span> <span class="kc">False</span><span class="p">,</span>
<span class="s1">&#39;persons_in_company_in_list&#39;</span><span class="p">:</span> <span class="kc">True</span> <span class="k">if</span> <span class="n">persons_in_company_in_list</span> <span class="k">else</span> <span class="kc">False</span>
<span class="p">}</span>
<span class="k">return</span> <span class="n">fal_data</span>
<span class="k">def</span><span class="w"> </span><span class="nf">search_global_company_profiles_id</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">company_name</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">list</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Поиск сводной информации по санкционным профилям ЮЛ</span>
<span class="sd"> :param company_name: Наименование компании</span>
<span class="sd"> :type company_name: str</span>
<span class="sd"> :return: Список идентификаторов профилей</span>
<span class="sd"> :rtype: list</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">inn</span><span class="p">:</span>
<span class="n">query</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">inn</span>
<span class="k">elif</span> <span class="n">company_name</span><span class="p">:</span>
<span class="n">query</span> <span class="o">=</span> <span class="n">company_name</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="p">{</span><span class="s1">&#39;success&#39;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span> <span class="s1">&#39;result&#39;</span><span class="p">:</span> <span class="s1">&#39;Не указан ИНН или наименование контрагента&#39;</span><span class="p">}</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">_focus_base_url</span><span class="si">}</span><span class="s1">/companies/profiles/search&#39;</span><span class="p">,</span> <span class="n">query</span><span class="o">=</span><span class="n">query</span><span class="p">)</span>
<span class="n">profiles</span> <span class="o">=</span> <span class="n">response</span><span class="p">[</span><span class="s1">&#39;legalEntityProfiles&#39;</span><span class="p">]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">profiles</span><span class="p">:</span>
<span class="k">return</span> <span class="p">{</span><span class="s1">&#39;success&#39;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span> <span class="s1">&#39;result&#39;</span><span class="p">:</span> <span class="n">profiles</span><span class="p">}</span>
<span class="k">elif</span> <span class="nb">len</span><span class="p">(</span><span class="n">profiles</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="k">return</span> <span class="p">{</span><span class="s1">&#39;success&#39;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span> <span class="s1">&#39;result&#39;</span><span class="p">:</span> <span class="p">[</span><span class="n">profile</span><span class="p">[</span><span class="s1">&#39;id&#39;</span><span class="p">]</span> <span class="k">for</span> <span class="n">profile</span> <span class="ow">in</span> <span class="n">profiles</span><span class="p">]}</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="p">{</span><span class="s1">&#39;success&#39;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span> <span class="s1">&#39;result&#39;</span><span class="p">:</span> <span class="p">[</span><span class="n">profiles</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s1">&#39;id&#39;</span><span class="p">]]}</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="k">return</span> <span class="p">{</span><span class="s1">&#39;success&#39;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span> <span class="s1">&#39;result&#39;</span><span class="p">:</span> <span class="s1">&#39;Key Error&#39;</span><span class="p">}</span>
<span class="k">def</span><span class="w"> </span><span class="nf">legal_entity_profile_report</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">profile_id_list</span><span class="p">:</span> <span class="nb">list</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Получение печатного отчета по профилю ЮЛ</span>
<span class="sd"> :param profile_id_list: Список идентификаторов санкционных профилей компании </span>
<span class="sd"> :type profile_id_list: list</span>
<span class="sd"> :param path: Путь сохранения файла, по-умолчанию файл сохраняется в текущий каталог</span>
<span class="sd"> :type path: str, optional</span>
<span class="sd"> :return: Отчет о результате сохранения файла</span>
<span class="sd"> :rtype: dict</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">profile_id_list</span><span class="p">:</span>
<span class="k">return</span> <span class="p">{</span><span class="s1">&#39;success&#39;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span> <span class="s1">&#39;message&#39;</span><span class="p">:</span> <span class="s1">&#39;No profiles is specified&#39;</span><span class="p">}</span>
<span class="k">elif</span> <span class="nb">len</span><span class="p">(</span><span class="n">profile_id_list</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">files</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">profile_id</span> <span class="ow">in</span> <span class="n">profile_id_list</span><span class="p">:</span>
<span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">_focus_base_url</span><span class="si">}</span><span class="s1">/companies/profiles/</span><span class="si">{</span><span class="n">profile_id</span><span class="si">}</span><span class="s1">/report&#39;</span><span class="p">)</span>
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_save_file</span><span class="p">(</span>
<span class="n">filename</span><span class="o">=</span><span class="sa">f</span><span class="s1">&#39;Отчет_по_профилю_</span><span class="si">{</span><span class="n">profile_id_list</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">,</span>
<span class="n">content</span><span class="o">=</span><span class="n">response</span><span class="o">.</span><span class="n">content</span><span class="p">,</span>
<span class="n">file_type</span><span class="o">=</span><span class="s1">&#39;docx&#39;</span><span class="p">,</span>
<span class="n">path</span><span class="o">=</span><span class="n">path</span>
<span class="p">)</span>
<span class="n">files</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
<span class="k">return</span> <span class="p">{</span><span class="s1">&#39;success&#39;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span> <span class="s1">&#39;files&#39;</span><span class="p">:</span> <span class="n">files</span><span class="p">}</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">_focus_base_url</span><span class="si">}</span><span class="s1">/companies/profiles/</span><span class="si">{</span><span class="n">profile_id_list</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="si">}</span><span class="s1">/report&#39;</span><span class="p">)</span>
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_save_file</span><span class="p">(</span>
<span class="n">filename</span><span class="o">=</span><span class="sa">f</span><span class="s1">&#39;Отчет_по_профилю_</span><span class="si">{</span><span class="n">profile_id_list</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">,</span>
<span class="n">content</span><span class="o">=</span><span class="n">response</span><span class="o">.</span><span class="n">content</span><span class="p">,</span>
<span class="n">file_type</span><span class="o">=</span><span class="s1">&#39;docx&#39;</span><span class="p">,</span>
<span class="n">path</span><span class="o">=</span><span class="n">path</span>
<span class="p">)</span>
<span class="k">return</span> <span class="p">{</span><span class="s1">&#39;success&#39;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span> <span class="s1">&#39;files&#39;</span><span class="p">:</span> <span class="p">[</span><span class="n">result</span><span class="p">]}</span>
<span class="k">def</span><span class="w"> </span><span class="nf">full_company_report</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s1">&#39;115-fz&#39;</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Запрос на полную проверку и построение печатного отчёта по организации</span>
<span class="sd"> :param model: Идентификатор модели, по которой пройдет проверка. </span>
<span class="sd"> Идентификатор возвращается в методе «Получение списка рисковых моделей организации»</span>
<span class="sd"> GET /banks/{bankId}/models, defaults to &#39;115-fz&#39;</span>
<span class="sd"> :type model: str, optional</span>
<span class="sd"> :param path: Путь сохранения файла, по-умолчанию файл сохраняется в текущий каталог, defaults to None</span>
<span class="sd"> :type path: str, optional</span>
<span class="sd"> :return: Отчет о результате сохранения файла</span>
<span class="sd"> :rtype: dict</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">model</span> <span class="o">==</span> <span class="s1">&#39;115-fz&#39;</span><span class="p">:</span>
<span class="n">model_id</span> <span class="o">=</span> <span class="p">[</span><span class="n">d</span><span class="p">[</span><span class="s1">&#39;risk_model_id&#39;</span><span class="p">]</span> <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">check_models</span> <span class="k">if</span> <span class="n">d</span><span class="p">[</span><span class="s1">&#39;name&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="n">model</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">model_id</span> <span class="o">=</span> <span class="p">[</span><span class="n">d</span><span class="p">[</span><span class="s1">&#39;risk_model_id&#39;</span><span class="p">]</span> <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">check_models</span> <span class="k">if</span> <span class="n">d</span><span class="p">[</span><span class="s1">&#39;name&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;corporate&#39;</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
<span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">_focus_base_url</span><span class="si">}</span><span class="s1">/models/</span><span class="si">{</span><span class="n">model_id</span><span class="si">}</span><span class="s1">/fullCompanyReport&#39;</span><span class="p">)</span>
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_save_file</span><span class="p">(</span>
<span class="n">filename</span><span class="o">=</span><span class="s1">&#39;Полный_отчет&#39;</span><span class="p">,</span>
<span class="n">content</span><span class="o">=</span><span class="n">response</span><span class="o">.</span><span class="n">content</span><span class="p">,</span>
<span class="n">file_type</span><span class="o">=</span><span class="s1">&#39;docx&#39;</span><span class="p">,</span>
<span class="n">path</span><span class="o">=</span><span class="n">path</span>
<span class="p">)</span>
<span class="k">return</span> <span class="p">{</span><span class="s1">&#39;success&#39;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span> <span class="s1">&#39;file&#39;</span><span class="p">:</span> <span class="n">result</span><span class="p">}</span>
<span class="c1"># Физлица</span>
<span class="k">def</span><span class="w"> </span><span class="nf">person_is_foreign_agent</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Вхождение физлица в список иностранных агентов</span>
<span class="sd"> :return: True или False</span>
<span class="sd"> :rtype: bool</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">_focus_base_url</span><span class="si">}</span><span class="s1">/individuals&#39;</span><span class="p">)</span>
<span class="n">fa</span> <span class="o">=</span> <span class="n">response</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s1">&#39;foreignAgents&#39;</span><span class="p">]</span>
<span class="k">return</span> <span class="kc">True</span> <span class="k">if</span> <span class="n">fa</span> <span class="k">else</span> <span class="kc">False</span>
<span class="k">def</span><span class="w"> </span><span class="nf">search_global_person_profiles_id</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">list</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Поиск сводной информации по санкционным/ПДЛ профилям ФЛ</span>
<span class="sd"> :return: Список идентификаторов профилей</span>
<span class="sd"> :rtype: list</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">_focus_base_url</span><span class="si">}</span><span class="s1">/individuals/profiles/search&#39;</span><span class="p">,</span> <span class="n">query</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">inn</span><span class="p">)</span>
<span class="k">return</span> <span class="n">response</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">def</span><span class="w"> </span><span class="nf">full_individual_report</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> <span class="n">passport</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> <span class="n">fio</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Запрос на построение печатного отчёта по физ лицу</span>
<span class="sd"> Необходимо обязательно указать либо ИНН, либо ФИО и номер паспорта</span>
<span class="sd"> :param path: Путь сохранения файла, по-умолчанию файл сохраняется в текущий каталог, defaults to None</span>
<span class="sd"> :type path: str, optional</span>
<span class="sd"> :param passport: Номер паспорты, defaults to None</span>
<span class="sd"> :type passport: str, optional</span>
<span class="sd"> :param fio: ФИО (хотя бы фамилия и имя), defaults to None</span>
<span class="sd"> :type fio: str, optional</span>
<span class="sd"> :return: Отчет о результате сохранения файла</span>
<span class="sd"> :rtype: dict</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">inn</span><span class="p">:</span>
<span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">_focus_base_url</span><span class="si">}</span><span class="s1">/formFullIndividualReport&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">inn</span> <span class="ow">and</span> <span class="n">passport</span> <span class="ow">and</span> <span class="n">fio</span><span class="p">:</span>
<span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">_focus_base_url</span><span class="si">}</span><span class="s1">/formFullIndividualReport&#39;</span><span class="p">,</span> <span class="n">passportNumber</span><span class="o">=</span><span class="n">passport</span><span class="p">,</span> <span class="n">fio</span><span class="o">=</span><span class="n">fio</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="p">{</span><span class="s1">&#39;success&#39;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span> <span class="s1">&#39;result&#39;</span><span class="p">:</span> <span class="s1">&#39;Необходимо указать: либо ИНН, либо ФИО (хотя бы фамилию и имя) и паспорт&#39;</span><span class="p">}</span>
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_save_file</span><span class="p">(</span>
<span class="n">filename</span><span class="o">=</span><span class="s1">&#39;Полный_отчет&#39;</span><span class="p">,</span>
<span class="n">content</span><span class="o">=</span><span class="n">response</span><span class="o">.</span><span class="n">content</span><span class="p">,</span>
<span class="n">file_type</span><span class="o">=</span><span class="s1">&#39;docx&#39;</span><span class="p">,</span>
<span class="n">path</span><span class="o">=</span><span class="n">path</span>
<span class="p">)</span>
<span class="k">return</span> <span class="p">{</span><span class="s1">&#39;success&#39;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span> <span class="s1">&#39;file&#39;</span><span class="p">:</span> <span class="n">result</span><span class="p">}</span>
<span class="c1"># Иноагенты</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_foreign_agents_list</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fa_type</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">list</span><span class="p">:</span> <span class="c1"># Не работает, если нет подключенной лицензии</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Получение списка иноагентов</span>
<span class="sd"> :param fa_type: Тип иноагента (i - физ. лица, l - юридические лица), если не указано, выгружаются все типы, defaults to None</span>
<span class="sd"> :type fa_type: str, optional</span>
<span class="sd"> :return: Список данных по иноагентам</span>
<span class="sd"> :rtype: list</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">_focus_base_url</span><span class="si">}</span><span class="s1">/foreign-agents&#39;</span><span class="p">)</span>
<span class="n">result</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="n">fa_type</span> <span class="o">==</span> <span class="s1">&#39;i&#39;</span><span class="p">:</span>
<span class="n">individuals</span> <span class="o">=</span> <span class="n">response</span><span class="p">[</span><span class="s1">&#39;individuals&#39;</span><span class="p">]</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">individuals</span>
<span class="k">elif</span> <span class="n">fa_type</span> <span class="o">==</span> <span class="s1">&#39;l&#39;</span><span class="p">:</span>
<span class="n">legal_entities</span> <span class="o">=</span> <span class="n">response</span><span class="p">[</span><span class="s1">&#39;legalEntities&#39;</span><span class="p">]</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">legal_entities</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">result</span> <span class="o">=</span> <span class="p">[</span><span class="n">response</span><span class="p">]</span>
<span class="k">return</span> <span class="n">result</span>
</pre></div>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>&#169; Авторские права 2025, Ilya Sapunov. </p>
</div>
Собрано при помощи <a href="https://www.sphinx-doc.org/">Sphinx</a> с использованием
<a href="https://github.com/readthedocs/sphinx_rtd_theme">темы,</a>
предоставленной <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

View File

@@ -0,0 +1,55 @@
===============
Фокус.Комплаенс
===============
Подготовка
----------
Создайте файл `.env` или добавьте в существующий параметры:
- `FOCUS_COMPLIANCE_BASE_URL=<kontur_url>`
- `FOCUS_COMPLIANCE_ACCESS_KEY=<your_access_key>`
Где `kontur_url` - адрес REST API Контур.Фокус. Например, `https://kyc.kontur.ru/api`.
А `FOCUS_ACCESS_KEY` - секретный ключ доступа к REST API Контур.Фокус.
Инициализация
-------------
.. code-block:: python
from kontur_focus import FocusCompliance
fc = FocusCompliance(inn='<inn_string>', ogrn='<ogrn_string>')
Обязательный параметр - **ИНН**.
Основные методы
---------------
Юридические лица
----------------
.. autofunction:: kontur_focus.FocusCompliance.company_is_foreign_agent()
.. autofunction:: kontur_focus.FocusCompliance.search_global_company_profiles_id()
.. autofunction:: kontur_focus.FocusCompliance.legal_entity_profile_report(profile_id_list, path)
.. autofunction:: kontur_focus.FocusCompliance.full_company_report(model, path)
Пример вывода результат по отчету:
.. code-block:: python
[{'success': True, 'filename': '<имя_файла>', 'path': '<полный_путь_файла>'}]
Физические лица
---------------
.. autofunction:: kontur_focus.FocusCompliance.person_is_foreign_agent()
.. autofunction:: kontur_focus.FocusCompliance.full_individual_report(path, passport, fio)

View File

@@ -0,0 +1,63 @@
=====
Фокус
=====
Подготовка
----------
Создайте файл `.env` или добавьте в существующий параметры:
- `FOCUS_BASE_URL=<kontur_url>`
- `FOCUS_ACCESS_KEY=<your_access_key>`
Где `kontur_url` - адрес REST API Контур.Фокус. Например, `https://focus-api.kontur.ru/api3`.
А `FOCUS_ACCESS_KEY` - секретный ключ доступа к REST API Контур.Фокус.
Инициализация
-------------
.. code-block:: python
from kontur_focus import Focus
focus = Focus(inn='<inn_string>', ogrn='<ogrn_string>')
Обязательный параметр - **ИНН**.
Основные методы
---------------
Пример использования методов:
.. code-block:: python
focus.base_info()
Юридические лица
----------------
.. autofunction:: kontur_focus.Focus.base_info()
.. autofunction:: kontur_focus.Focus.advanced_info()
.. autofunction:: kontur_focus.Focus.excerpt(path)
Пример вывода результат по отчету:
.. code-block:: python
{'success': True, 'filename': '<имя_файла>', 'path': '<полный_путь_файла>'}
.. autofunction:: kontur_focus.Focus.express_report(pdf, path)
Пример вывода результат по отчету:
.. code-block:: python
{'success': True, 'filename': '<имя_файла>', 'path': '<полный_путь_файла>'}
.. autofunction:: kontur_focus.Focus.founders_history()
.. autofunction:: kontur_focus.Focus.foreign_representatives()

View File

@@ -0,0 +1,18 @@
.. Kontur Focus Library documentation master file, created by
sphinx-quickstart on Mon Mar 10 17:54:03 2025.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
Kontur Focus Library documentation
==================================
Библиотека-обертка для взаимодействия с REST API Контур.Фокус и Фокус.Комплаенс.
.. toctree::
:maxdepth: 2
:caption: Contents:
setup
focus
focus-compliance
open-api

View File

@@ -0,0 +1,5 @@
======================
Open API specification
======================
.. openapi:: focus.yml

View File

@@ -0,0 +1,30 @@
=========
Установка
=========
Для установки необходимо иметь доступ в корпоративный `Gitlab <https://git.selectel.org>`_, чтобы получить доступ к Registry PyPi.
Установка через pip
-------------------
Выполните ``pip install kontur-focus --index-url https://__token__:<your_personal_token>@git.selectel.org/api/v4/projects/6350/packages/pypi/simple``
Где `<your_personal_token>` - `персональный токен <https://git.selectel.org/help/user/profile/personal_access_tokens>`_ доступа Gitlab.
Использование requirements.txt
------------------------------
Перед использованием необходимо настроить Registry.
Создайте файл `.pypirc` в папке пользователя и добавьте параметры репозитория:
.. code-block:: console
[gitlab]
repository = https://git.selectel.org/api/v4/projects/6350/packages/pypi
username = __token__
password = <your personal access token>
Более подробно `тут <https://git.selectel.org/help/user/packages/pypi_repository/index>`_.
После выполните ``pip install -r requirements.txt``

View File

@@ -0,0 +1,123 @@
/* Compatability shim for jQuery and underscores.js.
*
* Copyright Sphinx contributors
* Released under the two clause BSD licence
*/
/**
* small helper function to urldecode strings
*
* See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL
*/
jQuery.urldecode = function(x) {
if (!x) {
return x
}
return decodeURIComponent(x.replace(/\+/g, ' '));
};
/**
* small helper function to urlencode strings
*/
jQuery.urlencode = encodeURIComponent;
/**
* This function returns the parsed url parameters of the
* current request. Multiple values per key are supported,
* it will always return arrays of strings for the value parts.
*/
jQuery.getQueryParameters = function(s) {
if (typeof s === 'undefined')
s = document.location.search;
var parts = s.substr(s.indexOf('?') + 1).split('&');
var result = {};
for (var i = 0; i < parts.length; i++) {
var tmp = parts[i].split('=', 2);
var key = jQuery.urldecode(tmp[0]);
var value = jQuery.urldecode(tmp[1]);
if (key in result)
result[key].push(value);
else
result[key] = [value];
}
return result;
};
/**
* highlight a given string on a jquery object by wrapping it in
* span elements with the given class name.
*/
jQuery.fn.highlightText = function(text, className) {
function highlight(node, addItems) {
if (node.nodeType === 3) {
var val = node.nodeValue;
var pos = val.toLowerCase().indexOf(text);
if (pos >= 0 &&
!jQuery(node.parentNode).hasClass(className) &&
!jQuery(node.parentNode).hasClass("nohighlight")) {
var span;
var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg");
if (isInSVG) {
span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
} else {
span = document.createElement("span");
span.className = className;
}
span.appendChild(document.createTextNode(val.substr(pos, text.length)));
node.parentNode.insertBefore(span, node.parentNode.insertBefore(
document.createTextNode(val.substr(pos + text.length)),
node.nextSibling));
node.nodeValue = val.substr(0, pos);
if (isInSVG) {
var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
var bbox = node.parentElement.getBBox();
rect.x.baseVal.value = bbox.x;
rect.y.baseVal.value = bbox.y;
rect.width.baseVal.value = bbox.width;
rect.height.baseVal.value = bbox.height;
rect.setAttribute('class', className);
addItems.push({
"parent": node.parentNode,
"target": rect});
}
}
}
else if (!jQuery(node).is("button, select, textarea")) {
jQuery.each(node.childNodes, function() {
highlight(this, addItems);
});
}
}
var addItems = [];
var result = this.each(function() {
highlight(this, addItems);
});
for (var i = 0; i < addItems.length; ++i) {
jQuery(addItems[i].parent).before(addItems[i].target);
}
return result;
};
/*
* backward compatibility for jQuery.browser
* This will be supported until firefox bug is fixed.
*/
if (!jQuery.browser) {
jQuery.uaMatch = function(ua) {
ua = ua.toLowerCase();
var match = /(chrome)[ \/]([\w.]+)/.exec(ua) ||
/(webkit)[ \/]([\w.]+)/.exec(ua) ||
/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) ||
/(msie) ([\w.]+)/.exec(ua) ||
ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) ||
[];
return {
browser: match[ 1 ] || "",
version: match[ 2 ] || "0"
};
};
jQuery.browser = {};
jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true;
}

View File

@@ -0,0 +1,294 @@
/**@constructor*/
BaseStemmer = function() {
this.setCurrent = function(value) {
this.current = value;
this.cursor = 0;
this.limit = this.current.length;
this.limit_backward = 0;
this.bra = this.cursor;
this.ket = this.limit;
};
this.getCurrent = function() {
return this.current;
};
this.copy_from = function(other) {
this.current = other.current;
this.cursor = other.cursor;
this.limit = other.limit;
this.limit_backward = other.limit_backward;
this.bra = other.bra;
this.ket = other.ket;
};
this.in_grouping = function(s, min, max) {
if (this.cursor >= this.limit) return false;
var ch = this.current.charCodeAt(this.cursor);
if (ch > max || ch < min) return false;
ch -= min;
if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) == 0) return false;
this.cursor++;
return true;
};
this.in_grouping_b = function(s, min, max) {
if (this.cursor <= this.limit_backward) return false;
var ch = this.current.charCodeAt(this.cursor - 1);
if (ch > max || ch < min) return false;
ch -= min;
if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) == 0) return false;
this.cursor--;
return true;
};
this.out_grouping = function(s, min, max) {
if (this.cursor >= this.limit) return false;
var ch = this.current.charCodeAt(this.cursor);
if (ch > max || ch < min) {
this.cursor++;
return true;
}
ch -= min;
if ((s[ch >>> 3] & (0X1 << (ch & 0x7))) == 0) {
this.cursor++;
return true;
}
return false;
};
this.out_grouping_b = function(s, min, max) {
if (this.cursor <= this.limit_backward) return false;
var ch = this.current.charCodeAt(this.cursor - 1);
if (ch > max || ch < min) {
this.cursor--;
return true;
}
ch -= min;
if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) == 0) {
this.cursor--;
return true;
}
return false;
};
this.eq_s = function(s)
{
if (this.limit - this.cursor < s.length) return false;
if (this.current.slice(this.cursor, this.cursor + s.length) != s)
{
return false;
}
this.cursor += s.length;
return true;
};
this.eq_s_b = function(s)
{
if (this.cursor - this.limit_backward < s.length) return false;
if (this.current.slice(this.cursor - s.length, this.cursor) != s)
{
return false;
}
this.cursor -= s.length;
return true;
};
/** @return {number} */ this.find_among = function(v)
{
var i = 0;
var j = v.length;
var c = this.cursor;
var l = this.limit;
var common_i = 0;
var common_j = 0;
var first_key_inspected = false;
while (true)
{
var k = i + ((j - i) >>> 1);
var diff = 0;
var common = common_i < common_j ? common_i : common_j; // smaller
// w[0]: string, w[1]: substring_i, w[2]: result, w[3]: function (optional)
var w = v[k];
var i2;
for (i2 = common; i2 < w[0].length; i2++)
{
if (c + common == l)
{
diff = -1;
break;
}
diff = this.current.charCodeAt(c + common) - w[0].charCodeAt(i2);
if (diff != 0) break;
common++;
}
if (diff < 0)
{
j = k;
common_j = common;
}
else
{
i = k;
common_i = common;
}
if (j - i <= 1)
{
if (i > 0) break; // v->s has been inspected
if (j == i) break; // only one item in v
// - but now we need to go round once more to get
// v->s inspected. This looks messy, but is actually
// the optimal approach.
if (first_key_inspected) break;
first_key_inspected = true;
}
}
do {
var w = v[i];
if (common_i >= w[0].length)
{
this.cursor = c + w[0].length;
if (w.length < 4) return w[2];
var res = w[3](this);
this.cursor = c + w[0].length;
if (res) return w[2];
}
i = w[1];
} while (i >= 0);
return 0;
};
// find_among_b is for backwards processing. Same comments apply
this.find_among_b = function(v)
{
var i = 0;
var j = v.length
var c = this.cursor;
var lb = this.limit_backward;
var common_i = 0;
var common_j = 0;
var first_key_inspected = false;
while (true)
{
var k = i + ((j - i) >> 1);
var diff = 0;
var common = common_i < common_j ? common_i : common_j;
var w = v[k];
var i2;
for (i2 = w[0].length - 1 - common; i2 >= 0; i2--)
{
if (c - common == lb)
{
diff = -1;
break;
}
diff = this.current.charCodeAt(c - 1 - common) - w[0].charCodeAt(i2);
if (diff != 0) break;
common++;
}
if (diff < 0)
{
j = k;
common_j = common;
}
else
{
i = k;
common_i = common;
}
if (j - i <= 1)
{
if (i > 0) break;
if (j == i) break;
if (first_key_inspected) break;
first_key_inspected = true;
}
}
do {
var w = v[i];
if (common_i >= w[0].length)
{
this.cursor = c - w[0].length;
if (w.length < 4) return w[2];
var res = w[3](this);
this.cursor = c - w[0].length;
if (res) return w[2];
}
i = w[1];
} while (i >= 0);
return 0;
};
/* to replace chars between c_bra and c_ket in this.current by the
* chars in s.
*/
this.replace_s = function(c_bra, c_ket, s)
{
var adjustment = s.length - (c_ket - c_bra);
this.current = this.current.slice(0, c_bra) + s + this.current.slice(c_ket);
this.limit += adjustment;
if (this.cursor >= c_ket) this.cursor += adjustment;
else if (this.cursor > c_bra) this.cursor = c_bra;
return adjustment;
};
this.slice_check = function()
{
if (this.bra < 0 ||
this.bra > this.ket ||
this.ket > this.limit ||
this.limit > this.current.length)
{
return false;
}
return true;
};
this.slice_from = function(s)
{
var result = false;
if (this.slice_check())
{
this.replace_s(this.bra, this.ket, s);
result = true;
}
return result;
};
this.slice_del = function()
{
return this.slice_from("");
};
this.insert = function(c_bra, c_ket, s)
{
var adjustment = this.replace_s(c_bra, c_ket, s);
if (c_bra <= this.bra) this.bra += adjustment;
if (c_bra <= this.ket) this.ket += adjustment;
};
this.slice_to = function()
{
var result = '';
if (this.slice_check())
{
result = this.current.slice(this.bra, this.ket);
}
return result;
};
this.assign_to = function()
{
return this.current.slice(0, this.limit);
};
};

View File

@@ -0,0 +1,906 @@
/*
* Sphinx stylesheet -- basic theme.
*/
/* -- main layout ----------------------------------------------------------- */
div.clearer {
clear: both;
}
div.section::after {
display: block;
content: '';
clear: left;
}
/* -- relbar ---------------------------------------------------------------- */
div.related {
width: 100%;
font-size: 90%;
}
div.related h3 {
display: none;
}
div.related ul {
margin: 0;
padding: 0 0 0 10px;
list-style: none;
}
div.related li {
display: inline;
}
div.related li.right {
float: right;
margin-right: 5px;
}
/* -- sidebar --------------------------------------------------------------- */
div.sphinxsidebarwrapper {
padding: 10px 5px 0 10px;
}
div.sphinxsidebar {
float: left;
width: 230px;
margin-left: -100%;
font-size: 90%;
word-wrap: break-word;
overflow-wrap : break-word;
}
div.sphinxsidebar ul {
list-style: none;
}
div.sphinxsidebar ul ul,
div.sphinxsidebar ul.want-points {
margin-left: 20px;
list-style: square;
}
div.sphinxsidebar ul ul {
margin-top: 0;
margin-bottom: 0;
}
div.sphinxsidebar form {
margin-top: 10px;
}
div.sphinxsidebar input {
border: 1px solid #98dbcc;
font-family: sans-serif;
font-size: 1em;
}
div.sphinxsidebar #searchbox form.search {
overflow: hidden;
}
div.sphinxsidebar #searchbox input[type="text"] {
float: left;
width: 80%;
padding: 0.25em;
box-sizing: border-box;
}
div.sphinxsidebar #searchbox input[type="submit"] {
float: left;
width: 20%;
border-left: none;
padding: 0.25em;
box-sizing: border-box;
}
img {
border: 0;
max-width: 100%;
}
/* -- search page ----------------------------------------------------------- */
ul.search {
margin-top: 10px;
}
ul.search li {
padding: 5px 0;
}
ul.search li a {
font-weight: bold;
}
ul.search li p.context {
color: #888;
margin: 2px 0 0 30px;
text-align: left;
}
ul.keywordmatches li.goodmatch a {
font-weight: bold;
}
/* -- index page ------------------------------------------------------------ */
table.contentstable {
width: 90%;
margin-left: auto;
margin-right: auto;
}
table.contentstable p.biglink {
line-height: 150%;
}
a.biglink {
font-size: 1.3em;
}
span.linkdescr {
font-style: italic;
padding-top: 5px;
font-size: 90%;
}
/* -- general index --------------------------------------------------------- */
table.indextable {
width: 100%;
}
table.indextable td {
text-align: left;
vertical-align: top;
}
table.indextable ul {
margin-top: 0;
margin-bottom: 0;
list-style-type: none;
}
table.indextable > tbody > tr > td > ul {
padding-left: 0em;
}
table.indextable tr.pcap {
height: 10px;
}
table.indextable tr.cap {
margin-top: 10px;
background-color: #f2f2f2;
}
img.toggler {
margin-right: 3px;
margin-top: 3px;
cursor: pointer;
}
div.modindex-jumpbox {
border-top: 1px solid #ddd;
border-bottom: 1px solid #ddd;
margin: 1em 0 1em 0;
padding: 0.4em;
}
div.genindex-jumpbox {
border-top: 1px solid #ddd;
border-bottom: 1px solid #ddd;
margin: 1em 0 1em 0;
padding: 0.4em;
}
/* -- domain module index --------------------------------------------------- */
table.modindextable td {
padding: 2px;
border-collapse: collapse;
}
/* -- general body styles --------------------------------------------------- */
div.body {
min-width: 360px;
max-width: 800px;
}
div.body p, div.body dd, div.body li, div.body blockquote {
-moz-hyphens: auto;
-ms-hyphens: auto;
-webkit-hyphens: auto;
hyphens: auto;
}
a.headerlink {
visibility: hidden;
}
a:visited {
color: #551A8B;
}
h1:hover > a.headerlink,
h2:hover > a.headerlink,
h3:hover > a.headerlink,
h4:hover > a.headerlink,
h5:hover > a.headerlink,
h6:hover > a.headerlink,
dt:hover > a.headerlink,
caption:hover > a.headerlink,
p.caption:hover > a.headerlink,
div.code-block-caption:hover > a.headerlink {
visibility: visible;
}
div.body p.caption {
text-align: inherit;
}
div.body td {
text-align: left;
}
.first {
margin-top: 0 !important;
}
p.rubric {
margin-top: 30px;
font-weight: bold;
}
img.align-left, figure.align-left, .figure.align-left, object.align-left {
clear: left;
float: left;
margin-right: 1em;
}
img.align-right, figure.align-right, .figure.align-right, object.align-right {
clear: right;
float: right;
margin-left: 1em;
}
img.align-center, figure.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
img.align-default, figure.align-default, .figure.align-default {
display: block;
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left;
}
.align-center {
text-align: center;
}
.align-default {
text-align: center;
}
.align-right {
text-align: right;
}
/* -- sidebars -------------------------------------------------------------- */
div.sidebar,
aside.sidebar {
margin: 0 0 0.5em 1em;
border: 1px solid #ddb;
padding: 7px;
background-color: #ffe;
width: 40%;
float: right;
clear: right;
overflow-x: auto;
}
p.sidebar-title {
font-weight: bold;
}
nav.contents,
aside.topic,
div.admonition, div.topic, blockquote {
clear: left;
}
/* -- topics ---------------------------------------------------------------- */
nav.contents,
aside.topic,
div.topic {
border: 1px solid #ccc;
padding: 7px;
margin: 10px 0 10px 0;
}
p.topic-title {
font-size: 1.1em;
font-weight: bold;
margin-top: 10px;
}
/* -- admonitions ----------------------------------------------------------- */
div.admonition {
margin-top: 10px;
margin-bottom: 10px;
padding: 7px;
}
div.admonition dt {
font-weight: bold;
}
p.admonition-title {
margin: 0px 10px 5px 0px;
font-weight: bold;
}
div.body p.centered {
text-align: center;
margin-top: 25px;
}
/* -- content of sidebars/topics/admonitions -------------------------------- */
div.sidebar > :last-child,
aside.sidebar > :last-child,
nav.contents > :last-child,
aside.topic > :last-child,
div.topic > :last-child,
div.admonition > :last-child {
margin-bottom: 0;
}
div.sidebar::after,
aside.sidebar::after,
nav.contents::after,
aside.topic::after,
div.topic::after,
div.admonition::after,
blockquote::after {
display: block;
content: '';
clear: both;
}
/* -- tables ---------------------------------------------------------------- */
table.docutils {
margin-top: 10px;
margin-bottom: 10px;
border: 0;
border-collapse: collapse;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
table.align-default {
margin-left: auto;
margin-right: auto;
}
table caption span.caption-number {
font-style: italic;
}
table caption span.caption-text {
}
table.docutils td, table.docutils th {
padding: 1px 8px 1px 5px;
border-top: 0;
border-left: 0;
border-right: 0;
border-bottom: 1px solid #aaa;
}
th {
text-align: left;
padding-right: 5px;
}
table.citation {
border-left: solid 1px gray;
margin-left: 1px;
}
table.citation td {
border-bottom: none;
}
th > :first-child,
td > :first-child {
margin-top: 0px;
}
th > :last-child,
td > :last-child {
margin-bottom: 0px;
}
/* -- figures --------------------------------------------------------------- */
div.figure, figure {
margin: 0.5em;
padding: 0.5em;
}
div.figure p.caption, figcaption {
padding: 0.3em;
}
div.figure p.caption span.caption-number,
figcaption span.caption-number {
font-style: italic;
}
div.figure p.caption span.caption-text,
figcaption span.caption-text {
}
/* -- field list styles ----------------------------------------------------- */
table.field-list td, table.field-list th {
border: 0 !important;
}
.field-list ul {
margin: 0;
padding-left: 1em;
}
.field-list p {
margin: 0;
}
.field-name {
-moz-hyphens: manual;
-ms-hyphens: manual;
-webkit-hyphens: manual;
hyphens: manual;
}
/* -- hlist styles ---------------------------------------------------------- */
table.hlist {
margin: 1em 0;
}
table.hlist td {
vertical-align: top;
}
/* -- object description styles --------------------------------------------- */
.sig {
font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
}
.sig-name, code.descname {
background-color: transparent;
font-weight: bold;
}
.sig-name {
font-size: 1.1em;
}
code.descname {
font-size: 1.2em;
}
.sig-prename, code.descclassname {
background-color: transparent;
}
.optional {
font-size: 1.3em;
}
.sig-paren {
font-size: larger;
}
.sig-param.n {
font-style: italic;
}
/* C++ specific styling */
.sig-inline.c-texpr,
.sig-inline.cpp-texpr {
font-family: unset;
}
.sig.c .k, .sig.c .kt,
.sig.cpp .k, .sig.cpp .kt {
color: #0033B3;
}
.sig.c .m,
.sig.cpp .m {
color: #1750EB;
}
.sig.c .s, .sig.c .sc,
.sig.cpp .s, .sig.cpp .sc {
color: #067D17;
}
/* -- other body styles ----------------------------------------------------- */
ol.arabic {
list-style: decimal;
}
ol.loweralpha {
list-style: lower-alpha;
}
ol.upperalpha {
list-style: upper-alpha;
}
ol.lowerroman {
list-style: lower-roman;
}
ol.upperroman {
list-style: upper-roman;
}
:not(li) > ol > li:first-child > :first-child,
:not(li) > ul > li:first-child > :first-child {
margin-top: 0px;
}
:not(li) > ol > li:last-child > :last-child,
:not(li) > ul > li:last-child > :last-child {
margin-bottom: 0px;
}
ol.simple ol p,
ol.simple ul p,
ul.simple ol p,
ul.simple ul p {
margin-top: 0;
}
ol.simple > li:not(:first-child) > p,
ul.simple > li:not(:first-child) > p {
margin-top: 0;
}
ol.simple p,
ul.simple p {
margin-bottom: 0;
}
aside.footnote > span,
div.citation > span {
float: left;
}
aside.footnote > span:last-of-type,
div.citation > span:last-of-type {
padding-right: 0.5em;
}
aside.footnote > p {
margin-left: 2em;
}
div.citation > p {
margin-left: 4em;
}
aside.footnote > p:last-of-type,
div.citation > p:last-of-type {
margin-bottom: 0em;
}
aside.footnote > p:last-of-type:after,
div.citation > p:last-of-type:after {
content: "";
clear: both;
}
dl.field-list {
display: grid;
grid-template-columns: fit-content(30%) auto;
}
dl.field-list > dt {
font-weight: bold;
word-break: break-word;
padding-left: 0.5em;
padding-right: 5px;
}
dl.field-list > dd {
padding-left: 0.5em;
margin-top: 0em;
margin-left: 0em;
margin-bottom: 0em;
}
dl {
margin-bottom: 15px;
}
dd > :first-child {
margin-top: 0px;
}
dd ul, dd table {
margin-bottom: 10px;
}
dd {
margin-top: 3px;
margin-bottom: 10px;
margin-left: 30px;
}
.sig dd {
margin-top: 0px;
margin-bottom: 0px;
}
.sig dl {
margin-top: 0px;
margin-bottom: 0px;
}
dl > dd:last-child,
dl > dd:last-child > :last-child {
margin-bottom: 0;
}
dt:target, span.highlighted {
background-color: #fbe54e;
}
rect.highlighted {
fill: #fbe54e;
}
dl.glossary dt {
font-weight: bold;
font-size: 1.1em;
}
.versionmodified {
font-style: italic;
}
.system-message {
background-color: #fda;
padding: 5px;
border: 3px solid red;
}
.footnote:target {
background-color: #ffa;
}
.line-block {
display: block;
margin-top: 1em;
margin-bottom: 1em;
}
.line-block .line-block {
margin-top: 0;
margin-bottom: 0;
margin-left: 1.5em;
}
.guilabel, .menuselection {
font-family: sans-serif;
}
.accelerator {
text-decoration: underline;
}
.classifier {
font-style: oblique;
}
.classifier:before {
font-style: normal;
margin: 0 0.5em;
content: ":";
display: inline-block;
}
abbr, acronym {
border-bottom: dotted 1px;
cursor: help;
}
/* -- code displays --------------------------------------------------------- */
pre {
overflow: auto;
overflow-y: hidden; /* fixes display issues on Chrome browsers */
}
pre, div[class*="highlight-"] {
clear: both;
}
span.pre {
-moz-hyphens: none;
-ms-hyphens: none;
-webkit-hyphens: none;
hyphens: none;
white-space: nowrap;
}
div[class*="highlight-"] {
margin: 1em 0;
}
td.linenos pre {
border: 0;
background-color: transparent;
color: #aaa;
}
table.highlighttable {
display: block;
}
table.highlighttable tbody {
display: block;
}
table.highlighttable tr {
display: flex;
}
table.highlighttable td {
margin: 0;
padding: 0;
}
table.highlighttable td.linenos {
padding-right: 0.5em;
}
table.highlighttable td.code {
flex: 1;
overflow: hidden;
}
.highlight .hll {
display: block;
}
div.highlight pre,
table.highlighttable pre {
margin: 0;
}
div.code-block-caption + div {
margin-top: 0;
}
div.code-block-caption {
margin-top: 1em;
padding: 2px 5px;
font-size: small;
}
div.code-block-caption code {
background-color: transparent;
}
table.highlighttable td.linenos,
span.linenos,
div.highlight span.gp { /* gp: Generic.Prompt */
user-select: none;
-webkit-user-select: text; /* Safari fallback only */
-webkit-user-select: none; /* Chrome/Safari */
-moz-user-select: none; /* Firefox */
-ms-user-select: none; /* IE10+ */
}
div.code-block-caption span.caption-number {
padding: 0.1em 0.3em;
font-style: italic;
}
div.code-block-caption span.caption-text {
}
div.literal-block-wrapper {
margin: 1em 0;
}
code.xref, a code {
background-color: transparent;
font-weight: bold;
}
h1 code, h2 code, h3 code, h4 code, h5 code, h6 code {
background-color: transparent;
}
.viewcode-link {
float: right;
}
.viewcode-back {
float: right;
font-family: sans-serif;
}
div.viewcode-block:target {
margin: -1px -10px;
padding: 0 10px;
}
/* -- math display ---------------------------------------------------------- */
img.math {
vertical-align: middle;
}
div.body div.math p {
text-align: center;
}
span.eqno {
float: right;
}
span.eqno a.headerlink {
position: absolute;
z-index: 1;
}
div.math:hover a.headerlink {
visibility: visible;
}
/* -- printout stylesheet --------------------------------------------------- */
@media print {
div.document,
div.documentwrapper,
div.bodywrapper {
margin: 0 !important;
width: 100%;
}
div.sphinxsidebar,
div.related,
div.footer,
#top-link {
display: none;
}
}

View File

@@ -0,0 +1 @@
.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px}

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 434 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,149 @@
/*
* Base JavaScript utilities for all Sphinx HTML documentation.
*/
"use strict";
const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([
"TEXTAREA",
"INPUT",
"SELECT",
"BUTTON",
]);
const _ready = (callback) => {
if (document.readyState !== "loading") {
callback();
} else {
document.addEventListener("DOMContentLoaded", callback);
}
};
/**
* Small JavaScript module for the documentation.
*/
const Documentation = {
init: () => {
Documentation.initDomainIndexTable();
Documentation.initOnKeyListeners();
},
/**
* i18n support
*/
TRANSLATIONS: {},
PLURAL_EXPR: (n) => (n === 1 ? 0 : 1),
LOCALE: "unknown",
// gettext and ngettext don't access this so that the functions
// can safely bound to a different name (_ = Documentation.gettext)
gettext: (string) => {
const translated = Documentation.TRANSLATIONS[string];
switch (typeof translated) {
case "undefined":
return string; // no translation
case "string":
return translated; // translation exists
default:
return translated[0]; // (singular, plural) translation tuple exists
}
},
ngettext: (singular, plural, n) => {
const translated = Documentation.TRANSLATIONS[singular];
if (typeof translated !== "undefined")
return translated[Documentation.PLURAL_EXPR(n)];
return n === 1 ? singular : plural;
},
addTranslations: (catalog) => {
Object.assign(Documentation.TRANSLATIONS, catalog.messages);
Documentation.PLURAL_EXPR = new Function(
"n",
`return (${catalog.plural_expr})`
);
Documentation.LOCALE = catalog.locale;
},
/**
* helper function to focus on search bar
*/
focusSearchBar: () => {
document.querySelectorAll("input[name=q]")[0]?.focus();
},
/**
* Initialise the domain index toggle buttons
*/
initDomainIndexTable: () => {
const toggler = (el) => {
const idNumber = el.id.substr(7);
const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`);
if (el.src.substr(-9) === "minus.png") {
el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`;
toggledRows.forEach((el) => (el.style.display = "none"));
} else {
el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`;
toggledRows.forEach((el) => (el.style.display = ""));
}
};
const togglerElements = document.querySelectorAll("img.toggler");
togglerElements.forEach((el) =>
el.addEventListener("click", (event) => toggler(event.currentTarget))
);
togglerElements.forEach((el) => (el.style.display = ""));
if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler);
},
initOnKeyListeners: () => {
// only install a listener if it is really needed
if (
!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS &&
!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS
)
return;
document.addEventListener("keydown", (event) => {
// bail for input elements
if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return;
// bail with special keys
if (event.altKey || event.ctrlKey || event.metaKey) return;
if (!event.shiftKey) {
switch (event.key) {
case "ArrowLeft":
if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break;
const prevLink = document.querySelector('link[rel="prev"]');
if (prevLink && prevLink.href) {
window.location.href = prevLink.href;
event.preventDefault();
}
break;
case "ArrowRight":
if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break;
const nextLink = document.querySelector('link[rel="next"]');
if (nextLink && nextLink.href) {
window.location.href = nextLink.href;
event.preventDefault();
}
break;
}
}
// some keyboard layouts may need Shift to get /
switch (event.key) {
case "/":
if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break;
Documentation.focusSearchBar();
event.preventDefault();
}
});
},
};
// quick alias for translations
const _ = Documentation.gettext;
_ready(Documentation.init);

View File

@@ -0,0 +1,13 @@
const DOCUMENTATION_OPTIONS = {
VERSION: '0.1.0',
LANGUAGE: 'ru',
COLLAPSE_INDEX: false,
BUILDER: 'html',
FILE_SUFFIX: '.html',
LINK_SUFFIX: '.html',
HAS_SOURCE: true,
SOURCELINK_SUFFIX: '.txt',
NAVIGATION_WITH_KEYS: false,
SHOW_SEARCH_SUMMARY: true,
ENABLE_SEARCH_SHORTCUTS: true,
};

Binary file not shown.

After

Width:  |  Height:  |  Size: 286 B

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

2
docs/out/html/_static/jquery.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
!function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=4)}({4:function(e,t,r){}});

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,228 @@
const themeFlyoutDisplay = "hidden";
const themeVersionSelector = true;
const themeLanguageSelector = true;
if (themeFlyoutDisplay === "attached") {
function renderLanguages(config) {
if (!config.projects.translations.length) {
return "";
}
// Insert the current language to the options on the selector
let languages = config.projects.translations.concat(config.projects.current);
languages = languages.sort((a, b) => a.language.name.localeCompare(b.language.name));
const languagesHTML = `
<dl>
<dt>Languages</dt>
${languages
.map(
(translation) => `
<dd ${translation.slug == config.projects.current.slug ? 'class="rtd-current-item"' : ""}>
<a href="${translation.urls.documentation}">${translation.language.code}</a>
</dd>
`,
)
.join("\n")}
</dl>
`;
return languagesHTML;
}
function renderVersions(config) {
if (!config.versions.active.length) {
return "";
}
const versionsHTML = `
<dl>
<dt>Версии</dt>
${config.versions.active
.map(
(version) => `
<dd ${version.slug === config.versions.current.slug ? 'class="rtd-current-item"' : ""}>
<a href="${version.urls.documentation}">${version.slug}</a>
</dd>
`,
)
.join("\n")}
</dl>
`;
return versionsHTML;
}
function renderDownloads(config) {
if (!Object.keys(config.versions.current.downloads).length) {
return "";
}
const downloadsNameDisplay = {
pdf: "PDF",
epub: "Epub",
htmlzip: "HTML",
};
const downloadsHTML = `
<dl>
<dt>Загрузки</dt>
${Object.entries(config.versions.current.downloads)
.map(
([name, url]) => `
<dd>
<a href="${url}">${downloadsNameDisplay[name]}</a>
</dd>
`,
)
.join("\n")}
</dl>
`;
return downloadsHTML;
}
document.addEventListener("readthedocs-addons-data-ready", function (event) {
const config = event.detail.data();
const flyout = `
<div class="rst-versions" data-toggle="rst-versions" role="note">
<span class="rst-current-version" data-toggle="rst-current-version">
<span class="fa fa-book"> Read the Docs</span>
v: ${config.versions.current.slug}
<span class="fa fa-caret-down"></span>
</span>
<div class="rst-other-versions">
<div class="injected">
${renderLanguages(config)}
${renderVersions(config)}
${renderDownloads(config)}
<dl>
<dt>На Read the Docs</dt>
<dd>
<a href="${config.projects.current.urls.home}">Домашняя страница проекта</a>
</dd>
<dd>
<a href="${config.projects.current.urls.builds}">Сборки</a>
</dd>
<dd>
<a href="${config.projects.current.urls.downloads}">Загрузки</a>
</dd>
</dl>
<dl>
<dt>Поиск</dt>
<dd>
<form id="flyout-search-form">
<input
class="wy-form"
type="text"
name="q"
aria-label="Поиск в документации"
placeholder="Поиск в документации"
/>
</form>
</dd>
</dl>
<hr />
<small>
<span>Hosted by <a href="https://about.readthedocs.org/?utm_source=&utm_content=flyout">Read the Docs</a></span>
</small>
</div>
</div>
`;
// Inject the generated flyout into the body HTML element.
document.body.insertAdjacentHTML("beforeend", flyout);
// Trigger the Read the Docs Addons Search modal when clicking on the "Search docs" input from inside the flyout.
document
.querySelector("#flyout-search-form")
.addEventListener("focusin", () => {
const event = new CustomEvent("readthedocs-search-show");
document.dispatchEvent(event);
});
})
}
if (themeLanguageSelector || themeVersionSelector) {
function onSelectorSwitch(event) {
const option = event.target.selectedIndex;
const item = event.target.options[option];
window.location.href = item.dataset.url;
}
document.addEventListener("readthedocs-addons-data-ready", function (event) {
const config = event.detail.data();
const versionSwitch = document.querySelector(
"div.switch-menus > div.version-switch",
);
if (themeVersionSelector) {
let versions = config.versions.active;
if (config.versions.current.hidden || config.versions.current.type === "external") {
versions.unshift(config.versions.current);
}
const versionSelect = `
<select>
${versions
.map(
(version) => `
<option
value="${version.slug}"
${config.versions.current.slug === version.slug ? 'selected="selected"' : ""}
data-url="${version.urls.documentation}">
${version.slug}
</option>`,
)
.join("\n")}
</select>
`;
versionSwitch.innerHTML = versionSelect;
versionSwitch.firstElementChild.addEventListener("change", onSelectorSwitch);
}
const languageSwitch = document.querySelector(
"div.switch-menus > div.language-switch",
);
if (themeLanguageSelector) {
if (config.projects.translations.length) {
// Add the current language to the options on the selector
let languages = config.projects.translations.concat(
config.projects.current,
);
languages = languages.sort((a, b) =>
a.language.name.localeCompare(b.language.name),
);
const languageSelect = `
<select>
${languages
.map(
(language) => `
<option
value="${language.language.code}"
${config.projects.current.slug === language.slug ? 'selected="selected"' : ""}
data-url="${language.urls.documentation}">
${language.language.name}
</option>`,
)
.join("\n")}
</select>
`;
languageSwitch.innerHTML = languageSelect;
languageSwitch.firstElementChild.addEventListener("change", onSelectorSwitch);
}
else {
languageSwitch.remove();
}
}
});
}
document.addEventListener("readthedocs-addons-data-ready", function (event) {
// Trigger the Read the Docs Addons Search modal when clicking on "Search docs" input from the topnav.
document
.querySelector("[role='search'] input")
.addEventListener("focusin", () => {
const event = new CustomEvent("readthedocs-search-show");
document.dispatchEvent(event);
});
});

View File

@@ -0,0 +1,930 @@
/*
* This script contains the language-specific data used by searchtools.js,
* namely the list of stopwords, stemmer, scorer and splitter.
*/
var stopwords = ["\u0430", "\u0431\u0435\u0437", "\u0431\u043e\u043b\u0435\u0435", "\u0431\u043e\u043b\u044c\u0448\u0435", "\u0431\u0443\u0434\u0435\u0442", "\u0431\u0443\u0434\u0442\u043e", "\u0431\u044b", "\u0431\u044b\u043b", "\u0431\u044b\u043b\u0430", "\u0431\u044b\u043b\u0438", "\u0431\u044b\u043b\u043e", "\u0431\u044b\u0442\u044c", "\u0432", "\u0432\u0430\u043c", "\u0432\u0430\u0441", "\u0432\u0434\u0440\u0443\u0433", "\u0432\u0435\u0434\u044c", "\u0432\u043e", "\u0432\u043e\u0442", "\u0432\u043f\u0440\u043e\u0447\u0435\u043c", "\u0432\u0441\u0435", "\u0432\u0441\u0435\u0433\u0434\u0430", "\u0432\u0441\u0435\u0433\u043e", "\u0432\u0441\u0435\u0445", "\u0432\u0441\u044e", "\u0432\u044b", "\u0433\u0434\u0435", "\u0433\u043e\u0432\u043e\u0440\u0438\u043b", "\u0434\u0430", "\u0434\u0430\u0436\u0435", "\u0434\u0432\u0430", "\u0434\u043b\u044f", "\u0434\u043e", "\u0434\u0440\u0443\u0433\u043e\u0439", "\u0435\u0433\u043e", "\u0435\u0435", "\u0435\u0439", "\u0435\u043c\u0443", "\u0435\u0441\u043b\u0438", "\u0435\u0441\u0442\u044c", "\u0435\u0449\u0435", "\u0436", "\u0436\u0435", "\u0436\u0438\u0437\u043d\u044c", "\u0437\u0430", "\u0437\u0430\u0447\u0435\u043c", "\u0437\u0434\u0435\u0441\u044c", "\u0438", "\u0438\u0437", "\u0438\u043b\u0438", "\u0438\u043c", "\u0438\u043d\u043e\u0433\u0434\u0430", "\u0438\u0445", "\u043a", "\u043a\u0430\u0436\u0435\u0442\u0441\u044f", "\u043a\u0430\u043a", "\u043a\u0430\u043a\u0430\u044f", "\u043a\u0430\u043a\u043e\u0439", "\u043a\u043e\u0433\u0434\u0430", "\u043a\u043e\u043d\u0435\u0447\u043d\u043e", "\u043a\u0442\u043e", "\u043a\u0443\u0434\u0430", "\u043b\u0438", "\u043b\u0443\u0447\u0448\u0435", "\u043c\u0435\u0436\u0434\u0443", "\u043c\u0435\u043d\u044f", "\u043c\u043d\u0435", "\u043c\u043d\u043e\u0433\u043e", "\u043c\u043e\u0436\u0435\u0442", "\u043c\u043e\u0436\u043d\u043e", "\u043c\u043e\u0439", "\u043c\u043e\u044f", "\u043c\u044b", "\u043d\u0430", "\u043d\u0430\u0434", "\u043d\u0430\u0434\u043e", "\u043d\u0430\u043a\u043e\u043d\u0435\u0446", "\u043d\u0430\u0441", "\u043d\u0435", "\u043d\u0435\u0433\u043e", "\u043d\u0435\u0435", "\u043d\u0435\u0439", "\u043d\u0435\u043b\u044c\u0437\u044f", "\u043d\u0435\u0442", "\u043d\u0438", "\u043d\u0438\u0431\u0443\u0434\u044c", "\u043d\u0438\u043a\u043e\u0433\u0434\u0430", "\u043d\u0438\u043c", "\u043d\u0438\u0445", "\u043d\u0438\u0447\u0435\u0433\u043e", "\u043d\u043e", "\u043d\u0443", "\u043e", "\u043e\u0431", "\u043e\u0434\u0438\u043d", "\u043e\u043d", "\u043e\u043d\u0430", "\u043e\u043d\u0438", "\u043e\u043f\u044f\u0442\u044c", "\u043e\u0442", "\u043f\u0435\u0440\u0435\u0434", "\u043f\u043e", "\u043f\u043e\u0434", "\u043f\u043e\u0441\u043b\u0435", "\u043f\u043e\u0442\u043e\u043c", "\u043f\u043e\u0442\u043e\u043c\u0443", "\u043f\u043e\u0447\u0442\u0438", "\u043f\u0440\u0438", "\u043f\u0440\u043e", "\u0440\u0430\u0437", "\u0440\u0430\u0437\u0432\u0435", "\u0441", "\u0441\u0430\u043c", "\u0441\u0432\u043e\u044e", "\u0441\u0435\u0431\u0435", "\u0441\u0435\u0431\u044f", "\u0441\u0435\u0433\u043e\u0434\u043d\u044f", "\u0441\u0435\u0439\u0447\u0430\u0441", "\u0441\u043a\u0430\u0437\u0430\u043b", "\u0441\u043a\u0430\u0437\u0430\u043b\u0430", "\u0441\u043a\u0430\u0437\u0430\u0442\u044c", "\u0441\u043e", "\u0441\u043e\u0432\u0441\u0435\u043c", "\u0442\u0430\u043a", "\u0442\u0430\u043a\u043e\u0439", "\u0442\u0430\u043c", "\u0442\u0435\u0431\u044f", "\u0442\u0435\u043c", "\u0442\u0435\u043f\u0435\u0440\u044c", "\u0442\u043e", "\u0442\u043e\u0433\u0434\u0430", "\u0442\u043e\u0433\u043e", "\u0442\u043e\u0436\u0435", "\u0442\u043e\u043b\u044c\u043a\u043e", "\u0442\u043e\u043c", "\u0442\u043e\u0442", "\u0442\u0440\u0438", "\u0442\u0443\u0442", "\u0442\u044b", "\u0443", "\u0443\u0436", "\u0443\u0436\u0435", "\u0445\u043e\u0440\u043e\u0448\u043e", "\u0445\u043e\u0442\u044c", "\u0447\u0435\u0433\u043e", "\u0447\u0435\u043b\u043e\u0432\u0435\u043a", "\u0447\u0435\u043c", "\u0447\u0435\u0440\u0435\u0437", "\u0447\u0442\u043e", "\u0447\u0442\u043e\u0431", "\u0447\u0442\u043e\u0431\u044b", "\u0447\u0443\u0442\u044c", "\u044d\u0442\u0438", "\u044d\u0442\u043e\u0433\u043e", "\u044d\u0442\u043e\u0439", "\u044d\u0442\u043e\u043c", "\u044d\u0442\u043e\u0442", "\u044d\u0442\u0443", "\u044f"];
/* Non-minified version is copied as a separate JS file, if available */
/**@constructor*/
BaseStemmer = function() {
this.setCurrent = function(value) {
this.current = value;
this.cursor = 0;
this.limit = this.current.length;
this.limit_backward = 0;
this.bra = this.cursor;
this.ket = this.limit;
};
this.getCurrent = function() {
return this.current;
};
this.copy_from = function(other) {
this.current = other.current;
this.cursor = other.cursor;
this.limit = other.limit;
this.limit_backward = other.limit_backward;
this.bra = other.bra;
this.ket = other.ket;
};
this.in_grouping = function(s, min, max) {
if (this.cursor >= this.limit) return false;
var ch = this.current.charCodeAt(this.cursor);
if (ch > max || ch < min) return false;
ch -= min;
if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) == 0) return false;
this.cursor++;
return true;
};
this.in_grouping_b = function(s, min, max) {
if (this.cursor <= this.limit_backward) return false;
var ch = this.current.charCodeAt(this.cursor - 1);
if (ch > max || ch < min) return false;
ch -= min;
if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) == 0) return false;
this.cursor--;
return true;
};
this.out_grouping = function(s, min, max) {
if (this.cursor >= this.limit) return false;
var ch = this.current.charCodeAt(this.cursor);
if (ch > max || ch < min) {
this.cursor++;
return true;
}
ch -= min;
if ((s[ch >>> 3] & (0X1 << (ch & 0x7))) == 0) {
this.cursor++;
return true;
}
return false;
};
this.out_grouping_b = function(s, min, max) {
if (this.cursor <= this.limit_backward) return false;
var ch = this.current.charCodeAt(this.cursor - 1);
if (ch > max || ch < min) {
this.cursor--;
return true;
}
ch -= min;
if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) == 0) {
this.cursor--;
return true;
}
return false;
};
this.eq_s = function(s)
{
if (this.limit - this.cursor < s.length) return false;
if (this.current.slice(this.cursor, this.cursor + s.length) != s)
{
return false;
}
this.cursor += s.length;
return true;
};
this.eq_s_b = function(s)
{
if (this.cursor - this.limit_backward < s.length) return false;
if (this.current.slice(this.cursor - s.length, this.cursor) != s)
{
return false;
}
this.cursor -= s.length;
return true;
};
/** @return {number} */ this.find_among = function(v)
{
var i = 0;
var j = v.length;
var c = this.cursor;
var l = this.limit;
var common_i = 0;
var common_j = 0;
var first_key_inspected = false;
while (true)
{
var k = i + ((j - i) >>> 1);
var diff = 0;
var common = common_i < common_j ? common_i : common_j; // smaller
// w[0]: string, w[1]: substring_i, w[2]: result, w[3]: function (optional)
var w = v[k];
var i2;
for (i2 = common; i2 < w[0].length; i2++)
{
if (c + common == l)
{
diff = -1;
break;
}
diff = this.current.charCodeAt(c + common) - w[0].charCodeAt(i2);
if (diff != 0) break;
common++;
}
if (diff < 0)
{
j = k;
common_j = common;
}
else
{
i = k;
common_i = common;
}
if (j - i <= 1)
{
if (i > 0) break; // v->s has been inspected
if (j == i) break; // only one item in v
// - but now we need to go round once more to get
// v->s inspected. This looks messy, but is actually
// the optimal approach.
if (first_key_inspected) break;
first_key_inspected = true;
}
}
do {
var w = v[i];
if (common_i >= w[0].length)
{
this.cursor = c + w[0].length;
if (w.length < 4) return w[2];
var res = w[3](this);
this.cursor = c + w[0].length;
if (res) return w[2];
}
i = w[1];
} while (i >= 0);
return 0;
};
// find_among_b is for backwards processing. Same comments apply
this.find_among_b = function(v)
{
var i = 0;
var j = v.length
var c = this.cursor;
var lb = this.limit_backward;
var common_i = 0;
var common_j = 0;
var first_key_inspected = false;
while (true)
{
var k = i + ((j - i) >> 1);
var diff = 0;
var common = common_i < common_j ? common_i : common_j;
var w = v[k];
var i2;
for (i2 = w[0].length - 1 - common; i2 >= 0; i2--)
{
if (c - common == lb)
{
diff = -1;
break;
}
diff = this.current.charCodeAt(c - 1 - common) - w[0].charCodeAt(i2);
if (diff != 0) break;
common++;
}
if (diff < 0)
{
j = k;
common_j = common;
}
else
{
i = k;
common_i = common;
}
if (j - i <= 1)
{
if (i > 0) break;
if (j == i) break;
if (first_key_inspected) break;
first_key_inspected = true;
}
}
do {
var w = v[i];
if (common_i >= w[0].length)
{
this.cursor = c - w[0].length;
if (w.length < 4) return w[2];
var res = w[3](this);
this.cursor = c - w[0].length;
if (res) return w[2];
}
i = w[1];
} while (i >= 0);
return 0;
};
/* to replace chars between c_bra and c_ket in this.current by the
* chars in s.
*/
this.replace_s = function(c_bra, c_ket, s)
{
var adjustment = s.length - (c_ket - c_bra);
this.current = this.current.slice(0, c_bra) + s + this.current.slice(c_ket);
this.limit += adjustment;
if (this.cursor >= c_ket) this.cursor += adjustment;
else if (this.cursor > c_bra) this.cursor = c_bra;
return adjustment;
};
this.slice_check = function()
{
if (this.bra < 0 ||
this.bra > this.ket ||
this.ket > this.limit ||
this.limit > this.current.length)
{
return false;
}
return true;
};
this.slice_from = function(s)
{
var result = false;
if (this.slice_check())
{
this.replace_s(this.bra, this.ket, s);
result = true;
}
return result;
};
this.slice_del = function()
{
return this.slice_from("");
};
this.insert = function(c_bra, c_ket, s)
{
var adjustment = this.replace_s(c_bra, c_ket, s);
if (c_bra <= this.bra) this.bra += adjustment;
if (c_bra <= this.ket) this.ket += adjustment;
};
this.slice_to = function()
{
var result = '';
if (this.slice_check())
{
result = this.current.slice(this.bra, this.ket);
}
return result;
};
this.assign_to = function()
{
return this.current.slice(0, this.limit);
};
};
// Generated by Snowball 2.1.0 - https://snowballstem.org/
/**@constructor*/
RussianStemmer = function() {
var base = new BaseStemmer();
/** @const */ var a_0 = [
["\u0432", -1, 1],
["\u0438\u0432", 0, 2],
["\u044B\u0432", 0, 2],
["\u0432\u0448\u0438", -1, 1],
["\u0438\u0432\u0448\u0438", 3, 2],
["\u044B\u0432\u0448\u0438", 3, 2],
["\u0432\u0448\u0438\u0441\u044C", -1, 1],
["\u0438\u0432\u0448\u0438\u0441\u044C", 6, 2],
["\u044B\u0432\u0448\u0438\u0441\u044C", 6, 2]
];
/** @const */ var a_1 = [
["\u0435\u0435", -1, 1],
["\u0438\u0435", -1, 1],
["\u043E\u0435", -1, 1],
["\u044B\u0435", -1, 1],
["\u0438\u043C\u0438", -1, 1],
["\u044B\u043C\u0438", -1, 1],
["\u0435\u0439", -1, 1],
["\u0438\u0439", -1, 1],
["\u043E\u0439", -1, 1],
["\u044B\u0439", -1, 1],
["\u0435\u043C", -1, 1],
["\u0438\u043C", -1, 1],
["\u043E\u043C", -1, 1],
["\u044B\u043C", -1, 1],
["\u0435\u0433\u043E", -1, 1],
["\u043E\u0433\u043E", -1, 1],
["\u0435\u043C\u0443", -1, 1],
["\u043E\u043C\u0443", -1, 1],
["\u0438\u0445", -1, 1],
["\u044B\u0445", -1, 1],
["\u0435\u044E", -1, 1],
["\u043E\u044E", -1, 1],
["\u0443\u044E", -1, 1],
["\u044E\u044E", -1, 1],
["\u0430\u044F", -1, 1],
["\u044F\u044F", -1, 1]
];
/** @const */ var a_2 = [
["\u0435\u043C", -1, 1],
["\u043D\u043D", -1, 1],
["\u0432\u0448", -1, 1],
["\u0438\u0432\u0448", 2, 2],
["\u044B\u0432\u0448", 2, 2],
["\u0449", -1, 1],
["\u044E\u0449", 5, 1],
["\u0443\u044E\u0449", 6, 2]
];
/** @const */ var a_3 = [
["\u0441\u044C", -1, 1],
["\u0441\u044F", -1, 1]
];
/** @const */ var a_4 = [
["\u043B\u0430", -1, 1],
["\u0438\u043B\u0430", 0, 2],
["\u044B\u043B\u0430", 0, 2],
["\u043D\u0430", -1, 1],
["\u0435\u043D\u0430", 3, 2],
["\u0435\u0442\u0435", -1, 1],
["\u0438\u0442\u0435", -1, 2],
["\u0439\u0442\u0435", -1, 1],
["\u0435\u0439\u0442\u0435", 7, 2],
["\u0443\u0439\u0442\u0435", 7, 2],
["\u043B\u0438", -1, 1],
["\u0438\u043B\u0438", 10, 2],
["\u044B\u043B\u0438", 10, 2],
["\u0439", -1, 1],
["\u0435\u0439", 13, 2],
["\u0443\u0439", 13, 2],
["\u043B", -1, 1],
["\u0438\u043B", 16, 2],
["\u044B\u043B", 16, 2],
["\u0435\u043C", -1, 1],
["\u0438\u043C", -1, 2],
["\u044B\u043C", -1, 2],
["\u043D", -1, 1],
["\u0435\u043D", 22, 2],
["\u043B\u043E", -1, 1],
["\u0438\u043B\u043E", 24, 2],
["\u044B\u043B\u043E", 24, 2],
["\u043D\u043E", -1, 1],
["\u0435\u043D\u043E", 27, 2],
["\u043D\u043D\u043E", 27, 1],
["\u0435\u0442", -1, 1],
["\u0443\u0435\u0442", 30, 2],
["\u0438\u0442", -1, 2],
["\u044B\u0442", -1, 2],
["\u044E\u0442", -1, 1],
["\u0443\u044E\u0442", 34, 2],
["\u044F\u0442", -1, 2],
["\u043D\u044B", -1, 1],
["\u0435\u043D\u044B", 37, 2],
["\u0442\u044C", -1, 1],
["\u0438\u0442\u044C", 39, 2],
["\u044B\u0442\u044C", 39, 2],
["\u0435\u0448\u044C", -1, 1],
["\u0438\u0448\u044C", -1, 2],
["\u044E", -1, 2],
["\u0443\u044E", 44, 2]
];
/** @const */ var a_5 = [
["\u0430", -1, 1],
["\u0435\u0432", -1, 1],
["\u043E\u0432", -1, 1],
["\u0435", -1, 1],
["\u0438\u0435", 3, 1],
["\u044C\u0435", 3, 1],
["\u0438", -1, 1],
["\u0435\u0438", 6, 1],
["\u0438\u0438", 6, 1],
["\u0430\u043C\u0438", 6, 1],
["\u044F\u043C\u0438", 6, 1],
["\u0438\u044F\u043C\u0438", 10, 1],
["\u0439", -1, 1],
["\u0435\u0439", 12, 1],
["\u0438\u0435\u0439", 13, 1],
["\u0438\u0439", 12, 1],
["\u043E\u0439", 12, 1],
["\u0430\u043C", -1, 1],
["\u0435\u043C", -1, 1],
["\u0438\u0435\u043C", 18, 1],
["\u043E\u043C", -1, 1],
["\u044F\u043C", -1, 1],
["\u0438\u044F\u043C", 21, 1],
["\u043E", -1, 1],
["\u0443", -1, 1],
["\u0430\u0445", -1, 1],
["\u044F\u0445", -1, 1],
["\u0438\u044F\u0445", 26, 1],
["\u044B", -1, 1],
["\u044C", -1, 1],
["\u044E", -1, 1],
["\u0438\u044E", 30, 1],
["\u044C\u044E", 30, 1],
["\u044F", -1, 1],
["\u0438\u044F", 33, 1],
["\u044C\u044F", 33, 1]
];
/** @const */ var a_6 = [
["\u043E\u0441\u0442", -1, 1],
["\u043E\u0441\u0442\u044C", -1, 1]
];
/** @const */ var a_7 = [
["\u0435\u0439\u0448\u0435", -1, 1],
["\u043D", -1, 2],
["\u0435\u0439\u0448", -1, 1],
["\u044C", -1, 3]
];
/** @const */ var /** Array<int> */ g_v = [33, 65, 8, 232];
var /** number */ I_p2 = 0;
var /** number */ I_pV = 0;
/** @return {boolean} */
function r_mark_regions() {
I_pV = base.limit;
I_p2 = base.limit;
var /** number */ v_1 = base.cursor;
lab0: {
golab1: while(true)
{
lab2: {
if (!(base.in_grouping(g_v, 1072, 1103)))
{
break lab2;
}
break golab1;
}
if (base.cursor >= base.limit)
{
break lab0;
}
base.cursor++;
}
I_pV = base.cursor;
golab3: while(true)
{
lab4: {
if (!(base.out_grouping(g_v, 1072, 1103)))
{
break lab4;
}
break golab3;
}
if (base.cursor >= base.limit)
{
break lab0;
}
base.cursor++;
}
golab5: while(true)
{
lab6: {
if (!(base.in_grouping(g_v, 1072, 1103)))
{
break lab6;
}
break golab5;
}
if (base.cursor >= base.limit)
{
break lab0;
}
base.cursor++;
}
golab7: while(true)
{
lab8: {
if (!(base.out_grouping(g_v, 1072, 1103)))
{
break lab8;
}
break golab7;
}
if (base.cursor >= base.limit)
{
break lab0;
}
base.cursor++;
}
I_p2 = base.cursor;
}
base.cursor = v_1;
return true;
};
/** @return {boolean} */
function r_R2() {
if (!(I_p2 <= base.cursor))
{
return false;
}
return true;
};
/** @return {boolean} */
function r_perfective_gerund() {
var /** number */ among_var;
base.ket = base.cursor;
among_var = base.find_among_b(a_0);
if (among_var == 0)
{
return false;
}
base.bra = base.cursor;
switch (among_var) {
case 1:
lab0: {
var /** number */ v_1 = base.limit - base.cursor;
lab1: {
if (!(base.eq_s_b("\u0430")))
{
break lab1;
}
break lab0;
}
base.cursor = base.limit - v_1;
if (!(base.eq_s_b("\u044F")))
{
return false;
}
}
if (!base.slice_del())
{
return false;
}
break;
case 2:
if (!base.slice_del())
{
return false;
}
break;
}
return true;
};
/** @return {boolean} */
function r_adjective() {
base.ket = base.cursor;
if (base.find_among_b(a_1) == 0)
{
return false;
}
base.bra = base.cursor;
if (!base.slice_del())
{
return false;
}
return true;
};
/** @return {boolean} */
function r_adjectival() {
var /** number */ among_var;
if (!r_adjective())
{
return false;
}
var /** number */ v_1 = base.limit - base.cursor;
lab0: {
base.ket = base.cursor;
among_var = base.find_among_b(a_2);
if (among_var == 0)
{
base.cursor = base.limit - v_1;
break lab0;
}
base.bra = base.cursor;
switch (among_var) {
case 1:
lab1: {
var /** number */ v_2 = base.limit - base.cursor;
lab2: {
if (!(base.eq_s_b("\u0430")))
{
break lab2;
}
break lab1;
}
base.cursor = base.limit - v_2;
if (!(base.eq_s_b("\u044F")))
{
base.cursor = base.limit - v_1;
break lab0;
}
}
if (!base.slice_del())
{
return false;
}
break;
case 2:
if (!base.slice_del())
{
return false;
}
break;
}
}
return true;
};
/** @return {boolean} */
function r_reflexive() {
base.ket = base.cursor;
if (base.find_among_b(a_3) == 0)
{
return false;
}
base.bra = base.cursor;
if (!base.slice_del())
{
return false;
}
return true;
};
/** @return {boolean} */
function r_verb() {
var /** number */ among_var;
base.ket = base.cursor;
among_var = base.find_among_b(a_4);
if (among_var == 0)
{
return false;
}
base.bra = base.cursor;
switch (among_var) {
case 1:
lab0: {
var /** number */ v_1 = base.limit - base.cursor;
lab1: {
if (!(base.eq_s_b("\u0430")))
{
break lab1;
}
break lab0;
}
base.cursor = base.limit - v_1;
if (!(base.eq_s_b("\u044F")))
{
return false;
}
}
if (!base.slice_del())
{
return false;
}
break;
case 2:
if (!base.slice_del())
{
return false;
}
break;
}
return true;
};
/** @return {boolean} */
function r_noun() {
base.ket = base.cursor;
if (base.find_among_b(a_5) == 0)
{
return false;
}
base.bra = base.cursor;
if (!base.slice_del())
{
return false;
}
return true;
};
/** @return {boolean} */
function r_derivational() {
base.ket = base.cursor;
if (base.find_among_b(a_6) == 0)
{
return false;
}
base.bra = base.cursor;
if (!r_R2())
{
return false;
}
if (!base.slice_del())
{
return false;
}
return true;
};
/** @return {boolean} */
function r_tidy_up() {
var /** number */ among_var;
base.ket = base.cursor;
among_var = base.find_among_b(a_7);
if (among_var == 0)
{
return false;
}
base.bra = base.cursor;
switch (among_var) {
case 1:
if (!base.slice_del())
{
return false;
}
base.ket = base.cursor;
if (!(base.eq_s_b("\u043D")))
{
return false;
}
base.bra = base.cursor;
if (!(base.eq_s_b("\u043D")))
{
return false;
}
if (!base.slice_del())
{
return false;
}
break;
case 2:
if (!(base.eq_s_b("\u043D")))
{
return false;
}
if (!base.slice_del())
{
return false;
}
break;
case 3:
if (!base.slice_del())
{
return false;
}
break;
}
return true;
};
this.stem = /** @return {boolean} */ function() {
var /** number */ v_1 = base.cursor;
lab0: {
while(true)
{
var /** number */ v_2 = base.cursor;
lab1: {
golab2: while(true)
{
var /** number */ v_3 = base.cursor;
lab3: {
base.bra = base.cursor;
if (!(base.eq_s("\u0451")))
{
break lab3;
}
base.ket = base.cursor;
base.cursor = v_3;
break golab2;
}
base.cursor = v_3;
if (base.cursor >= base.limit)
{
break lab1;
}
base.cursor++;
}
if (!base.slice_from("\u0435"))
{
return false;
}
continue;
}
base.cursor = v_2;
break;
}
}
base.cursor = v_1;
r_mark_regions();
base.limit_backward = base.cursor; base.cursor = base.limit;
if (base.cursor < I_pV)
{
return false;
}
var /** number */ v_6 = base.limit_backward;
base.limit_backward = I_pV;
var /** number */ v_7 = base.limit - base.cursor;
lab4: {
lab5: {
var /** number */ v_8 = base.limit - base.cursor;
lab6: {
if (!r_perfective_gerund())
{
break lab6;
}
break lab5;
}
base.cursor = base.limit - v_8;
var /** number */ v_9 = base.limit - base.cursor;
lab7: {
if (!r_reflexive())
{
base.cursor = base.limit - v_9;
break lab7;
}
}
lab8: {
var /** number */ v_10 = base.limit - base.cursor;
lab9: {
if (!r_adjectival())
{
break lab9;
}
break lab8;
}
base.cursor = base.limit - v_10;
lab10: {
if (!r_verb())
{
break lab10;
}
break lab8;
}
base.cursor = base.limit - v_10;
if (!r_noun())
{
break lab4;
}
}
}
}
base.cursor = base.limit - v_7;
var /** number */ v_11 = base.limit - base.cursor;
lab11: {
base.ket = base.cursor;
if (!(base.eq_s_b("\u0438")))
{
base.cursor = base.limit - v_11;
break lab11;
}
base.bra = base.cursor;
if (!base.slice_del())
{
return false;
}
}
var /** number */ v_12 = base.limit - base.cursor;
r_derivational();
base.cursor = base.limit - v_12;
var /** number */ v_13 = base.limit - base.cursor;
r_tidy_up();
base.cursor = base.limit - v_13;
base.limit_backward = v_6;
base.cursor = base.limit_backward;
return true;
};
/**@return{string}*/
this['stemWord'] = function(/**string*/word) {
base.setCurrent(word);
this.stem();
return base.getCurrent();
};
};
Stemmer = RussianStemmer;

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 B

View File

@@ -0,0 +1,75 @@
pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight { background: #f8f8f8; }
.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */
.highlight .err { border: 1px solid #F00 } /* Error */
.highlight .k { color: #008000; font-weight: bold } /* Keyword */
.highlight .o { color: #666 } /* Operator */
.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */
.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */
.highlight .cp { color: #9C6500 } /* Comment.Preproc */
.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */
.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */
.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */
.highlight .gd { color: #A00000 } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.highlight .gr { color: #E40000 } /* Generic.Error */
.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
.highlight .gi { color: #008400 } /* Generic.Inserted */
.highlight .go { color: #717171 } /* Generic.Output */
.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
.highlight .gt { color: #04D } /* Generic.Traceback */
.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008000 } /* Keyword.Pseudo */
.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #B00040 } /* Keyword.Type */
.highlight .m { color: #666 } /* Literal.Number */
.highlight .s { color: #BA2121 } /* Literal.String */
.highlight .na { color: #687822 } /* Name.Attribute */
.highlight .nb { color: #008000 } /* Name.Builtin */
.highlight .nc { color: #00F; font-weight: bold } /* Name.Class */
.highlight .no { color: #800 } /* Name.Constant */
.highlight .nd { color: #A2F } /* Name.Decorator */
.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */
.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #00F } /* Name.Function */
.highlight .nl { color: #767600 } /* Name.Label */
.highlight .nn { color: #00F; font-weight: bold } /* Name.Namespace */
.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #19177C } /* Name.Variable */
.highlight .ow { color: #A2F; font-weight: bold } /* Operator.Word */
.highlight .w { color: #BBB } /* Text.Whitespace */
.highlight .mb { color: #666 } /* Literal.Number.Bin */
.highlight .mf { color: #666 } /* Literal.Number.Float */
.highlight .mh { color: #666 } /* Literal.Number.Hex */
.highlight .mi { color: #666 } /* Literal.Number.Integer */
.highlight .mo { color: #666 } /* Literal.Number.Oct */
.highlight .sa { color: #BA2121 } /* Literal.String.Affix */
.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */
.highlight .sc { color: #BA2121 } /* Literal.String.Char */
.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */
.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
.highlight .s2 { color: #BA2121 } /* Literal.String.Double */
.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */
.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */
.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */
.highlight .sx { color: #008000 } /* Literal.String.Other */
.highlight .sr { color: #A45A77 } /* Literal.String.Regex */
.highlight .s1 { color: #BA2121 } /* Literal.String.Single */
.highlight .ss { color: #19177C } /* Literal.String.Symbol */
.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #00F } /* Name.Function.Magic */
.highlight .vc { color: #19177C } /* Name.Variable.Class */
.highlight .vg { color: #19177C } /* Name.Variable.Global */
.highlight .vi { color: #19177C } /* Name.Variable.Instance */
.highlight .vm { color: #19177C } /* Name.Variable.Magic */
.highlight .il { color: #666 } /* Literal.Number.Integer.Long */

View File

@@ -0,0 +1,624 @@
// Generated by Snowball 2.1.0 - https://snowballstem.org/
/**@constructor*/
RussianStemmer = function() {
var base = new BaseStemmer();
/** @const */ var a_0 = [
["\u0432", -1, 1],
["\u0438\u0432", 0, 2],
["\u044B\u0432", 0, 2],
["\u0432\u0448\u0438", -1, 1],
["\u0438\u0432\u0448\u0438", 3, 2],
["\u044B\u0432\u0448\u0438", 3, 2],
["\u0432\u0448\u0438\u0441\u044C", -1, 1],
["\u0438\u0432\u0448\u0438\u0441\u044C", 6, 2],
["\u044B\u0432\u0448\u0438\u0441\u044C", 6, 2]
];
/** @const */ var a_1 = [
["\u0435\u0435", -1, 1],
["\u0438\u0435", -1, 1],
["\u043E\u0435", -1, 1],
["\u044B\u0435", -1, 1],
["\u0438\u043C\u0438", -1, 1],
["\u044B\u043C\u0438", -1, 1],
["\u0435\u0439", -1, 1],
["\u0438\u0439", -1, 1],
["\u043E\u0439", -1, 1],
["\u044B\u0439", -1, 1],
["\u0435\u043C", -1, 1],
["\u0438\u043C", -1, 1],
["\u043E\u043C", -1, 1],
["\u044B\u043C", -1, 1],
["\u0435\u0433\u043E", -1, 1],
["\u043E\u0433\u043E", -1, 1],
["\u0435\u043C\u0443", -1, 1],
["\u043E\u043C\u0443", -1, 1],
["\u0438\u0445", -1, 1],
["\u044B\u0445", -1, 1],
["\u0435\u044E", -1, 1],
["\u043E\u044E", -1, 1],
["\u0443\u044E", -1, 1],
["\u044E\u044E", -1, 1],
["\u0430\u044F", -1, 1],
["\u044F\u044F", -1, 1]
];
/** @const */ var a_2 = [
["\u0435\u043C", -1, 1],
["\u043D\u043D", -1, 1],
["\u0432\u0448", -1, 1],
["\u0438\u0432\u0448", 2, 2],
["\u044B\u0432\u0448", 2, 2],
["\u0449", -1, 1],
["\u044E\u0449", 5, 1],
["\u0443\u044E\u0449", 6, 2]
];
/** @const */ var a_3 = [
["\u0441\u044C", -1, 1],
["\u0441\u044F", -1, 1]
];
/** @const */ var a_4 = [
["\u043B\u0430", -1, 1],
["\u0438\u043B\u0430", 0, 2],
["\u044B\u043B\u0430", 0, 2],
["\u043D\u0430", -1, 1],
["\u0435\u043D\u0430", 3, 2],
["\u0435\u0442\u0435", -1, 1],
["\u0438\u0442\u0435", -1, 2],
["\u0439\u0442\u0435", -1, 1],
["\u0435\u0439\u0442\u0435", 7, 2],
["\u0443\u0439\u0442\u0435", 7, 2],
["\u043B\u0438", -1, 1],
["\u0438\u043B\u0438", 10, 2],
["\u044B\u043B\u0438", 10, 2],
["\u0439", -1, 1],
["\u0435\u0439", 13, 2],
["\u0443\u0439", 13, 2],
["\u043B", -1, 1],
["\u0438\u043B", 16, 2],
["\u044B\u043B", 16, 2],
["\u0435\u043C", -1, 1],
["\u0438\u043C", -1, 2],
["\u044B\u043C", -1, 2],
["\u043D", -1, 1],
["\u0435\u043D", 22, 2],
["\u043B\u043E", -1, 1],
["\u0438\u043B\u043E", 24, 2],
["\u044B\u043B\u043E", 24, 2],
["\u043D\u043E", -1, 1],
["\u0435\u043D\u043E", 27, 2],
["\u043D\u043D\u043E", 27, 1],
["\u0435\u0442", -1, 1],
["\u0443\u0435\u0442", 30, 2],
["\u0438\u0442", -1, 2],
["\u044B\u0442", -1, 2],
["\u044E\u0442", -1, 1],
["\u0443\u044E\u0442", 34, 2],
["\u044F\u0442", -1, 2],
["\u043D\u044B", -1, 1],
["\u0435\u043D\u044B", 37, 2],
["\u0442\u044C", -1, 1],
["\u0438\u0442\u044C", 39, 2],
["\u044B\u0442\u044C", 39, 2],
["\u0435\u0448\u044C", -1, 1],
["\u0438\u0448\u044C", -1, 2],
["\u044E", -1, 2],
["\u0443\u044E", 44, 2]
];
/** @const */ var a_5 = [
["\u0430", -1, 1],
["\u0435\u0432", -1, 1],
["\u043E\u0432", -1, 1],
["\u0435", -1, 1],
["\u0438\u0435", 3, 1],
["\u044C\u0435", 3, 1],
["\u0438", -1, 1],
["\u0435\u0438", 6, 1],
["\u0438\u0438", 6, 1],
["\u0430\u043C\u0438", 6, 1],
["\u044F\u043C\u0438", 6, 1],
["\u0438\u044F\u043C\u0438", 10, 1],
["\u0439", -1, 1],
["\u0435\u0439", 12, 1],
["\u0438\u0435\u0439", 13, 1],
["\u0438\u0439", 12, 1],
["\u043E\u0439", 12, 1],
["\u0430\u043C", -1, 1],
["\u0435\u043C", -1, 1],
["\u0438\u0435\u043C", 18, 1],
["\u043E\u043C", -1, 1],
["\u044F\u043C", -1, 1],
["\u0438\u044F\u043C", 21, 1],
["\u043E", -1, 1],
["\u0443", -1, 1],
["\u0430\u0445", -1, 1],
["\u044F\u0445", -1, 1],
["\u0438\u044F\u0445", 26, 1],
["\u044B", -1, 1],
["\u044C", -1, 1],
["\u044E", -1, 1],
["\u0438\u044E", 30, 1],
["\u044C\u044E", 30, 1],
["\u044F", -1, 1],
["\u0438\u044F", 33, 1],
["\u044C\u044F", 33, 1]
];
/** @const */ var a_6 = [
["\u043E\u0441\u0442", -1, 1],
["\u043E\u0441\u0442\u044C", -1, 1]
];
/** @const */ var a_7 = [
["\u0435\u0439\u0448\u0435", -1, 1],
["\u043D", -1, 2],
["\u0435\u0439\u0448", -1, 1],
["\u044C", -1, 3]
];
/** @const */ var /** Array<int> */ g_v = [33, 65, 8, 232];
var /** number */ I_p2 = 0;
var /** number */ I_pV = 0;
/** @return {boolean} */
function r_mark_regions() {
I_pV = base.limit;
I_p2 = base.limit;
var /** number */ v_1 = base.cursor;
lab0: {
golab1: while(true)
{
lab2: {
if (!(base.in_grouping(g_v, 1072, 1103)))
{
break lab2;
}
break golab1;
}
if (base.cursor >= base.limit)
{
break lab0;
}
base.cursor++;
}
I_pV = base.cursor;
golab3: while(true)
{
lab4: {
if (!(base.out_grouping(g_v, 1072, 1103)))
{
break lab4;
}
break golab3;
}
if (base.cursor >= base.limit)
{
break lab0;
}
base.cursor++;
}
golab5: while(true)
{
lab6: {
if (!(base.in_grouping(g_v, 1072, 1103)))
{
break lab6;
}
break golab5;
}
if (base.cursor >= base.limit)
{
break lab0;
}
base.cursor++;
}
golab7: while(true)
{
lab8: {
if (!(base.out_grouping(g_v, 1072, 1103)))
{
break lab8;
}
break golab7;
}
if (base.cursor >= base.limit)
{
break lab0;
}
base.cursor++;
}
I_p2 = base.cursor;
}
base.cursor = v_1;
return true;
};
/** @return {boolean} */
function r_R2() {
if (!(I_p2 <= base.cursor))
{
return false;
}
return true;
};
/** @return {boolean} */
function r_perfective_gerund() {
var /** number */ among_var;
base.ket = base.cursor;
among_var = base.find_among_b(a_0);
if (among_var == 0)
{
return false;
}
base.bra = base.cursor;
switch (among_var) {
case 1:
lab0: {
var /** number */ v_1 = base.limit - base.cursor;
lab1: {
if (!(base.eq_s_b("\u0430")))
{
break lab1;
}
break lab0;
}
base.cursor = base.limit - v_1;
if (!(base.eq_s_b("\u044F")))
{
return false;
}
}
if (!base.slice_del())
{
return false;
}
break;
case 2:
if (!base.slice_del())
{
return false;
}
break;
}
return true;
};
/** @return {boolean} */
function r_adjective() {
base.ket = base.cursor;
if (base.find_among_b(a_1) == 0)
{
return false;
}
base.bra = base.cursor;
if (!base.slice_del())
{
return false;
}
return true;
};
/** @return {boolean} */
function r_adjectival() {
var /** number */ among_var;
if (!r_adjective())
{
return false;
}
var /** number */ v_1 = base.limit - base.cursor;
lab0: {
base.ket = base.cursor;
among_var = base.find_among_b(a_2);
if (among_var == 0)
{
base.cursor = base.limit - v_1;
break lab0;
}
base.bra = base.cursor;
switch (among_var) {
case 1:
lab1: {
var /** number */ v_2 = base.limit - base.cursor;
lab2: {
if (!(base.eq_s_b("\u0430")))
{
break lab2;
}
break lab1;
}
base.cursor = base.limit - v_2;
if (!(base.eq_s_b("\u044F")))
{
base.cursor = base.limit - v_1;
break lab0;
}
}
if (!base.slice_del())
{
return false;
}
break;
case 2:
if (!base.slice_del())
{
return false;
}
break;
}
}
return true;
};
/** @return {boolean} */
function r_reflexive() {
base.ket = base.cursor;
if (base.find_among_b(a_3) == 0)
{
return false;
}
base.bra = base.cursor;
if (!base.slice_del())
{
return false;
}
return true;
};
/** @return {boolean} */
function r_verb() {
var /** number */ among_var;
base.ket = base.cursor;
among_var = base.find_among_b(a_4);
if (among_var == 0)
{
return false;
}
base.bra = base.cursor;
switch (among_var) {
case 1:
lab0: {
var /** number */ v_1 = base.limit - base.cursor;
lab1: {
if (!(base.eq_s_b("\u0430")))
{
break lab1;
}
break lab0;
}
base.cursor = base.limit - v_1;
if (!(base.eq_s_b("\u044F")))
{
return false;
}
}
if (!base.slice_del())
{
return false;
}
break;
case 2:
if (!base.slice_del())
{
return false;
}
break;
}
return true;
};
/** @return {boolean} */
function r_noun() {
base.ket = base.cursor;
if (base.find_among_b(a_5) == 0)
{
return false;
}
base.bra = base.cursor;
if (!base.slice_del())
{
return false;
}
return true;
};
/** @return {boolean} */
function r_derivational() {
base.ket = base.cursor;
if (base.find_among_b(a_6) == 0)
{
return false;
}
base.bra = base.cursor;
if (!r_R2())
{
return false;
}
if (!base.slice_del())
{
return false;
}
return true;
};
/** @return {boolean} */
function r_tidy_up() {
var /** number */ among_var;
base.ket = base.cursor;
among_var = base.find_among_b(a_7);
if (among_var == 0)
{
return false;
}
base.bra = base.cursor;
switch (among_var) {
case 1:
if (!base.slice_del())
{
return false;
}
base.ket = base.cursor;
if (!(base.eq_s_b("\u043D")))
{
return false;
}
base.bra = base.cursor;
if (!(base.eq_s_b("\u043D")))
{
return false;
}
if (!base.slice_del())
{
return false;
}
break;
case 2:
if (!(base.eq_s_b("\u043D")))
{
return false;
}
if (!base.slice_del())
{
return false;
}
break;
case 3:
if (!base.slice_del())
{
return false;
}
break;
}
return true;
};
this.stem = /** @return {boolean} */ function() {
var /** number */ v_1 = base.cursor;
lab0: {
while(true)
{
var /** number */ v_2 = base.cursor;
lab1: {
golab2: while(true)
{
var /** number */ v_3 = base.cursor;
lab3: {
base.bra = base.cursor;
if (!(base.eq_s("\u0451")))
{
break lab3;
}
base.ket = base.cursor;
base.cursor = v_3;
break golab2;
}
base.cursor = v_3;
if (base.cursor >= base.limit)
{
break lab1;
}
base.cursor++;
}
if (!base.slice_from("\u0435"))
{
return false;
}
continue;
}
base.cursor = v_2;
break;
}
}
base.cursor = v_1;
r_mark_regions();
base.limit_backward = base.cursor; base.cursor = base.limit;
if (base.cursor < I_pV)
{
return false;
}
var /** number */ v_6 = base.limit_backward;
base.limit_backward = I_pV;
var /** number */ v_7 = base.limit - base.cursor;
lab4: {
lab5: {
var /** number */ v_8 = base.limit - base.cursor;
lab6: {
if (!r_perfective_gerund())
{
break lab6;
}
break lab5;
}
base.cursor = base.limit - v_8;
var /** number */ v_9 = base.limit - base.cursor;
lab7: {
if (!r_reflexive())
{
base.cursor = base.limit - v_9;
break lab7;
}
}
lab8: {
var /** number */ v_10 = base.limit - base.cursor;
lab9: {
if (!r_adjectival())
{
break lab9;
}
break lab8;
}
base.cursor = base.limit - v_10;
lab10: {
if (!r_verb())
{
break lab10;
}
break lab8;
}
base.cursor = base.limit - v_10;
if (!r_noun())
{
break lab4;
}
}
}
}
base.cursor = base.limit - v_7;
var /** number */ v_11 = base.limit - base.cursor;
lab11: {
base.ket = base.cursor;
if (!(base.eq_s_b("\u0438")))
{
base.cursor = base.limit - v_11;
break lab11;
}
base.bra = base.cursor;
if (!base.slice_del())
{
return false;
}
}
var /** number */ v_12 = base.limit - base.cursor;
r_derivational();
base.cursor = base.limit - v_12;
var /** number */ v_13 = base.limit - base.cursor;
r_tidy_up();
base.cursor = base.limit - v_13;
base.limit_backward = v_6;
base.cursor = base.limit_backward;
return true;
};
/**@return{string}*/
this['stemWord'] = function(/**string*/word) {
base.setCurrent(word);
this.stem();
return base.getCurrent();
};
};

View File

@@ -0,0 +1,635 @@
/*
* Sphinx JavaScript utilities for the full-text search.
*/
"use strict";
/**
* Simple result scoring code.
*/
if (typeof Scorer === "undefined") {
var Scorer = {
// Implement the following function to further tweak the score for each result
// The function takes a result array [docname, title, anchor, descr, score, filename]
// and returns the new score.
/*
score: result => {
const [docname, title, anchor, descr, score, filename, kind] = result
return score
},
*/
// query matches the full name of an object
objNameMatch: 11,
// or matches in the last dotted part of the object name
objPartialMatch: 6,
// Additive scores depending on the priority of the object
objPrio: {
0: 15, // used to be importantResults
1: 5, // used to be objectResults
2: -5, // used to be unimportantResults
},
// Used when the priority is not in the mapping.
objPrioDefault: 0,
// query found in title
title: 15,
partialTitle: 7,
// query found in terms
term: 5,
partialTerm: 2,
};
}
// Global search result kind enum, used by themes to style search results.
class SearchResultKind {
static get index() { return "index"; }
static get object() { return "object"; }
static get text() { return "text"; }
static get title() { return "title"; }
}
const _removeChildren = (element) => {
while (element && element.lastChild) element.removeChild(element.lastChild);
};
/**
* See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping
*/
const _escapeRegExp = (string) =>
string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string
const _displayItem = (item, searchTerms, highlightTerms) => {
const docBuilder = DOCUMENTATION_OPTIONS.BUILDER;
const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX;
const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX;
const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY;
const contentRoot = document.documentElement.dataset.content_root;
const [docName, title, anchor, descr, score, _filename, kind] = item;
let listItem = document.createElement("li");
// Add a class representing the item's type:
// can be used by a theme's CSS selector for styling
// See SearchResultKind for the class names.
listItem.classList.add(`kind-${kind}`);
let requestUrl;
let linkUrl;
if (docBuilder === "dirhtml") {
// dirhtml builder
let dirname = docName + "/";
if (dirname.match(/\/index\/$/))
dirname = dirname.substring(0, dirname.length - 6);
else if (dirname === "index/") dirname = "";
requestUrl = contentRoot + dirname;
linkUrl = requestUrl;
} else {
// normal html builders
requestUrl = contentRoot + docName + docFileSuffix;
linkUrl = docName + docLinkSuffix;
}
let linkEl = listItem.appendChild(document.createElement("a"));
linkEl.href = linkUrl + anchor;
linkEl.dataset.score = score;
linkEl.innerHTML = title;
if (descr) {
listItem.appendChild(document.createElement("span")).innerHTML =
" (" + descr + ")";
// highlight search terms in the description
if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js
highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted"));
}
else if (showSearchSummary)
fetch(requestUrl)
.then((responseData) => responseData.text())
.then((data) => {
if (data)
listItem.appendChild(
Search.makeSearchSummary(data, searchTerms, anchor)
);
// highlight search terms in the summary
if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js
highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted"));
});
Search.output.appendChild(listItem);
};
const _finishSearch = (resultCount) => {
Search.stopPulse();
Search.title.innerText = _("Search Results");
if (!resultCount)
Search.status.innerText = Documentation.gettext(
"Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories."
);
else
Search.status.innerText = Documentation.ngettext(
"Search finished, found one page matching the search query.",
"Search finished, found ${resultCount} pages matching the search query.",
resultCount,
).replace('${resultCount}', resultCount);
};
const _displayNextItem = (
results,
resultCount,
searchTerms,
highlightTerms,
) => {
// results left, load the summary and display it
// this is intended to be dynamic (don't sub resultsCount)
if (results.length) {
_displayItem(results.pop(), searchTerms, highlightTerms);
setTimeout(
() => _displayNextItem(results, resultCount, searchTerms, highlightTerms),
5
);
}
// search finished, update title and status message
else _finishSearch(resultCount);
};
// Helper function used by query() to order search results.
// Each input is an array of [docname, title, anchor, descr, score, filename, kind].
// Order the results by score (in opposite order of appearance, since the
// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically.
const _orderResultsByScoreThenName = (a, b) => {
const leftScore = a[4];
const rightScore = b[4];
if (leftScore === rightScore) {
// same score: sort alphabetically
const leftTitle = a[1].toLowerCase();
const rightTitle = b[1].toLowerCase();
if (leftTitle === rightTitle) return 0;
return leftTitle > rightTitle ? -1 : 1; // inverted is intentional
}
return leftScore > rightScore ? 1 : -1;
};
/**
* Default splitQuery function. Can be overridden in ``sphinx.search`` with a
* custom function per language.
*
* The regular expression works by splitting the string on consecutive characters
* that are not Unicode letters, numbers, underscores, or emoji characters.
* This is the same as ``\W+`` in Python, preserving the surrogate pair area.
*/
if (typeof splitQuery === "undefined") {
var splitQuery = (query) => query
.split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu)
.filter(term => term) // remove remaining empty strings
}
/**
* Search Module
*/
const Search = {
_index: null,
_queued_query: null,
_pulse_status: -1,
htmlToText: (htmlString, anchor) => {
const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html');
for (const removalQuery of [".headerlink", "script", "style"]) {
htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() });
}
if (anchor) {
const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`);
if (anchorContent) return anchorContent.textContent;
console.warn(
`Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.`
);
}
// if anchor not specified or not found, fall back to main content
const docContent = htmlElement.querySelector('[role="main"]');
if (docContent) return docContent.textContent;
console.warn(
"Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template."
);
return "";
},
init: () => {
const query = new URLSearchParams(window.location.search).get("q");
document
.querySelectorAll('input[name="q"]')
.forEach((el) => (el.value = query));
if (query) Search.performSearch(query);
},
loadIndex: (url) =>
(document.body.appendChild(document.createElement("script")).src = url),
setIndex: (index) => {
Search._index = index;
if (Search._queued_query !== null) {
const query = Search._queued_query;
Search._queued_query = null;
Search.query(query);
}
},
hasIndex: () => Search._index !== null,
deferQuery: (query) => (Search._queued_query = query),
stopPulse: () => (Search._pulse_status = -1),
startPulse: () => {
if (Search._pulse_status >= 0) return;
const pulse = () => {
Search._pulse_status = (Search._pulse_status + 1) % 4;
Search.dots.innerText = ".".repeat(Search._pulse_status);
if (Search._pulse_status >= 0) window.setTimeout(pulse, 500);
};
pulse();
},
/**
* perform a search for something (or wait until index is loaded)
*/
performSearch: (query) => {
// create the required interface elements
const searchText = document.createElement("h2");
searchText.textContent = _("Searching");
const searchSummary = document.createElement("p");
searchSummary.classList.add("search-summary");
searchSummary.innerText = "";
const searchList = document.createElement("ul");
searchList.setAttribute("role", "list");
searchList.classList.add("search");
const out = document.getElementById("search-results");
Search.title = out.appendChild(searchText);
Search.dots = Search.title.appendChild(document.createElement("span"));
Search.status = out.appendChild(searchSummary);
Search.output = out.appendChild(searchList);
const searchProgress = document.getElementById("search-progress");
// Some themes don't use the search progress node
if (searchProgress) {
searchProgress.innerText = _("Preparing search...");
}
Search.startPulse();
// index already loaded, the browser was quick!
if (Search.hasIndex()) Search.query(query);
else Search.deferQuery(query);
},
_parseQuery: (query) => {
// stem the search terms and add them to the correct list
const stemmer = new Stemmer();
const searchTerms = new Set();
const excludedTerms = new Set();
const highlightTerms = new Set();
const objectTerms = new Set(splitQuery(query.toLowerCase().trim()));
splitQuery(query.trim()).forEach((queryTerm) => {
const queryTermLower = queryTerm.toLowerCase();
// maybe skip this "word"
// stopwords array is from language_data.js
if (
stopwords.indexOf(queryTermLower) !== -1 ||
queryTerm.match(/^\d+$/)
)
return;
// stem the word
let word = stemmer.stemWord(queryTermLower);
// select the correct list
if (word[0] === "-") excludedTerms.add(word.substr(1));
else {
searchTerms.add(word);
highlightTerms.add(queryTermLower);
}
});
if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js
localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" "))
}
// console.debug("SEARCH: searching for:");
// console.info("required: ", [...searchTerms]);
// console.info("excluded: ", [...excludedTerms]);
return [query, searchTerms, excludedTerms, highlightTerms, objectTerms];
},
/**
* execute search (requires search index to be loaded)
*/
_performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => {
const filenames = Search._index.filenames;
const docNames = Search._index.docnames;
const titles = Search._index.titles;
const allTitles = Search._index.alltitles;
const indexEntries = Search._index.indexentries;
// Collect multiple result groups to be sorted separately and then ordered.
// Each is an array of [docname, title, anchor, descr, score, filename, kind].
const normalResults = [];
const nonMainIndexResults = [];
_removeChildren(document.getElementById("search-progress"));
const queryLower = query.toLowerCase().trim();
for (const [title, foundTitles] of Object.entries(allTitles)) {
if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) {
for (const [file, id] of foundTitles) {
const score = Math.round(Scorer.title * queryLower.length / title.length);
const boost = titles[file] === title ? 1 : 0; // add a boost for document titles
normalResults.push([
docNames[file],
titles[file] !== title ? `${titles[file]} > ${title}` : title,
id !== null ? "#" + id : "",
null,
score + boost,
filenames[file],
SearchResultKind.title,
]);
}
}
}
// search for explicit entries in index directives
for (const [entry, foundEntries] of Object.entries(indexEntries)) {
if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) {
for (const [file, id, isMain] of foundEntries) {
const score = Math.round(100 * queryLower.length / entry.length);
const result = [
docNames[file],
titles[file],
id ? "#" + id : "",
null,
score,
filenames[file],
SearchResultKind.index,
];
if (isMain) {
normalResults.push(result);
} else {
nonMainIndexResults.push(result);
}
}
}
}
// lookup as object
objectTerms.forEach((term) =>
normalResults.push(...Search.performObjectSearch(term, objectTerms))
);
// lookup as search terms in fulltext
normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms));
// let the scorer override scores with a custom scoring function
if (Scorer.score) {
normalResults.forEach((item) => (item[4] = Scorer.score(item)));
nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item)));
}
// Sort each group of results by score and then alphabetically by name.
normalResults.sort(_orderResultsByScoreThenName);
nonMainIndexResults.sort(_orderResultsByScoreThenName);
// Combine the result groups in (reverse) order.
// Non-main index entries are typically arbitrary cross-references,
// so display them after other results.
let results = [...nonMainIndexResults, ...normalResults];
// remove duplicate search results
// note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept
let seen = new Set();
results = results.reverse().reduce((acc, result) => {
let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(',');
if (!seen.has(resultStr)) {
acc.push(result);
seen.add(resultStr);
}
return acc;
}, []);
return results.reverse();
},
query: (query) => {
const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query);
const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms);
// for debugging
//Search.lastresults = results.slice(); // a copy
// console.info("search results:", Search.lastresults);
// print the results
_displayNextItem(results, results.length, searchTerms, highlightTerms);
},
/**
* search for object names
*/
performObjectSearch: (object, objectTerms) => {
const filenames = Search._index.filenames;
const docNames = Search._index.docnames;
const objects = Search._index.objects;
const objNames = Search._index.objnames;
const titles = Search._index.titles;
const results = [];
const objectSearchCallback = (prefix, match) => {
const name = match[4]
const fullname = (prefix ? prefix + "." : "") + name;
const fullnameLower = fullname.toLowerCase();
if (fullnameLower.indexOf(object) < 0) return;
let score = 0;
const parts = fullnameLower.split(".");
// check for different match types: exact matches of full name or
// "last name" (i.e. last dotted part)
if (fullnameLower === object || parts.slice(-1)[0] === object)
score += Scorer.objNameMatch;
else if (parts.slice(-1)[0].indexOf(object) > -1)
score += Scorer.objPartialMatch; // matches in last name
const objName = objNames[match[1]][2];
const title = titles[match[0]];
// If more than one term searched for, we require other words to be
// found in the name/title/description
const otherTerms = new Set(objectTerms);
otherTerms.delete(object);
if (otherTerms.size > 0) {
const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase();
if (
[...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0)
)
return;
}
let anchor = match[3];
if (anchor === "") anchor = fullname;
else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname;
const descr = objName + _(", in ") + title;
// add custom score for some objects according to scorer
if (Scorer.objPrio.hasOwnProperty(match[2]))
score += Scorer.objPrio[match[2]];
else score += Scorer.objPrioDefault;
results.push([
docNames[match[0]],
fullname,
"#" + anchor,
descr,
score,
filenames[match[0]],
SearchResultKind.object,
]);
};
Object.keys(objects).forEach((prefix) =>
objects[prefix].forEach((array) =>
objectSearchCallback(prefix, array)
)
);
return results;
},
/**
* search for full-text terms in the index
*/
performTermsSearch: (searchTerms, excludedTerms) => {
// prepare search
const terms = Search._index.terms;
const titleTerms = Search._index.titleterms;
const filenames = Search._index.filenames;
const docNames = Search._index.docnames;
const titles = Search._index.titles;
const scoreMap = new Map();
const fileMap = new Map();
// perform the search on the required terms
searchTerms.forEach((word) => {
const files = [];
// find documents, if any, containing the query word in their text/title term indices
// use Object.hasOwnProperty to avoid mismatching against prototype properties
const arr = [
{ files: terms.hasOwnProperty(word) ? terms[word] : undefined, score: Scorer.term },
{ files: titleTerms.hasOwnProperty(word) ? titleTerms[word] : undefined, score: Scorer.title },
];
// add support for partial matches
if (word.length > 2) {
const escapedWord = _escapeRegExp(word);
if (!terms.hasOwnProperty(word)) {
Object.keys(terms).forEach((term) => {
if (term.match(escapedWord))
arr.push({ files: terms[term], score: Scorer.partialTerm });
});
}
if (!titleTerms.hasOwnProperty(word)) {
Object.keys(titleTerms).forEach((term) => {
if (term.match(escapedWord))
arr.push({ files: titleTerms[term], score: Scorer.partialTitle });
});
}
}
// no match but word was a required one
if (arr.every((record) => record.files === undefined)) return;
// found search word in contents
arr.forEach((record) => {
if (record.files === undefined) return;
let recordFiles = record.files;
if (recordFiles.length === undefined) recordFiles = [recordFiles];
files.push(...recordFiles);
// set score for the word in each file
recordFiles.forEach((file) => {
if (!scoreMap.has(file)) scoreMap.set(file, new Map());
const fileScores = scoreMap.get(file);
fileScores.set(word, record.score);
});
});
// create the mapping
files.forEach((file) => {
if (!fileMap.has(file)) fileMap.set(file, [word]);
else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word);
});
});
// now check if the files don't contain excluded terms
const results = [];
for (const [file, wordList] of fileMap) {
// check if all requirements are matched
// as search terms with length < 3 are discarded
const filteredTermCount = [...searchTerms].filter(
(term) => term.length > 2
).length;
if (
wordList.length !== searchTerms.size &&
wordList.length !== filteredTermCount
)
continue;
// ensure that none of the excluded terms is in the search result
if (
[...excludedTerms].some(
(term) =>
terms[term] === file ||
titleTerms[term] === file ||
(terms[term] || []).includes(file) ||
(titleTerms[term] || []).includes(file)
)
)
break;
// select one (max) score for the file.
const score = Math.max(...wordList.map((w) => scoreMap.get(file).get(w)));
// add result to the result list
results.push([
docNames[file],
titles[file],
"",
null,
score,
filenames[file],
SearchResultKind.text,
]);
}
return results;
},
/**
* helper function to return a node containing the
* search summary for a given text. keywords is a list
* of stemmed words.
*/
makeSearchSummary: (htmlText, keywords, anchor) => {
const text = Search.htmlToText(htmlText, anchor);
if (text === "") return null;
const textLower = text.toLowerCase();
const actualStartPosition = [...keywords]
.map((k) => textLower.indexOf(k.toLowerCase()))
.filter((i) => i > -1)
.slice(-1)[0];
const startWithContext = Math.max(actualStartPosition - 120, 0);
const top = startWithContext === 0 ? "" : "...";
const tail = startWithContext + 240 < text.length ? "..." : "";
let summary = document.createElement("p");
summary.classList.add("context");
summary.textContent = top + text.substr(startWithContext, 240).trim() + tail;
return summary;
},
};
_ready(Search.init);

View File

@@ -0,0 +1,154 @@
/* Highlighting utilities for Sphinx HTML documentation. */
"use strict";
const SPHINX_HIGHLIGHT_ENABLED = true
/**
* highlight a given string on a node by wrapping it in
* span elements with the given class name.
*/
const _highlight = (node, addItems, text, className) => {
if (node.nodeType === Node.TEXT_NODE) {
const val = node.nodeValue;
const parent = node.parentNode;
const pos = val.toLowerCase().indexOf(text);
if (
pos >= 0 &&
!parent.classList.contains(className) &&
!parent.classList.contains("nohighlight")
) {
let span;
const closestNode = parent.closest("body, svg, foreignObject");
const isInSVG = closestNode && closestNode.matches("svg");
if (isInSVG) {
span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
} else {
span = document.createElement("span");
span.classList.add(className);
}
span.appendChild(document.createTextNode(val.substr(pos, text.length)));
const rest = document.createTextNode(val.substr(pos + text.length));
parent.insertBefore(
span,
parent.insertBefore(
rest,
node.nextSibling
)
);
node.nodeValue = val.substr(0, pos);
/* There may be more occurrences of search term in this node. So call this
* function recursively on the remaining fragment.
*/
_highlight(rest, addItems, text, className);
if (isInSVG) {
const rect = document.createElementNS(
"http://www.w3.org/2000/svg",
"rect"
);
const bbox = parent.getBBox();
rect.x.baseVal.value = bbox.x;
rect.y.baseVal.value = bbox.y;
rect.width.baseVal.value = bbox.width;
rect.height.baseVal.value = bbox.height;
rect.setAttribute("class", className);
addItems.push({ parent: parent, target: rect });
}
}
} else if (node.matches && !node.matches("button, select, textarea")) {
node.childNodes.forEach((el) => _highlight(el, addItems, text, className));
}
};
const _highlightText = (thisNode, text, className) => {
let addItems = [];
_highlight(thisNode, addItems, text, className);
addItems.forEach((obj) =>
obj.parent.insertAdjacentElement("beforebegin", obj.target)
);
};
/**
* Small JavaScript module for the documentation.
*/
const SphinxHighlight = {
/**
* highlight the search words provided in localstorage in the text
*/
highlightSearchWords: () => {
if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight
// get and clear terms from localstorage
const url = new URL(window.location);
const highlight =
localStorage.getItem("sphinx_highlight_terms")
|| url.searchParams.get("highlight")
|| "";
localStorage.removeItem("sphinx_highlight_terms")
url.searchParams.delete("highlight");
window.history.replaceState({}, "", url);
// get individual terms from highlight string
const terms = highlight.toLowerCase().split(/\s+/).filter(x => x);
if (terms.length === 0) return; // nothing to do
// There should never be more than one element matching "div.body"
const divBody = document.querySelectorAll("div.body");
const body = divBody.length ? divBody[0] : document.querySelector("body");
window.setTimeout(() => {
terms.forEach((term) => _highlightText(body, term, "highlighted"));
}, 10);
const searchBox = document.getElementById("searchbox");
if (searchBox === null) return;
searchBox.appendChild(
document
.createRange()
.createContextualFragment(
'<p class="highlight-link">' +
'<a href="javascript:SphinxHighlight.hideSearchWords()">' +
_("Hide Search Matches") +
"</a></p>"
)
);
},
/**
* helper function to hide the search marks again
*/
hideSearchWords: () => {
document
.querySelectorAll("#searchbox .highlight-link")
.forEach((el) => el.remove());
document
.querySelectorAll("span.highlighted")
.forEach((el) => el.classList.remove("highlighted"));
localStorage.removeItem("sphinx_highlight_terms")
},
initEscapeListener: () => {
// only install a listener if it is really needed
if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return;
document.addEventListener("keydown", (event) => {
// bail for input elements
if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return;
// bail with special keys
if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return;
if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) {
SphinxHighlight.hideSearchWords();
event.preventDefault();
}
});
},
};
_ready(() => {
/* Do not call highlightSearchWords() when we are on the search page.
* It will highlight words from the *previous* search query.
*/
if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords();
SphinxHighlight.initEscapeListener();
});

View File

@@ -0,0 +1,65 @@
Documentation.addTranslations({
"locale": "ru",
"messages": {
"%(filename)s &#8212; %(docstitle)s": "%(filename)s &#8212; %(docstitle)s",
"&#169; %(copyright_prefix)s %(copyright)s.": "",
", in ": ", \u0432",
"About these documents": "\u041e\u0431 \u044d\u0442\u0438\u0445 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0445",
"Automatically generated list of changes in version %(version)s": "\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u0432\u0435\u0440\u0441\u0438\u0438 %(version)s",
"C API changes": "\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 API C",
"Changes in Version %(version)s &#8212; %(docstitle)s": "\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0432\u0435\u0440\u0441\u0438\u0438 %(version)s &#8212; %(docstitle)s",
"Collapse sidebar": "\u0421\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0431\u043e\u043a\u043e\u0432\u0443\u044e \u043f\u0430\u043d\u0435\u043b\u044c",
"Complete Table of Contents": "\u041f\u043e\u043b\u043d\u043e\u0435 \u043e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435",
"Contents": "\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435",
"Copyright": "\u0410\u0432\u0442\u043e\u0440\u0441\u043a\u0438\u0435 \u043f\u0440\u0430\u0432\u0430",
"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "\u0421\u043e\u0437\u0434\u0430\u043d\u043e \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.",
"Expand sidebar": "\u0420\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0431\u043e\u043a\u043e\u0432\u0443\u044e \u043f\u0430\u043d\u0435\u043b\u044c",
"Full index on one page": "\u041f\u043e\u043b\u043d\u044b\u0439 \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u043d\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435",
"General Index": "\u0410\u043b\u0444\u0430\u0432\u0438\u0442\u043d\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c",
"Global Module Index": "\u0410\u043b\u0444\u0430\u0432\u0438\u0442\u043d\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0434\u0443\u043b\u0435\u0439",
"Go": "\u0418\u0441\u043a\u0430\u0442\u044c",
"Hide Search Matches": "\u0421\u043d\u044f\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435",
"Index": "\u0410\u043b\u0444\u0430\u0432\u0438\u0442\u043d\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c",
"Index &#x2013; %(key)s": "\u0418\u043d\u0434\u0435\u043a\u0441 &#x2013; %(key)s",
"Index pages by letter": "\u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043f\u043e \u0431\u0443\u043a\u0432\u0430\u043c \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u0430",
"Indices and tables:": "\u0422\u0430\u0431\u043b\u0438\u0446\u044b \u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438:",
"Last updated on %(last_updated)s.": "\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043e: %(last_updated)s.",
"Library changes": "\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435",
"Navigation": "\u041d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f",
"Next topic": "\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0430\u0437\u0434\u0435\u043b",
"Other changes": "\u0414\u0440\u0443\u0433\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f",
"Overview": "\u041e\u0431\u0437\u043e\u0440",
"Please activate JavaScript to enable the search\n functionality.": "\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u043e\u0438\u0441\u043a\u0430 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u0435 JavaScript \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435.",
"Preparing search...": "\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043f\u043e\u0438\u0441\u043a\u0430\u2026",
"Previous topic": "\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0440\u0430\u0437\u0434\u0435\u043b",
"Quick search": "\u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u043f\u043e\u0438\u0441\u043a",
"Search": "\u041f\u043e\u0438\u0441\u043a",
"Search Page": "\u041f\u043e\u0438\u0441\u043a",
"Search Results": "\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u043e\u0438\u0441\u043a\u0430",
"Search finished, found one page matching the search query.": [
"",
"",
"",
""
],
"Search within %(docstitle)s": "\u041f\u043e\u0438\u0441\u043a \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0435 \u00ab%(docstitle)s\u00bb",
"Searching": "\u0418\u0434\u0451\u0442 \u043f\u043e\u0438\u0441\u043a",
"Searching for multiple words only shows matches that contain\n all words.": "\u041f\u043e\u0438\u0441\u043a \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u0441\u043b\u043e\u0432\u0430\u043c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b,\n \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 \u0432\u0441\u0435 \u0441\u043b\u043e\u0432\u0430.",
"Show Source": "\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442",
"Table of Contents": "\u041e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435",
"This Page": "\u042d\u0442\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430",
"Welcome! This is": "\u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c! \u042d\u0442\u043e",
"Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "\u041f\u043e \u0432\u0430\u0448\u0435\u043c\u0443 \u043f\u043e\u0438\u0441\u043a\u0443 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430. \u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435, \u0447\u0442\u043e \u0432\u0441\u0435 \u0441\u043b\u043e\u0432\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0431\u0435\u0437 \u043e\u0448\u0438\u0431\u043e\u043a, \u0438 \u0447\u0442\u043e \u0432\u044b \u0432\u044b\u0431\u0440\u0430\u043b\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439.",
"all functions, classes, terms": "\u0432\u0441\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043b\u0430\u0441\u0441\u044b, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b",
"can be huge": "\u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u043c",
"last updated": "\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435",
"lists all sections and subsections": "\u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u0440\u0430\u0437\u0434\u0435\u043b\u043e\u0432 \u0438 \u043f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b\u043e\u0432",
"next chapter": "\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0433\u043b\u0430\u0432\u0430",
"previous chapter": "\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u0433\u043b\u0430\u0432\u0430",
"quick access to all modules": "\u0441\u0432\u043e\u0434\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439",
"search": "\u0438\u0441\u043a\u0430\u0442\u044c",
"search this documentation": "\u043f\u043e\u0438\u0441\u043a \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438",
"the documentation for": "\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f"
},
"plural_expr": "(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3)"
});

View File

@@ -0,0 +1,273 @@
<!DOCTYPE html>
<html class="writer-html5" lang="ru" data-content_root="./">
<head>
<meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Фокус.Комплаенс &mdash; документация Kontur Focus Library 0.1.0</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=b86133f3" />
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=e59714d7" />
<script src="_static/jquery.js?v=5d32c60e"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
<script src="_static/documentation_options.js?v=6ff560e8"></script>
<script src="_static/doctools.js?v=9bcbadda"></script>
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="_static/translations.js?v=cd1d70c9"></script>
<script src="_static/js/theme.js"></script>
<link rel="index" title="Алфавитный указатель" href="genindex.html" />
<link rel="search" title="Поиск" href="search.html" />
<link rel="next" title="Open API specification" href="open-api.html" />
<link rel="prev" title="Фокус" href="focus.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="index.html" class="icon icon-home">
Kontur Focus Library
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Поиск в документации" aria-label="Поиск в документации" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Меню навигации">
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="setup.html">Установка</a></li>
<li class="toctree-l1"><a class="reference internal" href="focus.html">Фокус</a></li>
<li class="toctree-l1 current"><a class="current reference internal" href="#">Фокус.Комплаенс</a><ul>
<li class="toctree-l2"><a class="reference internal" href="#id2">Подготовка</a></li>
<li class="toctree-l2"><a class="reference internal" href="#id3">Инициализация</a></li>
<li class="toctree-l2"><a class="reference internal" href="#id4">Основные методы</a></li>
<li class="toctree-l2"><a class="reference internal" href="#id5">Юридические лица</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#kontur_focus.FocusCompliance.company_is_foreign_agent"><code class="docutils literal notranslate"><span class="pre">company_is_foreign_agent()</span></code></a></li>
<li class="toctree-l3"><a class="reference internal" href="#kontur_focus.FocusCompliance.search_global_company_profiles_id"><code class="docutils literal notranslate"><span class="pre">search_global_company_profiles_id()</span></code></a></li>
<li class="toctree-l3"><a class="reference internal" href="#kontur_focus.FocusCompliance.legal_entity_profile_report"><code class="docutils literal notranslate"><span class="pre">legal_entity_profile_report()</span></code></a></li>
<li class="toctree-l3"><a class="reference internal" href="#kontur_focus.FocusCompliance.full_company_report"><code class="docutils literal notranslate"><span class="pre">full_company_report()</span></code></a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="#id6">Физические лица</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#kontur_focus.FocusCompliance.person_is_foreign_agent"><code class="docutils literal notranslate"><span class="pre">person_is_foreign_agent()</span></code></a></li>
<li class="toctree-l3"><a class="reference internal" href="#kontur_focus.FocusCompliance.full_individual_report"><code class="docutils literal notranslate"><span class="pre">full_individual_report()</span></code></a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="open-api.html">Open API specification</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Меню навигации для мобильных устройств" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">Kontur Focus Library</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="Навигация по страницам">
<ul class="wy-breadcrumbs">
<li><a href="index.html" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item active">Фокус.Комплаенс</li>
<li class="wy-breadcrumbs-aside">
<a href="_sources/focus-compliance.rst.txt" rel="nofollow"> Просмотреть исходный код страницы</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<section id="id1">
<h1>Фокус.Комплаенс<a class="headerlink" href="#id1" title="Ссылка на этот заголовок"></a></h1>
<section id="id2">
<h2>Подготовка<a class="headerlink" href="#id2" title="Ссылка на этот заголовок"></a></h2>
<p>Создайте файл <cite>.env</cite> или добавьте в существующий параметры:</p>
<ul class="simple">
<li><p><cite>FOCUS_COMPLIANCE_BASE_URL=&lt;kontur_url&gt;</cite></p></li>
<li><p><cite>FOCUS_COMPLIANCE_ACCESS_KEY=&lt;your_access_key&gt;</cite></p></li>
</ul>
<p>Где <cite>kontur_url</cite> - адрес REST API Контур.Фокус. Например, <cite>https://kyc.kontur.ru/api</cite>.</p>
<p>А <cite>FOCUS_ACCESS_KEY</cite> - секретный ключ доступа к REST API Контур.Фокус.</p>
</section>
<section id="id3">
<h2>Инициализация<a class="headerlink" href="#id3" title="Ссылка на этот заголовок"></a></h2>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span><span class="w"> </span><span class="nn">kontur_focus</span><span class="w"> </span><span class="kn">import</span> <span class="n">FocusCompliance</span>
<span class="n">fc</span> <span class="o">=</span> <span class="n">FocusCompliance</span><span class="p">(</span><span class="n">inn</span><span class="o">=</span><span class="s1">&#39;&lt;inn_string&gt;&#39;</span><span class="p">,</span> <span class="n">ogrn</span><span class="o">=</span><span class="s1">&#39;&lt;ogrn_string&gt;&#39;</span><span class="p">)</span>
</pre></div>
</div>
<p>Обязательный параметр - <strong>ИНН</strong>.</p>
</section>
<section id="id4">
<h2>Основные методы<a class="headerlink" href="#id4" title="Ссылка на этот заголовок"></a></h2>
</section>
<section id="id5">
<h2>Юридические лица<a class="headerlink" href="#id5" title="Ссылка на этот заголовок"></a></h2>
<dl class="py function">
<dt class="sig sig-object py" id="kontur_focus.FocusCompliance.company_is_foreign_agent">
<span class="sig-name descname"><span class="pre">company_is_foreign_agent</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#kontur_focus.FocusCompliance.company_is_foreign_agent" title="Ссылка на это определение"></a></dt>
<dd><p>Вхождение организации и ее руководителей в список иностранных агентов</p>
<dl class="field-list simple">
<dt class="field-odd">Результат<span class="colon">:</span></dt>
<dd class="field-odd"><p>Дата формирования реестра, а также признаки присутствия или отсутствия в списках иностранных агентов</p>
</dd>
<dt class="field-even">Тип результата<span class="colon">:</span></dt>
<dd class="field-even"><p>dict</p>
</dd>
</dl>
</dd></dl>
<dl class="py function">
<dt class="sig sig-object py" id="kontur_focus.FocusCompliance.search_global_company_profiles_id">
<span class="sig-name descname"><span class="pre">search_global_company_profiles_id</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#kontur_focus.FocusCompliance.search_global_company_profiles_id" title="Ссылка на это определение"></a></dt>
<dd><p>Поиск сводной информации по санкционным профилям ЮЛ</p>
<dl class="field-list simple">
<dt class="field-odd">Параметры<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>company_name</strong> (<em>str</em>) Наименование компании</p>
</dd>
<dt class="field-even">Результат<span class="colon">:</span></dt>
<dd class="field-even"><p>Список идентификаторов профилей</p>
</dd>
<dt class="field-odd">Тип результата<span class="colon">:</span></dt>
<dd class="field-odd"><p>list</p>
</dd>
</dl>
</dd></dl>
<dl class="py function">
<dt class="sig sig-object py" id="kontur_focus.FocusCompliance.legal_entity_profile_report">
<span class="sig-name descname"><span class="pre">legal_entity_profile_report</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">profile_id_list</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">path</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#kontur_focus.FocusCompliance.legal_entity_profile_report" title="Ссылка на это определение"></a></dt>
<dd><p>Получение печатного отчета по профилю ЮЛ</p>
<dl class="field-list simple">
<dt class="field-odd">Параметры<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>profile_id_list</strong> (<em>list</em>) Список идентификаторов санкционных профилей компании</p></li>
<li><p><strong>path</strong> (<em>str</em><em>, </em><em>optional</em>) Путь сохранения файла, по-умолчанию файл сохраняется в текущий каталог</p></li>
</ul>
</dd>
<dt class="field-even">Результат<span class="colon">:</span></dt>
<dd class="field-even"><p>Отчет о результате сохранения файла</p>
</dd>
<dt class="field-odd">Тип результата<span class="colon">:</span></dt>
<dd class="field-odd"><p>dict</p>
</dd>
</dl>
</dd></dl>
<dl class="py function">
<dt class="sig sig-object py" id="kontur_focus.FocusCompliance.full_company_report">
<span class="sig-name descname"><span class="pre">full_company_report</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">model</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">path</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#kontur_focus.FocusCompliance.full_company_report" title="Ссылка на это определение"></a></dt>
<dd><p>Запрос на полную проверку и построение печатного отчёта по организации</p>
<dl class="field-list simple">
<dt class="field-odd">Параметры<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>model</strong> (<em>str</em><em>, </em><em>optional</em>) Идентификатор модели, по которой пройдет проверка.
Идентификатор возвращается в методе «Получение списка рисковых моделей организации»
GET /banks/{bankId}/models, defaults to „115-fz“</p></li>
<li><p><strong>path</strong> (<em>str</em><em>, </em><em>optional</em>) Путь сохранения файла, по-умолчанию файл сохраняется в текущий каталог, defaults to None</p></li>
</ul>
</dd>
<dt class="field-even">Результат<span class="colon">:</span></dt>
<dd class="field-even"><p>Отчет о результате сохранения файла</p>
</dd>
<dt class="field-odd">Тип результата<span class="colon">:</span></dt>
<dd class="field-odd"><p>dict</p>
</dd>
</dl>
</dd></dl>
<p>Пример вывода результат по отчету:</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="p">[{</span><span class="s1">&#39;success&#39;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span> <span class="s1">&#39;filename&#39;</span><span class="p">:</span> <span class="s1">&#39;&lt;имя_файла&gt;&#39;</span><span class="p">,</span> <span class="s1">&#39;path&#39;</span><span class="p">:</span> <span class="s1">&#39;&lt;полный_путь_файла&gt;&#39;</span><span class="p">}]</span>
</pre></div>
</div>
</section>
<section id="id6">
<h2>Физические лица<a class="headerlink" href="#id6" title="Ссылка на этот заголовок"></a></h2>
<dl class="py function">
<dt class="sig sig-object py" id="kontur_focus.FocusCompliance.person_is_foreign_agent">
<span class="sig-name descname"><span class="pre">person_is_foreign_agent</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#kontur_focus.FocusCompliance.person_is_foreign_agent" title="Ссылка на это определение"></a></dt>
<dd><p>Вхождение физлица в список иностранных агентов</p>
<dl class="field-list simple">
<dt class="field-odd">Результат<span class="colon">:</span></dt>
<dd class="field-odd"><p>True или False</p>
</dd>
<dt class="field-even">Тип результата<span class="colon">:</span></dt>
<dd class="field-even"><p>bool</p>
</dd>
</dl>
</dd></dl>
<dl class="py function">
<dt class="sig sig-object py" id="kontur_focus.FocusCompliance.full_individual_report">
<span class="sig-name descname"><span class="pre">full_individual_report</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">path</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">passport</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">fio</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#kontur_focus.FocusCompliance.full_individual_report" title="Ссылка на это определение"></a></dt>
<dd><dl class="simple">
<dt>Запрос на построение печатного отчёта по физ лицу</dt><dd><p>Необходимо обязательно указать либо ИНН, либо ФИО и номер паспорта</p>
</dd>
</dl>
<dl class="field-list simple">
<dt class="field-odd">Параметры<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>path</strong> (<em>str</em><em>, </em><em>optional</em>) Путь сохранения файла, по-умолчанию файл сохраняется в текущий каталог, defaults to None</p></li>
<li><p><strong>passport</strong> (<em>str</em><em>, </em><em>optional</em>) Номер паспорты, defaults to None</p></li>
<li><p><strong>fio</strong> (<em>str</em><em>, </em><em>optional</em>) ФИО (хотя бы фамилия и имя), defaults to None</p></li>
</ul>
</dd>
<dt class="field-even">Результат<span class="colon">:</span></dt>
<dd class="field-even"><p>Отчет о результате сохранения файла</p>
</dd>
<dt class="field-odd">Тип результата<span class="colon">:</span></dt>
<dd class="field-odd"><p>dict</p>
</dd>
</dl>
</dd></dl>
</section>
</section>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Нижняя область">
<a href="focus.html" class="btn btn-neutral float-left" title="Фокус" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Предыдущая</a>
<a href="open-api.html" class="btn btn-neutral float-right" title="Open API specification" accesskey="n" rel="next">Следующая <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
</div>
<hr/>
<div role="contentinfo">
<p>&#169; Авторские права 2025, Ilya Sapunov. </p>
</div>
Собрано при помощи <a href="https://www.sphinx-doc.org/">Sphinx</a> с использованием
<a href="https://github.com/readthedocs/sphinx_rtd_theme">темы,</a>
предоставленной <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

257
docs/out/html/focus.html Normal file
View File

@@ -0,0 +1,257 @@
<!DOCTYPE html>
<html class="writer-html5" lang="ru" data-content_root="./">
<head>
<meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Фокус &mdash; документация Kontur Focus Library 0.1.0</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=b86133f3" />
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=e59714d7" />
<script src="_static/jquery.js?v=5d32c60e"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
<script src="_static/documentation_options.js?v=6ff560e8"></script>
<script src="_static/doctools.js?v=9bcbadda"></script>
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="_static/translations.js?v=cd1d70c9"></script>
<script src="_static/js/theme.js"></script>
<link rel="index" title="Алфавитный указатель" href="genindex.html" />
<link rel="search" title="Поиск" href="search.html" />
<link rel="next" title="Фокус.Комплаенс" href="focus-compliance.html" />
<link rel="prev" title="Установка" href="setup.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="index.html" class="icon icon-home">
Kontur Focus Library
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Поиск в документации" aria-label="Поиск в документации" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Меню навигации">
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="setup.html">Установка</a></li>
<li class="toctree-l1 current"><a class="current reference internal" href="#">Фокус</a><ul>
<li class="toctree-l2"><a class="reference internal" href="#id2">Подготовка</a></li>
<li class="toctree-l2"><a class="reference internal" href="#id3">Инициализация</a></li>
<li class="toctree-l2"><a class="reference internal" href="#id4">Основные методы</a></li>
<li class="toctree-l2"><a class="reference internal" href="#id5">Юридические лица</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#kontur_focus.Focus.base_info"><code class="docutils literal notranslate"><span class="pre">base_info()</span></code></a></li>
<li class="toctree-l3"><a class="reference internal" href="#kontur_focus.Focus.advanced_info"><code class="docutils literal notranslate"><span class="pre">advanced_info()</span></code></a></li>
<li class="toctree-l3"><a class="reference internal" href="#kontur_focus.Focus.excerpt"><code class="docutils literal notranslate"><span class="pre">excerpt()</span></code></a></li>
<li class="toctree-l3"><a class="reference internal" href="#kontur_focus.Focus.express_report"><code class="docutils literal notranslate"><span class="pre">express_report()</span></code></a></li>
<li class="toctree-l3"><a class="reference internal" href="#kontur_focus.Focus.founders_history"><code class="docutils literal notranslate"><span class="pre">founders_history()</span></code></a></li>
<li class="toctree-l3"><a class="reference internal" href="#kontur_focus.Focus.foreign_representatives"><code class="docutils literal notranslate"><span class="pre">foreign_representatives()</span></code></a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="focus-compliance.html">Фокус.Комплаенс</a></li>
<li class="toctree-l1"><a class="reference internal" href="open-api.html">Open API specification</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Меню навигации для мобильных устройств" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">Kontur Focus Library</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="Навигация по страницам">
<ul class="wy-breadcrumbs">
<li><a href="index.html" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item active">Фокус</li>
<li class="wy-breadcrumbs-aside">
<a href="_sources/focus.rst.txt" rel="nofollow"> Просмотреть исходный код страницы</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<section id="id1">
<h1>Фокус<a class="headerlink" href="#id1" title="Ссылка на этот заголовок"></a></h1>
<section id="id2">
<h2>Подготовка<a class="headerlink" href="#id2" title="Ссылка на этот заголовок"></a></h2>
<p>Создайте файл <cite>.env</cite> или добавьте в существующий параметры:</p>
<ul class="simple">
<li><p><cite>FOCUS_BASE_URL=&lt;kontur_url&gt;</cite></p></li>
<li><p><cite>FOCUS_ACCESS_KEY=&lt;your_access_key&gt;</cite></p></li>
</ul>
<p>Где <cite>kontur_url</cite> - адрес REST API Контур.Фокус. Например, <cite>https://focus-api.kontur.ru/api3</cite>.</p>
<p>А <cite>FOCUS_ACCESS_KEY</cite> - секретный ключ доступа к REST API Контур.Фокус.</p>
</section>
<section id="id3">
<h2>Инициализация<a class="headerlink" href="#id3" title="Ссылка на этот заголовок"></a></h2>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span><span class="w"> </span><span class="nn">kontur_focus</span><span class="w"> </span><span class="kn">import</span> <span class="n">Focus</span>
<span class="n">focus</span> <span class="o">=</span> <span class="n">Focus</span><span class="p">(</span><span class="n">inn</span><span class="o">=</span><span class="s1">&#39;&lt;inn_string&gt;&#39;</span><span class="p">,</span> <span class="n">ogrn</span><span class="o">=</span><span class="s1">&#39;&lt;ogrn_string&gt;&#39;</span><span class="p">)</span>
</pre></div>
</div>
<p>Обязательный параметр - <strong>ИНН</strong>.</p>
</section>
<section id="id4">
<h2>Основные методы<a class="headerlink" href="#id4" title="Ссылка на этот заголовок"></a></h2>
<p>Пример использования методов:</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">focus</span><span class="o">.</span><span class="n">base_info</span><span class="p">()</span>
</pre></div>
</div>
</section>
<section id="id5">
<h2>Юридические лица<a class="headerlink" href="#id5" title="Ссылка на этот заголовок"></a></h2>
<dl class="py function">
<dt class="sig sig-object py" id="kontur_focus.Focus.base_info">
<span class="sig-name descname"><span class="pre">base_info</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#kontur_focus.Focus.base_info" title="Ссылка на это определение"></a></dt>
<dd><p>Выгрузка базовых реквизитов Российских юридических лиц и индивидуальных предпринимателей</p>
<dl class="field-list simple">
<dt class="field-odd">Результат<span class="colon">:</span></dt>
<dd class="field-odd"><p>Информация о ЮЛ</p>
</dd>
<dt class="field-even">Тип результата<span class="colon">:</span></dt>
<dd class="field-even"><p>str</p>
</dd>
</dl>
</dd></dl>
<dl class="py function">
<dt class="sig sig-object py" id="kontur_focus.Focus.advanced_info">
<span class="sig-name descname"><span class="pre">advanced_info</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#kontur_focus.Focus.advanced_info" title="Ссылка на это определение"></a></dt>
<dd><p>Расширенные сведения на основе ЕГРЮЛ/ЕГРИП</p>
<dl class="field-list simple">
<dt class="field-odd">Результат<span class="colon">:</span></dt>
<dd class="field-odd"><p>Информация о ЮЛ</p>
</dd>
<dt class="field-even">Тип результата<span class="colon">:</span></dt>
<dd class="field-even"><p>str</p>
</dd>
</dl>
</dd></dl>
<dl class="py function">
<dt class="sig sig-object py" id="kontur_focus.Focus.excerpt">
<span class="sig-name descname"><span class="pre">excerpt</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">path</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#kontur_focus.Focus.excerpt" title="Ссылка на это определение"></a></dt>
<dd><p>Выписка из ЕГРЮЛ/ЕГРИП</p>
<dl class="field-list simple">
<dt class="field-odd">Параметры<span class="colon">:</span></dt>
<dd class="field-odd"><p><strong>path</strong> (<em>str</em><em>, </em><em>необязательный</em>) Путь выгрузки файла. Если не указан, выгружается в текущий каталог.</p>
</dd>
<dt class="field-even">Результат<span class="colon">:</span></dt>
<dd class="field-even"><p>Результат, имя файла и путь выгрузки</p>
</dd>
<dt class="field-odd">Тип результата<span class="colon">:</span></dt>
<dd class="field-odd"><p>str</p>
</dd>
</dl>
</dd></dl>
<p>Пример вывода результат по отчету:</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="p">{</span><span class="s1">&#39;success&#39;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span> <span class="s1">&#39;filename&#39;</span><span class="p">:</span> <span class="s1">&#39;&lt;имя_файла&gt;&#39;</span><span class="p">,</span> <span class="s1">&#39;path&#39;</span><span class="p">:</span> <span class="s1">&#39;&lt;полный_путь_файла&gt;&#39;</span><span class="p">}</span>
</pre></div>
</div>
<dl class="py function">
<dt class="sig sig-object py" id="kontur_focus.Focus.express_report">
<span class="sig-name descname"><span class="pre">express_report</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">pdf</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">path</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#kontur_focus.Focus.express_report" title="Ссылка на это определение"></a></dt>
<dd><p>Экспресс-отчет по контрагенту</p>
<dl class="field-list simple">
<dt class="field-odd">Параметры<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>pdf</strong> (<em>bool</em><em>, </em><em>optional</em>) Выгрузить PDF файл, по-умолчанию True</p></li>
<li><p><strong>path</strong> (<em>str</em><em>, </em><em>optional</em>) Путь выгрузки файла. Если не указан, выгружается в текущий каталог.</p></li>
</ul>
</dd>
<dt class="field-even">Результат<span class="colon">:</span></dt>
<dd class="field-even"><p>_description_</p>
</dd>
<dt class="field-odd">Тип результата<span class="colon">:</span></dt>
<dd class="field-odd"><p>_type_</p>
</dd>
</dl>
</dd></dl>
<p>Пример вывода результат по отчету:</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="p">{</span><span class="s1">&#39;success&#39;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span> <span class="s1">&#39;filename&#39;</span><span class="p">:</span> <span class="s1">&#39;&lt;имя_файла&gt;&#39;</span><span class="p">,</span> <span class="s1">&#39;path&#39;</span><span class="p">:</span> <span class="s1">&#39;&lt;полный_путь_файла&gt;&#39;</span><span class="p">}</span>
</pre></div>
</div>
<dl class="py function">
<dt class="sig sig-object py" id="kontur_focus.Focus.founders_history">
<span class="sig-name descname"><span class="pre">founders_history</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#kontur_focus.Focus.founders_history" title="Ссылка на это определение"></a></dt>
<dd><p>История владения организацией</p>
<dl class="field-list simple">
<dt class="field-odd">Результат<span class="colon">:</span></dt>
<dd class="field-odd"><p>Набор полей с информацией об изменениях</p>
</dd>
<dt class="field-even">Тип результата<span class="colon">:</span></dt>
<dd class="field-even"><p>str</p>
</dd>
</dl>
</dd></dl>
<dl class="py function">
<dt class="sig sig-object py" id="kontur_focus.Focus.foreign_representatives">
<span class="sig-name descname"><span class="pre">foreign_representatives</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#kontur_focus.Focus.foreign_representatives" title="Ссылка на это определение"></a></dt>
<dd><p>Иностранные представительства и филиалы</p>
<dl class="field-list simple">
<dt class="field-odd">Результат<span class="colon">:</span></dt>
<dd class="field-odd"><p>Набор данных о представительствах</p>
</dd>
<dt class="field-even">Тип результата<span class="colon">:</span></dt>
<dd class="field-even"><p>str</p>
</dd>
</dl>
</dd></dl>
</section>
</section>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Нижняя область">
<a href="setup.html" class="btn btn-neutral float-left" title="Установка" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Предыдущая</a>
<a href="focus-compliance.html" class="btn btn-neutral float-right" title="Фокус.Комплаенс" accesskey="n" rel="next">Следующая <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
</div>
<hr/>
<div role="contentinfo">
<p>&#169; Авторские права 2025, Ilya Sapunov. </p>
</div>
Собрано при помощи <a href="https://www.sphinx-doc.org/">Sphinx</a> с использованием
<a href="https://github.com/readthedocs/sphinx_rtd_theme">темы,</a>
предоставленной <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

193
docs/out/html/genindex.html Normal file
View File

@@ -0,0 +1,193 @@
<!DOCTYPE html>
<html class="writer-html5" lang="ru" data-content_root="./">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Алфавитный указатель &mdash; документация Kontur Focus Library 0.1.0</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=b86133f3" />
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=e59714d7" />
<script src="_static/jquery.js?v=5d32c60e"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
<script src="_static/documentation_options.js?v=6ff560e8"></script>
<script src="_static/doctools.js?v=9bcbadda"></script>
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="_static/translations.js?v=cd1d70c9"></script>
<script src="_static/js/theme.js"></script>
<link rel="index" title="Алфавитный указатель" href="#" />
<link rel="search" title="Поиск" href="search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="index.html" class="icon icon-home">
Kontur Focus Library
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Поиск в документации" aria-label="Поиск в документации" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Меню навигации">
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="setup.html">Установка</a></li>
<li class="toctree-l1"><a class="reference internal" href="focus.html">Фокус</a></li>
<li class="toctree-l1"><a class="reference internal" href="focus-compliance.html">Фокус.Комплаенс</a></li>
<li class="toctree-l1"><a class="reference internal" href="open-api.html">Open API specification</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Меню навигации для мобильных устройств" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">Kontur Focus Library</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="Навигация по страницам">
<ul class="wy-breadcrumbs">
<li><a href="index.html" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item active">Алфавитный указатель</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<h1 id="index">Алфавитный указатель</h1>
<div class="genindex-jumpbox">
<a href="#A"><strong>A</strong></a>
| <a href="#B"><strong>B</strong></a>
| <a href="#C"><strong>C</strong></a>
| <a href="#E"><strong>E</strong></a>
| <a href="#F"><strong>F</strong></a>
| <a href="#L"><strong>L</strong></a>
| <a href="#P"><strong>P</strong></a>
| <a href="#S"><strong>S</strong></a>
</div>
<h2 id="A">A</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="focus.html#kontur_focus.Focus.advanced_info">advanced_info() (в модуле kontur_focus.Focus)</a>
</li>
</ul></td>
</tr></table>
<h2 id="B">B</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="focus.html#kontur_focus.Focus.base_info">base_info() (в модуле kontur_focus.Focus)</a>
</li>
</ul></td>
</tr></table>
<h2 id="C">C</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="focus-compliance.html#kontur_focus.FocusCompliance.company_is_foreign_agent">company_is_foreign_agent() (в модуле kontur_focus.FocusCompliance)</a>
</li>
</ul></td>
</tr></table>
<h2 id="E">E</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="focus.html#kontur_focus.Focus.excerpt">excerpt() (в модуле kontur_focus.Focus)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="focus.html#kontur_focus.Focus.express_report">express_report() (в модуле kontur_focus.Focus)</a>
</li>
</ul></td>
</tr></table>
<h2 id="F">F</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="focus.html#kontur_focus.Focus.foreign_representatives">foreign_representatives() (в модуле kontur_focus.Focus)</a>
</li>
<li><a href="focus.html#kontur_focus.Focus.founders_history">founders_history() (в модуле kontur_focus.Focus)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="focus-compliance.html#kontur_focus.FocusCompliance.full_company_report">full_company_report() (в модуле kontur_focus.FocusCompliance)</a>
</li>
<li><a href="focus-compliance.html#kontur_focus.FocusCompliance.full_individual_report">full_individual_report() (в модуле kontur_focus.FocusCompliance)</a>
</li>
</ul></td>
</tr></table>
<h2 id="L">L</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="focus-compliance.html#kontur_focus.FocusCompliance.legal_entity_profile_report">legal_entity_profile_report() (в модуле kontur_focus.FocusCompliance)</a>
</li>
</ul></td>
</tr></table>
<h2 id="P">P</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="focus-compliance.html#kontur_focus.FocusCompliance.person_is_foreign_agent">person_is_foreign_agent() (в модуле kontur_focus.FocusCompliance)</a>
</li>
</ul></td>
</tr></table>
<h2 id="S">S</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="focus-compliance.html#kontur_focus.FocusCompliance.search_global_company_profiles_id">search_global_company_profiles_id() (в модуле kontur_focus.FocusCompliance)</a>
</li>
</ul></td>
</tr></table>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>&#169; Авторские права 2025, Ilya Sapunov. </p>
</div>
Собрано при помощи <a href="https://www.sphinx-doc.org/">Sphinx</a> с использованием
<a href="https://github.com/readthedocs/sphinx_rtd_theme">темы,</a>
предоставленной <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

View File

@@ -0,0 +1,127 @@
<!DOCTYPE html>
<html class="writer-html5" lang="ru" data-content_root="./">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>HTTP Routing Table &mdash; документация Kontur Focus Library 0.1.0</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=b86133f3" />
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=e59714d7" />
<script src="_static/jquery.js?v=5d32c60e"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
<script src="_static/documentation_options.js?v=6ff560e8"></script>
<script src="_static/doctools.js?v=9bcbadda"></script>
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="_static/translations.js?v=cd1d70c9"></script>
<script src="_static/js/theme.js"></script>
<link rel="index" title="Алфавитный указатель" href="genindex.html" />
<link rel="search" title="Поиск" href="search.html" />
<script>
DOCUMENTATION_OPTIONS.COLLAPSE_INDEX = true;
</script>
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="index.html" class="icon icon-home">
Kontur Focus Library
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Поиск в документации" aria-label="Поиск в документации" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Меню навигации">
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="setup.html">Установка</a></li>
<li class="toctree-l1"><a class="reference internal" href="focus.html">Фокус</a></li>
<li class="toctree-l1"><a class="reference internal" href="focus-compliance.html">Фокус.Комплаенс</a></li>
<li class="toctree-l1"><a class="reference internal" href="open-api.html">Open API specification</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Меню навигации для мобильных устройств" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">Kontur Focus Library</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="Навигация по страницам">
<ul class="wy-breadcrumbs">
<li><a href="index.html" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item active">HTTP Routing Table</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<h1>HTTP Routing Table</h1>
<div class="modindex-jumpbox">
<a href="#cap-/test"><strong>/test</strong></a>
</div>
<table class="indextable modindextable">
<tr class="pcap"><td></td><td>&#160;</td><td></td></tr>
<tr class="cap" id="cap-/test"><td></td><td>
<strong>/test</strong></td><td></td></tr>
<tr>
<td></td>
<td>
<a href="open-api.html#get--test"><code class="xref">GET /test</code></a></td><td>
<em>null</em></td></tr>
</table>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>&#169; Авторские права 2025, Ilya Sapunov. </p>
</div>
Собрано при помощи <a href="https://www.sphinx-doc.org/">Sphinx</a> с использованием
<a href="https://github.com/readthedocs/sphinx_rtd_theme">темы,</a>
предоставленной <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

138
docs/out/html/index.html Normal file
View File

@@ -0,0 +1,138 @@
<!DOCTYPE html>
<html class="writer-html5" lang="ru" data-content_root="./">
<head>
<meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Kontur Focus Library documentation &mdash; документация Kontur Focus Library 0.1.0</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=b86133f3" />
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=e59714d7" />
<script src="_static/jquery.js?v=5d32c60e"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
<script src="_static/documentation_options.js?v=6ff560e8"></script>
<script src="_static/doctools.js?v=9bcbadda"></script>
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="_static/translations.js?v=cd1d70c9"></script>
<script src="_static/js/theme.js"></script>
<link rel="index" title="Алфавитный указатель" href="genindex.html" />
<link rel="search" title="Поиск" href="search.html" />
<link rel="next" title="Установка" href="setup.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="#" class="icon icon-home">
Kontur Focus Library
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Поиск в документации" aria-label="Поиск в документации" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Меню навигации">
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="setup.html">Установка</a></li>
<li class="toctree-l1"><a class="reference internal" href="focus.html">Фокус</a></li>
<li class="toctree-l1"><a class="reference internal" href="focus-compliance.html">Фокус.Комплаенс</a></li>
<li class="toctree-l1"><a class="reference internal" href="open-api.html">Open API specification</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Меню навигации для мобильных устройств" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="#">Kontur Focus Library</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="Навигация по страницам">
<ul class="wy-breadcrumbs">
<li><a href="#" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item active">Kontur Focus Library documentation</li>
<li class="wy-breadcrumbs-aside">
<a href="_sources/index.rst.txt" rel="nofollow"> Просмотреть исходный код страницы</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<section id="kontur-focus-library-documentation">
<h1>Kontur Focus Library documentation<a class="headerlink" href="#kontur-focus-library-documentation" title="Ссылка на этот заголовок"></a></h1>
<p>Библиотека-обертка для взаимодействия с REST API Контур.Фокус и Фокус.Комплаенс.</p>
<div class="toctree-wrapper compound">
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="setup.html">Установка</a><ul>
<li class="toctree-l2"><a class="reference internal" href="setup.html#pip">Установка через pip</a></li>
<li class="toctree-l2"><a class="reference internal" href="setup.html#requirements-txt">Использование requirements.txt</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="focus.html">Фокус</a><ul>
<li class="toctree-l2"><a class="reference internal" href="focus.html#id2">Подготовка</a></li>
<li class="toctree-l2"><a class="reference internal" href="focus.html#id3">Инициализация</a></li>
<li class="toctree-l2"><a class="reference internal" href="focus.html#id4">Основные методы</a></li>
<li class="toctree-l2"><a class="reference internal" href="focus.html#id5">Юридические лица</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="focus-compliance.html">Фокус.Комплаенс</a><ul>
<li class="toctree-l2"><a class="reference internal" href="focus-compliance.html#id2">Подготовка</a></li>
<li class="toctree-l2"><a class="reference internal" href="focus-compliance.html#id3">Инициализация</a></li>
<li class="toctree-l2"><a class="reference internal" href="focus-compliance.html#id4">Основные методы</a></li>
<li class="toctree-l2"><a class="reference internal" href="focus-compliance.html#id5">Юридические лица</a></li>
<li class="toctree-l2"><a class="reference internal" href="focus-compliance.html#id6">Физические лица</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="open-api.html">Open API specification</a></li>
</ul>
</div>
</section>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Нижняя область">
<a href="setup.html" class="btn btn-neutral float-right" title="Установка" accesskey="n" rel="next">Следующая <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
</div>
<hr/>
<div role="contentinfo">
<p>&#169; Авторские права 2025, Ilya Sapunov. </p>
</div>
Собрано при помощи <a href="https://www.sphinx-doc.org/">Sphinx</a> с использованием
<a href="https://github.com/readthedocs/sphinx_rtd_theme">темы,</a>
предоставленной <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

BIN
docs/out/html/objects.inv Normal file

Binary file not shown.

123
docs/out/html/open-api.html Normal file
View File

@@ -0,0 +1,123 @@
<!DOCTYPE html>
<html class="writer-html5" lang="ru" data-content_root="./">
<head>
<meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Open API specification &mdash; документация Kontur Focus Library 0.1.0</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=b86133f3" />
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=e59714d7" />
<script src="_static/jquery.js?v=5d32c60e"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
<script src="_static/documentation_options.js?v=6ff560e8"></script>
<script src="_static/doctools.js?v=9bcbadda"></script>
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="_static/translations.js?v=cd1d70c9"></script>
<script src="_static/js/theme.js"></script>
<link rel="index" title="Алфавитный указатель" href="genindex.html" />
<link rel="search" title="Поиск" href="search.html" />
<link rel="prev" title="Фокус.Комплаенс" href="focus-compliance.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="index.html" class="icon icon-home">
Kontur Focus Library
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Поиск в документации" aria-label="Поиск в документации" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Меню навигации">
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="setup.html">Установка</a></li>
<li class="toctree-l1"><a class="reference internal" href="focus.html">Фокус</a></li>
<li class="toctree-l1"><a class="reference internal" href="focus-compliance.html">Фокус.Комплаенс</a></li>
<li class="toctree-l1 current"><a class="current reference internal" href="#">Open API specification</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Меню навигации для мобильных устройств" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">Kontur Focus Library</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="Навигация по страницам">
<ul class="wy-breadcrumbs">
<li><a href="index.html" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item active">Open API specification</li>
<li class="wy-breadcrumbs-aside">
<a href="_sources/open-api.rst.txt" rel="nofollow"> Просмотреть исходный код страницы</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<section id="open-api-specification">
<h1>Open API specification<a class="headerlink" href="#open-api-specification" title="Ссылка на этот заголовок"></a></h1>
<dl class="http get">
<dt class="sig sig-object http" id="get--test">
<span class="sig-name descname"><span class="pre">GET</span> </span><span class="sig-name descname"><span class="pre">/test</span></span><a class="headerlink" href="#get--test" title="Ссылка на это определение"></a></dt>
<dd><dl class="field-list simple">
<dt class="field-odd">Status Codes<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.1">200 OK</a></span> OK</p></li>
</ul>
</dd>
</dl>
</dd></dl>
</section>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Нижняя область">
<a href="focus-compliance.html" class="btn btn-neutral float-left" title="Фокус.Комплаенс" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Предыдущая</a>
</div>
<hr/>
<div role="contentinfo">
<p>&#169; Авторские права 2025, Ilya Sapunov. </p>
</div>
Собрано при помощи <a href="https://www.sphinx-doc.org/">Sphinx</a> с использованием
<a href="https://github.com/readthedocs/sphinx_rtd_theme">темы,</a>
предоставленной <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

124
docs/out/html/search.html Normal file
View File

@@ -0,0 +1,124 @@
<!DOCTYPE html>
<html class="writer-html5" lang="ru" data-content_root="./">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Поиск &mdash; документация Kontur Focus Library 0.1.0</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=b86133f3" />
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=e59714d7" />
<script src="_static/jquery.js?v=5d32c60e"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
<script src="_static/documentation_options.js?v=6ff560e8"></script>
<script src="_static/doctools.js?v=9bcbadda"></script>
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="_static/translations.js?v=cd1d70c9"></script>
<script src="_static/js/theme.js"></script>
<script src="_static/searchtools.js"></script>
<script src="_static/language_data.js"></script>
<link rel="index" title="Алфавитный указатель" href="genindex.html" />
<link rel="search" title="Поиск" href="#" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="index.html" class="icon icon-home">
Kontur Focus Library
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="#" method="get">
<input type="text" name="q" placeholder="Поиск в документации" aria-label="Поиск в документации" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Меню навигации">
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="setup.html">Установка</a></li>
<li class="toctree-l1"><a class="reference internal" href="focus.html">Фокус</a></li>
<li class="toctree-l1"><a class="reference internal" href="focus-compliance.html">Фокус.Комплаенс</a></li>
<li class="toctree-l1"><a class="reference internal" href="open-api.html">Open API specification</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Меню навигации для мобильных устройств" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">Kontur Focus Library</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="Навигация по страницам">
<ul class="wy-breadcrumbs">
<li><a href="index.html" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item active">Поиск</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<noscript>
<div id="fallback" class="admonition warning">
<p class="last">
Активируйте JavaScript, чтобы использовать функционал поиска.
</p>
</div>
</noscript>
<div id="search-results">
</div>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>&#169; Авторские права 2025, Ilya Sapunov. </p>
</div>
Собрано при помощи <a href="https://www.sphinx-doc.org/">Sphinx</a> с использованием
<a href="https://github.com/readthedocs/sphinx_rtd_theme">темы,</a>
предоставленной <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
<script>
jQuery(function() { Search.loadIndex("searchindex.js"); });
</script>
<script id="searchindexloader"></script>
</body>
</html>

File diff suppressed because one or more lines are too long

136
docs/out/html/setup.html Normal file
View File

@@ -0,0 +1,136 @@
<!DOCTYPE html>
<html class="writer-html5" lang="ru" data-content_root="./">
<head>
<meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Установка &mdash; документация Kontur Focus Library 0.1.0</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=b86133f3" />
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=e59714d7" />
<script src="_static/jquery.js?v=5d32c60e"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
<script src="_static/documentation_options.js?v=6ff560e8"></script>
<script src="_static/doctools.js?v=9bcbadda"></script>
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="_static/translations.js?v=cd1d70c9"></script>
<script src="_static/js/theme.js"></script>
<link rel="index" title="Алфавитный указатель" href="genindex.html" />
<link rel="search" title="Поиск" href="search.html" />
<link rel="next" title="Фокус" href="focus.html" />
<link rel="prev" title="Kontur Focus Library documentation" href="index.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="index.html" class="icon icon-home">
Kontur Focus Library
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Поиск в документации" aria-label="Поиск в документации" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Меню навигации">
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
<ul class="current">
<li class="toctree-l1 current"><a class="current reference internal" href="#">Установка</a><ul>
<li class="toctree-l2"><a class="reference internal" href="#pip">Установка через pip</a></li>
<li class="toctree-l2"><a class="reference internal" href="#requirements-txt">Использование requirements.txt</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="focus.html">Фокус</a></li>
<li class="toctree-l1"><a class="reference internal" href="focus-compliance.html">Фокус.Комплаенс</a></li>
<li class="toctree-l1"><a class="reference internal" href="open-api.html">Open API specification</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Меню навигации для мобильных устройств" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">Kontur Focus Library</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="Навигация по страницам">
<ul class="wy-breadcrumbs">
<li><a href="index.html" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item active">Установка</li>
<li class="wy-breadcrumbs-aside">
<a href="_sources/setup.rst.txt" rel="nofollow"> Просмотреть исходный код страницы</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<section id="id1">
<h1>Установка<a class="headerlink" href="#id1" title="Ссылка на этот заголовок"></a></h1>
<p>Для установки необходимо иметь доступ в корпоративный <a class="reference external" href="https://git.selectel.org">Gitlab</a>, чтобы получить доступ к Registry PyPi.</p>
<section id="pip">
<h2>Установка через pip<a class="headerlink" href="#pip" title="Ссылка на этот заголовок"></a></h2>
<p>Выполните <code class="docutils literal notranslate"><span class="pre">pip</span> <span class="pre">install</span> <span class="pre">kontur-focus</span> <span class="pre">--index-url</span> <span class="pre">https://__token__:&lt;your_personal_token&gt;&#64;git.selectel.org/api/v4/projects/6350/packages/pypi/simple</span></code></p>
<p>Где <cite>&lt;your_personal_token&gt;</cite> - <a class="reference external" href="https://git.selectel.org/help/user/profile/personal_access_tokens">персональный токен</a> доступа Gitlab.</p>
</section>
<section id="requirements-txt">
<h2>Использование requirements.txt<a class="headerlink" href="#requirements-txt" title="Ссылка на этот заголовок"></a></h2>
<p>Перед использованием необходимо настроить Registry.</p>
<p>Создайте файл <cite>.pypirc</cite> в папке пользователя и добавьте параметры репозитория:</p>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="go">[gitlab]</span>
<span class="go">repository = https://git.selectel.org/api/v4/projects/6350/packages/pypi</span>
<span class="go">username = __token__</span>
<span class="go">password = &lt;your personal access token&gt;</span>
</pre></div>
</div>
<p>Более подробно <a class="reference external" href="https://git.selectel.org/help/user/packages/pypi_repository/index">тут</a>.</p>
<p>После выполните <code class="docutils literal notranslate"><span class="pre">pip</span> <span class="pre">install</span> <span class="pre">-r</span> <span class="pre">requirements.txt</span></code></p>
</section>
</section>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Нижняя область">
<a href="index.html" class="btn btn-neutral float-left" title="Kontur Focus Library documentation" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Предыдущая</a>
<a href="focus.html" class="btn btn-neutral float-right" title="Фокус" accesskey="n" rel="next">Следующая <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
</div>
<hr/>
<div role="contentinfo">
<p>&#169; Авторские права 2025, Ilya Sapunov. </p>
</div>
Собрано при помощи <a href="https://www.sphinx-doc.org/">Sphinx</a> с использованием
<a href="https://github.com/readthedocs/sphinx_rtd_theme">темы,</a>
предоставленной <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

View File

@@ -86,6 +86,29 @@ class Focus(Request):
return {'success': False, 'message': e} return {'success': False, 'message': e}
else: else:
return response return response
def finan(self, path: str = None):
"""В файле указана рейтинговая таблица и окончательное заключение о финансовых показателях компании.
:param path: Путь выгрузки файла. Если не указан, выгружается в текущий каталог, defaults to None
:type path: str, optional
"""
response = self.get('/finan')
current_datetime = datetime.now().strftime('%d-%m-%Y_%H-%M')
filename = f'Финансовый_анализ_{self.inn}_{current_datetime}.pdf'
if not path:
file_path = os.path.join(self._basedir, filename)
else:
file_path = os.path.join(path, filename)
try:
with open(file_path, mode='wb') as file:
file.write(response.content)
return {'success': True, 'filename': filename, 'path': file_path}
except Exception as e:
return {'success': False, 'message': e}
def founders_history(self): def founders_history(self):
"""История владения организацией """История владения организацией

View File

@@ -7,8 +7,20 @@ from datetime import datetime
class FocusCompliance(Request): class FocusCompliance(Request):
_basedir = os.path.abspath(os.path.dirname(__file__)) _basedir = os.path.abspath(os.path.dirname(__file__))
_focus_base_url = None _focus_base_url = None
check_models = [
{
'name': 'corporate',
'description': 'Корпоративный сегмент',
'risk_model_id': 'a9457161-0454-448a-bc2c-83a89cd51b42'
},
{
'name': '115-fz',
'description': '115 ФЗ для некредитных финансовых организаций',
'risk_model_id': '887ee87c-3a43-48d7-a4ad-05c0a64ff53a'
}
]
def __init__(self, inn: str, ogrn: str = None): def __init__(self, inn: str = None, ogrn: str = None):
load_dotenv() load_dotenv()
super().__init__( super().__init__(
base_url=os.environ.get('FOCUS_COMPLIANCE_BASE_URL'), base_url=os.environ.get('FOCUS_COMPLIANCE_BASE_URL'),
@@ -67,24 +79,33 @@ class FocusCompliance(Request):
return fal_data return fal_data
def search_global_company_profiles_id(self) -> list: def search_global_company_profiles_id(self, company_name: str = None) -> list:
"""Поиск сводной информации по санкционным профилям ЮЛ """Поиск сводной информации по санкционным профилям ЮЛ
:param company_name: Наименование компании
:type company_name: str
:return: Список идентификаторов профилей :return: Список идентификаторов профилей
:rtype: list :rtype: list
""" """
if self.inn:
query = self.inn
elif company_name:
query = company_name
else:
return {'success': False, 'result': 'Не указан ИНН или наименование контрагента'}
try: try:
response = self.get(f'{self._focus_base_url}/companies/profiles/search', query=self.inn) response = self.get(f'{self._focus_base_url}/companies/profiles/search', query=query)
profiles = response['legalEntityProfiles'] profiles = response['legalEntityProfiles']
if not profiles: if not profiles:
return profiles return {'success': True, 'result': profiles}
elif len(profiles) > 1: elif len(profiles) > 1:
return [profile['id'] for profile in profiles] return {'success': True, 'result': [profile['id'] for profile in profiles]}
else: else:
return [profiles[0]['id']] return {'success': True, 'result': [profiles[0]['id']]}
except KeyError: except KeyError:
return None return {'success': False, 'result': 'Key Error'}
def legal_entity_profile_report(self, profile_id_list: list, path: str = None) -> dict: def legal_entity_profile_report(self, profile_id_list: list, path: str = None) -> dict:
"""Получение печатного отчета по профилю ЮЛ """Получение печатного отчета по профилю ЮЛ
@@ -123,6 +144,33 @@ class FocusCompliance(Request):
return {'success': True, 'files': [result]} return {'success': True, 'files': [result]}
def full_company_report(self, model: str = '115-fz', path: str = None) -> dict:
"""Запрос на полную проверку и построение печатного отчёта по организации
:param model: Идентификатор модели, по которой пройдет проверка.
Идентификатор возвращается в методе «Получение списка рисковых моделей организации»
GET /banks/{bankId}/models, defaults to '115-fz'
:type model: str, optional
:param path: Путь сохранения файла, по-умолчанию файл сохраняется в текущий каталог, defaults to None
:type path: str, optional
:return: Отчет о результате сохранения файла
:rtype: dict
"""
if model == '115-fz':
model_id = [d['risk_model_id'] for d in self.check_models if d['name'] == model][0]
else:
model_id = [d['risk_model_id'] for d in self.check_models if d['name'] == 'corporate'][0]
response = self.get(f'{self._focus_base_url}/models/{model_id}/fullCompanyReport')
result = self._save_file(
filename='Полный_отчет',
content=response.content,
file_type='docx',
path=path
)
return {'success': True, 'file': result}
# Физлица # Физлица
def person_is_foreign_agent(self): def person_is_foreign_agent(self):
"""Вхождение физлица в список иностранных агентов """Вхождение физлица в список иностранных агентов
@@ -148,7 +196,60 @@ class FocusCompliance(Request):
except KeyError: except KeyError:
return None return None
def get_foreign_agents_list(self): # Не работает, если нет подключенной лицензии def full_individual_report(self, path: str = None, passport: str = None, fio: str = None) -> dict:
response = self.get(path=f'{self._focus_base_url}/foreign-agents') """Запрос на построение печатного отчёта по физ лицу
Необходимо обязательно указать либо ИНН, либо ФИО и номер паспорта
:param path: Путь сохранения файла, по-умолчанию файл сохраняется в текущий каталог, defaults to None
:type path: str, optional
:param passport: Номер паспорты, defaults to None
:type passport: str, optional
:param fio: ФИО (хотя бы фамилия и имя), defaults to None
:type fio: str, optional
:return: Отчет о результате сохранения файла
:rtype: dict
"""
if self.inn:
response = self.get(path=f'{self._focus_base_url}/formFullIndividualReport')
elif not self.inn and passport and fio:
response = self.get(path=f'{self._focus_base_url}/formFullIndividualReport', passportNumber=passport, fio=fio)
else:
return {'success': False, 'result': 'Необходимо указать: либо ИНН, либо ФИО (хотя бы фамилию и имя) и паспорт'}
return response try:
if response.status_code == 200:
result = self._save_file(
filename='Полный_отчет',
content=response.content,
file_type='docx',
path=path
)
return {'success': True, 'file': result}
else:
return {'success': False, 'result': 'Ошибка получения отчета. Проверьте корректность ИНН, ФИО или паспортных данных.'}
except AttributeError:
return {'success': False, 'result': 'Ошибка получения отчета. Проверьте корректность ИНН, ФИО или паспортных данных.'}
# Иноагенты
def get_foreign_agents_list(self, fa_type: str = None) -> list: # Не работает, если нет подключенной лицензии
"""Получение списка иноагентов
:param fa_type: Тип иноагента (i - физ. лица, l - юридические лица), если не указано, выгружаются все типы, defaults to None
:type fa_type: str, optional
:return: Список данных по иноагентам
:rtype: list
"""
response = self.get(path=f'{self._focus_base_url}/foreign-agents')
result = None
if fa_type == 'i':
individuals = response['individuals']
result = individuals
elif fa_type == 'l':
legal_entities = response['legalEntities']
result = legal_entities
else:
result = [response]
return result

View File

@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
setup( setup(
name="kontur_focus", name="kontur_focus",
version="0.2.7", version="2025.11.4",
author="Ilya Sapunov", author="Ilya Sapunov",
author_email="sapunov@selectel.ru", author_email="sapunov@selectel.ru",
description="Библиотека-обертка для взаимодействия с REST API Контур.Фокус и Фокус.Комплаенс", description="Библиотека-обертка для взаимодействия с REST API Контур.Фокус и Фокус.Комплаенс",