dsl_compose 1.6.0 → 1.7.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.
Files changed (27) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +7 -0
  3. data/lib/dsl_compose/composer.rb +3 -12
  4. data/lib/dsl_compose/dsl/arguments/argument/equal_to_validation.rb +1 -4
  5. data/lib/dsl_compose/dsl/arguments/argument/format_validation.rb +1 -4
  6. data/lib/dsl_compose/dsl/arguments/argument/greater_than_or_equal_to_validation.rb +2 -8
  7. data/lib/dsl_compose/dsl/arguments/argument/greater_than_validation.rb +2 -8
  8. data/lib/dsl_compose/dsl/arguments/argument/in_validation.rb +2 -8
  9. data/lib/dsl_compose/dsl/arguments/argument/length_validation.rb +3 -6
  10. data/lib/dsl_compose/dsl/arguments/argument/less_than_or_equal_to_validation.rb +2 -8
  11. data/lib/dsl_compose/dsl/arguments/argument/less_than_validation.rb +2 -8
  12. data/lib/dsl_compose/dsl/arguments/argument/not_in_validation.rb +2 -8
  13. data/lib/dsl_compose/dsl/arguments/argument.rb +38 -50
  14. data/lib/dsl_compose/dsl/arguments.rb +5 -20
  15. data/lib/dsl_compose/dsl/dsl_method.rb +6 -46
  16. data/lib/dsl_compose/dsl.rb +8 -24
  17. data/lib/dsl_compose/dsls.rb +4 -13
  18. data/lib/dsl_compose/interpreter/execution/arguments.rb +24 -26
  19. data/lib/dsl_compose/interpreter/execution/method_calls/method_call.rb +0 -24
  20. data/lib/dsl_compose/interpreter/execution/method_calls.rb +6 -0
  21. data/lib/dsl_compose/interpreter/execution.rb +3 -8
  22. data/lib/dsl_compose/interpreter.rb +8 -0
  23. data/lib/dsl_compose/parser/for_children_of_parser/for_dsl_parser/for_method_parser.rb +4 -10
  24. data/lib/dsl_compose/parser/for_children_of_parser/for_dsl_parser.rb +4 -10
  25. data/lib/dsl_compose/parser/for_children_of_parser.rb +3 -9
  26. data/lib/dsl_compose/version.rb +1 -1
  27. metadata +1 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 51a691703918ebafb30bb7c158e627e6a02597e9171e38d1b87cd4cd066d825d
4
- data.tar.gz: 4e750c6839f7946299f13e81b8af0a7ca94e8d852d7a418f8be97658a0ba67a8
3
+ metadata.gz: 461fe3b90a0a36703aee0be51b3594472d2fc55ff1eab2b6b5bfabd851446d09
4
+ data.tar.gz: 65ba43be5dfcefbaf5588744b66fcd73a8266abbea65bcb59699132c43ed47a7
5
5
  SHA512:
