<?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"><channel><title><![CDATA[Random Thoughts]]></title><description><![CDATA[Android Developer working at the Dutch Railways (Nederlandse Spoorwegen) who is passionate about mobile development and always eager to learn.]]></description><link>https://hameteman.com</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1655730137232/4E6afNxf4.png</url><title>Random Thoughts</title><link>https://hameteman.com</link></image><generator>RSS for Node</generator><lastBuildDate>Fri, 10 Apr 2026 15:48:29 GMT</lastBuildDate><atom:link href="https://hameteman.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[An Introduction to Paparazzi for Snapshot Testing]]></title><description><![CDATA[TL;DR: Snapshot testing with Paparazzi allows you to ensure your Jetpack Compose components behave as expected, without needing an emulator. This article covers setting up Paparazzi, creating a simple Tag composable, and using Paparazzi to create, ve...]]></description><link>https://hameteman.com/an-introduction-to-paparazzi-for-snapshot-testing</link><guid isPermaLink="true">https://hameteman.com/an-introduction-to-paparazzi-for-snapshot-testing</guid><category><![CDATA[Android]]></category><category><![CDATA[UI]]></category><category><![CDATA[Testing]]></category><category><![CDATA[Jetpack Compose]]></category><category><![CDATA[android app development]]></category><dc:creator><![CDATA[Paul Hameteman]]></dc:creator><pubDate>Thu, 03 Aug 2023 05:28:36 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1683811566814/c21f8e70-ad22-480c-b085-4dc3c8f9c12d.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote>
<p>TL;DR: Snapshot testing with Paparazzi allows you to ensure your Jetpack Compose components behave as expected, without needing an emulator. This article covers setting up Paparazzi, creating a simple Tag composable, and using Paparazzi to create, verify, and update snapshot tests for your Android app.</p>
</blockquote>
<h3 id="heading-what-is-snapshot-testing">What is Snapshot Testing?</h3>
<p>Snapshot testing allows you to ensure that your output continues to behave as expected. This is useful because as you revisit your code, some changes might cause something to break.</p>
<p>When writing snapshot tests for Jetpack Compose components, you first need to have your code in a working state. Then generate a snapshot of its expected output given certain data. The snapshot tests are committed alongside the component.</p>
<p><a target="_blank" href="https://github.com/cashapp/paparazzi">Paparazzi</a> is an Android library you can use to create those snapshots for your apps in a simple and friendly way and compare them. One of the advantages this library has over its competitor <a target="_blank" href="https://github.com/pedrovgs/Shot">Shot</a> is that it doesn't need an emulator to run the tests, it just runs in the unit test stage which is <em>much</em> faster.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://github.com/cashapp/paparazzi">https://github.com/cashapp/paparazzi</a></div>
<p> </p>
<h3 id="heading-set-up">Set up</h3>
<p>Let's begin the setup process for our first test! To get started, we need to make some changes to the root <code>build.gradle</code> file. First, we'll add the necessary dependency for Paparazzi and apply the plugin. The latest version available at the time of writing is 1.3.1.</p>
<p>The <code>build.gradle</code> file should look like this after adding the dependency:</p>
<pre><code class="lang-kotlin">buildscript {
    <span class="hljs-comment">// ... Repositories and other settings</span>
    dependencies {
        classpath <span class="hljs-string">'app.cash.paparazzi:paparazzi-gradle-plugin:1.3.1'</span>
        <span class="hljs-comment">// ... Other dependencies</span>
    }
}

<span class="hljs-comment">// ... The rest of your build.gradle content</span>

