<?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>.NET is pretty much very nice, thank youIronCow</title>
	<atom:link href="http://ludovic.chabant.com/devblog/category/ironcow/feed/" rel="self" type="application/rss+xml" />
	<link>http://ludovic.chabant.com/devblog</link>
	<description>.NET fanboyism and general geekery</description>
	<lastBuildDate>Mon, 30 Aug 2010 21:11:47 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Experimental IronCow branches</title>
		<link>http://ludovic.chabant.com/devblog/2009/04/23/experimental-ironcow-branches/</link>
		<comments>http://ludovic.chabant.com/devblog/2009/04/23/experimental-ironcow-branches/#comments</comments>
		<pubDate>Thu, 23 Apr 2009 16:44:00 +0000</pubDate>
		<dc:creator>ludovic</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Announcement]]></category>
		<category><![CDATA[IronCow]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://ludovic.chabant.com/devblog/2009/04/18/experimental-ironcow-branches/</guid>
		<description><![CDATA[I created 2 experimental branches for future versions of IronCow.

“IronCow Mobile” is a branch that adds support for the .NET Compact Framework. Thanks to jwboer for the initial patch.
“IronCow Local Search” is a branch that adds local search for tasks. We basically cache all the tasks in memory, and handle search queries locally, instead of [...]]]></description>
			<content:encoded><![CDATA[<p>I created 2 experimental branches for future versions of <a href="http://www.codeplex.com/ironcow"><strong>IronCow</strong></a>.</p>
<ul>
<li>“<em>IronCow Mobile</em>” is a branch that adds support for the <strong>.NET Compact Framework</strong>. Thanks to <a href="http://www.codeplex.com/site/users/view/jwboer">jwboer</a> for the initial patch.</li>
<li>“<em>IronCow Local Search</em>” is a branch that adds local search for tasks. We basically cache all the tasks in memory, and handle search queries locally, instead of <a href="http://www.rememberthemilk.com/services/api/methods/rtm.tasks.getList.rtm">sending a request to the <strong>RTM</strong> server</a> and parsing the response markup. The lexical analysis and <a href="http://en.wikipedia.org/wiki/Abstract_syntax_tree">AST</a> building of the search query is a bit dodgy, as I can’t get a proper tool like <strong><a href="http://www.antlr.org/">ANTLR</a></strong> to work with <strong>RTM</strong>’s search grammar (probably me doing something wrong), but it’s not too much of a problem right now since search queries tend to be quite short, and we already are significantly faster than a web request.</li>
</ul>
<p>Check them out!</p>
]]></content:encoded>
			<wfw:commentRss>http://ludovic.chabant.com/devblog/2009/04/23/experimental-ironcow-branches/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IronCow and Milkify now more open-source</title>
		<link>http://ludovic.chabant.com/devblog/2008/12/15/ironcow-and-milkify-now-more-open-source/</link>
		<comments>http://ludovic.chabant.com/devblog/2008/12/15/ironcow-and-milkify-now-more-open-source/#comments</comments>
		<pubDate>Mon, 15 Dec 2008 19:35:19 +0000</pubDate>
		<dc:creator>ludovic</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Announcement]]></category>
		<category><![CDATA[IronCow]]></category>
		<category><![CDATA[Milkify]]></category>

		<guid isPermaLink="false">http://ludovic.chabant.com/devblog/2008/12/15/ironcow-and-milkify-now-more-open-source/</guid>
		<description><![CDATA[The source code for IronCow and Milkify are now hosted directly on Codeplex. Anybody can therefore checkout the latest source code and submit patches!
]]></description>
			<content:encoded><![CDATA[<p>The source code for <a href="http://www.codeplex.com/ironcow">IronCow</a> and <a href="http://www.codeplex.com/milkify">Milkify</a> are now hosted directly on <a href="http://www.codeplex.com">Codeplex</a>. Anybody can therefore checkout the latest source code and submit patches!</p>
]]></content:encoded>
			<wfw:commentRss>http://ludovic.chabant.com/devblog/2008/12/15/ironcow-and-milkify-now-more-open-source/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>IronCow and the design for testability</title>
		<link>http://ludovic.chabant.com/devblog/2008/10/24/ironcow-and-the-design-for-testability/</link>
		<comments>http://ludovic.chabant.com/devblog/2008/10/24/ironcow-and-the-design-for-testability/#comments</comments>
		<pubDate>Fri, 24 Oct 2008 22:02:34 +0000</pubDate>
		<dc:creator>ludovic</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[IronCow]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[rememberthemilk]]></category>

		<guid isPermaLink="false">http://ludovic.chabant.com/devblog/2008/10/24/ironcow-and-the-design-for-testability/</guid>
		<description><![CDATA[IronCow is a library that wraps the Remember The Milk (RTM) web services. The “upper layer” of the IronCow API is an object model that stays in sync with the server and is designed with data binding in mind.
Of course, one of the things that went into IronCow’s design was testability. IronCow ships with a [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.codeplex.com/ironcow"><strong>IronCow</strong></a> is a library that wraps the <a href="http://www.rememberthemilk.com"><strong>Remember The Milk</strong></a> (RTM) web services. The “upper layer” of the <strong>IronCow</strong> API is an object model that stays in sync with the server and is designed with data binding in mind.</p>
<p>Of course, one of the things that went into <strong>IronCow</strong>’s design was testability. <strong>IronCow</strong> ships with a suite of unit tests that, well, test that the API is working fine. However, there’s another testability aspect: how the clients of your API are going to test their stuff. These are 2 different things: </p>
<ul>
<li>Within <strong>IronCow</strong>, “<em>design for testability</em>” means I have to be able to mock the underlying client that communicates with the RTM REST API. Then, I can manipulate my objects and check that the correct requests are sent, and that those objects behave correctly according to the responses I give. </li>
<li>From the point of view of a client, though, “<em>design for testability</em>” means they have to be able to make <strong>IronCow</strong> behave a certain way, and test that the rest of their application behave accordingly.</li>
</ul>
<p>The easy way to make an API testing friendly is to put everything behind interfaces. This way, the client can replace your stuff with test objects. But for some reason, I don’t feel like adding this kind of complexity to <strong>IronCow</strong>. It’s a pretty small API, with an object models that contains less than a dozen of classes, and hiding everything behind interfaces would triple the number of classes, add a couple of abstract factories, and more generally confuse clients that would otherwise expect a straightforward API.</p>
<p>Therefore, right now, to use <strong>IronCow</strong> in a test environment, you can disable the “syncing” behaviour like this:</p>
<pre class="code"><span style="color: #2b91af">Rtm </span>rtm = <span style="color: blue">new </span><span style="color: #2b91af">Rtm</span>(); <span style="color: green">// You can also pass in your apiKey and
// sharedSecret here but it doesn't matter.
</span>rtm.DisabledSyncing();
<span style="color: green">// From now on, there's no requests being sent.
</span></pre>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>When syncing is disabled, the <strong>IronCow</strong> object model just acts like a “dumb” object tree. Setting the name of a task or adding a new contact won’t trigger a request to RTM. Instead, it will just modify the objects locally, as if it was just a classic simple in-memory object model.</p>
<p>Note that you can’t reenable syncing.</p>
<p>The problem with this is that although the complexity of the public interface stays the same, the complexity of the internal code increases. I find it doesn’t increase nearly as much as when I tried to hide everything behind interfaces though. The other bigger problem is that it’s more complicated for clients to do behavioural testing. For example, if they want to test what happens in their application when a certain action makes <strong>IronCow</strong> throw an exception, there’s nothing to help them do that… In that case, they have to mock the <strong>IRestClient</strong> class, and use it with their <strong>Rtm</strong> instance. There are helper classes and methods to build RTM XML responses, but it’s not what you would call super user friendly (check the <strong>IronCow.UnitTests</strong> assembly source code for examples of how to use it).</p>
<p>So is this fine? No? Should I bite the bullet, add interfaces, and make this simple API be 3 times bigger and more complex? Is there a third option?</p>
]]></content:encoded>
			<wfw:commentRss>http://ludovic.chabant.com/devblog/2008/10/24/ironcow-and-the-design-for-testability/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Announcing IronCow</title>
		<link>http://ludovic.chabant.com/devblog/2008/07/04/announcing-ironcow/</link>
		<comments>http://ludovic.chabant.com/devblog/2008/07/04/announcing-ironcow/#comments</comments>
		<pubDate>Sat, 05 Jul 2008 05:56:11 +0000</pubDate>
		<dc:creator>ludovic</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Announcement]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[IronCow]]></category>
		<category><![CDATA[Powershell]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://ludovic.chabant.com/devblog/post.aspx?id=a1d3b4f7-95ec-40ed-a33b-db5b0f0f31ae</guid>
		<description><![CDATA[One of the projects I&#8217;m working on at home, IronCow, is now in a state of &#34;somewhat usable alpha&#34;. It&#8217;s a .NET API that allows developers to use Remember The Milk, the to-do list website, from any .NET language. IronCow is composed of two layers.
One layer is a &#34;dumb&#34; wrapper around the public REST API, [...]]]></description>
			<content:encoded><![CDATA[<p>One of the projects I&#8217;m working on at home, <a href="http://www.codeplex.com/ironcow"><strong>IronCow</strong></a>, is now in a state of &quot;<em>somewhat usable alpha</em>&quot;. It&#8217;s a .NET API that allows developers to use <em><a href="http://www.rememberthemilk.com">Remember The Milk</a></em>, the to-do list website, from any .NET language. <strong>IronCow</strong> is composed of two layers.</p>
<p>One layer is a &quot;dumb&quot; wrapper around the <a href="http://www.rememberthemilk.com/services/api/">public REST API</a>, in way very similar to what <strong><a href="http://www.codeplex.com/FlickrNet">FlickrNet</a></strong> does with <em>Flickr</em>&#8217;s own REST API. The second layer is a &quot;rich&quot; object model that exposes your tasks (and other data) through classes that stay in sync with the server as you manipulate them. This was done mainly with WPF applications in mind, enabling things like data binding and other reflection-based mechanisms.</p>
<p><strong>IronCow</strong> is <em><a href="http://www.codeplex.com/ironcow">available on CodePlex</a></em>.</p>
<p>A sample application that ships with <strong>IronCow</strong> is <strong>IronCow for Powershell</strong>. This is a <strong>Powershell</strong> snap-in that defines a few cmdlets that will let you manage your tasks through the command line! (if you don&#8217;t see the point, or think it&#8217;s lame, you&#8217;re obviously not enough of a geek) You&#8217;ll get to type command lines such as:</p>
<div>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">Get-RtmTask <span style="color: #006080">&quot;dueBefore:tomorrow&quot;</span> | Sort Priority,Estimate | Export-Csv $Home\TasksToDoToday.csv</pre>
</div>
<p>If that&#8217;s not cool, I don&#8217;t know what is.</p>
<p>This sample application is still a bit rough around the edges (understand: no installer &#8211; you need to compile and register the snap-in yourself, and no help file &#8211; you need to look at the code to know what parameters the cmdlets take!), but I&#8217;ll focus on that once <strong>IronCow</strong> itself is stabilized. Stay tuned!</p>
]]></content:encoded>
			<wfw:commentRss>http://ludovic.chabant.com/devblog/2008/07/04/announcing-ironcow/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
