nrser 0.2.2 → 0.3.0
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 +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/is_a.rb
CHANGED
@@ -3,73 +3,92 @@ require 'nrser/types/type'
|
|
3
3
|
using NRSER
|
4
4
|
|
5
5
|
module NRSER::Types
|
6
|
+
# Type satisfied by class membership (or mixin presence for modules).
|
7
|
+
#
|
8
|
+
# Tests via the subject value's `#is_a?` method.
|
9
|
+
#
|
6
10
|
class IsA < NRSER::Types::Type
|
7
|
-
attr_reader :
|
8
|
-
|
9
|
-
def initialize
|
10
|
-
unless
|
11
|
-
raise ArgumentError
|
12
|
-
`
|
13
|
-
|
14
|
-
<%= klass.pretty_inspect %>
|
15
|
-
|
16
|
-
ERB
|
11
|
+
attr_reader :mod
|
12
|
+
|
13
|
+
def initialize mod, init_from_data: false, **options
|
14
|
+
unless mod.is_a?( Module )
|
15
|
+
raise ArgumentError,
|
16
|
+
"`mod` argument must be a Module (inc. Class), " \
|
17
|
+
"received #{ mod.inspect }"
|
17
18
|
end
|
18
19
|
|
19
20
|
super **options
|
20
|
-
|
21
|
+
|
22
|
+
@init_from_data = !!init_from_data
|
23
|
+
|
24
|
+
@mod = mod
|
21
25
|
end
|
22
26
|
|
23
27
|
|
24
|
-
def
|
25
|
-
|
28
|
+
def explain
|
29
|
+
mod.safe_name
|
26
30
|
end
|
27
31
|
|
28
32
|
|
29
|
-
def test value
|
30
|
-
value.is_a?
|
33
|
+
def test? value
|
34
|
+
value.is_a? mod
|
31
35
|
end
|
32
36
|
|
33
37
|
|
34
|
-
|
38
|
+
|
39
|
+
# @todo Document init_from_data? method.
|
40
|
+
#
|
41
|
+
# @param [type] arg_name
|
42
|
+
# @todo Add name param description.
|
35
43
|
#
|
36
|
-
#
|
44
|
+
# @return [return_type]
|
45
|
+
# @todo Document return value.
|
37
46
|
#
|
38
|
-
|
39
|
-
|
47
|
+
def init_from_data?
|
48
|
+
@init_from_data
|
49
|
+
end # #init_from_data?
|
50
|
+
|
51
|
+
|
52
|
+
|
53
|
+
# Forwards to `mod.from_data`.
|
40
54
|
#
|
41
|
-
# @
|
42
|
-
#
|
55
|
+
# @param data (see NRSER::Types::Type#from_data)
|
56
|
+
# @return (see NRSER::Types::Type#from_data)
|
57
|
+
# @raise (see NRSER::Types::Type#from_data)
|
43
58
|
#
|
44
|
-
def
|
45
|
-
if
|
46
|
-
|
47
|
-
check @klass.from_data( data )
|
48
|
-
else
|
49
|
-
super data
|
50
|
-
end
|
59
|
+
def custom_from_data data
|
60
|
+
if init_from_data?
|
61
|
+
mod.new data
|
51
62
|
else
|
52
|
-
|
63
|
+
mod.from_data data
|
53
64
|
end
|
54
65
|
end
|
55
66
|
|
56
67
|
|
68
|
+
# Overrides {NRSER::Types::Type#has_from_data?} to respond `true` when
|
69
|
+
# there is a instance-specific `@from_data` or the {#mod} responds to
|
70
|
+
# `.from_data`.
|
71
|
+
#
|
72
|
+
# @return [Boolean]
|
73
|
+
#
|
57
74
|
def has_from_data?
|
58
|
-
@from_data ||
|
75
|
+
@from_data ||
|
76
|
+
init_from_data? ||
|
77
|
+
mod.respond_to?( :from_data )
|
59
78
|
end
|
60
79
|
|
61
80
|
|
62
81
|
def == other
|
63
82
|
equal?( other ) ||
|
64
83
|
( self.class == other.class &&
|
65
|
-
self.
|
84
|
+
self.mod == other.mod )
|
66
85
|
end
|
67
86
|
|
68
87
|
end # IsA
|
69
88
|
|
70
89
|
|
71
90
|
# class membership
|
72
|
-
|
73
|
-
IsA.new
|
91
|
+
def_factory :is_a do |mod, **options|
|
92
|
+
IsA.new mod, **options
|
74
93
|
end
|
75
94
|
end # NRSER::Types
|
data/lib/nrser/types/labels.rb
CHANGED
@@ -1,28 +1,5 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
# Stdlib
|
5
|
-
# -----------------------------------------------------------------------
|
6
|
-
|
7
|
-
# Deps
|
8
|
-
# -----------------------------------------------------------------------
|
9
|
-
|
10
|
-
# Project / Package
|
11
|
-
# -----------------------------------------------------------------------
|
12
|
-
|
13
|
-
|
14
|
-
# Refinements
|
15
|
-
# =======================================================================
|
16
|
-
|
17
|
-
require 'nrser/refinements'
|
18
|
-
using NRSER
|
19
|
-
|
20
|
-
|
21
|
-
# Declarations
|
22
|
-
# =======================================================================
|
23
|
-
|
24
|
-
module NRSER; end
|
25
|
-
|
1
|
+
require_relative './combinators'
|
2
|
+
require_relative './strings'
|
26
3
|
|
27
4
|
# Definitions
|
28
5
|
# =======================================================================
|
@@ -36,14 +13,10 @@ module NRSER::Types
|
|
36
13
|
#
|
37
14
|
# @return [NRSER::Types::Type]
|
38
15
|
#
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
union non_empty_str, non_empty_sym, **options
|
44
|
-
end
|
16
|
+
def_factory(
|
17
|
+
:label,
|
18
|
+
) do |name: 'Label', **options|
|
19
|
+
union non_empty_str, non_empty_sym, name: name, **options
|
45
20
|
end # .label
|
46
21
|
|
47
|
-
LABEL = label( name: 'LabelType' ).freeze
|
48
|
-
|
49
22
|
end # module NRSER::Types
|
data/lib/nrser/types/maybe.rb
CHANGED
@@ -1,10 +1,18 @@
|
|
1
|
-
|
1
|
+
require_relative './combinators'
|
2
|
+
require_relative './nil'
|
2
3
|
|
3
4
|
module NRSER::Types
|
4
5
|
|
5
|
-
# nil or the
|
6
|
-
|
7
|
-
|
6
|
+
# Type satisfied by `nil` or the parametrized type.
|
7
|
+
#
|
8
|
+
def_factory(
|
9
|
+
:maybe,
|
10
|
+
) do |type, **options|
|
11
|
+
union \
|
12
|
+
self.nil,
|
13
|
+
type,
|
14
|
+
name: (options[:name] || "#{ type.name }?"),
|
15
|
+
**options
|
8
16
|
end
|
9
17
|
|
10
18
|
end # NRSER::Types
|
data/lib/nrser/types/nil.rb
CHANGED
@@ -1,8 +1,28 @@
|
|
1
|
-
|
1
|
+
require_relative './is'
|
2
2
|
|
3
3
|
module NRSER::Types
|
4
|
-
#
|
5
|
-
|
6
|
-
|
4
|
+
# Type for `nil`, itself and only.
|
5
|
+
#
|
6
|
+
# @todo
|
7
|
+
# Should we have a `#from_s` that converts the empty string to `nil`?
|
8
|
+
#
|
9
|
+
# Kind-of seems like we would want that to be a different types so that
|
10
|
+
# you can have a Nil type that is distinct from the empty string in
|
11
|
+
# parsing, but also have a type that accepts the empty string and coverts
|
12
|
+
# it to `nil`?
|
13
|
+
#
|
14
|
+
# Something like:
|
15
|
+
#
|
16
|
+
# type = t.empty | t.non_empty_str
|
17
|
+
# type.from_s ''
|
18
|
+
# # => nil
|
19
|
+
# type.from_s 'blah'
|
20
|
+
# # => 'blah'
|
21
|
+
#
|
22
|
+
def_factory(
|
23
|
+
:nil,
|
24
|
+
aliases: [ :null ],
|
25
|
+
) do |name: 'Nil', **options|
|
26
|
+
is nil, name: name, **options
|
7
27
|
end
|
8
28
|
end # NRSER::Types
|
data/lib/nrser/types/not.rb
CHANGED
@@ -22,31 +22,21 @@ module NRSER::Types
|
|
22
22
|
# Instance Methods
|
23
23
|
# ======================================================================
|
24
24
|
|
25
|
-
def test value
|
25
|
+
def test? value
|
26
26
|
! @type.test( value )
|
27
27
|
end
|
28
28
|
|
29
29
|
|
30
|
-
def
|
31
|
-
"
|
30
|
+
def explain
|
31
|
+
"~#{ @type.name }"
|
32
32
|
end
|
33
33
|
|
34
|
-
|
35
|
-
# @return [String]
|
36
|
-
# a brief string description of the type - just it's {#name} surrounded
|
37
|
-
# by some back-ticks to make it easy to see where it starts and stops.
|
38
|
-
#
|
39
|
-
def to_s
|
40
|
-
"{ x ∉ #{ @type.name } }"
|
41
|
-
end
|
42
|
-
|
43
|
-
alias_method :inspect, :to_s
|
44
|
-
|
45
|
-
|
46
34
|
end # class Not
|
47
35
|
|
48
36
|
|
49
|
-
|
37
|
+
def_factory(
|
38
|
+
:not,
|
39
|
+
) do |type, **options|
|
50
40
|
Not.new type, **options
|
51
41
|
end
|
52
42
|
|
data/lib/nrser/types/numbers.rb
CHANGED
@@ -15,8 +15,8 @@ module NRSER::Types
|
|
15
15
|
# @return [Float]
|
16
16
|
# If the string represents a decimal number.
|
17
17
|
#
|
18
|
-
def self.parse_number
|
19
|
-
float = Float
|
18
|
+
def self.parse_number string
|
19
|
+
float = Float string
|
20
20
|
int = float.to_i
|
21
21
|
if float == int then int else float end
|
22
22
|
end
|
@@ -25,48 +25,44 @@ module NRSER::Types
|
|
25
25
|
# Zero
|
26
26
|
# =====================================================================
|
27
27
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
28
|
+
def_factory(
|
29
|
+
:Zero,
|
30
|
+
aliases: [ :zero ],
|
31
|
+
) do |from_s: method( :parse_number ), **options|
|
32
|
+
is \
|
33
|
+
0,
|
34
|
+
from_s: from_s,
|
35
|
+
**options
|
36
36
|
end
|
37
37
|
|
38
38
|
|
39
39
|
# Number ({Numeric})
|
40
40
|
# =====================================================================
|
41
41
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
42
|
+
def_factory(
|
43
|
+
:Number,
|
44
|
+
aliases: [ :num, :number, :numeric, :Numeric ],
|
45
|
+
) do |name: 'Number', from_s: method( :parse_number ), **options|
|
46
|
+
IsA.new \
|
47
|
+
Numeric,
|
48
|
+
from_s: from_s,
|
49
|
+
**options
|
50
50
|
end
|
51
51
|
|
52
|
-
singleton_class.send :alias_method, :number, :num
|
53
|
-
|
54
52
|
|
55
53
|
# Integers
|
56
54
|
# =====================================================================
|
57
55
|
|
58
|
-
|
59
|
-
Integer,
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
56
|
+
def_factory(
|
57
|
+
:Integer,
|
58
|
+
aliases: [ :int, :integer, :signed ],
|
59
|
+
) do |name: 'ℤ', from_s: method( :parse_number ), **options|
|
60
|
+
IsA.new \
|
61
|
+
Integer,
|
62
|
+
from_s: from_s,
|
63
|
+
**options
|
66
64
|
end
|
67
65
|
|
68
|
-
singleton_class.send :alias_method, :integer, :int
|
69
|
-
|
70
66
|
|
71
67
|
# Bounded Integers
|
72
68
|
# ---------------------------------------------------------------------
|
@@ -77,12 +73,15 @@ module NRSER::Types
|
|
77
73
|
# Integer greater than zero.
|
78
74
|
#
|
79
75
|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
76
|
+
def_factory(
|
77
|
+
:PositiveInteger,
|
78
|
+
aliases: [ :pos_int, :positive_int, :positive_integer ]
|
79
|
+
) do |name: 'ℤ⁺', **options|
|
80
|
+
intersection \
|
81
|
+
int,
|
82
|
+
bounded( min: 1 ),
|
83
|
+
name: name,
|
84
|
+
**options
|
86
85
|
end
|
87
86
|
|
88
87
|
# Ugh sometimes the naturals have 0, so omit it...
|
@@ -95,12 +94,15 @@ module NRSER::Types
|
|
95
94
|
# Integer less than zero.
|
96
95
|
#
|
97
96
|
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
97
|
+
def_factory(
|
98
|
+
:NegativeInteger,
|
99
|
+
aliases: [ :neg_int, :negative_int, :negative_integer ],
|
100
|
+
) do |name: 'ℤ⁻', **options|
|
101
|
+
intersection \
|
102
|
+
int,
|
103
|
+
bounded( max: -1 ),
|
104
|
+
name: name,
|
105
|
+
**options
|
104
106
|
end
|
105
107
|
|
106
108
|
|
@@ -111,20 +113,23 @@ module NRSER::Types
|
|
111
113
|
# as bounded instead of a union.
|
112
114
|
#
|
113
115
|
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
116
|
+
def_factory(
|
117
|
+
:NonNegativeInteger,
|
118
|
+
aliases: [
|
119
|
+
:non_neg_int,
|
120
|
+
:unsigned,
|
121
|
+
:index,
|
122
|
+
:non_negative_int,
|
123
|
+
:non_negative_integer,
|
124
|
+
],
|
125
|
+
) do |name: 'ℕ⁰', **options|
|
126
|
+
intersection \
|
127
|
+
int,
|
128
|
+
bounded( min: 0 ),
|
129
|
+
name: name,
|
130
|
+
**options
|
124
131
|
end
|
125
132
|
|
126
|
-
singleton_class.send :alias_method, :unsigned?, :non_neg_int?
|
127
|
-
|
128
133
|
|
129
134
|
# Non-Positive Integer
|
130
135
|
# --------------------
|
@@ -132,8 +137,40 @@ module NRSER::Types
|
|
132
137
|
# negative integers and zero.
|
133
138
|
#
|
134
139
|
|
135
|
-
|
136
|
-
|
140
|
+
def_factory(
|
141
|
+
:NonPositiveInteger,
|
142
|
+
aliases: [ :non_pos_int, :non_positive_int, :non_positive_integer ],
|
143
|
+
) do |name: '{0}∪ℤ⁻', **options|
|
144
|
+
intersection \
|
145
|
+
int,
|
146
|
+
bounded( max: 0 ),
|
147
|
+
name: name,
|
148
|
+
**options
|
149
|
+
end
|
150
|
+
|
151
|
+
|
152
|
+
def_factory(
|
153
|
+
:Unsigned16BitInteger,
|
154
|
+
aliases: [ :uint16, :ushort ],
|
155
|
+
) do |name: 'uint16', **options|
|
156
|
+
intersection \
|
157
|
+
int,
|
158
|
+
bounded( min: 0, max: ((2 ** 16) - 1) ),
|
159
|
+
name: name,
|
160
|
+
**options
|
137
161
|
end
|
138
|
-
|
162
|
+
|
163
|
+
|
164
|
+
# TODO Move?
|
165
|
+
def_factory(
|
166
|
+
:UNIXPort,
|
167
|
+
aliases: [ :port, ],
|
168
|
+
) do |name: 'port', **options|
|
169
|
+
intersection \
|
170
|
+
int,
|
171
|
+
bounded( min: 1, max: (2**16 - 1) ),
|
172
|
+
name: name,
|
173
|
+
**options
|
174
|
+
end
|
175
|
+
|
139
176
|
end # NRSER::Types
|
data/lib/nrser/types/pairs.rb
CHANGED
@@ -9,7 +9,10 @@
|
|
9
9
|
|
10
10
|
# Project / Package
|
11
11
|
# -----------------------------------------------------------------------
|
12
|
+
require 'nrser/core_ext/hash'
|
13
|
+
|
12
14
|
require_relative './combinators'
|
15
|
+
require_relative './tuples'
|
13
16
|
|
14
17
|
|
15
18
|
# Refinements
|
@@ -27,83 +30,80 @@ module NRSER; end
|
|
27
30
|
|
28
31
|
module NRSER::Types
|
29
32
|
|
30
|
-
|
31
|
-
# @todo Document array_pair method.
|
32
|
-
#
|
33
|
-
# @param [type] arg_name
|
34
|
-
# @todo Add name param description.
|
33
|
+
# Type for key/value pairs encoded as a {.tuple} (Array) of length 2.
|
35
34
|
#
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
35
|
+
def_factory(
|
36
|
+
:array_pair,
|
37
|
+
) do |name: 'ArrayPair', key: any, value: any, **options|
|
38
|
+
unless options.key? :name
|
39
|
+
options[:name] = if key == any && value == any
|
40
|
+
'ArrayPair'
|
41
|
+
else
|
42
|
+
key = NRSER::Types.make key
|
43
|
+
value = NRSER::Types.make value
|
44
|
+
|
45
|
+
"ArrayPair<#{ key.name }, #{ value.name }>"
|
46
|
+
end
|
47
|
+
end
|
44
48
|
|
45
|
-
tuple
|
49
|
+
tuple \
|
50
|
+
key,
|
51
|
+
value,
|
52
|
+
# name: name,
|
53
|
+
**options
|
46
54
|
end # .array_pair
|
47
55
|
|
48
|
-
ARRAY_PAIR = array_pair( name: 'ArrayPairType' ).freeze
|
49
56
|
|
50
|
-
|
51
|
-
# Type for a {Hash} that consists of only a single key and value pair.
|
57
|
+
# Type for key/value pairs encoded as {Hash} with a single entry.
|
52
58
|
#
|
53
59
|
# @param [String] name:
|
54
60
|
# Name to give the new type.
|
55
61
|
#
|
56
62
|
# @param [Hash] **options
|
57
|
-
# Other options to pass to
|
58
|
-
#
|
59
|
-
# @return [NRSER::Types::Type]
|
63
|
+
# Other options to pass to
|
60
64
|
#
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
65
|
+
def_factory(
|
66
|
+
:hash_pair,
|
67
|
+
) do |key: any, value: any, **options|
|
68
|
+
unless options.key? :name
|
69
|
+
options[:name] = if key == any && value == any
|
70
|
+
'HashPair'
|
71
|
+
else
|
72
|
+
key = NRSER::Types.make key
|
73
|
+
value = NRSER::Types.make value
|
74
|
+
|
75
|
+
"HashPair<#{ key.name }, #{ value.name }>"
|
68
76
|
end
|
69
|
-
}
|
70
|
-
|
71
|
-
if hash_options.empty?
|
72
|
-
intersection is_a( Hash ), length( 1 ), **options
|
73
|
-
else
|
74
|
-
intersection \
|
75
|
-
hash_type( **hash_options ),
|
76
|
-
length( 1 ),
|
77
|
-
**options
|
78
77
|
end
|
79
78
|
|
79
|
+
intersection \
|
80
|
+
hash_type( keys: key, values: value ),
|
81
|
+
length( 1 ),
|
82
|
+
# name: name,
|
83
|
+
**options
|
80
84
|
end # .hash_pair
|
81
85
|
|
82
|
-
HASH_PAIR = hash_pair( name: 'HashPairType' ).freeze
|
83
|
-
|
84
86
|
|
85
|
-
#
|
86
|
-
#
|
87
|
-
# @param [type] arg_name
|
88
|
-
# @todo Add name param description.
|
87
|
+
# A key/value pair, which can be encoded as an Array of length 2 or a
|
88
|
+
# Hash of length 1.
|
89
89
|
#
|
90
|
-
# @return [return_type]
|
91
|
-
# @todo Document return value.
|
92
90
|
#
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
91
|
+
def_factory :pair do |key: any, value: any, **options|
|
92
|
+
unless options.key? :name
|
93
|
+
options[:name] = if key == any && value == any
|
94
|
+
'Pair'
|
95
|
+
else
|
96
|
+
key = NRSER::Types.make key
|
97
|
+
value = NRSER::Types.make value
|
98
|
+
|
99
|
+
"Pair<#{ key.name }, #{ value.name }>"
|
100
|
+
end
|
103
101
|
end
|
102
|
+
|
103
|
+
union \
|
104
|
+
array_pair( key: key, value: value ),
|
105
|
+
hash_pair( key: key, value: value ),
|
106
|
+
**options
|
104
107
|
end # #pair
|
105
108
|
|
106
|
-
PAIR = pair( name: 'PairType' ).freeze
|
107
|
-
|
108
109
|
end # module NRSER::Types
|
109
|
-
|