<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://rustpython.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://rustpython.github.io/" rel="alternate" type="text/html" /><updated>2026-04-04T03:22:46+00:00</updated><id>https://rustpython.github.io/feed.xml</id><title type="html">RustPython</title><subtitle>An open source Python 3 (CPython &gt;= 3.11.0) interpreter written in Rust 🐍 😱 🤘</subtitle><entry><title type="html">Using RustPython with PyCharm and Visual Studio Code on macOS.</title><link href="https://rustpython.github.io/blog/2021/12/01/using-rustpython.html" rel="alternate" type="text/html" title="Using RustPython with PyCharm and Visual Studio Code on macOS." /><published>2021-12-01T16:45:00+00:00</published><updated>2021-12-01T16:45:00+00:00</updated><id>https://rustpython.github.io/blog/2021/12/01/using-rustpython</id><content type="html" xml:base="https://rustpython.github.io/blog/2021/12/01/using-rustpython.html"><![CDATA[<p>For macOS, here is how you can setup RustPython as an interpreter for PyCharm and Visual Studio Code.</p>

<h2 id="pre-requisites">Pre-requisites</h2>

<p>You will need:</p>
<ul>
  <li>The xcode command line tools from Apple</li>
  <li>Rust <a href="https://www.rust-lang.org/tools/install">(instructions)</a></li>
</ul>

<p>Here are the commands to install them:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">xcode-select --install</code></li>
  <li><code class="language-plaintext highlighter-rouge">curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh</code></li>
</ul>

<p>(those might change over time)</p>

<h2 id="install-rustpython">Install RustPython</h2>

<p>First run:</p>

<p><code class="language-plaintext highlighter-rouge">cargo install --git https://github.com/RustPython/RustPython</code></p>

<p>If you want RustPython with ssl support, try:</p>

<p><code class="language-plaintext highlighter-rouge">cargo install --git https://github.com/RustPython/RustPython --features ssl</code></p>

<p>Go to Cargo’s bin directory with <code class="language-plaintext highlighter-rouge">cd ~/.cargo/bin</code>. Run <code class="language-plaintext highlighter-rouge">ls</code>, you should see the binary <code class="language-plaintext highlighter-rouge">~/.cargo/bin/rustpython</code>.</p>

<p>If you type <code class="language-plaintext highlighter-rouge">rustpython</code> at the terminal, you should get the welcome message:<br />
<img src="/assets/media/rustpython-welcome.jpg" alt="RustPython Welcome Message" /></p>

<h2 id="setup-pycharm">Setup PyCharm</h2>

<p>In PyCharm, you can add an interpreter by using:</p>
<ul>
  <li>virtual environment</li>
  <li>conda</li>
  <li>pipenv</li>
  <li>system interpreter</li>
  <li>poetry</li>
</ul>

<p>The full docs are on <a href="https://www.jetbrains.com/help/pycharm/configuring-python-interpreter.html">this link</a>. This blog post is for the two options: virtual environment and system interpreter.</p>

<h3 id="system-interpreter">System interpreter</h3>
<p>Go to “Add Python Interpreter” -&gt; System Interpreter -&gt; Click on the browse icon.</p>

<p><img src="/assets/media/pycharm-add-interpreter-list.jpg" alt="PyCharm add Interpreter" /></p>

<p>Navigate to <code class="language-plaintext highlighter-rouge">/Users/YOURUSERNAME/.cargo/bin</code> - selecting <code class="language-plaintext highlighter-rouge">rustpython</code> as the interpreter gives this error:</p>

<p><img src="/assets/media/pycharm-rustpython-error.jpg" alt="PyCharm add Interpreter" /></p>

<p>There is an easy fix. Create a link/shortcut called <code class="language-plaintext highlighter-rouge">python</code> that points to <code class="language-plaintext highlighter-rouge">rustpython</code>.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cd ~/.cargo/bin
ln -s rustpython python
</code></pre></div></div>

