nrser 0.2.2 → 0.3.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 (188) hide show
  1. checksums.yaml +4 -4
  2. data/lib/nrser/char/alpha_numeric_sub.rb +1 -2
  3. data/lib/nrser/char.rb +0 -6
  4. data/lib/nrser/core_ext/array.rb +120 -0
  5. data/lib/nrser/core_ext/binding.rb +44 -0
  6. data/lib/nrser/{functions → core_ext}/enumerable/find_map.rb +18 -15
  7. data/lib/nrser/{ext → core_ext}/enumerable.rb +10 -24
  8. data/lib/nrser/core_ext/exception.rb +30 -0
  9. data/lib/nrser/core_ext/hash/extract_values_at.rb +49 -0
  10. data/lib/nrser/core_ext/hash/transform_values_with_keys.rb +24 -0
  11. data/lib/nrser/core_ext/hash.rb +50 -0
  12. data/lib/nrser/core_ext/module/method_objects.rb +96 -0
  13. data/lib/nrser/core_ext/module/names.rb +69 -0
  14. data/lib/nrser/core_ext/module/source_locations.rb +214 -0
  15. data/lib/nrser/core_ext/module.rb +2 -0
  16. data/lib/nrser/core_ext/object/lazy_var.rb +31 -0
  17. data/lib/nrser/core_ext/object.rb +46 -0
  18. data/lib/nrser/core_ext/open_struct.rb +6 -0
  19. data/lib/nrser/{ext → core_ext}/pathname.rb +8 -5
  20. data/lib/nrser/{ext → core_ext}/string.rb +6 -12
  21. data/lib/nrser/core_ext/symbol.rb +13 -0
  22. data/lib/nrser/core_ext/time.rb +46 -0
  23. data/lib/nrser/core_ext.rb +13 -0
  24. data/lib/nrser/errors/abstract_method_error.rb +150 -0
  25. data/lib/nrser/errors/argument_error.rb +42 -0
  26. data/lib/nrser/errors/nicer_error.rb +298 -72
  27. data/lib/nrser/errors/type_error.rb +46 -0
  28. data/lib/nrser/errors.rb +4 -53
  29. data/lib/nrser/ext/tree.rb +3 -0
  30. data/lib/nrser/functions/enumerable/associate.rb +6 -9
  31. data/lib/nrser/functions/enumerable/include_slice.rb +2 -3
  32. data/lib/nrser/functions/enumerable.rb +1 -3
  33. data/lib/nrser/functions/exception.rb +1 -1
  34. data/lib/nrser/functions/hash.rb +0 -6
  35. data/lib/nrser/functions/merge_by.rb +2 -2
  36. data/lib/nrser/functions/module/method_objects.rb +77 -0
  37. data/lib/nrser/functions/module.rb +1 -2
  38. data/lib/nrser/functions/open_struct.rb +25 -35
  39. data/lib/nrser/functions/proc.rb +1 -6
  40. data/lib/nrser/functions/string/looks_like.rb +32 -1
  41. data/lib/nrser/functions/string.rb +1 -40
  42. data/lib/nrser/functions/text/lines.rb +2 -1
  43. data/lib/nrser/functions.rb +0 -1
  44. data/lib/nrser/graph/tsorter.rb +41 -0
  45. data/lib/nrser/labs/core_ext/binding.rb +37 -0
  46. data/lib/nrser/labs/stash.rb +372 -0
  47. data/lib/nrser/{logging → log}/appender/sync.rb +3 -3
  48. data/lib/nrser/log/appender.rb +3 -0
  49. data/lib/nrser/{logging → log}/formatters/color.rb +47 -20
  50. data/lib/nrser/log/formatters/mixin.rb +270 -0
  51. data/lib/nrser/{logging → log}/formatters.rb +0 -0
  52. data/lib/nrser/log/logger.rb +229 -0
  53. data/lib/nrser/log/mixin.rb +56 -0
  54. data/lib/nrser/log.rb +723 -0
  55. data/lib/nrser/message.rb +24 -3
  56. data/lib/nrser/meta/source/location.rb +158 -0
  57. data/lib/nrser/meta.rb +1 -1
  58. data/lib/nrser/props/class_methods.rb +118 -0
  59. data/lib/nrser/props/immutable/hash.rb +111 -0
  60. data/lib/nrser/props/immutable/hash_variable.rb +82 -0
  61. data/lib/nrser/props/immutable/instance_variables.rb +48 -0
  62. data/lib/nrser/props/immutable/vector.rb +107 -0
  63. data/lib/nrser/props/instance_methods.rb +184 -0
  64. data/lib/nrser/props/metadata.rb +359 -0
  65. data/lib/nrser/props/mutable/instance_variables.rb +60 -0
  66. data/lib/nrser/props/mutable/stash.rb +199 -0
  67. data/lib/nrser/{meta/props → props}/prop.rb +217 -112
  68. data/lib/nrser/props/storage/instance_variable.rb +85 -0
  69. data/lib/nrser/props/storage/instance_variables.rb +67 -0
  70. data/lib/nrser/props/storage/key.rb +88 -0
  71. data/lib/nrser/props.rb +9 -0
  72. data/lib/nrser/refinements/sugar.rb +41 -0
  73. data/lib/nrser/refinements/types.rb +2 -2
  74. data/lib/nrser/refinements.rb +14 -16
  75. data/lib/nrser/rspex/example_group/describe_attribute.rb +24 -0
  76. data/lib/nrser/rspex/example_group/describe_called_with.rb +1 -6
  77. data/lib/nrser/rspex/example_group/{describe_use_case.rb → describe_case.rb} +6 -3
  78. data/lib/nrser/rspex/example_group/describe_class.rb +1 -0
  79. data/lib/nrser/rspex/example_group/describe_group.rb +29 -0
  80. data/lib/nrser/rspex/example_group/describe_instance_method.rb +2 -2
  81. data/lib/nrser/rspex/example_group/describe_message.rb +35 -0
  82. data/lib/nrser/rspex/example_group/describe_method.rb +23 -2
  83. data/lib/nrser/rspex/example_group/describe_module.rb +19 -0
  84. data/lib/nrser/rspex/example_group/describe_response_to.rb +32 -0
  85. data/lib/nrser/rspex/example_group/describe_section.rb +38 -0
  86. data/lib/nrser/rspex/example_group/describe_sent_to.rb +52 -0
  87. data/lib/nrser/rspex/example_group/describe_source_file.rb +49 -0
  88. data/lib/nrser/rspex/example_group/describe_spec_file.rb +41 -108
  89. data/lib/nrser/rspex/example_group/describe_when.rb +14 -7
  90. data/lib/nrser/rspex/example_group/describe_x.rb +39 -12
  91. data/lib/nrser/rspex/example_group/overrides.rb +66 -0
  92. data/lib/nrser/rspex/example_group.rb +20 -252
  93. data/lib/nrser/rspex/format.rb +83 -17
  94. data/lib/nrser/rspex.rb +4 -34
  95. data/lib/nrser/sugar/method_missing_forwarder.rb +50 -0
  96. data/lib/nrser/{env → sys/env}/path.rb +1 -2
  97. data/lib/nrser/{env.rb → sys/env.rb} +2 -1
  98. data/lib/nrser/sys.rb +5 -0
  99. data/lib/nrser/types/any.rb +36 -7
  100. data/lib/nrser/types/{array.rb → arrays.rb} +32 -81
  101. data/lib/nrser/types/attrs.rb +68 -15
  102. data/lib/nrser/types/booleans.rb +95 -34
  103. data/lib/nrser/types/bounded.rb +12 -10
  104. data/lib/nrser/types/combinators.rb +74 -37
  105. data/lib/nrser/types/errors/check_error.rb +86 -0
  106. data/lib/nrser/types/errors/from_string_error.rb +82 -0
  107. data/lib/nrser/types/factory.rb +91 -0
  108. data/lib/nrser/types/hashes.rb +171 -26
  109. data/lib/nrser/types/in.rb +25 -12
  110. data/lib/nrser/types/is.rb +50 -18
  111. data/lib/nrser/types/is_a.rb +52 -33
  112. data/lib/nrser/types/labels.rb +6 -33
  113. data/lib/nrser/types/maybe.rb +12 -4
  114. data/lib/nrser/types/nil.rb +24 -4
  115. data/lib/nrser/types/not.rb +6 -16
  116. data/lib/nrser/types/numbers.rb +94 -57
  117. data/lib/nrser/types/pairs.rb +57 -57
  118. data/lib/nrser/types/paths.rb +112 -133
  119. data/lib/nrser/types/responds.rb +64 -74
  120. data/lib/nrser/types/shape.rb +29 -24
  121. data/lib/nrser/types/strings.rb +25 -17
  122. data/lib/nrser/types/symbols.rb +19 -17
  123. data/lib/nrser/types/trees.rb +18 -70
  124. data/lib/nrser/types/tuples.rb +36 -40
  125. data/lib/nrser/types/type.rb +342 -91
  126. data/lib/nrser/types/when.rb +40 -18
  127. data/lib/nrser/types/where.rb +94 -9
  128. data/lib/nrser/types.rb +72 -63
  129. data/lib/nrser/version.rb +1 -1
  130. data/lib/nrser.rb +18 -18
  131. data/spec/lib/nrser/{functions/binding/template_spec.rb → core_ext/binding/erb_spec.rb} +5 -5
  132. data/spec/lib/nrser/{functions → core_ext}/enumerable/find_map_spec.rb +8 -6
  133. data/spec/lib/nrser/{refinements → core_ext}/hash_spec.rb +9 -22
  134. data/spec/lib/nrser/errors/abstract_method_error_spec.rb +12 -5
  135. data/spec/lib/nrser/functions/enumerable/{to_h_by_spec.rb → associate_spec.rb} +1 -1
  136. data/spec/lib/nrser/functions/merge_by_spec.rb +1 -1
  137. data/spec/lib/nrser/functions/tree/each_branch_spec.rb +3 -3
  138. data/spec/lib/nrser/functions/tree/transform_spec.rb +14 -15
  139. data/spec/lib/nrser/gem_ext/hamster/json_spec.rb +4 -0
  140. data/spec/lib/nrser/meta/source/location_spec.rb +86 -0
  141. data/spec/lib/nrser/props/immutable/hash_spec.rb +297 -0
  142. data/spec/lib/nrser/props/immutable/vector_spec.rb +296 -0
  143. data/spec/lib/nrser/{meta/props_spec.rb → props/original_props_spec.rb} +11 -16
  144. data/spec/lib/nrser/{meta/props → props}/to_and_from_data_spec.rb +10 -8
  145. data/spec/lib/nrser/refinements/array_spec.rb +2 -15
  146. data/spec/lib/nrser/refinements/erb_spec.rb +5 -7
  147. data/spec/lib/nrser/refinements/set_spec.rb +2 -15
  148. data/spec/lib/nrser/{env → sys/env}/path/insert_spec.rb +4 -2
  149. data/spec/lib/nrser/{env → sys/env}/path_spec.rb +4 -2
  150. data/spec/lib/nrser/types/array_spec.rb +8 -8
  151. data/spec/lib/nrser/types/paths_spec.rb +15 -18
  152. data/spec/spec_helper.rb +4 -0
  153. metadata +109 -69
  154. data/lib/nrser/ext/binding.rb +0 -36
  155. data/lib/nrser/ext/module.rb +0 -62
  156. data/lib/nrser/ext.rb +0 -8
  157. data/lib/nrser/functions/binding.rb +0 -76
  158. data/lib/nrser/functions/enumerable/map_keys.rb +0 -0
  159. data/lib/nrser/functions/enumerable/map_values.rb +0 -94
  160. data/lib/nrser/functions/hash/deep_merge.rb +0 -57
  161. data/lib/nrser/functions/hash/except_keys.rb +0 -44
  162. data/lib/nrser/functions/hash/slice_keys.rb +0 -43
  163. data/lib/nrser/functions/hash/stringify_keys.rb +0 -55
  164. data/lib/nrser/functions/hash/symbolize_keys.rb +0 -57
  165. data/lib/nrser/functions/hash/transform_keys.rb +0 -140
  166. data/lib/nrser/functions/module/methods.rb +0 -206
  167. data/lib/nrser/functions/module/source_locations.rb +0 -213
  168. data/lib/nrser/logging/appender.rb +0 -3
  169. data/lib/nrser/logging.rb +0 -353
  170. data/lib/nrser/meta/props/base.rb +0 -31
  171. data/lib/nrser/meta/props.rb +0 -357
  172. data/lib/nrser/refinements/array.rb +0 -133
  173. data/lib/nrser/refinements/binding.rb +0 -6
  174. data/lib/nrser/refinements/enumerator.rb +0 -5
  175. data/lib/nrser/refinements/exception.rb +0 -35
  176. data/lib/nrser/refinements/hash.rb +0 -150
  177. data/lib/nrser/refinements/module.rb +0 -5
  178. data/lib/nrser/refinements/object.rb +0 -42
  179. data/lib/nrser/refinements/open_struct.rb +0 -28
  180. data/lib/nrser/refinements/pathname.rb +0 -5
  181. data/lib/nrser/refinements/set.rb +0 -5
  182. data/lib/nrser/refinements/string.rb +0 -5
  183. data/lib/nrser/refinements/symbol.rb +0 -20
  184. data/lib/nrser/rspex/described.rb +0 -99
  185. data/spec/design/mapping_spec.rb +0 -42
  186. data/spec/lib/nrser/functions/hash_spec.rb +0 -41
  187. data/spec/lib/nrser/functions/string/truncate_spec.rb +0 -11
  188. data/spec/lib/nrser/refinements/truncate_spec.rb +0 -10
