<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://bridgetownrb.com/" version="2.2.2">Bridgetown</generator><link href="/feed/flag_shih_tzu.xml" rel="self" type="application/atom+xml" /><link href="/" rel="alternate" type="text/html" /><updated>2026-11-07T09:27:58+00:00</updated><id>/feed/flag_shih_tzu.xml</id><title type="html">Peter Boling | Flag_shih_tzu</title><subtitle>Yet Another Paradigm by Peter Boling, featuring technical blog posts about Ruby, JavaScript, TypeScript, Go, Python, DevOps, and various open source projects. Ramblings, mumblings, cv/resume, technical blog, and documentation for many popular, and unpopular, RubyGems and other FLOSS projects, including oauth2, omniauth-identity, sanitize_email, debug_logging, flag_shih_tzu, gem_bench, etc. Semi-lifely state-of-the-petris updates.</subtitle><entry><title type="html">Introducing flag_shih_tzu</title><link href="/flag_shih_tzu/introducing-flag_shih_tzu/" rel="alternate" type="text/html" title="Introducing flag_shih_tzu" /><published>2011-03-09T00:00:00+00:00</published><updated>2011-03-09T00:00:00+00:00</updated><id>repo://flag_shih_tzu.collection/_flag_shih_tzu/intro.md</id><content type="html" xml:base="/flag_shih_tzu/introducing-flag_shih_tzu/">&lt;p&gt;[![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate on Polar][🖇polar-img]][🖇polar] [![Donate to my FLOSS or refugee efforts at ko-fi.com][🖇kofi-img]][🖇kofi] [![Donate to my FLOSS or refugee efforts using Patreon][🖇patreon-img]][🖇patreon]&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;getting-started&quot;&gt;Getting Started&lt;/h3&gt;

&lt;p&gt;For more information and detailed examples, please visit the &lt;a href=&quot;https://github.com/galtzo-floss/flag_shih_tzu&quot;&gt;documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;supporting-this-project&quot;&gt;Supporting this Project&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://opencollective.com/galtzo-floss&quot;&gt;OpenCollective&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://gitlab.com/galtzo-floss/flag_shih_tzu&quot;&gt;GitLab&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://codeberg.org/galtzo-floss/flag_shih_tzu&quot;&gt;Codeberg&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://git.sr.ht/~galtzo/flag_shih_tzu&quot;&gt;SourceHut&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><author><name></name></author><category term="introduction" /><category term="flag_shih_tzu" /></entry><entry><title type="html">Maintaining flag_shih_tzu</title><link href="/flag_shih_tzu/maintaining-flag_shih_tzu/" rel="alternate" type="text/html" title="Maintaining flag_shih_tzu" /><published>2013-08-06T19:30:16+00:00</published><updated>2013-08-06T19:30:16+00:00</updated><id>repo://flag_shih_tzu.collection/_flag_shih_tzu/2013-08-06-intro.md</id><content type="html" xml:base="/flag_shih_tzu/maintaining-flag_shih_tzu/">&lt;h2 id=&quot;bit-fields-for-active-record&quot;&gt;Bit Fields for Active Record&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/pboling/flag_shih_tzu&quot;&gt;&lt;img src=&quot;https://img.shields.io/gem/rt/flag_shih_tzu.svg&quot; alt=&quot;Total Downloads&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;https://github.com/pboling/flag_shih_tzu&quot;&gt;&lt;img src=&quot;https://img.shields.io/gem/rd/flag_shih_tzu.svg&quot; alt=&quot;Downloads Today&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;https://codeclimate.com/github/pboling/flag_shih_tzu&quot;&gt;&lt;img src=&quot;https://img.shields.io/codeclimate/github/pboling/flag_shih_tzu.svg&quot; alt=&quot;Code Quality&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;https://github.com/pboling/flag_shih_tzu/network&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/forks/pboling/flag_shih_tzu.svg?style=social&quot; alt=&quot;Network&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;https://github.com/pboling/flag_shih_tzu/stargazers&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/pboling/flag_shih_tzu.svg?style=social&quot; alt=&quot;Stars&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;https://rubygems.org/gems/flag_shih_tzu&quot;&gt;&lt;img src=&quot;https://img.shields.io/gem/v/flag_shih_tzu.svg&quot; alt=&quot;Version&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;https://travis-ci.org/pboling/flag_shih_tzu&quot;&gt;&lt;img src=&quot;https://img.shields.io/travis/pboling/flag_shih_tzu.svg&quot; alt=&quot;Build&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://inch-ci.org/github/pboling/flag_shih_tzu&quot;&gt;&lt;img src=&quot;http://inch-ci.org/github/pboling/flag_shih_tzu.svg&quot; alt=&quot;Documentation&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;https://depfu.com/github/pboling/flag_shih_tzu?project_id=2685&quot;&gt;&lt;img src=&quot;https://badges.depfu.com/badges/f011a69cf2426f91483aaade580823ac/count.svg&quot; alt=&quot;Depfu&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;https://img.shields.io/gitter/room/pboling/flag_shih_tzu.svg&quot;&gt;&lt;img src=&quot;https://img.shields.io/gitter/room/pboling/flag_shih_tzu.svg&quot; alt=&quot;Chat&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;https://opensource.org/licenses/MIT&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/License-MIT-green.svg&quot; alt=&quot;License: MIT&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;what-is-a-bit-field&quot;&gt;What is a bit field?&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Bit_field&quot;&gt;https://en.wikipedia.org/wiki/Bit_field&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;what-is-a-bitwise-operation&quot;&gt;What is a bitwise operation?&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Bitwise_operation&quot;&gt;https://en.wikipedia.org/wiki/Bitwise_operation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;flag_shih_tzu&lt;/code&gt; supports both &lt;code class=&quot;highlighter-rouge&quot;&gt;:bit_operator&lt;/code&gt; and &lt;code class=&quot;highlighter-rouge&quot;&gt;:in_list&lt;/code&gt; query modes, but only &lt;code class=&quot;highlighter-rouge&quot;&gt;:in_list&lt;/code&gt; can will utilize a database index.&lt;/p&gt;

