<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[ShiningPanda]]></title><description><![CDATA[Past and present tribulations of Tomotcha founders]]></description><link>http://shiningpanda.com/</link><image><url>http://shiningpanda.com/favicon.png</url><title>ShiningPanda</title><link>http://shiningpanda.com/</link></image><generator>Ghost 5.23</generator><lastBuildDate>Sun, 19 Apr 2026 11:54:33 GMT</lastBuildDate><atom:link href="http://shiningpanda.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Requires.io, clap de fin]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Today brings some sad news: we are shutting down <a href="https://requires.io/">Requires.io</a>. The service will remain up and running until September 30th, 2022.</p>
<p>There are many services offering similar services now, especially regarding security vulnerabilities, so migrating away from requires.io should not be too hard. A couple of them:</p>
<ul>
<li><a href="https://snyk.io/">snyk</a></li></ul>]]></description><link>http://shiningpanda.com/requires-io-clap-de-fin/</link><guid isPermaLink="false">637fe19c975135ef2da3c61f</guid><category><![CDATA[Requires.io]]></category><dc:creator><![CDATA[Olivier]]></dc:creator><pubDate>Thu, 30 Jun 2022 22:00:00 GMT</pubDate><media:content url="http://shiningpanda.com/content/images/2022/11/requires_crop.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="http://shiningpanda.com/content/images/2022/11/requires_crop.png" alt="Requires.io, clap de fin"><p>Today brings some sad news: we are shutting down <a href="https://requires.io/">Requires.io</a>. The service will remain up and running until September 30th, 2022.</p>
<p>There are many services offering similar services now, especially regarding security vulnerabilities, so migrating away from requires.io should not be too hard. A couple of them:</p>
<ul>
<li><a href="https://snyk.io/">snyk</a></li>
<li><a href="https://github.com/dependabot">Dependabot</a>, integrated within <a href="https://github.com/features/security">GitHub</a></li>
<li><a href="https://about.gitlab.com/">GitLab</a> is also offering <a href="https://docs.gitlab.com/ee/user/application_security/dependency_scanning/">dependency scanning</a></li>
</ul>
<p>We are incredibly thankful to all the people who have been relying on requires.io to stay up to date with their dependencies.</p>
<p>Thank you all for supporting us for so long.</p>
<p>Olivier &amp; Alexis</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Pipenv support]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p><a href="https://requires.io/">Requires.io</a> is all about being notified of outdated dependencies on PyPI packages.</p>
<p>Today we are proud to introduce <a href="http://pipenv.readthedocs.io/en/latest/">Pipenv</a> support!</p>
<p><img src="http://shiningpanda.com/content/images/2018-01/pipenv.png" alt="Licenses" loading="lazy"></p>
<p>Requires.io will now look for <code>Pipenv</code> and <code>Pipenv.lock</code> files at the root of your repository to warn you about oudated and insecure dependencies, licenses, changelogs... and even</p>]]></description><link>http://shiningpanda.com/pipenv-support/</link><guid isPermaLink="false">637fe19c975135ef2da3c634</guid><category><![CDATA[Requires.io]]></category><dc:creator><![CDATA[Olivier]]></dc:creator><pubDate>Wed, 10 Jan 2018 23:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p><a href="https://requires.io/">Requires.io</a> is all about being notified of outdated dependencies on PyPI packages.</p>
<p>Today we are proud to introduce <a href="http://pipenv.readthedocs.io/en/latest/">Pipenv</a> support!</p>
<p><img src="http://shiningpanda.com/content/images/2018-01/pipenv.png" alt="Licenses" loading="lazy"></p>
<p>Requires.io will now look for <code>Pipenv</code> and <code>Pipenv.lock</code> files at the root of your repository to warn you about oudated and insecure dependencies, licenses, changelogs... and even issue pull requests to update your <code>Pipenv</code>.</p>
<p>We hope you will enjoy this new feature!</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Optimize your website within two hours]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>I run a small tea subscription service called <a href="https://tomotcha.com/">Tomotcha</a>, and each month we send Japanese tea directly from Osaka.</p>
<p>Like most small businesses we use Google tools extensively (Analytics, AdWords, Webmaster Tools...) and we periodically receive their emails about new stuffs.</p>
<p>Last week&apos;s topic was <em>Does the speed</em></p>]]></description><link>http://shiningpanda.com/optimize-your-website-within-two-hours/</link><guid isPermaLink="false">637fe19c975135ef2da3c647</guid><category><![CDATA[Tomotcha]]></category><category><![CDATA[Python]]></category><dc:creator><![CDATA[Olivier]]></dc:creator><pubDate>Wed, 08 Nov 2017 23:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>I run a small tea subscription service called <a href="https://tomotcha.com/">Tomotcha</a>, and each month we send Japanese tea directly from Osaka.</p>
<p>Like most small businesses we use Google tools extensively (Analytics, AdWords, Webmaster Tools...) and we periodically receive their emails about new stuffs.</p>
<p>Last week&apos;s topic was <em>Does the speed of your mobile website makes you lose some visitors?</em> (loosely translated from French).</p>
<p>Interesting.</p>
<p>I ran it and... it was bad.</p>
<p><img src="http://shiningpanda.com/content/images/2017-11/test-before.png" alt="Initial test" loading="lazy"></p>
<p>Eleven seconds! Try by yourself on your favorite url <a href="https://testmysite.thinkwithgoogle.com/intl/en-us">here</a>.</p>
<p>A friend of mine based in US told me lately that our website was a little bit slow (our servers are in Paris).</p>
<p>I already started to check <a href="https://aws.amazon.com/cloudfront/?nc1=h_ls">CloudFront</a>. But with eleven seconds, the problem was obviously deeper than the server location.</p>
<p>And so started my optimization journey on a pretty common stack (ours): Nginx &amp; Django.</p>
<h1 id="django">Django</h1>
<p>I started with Django. We had dozens of CSS and JS files, it was time to consolidate them.</p>
<p><a href="https://django-compressor.readthedocs.io/en/latest/">Django Compressor</a> is the way to go.</p>
<p>Edit your <code>settings.py</code> file and modify it as follows after pip installing the <code>django_compressor</code> package:</p>
<pre><code class="language-python">INSTALLED_APPS = [
    # ...
    &apos;compressor&apos;,
    # ...
]
STATICFILES_FINDERS = [
    # ...
    &apos;compressor.finders.CompressorFinder&apos;,
]
</code></pre>
<p>In your templates, group a maximum of CSS links and JavaScript scripts between a minimum number of <code>compress</code> instructions:</p>
<pre><code class="language-html">{% load compress %}
&lt;!-- ... --&gt;
{% compress css %}
&lt;link rel=&quot;stylesheet&quot; href=&quot;{% static &apos;startup/flat-ui/bootstrap/css/bootstrap.css&apos; %}&quot;&gt;
&lt;!-- ... --&gt;
&lt;link rel=&quot;stylesheet&quot; href=&quot;{% static &apos;tomotcha/css/style.css&apos; %}&quot;&gt;
{% endcompress %}
&lt;!-- ... --&gt;
{% compress js %}
&lt;script src=&quot;{% static &apos;tomotcha/js/underscore-min.js&apos; %}&quot;&gt;&lt;/script&gt;
&lt;!-- ... --&gt;
&lt;script src=&quot;{% static &apos;js/angular.min.js&apos; %}&quot;&gt;&lt;/script&gt;
{% endcompress %}
</code></pre>
<p>This will aggregate your various files in a single one, with network gains in perspective.</p>
<p>The icing on the cake: set <code>COMPRESS_OFFLINE = True</code> in <code>settings.py</code> and issue a <code>manage.py compress</code> command to avoid on the fly cache generation and latency for your first visitor.</p>
<h1 id="nginx">Nginx</h1>
<p>You should definitively check that gzip is enabled and actually compress some stuff.</p>
<p>Use Chrome inspection tool and look for the <code>Content-Encoding</code> header in the <code>Response Headers</code>.</p>
<p><img src="http://shiningpanda.com/content/images/2017-11/gzip.png" alt="Check that Gzip is enabled" loading="lazy"></p>
<p>If not, you should have a look at the following settings in your Nginx configuration:</p>
<pre><code class="language-bash">server {
    [...]
    gzip on;
    gzip_comp_level    5;
    gzip_min_length    256;
    gzip_types *;
    [...]
}
</code></pre>
<p>Do not forget to restart it.</p>
<h1 id="stripe">Stripe</h1>
<p>Stripe is our payment provider. Awesome service with a great APIs.</p>
<p>We have very basic needs, so we only use <a href="https://stripe.com/checkout">Stripe Checkout</a>.</p>
<p>On <a href="https://tomotcha.com/">Tomotcha</a> the checkout button is on the home page and its integration was done pretty much like this:</p>
<pre><code class="language-html">&lt;script src=&quot;https://checkout.stripe.com/checkout.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
(function() {
    [...]
    StripeCheckout.configure({
        key: &apos;tomotcha&apos;,
        [...]
    });
})();
&lt;/script&gt;
</code></pre>
<p>Don&apos;t. Look at the <code>Performance</code> tab of Chrome inspection tool. Catastrophic:</p>
<p><img src="http://shiningpanda.com/content/images/2017-11/stripe.png" alt="Stripe performances" loading="lazy"></p>
<p>Instead, call <code>StripeCheckout.configure</code> when your customer actually wants to subscribe.</p>
<p>Its a little longer but a nice wheel make them wait, time to display the form.</p>
<h1 id="resources">Resources</h1>
<p>A vast subject:</p>
<ul>
<li>Do I really need to include my theme&apos;s JS for a fancy carousel that I do not use? No: drop it!</li>
<li>Is my header image small enough? Initially at 225k, optimized for the web it&apos;s now 78k: use the dedicated feature in your favorite image editor.</li>
<li>Check that you include minified (<code>*.min.js</code>) JavaScript files, at least for external dependencies.</li>
<li>...</li>
</ul>
<p>Time to collect. Let&apos;s re-run the benchmark:</p>
<p><img src="http://shiningpanda.com/content/images/2017-11/test-after.png" alt="Final test" loading="lazy"></p>
<p>Better! And now we can start to think about advanced stuff:</p>
<ul>
<li>Server location</li>
<li>Caching</li>
<li>...</li>
</ul>
<p>My conclusion? Coffee is deprecated, upgrade to <a href="https://tomotcha.com/">green tea</a>.</p>
<p>More seriously, it only took me a couple hours to greatly improve our website performance, and it&apos;s definitively worth a shot.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Better emails]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p><a href="http://www.dkim.org/">DomainKeys Identified Mail</a> (DKIM) and <a href="http://www.openspf.org/">Sender Policy Framework</a> (SPF) are now enabled on all <a href="https://requires.io">Requires.io</a> emails to ensure their delivery.</p>
<p>In addition, our email notification system is now registered and compliant with <a href="https://developers.google.com/gmail/markup/">Gmail Email Markup</a> so as to provide an easy access to your project&apos;s page:</p>
<p><img src="http://shiningpanda.com/content/images/2016-01-30/gmail.png" alt="Email markup" loading="lazy"></p>
<p>Hope</p>]]></description><link>http://shiningpanda.com/better-emails/</link><guid isPermaLink="false">637fe19c975135ef2da3c619</guid><category><![CDATA[Requires.io]]></category><dc:creator><![CDATA[Olivier]]></dc:creator><pubDate>Fri, 29 Jan 2016 23:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p><a href="http://www.dkim.org/">DomainKeys Identified Mail</a> (DKIM) and <a href="http://www.openspf.org/">Sender Policy Framework</a> (SPF) are now enabled on all <a href="https://requires.io">Requires.io</a> emails to ensure their delivery.</p>
<p>In addition, our email notification system is now registered and compliant with <a href="https://developers.google.com/gmail/markup/">Gmail Email Markup</a> so as to provide an easy access to your project&apos;s page:</p>
<p><img src="http://shiningpanda.com/content/images/2016-01-30/gmail.png" alt="Email markup" loading="lazy"></p>
<p>Hope you&apos;ll enjoy these improvements!</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Support for pip 8 Hash-Checking Mode]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Since version 8.0 (released a week ago), pip can check downloaded package archives against <a href="https://pip.pypa.io/en/stable/reference/pip_install/#hash-checking-mode">local hashes</a> to protect against remote tampering. To verify a package against one or more hashes, add the hashes at the end of your <code>requirements.txt</code> files:</p>
<pre><code class="language-bash">FooProject==1.2 --hash:sha256=2cf24dba5fb0a30e26e83b2ac5b9e29e \
                --hash:sha256=</code></pre>]]></description><link>http://shiningpanda.com/pip8-hash-checking/</link><guid isPermaLink="false">637fe19c975135ef2da3c618</guid><category><![CDATA[Requires.io]]></category><dc:creator><![CDATA[Olivier]]></dc:creator><pubDate>Tue, 26 Jan 2016 23:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Since version 8.0 (released a week ago), pip can check downloaded package archives against <a href="https://pip.pypa.io/en/stable/reference/pip_install/#hash-checking-mode">local hashes</a> to protect against remote tampering. To verify a package against one or more hashes, add the hashes at the end of your <code>requirements.txt</code> files:</p>
