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.
Files changed (188) hide show
  1. checksums.yaml +4 -4
  2. data/lib/nrser/char/alpha_numeric_sub.rb +1 -2
  3. data/lib/nrser/char.rb +0 -6
  4. data/lib/nrser/core_ext/array.rb +120 -0
  5. data/lib/nrser/core_ext/binding.rb +44 -0
  6. data/lib/nrser/{functions → core_ext}/enumerable/find_map.rb +18 -15
  7. data/lib/nrser/{ext → core_ext}/enumerable.rb +10 -24
  8. data/lib/nrser/core_ext/exception.rb +30 -0
  9. data/lib/nrser/core_ext/hash/extract_values_at.rb +49 -0
  10. data/lib/nrser/core_ext/hash/transform_values_with_keys.rb +24 -0
  11. data/lib/nrser/core_ext/hash.rb +50 -0
  12. data/lib/nrser/core_ext/module/method_objects.rb +96 -0
  13. data/lib/nrser/core_ext/module/names.rb +69 -0
  14. data/lib/nrser/core_ext/module/source_locations.rb +214 -0
  15. data/lib/nrser/core_ext/module.rb +2 -0
  16. data/lib/nrser/core_ext/object/lazy_var.rb +31 -0
  17. data/lib/nrser/core_ext/object.rb +46 -0
  18. data/lib/nrser/core_ext/open_struct.rb +6 -0
  19. data/lib/nrser/{ext → core_ext}/pathname.rb +8 -5
  20. data/lib/nrser/{ext → core_ext}/string.rb +6 -12
  21. data/lib/nrser/core_ext/symbol.rb +13 -0
  22. data/lib/nrser/core_ext/time.rb +46 -0
  23. data/lib/nrser/core_ext.rb +13 -0
  24. data/lib/nrser/errors/abstract_method_error.rb +150 -0
  25. data/lib/nrser/errors/argument_error.rb +42 -0
  26. data/lib/nrser/errors/nicer_error.rb +298 -72
  27. data/lib/nrser/errors/type_error.rb +46 -0
  28. data/lib/nrser/errors.rb +4 -53
  29. data/lib/nrser/ext/tree.rb +3 -0
  30. data/lib/nrser/functions/enumerable/associate.rb +6 -9
  31. data/lib/nrser/functions/enumerable/include_slice.rb +2 -3
  32. data/lib/nrser/functions/enumerable.rb +1 -3
  33. data/lib/nrser/functions/exception.rb +1 -1
  34. data/lib/nrser/functions/hash.rb +0 -6
  35. data/lib/nrser/functions/merge_by.rb +2 -2
  36. data/lib/nrser/functions/module/method_objects.rb +77 -0
  37. data/lib/nrser/functions/module.rb +1 -2
  38. data/lib/nrser/functions/open_struct.rb +25 -35
  39. data/lib/nrser/functions/proc.rb +1 -6
  40. data/lib/nrser/functions/string/looks_like.rb +32 -1
  41. data/lib/nrser/functions/string.rb +1 -40
  42. data/lib/nrser/functions/text/lines.rb +2 -1
  43. data/lib/nrser/functions.rb +0 -1
  44. data/lib/nrser/graph/tsorter.rb +41 -0
  45. data/lib/nrser/labs/core_ext/binding.rb +37 -0
  46. data/lib/nrser/labs/stash.rb +372 -0
  47. data/lib/nrser/{logging → log}/appender/sync.rb +3 -3
  48. data/lib/nrser/log/appender.rb +3 -0
  49. data/lib/nrser/{logging → log}/formatters/color.rb +47 -20
  50. data/lib/nrser/log/formatters/mixin.rb +270 -0
  51. data/lib/nrser/{logging → log}/formatters.rb +0 -0
  52. data/lib/nrser/log/logger.rb +229 -0
  53. data/lib/nrser/log/mixin.rb +56 -0
  54. data/lib/nrser/log.rb +723 -0
  55. data/lib/nrser/message.rb +24 -3
  56. data/lib/nrser/meta/source/location.rb +158 -0
  57. data/lib/nrser/meta.rb +1 -1
  58. data/lib/nrser/props/class_methods.rb +118 -0
  59. data/lib/nrser/props/immutable/hash.rb +111 -0
  60. data/lib/nrser/props/immutable/hash_variable.rb +82 -0
  61. data/lib/nrser/props/immutable/instance_variables.rb +48 -0
  62. data/lib/nrser/props/immutable/vector.rb +107 -0
  63. data/lib/nrser/props/instance_methods.rb +184 -0
  64. data/lib/nrser/props/metadata.rb +359 -0
  65. data/lib/nrser/props/mutable/instance_variables.rb +60 -0
  66. data/lib/nrser/props/mutable/stash.rb +199 -0
  67. data/lib/nrser/{meta/props → props}/prop.rb +217 -112
  68. data/lib/nrser/props/storage/instance_variable.rb +85 -0
  69. data/lib/nrser/props/storage/instance_variables.rb +67 -0
  70. data/lib/nrser/props/storage/key.rb +88 -0
  71. data/lib/nrser/props.rb +9 -0
  72. data/lib/nrser/refinements/sugar.rb +41 -0
  73. data/lib/nrser/refinements/types.rb +2 -2
  74. data/lib/nrser/refinements.rb +14 -16
  75. data/lib/nrser/rspex/example_group/describe_attribute.rb +24 -0
  76. data/lib/nrser/rspex/example_group/describe_called_with.rb +1 -6
  77. data/lib/nrser/rspex/example_group/{describe_use_case.rb → describe_case.rb} +6 -3
  78. data/lib/nrser/rspex/example_group/describe_class.rb +1 -0
  79. data/lib/nrser/rspex/example_group/describe_group.rb +29 -0
  80. data/lib/nrser/rspex/example_group/describe_instance_method.rb +2 -2
  81. data/lib/nrser/rspex/example_group/describe_message.rb +35 -0
  82. data/lib/nrser/rspex/example_group/describe_method.rb +23 -2
  83. data/lib/nrser/rspex/example_group/describe_module.rb +19 -0
  84. data/lib/nrser/rspex/example_group/describe_response_to.rb +32 -0
  85. data/lib/nrser/rspex/example_group/describe_section.rb +38 -0
  86. data/lib/nrser/rspex/example_group/describe_sent_to.rb +52 -0
  87. data/lib/nrser/rspex/example_group/describe_source_file.rb +49 -0
  88. data/lib/nrser/rspex/example_group/describe_spec_file.rb +41 -108
  89. data/lib/nrser/rspex/example_group/describe_when.rb +14 -7
  90. data/lib/nrser/rspex/example_group/describe_x.rb +39 -12
  91. data/lib/nrser/rspex/example_group/overrides.rb +66 -0
  92. data/lib/nrser/rspex/example_group.rb +20 -252
  93. data/lib/nrser/rspex/format.rb +83 -17
  94. data/lib/nrser/rspex.rb +4 -34
  95. data/lib/nrser/sugar/method_missing_forwarder.rb +50 -0
  96. data/lib/nrser/{env → sys/env}/path.rb +1 -2
  97. data/lib/nrser/{env.rb → sys/env.rb} +2 -1
  98. data/lib/nrser/sys.rb +5 -0
  99. data/lib/nrser/types/any.rb +36 -7
  100. data/lib/nrser/types/{array.rb → arrays.rb} +32 -81
  101. data/lib/nrser/types/attrs.rb +68 -15
  102. data/lib/nrser/types/booleans.rb +95 -34
  103. data/lib/nrser/types/bounded.rb +12 -10
  104. data/lib/nrser/types/combinators.rb +74 -37
  105. data/lib/nrser/types/errors/check_error.rb +86 -0
  106. data/lib/nrser/types/errors/from_string_error.rb +82 -0
  107. data/lib/nrser/types/factory.rb +91 -0
  108. data/lib/nrser/types/hashes.rb +171 -26
  109. data/lib/nrser/types/in.rb +25 -12
  110. data/lib/nrser/types/is.rb +50 -18
  111. data/lib/nrser/types/is_a.rb +52 -33
  112. data/lib/nrser/types/labels.rb +6 -33
  113. data/lib/nrser/types/maybe.rb +12 -4
  114. data/lib/nrser/types/nil.rb +24 -4
  115. data/lib/nrser/types/not.rb +6 -16
  116. data/lib/nrser/types/numbers.rb +94 -57
  117. data/lib/nrser/types/pairs.rb +57 -57
  118. data/lib/nrser/types/paths.rb +112 -133
  119. data/lib/nrser/types/responds.rb +64 -74
  120. data/lib/nrser/types/shape.rb +29 -24
  121. data/lib/nrser/types/strings.rb +25 -17
  122. data/lib/nrser/types/symbols.rb +19 -17
  123. data/lib/nrser/types/trees.rb +18 -70
  124. data/lib/nrser/types/tuples.rb +36 -40
  125. data/lib/nrser/types/type.rb +342 -91
  126. data/lib/nrser/types/when.rb +40 -18
  127. data/lib/nrser/types/where.rb +94 -9
  128. data/lib/nrser/types.rb +72 -63
  129. data/lib/nrser/version.rb +1 -1
  130. data/lib/nrser.rb +18 -18
  131. data/spec/lib/nrser/{functions/binding/template_spec.rb → core_ext/binding/erb_spec.rb} +5 -5
  132. data/spec/lib/nrser/{functions → core_ext}/enumerable/find_map_spec.rb +8 -6
  133. data/spec/lib/nrser/{refinements → core_ext}/hash_spec.rb +9 -22
  134. data/spec/lib/nrser/errors/abstract_method_error_spec.rb +12 -5
  135. data/spec/lib/nrser/functions/enumerable/{to_h_by_spec.rb → associate_spec.rb} +1 -1
  136. data/spec/lib/nrser/functions/merge_by_spec.rb +1 -1
  137. data/spec/lib/nrser/functions/tree/each_branch_spec.rb +3 -3
  138. data/spec/lib/nrser/functions/tree/transform_spec.rb +14 -15
  139. data/spec/lib/nrser/gem_ext/hamster/json_spec.rb +4 -0
  140. data/spec/lib/nrser/meta/source/location_spec.rb +86 -0
  141. data/spec/lib/nrser/props/immutable/hash_spec.rb +297 -0
  142. data/spec/lib/nrser/props/immutable/vector_spec.rb +296 -0
  143. data/spec/lib/nrser/{meta/props_spec.rb → props/original_props_spec.rb} +11 -16
  144. data/spec/lib/nrser/{meta/props → props}/to_and_from_data_spec.rb +10 -8
  145. data/spec/lib/nrser/refinements/array_spec.rb +2 -15
  146. data/spec/lib/nrser/refinements/erb_spec.rb +5 -7
  147. data/spec/lib/nrser/refinements/set_spec.rb +2 -15
  148. data/spec/lib/nrser/{env → sys/env}/path/insert_spec.rb +4 -2
  149. data/spec/lib/nrser/{env → sys/env}/path_spec.rb +4 -2
  150. data/spec/lib/nrser/types/array_spec.rb +8 -8
  151. data/spec/lib/nrser/types/paths_spec.rb +15 -18
  152. data/spec/spec_helper.rb +4 -0
  153. metadata +109 -69
  154. data/lib/nrser/ext/binding.rb +0 -36
  155. data/lib/nrser/ext/module.rb +0 -62
  156. data/lib/nrser/ext.rb +0 -8
  157. data/lib/nrser/functions/binding.rb +0 -76
  158. data/lib/nrser/functions/enumerable/map_keys.rb +0 -0
  159. data/lib/nrser/functions/enumerable/map_values.rb +0 -94
  160. data/lib/nrser/functions/hash/deep_merge.rb +0 -57
  161. data/lib/nrser/functions/hash/except_keys.rb +0 -44
  162. data/lib/nrser/functions/hash/slice_keys.rb +0 -43
  163. data/lib/nrser/functions/hash/stringify_keys.rb +0 -55
  164. data/lib/nrser/functions/hash/symbolize_keys.rb +0 -57
  165. data/lib/nrser/functions/hash/transform_keys.rb +0 -140
  166. data/lib/nrser/functions/module/methods.rb +0 -206
  167. data/lib/nrser/functions/module/source_locations.rb +0 -213
  168. data/lib/nrser/logging/appender.rb +0 -3
  169. data/lib/nrser/logging.rb +0 -353
  170. data/lib/nrser/meta/props/base.rb +0 -31
  171. data/lib/nrser/meta/props.rb +0 -357
  172. data/lib/nrser/refinements/array.rb +0 -133
  173. data/lib/nrser/refinements/binding.rb +0 -6
  174. data/lib/nrser/refinements/enumerator.rb +0 -5
  175. data/lib/nrser/refinements/exception.rb +0 -35
  176. data/lib/nrser/refinements/hash.rb +0 -150
  177. data/lib/nrser/refinements/module.rb +0 -5
  178. data/lib/nrser/refinements/object.rb +0 -42
  179. data/lib/nrser/refinements/open_struct.rb +0 -28
  180. data/lib/nrser/refinements/pathname.rb +0 -5
  181. data/lib/nrser/refinements/set.rb +0 -5
  182. data/lib/nrser/refinements/string.rb +0 -5
  183. data/lib/nrser/refinements/symbol.rb +0 -20
  184. data/lib/nrser/rspex/described.rb +0 -99
  185. data/spec/design/mapping_spec.rb +0 -42
  186. data/spec/lib/nrser/functions/hash_spec.rb +0 -41
  187. data/spec/lib/nrser/functions/string/truncate_spec.rb +0 -11
  188. data/spec/lib/nrser/refinements/truncate_spec.rb +0 -10