&lt;h3 id=&quot;what-does-it-look-like&quot;&gt;What does it look like?&lt;/h3&gt;

&lt;div class=&quot;language-ruby highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Lead&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;ActiveRecord&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Base&lt;/span&gt;
  &lt;span class=&quot;kp&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;FlagShihTzu&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;has_flags&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:warm_up_email_sent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:follow_up_call_made&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:final_email_sent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:appointment_scheduled&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:not_interested&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;# You can specify use any integer column to use for flags!&lt;/span&gt;
            &lt;span class=&quot;ss&quot;&gt;column: &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;actions_taken&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;ss&quot;&gt;flag_query_mode: :in_list&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# or :bit_operator&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# Flag values always default to false&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;lead&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Lead&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;warm_up_email_sent: &lt;/span&gt;&lt;span class=&quot;kp&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# Provides accessors with the same API as a regular boolean column:&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;lead&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;warm_up_email_sent&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# =&amp;gt; true&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;lead&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;actions_taken&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# =&amp;gt; 1&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;lead&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;follow_up_call_made?&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# =&amp;gt; false&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;lead&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;follow_up_call_made&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;true&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;lead&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;follow_up_call_made?&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# =&amp;gt; true&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;lead&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;actions_taken&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# =&amp;gt; 3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</content><author><name></name></author><category term="development" /><category term="ruby" /><category term="rails" /><category term="rubygems" /><category term="flag_shih_tzu" /><category term="database" /><category term="active_record" /></entry><entry><title type="html">Why Should You Use flag_shih_tzu</title><link href="/flag_shih_tzu/why-should-you-use-flag_shih_tzu/" rel="alternate" type="text/html" title="Why Should You Use flag_shih_tzu" /><published>2015-12-07T07:21:16+00:00</published><updated>2015-12-07T07:21:16+00:00</updated><id>repo://flag_shih_tzu.collection/_flag_shih_tzu/2015-12-07-why-use-flag_shih_tzu.md</id><content type="html" xml:base="/flag_shih_tzu/why-should-you-use-flag_shih_tzu/">&lt;h3 id=&quot;what-is-it&quot;&gt;What is it?&lt;/h3&gt;

