nrser 0.2.2 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/nrser/char/alpha_numeric_sub.rb +1 -2
- data/lib/nrser/char.rb +0 -6
- data/lib/nrser/core_ext/array.rb +120 -0
- data/lib/nrser/core_ext/binding.rb +44 -0
- data/lib/nrser/{functions → core_ext}/enumerable/find_map.rb +18 -15
- data/lib/nrser/{ext → core_ext}/enumerable.rb +10 -24
- data/lib/nrser/core_ext/exception.rb +30 -0
- data/lib/nrser/core_ext/hash/extract_values_at.rb +49 -0
- data/lib/nrser/core_ext/hash/transform_values_with_keys.rb +24 -0
- data/lib/nrser/core_ext/hash.rb +50 -0
- data/lib/nrser/core_ext/module/method_objects.rb +96 -0
- data/lib/nrser/core_ext/module/names.rb +69 -0
- data/lib/nrser/core_ext/module/source_locations.rb +214 -0
- data/lib/nrser/core_ext/module.rb +2 -0
- data/lib/nrser/core_ext/object/lazy_var.rb +31 -0
- data/lib/nrser/core_ext/object.rb +46 -0
- data/lib/nrser/core_ext/open_struct.rb +6 -0
- data/lib/nrser/{ext → core_ext}/pathname.rb +8 -5
- data/lib/nrser/{ext → core_ext}/string.rb +6 -12
- data/lib/nrser/core_ext/symbol.rb +13 -0
- data/lib/nrser/core_ext/time.rb +46 -0
- data/lib/nrser/core_ext.rb +13 -0
- data/lib/nrser/errors/abstract_method_error.rb +150 -0
- data/lib/nrser/errors/argument_error.rb +42 -0
- data/lib/nrser/errors/nicer_error.rb +298 -72
- data/lib/nrser/errors/type_error.rb +46 -0
- data/lib/nrser/errors.rb +4 -53
- data/lib/nrser/ext/tree.rb +3 -0
- data/lib/nrser/functions/enumerable/associate.rb +6 -9
- data/lib/nrser/functions/enumerable/include_slice.rb +2 -3
- data/lib/nrser/functions/enumerable.rb +1 -3
- data/lib/nrser/functions/exception.rb +1 -1
- data/lib/nrser/functions/hash.rb +0 -6
- data/lib/nrser/functions/merge_by.rb +2 -2
- data/lib/nrser/functions/module/method_objects.rb +77 -0
- data/lib/nrser/functions/module.rb +1 -2
- data/lib/nrser/functions/open_struct.rb +25 -35
- data/lib/nrser/functions/proc.rb +1 -6
- data/lib/nrser/functions/string/looks_like.rb +32 -1
- data/lib/nrser/functions/string.rb +1 -40
- data/lib/nrser/functions/text/lines.rb +2 -1
- data/lib/nrser/functions.rb +0 -1
- data/lib/nrser/graph/tsorter.rb +41 -0
- data/lib/nrser/labs/core_ext/binding.rb +37 -0
- data/lib/nrser/labs/stash.rb +372 -0
- data/lib/nrser/{logging → log}/appender/sync.rb +3 -3
- data/lib/nrser/log/appender.rb +3 -0
- data/lib/nrser/{logging → log}/formatters/color.rb +47 -20
- data/lib/nrser/log/formatters/mixin.rb +270 -0
- data/lib/nrser/{logging → log}/formatters.rb +0 -0
- data/lib/nrser/log/logger.rb +229 -0
- data/lib/nrser/log/mixin.rb +56 -0
- data/lib/nrser/log.rb +723 -0
- data/lib/nrser/message.rb +24 -3
- data/lib/nrser/meta/source/location.rb +158 -0
- data/lib/nrser/meta.rb +1 -1
- data/lib/nrser/props/class_methods.rb +118 -0
- data/lib/nrser/props/immutable/hash.rb +111 -0
- data/lib/nrser/props/immutable/hash_variable.rb +82 -0
- data/lib/nrser/props/immutable/instance_variables.rb +48 -0
- data/lib/nrser/props/immutable/vector.rb +107 -0
- data/lib/nrser/props/instance_methods.rb +184 -0
- data/lib/nrser/props/metadata.rb +359 -0
- data/lib/nrser/props/mutable/instance_variables.rb +60 -0
- data/lib/nrser/props/mutable/stash.rb +199 -0
- data/lib/nrser/{meta/props → props}/prop.rb +217 -112
- data/lib/nrser/props/storage/instance_variable.rb +85 -0
- data/lib/nrser/props/storage/instance_variables.rb +67 -0
- data/lib/nrser/props/storage/key.rb +88 -0
- data/lib/nrser/props.rb +9 -0
- data/lib/nrser/refinements/sugar.rb +41 -0
- data/lib/nrser/refinements/types.rb +2 -2
- data/lib/nrser/refinements.rb +14 -16
- data/lib/nrser/rspex/example_group/describe_attribute.rb +24 -0
- data/lib/nrser/rspex/example_group/describe_called_with.rb +1 -6
- data/lib/nrser/rspex/example_group/{describe_use_case.rb → describe_case.rb} +6 -3
- data/lib/nrser/rspex/example_group/describe_class.rb +1 -0
- data/lib/nrser/rspex/example_group/describe_group.rb +29 -0
- data/lib/nrser/rspex/example_group/describe_instance_method.rb +2 -2
- data/lib/nrser/rspex/example_group/describe_message.rb +35 -0
- data/lib/nrser/rspex/example_group/describe_method.rb +23 -2
- data/lib/nrser/rspex/example_group/describe_module.rb +19 -0
- data/lib/nrser/rspex/example_group/describe_response_to.rb +32 -0
- data/lib/nrser/rspex/example_group/describe_section.rb +38 -0
- data/lib/nrser/rspex/example_group/describe_sent_to.rb +52 -0
- data/lib/nrser/rspex/example_group/describe_source_file.rb +49 -0
- data/lib/nrser/rspex/example_group/describe_spec_file.rb +41 -108
- data/lib/nrser/rspex/example_group/describe_when.rb +14 -7
- data/lib/nrser/rspex/example_group/describe_x.rb +39 -12
- data/lib/nrser/rspex/example_group/overrides.rb +66 -0
- data/lib/nrser/rspex/example_group.rb +20 -252
- data/lib/nrser/rspex/format.rb +83 -17
- data/lib/nrser/rspex.rb +4 -34
- data/lib/nrser/sugar/method_missing_forwarder.rb +50 -0
- data/lib/nrser/{env → sys/env}/path.rb +1 -2
- data/lib/nrser/{env.rb → sys/env.rb} +2 -1
- data/lib/nrser/sys.rb +5 -0
- data/lib/nrser/types/any.rb +36 -7
- data/lib/nrser/types/{array.rb → arrays.rb} +32 -81
- data/lib/nrser/types/attrs.rb +68 -15
- data/lib/nrser/types/booleans.rb +95 -34
- data/lib/nrser/types/bounded.rb +12 -10
- data/lib/nrser/types/combinators.rb +74 -37
- data/lib/nrser/types/errors/check_error.rb +86 -0
- data/lib/nrser/types/errors/from_string_error.rb +82 -0
- data/lib/nrser/types/factory.rb +91 -0
- data/lib/nrser/types/hashes.rb +171 -26
- data/lib/nrser/types/in.rb +25 -12
- data/lib/nrser/types/is.rb +50 -18
- data/lib/nrser/types/is_a.rb +52 -33
- data/lib/nrser/types/labels.rb +6 -33
- data/lib/nrser/types/maybe.rb +12 -4
- data/lib/nrser/types/nil.rb +24 -4
- data/lib/nrser/types/not.rb +6 -16
- data/lib/nrser/types/numbers.rb +94 -57
- data/lib/nrser/types/pairs.rb +57 -57
- data/lib/nrser/types/paths.rb +112 -133
- data/lib/nrser/types/responds.rb +64 -74
- data/lib/nrser/types/shape.rb +29 -24
- data/lib/nrser/types/strings.rb +25 -17
- data/lib/nrser/types/symbols.rb +19 -17
- data/lib/nrser/types/trees.rb +18 -70
- data/lib/nrser/types/tuples.rb +36 -40
- data/lib/nrser/types/type.rb +342 -91
- data/lib/nrser/types/when.rb +40 -18
- data/lib/nrser/types/where.rb +94 -9
- data/lib/nrser/types.rb +72 -63
- data/lib/nrser/version.rb +1 -1
- data/lib/nrser.rb +18 -18
- data/spec/lib/nrser/{functions/binding/template_spec.rb → core_ext/binding/erb_spec.rb} +5 -5
- data/spec/lib/nrser/{functions → core_ext}/enumerable/find_map_spec.rb +8 -6
- data/spec/lib/nrser/{refinements → core_ext}/hash_spec.rb +9 -22
- data/spec/lib/nrser/errors/abstract_method_error_spec.rb +12 -5
- data/spec/lib/nrser/functions/enumerable/{to_h_by_spec.rb → associate_spec.rb} +1 -1
- data/spec/lib/nrser/functions/merge_by_spec.rb +1 -1
- data/spec/lib/nrser/functions/tree/each_branch_spec.rb +3 -3
- data/spec/lib/nrser/functions/tree/transform_spec.rb +14 -15
- data/spec/lib/nrser/gem_ext/hamster/json_spec.rb +4 -0
- data/spec/lib/nrser/meta/source/location_spec.rb +86 -0
- data/spec/lib/nrser/props/immutable/hash_spec.rb +297 -0
- data/spec/lib/nrser/props/immutable/vector_spec.rb +296 -0
- data/spec/lib/nrser/{meta/props_spec.rb → props/original_props_spec.rb} +11 -16
- data/spec/lib/nrser/{meta/props → props}/to_and_from_data_spec.rb +10 -8
- data/spec/lib/nrser/refinements/array_spec.rb +2 -15
- data/spec/lib/nrser/refinements/erb_spec.rb +5 -7
- data/spec/lib/nrser/refinements/set_spec.rb +2 -15
- data/spec/lib/nrser/{env → sys/env}/path/insert_spec.rb +4 -2
- data/spec/lib/nrser/{env → sys/env}/path_spec.rb +4 -2
- data/spec/lib/nrser/types/array_spec.rb +8 -8
- data/spec/lib/nrser/types/paths_spec.rb +15 -18
- data/spec/spec_helper.rb +4 -0
- metadata +109 -69
- data/lib/nrser/ext/binding.rb +0 -36
- data/lib/nrser/ext/module.rb +0 -62
- data/lib/nrser/ext.rb +0 -8
- data/lib/nrser/functions/binding.rb +0 -76
- data/lib/nrser/functions/enumerable/map_keys.rb +0 -0
- data/lib/nrser/functions/enumerable/map_values.rb +0 -94
- data/lib/nrser/functions/hash/deep_merge.rb +0 -57
- data/lib/nrser/functions/hash/except_keys.rb +0 -44
- data/lib/nrser/functions/hash/slice_keys.rb +0 -43
- data/lib/nrser/functions/hash/stringify_keys.rb +0 -55
- data/lib/nrser/functions/hash/symbolize_keys.rb +0 -57
- data/lib/nrser/functions/hash/transform_keys.rb +0 -140
- data/lib/nrser/functions/module/methods.rb +0 -206
- data/lib/nrser/functions/module/source_locations.rb +0 -213
- data/lib/nrser/logging/appender.rb +0 -3
- data/lib/nrser/logging.rb +0 -353
- data/lib/nrser/meta/props/base.rb +0 -31
- data/lib/nrser/meta/props.rb +0 -357
- data/lib/nrser/refinements/array.rb +0 -133
- data/lib/nrser/refinements/binding.rb +0 -6
- data/lib/nrser/refinements/enumerator.rb +0 -5
- data/lib/nrser/refinements/exception.rb +0 -35
- data/lib/nrser/refinements/hash.rb +0 -150
- data/lib/nrser/refinements/module.rb +0 -5
- data/lib/nrser/refinements/object.rb +0 -42
- data/lib/nrser/refinements/open_struct.rb +0 -28
- data/lib/nrser/refinements/pathname.rb +0 -5
- data/lib/nrser/refinements/set.rb +0 -5
- data/lib/nrser/refinements/string.rb +0 -5
- data/lib/nrser/refinements/symbol.rb +0 -20
- data/lib/nrser/rspex/described.rb +0 -99
- data/spec/design/mapping_spec.rb +0 -42
- data/spec/lib/nrser/functions/hash_spec.rb +0 -41
- data/spec/lib/nrser/functions/string/truncate_spec.rb +0 -11
- data/spec/lib/nrser/refinements/truncate_spec.rb +0 -10
data/lib/nrser/types/paths.rb
CHANGED
@@ -1,158 +1,137 @@
|
|
1
1
|
# Requirements
|
2
2
|
# =======================================================================
|
3
3
|
|
4
|
-
#
|
5
|
-
|
4
|
+
# Stdlib
|
5
|
+
# -----------------------------------------------------------------------
|
6
6
|
|
7
|
-
#
|
7
|
+
# Deps
|
8
|
+
# -----------------------------------------------------------------------
|
9
|
+
|
10
|
+
# Project / Package
|
11
|
+
# -----------------------------------------------------------------------
|
12
|
+
|
13
|
+
require 'nrser/core_ext/pathname'
|
8
14
|
|
9
|
-
# package
|
10
15
|
require_relative './is_a'
|
11
16
|
require_relative './where'
|
12
17
|
require_relative './combinators'
|
13
18
|
|
14
19
|
|
15
|
-
# Refinements
|
16
|
-
# =======================================================================
|
17
|
-
|
18
|
-
require 'nrser/refinements'
|
19
|
-
using NRSER
|
20
|
-
|
21
|
-
|
22
|
-
# Declarations
|
23
|
-
# =======================================================================
|
24
|
-
|
25
|
-
module NRSER; end
|
26
|
-
|
27
|
-
|
28
20
|
# Definitions
|
29
21
|
# =======================================================================
|
30
22
|
|
31
23
|
module NRSER::Types
|
32
24
|
|
33
|
-
#
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
25
|
+
# @!group Type Factory Functions
|
26
|
+
|
27
|
+
def_factory :pathname do |to_data: :to_s, **options|
|
28
|
+
is_a \
|
29
|
+
Pathname,
|
30
|
+
from_s: ->( string ) { Pathname.new string },
|
31
|
+
to_data: to_data,
|
32
|
+
**options
|
33
|
+
end
|
39
34
|
|
40
35
|
|
41
36
|
# A type satisfied by a {Pathname} instance that's not empty (meaning it's
|
42
37
|
# string representation is not empty).
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
38
|
+
def_factory :non_empty_pathname do |name: 'NonEmptyPathname', **options|
|
39
|
+
all_of \
|
40
|
+
pathname,
|
41
|
+
attrs( to_s: non_empty_str ),
|
42
|
+
name: name,
|
43
|
+
**options
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
# A path is a non-empty {String} or {Pathname}.
|
48
|
+
#
|
49
|
+
# @param **options see NRSER::Types::Type#initialize
|
50
|
+
#
|
51
|
+
# @return [NRSER::Types::Type]
|
52
|
+
#
|
53
|
+
def_factory :path do |name: 'Path', **options|
|
54
|
+
one_of \
|
55
|
+
non_empty_str,
|
56
|
+
non_empty_pathname,
|
57
|
+
name: name,
|
58
|
+
**options
|
59
|
+
end # #path
|
60
|
+
|
47
61
|
|
48
|
-
|
62
|
+
def_factory :posix_path_segment,
|
63
|
+
aliases: [:path_segment, :path_seg] \
|
64
|
+
do |name: 'POSIXPathSegment', **options|
|
65
|
+
all_of \
|
66
|
+
non_empty_str,
|
67
|
+
respond( to: [:include?, '/'], with: false ),
|
68
|
+
name: name,
|
69
|
+
**options
|
70
|
+
end
|
49
71
|
|
50
72
|
|
51
|
-
#
|
52
|
-
#
|
73
|
+
# An absolute {#path}.
|
74
|
+
#
|
75
|
+
# @param **options see NRSER::Types::Type#initialize
|
76
|
+
#
|
77
|
+
def_factory :abs_path do |name: 'AbsPath', **options|
|
78
|
+
intersection \
|
79
|
+
path,
|
80
|
+
# Weirdly, there is no {File.absolute?}..
|
81
|
+
attrs( to_pn: attrs( absolute?: true ) ),
|
82
|
+
name: name,
|
83
|
+
from_s: ->( s ) { File.expand_path s },
|
84
|
+
**options
|
85
|
+
end
|
86
|
+
|
87
|
+
|
88
|
+
# A {NRSER::Types.path} that is a directory.
|
89
|
+
#
|
90
|
+
# @param [Hash] **options
|
91
|
+
# Construction options passed to {NRSER::Types::Type#initialize}.
|
92
|
+
#
|
93
|
+
# @return [NRSER::Types::Type]
|
94
|
+
#
|
95
|
+
def_factory :dir_path do |name: 'DirPath', **options|
|
96
|
+
intersection \
|
97
|
+
path,
|
98
|
+
# TODO How to change this from {.where}?
|
99
|
+
where { |path| File.directory? path },
|
100
|
+
name: name,
|
101
|
+
**options
|
102
|
+
end # #dir_path
|
103
|
+
|
104
|
+
|
105
|
+
# Absolute {.path} to a directory (both an {.abs_path} and an {.dir_path}).
|
106
|
+
#
|
107
|
+
# @param name: (see NRSER::Types::Type#initialize)
|
108
|
+
#
|
109
|
+
# @param **options
|
110
|
+
# See {NRSER::Types::Type#initialize}
|
111
|
+
#
|
112
|
+
def_factory :abs_dir_path do |name: 'AbsDirPath', **options|
|
113
|
+
intersection \
|
114
|
+
abs_path,
|
115
|
+
dir_path,
|
116
|
+
name: name,
|
117
|
+
**options
|
118
|
+
end # .abs_dir_path
|
119
|
+
|
120
|
+
|
121
|
+
# A {.path} that is a file (using {File.file?} to test).
|
122
|
+
#
|
123
|
+
# @param name: (see NRSER::Types::Type#initialize)
|
124
|
+
#
|
125
|
+
# @param **options
|
126
|
+
# See {NRSER::Types::Type#initialize}
|
53
127
|
#
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
Pathname,
|
63
|
-
name: 'PathnameType',
|
64
|
-
from_s: ->(string) { Pathname.new string },
|
65
|
-
to_data: to_data,
|
66
|
-
**options
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
# A path is a non-empty {String} or {Pathname}.
|
71
|
-
#
|
72
|
-
# @param **options see NRSER::Types::Type#initialize
|
73
|
-
#
|
74
|
-
# @return [NRSER::Types::Type]
|
75
|
-
#
|
76
|
-
def path **options
|
77
|
-
if options.empty?
|
78
|
-
PATH
|
79
|
-
else
|
80
|
-
union non_empty_str, NON_EMPTY_PATHNAME, **options
|
81
|
-
end
|
82
|
-
end # #path
|
83
|
-
|
84
|
-
|
85
|
-
def path_segment **options
|
86
|
-
if options.empty?
|
87
|
-
POSIX_PATH_SEGMENT
|
88
|
-
else
|
89
|
-
intersection non_empty_str,
|
90
|
-
where { |string| ! string.include?( '/' ) },
|
91
|
-
name: 'POSIXPathSegment'
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
alias_method :path_seg, :path_segment
|
96
|
-
|
97
|
-
|
98
|
-
# An absolute {#path}.
|
99
|
-
#
|
100
|
-
# @param **options see NRSER::Types::Type#initialize
|
101
|
-
#
|
102
|
-
def abs_path name: 'AbsPath', **options
|
103
|
-
intersection \
|
104
|
-
path,
|
105
|
-
where { |path| path.to_pn.absolute? },
|
106
|
-
name: name,
|
107
|
-
from_s: ->( s ) { File.expand_path s },
|
108
|
-
**options
|
109
|
-
end
|
110
|
-
|
111
|
-
|
112
|
-
# A {NRSER::Types.path} that is a directory.
|
113
|
-
#
|
114
|
-
# @param [Hash] **options
|
115
|
-
# Construction options passed to {NRSER::Types::Type#initialize}.
|
116
|
-
#
|
117
|
-
# @return [NRSER::Types::Type]
|
118
|
-
#
|
119
|
-
def dir_path name: 'DirPath', **options
|
120
|
-
intersection \
|
121
|
-
path,
|
122
|
-
where { |path| File.directory? path },
|
123
|
-
name: name,
|
124
|
-
**options
|
125
|
-
end # #dir_path
|
126
|
-
|
127
|
-
|
128
|
-
# Absolute {.path} to a directory (both an {.abs_path} and an {.dir_path}).
|
129
|
-
#
|
130
|
-
# @param [type] name:
|
131
|
-
# @todo Add name param description.
|
132
|
-
#
|
133
|
-
# @return [return_type]
|
134
|
-
# @todo Document return value.
|
135
|
-
#
|
136
|
-
def abs_dir_path name: 'AbsDirPath', **options
|
137
|
-
intersection \
|
138
|
-
abs_path,
|
139
|
-
dir_path,
|
140
|
-
name: name,
|
141
|
-
**options
|
142
|
-
end # #abs_dir_path
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
def file_path name: 'FilePath', **options
|
147
|
-
intersection \
|
148
|
-
path,
|
149
|
-
where { |path| File.file? path },
|
150
|
-
name: name,
|
151
|
-
**options
|
152
|
-
end
|
153
|
-
|
154
|
-
end # class << self (Eigenclass)
|
155
|
-
|
156
|
-
POSIX_PATH_SEGMENT = path_segment name: 'POSIXPathSegment'
|
128
|
+
def_factory :file_path do |name: 'FilePath', **options|
|
129
|
+
intersection \
|
130
|
+
path,
|
131
|
+
# TODO How to change this from {.where}?
|
132
|
+
where { |path| File.file? path },
|
133
|
+
name: name,
|
134
|
+
**options
|
135
|
+
end
|
157
136
|
|
158
137
|
end # module NRSER::Types
|
data/lib/nrser/types/responds.rb
CHANGED
@@ -1,110 +1,100 @@
|
|
1
|
+
require 'nrser/message'
|
1
2
|
require_relative './booleans'
|
2
3
|
|
3
4
|
module NRSER::Types
|
4
5
|
|
5
|
-
# Type
|
6
|
-
#
|
7
|
-
|
6
|
+
# Type holding an {NRSER::Message} and response type. Satisfied by objects
|
7
|
+
# that respond with a value that satisfies the respond type when sent the
|
8
|
+
# message.
|
9
|
+
#
|
10
|
+
class Respond < NRSER::Types::Type
|
8
11
|
|
9
|
-
#
|
12
|
+
# Attributes
|
10
13
|
# ======================================================================
|
11
14
|
|
15
|
+
# Message that will be sent to tested values.
|
16
|
+
#
|
17
|
+
# @return [NRSER::Message]
|
18
|
+
#
|
19
|
+
attr_reader :message
|
12
20
|
|
13
|
-
|
14
|
-
#
|
21
|
+
|
22
|
+
# Type tested values must respond with when sent the message.
|
23
|
+
#
|
24
|
+
# @return [NRSER::Types::Type]
|
25
|
+
#
|
26
|
+
attr_reader :response
|
15
27
|
|
16
28
|
|
17
|
-
|
18
|
-
#
|
29
|
+
|
30
|
+
# TODO document `publicly` attribute.
|
31
|
+
#
|
32
|
+
# @return [Boolean]
|
33
|
+
#
|
34
|
+
attr_reader :publicly
|
35
|
+
|
19
36
|
|
20
37
|
|
21
38
|
# Constructor
|
22
39
|
# ======================================================================
|
23
40
|
|
24
|
-
# Instantiate a new `
|
25
|
-
def initialize
|
26
|
-
|
41
|
+
# Instantiate a new `Respond`.
|
42
|
+
def initialize to:,
|
43
|
+
with:,
|
44
|
+
publicly: true,
|
27
45
|
**options
|
28
|
-
@
|
29
|
-
|
30
|
-
|
46
|
+
@message = NRSER::Message.from *to
|
47
|
+
@publicly = publicly
|
48
|
+
@response = NRSER::Types.make with
|
49
|
+
|
50
|
+
super **options
|
31
51
|
end # #initialize
|
32
52
|
|
33
53
|
|
34
54
|
# Instance Methods
|
35
55
|
# ======================================================================
|
36
56
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
57
|
+
# See {NRSER::Types::Type#explain}.
|
58
|
+
#
|
59
|
+
# @param (see NRSER::Types::Type#explain)
|
60
|
+
# @return (see NRSER::Types::Type#explain)
|
61
|
+
# @raise (see NRSER::Types::Type#explain)
|
62
|
+
#
|
63
|
+
def explain
|
64
|
+
args_str = message.args.map( &:inspect ).join ', '
|
65
|
+
|
66
|
+
if message.block
|
67
|
+
args_str += ', ' + message.block.to_s
|
68
|
+
end
|
43
69
|
|
44
|
-
"
|
70
|
+
"##{ message.symbol }(#{ args_str })#{ RESPONDS_WITH }#{ response.explain }"
|
45
71
|
end
|
46
72
|
|
47
73
|
|
48
|
-
#
|
74
|
+
# Test value for membership.
|
49
75
|
#
|
50
|
-
# @param
|
51
|
-
#
|
76
|
+
# @param (see NRSER::Types::Type#test?)
|
77
|
+
# @return (see NRSER::Types::Type#test?)
|
78
|
+
# @raise (see NRSER::Types::Type#test?)
|
52
79
|
#
|
53
|
-
|
54
|
-
|
55
|
-
#
|
56
|
-
def test value
|
57
|
-
@map.all? { |args, type|
|
58
|
-
response = if @public
|
59
|
-
value.public_send *args
|
60
|
-
else
|
61
|
-
value.send *args
|
62
|
-
end
|
63
|
-
|
64
|
-
type.test response
|
65
|
-
}
|
80
|
+
def test? value
|
81
|
+
response.test message.send_to( value, publicly: publicly )
|
66
82
|
end # #test
|
67
83
|
|
68
|
-
|
69
84
|
end # class Responds
|
70
85
|
|
86
|
+
|
87
|
+
def_factory(
|
88
|
+
:respond,
|
89
|
+
) do |*args|
|
90
|
+
Respond.new *args
|
91
|
+
end # #responds
|
71
92
|
|
72
|
-
# Eigenclass (Singleton Class)
|
73
|
-
# ========================================================================
|
74
|
-
#
|
75
|
-
class << self
|
76
|
-
|
77
|
-
|
78
|
-
# @todo Document responds method.
|
79
|
-
#
|
80
|
-
# @param [type] arg_name
|
81
|
-
# @todo Add name param description.
|
82
|
-
#
|
83
|
-
# @return [return_type]
|
84
|
-
# @todo Document return value.
|
85
|
-
#
|
86
|
-
def responds *args
|
87
|
-
Responds.new *args
|
88
|
-
end # #responds
|
89
|
-
|
90
|
-
|
91
|
-
# @todo Document respond_to Responds.
|
92
|
-
#
|
93
|
-
# @param [type] arg_name
|
94
|
-
# @todo Add name param description.
|
95
|
-
#
|
96
|
-
# @return [return_type]
|
97
|
-
# @todo Document return value.
|
98
|
-
#
|
99
|
-
def respond_to name, **options
|
100
|
-
responds(
|
101
|
-
{[:respond_to?, name] => NRSER::Types::TRUE},
|
102
|
-
**options
|
103
|
-
)
|
104
|
-
end # #respond_to
|
105
|
-
|
106
|
-
|
107
|
-
end # class << self (Eigenclass)
|
108
93
|
|
94
|
+
def_factory(
|
95
|
+
:respond_to
|
96
|
+
) do |method_name, **options|
|
97
|
+
respond to: [:respond_to?, method_name], with: NRSER::Types.true
|
98
|
+
end # #respond_to
|
109
99
|
|
110
100
|
end # module NRSER::Types
|
data/lib/nrser/types/shape.rb
CHANGED
@@ -1,24 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# Requirements
|
4
|
-
# =======================================================================
|
5
|
-
|
6
|
-
# Stdlib
|
7
|
-
# -----------------------------------------------------------------------
|
8
|
-
|
9
|
-
# Deps
|
10
|
-
# -----------------------------------------------------------------------
|
11
|
-
|
12
|
-
# Project / Package
|
13
|
-
# -----------------------------------------------------------------------
|
14
|
-
|
15
|
-
|
16
|
-
# Refinements
|
17
|
-
# =======================================================================
|
18
|
-
|
19
|
-
|
20
|
-
# Declarations
|
21
|
-
# =======================================================================
|
2
|
+
# encoding: UTF-8
|
22
3
|
|
23
4
|
|
24
5
|
# Definitions
|
@@ -28,6 +9,17 @@ module NRSER::Types
|
|
28
9
|
|
29
10
|
class Shape < Type
|
30
11
|
|
12
|
+
|
13
|
+
# Attributes
|
14
|
+
# ========================================================================
|
15
|
+
|
16
|
+
# TODO document `pairs` attribute.
|
17
|
+
#
|
18
|
+
# @return [Hash]
|
19
|
+
#
|
20
|
+
attr_reader :pairs
|
21
|
+
|
22
|
+
|
31
23
|
# Constructor
|
32
24
|
# ======================================================================
|
33
25
|
|
@@ -36,14 +28,14 @@ module NRSER::Types
|
|
36
28
|
super **options
|
37
29
|
@pairs = pairs.map { |k, v|
|
38
30
|
[k, NRSER::Types.make( v )]
|
39
|
-
}.to_h
|
31
|
+
}.to_h.freeze
|
40
32
|
end # #initialize
|
41
33
|
|
42
34
|
|
43
35
|
# Instance Methods
|
44
36
|
# ======================================================================
|
45
37
|
|
46
|
-
def test value
|
38
|
+
def test? value
|
47
39
|
begin
|
48
40
|
@pairs.all? { |k, v|
|
49
41
|
v === value[k]
|
@@ -53,7 +45,7 @@ module NRSER::Types
|
|
53
45
|
end
|
54
46
|
end
|
55
47
|
|
56
|
-
def
|
48
|
+
def explain
|
57
49
|
inner = @pairs.map { |k, v|
|
58
50
|
"[#{ k.inspect }]→#{ v.name }"
|
59
51
|
}.join( ", " )
|
@@ -65,10 +57,23 @@ module NRSER::Types
|
|
65
57
|
end
|
66
58
|
end
|
67
59
|
|
60
|
+
def has_from_data?
|
61
|
+
pairs.values.all? { |type| type.has_from_data? }
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
def custom_from_data data
|
66
|
+
pairs.map { |key, type|
|
67
|
+
[ key, type.from_data( data[key] ) ]
|
68
|
+
}.to_h
|
69
|
+
end
|
70
|
+
|
68
71
|
end # class Shape
|
69
72
|
|
70
73
|
|
71
|
-
|
74
|
+
def_factory(
|
75
|
+
:shape,
|
76
|
+
) do |pairs, **options|
|
72
77
|
Shape.new pairs, **options
|
73
78
|
end
|
74
79
|
|
data/lib/nrser/types/strings.rb
CHANGED
@@ -1,18 +1,19 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
require 'nrser/types/not'
|
1
|
+
require_relative './is'
|
2
|
+
require_relative './is_a'
|
3
|
+
require_relative './attrs'
|
4
|
+
require_relative './not'
|
6
5
|
|
7
|
-
using NRSER
|
8
6
|
|
9
7
|
module NRSER::Types
|
10
8
|
|
11
9
|
# @!group Type Factory Functions
|
12
10
|
|
13
|
-
|
11
|
+
def_factory(
|
12
|
+
:String,
|
13
|
+
aliases: [ :str, :string ],
|
14
|
+
) do |length: nil, encoding: nil, **options|
|
14
15
|
if [length, encoding].all?( &:nil? )
|
15
|
-
IsA.new String, from_s: ->(s) { s }, **options
|
16
|
+
IsA.new ::String, from_s: ->(s) { s }, **options
|
16
17
|
|
17
18
|
else
|
18
19
|
types = [str]
|
@@ -21,27 +22,34 @@ module NRSER::Types
|
|
21
22
|
|
22
23
|
intersection *types, **options
|
23
24
|
end
|
24
|
-
end #
|
25
|
-
|
26
|
-
singleton_class.send :alias_method, :string, :str
|
25
|
+
end # String
|
27
26
|
|
28
27
|
|
29
28
|
# Get a {Type} only satisfied by empty strings.
|
30
29
|
#
|
31
30
|
# @param [String] name: (default 'EmptyString')
|
32
31
|
#
|
33
|
-
def_factory
|
32
|
+
def_factory(
|
33
|
+
:EmptyString,
|
34
|
+
aliases: [ :empty_str, :empty_string ],
|
35
|
+
) do |name: 'EmptyString', **options|
|
34
36
|
str length: 0, name: name, **options
|
35
37
|
end
|
36
38
|
|
37
39
|
|
38
|
-
def_factory
|
39
|
-
|
40
|
+
def_factory(
|
41
|
+
:NonEmptyString,
|
42
|
+
aliases: [ :non_empty_str, :non_empty_string ],
|
43
|
+
) do |name: 'NonEmptyString', **options|
|
44
|
+
str length: {min: 1}, name: name, **options
|
40
45
|
end
|
41
46
|
|
42
47
|
|
43
|
-
def_factory
|
44
|
-
|
48
|
+
def_factory(
|
49
|
+
:Character,
|
50
|
+
aliases: [ :char, :character ],
|
51
|
+
) do |name: 'Character', **options|
|
52
|
+
str length: 1, name: name, **options
|
45
53
|
end
|
46
54
|
|
47
55
|
|
@@ -49,7 +57,7 @@ module NRSER::Types
|
|
49
57
|
#
|
50
58
|
# @param [String] name: (default 'UTF8String')
|
51
59
|
#
|
52
|
-
|
60
|
+
def_factory :uft_8, aliases: [:utf8] do |name: 'UTF8String', **options|
|
53
61
|
str encoding: Encoding::UTF_8, name: name, **options
|
54
62
|
end
|
55
63
|
|
data/lib/nrser/types/symbols.rb
CHANGED
@@ -1,33 +1,35 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require 'nrser/types/is_a'
|
1
|
+
require_relative './is'
|
2
|
+
require_relative './is_a'
|
4
3
|
|
5
|
-
require 'nrser/refinements'
|
6
|
-
using NRSER
|
7
|
-
|
8
4
|
module NRSER::Types
|
9
5
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
6
|
+
def_factory(
|
7
|
+
:Symbol,
|
8
|
+
aliases: [ :sym, :symbol ],
|
9
|
+
) do |from_s: :to_sym.to_proc, **options|
|
10
|
+
is_a \
|
11
|
+
::Symbol,
|
12
|
+
from_s: from_s,
|
14
13
|
**options
|
15
|
-
)
|
16
14
|
end # sym
|
17
15
|
|
18
|
-
singleton_class.send :alias_method, :symbol, :sym
|
19
|
-
|
20
16
|
|
21
|
-
|
22
|
-
|
17
|
+
def_factory(
|
18
|
+
:EmptySymbol,
|
19
|
+
aliases: [ :empty_sym, :empty_symbol ],
|
20
|
+
) do |name: 'EmptySymbol', **options|
|
21
|
+
is :'', name: name, **options
|
23
22
|
end
|
24
23
|
|
25
24
|
|
26
|
-
|
25
|
+
def_factory(
|
26
|
+
:NonEmptySymbol,
|
27
|
+
aliases: [ :non_empty_sym, :non_empty_symbol ],
|
28
|
+
) do |name: 'NonEmptySymbol', **options|
|
27
29
|
intersection \
|
28
30
|
sym,
|
29
31
|
self.not( empty_sym ),
|
30
|
-
name:
|
32
|
+
name: name,
|
31
33
|
**options
|
32
34
|
end
|
33
35
|
|