<p>PyCharm is happy. Test out that things work by creating a python file in PyCharm and running</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">sys</span>
<span class="k">print</span><span class="p">(</span><span class="n">sys</span><span class="p">.</span><span class="n">executable</span><span class="p">)</span>
</code></pre></div></div>

<h3 id="virtual-environment">Virtual environment</h3>

<p>In the screen above, if you try to use the virtual option, you get this error.</p>

<p><img src="/assets/media/pycharm-venv-error.jpg" alt="venv error" /></p>

<p>However, you can still manually create the virtual environment. First, create a directory, cd into into it and run:
 <code class="language-plaintext highlighter-rouge">~/.cargo/bin/rustpython -m venv env --without-pip</code></p>

<p>This would create a virtual environement that looks like this.</p>

<p><img src="/assets/media/tree.jpg" alt="venv" /></p>

<p>Go the directory, open PyCharm, now you can set the interpreter from the virtual environement.</p>

<h2 id="setup-visual-studio-code">Setup Visual Studio Code</h2>

<p>Install the Python Extension by Micorsoft. Create your Python file and press <code class="language-plaintext highlighter-rouge">Command + Shift + P</code>, then search for “Python: Select Interpreter”, add a new interpreter by using “Enter Interpreter Path” then browse your filesystem, go to <code class="language-plaintext highlighter-rouge">~/.cargo/bin/rustpython</code></p>

<p>You can repeat the same steps for creating a virtual environement and using that with Visual Studio Code.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[For macOS, here is how you can setup RustPython as an interpreter for PyCharm and Visual Studio Code.]]></summary></entry><entry><title type="html">pip is working! 🎉 🎉</title><link href="https://rustpython.github.io/blog/2021/01/26/pip-support.html" rel="alternate" type="text/html" title="pip is working! 🎉 🎉" /><published>2021-01-26T16:45:00+00:00</published><updated>2021-01-26T16:45:00+00:00</updated><id>https://rustpython.github.io/blog/2021/01/26/pip-support</id><content type="html" xml:base="https://rustpython.github.io/blog/2021/01/26/pip-support.html"><![CDATA[<p>7380 commits and 1940 pull requests later, <strong>pip</strong> and <strong>get-pip.py</strong> are working with RustPython 🎉  🎉. pip can install itself and setuptools!</p>

<p>This update is brought to you from <a href="https://github.com/coolreader18">@coolreader18’s</a> terminal by asciinema 🍿.</p>

<h2 id="get-pippy">get-pip.py</h2>
<p><a href="https://asciinema.org/a/3pAZSfrFeIbEUzpPyXtvYZCeN"><img src="https://asciinema.org/a/3pAZSfrFeIbEUzpPyXtvYZCeN.svg" alt="asciicast" /></a></p>

<h2 id="get-pippy--pip-install-requests">get-pip.py + pip install requests</h2>
<p><a href="https://asciinema.org/a/fuTmP0wMD8HnvwsOkPRPuVHoa"><img src="https://asciinema.org/a/fuTmP0wMD8HnvwsOkPRPuVHoa.svg" alt="asciicast" /></a></p>

<h2 id="pip-installs-itself-and-setup-tools">pip installs itself and setup tools</h2>
<p><a href="https://asciinema.org/a/y2rIeqELmzn5LCaWI6MLMvujz"><img src="https://asciinema.org/a/y2rIeqELmzn5LCaWI6MLMvujz.svg" alt="asciicast" /></a></p>

<h2 id="what-you-need-to-do">What you need to do</h2>

<p>(Update 2021-02-08): Everything has been merged to master!</p>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="nv">$ </span>cargo <span class="nb">install</span> <span class="nt">--git</span> https://github.com/RustPython/RustPython <span class="nt">--features</span> ssl <span class="c"># or however you build</span>
    <span class="nv">$ </span>curl https://bootstrap.pypa.io/get-pip.py <span class="nt">-O</span>
    <span class="nv">$ </span>rustpython get-pip.py
    ...lots of work...
    <span class="nv">$ </span>rustpython <span class="nt">-m</span> pip <span class="nt">--version</span>
    pip 21.0 from /home/.../.local/lib/rustpython3.9/site-packages/pip <span class="o">(</span>python 3.9<span class="o">)</span>