&lt;p&gt;See &lt;a href=&quot;/flag_shih_tzu&quot;&gt;the what is it post.&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;why-should-you-use-it&quot;&gt;Why should you use it?&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;No migrations needed for new boolean attributes&lt;/li&gt;
  &lt;li&gt;Avoids ALTER TABLE when adding a new boolean field to a model, which can be important for very large tables&lt;/li&gt;
  &lt;li&gt;Only the one integer column needs to be indexed&lt;/li&gt;
  &lt;li&gt;The index is actually meaningful, unlike a boolean column index&lt;/li&gt;
  &lt;li&gt;Bitwise operations are fast, indexes are even faster, and you can use either one&lt;/li&gt;
  &lt;li&gt;Adds scopes to easily access collections of records with specific fields
    &lt;ul&gt;
      &lt;li&gt;Chained scopes to combine sql for different bit fields for maximum performance&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Provides condition builder methods for each bit field so you can construct your own custom SQL with the correct bit field values for the list.
    &lt;ul&gt;
      &lt;li&gt;Table alias option to allow it to work with tables aliased in a query (e.g. custom joins)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Has a &lt;code class=&quot;highlighter-rouge&quot;&gt;set_flag_sql&lt;/code&gt; method useful when doing mass updates without initializing object for each row.&lt;/li&gt;
  &lt;li&gt;Has a &lt;code class=&quot;highlighter-rouge&quot;&gt;update_flag!&lt;/code&gt; method useful when you want to set a flag, but avoid validations and callbacks on the record.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;why-is-it-better-than-the-alternative&quot;&gt;Why is it better than the alternative?&lt;/h3&gt;

&lt;p&gt;The competition is Michael Grosser’s &lt;a href=&quot;https://github.com/grosser/bitfields&quot;&gt;bitfields&lt;/a&gt;, and as always, it depends on your needs. Grosser’s library is less than half the size of &lt;code class=&quot;highlighter-rouge&quot;&gt;flag_shih_tzu&lt;/code&gt;, and has far fewer features, and a much smaller compatibility matrix.  Some of the differences are laid out below.&lt;/p&gt;

