mirror of
https://gitea.invidious.io/iv-org/shard-spectator.git
synced 2024-08-15 00:53:35 +00:00
Merge described class and implicit subject macros
These macros are only called once.
This commit is contained in:
parent
665c202848
commit
4e690e7906
1 changed files with 15 additions and 19 deletions
|
@ -249,7 +249,7 @@ module Spectator::DSL
|
||||||
include {{@type.id}}
|
include {{@type.id}}
|
||||||
|
|
||||||
# Check if `what` looks like a type.
|
# Check if `what` looks like a type.
|
||||||
# If it is, add the `#described_class` method.
|
# If it is, add the `#described_class` and `subject` methods.
|
||||||
# At the time of writing this code,
|
# At the time of writing this code,
|
||||||
# this is the way (at least that I know of)
|
# this is the way (at least that I know of)
|
||||||
# to check if an AST node is a type name.
|
# to check if an AST node is a type name.
|
||||||
|
@ -257,7 +257,20 @@ module Spectator::DSL
|
||||||
# NOTE: In Crystal 0.27, it looks like `#resolve` can be used.
|
# NOTE: In Crystal 0.27, it looks like `#resolve` can be used.
|
||||||
# Need to investigate, but would also increase minimum version.
|
# Need to investigate, but would also increase minimum version.
|
||||||
{% if what.is_a?(Path) || what.is_a?(Generic) %}
|
{% if what.is_a?(Path) || what.is_a?(Generic) %}
|
||||||
_spectator_described_class {{what}}
|
# Returns the type currently being described.
|
||||||
|
def described_class
|
||||||
|
{{what}}.tap do |thing|
|
||||||
|
# Runtime check to ensure that `what` is a type.
|
||||||
|
raise "#{thing} must be a type name to use #described_class or #subject,\
|
||||||
|
but it is a #{typeof(thing)}" unless thing.is_a?(Class)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Implicit subject definition.
|
||||||
|
# Simply creates a new instance of the described type.
|
||||||
|
def subject
|
||||||
|
described_class.new
|
||||||
|
end
|
||||||
{% end %}
|
{% end %}
|
||||||
|
|
||||||
# Start a new group.
|
# Start a new group.
|
||||||
|
@ -455,23 +468,6 @@ module Spectator::DSL
|
||||||
::Spectator::DSL::Builder.add_example(Example%example)
|
::Spectator::DSL::Builder.add_example(Example%example)
|
||||||
end
|
end
|
||||||
|
|
||||||
private macro _spectator_described_class(what)
|
|
||||||
def described_class
|
|
||||||
{{what}}.tap do |thing|
|
|
||||||
raise "#{thing} must be a type name to use #described_class or #subject,\
|
|
||||||
but it is a #{typeof(thing)}" unless thing.is_a?(Class)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
_spectator_implicit_subject
|
|
||||||
end
|
|
||||||
|
|
||||||
private macro _spectator_implicit_subject
|
|
||||||
def subject
|
|
||||||
described_class.new
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
private macro _spectator_example_wrapper(class_name, run_method_name, &block)
|
private macro _spectator_example_wrapper(class_name, run_method_name, &block)
|
||||||
class {{class_name.id}}
|
class {{class_name.id}}
|
||||||
include ::Spectator::DSL::ExampleDSL
|
include ::Spectator::DSL::ExampleDSL
|
||||||
|
|
Loading…
Reference in a new issue