@@ -0,0 +1,85 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
3
+
4
+
5
+ # Declarations
6
+ # =======================================================================
7
+
8
+ module NRSER::Props::Storage; end
9
+
10
+
11
+ # Definitions
12
+ # =======================================================================
13
+
14
+ # @todo document NRSER::Props::Storage::Key module.
15
+ class NRSER::Props::Storage::InstanceVariable
16
+
17
+ DEFAULT_VAR_NAME = :@__NRSER_prop_values
18
+
19
+ # TODO document `var_name` attribute.
20
+ #
21
+ # @return [Symbol]
22
+ #
23
+ attr_reader :var_name
24
+
25
+
26
+ # TODO document `sub_storage` attribute.
27
+ #
28
+ # @return [attr_type]
29
+ #
30
+ attr_reader :sub_storage
31
+
32
+
33
+ def initialize var_name: DEFAULT_VAR_NAME,
34
+ sub_storage:
35
+ @var_name = var_name.to_sym
36
+ @sub_storage = sub_storage
37
+ end
38
+
39
+ # Instance Methods
40
+ # ======================================================================
41
+
42
+
43
+ def init instance, collection
44
+ if init? instance
45
+ raise NRSER::ConflictError.new binding.erb <<~END
46
+ Already initialized!
47
+
48
+ Instance:
49
+
50
+ <%= instance.pretty_inspect %>
51
+
52
+ Collection:
53
+
54
+ <%= collection.pretty_inspect %>
55
+
56
+ END
57
+ end
58
+
59
+ instance.instance_variable_set @var_name, collection
60
+ end
61
+
62
+
63
+ def immutable?
64
+ sub_storage.immutable?
65
+ end
66
+
67
+
68
+ def init? instance
69
+ instance.instance_variable_defined? @var_name
70
+ end
71
+
72
+
73
+ def get instance, prop
74
+ sub_storage.get instance.instance_variable_get( @var_name ), prop
75
+ end
76
+
77
+
78
+ def put instance, prop, value
79
+ sub_storage.put \
80
+ instance.instance_variable_get( @var_name ),
81
+ prop,
82
+ value
83
+ end
84
+
85
+ end
@@ -0,0 +1,67 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
3
+
4
+ # Requirements
5
+ # =======================================================================
6
+
7
+ # Stdlib
8
+ # -----------------------------------------------------------------------
9
+
10
+ # Deps
11
+ # -----------------------------------------------------------------------
12
+
13
+ # Project / Package
14
+ # -----------------------------------------------------------------------
15
+
16
+
17
+ # Refinements
18
+ # =======================================================================
19
+
20
+
21
+ # Declarations
22
+ # =======================================================================
23
+
24
+ module NRSER::Props::Storage; end
25
+
26
+
27
+ # Definitions
28
+ # =======================================================================
29
+
30
+ # @todo document NRSER::Props::Storage::Key module.
31
+ class NRSER::Props::Storage::InstanceVariables
32
+
33
+ def initialize immutable:
34
+ @immutable = !!immutable
35
+ end
36
+
37
+
38
+ def immutable?
39
+ @immutable
40
+ end
41
+
42
+
43
+ def get instance, prop
44
+ instance.instance_variable_get "@#{ prop.name }"
45
+ end
46
+
47
+
48
+ def put instance, prop, value
49
+ if immutable?
50
+ raise RuntimeError.new binding.erb <<~END
51
+ Properties of #{ instance.class.safe_name } are immutable.
52
+
53
+ Tried to set prop #{ prop.name } to value
54
+
55
+ <%= value.pretty_inspect %>
56
+
57
+ in instance
58
+
59
+ <%= instance.pretty_inspect %>
60
+
61
+ END
62
+ end
63
+
64
+ instance.instance_variable_set "@#{ prop.name }", value
65
+ end
66
+
67
+ end
@@ -0,0 +1,88 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
3
+
4
+ # Requirements
5
+ # =======================================================================
6
+
7
+ # Stdlib
8
+ # -----------------------------------------------------------------------
9
+
10
+ # Deps
11
+ # -----------------------------------------------------------------------
12
+
13
+ # Project / Package
14
+ # -----------------------------------------------------------------------
15
+
16
+
17
+ # Refinements
18
+ # =======================================================================
19
+
20
+
21
+ # Declarations
22
+ # =======================================================================
23
+
24
+ module NRSER::Props::Storage; end
25
+
26
+
27
+ # Definitions
28
+ # =======================================================================
29
+
30
+ # @todo document NRSER::Props::Storage::Key module.
31
+ class NRSER::Props::Storage::Key
32
+
33
+ def initialize immutable:, key_type:, get: :[], put: :[]=
34
+ @immutable = !!immutable
35
+ @key_type = key_type
36
+ @get_method_name = get
37
+ @put_method_name = put
38
+ end
39
+
40
+ # Instance Methods
41
+ # ======================================================================
42
+
43
+ def immutable?
44
+ @immutable
45
+ end
46
+
47
+
48
+ def key_for prop
49
+ case @key_type
50
+ when :name
51
+ prop.name
52
+ when :index
53
+ prop.index
54
+ end
55
+ end
56
+
57
+
58
+ def get instance, prop
59
+ instance.send @get_method_name, key_for( prop )
60
+ end
61
+
62
+
63
+ def put instance, prop, value
64
+ key = key_for prop
65
+
66
+ if immutable?
67
+ raise RuntimeError.new binding.erb <<~END
68
+ Properties of #{ instance.class.safe_name } are immutable.
69
+
70
+ Tried to set key
71
+
72
+ <%= key.pretty_inspect %>
73
+
74
+ to value
75
+
76
+ <%= value.pretty_inspect %>
77
+
78
+ in instance
79
+
80
+ <%= instance.pretty_inspect %>
81
+
82
+ END
83
+ end
84
+
85
+ instance.send @put_method_name, key, value
86
+ end
87
+
88
+ end # class NRSER::Props::Storage::Key
@@ -0,0 +1,9 @@
1
+ require_relative './props/class_methods'
2
+ require_relative './props/instance_methods'
3
+
4
+ module NRSER::Props
5
+ def self.included base
6
+ base.include NRSER::Props::InstanceMethods
7
+ base.extend NRSER::Props::ClassMethods
8
+ end
9
+ end
@@ -0,0 +1,41 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
3
+
4
+ # Requirements
5
+ # =======================================================================
6
+
7
+ # Project / Package
8
+ # -----------------------------------------------------------------------
9
+
10
+ # Need {NRSER::MethodMissingForwarder}
11
+ require 'nrser/sugar/method_missing_forwarder'
12
+
13
+
14
+ # Definitions
15
+ # =======================================================================
16
+
17
+ # Some sugary sweet stuff that I find nice but seems irresponsible to
18
+ # monkey-patch in, so it's available as refinements.
19
+ #
20
+ module NRSER::Sugar
21
+
22
+ refine Object do
23
+
24
+ # Get {Method} objects using concise syntax.
25
+ #
26
+ # @example
27
+ # text = 'bee!'
28
+ # ['a', 'b', 'c'].any? { |char| text.meth.start_with? }
29
+ #
30
+ # @return [NRSER::MethodMissingForwarder]
31
+ # That forwards `#method_missing( symbol )` to `self.method( symbol )`.
32
+ #
33
+ def meth
34
+ NRSER::MethodMissingForwarder.new do |symbol|
35
+ self.method symbol
36
+ end
37
+ end
38
+
39
+ end # refine Object
40
+
41
+ end # module NRSER::Sugar
@@ -1,5 +1,5 @@
1
- module NRSER
2
- module Types
1
+ module NRSER
2
+ module Types
3
3
  refine Object do
