dsl_compose 2.14.3 → 2.15.0
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 +13 -0
- data/README.md +6 -2
- data/lib/dsl_compose/dsl/arguments/argument.rb +10 -1
- data/lib/dsl_compose/dsl/arguments.rb +4 -2
- data/lib/dsl_compose/dsl/interpreter.rb +4 -2
- data/lib/dsl_compose/interpreter/execution/arguments.rb +3 -3
- data/lib/dsl_compose/parser/for_children_of_parser/descendents.rb +7 -1
- data/lib/dsl_compose/parser/for_children_of_parser.rb +2 -2
- data/lib/dsl_compose/parser.rb +7 -5
- data/lib/dsl_compose/version.rb +1 -1
- data/sig/dsl_compose/dsl/arguments/argument.rbs +2 -1
- data/sig/dsl_compose/dsl/arguments.rbs +1 -1
- data/sig/dsl_compose/dsl/interpreter.rbs +1 -1
- data/sig/dsl_compose/parser/for_children_of_parser/descendents.rbs +2 -1
- data/sig/dsl_compose/parser/for_children_of_parser.rbs +1 -1
- data/sig/dsl_compose/parser.rbs +2 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: af6d832ff6a9dbe899f76297a60555caf170045743dd6cf83cbabb6b26e87892
|
4
|
+
data.tar.gz: a9628422e02b4cac58263ad72938c0297f42c75d81dd3337e43d227ec71ba664
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 82ee9d6210446826e52dec60de79f414d9769e4e571e2d95ccf41c66da3231728ad6ffecb9f55beedeceecbf651c286fc0499b076301d3c7f858fa84bd0d5106
|
7
|
+
data.tar.gz: d30c48922a712e86138867c4b4de9daee988bf99b3af052a407a8b8bc739f292c974a143ea6b93c0de35b84a981d763c08e3da799114a17ca68f1ff4e6b086f4
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,18 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## [2.15.0](https://github.com/craigulliott/dsl_compose/compare/v2.14.3...v2.15.0) (2023-10-03)
|
4
|
+
|
5
|
+
|
6
|
+
### Features
|
7
|
+
|
8
|
+
* added option to skip certain provided classes within dsl parsers ([c2be111](https://github.com/craigulliott/dsl_compose/commit/c2be111289f4ca0b84b95e641c18bdbd784b5b6f))
|
9
|
+
* adding default values for dsl arguments ([b89bd69](https://github.com/craigulliott/dsl_compose/commit/b89bd697eb6598f5f723a28533bd3e67e4ab9207))
|
10
|
+
|
11
|
+
|
12
|
+
### Bug Fixes
|
13
|
+
|
14
|
+
* passing classes to skip to the parser as class names (strings) instead of the actual classes. This prevents this library holding a reference to those classes and preventing garbage collection of the classes when they are dynamically created/destroyed within a test suite. ([74b332a](https://github.com/craigulliott/dsl_compose/commit/74b332ab99b7cf96bb8468a06634ee217cd5c58b))
|
15
|
+
|
3
16
|
## [2.14.3](https://github.com/craigulliott/dsl_compose/compare/v2.14.2...v2.14.3) (2023-09-27)
|
4
17
|
|
5
18
|
|
data/README.md
CHANGED
@@ -106,8 +106,9 @@ class Foo
|
|
106
106
|
|
107
107
|
# You can also add optional arguments to your DSL methods. All optional
|
108
108
|
# arguments must be added after required ones. An error will be raised if
|
109
|
-
# you define a required argument after an optional one.
|
110
|
-
|
109
|
+
# you define a required argument after an optional one. Optional arguments can
|
110
|
+
# have an default value, if a default is not provided then nil will be assumed.
|
111
|
+
optional :optional_argument, :integer, default: 123 do
|
111
112
|
description "A description of an optional argument"
|
112
113
|
|
113
114
|
# You can add validation to your arguments. A full list is provided later in this document
|
@@ -281,6 +282,9 @@ class MyParser < DSLCompose::Parser
|
|
281
282
|
# If you only want to process classes at the end of the class hierarchy (classes
|
282
283
|
# which extend the provided base class, but do not have their own children) then
|
283
284
|
# use `for_final_children_of` instead of `for_children_of`
|
285
|
+
#
|
286
|
+
# Both `for_children_of` and `for_final_children_of` accept an optional parameter
|
287
|
+
# named skip_classes which accepts an array of class names which should be skipped.
|
284
288
|
for_children_of SomeBaseClass do |child_class:|
|
285
289
|
add_documentation <<~DESCRIPTION
|
286
290
|
You can optionally provide a description of anything specific that your parser
|
@@ -52,6 +52,8 @@ module DSLCompose
|
|
52
52
|
# If true, then this argument accepts an array of values. It will also accept a single value,
|
53
53
|
# but that single value will be automatically converted to an array
|
54
54
|
attr_reader :array
|
55
|
+
# The default value for optional arguments, if one is not provided then nil will be assumed.
|
56
|
+
attr_reader :default
|
55
57
|
# An otional description of this Attribute, if provided then it must be a string.
|
56
58
|
# The description accepts markdown and is used when generating documentation.
|
57
59
|
attr_reader :description
|
@@ -81,7 +83,7 @@ module DSLCompose
|
|
81
83
|
# `kwarg` is a boolean which determines if a required Attribute must be provided as a keyword argument.
|
82
84
|
# `type` can be either :integer, :boolean, :float, :string or :symbol
|
83
85
|
# `block` contains the instructions to further configure this Attribute
|
84
|
-
def initialize name, required, kwarg, type, array: false, &block
|
86
|
+
def initialize name, required, kwarg, type, array: false, default: nil, &block
|
85
87
|
if name.is_a? Symbol
|
86
88
|
|
87
89
|
if RESERVED_ARGUMENT_NAMES.include? name
|
@@ -109,6 +111,13 @@ module DSLCompose
|
|
109
111
|
|
110
112
|
@array = array ? true : false
|
111
113
|
|
114
|
+
unless default.nil?
|
115
|
+
if @required
|
116
|
+
raise ImpossibleKwargError, "The argument `#{name}` is required, so can not be given a default value."
|
117
|
+
end
|
118
|
+
@default = default
|
119
|
+
end
|
120
|
+
|
112
121
|
# If a block was provided, then we evaluate it using a seperate
|
113
122
|
# interpreter class. We do this because the interpreter class contains
|
114
123
|
# no other methods or variables, if it was evaluated in the context of
|
@@ -85,9 +85,11 @@ module DSLCompose
|
|
85
85
|
#
|
86
86
|
# Argument `name` must be unique within the DSLMethod.
|
87
87
|
# `required` must be a boolean, and determines if this argument will be required
|
88
|
+
# `array` is a boolean which determines if this argument will accept an array of the given type or a single item
|
89
|
+
# `default` contains the default value, if one is not provided then nil will be assumed (it is only available for optional arguments)
|
88
90
|
# `kwarg` is a boolean which determines if a required Attribute must be provided as a keyword argument.
|
89
91
|
# or optional on the method which is exposed in our DSL.
|
90
|
-
def add_argument name, required, kwarg, type, array: false, &block
|
92
|
+
def add_argument name, required, kwarg, type, array: false, default: nil, &block
|
91
93
|
if @arguments.key? name
|
92
94
|
raise ArgumentAlreadyExistsError, "An argument with the name `#{name}` already exists for this DSL method"
|
93
95
|
end
|
@@ -97,7 +99,7 @@ module DSLCompose
|
|
97
99
|
raise ArgumentOrderingError, "Required arguments can not be added after optional ones"
|
98
100
|
end
|
99
101
|
|
100
|
-
@arguments[name] = Argument.new(name, required, kwarg, type, array: array, &block)
|
102
|
+
@arguments[name] = Argument.new(name, required, kwarg, type, array: array, default: default, &block)
|
101
103
|
end
|
102
104
|
end
|
103
105
|
end
|
@@ -63,10 +63,12 @@ module DSLCompose
|
|
63
63
|
#
|
64
64
|
# name must be a symbol
|
65
65
|
# `type` can be either :integer, :boolean, :float, :string, :symbol, :class or :object
|
66
|
+
# `array` is a boolean which determines if this argument will accept an array of the given type or a single item
|
67
|
+
# `default` contains the default value, if one is not provided then nil will be assumed
|
66
68
|
# `block` contains the argument definition and will be evaluated seperately
|
67
69
|
# by the Argument::Interpreter
|
68
|
-
def optional name, type, array: false, &block
|
69
|
-
@dsl.arguments.add_argument name, false, false, type, array: array, &block
|
70
|
+
def optional name, type, array: false, default: nil, &block
|
71
|
+
@dsl.arguments.add_argument name, false, false, type, array: array, default: default, &block
|
70
72
|
end
|
71
73
|
|
72
74
|
# adds a new required argument to the DSLMethod
|
@@ -69,17 +69,17 @@ module DSLCompose
|
|
69
69
|
raise TooManyArgumentsError, "Too many arguments provided"
|
70
70
|
end
|
71
71
|
|
72
|
-
# Assume all optonal arguments are
|
72
|
+
# Assume all optonal arguments are their defaults (except booleans, which default to false).
|
73
73
|
# If actual values were provided, then they will be set further below.
|
74
74
|
if arguments.optional_arguments.any?
|
75
75
|
arguments.optional_arguments.each do |optional_argument|
|
76
76
|
# assume it is nil
|
77
|
-
@arguments[optional_argument.name] =
|
77
|
+
@arguments[optional_argument.name] = optional_argument.default
|
78
78
|
# unless the argument is an array or a boolean, in which case it defaults
|
79
79
|
# to an empty array or false
|
80
80
|
if optional_argument.array
|
81
81
|
@arguments[optional_argument.name] = [].freeze
|
82
|
-
elsif optional_argument.type == :boolean
|
82
|
+
elsif optional_argument.type == :boolean && optional_argument.default.nil?
|
83
83
|
@arguments[optional_argument.name] = false
|
84
84
|
end
|
85
85
|
end
|
@@ -4,9 +4,10 @@ module DSLCompose
|
|
4
4
|
class Parser
|
5
5
|
class ForChildrenOfParser
|
6
6
|
class Descendents
|
7
|
-
def initialize base_class, final_children_only
|
7
|
+
def initialize base_class, final_children_only, skip_classes = []
|
8
8
|
@base_class = base_class
|
9
9
|
@final_children_only = final_children_only
|
10
|
+
@skip_classes = skip_classes
|
10
11
|
end
|
11
12
|
|
12
13
|
def classes
|
@@ -19,6 +20,11 @@ module DSLCompose
|
|
19
20
|
"#{child_class.name.split("::").count}_#{has_descendents(child_class) ? 0 : 1}_#{child_class.name}"
|
20
21
|
end
|
21
22
|
|
23
|
+
# reject any classes which we are skipping
|
24
|
+
extending_classes.reject! do |child_class|
|
25
|
+
@skip_classes.include? child_class.name
|
26
|
+
end
|
27
|
+
|
22
28
|
# if this is not a final child, but we are processing final children only, then skip it
|
23
29
|
if @final_children_only
|
24
30
|
# reject any classes which have descendents
|
@@ -35,7 +35,7 @@ module DSLCompose
|
|
35
35
|
# parser.for_children_of BaseClass do |child_class:|
|
36
36
|
# # this will yield for ChildClass and GrandchildClass
|
37
37
|
# and
|
38
|
-
def initialize base_class, final_children_only, &block
|
38
|
+
def initialize base_class, final_children_only, skip_classes = [], &block
|
39
39
|
# assert the provided class has the DSLCompose::Composer module installed
|
40
40
|
unless base_class.respond_to? :dsls
|
41
41
|
raise ClassDoesNotUseDSLComposeError, base_class
|
@@ -57,7 +57,7 @@ module DSLCompose
|
|
57
57
|
end
|
58
58
|
|
59
59
|
# yeild the block for all descendents of the provided base_class
|
60
|
-
Descendents.new(base_class, final_children_only).classes.each do |child_class|
|
60
|
+
Descendents.new(base_class, final_children_only, skip_classes).classes.each do |child_class|
|
61
61
|
# determine which arguments to send to the block
|
62
62
|
args = {}
|
63
63
|
if BlockArguments.accepts_argument?(:child_class, &block)
|
data/lib/dsl_compose/parser.rb
CHANGED
@@ -30,27 +30,28 @@ module DSLCompose
|
|
30
30
|
# If `final_children_only` is true, then this will cause the parser to only return
|
31
31
|
# classes which are at the end of their class hierachy (meaning they dont have any
|
32
32
|
# children of their own)
|
33
|
-
def self.for_children_of base_class, final_children_only: false, rerun: false, &block
|
33
|
+
def self.for_children_of base_class, final_children_only: false, skip_classes: [], rerun: false, &block
|
34
34
|
unless rerun
|
35
35
|
@runs ||= []
|
36
36
|
@runs << {
|
37
37
|
base_class: base_class,
|
38
38
|
final_children_only: final_children_only,
|
39
|
+
skip_classes: skip_classes,
|
39
40
|
block: block
|
40
41
|
}
|
41
42
|
end
|
42
43
|
|
43
44
|
# we parse the provided block in the context of the ForChildrenOfParser class
|
44
45
|
# to help make this code more readable, and to limit polluting the current namespace
|
45
|
-
ForChildrenOfParser.new(base_class, final_children_only, &block)
|
46
|
+
ForChildrenOfParser.new(base_class, final_children_only, skip_classes, &block)
|
46
47
|
end
|
47
48
|
|
48
49
|
# this is a wrapper for the `for_children_of` method, but it provides a value
|
49
50
|
# of true for the `final_children_only` argument. This will cause the parser to only
|
50
51
|
# return classes which are at the end of the class hierachy (meaning they dont have
|
51
52
|
# any children of their own)
|
52
|
-
def self.for_final_children_of base_class, &block
|
53
|
-
for_children_of base_class, final_children_only: true, &block
|
53
|
+
def self.for_final_children_of base_class, skip_classes: [], &block
|
54
|
+
for_children_of base_class, final_children_only: true, skip_classes: skip_classes, &block
|
54
55
|
end
|
55
56
|
|
56
57
|
# this method is used to rerun the parser, this is most useful from within a test suite
|
@@ -61,7 +62,8 @@ module DSLCompose
|
|
61
62
|
base_class = run[:base_class]
|
62
63
|
block = run[:block]
|
63
64
|
final_children_only = run[:final_children_only]
|
64
|
-
|
65
|
+
skip_classes = run[:skip_classes]
|
66
|
+
for_children_of base_class, rerun: true, final_children_only: final_children_only, skip_classes: skip_classes, &block
|
65
67
|
end
|
66
68
|
end
|
67
69
|
|
data/lib/dsl_compose/version.rb
CHANGED
@@ -11,6 +11,7 @@ module DSLCompose
|
|
11
11
|
attr_reader required: bool
|
12
12
|
attr_reader kwarg: bool
|
13
13
|
attr_reader array: bool
|
14
|
+
attr_reader default: untyped
|
14
15
|
attr_reader description: String
|
15
16
|
|
16
17
|
attr_reader greater_than_validation: GreaterThanValidation
|
@@ -28,7 +29,7 @@ module DSLCompose
|
|
28
29
|
attr_reader length_validation: LengthValidation
|
29
30
|
attr_reader is_a_validation: IsAValidation
|
30
31
|
|
31
|
-
def initialize: (Symbol name, bool required, bool kwarg, argument_type `type`, ?array: bool) -> void
|
32
|
+
def initialize: (Symbol name, bool required, bool kwarg, argument_type `type`, ?array: bool, ?default: untyped) -> void
|
32
33
|
def set_description: (String description) -> void
|
33
34
|
def has_description?: () -> bool
|
34
35
|
def required?: -> bool
|
@@ -12,7 +12,7 @@ module DSLCompose
|
|
12
12
|
def optional_argument: (Symbol name) -> Argument
|
13
13
|
def required_argument: (Symbol name) -> Argument
|
14
14
|
def has_argument?: (Symbol name) -> bool
|
15
|
-
def add_argument: (Symbol name, bool required, bool kwarg, argument_type `type`, ?array: bool) -> Argument
|
15
|
+
def add_argument: (Symbol name, bool required, bool kwarg, argument_type `type`, ?array: bool, ?default: untyped) -> Argument
|
16
16
|
|
17
17
|
class ArgumentDoesNotExistError < StandardError
|
18
18
|
end
|
@@ -13,7 +13,7 @@ module DSLCompose
|
|
13
13
|
def title: (String title) -> void
|
14
14
|
def add_method: (Symbol name, ?required: nil) -> void
|
15
15
|
def add_unique_method: (Symbol name, ?required: nil) -> void
|
16
|
-
def optional: (Symbol name, argument_type `type`, ?array: bool) -> void
|
16
|
+
def optional: (Symbol name, argument_type `type`, ?array: bool, ?default: untyped) -> void
|
17
17
|
def requires: (Symbol name, argument_type `type`, ?kwarg: bool, ?array: bool) -> void
|
18
18
|
end
|
19
19
|
end
|
@@ -4,9 +4,10 @@ module DSLCompose
|
|
4
4
|
class ForChildrenOfParser
|
5
5
|
class Descendents
|
6
6
|
@base_class: singleton(Object)
|
7
|
+
@skip_classes: Array[String]
|
7
8
|
@final_children_only: bool
|
8
9
|
|
9
|
-
def initialize: (singleton(Object) base_class, bool final_children_only) -> void
|
10
|
+
def initialize: (singleton(Object) base_class, bool final_children_only, ?Array[String] skip_classes) -> void
|
10
11
|
def classes: -> Array[singleton(Object)]
|
11
12
|
|
12
13
|
private
|
@@ -5,7 +5,7 @@ module DSLCompose
|
|
5
5
|
@base_class: singleton(Object)
|
6
6
|
@child_class: singleton(Object)
|
7
7
|
|
8
|
-
def initialize: (singleton(Object) base_class, bool final_children_only) -> void
|
8
|
+
def initialize: (singleton(Object) base_class, bool final_children_only, ?Array[String] skip_classes) -> void
|
9
9
|
|
10
10
|
# overriding this method because steep doesn't
|
11
11
|
# correctly infer that a block is being passed to this method
|
data/sig/dsl_compose/parser.rbs
CHANGED
@@ -4,7 +4,8 @@ module DSLCompose
|
|
4
4
|
self.@runs: untyped
|
5
5
|
|
6
6
|
def initialize: -> void
|
7
|
-
def self.for_children_of: (singleton(Object) base_class, ?final_children_only: bool, ?rerun: bool) -> void
|
7
|
+
def self.for_children_of: (singleton(Object) base_class, ?final_children_only: bool, ?skip_classes: Array[String], ?rerun: bool) -> void
|
8
|
+
def self.for_final_children_of: (singleton(Object) base_class, ?skip_classes: Array[String]) -> void
|
8
9
|
|
9
10
|
class NotInitializable < StandardError
|
10
11
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dsl_compose
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.15.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Craig Ulliott
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-10-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: class_spec_helper
|