<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Isaac Broyles</title>
    <description>The latest articles on DEV Community by Isaac Broyles (@isaacbroyles).</description>
    <link>https://dev.to/isaacbroyles</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F93804%2F65428811-f051-40e7-b282-20aab0ca4f15.jpg</url>
      <title>DEV Community: Isaac Broyles</title>
      <link>https://dev.to/isaacbroyles</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/isaacbroyles"/>
    <language>en</language>
    <item>
      <title>Building Unity with GitHub Actions</title>
      <dc:creator>Isaac Broyles</dc:creator>
      <pubDate>Sat, 04 Jul 2020 00:00:00 +0000</pubDate>
      <link>https://dev.to/isaacbroyles/building-unity-with-github-actions-1l85</link>
      <guid>https://dev.to/isaacbroyles/building-unity-with-github-actions-1l85</guid>
      <description>&lt;p&gt;I recently began doing some work on a personal project in &lt;a href="https://prf.hn/click/camref:1100ldaXB/destination:https://store.unity.com/products/unity-plus"&gt;Unity Engine&lt;/a&gt;. As with any of my projects, the first thing I set up is a working CI pipeline for it. I find doing this early reinforces best practices. I liked the option of using GitHub Actions, since it is a relatively small project. Here's how I did it!&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;First, familiarize yourself with the community offerings for GitHub Actions - &lt;a href="https://github.com/game-ci/unity-actions"&gt;game-ci/unity-actions&lt;/a&gt;. There's a good overview here in the readme of the supported actions.&lt;/p&gt;

&lt;p&gt;The other thing to check would be the official &lt;a href="https://game.ci/docs/github/getting-started"&gt;game-ci getting starting docs&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up License
&lt;/h2&gt;

&lt;p&gt;The instructions in the official docs aren't the most verbose, but it's actually quite simple.&lt;/p&gt;

&lt;p&gt;I'll just go into a little more detail here to try to make things super clear.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1 - Request Activation File on GitHub
&lt;/h3&gt;

&lt;p&gt;This is an action that is intended to be a one-time use. Its purpose is to create a "license request file" that will be needed for the next step. This is what will allow unity to run builds on the GitHub Actions servers.&lt;/p&gt;

&lt;p&gt;The file should end up looking something like this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;.github/workflows/activation.yml:&lt;/code&gt;&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name: Acquire activation file
on:
  workflow_dispatch: {}
jobs:
  activation:
    name: Request manual activation file 🔑
    runs-on: ubuntu-latest
    steps:
      # Request manual activation file
      - name: Request manual activation file
        id: getManualLicenseFile
        uses: game-ci/unity-request-activation-file@v2
      # Upload artifact (Unity_v20XX.X.XXXX.alf)
      - name: Expose as artifact
        uses: actions/upload-artifact@v2
        with:
          name: ${{ steps.getManualLicenseFile.outputs.filePath }}
          path: ${{ steps.getManualLicenseFile.outputs.filePath }}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After you push it up, you can &lt;a href="https://docs.github.com/en/actions/managing-workflow-runs/manually-running-a-workflow"&gt;manually run the worfklow&lt;/a&gt; to generate your license.&lt;/p&gt;

&lt;p&gt;To find this file, go to &lt;code&gt;GitHub&lt;/code&gt; &amp;gt; &lt;code&gt;Your Repository&lt;/code&gt; &amp;gt; &lt;code&gt;Actions&lt;/code&gt;. Click on the commit that last ran. You should find a file named something like &lt;code&gt;Unity_v2019.3.14f1.alf&lt;/code&gt;. (The exact name depends on the version string that you put in &lt;code&gt;unityVersion&lt;/code&gt; above.)&lt;/p&gt;

&lt;p&gt;You'll need to save this file locally for use in the next step.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2 - Request License from Unity
&lt;/h3&gt;