@@ -1,158 +1,137 @@
1
1
  # Requirements
2
2
  # =======================================================================
3
3
 
4
- # stdlib
5
- require 'pathname'
4
+ # Stdlib
5
+ # -----------------------------------------------------------------------
6
6
 
7
- # gems
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
- # A {Pathname} type that provides a `from_s`
34
- PATHNAME = is_a \
35
- Pathname,
36
- name: 'PathnameType',
37
- from_s: ->(string) { Pathname.new string },
38
- to_data: :to_s
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
- NON_EMPTY_PATHNAME = intersection \
44
- PATHNAME,
45
- where { |value| value.to_s.length > 0 },
46
- name: 'NonEmptyPathnameType'
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
- PATH = union non_empty_str, NON_EMPTY_PATHNAME, name: 'Path'
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
- # Eigenclass (Singleton Class)
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
- class << self
55
- # @!group Type Factory Functions
56
-
57
- def pathname to_data: :to_s, **options
58
- if options.empty? && to_data == :to_s
59
- PATHNAME
60
- else
61
- is_a \
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
@@ -1,110 +1,100 @@
1
+ require 'nrser/message'
1
2
  require_relative './booleans'
2
3
 
3
4
  module NRSER::Types
4
5
 
5
- # Type that encodes messages mapped to result types that member values must
6
- # satisfy.
7
- class Responds < NRSER::Types::Type
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
- # Constants
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
- # Class Methods
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
- # Attributes
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 `Responds`.
25
- def initialize map,
26
- public: true,
41
+ # Instantiate a new `Respond`.
42
+ def initialize to:,
43
+ with:,
44
+ publicly: true,
27
45
  **options