</code></pre></div></div>

<p>There’s undoubtedly still a lot that doesn’t work, so if there’s something simple-ish that errors inside of pip or a setup script, feel free to open an issue for it (note that C extensions won’t be supported anytime soon, and a ctypes implementation is in progress).</p>

<p>(Previous instructions):</p>

<p>This update is so fresh, things are not merged into the <code class="language-plaintext highlighter-rouge">master</code> or <code class="language-plaintext highlighter-rouge">release</code> branches yet. For now, to test this out, you have to checkout the <code class="language-plaintext highlighter-rouge">pip-merg</code> branch, and make sure to build with the <code class="language-plaintext highlighter-rouge">ssl</code> feature:</p>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="nv">$ </span><span class="nb">cd </span>RustPython
    <span class="nv">$ </span>git fetch <span class="nt">--all</span>
    <span class="nv">$ </span>git checkout pip-merg
    <span class="nv">$ </span>cargo <span class="nb">install</span> <span class="nt">--path</span> <span class="nb">.</span> <span class="nt">--features</span> ssl
    <span class="nv">$ </span>curl https://bootstrap.pypa.io/get-pip.py <span class="nt">-O</span>
    <span class="nv">$ </span>rustpython get-pip.py
    ...lots of work...
    <span class="nv">$ </span>rustpython <span class="nt">-m</span> pip <span class="nt">--version</span>
    pip 21.0 from /home/.../.local/lib/rustpython3.9/site-packages/pip <span class="o">(</span>python 3.9<span class="o">)</span>
</code></pre></div></div>]]></content><author><name></name></author><category term="featured" /><summary type="html"><![CDATA[7380 commits and 1940 pull requests later, pip and get-pip.py are working with RustPython 🎉 🎉. pip can install itself and setuptools!]]></summary></entry><entry><title type="html">How to contribute to RustPython using CPython’s unit tests</title><link href="https://rustpython.github.io/blog/2020/04/04/how-to-contribute-by-cpython-unittest.html" rel="alternate" type="text/html" title="How to contribute to RustPython using CPython’s unit tests" /><published>2020-04-04T16:45:00+00:00</published><updated>2020-04-04T16:45:00+00:00</updated><id>https://rustpython.github.io/blog/2020/04/04/how-to-contribute-by-cpython-unittest</id><content type="html" xml:base="https://rustpython.github.io/blog/2020/04/04/how-to-contribute-by-cpython-unittest.html"><![CDATA[<p>At the very end of 2019, we finally reached one of our short-term goals: CPython <code class="language-plaintext highlighter-rouge">unittest</code> support which makes finding CPython compatibility errors easier than ever.
This will probably be the major source of contributions for new contributors this year. Here is a simple guideline.</p>

<h2 id="fix-known-compatibility-bugs">Fix known compatibility bugs</h2>
<p>Let’s find an incompatibility issue and fix it.</p>
<ol>
  <li>Look at the <code class="language-plaintext highlighter-rouge">Lib/test</code> directory of the project. There are many <code class="language-plaintext highlighter-rouge">test_</code> prefixed files like <code class="language-plaintext highlighter-rouge">test_unicode.py</code>.</li>
  <li>Try to open one of them. It might look just fine at a glance - but search for <code class="language-plaintext highlighter-rouge">TODO: RUSTPYTHON</code> in the files. There are tons of skipped, marked as an expected failure or commented out tests.</li>
  <li>Alternatively, try looking at the <a href="/pages/regression-tests-results.html">regression test results</a> to find skipped or expected failure tests; some of them have