4
4
  def t
5
5
  NRSER::Types
@@ -1,17 +1,15 @@
1
- # Declare the module
2
- module NRSER::Refinements; end
1
+ # TODO Remove me
3
2
 
4
- # Require all refinements
5
- require_relative './refinements/object'
6
- require_relative './refinements/string'
7
- require_relative './refinements/array'
8
- require_relative './refinements/hash'
9
- require_relative './refinements/pathname'
10
- require_relative './refinements/exception'
11
- require_relative './refinements/binding'
12
- require_relative './refinements/set'
13
- require_relative './refinements/open_struct'
14
- require_relative './refinements/enumerator'
15
- require_relative './refinements/symbol'
16
- require_relative './refinements/types'
17
- require_relative './refinements/module'
3
+ require_relative './log'
4
+
5
+ NRSER.logger.warn <<~END
6
+ DEPRECIATED - `require 'nrser/refinements'` is now a no-op,
7
+ please remove the calls.
8
+
9
+ Require specific refinements, like:
10
+
11
+ require 'nrser/refinements/types'
12
+ require 'nrser/refinements/sugar'
13
+
14
+ Thank you, the management.
15
+ END
@@ -0,0 +1,24 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
3
+
4
+ module NRSER::RSpex::ExampleGroup
5
+
6
+ # Describe an attribute of the parent subject.
7
+ #
8
+ # @return [void]
9
+ #
10
+ def describe_attribute symbol, **metadata, &body
11
+ describe_x \
12
+ NRSER::RSpex::Format.md_code_quote( "##{ symbol }" ),
13
+ type: :attribute,
14
+ metadata: metadata,
15
+ subject_block: -> {
16
+ super().public_send symbol
17
+ },
18
+ &body
19
+ end # #describe_attribute
20
+
21
+ # Shorter name
22
+ alias_method :describe_attr, :describe_attribute
23
+
24
+ end # module NRSER::RSpex::ExampleGroup
@@ -31,12 +31,7 @@ module NRSER::RSpex::ExampleGroup
31
31
  &body
