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,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
+