notes for a way to resolve the issue.</li>
  <li>Choose one or two interesting bugs. Remove the test blocker - <code class="language-plaintext highlighter-rouge">skip</code>, <code class="language-plaintext highlighter-rouge">expectedFailure</code> or comments.</li>
  <li>Try to fix them.</li>
</ol>

<p>Here’s how you run a single unittest file:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ RUSTPYTHONPATH=Lib cargo run --release Lib/test/test_unicode.py
</code></pre></div></div>

<h2 id="add-a-new-unittest-file">Add a new unittest file</h2>
<p>Because CPython unittest doesn’t work perfectly in RustPython, we are adding test files one by one. Here’s how:</p>
<ol>
  <li>Download the CPython source code with <code class="language-plaintext highlighter-rouge">git clone https://github.com/python/cpython.git</code>.</li>
  <li>Check out a specific version of CPython. We test against CPython 3.8, so the most recent release of 3.8 (<a href="https://www.python.org/doc/versions/">currently 3.8.7</a>) is recommended.</li>
  <li>Copy a file from CPython’s <code class="language-plaintext highlighter-rouge">Lib/test</code></li>
  <li>Commit the file without editing it. Specify the CPython version you copied from in the commit message.</li>
  <li>Try to edit it until it runs without a crash or failure.</li>
  <li>Commit the changes to make it run. This is the core contribution.</li>
</ol>

<p>Because RustPython is not perfect, “try to edit it until it runs” doesn’t mean to make it run 100% of the tests successfully. The common methods to make the test file pass are:</p>
<ol>
  <li>It must at least be able to start to run the tests. Fix the test code or bug until it runs at least a single unit of the test. Typically, unimplemented stdlib or missing files in <code class="language-plaintext highlighter-rouge">unittest</code> can cause issues. Sometimes RustPython bugs cause issues too.</li>
  <li>If any test can’t be loaded because of a <code class="language-plaintext highlighter-rouge">SyntaxError</code>, you’ll have to comment that part out.</li>
  <li>If any test leads to a crash of RustPython, this code can’t be run. Mark the test with <code class="language-plaintext highlighter-rouge">@unittest.skip('TODO: RUSTPYTHON')</code> to skip it.</li>
  <li>If any test runs but fails, this is an incompatibility issue. Mark the test as an expected failure with <code class="language-plaintext highlighter-rouge">@unittest.expectedFailure</code>.</li>
</ol>

<p>We prefer the reversed order of above methods. The later, the more strict, so it’s easier to detect any progress or regression.
When we temporarily disable parts of <code class="language-plaintext highlighter-rouge">unittest</code> due to RustPython caveats, we mark them to make it easier to find (and re-enable!) them later. Please see the examples below or search for <code class="language-plaintext highlighter-rouge">TODO: RUSTPYTHON</code> in the <code class="language-plaintext highlighter-rouge">Lib/test</code> directory to check actual usage.</p>

<p>Comment out:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># TODO: RUSTPYTHON
#
# def ...  # commented out tests
</span></code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">skip</code>:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">@</span><span class="n">unittest</span><span class="p">.</span><span class="n">skip</span><span class="p">(</span><span class="s">"TODO: RUSTPYTHON"</span><span class="p">)</span>
<span class="k">def</span> <span class="err">...  # </span><span class="nf">skipped</span> <span class="n">tests</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">expectedFailure</code>:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># TODO: RUSTPYTHON
</span><span class="o">@</span><span class="n">unittest</span><span class="p">.</span><span class="n">expectedFailure</span>
<span class="k">def</span> <span class="err">...  # </span><span class="nf">failed</span> <span class="n">tests</span>
</code></pre></div></div>

