<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>conda-forge | community-driven packaging for conda Blog</title>
        <link>https://conda-forge.org/blog</link>
        <description>conda-forge | community-driven packaging for conda Blog</description>
        <lastBuildDate>Thu, 13 Jul 2023 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Security updates to our installers]]></title>
            <link>https://conda-forge.org/blog/2023/07/13/installer-security-fixes</link>
            <guid>https://conda-forge.org/blog/2023/07/13/installer-security-fixes</guid>
            <pubDate>Thu, 13 Jul 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[In June 2023, software engineers from]]></description>
            <content:encoded><![CDATA[<p>In June 2023, software engineers from
<a href="https://www.anaconda.com/" target="_blank" rel="noopener noreferrer">Anaconda</a> have reported a security issue in
the uninstallers that are included in the Windows versions of the
<a href="https://github.com/conda-forge/miniforge" target="_blank" rel="noopener noreferrer">miniforge and mambaforge
installers</a>, one of the main
ways to bootstrap conda-forge based conda and mamba distributions.</p>
<p>The issue could, under specific conditions, unintentionally delete files
from your system during the uninstallation process. Anaconda has
published more details in the related
<a href="https://www.anaconda.com/blog/windows-installer-security-fix" target="_blank" rel="noopener noreferrer">blogpost</a>
about the security fix for the miniconda and Anaconda Distribution
Windows installers as well.</p>
<p>conda-forge is committed to fix the miniforge and mambaforge installers
equally to reduce the possible impact on conda-forge users and has
worked with Anaconda to mitigate the issue.</p>
<ul>
<li>As such, we are strongly recommending all users of miniforge and
mambaforge to <strong>update immediately</strong> to the latest versions of
miniforge and mambaforge. Please download them from the <a href="https://github.com/conda-forge/miniforge" target="_blank" rel="noopener noreferrer">miniforge
repository's main page</a>
or the <a href="https://github.com/conda-forge/miniforge/releases/tag/23.1.0-4" target="_blank" rel="noopener noreferrer">release specific
page</a>.</li>
<li>For older versions, we are providing a <strong>security patch for already
installed miniforge and mambaforge installations</strong>. You can download
these from <a href="https://github.com/conda-forge/miniforge/releases/tag/23.1.0-4" target="_blank" rel="noopener noreferrer">release specific
page</a>
as well, under the names
<code>Miniforge3-uninstaller-patch-Windows-x86_64.exe</code> and
<code>Mambaforge-uninstaller-patch-Windows-x86_64.exe</code>.</li>
</ul>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>To uninstall older versions of miniforge and mambaforge released before
July 1, 2023, please download the security patch fix prior to
uninstallation.</p></div></div>
<p>In order for this flaw to be triggered, a specific combination of
factors must align, including uninstallation permissions, system access,
usage of Windows, and an existing installation of miniforge or
mambaforge.</p>]]></content:encoded>
            <category>security</category>
        </item>
        <item>
            <title><![CDATA[CircleCI Security Incident]]></title>
            <link>https://conda-forge.org/blog/2023/03/12/circle-ci-security-breach</link>
            <guid>https://conda-forge.org/blog/2023/03/12/circle-ci-security-breach</guid>
            <pubDate>Sun, 12 Mar 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[In early January 2023, CircleCI informed us that they had a large]]></description>
            <content:encoded><![CDATA[<p>In early January 2023, CircleCI informed us that they had a large
<a href="https://circleci.com/blog/jan-4-2023-incident-report/" target="_blank" rel="noopener noreferrer">security breach</a>
where a third party had gained access to all the environment secrets
stored in the service. For <code>conda-forge</code>, these secrets are the API
token used to upload built packages to our staging area on
<code>anaconda.org</code> and the unique token we generate for each feedstock. The
feedstock tokens are used as part of our artifact staging process to
ensure that only the maintainers of a given feedstock can upload
packages built by that feedstock. Later in January, we were informed by
CircleCI that their security breach started on December 19, 2022, with
the bulk of the secrets being exfiltrated in plain text from their
servers a few days later. A malicious third-party with access to these
secrets could potentially upload compromised versions of any package on
<code>conda-forge</code> in a so-called "supply chain" attack.</p>
<p><strong>We have produced a</strong> <a href="https://raw.githubusercontent.com/conda-forge/conda-forge.github.io/main/misc/circle_ci_pkgs_dec2022_breach.json" target="_blank" rel="noopener noreferrer">list of all possibly compromised
artifacts</a>.</p>
<p><strong>If you use</strong> <code>conda-forge</code> <strong>in very sensitive environments (which we
do not recommend!), please remove these artifacts from your system.</strong></p>
<p><strong>To date, we know of no compromised artifacts in</strong> <code>conda-forge</code>.</p>
<p><strong>API tokens for the main</strong> <code>conda-forge</code> <strong>channel were never exposed
and remain secure to our knowledge.</strong></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="our-response">Our Response<a href="https://conda-forge.org/blog/2023/03/12/circle-ci-security-breach#our-response" class="hash-link" aria-label="Direct link to Our Response" title="Direct link to Our Response">​</a></h2>
<p>We took the following steps to respond to this incident.</p>
<ul>
<li>We immediately started a token rotation of all of our feedstock
tokens and our staging area upload tokens as precautionary measures.
This token rotation hit a few bugs, but was completed as of January
13, 2023.</li>
<li>We produced a census of all packages uploaded between December 19,
2022 and January 13, 2023. This data is available for download as a
<a href="https://raw.githubusercontent.com/conda-forge/conda-forge.github.io/main/misc/circle_ci_pkgs_dec2022_breach.json" target="_blank" rel="noopener noreferrer">JSON
file</a>.</li>
<li>We examined all the artifacts built during this time period for the
<a href="https://circleci.com/blog/jan-4-2023-incident-report/" target="_blank" rel="noopener noreferrer">malicious
files</a> listed
by CicleCI. We did not find any of those files in our artifacts.</li>
<li>As detailed below, we have begun retooling our system for feedstock
tokens to be more robust and enable greater flexibility in our
response to incidents like this.</li>
<li>We have begun systematically invalidating old tokens,
decommissioning old bots, and minimizing permissions of our current
tokens in order to further enhance <code>conda-forge</code>'s security.</li>
</ul>
<p>Rotating all of our tokens was taken as a precautionary measure.
Unfortunately, during this token rotation, one of our bots encountered a
bug which resulted in us losing the tokens for a very large fraction of
feedstocks. This situation resulted in an extended outage that lasted
about five days and was resolved on January 13, 2023, when the full
token rotation was completed.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-did-we-learn">What did we learn?<a href="https://conda-forge.org/blog/2023/03/12/circle-ci-security-breach#what-did-we-learn" class="hash-link" aria-label="Direct link to What did we learn?" title="Direct link to What did we learn?">​</a></h2>
<p>We learned a few things about our system for feedstock tokens and
general maintenance of our CI service integrations. We probably should
have known them already, but here we are.</p>
<ul>
<li>We used the same feedstock token across multiple CI services. This
limited our ability to immediately invalidate tokens associated with
a single CI service and exposed all services if any single service
had an incident.</li>
<li>Our token system only allowed one valid token per feedstock. This
limitation means that we cannot recover from partially failed token
resets/rotations and are subject to race conditions during the
reset/rotation process that can cause failed package uploads.</li>
<li>We need to be more proactive about cleaning up deprecated/removed CI
services. The use of CircleCI in <code>conda-forge</code> has been deprecated
for quite a while. Had we taken the time, and had the foresight, to
remove all of our secrets from CircleCI when it was deprecated, we
could have avoided the security incident all together.</li>
</ul>
<p>We have begun retooling our system for feedstock tokens in order to fix
the issues identified above and allow us to have more flexibility in
responding to security incidents. We have also started the process of
decommissioning several of our old CI services. These changes will take
time to implement. You can follow the progress on our various public
issue trackers.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="closing-thoughts--what-can-you-do">Closing Thoughts &amp; What can you do?<a href="https://conda-forge.org/blog/2023/03/12/circle-ci-security-breach#closing-thoughts--what-can-you-do" class="hash-link" aria-label="Direct link to Closing Thoughts &amp; What can you do?" title="Direct link to Closing Thoughts &amp; What can you do?">​</a></h2>
<p>We, the <code>conda-forge</code> core dev team, want to thank everyone for their
patience and support as we have responded to the various security
incidents and bugs detailed above. It goes without saying that the
public nature of <code>conda-forge</code>'s infrastructure carries risks. On the
other hand, by being public, anyone can look and verify our artifact
builds. Security for <code>conda-forge</code> is about reducing risk, and we will
continue to do our best.</p>
<p>As a reminder, we do not recommend that you use <code>conda-forge</code> in
environments with sensitive information. <code>conda-forge</code>'s software is
built by our users and the core dev team cannot verify or guarantee that
this software is not malicious or has not been tampered with.</p>
<p>Our best defense against security incidents in <code>conda-forge</code> is you! Our
feedstock maintainers are in the best position to notice incidents and
issues. Please responsibly report anything you find to us at
<code>condaforge+security@gmail.com</code>.</p>]]></content:encoded>
            <category>security</category>
        </item>
        <item>
            <title><![CDATA[Outreachy 2022 Wrap-up Blog]]></title>
            <link>https://conda-forge.org/blog/2022/08/26/outreachy-wrap-up-blog-2022</link>
            <guid>https://conda-forge.org/blog/2022/08/26/outreachy-wrap-up-blog-2022</guid>
            <pubDate>Fri, 26 Aug 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[This blog is about my work during my Outreachy internship with]]></description>
            <content:encoded><![CDATA[<p>This blog is about my work during my Outreachy internship with
<a href="https://conda-forge.github.io/" target="_blank" rel="noopener noreferrer">conda-forge</a>. Before that a little about
me - I am <a href="https://github.com/ssurbhi560" target="_blank" rel="noopener noreferrer">Surbhi</a>, an Outreachy intern
with conda-forge for the May-August 2022 cohort and I worked on
documenting the conda-forge ecosystem.</p>
<p>The first issue I started working on when the internship began was
<a href="https://github.com/conda-forge/conda-forge.github.io/issues/1611" target="_blank" rel="noopener noreferrer">Better anchoring of
announcements(#1611)</a>.
The goal of this issue was to fix the anchor for each year and also
specific announcements in the Announcements section so as to provide
better navigation of the <a href="https://conda-forge.org/docs/user/announcements.html" target="_blank" rel="noopener noreferrer">Announcements
page</a>. This was
also the time when I was feeling quite overwhelmed and anxious since I
was just starting and was unsure if I would be able to give my best. But
thanks to my awesome mentors
<a href="https://github.com/kathatherine" target="_blank" rel="noopener noreferrer">@Katherine</a> and
<a href="https://github.com/beckermr" target="_blank" rel="noopener noreferrer">@Matt</a>, who have always been so helpful,
I was able to have a good start. We solved this issue in two parts. The
first part was to add anchors to each year which is solved with <a href="https://github.com/conda-forge/conda-forge.github.io/pull/1766" target="_blank" rel="noopener noreferrer">Improve
anchors for each year in the Announcements section.
(#1766)</a>,
and the second part was adding anchors to each announcement and fixing
the RSS feed.</p>
<p>The part of the documentation I focused on after completing the first
issue was <a href="https://conda-forge.org/docs/maintainer/00_intro.html" target="_blank" rel="noopener noreferrer">Maintainers'
Documentation</a>.
Many open issues needed to be taken care of to make the Maintainers'
documentation more useful and accessible for new maintainers. The open
tickets that we have worked on are:</p>
<ol>
<li>
<p><a href="https://github.com/conda-forge/conda-forge.github.io/issues/1769" target="_blank" rel="noopener noreferrer">Document extras feedstock-name
(#1769)</a>
and <a href="https://github.com/conda-forge/conda-forge.github.io/issues/1331" target="_blank" rel="noopener noreferrer">Explain how to become a maintainer
(#1331)</a>.
Closed with <a href="https://github.com/conda-forge/conda-forge.github.io/pull/1772" target="_blank" rel="noopener noreferrer">add extra section-recipe maintainer and feedstock-name
(#1772)</a>.</p>
<blockquote>
<p>As we started with improving the Maintainer documentation, these
were the issues we picked first to work on. The first issue was
documenting how maintainers can use the "feedstock-name" directive
for naming feedstocks differently than their package names in
staged recipes. The second issue was documenting how one should
become a package maintainer.</p>
</blockquote>
</li>
<li>
<p><a href="https://github.com/conda-forge/conda-forge.github.io/issues/1651" target="_blank" rel="noopener noreferrer">Add more steps in Improve the documentation section
(#1651)</a>.
Closed with <a href="https://github.com/conda-forge/conda-forge.github.io/pull/1776" target="_blank" rel="noopener noreferrer">Update "Improve the documentation" section with more
steps
(#1776)</a>.</p>
<blockquote>
<p>In this issue we added some additional steps for people who would
like to start contributing to conda-forge, especially to
documentation.</p>
</blockquote>
</li>
<li>
<p><a href="https://github.com/conda-forge/conda-forge.github.io/issues/1655" target="_blank" rel="noopener noreferrer">Add more information about Grayskull in the documentation itself
(#1655)</a>.
Closed with
<a href="https://github.com/conda-forge/conda-forge.github.io/pull/1777" target="_blank" rel="noopener noreferrer">#1777</a>.</p>
<blockquote>
<p>The documentation on Grayskull in docs lacked the answers to
questions like what exactly Grayskull is and how one should use
Grayskull to generate a recipe. With this issue, we added more
documentation on Grayskull for users.</p>
</blockquote>
</li>
<li>
<p><a href="https://github.com/conda-forge/conda-forge.github.io/issues/803" target="_blank" rel="noopener noreferrer">Clarify feedstock LICENSE.txt
(#803)</a>.
Closed with <a href="https://github.com/conda-forge/conda-forge.github.io/pull/1786" target="_blank" rel="noopener noreferrer">Add Feedstock repository structure section
(#1786)</a>.</p>
<blockquote>
<p>The docs for contributing and maintaining conda recipes discuss
when and how to distribute the license for a particular package.
The auto-generated feedstock repositories also include a license
in the root, which is different from the related package license.
With this issue, we added documentation on the differences between
those two licenses and briefly explained the feedstock repository
structure.</p>
</blockquote>
</li>
<li>
<p><a href="https://github.com/conda-forge/conda-forge.github.io/issues/1117" target="_blank" rel="noopener noreferrer">DOC: New maintainer
(#1117)</a>.
Closed with <a href="https://github.com/conda-forge/conda-forge.github.io/pull/1788" target="_blank" rel="noopener noreferrer">Add "How regro-cf-autotick-bot create version update
PR?" section.
(#1788)</a>.</p>
<blockquote>
<p>With this issue we improved docs for the new maintainers and the
working of the bot. A "How does <code>regro-cf-autotick-bot</code> create
automatic version updates?" section was added to the docs, which
explains the whole process of creating an automated version update
PRs by bot.</p>
</blockquote>
</li>
<li>
<p><a href="https://github.com/conda-forge/conda-forge.github.io/issues/1536" target="_blank" rel="noopener noreferrer">Add Perl package hints to documentation
(#1536)</a>.
Working on this
<a href="https://github.com/conda-forge/conda-forge.github.io/pull/1790" target="_blank" rel="noopener noreferrer">#1790</a>.</p>
<blockquote>
<p>With this issue we added ​​packaging instructions for Perl packages
with different build systems in the documentation.</p>
</blockquote>
</li>
<li>
<p><a href="https://github.com/conda-forge/conda-forge.github.io/issues/1532" target="_blank" rel="noopener noreferrer">DOC: Update documentation about tokens
(#1532)</a>.
Closed with
<a href="https://github.com/conda-forge/conda-forge.github.io/pull/1793" target="_blank" rel="noopener noreferrer">#1793</a>.</p>
<blockquote>
<p>Feedstocks have stopped storing encrypted tokens to upload
packages, but outdated information on tokens was still present in
the documentation. With this issue we removed the outdated
information and also added a new section "How to update your
feedstock token?" for maintainers.</p>
</blockquote>
</li>
<li>
<p><a href="https://github.com/conda-forge/conda-forge.github.io/issues/1668" target="_blank" rel="noopener noreferrer">Improve the documentation on arch_rebuild.txt
(#1668)</a>.
Closed with
<a href="https://github.com/conda-forge/conda-forge.github.io/pull/1794" target="_blank" rel="noopener noreferrer">#1794</a>.</p>
<blockquote>
<p>With this issue we improved the documentation on
<code>arch_rebuild.txt</code> and how maintainers can add a feedstock to
<code>arch-rebuild.txt</code> if it requires rebuilding with different
architectures/platforms (such as ppc64le or aarch64).</p>
</blockquote>
</li>
<li>
<p><a href="https://github.com/conda-forge/conda-forge.github.io/issues/1355" target="_blank" rel="noopener noreferrer">Document migrators
(#1355)</a>,
<a href="https://github.com/conda-forge/conda-forge.github.io/issues/862" target="_blank" rel="noopener noreferrer">Update migration docs
(#862)</a>,
and <a href="https://github.com/conda-forge/conda-forge.github.io/issues/737" target="_blank" rel="noopener noreferrer">document migrators
(#737)</a>
. Closed with <a href="https://github.com/conda-forge/conda-forge.github.io/pull/1801" target="_blank" rel="noopener noreferrer">Documenting Migrators and Migrations.
(#1801)</a>.</p>
<blockquote>
<p>With these, we added more documentation on migrations and
migrators, which would help maintainers find answers to questions
like - What is a migrator/migration, and what does it do? When can
(and why would) they should reject a migration PR? And so on.</p>
</blockquote>
</li>
<li>
<p><a href="https://github.com/conda-forge/conda-forge.github.io/issues/1808" target="_blank" rel="noopener noreferrer">Add a section in docs on security aspects of conda-forge
(#1808)</a>.
Closed with
<a href="https://github.com/conda-forge/conda-forge.github.io/pull/1812" target="_blank" rel="noopener noreferrer">#1812</a>.</p>
<blockquote>
<p>Currently, information regarding the security considerations of
conda-forge builds is scattered throughout the documentation, and
therefore it is hard to find and read. With this issue, we will
put all the information together in one place, which will help
maintainers and users to know more about how conda-forge secures
its packages and infrastructure.</p>
</blockquote>
</li>
</ol>
<p>I met some wonderful people during the internship who helped me with all
my questions and doubts that I had. The experience during the internship
also helped me get better opportunities after completing the Outreachy
internship. I have learned so many things during the internship that it
would make a long list if I were to write all of those. But the most
important things I learned are:</p>
<ul>
<li>The importance of documentation and how to write good documentation.</li>
<li>The best practices to follow while writing documentation.</li>
<li>More about conda-forge and packaging tools.</li>
</ul>
<p>And above all, Outreachy helped me feel more confident about my skills
and overcome the imposter syndrome I had before. Thanks again to my
awesome mentors and the kind people of the conda-forge community! :)</p>]]></content:encoded>
            <category>Outreachy</category>
        </item>
        <item>
            <title><![CDATA[GPU enabled TensorFlow builds on conda-forge]]></title>
            <link>https://conda-forge.org/blog/2021/11/03/tensorflow-gpu</link>
            <guid>https://conda-forge.org/blog/2021/11/03/tensorflow-gpu</guid>
            <pubDate>Wed, 03 Nov 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Tensorflow on Anvil]]></description>
            <content:encoded><![CDATA[<p><img loading="lazy" src="https://i.imgur.com/pRdJaYw.png" alt="Tensorflow on Anvil" class="img_ev3q"></p>
<p>Recently we've been able to add GPU-enabled TensorFlow builds to
conda-forge! This was quite a journey, with multiple contributors trying
different ways to convince the Bazel-based build system of TensorFlow to
build CUDA-enabled packages. But we managed, <a href="https://github.com/conda-forge/tensorflow-feedstock/pull/157" target="_blank" rel="noopener noreferrer">and the pull request got
merged</a>.</p>
<p>We now have a configuration in place that creates CUDA-enabled
TensorFlow builds for all conda-forge supported configurations (CUDA
10.2, 11.0, 11.1, and 11.2+). Building out the CUDA packages requires
beefy machines -- on a 32 core machine it still takes around 3 hours to
build a single package. Our build matrix now includes 12 CUDA-enabled
packages &amp; 3 CPU packages (because we need separate packages per Python
version). As one can imagine, this isn't easily possible on an average
"home computer".</p>
<p>For this purpose, we have written an Ansible playbook that lets us boot
up cloud machines which then build the feedstock (using the
<code>build-locally.py</code> script). Thanks to the generous support
of OVH we were able to boot multiple 32-core virtual machines
simultaneously to build the different TensorFlow variants.</p>
<p>We have open-sourced the <a href="https://github.com/mamba-org/build-locally-ansible" target="_blank" rel="noopener noreferrer">Ansible playbook in
GitHub</a> and we're
working towards making it (more) generally useful for other long-running
builds!</p>
<p><img loading="lazy" src="https://i.imgur.com/nvV6izV.jpg" alt="Running 3 builds in parallel on 32 cores ... still takes around 3 hours to finish" class="img_ev3q"></p>
<p>With the TensorFlow builds in place, conda-forge now has CUDA-enabled
builds for PyTorch and Tensorflow, the two most popular deep learning
libraries.</p>
<p>We are still missing Windows builds for TensorFlow (CPU &amp; CUDA,
unfortunately) and would love the community to help us out with that.
There is an open PR, but it probably needs some poking in Bazel to get
it to pass: <a href="https://github.com/conda-forge/tensorflow-feedstock/pull/111" target="_blank" rel="noopener noreferrer">conda-forge/tensorflow-feedstock#111</a>.</p>
<p>We hope that these new GPU builds will enable many more packages to be
added to the conda-forge channel! We are already looking forward to the
2.6.2 and 2.7 releases of TensorFlow and to adding Windows support in
the future. We hope you enjoy this work.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="installation">Installation<a href="https://conda-forge.org/blog/2021/11/03/tensorflow-gpu#installation" class="hash-link" aria-label="Direct link to Installation" title="Direct link to Installation">​</a></h2>
<p>You can now select between GPU enabled (default) and CPU packages using
the <code>tensorflow-gpu</code> and <code>tensorflow-cpu</code> packages. Just run</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">mamba install tensorflow-gpu -c conda-forge</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># OR</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">conda install tensorflow-gpu -c conda-forge</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>When installing the <code>tensorflow</code> package, the package resolution will
now default to the GPU-enabled builds of tensorflow if the local machine
has a GPU (these builds can be identified by "cuda" at the beginning
of the version number). Note that GPU-enabled packages can also work on
CPU-only machines, but one would need to override the enviornment
variable <code>CONDA_OVERRIDE_CUDA</code> like below. This could be handy if you
are in a situation where your current node (e.g. login node) on an HPC
does not have GPUs, but the compute nodes with GPUs do not have internet
access.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">CONDA_OVERRIDE_CUDA="11.2" conda install tensorflow cudatoolkit&gt;=11.2 -c conda-forge</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># OR</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">CONDA_OVERRIDE_CUDA="11.2" mamba install tensorflow cudatoolkit&gt;=11.2 -c conda-forge</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Note that you should select the cudatoolkit version most appropraite for
your GPU; currently, we have "10.2", "11.0", "11.1", and "11.2"
builds available where the the "11.2" builds are compatible with all
cudatoolkits&gt;=11.2. You could also force a specific version of
<code>cudatoolkit</code> by specifying it like above. Moreover, you could ensure
you get a sepcific build of tensorflow by appending the package name
like <code>tensorflow==2.7.0=cuda*</code> or <code>tensorflow==2.7.0=cuda112*</code>. If you
want the slimmer "cpu-only" package, then you can install
<code>tensorflow-cpu</code> directly or equivalently <code>tensorflow==2.7.0=cpu*</code>. At
the time of writing (February 2022), on a machine without a GPU, one
would always get the <code>-cpu</code> variant unless overriden like
above. This decision has been made to allow greater accessibility for
users with limited bandwidth and resources.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="thanks-to">Thanks to<a href="https://conda-forge.org/blog/2021/11/03/tensorflow-gpu#thanks-to" class="hash-link" aria-label="Direct link to Thanks to" title="Direct link to Thanks to">​</a></h2>
<ul>
<li>Mark Harfouche (@hmaarrfk) &amp; Ista Zahn (@izahn) for their initial
work on the TensorFlow GPU builds, and all other TensorFlow
maintainers. Uwe Korn (@xhochy) for his work on the Bazel scripts &amp;
TensorFlow -- and all the other maintainers of the <a href="https://github.com/conda-forge/tensorflow-feedstock" target="_blank" rel="noopener noreferrer">TensorFlow
feedstock</a>!</li>
<li>NVIDIA for pushing cudatoolkit and cudnn on conda-forge that makes
this possible</li>
<li>OVH for their generous sponsoring of large build machines that we
could use to build the recipes</li>
<li>Bloomberg for their sponsorship of QuantStack's involvement with
conda-forge</li>
<li>Andreas Trawoger (@atrawog) for the Ansible scripts that this is
based on</li>
<li>Thorsten Beier (@derthorsten) and Adrien Delsalle (@adriendelsalle)
for their contributions to the recipe</li>
</ul>]]></content:encoded>
            <category>conda-forge</category>
        </item>
        <item>
            <title><![CDATA[Travis CI Security Incident]]></title>
            <link>https://conda-forge.org/blog/2021/09/24/travis-security</link>
            <guid>https://conda-forge.org/blog/2021/09/24/travis-security</guid>
            <pubDate>Fri, 24 Sep 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[On September 9, 2021 one of our core devs discovered that artifacts]]></description>
            <content:encoded><![CDATA[<p>On September 9, 2021 one of our core devs discovered that artifacts
building on Travis CI were being uploaded to our conda channel from PRs
running on forked repositories. A quick investigation revealed that
Travis CI was passing encrypted secrets to PR builds on forks. Further
examination of our logs and artifacts indicated that this had been
happening since about September 3, 2021. This security bug was
subsequently confirmed by Travis CI. See this
<a href="https://nvd.nist.gov/vuln/detail/CVE-2021-41077" target="_blank" rel="noopener noreferrer">CVE</a> for more details
on this incident. <strong>As far as we know, there were no actual exploits
against conda-forge which used this vulnerability.</strong></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="our-response">Our Response<a href="https://conda-forge.org/blog/2021/09/24/travis-security#our-response" class="hash-link" aria-label="Direct link to Our Response" title="Direct link to Our Response">​</a></h2>
<p>We took the following steps to respond to this incident.</p>
<ol>
<li>We immediately turned off all builds on Travis CI by suspending the
Travis CI GitHub App.</li>
<li>We immediately disclosed the bug to Travis CI through our contacts
there.</li>
<li>Once Travis CI indicated to us that they were ready, we rotated all
feedstock tokens and later our anaconda.org token for our staging
channel. The anaconda.org token for the main <code>conda-forge</code> channel
was never disclosed in this incident. Further, only ~70 feedstocks
had their tokens exposed in this incident.</li>
<li>We examined our artifacts and marked as broken any artifacts that
were uploaded from PRs. We think we found everything, but we are not
completely sure. Our criterion for marking things broken was more
generous than it needed to be.</li>
<li>We issued PRs to rebuild any broken artifacts via our bots.</li>
<li>We put in changes to <code>conda-smithy</code> to help prevent inadvertent
uploads of artifacts from PRs in the future.</li>
</ol>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="closing-thoughts--what-can-you-do">Closing Thoughts &amp; What can you do?<a href="https://conda-forge.org/blog/2021/09/24/travis-security#closing-thoughts--what-can-you-do" class="hash-link" aria-label="Direct link to Closing Thoughts &amp; What can you do?" title="Direct link to Closing Thoughts &amp; What can you do?">​</a></h2>
<p>I (MRB) want to recognize the quick work of our core dev team in
handling this incident. It goes without saying that the public nature of
<code>conda-forge</code>'s infrastructure carries risks. On the other hand, by
being public, anyone can look and verify our artifact builds. Security
for <code>conda-forge</code> is about reducing risk and we will continue to do our
best.</p>
<p>Our best defense against security incidents in <code>conda-forge</code> is <em>you</em>!
Our feedstock maintainers are in the best position to notice incidents
and issues. Please responsibly report anything you find to us at
<code>condaforge+security@gmail.com</code>.</p>]]></content:encoded>
            <category>security</category>
        </item>
        <item>
            <title><![CDATA[Contributing Packages To conda-forge Using Grayskull]]></title>
            <link>https://conda-forge.org/blog/2021/06/16/graykull-step-by-step</link>
            <guid>https://conda-forge.org/blog/2021/06/16/graykull-step-by-step</guid>
            <pubDate>Wed, 16 Jun 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[When contributing packages to conda-forge, Grayskull can make your life]]></description>
            <content:encoded><![CDATA[<p>When contributing packages to conda-forge, Grayskull can make your life
much easier. Grayskull generates recipes for Python packages hosted on
PyPI.</p>
<p>As the
<a href="https://github.com/conda-incubator/grayskull#introduction" target="_blank" rel="noopener noreferrer">introduction</a>
for Grayskull reads; "The main goal of this project is to generate
concise recipes for conda-forge." In this tutorial we learn how to
contribute a Python package to the conda-forge channel using Grayskull
to generate the recipe.</p>
<p>Let us get started.</p>
<ol>
<li>
<p>Install <code>grayskull</code> using <code>conda</code> through the <code>conda-forge</code> channel:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">$ conda install -c conda-forge grayskull</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
</li>
<li>
<p>Fork and clone the conda-forge <a href="https://github.com/conda-forge/staged-recipes" target="_blank" rel="noopener noreferrer">staged-recipes
repository</a> from
GitHub.</p>
</li>
<li>
<p>Checkout a new branch from the <code>master branch</code>.</p>
</li>
<li>
<p>Through CLI, cd inside the 'staged-recipes/recipes' directory.</p>
</li>
<li>
<p>Call <code>grayskull</code> and pass the <code>pypi</code> repository, followed by the
name of the package you want to contribute to conda-forge. For
example: <code>grayskull pypi abc</code></p>
<p>Or you could use <code>grayskull pypi abc --strict-conda-forge</code> to remove
some selectors which are not necessary for conda-forge and adapt
recipes to fit better in the conda-forge ecosystem.</p>
<p>Grayskull will create a folder with the same name as the package (in
this case: 'abc') in the 'recipes' folder of the 'staged-recipes'
directory. This folder will contain the <code>meta.yaml</code> file and also
the license file if the package includes a license in the PyPI
distribution.</p>
</li>
<li>
<p>Go through the generated <code>meta.yaml</code> file. For simpler packages, the
generated recipes are nearly perfect, but for some packages you
might need to make certain tweaks.</p>
</li>
<li>
<p>Commit and push the changes. <code>git add recipe/abc/meta.yaml</code>
<code>git commit -m "add a commit message"</code> <code>git push</code></p>
</li>
<li>
<p>Create a PR.</p>
</li>
<li>
<p>Once the CI is passing, post a comment saying:
<code>This is ready for review</code> <code>@conda-forge-admin, please ping team</code></p>
</li>
</ol>
<p>Once the PR gets merged, your package will be available on the
conda-forge channel. Tada! It's that easy.</p>]]></content:encoded>
            <category>grayskull</category>
            <category>outreachy</category>
        </item>
        <item>
            <title><![CDATA[Conda-forge Outreachy]]></title>
            <link>https://conda-forge.org/blog/2021/02/02/outreachy</link>
            <guid>https://conda-forge.org/blog/2021/02/02/outreachy</guid>
            <pubDate>Tue, 02 Feb 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Conda-forge is participating in the upcoming round of]]></description>
            <content:encoded><![CDATA[<p>Conda-forge is participating in the upcoming round of
<a href="https://www.outreachy.org/" target="_blank" rel="noopener noreferrer">Outreachy</a> i.e May 2021 to August 2021. The
goal of this program is to increase participation from under-represented
groups in free and open-source software. Outreachy is organized by
<a href="https://sfconservancy.org/" target="_blank" rel="noopener noreferrer">Software Freedom Conservancy</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="participant-application-process">Participant Application Process:<a href="https://conda-forge.org/blog/2021/02/02/outreachy#participant-application-process" class="hash-link" aria-label="Direct link to Participant Application Process:" title="Direct link to Participant Application Process:">​</a></h2>
<p>First, please review the Outreachy Eligibility and Application
Information page to learn more about eligibility for Outreachy.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="steps-for-applicants-to-conda-forge">Steps for applicants to conda-forge:<a href="https://conda-forge.org/blog/2021/02/02/outreachy#steps-for-applicants-to-conda-forge" class="hash-link" aria-label="Direct link to Steps for applicants to conda-forge:" title="Direct link to Steps for applicants to conda-forge:">​</a></h2>
<ol>
<li>Confirm your eligibility on the Outreachy site</li>
<li>Look at the Conda-forge projects available on the Outreachy site,
consider your options, and if you have questions, communicate with the
project mentors.</li>
<li>Begin by contributing to the project by looking at our <a href="https://github.com/conda-forge/conda-forge.github.io/issues" target="_blank" rel="noopener noreferrer">issues
page</a>.
As you make contributions, record them on the Outreachy site.</li>
<li>Once you have made a few contributions, begin to write your application.
Ask the mentors to review the application before you submit it.</li>
</ol>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="participant-expectations">Participant Expectations<a href="https://conda-forge.org/blog/2021/02/02/outreachy#participant-expectations" class="hash-link" aria-label="Direct link to Participant Expectations" title="Direct link to Participant Expectations">​</a></h2>
<p>You will be working full-time on your project for three months. You will
meet with your mentor(s) frequently and participate in the open-source
development process -- writing code, reviewing code, testing, and so
on. You will be expected to write a blog entry each week.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="project-contribution-information">Project Contribution Information<a href="https://conda-forge.org/blog/2021/02/02/outreachy#project-contribution-information" class="hash-link" aria-label="Direct link to Project Contribution Information" title="Direct link to Project Contribution Information">​</a></h2>
<p>As part of the application process, all applicants must make at least
one contribution to be accepted as an intern for this project. Only
applicants who make a contribution will be eligible to be accepted as
interns.</p>
<p>While we don't have one we highly recommend the first-time contributor
to be a conda user and/or submit a package to conda-forge via
<a href="https://github.com/conda-forge/staged-recipes" target="_blank" rel="noopener noreferrer">staged-recipes</a>. That
will ensure the contributor understands the value of what we do and
means that they are willing to participate in our community.</p>
<p>Applicants can contribute to this project through the <a href="https://conda-forge.org/#contribute" target="_blank" rel="noopener noreferrer">project
repository or contribution page</a>.
The project uses an <a href="https://github.com/conda-forge/conda-forge.github.io/issues" target="_blank" rel="noopener noreferrer">issue
tracker</a> to
keep information about bugs to fix, project features to implement,
documentation to write, and more. Applicants can look for
newcomer-friendly issues to use for their first contributions by looking
for the following issue tags in the project issue
<a href="https://github.com/conda-forge/conda-forge.github.io/issues" target="_blank" rel="noopener noreferrer">tracker</a>:
Docs, Good first issue</p>
<p>We here at <a href="https://conda-forge.org/#contribute" target="_blank" rel="noopener noreferrer">conda-forge</a> have a
large number of potential Outreachy endeavors around documentation,
maintenance, and development. These tasks are high-impact, affecting the
entire conda-forge ecosystem. They also cover multiple systems including
databases, conda's CDN provider, continuous integration providers, and
user interactions on GitHub.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-do-i-work-with-the-conda-forge-community">How do I work with the conda-forge community?<a href="https://conda-forge.org/blog/2021/02/02/outreachy#how-do-i-work-with-the-conda-forge-community" class="hash-link" aria-label="Direct link to How do I work with the conda-forge community?" title="Direct link to How do I work with the conda-forge community?">​</a></h2>
<p>Outreachy applicants can get help and feedback from both mentors and
community members. Community members discuss their contributions in a
public chat. Outreachy applicants can often learn from those
discussions.</p>
<p>Please introduce yourself on the public project chat:</p>
<ul>
<li>Gitter - <a href="https://gitter.im/conda-forge/conda-forge.github.io" target="_blank" rel="noopener noreferrer">Follow this
link</a> to join this
project's public chat.</li>
<li>Outreachy mentors will often be in the community public chat. The
project mentor's usernames are: <code>@viniciusdc</code>.</li>
</ul>
<p>Here are some ready-to-go ways you can get started contributing on your
own.</p>
<ul>
<li>Find an open issue to tackle or report a bug to the issue tracker;</li>
<li>Don't be afraid to communicate: Ask if you can help write a new
feature or help Automate project setups;</li>
<li>Improving current tooling and testing features is always welcome.</li>
</ul>
<p>As this project main goal is enhancing our current documentation, here
are some preliminary tasks that you can inspect to get ideas:</p>
<ul>
<li>Write and improve the project's documentation;</li>
<li>Link to duplicate issues, and suggest new issue labels, to keep
things organized;</li>
<li>Go through open issues and suggest closing old ones;</li>
<li>Ask clarifying questions on recently opened issues to move the
discussion forward;</li>
<li>We also have issues regarding the main functionalities of our bot,
in particular the autotick bot. You could find some new information
or ideas for your contributing proposals.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="good-starter-tasks">Good starter tasks:<a href="https://conda-forge.org/blog/2021/02/02/outreachy#good-starter-tasks" class="hash-link" aria-label="Direct link to Good starter tasks:" title="Direct link to Good starter tasks:">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="small-starter-tasks">Small Starter Tasks<a href="https://conda-forge.org/blog/2021/02/02/outreachy#small-starter-tasks" class="hash-link" aria-label="Direct link to Small Starter Tasks" title="Direct link to Small Starter Tasks">​</a></h3>
<p>As with most organizations, there are lots of small issues that need
addressing usually related to problems such as bad recipes, old
documentation and others. These will make good first issues to resolve
or "update". This will also be an opportunity to familiarise yourself
with the conda-forge environment.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="larger-tasks">Larger tasks<a href="https://conda-forge.org/blog/2021/02/02/outreachy#larger-tasks" class="hash-link" aria-label="Direct link to Larger tasks" title="Direct link to Larger tasks">​</a></h3>
<p>There are a few potential larger tasks that can come after a few smaller
task contributions. These are included into our three main bases:</p>
<ul>
<li><a href="https://conda-forge.org/docs/user/00_intro.html" target="_blank" rel="noopener noreferrer">Users</a>: In this
case, some good starter tasks are mainly checking the actual
contents of conda-forge users documentations, and ideas to better
express its contents.</li>
<li><a href="https://conda-forge.org/docs/maintainer/00_intro.html" target="_blank" rel="noopener noreferrer">Maintainers</a>:
There are a bunch of missed topics in this area, some information
have to be updated or rewritten for better understanding. Writing a
complete guide containing the actual steps and standard model for a
package recipe, building process (just a simple discussion) and how
conda-forge bot recognize defective licenses, recipes and packages
in general is highly welcomed. For further understanding of the
general system check <a href="https://conda-forge.org/docs/maintainer/infrastructure.html" target="_blank" rel="noopener noreferrer">this
link</a>.<!-- -->
<ul>
<li>It can be funny to say, but lots of helpful ideas and bug
solutions appear on our gitter channel, so if you have time to
write guides about them... it's also an incredible task.</li>
</ul>
</li>
<li><a href="https://conda-forge.org/docs/orga/00_intro.html" target="_blank" rel="noopener noreferrer">And organization</a>
Our environment is changing everyday, because of that a lot of
information is lost in this process or even worse, not documented at
all! which leads to some difficulties inserting new members to
develop and further enhance the current process.<!-- -->
<ul>
<li>The related work on this matter is highly welcomed and for a
better grasp of the situation you can start with this
<a href="https://conda-forge.org/docs/orga/guidelines.html" target="_blank" rel="noopener noreferrer">guideline</a>
and read some of our posts in our
<a href="https://conda-forge.org/blog/blog/" target="_blank" rel="noopener noreferrer">blog</a></li>
<li>Revitalizing ideas/projects for the conda-forge blog are
definitely welcomed;</li>
<li>Currently we have some interesting projects going on inside our
ecosystem, which in return will need good documentation... Some
of the projects conda-forge is affiliated include the <a href="https://github.com/regro/cf-scripts" target="_blank" rel="noopener noreferrer">auto-tick
bot</a>,
<a href="https://github.com/symbol-management/symbol-exporter" target="_blank" rel="noopener noreferrer">symbol-exporter</a>
and a new service we are eager to start developing is the
<a href="https://github.com/regro/cf-scripts/issues/1367" target="_blank" rel="noopener noreferrer">distributed-bot</a>.
All of them have a great coverage of subjects and lots of people
to help and give advice about the service structure and
functionalities.</li>
</ul>
</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="improving-the-documentation">Improving the documentation<a href="https://conda-forge.org/blog/2021/02/02/outreachy#improving-the-documentation" class="hash-link" aria-label="Direct link to Improving the documentation" title="Direct link to Improving the documentation">​</a></h2>
<p>You can help improve the documentation as it is version-controlled in
the conda-forge.github.io repository on GitHub. The source text is
stored there in the <code>src/subdirectory</code> and is formatted using <a href="https://wiki.python.org/moin/reStructuredText" target="_blank" rel="noopener noreferrer">Python's
reStructuredText system</a>.</p>
<p>You can propose quick edits directly through the GitHub website, if you
have an account there --- for instance, this
<a href="https://github.com/conda-forge/conda-forge.github.io/edit/master/src/user/contributing.rst" target="_blank" rel="noopener noreferrer">link</a>
will take you directly to a web-based editor for this section page in
our
<a href="https://conda-forge.org/docs/user/contributing.html#improve-docs" target="_blank" rel="noopener noreferrer">docs</a>.
In general, the file corresponding to each page in the GitHub browser
has a little pencil icon in its top-right that lets you open it up for
editing.</p>
<p>The more manual process is as follows:</p>
<ul>
<li>Fork the conda-forge.github.io repository to your own GitHub user
account.</li>
<li>Clone that fork onto your computer.</li>
<li>Check out a new branch deriving from master to do your work.</li>
<li>Make and commit your changes.</li>
<li>Submit a pull request to the main repository proposing your changes.</li>
</ul>
<p>Happy editing!</p>]]></content:encoded>
            <category>outreachy</category>
        </item>
        <item>
            <title><![CDATA[2020 in Review]]></title>
            <link>https://conda-forge.org/blog/2020/12/26/year-in-review</link>
            <guid>https://conda-forge.org/blog/2020/12/26/year-in-review</guid>
            <pubDate>Sat, 26 Dec 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[As 2020 winds down, the Core team thought it'd be fun to review some of]]></description>
            <content:encoded><![CDATA[<p>As 2020 winds down, the Core team thought it'd be fun to review some of
the big accomplishments our community has made this year.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="strong-growth">Strong Growth<a href="https://conda-forge.org/blog/2020/12/26/year-in-review#strong-growth" class="hash-link" aria-label="Direct link to Strong Growth" title="Direct link to Strong Growth">​</a></h2>
<p>The <code>conda-forge</code> community has grown immensely this year. Here are some
numbers to help give you an idea of the scale of our growth.</p>
<ul>
<li>The community has added 3,751 new, unique <code>conda</code> packages this
year, along with a corresponding number of new feedstocks.</li>
<li>For the majority of 2020, the <code>conda-forge</code> channel on
<code>anaconda.org</code> exceeded 100 million downloads per month.</li>
<li>In July of 2020, the <code>conda-forge</code> channel passed 2 billion total,
all-time downloads.</li>
<li>We've grown our core developer community, adding seven new members
to the <code>conda-forge</code> Core team and at least two members to the
<code>staged-recipes</code> team.</li>
<li>We now have over 2,500 recipe maintainers in the <code>conda-forge</code>
GitHub organization.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="big-new-features">Big New Features<a href="https://conda-forge.org/blog/2020/12/26/year-in-review#big-new-features" class="hash-link" aria-label="Direct link to Big New Features" title="Direct link to Big New Features">​</a></h2>
<p>We've also shipped a ton of big updates to our core infrastructure this
year. These updates include</p>
<ul>
<li><code>PyPy</code> <strong>support</strong>: We added support for <code>PyPy</code> 3.6 and now supply
one of the biggest stacks of <code>PyPy</code>-enabled packages in the <code>PyPy</code>
ecosystem.</li>
<li><strong>automerge</strong>: We now support the automatic merging of PRs on
feedstocks using the <code>automerge</code> label or through an opt-in setting
in the <code>conda-forge.yml</code>.</li>
<li><code>R</code> <strong>4.0 migration</strong>: This migration was the first one to use our
<code>automerge</code> infrastructure at scale. With it, we completed a
complete rebuild/upgrade of the <code>R</code> ecosystem in about a week.</li>
<li><code>Python</code> <strong>updates</strong>: We deprecated <code>Python</code> 2.7, completed the
<code>Python</code> 3.8 migration, and got about 75% of the way through the
<code>Python</code> 3.9 migration.</li>
<li><strong>compiler upgrades</strong>: We upgraded our compiler infrastructure to
<code>GCC</code> 9 and <code>clang</code> 11.</li>
<li><strong>CentOS 7 and CentOS 6 EOL</strong>: We shipped an option to enable our
compilers to use the CentOS 7 <code>sysroot</code> in preparation for the
CentOS 6 EOL. We hope to complete the move to CentOS 7 early next
year.</li>
<li><strong>miniforge</strong>: We built our own standalone, <code>miniconda</code>-like
installers. These support a broad range of platforms, including
<code>osx-arm64</code> and <code>linux-aarch64</code>.</li>
<li><strong>standalone Windows stack</strong>: We fully decoupled our Windows recipes
from the <code>defaults</code> channel by rebuilding the <code>msys2</code> recipes.</li>
<li><strong>Apple silicon support</strong>: We added support for Apple silicon with
our <code>osx-arm64</code> platform. This platform is our first one to use a
fully cross-compiled infrastructure.</li>
<li><strong>CUDA support</strong>: We added support for building CUDA packages on
windows and added CUDA 11.0 support.</li>
</ul>
<hr>
<p>We know that this year has been extremely difficult for so many of our
community members and that the fantastic success of <code>conda-forge</code> would
not have been possible without the active participation and support of
our community. <strong>Thank you everyone so much for the work you put into</strong>
<code>conda-forge</code> <strong>this year, making it the wonderful, community-led
resource that it is.</strong></p>
<p>We wish everyone a happy, healthy, and peaceful new year!</p>]]></content:encoded>
            <category>conda-forge</category>
        </item>
        <item>
            <title><![CDATA[Package Distribution and the anaconda.com Terms of Service]]></title>
            <link>https://conda-forge.org/blog/2020/11/20/anaconda-tos</link>
            <guid>https://conda-forge.org/blog/2020/11/20/anaconda-tos</guid>
            <pubDate>Fri, 20 Nov 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[Various members of the community have raised questions publicly and]]></description>
            <content:encoded><![CDATA[<p>Various members of the community have raised questions publicly and
privately about the implications of Anaconda's new Terms of Service
(TOS) on <code>anaconda.com</code>. First of all, we understand your concerns. We
would like to explain a bit how <code>conda-forge</code> works, how the TOS change
affects us and <code>conda-forge</code> users, and what our plans as a community
are for the future.</p>
<p>What makes it non-surprising [that no other free conda package
distribution services have appeared] is that, at the moment, any third
party channel like <code>conda-forge</code> is free. The TOS change does not apply
to <code>conda-forge</code>, nor to other channels hosted on anaconda.org; the TOS
change in question applies only to the "defaults" channel and other
software hosted on repo.anaconda.com.</p>
<p>While having alternative hosting is in our plans, we cannot afford the
costs. We are just a community of volunteers. We have experimented with
uploading the <code>conda-forge</code> artifacts to GitHub and continue to do so
(see <code>regro/releases</code>). We also have put those artifacts behind an
experimental repodata server. One of our core devs (@wolfv) is working
to setup <code>quetz</code> with <code>conda-forge</code> artifacts as well.</p>
<p>It is very important to recognize that Anaconda Inc kindly donates use
of their hosting and employee time to us, absorbing all of these costs.
They host about 1.8 TB of our data and serve over 100 million downloads
of artifacts from that data each month. This is a highly significant
donation and <code>conda-forge</code> would not exist without it. Anaconda Inc
employees also provide help with maintaining some of the most complex
package recipes in conda-forge.</p>
<p>Note that Anaconda Inc has also said that part of the revenue from the
TOS change will be donated to OSS projects. (see this <a href="https://www.anaconda.com/blog/sustaining-our-stewardship-of-the-open-source-data-science-community" target="_blank" rel="noopener noreferrer">blog
post</a>).
You should be aware that <code>conda-forge</code> is a part of NumFOCUS, and so it
stands to benefit from the change in TOS, as do many other OSS projects.</p>
<p>We absolutely welcome help from the community to move our efforts on
building out more hosting infrastructure for <code>conda-forge</code> forward. This
could be anything from spending time developing <code>quetz</code> to providing
hosting/mirroring for our data. Please do get in contact with us if
you'd like to help out!</p>]]></content:encoded>
            <category>conda-forge</category>
        </item>
        <item>
            <title><![CDATA[macOS ARM builds on conda-forge]]></title>
            <link>https://conda-forge.org/blog/2020/10/29/macos-arm64</link>
            <guid>https://conda-forge.org/blog/2020/10/29/macos-arm64</guid>
            <pubDate>Thu, 29 Oct 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[A new platform osx-arm64 has been added to the build matrix of]]></description>
            <content:encoded><![CDATA[<p>A new platform <code>osx-arm64</code> has been added to the build matrix of
conda-forge. <code>osx-arm64</code> packages are built to run on upcoming macOS
arm64 processors marketed as <code>Apple Silicon</code>. An installer for this
platform can be found
<a href="https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-MacOSX-arm64.sh" target="_blank" rel="noopener noreferrer">here</a>.</p>
<p>This will install a conda environment with python and conda in it.
Installed conda will be able to install packages like <code>numpy, scipy</code>.
Currently there are about 100 packages out of 10000 packages pre-built
for this platform.</p>
<p>All these packages are built on conda-forge's current macOS <code>x86_64</code>
infrastructure. In order to do so, we have made lots of changes to the
infrastructure including,
<code>conda, conda-build, conda-smithy, constructor, conda-forge-ci-setup</code> to
facilitate cross-compiling which is the process of compiling a package
that will run on a <code>host</code> platform (<code>osx-arm64</code> in our case), with the
compilation done on a <code>build</code> platform (<code>osx-64</code> or <code>linux-64</code> in our
case).</p>
<p><code>osx-arm64</code> is the first conda platform that is completely bootstrapped
using conda-build's cross-compiling facility. Previously, when adding a
new platform, conda-build was built with an existing python and pip
environment on the new platform. With cross-compiling, when the
compilers and a sysroot is set up on a different platform, an existing
conda-build installation (on <code>osx-64</code> and <code>linux-64</code> in this case) will
be able to start building packages right away.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="cross-compiling-builds-for-osx-arm64">Cross-compiling builds for <code>osx-arm64</code><a href="https://conda-forge.org/blog/2020/10/29/macos-arm64#cross-compiling-builds-for-osx-arm64" class="hash-link" aria-label="Direct link to cross-compiling-builds-for-osx-arm64" title="Direct link to cross-compiling-builds-for-osx-arm64">​</a></h2>
<p>In order to cross compile packages for <code>osx-arm64</code> we need compilers.
So, we first built <code>clang=11.0.0.rc1</code> which has support for targetting
<code>osx-arm64</code>. We also built <code>compiler-rt=11.0.0.rc1</code> as a universal build
support both <code>osx-64</code> and <code>osx-arm64</code>.</p>
<p>Linker, archiver, <code>otool</code>, <code>install_name_tool</code> was built using the
<a href="https://github.com/tpoechtrager/cctools-port" target="_blank" rel="noopener noreferrer">cctools-port project</a> by
Thomas Pöchtrager.</p>
<p>One issue we ran into was that the macOS 11.0 Big Sur Beta 7 required
that all executables and shared libraries be ad-hoc signed which is
signing without a verified signature. On suggestion of <code>cctools-port</code>
developer we added support to <code>cctools-port</code> to sign these executables
using <code>ldid</code> which can be used on Linux as well as macOS to sign.</p>
<p>Using these, the first cross compiled package we built was <code>libcxx</code> to
facilitate C++ builds. For the <code>osx-arm64</code> sysroot we used the
<code>MacOSX11.0.sdk</code> already installed on Azure pipelines and Travis-CI. Due
to licensing issues, we cannot distribute this, but it can be downloaded
from the Apple developer website even on Linux.</p>
<p>With clang we have a C/C++ compiler, but lack a Fortran compiler. We
used the <a href="https://github.com/iains/gcc-darwin-arm64" target="_blank" rel="noopener noreferrer">GCC fork for
darwin-arm64</a>. First, a cross
compiler (<code>build == host != target</code>) was built. Using that compiler, we
built a <code>cross-native</code> compiler (<code>build != host == target</code>) which gave
use the shared libraries like <code>libgfortran.dylib</code>.</p>
<p>We also added support for cross compiling rust programs to the rust
packages in conda and installing <code>rust_osx-64</code> on Linux will give you a
compiler that will build packages for <code>osx-64</code>.</p>
<p>As we haven't done cross-compilation before, many packages needed to be
updated. Most were trivial changes that we automated later on. These
included getting a newer <code>config.sub</code> to identify the new autotools
platform <code>arm64-apple-darwin20.0.0</code>, adding options to CMake with the
environment variable <code>CMAKE_ARGS</code> to correctly set up the toolchain and
recipes were update to use <code>cmake ${CMAKE_ARGS} ..</code>. Running tests when
building were also disabled by guarding commands like <code>make check</code>,
<code>make test</code>, <code>ctest</code> with the env variable
<code>CONDA_BUILD_CROSS_COMPILATION</code>.</p>
<p>Cross-compiling python extensions is quite tricky as <code>distutils</code> is not
really setup to do this. Thanks to the project
<a href="https://github.com/benfogle/crossenv" target="_blank" rel="noopener noreferrer">crossenv</a> this is unofficially
supported with a few quirks. With <code>crossenv</code>, we can run a python on the
build machine (<code>osx-64</code> or <code>linux-64</code> in this case) that acts like it is
on <code>osx-arm64</code>. <code>crossenv</code> monkey-patches a few functions like
<code>os.uname</code> and sets up values like <code>_PYTHON_SYSCONFIG_DATA</code> to make
python running on <code>osx-64</code> or <code>linux-64</code> behave like <code>osx-arm64</code>. One
issue is that, monkey-patching <code>sys.platform</code> doesn't work and
therefore if a python package in it's <code>setup.py</code> uses <code>sys.platform</code> to
differentiate OSes this will lead to unintended consequences if you are
cross-compiling from <code>linux-64</code>. Therefore, we have to use <code>osx-64</code> as
our <code>build</code> system when cross-compiling for <code>osx-arm64</code>. Note that
packages using <code>sysconfig.get_platform()</code> will get the correct platform.</p>
<p>For creating an installer for conda, we needed a standalone conda
executable to bootstrap the conda environment. For other platforms we
relied on <code>conda-standalone</code> which is a standalone conda executable
created using <code>pyinstaller</code>. Since <code>pyinstaller</code> does not support
cross-compile, we decided to use <code>micromamba</code> as the bootstrapper and
added features to <code>micromamba</code> so that it can function as the
bootstrapper.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-to-add-a-osx-arm64-build-to-a-feedstock">How to add a <code>osx-arm64</code> build to a feedstock<a href="https://conda-forge.org/blog/2020/10/29/macos-arm64#how-to-add-a-osx-arm64-build-to-a-feedstock" class="hash-link" aria-label="Direct link to how-to-add-a-osx-arm64-build-to-a-feedstock" title="Direct link to how-to-add-a-osx-arm64-build-to-a-feedstock">​</a></h2>
<p>All the below changes will be done by a bot and the packages the bot
will send PRs to is determined by the list of packages at
<a href="https://github.com/conda-forge/conda-forge-pinning-feedstock/blob/master/recipe/migrations/osx_arm64.txt" target="_blank" rel="noopener noreferrer">conda-forge-pinning</a>
and their dependences. If you would like to add support, please send a
PR adding the feedstock name to the above list. After that PR is merged,
you can monitor the status at <a href="https://conda-forge.org/status/#armosxaddition" target="_blank" rel="noopener noreferrer">conda-forge
status-page</a> and if a
particular PR is stalled you can send a PR to the feedstock to fix it.</p>
<p>Following instructions are for when you want to add support manually.</p>
<p>Add the following to <code>conda-forge.yml</code> (on Linux or OSX),</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">build_platform</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">osx_arm64</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> osx_64</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">test</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> native_and_emulated</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>You can rerender using,</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">conda smithy rerender</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>For python packages, add one or more of the following to
<code>recipe/meta.yaml</code> as needed, noting that you <em>must</em> only add
<code>numpy</code>, <code>cython</code>, and/or <code>pybind11</code>
if they are used in <code>host:</code> as well,</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">requirements</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">build</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> python                                 </span><span class="token comment" style="color:#999988;font-style:italic"># [build_platform != target_platform]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> cross</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">python_</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> target_platform </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">     </span><span class="token comment" style="color:#999988;font-style:italic"># [build_platform != target_platform]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> cython                                 </span><span class="token comment" style="color:#999988;font-style:italic"># [build_platform != target_platform]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> numpy                                  </span><span class="token comment" style="color:#999988;font-style:italic"># [build_platform != target_platform]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> pybind11                               </span><span class="token comment" style="color:#999988;font-style:italic"># [build_platform != target_platform]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>For autotools package, add the following to <code>recipe/meta.yaml</code>,</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">requirements</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">build</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> gnuconfig   </span><span class="token comment" style="color:#999988;font-style:italic"># [unix]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>and to <code>recipe/build.sh</code>,</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># Get an updated config.sub and config.guess</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">cp $BUILD_PREFIX/share/gnuconfig/config.* .</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>For cmake packages, add the following to <code>recipe/build.sh</code>,</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">cmake ${CMAKE_ARGS} ..</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>For <code>meson</code> packages, add the following to <code>recipe/build.sh</code>,</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">meson ${MESON_ARGS} builddir/</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>Conda automatically creates a <a href="https://mesonbuild.com/Cross-compilation.html" target="_blank" rel="noopener noreferrer">cross build definition
file</a> when
cross-compiling, and adds the necessary argument to <code>${MESON_ARGS}</code> to
point <code>meson</code> to that file. <code>${MESON_ARGS}</code> is only defined when
cross-compiling, not for normal builds.</p></div></div>
<p>For rust packages, add the following to <code>recipe/meta.yaml</code>,</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">requirements:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  build:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    - {{ compiler('rust') }}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>If there's a line like <code>make check</code> in <code>recipe/build.sh</code> that cannot be
run when cross-compiling, do the following,</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">if [[ "$CONDA_BUILD_CROSS_COMPILATION" != "1" ]]; then</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  make check</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">fi</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>After these changes, another rerendering might be required.</p>
<p>Some useful jinja variables,</p>
<ol>
<li><code>build_platform</code> - conda subdir for <code>BUILD_PREFIX</code>. eg:
<code>linux-64</code></li>
<li><code>target_platform</code> - conda subdir for <code>PREFIX</code>. eg: <code>osx-arm64</code></li>
</ol>
<p>Some useful environment variables,</p>
<ol>
<li><code>build_platform</code></li>
<li><code>target_platform</code></li>
<li><code>CONDA_BUILD_CROSS_COMPILATION</code> - 1 if cross compiling</li>
<li><code>CMAKE_ARGS</code> - arguments to pass to cmake</li>
<li><code>CC_FOR_BUILD</code> - C compiler for build platform</li>
<li><code>CXX_FOR_BUILD</code> - C++ compiler for build platform</li>
<li><code>HOST</code> - a triplet for host passed to autoconf. eg:
<code>arm64-apple-darwin20.0.0</code></li>
<li><code>BUILD</code> - a triplet for build passed to autoconf. eg:
<code>x86_64-conda-linux-gnu</code></li>
</ol>
<p>Some useful configure options in <code>conda-forge.yml</code></p>
<ol>
<li>
<p><code>build_platform</code> - a dictionary mapping <code>build</code> subdir to <code>host</code> subdir. eg:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">build_platform</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">osx_arm64</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> osx_64</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">linux_ppc64le</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> linux_64</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">linux_aarch64</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> linux_64</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
</li>
<li>
<p><code>test_on_native_only</code> - a boolean to turn off testing on cross
compiling. If the tests don't require emulation (for eg: check
that a file exists), then <code>test_on_native_only: false</code> will run
the tests even when cross compiling.</p>
</li>
</ol>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="building-locally">Building locally<a href="https://conda-forge.org/blog/2020/10/29/macos-arm64#building-locally" class="hash-link" aria-label="Direct link to Building locally" title="Direct link to Building locally">​</a></h2>
<p>For building locally add the following in
<code>$HOME/conda_build_config.yaml</code>.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">SDKROOT</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> /path/to/MacOSX11.0.sdk</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>After that, look for the config you want to run in <code>.ci_support</code> folder
in the root of the feedstock For eg: <code>.ci_support/osx_arm64_.yaml</code>. Then
run,</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">conda build recipe -m .ci_support/osx_arm64_.yaml -c conda-forge -c conda-forge/label/rust_dev</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>This should start a new build for <code>osx-arm64</code>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="testing-packages">Testing packages<a href="https://conda-forge.org/blog/2020/10/29/macos-arm64#testing-packages" class="hash-link" aria-label="Direct link to Testing packages" title="Direct link to Testing packages">​</a></h2>
<p>In order to test packages intended to run on future Apple Silicon
hardware, Apple provides a machine called Developer Transition Kit
(DTK). Jonathan Helmus and Eli Rykoff has helped with testing these
packages on DTKs. Thanks to Eli Rykoff, we are now running tests for
these packages as a daily cron job which has led to finding several bugs
in our cross compiling infrastructure and also bugs in our recipes.</p>
<p>To test cross compiled recipes, transfer the built conda package to the
<code>host</code> and run,</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">conda build --test /path/to/package -c conda-forge</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>This work would not have been possible without the help of many people
including the upstream maintainers of compiler infrastructure (which
includes conda, conda-build, cctools, tapi, cctools-port, ldid, llvm,
clang, compiler-rt, openmp, libcxx, crossenv, rust, gcc-darwin-arm64),
<code>conda-forge/help-osx-arm64</code> team including Matt Becker, Eli Rykoff and
Uwe Korn who sent PRs to fix recipes, <code>conda-forge/bot</code> team and also
all the conda-forge maintainers of the 100 feedstocks who reviewed and
fixed PRs.</p>
<p>Isuru Fernando</p>]]></content:encoded>
            <category>conda-forge</category>
        </item>
        <item>
            <title><![CDATA[The API Territory and Version Number Map]]></title>
            <link>https://conda-forge.org/blog/2020/10/02/versions</link>
            <guid>https://conda-forge.org/blog/2020/10/02/versions</guid>
            <pubDate>Fri, 02 Oct 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[tl;dr Depending on specific version numbers of underlying libraries may]]></description>
            <content:encoded><![CDATA[<p>tl;dr Depending on specific version numbers of underlying libraries may
be too inaccurate and cause headaches as upstream libraries evolve and
change. A more detailed approach is needed. In this post I outline
current and potential work on a path towards a more complete inspection
of requirements based on APIs and dynamic pinning of libraries.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-constitutes-a-good-version-number">What Constitutes a Good Version Number<a href="https://conda-forge.org/blog/2020/10/02/versions#what-constitutes-a-good-version-number" class="hash-link" aria-label="Direct link to What Constitutes a Good Version Number" title="Direct link to What Constitutes a Good Version Number">​</a></h2>
<p>Version numbers should constitute a set that has the following
properties</p>
<ol>
<li>The set must be unbounded</li>
<li>The set must be orderable (maybe)</li>
</ol>
<p>Of course sets that meet these requirements might not convey a lot of
information about the software they represent other than if two things
are equivalent and their comparative ages. Note that the requirement to
be orderable may not be needed, but is generally useful when considering
the idea of an "upgrade" since it provides a clear delineation between
older and newer packages. In many cases, the structure of the version
number provides additional information. For some projects the version
number includes the date of the release, often using <a href="https://calver.org/" target="_blank" rel="noopener noreferrer">cal
ver</a>. Many projects use <a href="https://semver.org/" target="_blank" rel="noopener noreferrer">semantic
versioning</a>, which attempts to encode information
about the underlying source code's API in the version number.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="version-numbers-and-api-pinning">Version Numbers and API Pinning<a href="https://conda-forge.org/blog/2020/10/02/versions#version-numbers-and-api-pinning" class="hash-link" aria-label="Direct link to Version Numbers and API Pinning" title="Direct link to Version Numbers and API Pinning">​</a></h2>
<p>One of the most important places where version numbers are specified is
during the pinning of APIs. Source code often requires specific APIs
from the libraries it uses. This requires a pin specifying which
versions of the underlying libraries can be used. The package manager
then uses these pins to make certain a compatible environment is
created.</p>
<p>However, these pins (or even the lack of pins) produce problems.
Firstly, the pins are a one-time, local statement about the current and
future, global ecosystem of packages. For instance a pin of <code>scipy</code> to
the current major version number may not hold up over time, newer
versions of <code>scipy</code> may break the API while not changing the major
version number. Similarly the lack of pin for <code>scipy</code> could be false as
the API breaks. Even pins that establish firm upper and lower bounds may
be false as new versions of the pinned library restore the missing API.
These issues are particularly problematic for dependency systems that
tie the pins to a particular version of the source code, requiring a new
version to be created to update the pins. Conda-Forge is able to avoid
some of these issues via <a href="https://github.com/conda-forge/conda-forge-repodata-patches-feedstock" target="_blank" rel="noopener noreferrer">repodata
patching</a>,
dynamically updating a package's stated requirements. Overall this
process is fraught, as each package depends on different portions of a
library's API, a version bump that breaks one package may leave others
unscathed.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="a-potential-path-forward">A Potential Path Forward<a href="https://conda-forge.org/blog/2020/10/02/versions#a-potential-path-forward" class="hash-link" aria-label="Direct link to A Potential Path Forward" title="Direct link to A Potential Path Forward">​</a></h2>
<p>All of the above issues are caused by the confusion of <a href="https://en.wikipedia.org/wiki/Map%E2%80%93territory_relation" target="_blank" rel="noopener noreferrer">the map for the
territory</a>.
The map, in this case the version number of a library, can not
accurately represent the territory, the API itself. To fix this issue we
need a more accurate description of the territory. Achieving this will
not be easy, but I think there is an approach that gets close enough to
limit the number of errors.</p>
<p>We need a programmatic way to check if a particular library, for a
particular version, provides the required API. I think this can be
achieved iteratively, with each step providing additional clarity and
difficulty of implementation. Note that in the steps below, I'm using
python packaging as an example, but I imagine that these steps are
general enough to apply to other languages and ecosystems.</p>
<ol>
<li>Determine which libraries are requirements of the code, this is
provided by tools like
<a href="https://github.com/ericdill/depfinder" target="_blank" rel="noopener noreferrer">depfinder</a> and are starting
to be integrated into the Conda-Forge bot systems (although they are
still highly experimental and being worked on).</li>
<li>Determine if the a version of the library provides the needed
modules. This could be accomplished by using depfinder to find the
imports and use the mapping provided by
<a href="https://github.com/regro/libcfgraph/tree/master/import_maps" target="_blank" rel="noopener noreferrer">libcfgraph</a>
between the import names and the versions of packages that ship
those imports.</li>
<li>Determine if an imported module provides the symbols being imported.
This would require a listing of all the symbols in a given python
module, including top level scoped variables, function names, class
names, methods, etc.</li>
<li>For callables determine if the used call signature matches the
method or function definition.</li>
</ol>
<p>The <a href="https://github.com/ericdill/depfinder" target="_blank" rel="noopener noreferrer">depfinder</a> project has made
significant advances along this path, providing an easy to use tool to
extract accurate import and package requirement data from source code.
Depfinder even has cases to handle imports that are within code blocks
that might make the requirement optional or use the python standard
library. Future work on depfinder, including using more accurate maps
between imports and package names and providing metadata on package
requirements that are collectively exhaustive (for instance imports of
<code>pyqt4</code> vs. <code>pyqt5</code> in a <code>try: except:</code> block), will provide even more
accurate information on requirements.</p>
<p>At each one of the above stages we can provide significant value to
users, maintainers and source code authors by helping them to keep their
requirements consistent and warning when there are conflicts.
Conda-Forge can update its repodata as new versions of imported
libraries are created, to properly represent if that version is API
compatible with it's downstream consumers. Additionally the tables that
list all the symbols and call signatures can be provided to 3rd party
consumers that may want to patch their own metadata or check if a piece
of source code is self consistent in its requirements. This will also
help with the loosening of pins, creating more solvable environments for
Conda-Forge and other packaging ecosystems. Furthermore, as this tooling
matures and becomes more accurate it can be incorporated into the
Conda-Forge bot systems to automatically update dependencies during
version bumps and repodata patches, helping reduce maintenance burden.</p>
<p>Tools built from the symbol table can also have impacts far beyond
Conda-Forge. For instance, the symbol tables could allow source code
authors to have a line by line inspection of their code, revealing which
lines force the use of older or newer versions of dependencies. This
could enable large scale migrations of source code with surgical
precision, enabling developers to extract and re-write the few lines of
code preventing the use of a new version of a library.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="caveats">Caveats<a href="https://conda-forge.org/blog/2020/10/02/versions#caveats" class="hash-link" aria-label="Direct link to Caveats" title="Direct link to Caveats">​</a></h2>
<p>There are some important caveats to this approach that need to be kept
in mind.</p>
<ol>
<li>All of this work is aimed at understanding the API of a given
library, this approach can not provide insight into the code inside
of the API, or if changes there impact downstream consumers. For
instance, version updates that fix bugs and security flaws in
library code may not change the API at all. From this tooling's
perspective there is no reason to upgrade since the API is not
different. Of course there is a strong reason to upgrade in this
case, since buggy or vulnerable libraries could be a huge headache
and liability for downstream code and should be removed as quickly
as possible.</li>
<li>Some features may depend on broader adoption by the community. For
instance, this approach would benefit greatly from python type
hints, since the API could be constrained down to the expected
types. Such type constraints would provide much more accuracy to the
API version range as any changes could be detected. However, type
hints may not be adopted in the python community at a high enough
rate to truly be useful for this application.</li>
<li>Source code is fundamentally flexible. There may be knots of code
that even this approach could not cut through, especially as
multiple languages and runtime module loading come into the picture.
My personal hope would be that the code recognizes when these
situations occur, provides its best guess of what is going on, and
provides sufficient metadata to users so that they understand the
decreased accuracy of the results. Fundamentally the tooling can
only provide very educated guesses and context to users, who then
need to go figure out what is actually going on inside the code.</li>
</ol>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="https://conda-forge.org/blog/2020/10/02/versions#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h2>
<p>Version number based pins are imprecise representations of API
compatibility. More accurate representations based on source code
inspection would make the Conda-Forge ecosystem more robust and flexible
while reducing maintenance burden. Some of the path to achieving this is
built, and near future steps can be achieved with current tooling and
databases.</p>]]></content:encoded>
            <category>conda-forge</category>
        </item>
        <item>
            <title><![CDATA[R 4.0 Migration Retrospective]]></title>
            <link>https://conda-forge.org/blog/2020/07/11/r-4</link>
            <guid>https://conda-forge.org/blog/2020/07/11/r-4</guid>
            <pubDate>Sat, 11 Jul 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[While the R 4.0 migration has been functionally complete for quite a]]></description>
            <content:encoded><![CDATA[<p>While the R 4.0 migration has been functionally complete for quite a
while, the recent migration of <code>r-java</code> and its dependents gives a good
opportunity to write a retrospective on the technical issues with
large-scale migrations in <code>conda-forge</code> and how we solved them.</p>
<p>The R 4.0 migration rebuilt every package in <code>conda-forge</code> that had
<code>r-base</code> as a requirement, including more than 2200 feedstocks. A
migration of this size in <code>conda-forge</code> faces several hurdles. First,
since every feedstock is a separate GitHub repository, one needs to
merge more 2200 pull requests (PRs). Second, <code>conda-forge</code>'s packages
on <code>anaconda.org</code> are behind a CDN (content delivery network). This
service reduces web hosting costs for Anaconda Inc. but introduces an
approximately 30 minute delay from when a package is uploaded to
<code>anaconda.org</code> and when it will appear as available using <code>conda</code> from
the command line. Thus, even if the dependencies of a package have been
built, we have to wait until they appear on the CDN before we can
successfully issue the next PR and have it build correctly. Finally, the
existing bot and <code>conda</code> infrastructure limited the throughput of the
migrations, due in part to the speed of the <code>conda</code> solver.</p>
<p>Given the size of the R 4.0 migration, we took this opportunity to try
out a bunch of new technology to speed up large-scale migrations. The
main enhancements were using GitHub Actions to automerge PRs, using
<code>mamba</code> to quickly check for solvability of package environments, and
enabling long-running migration jobs for the autotick bot. All told, the
bulk of the feedstocks for R 4.0 were rebuilt in less than a week, with
many PRs being merged in 30 minutes or less from when they were issued.
These enhancements to the autotick bot and <code>conda-forge</code> infrastructure
can be used to enhance future migrations (e.g., Python 3.9) and reduce
maintenance burdens for feedstocks.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="automerging-conda-forge-prs">Automerging conda-forge PRs<a href="https://conda-forge.org/blog/2020/07/11/r-4#automerging-conda-forge-prs" class="hash-link" aria-label="Direct link to Automerging conda-forge PRs" title="Direct link to Automerging conda-forge PRs">​</a></h2>
<p>In a typical migration on <code>conda-forge</code>, we issue a PR to a feedstock
and then ask the feedstock maintainers to make sure it passes and merge
it. In the case of the R 4.0 migration, the maintainers of R packages on
<code>conda-forge</code> use a maintenance team (i.e., <code>@conda-forge/r</code>) on the
vast majority of feedstocks. This team is small and so merging over 2000
PRs by hand is a big undertaking. Thus, with their permission, we added
the <code>conda-forge</code> automerge functionality to all R feedstocks that they
maintain. The automerge bot, which relies on GitHub Actions, is able to
automatically merge any PR from the autotick bot that passes the recipe
linter, the continuous integration services, and has the special
<code>[bot automerge]</code> slug in the PR title. This feature removed the
bottleneck of waiting for maintainers to merge PRs and reduced the
maintenance burden on the R maintenance team.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="checking-solvability-with-mamba">Checking Solvability with mamba<a href="https://conda-forge.org/blog/2020/07/11/r-4#checking-solvability-with-mamba" class="hash-link" aria-label="Direct link to Checking Solvability with mamba" title="Direct link to Checking Solvability with mamba">​</a></h2>
<p>While being able to automatically merge PRs removed much of the work of
performing the R 4.0 migration, it relied on the PR building correctly
the first time it was issued. Due to the CDN delays and the build times
of a package's dependencies, the dependencies of a package may not be
immediately available after all of their migration PRs are merged. If
the bot issued the packages migration PR before the dependents are
available, the PR would fail with an unsolvable environment and have to
be restarted manually. This failure would negate any of the benefits of
using automerge in the first place.</p>
<p>To control for this edge case, we employed the <code>mamba</code> package to check
for the solvability of a PR's environments before the PR was issued.
<code>mamba</code> is a fast alternative to <code>conda</code> that produces solutions for
environments orders of magnitude more quickly. Since, we have to perform
our checks of PR environments many times, an extremely fast solver was
essential for making the code efficient enough to run as part of the
autotick bot. We ended up using mamba to try to install the dependencies
for every variant produced by the feedstock to be migrated. With this
check in place, the autotick bot was able to issue migration PRs that
passed on the first try and were thus automatically merged, many within
30 minutes or less.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="improving-the-autotick-bots-efficiency">Improving the Autotick Bot's Efficiency<a href="https://conda-forge.org/blog/2020/07/11/r-4#improving-the-autotick-bots-efficiency" class="hash-link" aria-label="Direct link to Improving the Autotick Bot's Efficiency" title="Direct link to Improving the Autotick Bot's Efficiency">​</a></h2>
<p>Finally, we made several upgrades to the autotick bot infrastructure to
increase the uptime of the bot and its efficiency. First, we moved from
an hourly cron job to a set of chained CI jobs. This change eliminated
downtime between the runs of the bot. Second, we started to refactor the
autotick bot from one monolithic piece of code into a distributed set of
microservices which perform various independent tasks in parallel. These
independent tasks, used for things like checking the statuses of
previously issued PRs, are run separately allowing the bot to spend more
time issuing PRs. Finally, we optimized the internal prioritization of
the PRs to make sure the bot was spending more time on larger migrations
where there is more work to do. More work on the autotick bot
infrastructure, including work done by Vinicius Cerutti as part of the
Google Summer of Code program, will further streamline the bot's
operation.</p>
<p>Despite some initial hiccups with the bot infrastructure, the migration
ran quite smoothly for an endeavor of its size. The vast majority of
migration PRs were completed within a week from when we started, which
is a first for a migration of this size on <code>conda-forge</code>. The largest
issue was solved recently, with the fixing of the <code>openjdk</code> recipe and
the removal of <code>aarch64</code> and <code>ppc64le</code> builds from <code>r-java</code>, enabling
the last large piece of the R ecosystem to be updated.</p>
<p>Looking forward, the improvements we made for the R 4.0 migration seem
broadly applicable to other migration tasks, including the yearly python
minor version bump. These kinds of large-scale migrations are
particularly suitable, since they usually involve few changes to the
feedstock itself and usually fail on CI when a broken package would be
produced. Faster migrations will help to provide the latest features to
downstream users and keep transition times to a minimum, helping to
foster greater stability of the ecosystem and the seamless experience
users have come to expect from <code>conda-forge</code>.</p>]]></content:encoded>
            <category>scipy</category>
        </item>
        <item>
            <title><![CDATA[Scipy 2020 Packaging BOF]]></title>
            <link>https://conda-forge.org/blog/2020/07/06/scipy-bof</link>
            <guid>https://conda-forge.org/blog/2020/07/06/scipy-bof</guid>
            <pubDate>Mon, 06 Jul 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[Abstract:]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorWithStickyNavbar_LWe7" id="abstract">Abstract:<a href="https://conda-forge.org/blog/2020/07/06/scipy-bof#abstract" class="hash-link" aria-label="Direct link to Abstract:" title="Direct link to Abstract:">​</a></h2>
<p>Have some thoughts about conda-forge and how it can be expanded in a way
that is sustainable? Join us in this virtual Birds of a Feather
discussion where we'll discuss maintenance, pain points, opportunities
within conda-forge. Any and all are welcome, and we especially are
seeking new viewpoints and opinions!</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="bof-questions">BOF questions:<a href="https://conda-forge.org/blog/2020/07/06/scipy-bof#bof-questions" class="hash-link" aria-label="Direct link to BOF questions:" title="Direct link to BOF questions:">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="state-of-packaging">State of Packaging<a href="https://conda-forge.org/blog/2020/07/06/scipy-bof#state-of-packaging" class="hash-link" aria-label="Direct link to State of Packaging" title="Direct link to State of Packaging">​</a></h3>
<ul>
<li>What is the state of conda-forge today?</li>
<li>What improvements are in the works?</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="new-featuresideas">New features/ideas<a href="https://conda-forge.org/blog/2020/07/06/scipy-bof#new-featuresideas" class="hash-link" aria-label="Direct link to New features/ideas" title="Direct link to New features/ideas">​</a></h3>
<ul>
<li>What is something that's not in the works that you'd like to see
updated/improved?</li>
<li>What are ways that folks who are interested but new to the community
can get involved?</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="maintenance">Maintenance<a href="https://conda-forge.org/blog/2020/07/06/scipy-bof#maintenance" class="hash-link" aria-label="Direct link to Maintenance" title="Direct link to Maintenance">​</a></h3>
<ul>
<li>What is the maintenance burden and what pain points does it create?</li>
<li>What are strategies to mitigate this burden?</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="questions-to-the-audience">Questions to the audience<a href="https://conda-forge.org/blog/2020/07/06/scipy-bof#questions-to-the-audience" class="hash-link" aria-label="Direct link to Questions to the audience" title="Direct link to Questions to the audience">​</a></h3>
<ul>
<li>What are your pain points when engaging with conda forge?</li>
<li>What is something new you'd like to see happen?</li>
<li>What feedback do audience members have?</li>
</ul>]]></content:encoded>
            <category>scipy</category>
        </item>
        <item>
            <title><![CDATA[Conda-Forge Operational Risk]]></title>
            <link>https://conda-forge.org/blog/2020/07/02/op-risk</link>
            <guid>https://conda-forge.org/blog/2020/07/02/op-risk</guid>
            <pubDate>Thu, 02 Jul 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[Recently I've been thinking about operational risk (op. risk).]]></description>
            <content:encoded><![CDATA[<p>Recently I've been thinking about operational risk (op. risk).
Operational risks arise from failures of processes, for instance a
missing email, or an automated software system not running properly.
Many commercial institutions are interested in minimizing op. risk,
since it is risk that produces no value, as opposed to risks associated
with investing. This is also something I think about in my job at
<a href="https://www.lab49.com/" target="_blank" rel="noopener noreferrer">Lab49</a>, where I'm a software engineering
consultant focusing on financial institutions. I think there is also a
good analogy for Conda-Forge, even though we are not a commercial
outfit. In this case the risk we incur isn't the potential for lost
earnings but frustration for our users and maintainers in the form of
bugs and lackluster user experience. In this post I explore three main
sources of operational risk for Conda-Forge: Automation, Top-Down
Control, and Self-Service Structure.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="a-brief-conda-forge-primer">A brief conda-forge primer<a href="https://conda-forge.org/blog/2020/07/02/op-risk#a-brief-conda-forge-primer" class="hash-link" aria-label="Direct link to A brief conda-forge primer" title="Direct link to A brief conda-forge primer">​</a></h2>
<p>Conda-Forge is an ecosystem and community that grew around building
packages for the conda package manager. Conda-Forge uses continuous
integration services to build packages from GitHub repos called
feedstocks. This structure enables teams of contributors to maintain
packages via a pull request based workflow. At time of writing
Conda-Forge has over 10000 feedstocks and ships more than 120 million
packages a month.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="self-service-structure">Self-Service Structure<a href="https://conda-forge.org/blog/2020/07/02/op-risk#self-service-structure" class="hash-link" aria-label="Direct link to Self-Service Structure" title="Direct link to Self-Service Structure">​</a></h2>
<p>Conda-Forge is built around a self-service structure for each stage in a
feedstock's lifecyle. The creation of new feedstocks relies on would be
maintainers to submit PRs to staged-recipes. Although language specific
help teams and staged-recipes reviewers provide some assistance and
oversight, the PR submitter plays the most important role in proposing
the package and shepherding it to acceptance. Once the feedstock is
accepted the maintenance is federated with most upkeep being performed
by the maintainers, who have extensive permissions and control over the
feedstock. If fixes or updates are needed for a package, maintainers and
users are encouraged to open their own pull requests.</p>
<p>This structure can present a few challenges for minimizing op. risk. The
most important challenge is the disconnect between feedstock maintainers
and users. While most maintainers are package users, most of our users
are not maintainers, and are unlikely to become maintainers. The
disparity between maintainers and users can come from a few sources,
some under our control and others not. For instance we can write better
documentation, lowering the barrier to entry, but we don't have control
over how our user's incentive structures value Conda-Forge
contributions. This produces a gap in representation in the Conda-Forge
organizational structure, where non-maintainer users' issues and
desires are not communicated to maintainers and Core.</p>
<p>For instance, are we servicing the needs of developers using our
binaries as dependencies to code they are compiling locally. As another
example, are there support gaps for developers and scientists using
Conda-Forge in academic and government laboratories, who might not have
the skills or capacity to fix feedstocks. Our reliance on the public
GitHub platform may prevent some users without access from raising their
concerns. Since these users may be under-represented we don't even know
if we are meeting their needs and how best to help.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="top-down-control">Top-Down Control<a href="https://conda-forge.org/blog/2020/07/02/op-risk#top-down-control" class="hash-link" aria-label="Direct link to Top-Down Control" title="Direct link to Top-Down Control">​</a></h2>
<p>While the majority of Conda-Forge's permissions structure is federated,
certain important parts are centralized, with the Core developers making
key decisions. Often these decisions are focused on stability of the
ecosystem, for instance what versions of languages to support.
Additionally, maintenance and enhancements to the Conda-Forge
infrastructure are mostly performed by Core developers.</p>
<p>However, the Core developers are usually experienced feedstock
maintainers, expert conda users, and have bought into the Conda-Forge
ecosystem and mission. This means that decisions can be made without the
perspective of new users or maintainers, or from potential users that
are skeptical of the Conda-Forge approach.</p>
<p>For instance, decisions about application binary interface pins are
usually made by core, although these changes have impacts on downstream
maintainers. It is possible that most maintainers don't know about what
these pins are, how they are changed and how that affects their
feedstocks.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="automation">Automation<a href="https://conda-forge.org/blog/2020/07/02/op-risk#automation" class="hash-link" aria-label="Direct link to Automation" title="Direct link to Automation">​</a></h2>
<p>Automation has been used to great effect to make Conda-Forge possible.
The various bots and web services enable Conda-Forge's current scale,
providing help and support from running builds, bumping versions, and
checking feedstock quality. However, this automation presents its own
operational risks and magnifies existing operational risks.</p>
<p>Automation has a tendency to fail when we least expect it and often we
lack the ability to fix it. The January 2018 Travis-CI outage is a great
example of this, where the CI service we were using for macOS builds
experienced reduced capacity and then a complete outage, causing builds
to queue for days. Recently there was a sudden decrease in the number of
parallel builds on Azure causing a similar queue of builds. Automation
can cause issues by enabling users to make decisions without all the
needed information. While many feedstocks have effective smoke tests for
their packages the autotick bot doesn't currently check for new
dependencies, potentially leading to missing or incorrect package
metadata.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="https://conda-forge.org/blog/2020/07/02/op-risk#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h2>
<p>Overall Conda-Forge has managed its operational risk well. Most
importantly Conda-Forge's transparent open source nature allows us to
address these issues head on by engaging with the community.</p>]]></content:encoded>
            <category>conda-forge</category>
        </item>
        <item>
            <title><![CDATA[PyPy builds on conda-forge]]></title>
            <link>https://conda-forge.org/blog/2020/03/10/pypy</link>
            <guid>https://conda-forge.org/blog/2020/03/10/pypy</guid>
            <pubDate>Tue, 10 Mar 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[conda-forge now supports PyPy3.6 as the python interpreter in a conda]]></description>
            <content:encoded><![CDATA[<p>conda-forge now supports PyPy3.6 as the python interpreter in a conda
environment</p>
<p>Supported platforms are,</p>
<blockquote>
<ul>
<li>Linux-x86_64 (glibc 2.12 or newer)</li>
<li>OSX-x86_64 (OSX 10.9 or newer)</li>
<li>Linux-aarch64 (glibc 2.17 or newer)</li>
<li>Linux-ppc64le (glibc 2.17 or newer)</li>
</ul>
</blockquote>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-to-use-pypy">How to use PyPy<a href="https://conda-forge.org/blog/2020/03/10/pypy#how-to-use-pypy" class="hash-link" aria-label="Direct link to How to use PyPy" title="Direct link to How to use PyPy">​</a></h2>
<p>To use the PyPy builds you can do the following,</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">conda config --set channel_priority strict</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">conda create -n pypy pypy</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">conda activate pypy</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>If you don't have a conda installation already, you can use
<a href="https://github.com/conda-forge/miniforge#miniforge-pypy3" target="_blank" rel="noopener noreferrer">miniforge-pypy3</a>
which gives you a conda installation powered by pypy itself.</p>
<p>However as of the writing of this post, not many conda packages can be
installed into this environment, but noarch packages which do not depend
on the python version nor the interpreter can be installed. For eg,
mpmath is a noarch package without any dependencies.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">conda install mpmath    # succeeds</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">conda install numpy     # fails as of March 10, 2020</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>UPDATE</strong>: numpy and scipy builds are working as of April 10, 2020.</p>
<p>All python C extensions needs to be rebuilt for the PyPy ABI. This is
currently on the way and can be tracked at the <a href="https://conda-forge.org/status" target="_blank" rel="noopener noreferrer">status
page</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="python_abi-package">python_abi Package<a href="https://conda-forge.org/blog/2020/03/10/pypy#python_abi-package" class="hash-link" aria-label="Direct link to python_abi Package" title="Direct link to python_abi Package">​</a></h2>
<p>As part of adding support for PyPy and to keep the older python builds
working, a python_abi package was added. This defines the abi for the
python package and any non-noarch python packages will have a dependency
on this package. Older python downstream packages like numpy had their
metadata patched to add a CPython ABI. You can ask for a specific python
ABI.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">conda install "python_abi=*=*_cp27mu"</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>If you are using python packages from packages other than defaults, you
will be able to install python extensions built with CPython ABI into
PyPy builds as their metadata have not been patched. Solution in this
case is to hotfix the metadata which is available to only high volume
conda channel or to rebuild those packages with the new python packages
and mark the older ones as broken.</p>
<p>Using the newer packages will rerender the following requirement to add
a dependency on python_abi. For eg,</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">requirements</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">host</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> python 3.6</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">run</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> python</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>is rendered as,</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">requirements</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">host</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> python 3.6.10 h9d8adfe_1009_cpython</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">run</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> python </span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain">=3.6</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">&lt;3.7.0a0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> python_abi 3.6 </span><span class="token important">*_cp36m</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>whereas,</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">requirements</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">host</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> python 3.6 </span><span class="token important">*_73_pypy</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">run</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> python</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>is rendered as,</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">requirements</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">host</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> python 3.6.9 0_73_pypy</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">run</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> python </span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain">=3.6</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">&lt;3.7.0a0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> python_abi 3.6 </span><span class="token important">*_pypy36_pp73</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Note that the PyPy ABI tag has <code>pp73</code> at the end which
indicates that the ABI is stable only for PyPy3.6 7.3.x series.</p>
<p>This opens up the possibility of adding debug builds of python and
building extension packages using the Python Debug ABI.</p>
<p>Discussion on the PyPy builds can be found in the issue
<a href="https://github.com/conda-forge/conda-forge.github.io/issues/867" target="_blank" rel="noopener noreferrer">conda-forge/conda-forge.github.io#867</a>.</p>]]></content:encoded>
            <category>infrastructure</category>
        </item>
        <item>
            <title><![CDATA[By the power of Grayskull... I have the Conda recipe!]]></title>
            <link>https://conda-forge.org/blog/2020/03/05/grayskull</link>
            <guid>https://conda-forge.org/blog/2020/03/05/grayskull</guid>
            <pubDate>Thu, 05 Mar 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[The main goal of the Skeleto~~n~~r is to conquer Grayskull.]]></description>
            <content:encoded><![CDATA[<p><em>The main goal of the Skeleto</em><del>n</del><em>r is to conquer Grayskull.</em></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="introduction">Introduction<a href="https://conda-forge.org/blog/2020/03/05/grayskull#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction">​</a></h2>
<p>All jokes aside, the new project
<a href="https://github.com/marcelotrevisani/grayskull" target="_blank" rel="noopener noreferrer">grayskull</a> was created
with the <strong>intention</strong> of generating better Conda recipes that would
allow to package properly projects available in different channels such
as PyPI, CRAN, Conan, GitHub register, GitHub repositories and so on. On
top of that, Grayskull is also being developed to help
<a href="https://conda-forge.org/" target="_blank" rel="noopener noreferrer">conda-forge</a> to update recipes.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="current-status">Current status<a href="https://conda-forge.org/blog/2020/03/05/grayskull#current-status" class="hash-link" aria-label="Direct link to Current status" title="Direct link to Current status">​</a></h2>
<p>Currently, Grayskull (version <code>0.2.1</code>) is able to generate recipes just
looking for packages on <a href="https://pypi.org/" target="_blank" rel="noopener noreferrer">PyPI</a>, and it is available
on <a href="https://pypi.org/project/grayskull/" target="_blank" rel="noopener noreferrer">PyPI</a> and
<a href="https://github.com/conda-forge/grayskull-feedstock" target="_blank" rel="noopener noreferrer">conda-forge</a>. The
GitHub repository for this package is:
<a href="https://github.com/marcelotrevisani/grayskull" target="_blank" rel="noopener noreferrer">marcelotrevisani/grayskull</a>.</p>
<p>Before Grayskull, we just had <code>conda-build skeleton</code> to generate recipes
for Python packages on PyPI. In all other aspects, the difference of
quality of the generated recipes, and also the time spent to generate
them have a big discrepancy when compared to <code>conda-build skeleton</code> and
<code>grayskull</code>. Grayskull generates recipes taking in consideration the
platform, Python version available, selectors, compilers (Fortran, C and
C++), packages constrains, license type, license file, and so forth. It
uses metadata available from multiple sources to try to create the best
recipe possible.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="installation">Installation<a href="https://conda-forge.org/blog/2020/03/05/grayskull#installation" class="hash-link" aria-label="Direct link to Installation" title="Direct link to Installation">​</a></h2>
<p>You can install <code>grayskull</code> using <code>pip</code> or <code>conda</code>. <code>Grayskull</code> does not
rely on <code>conda</code> to run and can generate recipes with minimum
dependencies.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="with-conda">With conda<a href="https://conda-forge.org/blog/2020/03/05/grayskull#with-conda" class="hash-link" aria-label="Direct link to With conda" title="Direct link to With conda">​</a></h3>
<p>Grayskull is available on the conda-forge channel.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">conda install -c conda-forge grayskull</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="with-pip">With pip<a href="https://conda-forge.org/blog/2020/03/05/grayskull#with-pip" class="hash-link" aria-label="Direct link to With pip" title="Direct link to With pip">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">pip install grayskull</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="grayskull-vs-conda-build-skeleton">Grayskull vs conda-build skeleton<a href="https://conda-forge.org/blog/2020/03/05/grayskull#grayskull-vs-conda-build-skeleton" class="hash-link" aria-label="Direct link to Grayskull vs conda-build skeleton" title="Direct link to Grayskull vs conda-build skeleton">​</a></h2>
<p>There are some differences of recipes generated by <code>grayskull</code> and
<code>conda skeleton</code>. Taking as example the <code>pytest</code> recipe, which has
selectors for platforms, Python version constrains, and has several
package constrains as well.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="grayskull-021---took-4-seconds-to-generate-the-recipe">Grayskull (0.2.1) - took 4 seconds to generate the recipe<a href="https://conda-forge.org/blog/2020/03/05/grayskull#grayskull-021---took-4-seconds-to-generate-the-recipe" class="hash-link" aria-label="Direct link to Grayskull (0.2.1) - took 4 seconds to generate the recipe" title="Direct link to Grayskull (0.2.1) - took 4 seconds to generate the recipe">​</a></h3>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">% set name = "pytest" %</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">% set version = "5.3.5" %</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">package</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">|</span><span class="token plain">lower </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">version</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> version </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">source</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">url</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//pypi.io/packages/source/</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">/</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> name </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">/</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> name </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> version </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">.tar.gz</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">sha256</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 0d5fe9189a148acc3c3eb2ac8e1ac0742cb7618c084f3d228baaec0c254b318d</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">build</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">number</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">skip</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain">   </span><span class="token comment" style="color:#999988;font-style:italic"># [py2k]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">entry_points</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> pytest=pytest</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">main</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> py.test=pytest</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">main</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">script</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> PYTHON </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">m pip install . </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">vv</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">requirements</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">host</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> pip</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> python</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> setuptools </span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain">=40.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> setuptools_scm</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">run</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> atomicwrites </span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain">=1.0      </span><span class="token comment" style="color:#999988;font-style:italic"># [win]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> attrs </span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain">=17.4.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> colorama      </span><span class="token comment" style="color:#999988;font-style:italic"># [win]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> importlib</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">metadata </span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain">=0.12        </span><span class="token comment" style="color:#999988;font-style:italic"># [py&lt;38]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> more</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">itertools </span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain">=4.0.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> packaging</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> pathlib2 </span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain">=2.2.0        </span><span class="token comment" style="color:#999988;font-style:italic"># [py&lt;36]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> pluggy &lt;1.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain">=0.12</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> py </span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain">=1.5.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> python</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> wcwidth</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">test</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">imports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> pytest</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">commands</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> pip check</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> pytest </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">help</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> py.test </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">help</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">requires</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> pip</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">about</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">home</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//pypi.org/project/pytest/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">summary</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'pytest: simple powerful testing with Python'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">dev_url</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//github.com/pytest</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">dev/pytest</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">license</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> MIT</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">license_file</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> LICENSE</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">extra</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">recipe-maintainers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> marcelotrevisani</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="skeleton-31811---took-31-seconds-to-generate-the-recipe">Skeleton (3.18.11) - took 31 seconds to generate the recipe<a href="https://conda-forge.org/blog/2020/03/05/grayskull#skeleton-31811---took-31-seconds-to-generate-the-recipe" class="hash-link" aria-label="Direct link to Skeleton (3.18.11) - took 31 seconds to generate the recipe" title="Direct link to Skeleton (3.18.11) - took 31 seconds to generate the recipe">​</a></h3>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">% set name = "pytest" %</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">% set version = "5.3.5" %</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">package</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"{{ name|lower }}"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">version</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"{{ version }}"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">source</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">url</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://pypi.io/packages/source/{{ name[0] }}/{{ name }}/{{ name }}-{{ version }}.tar.gz"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">sha256</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 0d5fe9189a148acc3c3eb2ac8e1ac0742cb7618c084f3d228baaec0c254b318d</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">build</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">number</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">script</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"{{ PYTHON }} -m pip install . -vv"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">requirements</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">host</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> atomicwrites </span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain">=1.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> attrs </span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain">=17.4.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> colorama;sys_platform =="win32"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> importlib</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">metadata </span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain">=0.12</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> more</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">itertools </span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain">=4.0.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> packaging</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> pathlib2 </span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain">=2.2.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> pip</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> pluggy </span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain">=0.12</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">&lt;1.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> py </span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain">=1.5.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> python</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> wcwidth</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">run</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> atomicwrites </span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain">=1.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> attrs </span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain">=17.4.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> colorama;sys_platform =="win32"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> importlib</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">metadata </span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain">=0.12</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> more</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">itertools </span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain">=4.0.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> packaging</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> pathlib2 </span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain">=2.2.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> pluggy </span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain">=0.12</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">&lt;1.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> py </span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain">=1.5.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> python</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> wcwidth</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">about</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">home</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> The package home page</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">license</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> MIT</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">license_family</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> MIT</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">license_file</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">summary</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"pytest: simple powerful testing with Python"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">doc_url</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">dev_url</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">extra</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">recipe-maintainers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> your</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">github</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">id</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">here</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="original-recipe-on-conda-forge-for-pytest-535">Original recipe on <code>conda-forge</code> for <code>pytest 5.3.5</code><a href="https://conda-forge.org/blog/2020/03/05/grayskull#original-recipe-on-conda-forge-for-pytest-535" class="hash-link" aria-label="Direct link to original-recipe-on-conda-forge-for-pytest-535" title="Direct link to original-recipe-on-conda-forge-for-pytest-535">​</a></h3>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">% set version = "5.3.5" %</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">package</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> pytest</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">version</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> version </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">source</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">url</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//pypi.io/packages/source/p/pytest/pytest</span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> version </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">.tar.gz</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">sha256</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 0d5fe9189a148acc3c3eb2ac8e1ac0742cb7618c084f3d228baaec0c254b318d</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">build</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">skip</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">True</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># [py27]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">number</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">script</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"{{ PYTHON }} setup.py install --single-version-externally-managed --record record.txt"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">entry_points</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> py.test = py.test</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">main</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> pytest = py.test</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">main</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">requirements</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">host</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> pip</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> python</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> setuptools </span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain">=40.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> setuptools_scm</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">run</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> atomicwrites </span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain">=1.0  </span><span class="token comment" style="color:#999988;font-style:italic"># [win]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> attrs </span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain">=17.4.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> colorama  </span><span class="token comment" style="color:#999988;font-style:italic"># [win]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> importlib_metadata </span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain">=0.12  </span><span class="token comment" style="color:#999988;font-style:italic"># [py&lt;38]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> more</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">itertools </span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain">=4.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> packaging</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> pathlib2 </span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain">=2.2.0  </span><span class="token comment" style="color:#999988;font-style:italic"># [py&lt;36]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> pluggy </span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain">=0.12</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">&lt;1.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> py </span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain">=1.5.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> python</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> setuptools </span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain">=40.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> wcwidth</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">run_constrained</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># pytest-faulthandler 2 is a dummy package.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># if an older version of fault-handler is installed, it will conflict with pytest &gt;=5.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> pytest</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">faulthandler </span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain">=2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">test</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">commands</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> pytest </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">h</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">imports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> pytest</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">about</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">home</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//docs.pytest.org/en/latest/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">license</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> MIT</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">license_file</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> LICENSE</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">summary</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Simple and powerful testing with Python.'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span><br></span><span class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    The pytest framework makes it easy to write small tests, yet scales to</span><br></span><span class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    support complex functional testing for applications and libraries.</span><br></span><span class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    doc_url: https://docs.pytest.org/en/latest/</span><br></span><span class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    dev_url: https://github.com/pytest-dev/pytest/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">extra</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">recipe-maintainers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> flub</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> goanpeca</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> nicoddemus</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> ocefpaf</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> mingwandroid</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="major-differences">Major differences<a href="https://conda-forge.org/blog/2020/03/05/grayskull#major-differences" class="hash-link" aria-label="Direct link to Major differences" title="Direct link to Major differences">​</a></h3>
<table><thead><tr><th>Attribute</th><th>Grayskull (0.2.1)</th><th>Skeleton (3.18.11)</th></tr></thead><tbody><tr><td><strong>Command</strong></td><td>✅ grayskull pypi pytest</td><td>✅ conda skeleton pypi pytest</td></tr><tr><td><strong>Time</strong></td><td>✅ 4 seconds</td><td>❌ 31 seconds</td></tr><tr><td><strong>License</strong></td><td>✅ Added the license file and license type correctly</td><td>❗️ Added just the license type</td></tr><tr><td><strong>Host Requirements</strong></td><td>✅ Added correctly all the host requirements</td><td>❌ it didn't add the correctly the host dependencies. It added unnecessary dependencies and it is missing quite a few of them necessary to build the package</td></tr><tr><td><strong>Run Requirements</strong></td><td>✅ Missing just setuptools from the host requirements (but this dependency is not defined on pytest package)</td><td>❌ incorrect dependencies added to the project</td></tr><tr><td><strong>Selectors</strong></td><td>✅ Skipping correctly Python 2 and added selectors for windows and python versions</td><td>❌ it didn't add any information regarding selectors. Actually conda-build added wrong information which will result in a broken recipe. For example 'sys_platform == win32' was added which is a wrong format for conda recipes</td></tr><tr><td><strong>Entry points</strong></td><td>✅ Added all entry points correctly</td><td>❌ No entry points</td></tr><tr><td><strong>Does it build?</strong></td><td>✅ YES</td><td>❌ NO</td></tr></tbody></table>
<p>In the case of <code>noarch: python</code>, Grayskull is smart enough to detect
when the recipe supports it, which is not done by Skeleton. It is
important to highlight that Skeleton does not detect compilers as well.
Nevertheless, Grayskull always try to detect it.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="usage-grayskull-021">Usage Grayskull (0.2.1)<a href="https://conda-forge.org/blog/2020/03/05/grayskull#usage-grayskull-021" class="hash-link" aria-label="Direct link to Usage Grayskull (0.2.1)" title="Direct link to Usage Grayskull (0.2.1)">​</a></h2>
<p>Project options:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">$ grayskull --help</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">usage: grayskull [-h] [--version] {pypi} ...</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Grayskull - Conda recipe generator</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">positional arguments:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">{pypi}         Options to generate PyPI recipes</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pypi         Generate recipes based on PyPI</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">optional arguments:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">-h, --help     show this help message and exit</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">--version, -v  Print Grayskull version and exit</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">$ grayskull pypi --help</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">usage: grayskull pypi [-h] [--maintainers MAINTAINERS [MAINTAINERS...]]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[--output OUTPUT]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pypi_packages [pypi_packages ...]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">positional arguments:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pypi_packages         Specify the PyPI package name.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">optional arguments:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">-h, --help            show this help message and exit</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">--maintainers MAINTAINERS [MAINTAINERS ...], -m MAINTAINERS [MAINTAINERS...] List of maintainers which will be added to the recipe.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">--output OUTPUT, -o OUTPUT Path to where the recipe will be created</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>To generate the recipe you can just call <code>grayskull</code> and pass the
channel (as for now we are just supporting PyPI, it should be pypi) and
the package name. You should also specify an output folder using the
option <code>--output</code> or <code>-o</code> and it will create the package folder, and the
recipe in there. It is important to note that the user can specify a
list of maintainers which will be added to the recipe using the option
<code>--maintainers</code>.</p>
<p>Example for pytest:</p>
<p><img loading="lazy" src="https://raw.githubusercontent.com/marcelotrevisani/grayskull/15e4a0317da4e6c2f66a381329682b7e9dc70da0/docs/images/cli_example_grayskull.gif" alt="Grayskull CLI" class="img_ev3q"></p>
<p>If you need to specify the package version you can do it just puting the
equal sign after the package name and the version just right after that.
Example:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">grayskull pypi requests=2.21.0</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>or</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">grayskull pypi requests==2.21.0</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><img loading="lazy" src="https://raw.githubusercontent.com/marcelotrevisani/grayskull/15e4a0317da4e6c2f66a381329682b7e9dc70da0/docs/images/cli_example_grayskull_version.gif" alt="Grayskull pinned package -requests" class="img_ev3q"></p>
<p>If you want to generate multiple recipes just pass a list of packages,
such as:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">grayskul pypi pytest requests=2.21.0 colorama</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="future-plans">Future plans<a href="https://conda-forge.org/blog/2020/03/05/grayskull#future-plans" class="hash-link" aria-label="Direct link to Future plans" title="Direct link to Future plans">​</a></h2>
<blockquote>
<ul>
<li>For the next major version (1.0.0) it is planned to add the
functionality to be able to load the recipe and update just parts
of it;</li>
<li>Generate Conda recipes using CRAN (R) channel (2.0.0);</li>
<li>Generate Conda recipes using Conan (C++) channel (3.0.0);</li>
</ul>
</blockquote>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="issues">Issues<a href="https://conda-forge.org/blog/2020/03/05/grayskull#issues" class="hash-link" aria-label="Direct link to Issues" title="Direct link to Issues">​</a></h2>
<p>Any problem, question, suggestions please feel free to open <a href="https://github.com/marcelotrevisani/grayskull/issues" target="_blank" rel="noopener noreferrer">an issue on
the repository</a>.</p>
<p>Contributions are very welcome! :)</p>
<hr>
<p>This work was possible thanks to the <a href="https://numfocus.org/" target="_blank" rel="noopener noreferrer">NumFOCUS</a>
Small Development Grant program.</p>]]></content:encoded>
            <category>conda</category>
        </item>
        <item>
            <title><![CDATA[Google Summer of Code 2020 improved automatic maintenance of conda-forge]]></title>
            <link>https://conda-forge.org/blog/2020/02/04/gsoc</link>
            <guid>https://conda-forge.org/blog/2020/02/04/gsoc</guid>
            <pubDate>Tue, 04 Feb 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[The conda-forge "autotick" bot is a crucial part of conda-forge's]]></description>
            <content:encoded><![CDATA[<p>The <code>conda-forge</code> "autotick" bot is a crucial part of <code>conda-forge</code>'s
infrastructure. It enables automatic maintenance of <code>conda-forge</code>
packages by pushing version updates to the underlying software and
enabling large migrations of packages from one dependency to another
(e.g., Python 3.7 to Python 3.8). As <code>conda-forg</code> grows in size, with
over 9,000 packages to date, automatic maintenance of the <code>conda-forge</code>
ecosystem will become even more important.</p>
<p>We here at <code>conda-forge</code> have a large number of potential Google Sumer
of Code projects around maintenance and development of the autotick bot
infrastructure. These projects are high-impact, affecting the entire
<code>conda-forge</code> ecosystem. They also cover multiple systems including
databases, <code>conda</code>'s CDN provider, continuous integration providers,
and user interactions on GitHub.</p>
<p>Want to be a part of the team? Great! Take a look at the projects below
and get in touch with us on GitHub! You can check the <a href="https://github.com/regro/cf-scripts/labels/GSOC" target="_blank" rel="noopener noreferrer">GSoC
label</a> for a
detailed listing of the issues that need work.</p>
<ol>
<li>
<p>Maintenance and Refactoring</p>
<p>We have a large backlog of maintenance and refactoring issues that
are great for people with a range of experience from beginners to
true code ninjas.</p>
<ul>
<li>
<p>Integration Testing for the Autotick Bot</p>
<blockquote>
<p>Run true integration testing on a copy of the graph to better
test code changes and improve our CI process.</p>
<p><strong>Issue</strong>: <a href="https://github.com/regro/cf-scripts/issues/261" target="_blank" rel="noopener noreferrer">regro/cf-scripts261</a></p>
<p><strong>Experience Level</strong>: advanced</p>
</blockquote>
</li>
<li>
<p>Work on the "code hardening"
<a href="https://github.com/regro/cf-scripts/milestone/4" target="_blank" rel="noopener noreferrer">Milestone</a></p>
<p>Address any of the issues in the milestone above related to code
refactoring and cleanup.</p>
<p><strong>Issues</strong>: <a href="https://github.com/regro/cf-scripts/milestone/4" target="_blank" rel="noopener noreferrer">regro/cf-scripts milestone #4</a></p>
<p><strong>Experience Level</strong>: beginner to advanced</p>
</li>
</ul>
</li>
<li>
<p>Automated PRs for Globally Pinned Packages</p>
<p><code>conda-forge</code> maintains a list of globally pinned packages. These
are typically dependencies whose version needs to be the same across
all of <code>conda-forge</code> (e.g., the compiler versions or packages like
<code>HDF5</code>). While we have infrastructure to run a migration of the
downstream packages from a given pinned package, we do not have
automated infrastructure to propose the migration of the pin itself.
The project here is to add this functionality to our infrastructure.</p>
<p><strong>Issue</strong>: <a href="https://github.com/regro/cf-scripts/issues/665" target="_blank" rel="noopener noreferrer">regro/cf-scripts#665</a></p>
<p><strong>Experience Level</strong>: advanced</p>
</li>
<li>
<p>Check the <code>conda</code> CDN for Updated Packages before Issuing PRs in a
Migration</p>
<p><code>conda</code> relies on a CDN provider to serve the index of available
packages. There is a moderate ~30 minute delay between when a
package is uploaded to <code>anaconda.org</code> and when it will appear in the
<code>conda</code> index. We currently do not take this delay into account when
issuing PRs in a migration.</p>
<p><strong>Issue</strong>: <a href="https://github.com/regro/cf-scripts/issues/595" target="_blank" rel="noopener noreferrer">regro/cf-scripts#595</a></p>
<p><strong>Experience Level</strong>: beginner</p>
</li>
<li>
<p>Finish Migrations with PR into the <code>conda-forge</code> Pinnings File</p>
<p>Right now, when the migration of say package <code>ABC</code> to version <code>X</code>
from version <code>Y</code> is done, we do not automatically merge the change
in the globally pinned value of <code>ABC</code> into our listing of global
pinnings. We should be issuing a PR to the pinnings file once we
have determined that a suitable fraction of the packages effected by
a migration have been properly rebuilt.</p>
<p><strong>Issue</strong>: <a href="https://github.com/regro/cf-scripts/issues/595" target="_blank" rel="noopener noreferrer">regro/cf-scripts#595</a></p>
<p><strong>Experience Level</strong>: moderate</p>
</li>
<li>
<p>Fully Render <code>conda</code> Packages in order to Determine Migration
Dependencies</p>
<p>Determining the dependencies of a given package is actually a
computation expensive task due to the way <code>conda</code> recipes are
structured and parametrized through the use of <code>Jinja2</code> and
<code>conda-build-config.yaml</code> files. Currently, the autotick bot
examines the static metadata in the <code>meta.yaml</code> file and not the
fully rendered metadata. For this reason, we sometimes miss
dependencies of a given package that need to be migrated first.
Addressing this issue involves both calling the rendering process
and also scaling that process to the entire set of <code>conda-forge</code>
packages.</p>
<p><strong>Issue</strong>: <a href="https://github.com/regro/cf-scripts/issues/664" target="_blank" rel="noopener noreferrer">regro/cf-scripts#664</a></p>
<p><strong>Experience Level</strong>: moderate</p>
</li>
</ol>]]></content:encoded>
            <category>autotick-bot</category>
            <category>gsoc</category>
        </item>
        <item>
            <title><![CDATA[Automatically Deployed ABI Migrations]]></title>
            <link>https://conda-forge.org/blog/2019/12/06/cfep09</link>
            <guid>https://conda-forge.org/blog/2019/12/06/cfep09</guid>
            <pubDate>Fri, 06 Dec 2019 00:00:00 GMT</pubDate>
            <description><![CDATA[Handling application binary interface (ABI) migrations has always been a]]></description>
            <content:encoded><![CDATA[<p>Handling application binary interface (ABI) migrations has always been a
hassle for Conda-Forge. Maintaining ABI consistency helps enable the
"just use conda-forge" experience for many of our users, making
certain that numpy's blas is the same as scipy's. As libraries update
their code, the new versions may be ABI incompatible, as function
signatures and other symbols may have changed, leading to the dreaded
<code>SegmentationFault</code> and other errors.</p>
<p>Conda-Forge handles this by having a pinning file that tracks all the
currently supported ABIs. These pinned ABIs are then used to build the
downstream packages, making certain that all are consistent. As new
versions of pinned software are released the pins are updated, causing a
migration of the pin, and the rebuilding of all packages which rely on
the pinned package. In the past, this was handled by a change to the
global pinnings and a subsequent migration via the auto-tick bot. While
this worked, there were issues that this created. Firstly, this approach
could cause unsatisfiable build dependencies for new packages, as some
of the new package's dependencies had been compiled with the new pins,
but not all. Secondly, migrations happened in series, if a second pin
was moved while the first was being migrated then the migration could go
wrong as packages which were being rebuilt for the first pin got the
second pin before they were ready.</p>
<p>Conda-Forge Core has recently approved CFEP-9, a migration policy to fix
these issues. With CFEP-9 pinnings are proposed as small yaml snippets
which contain the new pins. The auto-tick bot then starts migrating the
packages in order, applying the yaml snippet to each package in turn. If
a second pinning change is issued then the bot starts the migration for
that package too, enabling the two migrations to work independently. If
a package needs a change in both pins then the maintainers can choose
the order in which they apply the pins by merging one pin before the
other.</p>
<p>This approach will yield much greater stability in migrations and will
enable more maintainers to issue migrations. Migrations can be issued by
putting a PR into
<a href="https://github.com/conda-forge/conda-forge-pinning-feedstock" target="_blank" rel="noopener noreferrer">conda-forge/conda-forge-pinning-feedstock</a>,
adding a file to the <code>migrations</code> folder, PRs into the auto-tick bot are
not needed anymore.</p>]]></content:encoded>
            <category>autotick-bot</category>
        </item>
    </channel>
</rss>