nrser 0.3.9 → 0.3.10

Sign up to get free protection for your applications and to get access to all the features.
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,41 +0,0 @@
1
- # encoding: UTF-8
2
- # frozen_string_literal: true
3
-
4
- module NRSER::Types
5
-
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
39
- end
40
-
41
- end # NRSER::Types
@@ -1,213 +0,0 @@
1
- # encoding: UTF-8
2
- # frozen_string_literal: true
3
-
4
-
5
- # Requirements
6
- # ========================================================================
7
-
8
- # Project / Package
9
- # ------------------------------------------------------------------------
10
-
11
- require 'nrser/core_ext/hash'
12
-
13
- require_relative './type'
14
- require_relative './combinators'
15
- require_relative './is'
16
-
17
-
18
- # Definitions
19
- # ========================================================================
20
-
21
- module NRSER::Types
22
-
23
- # Specify types for value attributes.
24
- #
25
- class AttrsType < NRSER::Types::Type
26
-
27
- # Construct an `AttrsType`.
28
- #
29
- # @param [Hash<Symbol, TYPE>] attrs
30
- # Map of attribute names to their types (`TYPE` values will be passed
31
- # through {NRSER::Types.make} to get a type instance).
32
- #
33
- # May not be empty.
34
- #
35
- def initialize attrs, **options
36
- super **options
37
-
38
- if attrs.empty?
39
- raise ArgumentError,
40
- "Must provide at least one attribute name/type pair"
41
- end
42
-
43
- @attrs = attrs.transform_values &NRSER::Types.maker
44
- end
45
-
46
-
47
- # @see NRSER::Types::Type#explain
48
- #
49
- # @return [String]
50
- #
51
- def explain
52
- attrs_str = @attrs.map { |name, type|
53
- "##{ name }#{ RESPONDS_WITH }#{ type.name }"
54
- }.join(', ')
55
-
56
- if @attrs.length < 2
57
- attrs_str
58
- else
59
- L_PAREN + attrs_str + R_PAREN
60
- end
61
- end
62
-
63
-
64
- # @see NRSER::Types::Type#test
65
- #
66
- # @return [Boolean]
67
- #
68
- def test? value
69
- @attrs.all? { |name, type|
70
- value.respond_to?( name ) &&
71
- type.test?( value.method( name ).call )
72
- }
73
- end
74
-
75
- end # AttrsType
76
-
77
-
78
- # @!group Type Factory Functions
79
-
80
- # Get a {Type} that checks the types of one or more attributes on values.
81
- #
82
- # @example Type where first element of an Enumerable is a String
83
- # string_first = intersection Enumerable, attrs(first: String)
84
- #
85
- def_factory :attrs do |*args|
86
- case args.length
87
- when 0
88
- raise NRSER::ArgumentError.new \
89
- "requires at least one argument"
90
- when 1
91
- attrs = args[0]
92
- options = {}
93
- when 2
94
- attrs = args[0]
95
- options = args[1]
96
- end
97
-
98
- AttrsType.new attrs, **options
99
- end
100
-
101
-
102
- # @overload length exact, options = {}
103
- # Get a length attribute type that specifies an `exact` value.
104
- #
105
- # @example
106
- # only_type = NRSER::Types.length 1
107
- #
108
- # only_type.test []
109
- # # => false
110
- #
111
- # only_type.test [:x]
112
- # # => true
113
- #
114
- # only_type.test [:x, :y]
115
- # # => false
116
- #
117
- # @param [Integer] exact
118
- # Exact non-negative integer that the length must be to satisfy the
119
- # type created.
120
- #
121
- # @param [Hash] options
122
- # Options hash passed up to {NRSER::Types::Type} constructor.
123
- #
124
- # @return [NRSER::Types::Attrs]
125
- # Type satisfied by a `#length` attribute that is exactly `exact`.
126
- #
127
- #
128
- # @overload length bounds, options = {}
129
- # Get a length attribute type satisfied by values within a `:min` and
130
- # `:max` (inclusive).
131
- #
132
- # @example
133
- # three_to_five = NRSER::Types.length( {min: 3, max: 5}, name: '3-5' )
134
- # three_to_five.test [1, 2] # => false
135
- # three_to_five.test [1, 2, 3] # => true
136
- # three_to_five.test [1, 2, 3, 4] # => true
137
- # three_to_five.test [1, 2, 3, 4, 5] # => true
138
- # three_to_five.test [1, 2, 3, 4, 5, 6] # => false
139
- #
140
- # @param [Hash] bounds
141
- #
142
- # @option bounds [Integer] :min
143
- # An optional minimum value that the `#length` should not be less than.
144
- #
145
- # @option bounds [Integer] :max
146
- # An optional maximum value that the `#length` should not be more than.
147
- #
148
- # @option bounds [Integer] :length
149
- # An optional value for both the minimum and maximum.
150
- #
151
- # @param [Hash] options
152
- # Options hash passed up to {NRSER::Types::Type} constructor.
153
- #
154
- # @return [NRSER::Types::Attrs]
155
- # Type satisfied by a `#length` attribute between the `:min` and `:max`
156
- # (inclusive).
157
- #
158
- def self.length *args
159
- bounds = {}
160
- options = if args[1].is_a?( Hash ) then args[1] else {} end
161
-
162
- case args[0]
163
- when ::Integer
164
- # It's just a length
165
- return attrs(
166
- { length: is( non_neg_int.check!( args[0] ) ) },
167
- **options
168
- )
169
-
170
- bounds[:min] = bounds[:max] = non_neg_int.check args[0]
171
-
172
- when ::Hash
173
- # It's keyword args
174
- kwds = args[0].sym_keys
175
-
176
- # Pull any :min and :max in the keywords
177
- bounds[:min] = kwds.delete :min
178
- bounds[:max] = kwds.delete :max
179
-
180
- # But override with :length if we got it
181
- if length = kwds.delete(:length)
182
- bounds[:min] = length
183
- bounds[:max] = length
184
- end
185
-
186
- # (Reverse) merge anything else into the options (options hash values
187
- # take precedence)
188
- options = kwds.merge options
189
-
190
- else
191
- raise ArgumentError, <<-END.squish
192
- arg must be positive integer or option hash, found:
193
- #{ args[0].inspect } of type #{ args[0].class }
194
- END
195
-
196
- end
197
-
198
- bounded_type = bounded bounds
199
-
200
- length_type = if !bounded_type.min.nil? && bounded_type.min >= 0
201
- # We don't need the non-neg check
202
- bounded_type
203
- else
204
- # We do need the non-neg check
205
- intersection(non_neg_int, bounded_type)
206
- end
207
-
208
- options[:name] ||= "Length<#{ bounded_type.name }>"
209
-
210
- attrs({ length: length_type }, options)
211
- end # #length
212
-
213
- end # NRSER::Types
@@ -1,42 +0,0 @@
1
- # Requirements
2
- # =======================================================================
3
-
4
- # Project / Package
5
- # -----------------------------------------------------------------------
6
- require_relative './combinators'
7
- require_relative './responds'
8
- require_relative './is_a'
9
-
10
-
11
- # Definitions
12
- # =======================================================================
13
-
14
- module NRSER::Types
15
-
16
- def_factory :array_like do |name: 'ArrayLike', **options|
17
- intersection \
18
- is_a( Enumerable ),
19
- respond_to( :each_index ),
20
- name: name,
21
- **options
22
- end # .array_like
23
-
24
-
25
- def_factory :hash_like do |name: 'HashLike', **options|
26
- intersection \
27
- is_a( Enumerable ),
28
- respond_to( :each_pair ),
29
- name: name,
30
- **options
31
- end # .hash_like
32
-
33
-
34
- def_factory :tree do |name: 'Tree', **options|
35
- union \
36
- array_like,
37
- hash_like,
38
- name: name,
39
- **options
40
- end # .tree
41
-
42
- end # module NRSER::Types