apply plugin: <span class="hljs-string">'app.cash.paparazzi'</span>
</code></pre>
<p>Next, in your Android library or app module, we need to include the Paparazzi plugin in the plugins block within <code>build.gradle</code>:</p>
<pre><code class="lang-kotlin">plugins {
    <span class="hljs-comment">// Other plugin ids</span>
    id <span class="hljs-string">'app.cash.paparazzi'</span>
}
</code></pre>
<p>After making these changes, perform a Gradle sync to complete the setup process. Now, we are all set to create our first snapshot using Paparazzi!</p>
<h3 id="heading-creating-the-first-snapshot-test">Creating the first snapshot test</h3>
<p>Let's create a simple Tag composable of which we can make a snapshot later on. Normally a component like this would also have support for click interactions and accessibility. For brevity, we will leave these out in this example.</p>
<pre><code class="lang-kotlin"><span class="hljs-meta">@Composable</span>
<span class="hljs-function"><span class="hljs-keyword">fun</span> <span class="hljs-title">Tag</span><span class="hljs-params">(
    name: <span class="hljs-type">String</span>,
    modifier: <span class="hljs-type">Modifier</span> = Modifier,
    backgroundColor: <span class="hljs-type">Color</span> = MaterialTheme.colors.primarySurface,
    contentColor: <span class="hljs-type">Color</span> = contentColorFor(backgroundColor)</span></span>
) {
    Text(
        text = <span class="hljs-string">"#<span class="hljs-variable">$name</span>"</span>.toLowerCase(Locale.current),
        modifier = modifier
            .background(
                color = backgroundColor,
                shape = MaterialTheme.shapes.small
            )
            .padding(horizontal = <span class="hljs-number">4</span>.dp, vertical = <span class="hljs-number">2</span>.dp),
        color = contentColor,
        fontSize = <span class="hljs-number">12</span>.sp
    )
}
</code></pre>
<p>This will end up in a component looking like this:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1690953159374/44670216-e6c4-4c03-8c02-4eef08c2a339.png" alt="A purple tag with the word tag on it" class="image--center mx-auto" /></p>
<p>Next, let's create the snapshot test. Create a new test and make sure to place it inside the <code>unitTest</code> folder instead of <code>androidTest</code>.</p>
<p>In the <code>TagTest</code> class, add the Paparazzi rule, use rendering mode <code>SHRINK</code> here if you only want to capture the component instead of the whole screen of the device.</p>
<pre><code class="lang-kotlin"><span class="hljs-meta">@get:Rule</span>
<span class="hljs-keyword">val</span> paparazzi = Paparazzi(
    deviceConfig = DeviceConfig.NEXUS_5.copy(softButtons = <span class="hljs-literal">false</span>),
    renderingMode = SessionParams.RenderingMode.SHRINK
)
</code></pre>
<p>Create a test to render the component like so;</p>
<pre><code class="lang-kotlin"><span class="hljs-meta">@Test</span>
<span class="hljs-function"><span class="hljs-keyword">fun</span> <span class="hljs-title">testTag</span><span class="hljs-params">()</span></span> {
    paparazzi.snapshot(<span class="hljs-string">"Tag"</span>) {
        MaterialTheme {
            Tag(name = <span class="hljs-string">"Snapshot-Test"</span>)
        }
    }
}
</code></pre>
<p>Because we've added Paparazzi to the Gradle files already, there are now 2 additional tasks that you can run.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Task</td><td>Description</td></tr>
</thead>
<tbody>
<tr>
<td><code>verifyPaparazziDebug</code></td><td>Runs tests and verifies against previously-recorded golden values. Failures generate diffs at <code>build/paparazzi/failures</code>.</td></tr>
<tr>
<td><code>recordPaparazziDebug</code></td><td>Saves snapshots as golden values to a predefined source-controlled location (defaults to <code>src/test/snapshots</code>).</td></tr>
</tbody>
</table>
</div><p>Because we haven't created the golden values yet, running the verify task now will result in a failed test.</p>
<pre><code class="lang-bash">$ ./gradlew :app:verifyPaparazziDebug

&gt; Task :app:testReleaseUnitTest

com.appsoluut.paparazzi.tag.TagTest &gt; testTag FAILED
    java.lang.AssertionError at TagTest.kt:19