28
- @map = NRSER.map_values(map) { |args, type|
29
- NRSER::Types.make type
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
- def default_name
39
- attrs_str = @map.map { |args, type|
40
- args_str = args[1..-1].map(&:inspect).join ', '
41
- "#{ args[0] }(#{ args_str })=#{ type.name }"
42
- }.join(', ')
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
- "#{ self.class.short_name } #{ attrs_str }"
70
+ "##{ message.symbol }(#{ args_str })#{ RESPONDS_WITH }#{ response.explain }"
45
71
  end
46
72
 
47
73
 
48
- # @todo Document test method.
74
+ # Test value for membership.
49
75
  #
50
- # @param [type] arg_name
51
- # @todo Add name param description.
76
+ # @param (see NRSER::Types::Type#test?)
77
+ # @return (see NRSER::Types::Type#test?)
78
+ # @raise (see NRSER::Types::Type#test?)
52
79
  #
53
- # @return [return_type]
54
- # @todo Document return value.
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
@@ -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 default_name
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
- def self.shape pairs, **options
74
+ def_factory(
75
+ :shape,
76
+ ) do |pairs, **options|
72
77
  Shape.new pairs, **options
73
78
  end
74
79
 
@@ -1,18 +1,19 @@
1
- require 'nrser/refinements'
2
- require 'nrser/types/is'
3
- require 'nrser/types/is_a'
4
- require 'nrser/types/attrs'
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
- def self.str length: nil, encoding: nil, **options
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 # string
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 :empty_str do |name: 'EmptyString', **options|
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 :non_empty_str do |**options|
39
- str length: {min: 1}, **options
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 :char do |**options|
44
- str length: 1, name: "Character", **options
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
- def_factory :uft_8, aliases: [:utf8] do |name: 'UTF8String', **options|
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
 
@@ -1,33 +1,35 @@
1
- require 'nrser/refinements'
2
- require 'nrser/types/is'
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
- def self.sym **options
11
- IsA.new(
12
- Symbol,
13
- from_s: :to_sym.to_proc,
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
- def self.empty_sym **options
22
- is :'', name: 'EmptySymbol', **options
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
- def self.non_empty_sym **options
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: 'NonEmptySymbol',
32
+ name: name,
31
33
  **options
32
34
  end
33
35