6
- metadata.gz: aa82b56b1c7b6cfcbf4b0116c34b4084f5873cd5d957ceb615b16ab4b36f44a6d3da1ffea8a8ef779b837322d0622254e8688fa4fecffdcb6a011a531aa31106
7
- data.tar.gz: b1d02bc6e922d35aeee52095bfd3847d5ae347ef56e6278a4f90bb4c76666e0829dad6638956f96a555400a129160f5431d197b264dc1103532c2a1b6df14de2
6
+ metadata.gz: 9d2b86c2398b49217ba29152f68f6666e0bcbe926d4adadaac29b4f4a3d8500b120192c469c4fa25f68b68c58e73782459356a7845bcabb0237076521e4e0f37
7
+ data.tar.gz: 4f58959006d911cb13d75ccddc1871416736236d0e278844f6beb1c22a546d2e8d3620230931a2108c8949ad346a65ce27f3ae437fd8d55e5563603ad8421d24
data/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.7.0](https://github.com/craigulliott/dsl_compose/compare/v1.6.0...v1.7.0) (2023-07-07)
4
+
5
+
6
+ ### Features
7
+
8
+ * better error messages ([#19](https://github.com/craigulliott/dsl_compose/issues/19)) ([a9afa6c](https://github.com/craigulliott/dsl_compose/commit/a9afa6cb1b7482d0d7a646b6872ca5e969393eb7))
9
+
3
10
  ## [1.6.0](https://github.com/craigulliott/dsl_compose/compare/v1.5.0...v1.6.0) (2023-07-07)
4
11
 
5
12
 
@@ -3,26 +3,17 @@
3
3
  module DSLCompose
4
4
  module Composer
5
5
  class ComposerAlreadyInstalledError < StandardError
6
- def message
7
- "This module has already been included or the define_dsl singleton method already exists for this class."
8
- end
9
6
  end
10
7
 
11
8
  class MethodAlreadyExistsWithThisDSLNameError < StandardError
12
- def message
13
- "The `define_dsl` singleton method already exists for this class."
14
- end
15
9
  end
16
10
 
17
11
  class GetDSLExecutionResultsMethodAlreadyExistsError < StandardError
18
- def message
19
- "The `dsls` singleton method already exists for this class."
20
- end
21
12
  end
22
13
 
23
14
  def self.included klass
24
15
  if (klass.private_methods + klass.methods).include? :define_dsl
25
- raise ComposerAlreadyInstalledError
16
+ raise ComposerAlreadyInstalledError, "This module has already been included or the define_dsl singleton method already exists for this class."
26
17
  end
27
18
 
28
19
  # create an interpreter for this class which will be shared by all child classes and all
@@ -31,7 +22,7 @@ module DSLCompose
31
22
 
32
23
  # return a specific DSL which is defined for this class
33
24
  if klass.respond_to? :dsls
34
- raise GetDSLExecutionResultsMethodAlreadyExistsError
25
+ raise GetDSLExecutionResultsMethodAlreadyExistsError, "The `dsls` singleton method already exists for this class."
35
26
  end
36
27
 
37
28
  klass.define_singleton_method :dsls do
@@ -52,7 +43,7 @@ module DSLCompose
52
43
 
53
44
  # ensure that creating this DSL will not override any existing methods on this class
54
45
  if respond_to? name
55
- raise MethodAlreadyExistsWithThisDSLNameError
46
+ raise MethodAlreadyExistsWithThisDSLNameError, "The `define_dsl` singleton method `#{name}` already exists for this class."
56
47
  end
57
48
 
58
49
  # add a singleton method with the name of this new DSL onto our class, this is how our new DSL will be accessed
@@ -6,9 +6,6 @@ module DSLCompose
6
6
  class Argument
7
7
  class EqualToValidation
8
8
  class ValidationFailedError < StandardError
9
- def message
10
- "The argument is invalid"
11
- end
12
9
  end
13
10
 
14
11
  def initialize value
@@ -16,7 +13,7 @@ module DSLCompose
16
13
  end
17
14
 
18
15
  def validate! value
19
- raise ValidationFailedError unless value == @value
16
+ raise ValidationFailedError, "The argument is invalid. Expected #{@value} but received #{value}" unless value == @value
20
17
  end
21
18
  end
22
19
  end
@@ -6,9 +6,6 @@ module DSLCompose
6
6
  class Argument
7
7
  class FormatValidation
8
8
  class ValidationFailedError < StandardError
9
- def message
10
- "The argument is invalid"
11
- end
12
9
  end
13
10
 
14
11
  def initialize regex
@@ -16,7 +13,7 @@ module DSLCompose
16
13
  end
17
14
 
18
15
  def validate! value
19
- raise ValidationFailedError if @regex.match(value).nil?
16
+ raise ValidationFailedError, "The argument is invalid. Expected format #{@regex} but received #{value}" if @regex.match(value).nil?
20
17
  end
21
18
  end
22
19
  end
@@ -6,27 +6,21 @@ module DSLCompose
6
6
  class Argument
7
7
  class GreaterThanOrEqualToValidation
8
8
  class InvalidValueError < StandardError
9
- def message
10
- "The value provided to validate_greater_than must be a number"
11
- end
12
9
  end
13
10
 
14
11
  class ValidationFailedError < StandardError
15
- def message
16
- "The argument is invalid"
17
- end
18
12
  end
19
13
 
20
14
  def initialize value
21
15
  unless value.is_a?(Numeric)
22
- raise InvalidValueError
16
+ raise InvalidValueError, "The value `#{value}` provided to this validator must be of type number"
23
17
  end
24
18
 
25
19
  @value = value
26
20
  end
27
21
 
28
22
  def validate! value
29
- raise ValidationFailedError unless value >= @value
23
+ raise ValidationFailedError, "The argument is invalid. Expected greater than or equal to #{@value} but received #{value}" unless value >= @value
30
24
  end
31
25
  end
32
26
  end
@@ -6,27 +6,21 @@ module DSLCompose
6
6
  class Argument
7
7
  class GreaterThanValidation
8
8
  class InvalidValueError < StandardError
9
- def message
10
- "The value provided to validate_greater_than must be a number"
11
- end
12
9
  end
13
10
 
14
11
  class ValidationFailedError < StandardError
15
- def message
16
- "The argument is invalid"
17
- end
18
12
  end
19
13
 
20
14
  def initialize value
21
15
  unless value.is_a?(Numeric)
22
- raise InvalidValueError
16
+ raise InvalidValueError, "The value `#{value}` provided to this validator must be of type number"
23
17
  end
24
18
 
25
19
  @value = value
26
20
  end
27
21
 
28
22
  def validate! value
29
- raise ValidationFailedError unless value > @value
23
+ raise ValidationFailedError, "The argument is invalid. Expected greater than #{@value} but received #{value}" unless value > @value
30
24
  end
31
25
  end
32
26
  end
@@ -6,27 +6,21 @@ module DSLCompose
6
6
  class Argument
7
7
  class InValidation
8
8
  class InvalidValueError < StandardError
9
- def message
10
- "The value provided to validate_greater_than must be a number"
11
- end
12
9
  end
13
10
 
14
11
  class ValidationFailedError < StandardError
15
- def message
16
- "The argument is invalid"
17
- end
18
12
  end
19
13
 
20
14
  def initialize values
21
15
  unless values.is_a?(Array)
22
- raise InvalidValueError
16
+ raise InvalidValueError, "The value `#{values}` provided to this validator must be of type Array"
23
17
  end
24
18
 
25
19
  @values = values
26
20
  end
27
21
 
28
22
  def validate! value
29
- raise ValidationFailedError unless @values.include? value
23
+ raise ValidationFailedError, "The argument is invalid. Expected in #{@values} but received #{value}" unless @values.include? value
30
24
  end
31
25
  end
32
26
  end
@@ -6,9 +6,6 @@ module DSLCompose
6
6
  class Argument
7
7
  class LengthValidation
8
8
  class ValidationFailedError < StandardError
9
- def message
10
- "The argument is invalid"
11
- end
12
9
  end
13
10
 
14
11
  def initialize maximum: nil, minimum: nil, is: nil
@@ -20,17 +17,17 @@ module DSLCompose
20
17
  def validate! value
21
18
  maximum = @maximum
22
19
  unless maximum.nil?
23
- raise ValidationFailedError if value.length > maximum
20
+ raise ValidationFailedError, "The argument is invalid. Expected #{value} to be less than or equal to #{maximum} characters" if value.length > maximum
24
21
  end
25
22
 
26
23
  minimum = @minimum
27
24
  unless minimum.nil?
28
- raise ValidationFailedError if value.length < minimum
25
+ raise ValidationFailedError, "The argument is invalid. Expected #{value} to be greater than or equal to #{minimum} characters" if value.length < minimum
29
26
  end
30
27
 
31
28
  is = @is
32
29
  unless is.nil?
33
- raise ValidationFailedError if value.length != is
30
+ raise ValidationFailedError, "The argument is invalid. Expected #{value} to be #{is} characters long" if value.length != is
34
31
  end
35
32
 
36
33
  true
@@ -6,27 +6,21 @@ module DSLCompose
6
6
  class Argument
7
7
  class LessThanOrEqualToValidation
8
8
  class InvalidValueError < StandardError
9
- def message
10
- "The value provided to validate_greater_than must be a number"
11
- end
12
9
  end
13
10
 
14
11
  class ValidationFailedError < StandardError
15
- def message
16
- "The argument is invalid"
17
- end
18
12
  end
19
13
 
20
14
  def initialize value
21
15
  unless value.is_a?(Numeric)
22
- raise InvalidValueError
16
+ raise InvalidValueError, "The value `#{value}` provided to this validator must be of type number"
23
17
  end
24
18
 
25
19
  @value = value
26
20
  end
27
21
 
28
22
  def validate! value
29
- raise ValidationFailedError unless value <= @value
23
+ raise ValidationFailedError, "The argument is invalid. Expected less than or equal to #{@value} but received #{value}" unless value <= @value
30
24
  end
31
25
  end
32
26
  end
@@ -6,27 +6,21 @@ module DSLCompose
6
6
  class Argument
7
7
  class LessThanValidation
8
8
  class InvalidValueError < StandardError
9
- def message
10
- "The value provided to validate_greater_than must be a number"
11
- end
12
9
  end
13
10
 
14
11
  class ValidationFailedError < StandardError
15
- def message
16
- "The argument is invalid"
17
- end
18
12
  end
19
13
 
20
14
  def initialize value
21
15
  unless value.is_a?(Numeric)
22
- raise InvalidValueError
16
+ raise InvalidValueError, "The value `#{value}` provided to this validator must be of type number"
23
17
  end
24
18
 
25
19
  @value = value
26
20
  end
27
21
 
28
22
  def validate! value
29
- raise ValidationFailedError unless value < @value
23
+ raise ValidationFailedError, "The argument is invalid. Expected less than #{@value} but received #{value}" unless value < @value
30
24
  end
31
25
  end
32
26
  end
@@ -6,27 +6,21 @@ module DSLCompose
6
6
  class Argument
7
7
  class NotInValidation
8
8
  class InvalidValueError < StandardError
9
- def message
10
- "The value provided to validate_greater_than must be a number"
11
- end
12
9
  end
13
10
 
14
11
  class ValidationFailedError < StandardError
15
- def message
16
- "The argument is invalid"
17
- end
18
12
  end
19
13
 
20
14
  def initialize values
21
15
  unless values.is_a?(Array)
22
- raise InvalidValueError
16
+ raise InvalidValueError, "The value `#{values}` provided to this validator must be of type Array"
23
17
  end
24
18
 
25
19
  @values = values
26
20
  end
27
21
 
28
22
  def validate! value
29
- raise ValidationFailedError if @values.include?(value)
23
+ raise ValidationFailedError, "The argument is invalid. Expected not in #{@values} but received #{value}" if @values.include?(value)
30
24
  end
31
25
  end
32
26
  end
@@ -5,45 +5,27 @@ module DSLCompose
5
5
  class Arguments
6
6
  class Argument
7
7
  class ValidationIncompatibleError < StandardError
8
- def message
9
- "The validation is not compatible with this argument type"
10
- end
11
8
  end
12
9
 
13
10
  class ValidationAlreadyExistsError < StandardError
14
- def message
15
- "This validation has already been applied to this method option."
16
- end
17
11
  end
18
12
 
19
13
  class InvalidTypeError < StandardError
20
- def message
21
- "Argument type must be one of :integer, :boolean, :float, :string or :symbol"
22
- end
23
14
  end
24
15
 
25
16
  class InvalidNameError < StandardError
26
- def message
27
- "The option name is invalid, it must be of type symbol."
28
- end
29
17
  end
30
18
 
31
19
  class InvalidDescriptionError < StandardError
32
- def message
33
- "The option description is invalid, it must be of type string and have length greater than 0."
34
- end
35
20
  end
36
21
 
37
22
  class DescriptionAlreadyExistsError < StandardError
38
- def message
39
- "The description has already been set"
40
- end
41
23
  end
42
24
 
43
25
  class ArgumentNameReservedError < StandardError
44
- def message
45
- "This argument name is a reserved word. The names #{RESERVED_ARGUMENT_NAMES.join ", "} can not be used here because the Parser uses it to express a structural part of the DSL"
46
- end
26
+ end
27
+
28
+ class ValidationInvalidArgumentError < StandardError
47
29
  end
48
30
 
49
31
  RESERVED_ARGUMENT_NAMES = [
@@ -87,18 +69,18 @@ module DSLCompose
87
69
  if name.is_a? Symbol
88
70
 
89
71
  if RESERVED_ARGUMENT_NAMES.include? name
90
- raise ArgumentNameReservedError
72
+ raise ArgumentNameReservedError, "This argument name `#{name}` is a reserved word. The names #{RESERVED_ARGUMENT_NAMES.join ", "} can not be used here because the Parser uses them to express a structural part of the DSL"
91
73
  end
92
74
 
93
75
  @name = name
94
76
  else
95
- raise InvalidNameError
77
+ raise InvalidNameError, "The option name `#{name}` is invalid, it must be of type symbol."
96
78
  end
97
79
 
98
80
  if type == :integer || type == :boolean || type == :float || type == :string || type == :symbol
99
81
  @type = type
100
82
  else
101
- raise InvalidTypeError
83
+ raise InvalidTypeError, "Argument type `#{type}` must be one of :integer, :boolean, :float, :string or :symbol"
102
84
  end
103
85
 
104
86
  @required = required ? true : false
@@ -111,6 +93,8 @@ module DSLCompose
111
93
  if block
112
94
  Interpreter.new(self).instance_eval(&block)
113
95
  end
96
+ rescue => e
97
+ raise e, "Error defining argument #{name}: #{e.message}", e.backtrace
114
98
  end
115
99
 
116
100
  # Set the description for this Argument to the provided value.
@@ -119,11 +103,11 @@ module DSLCompose
119
103
  # The `description` can only be set once per Argument
120
104
  def set_description description
121
105
  unless description.is_a?(String) && description.length > 0
122
- raise InvalidDescriptionError
106
+ raise InvalidDescriptionError, "The option description `#{description}` is invalid, it must be of type string and have length greater than 0."
123
107
  end
124
108
 
125
109
  if has_description?
126
- raise DescriptionAlreadyExistsError
110
+ raise DescriptionAlreadyExistsError, "The description has already been set"
127
111
  end
128
112
 
129
113
  @description = description
@@ -146,11 +130,15 @@ module DSLCompose
146
130
 
147
131
  def validate_greater_than value
148
132
  if @greater_than_validation
149
- raise ValidationAlreadyExistsError
133
+ raise ValidationAlreadyExistsError, "The validation `greater_than` has already been applied to this method option."
134
+ end
135
+
136
+ unless value.is_a?(Numeric)
137
+ raise ValidationInvalidArgumentError, value
150
138
  end
151
139
 
152
140
  unless @type == :integer || @type == :float
153
- raise ValidationIncompatibleError
141
+ raise ValidationIncompatibleError, "The validation type #{@type} is not compatible with this argument type"
154
142
  end
155
143
 
156
144
  @greater_than_validation = GreaterThanValidation.new value
@@ -158,15 +146,15 @@ module DSLCompose
158
146
 
159
147
  def validate_greater_than_or_equal_to value
160
148
  if @greater_than_or_equal_to_validation
161
- raise ValidationAlreadyExistsError
149
+ raise ValidationAlreadyExistsError, "The validation `greater_than_or_equal_to` has already been applied to this method option."
162
150
  end
163
151
 
164
152
  unless value.is_a?(Numeric)
165
- raise ValidationInvalidArgumentError
153
+ raise ValidationInvalidArgumentError, value
166
154
  end
167
155
 
168
156
  unless @type == :integer || @type == :float
169
- raise ValidationIncompatibleError
157
+ raise ValidationIncompatibleError, "The validation type #{@type} is not compatible with this argument type"
170
158
  end
171
159
 
172
160
  @greater_than_or_equal_to_validation = GreaterThanOrEqualToValidation.new value
@@ -174,15 +162,15 @@ module DSLCompose
174
162
 
175
163
  def validate_less_than value
176
164
  if @less_than_validation
177
- raise ValidationAlreadyExistsError
165
+ raise ValidationAlreadyExistsError, "The validation `less_than` has already been applied to this method option."
178
166
  end
179
167
 
180
168
  unless value.is_a?(Numeric)
181
- raise ValidationInvalidArgumentError
169
+ raise ValidationInvalidArgumentError, value
182
170
  end
183
171
 
184
172
  unless @type == :integer || @type == :float
185
- raise ValidationIncompatibleError
173
+ raise ValidationIncompatibleError, "The validation type #{@type} is not compatible with this argument type"
186
174
  end
187
175
 
188
176
  @less_than_validation = LessThanValidation.new value
@@ -190,15 +178,15 @@ module DSLCompose
190
178
 
191
179
  def validate_less_than_or_equal_to value
192
180
  if @less_than_or_equal_to_validation
193
- raise ValidationAlreadyExistsError
181
+ raise ValidationAlreadyExistsError, "The validation `less_than_or_equal_to` has already been applied to this method option."
194
182
  end
195
183
 
196
184
  unless value.is_a?(Numeric)
197
- raise ValidationInvalidArgumentError
185
+ raise ValidationInvalidArgumentError, value
198
186
  end
199
187
 
200
188
  unless @type == :integer || @type == :float
201
- raise ValidationIncompatibleError
189
+ raise ValidationIncompatibleError, "The validation type #{@type} is not compatible with this argument type"
202
190
  end
203
191
 
204
192
  @less_than_or_equal_to_validation = LessThanOrEqualToValidation.new value
@@ -206,26 +194,26 @@ module DSLCompose
206
194
 
207
195
  def validate_format regexp
208
196
  if @format_validation
209
- raise ValidationAlreadyExistsError
197
+ raise ValidationAlreadyExistsError, "The validation `format` has already been applied to this method option."
210
198
  end
211
199
 
212
200
  unless regexp.is_a? Regexp
213
- raise ValidationInvalidArgumentError
201
+ raise ValidationInvalidArgumentError, regexp
214
202
  end
215
203
 
216
204
  unless @type == :string || @type == :symbol
217
- raise ValidationIncompatibleError
205
+ raise ValidationIncompatibleError, "The validation type #{@type} is not compatible with this argument type"
218
206
  end
219
207
  @format_validation = FormatValidation.new regexp
220
208
  end
221
209
 
222
210
  def validate_equal_to value
223
211
  if @equal_to_validation
224
- raise ValidationAlreadyExistsError
212
+ raise ValidationAlreadyExistsError, "The validation `equal_to` has already been applied to this method option."
225
213
  end
226
214
 
227
215
  unless @type == :integer || @type == :float || @type == :string || @type == :symbol || @type == :boolean
228
- raise ValidationIncompatibleError
216
+ raise ValidationIncompatibleError, "The validation type #{@type} is not compatible with this argument type"
229
217
  end
230
218
 
231
219
  @equal_to_validation = EqualToValidation.new value
@@ -233,15 +221,15 @@ module DSLCompose
233
221
 
234
222
  def validate_in values
235
223
  if @in_validation
236
- raise ValidationAlreadyExistsError
224
+ raise ValidationAlreadyExistsError, "The validation `in` has already been applied to this method option."
237
225
  end
238
226
 
239
227
  unless values.is_a? Array
240
- raise ValidationInvalidArgumentError
228
+ raise ValidationInvalidArgumentError, values
241
229
  end
242
230
 
243
231
  unless @type == :integer || @type == :float || @type == :string || @type == :symbol
244
- raise ValidationIncompatibleError
232
+ raise ValidationIncompatibleError, "The validation type #{@type} is not compatible with this argument type"
245
233
  end
246
234
 
247
235
  @in_validation = InValidation.new values
@@ -249,15 +237,15 @@ module DSLCompose
249
237
 
250
238
  def validate_not_in values
251
239
  if @not_in_validation
252
- raise ValidationAlreadyExistsError
240
+ raise ValidationAlreadyExistsError, "The validation `not_in` has already been applied to this method option."
253
241
  end
254
242
 
255
243
  unless values.is_a? Array
256
- raise ValidationInvalidArgumentError
244
+ raise ValidationInvalidArgumentError, values
257
245
  end
258
246
 
259
247
  unless @type == :integer || @type == :float || @type == :string || @type == :symbol
260
- raise ValidationIncompatibleError
248
+ raise ValidationIncompatibleError, "The validation type #{@type} is not compatible with this argument type"
261
249
  end
262
250
 
263
251
  @not_in_validation = NotInValidation.new values
@@ -265,11 +253,11 @@ module DSLCompose
265
253
 
266
254
  def validate_length maximum: nil, minimum: nil, is: nil
267
255
  if @length_validation
268
- raise ValidationAlreadyExistsError
256
+ raise ValidationAlreadyExistsError, "The validation `length` has already been applied to this method option."
269
257
  end
270
258
 
271
259
  unless @type == :string || @type == :symbol
272
- raise ValidationIncompatibleError
260
+ raise ValidationIncompatibleError, "The validation type #{@type} is not compatible with this argument type"
273
261
  end
274
262
 
275
263
  @length_validation = LengthValidation.new(maximum: maximum, minimum: minimum, is: is)
@@ -4,33 +4,18 @@ module DSLCompose
4
4
  class DSL
5
5
  class Arguments
6
6
  class ArgumentDoesNotExistError < StandardError
7
- def message
8
- "This argument does not exist for this DSLMethod"
9
- end
10
7
  end
11
8
 
12
9
  class ArgumentOrderingError < StandardError
13
- def message
14
- "Required arguments can not be added after optional ones"
15
- end
16
10
  end
17
11
 
18
12
  class ArgumentAlreadyExistsError < StandardError
19
- def message
20
- "An argument with this name already exists for this DSL method"
21
- end
22
13
  end
23
14
 
24
15
  class RequestedOptionalArgumentIsRequiredError < StandardError
25
- def message
26
- "A specific argument which was expected to be optional was requested, but the argument found was flagged as required"
27
- end
28
16
  end
29
17
 
30
18
  class RequestedRequiredArgumentIsOptionalError < StandardError
31
- def message
32
- "A specific argument which was expected to be required was requested, but the argument found was flagged as optional"
33
- end
34
19
  end
35
20
 
36
21
  def initialize
@@ -58,7 +43,7 @@ module DSLCompose
58
43
  if has_argument? name
59
44
  @arguments[name]
60
45
  else
61
- raise ArgumentDoesNotExistError
46
+ raise ArgumentDoesNotExistError, "The argument `#{name}` does not exist for this DSLMethod"
62
47
  end
63
48
  end
64
49
 
@@ -69,7 +54,7 @@ module DSLCompose
69
54
  if arg.optional?
70
55
  @arguments[name]
71
56
  else
72
- raise RequestedOptionalArgumentIsRequiredError
57
+ raise RequestedOptionalArgumentIsRequiredError, "A specific argument `#{name}` which was expected to be optional was requested, but the argument found was flagged as required"
73
58
  end
74
59
  end
75
60
 
@@ -80,7 +65,7 @@ module DSLCompose
80
65
  if arg.required?
81
66
  @arguments[name]
82
67
  else
83
- raise RequestedRequiredArgumentIsOptionalError
68
+ raise RequestedRequiredArgumentIsOptionalError, "A specific argument `#{name}` which was expected to be required was requested, but the argument found was flagged as optional"
84
69
  end
85
70
  end
86
71
 
@@ -98,12 +83,12 @@ module DSLCompose
98
83
  # or optional on the method which is exposed in our DSL.
99
84
  def add_argument name, required, type, &block
100
85
  if @arguments.key? name
101
- raise ArgumentAlreadyExistsError
86
+ raise ArgumentAlreadyExistsError, "An argument with the name `#{name}` already exists for this DSL method"
102
87
  end
103
88
 
104
89
  # required arguments may not come after optional ones
105
90
  if required && optional_arguments.any?
106
- raise ArgumentOrderingError
91
+ raise ArgumentOrderingError, "Required arguments can not be added after optional ones"
107
92
  end
108
93
 
109
94
  @arguments[name] = Argument.new(name, required, type, &block)
@@ -3,58 +3,16 @@
3
3
  module DSLCompose
4
4
  class DSL
5
5
  class DSLMethod
6
- class ArgumentDoesNotExistError < StandardError
7
- def message
8
- "This argument does not exist for this DSLMethod"
9
- end
10
- end
11
-
12
6
  class InvalidNameError < StandardError
13
- def message
14
- "The method #{method_name} is invalid, it must be of type symbol"
15
- end
16
7
  end
17
8
 
18
9
  class MethodNameIsReservedError < StandardError
19
- def message
20
- "This method already would override an existing internal method"
21
- end
22
10
  end
23
11
 
24
12
  class InvalidDescriptionError < StandardError
25
- def message
26
- "The DSL method description is invalid, it must be of type string and have length greater than 0"
27
- end
28
13
  end
29
14
 
30
15
  class DescriptionAlreadyExistsError < StandardError
31
- def message
32
- "The description has already been set"
33
- end
34
- end
35
-
36
- class ArgumentOrderingError < StandardError
37
- def message
38
- "Required arguments can not be added after optional ones"
39
- end
40
- end
41
-
42
- class ArgumentAlreadyExistsError < StandardError
43
- def message
44
- "An argument with this name already exists for this DSL method"
45
- end
46
- end
47
-
48
- class RequestedOptionalArgumentIsRequiredError < StandardError
49
- def message
50
- "A specific argument which was expected to be optional was requested, but the argument found was flagged as required"
51
- end
52
- end
53
-
54
- class RequestedRequiredArgumentIsOptionalError < StandardError
55
- def message
56
- "A specific argument which was expected to be required was requested, but the argument found was flagged as optional"
57
- end
58
16
  end
59
17
 
60
18
  # The name of this DSLMethod.
@@ -82,12 +40,12 @@ module DSLCompose
82
40
 
83
41
  # don't allow methods to override existing internal methods
84
42
  if Class.respond_to? name
85
- raise MethodNameIsReservedError
43
+ raise MethodNameIsReservedError, "This method #{name} would override an existing internal method"
86
44
  end
87
45
 
88
46
  @name = name
89
47
  else
90
- raise InvalidNameError
48
+ raise InvalidNameError, "The method name `#{name}` is invalid, it must be of type symbol"
91
49
  end
92
50
 
93
51
  @unique = unique ? true : false
@@ -101,6 +59,8 @@ module DSLCompose
101
59
  if block
102
60
  Interpreter.new(self).instance_eval(&block)
103
61
  end
62
+ rescue => e
63
+ raise e, "Error defining method #{name}: #{e.message}", e.backtrace
104
64
  end
105
65
 
106
66
  # Set the description for this DSLMethod to the provided value.
@@ -109,11 +69,11 @@ module DSLCompose
109
69
  # The `description` can only be set once per DSLMethod
110
70
  def set_description description
111
71
  unless description.is_a?(String) && description.length > 0
112
- raise InvalidDescriptionError
72
+ raise InvalidDescriptionError, "The DSL method description `#{description}` is invalid, it must be of type string and have length greater than 0"
113
73
  end
114
74
 
115
75
  if has_description?
116
- raise DescriptionAlreadyExistsError
76
+ raise DescriptionAlreadyExistsError, "The description has already been set"
117
77
  end
118
78
 
119
79
  @description = description
@@ -7,39 +7,21 @@ module DSLCompose
7
7
  # by calling `define_dsl` in a class and passing it a block which contains the DSL definition
8
8
  class DSL
9
9
  class MethodDoesNotExistError < StandardError
10
- def message
11
- "This method does not exist for this DSL"
12
- end
13
10
  end
14
11
 
15
12
  class MethodAlreadyExistsError < StandardError
16
- def message
17
- "This method already exists for this DSL"
18
- end
19
13
  end
20
14
 
21
15
  class InvalidNameError < StandardError
22
- def message
23
- "This DSL name is invalid, it must be of type symbol"
24
- end
25
16
  end
26
17
 
27
18
  class InvalidDescriptionError < StandardError
28
- def message
29
- "This DSL description is invalid, it must be of type string and have length greater than 0"
30
- end
31
19
  end
32
20
 
33
21
  class DescriptionAlreadyExistsError < StandardError
34
- def message
35
- "The DSL description has already been set"
36
- end
37
22
  end
38
23
 
39
24
  class NoBlockProvidedError < StandardError
40
- def message
41
- "No block was provided for this DSL"
42
- end
43
25
  end
44
26
 
45
27
  # The name of this DSL.
@@ -64,7 +46,7 @@ module DSLCompose
64
46
  if name.is_a? Symbol
65
47
  @name = name
66
48
  else
67
- raise InvalidNameError
49
+ raise InvalidNameError, "The DSL name `#{name}` is invalid, it must be of type symbol"
68
50
  end
69
51
 
70
52
  @klass = klass
@@ -81,8 +63,10 @@ module DSLCompose
81
63
  # would have access to all of the methods defined in here.
82
64
  Interpreter.new(self).instance_eval(&block)
83
65
  else
84
- raise NoBlockProvidedError
66
+ raise NoBlockProvidedError, "No block was provided for this DSL"
85
67
  end
68
+ rescue => e
69
+ raise e, "Error defining DSL #{@name} on #{@klass}: #{e.message}", e.backtrace
86
70
  end
87
71
 
88
72
  # Set the description for this DSL to the provided value.
@@ -91,11 +75,11 @@ module DSLCompose
91
75
  # The `description` can only be set once per DSL
92
76
  def set_description description
93
77
  unless description.is_a?(String) && description.length > 0
94
- raise InvalidDescriptionError
78
+ raise InvalidDescriptionError, "The DSL description `#{description}` is invalid, it must be of type string and have length greater than 0"
95
79
  end
96
80
 
97
81
  if has_description?
98
- raise DescriptionAlreadyExistsError
82
+ raise DescriptionAlreadyExistsError, "The DSL description has already been set"
99
83
  end
100
84
 
101
85
  @description = description
@@ -112,7 +96,7 @@ module DSLCompose
112
96
  # Method `name` must be unique within the DSL.
113
97
  def add_method name, unique, required, &block
114
98
  if has_dsl_method? name
115
- raise MethodAlreadyExistsError
99
+ raise MethodAlreadyExistsError, "The method `#{name}` already exists for this DSL"
116
100
  end
117
101
 
118
102
  @dsl_methods[name] = DSLMethod.new(name, unique, required, &block)
@@ -139,7 +123,7 @@ module DSLCompose
139
123
  if has_dsl_method? name
140
124
  @dsl_methods[name]
141
125
  else
142
- raise MethodDoesNotExistError
126
+ raise MethodDoesNotExistError, "The method `#{name}` does not exist for this DSL"
143
127
  end
144
128
  end
145
129
 
@@ -3,21 +3,12 @@
3
3
  module DSLCompose
4
4
  module DSLs
5
5
  class ClassDSLDefinitionDoesNotExistError < StandardError
6
- def message
7
- "The requested DSL does not exist on this class"
8
- end
9
6
  end
10
7
 
11
8
  class DSLAlreadyExistsError < StandardError
12
- def message
13
- "A DSL with this name already exists"
14
- end
15
9
  end
16
10
 
17
11
  class NoDSLDefinitionsForClassError < StandardError
18
- def message
19
- "No DSLs have been defined for this class"
20
- end
21
12
  end
22
13
 
23
14
  # an object to hold all of the defined DSLs in our application, the DSLs are
@@ -30,7 +21,7 @@ module DSLCompose
30
21
  @dsls[klass] ||= {}
31
22
 
32
23
  if @dsls[klass].key? name
33
- raise DSLAlreadyExistsError
24
+ raise DSLAlreadyExistsError, "A DSL with the name `#{name}` already exists"
34
25
  end
35
26
 
36
27
  @dsls[klass][name] = DSLCompose::DSL.new(name, klass)
@@ -53,7 +44,7 @@ module DSLCompose
53
44
  if @dsls.key? klass
54
45
  @dsls[klass].values
55
46
  else
56
- raise NoDSLDefinitionsForClassError
47
+ raise NoDSLDefinitionsForClassError, "No DSLs have been defined for this class"
57
48
  end
58
49
  end
59
50
 
@@ -64,10 +55,10 @@ module DSLCompose
64
55
  if @dsls[klass].key? name
65
56
  @dsls[klass][name]
66
57
  else
67
- raise ClassDSLDefinitionDoesNotExistError
58
+ raise ClassDSLDefinitionDoesNotExistError, "The requested DSL `#{name}` does not exist on this class"
68
59
  end
69
60
  else
70
- raise NoDSLDefinitionsForClassError
61
+ raise NoDSLDefinitionsForClassError, "No DSLs have been defined for this class"
71
62
  end
72
63
  end
73
64
 
@@ -5,27 +5,15 @@ module DSLCompose
5
5
  class Execution
6
6
  class Arguments
7
7
  class MissingRequiredArgumentsError < StandardError
8
- def initialize required_count, provided_count
9
- super "This requires #{required_count} arguments, but only #{provided_count} were provided"
10
- end
11
8
  end
12
9
 
13
10
  class TooManyArgumentsError < StandardError
14
- def message
15
- "Too many arguments provided"
16
- end
17
11
  end
18
12
 
19
- class OptionalArgsShouldBeHashError < StandardError
20
- def message
21
- "If provided, then the optional arguments must be last, and be represented as a Hash"
22
- end
13
+ class OptionalArgumentsShouldBeHashError < StandardError
23
14
  end
24
15
 
25
16
  class InvalidArgumentTypeError < StandardError
26
- def message
27
- "The provided argument is the wrong type"
28
- end
29
17
  end
30
18
 
31
19
  attr_reader :arguments
@@ -45,18 +33,18 @@ module DSLCompose
45
33
 
46
34
  # assert that a value is provided for every required argument
47
35
  unless required_argument_count == required_args.count
48
- raise MissingRequiredArgumentsError.new required_argument_count, required_args.count
36
+ raise MissingRequiredArgumentsError, "This requires #{required_argument_count} arguments, but only #{required_args.count} were provided"
49
37
  end
50
38
 
51
39
  # assert that too many arguments have not been provided
52
40
  if args.count > required_argument_count + (has_optional_arguments ? 1 : 0)
53
- raise TooManyArgumentsError
41
+ raise TooManyArgumentsError, "Too many arguments provided"
54
42
  end
55
43
 
56
44
  # asset that, if provided, then the optional argument (always the last one) is a Hash
57
45
  if has_optional_arguments && optional_arg.nil? === false
58
46
  unless optional_arg.is_a? Hash
59
- raise OptionalArgsShouldBeHashError
47
+ raise OptionalArgumentsShouldBeHashError, "If provided, then the optional arguments must be last, and be represented as a Hash"
60
48
  end
61
49
 
62
50
  # assert the each provided optional argument is valid
@@ -67,72 +55,82 @@ module DSLCompose
67
55
  case optional_argument.type
68
56
  when :integer
69
57
  unless optional_arg_value.is_a? Integer
70
- raise InvalidArgumentTypeError
58
+ raise InvalidArgumentTypeError, "#{optional_arg_value} is not an Integer"
71
59
  end
72
60
  optional_argument.validate_integer! optional_arg_value
73
61
 
74
62
  when :symbol
75
63
  unless optional_arg_value.is_a? Symbol
76
- raise InvalidArgumentTypeError
64
+ raise InvalidArgumentTypeError, "#{optional_arg_value} is not a Symbol"
77
65
  end
78
66
  optional_argument.validate_symbol! optional_arg_value
79
67
 
80
68
  when :string
81
69
  unless optional_arg_value.is_a? String
82
- raise InvalidArgumentTypeError
70
+ raise InvalidArgumentTypeError, "#{optional_arg_value} is not a String"
83
71
  end
84
72
  optional_argument.validate_string! optional_arg_value
85
73
 
86
74
  when :boolean
87
75
  unless optional_arg_value.is_a?(TrueClass) || optional_arg_value.is_a?(FalseClass)
88
- raise InvalidArgumentTypeError
76
+ raise InvalidArgumentTypeError, "#{optional_arg_value} is not a boolean"
89
77
  end
90
78
  optional_argument.validate_boolean! optional_arg_value
91
79
 
92
80
  else
93
- raise InvalidArgumentTypeError
81
+ raise InvalidArgumentTypeError, "The argument #{optional_arg_value} is not a supported type"
94
82
  end
95
83
 
96
84
  # the provided value appears valid for this argument, save the value
97
85
  @arguments[optional_argument_name] = optional_arg_value
86
+
87
+ rescue => e
88
+ raise e, "Error processing optional argument #{optional_argument_name}: #{e.message}", e.backtrace
98
89
  end
99
90
 
100
91
  end
101
92
 
102
93
  # validate the value provided to each required argument
103
94
  arguments.required_arguments.each_with_index do |required_argument, i|
95
+ # make sure we always have an argument_name for the exception below
96
+ argument_name = nil
97
+ argument_name = required_argument.name
98
+
104
99
  arg = args[i]
105
100
  case required_argument.type
106
101
  when :integer
107
102
  unless arg.is_a? Integer
108
- raise InvalidArgumentTypeError
103
+ raise InvalidArgumentTypeError, "#{arg} is not an Integer"
109
104
  end
110
105
  required_argument.validate_integer! arg
111
106
 
112
107
  when :symbol
113
108
  unless arg.is_a? Symbol
114
- raise InvalidArgumentTypeError
109
+ raise InvalidArgumentTypeError, "#{arg} is not a Symbol"
115
110
  end
116
111
  required_argument.validate_symbol! arg
117
112
 
118
113
  when :string
119
114
  unless arg.is_a? String
120
- raise InvalidArgumentTypeError
115
+ raise InvalidArgumentTypeError, "#{arg} is not a String"
121
116
  end
122
117
  required_argument.validate_string! arg
123
118
 
124
119
  when :boolean
125
120
  unless arg.is_a?(TrueClass) || arg.is_a?(FalseClass)
126
- raise InvalidArgumentTypeError
121
+ raise InvalidArgumentTypeError, "#{arg} is not a boolean"
127
122
  end
128
123
  required_argument.validate_boolean! arg
129
124
 
130
125
  else
131
- raise InvalidArgumentTypeError
126
+ raise InvalidArgumentTypeError, "The argument #{arg} is not a supported type"
132
127
  end
133
128
 
134
129
  # the provided value appears valid for this argument, save the value
135
130
  @arguments[required_argument.name] = arg
131
+
132
+ rescue => e
133
+ raise e, "Error processing required argument #{argument_name}: #{e.message}", e.backtrace
136
134
  end
137
135
  end
138
136
 
@@ -8,30 +8,6 @@ module DSLCompose
8
8
  attr_reader :dsl_method
9
9
  attr_reader :arguments
10
10
 
11
- class MissingRequiredArgumentsError < StandardError
12
- def initialize required_count, provided_count
13
- super "This method requires #{required_count} arguments, but only #{required_count} were provided"
14
- end
15
- end
16
-
17
- class TooManyArgumentsError < StandardError
18
- def message
19
- "Too many arguments provided to this method"
20
- end
21
- end
22
-
23
- class OptionalArgsShouldBeHashError < StandardError
24
- def message
25
- "If provided, then the optional arguments must be last, and be represented as a Hash"
26
- end
27
- end
28
-
29
- class InvalidArgumentTypeError < StandardError
30
- def message
31
- "The provided argument is the wrong type"
32
- end
33
- end
34
-
35
11
  def initialize dsl_method, *args, &block
36
12
  @dsl_method = dsl_method
37
13
  @arguments = Arguments.new(dsl_method.arguments, *args)
@@ -15,9 +15,15 @@ module DSLCompose
15
15
  end
16
16
 
17
17
  def add_method_call dsl_method, *args, &block
18
+ # make sure we always have a variable which can be used in the exception message
19
+ dsl_method_name = nil
20
+ dsl_method_name = dsl_method.name
21
+
18
22
  method_call = MethodCall.new(dsl_method, *args, &block)
19
23
  @method_calls << method_call
20
24
  method_call
25
+ rescue => e
26
+ raise e, "Error while executing method #{dsl_method_name}: #{e.message}", e.backtrace
21
27
  end
22
28
 
23
29
  def method_calls_by_name method_name
@@ -4,15 +4,9 @@ module DSLCompose
4
4
  class Interpreter
5
5
  class Execution
6
6
  class MethodIsUniqueError < StandardError
7
- def message
8
- "This method is unique and can only be called once within this DSL"
9
- end
10
7
  end
11
8
 
12
9
  class RequiredMethodNotCalledError < StandardError
13
- def message
14
- "This method is required, but was not called within this DSL"
15
- end
16
10
  end
17
11
 
18
12
  attr_reader :dsl
@@ -36,7 +30,8 @@ module DSLCompose
36
30
  # assert that all required methods have been called at least once
37
31
  dsl.required_dsl_methods.each do |dsl_method|
38
32
  unless @method_calls.method_called? dsl_method.name
39
- raise RequiredMethodNotCalledError
33
+ dsl_method_name = dsl_method&.name
34
+ raise RequiredMethodNotCalledError, "The method #{dsl_method_name} is required, but was not called within this DSL"
40
35
  end
41
36
  end
42
37
  end
@@ -50,7 +45,7 @@ module DSLCompose
50
45
 
51
46
  # if the method is unique, then it can only be called once per DSL
52
47
  if dsl_method.unique? && @method_calls.method_called?(method_name)
53
- raise MethodIsUniqueError
48
+ raise MethodIsUniqueError, "This method `#{method_name}` is unique and can only be called once within this DSL"
54
49
  end
55
50
 
56
51
  @method_calls.add_method_call dsl_method, *args, &block
@@ -17,9 +17,17 @@ module DSLCompose
17
17
  # `klass` is the class in which the DSL is being used, not
18
18
  # the class in which the DSL was defined.
19
19
  def execute_dsl klass, dsl, *args, &block
20
+ # make sure we have these variables for the exception message below
21
+ class_name = nil
22
+ class_name = klass.name
23
+ dsl_name = nil
24
+ dsl_name = dsl.name
25
+
20
26
  execution = Execution.new(klass, dsl, *args, &block)
21
27
  @executions << execution
22
28
  execution
29
+ rescue => e
30
+ raise e, "Error processing dsl #{dsl_name} for class #{class_name}: #{e.message}", e.backtrace
23
31
  end
24
32
 
25
33
  # Returns an array of all executions for a given class.
@@ -6,9 +6,6 @@ module DSLCompose
6
6
  class ForDSLParser
7
7
  class ForMethodParser
8
8
  class AllBlockParametersMustBeKeywordParametersError < StandardError
9
- def message
10
- "All block parameters must be keyword parameters, i.e. `for_children_of FooClass do |base_class:|`"
11
- end
12
9
  end
13
10
 
14
11
  class NoBlockProvided < StandardError
@@ -18,9 +15,6 @@ module DSLCompose
18
15
  end
19
16
 
20
17
  class MethodNamesShouldBeSymbolsError < StandardError
21
- def message
22
- "Method names must be provided with a symbol or array of symbols"
23
- end
24
18
  end
25
19
 
26
20
  # This class will yield to the provided block once for each time a method
@@ -43,7 +37,7 @@ module DSLCompose
43
37
  if block.parameters.any?
44
38
  # all parameters must be keyword arguments
45
39
  if block.parameters.filter { |p| p.first != :keyreq }.any?
46
- raise AllBlockParametersMustBeKeywordParametersError
40
+ raise AllBlockParametersMustBeKeywordParametersError, "All block parameters must be keyword parameters, i.e. `for_children_of FooClass do |base_class:|`"
47
41
  end
48
42
  end
49
43
 
@@ -54,17 +48,17 @@ module DSLCompose
54
48
 
55
49
  # assert that the provided dsl name is an array
56
50
  unless method_names.is_a? Array
57
- raise MethodNamesShouldBeSymbolsError
51
+ raise MethodNamesShouldBeSymbolsError, "Method names `#{method_names}` must be provided with a symbol or array of symbols"
58
52
  end
59
53
 
60
54
  # assert that the provided dsl name is an array of symbols
61
55
  unless method_names.all? { |method_name| method_name.is_a? Symbol }
62
- raise MethodNamesShouldBeSymbolsError
56
+ raise MethodNamesShouldBeSymbolsError, "Method names `#{method_names}` must be provided with a symbol or array of symbols"
63
57
  end
64
58
 
65
59
  # assert that the provided method names all exist for the scoped DSL
66
60
  unless method_names.all? { |method_name| dsl_execution.dsl.has_dsl_method?(method_name) }
67
- raise MethodDoesNotExistError
61
+ raise MethodDoesNotExistError, "Method names `#{method_names}` must all exist"
68
62
  end
69
63
 
70
64
  # for each provided dsl name, yield to the provided block
@@ -5,9 +5,6 @@ module DSLCompose
5
5
  class ForChildrenOfParser
6
6
  class ForDSLParser
7
7
  class AllBlockParametersMustBeKeywordParametersError < StandardError
8
- def message
9
- "All block parameters must be keyword parameters, i.e. `for_dsl :dsl_name do |dsl_name:|`"
10
- end
11
8
  end
12
9
 
13
10
  class NoBlockProvided < StandardError
@@ -17,9 +14,6 @@ module DSLCompose
17
14
  end
18
15
 
19
16
  class DSLNamesShouldBeSymbolsError < StandardError
20
- def message
21
- "DSL names must be provided with a symbol or array of symbols"
22
- end
23
17
  end
24
18
 
25
19
  # This class will yield to the provided block once for each time a DSL
@@ -40,7 +34,7 @@ module DSLCompose
40
34
  if block.parameters.any?
41
35
  # all parameters must be keyword arguments
42
36
  if block.parameters.filter { |p| p.first != :keyreq }.any?
43
- raise AllBlockParametersMustBeKeywordParametersError
37
+ raise AllBlockParametersMustBeKeywordParametersError, "All block parameters must be keyword parameters, i.e. `for_dsl :dsl_name do |dsl_name:|`"
44
38
  end
45
39
  end
46
40
 
@@ -51,17 +45,17 @@ module DSLCompose
51
45
 
52
46
  # assert that the provided dsl name is an array
53
47
  unless dsl_names.is_a? Array
54
- raise DSLNamesShouldBeSymbolsError
48
+ raise DSLNamesShouldBeSymbolsError, "DSL names `#{dsl_names}` must be provided with a symbol or array of symbols"
55
49
  end
56
50
 
57
51
  # assert that the provided dsl name is an array of symbols
58
52
  unless dsl_names.all? { |dsl_name| dsl_name.is_a? Symbol }
59
- raise DSLNamesShouldBeSymbolsError
53
+ raise DSLNamesShouldBeSymbolsError, "DSL names `#{dsl_names}` must be provided with a symbol or array of symbols"
60
54
  end
61
55
 
62
56
  # assert that the provided dsl names all exist
63
57
  unless dsl_names.all? { |dsl_name| DSLs.class_dsl_exists?(base_class, dsl_name) }
64
- raise DSLDoesNotExistError
58
+ raise DSLDoesNotExistError, "DSLs named `#{dsl_names}` must all exist"
65
59
  end
66
60
 
67
61
  # for each provided dsl name, yield to the provided block
@@ -4,9 +4,6 @@ module DSLCompose
4
4
  class Parser
5
5
  class ForChildrenOfParser
6
6
  class AllBlockParametersMustBeKeywordParametersError < StandardError
7
- def message
8
- "All block parameters must be keyword parameters, i.e. `for_children_of FooClass do |base_class:|`"
9
- end
10
7
  end
11
8
 
12
9
  class ClassDoesNotUseDSLComposeError < StandardError
@@ -16,9 +13,6 @@ module DSLCompose
16
13
  end
17
14
 
18
15
  class NoChildClassError < StandardError
19
- def message
20
- "No child_class was found, please call this method from within a `for_children_of` block"
21
- end
22
16
  end
23
17
 
24
18
  # This class will yield to the provided block for each class which extends the base_class, provided
@@ -26,7 +20,7 @@ module DSLCompose
26
20
  def initialize base_class, &block
27
21
  # assert the provided class has the DSLCompose::Composer module installed
28
22
  unless base_class.respond_to? :dsls
29
- raise ClassDoesNotUseDSLComposeError
23
+ raise ClassDoesNotUseDSLComposeError, base_class
30
24
  end
31
25
 
32
26
  @base_class = base_class
@@ -40,7 +34,7 @@ module DSLCompose
40
34
  if block.parameters.any?
41
35
  # all parameters must be keyword arguments
42
36
  if block.parameters.filter { |p| p.first != :keyreq }.any?
43
- raise AllBlockParametersMustBeKeywordParametersError
37
+ raise AllBlockParametersMustBeKeywordParametersError, "All block parameters must be keyword parameters, i.e. `for_children_of FooClass do |base_class:|`"
44
38
  end
45
39
  end
46
40
 
@@ -78,7 +72,7 @@ module DSLCompose
78
72
  child_class = @child_class
79
73
 
80
74
  unless child_class
81
- raise NoChildClassError
75
+ raise NoChildClassError, "No child_class was found, please call this method from within a `for_children_of` block"
82
76
  end
83
77
 
84
78
  ForDSLParser.new(@base_class, child_class, dsl_names, &block)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DSLCompose
4
- VERSION = "1.6.0"
4
+ VERSION = "1.7.0"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dsl_compose
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.0
4
+ version: 1.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Craig Ulliott