* What went wrong:
Execution failed <span class="hljs-keyword">for</span> task <span class="hljs-string">':app:testReleaseUnitTest'</span>.
&gt; There were failing tests. See the report at: file://android/paparazzi/app/build/reports/tests/testReleaseUnitTest/index.html
</code></pre>
<p>Creating the golden values is simple. Look at the tasks table above and see you only need to run the <code>recordPaparazziDebug</code> task to start recording. If it doesn't already exists, a new <code>snapshots</code> folder will be created in the <code>src/test</code> directory. This will contain our snapshot and should look something like this.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1691039337150/a2c56181-55a3-4355-a2b9-9cd93ab1ee1f.png" alt class="image--center mx-auto" /></p>
<p>If you would run the <code>verifyPaparazziDebug</code> task again, all tests should report successfully. But let's make it more interesting and break the snapshot! Remove the <code>.toLowerCase(Locale.current)</code> part from the Tag composable so we have minimal changes. Run the <code>verifyPaparazziDebug</code> task again and see what happens.</p>
<pre><code class="lang-bash">&gt; Task :app:testDebugUnitTest FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed <span class="hljs-keyword">for</span> task <span class="hljs-string">':app:testDebugUnitTest'</span>.
&gt; There were failing tests. See the report at: file://android/paparazzi/app/build/reports/tests/testDebugUnitTest/index.html
</code></pre>
<p>Unsurprisingly the test failed. You can either open up the HTML report and get a written report of what was going wrong, but that one will only tell you the percentage difference or if the size has changed of the snapshot.</p>
<p>More interesting is to see the actual difference in the snapshot. The tasks will now have created 2 output files which can be found in the <code>build/paparazzi/outputs</code> directory. The <code>delta</code> variant will show the expected, difference and actual snapshot in one handy image.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1691040059231/7a95f530-6dad-4322-b379-d7815dbc87f1.png" alt class="image--center mx-auto" /></p>
<p>It's directly clear from the above image what the problem is. If this was expected to change, you can just run the <code>recordPaparazziDebug</code> task again to update the golden values.</p>
<h3 id="heading-final-words">Final words</h3>
<p>I hope this article helped you get a basic understanding of snapshot testing and inspired you to add them to your project. The next part in this series will be adding the tests to be part of your CI/CD setup.</p>
]]></content:encoded></item><item><title><![CDATA[10 Tips to stay a Happy Developer]]></title><description><![CDATA[As a developer, it's easy to get caught up in the daily grind of writing code, fixing bugs, and meeting deadlines. It's important to remember, however, that being a happy and fulfilled developer is just as important as being a competent one. Here are...]]></description><link>https://hameteman.com/10-tips-to-stay-a-happy-developer</link><guid isPermaLink="true">https://hameteman.com/10-tips-to-stay-a-happy-developer</guid><category><![CDATA[Developer]]></category><category><![CDATA[Happy ]]></category><category><![CDATA[#happycoding]]></category><category><![CDATA[development]]></category><category><![CDATA[healthcare]]></category><dc:creator><![CDATA[Paul Hameteman]]></dc:creator><pubDate>Wed, 04 Jan 2023 13:24:57 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1672838613380/69fe75e0-29b5-41a1-902e-25acfdf3c112.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>As a developer, it's easy to get caught up in the daily grind of writing code, fixing bugs, and meeting deadlines. It's important to remember, however, that being a happy and fulfilled developer is just as important as being a competent one. Here are 10 tips for how to find happiness as a developer:</p>
<ol>
<li><p><strong>Find work that you enjoy:</strong> One of the key factors in job satisfaction is finding work that you are truly passionate about. If you enjoy the work that you do, it won't feel like a chore, and you'll be more motivated to do your best.</p>
</li>
<li><p><strong>Take breaks:</strong> Working long hours without a break can lead to burnout and decreased productivity. It's important to take breaks to rest, recharge, and come back to your work with a fresh perspective.</p>
</li>
<li><p><strong>Stay up to date with new technologies:</strong> Staying up to date with the latest technologies can help keep your work interesting and challenging. It can also help you stay competitive in the job market.</p>
</li>
<li><p><strong>Connect with other developers:</strong> Being part of a community of like-minded individuals can help you stay motivated and inspired. It can also be a great resource for troubleshooting and learning new things.</p>
</li>
<li><p><strong>Set realistic goals:</strong> It's important to set goals for yourself, but it's just as important to make sure they are realistic. Setting unrealistic goals can lead to disappointment and frustration.</p>
</li>
<li><p><strong>Practice good work-life balance:</strong> It's easy to get caught up in work, but it's important to make time for the other important aspects of your life, such as friends, family, and hobbies.</p>
</li>
<li><p><strong>Take care of your physical and mental health:</strong> As a developer, it's easy to spend long hours sitting at a computer, which can take a toll on your physical health. It's important to take breaks to stretch and move around and to make sure you're getting enough sleep and exercise. It's also important to take care of your mental health by finding ways to manage stress and seeking help if you need it.</p>
</li>
<li><p><strong>Find a mentor:</strong> Having someone to guide and support you can be invaluable as you navigate your career as a developer. A mentor can offer advice, provide guidance, and help you find opportunities for growth and advancement.</p>
</li>
<li><p><strong>Keep learning:</strong> The field of technology is constantly evolving, and it's important to keep learning and growing as a developer. This could mean taking online courses, attending conferences, or simply staying up to date with industry news and trends.</p>
</li>
<li><p><strong>Celebrate your successes:</strong> It's important to recognize and celebrate your achievements, no matter how big or small. Take time to reflect on your accomplishments and the progress you've made, and don't be afraid to share your successes with others.</p>
</li>
</ol>
<blockquote>
<p>"The true test of a developer's character is not how they handle success, but how they handle setbacks and failures."</p>
</blockquote>
<p>By following these tips, you can find happiness and fulfillment as a developer and enjoy your work to the fullest. Remember, it's not all about the code – it's also about finding balance and happiness in your career.</p>
]]></content:encoded></item><item><title><![CDATA[How-to not clear the logcat on a crash]]></title><description><![CDATA[It is already annoying that your app crashes. But even more so when you can’t find the crash in the logcat due to the app restarting on either the emulator or a physical device.
Luckily, there is a very simple and quick solution for this, it stops An...]]></description><link>https://hameteman.com/how-to-not-clear-the-logcat-on-a-crash</link><guid isPermaLink="true">https://hameteman.com/how-to-not-clear-the-logcat-on-a-crash</guid><category><![CDATA[Android]]></category><category><![CDATA[Android Studio]]></category><category><![CDATA[#howtos]]></category><category><![CDATA[logging]]></category><dc:creator><![CDATA[Paul Hameteman]]></dc:creator><pubDate>Fri, 10 Dec 2021 12:41:06 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1643633076923/180qAYAzE.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>It is already annoying that your app crashes. But even more so when you can’t find the crash in the logcat due to the app restarting on either the emulator or a physical device.</p>
<p>Luckily, there is a very simple and quick solution for this, it stops Android Studio from clearing the logcat which means you can stop trying to reproduce it multiple times or are forced to use the command line. You can just start fixing the actual error instead.</p>
<hr />
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1643633231582/6yWP4WM1E.png" alt="edit-filter-configuration.png" /></p>
<p>It only consists of two steps, first open the logcat window in your Android Studio if it’s not already there. On the top right, you see the filters dropdown. Open this and select <em>Edit Filter Configuration</em>.</p>
<hr />
<p>In the <em>Create New Logcat Filter</em> window fill in the <em>Package Name</em> of your application. In my case, it is <code>eu.walkthecity</code>. You can fill in anything you want in <em>Filter Name</em> but I would recommend putting the name of your application there so you can easily find it back if you’re working on multiple apps.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1643633184227/avAMsVTFN.png" alt="create-new-logcat-filter.png" /></p>
<p>The <em>Log Level</em> can be set to anything you want as crashes are always reported as <em>Error</em>. I used <em>Verbose</em> so I can just leave this filter on when looking for my debug messages as well.</p>
<p><em>Voila</em>, you’re done. Simple right? Now back to more important stuff and get those amazing apps out there!</p>
]]></content:encoded></item><item><title><![CDATA[Android Jetifier — Can we say Bye-Bye yet]]></title><description><![CDATA[A couple of years ago Google deprecated the support libraries in favor of the new AndroidX library. Jetifier is a tool to do this conversion for you if you are using libraries that still depend on those deprecated support libraries. However, doing th...]]></description><link>https://hameteman.com/android-jetifier-can-we-say-bye-bye-yet</link><guid isPermaLink="true">https://hameteman.com/android-jetifier-can-we-say-bye-bye-yet</guid><category><![CDATA[Android]]></category><category><![CDATA[gradle]]></category><category><![CDATA[android app development]]></category><category><![CDATA[Libraries]]></category><category><![CDATA[Developer Tools]]></category><dc:creator><![CDATA[Paul Hameteman]]></dc:creator><pubDate>Wed, 10 Nov 2021 23:00:00 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1643695742214/T5DIKMrYm.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A couple of years ago Google deprecated the support libraries in favor of the new AndroidX library. Jetifier is a tool to do this conversion for you if you are using libraries that still depend on those deprecated support libraries. However, doing this conversion every build might be time-consuming and it might not even be needed anymore by this time.</p>
<p><em>“But how do I know if it is still useful?”</em> I hear you ask. Fortunately, there is a <a target="_blank" href="https://github.com/dipien/bye-bye-jetifier">Bye Bye Jetifier</a> Gradle plugin available by <a target="_blank" href="https://www.dipien.com/">Dipien</a> that has the answer!</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://github.com/dipien/bye-bye-jetifier">https://github.com/dipien/bye-bye-jetifier</a></div>
<h2 id="heading-two-simple-steps-to-get-you-started">Two simple steps to get you started</h2>
<p>Luckily it is very easy to get started! Just add the following dependency to your app <code>build.gradle</code> file.</p>
<iframe width="575" height="266" src="https://snappify.io/embed/03b2e7bf-e312-4dab-9892-01d98cbb403a" style="border-radius:10px;background:linear-gradient(354deg,  #283593, #1976d2)"></iframe>

