nrser 0.3.9 → 0.3.10

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 (141) hide show
  1. checksums.yaml +4 -4
  2. data/lib/nrser/char/alpha_numeric_sub.rb +9 -19
  3. data/lib/nrser/char/special.rb +5 -5
  4. data/lib/nrser/core_ext/array.rb +36 -13
  5. data/lib/nrser/core_ext/enumerable.rb +1 -0
  6. data/lib/nrser/core_ext/enumerable/find_map.rb +1 -1
  7. data/lib/nrser/core_ext/hash/bury.rb +3 -0
  8. data/lib/nrser/core_ext/hash/extract_values_at.rb +2 -2
  9. data/lib/nrser/core_ext/method/full_name.rb +1 -1
  10. data/lib/nrser/core_ext/module/method_objects.rb +1 -1
  11. data/lib/nrser/core_ext/module/source_locations.rb +27 -15
  12. data/lib/nrser/core_ext/object/lazy_var.rb +1 -1
  13. data/lib/nrser/core_ext/pathname.rb +67 -12
  14. data/lib/nrser/core_ext/pathname/subpath.rb +86 -0
  15. data/lib/nrser/core_ext/string.rb +28 -1
  16. data/lib/nrser/core_ext/symbol.rb +11 -12
  17. data/lib/nrser/errors/README.md +154 -0
  18. data/lib/nrser/errors/attr_error.rb +146 -53
  19. data/lib/nrser/errors/count_error.rb +61 -12
  20. data/lib/nrser/errors/nicer_error.rb +42 -71
  21. data/lib/nrser/errors/value_error.rb +53 -58
  22. data/lib/nrser/functions.rb +0 -2
  23. data/lib/nrser/functions/enumerable.rb +5 -17
  24. data/lib/nrser/functions/enumerable/associate.rb +14 -5
  25. data/lib/nrser/functions/enumerable/find_all_map.rb +1 -1
  26. data/lib/nrser/functions/enumerable/include_slice/array_include_slice.rb +1 -1
  27. data/lib/nrser/functions/hash/bury.rb +2 -12
  28. data/lib/nrser/functions/merge_by.rb +2 -2
  29. data/lib/nrser/functions/module/method_objects.rb +2 -2
  30. data/lib/nrser/functions/path.rb +185 -165
  31. data/lib/nrser/functions/path/normalized.rb +84 -0
  32. data/lib/nrser/functions/string.rb +4 -4
  33. data/lib/nrser/functions/text/README.md +4 -0
  34. data/lib/nrser/functions/text/format.rb +53 -0
  35. data/lib/nrser/functions/text/indentation.rb +6 -6
  36. data/lib/nrser/functions/text/word_wrap.rb +2 -2
  37. data/lib/nrser/functions/tree/map_leaves.rb +3 -3
  38. data/lib/nrser/functions/tree/map_tree.rb +2 -2
  39. data/lib/nrser/functions/tree/transform.rb +1 -18
  40. data/lib/nrser/gem_ext/README.md +4 -0
  41. data/lib/nrser/labs/README.md +8 -0
  42. data/lib/nrser/labs/config.rb +163 -0
  43. data/lib/nrser/labs/i8.rb +49 -159
  44. data/lib/nrser/labs/i8/struct.rb +167 -0
  45. data/lib/nrser/labs/i8/struct/hash.rb +140 -0
  46. data/lib/nrser/labs/i8/struct/vector.rb +149 -0
  47. data/lib/nrser/labs/i8/surjection.rb +211 -0
  48. data/lib/nrser/labs/lots/consumer.rb +19 -0
  49. data/lib/nrser/labs/lots/parser.rb +21 -1
  50. data/lib/nrser/labs/stash.rb +4 -4
  51. data/lib/nrser/log.rb +25 -21
  52. data/lib/nrser/log/appender/sync.rb +15 -11
  53. data/lib/nrser/log/formatters/color.rb +0 -3
  54. data/lib/nrser/log/formatters/mixin.rb +4 -4
  55. data/lib/nrser/log/logger.rb +54 -6
  56. data/lib/nrser/log/mixin.rb +2 -1
  57. data/lib/nrser/log/plugin.rb +6 -6
  58. data/lib/nrser/log/types.rb +46 -29
  59. data/lib/nrser/mean_streak.rb +0 -8
  60. data/lib/nrser/mean_streak/document.rb +1 -4
  61. data/lib/nrser/message.rb +3 -3
  62. data/lib/nrser/meta/README.md +4 -0
  63. data/lib/nrser/meta/lazy_attr.rb +2 -2
  64. data/lib/nrser/meta/source/location.rb +1 -1
  65. data/lib/nrser/props.rb +34 -3
  66. data/lib/nrser/props/class_methods.rb +2 -1
  67. data/lib/nrser/props/instance_methods.rb +9 -9
  68. data/lib/nrser/props/metadata.rb +4 -12
  69. data/lib/nrser/props/mutable/stash.rb +5 -2
  70. data/lib/nrser/props/prop.rb +10 -19
  71. data/lib/nrser/rspex.rb +1 -20
  72. data/lib/nrser/rspex/example_group/describe_attribute.rb +3 -0
  73. data/lib/nrser/rspex/example_group/describe_called_with.rb +9 -4
  74. data/lib/nrser/rspex/example_group/describe_case.rb +1 -0
  75. data/lib/nrser/rspex/example_group/describe_class.rb +2 -0
  76. data/lib/nrser/rspex/example_group/describe_group.rb +1 -1
  77. data/lib/nrser/rspex/example_group/describe_instance.rb +3 -1
  78. data/lib/nrser/rspex/example_group/describe_message.rb +1 -1
  79. data/lib/nrser/rspex/example_group/describe_method.rb +64 -30
  80. data/lib/nrser/rspex/example_group/describe_response_to.rb +1 -1
  81. data/lib/nrser/rspex/example_group/describe_section.rb +4 -1
  82. data/lib/nrser/rspex/example_group/describe_sent_to.rb +1 -1
  83. data/lib/nrser/rspex/example_group/describe_setup.rb +1 -0
  84. data/lib/nrser/rspex/example_group/describe_source_file.rb +1 -1
  85. data/lib/nrser/rspex/example_group/describe_spec_file.rb +4 -2
  86. data/lib/nrser/rspex/example_group/describe_when.rb +2 -1
  87. data/lib/nrser/rspex/example_group/describe_x.rb +5 -5
  88. data/lib/nrser/rspex/format.rb +0 -15
  89. data/lib/nrser/sugar/method_missing_forwarder.rb +3 -3
  90. data/lib/nrser/sys/env/path.rb +2 -28
  91. data/lib/nrser/types.rb +63 -12
  92. data/lib/nrser/types/README.md +76 -0
  93. data/lib/nrser/types/arrays.rb +192 -137
  94. data/lib/nrser/types/attributes.rb +269 -0
  95. data/lib/nrser/types/booleans.rb +134 -83
  96. data/lib/nrser/types/bounded.rb +110 -47
  97. data/lib/nrser/types/collections.rb +119 -0
  98. data/lib/nrser/types/combinators.rb +283 -196
  99. data/lib/nrser/types/doc/display_table.md +66 -0
  100. data/lib/nrser/types/eqiuvalent.rb +91 -0
  101. data/lib/nrser/types/errors/check_error.rb +5 -11
  102. data/lib/nrser/types/errors/from_string_error.rb +3 -3
  103. data/lib/nrser/types/factory.rb +287 -20
  104. data/lib/nrser/types/hashes.rb +227 -179
  105. data/lib/nrser/types/in.rb +73 -36
  106. data/lib/nrser/types/is.rb +67 -60
  107. data/lib/nrser/types/is_a.rb +141 -84
  108. data/lib/nrser/types/labels.rb +45 -16
  109. data/lib/nrser/types/maybe.rb +6 -3
  110. data/lib/nrser/types/nil.rb +64 -27
  111. data/lib/nrser/types/not.rb +92 -34
  112. data/lib/nrser/types/numbers.rb +224 -169
  113. data/lib/nrser/types/pairs.rb +113 -89
  114. data/lib/nrser/types/paths.rb +250 -137
  115. data/lib/nrser/types/responds.rb +167 -89
  116. data/lib/nrser/types/selector.rb +234 -0
  117. data/lib/nrser/types/shape.rb +136 -65
  118. data/lib/nrser/types/strings.rb +189 -63
  119. data/lib/nrser/types/symbols.rb +83 -33
  120. data/lib/nrser/types/top.rb +89 -0
  121. data/lib/nrser/types/tuples.rb +134 -98
  122. data/lib/nrser/types/type.rb +617 -505
  123. data/lib/nrser/types/when.rb +123 -98
  124. data/lib/nrser/types/where.rb +182 -91
  125. data/lib/nrser/version.rb +1 -1
  126. data/spec/lib/nrser/core_ext/pathname/subpath_spec.rb +22 -0
  127. data/spec/lib/nrser/errors/attr_error_spec.rb +68 -0
  128. data/spec/lib/nrser/errors/count_error_spec.rb +69 -0
  129. data/spec/lib/nrser/functions/path/normalize_path_spec.rb +35 -0
  130. data/spec/lib/nrser/functions/tree/map_tree_spec.rb +74 -96
  131. data/spec/lib/nrser/functions/tree/transform_spec.rb +11 -11
  132. data/spec/lib/nrser/labs/config_spec.rb +22 -0
  133. data/spec/lib/nrser/labs/i8/struct_spec.rb +39 -0
  134. data/spec/lib/nrser/types/display_spec.rb +50 -0
  135. data/spec/lib/nrser/types/paths_spec.rb +16 -10
  136. data/spec/lib/nrser/types/selector_spec.rb +125 -0
  137. data/spec/spec_helper.rb +4 -5
  138. metadata +105 -22
  139. data/lib/nrser/types/any.rb +0 -41
  140. data/lib/nrser/types/attrs.rb +0 -213
  141. data/lib/nrser/types/trees.rb +0 -42
