ariadne_view_components 0.0.93.1 → 0.0.94
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -0
- data/README.md +13 -4
- data/app/assets/javascripts/ariadne_view_components.js +14 -14
- data/app/assets/javascripts/ariadne_view_components.js.br +0 -0
- data/app/assets/javascripts/ariadne_view_components.js.gz +0 -0
- data/app/assets/javascripts/ariadne_view_components.js.map +1 -1
- data/app/assets/stylesheets/ariadne_view_components.css +1 -1
- data/app/assets/stylesheets/ariadne_view_components.css.br +0 -0
- data/app/assets/stylesheets/ariadne_view_components.css.gz +0 -0
- data/app/components/ariadne/base_component.rb +25 -22
- data/app/components/ariadne/behaviors/tooltipable.rb +12 -12
- data/app/components/ariadne/form/checkbox/component.rb +2 -2
- data/app/components/ariadne/form/group/component.rb +1 -1
- data/app/components/ariadne/form/radio_button/component.rb +2 -2
- data/app/components/ariadne/form/select/component.rb +1 -1
- data/app/components/ariadne/form/text_field/component.html.erb +2 -2
- data/app/components/ariadne/form/text_field/component.rb +14 -7
- data/app/components/ariadne/form/toggle/component.rb +2 -2
- data/app/components/ariadne/form/toggle_group/component.rb +1 -1
- data/app/components/ariadne/form/toggle_group/option/component.rb +1 -1
- data/app/components/ariadne/layout/grid/component.rb +1 -1
- data/app/components/ariadne/layout/grid/item/component.rb +2 -2
- data/app/components/ariadne/layout/label_block/component.rb +1 -1
- data/app/components/ariadne/layout/narrow/component.rb +1 -1
- data/app/components/ariadne/ui/accordion/component.rb +3 -1
- data/app/components/ariadne/ui/accordion/item/component.html.erb +10 -10
- data/app/components/ariadne/ui/accordion/item/component.rb +12 -3
- data/app/components/ariadne/ui/avatar/component.html.erb +9 -7
- data/app/components/ariadne/ui/avatar/component.rb +55 -7
- data/app/components/ariadne/ui/badge/component.rb +35 -16
- data/app/components/ariadne/ui/banner/component.html.erb +23 -0
- data/app/components/ariadne/ui/banner/component.rb +226 -0
- data/app/components/ariadne/ui/banner/component.ts +46 -0
- data/app/components/ariadne/ui/blankslate/component.html.erb +2 -2
- data/app/components/ariadne/ui/blankslate/component.rb +12 -1
- data/app/components/ariadne/ui/button/component.rb +35 -24
- data/app/components/ariadne/ui/card/body/component.rb +1 -1
- data/app/components/ariadne/ui/card/component.rb +11 -7
- data/app/components/ariadne/ui/card/footer/component.rb +1 -1
- data/app/components/ariadne/ui/card/header/component.html.erb +2 -2
- data/app/components/ariadne/ui/card/header/component.rb +25 -16
- data/app/components/ariadne/ui/clipboard_copy/component.html.erb +1 -0
- data/app/components/ariadne/ui/clipboard_copy/component.rb +17 -21
- data/app/components/ariadne/ui/clipboard_copy/component.ts +15 -0
- data/app/components/ariadne/ui/color_dot/component.html.erb +5 -5
- data/app/components/ariadne/ui/color_dot/component.rb +19 -4
- data/app/components/ariadne/ui/combobox/component.html.erb +1 -1
- data/app/components/ariadne/ui/combobox/component.rb +54 -23
- data/app/components/ariadne/ui/combobox/component.ts +2 -0
- data/app/components/ariadne/ui/dialog/body/component.html.erb +3 -0
- data/app/components/ariadne/ui/dialog/body/component.rb +28 -0
- data/app/components/ariadne/ui/dialog/component.html.erb +25 -24
- data/app/components/ariadne/ui/dialog/component.rb +87 -18
- data/app/components/ariadne/ui/dialog/component.ts +5 -1
- data/app/components/ariadne/ui/dialog/footer/component.html.erb +3 -0
- data/app/components/ariadne/ui/dialog/footer/component.rb +34 -0
- data/app/components/ariadne/ui/heroicon/component.rb +21 -21
- data/app/components/ariadne/ui/image/component.rb +11 -23
- data/app/components/ariadne/ui/link/component.html.erb +1 -3
- data/app/components/ariadne/ui/link/component.rb +17 -4
- data/app/components/ariadne/ui/list/component.html.erb +5 -9
- data/app/components/ariadne/ui/list/component.rb +31 -7
- data/app/components/ariadne/ui/list/item/component.rb +6 -5
- data/app/components/ariadne/ui/pagination/component.rb +1 -2
- data/app/components/ariadne/ui/popover/component.html.erb +1 -1
- data/app/components/ariadne/ui/popover/component.rb +31 -26
- data/app/components/ariadne/ui/relative_time/component.html.erb +1 -0
- data/app/components/ariadne/ui/{time_ago → relative_time}/component.rb +15 -15
- data/app/components/ariadne/ui/{time_ago → relative_time}/component.ts +1 -1
- data/app/components/ariadne/ui/shortcut/component.html.erb +0 -1
- data/app/components/ariadne/ui/shortcut/component.rb +31 -5
- data/app/components/ariadne/ui/shortcut/component.ts +1 -1
- data/app/components/ariadne/ui/skeleton/component.rb +2 -8
- data/app/components/ariadne/ui/stats_panel/component.html.erb +3 -3
- data/app/components/ariadne/ui/stats_panel/component.rb +25 -1
- data/app/components/ariadne/ui/stats_panel/item/component.html.erb +3 -3
- data/app/components/ariadne/ui/stats_panel/item/component.rb +6 -6
- data/app/components/ariadne/ui/table/cell/component.rb +1 -1
- data/app/components/ariadne/ui/table/row/component.rb +1 -1
- data/app/components/ariadne/ui/typography/component.rb +3 -1
- data/app/frontend/controllers/tooltip_controller.ts +8 -3
- data/app/frontend/stylesheets/ariadne_view_components.css +1 -0
- data/app/frontend/stylesheets/theme.css +88 -0
- data/app/frontend/utils/createController.ts +9 -0
- data/app/helpers/ariadne/color_helper.rb +158 -0
- data/app/helpers/ariadne/form_helper.rb +1 -0
- data/app/helpers/ariadne/size_helper.rb +7 -0
- data/app/lib/ariadne/attributes_helper.rb +4 -4
- data/app/lib/ariadne/view_component/style_variants.rb +1 -1
- data/app/lib/ariadne/view_helper.rb +0 -6
- data/lib/ariadne/accessibility.rb +64 -0
- data/lib/ariadne/forms/dsl/form_object.rb +5 -1
- data/lib/ariadne/forms/dsl/input.rb +1 -1
- data/lib/ariadne/static/generate_arguments.rb +54 -0
- data/lib/ariadne/static/generate_audited_at.rb +17 -0
- data/lib/ariadne/static/generate_constants.rb +19 -0
- data/lib/ariadne/static/generate_previews.rb +53 -0
- data/lib/ariadne/static/generate_statuses.rb +17 -0
- data/lib/ariadne/static/generate_structure.rb +279 -0
- data/lib/ariadne/static.rb +68 -0
- data/lib/ariadne/view_components/constants.rb +2 -2
- data/lib/ariadne/view_components/version.rb +1 -1
- data/lib/ariadne/view_components.rb +0 -51
- data/lib/ariadne/yard/component_manifest.rb +81 -81
- data/lib/ariadne/yard/component_ref.rb +1 -1
- data/lib/ariadne/yard/docs_helper.rb +24 -16
- data/lib/ariadne/yard/dry_initializer/common_handler.rb +103 -0
- data/lib/ariadne/yard/dry_initializer/option_handler.rb +38 -0
- data/lib/ariadne/yard/dry_initializer/param_handler.rb +57 -0
- data/lib/ariadne/yard/registry.rb +2 -5
- data/lib/ariadne/yard/{info_arch_docs_helper.rb → structure_docs_helper.rb} +5 -5
- data/lib/ariadne/yard.rb +20 -8
- data/lib/rubocop/config/default.yml +0 -3
- metadata +34 -37
- data/app/components/ariadne/behaviors/captionable.rb +0 -55
- data/app/components/ariadne/turbo/frame/component.html.erb +0 -3
- data/app/components/ariadne/turbo/frame/component.rb +0 -16
- data/app/components/ariadne/turbo/stream_action/component.html.erb +0 -4
- data/app/components/ariadne/turbo/stream_action/component.rb +0 -25
- data/app/components/ariadne/ui/data_table/component.html.erb +0 -1
- data/app/components/ariadne/ui/data_table/component.rb +0 -11
- data/app/components/ariadne/ui/flash/component.html.erb +0 -18
- data/app/components/ariadne/ui/flash/component.rb +0 -151
- data/app/components/ariadne/ui/flash/component.ts +0 -56
- data/app/components/ariadne/ui/overlay/component.html.erb +0 -12
- data/app/components/ariadne/ui/overlay/component.rb +0 -54
- data/app/components/ariadne/ui/overlay/component.ts +0 -92
- data/app/components/ariadne/ui/time_ago/component.html.erb +0 -1
- data/lib/ariadne/view_components/commands.rb +0 -90
- data/lib/ariadne/view_components/statuses.rb +0 -14
- data/lib/ariadne/view_components/upstream.rb +0 -19
- data/lib/ariadne/yard/lookbook_pages_backend.rb +0 -235
- data/lib/rubocop/cop/ariadne/no_tag_memoize.rb +0 -44
- data/static/arguments.yml +0 -879
- data/static/assets/view-components.svg +0 -18
- data/static/classes.yml +0 -211
- data/static/constants.json +0 -743
- data/static/statuses.json +0 -58
- data/static/tailwindcss.yml +0 -727
- /data/app/components/ariadne/ui/{time_ago → relative_time}/en.yml +0 -0
| @@ -1,235 +0,0 @@ | |
| 1 | 
            -
            # frozen_string_literal: true
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            # :nocov:
         | 
