mirror of
https://github.com/almet/notmyidea.git
synced 2025-04-28 19:42:37 +02:00
261 lines
No EOL
20 KiB
HTML
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 & code - Wrap-up</h1>
|
|
<p>This week-end I hosted a <em>cheese & 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">'</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">'</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">"</span><span class="s">Respire</span><span class="s2">"</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">'</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">>>></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">>>></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">>>></span> <span class="nv">cl</span> <span class="o">=</span> <span class="nv">client_from_url</span><span class="ss">(</span><span class="s1">'</span><span class="s">http://localhost:8000/spore</span><span class="s1">'</span><span class="ss">)</span>
|
|
|
|
<span class="o">>>></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">>>></span> <span class="nv">todo_def</span> <span class="o">=</span> {
|
|
... <span class="s2">"</span><span class="s">title</span><span class="s2">"</span>: <span class="s2">"</span><span class="s">todo</span><span class="s2">"</span>,
|
|
... <span class="s2">"</span><span class="s">description</span><span class="s2">"</span>: <span class="s2">"</span><span class="s">A list of my stuff to do</span><span class="s2">"</span>,
|
|
... <span class="s2">"</span><span class="s">fields</span><span class="s2">"</span>: [
|
|
... {
|
|
... <span class="s2">"</span><span class="s">name</span><span class="s2">"</span>: <span class="s2">"</span><span class="s">item</span><span class="s2">"</span>,
|
|
... <span class="s2">"</span><span class="s">type</span><span class="s2">"</span>: <span class="s2">"</span><span class="s">string</span><span class="s2">"</span>,
|
|
... <span class="s2">"</span><span class="s">description</span><span class="s2">"</span>: <span class="s2">"</span><span class="s">The item</span><span class="s2">"</span>
|
|
... },
|
|
... {
|
|
... <span class="s2">"</span><span class="s">name</span><span class="s2">"</span>: <span class="s2">"</span><span class="s">status</span><span class="s2">"</span>,
|
|
... <span class="s2">"</span><span class="s">type</span><span class="s2">"</span>: <span class="s2">"</span><span class="s">enum</span><span class="s2">"</span>,
|
|
... <span class="s2">"</span><span class="s">choices</span><span class="s2">"</span>: [
|
|
... <span class="s2">"</span><span class="s">done</span><span class="s2">"</span>,
|
|
... <span class="s2">"</span><span class="s">todo</span><span class="s2">"</span>
|
|
... ],
|
|
... <span class="s2">"</span><span class="s">description</span><span class="s2">"</span>: <span class="s2">"</span><span class="s">is it done or not</span><span class="s2">"</span>
|
|
... }
|
|
... ]}
|
|
<span class="o">>>></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">'</span><span class="s">todo</span><span class="s1">'</span>, <span class="nv">data</span><span class="o">=</span><span class="nv">todo_def</span><span class="ss">)</span>
|
|
<span class="o">>>></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">'</span><span class="s">todo</span><span class="s1">'</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">'</span><span class="s">make it work</span><span class="s1">'</span>, <span class="nv">status</span><span class="o">=</span><span class="s1">'</span><span class="s">todo</span><span class="s1">'</span><span class="ss">))</span>
|
|
{<span class="nv">u</span><span class="s1">'</span><span class="s">id</span><span class="s1">'</span>: <span class="nv">u</span><span class="s1">'</span><span class="s">9f2c90c0529a442cfdc03c191b022cf7</span><span class="s1">'</span>}
|
|
<span class="o">>>></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">'</span><span class="s">todo</span><span class="s1">'</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> |