@@ -1,77 +1,84 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
1
3
 
2
4
  # Requirements
3
5
  # ========================================================================
4
6
 
5
- # Stdlib
6
- # ------------------------------------------------------------------------
7
-
8
- # Deps
7
+ # Project / Package
9
8
  # ------------------------------------------------------------------------
10
9
 
11
- # Need {Module#anonymous?}
12
- require 'active_support/core_ext/module/anonymous'
10
+ require_relative './type'
13
11
 
14
12
 
15
- # Project / Package
16
- # ------------------------------------------------------------------------
13
+ # Namespace
14
+ # ========================================================================
17
15
 
18
- require_relative './type'
16
+ module NRSER
17
+ module Types
19
18
 
20
19
 
21
- module NRSER::Types
20
+ # Type satisfied only by it's exact {#value} object (identity comparison
21
+ # via `#equal?`).
22
+ #
23
+ class Is < Type
22
24
 
23
- # Type satisfied only by it's exact {#value} object (identity comparison
24
- # via `#equal?`).
25
+ # The exact value for this type.
26
+ #
27
+ # @return [Object]
25
28
  #
26
- class Is < NRSER::Types::Type
27
-
28
- # Attributes
29
- # ========================================================================
30
-
31
- attr_reader :value
32
-
33
- def initialize value, **options
34
- super **options
35
- @value = value
36
- end
37
-
38
- def explain
39
- case value
40
- when Module
41
- module_type = if value.is_a?( Class ) then 'Class' else 'Module' end
42
-
43
- name = if value.anonymous?
44
- value.to_s.split( ':' ).last[0...-1]
45
- else
46
- value.name
47
- end
48
-
49
- "#{ module_type }<#{ name }>"
50
- else
51
- value.inspect
52
- end
53
- end
54
-
55
- def test? value
56
- @value.equal? value
57
- end
58
-
59
- def == other
60
- equal?(other) ||
61
- ( self.class == other.class &&
62
- @value == other.value )
63
- end
64
-
65
- end # Is
29
+ attr_reader :value
66
30
 