| 4 | 
            -
            module Ariadne
         | 
| 5 | 
            -
              module Yard
         | 
| 6 | 
            -
                # A single Lookbook page.
         | 
| 7 | 
            -
                class LookbookPage
         | 
| 8 | 
            -
                  include DocsHelper
         | 
| 9 | 
            -
             | 
| 10 | 
            -
                  PREVIEW_MAP = {
         | 
| 11 | 
            -
                    Ariadne::Alpha::TextField => [:single_text_field_form, :multi_text_field_form],
         | 
| 12 | 
            -
                    Ariadne::Alpha::TextArea => [],
         | 
| 13 | 
            -
                    Ariadne::Alpha::Select => [:select_form],
         | 
| 14 | 
            -
                    Ariadne::Alpha::MultiInput => [:multi_input_form],
         | 
| 15 | 
            -
                    Ariadne::Alpha::RadioButton => [:radio_button_with_nested_form],
         | 
| 16 | 
            -
                    Ariadne::Alpha::RadioButtonGroup => [:radio_button_group_form],
         | 
| 17 | 
            -
                    Ariadne::Alpha::CheckBox => [:check_box_with_nested_form],
         | 
| 18 | 
            -
                    Ariadne::Alpha::CheckBoxGroup => [:check_box_group_form],
         | 
| 19 | 
            -
                    Ariadne::Alpha::SubmitButton => [:submit_button_form],
         | 
| 20 | 
            -
                    Ariadne::Alpha::FormButton => [:submit_button_form],
         | 
| 21 | 
            -
                  }.freeze
         | 
