nrser 0.2.2 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/nrser/char/alpha_numeric_sub.rb +1 -2
- data/lib/nrser/char.rb +0 -6
- data/lib/nrser/core_ext/array.rb +120 -0
- data/lib/nrser/core_ext/binding.rb +44 -0
- data/lib/nrser/{functions → core_ext}/enumerable/find_map.rb +18 -15
- data/lib/nrser/{ext → core_ext}/enumerable.rb +10 -24
- data/lib/nrser/core_ext/exception.rb +30 -0
- data/lib/nrser/core_ext/hash/extract_values_at.rb +49 -0
- data/lib/nrser/core_ext/hash/transform_values_with_keys.rb +24 -0
- data/lib/nrser/core_ext/hash.rb +50 -0
- data/lib/nrser/core_ext/module/method_objects.rb +96 -0
- data/lib/nrser/core_ext/module/names.rb +69 -0
- data/lib/nrser/core_ext/module/source_locations.rb +214 -0
- data/lib/nrser/core_ext/module.rb +2 -0
- data/lib/nrser/core_ext/object/lazy_var.rb +31 -0
- data/lib/nrser/core_ext/object.rb +46 -0
- data/lib/nrser/core_ext/open_struct.rb +6 -0
- data/lib/nrser/{ext → core_ext}/pathname.rb +8 -5
- data/lib/nrser/{ext → core_ext}/string.rb +6 -12
- data/lib/nrser/core_ext/symbol.rb +13 -0
- data/lib/nrser/core_ext/time.rb +46 -0
- data/lib/nrser/core_ext.rb +13 -0
- data/lib/nrser/errors/abstract_method_error.rb +150 -0
- data/lib/nrser/errors/argument_error.rb +42 -0
- data/lib/nrser/errors/nicer_error.rb +298 -72
- data/lib/nrser/errors/type_error.rb +46 -0
- data/lib/nrser/errors.rb +4 -53
- data/lib/nrser/ext/tree.rb +3 -0
- data/lib/nrser/functions/enumerable/associate.rb +6 -9
- data/lib/nrser/functions/enumerable/include_slice.rb +2 -3
- data/lib/nrser/functions/enumerable.rb +1 -3
- data/lib/nrser/functions/exception.rb +1 -1
- data/lib/nrser/functions/hash.rb +0 -6
- data/lib/nrser/functions/merge_by.rb +2 -2
- data/lib/nrser/functions/module/method_objects.rb +77 -0
- data/lib/nrser/functions/module.rb +1 -2
- data/lib/nrser/functions/open_struct.rb +25 -35
- data/lib/nrser/functions/proc.rb +1 -6
- data/lib/nrser/functions/string/looks_like.rb +32 -1
- data/lib/nrser/functions/string.rb +1 -40
- data/lib/nrser/functions/text/lines.rb +2 -1
- data/lib/nrser/functions.rb +0 -1
- data/lib/nrser/graph/tsorter.rb +41 -0
- data/lib/nrser/labs/core_ext/binding.rb +37 -0
- data/lib/nrser/labs/stash.rb +372 -0
- data/lib/nrser/{logging → log}/appender/sync.rb +3 -3
- data/lib/nrser/log/appender.rb +3 -0
- data/lib/nrser/{logging → log}/formatters/color.rb +47 -20
- data/lib/nrser/log/formatters/mixin.rb +270 -0
- data/lib/nrser/{logging → log}/formatters.rb +0 -0
- data/lib/nrser/log/logger.rb +229 -0
- data/lib/nrser/log/mixin.rb +56 -0
- data/lib/nrser/log.rb +723 -0
- data/lib/nrser/message.rb +24 -3
- data/lib/nrser/meta/source/location.rb +158 -0
- data/lib/nrser/meta.rb +1 -1
- data/lib/nrser/props/class_methods.rb +118 -0
- data/lib/nrser/props/immutable/hash.rb +111 -0
- data/lib/nrser/props/immutable/hash_variable.rb +82 -0
- data/lib/nrser/props/immutable/instance_variables.rb +48 -0
- data/lib/nrser/props/immutable/vector.rb +107 -0
- data/lib/nrser/props/instance_methods.rb +184 -0
- data/lib/nrser/props/metadata.rb +359 -0
- data/lib/nrser/props/mutable/instance_variables.rb +60 -0
- data/lib/nrser/props/mutable/stash.rb +199 -0
- data/lib/nrser/{meta/props → props}/prop.rb +217 -112
- data/lib/nrser/props/storage/instance_variable.rb +85 -0
- data/lib/nrser/props/storage/instance_variables.rb +67 -0
- data/lib/nrser/props/storage/key.rb +88 -0
- data/lib/nrser/props.rb +9 -0
- data/lib/nrser/refinements/sugar.rb +41 -0
- data/lib/nrser/refinements/types.rb +2 -2
- data/lib/nrser/refinements.rb +14 -16
- data/lib/nrser/rspex/example_group/describe_attribute.rb +24 -0
- data/lib/nrser/rspex/example_group/describe_called_with.rb +1 -6
- data/lib/nrser/rspex/example_group/{describe_use_case.rb → describe_case.rb} +6 -3
- data/lib/nrser/rspex/example_group/describe_class.rb +1 -0
- data/lib/nrser/rspex/example_group/describe_group.rb +29 -0
- data/lib/nrser/rspex/example_group/describe_instance_method.rb +2 -2
- data/lib/nrser/rspex/example_group/describe_message.rb +35 -0
- data/lib/nrser/rspex/example_group/describe_method.rb +23 -2
- data/lib/nrser/rspex/example_group/describe_module.rb +19 -0
- data/lib/nrser/rspex/example_group/describe_response_to.rb +32 -0
- data/lib/nrser/rspex/example_group/describe_section.rb +38 -0
- data/lib/nrser/rspex/example_group/describe_sent_to.rb +52 -0
- data/lib/nrser/rspex/example_group/describe_source_file.rb +49 -0
- data/lib/nrser/rspex/example_group/describe_spec_file.rb +41 -108
- data/lib/nrser/rspex/example_group/describe_when.rb +14 -7
- data/lib/nrser/rspex/example_group/describe_x.rb +39 -12
- data/lib/nrser/rspex/example_group/overrides.rb +66 -0
- data/lib/nrser/rspex/example_group.rb +20 -252
- data/lib/nrser/rspex/format.rb +83 -17
- data/lib/nrser/rspex.rb +4 -34
- data/lib/nrser/sugar/method_missing_forwarder.rb +50 -0
- data/lib/nrser/{env → sys/env}/path.rb +1 -2
- data/lib/nrser/{env.rb → sys/env.rb} +2 -1
- data/lib/nrser/sys.rb +5 -0
- data/lib/nrser/types/any.rb +36 -7
- data/lib/nrser/types/{array.rb → arrays.rb} +32 -81
- data/lib/nrser/types/attrs.rb +68 -15
- data/lib/nrser/types/booleans.rb +95 -34
- data/lib/nrser/types/bounded.rb +12 -10
- data/lib/nrser/types/combinators.rb +74 -37
- data/lib/nrser/types/errors/check_error.rb +86 -0
- data/lib/nrser/types/errors/from_string_error.rb +82 -0
- data/lib/nrser/types/factory.rb +91 -0
- data/lib/nrser/types/hashes.rb +171 -26
- data/lib/nrser/types/in.rb +25 -12
- data/lib/nrser/types/is.rb +50 -18
- data/lib/nrser/types/is_a.rb +52 -33
- data/lib/nrser/types/labels.rb +6 -33
- data/lib/nrser/types/maybe.rb +12 -4
- data/lib/nrser/types/nil.rb +24 -4
- data/lib/nrser/types/not.rb +6 -16
- data/lib/nrser/types/numbers.rb +94 -57
- data/lib/nrser/types/pairs.rb +57 -57
- data/lib/nrser/types/paths.rb +112 -133
- data/lib/nrser/types/responds.rb +64 -74
- data/lib/nrser/types/shape.rb +29 -24
- data/lib/nrser/types/strings.rb +25 -17
- data/lib/nrser/types/symbols.rb +19 -17
- data/lib/nrser/types/trees.rb +18 -70
- data/lib/nrser/types/tuples.rb +36 -40
- data/lib/nrser/types/type.rb +342 -91
- data/lib/nrser/types/when.rb +40 -18
- data/lib/nrser/types/where.rb +94 -9
- data/lib/nrser/types.rb +72 -63
- data/lib/nrser/version.rb +1 -1
- data/lib/nrser.rb +18 -18
- data/spec/lib/nrser/{functions/binding/template_spec.rb → core_ext/binding/erb_spec.rb} +5 -5
- data/spec/lib/nrser/{functions → core_ext}/enumerable/find_map_spec.rb +8 -6
- data/spec/lib/nrser/{refinements → core_ext}/hash_spec.rb +9 -22
- data/spec/lib/nrser/errors/abstract_method_error_spec.rb +12 -5
- data/spec/lib/nrser/functions/enumerable/{to_h_by_spec.rb → associate_spec.rb} +1 -1
- data/spec/lib/nrser/functions/merge_by_spec.rb +1 -1
- data/spec/lib/nrser/functions/tree/each_branch_spec.rb +3 -3
- data/spec/lib/nrser/functions/tree/transform_spec.rb +14 -15
- data/spec/lib/nrser/gem_ext/hamster/json_spec.rb +4 -0
- data/spec/lib/nrser/meta/source/location_spec.rb +86 -0
- data/spec/lib/nrser/props/immutable/hash_spec.rb +297 -0
- data/spec/lib/nrser/props/immutable/vector_spec.rb +296 -0
- data/spec/lib/nrser/{meta/props_spec.rb → props/original_props_spec.rb} +11 -16
- data/spec/lib/nrser/{meta/props → props}/to_and_from_data_spec.rb +10 -8
- data/spec/lib/nrser/refinements/array_spec.rb +2 -15
- data/spec/lib/nrser/refinements/erb_spec.rb +5 -7
- data/spec/lib/nrser/refinements/set_spec.rb +2 -15
- data/spec/lib/nrser/{env → sys/env}/path/insert_spec.rb +4 -2
- data/spec/lib/nrser/{env → sys/env}/path_spec.rb +4 -2
- data/spec/lib/nrser/types/array_spec.rb +8 -8
- data/spec/lib/nrser/types/paths_spec.rb +15 -18
- data/spec/spec_helper.rb +4 -0
- metadata +109 -69
- data/lib/nrser/ext/binding.rb +0 -36
- data/lib/nrser/ext/module.rb +0 -62
- data/lib/nrser/ext.rb +0 -8
- data/lib/nrser/functions/binding.rb +0 -76
- data/lib/nrser/functions/enumerable/map_keys.rb +0 -0
- data/lib/nrser/functions/enumerable/map_values.rb +0 -94
- data/lib/nrser/functions/hash/deep_merge.rb +0 -57
- data/lib/nrser/functions/hash/except_keys.rb +0 -44
- data/lib/nrser/functions/hash/slice_keys.rb +0 -43
- data/lib/nrser/functions/hash/stringify_keys.rb +0 -55
- data/lib/nrser/functions/hash/symbolize_keys.rb +0 -57
- data/lib/nrser/functions/hash/transform_keys.rb +0 -140
- data/lib/nrser/functions/module/methods.rb +0 -206
- data/lib/nrser/functions/module/source_locations.rb +0 -213
- data/lib/nrser/logging/appender.rb +0 -3
- data/lib/nrser/logging.rb +0 -353
- data/lib/nrser/meta/props/base.rb +0 -31
- data/lib/nrser/meta/props.rb +0 -357
- data/lib/nrser/refinements/array.rb +0 -133
- data/lib/nrser/refinements/binding.rb +0 -6
- data/lib/nrser/refinements/enumerator.rb +0 -5
- data/lib/nrser/refinements/exception.rb +0 -35
- data/lib/nrser/refinements/hash.rb +0 -150
- data/lib/nrser/refinements/module.rb +0 -5
- data/lib/nrser/refinements/object.rb +0 -42
- data/lib/nrser/refinements/open_struct.rb +0 -28
- data/lib/nrser/refinements/pathname.rb +0 -5
- data/lib/nrser/refinements/set.rb +0 -5
- data/lib/nrser/refinements/string.rb +0 -5
- data/lib/nrser/refinements/symbol.rb +0 -20
- data/lib/nrser/rspex/described.rb +0 -99
- data/spec/design/mapping_spec.rb +0 -42
- data/spec/lib/nrser/functions/hash_spec.rb +0 -41
- data/spec/lib/nrser/functions/string/truncate_spec.rb +0 -11
- data/spec/lib/nrser/refinements/truncate_spec.rb +0 -10
@@ -6,261 +6,29 @@
|
|
6
6
|
# =======================================================================
|
7
7
|
|
8
8
|
module NRSER::RSpex; end
|
9
|
+
module NRSER::RSpex::ExampleGroup; end
|
9
10
|
|
10
11
|
|
11
|
-
#
|
12
|
-
#
|
13
|
-
|
14
|
-
# Instance methods to extend examples groups with. Also included globally so
|
15
|
-
# they're available at the top-level in files.
|
16
|
-
#
|
17
|
-
module NRSER::RSpex::ExampleGroup
|
18
|
-
|
19
|
-
# HACK HACK HACK-ITY HACK - Allow for overriding RSpec methods
|
20
|
-
#
|
21
|
-
# Yeah, it has to do with mixin mixing-in ordering - seems to be that when
|
22
|
-
#
|
23
|
-
# config.extend NRSER::RSpex::ExampleGroup
|
24
|
-
#
|
25
|
-
# {NRSER::RSpex::ExampleGroup} gets mixed in *very early* in the chain,
|
26
|
-
# before {RSpec::Core::ExampleGroup}... why you would provide an explicit
|
27
|
-
# extension mechanism and not give those extensions priority I'm not sure,
|
28
|
-
# but I'm sure I shouldn't be looking into it right now, so here we are:
|
29
|
-
#
|
30
|
-
# It turns out that {NRSER::RSpex::Example}, which gets mixed with
|
31
|
-
#
|
32
|
-
# config.include NRSER::RSpex::Example
|
33
|
-
#
|
34
|
-
# gets mixed *last*, so by using it's {NRSER::RSpex::Example.included}
|
35
|
-
# hook we can use
|
36
|
-
#
|
37
|
-
# base#extend NRSER::RSpex::ExampleGroup::Overrides
|
38
|
-
#
|
39
|
-
# to mix these guys over the top of RSpec's methods.
|
40
|
-
#
|
41
|
-
# Seems like we could just mix all of {NRSER::RSpex::ExampleGroup} there
|
42
|
-
# to get the behavior I would have expected all along, but maybe it's better
|
43
|
-
# to have these explicit notes for the moment and not change much else until
|
44
|
-
# I get the chance to really check out what's going on.
|
45
|
-
#
|
46
|
-
# And really it's all to override `.described_class` to pick up our
|
47
|
-
# metadata if it's there, but that approach is in quite a bit of use at
|
48
|
-
# this point, and, no, I have no idea how it seemed to work up until this
|
49
|
-
# point :/
|
50
|
-
#
|
51
|
-
module Overrides
|
52
|
-
|
53
|
-
# Override {RSpec::Core::ExampleGroup.described_class} to use RSpex's
|
54
|
-
# `:class` metadata if it's present.
|
55
|
-
#
|
56
|
-
# Because I can't figure out how to feed RSpec the described class
|
57
|
-
# without it being the description, and we want better descriptions.
|
58
|
-
#
|
59
|
-
# Some hackery could def do it, this is RUBY after all, but whatever this
|
60
|
-
# works for now and may even be less fragile.
|
61
|
-
#
|
62
|
-
# @return [Class]
|
63
|
-
# If there's a `:class` in the metadata, or if RSpec has on through the
|
64
|
-
# standard means (`describe MyClass do ...`).
|
65
|
-
#
|
66
|
-
# @return [nil]
|
67
|
-
# If we don't have a class context around.
|
68
|
-
#
|
69
|
-
def described_class
|
70
|
-
metadata[:class] || super()
|
71
|
-
end
|
72
|
-
|
73
|
-
end
|
74
|
-
|
75
|
-
|
76
|
-
def describe_message symbol, *args, &body
|
77
|
-
description = \
|
78
|
-
"message #{ [symbol, *args].map( &NRSER::RSpex.method( :short_s ) ).join( ', ' ) }"
|
79
|
-
|
80
|
-
describe description, type: :message do
|
81
|
-
subject { NRSER::Message.new symbol, *args }
|
82
|
-
module_exec &body
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
|
87
|
-
# For use when `subject` is a {NRSER::Message}. Create a new context for
|
88
|
-
# the `receiver` where the subject is the result of sending that message
|
89
|
-
# to the receiver.
|
90
|
-
#
|
91
|
-
# @param [Object] receiver
|
92
|
-
# Object that will receive the message to create the new subject.
|
93
|
-
#
|
94
|
-
# @param [Boolean] publicly:
|
95
|
-
# Send message publicly via {Object#public_send} (default) or privately
|
96
|
-
# via {Object.send}.
|
97
|
-
#
|
98
|
-
# @return
|
99
|
-
# Whatever the `context` call returns.
|
100
|
-
#
|
101
|
-
def describe_sent_to receiver, publicly: true, &block
|
102
|
-
mode = if publicly
|
103
|
-
"publicly"
|
104
|
-
else
|
105
|
-
"privately"
|
106
|
-
end
|
107
|
-
|
108
|
-
describe "sent to #{ receiver } (#{ mode })" do
|
109
|
-
subject { super().send_to unwrap( receiver, context: self ) }
|
110
|
-
module_exec &block
|
111
|
-
end
|
112
|
-
end # #describe_sent_to
|
113
|
-
|
114
|
-
# Aliases to other names I was using at first... not preferring their use
|
115
|
-
# at the moment.
|
116
|
-
#
|
117
|
-
# The `when_` one sucks because Atom de-dents the line, and `describe_`
|
118
|
-
# is just clearer what the block is doing for people reading it.
|
119
|
-
alias_method :sent_to, :describe_sent_to
|
120
|
-
alias_method :when_sent_to, :describe_sent_to
|
121
|
-
|
122
|
-
|
123
|
-
def describe_return_value *args, &body
|
124
|
-
msg = NRSER::Message.from *args
|
125
|
-
|
126
|
-
describe "return value from #{ msg }" do
|
127
|
-
subject { msg.send_to super() }
|
128
|
-
module_exec &body
|
129
|
-
end # "return value from #{ msg }"
|
130
|
-
end
|
131
|
-
|
132
|
-
|
133
|
-
# Describe a "section". Just like {RSpec.describe} except it:
|
134
|
-
#
|
135
|
-
# 1. Expects a string title.
|
136
|
-
#
|
137
|
-
# 2. Prepends a little section squiggle `§` to the title so sections are
|
138
|
-
# easier to pick out visually.
|
139
|
-
#
|
140
|
-
# 3. Adds `type: :section` metadata.
|
141
|
-
#
|
142
|
-
# @param [String] title
|
143
|
-
# String title for the section.
|
144
|
-
#
|
145
|
-
# @param [Hash<Symbol, Object>] **metadata
|
146
|
-
# Additional [RSpec metadata][] for the example group.
|
147
|
-
#
|
148
|
-
# [RSpec metadata]: https://relishapp.com/rspec/rspec-core/docs/metadata/user-defined-metadata
|
149
|
-
#
|
150
|
-
# @return
|
151
|
-
# Whatever {RSpec.describe} returns.
|
152
|
-
#
|
153
|
-
def describe_section title, **metadata, &block
|
154
|
-
describe(
|
155
|
-
"#{ NRSER::RSpex::PREFIXES[:section] } #{ title }",
|
156
|
-
type: :section,
|
157
|
-
**metadata
|
158
|
-
) do
|
159
|
-
module_exec &block
|
160
|
-
end
|
161
|
-
end # #describe_section
|
162
|
-
|
163
|
-
# Old name
|
164
|
-
alias_method :describe_topic, :describe_section
|
165
|
-
|
166
|
-
|
167
|
-
def describe_file path, **metadata, &body
|
168
|
-
title = path
|
169
|
-
|
170
|
-
describe(
|
171
|
-
"#{ NRSER::RSpex::PREFIXES[:file] } #{ title }",
|
172
|
-
type: :file,
|
173
|
-
file: path,
|
174
|
-
**metadata
|
175
|
-
) do
|
176
|
-
module_exec &body
|
177
|
-
end
|
178
|
-
end
|
179
|
-
|
180
|
-
|
181
|
-
def describe_module mod, bind_subject: true, **metadata, &block
|
182
|
-
describe(
|
183
|
-
"#{ NRSER::RSpex::PREFIXES[:module] } #{ mod.name }",
|
184
|
-
type: :module,
|
185
|
-
module: mod,
|
186
|
-
**metadata
|
187
|
-
) do
|
188
|
-
if bind_subject
|
189
|
-
subject { mod }
|
190
|
-
end
|
191
|
-
|
192
|
-
module_exec &block
|
193
|
-
end
|
194
|
-
end # #describe_module
|
195
|
-
|
196
|
-
|
197
|
-
def describe_group title, **metadata, &block
|
198
|
-
describe(
|
199
|
-
"#{ NRSER::RSpex::PREFIXES[:group] } #{ title }",
|
200
|
-
type: :group,
|
201
|
-
**metadata
|
202
|
-
) do
|
203
|
-
module_exec &block
|
204
|
-
end
|
205
|
-
end # #describe_class
|
206
|
-
|
207
|
-
|
208
|
-
def describe_attribute symbol, **metadata, &block
|
209
|
-
describe(
|
210
|
-
"#{ NRSER::RSpex::PREFIXES[:attribute] } ##{ symbol }",
|
211
|
-
type: :attribute,
|
212
|
-
**metadata
|
213
|
-
) do
|
214
|
-
subject { super().public_send symbol }
|
215
|
-
module_exec &block
|
216
|
-
end
|
217
|
-
end # #describe_attribute
|
218
|
-
|
219
|
-
# Shorter name
|
220
|
-
alias_method :describe_attr, :describe_attribute
|
221
|
-
|
222
|
-
|
223
|
-
# Define a `context` block with `let` bindings and evaluate the `body`
|
224
|
-
# block in it.
|
225
|
-
#
|
226
|
-
# @param [Hash<Symbol, Object>] **bindings
|
227
|
-
# Map of symbol names to value to bind using `let`.
|
228
|
-
#
|
229
|
-
# @param [#call] &body
|
230
|
-
# Body block to evaluate in the context.
|
231
|
-
#
|
232
|
-
# @return
|
233
|
-
# Whatever `context` returns.
|
234
|
-
#
|
235
|
-
def context_where description = nil, **bindings, &body
|
236
|
-
|
237
|
-
if description.nil?
|
238
|
-
description = bindings.map { |name, value|
|
239
|
-
"#{ name }: #{ NRSER::RSpex.short_s value }"
|
240
|
-
}.join( ", " )
|
241
|
-
end
|
242
|
-
|
243
|
-
context "△ #{ description }", type: :where do
|
244
|
-
bindings.each { |name, value|
|
245
|
-
let( name ) { unwrap value, context: self }
|
246
|
-
}
|
247
|
-
|
248
|
-
module_exec &body
|
249
|
-
end
|
250
|
-
end
|
251
|
-
|
252
|
-
end # module NRSER:RSpex::ExampleGroup
|
12
|
+
# Sub-Tree
|
13
|
+
# ============================================================================
|
253
14
|
|
15
|
+
require_relative './example_group/overrides'
|
254
16
|
|
255
|
-
|
256
|
-
# =======================================================================
|
257
|
-
|
258
|
-
require_relative './example_group/describe_x'
|
259
|
-
require_relative './example_group/describe_spec_file'
|
260
|
-
require_relative './example_group/describe_when'
|
261
|
-
require_relative './example_group/describe_setup'
|
262
|
-
require_relative './example_group/describe_use_case'
|
263
|
-
require_relative './example_group/describe_instance'
|
17
|
+
require_relative './example_group/describe_attribute'
|
264
18
|
require_relative './example_group/describe_called_with'
|
265
|
-
require_relative './example_group/
|
19
|
+
require_relative './example_group/describe_case'
|
266
20
|
require_relative './example_group/describe_class'
|
21
|
+
require_relative './example_group/describe_group'
|
22
|
+
require_relative './example_group/describe_instance_method'
|
23
|
+
require_relative './example_group/describe_instance'
|
24
|
+
require_relative './example_group/describe_message'
|
25
|
+
require_relative './example_group/describe_method'
|
26
|
+
require_relative './example_group/describe_module'
|
27
|
+
require_relative './example_group/describe_response_to'
|
28
|
+
require_relative './example_group/describe_section'
|
29
|
+
require_relative './example_group/describe_sent_to'
|
30
|
+
require_relative './example_group/describe_setup'
|
31
|
+
require_relative './example_group/describe_source_file'
|
32
|
+
require_relative './example_group/describe_spec_file'
|
33
|
+
require_relative './example_group/describe_when'
|
34
|
+
require_relative './example_group/describe_x'
|
data/lib/nrser/rspex/format.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
require 'pastel'
|
2
2
|
|
3
|
-
using NRSER
|
4
3
|
|
5
4
|
# Definitions
|
6
5
|
# =======================================================================
|
@@ -82,8 +81,26 @@ module NRSER::RSpex::Format
|
|
82
81
|
end
|
83
82
|
|
84
83
|
|
84
|
+
def self.method_name? string
|
85
|
+
# Must start with `#` or `.`
|
86
|
+
return false unless ['#', '.'].any? { |c| string[0] == c }
|
87
|
+
|
88
|
+
name = string[1..-1]
|
89
|
+
|
90
|
+
case name
|
91
|
+
when '!', '~', '+', '**', '-', '*', '/', '%', '+', '-', '<<', '>>', '&',
|
92
|
+
'|', '^', '<', '<=', '>=', '>', '==', '===', '!=', '=~', '!~', '<=>',
|
93
|
+
'[]',
|
94
|
+
/\A[a-zA-Z_][a-zA-Z0-9_]*(?:\?|\!|=)?/
|
95
|
+
true
|
96
|
+
else
|
97
|
+
false
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
|
85
102
|
def self.code string
|
86
|
-
if string
|
103
|
+
if method_name? string
|
87
104
|
pastel.bold.blue string
|
88
105
|
else
|
89
106
|
rspec_syntax_highlighter.highlight string.lines
|
@@ -108,18 +125,41 @@ module NRSER::RSpex::Format
|
|
108
125
|
def self.prepend_type type, description
|
109
126
|
return description if type.nil?
|
110
127
|
|
111
|
-
|
112
|
-
#
|
113
|
-
# prefix = prefixes[type] ||
|
114
|
-
# pastel.magenta( i( type.to_s.upcase.gsub('_', ' ') ) )
|
128
|
+
prefixes = RSpec.configuration.x_type_prefixes
|
115
129
|
|
116
|
-
|
117
|
-
|
130
|
+
prefix = pastel.magenta(
|
131
|
+
prefixes[type] || i( type.to_s.upcase.gsub('_', ' ') )
|
132
|
+
)
|
118
133
|
|
119
134
|
"#{ prefix } #{ description }"
|
120
135
|
end # .format_type
|
121
136
|
|
122
137
|
|
138
|
+
def self.pathname pn
|
139
|
+
if pn.absolute?
|
140
|
+
rel = pn.relative_path_from Pathname.getwd
|
141
|
+
|
142
|
+
if rel.split( File::SEPARATOR ).first == '..'
|
143
|
+
File.join '.', rel
|
144
|
+
else
|
145
|
+
pn.to_s
|
146
|
+
end
|
147
|
+
else
|
148
|
+
if pn.exist?
|
149
|
+
File.join '.', pn
|
150
|
+
else
|
151
|
+
lib_pn = Pathname.getwd / 'lib' / pn
|
152
|
+
|
153
|
+
if lib_pn.exist?
|
154
|
+
File.join '.', lib_pn.relative_path_from( Pathname.getwd )
|
155
|
+
else
|
156
|
+
pn.to_s
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
|
123
163
|
# @todo Document format method.
|
124
164
|
#
|
125
165
|
# @param [type] arg_name
|
@@ -129,18 +169,48 @@ module NRSER::RSpex::Format
|
|
129
169
|
#
|
130
170
|
def self.description *parts, type: nil
|
131
171
|
parts.
|
132
|
-
|
172
|
+
flat_map { |part|
|
133
173
|
if part.respond_to? :to_desc
|
134
174
|
desc = part.to_desc
|
135
175
|
if desc.empty?
|
136
176
|
''
|
137
177
|
else
|
138
|
-
md_code_quote
|
178
|
+
md_code_quote desc
|
139
179
|
end
|
140
|
-
elsif part.is_a? String
|
141
|
-
part
|
142
180
|
else
|
143
|
-
|
181
|
+
case part
|
182
|
+
when Module
|
183
|
+
mod = part
|
184
|
+
|
185
|
+
name_desc = if mod.anonymous?
|
186
|
+
"(anonymous #{ part.class })"
|
187
|
+
else
|
188
|
+
md_code_quote mod.name
|
189
|
+
end
|
190
|
+
|
191
|
+
[name_desc, description( mod.source_location )]
|
192
|
+
|
193
|
+
when NRSER::Meta::Source::Location
|
194
|
+
if part.valid?
|
195
|
+
"(#{ NRSER::RSpex.dot_rel_path( part.file ) }:#{ part.line })"
|
196
|
+
else
|
197
|
+
''
|
198
|
+
end
|
199
|
+
|
200
|
+
when String
|
201
|
+
part
|
202
|
+
|
203
|
+
when Pathname
|
204
|
+
pathname part
|
205
|
+
|
206
|
+
when NRSER::Message
|
207
|
+
[part.symbol, part.args].
|
208
|
+
map( &NRSER::RSpex.method( :short_s ) ).join( ', ' )
|
209
|
+
|
210
|
+
else
|
211
|
+
NRSER::RSpex.short_s part
|
212
|
+
|
213
|
+
end
|
144
214
|
end
|
145
215
|
}.
|
146
216
|
join( ' ' ).
|
@@ -151,7 +221,3 @@ module NRSER::RSpex::Format
|
|
151
221
|
end # .description
|
152
222
|
|
153
223
|
end # module NRSER::RSpex::Format
|
154
|
-
|
155
|
-
|
156
|
-
# Post-Processing
|
157
|
-
# =======================================================================
|
data/lib/nrser/rspex.rb
CHANGED
@@ -25,6 +25,8 @@ require 'commonmarker'
|
|
25
25
|
# Project / Package
|
26
26
|
# -----------------------------------------------------------------------
|
27
27
|
require 'nrser'
|
28
|
+
require 'nrser/core_ext'
|
29
|
+
|
28
30
|
require_relative './rspex/example'
|
29
31
|
require_relative './rspex/example_group'
|
30
32
|
require_relative './rspex/shared_examples'
|
@@ -133,50 +135,18 @@ module NRSER::RSpex
|
|
133
135
|
# Constants
|
134
136
|
# =====================================================================
|
135
137
|
|
136
|
-
#
|
137
|
-
# ---------------------------------------------------------------------
|
138
|
+
# Symbol characters for specific example group types.
|
138
139
|
#
|
139
140
|
# Sources:
|
140
141
|
#
|
141
142
|
# - https://en.wikipedia.org/wiki/Mathematical_operators_and_symbols_in_Unicode
|
142
143
|
#
|
143
|
-
|
144
|
-
PREFIXES_BASE = {
|
144
|
+
PREFIXES = {
|
145
145
|
section: '§',
|
146
146
|
group: '•',
|
147
147
|
invocation: '𝑓⟮𝑥⟯',
|
148
148
|
}
|
149
149
|
|
150
|
-
PREFIXES_MATH_ITALIC = PREFIXES_BASE.merge(
|
151
|
-
module: '𝑀',
|
152
|
-
method: '𝑚',
|
153
|
-
class: '𝐶',
|
154
|
-
attribute: '𝑎',
|
155
|
-
file: '𝐹',
|
156
|
-
)
|
157
|
-
|
158
|
-
PREFIXES_MATH_CURSIVE_WORDS = PREFIXES_BASE.merge(
|
159
|
-
module: '𝓜 𝓸𝓭𝓾𝓵𝓮',
|
160
|
-
method: '𝓶𝓮𝓽',
|
161
|
-
class: '𝐶',
|
162
|
-
attribute: '𝑎',
|
163
|
-
file: '𝐹',
|
164
|
-
)
|
165
|
-
|
166
|
-
# PREFIXES_MATH_GREEK = PREFIXES_BASE.merge(
|
167
|
-
# # module: "𝓜 𝓸𝓭𝓾𝓵𝓮",
|
168
|
-
# module: '𝛭',
|
169
|
-
# method: '𝜆',
|
170
|
-
# class: '𝛤',
|
171
|
-
# attribute: '𝛼',
|
172
|
-
# )
|
173
|
-
|
174
|
-
PREFIXES = PREFIXES_MATH_ITALIC
|
175
|
-
|
176
|
-
# PREFIXES = PREFIXES_MATH_ITALIC.map_values { |k, v|
|
177
|
-
# RSpec::Core::Formatters::ConsoleCodes.wrap( v, :cyan )
|
178
|
-
# }
|
179
|
-
|
180
150
|
|
181
151
|
# Module (Class) Functions
|
182
152
|
# =====================================================================
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
# Declarations
|
5
|
+
# =======================================================================
|
6
|
+
|
7
|
+
module NRSER; end
|
8
|
+
|
9
|
+
|
10
|
+
# Definitions
|
11
|
+
# ========================================================================
|
12
|
+
|
13
|
+
# A very simple class that forwards all method calls to the block it was
|
14
|
+
# initialized with (via {#method_missing}).
|
15
|
+
#
|
16
|
+
class NRSER::MethodMissingForwarder < BasicObject
|
17
|
+
|
18
|
+
# Constructor
|
19
|
+
# ========================================================================
|
20
|
+
|
21
|
+
# Instantiate a new `NRSER::MethodMissingForwarder` holding the forwarding
|
22
|
+
# block.
|
23
|
+
#
|
24
|
+
# @param [Proc<(symbol:Symbol, *args, &block)>] &forwarder
|
25
|
+
# Block that will receive all calls to {#method_missing}.
|
26
|
+
#
|
27
|
+
def initialize &forwarder
|
28
|
+
@forwarder = forwarder
|
29
|
+
end # #initialize
|
30
|
+
|
31
|
+
|
32
|
+
# Instance Methods
|
33
|
+
# ========================================================================
|
34
|
+
|
35
|
+
# Forwards all params to the `@forwarder` proc.
|
36
|
+
#
|
37
|
+
# @param [Symbol] symbol
|
38
|
+
# The name of the method that was called.
|
39
|
+
#
|
40
|
+
# @param [Array] *args
|
41
|
+
# Any parameters the missing method was called with.
|
42
|
+
#
|
43
|
+
# @param [Proc?] &block
|
44
|
+
# The block the method was called with, if any.
|
45
|
+
#
|
46
|
+
def method_missing symbol, *args, &block
|
47
|
+
@forwarder.call symbol, *args, &block
|
48
|
+
end
|
49
|
+
|
50
|
+
end # class NRSER::MethodMisser
|
@@ -27,9 +27,8 @@ using NRSER
|
|
27
27
|
# =======================================================================
|
28
28
|
|
29
29
|
# @todo document NRSER::Env::Path class.
|
30
|
-
class NRSER::Env::Path
|
30
|
+
class NRSER::Sys::Env::Path
|
31
31
|
include Enumerable
|
32
|
-
include NRSER::Ext::Enumerable
|
33
32
|
|
34
33
|
# Constants
|
35
34
|
# ======================================================================
|
data/lib/nrser/sys.rb
ADDED
data/lib/nrser/types/any.rb
CHANGED
@@ -1,12 +1,41 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
# encoding: UTF-8
|
2
|
+
# frozen_string_literal: true
|
4
3
|
|
5
4
|
module NRSER::Types
|
6
|
-
ANY = where(name: 'AnyType', from_s: ->(s) { s }) { true }.freeze
|
7
5
|
|
8
|
-
# anything
|
9
|
-
|
10
|
-
|
6
|
+
# A type for anything - {#test?} always returns `true`.
|
7
|
+
#
|
8
|
+
class AnyType < NRSER::Types::Type
|
9
|
+
|
10
|
+
def test? value; true; end
|
11
|
+
def explain; '*'; end
|
12
|
+
def custom_from_s string; string; end
|
13
|
+
|
14
|
+
# {AnyType} instances are all equal.
|
15
|
+
#
|
16
|
+
# @note
|
17
|
+
# `other`'s class must be {AnyType} exactly - we make no assumptions
|
18
|
+
# about anything that has subclasses {AnyType}.
|
19
|
+
#
|
20
|
+
# @param [*] other
|
21
|
+
# Object to compare to.
|
22
|
+
#
|
23
|
+
# @return [Boolean]
|
24
|
+
# `true` if `other#class` equals {AnyType}.
|
25
|
+
#
|
26
|
+
def == other
|
27
|
+
other.class == AnyType
|
28
|
+
end
|
29
|
+
|
30
|
+
end # class Any
|
31
|
+
|
32
|
+
# Anything at all...
|
33
|
+
#
|
34
|
+
def_factory(
|
35
|
+
:any,
|
36
|
+
aliases: [ :all ],
|
37
|
+
) do
|
38
|
+
@_any_type_instance ||= AnyType.new
|
11
39
|
end
|
40
|
+
|
12
41
|
end # NRSER::Types
|