&lt;p&gt;For some things however, you only have one option.  If you are still on legacy Ruby or legacy Rails, or using jRuby, then use &lt;code class=&quot;highlighter-rouge&quot;&gt;flag_shih_tzu&lt;/code&gt;.  If you need multiple flag columns on a single model, use &lt;code class=&quot;highlighter-rouge&quot;&gt;flag_shih_tzu&lt;/code&gt;.  If you want to use it with form builders, it is slightly easier with &lt;code class=&quot;highlighter-rouge&quot;&gt;flag_shih_tzu&lt;/code&gt;.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;comparison&lt;/th&gt;
      &lt;th&gt;flag_shih_tzu&lt;/th&gt;
      &lt;th&gt;bitfields&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Age&lt;/td&gt;
      &lt;td&gt;Mar 2009&lt;/td&gt;
      &lt;td&gt;Mar 2010&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Legacy MRI Support&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/pboling/flag_shih_tzu/tree/0.2.X#prerequisites&quot; title=&quot;0.2.X branch&quot;&gt;1.8.7, 1.9.2&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;None&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Current MRI Support&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/pboling/flag_shih_tzu/tree/master#compatibility-matrix&quot; title=&quot;Compatability Matrix&quot;&gt;1.9.3, 2.0, 2.1, 2.2&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;1.9.3 2.0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Current jRuby Support&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/pboling/flag_shih_tzu/tree/master#compatibility-matrix&quot; title=&quot;Compatability Matrix&quot;&gt;jRuby-1.7, jRuby-9.0&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;None&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Legacy Rails Support&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/pboling/flag_shih_tzu/tree/0.2.X#prerequisites&quot; title=&quot;0.2.X branch&quot;&gt;2.3, 3.0, 3.1, 3.2&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;None&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Current Rails Support&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/pboling/flag_shih_tzu/tree/master#compatibility-matrix&quot; title=&quot;Compatability Matrix&quot;&gt;2.3, 3.0, 3.1, 3.2, 4.0, 4.1, 4.2&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;3.2, 4.0, 4.1, 4.2&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Stars&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/pboling/flag_shih_tzu/stargazers&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/pboling/flag_shih_tzu.svg?style=social&quot; alt=&quot;Stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/grosser/bitfields/stargazers&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/stars/grosser/bitfields.svg?style=social&quot; alt=&quot;Stars&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Forks&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/pboling/flag_shih_tzu/network&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/forks/pboling/flag_shih_tzu.svg?style=social&quot; alt=&quot;Network&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/grosser/bitfields/network&quot;&gt;&lt;img src=&quot;https://img.shields.io/github/forks/grosser/bitfields.svg?style=social&quot; alt=&quot;Network&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Downloads (All-time)&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/pboling/flag_shih_tzu&quot;&gt;&lt;img src=&quot;https://img.shields.io/gem/rt/flag_shih_tzu.svg&quot; alt=&quot;Total Downloads&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/grosser/bitfields&quot;&gt;&lt;img src=&quot;https://img.shields.io/gem/rt/bitfields.svg&quot; alt=&quot;Total Downloads&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Downloads (Today)&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/pboling/flag_shih_tzu&quot;&gt;&lt;img src=&quot;https://img.shields.io/gem/rd/flag_shih_tzu.svg&quot; alt=&quot;Downloads Today&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/grosser/bitfields&quot;&gt;&lt;img src=&quot;https://img.shields.io/gem/rd/bitfields.svg&quot; alt=&quot;Downloads Today&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Code Quality&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://codeclimate.com/github/pboling/flag_shih_tzu&quot;&gt;&lt;img src=&quot;https://img.shields.io/codeclimate/github/pboling/flag_shih_tzu.svg&quot; alt=&quot;Code Quality&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://codeclimate.com/github/grosser/bitfields&quot;&gt;&lt;img src=&quot;https://img.shields.io/codeclimate/github/grosser/bitfields.svg&quot; alt=&quot;Code Quality&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Build&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://travis-ci.org/pboling/flag_shih_tzu&quot;&gt;&lt;img src=&quot;https://img.shields.io/travis/pboling/flag_shih_tzu.svg&quot; alt=&quot;Build&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://travis-ci.org/grosser/bitfields&quot;&gt;&lt;img src=&quot;https://img.shields.io/travis/grosser/bitfields.svg&quot; alt=&quot;Build&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Documentation&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;http://inch-ci.org/github/pboling/flag_shih_tzu&quot;&gt;&lt;img src=&quot;http://inch-ci.org/github/pboling/flag_shih_tzu.svg&quot; alt=&quot;Documentation&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;http://inch-ci.org/github/grosser/bitfields&quot;&gt;&lt;img src=&quot;http://inch-ci.org/github/grosser/bitfields.svg&quot; alt=&quot;Documentation&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Dependency Status&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://depfu.com/github/pboling/flag_shih_tzu?project_id=2685&quot;&gt;&lt;img src=&quot;https://badges.depfu.com/badges/f011a69cf2426f91483aaade580823ac/count.svg&quot; alt=&quot;Depfu&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;Unknown&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Custom Flag Column Name&lt;/td&gt;
      &lt;td&gt;Yes&lt;/td&gt;
      &lt;td&gt;Yes&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Multiple Flag Columns per Model&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/pboling/flag_shih_tzu#using-a-custom-column-name&quot;&gt;Yes&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Has analog &lt;a href=&quot;http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-update_column&quot;&gt;to &lt;code class=&quot;highlighter-rouge&quot;&gt;update_column&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/pboling/flag_shih_tzu/tree/master#callbacks-and-validations&quot; title=&quot;update_flag!&quot;&gt;Yes&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Built-in use &lt;a href=&quot;http://api.rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-update_all&quot; title=&quot;ActiveRecord::Relation&quot;&gt;with &lt;code class=&quot;highlighter-rouge&quot;&gt;update_all&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/pboling/flag_shih_tzu#updating-flag-column-by-raw-sql&quot; title=&quot;set_flag_sql&quot;&gt;Yes&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/grosser/bitfields/blob/master/lib/bitfields.rb#L62&quot; title=&quot;set_bitfield_sql&quot;&gt;Yes&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Built-in use &lt;a href=&quot;https://github.com/plataformatec/simple_form#usage&quot; title=&quot;SimpleForm or Rails&quot;&gt;with form builders&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/pboling/flag_shih_tzu/blob/master/lib/flag_shih_tzu.rb#L544&quot; title=&quot;as_flag_collection&quot;&gt;Yes&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Built-in Validator&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/pboling/flag_shih_tzu/blob/master/lib/flag_shih_tzu/validators.rb#L37&quot; title=&quot;validated_presence_of_flags&quot;&gt;Yes&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;No&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Change Tracking &lt;code class=&quot;highlighter-rouge&quot;&gt;_was&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;No&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/grosser/bitfields/blob/master/lib/bitfields.rb#L87&quot;&gt;Yes&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Change Tracking &lt;code class=&quot;highlighter-rouge&quot;&gt;_changed?&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/pboling/flag_shih_tzu/blob/master/lib/flag_shih_tzu.rb#L105&quot;&gt;Yes&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/grosser/bitfields/blob/master/lib/bitfields.rb#L88&quot;&gt;Yes&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Change Tracking &lt;code class=&quot;highlighter-rouge&quot;&gt;_change&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;No&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/grosser/bitfields/blob/master/lib/bitfields.rb#L89&quot;&gt;Yes&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Scopes Optional&lt;/td&gt;
      &lt;td&gt;Yes&lt;/td&gt;
      &lt;td&gt;Yes&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;</content><author><name></name></author><category term="development" /><category term="ruby" /><category term="rails" /><category term="rubygems" /><category term="flag_shih_tzu" /><category term="database" /><category term="active_record" /></entry><entry><title type="html">Efficient Boolean Flags with flag_shih_tzu</title><link href="/flag_shih_tzu/efficient-boolean-flags-with-flag_shih_tzu/" rel="alternate" type="text/html" title="Efficient Boolean Flags with flag_shih_tzu" /><published>2024-10-02T13:45:00+00:00</published><updated>2024-10-02T13:45:00+00:00</updated><id>repo://flag_shih_tzu.collection/_flag_shih_tzu/2024-10-02-efficient-boolean-flags.md</id><content type="html" xml:base="/flag_shih_tzu/efficient-boolean-flags-with-flag_shih_tzu/">&lt;p&gt;Store multiple boolean flags efficiently in a single integer column with flag_shih_tzu.&lt;/p&gt;