32
32
  end # #describe_called_with
33
33
 
34
- # Aliases to other names I was using at first... not preferring their use
35
- # at the moment.
36
- #
37
- # The `when_` one sucks because Atom de-dents the line, and `describe_`
38
- # is just clearer what the block is doing for people reading it.
34
+ # Short / old name
39
35
  alias_method :called_with, :describe_called_with
40
- alias_method :when_called_with, :describe_called_with
41
36
 
42
37
  end # module NRSER::RSpex::ExampleGroup
@@ -6,13 +6,16 @@ module NRSER::RSpex::ExampleGroup
6
6
  #
7
7
  # @return [void]
8
8
  #
9
- def describe_use_case *description, where: {}, **metadata, &body
9
+ def describe_case *description, where: {}, **metadata, &body
10
10
  describe_x \
11
11
  *description,
12
- type: :use_case,
12
+ type: :case,
13
13
  bindings: where,
14
14
  metadata: metadata,
15
15
  &body
16
- end # #describe_use_case
16
+ end # #describe_case
17
+
18
+ # Older name
19
+ alias_method :describe_use_case, :describe_case
17
20
 
18
21
  end # module NRSER::RSpex::ExampleGroup
@@ -18,6 +18,7 @@ module NRSER::RSpex::ExampleGroup
18
18
 