&lt;p&gt;Head over to the &lt;a href="https://license.unity3d.com/manual"&gt;Unity Manual Activation&lt;/a&gt; link.&lt;/p&gt;

&lt;p&gt;Here you simply upload your &lt;code&gt;.alf&lt;/code&gt; file from the previous step. Fill out the form with your license details.&lt;/p&gt;

&lt;p&gt;On the last step you should be able to download a file that ends in &lt;code&gt;.ulf&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This is your license you will put in GitHub secrets for use in your build actions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3 - Save License in GitHub Secrets
&lt;/h3&gt;

&lt;p&gt;Open &lt;code&gt;GitHub&lt;/code&gt; &amp;gt; &lt;code&gt;Your Repository&lt;/code&gt; &amp;gt; &lt;code&gt;Settings&lt;/code&gt; &amp;gt; &lt;code&gt;Secrets&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Create a secret called &lt;code&gt;UNITY_LICENSE&lt;/code&gt; and add the contents of the obtained license file (&lt;code&gt;.ulf&lt;/code&gt;). Yes, add the entire XML contents to the GitHub secret.&lt;/p&gt;

&lt;p&gt;Now that this step is done, you can delete the &lt;code&gt;.github/workflows/activation.yml&lt;/code&gt; file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Set up workflow
&lt;/h2&gt;

&lt;p&gt;Now's the fun stuff! Now that you have your license ready to go, you can start setting up actions.&lt;/p&gt;

&lt;p&gt;A couple of best practice recommendations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cache your &lt;code&gt;Library&lt;/code&gt; folder. This is where all your cached packages and large files end up during builds.

&lt;ul&gt;
&lt;li&gt;Note caches created on branches are scoped to that branch, regardless of key matches. Same goes for tags.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Use GitHub Releases to store your file, &lt;em&gt;not&lt;/em&gt; actions artifacts. You will quickly run into free limits using artifacts&lt;/li&gt;
&lt;li&gt;Due to the size and time of full builds, I like to generate target builds only on tags.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's an example of a couple of workflow files.&lt;/p&gt;

&lt;h4&gt;
  
  
  Test - Runs on every commit
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;.github/workflows/test.yml:&lt;/code&gt;&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name: Test

on:
  pull_request: {}
  push: { branches: [master] }

env:
  UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}

jobs:
  build:
    name: Test project
    runs-on: ubuntu-latest
    steps:

      # Checkout
      - name: Checkout repository
        uses: actions/checkout@v2
        with:
          lfs: true

      # Cache
      - uses: actions/cache@v2
        with:
          path: Library
          key: Library

      # Test
      - name: Run tests
        uses: game-ci/unity-test-runner@v2
        with:
          unityVersion: 2020.3.15f2

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Build - Runs on tagged commits
&lt;/h4&gt;

&lt;p&gt;This file uses this &lt;code&gt;on.push.tags&lt;/code&gt; trigger to only run when tags are pushed.&lt;/p&gt;

&lt;p&gt;It then uploads artifacts, zips up the binaries, creates a GitHub release for the tag, and uploads the release assets to it.&lt;/p&gt;

&lt;p&gt;Depending on your usage, you might not want to upload the artifacts. You'll quickly run into limits if you use it too much.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;.github/workflows/main.yml:&lt;/code&gt;&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name: Build

on:
  push:
    tags:
      - '*'

env:
  UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}

