blog.notmyidea.org/cheese-code-wrap-up.html
2019-11-20 13:56:59 +01:00

261 lines
No EOL
20 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1">
<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
<title>Cheese & code - Wrap-up - Alexis - Carnets en ligne</title>
<meta charset="utf-8" />
<link href="https://blog.notmyidea.org/feeds/all.atom.xml" type="application/atom+xml" rel="alternate" title="Alexis - Carnets en ligne Full Atom Feed" />
<link rel="stylesheet" href="https://blog.notmyidea.org/theme/css/poole.css"/>
<link rel="stylesheet" href="https://blog.notmyidea.org/theme/css/syntax.css"/>
<link rel="stylesheet" href="https://blog.notmyidea.org/theme/css/lanyon.css"/>
<link rel="stylesheet" href="//fonts.googleapis.com/css?family=PT+Serif:400,400italic,700%7CPT+Sans:400">
<link rel="stylesheet" href="https://blog.notmyidea.org/theme/css/styles.css"/>
<style>
h1 {
font-family: "Avant Garde", Avantgarde, "Century Gothic", CenturyGothic, "AppleGothic", sans-serif;
padding: 80px 50px;
text-align: center;
text-transform: uppercase;
text-rendering: optimizeLegibility;
color: #202020;
letter-spacing: .1em;
text-shadow:
-1px -1px 1px #111,
2px 2px 1px #eaeaea;
}
#main {
text-align: justify;
text-justify: inter-word;
}
#main h1 {
padding: 10px;
}
.post-headline {
padding: 15px;
text-align: center;
}
</style>
</head>
<body>
<!-- Target for toggling the sidebar `.sidebar-checkbox` is for regular
styles, `#sidebar-checkbox` for behavior. -->
<input type="checkbox" class="sidebar-checkbox" id="sidebar-checkbox">
<!-- Toggleable sidebar -->
<div class="sidebar" id="sidebar">
<div class="sidebar-item">
<div class="profile">
<img src="https://blog.notmyidea.org/theme/img/profile.png"/>
</div>
</div>
<nav class="sidebar-nav">
<a class="sidebar-nav-item" href="/">Articles</a>
<a class="sidebar-nav-item" href="https://www.vieuxsinge.com">Brasserie du Vieux Singe</a>
<a class="sidebar-nav-item" href="http://blog.notmyidea.org/pages/about.html">A propos</a>
<a class="sidebar-nav-item" href="https://twitter.com/ametaireau">Messages courts</a>
<a class="sidebar-nav-item" href="https://github.com/almet">Code</a>
</nav>
</div> <div class="wrap">
<div class="masthead">
<div class="container">
<h3 class="masthead-title">
<a href="https://blog.notmyidea.org/" title="Home">Alexis - Carnets en ligne</a>
</h3>
</div>
</div>
<div class="container content">
<div id="main" class="posts">
<h1 class="post-title">Cheese & code - Wrap-up</h1>
<span class="post-date">
22 octobre 2012, dans <a class="no-color" href="category/technologie.html">Technologie</a>
</span>
<img id="illustration" class="illustration-Technologie" src="" />
<div class="post article">
<h1>🌟</h1>
<h1 id="cheese-code-wrap-up">Cheese &amp; code - Wrap-up</h1>
<p>This week-end I hosted a <em>cheese &amp; code</em> session in the country-side of
Angers, France.</p>
<p>We were a bunch of python hackers and it rained a lot, wich forced us to
stay inside and to code. Bad.</p>
<p>We were not enough to get rid of all the cheese and the awesome meals,
but well, we finally managed it pretty well.</p>
<p>Here is a summary of what we worked on:</p>
<h2 id="daybed">Daybed</h2>
<p>Daybed started some time ago, and intend to be a replacement to google
forms, in term of features, but backed as a REST web service, in python,
and open source.</p>
<p>In case you wonder, daybed is effectively the name of a couch. We chose
this name because of the similarities (in the sound) with <strong>db</strong>, and
because we're using <strong>CouchDB</strong> as a backend.</p>
<p><img alt="Daybed is a big couch!" src="images/daybed.jpg"></p>
<p>We mainly hacked on daybed and are pretty close to the release of the
first version, meaning that we have something working.</p>
<p><a href="http://github.com/spiral-project/daybed">The code</a> is available on
github, and we also wrote <a href="http://daybed.rtfd.org">a small
documentation</a> for it.</p>
<p>Mainly, we did a lot of cleanup, rewrote a bunch of tests so that it
would be easier to continue to work on the project, and implemented some
minor features. I'm pretty confidend that we now have really good basis
for this project.</p>
<p>Also, we will have a nice todolist application, with the backend <strong>and</strong>
the frontend, in javascript / html / css, you'll know more when it'll be
ready :-)</p>
<p>Once we have something good enough, we'll release the first version and
I'll host it somewhere so that people can play with it.</p>
<h2 id="cornice">Cornice</h2>
<p>Daybed is built on top of <a href="http://cornice.rtfd.org">Cornice</a>, a
framework to ease the creation of web-services.</p>
<p>At Pycon France, we had the opportunity to attend a good presentation
about <a href="https://github.com/SPORE/specifications">SPORE</a>. SPORE is a way
to describe your REST web services, as WSDL is for WS-* services. This
allows to ease the creation of generic SPORE clients, which are able to
consume any REST API with a SPORE endpoint.</p>
<p>Here is how you can let cornice describe your web service for you</p>
<p>``` sourceCode python
from cornice.ext.spore import generate_spore_description
from cornice.service import Service, get_services</p>
<p>spore = Service('spore', path='/spore', renderer='jsonp')
@spore.get
def get_spore(request):
services = get_services()
return generate_spore_description(services, 'Service name',
request.application_url, '1.0')</p>
<div class="highlight"><pre><span></span><span class="nv">And</span> <span class="nv">you</span><span class="s1">&#39;</span><span class="s">ll get a definition of your service, in SPORE, available at</span>
<span class="o">/</span><span class="nv">spore</span>.
<span class="nv">Of</span> <span class="nv">course</span>, <span class="nv">you</span> <span class="nv">can</span> <span class="nv">use</span> <span class="nv">it</span> <span class="nv">to</span> <span class="k">do</span> <span class="nv">other</span> <span class="nv">things</span>, <span class="nv">like</span> <span class="nv">generating</span> <span class="nv">the</span> <span class="nv">file</span>
<span class="nv">locally</span> <span class="nv">and</span> <span class="nv">exporting</span> <span class="nv">it</span> <span class="nv">wherever</span> <span class="nv">it</span> <span class="nv">makes</span> <span class="nv">sense</span> <span class="nv">to</span> <span class="nv">you</span>, <span class="nv">etc</span>.
<span class="nv">I</span> <span class="nv">released</span> <span class="nv">today</span> [<span class="nv">Cornice</span> <span class="mi">0</span>.<span class="mi">11</span>]<span class="ss">(</span><span class="nv">http</span>:<span class="o">//</span><span class="nv">crate</span>.<span class="nv">io</span><span class="o">/</span><span class="nv">packages</span><span class="o">/</span><span class="nv">cornice</span><span class="o">/</span><span class="ss">)</span>,
<span class="nv">which</span> <span class="nv">adds</span> <span class="nv">into</span> <span class="nv">other</span> <span class="nv">things</span> <span class="nv">the</span> <span class="nv">support</span> <span class="k">for</span> <span class="nv">SPORE</span>, <span class="nv">plus</span> <span class="nv">some</span> <span class="nv">other</span>
<span class="nv">fixes</span> <span class="nv">we</span> <span class="nv">found</span> <span class="nv">on</span> <span class="nv">our</span> <span class="nv">way</span>.
## <span class="nv">Respire</span>
<span class="nv">Once</span> <span class="nv">you</span> <span class="nv">have</span> <span class="nv">the</span> <span class="nv">description</span> <span class="nv">of</span> <span class="nv">the</span> <span class="nv">service</span>, <span class="nv">you</span> <span class="nv">can</span> <span class="k">do</span> <span class="nv">generic</span> <span class="nv">clients</span>
<span class="nv">consuming</span> <span class="nv">them</span>\<span class="o">!</span>
<span class="nv">We</span> <span class="nv">first</span> <span class="nv">wanted</span> <span class="nv">to</span> <span class="nv">contribute</span> <span class="nv">to</span> [<span class="nv">spyre</span>]<span class="ss">(</span><span class="nv">https</span>:<span class="o">//</span><span class="nv">github</span>.<span class="nv">com</span><span class="o">/</span><span class="nv">bl0b</span><span class="o">/</span><span class="nv">spyre</span><span class="ss">)</span>
<span class="nv">but</span> <span class="nv">it</span> <span class="nv">was</span> <span class="nv">written</span> <span class="nv">in</span> <span class="nv">a</span> <span class="nv">way</span> <span class="nv">that</span> <span class="nv">wasn</span><span class="s1">&#39;</span><span class="s">t supporting to POST data, and</span>
<span class="nv">they</span> <span class="nv">were</span> <span class="nv">using</span> <span class="nv">their</span> <span class="nv">own</span> <span class="nv">stack</span> <span class="nv">to</span> <span class="nv">handle</span> <span class="nv">HTTP</span>. <span class="nv">A</span> <span class="nv">lot</span> <span class="nv">of</span> <span class="nv">code</span> <span class="nv">that</span>
<span class="nv">already</span> <span class="nv">exists</span> <span class="nv">in</span> <span class="nv">other</span> <span class="nv">libraries</span>.
<span class="k">While</span> <span class="nv">waiting</span> <span class="nv">the</span> <span class="nv">train</span> <span class="nv">with</span> [<span class="nv">R</span>é<span class="nv">my</span>]<span class="ss">(</span><span class="nv">http</span>:<span class="o">//</span><span class="nv">natim</span>.<span class="nv">ionyse</span>.<span class="nv">com</span><span class="o">/</span><span class="ss">)</span>, <span class="nv">we</span> <span class="nv">hacked</span>
<span class="nv">something</span> <span class="nv">together</span>, <span class="nv">named</span> <span class="s2">&quot;</span><span class="s">Respire</span><span class="s2">&quot;</span>, <span class="nv">a</span> <span class="nv">thin</span> <span class="nv">layer</span> <span class="nv">on</span> <span class="nv">top</span> <span class="nv">of</span> <span class="nv">the</span> <span class="nv">awesome</span>
[<span class="nv">Requests</span>]<span class="ss">(</span><span class="nv">http</span>:<span class="o">//</span><span class="nv">python</span><span class="o">-</span><span class="nv">requests</span>.<span class="nv">org</span><span class="ss">)</span> <span class="nv">library</span>.
<span class="nv">We</span> <span class="nv">have</span> <span class="nv">a</span> <span class="nv">first</span> <span class="nv">version</span>, <span class="nv">feel</span> <span class="nv">free</span> <span class="nv">to</span> <span class="nv">have</span> <span class="nv">a</span> <span class="nv">look</span> <span class="nv">at</span> <span class="nv">it</span> <span class="nv">and</span> <span class="nv">provide</span>
<span class="nv">enhancements</span> <span class="k">if</span> <span class="nv">you</span> <span class="nv">feel</span> <span class="nv">like</span> <span class="nv">it</span>. <span class="nv">We</span><span class="s1">&#39;</span><span class="s">re still hacking on it so it may</span>
<span class="k">break</span> <span class="ss">(</span><span class="k">for</span> <span class="nv">the</span> <span class="nv">better</span><span class="ss">)</span>, <span class="nv">but</span> <span class="nv">that</span> <span class="nv">had</span> <span class="nv">been</span> <span class="nv">working</span> <span class="nv">pretty</span> <span class="nv">well</span> <span class="k">for</span> <span class="nv">us</span> <span class="nv">so</span>
<span class="nv">far</span>.
<span class="nv">You</span> <span class="nv">can</span> [<span class="nv">find</span> <span class="nv">the</span> <span class="nv">project</span> <span class="nv">on</span>
<span class="nv">github</span>]<span class="ss">(</span><span class="nv">http</span>:<span class="o">//</span><span class="nv">github</span>.<span class="nv">com</span><span class="o">/</span><span class="nv">spiral</span><span class="o">-</span><span class="nv">project</span><span class="o">/</span><span class="nv">respire</span><span class="ss">)</span>, <span class="nv">but</span> <span class="nv">here</span> <span class="nv">is</span> <span class="nv">how</span> <span class="nv">to</span>
<span class="nv">use</span> <span class="nv">it</span>, <span class="nv">really</span> <span class="nv">quickly</span> <span class="ss">(</span><span class="nv">these</span> <span class="nv">examples</span> <span class="nv">are</span> <span class="nv">how</span> <span class="nv">to</span> <span class="nv">interact</span> <span class="nv">with</span> <span class="nv">daybed</span><span class="ss">)</span>
``` <span class="nv">sourceCode</span> <span class="nv">python</span>
<span class="o">&gt;&gt;&gt;</span> <span class="nv">from</span> <span class="nv">respire</span> <span class="nv">import</span> <span class="nv">client_from_url</span>
<span class="o">&gt;&gt;&gt;</span> # <span class="nv">create</span> <span class="nv">the</span> <span class="nv">client</span> <span class="nv">from</span> <span class="nv">the</span> <span class="nv">SPORE</span> <span class="nv">definition</span>
<span class="o">&gt;&gt;&gt;</span> <span class="nv">cl</span> <span class="o">=</span> <span class="nv">client_from_url</span><span class="ss">(</span><span class="s1">&#39;</span><span class="s">http://localhost:8000/spore</span><span class="s1">&#39;</span><span class="ss">)</span>
<span class="o">&gt;&gt;&gt;</span> # <span class="nv">in</span> <span class="nv">daybed</span>, <span class="nv">create</span> <span class="nv">a</span> <span class="nv">new</span> <span class="nv">definition</span>
<span class="o">&gt;&gt;&gt;</span> <span class="nv">todo_def</span> <span class="o">=</span> {
... <span class="s2">&quot;</span><span class="s">title</span><span class="s2">&quot;</span>: <span class="s2">&quot;</span><span class="s">todo</span><span class="s2">&quot;</span>,
... <span class="s2">&quot;</span><span class="s">description</span><span class="s2">&quot;</span>: <span class="s2">&quot;</span><span class="s">A list of my stuff to do</span><span class="s2">&quot;</span>,
... <span class="s2">&quot;</span><span class="s">fields</span><span class="s2">&quot;</span>: [
... {
... <span class="s2">&quot;</span><span class="s">name</span><span class="s2">&quot;</span>: <span class="s2">&quot;</span><span class="s">item</span><span class="s2">&quot;</span>,
... <span class="s2">&quot;</span><span class="s">type</span><span class="s2">&quot;</span>: <span class="s2">&quot;</span><span class="s">string</span><span class="s2">&quot;</span>,
... <span class="s2">&quot;</span><span class="s">description</span><span class="s2">&quot;</span>: <span class="s2">&quot;</span><span class="s">The item</span><span class="s2">&quot;</span>
... },
... {
... <span class="s2">&quot;</span><span class="s">name</span><span class="s2">&quot;</span>: <span class="s2">&quot;</span><span class="s">status</span><span class="s2">&quot;</span>,
... <span class="s2">&quot;</span><span class="s">type</span><span class="s2">&quot;</span>: <span class="s2">&quot;</span><span class="s">enum</span><span class="s2">&quot;</span>,
... <span class="s2">&quot;</span><span class="s">choices</span><span class="s2">&quot;</span>: [
... <span class="s2">&quot;</span><span class="s">done</span><span class="s2">&quot;</span>,
... <span class="s2">&quot;</span><span class="s">todo</span><span class="s2">&quot;</span>
... ],
... <span class="s2">&quot;</span><span class="s">description</span><span class="s2">&quot;</span>: <span class="s2">&quot;</span><span class="s">is it done or not</span><span class="s2">&quot;</span>
... }
... ]}
<span class="o">&gt;&gt;&gt;</span> <span class="nv">cl</span>.<span class="nv">put_definition</span><span class="ss">(</span><span class="nv">model_name</span><span class="o">=</span><span class="s1">&#39;</span><span class="s">todo</span><span class="s1">&#39;</span>, <span class="nv">data</span><span class="o">=</span><span class="nv">todo_def</span><span class="ss">)</span>
<span class="o">&gt;&gt;&gt;</span> <span class="nv">cl</span>.<span class="nv">post_data</span><span class="ss">(</span><span class="nv">model_name</span><span class="o">=</span><span class="s1">&#39;</span><span class="s">todo</span><span class="s1">&#39;</span>, <span class="nv">data</span><span class="o">=</span><span class="nv">dict</span><span class="ss">(</span><span class="nv">item</span><span class="o">=</span><span class="s1">&#39;</span><span class="s">make it work</span><span class="s1">&#39;</span>, <span class="nv">status</span><span class="o">=</span><span class="s1">&#39;</span><span class="s">todo</span><span class="s1">&#39;</span><span class="ss">))</span>
{<span class="nv">u</span><span class="s1">&#39;</span><span class="s">id</span><span class="s1">&#39;</span>: <span class="nv">u</span><span class="s1">&#39;</span><span class="s">9f2c90c0529a442cfdc03c191b022cf7</span><span class="s1">&#39;</span>}
<span class="o">&gt;&gt;&gt;</span> <span class="nv">cl</span>.<span class="nv">get_data</span><span class="ss">(</span><span class="nv">model_name</span><span class="o">=</span><span class="s1">&#39;</span><span class="s">todo</span><span class="s1">&#39;</span><span class="ss">)</span>
</pre></div>
<p>Finally, we were out of cheese so everyone headed back to their
respective houses and cities.</p>
<p>Until next time?</p>
</div>
</div>
</div>
<label for="sidebar-checkbox" class="sidebar-toggle"></label>
<script>
(function(document) {
var i = 0;
// snip empty header rows since markdown can't
var rows = document.querySelectorAll('tr');
for(i=0; i<rows.length; i++) {
var ths = rows[i].querySelectorAll('th');
var rowlen = rows[i].children.length;
if (ths.length > 0 && ths.length === rowlen) {
rows[i].remove();
}
}
})(document);
</script>
<script>
/* Lanyon & Poole are Copyright (c) 2014 Mark Otto. Adapted to Pelican 20141223 and extended a bit by @thomaswilley */
(function(document) {
var toggle = document.querySelector('.sidebar-toggle');
var sidebar = document.querySelector('#sidebar');
var checkbox = document.querySelector('#sidebar-checkbox');
document.addEventListener('click', function(e) {
var target = e.target;
if(!checkbox.checked ||
sidebar.contains(target) ||
(target === checkbox || target === toggle)) return;
checkbox.checked = false;
}, false);
})(document);
</script>
<!-- Piwik -->
<script type="text/javascript">
var _paq = _paq || [];
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="//tracker.notmyidea.org/";
_paq.push(['setTrackerUrl', u+'piwik.php']);
_paq.push(['setSiteId', 3]);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'piwik.js'; s.parentNode.insertBefore(g,s);
})();
</script>
<noscript><p><img src="//tracker.notmyidea.org/piwik.php?idsite=3" style="border:0;" alt="" /></p></noscript>
<!-- End Piwik Code -->
</div>
</body>
</html>