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,357 +0,0 @@
1
- # Refinements
2
- # =======================================================================
3
-
4
- using NRSER
5
- using NRSER::Types
6
-
7
-
8
- # Definitions
9
- # =======================================================================
10
-
11
- module NRSER::Meta::Props
12
- DEFAULT_CLASS_KEY = '__class__';
13
-
14
- PROPS_VARIABLE_NAME = :@__NRSER_props
15
- PROP_VALUES_VARIABLE_NAME = :@__NRSER_prop_values
16
-
17
-
18
- # Module Methods (Utilities)
19
- # =====================================================================
20
- #
21
- # These are *NOT* mixed in to including classes, and must be accessed
22
- # via `NRSER::Meta::Props.<method_name>`.
23
- #
24
- # They're utilities that should only really need to be used internally.
25
- #
26
-
27
-
28
- # @todo Document get_props_ref method.
29
- #
30
- # @param [type] arg_name
31
- # @todo Add name param description.
32
- #
33
- # @return [return_type]
34
- # @todo Document return value.
35
- #
36
- def self.get_props_ref klass
37
- unless klass.instance_variable_defined? PROPS_VARIABLE_NAME
38
- klass.instance_variable_set PROPS_VARIABLE_NAME, {}
39
- end
40
-
41
- klass.instance_variable_get PROPS_VARIABLE_NAME
42
- end # .get_props_ref
43
-
44
-
45
- # Instantiate a class from a data hash. The hash must contain the
46
- # `__class__` key and the target class must be loaded already.
47
- #
48
- # **WARNING**
49
- #
50
- # I'm sure this is all-sorts of unsafe. Please don't ever think this is
51
- # reasonable to use on untrusted data.
52
- #
53
- # @param [Hash<String, Object>] data
54
- # Data hash to load from.
55
- #
56
- # @param
57
- #
58
- # @return [NRSER::Meta::Props]
59
- # Instance of a propertied class.
60
- #
61
- def self.UNSAFE_load_instance_from_data data, class_key: DEFAULT_CLASS_KEY
62
- t.hash_.check data
63
-
64
- unless data.key?( class_key )
65
- raise ArgumentError.new binding.erb <<-ERB
66
- Data is missing <%= class_key %> key - no idea what class to
67
- instantiate.
68
-
69
- Data:
70
-
71
- <%= data.pretty_inspect %>
72
-
73
- ERB
74
- end
75
-
76
- # Get the class name from the data hash using the key, checking that it's
77
- # a non-empty string.
78
- class_name = t.non_empty_str.check data[class_key]
79
-
80
- # Resolve the constant at that name.
81
- klass = class_name.to_const
82
-
83
- # Make sure it's one of ours
84
- unless klass.included_modules.include?( NRSER::Meta::Props )
85
- raise ArgumentError.new binding.erb <<-ERB
86
- Can not load instance from data - bad class name.
87
-
88
- Extracted class name
89
-
90
- <%= class_name.inspect %>
91
-
92
- from class key
93
-
94
- <%= class_key.inspect %>
95
-
96
- which resolved to constant
97
-
98
- <%= klass.inspect %>
99
-
100
- but that class does not include the NRSER::Meta::Props mixin, which we
101
- check for to help protect against executing an unrelated `.from_data`
102
- class method when attempting to load.
103
-
104
- Data:
105
-
106
- <%= data.pretty_inspect %>
107
-
108
- ERB
109
- end
110
-
111
- # Kick off the restore and return the result
112
- klass.from_data data
113
-
114
- end # .UNSAFE_load_instance_from_data
115
-
116
-
117
- # Hook to extend the including class with {NRSER::Meta::Props:ClassMethods}
118
- def self.included base
119
- base.extend ClassMethods
120
- end
121
-
122
-
123
- # Mixed-In Class Methods
124
- # =====================================================================
125
-
126
- # Methods added to the including *class* via `extend`.
127
- #
128
- module ClassMethods
129
-
130
- # Get a map of property names to property instances.
131
- #
132
- # @param [Boolean] only_own:
133
- # Don't include super-class properties.
134
- #
135
- # @param [Boolean] only_primary:
136
- # Don't include properties that have a {NRSER::Meta::Props::Prop#source}.
137
- #
138
- # @return [Hash{ Symbol => NRSER::Meta::Props::Prop }]
139
- # Hash mapping property name to property instance.
140
- #
141
- def props only_own: false, only_primary: false
142
- result = if !only_own && superclass.respond_to?(:props)
143
- superclass.props only_own: only_own, only_primary: only_primary
144
- else
145
- {}
146
- end
147
-
148
- own_props = NRSER::Meta::Props.get_props_ref self
149
-
150
- if only_primary
151
- own_props.each {|name, prop|
152
- if prop.primary?
153
- result[name] = prop
154
- end
155
- }
156
- else
157
- result.merge! own_props
158
- end
159
-
160
- result
161
- end # #own_props
162
-
163
-
164
- # Define a property.
165
- #
166
- # @param [Symbol] name
167
- # The name of the property.
168
- #
169
- # @param [Hash{ Symbol => Object }] **opts
170
- # Constructor options for {NRSER::Meta::Props::Prop}.
171
- #
172
- # @return [NRSER::Meta::Props::Prop]
173
- # The newly created prop, thought you probably don't need it (it's
174
- # already all bound up on the class at this point), but why not?
175
- #
176
- def prop name, **opts
177
- ref = NRSER::Meta::Props.get_props_ref self
178
-
179
- t.sym.check name
180
-
181
- if ref.key? name
182
- raise ArgumentError.new NRSER.squish <<-END
183
- Prop #{ name.inspect } already set for #{ self }:
184
- #{ ref[name].inspect }
185
- END
186
- end
187
-
188
- prop = Prop.new self, name, **opts
189
- ref[name] = prop
190
-
191
- if prop.create_reader?
192
- class_eval do
193
- define_method prop.name do
194
- prop.get self
195
- end
196
- end
197
- end
198
-
199
- if prop.create_writer?
200
- class_eval do
201
- define_method "#{ prop.name }=" do |value|
202
- prop.set self, value
203
- end
204
- end
205
- end
206
-
207
- prop
208
- end # #prop
209
-
210
-
211
- # Instantiate from a data hash.
212
- #
213
- # @todo
214
- # This needs to be extended to handle prop'd classes nested in
215
- # arrays and hashes... but for the moment, it is what it is.
216
- #
217
- # @param [Hash<String, Object>] data
218
- #
219
- # @return [self]
220
- #
221
- def from_data data
222
- values = {}
223
- props = self.props
224
-
225
- data.each { |data_key, data_value|
226
- prop_key = case data_key
227
- when Symbol
228
- data_key
229
- when String
230
- data_key.to_sym
231
- end
232
-
233
- if prop_key &&
234
- prop = props[prop_key]
235
- values[prop_key] = prop.value_from_data data_value
236
- end
237
- }
238
-
239
- self.new values
240
- end # #from_data
241
-
242
-
243
- end # module ClassMethods
244
-
245
-
246
- # Mixed-In Instance Methods
247
- # =====================================================================
248
-
249
- # @todo Document initialize_props method.
250
- #
251
- # @param [type] arg_name
252
- # @todo Add name param description.
253
- #
254
- # @return [return_type]
255
- # @todo Document return value.
256
- #
257
- def initialize_props values
258
- self.class.props(only_primary: true).each { |name, prop|
259
- prop.set_from_values_hash self, values
260
- }
261
-
262
- # TODO Now trigger all eager defaults (check prop getting trigger
263
- # correctly)
264
- end # #initialize_props
265
-
266
-
267
- def merge overrides = {}
268
- self.class.new(
269
- self.to_h(only_primary: true).merge(overrides.symbolize_keys)
270
- )
271
- end
272
-
273
-
274
- # @todo Document to_h method.
275
- #
276
- # @param [type] arg_name
277
- # @todo Add name param description.
278
- #
279
- # @return [Hash<Symbol, Object>]
280
- # @todo Document return value.
281
- #
282
- def to_h only_own: false, only_primary: false
283
- self.class.
284
- props(only_own: only_own, only_primary: only_primary).
285
- map_values { |name, prop| prop.get self }
286
- end # #to_h
287
-
288
-
289
- # Create a "data" representation suitable for transport, storage, etc.
290
- #
291
- # The result is meant to consist of only basic data types and structures -
292
- # strings, numbers, arrays, hashes, datetimes, etc... though it depends on
293
- # any custom objects it encounters correctly responding to `#to_data` for
294
- # this to happen (as is implemented from classes that mix in Props here).
295
- #
296
- # Prop names are converted to strings (from symbols) since though YAML
297
- # supports symbol values, they have poor portability across languages,
298
- # and they mean the same thing in this situation.
299
- #
300
- # @param [type] arg_name
301
- # @todo Add name param description.
302
- #
303
- # @return [Hash<String, Object>]
304
- # @todo Document return value.
305
- #
306
- def to_data only_own: false,
307
- only_primary: false,
308
- add_class: true,
309
- class_key: NRSER::Meta::Props::DEFAULT_CLASS_KEY
310
-
311
- self.class.props(only_own: false, only_primary: false).
312
- map { |name, prop|
313
- [name.to_s, prop.to_data(self)]
314
- }.
315
- to_h.
316
- tap { |hash|
317
- hash[class_key] = self.class.name if add_class
318
- }
319
- end # #to_data
320
-
321
-
322
- # Language Inter-Op
323
- # ---------------------------------------------------------------------
324
-
325
- # Get a JSON {String} encoding the instance's data.
326
- #
327
- # @param [Array] *args
328
- # I really don't know. `#to_json` takes at last one argument, but I've
329
- # had trouble finding a spec for it :/
330
- #
331
- # @return [String]
332
- #
333
- def to_json *args
334
- to_data.to_json *args
335
- end # #to_json
336
-
337
-
338
- # Get a YAML {String} encoding the instance's data.
339
- #
340
- # @param [Array] *args
341
- # I really don't know... whatever {YAML.dump} sends to it i guess.
342
- #
343
- # @return [String]
344
- #
345
- def to_yaml *args
346
- to_data.to_yaml *args
347
- end
348
-
349
-
350
- end # module Props
351
-
352
-
353
- # Post-Processing
354
- # =======================================================================
355
-
356
- require_relative './props/prop'
357
- require_relative './props/base'
@@ -1,133 +0,0 @@
1
- module NRSER
2
- refine ::Array do
3
- include NRSER::Ext::Enumerable
4
- include NRSER::Ext::Tree
5
-
6
-
7
- # @return [Array]
8
- # new array consisting of all elements after the first (which may be
9
- # none, resulting in an empty array).
10
- #
11
- def rest
12
- NRSER.rest self
13
- end # #rest
14
-
15
-
16
- def extract! &block
17
- NRSER.extract_from_array! self, &block
18
- end
19
-
20
-
21
- # Calls {NRSER.ellipsis} on `self`.
22
- def ellipsis *args
23
- NRSER.ellipsis self, *args
24
- end
25
-
26
-
27
- # `to_*` Converters
28
- # =====================================================================
29
-
30
- # Checks that length is 2 and returns `self`.
31
- #
32
- # @return [Array]
33
- # Array of length 2.
34
- #
35
- # @raise [TypeError]
36
- # If length is not 2.
37
- #
38
- def to_pair
39
- unless length == 2
40
- raise TypeError,
41
- "Array is not of length 2: #{ self.inspect }"
42
- end
43
-
44
- self
45
- end # #to_pair
46
-
47
-
48
- # To Operation Objects
49
- # ---------------------------------------------------------------------
50
-
51
- # Creates a new {NRSER::Message} from the array.
52
- #
53
- # @example
54
- #
55
- # message = [:fetch, :x].to_message
56
- # message.send_to x: 'ex', y: 'why?'
57
- # # => 'ex'
58
- #
59
- # @return [NRSER::Message]
60
- #
61
- def to_message
62
- NRSER::Message.new *self
63
- end # #to_message
64
-
65
- alias_method :to_m, :to_message
66
-
67
-
68
- # Create a {Proc} that accepts a single `receiver` and provides this array's
69
- # entries as the arguments to `#public_send` (or `#send` if the `publicly`
70
- # option is `false`).
71
- #
72
- # Equivalent to
73
- #
74
- # to_message.to_proc publicly: boolean
75
- #
76
- # @example
77
- #
78
- # [:fetch, :x].sender.call x: 'ex'
79
- # # => 'ex'
80
- #
81
- # @param [Boolean] publicly:
82
- # When `true`, uses `#public_send` in liu of `#send`.
83
- #
84
- # @return [Proc]
85
- #
86
- def to_sender publicly: true
87
- to_message.to_proc publicly: publicly
88
- end
89
-
90
- alias_method :sender, :to_sender
91
- alias_method :sndr, :to_sender
92
-
93
-
94
- # See {NRSER.chainer}.
95
- #
96
- def to_chainer publicly: true
97
- NRSER.chainer self, publicly: publicly
98
- end # #to_chainer
99
-
100
- alias_method :chainer, :to_chainer
101
- alias_method :chnr, :to_chainer
102
-
103
-
104
- # Returns a lambda that calls accepts a single arg and calls `#dig` on it
105
- # with the elements of *this* array as arguments.
106
- #
107
- # @example
108
- # list = [{id: 1, name: "Neil"}, {id: 2, name: "Mica"}]
109
- # list.to_h_by &[:id].digger
110
- # # => {
111
- # # 1 => {id: 1, name: "Neil"},
112
- # # 2 => {id: 2, name: "Mica"},
113
- # # }
114
- #
115
- # @todo
116
- # I wanted to use `#to_proc` so that you could use `&[:id]`, but unary
117
- # `&` doesn't invoke refinements, and I don't really want to monkey-patch
118
- # anything, especially something as core as `#to_proc` and `Array`.
119
- #
120
- # @return [Proc]
121
- # Lambda proc that accepts a single argument and calls `#dig` with this
122
- # array's contents as the `#dig` arguments.
123
- #
124
- def to_digger
125
- NRSER::Message.new( :dig, *self ).to_proc
126
- end # #to_digger
127
-
128
- alias_method :digger, :to_digger
129
- alias_method :dggr, :to_digger
130
-
131
-
132
- end # refine ::Array
133
- end # NRSER
@@ -1,6 +0,0 @@
1
- module NRSER
2
- # Harness to include {NRSER::Ext::Binding} in {Binding}
3
- refine Binding do
4
- include NRSER::Ext::Binding
5
- end
6
- end # NRSER
@@ -1,5 +0,0 @@
1
- module NRSER
2
- refine ::Enumerator do
3
- include NRSER::Ext::Enumerable
4
- end # refine ::Enumerator
5
- end # NRSER
@@ -1,35 +0,0 @@
1
- module NRSER
2
- refine Exception do
3
- def format
4
- NRSER.format_exception self
5
- end
6
- end
7
-
8
- refine Exception.singleton_class do
9
-
10
- # Create a new instance from the squished message.
11
- #
12
- # See {NRSER.squish}.
13
- #
14
- # @param [String] message
15
- #
16
- # @return [Exception]
17
- #
18
- def squished message
19
- new NRSER.squish( message )
20
- end
21
-
22
- # Create a new instance from the dedented message.
23
- #
24
- # See {NRSER.dedent}.
25
- #
26
- # @param [String] message
27
- #
28
- # @return [Exception]
29
- #
30
- def dedented message
31
- new NRSER.dedent( message )
32
- end
33
-
34
- end # refine Exception.singleton_class
35
- end # NRSER
@@ -1,150 +0,0 @@
1
- module NRSER
2
-
3
- refine ::Hash do
4
- include NRSER::Ext::Enumerable
5
- include NRSER::Ext::Tree
6
-
7
-
8
- # See {NRSER.except_keys!}.
9
- def except! *keys
10
- NRSER.except_keys! self, *keys
11
- end
12
-
13
- alias_method :omit!, :except!
14
-
15
-
16
- # See {NRSER.except_keys}.
17
- def except *keys
18
- NRSER.except_keys self, *keys
19
- end
20
-
21
- alias_method :omit, :except
22
-
23
-
24
- # See {NRSER.slice_keys}.
25
- def slice *keys
26
- NRSER.slice_keys self, *keys
27
- end
28
-
29
-
30
- # See {NRSER.transform_keys!}
31
- def transform_keys! &block
32
- return enum_for(:transform_keys!) { size } unless block_given?
33
- NRSER.transform_keys! self, &block
34
- end
35
-
36
-
37
- # See {NRSER.deep_transform_keys!}
38
- def deep_transform_keys! &block
39
- return enum_for(:deep_transform_keys!) { size } unless block_given?
40
- NRSER.deep_transform_keys! self, &block
41
- end
42
-
43
- alias_method :deep_map_keys!, :deep_transform_keys!
44
- alias_method :map_keys_r!, :deep_transform_keys!
45
- alias_method :deep_rekey!, :deep_transform_keys!
46
- alias_method :rekey_r!, :deep_transform_keys!
47
-
48
-
49
- # See {NRSER.transform_keys}
50
- def transform_keys &block
51
- return enum_for(:transform_keys) { size } unless block_given?
52
- NRSER.transform_keys self, &block
53
- end
54
-
55
-
56
- # See {NRSER.deep_transform_keys}
57
- def deep_transform_keys &block
58
- return enum_for(:deep_transform_keys) { size } unless block_given?
59
- NRSER.deep_transform_keys self, &block
60
- end
61
-
62
- alias_method :deep_map_keys, :deep_transform_keys
63
- alias_method :map_keys_r, :deep_transform_keys
64
- alias_method :deep_rekey, :deep_transform_keys
65
- alias_method :rekey_r, :deep_transform_keys
66
-
67
-
68
- # See {NRSER.symbolize_keys!}
69
- def symbolize_keys!
70
- NRSER.symbolize_keys! self
71
- end
72
-
73
- alias_method :sym_keys!, :symbolize_keys!
74
-
75
-
76
- # See {NRSER.symbolize_keys}
77
- def symbolize_keys
78
- NRSER.symbolize_keys self
79
- end
80
-
81
- alias_method :sym_keys, :symbolize_keys
82
-
83
-
84
- # See {NRSER.stringify_keys!}
85
- def stringify_keys!
86
- NRSER.stringify_keys! self
87
- end
88
-
89
- alias_method :str_keys!, :stringify_keys!
90
-
91
-
92
- # See {NRSER.stringify_keys}
93
- def stringify_keys
94
- NRSER.stringify_keys self
95
- end
96
-
97
- alias_method :str_keys, :stringify_keys
98
-
99
-
100
- # See {NRSER.map_hash_keys}
101
- def map_keys &block
102
- NRSER.map_keys self, &block
103
- end
104
-
105
-
106
- # See {NRSER.bury!}
107
- def bury! key_path,
108
- value,
109
- parsed_key_type: :guess,
110
- clobber: false
111
- NRSER.bury! self,
112
- key_path,
113
- value,
114
- parsed_key_type: parsed_key_type,
115
- clobber: clobber
116
- end
117
-
118
-
119
- # Checks that `self` contains a single key/value pair (`#length` of 1)
120
- # and returns it as an array of length 2.
121
- #
122
- # @return [Array]
123
- # Array of length 2.
124
- #
125
- # @raise [TypeError]
126
- # If `self` has more than one key/value pair.
127
- #
128
- def to_pair
129
- unless length == 1
130
- raise TypeError,
131
- "Hash has more than one pair: #{ self.inspect }"
132
- end
133
-
134
- first
135
- end
136
-
137
-
138
- # See {NRSER.deep_merge}
139
- def deep_merge other_hash, &block
140
- NRSER.deep_merge self, other_hash, &block
141
- end
142
-
143
-
144
- # See {NRSER.deep_merge!}
145
- def deep_merge! other_hash, &block
146
- NRSER.deep_merge! self, other_hash, &block
147
- end
148
-
149
- end # refine ::Hash
150
- end # NRSER
@@ -1,5 +0,0 @@
1
- module NRSER
2
- refine Module do
3
- include NRSER::Ext::Module
4
- end
5
- end