31
+ def initialize value, **options
32
+ super **options
33
+ @value = value
34
+ end
67
35
 
68
- # Satisfied by the exact value only (identity comparison via
69
- # `#equal?`).
70
- #
71
- # Useful for things like {Module}, {Class}, {Fixnum}, {Symbol}, `true`, etc.
72
- #
73
- def_factory :is do |value, **options|
74
- Is.new value, **options
36
+ def explain
37
+ "Is<#{ value.inspect }>"
38
+ end
39
+
40
+ def test? value
41
+ @value.equal? value
75
42
  end
76
43
 
77
- end # NRSER::Types
44
+ def == other
45
+ equal?(other) ||
46
+ ( self.class.equal?( other.class ) &&
47
+ @value.equal?( other.value ) )
48
+ end
49
+
50
+
51
+ def default_symbolic
52
+ "{#{ value.inspect }}"
53
+ end
54
+
55
+ end # Is
56
+
57
+
58
+ # @!group Identity Equality Type Factories
59
+ # ----------------------------------------------------------------------------
60
+
61
+ #@!method self.Is **options
62
+ # Satisfied by the exact value only (identity comparison via `#equal?`).
63
+ #
64
+ # Useful for things like {Module}, {Class}, {Fixnum}, {Symbol}, `true`, etc.
65
+ #
66
+ # @param [Hash] options
67
+ # Passed to {Type#initialize}.
68
+ #
69
+ # @return [Type]
70
+ #
71
+ def_type :Is,
72
+ parameterize: :value,
73
+ &->( value, **options ) do
74
+ Is.new value, **options
75
+ end # .Is
76
+
77
+ # @!endgroup Identity Equality Type Factories # ******************************
78
+
79
+
80
+ # /Namespace
81
+ # ========================================================================
82
+
83
+ end # module Types
84
+ end # module NRSER
@@ -1,98 +1,155 @@
1
+ # frozen_string_literal: true
2
+ # encoding: UTF-8
3
+
4
+
5
+ # Requirements
6
+ # ========================================================================
7
+
8
+ # Project / Package
9
+ # ------------------------------------------------------------------------
10
+
1
11
  require 'nrser/types/type'