19
19
  describe_x \
20
20
  NRSER::RSpex::Format.md_code_quote( klass.name ),
21
+ klass.source_location,
21
22
  *description,
22
23
  type: :class,
23
24
  metadata: {
@@ -0,0 +1,29 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
3
+
4
+ module NRSER::RSpex::ExampleGroup
5
+
6
+ # Describe a "group". Doesn't really do much. Didn't end up getting used
7
+ # much. Probably not long for this world.
8
+ #
9
+ # @param *description (see #describe_x)
10
+ #
11
+ # @param [Hash<Symbol, Object>] **metadata
12
+ # RSpec metadata to set for the example group.
13
+ #
14
+ # See the `metadata` keyword argument to {#describe_x}.
15
+ #
16
+ # @param &body (see #describe_x)
17
+ #
18
+ # @return (see #describe_x)
19
+ #
20
+ def describe_group *description, **metadata, &body
21
+ # Pass up to {#describe_x}
22
+ describe_x \
23
+ *description,
24
+ type: :group,
25
+ metadata: metadata,
26
+ &body
27
+ end # #describe_group
28
+
29
+ end # module NRSER::RSpex::ExampleGroup
@@ -4,8 +4,8 @@ module NRSER::RSpex::ExampleGroup
4
4
 
5
5
  def describe_instance_method name, **metadata, &block
6
6
  describe(
7
- "#{ NRSER::RSpex::PREFIXES[:method] } #{ name }",
8
- type: :method,
7
+ "##{ name }",
8
+ type: :instance_method,
9
9
  method_name: name,
10
10
  **metadata
11
11
  ) do
@@ -0,0 +1,35 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
3
+
4
+ module NRSER::RSpex::ExampleGroup
5
+
6
+ # Describe a {NRSER::Message}. Useful when you have a message that you want
7
+ # to send to many receivers (see {#describe_sent_to}).
8
+ #
9
+ # @note
10
+ # Since the block is used for the example group body, if you want to
11
+ # describe a message with a {NRSER::Message#block} your need to create
12
+ # the message yourself and pass it as the only argument.
13
+ #
14
+ # @see #describe_x
15
+ #
16
+ # @param [Array] *args
17
+ # Passed to {NRSER::Message.from} to get or create the message instance.
18
+ #
19
+ # @param &body (see #describe_x)
20
+ #
21
+ # @return (see #describe_x)
22
+ #
23
+ def describe_message *args, &body
24
+ message = NRSER::Message.from *args
25
+
26
+ describe_x \
27
+ description,
28
+ type: :message,
29
+ metadata: {
30
+ message: message,
31
+ },
32
+ &body
33
+ end
34
+
35
+ end # module NRSER::RSpex::ExampleGroup
@@ -3,7 +3,7 @@
3
3
 
4
4
  module NRSER::RSpex::ExampleGroup
5
5
 
6
- # @todo Document describe_method method.
6
+ # Describe a method of the parent subject.
7
7
  #
8
8
  # @return [void]
9
9
  #
@@ -23,11 +23,32 @@ module NRSER::RSpex::ExampleGroup
23
23
  '.'
24
24
  end
25
25
 
26
+ method = if self.try( :metadata )
27
+ getter = if self.metadata.key?( :constructor_args )
28
+ :instance_method
29
+ else
30
+ :method
31
+ end
32
+
33
+ target = self.metadata[:class] || self.metadata[:module]
34
+
35
+ if target
36
+ begin
37
+ target.public_send getter, method_name
38
+ rescue
39
+ nil
40
+ end
41
+ end
42
+ end
43
+
26
44
  name_string = NRSER::RSpex::Format.md_code_quote \
27
45
  "#{ name_prefix }#{ method_name }"
28
46
 
29
47
  # Create the RSpec example group context
30
- describe_x name_string, *description,
48
+ describe_x \
49
+ name_string,
50
+ NRSER::Meta::Source::Location.new( method ),
51
+ *description,
31
52
  type: :method,
32
53
  metadata: {
33
54
  **metadata,
@@ -0,0 +1,19 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
3
+
4
+ module NRSER::RSpex::ExampleGroup
5
+
6
+ def describe_module mod, bind_subject: true, **metadata, &body
7
+ describe_x \
8
+ mod,
9
+ type: :module,
10
+ metadata: {
11
+ module: mod,
12
+ **metadata,
13
+ },
14
+ bind_subject: bind_subject,
15
+ subject_block: -> { mod },
16
+ &body
17
+ end # #describe_module
18
+
19
+ end # module NRSER::RSpex::ExampleGroup
@@ -0,0 +1,32 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
3
+
4
+ module NRSER::RSpex::ExampleGroup
5
+
6
+ # Describe the response of the subject to a {NRSER::Message}.
7
+ #
8
+ # Pretty much a short-cut for nesting {#describe_method} /
9
+ # {#describe_called_with}. Meh.
10
+ #
11
+ # @param [Array] *args
12
+ # Passed to {NRSER::Message.from} to get or create the message instance.
13
+ #
14
+ # @param &body (see #describe_x)
15
+ #
16
+ # @return (see #describe_x)
17
+ #
18
+ def describe_response_to *args, &body
19
+ msg = NRSER::Message.from *args
20
+
21
+ # Pass up to {#describe_x}
22
+ describe_x \
23
+ msg,
24
+ type: :response_to,
25
+ subject_block: -> { msg.send_to super() },
26
+ &body
27
+ end # #describe_response_to
28
+
29
+ # Old name
30
+ alias_method :describe_return_value, :describe_response_to
31
+
32
+ end # module NRSER::RSpex::ExampleGroup
@@ -0,0 +1,38 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
3
+
4
+ module NRSER::RSpex::ExampleGroup
5
+
6
+ # Describe a "section". Just like {RSpec.describe} except it:
7
+ #
8
+ # 1. Expects a string title.
9
+ #
10
+ # 2. Prepends a little section squiggle `§` to the title so sections are
11
+ # easier to pick out visually.
12
+ #
13
+ # 3. Adds `type: :section` metadata.
14
+ #
15
+ # @param *description (see #describe_x)
16
+ #
17
+ # @param [Hash<Symbol, Object>] **metadata
18
+ # RSpec metadata to set for the example group.
19
+ #
20
+ # See the `metadata` keyword argument to {#describe_x}.
21
+ #
22
+ # @param &body (see #describe_x)
23
+ #
24
+ # @return (see #describe_x)
25
+ #
26
+ def describe_section *description, **metadata, &body
27
+ # Pass up to {#describe_x}
28
+ describe_x \
29
+ *description,
30
+ type: :section,
31
+ metadata: metadata,
32
+ &body
33
+ end # #describe_section
34
+
35
+ # Old name
36
+ alias_method :describe_topic, :describe_section
37
+
38
+ end # module NRSER::RSpex::ExampleGroup
@@ -0,0 +1,52 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
3
+
4
+ module NRSER::RSpex::ExampleGroup
5
+
6
+ # For use when `subject` is a {NRSER::Message}. Create a new context for
7
+ # the `receiver` where the subject is the result of sending that message
8
+ # to the receiver.
9
+ #
10
+ # @param [Object] receiver
11
+ # Object that will receive the message to create the new subject.
12
+ #
13
+ # If it's a {Wrapper} it will be unwrapped in example contexts of the
14
+ # new example group.
15
+ #
16
+ # @param [Boolean] publicly:
17
+ # Send message publicly via {Object#public_send} (default) or privately
18
+ # via {Object.send}.
19
+ #
20
+ # @param bind_subject: (see #describe_x)
21
+ # @param &body (see #describe_x)
22
+ #
23
+ # @return (see #describe_x)
24
+ #
25
+ def describe_sent_to receiver,
26
+ publicly: true,
27
+ bind_subject: true,
28
+ &body
29
+ mode = if publicly
30
+ "publicly"
31
+ else
32
+ "privately"
33
+ end
34
+
35
+ describe_x \
36
+ receiver,
37
+ "(#{ mode })",
38
+ type: :sent_to,
39
+ bind_subject: bind_subject,
40
+ subject_block: -> {
41
+ super().send_to \
42
+ unwrap( receiver, context: self ),
43
+ publicly: publicly
44
+ },
45
+ &body
46
+ end # #describe_sent_to
47
+
48
+ # Aliases to other names I was using at first... not preferring their use
49
+ # at the moment.
50
+ alias_method :sent_to, :describe_sent_to
51
+
52
+ end # module NRSER::RSpex::ExampleGroup