| 22 | 
            -
             | 
| 23 | 
            -
                  attr_reader :component_ref, :backend, :docs
         | 
| 24 | 
            -
             | 
| 25 | 
            -
                  def initialize(component_ref, backend, docs)
         | 
| 26 | 
            -
                    @component_ref = component_ref
         | 
| 27 | 
            -
                    @backend = backend
         | 
| 28 | 
            -
                    @docs = docs
         | 
| 29 | 
            -
                  end
         | 
| 30 | 
            -
             | 
| 31 | 
            -
                  def page_id
         | 
| 32 | 
            -
                    @page_id ||= docs.short_name.dasherize.underscore.tap do |page_id|
         | 
| 33 | 
            -
                      page_id << "_input" unless page_id.end_with?("_input")
         | 
| 34 | 
            -
                    end
         | 
| 35 | 
            -
                  end
         | 
| 36 | 
            -
             | 
| 37 | 
            -
                  def generate
         | 
| 38 | 
            -
                    path = File.expand_path(
         | 
| 39 | 
            -
                      File.join(
         | 
| 40 | 
            -
                        "..",
         | 
| 41 | 
            -
                        "..",
         | 
| 42 | 
            -
                        "..",
         | 
| 43 | 
            -
                        "previews",
         | 
| 44 | 
            -
                        "pages",
         | 
| 45 | 
            -
                        "forms",
         | 
| 46 | 
            -
                        "inputs",
         | 
| 47 | 
            -
                        "#{docs.short_name.dasherize.underscore}.md.erb",
         | 
| 48 | 
            -
                      ),
         | 
| 49 | 
            -
                      __dir__,
         | 
| 50 | 
            -
                    )
         | 