<p><em>The version at the time of this writing was <strong>1.2.0</strong>.</em></p>
<p>At the end of the same <code>build.gradle</code> file, apply the plugin.</p>
<iframe width="479" height="182" src="https://snappify.io/embed/9a0a9f53-ba46-4a71-b922-6f4bb4b10817" style="border-radius:10px;background:linear-gradient(354deg,  #283593, #1976d2)"></iframe>

<p>You’re all set. Now when you run the Gradle command <code>./gradlew canISayByeByeJetifier -Pandroid.enableJetifier=false</code> in a terminal, you’ll get output telling you if your project is still depending on Jetifier or not. In my case, I still have to do some more maintenance.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1643698894338/jtZFu4fYJx.png" alt="image.png" /></p>
]]></content:encoded></item><item><title><![CDATA[Gson using AutoValue and Polymorphism]]></title><description><![CDATA[Recently, I ran into a situation where a RESTful API provided me with a list of objects. Normally this isn't a problem since REST provides you with a structure that is easy to convert. The catch was that some objects inside other objects were polymor...]]></description><link>https://hameteman.com/gson-using-autovalue-and-polymorphism</link><guid isPermaLink="true">https://hameteman.com/gson-using-autovalue-and-polymorphism</guid><category><![CDATA[json]]></category><category><![CDATA[REST API]]></category><category><![CDATA[Android]]></category><category><![CDATA[Java]]></category><dc:creator><![CDATA[Paul Hameteman]]></dc:creator><pubDate>Sat, 19 May 2018 22:00:00 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1643705760109/DmRNHSkbG.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Recently, I ran into a situation where a RESTful API provided me with a list of objects. Normally this isn't a problem since REST provides you with a structure that is easy to convert. The catch was that some objects inside other objects were polymorphic and required to parse specific fields.</p>
<p>The previous solution was to have a HashMap that contained all the supplied fields. The application then needed to check what kind of object was returned and decide if all required key-value pairs were filled with usable data. This was not a preferred solution and was prone to errors.</p>
<p>A lot of suggestions were made to look into custom (de)serializers, which is a good idea, but also a lot of work. I came across the “hidden” <a target="_blank" href="https://github.com/google/gson/blob/master/extras/src/main/java/com/google/gson/typeadapters/RuntimeTypeAdapterFactory.java">RuntimeTypeAdapterFactory</a> class in the Gson repository which solved most of my problems quite nicely.</p>
<hr />
<h2 id="heading-an-example-problem">An Example Problem</h2>
<p>Take the following JSON structure for example:</p>
<iframe width="100%" height="623" src="https://snappify.io/embed/53624d49-273c-4e65-8118-1195b339a0b3" style="border-radius:10px;background:linear-gradient(354deg,  #283593, #1976d2)"></iframe>

<p>As you can see, the objects in the <code>body</code> array contain a field called type, which determines the type of object being returned. This will give you the flexibility to parse the objects into their own respected models, which in this case should be “<code>text</code>”, “<code>image</code>” and “<code>video</code>”. See the 3 model examples below using Google’s AutoValue.</p>
<iframe width="531" height="1177" src="https://snappify.io/embed/9b5b0cb9-9024-4dfa-927c-17a9541aab7c" style="border-radius:10px;background:linear-gradient(354deg,  #283593, #1976d2)"></iframe>

<p><em>(For brevity sake I left out the Builders and Gson Type Adapter generators in the above examples.)</em></p>
<hr />
<h2 id="heading-the-solution">The Solution</h2>
<p>First we’ll need to create the Article model itself. In the example below you’ll notice the <code>List&lt;Block&gt;</code> return type. If you take a look at the Blocks example code, you’ll see these all implement the Block interface. This way we can easily define new typed objects we want to support in future updates.</p>
<iframe width="461" height="329" src="https://snappify.io/embed/e51c7295-d076-4fd2-9cbc-bf8b8cfd2e1b" style="border-radius:10px;background:linear-gradient(354deg,  #283593, #1976d2)"></iframe>

<p>But now parsing it; here the magic called RuntimeTypeAdapterFactory will step in! When creating the Gson parser, you can register all kinds of type adapter factories. Add the generated AutoValue adapter and the Runtime adapter and you’re set.</p>
<p>For example:</p>
<iframe width="100%" height="431" src="https://snappify.io/embed/09cfd239-31ff-4f05-b72b-3bd686eff52b" style="border-radius:10px;background:linear-gradient(354deg,  #283593, #1976d2)"></iframe>

<p>Whenever the Gson parser encounters an object of the type <code>Block</code> the adapter will check if it can parse to any of the defined subtypes. If your API defines the type in a different field than <code>"type"</code> you can provide it. <code>"type"</code> is the default name for the key so you can omit it entirely if your API does work this way.</p>
<hr />
<h2 id="heading-caveats">Caveats</h2>
<p>I ran into a couple of minor issues which I needed to solve for my purpose. These findings might also come in handy for you to know when you’ll start working with the RuntimeTypeAdapterFactory.</p>
<ol>
<li>If the parser encounters an unexpected type, an exception will be thrown and your complete object will be invalid — You can modify the parser to return <code>null</code> instead if you don’t like this approach</li>
<li>The parsed <code>"type"</code> field will not be returned to the model — if you want this info, you’ll need to re-add it</li>
</ol>
<p>Happy coding!</p>
]]></content:encoded></item></channel></rss>