<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>PyRuby blog &#187; REST</title>
	<atom:link href="http://www.pyruby.com/tag/rest/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.pyruby.com</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Mon, 12 Dec 2011 11:03:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>Stubbing a REST api in Python</title>
		<link>http://www.pyruby.com/2009/10/06/stubbing-a-rest-api-in-python/</link>
		<comments>http://www.pyruby.com/2009/10/06/stubbing-a-rest-api-in-python/#comments</comments>
		<pubDate>Wed, 07 Oct 2009 04:58:19 +0000</pubDate>
		<dc:creator>PyRuby</dc:creator>
				<category><![CDATA[geek]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://www.pyruby.com/?p=15</guid>
		<description><![CDATA[<p>For the last few jobs I&#8217;ve had, Service Oriented Architecture has been a strong theme.  Having services presenting REST apis that consume and produce XML has been the regular approach.  When it comes to testing consumers of those services, I have found Python to be an extremely useful and convenient tool.  It&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>For the last few jobs I&#8217;ve had, <a href="http://en.wikipedia.org/wiki/Service-oriented_architecture">Service Oriented Architecture</a> has been a strong theme.  Having services presenting REST apis that consume and produce XML has been the regular approach.  When it comes to testing consumers of those services, I have found Python to be an extremely useful and convenient tool.  It&#8217;s quick and easy to <a href="http://docs.python.org/library/basehttpserver.html">throw an HTTP server up</a> in Python, and hard code the values that it returns.  The problem is though, that I have ended up just adding code to the do_GET / do_POST methods as I add tests that handle different expectations.  This ends up separating the expectations and return values from the test, and making maintaining the stub code harder than it should be.  </p>
<p>To resolve this, I&#8217;d like to add expectations of the stub http server in the same way as with defining mocks.  The syntax would look something like this</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"> &nbsp; &nbsp;server.<span class="me1">expect</span><span class="br0">&#40;</span>method=<span class="st0">&quot;GET&quot;</span>, url=<span class="st0">&quot;/address/<span class="es0">\d</span>+$&quot;</span><span class="br0">&#41;</span>.</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="me1">and_return</span><span class="br0">&#40;</span>mime=<span class="st0">&quot;text/xml&quot;</span>, file_content=<span class="st0">&quot;path/to/response.xml&quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; capture = <span class="br0">&#123;</span><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; server.<span class="me1">expect</span><span class="br0">&#40;</span>method=<span class="st0">&quot;PUT&quot;</span>, url=<span class="st0">&quot;/address/<span class="es0">\d</span>+$&quot;</span>, data_capture=capture<span class="br0">&#41;</span>.</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="me1">and_return</span><span class="br0">&#40;</span>reply_code=<span class="nu0">201</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; server.<span class="me1">expect</span><span class="br0">&#40;</span>method=<span class="st0">&quot;POST&quot;</span>, url=<span class="st0">&quot;address/<span class="es0">\d</span>+/inhabitant&quot;</span>, data=<span class="st0">&#8216;&lt;inhabitant name=&quot;Chris&quot;/&gt;&#8217;</span><span class="br0">&#41;</span>.</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="me1">and_return</span><span class="br0">&#40;</span>reply_code=<span class="nu0">204</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; server.<span class="me1">expect</span><span class="br0">&#40;</span>method=<span class="st0">&quot;GET&quot;</span>, url=<span class="st0">&quot;/monitor/server_status$&quot;</span><span class="br0">&#41;</span>.</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="me1">and_return</span><span class="br0">&#40;</span>content=<span class="st0">&quot;&lt;html&gt;&lt;body&gt;Server is up&lt;/body&gt;&lt;/html&gt;&quot;</span>, mime_type=<span class="st0">&quot;text/html&quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1"># execute system under test</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">assertEquals</span><span class="br0">&#40;</span><span class="st0">&quot;&lt;expected&gt;&lt;xml/&gt;&lt;/expected&gt;&quot;</span>, capture<span class="br0">&#91;</span><span class="st0">&quot;body&quot;</span><span class="br0">&#93;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>So, over the next couple of weeks I&#8217;ll be putting this together, which should among other things allow me to improve the end to end testing story for <a href="http://djangorestmodel.sourceforge.net">djangoRESTModel</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pyruby.com/2009/10/06/stubbing-a-rest-api-in-python/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Django REST models</title>
		<link>http://www.pyruby.com/2009/09/28/django-rest-models/</link>
		<comments>http://www.pyruby.com/2009/09/28/django-rest-models/#comments</comments>
		<pubDate>Tue, 29 Sep 2009 01:05:07 +0000</pubDate>
		<dc:creator>PyRuby</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://www.pyruby.com/?p=4</guid>
		<description><![CDATA[We wrote an xml_models library, which allowed us to map our models to the XML data, using a declarative style similar to the Django DB models.  The library has been open sourced and can be found on <a [...]]]></description>
			<content:encoded><![CDATA[<h2>Making external XML REST apis more pythonic</h2>
<p>At <a href="http://www.point2.com">work</a> we have a <a href="http://www.djangoproject.com">Django</a> web application where the models are backed by a Java XML <a href="http://en.wikipedia.org/wiki/Representational_State_Transfer">REST api</a>.  The application is read only, so there is no requirement to write back to the REST api.</p>
<p>We started with copying the data into a local DB, and using regular Django DB models, and we wanted something that would feel very similar, but use an XML REST backend. We wrote an xml_models library, which allowed us to map our models to the XML data, using a declarative style similar to the Django DB models.  The library has been open sourced and can be found on <a href="http://djangorestmodel.sf.net">sourceforge</a>.</p>
<p>Here is a simple example:-</p>
<p>Suppose there was an API http://myaddressbook.com/addresses/{addressID} that returns the following XML</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;address</span> <span class="re0">id</span>=<span class="st0">&quot;123&quot;</span> <span class="re0">num</span>=<span class="st0">&quot;3301&quot;</span><span class="re2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="sc3"><span class="re1">&lt;street<span class="re2">&gt;</span></span></span>8th Street<span class="sc3"><span class="re1">&lt;/street<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="sc3"><span class="re1">&lt;city<span class="re2">&gt;</span></span></span>Saskatoon<span class="sc3"><span class="re1">&lt;/city<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="sc3"><span class="re1">&lt;province<span class="re2">&gt;</span></span></span>SK<span class="sc3"><span class="re1">&lt;/province<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="sc3"><span class="re1">&lt;country<span class="re2">&gt;</span></span></span>Canada<span class="sc3"><span class="re1">&lt;/country<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;/address<span class="re2">&gt;</span></span></span></div>
</li>
</ol>
</div>
<p>The model might be defined as</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">class</span> Address<span class="br0">&#40;</span>xml_models.<span class="me1">Model</span><span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">id</span> = xml_models.<span class="me1">IntField</span><span class="br0">&#40;</span>xpath=<span class="st0">&quot;/address/@id&quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; num = xml_models.<span class="me1">IntField</span><span class="br0">&#40;</span>xpath=<span class="st0">&quot;/address/@num&quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; street = xml_models.<span class="me1">CharField</span><span class="br0">&#40;</span>xpath=<span class="st0">&quot;/address/street&quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; city = xml_models.<span class="me1">CharField</span><span class="br0">&#40;</span>xpath=<span class="st0">&quot;/address/city&quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; province = xml_models.<span class="me1">CharField</span><span class="br0">&#40;</span>xpath=<span class="st0">&quot;/address/province&quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; country = xml_models.<span class="me1">CharField</span><span class="br0">&#40;</span>xpath=<span class="st0">&quot;/address/country&quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; finders = <span class="br0">&#123;</span> <span class="br0">&#40;</span><span class="kw2">id</span>,<span class="br0">&#41;</span>: <span class="st0">&quot;http://myaddressbook.com/addresses/%s&quot;</span> ,</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span>num,street<span class="br0">&#41;</span>: <span class="st0">&quot;http://myaddressbook.com/addresses/num/%s/street/%s&quot;</span><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>And using the finder method would be like this</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">address = Address.<span class="me1">objects</span>.<span class="me1">get</span><span class="br0">&#40;</span><span class="kw2">id</span>=<span class="nu0">123</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>That&#8217;s the basics.  We are mapping much more complex relationships with collection fields, date fields and more.  Take a look and let me know what you think.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pyruby.com/2009/09/28/django-rest-models/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