jobs:
  build:
    name: Build my project
    runs-on: ubuntu-latest
    steps:

      # Checkout
      - name: Checkout repository
        uses: actions/checkout@v2
        with:
          lfs: true

      # Cache
      - uses: actions/cache@v2
        with:
          path: Library
          key: Library

      # Test
      - name: Run tests
        uses: game-ci/unity-test-runner@v2
        with:
          unityVersion: 2020.3.15f2

      # Build
      - name: Build project
        uses: game-ci/unity-builder@v2
        with:
          unityVersion: 2020.3.15f2
          targetPlatform: StandaloneWindows64 

      # Output 
      - uses: actions/upload-artifact@v2
        with:
          name: Build
          path: build

      - name: Zip build
        run: |
          pushd build/StandaloneWindows64
          zip -r ../../StandaloneWindows64.zip .
          popd

      - name: Release
        uses: softprops/action-gh-release@v1
        with:
          files: StandaloneWindows64.zip
          name: Release ${{ github.ref }}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note: If you're using the above workflow, and experience an error on the build step like this:&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Warning: Changes were made to the following files and folders:

Warning: ?? artifacts/

Error: Branch is dirty. Refusing to base semantic version on uncommitted changes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You will need to add the artifacts folder to your &lt;code&gt;.gitignore&lt;/code&gt; file, as referenced in &lt;a href="https://github.com/game-ci/unity-builder/issues/241"&gt;this GitHub issue&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Another option would be using the &lt;a href="https://game.ci/docs/github/builder#allowdirtybuild"&gt;allowDirtyBuild&lt;/a&gt; flag if you are still running into dirty branch issues.&lt;/p&gt;

&lt;p&gt;Feel free to customize for your use case, as this workflow only outputs windows binaries. However, as mentioned in &lt;a href="https://github.com/game-ci/unity-actions"&gt;game-ci/unity-actions&lt;/a&gt;, there's a ton more supported actions/options.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Setting up a CI flow early tends to keep me honest in following best practices. I like to do it even for my hobby projects.&lt;/p&gt;

&lt;p&gt;A good side effect, is if I have to let projects idle for a while, I can always come back and expect my builds to work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://prf.hn/click/camref:1100ldaXB/destination:https://store.unity.com/products/unity-plus"&gt;Unity Plus&lt;/a&gt; - &lt;a href="https://prf.hn/click/camref:1100ldaXB/destination:https://store.unity.com/products/unity-pro"&gt;Unity Pro&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/game-ci/unity-actions"&gt;Github - Unity Actions&lt;/a&gt; - Unity Actions for GitHub&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note: This post includes affiliate links; I may receive compensation if you purchase products or services from the different links provided in this article.&lt;/p&gt;

</description>
      <category>unity3d</category>
      <category>github</category>
      <category>githubactions</category>
      <category>gamedev</category>
    </item>
    <item>
      <title>How to effectively use Model Mapper</title>
      <dc:creator>Isaac Broyles</dc:creator>
      <pubDate>Sun, 15 Jul 2018 00:00:00 +0000</pubDate>
      <link>https://dev.to/isaacbroyles/how-to-effectively-use-model-mapper-2kb5</link>
      <guid>https://dev.to/isaacbroyles/how-to-effectively-use-model-mapper-2kb5</guid>
      <description>&lt;p&gt;I had the pleasure of modifying a large code base that extensively used &lt;a href="http://modelmapper.org/"&gt;Model Mapper&lt;/a&gt;. I ran into some issues using it blindly, and I did not have much luck searching for answers. Most of the information in this blog posts already exists elsewhere, but I was suprised that it was not very visible on google. Hopefully we can correct that.&lt;/p&gt;

&lt;p&gt;Here are my tips for effective use of ModelMapper.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use and understand PropertyMap
&lt;/h2&gt;

&lt;p&gt;The first thing you should understand are the nuances of configuring a PropertyMap, which I personally found unintuitive. It wasnt until scouring the documentation and a few well written Stack Overflow posts that everything started to click.&lt;/p&gt;