<pre><code class="language-bash">FooProject==1.2 --hash:sha256=2cf24dba5fb0a30e26e83b2ac5b9e29e \
                --hash:sha256=486ea46224d1bb4fb680f34f7c9ad96a
</code></pre>
<p><a href="https://requires.io/">Requires.io</a> is now compatible with this feature, as you can see for instance on this project: <a href="https://requires.io/github/mozilla/kuma/requirements/?branch=master">mozilla/kuma</a>.</p>
<p>A big thank to <a href="https://twitter.com/jezdez/">jezdez</a> for notifying us of this new feature of pip!</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Track your licenses!]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p><a href="https://requires.io/">Requires.io</a> is proud to introduce a new feature: license tracking for your requirements!</p>
<p><img src="http://shiningpanda.com/content/images/2015-08-30/licenses.png" alt="Licenses" loading="lazy"></p>
<p>And if a licence differs between your version of a package and its latest one, you get the information in both <code>Requirement</code> and <code>Latest</code> columns.</p>
<p>We hope you will enjoy this new feature!</p>
<!--kg-card-end: markdown-->]]></description><link>http://shiningpanda.com/licenses/</link><guid isPermaLink="false">637fe19c975135ef2da3c637</guid><category><![CDATA[Requires.io]]></category><dc:creator><![CDATA[Olivier]]></dc:creator><pubDate>Wed, 02 Sep 2015 22:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p><a href="https://requires.io/">Requires.io</a> is proud to introduce a new feature: license tracking for your requirements!</p>
<p><img src="http://shiningpanda.com/content/images/2015-08-30/licenses.png" alt="Licenses" loading="lazy"></p>
<p>And if a licence differs between your version of a package and its latest one, you get the information in both <code>Requirement</code> and <code>Latest</code> columns.</p>
<p>We hope you will enjoy this new feature!</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[ShiningPanda plugin 0.22 is out!]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>We released today a new version of the ShiningPanda plugin for Jenkins. For those who don&apos;t know this plugin yet, it is probably the easiest way to setup your Python projects with Jenkins. But let&apos;s have a look at the new features:</p>
<h1 id="coverage4">Coverage 4</h1>
<p>The <code>Publish</code></p>]]></description><link>http://shiningpanda.com/shiningpanda-plugin-022/</link><guid isPermaLink="false">637fe19c975135ef2da3c640</guid><category><![CDATA[CI]]></category><category><![CDATA[Jenkins]]></category><category><![CDATA[Python]]></category><dc:creator><![CDATA[Olivier]]></dc:creator><pubDate>Fri, 28 Aug 2015 22:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>We released today a new version of the ShiningPanda plugin for Jenkins. For those who don&apos;t know this plugin yet, it is probably the easiest way to setup your Python projects with Jenkins. But let&apos;s have a look at the new features:</p>
<h1 id="coverage4">Coverage 4</h1>
<p>The <code>Publish coverage.py HTML reports</code> publisher is now compatible with <code>coverage&gt;=4</code>.</p>
<h1 id="virtualenv">Virtualenv</h1>
<p>The plugin now bundles the lastest version (<a href="http://pypi.python.org/pypi/virtualenv/13.1.2">13.1.2</a>) of the virtual Python environment builder.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[A new notification system]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>As you may know, <a href="https://requires.io">requires.io</a> is all about being notified of outdated dependencies on PyPI packages.</p>
<p>We just released a new event-driven notification system, rewritten from scratch to bring more flexibility to all requires.io users.</p>
<p>Email and pull-request policies are now configured at the organization level within the</p>]]></description><link>http://shiningpanda.com/new-notifications/</link><guid isPermaLink="false">637fe19c975135ef2da3c62c</guid><category><![CDATA[Requires.io]]></category><dc:creator><![CDATA[Olivier]]></dc:creator><pubDate>Wed, 13 May 2015 22:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>As you may know, <a href="https://requires.io">requires.io</a> is all about being notified of outdated dependencies on PyPI packages.</p>
<p>We just released a new event-driven notification system, rewritten from scratch to bring more flexibility to all requires.io users.</p>
<p>Email and pull-request policies are now configured at the organization level within the <code>Hooks</code> section of your dashboard.</p>
<p><img src="http://shiningpanda.com/content/images/2015-05-14/hooks.png" alt="Hooks" loading="lazy"></p>
<p><code>Email</code> and <code>Pull Request</code> (for GitHub) are available, and <code>Web Hook</code> should be available very soon.</p>
<p><img src="http://shiningpanda.com/content/images/2015-05-14/targets.png" alt="Hook targets" loading="lazy"></p>
<p>You can of course specify some hook specific information like a comma separated list of email addresses.</p>
<p>But you can also fine-tune the targets: repositories, branches, tags or sites. For these fields, use a comma separated list of glob patterns.</p>
<p>Note the special case of the <code>@default</code> branch: this will target <code>master</code>, <code>default</code> or whatever default branch you defined on GitHub or Bitbucket.</p>
<p>This new system is very much event-driven. For each dependency status (up-to-date, outdated, insecure), you can select when to be notified or not.</p>
<p><img src="http://shiningpanda.com/content/images/2015-05-14/triggers.png" alt="Hook triggers" loading="lazy"></p>
<p>In the above example, if your project&apos;s status:</p>
<ul>
<li><strong>is</strong> up-to-date: you <strong>will never</strong> be notified</li>
<li><strong>becomes</strong> outdated: you <strong>will</strong> be notified</li>
<li><strong>stays</strong> outdated: you <strong>will not</strong> be notified</li>
<li><strong>is</strong> insecure: you <strong>will</strong> always be notified (on new package version, on commits modifying <code>requirements.txt</code> etc...)</li>
</ul>
<p>Periodic digests are also available: by opting in you will get a daily, weekly or monthly digest regardless of the project&apos;s status.</p>
<p>A question? Drop us <a href="https://requires.io/contact/">an email</a>!</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[New Logo]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p><a href="https://requires.io/">requires.io</a> has a new logo!</p>
<p><img src="http://shiningpanda.com/content/images/2015-03-03/logo.png" alt="Requires.io new logo." loading="lazy"></p>
<p>This logo was designed with lots of dedication by the very talented Ayaka Yamamoto. She is now designing a new logo for our Japanese tea subscription service: <a href="https://tomotcha.com/">tomotcha.com</a>. The current logo looks like a cup of coffee...</p>
<p>Ayaka is based in Japan, but</p>]]></description><link>http://shiningpanda.com/new-logo/</link><guid isPermaLink="false">637fe19c975135ef2da3c624</guid><category><![CDATA[Requires.io]]></category><dc:creator><![CDATA[Olivier]]></dc:creator><pubDate>Mon, 09 Mar 2015 23:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p><a href="https://requires.io/">requires.io</a> has a new logo!</p>
<p><img src="http://shiningpanda.com/content/images/2015-03-03/logo.png" alt="Requires.io new logo." loading="lazy"></p>
<p>This logo was designed with lots of dedication by the very talented Ayaka Yamamoto. She is now designing a new logo for our Japanese tea subscription service: <a href="https://tomotcha.com/">tomotcha.com</a>. The current logo looks like a cup of coffee...</p>
<p>Ayaka is based in Japan, but speaks very good English (and even quite a bit of French), so do not hesitate to <a href="mailto:ayamamotodesign@gmail.com">contact her</a>, or to check her online <a href="http://www.behance.net/ayamamoto">portfolio</a>.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Steady as She Goes]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Over the last few weeks we&apos;ve released a number of small patches and bugfix improving the overall experience with <a href="https://requires.io/">requires.io</a>, to keep on helping you keep track of Python dependencies.</p>
<h1 id="handlingofprereleases">Handling of prereleases</h1>
<p>To figure out if a package is <code>up-to-date</code>, <a href="https://requires.io/">requires.io</a> was using a very</p>]]></description><link>http://shiningpanda.com/steady-as-she-goes/</link><guid isPermaLink="false">637fe19c975135ef2da3c63c</guid><category><![CDATA[Requires.io]]></category><dc:creator><![CDATA[Olivier]]></dc:creator><pubDate>Mon, 16 Feb 2015 23:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Over the last few weeks we&apos;ve released a number of small patches and bugfix improving the overall experience with <a href="https://requires.io/">requires.io</a>, to keep on helping you keep track of Python dependencies.</p>
<h1 id="handlingofprereleases">Handling of prereleases</h1>
<p>To figure out if a package is <code>up-to-date</code>, <a href="https://requires.io/">requires.io</a> was using a very simple strategy: take the latest [1] version available on <a href="https://pypi.python.org/pypi">pypi</a>, and match it against the requirement. If it matched, the requirement was <code>up-to-date</code>, otherwise it was <code>outdated</code>.</p>
<p>This strategy falls short for two edge cases: prereleases and private forks.</p>
<pre><code class="language-python">requests==dev    # Master fetched from GitHub
django==1.7.4.1  # A private fork of Django
</code></pre>
<p>These edge cases are now correctly handled, and such dependencies are simply flagged <code>up-to-date</code>.</p>
<p>[1] It was (and still is) a tad more complicated as we distinguish between unstable and stable releases, but this is beyond the scope of this blog post.</p>
<h1 id="compatiblerequirementsandpullrequests">Compatible requirements and pull-requests</h1>
<p>A lot of projects on GitHub are using <a href="https://requires.io/">requires.io</a> pull-requests. But until now we didn&apos;t handle &quot;compatible&quot; requirements correctly.</p>
<pre><code class="language-python">django&gt;=1.6,&lt;1.7
</code></pre>
<p>Such a requirement is now updated to:</p>
<pre><code class="language-python">django&gt;=1.7,&lt;1.8
</code></pre>
<p>Don&apos;t forget that you can specify <a href="https://requires.io/features/">directives</a> in your requirements files to discard updates you don&apos;t need. For instance the following requirement would be flagged <code>up-to-date</code> and not yield any pull-request, despite being `outdated`:</p>
<pre><code class="language-python"># Outdated bug flagged `up-to-date`
django&gt;=1.6,&lt;1.7  # rq.filter:&lt;1.7
</code></pre>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Switching to Flat Badges]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p><a href="https://requires.io/">Requires.io</a> uses badges generated by <a href="http://shields.io/">shields.io</a>. Today (February 1st, 2015) shields.io is switching its default badges to a sleek, flat design. The rational is that it will be a better <a href="https://github.com/badges/shields/issues/185#issuecomment-65898604">match</a> for GitHub overall design.</p>
<p>For consistency purpose, we have decided to make the switch:</p>
<p><svg xmlns="http://www.w3.org/2000/svg" width="156" height="20"><lineargradient id="a" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></lineargradient><rect rx="3" width="156" height="20" fill="#555"/><rect rx="3" x="86" width="70" height="20" fill="#4c1"/><path fill="#4c1" d="M86 0h4v20h-4z"/><rect rx="3" width="156" height="20" fill="url(#a)"/><g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11"><text x="44" y="15" fill="#010101" fill-opacity=".3">requirements</text><text x="44" y="14">requirements</text></g></svg></p>]]></description><link>http://shiningpanda.com/switching-to-flat-badges/</link><guid isPermaLink="false">637fe19c975135ef2da3c646</guid><category><![CDATA[Requires.io]]></category><dc:creator><![CDATA[Olivier]]></dc:creator><pubDate>Sat, 31 Jan 2015 23:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p><a href="https://requires.io/">Requires.io</a> uses badges generated by <a href="http://shields.io/">shields.io</a>. Today (February 1st, 2015) shields.io is switching its default badges to a sleek, flat design. The rational is that it will be a better <a href="https://github.com/badges/shields/issues/185#issuecomment-65898604">match</a> for GitHub overall design.</p>
<p>For consistency purpose, we have decided to make the switch:</p>
<p><svg xmlns="http://www.w3.org/2000/svg" width="156" height="20"><lineargradient id="a" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></lineargradient><rect rx="3" width="156" height="20" fill="#555"/><rect rx="3" x="86" width="70" height="20" fill="#4c1"/><path fill="#4c1" d="M86 0h4v20h-4z"/><rect rx="3" width="156" height="20" fill="url(#a)"/><g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11"><text x="44" y="15" fill="#010101" fill-opacity=".3">requirements</text><text x="44" y="14">requirements</text><text x="120" y="15" fill="#010101" fill-opacity=".3">up-to-date</text><text x="120" y="14">up-to-date</text></g></svg></p>
<p><svg xmlns="http://www.w3.org/2000/svg" width="146" height="20"><lineargradient id="a" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></lineargradient><rect rx="3" width="146" height="20" fill="#555"/><rect rx="3" x="86" width="60" height="20" fill="#dfb317"/><path fill="#dfb317" d="M86 0h4v20h-4z"/><rect rx="3" width="146" height="20" fill="url(#a)"/><g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11"><text x="44" y="15" fill="#010101" fill-opacity=".3">requirements</text><text x="44" y="14">requirements</text><text x="115" y="15" fill="#010101" fill-opacity=".3">outdated</text><text x="115" y="14">outdated</text></g></svg></p>
<p><svg xmlns="http://www.w3.org/2000/svg" width="144" height="20"><lineargradient id="a" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></lineargradient><rect rx="3" width="144" height="20" fill="#555"/><rect rx="3" x="86" width="58" height="20" fill="#e05d44"/><path fill="#e05d44" d="M86 0h4v20h-4z"/><rect rx="3" width="144" height="20" fill="url(#a)"/><g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11"><text x="44" y="15" fill="#010101" fill-opacity=".3">requirements</text><text x="44" y="14">requirements</text><text x="114" y="15" fill="#010101" fill-opacity=".3">insecure</text><text x="114" y="14">insecure</text></g></svg></p>
<p>You can of course still use the former style (called &quot;plastic&quot;) by appending a GET parameter to badges requests, like this: <code>&amp;style=plastic</code>.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[And the winner is...]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>As you may know, <a href="https://requires.io">requires.io</a> is all about being notified of outdated dependencies on PyPI packages.</p>
<p>Therefore we are a privileged observer of the Python community, and it was high time we release some data!</p>
<p>We&apos;ll share some more in the upcoming weeks, but let&apos;s</p>]]></description><link>http://shiningpanda.com/statistics-1/</link><guid isPermaLink="false">637fe19c975135ef2da3c62b</guid><category><![CDATA[Requires.io]]></category><dc:creator><![CDATA[Olivier]]></dc:creator><pubDate>Mon, 26 Jan 2015 23:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>As you may know, <a href="https://requires.io">requires.io</a> is all about being notified of outdated dependencies on PyPI packages.</p>
<p>Therefore we are a privileged observer of the Python community, and it was high time we release some data!</p>
<p>We&apos;ll share some more in the upcoming weeks, but let&apos;s start with the most popular packages expressed as the percentage of repositories (followed by requires.io) that depends on them:</p>
<p><img src="http://shiningpanda.com/content/images/2015-01-24/statistics.png" alt="Statistics" loading="lazy"></p>
<p>The result will not come as a surprise: <a href="https://www.djangoproject.com/">Django</a> is number one with almost 33% of the projects depending on it. We were also quite happy to notice that quality related tools (like coverage, mock, flake8, etc.) rank quite high on the list, evidence that the Python community cares a lot about code quality!</p>
<p>To package maintainers: not on the list? Send us an <a href="https://requires.io/contact/">email</a> and we&apos;ll share figures with you.</p>
<p>Stay tuned!</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Production Server Monitoring]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Today <a href="https://requires.io/">requires.io</a> introduces Site Monitoring, a security feature to check that the dependencies of the Python apps deployed on your production servers are up-to-date and secure.</p>
<p>Requires.io can already monitor the requirements of your projects from their source code. We expanded the API so that by adding two</p>]]></description><link>http://shiningpanda.com/site-monitoring/</link><guid isPermaLink="false">637fe19c975135ef2da3c620</guid><category><![CDATA[Requires.io]]></category><dc:creator><![CDATA[Olivier]]></dc:creator><pubDate>Wed, 19 Nov 2014 23:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Today <a href="https://requires.io/">requires.io</a> introduces Site Monitoring, a security feature to check that the dependencies of the Python apps deployed on your production servers are up-to-date and secure.</p>
<p>Requires.io can already monitor the requirements of your projects from their source code. We expanded the API so that by adding two lines to your deployment scripts you can now check that your production apps are secure:</p>
<pre><code class="language-bash">$ pip install -U requires.io
$ requires.io update-site -t $MY_SECRET_TOKEN -r $MY_REPO
</code></pre>
<h1 id="stepbysteptutorial">Step-by-step Tutorial</h1>
<p>In this small tutorial we will setup Site Monitoring for the project <code>requires/myapp</code>. This tutorial assumes that you already have an account on <a href="https://requires.io/">requires.io</a>... If you don&apos;t, just register!</p>
<h2 id="1planupgrade">1. Plan upgrade</h2>
<p>First ensure that your plan support the Site Monitoring feature. This can be done from the <a href="https://requires.io/settings/repositories/">settings</a> page. In this case I need an Indie+ account.</p>
<p><img src="http://shiningpanda.com/content/images/2014-11-19/plans.png" alt="Plan upgrade" loading="lazy"></p>
<h2 id="2upgradeyourdeploymentscript">2. Upgrade your deployment script</h2>
<p>Go to the &quot;monitoring&quot; section of your settings. There you can just copy the necessary line. In this case it is:</p>
<pre><code class="language-bash">requires.io update-site -t 6ade5eb345d8a79ad69a9f868021e0210522aceb -r REPO
</code></pre>
<p>The token is valid for the account requires, so for the project <code>requires/myapp</code> we just need to replace REPO by <code>myapp</code>.</p>
<pre><code class="language-bash">requires.io update-site -t 62717a87341c8500d316bf52635a9e40ced04ace -r myapp
</code></pre>
<p><img src="http://shiningpanda.com/content/images/2014-11-19/monitoring.png" alt="Monitoring" loading="lazy"></p>
<p>For an app deployed with a simple fabric script (using fabtools to handle the virtualenv), the resulting script would look similar to this:</p>
<pre><code class="language-python">with fabtools.python.virtualenv(virtualenv):
    run(&apos;pip install -r requirements.txt&apos;)
    run(&apos;pip install requires.io&apos;)
    run(&apos;requires.io update-site -t 6ade5eb345d8a79ad69a9f868021e0210522aceb -r myapp&apos;)