| 51 | 
            -
             | 
| 52 | 
            -
                    docs.non_slot_methods.select do |mtd|
         | 
| 53 | 
            -
                      [component.name, "Ariadne::Forms::Dsl::InputMethods"].include?(mtd.parent.title)
         | 
| 54 | 
            -
                    end
         | 
| 55 | 
            -
             | 
| 56 | 
            -
                    preview_methods = PREVIEW_MAP[component]
         | 
| 57 | 
            -
                    preview_methods.map do |preview_method|
         | 
| 58 | 
            -
                      if Ariadne::FormsPreview.instance_methods.exclude?(preview_method)
         | 
| 59 | 
            -
                        raise "Preview '#{preview_method}' does not exist in Ariadne::FormsPreview"
         | 
| 60 | 
            -
                      end
         | 
| 61 | 
            -
                      # rubocop:enable Style/IfUnlessModifier
         | 
| 62 | 
            -
             | 
| 63 | 
            -
                      "<%= embed Ariadne::FormsPreview, #{preview_method.inspect} %>"
         | 
| 64 | 
            -
                    end
         | 
| 65 | 
            -
                    # rubocop:disable Security/Eval
         | 
| 66 | 
            -
                    File.open(path, "w") do |f|
         | 
| 67 | 
            -
                      f.write(eval(Erubi::Engine.new(<<~ERB, trim: true).src))
         | 
| 68 | 
            -
                        ---
         | 
| 69 | 
            -
                        title: <%= docs.title.underscore.titleize %>
         | 
| 70 | 
            -
                        id: <%= page_id %>
         | 
| 71 | 
            -
                        ---
         | 
| 72 | 
            -
             | 
| 73 | 
            -
                        <%= docs.base_docstring %>
         | 
| 74 | 
            -
             | 
| 75 | 
            -
                        ## Usage
         | 
| 76 | 
            -
             | 
| 77 | 
            -
                        ```ruby
         | 
| 78 | 
            -
                        <%= docs.tags(:form_usage).first.text %>
         | 
| 79 | 
            -
                        ```
         | 
| 80 | 
            -
             | 
| 81 | 
            -
                        <% specific_args = specific_args_from(docs.params) %>
         | 