<h2 id="development-guide">Development guide</h2>
<p>For a general introduction to RustPython development, please visit the <a href="https://github.com/RustPython/RustPython/blob/master/DEVELOPMENT.md">RustPython development guide</a></p>]]></content><author><name></name></author><category term="guideline" /><category term="featured" /><summary type="html"><![CDATA[At the very end of 2019, we finally reached one of our short-term goals: CPython unittest support which makes finding CPython compatibility errors easier than ever. This will probably be the major source of contributions for new contributors this year. Here is a simple guideline.]]></summary></entry><entry><title type="html">Introduction to the RustPython parser</title><link href="https://rustpython.github.io/blog/2020/04/02/thing-explainer-parser.html" rel="alternate" type="text/html" title="Introduction to the RustPython parser" /><published>2020-04-02T15:34:01+00:00</published><updated>2020-04-02T15:34:01+00:00</updated><id>https://rustpython.github.io/blog/2020/04/02/thing-explainer-parser</id><content type="html" xml:base="https://rustpython.github.io/blog/2020/04/02/thing-explainer-parser.html"><![CDATA[<p>This post goes over the RustPython parser. You can see the source code in the <a href="https://github.com/RustPython/RustPython/tree/main/compiler/parser">rustpython-parser</a> crate.</p>

<p>When you write code in Python and run it, an interpreter, such as the RustPython interpreter, acts as the translator between you and your machine.</p>

<p>The interpreter has the job of turning your human code into bytecode that a Python virtual machine can run. Bytecode is an intermediate code between source code and machine code. This makes it portable across multiple hardware and operating systems. Bytecode “works” as long as you implement a virtual machine (vm) that can run it. There is a performance penalty for this flexibility. RustPython also <a href="https://github.com/RustPython/RustPython/tree/main/vm">has a vm</a> that interprets the generated bytecode, other posts will go into the details of that vm but now let’s figure out how to turn code into bytecode.</p>

<h2 id="what-bytecode-looks-like">What bytecode looks like</h2>

<p>Seeing is believing. To see what bytecode looks like, you can use a Python module called <a href="https://docs.python.org/3/library/dis.html"><code class="language-plaintext highlighter-rouge">dis</code></a>. “dis” is short of for _dis_assembler. You can write source code then see how its bytecode looks like. Here is an example:</p>

<p><img src="/assets/media/bytecode.jpg" alt="bytecode" /></p>

<h2 id="how-rustpython-turns-your-code-into-bytecode">How RustPython turns your code into bytecode</h2>

<p>Here are the main steps that RustPython currently goes through:</p>
<ul>
  <li>parse the line of source code into tokens</li>
  <li>determine if the tokens have a valid syntax</li>
  <li>create an Abstract Syntax Tree (AST)</li>
  <li>compile the AST into bytecode</li>
</ul>

<p>This list of steps introduces some new concepts like: tokens and abstract syntax trees. We’ll explain and demistify those.</p>

<h3 id="step-1-parsing-source-code-into-tokens">Step 1: parsing source code into tokens</h3>

<p>The fastest way to understand what tokens are, is to see them. Conveniently, Python comes with a <a href="https://docs.python.org/3/library/tokenize.html">tokenizer</a>. Here is what happens if I run the tokenizer on the function that I created above.</p>

<p><code class="language-plaintext highlighter-rouge">$ python -m tokenize file.py</code></p>

<p><code class="language-plaintext highlighter-rouge">file.py</code> has the function that I used in the previous example.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">x</span><span class="o">+</span><span class="n">y</span>
</code></pre></div></div>

<p><strong>Tokenize output:</strong><br />
<img src="/assets/media/tokenizing.jpg" alt="tokenzizing" /></p>

<p>A picture IS worth a thousand words 😛 Those are the tokens. They are the basic “units” of the programming language. They are the keywords and operators that you typed. Even new lines and identation count.</p>

<p>If you want to sound fancy:</p>
<ul>
  <li>The tokens are the basic “lexical components”</li>
  <li>The parsing process is called “lexical analysis”</li>
  <li>The thing that does this is a “lexer”</li>
</ul>

<p>The code for the lexing stage lives in <a href="https://github.com/RustPython/RustPython/blob/main/compiler/parser/src/lexer.rs">lex.rs</a> of the parser crate.</p>