</code></pre>
<p>Adapt for your own deployment scripts!</p>
<h2 id="4checktheresult">4. Check the result</h2>
<p>Just go to your requirements page on requires.io: you will see a new section called &quot;Sites&quot; in the right column.</p>
<p><img src="http://shiningpanda.com/content/images/2014-11-19/sites.png" alt="Sites" loading="lazy"></p>
<h1 id="notifications">Notifications</h1>
<p>Notifications for the Site Monitoring feature are coming very soon... <a href="https://requires.io/">Requires.io</a> notification system is being thoroughly updated, but it is not quite ready yet.</p>
<h1 id="heroku">Heroku</h1>
<p>We are currently testing the requires.io Heroku app. So if you want to hook <a href="https://requires.io/">requires.io</a> to your heroku account to use the Site Monitoring feature, let us know!</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Svg Badges]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p><a href="https://requires.io/">Requires.io</a> introduces new beautiful badges, generated thanks to <a href="http://shields.io/">Shields.io</a>:</p>
<p><svg xmlns="http://www.w3.org/2000/svg" width="156" height="18"><lineargradient id="a" x2="0" y2="100%"><stop offset="0" stop-color="#fff" stop-opacity=".7"/><stop offset=".1" stop-color="#aaa" stop-opacity=".1"/><stop offset=".9" stop-opacity=".3"/><stop offset="1" stop-opacity=".5"/></lineargradient><rect rx="4" width="156" height="18" fill="#555"/><rect rx="4" x="86" width="70" height="18" fill="#4c1"/><path fill="#4c1" d="M86 0h4v18h-4z"/><rect rx="4" width="156" height="18" fill="url(#a)"/><g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11"><text x="44" y="14" fill="#010101" fill-opacity=".3">requirements</text><text x="44" y="13">requirements</text><text x="120" y="14" fill="#010101" fill-opacity=".3">up-to-date</text><text x="120" y="13">up-to-date</text></g></svg></p>
<p><svg xmlns="http://www.w3.org/2000/svg" width="146" height="18"><lineargradient id="a" x2="0" y2="100%"><stop offset="0" stop-color="#fff" stop-opacity=".7"/><stop offset=".1" stop-color="#aaa" stop-opacity=".1"/><stop offset=".9" stop-opacity=".3"/><stop offset="1" stop-opacity=".5"/></lineargradient><rect rx="4" width="146" height="18" fill="#555"/><rect rx="4" x="86" width="60" height="18" fill="#dfb317"/><path fill="#dfb317" d="M86 0h4v18h-4z"/><rect rx="4" width="146" height="18" fill="url(#a)"/><g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11"><text x="44" y="14" fill="#010101" fill-opacity=".3">requirements</text><text x="44" y="13">requirements</text><text x="115" y="14" fill="#010101" fill-opacity=".3">outdated</text><text x="115" y="13">outdated</text></g></svg></p>
<p><svg xmlns="http://www.w3.org/2000/svg" width="144" height="18"><lineargradient id="a" x2="0" y2="100%"><stop offset="0" stop-color="#fff" stop-opacity=".7"/><stop offset=".1" stop-color="#aaa" stop-opacity=".1"/><stop offset=".9" stop-opacity=".3"/><stop offset="1" stop-opacity=".5"/></lineargradient><rect rx="4" width="144" height="18" fill="#555"/><rect rx="4" x="86" width="58" height="18" fill="#e05d44"/><path fill="#e05d44" d="M86 0h4v18h-4z"/><rect rx="4" width="144" height="18" fill="url(#a)"/><g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11"><text x="44" y="14" fill="#010101" fill-opacity=".3">requirements</text><text x="44" y="13">requirements</text><text x="114" y="14" fill="#010101" fill-opacity=".3">insecure</text><text x="114" y="13">insecure</text></g></svg></p>
<p>To switch to the new svg badges just replace <code>.svg</code> by <code>.png</code> in your badge urls.</p>
<p>PS: We are looking for testers to tryout our new Heroku</p>]]></description><link>http://shiningpanda.com/svg-badges/</link><guid isPermaLink="false">637fe19c975135ef2da3c632</guid><category><![CDATA[Requires.io]]></category><dc:creator><![CDATA[Olivier]]></dc:creator><pubDate>Tue, 23 Sep 2014 22:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p><a href="https://requires.io/">Requires.io</a> introduces new beautiful badges, generated thanks to <a href="http://shields.io/">Shields.io</a>:</p>
<p><svg xmlns="http://www.w3.org/2000/svg" width="156" height="18"><lineargradient id="a" x2="0" y2="100%"><stop offset="0" stop-color="#fff" stop-opacity=".7"/><stop offset=".1" stop-color="#aaa" stop-opacity=".1"/><stop offset=".9" stop-opacity=".3"/><stop offset="1" stop-opacity=".5"/></lineargradient><rect rx="4" width="156" height="18" fill="#555"/><rect rx="4" x="86" width="70" height="18" fill="#4c1"/><path fill="#4c1" d="M86 0h4v18h-4z"/><rect rx="4" width="156" height="18" fill="url(#a)"/><g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11"><text x="44" y="14" fill="#010101" fill-opacity=".3">requirements</text><text x="44" y="13">requirements</text><text x="120" y="14" fill="#010101" fill-opacity=".3">up-to-date</text><text x="120" y="13">up-to-date</text></g></svg></p>
<p><svg xmlns="http://www.w3.org/2000/svg" width="146" height="18"><lineargradient id="a" x2="0" y2="100%"><stop offset="0" stop-color="#fff" stop-opacity=".7"/><stop offset=".1" stop-color="#aaa" stop-opacity=".1"/><stop offset=".9" stop-opacity=".3"/><stop offset="1" stop-opacity=".5"/></lineargradient><rect rx="4" width="146" height="18" fill="#555"/><rect rx="4" x="86" width="60" height="18" fill="#dfb317"/><path fill="#dfb317" d="M86 0h4v18h-4z"/><rect rx="4" width="146" height="18" fill="url(#a)"/><g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11"><text x="44" y="14" fill="#010101" fill-opacity=".3">requirements</text><text x="44" y="13">requirements</text><text x="115" y="14" fill="#010101" fill-opacity=".3">outdated</text><text x="115" y="13">outdated</text></g></svg></p>
<p><svg xmlns="http://www.w3.org/2000/svg" width="144" height="18"><lineargradient id="a" x2="0" y2="100%"><stop offset="0" stop-color="#fff" stop-opacity=".7"/><stop offset=".1" stop-color="#aaa" stop-opacity=".1"/><stop offset=".9" stop-opacity=".3"/><stop offset="1" stop-opacity=".5"/></lineargradient><rect rx="4" width="144" height="18" fill="#555"/><rect rx="4" x="86" width="58" height="18" fill="#e05d44"/><path fill="#e05d44" d="M86 0h4v18h-4z"/><rect rx="4" width="144" height="18" fill="url(#a)"/><g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11"><text x="44" y="14" fill="#010101" fill-opacity=".3">requirements</text><text x="44" y="13">requirements</text><text x="114" y="14" fill="#010101" fill-opacity=".3">insecure</text><text x="114" y="13">insecure</text></g></svg></p>
<p>To switch to the new svg badges just replace <code>.svg</code> by <code>.png</code> in your badge urls.</p>
<p>PS: We are looking for testers to tryout our new Heroku app. If you want to get notified when a requirement on your production system is compromised, drop us an email at <a href="mailto:info@requires.io">info@requires.io</a>.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[An API to track your requirements]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p><a href="https://requires.io/">Requires.io</a> helps you keep track of the requirements of your Python projects.</p>
<p>Today we are introducing an API to push your dependency files.</p>
<p>It&apos;s very simple to use, and this is definitively the way to go if you are not using GitHub or Bitbucket.</p>
<p>Get started in</p>]]></description><link>http://shiningpanda.com/api/</link><guid isPermaLink="false">637fe19c975135ef2da3c64c</guid><category><![CDATA[Requires.io]]></category><dc:creator><![CDATA[Olivier]]></dc:creator><pubDate>Tue, 29 Jul 2014 22:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p><a href="https://requires.io/">Requires.io</a> helps you keep track of the requirements of your Python projects.</p>
<p>Today we are introducing an API to push your dependency files.</p>
<p>It&apos;s very simple to use, and this is definitively the way to go if you are not using GitHub or Bitbucket.</p>
<p>Get started in 4 steps:</p>
<ol>
<li><a href="https://requires.io/signup/">Sign Up</a> for an API account</li>
<li>Get your API token</li>
<li>Install the <a href="https://pypi.python.org/pypi/requires.io/">requires.io</a> package from PyPI</li>
<li>Call <code>requires.io</code> on the command line</li>
</ol>
<p>Typical use case in a build or deployment script would be like:</p>
<pre><code class="language-bash">$ pip install -U requires.io
$ requires.io -a $API_TOKEN -r $REPO_NAME /path/to/my/repo
</code></pre>
<p>On the pricing side:</p>
<ul>
<li>$0 per month with unlimited public repositories for open source projects</li>
<li>$15 per month for unlimited private repositories with our <em>Enterprise</em> plan</li>
</ul>
<p>So <a href="https://requires.io/signup/">register now</a>!</p>
<!--kg-card-end: markdown-->]]></content:encoded></item></channel></rss>