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/is.rb
CHANGED
@@ -1,77 +1,84 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
# frozen_string_literal: true
|
1
3
|
|
2
4
|
# Requirements
|
3
5
|
# ========================================================================
|
4
6
|
|
5
|
-
#
|
6
|
-
# ------------------------------------------------------------------------
|
7
|
-
|
8
|
-
# Deps
|
7
|
+
# Project / Package
|
9
8
|
# ------------------------------------------------------------------------
|
10
9
|
|
11
|
-
|
12
|
-
require 'active_support/core_ext/module/anonymous'
|
10
|
+
require_relative './type'
|
13
11
|
|
14
12
|
|
15
|
-
#
|
16
|
-
#
|
13
|
+
# Namespace
|
14
|
+
# ========================================================================
|
17
15
|
|
18
|
-
|
16
|
+
module NRSER
|
17
|
+
module Types
|
19
18
|
|
20
19
|
|
21
|
-
|
20
|
+
# Type satisfied only by it's exact {#value} object (identity comparison
|
21
|
+
# via `#equal?`).
|
22
|
+
#
|
23
|
+
class Is < Type
|
22
24
|
|
23
|
-
#
|
24
|
-
#
|
25
|
+
# The exact value for this type.
|
26
|
+
#
|
27
|
+
# @return [Object]
|
25
28
|
#
|
26
|
-
|
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
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
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
|
-
|
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
|
data/lib/nrser/types/is_a.rb
CHANGED
@@ -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
|
-
|
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
|
-
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
|
-
|
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
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
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
|
-
#
|
89
|
-
|
90
|
-
|
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
|
-
|
95
|
-
|
93
|
+
def == other
|
94
|
+
equal?( other ) ||
|
95
|
+
( self.class == other.class &&
|
96
|
+
self.mod == other.mod )
|
96
97
|
end
|
97
98
|
|
98
|
-
end #
|
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
|
data/lib/nrser/types/labels.rb
CHANGED
@@ -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
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
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
|
+
|