nrser 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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