From e093ec788e9e627cfba85b5c0abe9ef1ea0c3f0d Mon Sep 17 00:00:00 2001 From: Michael Miller Date: Sat, 30 Jan 2021 14:08:42 -0700 Subject: [PATCH] Clean up tags method generation by moving it to another macro --- src/spectator/dsl/examples.cr | 55 ++++++++++++++++------------------- src/spectator/dsl/groups.cr | 55 ++++++++++++++++------------------- 2 files changed, 50 insertions(+), 60 deletions(-) diff --git a/src/spectator/dsl/examples.cr b/src/spectator/dsl/examples.cr index d789a44..b711502 100644 --- a/src/spectator/dsl/examples.cr +++ b/src/spectator/dsl/examples.cr @@ -26,36 +26,8 @@ module Spectator::DSL \{% raise "A description or block must be provided. Cannot use '{{name.id}}' alone." unless what || block %} \{% raise "Block argument count '{{name.id}}' hook must be 0..1" if block.args.size > 1 %} - def self.\%tags - tags = _spectator_tags - {% if !tags.empty? %} - tags.concat({ {{tags.map(&.id.symbolize).splat}} }) - {% end %} - {% for k, v in metadata %} - cond = begin - {{v}} - end - if cond - tags.add({{k.id.symbolize}}) - else - tags.delete({{k.id.symbolize}}) - end - {% end %} - \{% if !tags.empty? %} - tags.concat({ \{{tags.map(&.id.symbolize).splat}} }) - \{% end %} - \{% for k, v in metadata %} - cond = begin - \{{v}} - end - if cond - tags.add(\{{k.id.symbolize}}) - else - tags.delete(\{{k.id.symbolize}}) - end - \{% end %} - tags - end + _spectator_tags_method(%tags, :_spectator_tags, {{tags.splat(",")}} {{metadata.double_splat}}) + _spectator_tags_method(\%tags, %tags, \{{tags.splat(",")}} \{{metadata.double_splat}}) def \%test(\{{block.args.splat}}) : Nil \{{block.body}} @@ -92,6 +64,29 @@ module Spectator::DSL {% end %} end + # Defines a class method named *name* that combines tags + # returned by *source* with *tags* and *metadata*. + # Any falsey items from *metadata* are removed. + private macro _spectator_tags_method(name, source, *tags, **metadata) + def self.{{name.id}} + tags = {{source.id}} + {% unless tags.empty? %} + tags.concat({ {{tags.map(&.id.symbolize).splat}} }) + {% end %} + {% for k, v in metadata %} + cond = begin + {{v}} + end + if cond + tags.add({{k.id.symbolize}}) + else + tags.delete({{k.id.symbolize}}) + end + {% end %} + tags + end + end + define_example :example define_example :it diff --git a/src/spectator/dsl/groups.cr b/src/spectator/dsl/groups.cr index d6dd9c2..a570cb9 100644 --- a/src/spectator/dsl/groups.cr +++ b/src/spectator/dsl/groups.cr @@ -16,36 +16,8 @@ module Spectator::DSL class Group\%group < \{{@type.id}} _spectator_group_subject(\{{what}}) - def self._spectator_tags - tags = super - {% if !tags.empty? %} - tags.concat({ {{tags.map(&.id.symbolize).splat}} }) - {% end %} - {% for k, v in metadata %} - cond = begin - {{v}} - end - if cond - tags.add({{k.id.symbolize}}) - else - tags.delete({{k.id.symbolize}}) - end - {% end %} - \{% if !tags.empty? %} - tags.concat({ \{{tags.map(&.id.symbolize).splat}} }) - \{% end %} - \{% for k, v in metadata %} - cond = begin - \{{v}} - end - if cond - tags.add(\{{k.id.symbolize}}) - else - tags.delete(\{{k.id.symbolize}}) - end - \{% end %} - tags - end + _spectator_tags_method(:_spectator_tags, :super, {{tags.splat(", ")}} {{metadata.double_splat}}) + _spectator_tags_method(:_spectator_tags, :previous_def, \{{tags.splat(", ")}} \{{metadata.double_splat}}) ::Spectator::DSL::Builder.start_group( _spectator_group_name(\{{what}}), @@ -112,6 +84,29 @@ module Spectator::DSL {% end %} end + # Defines a class method named *name* that combines tags + # returned by *source* with *tags* and *metadata*. + # Any falsey items from *metadata* are removed. + private macro _spectator_tags_method(name, source, *tags, **metadata) + def self.{{name.id}} + tags = {{source.id}} + {% unless tags.empty? %} + tags.concat({ {{tags.map(&.id.symbolize).splat}} }) + {% end %} + {% for k, v in metadata %} + cond = begin + {{v}} + end + if cond + tags.add({{k.id.symbolize}}) + else + tags.delete({{k.id.symbolize}}) + end + {% end %} + tags + end + end + define_example_group :example_group define_example_group :describe