&lt;h2 id=&quot;why-use-bit-flags&quot;&gt;Why Use Bit Flags?&lt;/h2&gt;

&lt;p&gt;Instead of creating multiple boolean columns, store all flags in one integer:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Save database space&lt;/li&gt;
  &lt;li&gt;Faster queries&lt;/li&gt;
  &lt;li&gt;Cleaner schema&lt;/li&gt;
  &lt;li&gt;Better performance&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;setup&quot;&gt;Setup&lt;/h2&gt;

&lt;p&gt;Add to your Gemfile:&lt;/p&gt;

&lt;div class=&quot;language-ruby highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;gem&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;flag_shih_tzu&apos;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;define-flags&quot;&gt;Define Flags&lt;/h2&gt;

&lt;div class=&quot;language-ruby highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;User&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;ActiveRecord&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Base&lt;/span&gt;
  &lt;span class=&quot;kp&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;FlagShihTzu&lt;/span&gt;
  
  &lt;span class=&quot;n&quot;&gt;has_flags&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:active&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:admin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:verified&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:premium&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;ss&quot;&gt;column: &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;flags&apos;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;usage&quot;&gt;Usage&lt;/h2&gt;

&lt;div class=&quot;language-ruby highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;user&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;new&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;active&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;true&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;admin&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;true&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;save&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# Query users&lt;/span&gt;
&lt;span class=&quot;no&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;active&lt;/span&gt;
&lt;span class=&quot;no&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;admin&lt;/span&gt;
&lt;span class=&quot;no&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;not_verified&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# Check flags&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;active?&lt;/span&gt;      &lt;span class=&quot;c1&quot;&gt;# =&amp;gt; true&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;verified?&lt;/span&gt;    &lt;span class=&quot;c1&quot;&gt;# =&amp;gt; false&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# Set multiple flags&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;flags&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:active&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:verified&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:premium&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;database-migration&quot;&gt;Database Migration&lt;/h2&gt;

&lt;div class=&quot;language-ruby highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;AddFlagsToUsers&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;ActiveRecord&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Migration&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;7.0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;change&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;add_column&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:users&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:flags&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:integer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;default: &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;null: &lt;/span&gt;&lt;span class=&quot;kp&quot;&gt;false&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;advanced-features&quot;&gt;Advanced Features&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Named scopes for each flag&lt;/li&gt;
  &lt;li&gt;Flag combinations&lt;/li&gt;
  &lt;li&gt;Default values&lt;/li&gt;
  &lt;li&gt;SQL optimizations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Perfect for managing user permissions and settings!&lt;/p&gt;</content><author><name></name></author></entry><entry><title type="html">flag_shih_tzu v0.3.19 released!</title><link href="/flag_shih_tzu/flag_shih_tzu-v0.3.19-released!/" rel="alternate" type="text/html" title="flag_shih_tzu v0.3.19 released!" /><published>2025-06-01T00:41:30+00:00</published><updated>2025-06-01T00:41:30+00:00</updated><id>repo://flag_shih_tzu.collection/_flag_shih_tzu/releases/2025-06-01-flag_shih_tzu-v0.3.19.md</id><content type="html" xml:base="/flag_shih_tzu/flag_shih_tzu-v0.3.19-released!/">&lt;p&gt;&lt;strong&gt;Full Changelog&lt;/strong&gt;: https://github.com/pboling/flag_shih_tzu/compare/v0.3.18…v0.3.19&lt;/p&gt;</content><author><name></name></author><category term="release" /><category term="flag_shih_tzu" /><category term="v0.3.19" /></entry><entry><title type="html">flag_shih_tzu 1.0.0: Tri-state and multi-bit flags</title><link href="/flag_shih_tzu/flag_shih_tzu-1.0.0-tri-state-and-multi-bit-flags/" rel="alternate" type="text/html" title="flag_shih_tzu 1.0.0: Tri-state and multi-bit flags" /><published>2026-05-26T00:00:00+00:00</published><updated>2026-05-26T00:00:00+00:00</updated><id>repo://flag_shih_tzu.collection/_flag_shih_tzu/releases/2026-05-26-flag_shih_tzu-1.0.0-release-notes.md</id><content type="html" xml:base="/flag_shih_tzu/flag_shih_tzu-1.0.0-tri-state-and-multi-bit-flags/">&lt;p&gt;Version 1.0.0 adds tri-state values and configurable bit widths and encoders, extending flags beyond true and false. Array and hash assignment also let callers update named flags without calculating packed integers themselves.&lt;/p&gt;