<p>If you want to dive into the details of lexical analysis, check out <a href="https://learning.oreilly.com/library/view/python-in-a/9781491913833/ch03.html#python_language-id00003">Python in a nutshell / Lexical structure</a></p>

<h3 id="step-2--determine-if-the-tokens-are-valid-syntax">Step 2 : determine if the tokens are valid syntax</h3>

<p>In the previous step, if you add random stuff to your function and tokenize it, it will work and still tokenize.</p>

<p><img src="/assets/media/tokenizing-with-errors.jpg" alt="tokenzizing" /></p>

<p>So don’t hate on the whole interpreter when you get error messages! or at least don’t hate on the tokenizer!</p>

<p>To determine if the tokens are valid syntax, first you need a definition of what a valid syntax is. Python has a defined “grammar” or set of rules. The official reference is on <a href="https://docs.python.org/3/reference/grammar.html">this link</a>. There, you will find a machine readable file. You may read a book to know the rules of Python, but words are too “fluffy”, an algorithm that verifies if the rules are followed needs a very strict set of rules encoded in a file. <a href="https://www.youtube.com/watch?v=KGMFvy2d5OI">This video</a> explains the Python grammar and the file’s notation.
As the presenter puts it, this is the spirit of the beast (Python) and it is only ~10KB 😭 (compare that to the size of the Python books you had to read!)</p>

<p>So, we have the rules or grammar of a programming language in a machine encoded format… now we need to write something that verifies that those rules were followed… This sounds like something that other people could use and like something that should exist as an open source project! 🤔</p>

<p>Sure enough, there is a whole Rust framework called <code class="language-plaintext highlighter-rouge">LALRPOP</code>. It takes the tokens generated by the lexer, verifies the syntax and turns the tokens into an AST (Abstract Syntax Tree). More information and a tutorial can be found in the <a href="https://lalrpop.github.io/lalrpop/index.html">LALRPOP book</a>.</p>

<p>RustPython does one nice extra thing on top of <code class="language-plaintext highlighter-rouge">LALRPOP</code>. It masks the errors and provides you with safer, nicer errors. You can see the code for this in <code class="language-plaintext highlighter-rouge">RustPython/parser/src/error.rs</code></p>

<p><strong>Using RustPython to generate an AST</strong></p>

<p>You can do:</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="k">use</span> <span class="nn">rustpython_parser</span><span class="p">::{</span><span class="n">parser</span><span class="p">,</span> <span class="n">ast</span><span class="p">};</span>  
 <span class="k">let</span> <span class="n">python_source</span> <span class="o">=</span> <span class="s">"print('Hello world')"</span><span class="p">;</span>  
 <span class="k">let</span> <span class="n">python_ast</span> <span class="o">=</span> <span class="nn">parser</span><span class="p">::</span><span class="nf">parse_expression</span><span class="p">(</span><span class="n">python_source</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">();</span>
</code></pre></div></div>

<h2 id="recap--">Recap 🥴 🥵</h2>

<p>As a recap, when you write a line of Python code and “run it”, here is what the RustPython interpreter does:</p>

<p><strong>INPUT: your code</strong> (in <code class="language-plaintext highlighter-rouge">file.py</code> or interactive shell)<br />
⬇️ parse the line of source code into tokens<br />
⬇️ determine if the tokens are valid syntax<br />
⬇️  create an Abstract Syntax Tree (AST)   <br />
⬇️  compile the AST into bytecode <br />
<strong>OUTPUT: bytecode</strong> (in <code class="language-plaintext highlighter-rouge">__pycache__/file.pyc</code> or in memory)</p>

<p>The compiler is located in the <a href="https://github.com/RustPython/RustPython/tree/main/compiler">rustpython-compiler</a> crate. Keep an eye on the blog for a future post about the details or the compiler. In the meantime, check out the parser source code in <a href="https://github.com/RustPython/RustPython/tree/main/compiler/parser">rustpython-parser</a>.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[This post goes over the RustPython parser. You can see the source code in the rustpython-parser crate.]]></summary></entry></feed>