2
12
 
3
- module NRSER::Types
4
- # Type satisfied by class membership (or mixin presence for modules).
5
- #
6
- # Tests via the subject value's `#is_a?` method.
7
- #
8
- class IsA < NRSER::Types::Type
9
- attr_reader :mod
10
-
11
- def initialize mod, init_from_data: false, **options
12
- unless mod.is_a?( Module )
13
- raise ArgumentError,
14
- "`mod` argument must be a Module (inc. Class), " \
15
- "received #{ mod.inspect }"
16
- end
17
-
18
- super **options
19
-
20
- @init_from_data = !!init_from_data
21
-
22
- @mod = mod
23
- end
24
-
25
-
26
- def explain
27
- mod.safe_name
28
- end
29
-
30
-
31
- def test? value
32
- value.is_a? mod
33
- end
34
-
35
-
36
-
37
- # @todo Document init_from_data? method.
38
- #
39
- # @param [type] arg_name
40
- # @todo Add name param description.
41
- #
42
- # @return [return_type]
43
- # @todo Document return value.
44
- #
45
- def init_from_data?
46
- @init_from_data
47
- end # #init_from_data?
48
-
49
-
50
-
51
- # Forwards to `mod.from_data`.
52
- #
53
- # @param data (see NRSER::Types::Type#from_data)
54
- # @return (see NRSER::Types::Type#from_data)
55
- # @raise (see NRSER::Types::Type#from_data)
56
- #
57
- def custom_from_data data
58
- if init_from_data?
59
- mod.new data
60
- else
61
- mod.from_data data
62
- end
13
+
14
+ # Namespace
15
+ # ========================================================================
16
+
17
+ module NRSER
18
+ module Types
19
+
20
+
21
+ # Definitions
22
+ # ========================================================================
23
+
24
+ # Type satisfied by class membership (or mixin presence for modules).
25
+ #
26
+ # Tests via the subject value's `#is_a?` method is `true` for {#mod}. Works
27
+ # for class instances as will as mixins.
28
+ #
29
+ # @note
30
+ # Construct {IsA} types using the {.IsA} factory.
31
+ #
32
+ class IsA < NRSER::Types::Type
33
+ attr_reader :mod
34
+
35
+ def initialize mod, init_from_data: false, **options
36
+ unless mod.is_a?( Module )
37
+ raise ArgumentError,
38
+ "`mod` argument must be a Module (inc. Class), " \
39
+ "received #{ mod.inspect }"
63
40
  end
64
41
 
42
+ super **options
65
43
 
66
- # Overrides {NRSER::Types::Type#has_from_data?} to respond `true` when
67
- # there is a instance-specific `@from_data` or the {#mod} responds to
68
- # `.from_data`.
69
- #
70
- # @return [Boolean]
71
- #
72
- def has_from_data?
73
- @from_data ||
74
- init_from_data? ||
75
- mod.respond_to?( :from_data )
76
- end
77
-
44
+ @init_from_data = !!init_from_data
78
45
 
79
- def == other
80
- equal?( other ) ||
81
- ( self.class == other.class &&
82
- self.mod == other.mod )
46
+ @mod = mod
47
+ end
48
+
49
+
50
+ def explain
51
+ mod.safe_name
52
+ end
53
+
54
+
55
+ def test? value
56
+ value.is_a? mod
57
+ end
58
+
59
+
60
+ def init_from_data?
61
+ @init_from_data
62
+ end # #init_from_data?
63
+
64
+
65
+ # Forwards to `mod.from_data`.
66
+ #
67
+ # @param data (see NRSER::Types::Type#from_data)
68
+ # @return (see NRSER::Types::Type#from_data)
69
+ # @raise (see NRSER::Types::Type#from_data)
70
+ #
71
+ def custom_from_data data
72
+ if init_from_data?
73
+ mod.new data
74
+ else
75
+ mod.from_data data
83
76
  end