&lt;p&gt;Read the &lt;a href=&quot;https://github.com/galtzo-floss/flag_shih_tzu/releases/tag/v1.0.0&quot;&gt;upstream release notes&lt;/a&gt; for the complete changes and see the &lt;a href=&quot;https://github.com/galtzo-floss/flag_shih_tzu&quot;&gt;project repository&lt;/a&gt; for usage and installation.&lt;/p&gt;</content><author><name></name></author><category term="release" /><category term="flag_shih_tzu" /><category term="1.0.0" /></entry><entry><title type="html">flag_shih_tzu v1.0.6 released!</title><link href="/flag_shih_tzu/flag_shih_tzu-v1.0.6-released!/" rel="alternate" type="text/html" title="flag_shih_tzu v1.0.6 released!" /><published>2026-09-12T01:55:47+00:00</published><updated>2026-09-12T01:55:47+00:00</updated><id>repo://flag_shih_tzu.collection/_flag_shih_tzu/releases/2026-09-12-flag_shih_tzu-v1.0.6.md</id><content type="html" xml:base="/flag_shih_tzu/flag_shih_tzu-v1.0.6-released!/">&lt;h2 id=&quot;106---2026-09-12&quot;&gt;&lt;a href=&quot;https://github.com/galtzo-floss/flag_shih_tzu/compare/v1.0.6&quot;&gt;1.0.6&lt;/a&gt; - 2026-09-12&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;TAG: &lt;a href=&quot;https://github.com/galtzo-floss/flag_shih_tzu/releases/tag/v1.0.6&quot;&gt;v1.0.6&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;COVERAGE: N/A&lt;/li&gt;
  &lt;li&gt;BRANCH COVERAGE: N/A&lt;/li&gt;
  &lt;li&gt;0.00% documented&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;changed&quot;&gt;Changed&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;kettle-jem-template-20260801-001 - Generated README gem dashboard links now
use ClickGems instead of BestGems.&lt;/li&gt;
  &lt;li&gt;[kc] kettle-jem/prepare: updated 8 project files:
    &lt;ul&gt;
      &lt;li&gt;dependencies (8)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;[kc] kettle-jem/template: updated 4 project files:
    &lt;ul&gt;
      &lt;li&gt;code and tests (1)&lt;/li&gt;
      &lt;li&gt;dependencies (2)&lt;/li&gt;
      &lt;li&gt;other (1)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;fixed&quot;&gt;Fixed&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;kettle-jem-template-20260801-002 - Generated RSpec helpers now normalize
managed configuration block bindings structurally, preventing mixed block
parameter names from producing invalid configuration after a merge.&lt;/li&gt;
  &lt;li&gt;kettle-jem-template-20260801-003 - Generated project metadata and
documentation now normalize configured underscore hostnames to valid
hyphenated hostnames.&lt;/li&gt;
  &lt;li&gt;kettle-jem-template-20260801-004 - Generated organization README logos now
use GitHub’s stable organization avatar endpoint instead of assuming a
matching Galtzo-hosted asset exists.&lt;/li&gt;
  &lt;li&gt;kettle-jem-template-20260802-001 - Devcontainer JSON files now merge as JSONC,
preserving comments and trailing commas during template updates.&lt;/li&gt;
  &lt;li&gt;Restore the ActiveRecord test dependencies required by the default development bundle.&lt;/li&gt;
  &lt;li&gt;Restore README link definitions required by the pre-release Markdown reference validator.&lt;/li&gt;
  &lt;li&gt;Restore the ActiveRecord test bundle removed by an earlier template pass.
