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.
- checksums.yaml +4 -4
- data/lib/nrser/char/alpha_numeric_sub.rb +9 -19
- data/lib/nrser/char/special.rb +5 -5
- data/lib/nrser/core_ext/array.rb +36 -13
- data/lib/nrser/core_ext/enumerable.rb +1 -0
- data/lib/nrser/core_ext/enumerable/find_map.rb +1 -1
- data/lib/nrser/core_ext/hash/bury.rb +3 -0
- data/lib/nrser/core_ext/hash/extract_values_at.rb +2 -2
- data/lib/nrser/core_ext/method/full_name.rb +1 -1
- data/lib/nrser/core_ext/module/method_objects.rb +1 -1
- data/lib/nrser/core_ext/module/source_locations.rb +27 -15
- data/lib/nrser/core_ext/object/lazy_var.rb +1 -1
- data/lib/nrser/core_ext/pathname.rb +67 -12
- data/lib/nrser/core_ext/pathname/subpath.rb +86 -0
- data/lib/nrser/core_ext/string.rb +28 -1
- data/lib/nrser/core_ext/symbol.rb +11 -12
- data/lib/nrser/errors/README.md +154 -0
- data/lib/nrser/errors/attr_error.rb +146 -53
- data/lib/nrser/errors/count_error.rb +61 -12
- data/lib/nrser/errors/nicer_error.rb +42 -71
- data/lib/nrser/errors/value_error.rb +53 -58
- data/lib/nrser/functions.rb +0 -2
- data/lib/nrser/functions/enumerable.rb +5 -17
- data/lib/nrser/functions/enumerable/associate.rb +14 -5
- data/lib/nrser/functions/enumerable/find_all_map.rb +1 -1
- data/lib/nrser/functions/enumerable/include_slice/array_include_slice.rb +1 -1
- data/lib/nrser/functions/hash/bury.rb +2 -12
- data/lib/nrser/functions/merge_by.rb +2 -2
- data/lib/nrser/functions/module/method_objects.rb +2 -2
- data/lib/nrser/functions/path.rb +185 -165
- data/lib/nrser/functions/path/normalized.rb +84 -0
- data/lib/nrser/functions/string.rb +4 -4
- data/lib/nrser/functions/text/README.md +4 -0
- data/lib/nrser/functions/text/format.rb +53 -0
- data/lib/nrser/functions/text/indentation.rb +6 -6
- data/lib/nrser/functions/text/word_wrap.rb +2 -2
- data/lib/nrser/functions/tree/map_leaves.rb +3 -3
- data/lib/nrser/functions/tree/map_tree.rb +2 -2
- data/lib/nrser/functions/tree/transform.rb +1 -18
- data/lib/nrser/gem_ext/README.md +4 -0
- data/lib/nrser/labs/README.md +8 -0
- data/lib/nrser/labs/config.rb +163 -0
- data/lib/nrser/labs/i8.rb +49 -159
- data/lib/nrser/labs/i8/struct.rb +167 -0
- data/lib/nrser/labs/i8/struct/hash.rb +140 -0
- data/lib/nrser/labs/i8/struct/vector.rb +149 -0
- data/lib/nrser/labs/i8/surjection.rb +211 -0
- data/lib/nrser/labs/lots/consumer.rb +19 -0
- data/lib/nrser/labs/lots/parser.rb +21 -1
- data/lib/nrser/labs/stash.rb +4 -4
- data/lib/nrser/log.rb +25 -21
- data/lib/nrser/log/appender/sync.rb +15 -11
- data/lib/nrser/log/formatters/color.rb +0 -3
- data/lib/nrser/log/formatters/mixin.rb +4 -4
- data/lib/nrser/log/logger.rb +54 -6
- data/lib/nrser/log/mixin.rb +2 -1
- data/lib/nrser/log/plugin.rb +6 -6
- data/lib/nrser/log/types.rb +46 -29
- data/lib/nrser/mean_streak.rb +0 -8
- data/lib/nrser/mean_streak/document.rb +1 -4
- data/lib/nrser/message.rb +3 -3
- data/lib/nrser/meta/README.md +4 -0
- data/lib/nrser/meta/lazy_attr.rb +2 -2
- data/lib/nrser/meta/source/location.rb +1 -1
- data/lib/nrser/props.rb +34 -3
- data/lib/nrser/props/class_methods.rb +2 -1
- data/lib/nrser/props/instance_methods.rb +9 -9
- data/lib/nrser/props/metadata.rb +4 -12
- data/lib/nrser/props/mutable/stash.rb +5 -2
- data/lib/nrser/props/prop.rb +10 -19
- data/lib/nrser/rspex.rb +1 -20
- data/lib/nrser/rspex/example_group/describe_attribute.rb +3 -0
- data/lib/nrser/rspex/example_group/describe_called_with.rb +9 -4
- data/lib/nrser/rspex/example_group/describe_case.rb +1 -0
- data/lib/nrser/rspex/example_group/describe_class.rb +2 -0
- data/lib/nrser/rspex/example_group/describe_group.rb +1 -1
- data/lib/nrser/rspex/example_group/describe_instance.rb +3 -1
- data/lib/nrser/rspex/example_group/describe_message.rb +1 -1
- data/lib/nrser/rspex/example_group/describe_method.rb +64 -30
- data/lib/nrser/rspex/example_group/describe_response_to.rb +1 -1
- data/lib/nrser/rspex/example_group/describe_section.rb +4 -1
- data/lib/nrser/rspex/example_group/describe_sent_to.rb +1 -1
- data/lib/nrser/rspex/example_group/describe_setup.rb +1 -0
- data/lib/nrser/rspex/example_group/describe_source_file.rb +1 -1
- data/lib/nrser/rspex/example_group/describe_spec_file.rb +4 -2
- data/lib/nrser/rspex/example_group/describe_when.rb +2 -1
- data/lib/nrser/rspex/example_group/describe_x.rb +5 -5
- data/lib/nrser/rspex/format.rb +0 -15
- data/lib/nrser/sugar/method_missing_forwarder.rb +3 -3
- data/lib/nrser/sys/env/path.rb +2 -28
- data/lib/nrser/types.rb +63 -12
- data/lib/nrser/types/README.md +76 -0
- data/lib/nrser/types/arrays.rb +192 -137
- data/lib/nrser/types/attributes.rb +269 -0
- data/lib/nrser/types/booleans.rb +134 -83
- data/lib/nrser/types/bounded.rb +110 -47
- data/lib/nrser/types/collections.rb +119 -0
- data/lib/nrser/types/combinators.rb +283 -196
- data/lib/nrser/types/doc/display_table.md +66 -0
- data/lib/nrser/types/eqiuvalent.rb +91 -0
- data/lib/nrser/types/errors/check_error.rb +5 -11
- data/lib/nrser/types/errors/from_string_error.rb +3 -3
- data/lib/nrser/types/factory.rb +287 -20
- data/lib/nrser/types/hashes.rb +227 -179
- data/lib/nrser/types/in.rb +73 -36
- data/lib/nrser/types/is.rb +67 -60
- data/lib/nrser/types/is_a.rb +141 -84
- data/lib/nrser/types/labels.rb +45 -16
- data/lib/nrser/types/maybe.rb +6 -3
- data/lib/nrser/types/nil.rb +64 -27
- data/lib/nrser/types/not.rb +92 -34
- data/lib/nrser/types/numbers.rb +224 -169
- data/lib/nrser/types/pairs.rb +113 -89
- data/lib/nrser/types/paths.rb +250 -137
- data/lib/nrser/types/responds.rb +167 -89
- data/lib/nrser/types/selector.rb +234 -0
- data/lib/nrser/types/shape.rb +136 -65
- data/lib/nrser/types/strings.rb +189 -63
- data/lib/nrser/types/symbols.rb +83 -33
- data/lib/nrser/types/top.rb +89 -0
- data/lib/nrser/types/tuples.rb +134 -98
- data/lib/nrser/types/type.rb +617 -505
- data/lib/nrser/types/when.rb +123 -98
- data/lib/nrser/types/where.rb +182 -91
- data/lib/nrser/version.rb +1 -1
- data/spec/lib/nrser/core_ext/pathname/subpath_spec.rb +22 -0
- data/spec/lib/nrser/errors/attr_error_spec.rb +68 -0
- data/spec/lib/nrser/errors/count_error_spec.rb +69 -0
- data/spec/lib/nrser/functions/path/normalize_path_spec.rb +35 -0
- data/spec/lib/nrser/functions/tree/map_tree_spec.rb +74 -96
- data/spec/lib/nrser/functions/tree/transform_spec.rb +11 -11
- data/spec/lib/nrser/labs/config_spec.rb +22 -0
- data/spec/lib/nrser/labs/i8/struct_spec.rb +39 -0
- data/spec/lib/nrser/types/display_spec.rb +50 -0
- data/spec/lib/nrser/types/paths_spec.rb +16 -10
- data/spec/lib/nrser/types/selector_spec.rb +125 -0
- data/spec/spec_helper.rb +4 -5
- metadata +105 -22
- data/lib/nrser/types/any.rb +0 -41
- data/lib/nrser/types/attrs.rb +0 -213
- data/lib/nrser/types/trees.rb +0 -42
data/lib/nrser/types/symbols.rb
CHANGED
@@ -1,36 +1,86 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
# Requirements
|
5
|
+
# =======================================================================
|
6
|
+
|
7
|
+
# Project / Package
|
8
|
+
# -----------------------------------------------------------------------
|
9
|
+
|
1
10
|
require_relative './is'
|
2
11
|
require_relative './is_a'
|
3
12
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
13
|
+
|
14
|
+
# Namespace
|
15
|
+
# ========================================================================
|
16
|
+
|
17
|
+
module NRSER
|
18
|
+
module Types
|
19
|
+
|
20
|
+
|
21
|
+
# Definitions
|
22
|
+
# ========================================================================
|
23
|
+
|
24
|
+
# @!group Symbol Type Factories
|
25
|
+
# ----------------------------------------------------------------------------
|
26
|
+
|
27
|
+
#@!method self.Symbol **options
|
28
|
+
# {Symbol} instances. Load from strings as you would expect {::String#to_sym}.
|
29
|
+
#
|
30
|
+
# @param [Hash] options
|
31
|
+
# Passed to {Type#initialize}.
|
32
|
+
#
|
33
|
+
# @return [Type]
|
34
|
+
#
|
35
|
+
def_type :Symbol,
|
36
|
+
aliases: [ :sym ],
|
37
|
+
from_s: :to_sym.to_proc,
|
38
|
+
&->( **options ) do
|
39
|
+
self.IsA ::Symbol, **options
|
40
|
+
end # .Symbol
|
41
|
+
|
42
|
+
|
43
|
+
#@!method self.EmptySymbol **options
|
44
|
+
# Exactly `:''`.
|
45
|
+
#
|
46
|
+
# Pretty much just exists for use in {.NonEmptySymbol}, which pretty much
|
47
|
+
# just exists for use in {.Label}, which actually has some use ;)
|
48
|
+
#
|
49
|
+
# @param [Hash] options
|
50
|
+
# Passed to {Type#initialize}.
|
51
|
+
#
|
52
|
+
# @return [Type]
|
53
|
+
#
|
54
|
+
def_type :EmptySymbol,
|
55
|
+
aliases: [ :empty_sym ],
|
56
|
+
from_s: :to_sym.to_proc,
|
57
|
+
&->( **options ) do
|
58
|
+
self.Is :'', **options
|
59
|
+
end # .EmptySymbol
|
60
|
+
|
61
|
+
|
62
|
+
#@!method self.NonEmptySymbol **options
|
63
|
+
# A {Symbol} that is *not* `:''`.
|
64
|
+
#
|
65
|
+
# @param [Hash] options
|
66
|
+
# Passed to {Type#initialize}.
|
67
|
+
#
|
68
|
+
# @return [Type]
|
69
|
+
#
|
70
|
+
def_type :NonEmptySymbol,
|
71
|
+
aliases: [ :non_empty_sym ],
|
72
|
+
&->( **options ) do
|
73
|
+
self.Intersection \
|
74
|
+
self.Symbol,
|
75
|
+
~self.EmptySymbol,
|
76
|
+
**options
|
77
|
+
end # .NonEmptySymbol
|
78
|
+
|
79
|
+
# @!endgroup Symbol Type Factories # *****************************************
|
80
|
+
|
81
|
+
|
82
|
+
# /Namespace
|
83
|
+
# ========================================================================
|
84
|
+
|
85
|
+
end # module Types
|
86
|
+
end # module NRSER
|
@@ -0,0 +1,89 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
|
5
|
+
# Requirements
|
6
|
+
# ========================================================================
|
7
|
+
|
8
|
+
# Project / Package
|
9
|
+
# ------------------------------------------------------------------------
|
10
|
+
|
11
|
+
require_relative './type'
|
12
|
+
|
13
|
+
|
14
|
+
# Namespace
|
15
|
+
# ========================================================================
|
16
|
+
|
17
|
+
module NRSER
|
18
|
+
module Types
|
19
|
+
|
20
|
+
|
21
|
+
# Definitions
|
22
|
+
# ========================================================================
|
23
|
+
|
24
|
+
# The top type is the universal type - all values are members.
|
25
|
+
#
|
26
|
+
# @see https://en.wikipedia.org/wiki/Top_type
|
27
|
+
#
|
28
|
+
class Top < NRSER::Types::Type
|
29
|
+
NAME = '*'
|
30
|
+
|
31
|
+
def initialize
|
32
|
+
super name: NAME
|
33
|
+
end
|
34
|
+
|
35
|
+
def test? value
|
36
|
+
true
|
37
|
+
end
|
38
|
+
|
39
|
+
def explain
|
40
|
+
'Top'
|
41
|
+
end
|
42
|
+
|
43
|
+
def symbolic
|
44
|
+
'*' # '⊤'
|
45
|
+
end
|
46
|
+
|
47
|
+
def has_from_s?
|
48
|
+
true
|
49
|
+
end
|
50
|
+
|
51
|
+
def from_s string
|
52
|
+
string
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
# {AnyType} instances are all equal.
|
57
|
+
#
|
58
|
+
# @note
|
59
|
+
# `other`'s class must be {AnyType} exactly - we make no assumptions
|
60
|
+
# about anything that has subclasses {AnyType}.
|
61
|
+
#
|
62
|
+
# @param [*] other
|
63
|
+
# Object to compare to.
|
64
|
+
#
|
65
|
+
# @return [Boolean]
|
66
|
+
# `true` if `other#class` equals {AnyType}.
|
67
|
+
#
|
68
|
+
def == other
|
69
|
+
other.class == Top
|
70
|
+
end
|
71
|
+
|
72
|
+
end # class Top
|
73
|
+
|
74
|
+
# Anything at all...
|
75
|
+
#
|
76
|
+
def_type(
|
77
|
+
:Top,
|
78
|
+
aliases: [ :everything, :all, :any ],
|
79
|
+
) do
|
80
|
+
# Top type gets used as a default a lot, so cache it...
|
81
|
+
@_top_type_instance ||= Top.new
|
82
|
+
end
|
83
|
+
|
84
|
+
|
85
|
+
# /Namespace
|
86
|
+
# ========================================================================
|
87
|
+
|
88
|
+
end # module Types
|
89
|
+
end # module NRSER
|
data/lib/nrser/types/tuples.rb
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
|
1
5
|
# Requirements
|
2
6
|
# =======================================================================
|
3
7
|
|
@@ -6,112 +10,144 @@
|
|
6
10
|
require_relative './arrays'
|
7
11
|
|
8
12
|
|
13
|
+
|
14
|
+
# Namespace
|
15
|
+
# ========================================================================
|
16
|
+
|
17
|
+
module NRSER
|
18
|
+
module Types
|
19
|
+
|
20
|
+
|
9
21
|
# Definitions
|
10
|
-
#
|
22
|
+
# ========================================================================
|
11
23
|
|
12
|
-
|
24
|
+
# Tuple type - array of fixed length and types (though those could be
|
25
|
+
# {.Top}).
|
26
|
+
#
|
27
|
+
# @note
|
28
|
+
# Construct {Tuple} types using the {.Tuple} factory.
|
29
|
+
#
|
30
|
+
class Tuple < ArrayType
|
13
31
|
|
14
|
-
#
|
15
|
-
#
|
32
|
+
# Attributes
|
33
|
+
# ======================================================================
|
34
|
+
|
35
|
+
# The types of each of the tuple indexes.
|
16
36
|
#
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
# Test each item type
|
74
|
-
@types.each_with_index.all? { |type, index|
|
75
|
-
type.test value[index]
|
76
|
-
}
|
77
|
-
end # #test?
|
78
|
-
|
79
|
-
|
80
|
-
# @return [Boolean]
|
81
|
-
# `true` if this type can load values from a string, which is true if
|
82
|
-
# *all* it's types can load values from strings.
|
83
|
-
#
|
84
|
-
def has_from_s?
|
85
|
-
@from_s || @types.all?( &:has_from_s? )
|
86
|
-
end # #has_from_s?
|
87
|
-
|
37
|
+
# @return [Array<Type>]
|
38
|
+
#
|
39
|
+
attr_reader :types
|
40
|
+
|
41
|
+
|
42
|
+
# Constructor
|
43
|
+
# ======================================================================
|
44
|
+
|
45
|
+
# Instantiate a new `Tuple`.
|
46
|
+
#
|
47
|
+
# @param [Array] types
|
48
|
+
# Tuple value types by their index in the tuples.
|
49
|
+
#
|
50
|
+
# Entries are passed through {NRSER::Types.make} to create the type
|
51
|
+
# if needed.
|
52
|
+
#
|
53
|
+
# @param [Hash<Symbol, *>] options
|
54
|
+
# Type options; see {Type#initialize}.
|
55
|
+
#
|
56
|
+
def initialize *types, **options
|
57
|
+
super **options
|
58
|
+
@types = types.map( &NRSER::Types.method(:make) ).freeze
|
59
|
+
end # #initialize
|
60
|
+
|
61
|
+
|
62
|
+
def default_name
|
63
|
+
'Array<(' + types.map( &:name ).join( ', ' ) + ')>'
|
64
|
+
end
|
65
|
+
|
66
|
+
|
67
|
+
def default_symbolic
|
68
|
+
'[' + types.map( &:symbolic ).join( ', ' ) + ']'
|
69
|
+
end
|
70
|
+
|
71
|
+
|
72
|
+
# @return [String]
|
73
|
+
# See {Type#explain}
|
74
|
+
#
|
75
|
+
def explain
|
76
|
+
'Array<(' + types.map( &:explain ).join( ', ' ) + ')>'
|
77
|
+
end
|
78
|
+
|
79
|
+
|
80
|
+
# Instance Methods
|
81
|
+
# ======================================================================
|
82
|
+
|
83
|
+
# Test value for membership.
|
84
|
+
#
|
85
|
+
# @param (see Type#test?)
|
86
|
+
# @return (see Type#test?)
|
87
|
+
# @raise (see Type#test?)
|
88
|
+
#
|
89
|
+
def test? value
|
90
|
+
# Test the super class first
|
91
|
+
return false unless super( value )
|
88
92
|
|
89
|
-
#
|
90
|
-
|
91
|
-
# the type of the corresponding index.
|
92
|
-
#
|
93
|
-
# @param [Array<String>] strings
|
94
|
-
#
|
95
|
-
# @return [Array]
|
96
|
-
#
|
97
|
-
def items_from_strings strings
|
98
|
-
@types.each_with_index.map { |type, index|
|
99
|
-
type.from_s strings[index]
|
100
|
-
}
|
101
|
-
end
|
93
|
+
# If it's not the right length then it doesn't pass
|
94
|
+
return false unless value.length == types.length
|
102
95
|
|
103
|
-
|
96
|
+
# Test each item type
|
97
|
+
types.each_with_index.all? { |type, index|
|
98
|
+
type.test value[index]
|
99
|
+
}
|
100
|
+
end # #test?
|
104
101
|
|
105
|
-
|
106
|
-
#
|
102
|
+
|
103
|
+
# @return [Boolean]
|
104
|
+
# `true` if this type can load values from a string, which is true if
|
105
|
+
# *all* it's types can load values from strings.
|
106
|
+
#
|
107
|
+
def has_from_s?
|
108
|
+
@from_s || types.all?( &:has_from_s? )
|
109
|
+
end # #has_from_s?
|
110
|
+
|
111
|
+
|
112
|
+
# Load each value in an array of strings split out by
|
113
|
+
# {ArrayType#from_s} by passing each value to `#from_s` in
|
114
|
+
# the type of the corresponding index.
|
107
115
|
#
|
108
|
-
# @param
|
109
|
-
# @param **options (see TupleType#initialize)
|
116
|
+
# @param [Array<String>] strings
|
110
117
|
#
|
111
|
-
# @return [
|
118
|
+
# @return [Array]
|
112
119
|
#
|
113
|
-
|
114
|
-
|
115
|
-
|
120
|
+
def items_from_strings strings
|
121
|
+
types.each_with_index.map { |type, index|
|
122
|
+
type.from_s strings[index]
|
123
|
+
}
|
124
|
+
end
|
116
125
|
|
117
|
-
end #
|
126
|
+
end # class Tuple
|
127
|
+
|
128
|
+
|
129
|
+
#@!method self.Tuple *types, **options
|
130
|
+
# Get a {Tuple} type.
|
131
|
+
#
|
132
|
+
# @param [Array<TYPE>] types
|
133
|
+
# The types of the tuple values, in order they will appear. If entries are
|
134
|
+
# not {Type} instances, they will be {.make} into them.
|
135
|
+
#
|
136
|
+
# @param [Hash] options
|
137
|
+
# Passed to {Type#initialize}.
|
138
|
+
#
|
139
|
+
# @return [Tuple]
|
140
|
+
#
|
141
|
+
def_type :Tuple,
|
142
|
+
default_name: false,
|
143
|
+
parameterize: :types,
|
144
|
+
&->( *types, **options ) do
|
145
|
+
Tuple.new *types, **options
|
146
|
+
end # .Tuple
|
147
|
+
|
148
|
+
|
149
|
+
# /Namespace
|
150
|
+
# ========================================================================
|
151
|
+
|
152
|
+
end # module Types
|
153
|
+
end # module NRSER
|