| 82 | 
            -
                        <% unless specific_args.empty? %>
         | 
| 83 | 
            -
                        ## Arguments
         | 
| 84 | 
            -
             | 
| 85 | 
            -
                        <%= generate_args_table(specific_args) %>
         | 
| 86 | 
            -
                        <% end %>
         | 
| 87 | 
            -
             | 
| 88 | 
            -
                        ## Common arguments
         | 
| 89 | 
            -
             | 
| 90 | 
            -
                        <%= generate_args_table(common_args_from(docs.params)) %>
         | 
| 91 | 
            -
             | 
| 92 | 
            -
                        <% unless documented_methods.empty? %>
         | 
| 93 | 
            -
                        ## Methods
         | 
| 94 | 
            -
             | 
| 95 | 
            -
                          <% documented_methods.each do |method_docs| %>
         | 
| 96 | 
            -
                        ### `#<%= method_docs.signature.sub(/def /, "") %>`
         | 
| 97 | 
            -
             | 
| 98 | 
            -
                        <%= method_docs.base_docstring %>
         | 
| 99 | 
            -
             | 
| 100 | 
            -
                            <% param_tags = method_docs.tags(:param) %>
         | 
| 101 | 
            -
             | 
| 102 | 
            -
                            <% if param_tags.any? %>
         | 
| 103 | 
            -
             | 
| 104 | 
            -
                        <%= generate_args_table(param_tags) %>
         | 
| 105 | 
            -
                            <% end %>
         | 
| 106 | 
            -
                          <% end %>
         | 
| 107 | 
            -
                        <% end %>
         | 
| 108 | 
            -
             | 
| 109 | 
            -
                        <% unless preview_methods.empty? %>
         | 
| 110 | 
            -
                        ## Examples
         | 
| 111 | 
            -
             | 
| 112 | 
            -
                        <%= preview_erbs.join("\n") %>
         | 
| 113 | 
            -
                        <% end %>
         | 
| 114 | 
            -
                      ERB
         | 
| 115 | 
            -
                    end
         | 
| 116 | 
            -
                    # rubocop:enable Security/Eval
         | 
| 117 | 
            -
                  end
         | 
| 118 | 
            -
             | 
| 119 | 
            -
                  private
         | 
| 120 | 
            -
             | 
| 121 | 
            -
                  def registry
         | 
| 122 | 
            -
                    backend.registry
         | 
| 123 | 
            -
                  end
         | 
| 124 | 
            -
             | 
| 125 | 
            -
                  def generate_args_table(params)
         | 
| 126 | 
            -
                    rows = params.map do |tag|
         | 
| 127 | 
            -
                      description = backend.view_context.render(inline: tag.text.squish)
         | 
| 128 | 
            -
                      parts = [
         | 
| 129 | 
            -
                        "`#{tag.name}`",
         | 
| 130 | 
            -
                        tag.types.join(", "),
         | 
| 131 | 
            -
                        description,
         | 
| 132 | 
            -
                      ]
         | 
| 133 | 
            -
             | 
| 134 | 
            -
                      "| #{parts.join(" | ")} |"
         | 
| 135 | 
            -
                    end
         | 
| 136 | 
            -
             | 
| 137 | 
            -
                    <<~MARKDOWN
         | 
| 138 | 
            -
                      | Name | Type | Description |
         | 
| 139 | 
            -
                      | :- | :- | :- |
         | 
| 140 | 
            -
                      #{rows.join("\n")}
         | 
| 141 | 
            -
                    MARKDOWN
         | 
| 142 | 
            -
                  end
         | 
| 143 | 
            -
             | 
| 144 | 
            -
                  def common_args_from(params)
         | 
| 145 | 
            -
                    params.select { |param| common_form_input_argument_names.include?(param.name) }
         | 
| 146 | 
            -
                  end
         | 
| 147 | 
            -
             | 
| 148 | 
            -
                  def specific_args_from(params)
         | 