&lt;a href=&quot;https://github.com/galtzo-floss/flag_shih_tzu/compare/v1.0.6&quot;&gt;1.0.6&lt;/a&gt;: https://github.com/galtzo-floss/flag_shih_tzu/compare/v1.0.5…v1.0.6
&lt;a href=&quot;https://github.com/galtzo-floss/flag_shih_tzu/releases/tag/v1.0.6&quot;&gt;1.0.6t&lt;/a&gt;: https://github.com/galtzo-floss/flag_shih_tzu/releases/tag/v1.0.6
Community support 👉️ [![Ruby Users Forum][✉️ruby-forum-img]][✉️ruby-forum] &lt;a href=&quot;https://discord.gg/3qme4XHNKN&quot;&gt;&lt;img src=&quot;https://img.shields.io/discord/1373797679469170758?style=flat&quot; alt=&quot;Live Chat on Discord&quot; /&gt;&lt;/a&gt;
Many paths lead to being a sponsor or a backer of this project. Are you on such a path?
&lt;a href=&quot;https://opencollective.com/galtzo-floss#backer&quot;&gt;&lt;img src=&quot;https://img.shields.io/opencollective/backers/galtzo-floss?style=flat&quot; alt=&quot;OpenCollective Backers&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://opencollective.com/galtzo-floss#sponsor&quot;&gt;&lt;img src=&quot;https://img.shields.io/opencollective/sponsors/galtzo-floss?style=flat&quot; alt=&quot;OpenCollective Sponsors&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/sponsors/pboling&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/Sponsor_Me!-pboling.svg?style=social&amp;amp;logo=github&quot; alt=&quot;Sponsor Me on Github&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://liberapay.com/pboling/donate&quot;&gt;&lt;img src=&quot;https://img.shields.io/liberapay/goal/pboling.svg?logo=liberapay&amp;amp;color=a51611&amp;amp;style=flat&quot; alt=&quot;Liberapay Goal Progress&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://www.paypal.com/paypalme/peterboling&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/donate-paypal-a51611.svg?style=flat&amp;amp;logo=paypal&quot; alt=&quot;Donate on PayPal&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;https://www.buymeacoffee.com/pboling&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/buy_me_a_coffee-%E2%9C%93-a51611.svg?style=flat&quot; alt=&quot;Buy me a coffee&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://ko-fi.com/O5O86SNP4&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/ko--fi-%E2%9C%93-a51611.svg?style=flat&quot; alt=&quot;Donate to my FLOSS efforts at ko-fi.com&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;https://img.shields.io/liberapay/goal/pboling.svg?logo=liberapay&amp;amp;color=a51611&amp;amp;style=flat&quot;&gt;⛳liberapay-img&lt;/a&gt;: https://img.shields.io/liberapay/goal/pboling.svg?logo=liberapay&amp;amp;color=a51611&amp;amp;style=flat
&lt;a href=&quot;https://liberapay.com/pboling/donate&quot;&gt;⛳liberapay&lt;/a&gt;: https://liberapay.com/pboling/donate
&lt;a href=&quot;https://opencollective.com/galtzo-floss#backer&quot;&gt;🖇osc-backers&lt;/a&gt;: https://opencollective.com/galtzo-floss#backer
&lt;a href=&quot;https://img.shields.io/opencollective/backers/galtzo-floss?style=flat&quot;&gt;🖇osc-backers-i&lt;/a&gt;: https://opencollective.com/galtzo-floss/backers/badge.svg?style=flat
&lt;a href=&quot;https://opencollective.com/galtzo-floss#sponsor&quot;&gt;🖇osc-sponsors&lt;/a&gt;: https://opencollective.com/galtzo-floss#sponsor
&lt;a href=&quot;https://img.shields.io/opencollective/sponsors/galtzo-floss?style=flat&quot;&gt;🖇osc-sponsors-i&lt;/a&gt;: https://opencollective.com/galtzo-floss/sponsors/badge.svg?style=flat
&lt;a href=&quot;https://img.shields.io/badge/Sponsor_Me!-pboling.svg?style=social&amp;amp;logo=github&quot;&gt;🖇sponsor-img&lt;/a&gt;: https://img.shields.io/badge/Sponsor_Me!-pboling.svg?style=social&amp;amp;logo=github
&lt;a href=&quot;https://github.com/sponsors/pboling&quot;&gt;🖇sponsor&lt;/a&gt;: https://github.com/sponsors/pboling
&lt;a href=&quot;https://img.shields.io/badge/ko--fi-%E2%9C%93-a51611.svg?style=flat&quot;&gt;🖇kofi-img&lt;/a&gt;: https://img.shields.io/badge/ko–fi-%E2%9C%93-a51611.svg?style=flat
&lt;a href=&quot;https://ko-fi.com/O5O86SNP4&quot;&gt;🖇kofi&lt;/a&gt;: https://ko-fi.com/pboling
&lt;a href=&quot;https://img.shields.io/badge/buy_me_a_coffee-%E2%9C%93-a51611.svg?style=flat&quot;&gt;🖇buyme-small-img&lt;/a&gt;: https://img.shields.io/badge/buy_me_a_coffee-%E2%9C%93-a51611.svg?style=flat
&lt;a href=&quot;https://www.buymeacoffee.com/pboling&quot;&gt;🖇buyme&lt;/a&gt;: https://www.buymeacoffee.com/pboling
&lt;a href=&quot;https://img.shields.io/badge/donate-paypal-a51611.svg?style=flat&amp;amp;logo=paypal&quot;&gt;🖇paypal-img&lt;/a&gt;: https://img.shields.io/badge/donate-paypal-a51611.svg?style=flat&amp;amp;logo=paypal
&lt;a href=&quot;https://www.paypal.com/paypalme/peterboling&quot;&gt;🖇paypal&lt;/a&gt;: https://www.paypal.com/paypalme/peterboling
&lt;a href=&quot;https://discord.gg/3qme4XHNKN&quot;&gt;✉️discord-invite&lt;/a&gt;: https://discord.gg/3qme4XHNKN
&lt;a href=&quot;https://img.shields.io/discord/1373797679469170758?style=flat&quot;&gt;✉️discord-invite-img&lt;/a&gt;: https://img.shields.io/discord/1373797679469170758?style=flat
[✉️ruby-forum]: https://www.rubyforum.org/tag/flag-shih-tzu
[✉️ruby-forum-img]: https://img.shields.io/discourse/topics?server=https%3A%2F%2Fwww.rubyforum.org&amp;amp;style=flat&amp;amp;logo=discourse&amp;amp;label=Ruby%20Users%20Forum&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Official Discord 👉️ &lt;a href=&quot;https://discord.gg/3qme4XHNKN&quot;&gt;&lt;img src=&quot;https://img.shields.io/discord/1373797679469170758?style=flat&quot; alt=&quot;Live Chat on Discord&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Many paths lead to being a sponsor or a backer of this project. Are you on such a path?&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://opencollective.com/galtzo-floss#backer&quot;&gt;&lt;img src=&quot;https://img.shields.io/opencollective/backers/galtzo-floss?style=flat&quot; alt=&quot;OpenCollective Backers&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://opencollective.com/galtzo-floss#sponsor&quot;&gt;&lt;img src=&quot;https://img.shields.io/opencollective/sponsors/galtzo-floss?style=flat&quot; alt=&quot;OpenCollective Sponsors&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://github.com/sponsors/pboling&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/Sponsor_Me!-pboling.svg?style=social&amp;amp;logo=github&quot; alt=&quot;Sponsor Me on Github&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://liberapay.com/pboling/donate&quot;&gt;&lt;img src=&quot;https://img.shields.io/liberapay/goal/pboling.svg?logo=liberapay&amp;amp;color=a51611&amp;amp;style=flat&quot; alt=&quot;Liberapay Goal Progress&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://www.paypal.com/paypalme/peterboling&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/donate-paypal-a51611.svg?style=flat&amp;amp;logo=paypal&quot; alt=&quot;Donate on PayPal&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.buymeacoffee.com/pboling&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/buy_me_a_coffee-%E2%9C%93-a51611.svg?style=flat&quot; alt=&quot;Buy me a coffee&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://polar.sh/pboling&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/polar-donate-a51611.svg?style=flat&quot; alt=&quot;Donate on Polar&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://ko-fi.com/O5O86SNP4&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/ko--fi-%E2%9C%93-a51611.svg?style=flat&quot; alt=&quot;Donate to my FLOSS efforts at ko-fi.com&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;https://patreon.com/galtzo&quot;&gt;&lt;img src=&quot;https://img.shields.io/badge/patreon-donate-a51611.svg?style=flat&quot; alt=&quot;Donate to my FLOSS efforts using Patreon&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content><author><name></name></author><category term="release" /><category term="flag_shih_tzu" /><category term="v1.0.6" /></entry></feed>