84
-
85
- end # IsA
77
+ end
86
78
 
87
79
 
88
- # class membership
89
- def_factory :is_a do |mod, **options|
90
- IsA.new mod, **options
80
+ # Overrides {NRSER::Types::Type#has_from_data?} to respond `true` when
81
+ # there is a instance-specific `@from_data` or the {#mod} responds to
82
+ # `.from_data`.
83
+ #
84
+ # @return [Boolean]
85
+ #
86
+ def has_from_data?
87
+ @from_data ||
88
+ init_from_data? ||
89
+ mod.respond_to?( :from_data )
91
90
  end
92
91
 
93
92
 
94
- def_factory :type do |**options|
95
- is_a NRSER::Types::Type
93
+ def == other
94
+ equal?( other ) ||
95
+ ( self.class == other.class &&
96
+ self.mod == other.mod )
96
97
  end
97
98
 
98
- end # NRSER::Types
99
+ end # class IsA
100
+
101
+
102
+ # @!group Class Instance Type Factories
103
+ # ----------------------------------------------------------------------------
104
+
105
+ # @!method self.IsA module_, **options
106
+ # Create a type
107
+ #
108
+ # { x : x.is_a?( mod ) == true }
109
+ #
110
+ # If `mod` is a {Class}, the returned {Type} will be satisfied by instances
111
+ # of `mod`.
112
+ #
113
+ # If `mod` is a non-Class {Module}, the returned {Type} will be satisfied
114
+ # by instances of classes that include `mod`.
115
+ #
116
+ # @param [Module] module_
117
+ # The {Class} or {Module} that type members should be.
118
+ #
119
+ # @param [Hash] options
120
+ # Passed to {Type#initialize}.
121
+ #
122
+ # @return [Type]
123
+ #
124
+ def_type :IsA,
125
+ parameterize: :mod,
126
+ &->( module_, **options ) do
127
+ IsA.new module_, **options
128
+ end
129
+
130
+
131
+ #@!method self.Type **options
132
+ # A type whose members are {Type} instances themselves.
133
+ #
134
+ # @todo
135
+ # This is where the methods that load types from data and strings that
136
+ # are used by CLI apps to spec params and the like should go!
137
+ #
138
+ # @param [Hash] options
139
+ # Passed to {Type#initialize}.
140
+ #
141
+ # @return [IsA]
142
+ #
143
+ def_type :Type,
144
+ &->( **options ) do
145
+ IsA NRSER::Types::Type, **options
146
+ end # .Type
147
+
148
+ # @!endgroup Class Instance Type Factories # *********************************
149
+
150
+
151
+ # /Namespace
152
+ # ========================================================================
153
+
154
+ end # module Types
155
+ end # module NRSER
@@ -1,22 +1,51 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
3
+
4
+ # Requirements
5
+ # ========================================================================
6
+
7
+ # Project / Package
8
+ # ------------------------------------------------------------------------
9
+
1
10
  require_relative './combinators'
2
11
  require_relative './strings'
3
12
 
13
+
14
+ # Namespace
15
+ # ========================================================================
16
+
17
+ module NRSER
18
+ module Types
19
+
20
+
4
21
  # Definitions
5
22
  # =======================================================================
6
23
 
7
- module NRSER::Types
8
-
9
- # A label is a non-empty {String} or {Symbol}.
10
- #
11
- # @param [Hash] **options
12
- # Options to pass to {NRSER::Types::Type#initialize}.
13
- #
14
- # @return [NRSER::Types::Type]
15
- #
16
- def_factory(
17
- :label,
18
- ) do |name: 'Label', **options|
19
- union non_empty_str, non_empty_sym, name: name, **options
20
- end # .label
21
-
22
- end # module NRSER::Types
24
+ # @!group Label Type Factories
25
+ # ----------------------------------------------------------------------------
26
+
27
+ #@!method self.Label **options
28
+ # A label is a non-empty {String} or {Symbol}.
29
+ #
30
+ # @param [Hash] options
31
+ # Passed to {Type#initialize}.
32
+ #
33
+ # @return [Type]
34
+ #
35
+ def_type :Label,
36
+ &->( **options ) do
37
+ self.Union \
38
+ self.NonEmptyString,
39
+ self.NonEmptySymbol,
40
+ **options
41
+ end # .Label
42
+
43
+ # @!endgroup Label Type Factories # ******************************************
44
+
45
+
46
+ # /Namespace
47
+ # ========================================================================
48
+
49
+ end # module Types
50
+ end # module NRSER
51
+