| 149 | 
            -
                    params.reject { |param| common_form_input_argument_names.include?(param.name) }
         | 
| 150 | 
            -
                  end
         | 
| 151 | 
            -
             | 
| 152 | 
            -
                  def common_form_input_argument_names
         | 
| 153 | 
            -
                    @common_form_input_argument_names ||= begin
         | 
| 154 | 
            -
                      macro = registry.yard_registry[".macro.form_input_arguments"]
         | 
| 155 | 
            -
                      parser = ::YARD::Docstring.parser
         | 
| 156 | 
            -
                      parser.parse(macro.macro_data)
         | 
| 157 | 
            -
                      parser
         | 
| 158 | 
            -
                        .tags
         | 
| 159 | 
            -
                        .select { |tag| tag.tag_name == "param" }
         | 
| 160 | 
            -
                        .map(&:name)
         | 
| 161 | 
            -
                    end
         | 
| 162 | 
            -
                  end
         | 
| 163 | 
            -
             | 
| 164 | 
            -
                  def component
         | 
| 165 | 
            -
                    component_ref.klass
         | 
| 166 | 
            -
                  end
         | 
| 167 | 
            -
                end
         | 
| 168 | 
            -
             | 
| 169 | 
            -
                # Backend that generates Lookbook pages.
         | 
| 170 | 
            -
                class LookbookPagesBackend < Backend
         | 
| 171 | 
            -
                  attr_reader :registry, :manifest
         | 
| 172 | 
            -
             | 
| 173 | 
            -
                  def initialize(registry, manifest)
         | 
| 174 | 
            -
                    @registry = registry
         | 
| 175 | 
            -
                    @manifest = manifest
         | 
| 176 | 
            -
                  end
         | 
| 177 | 
            -
             | 
| 178 | 
            -
                  def generate
         | 
| 179 | 
            -
                    each_component do |component_ref|
         | 
| 180 | 
            -
                      page_for(component_ref).generate
         | 
| 181 | 
            -
                    end
         | 
| 182 | 
            -
                    generate_system_args_docs
         | 
| 183 | 
            -
                  end
         | 
| 184 | 
            -
             | 
| 185 | 
            -
                  def page_for(component_ref)
         | 
| 186 | 
            -
                    docs = registry.find(component_ref.klass)
         | 
| 187 | 
            -
                    LookbookPage.new(component_ref, self, docs)
         | 
| 188 | 
            -
                  end
         | 
| 189 | 
            -
             | 
| 190 | 
            -
                  def view_context
         | 
| 191 | 
            -
                    @view_context ||= super.tap do |vc|
         | 
| 192 | 
            -
                      vc.singleton_class.include(LookbookDocsHelper)
         | 
| 193 | 
            -
                    end
         | 
| 194 | 
            -
                  end
         | 
| 195 | 
            -
             | 
| 196 | 
            -
                  private
         | 
| 197 | 
            -
             | 
| 198 | 
            -
                  def each_component(&block)
         | 
| 199 | 
            -
                    manifest.each(&block)
         | 
| 200 | 
            -
                  end
         | 
| 201 | 
            -
             | 
| 202 | 
            -
                  def generate_system_args_docs
         | 
| 203 | 
            -
                    docs = registry.find(Ariadne::BaseComponent)
         | 
| 204 | 
            -
             | 
| 205 | 
            -
                    path = File.expand_path(
         | 
| 206 | 
            -
                      File.join(
         | 
| 207 | 
            -
                        "..", "..", "..", "previews", "pages", "system-arguments.md.erb"
         | 
| 208 | 
            -
                      ),
         | 
| 209 | 
            -
                      __dir__,
         | 
| 210 | 
            -
                    )
         | 
| 211 | 
            -
             | 
| 212 | 
            -
                    data = {
         | 
| 213 | 
            -
                      "description_md" => docs.base_docstring.to_s,
         | 
| 214 | 
            -
                      "args_md" => view_context.render(inline: docs.constructor.base_docstring),
         | 
| 215 | 
            -
                    }
         | 