&lt;p&gt;If you’re like me, this first thing you’ll run up against when searching for help is running across an unintuitive example like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class MyMapper extends PropertyMap&amp;lt;Source, Destination&amp;gt;{
    @Override
    protected void configure(){
        map(source.getProperty()).setOther(null);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The reason why this is confusing, is why would I “set” my destination property to null?&lt;/p&gt;

&lt;h3&gt;
  
  
  The configure() function contains EDSL
&lt;/h3&gt;

&lt;p&gt;The answer is, the code in the &lt;code&gt;configure()&lt;/code&gt; method is not actually executed as part of your mapping at all. It is actually an Embedded Domain Specific Language (EDSL). &lt;strong&gt;This is the number one thing that made my understanding of Model Mapper so much clearer.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can read more about how the EDSL works in the &lt;a href="http://modelmapper.org/javadoc/org/modelmapper/PropertyMap.html"&gt;official javadocs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This gist is this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The mapping is not executed as Java code. The &lt;code&gt;PropertyMap.configure()&lt;/code&gt; is not being executed during the mapping process. You can validate this by setting a breakpoint in the method while debugging a mapping.&lt;/li&gt;
&lt;li&gt;The mapping is interpreted by ModelMapper when the mappings are added using &lt;code&gt;addMapping(...)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Converter.convert()&lt;/code&gt;’s &lt;strong&gt;are&lt;/strong&gt; executing during runtime. So you can do something like this:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class MyMapper extends PropertyMap&amp;lt;Source, Destination&amp;gt;{
    private Converter&amp;lt;String, String&amp;gt; toUppercase = (c) -&amp;gt; {
        return c.getSource().toUpperCase();
    };

    @Override
    protected void configure(){
        using(toUppercase)
            .map(source.getProperty())
            .setOther(null);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And the code in the &lt;code&gt;toUppercase&lt;/code&gt; converter will be executed each time the objects are mapped.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use TDD when defining mappings
&lt;/h3&gt;

&lt;p&gt;I cover unit testing in the next section, but bring it up here because it can reduce boilerplate. ModelMapper actually does a pretty good job on its own in most cases. If you define what you expect in tests, it will force you to do the bare minimum definition in the PropertyMap.&lt;/p&gt;

&lt;p&gt;For example, if you were to naively define a &lt;code&gt;PropertyMap&lt;/code&gt; without running any tests, you might end up with something as verbose as this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class OverkillPropertyMap
        extends PropertyMap&amp;lt;PersonDto, Person&amp;gt; {

    @Override
    protected void configure() {
        map(source.getFirstName(), destination.getFirstName());
        map(source.getLastName(), destination.getLastName());
        map(source.getEmail(), destination.getEmail());
        map(source.getPhone(), destination.getPhone());
        map(source.getAddress1(), destination.getAddress1());
        map(source.getAddress2(), destination.getAddress2());
        map(source.getCity(), destination.getCity());
        map(source.getState(), destination.getState());
        map(source.getZip(), destination.getZip());
        map(source.getCountry(), destination.getCountry());

    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a contrived example that can seem silly to an experienced developer, but you’d be surprised at how many mappings like these pop up in codebases.&lt;/p&gt;

&lt;p&gt;Let’s see if we can simplify this in the next section with a unit test.&lt;/p&gt;

&lt;h2&gt;
  
  
  Unit Testing
&lt;/h2&gt;

&lt;p&gt;The ModelMapper official docs state that you should always unit test mappings, and I fully agree. As with most issues, it’s much easier to catch things in unit tests than later on in the SDLC.&lt;/p&gt;

&lt;p&gt;Here are the two things to always cover in your mapping unit tests:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Always&lt;/strong&gt; use &lt;code&gt;ModelMapper.validate()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Verify fields are being mapped with &lt;strong&gt;assertEquals(…)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  ModelMapper.validate()
&lt;/h3&gt;

&lt;p&gt;The handy method will verify that all destination properties are matched. This is extremely useful if somebody forgets to map a destination property after adding it. In other words, this will protect your mapper from future changes to both source/destination objects.&lt;/p&gt;

&lt;p&gt;If you are getting false positives here, you can skip properties in your mapping:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;skip(destination.getPropertyNotMapped());

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Example of effective unit test
&lt;/h3&gt;

&lt;p&gt;Going back to the example from the last section, except let’s start with a unit test this time.&lt;/p&gt;

&lt;p&gt;A standard unit test would look something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class PersonMapTests {
    private ModelMapper modelMapper;

    @Before
    public void setup(){
        modelMapper = new ModelMapper();
        modelMapper.addMappings(new PersonMap());
        modelMapper.getConfiguration()
            .setMatchingStrategy(MatchingStrategies.STRICT);
    }

    @Test
    public void map_ShouldValidate_IfObjectsValid(){
        var personDto = preparePersonDto();

        var personModel =
            modelMapper.map(personDto, Person.class);

        modelMapper.validate();

        assertEquals(
            personDto.getFirstName(), personModel.getFirstName());
        assertEquals(
            personDto.getLastName(), personModel.getLastName());
        assertEquals(
            personDto.getEmail(), personModel.getEmail());
        assertEquals(
            personDto.getPhone(), personModel.getPhone());
        assertEquals(
            personDto.getAddress1(), personModel.getAddress1());
        assertEquals(
            personDto.getAddress2(), personModel.getAddress2());
        assertEquals(
            personDto.getCity(), personModel.getCity());
        assertEquals(
            personDto.getState(), personModel.getState());
        assertEquals(
            personDto.getCountry(), personModel.getCountry());
        assertEquals(
            personDto.getZip(), personModel.getZip());
    }

    private PersonDto preparePersonDto() {
        return new PersonDto.Builder()
                .firstName("Isaac")
                .lastName("Broyles")
                .email("isaacbroyles@example.com")
                .phone("202-555-0129")
                .address1("123 Street")
                .address2("Apt 101")
                .city("Ville")
                .state("TX")
                .zip("12345")
                .country("USA")
                .build();
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In running this unit test, I get an error like this:&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1) Unmapped destination properties found in TypeMap[PersonDto -&amp;gt; Person]:

com.isaacbroyles.examples.modelmapperexamples.models.Person.setLastModified()

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uh oh, the &lt;code&gt;validate()&lt;/code&gt; method is showing us that we have a destination property that is not mapped. So let’s define a &lt;code&gt;PropertyMap&lt;/code&gt; to fix that issue.&lt;/p&gt;

&lt;p&gt;Here is the property map, with just the minimal code to fix my error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class PersonMap extends PropertyMap&amp;lt;PersonDto, Person&amp;gt; {
    @Override
    protected void configure() {
        map(source.getDateCreated(),
            destination.getLastModified());
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now I rerun my test – Oh cool, it passes now.&lt;/p&gt;

&lt;p&gt;Compare the &lt;code&gt;PropertyMap&lt;/code&gt; we ended up with to the &lt;code&gt;OverkillPropertyMap&lt;/code&gt; in the previous section. All the other properties were automatically mapped, even with &lt;code&gt;MatchingStrategies.STRICT&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;I’m somewhat conflicted over whether I like the usage of ModelMapper or not. On the one hand, it provides a good way to reduce boilerplate mapping code. On the other hand, some of the rather unintuitive aspects of it have caused me headache. This isn’t necessarily a critique of ModelMapper, and probably speaks more to my inexperience with it than any lacking on the tool’s part. It has obviously grown to be a popular tool for a good reason.&lt;/p&gt;

&lt;p&gt;Regardless, I thought this post would prove useful to others who are in a codebase that uses ModelMapper, and are running into the same kinds of issues.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://modelmapper.org/"&gt;ModelMapper&lt;/a&gt; - The official ModelMapper website.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://stackoverflow.com/a/44534173"&gt;Excellent StackOverflow answer&lt;/a&gt; - I saw this great answer, which prompted me to dig in deeper to get more understanding about ModelMapper’s inner workings.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>java</category>
      <category>modelmapper</category>
    </item>
  </channel>
</rss>