| 216 | 
            -
             | 
| 217 | 
            -
                    frontmatter = {
         | 
| 218 | 
            -
                      "title" => "System arguments",
         | 
| 219 | 
            -
                      "id" => "system_arguments",
         | 
| 220 | 
            -
                      "data" => data,
         | 
| 221 | 
            -
                    }
         | 
| 222 | 
            -
             | 
| 223 | 
            -
                    File.write(
         | 
| 224 | 
            -
                      path, <<~ERB
         | 
| 225 | 
            -
                        #{YAML.dump(frontmatter)}
         | 
| 226 | 
            -
                        ---
         | 
| 227 | 
            -
                        <%= @page.data[:description_md].html_safe %>
         | 
| 228 | 
            -
                        <%= @page.data[:args_md].html_safe %>
         | 
| 229 | 
            -
                      ERB
         | 
| 230 | 
            -
                    )
         | 
| 231 | 
            -
                  end
         | 
| 232 | 
            -
                end
         | 
| 233 | 
            -
              end
         | 
| 234 | 
            -
            end
         | 
| 235 | 
            -
            # :nocov:
         | 
| @@ -1,44 +0,0 @@ | |
| 1 | 
            -
            # frozen_string_literal: true
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            require "rubocop"
         | 
| 4 | 
            -
             | 
| 5 | 
            -
            # :nocov:
         | 
| 6 | 
            -
            module RuboCop
         | 
| 7 | 
            -
              module Cop
         | 
| 8 | 
            -
                module Ariadne
         | 
| 9 | 
            -
                  # This cop ensures that tags are not set with ||=
         | 
| 10 | 
            -
                  #
         | 
| 11 | 
            -
                  # bad
         | 
| 12 | 
            -
                  # @attributes[:tag] ||= :h1
         | 
| 13 | 
            -
                  #
         | 
| 14 | 
            -
                  # good
         | 
| 15 | 
            -
                  # @attributes[:tag] = fetch_or_raise(TAG_OPTIONS, tag)
         | 
| 16 | 
            -
                  #
         | 
| 17 | 
            -
                  # good
         | 
| 18 | 
            -
                  # @attributes[:tag] = :h2
         | 
| 19 | 
            -
                  # TODO: TEST THIS
         | 
| 20 | 
            -
                  class NoTagMemoize < Base
         | 
| 21 | 
            -
                    INVALID_MESSAGE = <<~STR
         | 
| 22 | 
            -
                      Avoid `[:tag] ||=`. Instead, try one of the following:
         | 
| 23 | 
            -
                        - Don't allow consumers to update the tag by having a fixed tag (e.g. `attributes[:tag] = :div`)
         | 
| 24 | 
            -
                        - Use the `fetch_or_raise` helper to only allow a tag from a restricted list.
         | 
| 25 | 
            -
                    STR
         | 
| 26 | 
            -
             | 
| 27 | 
            -
                    def_node_search :tag_memoized?, <<~PATTERN
         | 
| 28 | 
            -
                      (or-asgn
         | 
| 29 | 
            -
                        (send
         | 
| 30 | 
            -
                          _
         | 
| 31 | 
            -
                          _
         | 
| 32 | 
            -
                          (sym :tag)
         | 
| 33 | 
            -
                        )
         | 
| 34 | 
            -
                        _
         | 
| 35 | 
            -
                      )
         | 
| 36 | 
            -
                    PATTERN
         | 
| 37 | 
            -
             | 
| 38 | 
            -
                    def on_or_asgn(node)
         | 
| 39 | 
            -
                      add_offense(node, message: INVALID_MESSAGE) if tag_memoized?(node)
         | 
| 40 | 
            -
                    end
         | 
| 41 | 
            -
                  end
         | 
| 42 | 
            -
                end
         | 
| 43 | 
            -
              end
         | 
| 44 | 
            -
            end
         |