nrser 0.2.2 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/nrser/char/alpha_numeric_sub.rb +1 -2
- data/lib/nrser/char.rb +0 -6
- data/lib/nrser/core_ext/array.rb +120 -0
- data/lib/nrser/core_ext/binding.rb +44 -0
- data/lib/nrser/{functions → core_ext}/enumerable/find_map.rb +18 -15
- data/lib/nrser/{ext → core_ext}/enumerable.rb +10 -24
- data/lib/nrser/core_ext/exception.rb +30 -0
- data/lib/nrser/core_ext/hash/extract_values_at.rb +49 -0
- data/lib/nrser/core_ext/hash/transform_values_with_keys.rb +24 -0
- data/lib/nrser/core_ext/hash.rb +50 -0
- data/lib/nrser/core_ext/module/method_objects.rb +96 -0
- data/lib/nrser/core_ext/module/names.rb +69 -0
- data/lib/nrser/core_ext/module/source_locations.rb +214 -0
- data/lib/nrser/core_ext/module.rb +2 -0
- data/lib/nrser/core_ext/object/lazy_var.rb +31 -0
- data/lib/nrser/core_ext/object.rb +46 -0
- data/lib/nrser/core_ext/open_struct.rb +6 -0
- data/lib/nrser/{ext → core_ext}/pathname.rb +8 -5
- data/lib/nrser/{ext → core_ext}/string.rb +6 -12
- data/lib/nrser/core_ext/symbol.rb +13 -0
- data/lib/nrser/core_ext/time.rb +46 -0
- data/lib/nrser/core_ext.rb +13 -0
- data/lib/nrser/errors/abstract_method_error.rb +150 -0
- data/lib/nrser/errors/argument_error.rb +42 -0
- data/lib/nrser/errors/nicer_error.rb +298 -72
- data/lib/nrser/errors/type_error.rb +46 -0
- data/lib/nrser/errors.rb +4 -53
- data/lib/nrser/ext/tree.rb +3 -0
- data/lib/nrser/functions/enumerable/associate.rb +6 -9
- data/lib/nrser/functions/enumerable/include_slice.rb +2 -3
- data/lib/nrser/functions/enumerable.rb +1 -3
- data/lib/nrser/functions/exception.rb +1 -1
- data/lib/nrser/functions/hash.rb +0 -6
- data/lib/nrser/functions/merge_by.rb +2 -2
- data/lib/nrser/functions/module/method_objects.rb +77 -0
- data/lib/nrser/functions/module.rb +1 -2
- data/lib/nrser/functions/open_struct.rb +25 -35
- data/lib/nrser/functions/proc.rb +1 -6
- data/lib/nrser/functions/string/looks_like.rb +32 -1
- data/lib/nrser/functions/string.rb +1 -40
- data/lib/nrser/functions/text/lines.rb +2 -1
- data/lib/nrser/functions.rb +0 -1
- data/lib/nrser/graph/tsorter.rb +41 -0
- data/lib/nrser/labs/core_ext/binding.rb +37 -0
- data/lib/nrser/labs/stash.rb +372 -0
- data/lib/nrser/{logging → log}/appender/sync.rb +3 -3
- data/lib/nrser/log/appender.rb +3 -0
- data/lib/nrser/{logging → log}/formatters/color.rb +47 -20
- data/lib/nrser/log/formatters/mixin.rb +270 -0
- data/lib/nrser/{logging → log}/formatters.rb +0 -0
- data/lib/nrser/log/logger.rb +229 -0
- data/lib/nrser/log/mixin.rb +56 -0
- data/lib/nrser/log.rb +723 -0
- data/lib/nrser/message.rb +24 -3
- data/lib/nrser/meta/source/location.rb +158 -0
- data/lib/nrser/meta.rb +1 -1
- data/lib/nrser/props/class_methods.rb +118 -0
- data/lib/nrser/props/immutable/hash.rb +111 -0
- data/lib/nrser/props/immutable/hash_variable.rb +82 -0
- data/lib/nrser/props/immutable/instance_variables.rb +48 -0
- data/lib/nrser/props/immutable/vector.rb +107 -0
- data/lib/nrser/props/instance_methods.rb +184 -0
- data/lib/nrser/props/metadata.rb +359 -0
- data/lib/nrser/props/mutable/instance_variables.rb +60 -0
- data/lib/nrser/props/mutable/stash.rb +199 -0
- data/lib/nrser/{meta/props → props}/prop.rb +217 -112
- data/lib/nrser/props/storage/instance_variable.rb +85 -0
- data/lib/nrser/props/storage/instance_variables.rb +67 -0
- data/lib/nrser/props/storage/key.rb +88 -0
- data/lib/nrser/props.rb +9 -0
- data/lib/nrser/refinements/sugar.rb +41 -0
- data/lib/nrser/refinements/types.rb +2 -2
- data/lib/nrser/refinements.rb +14 -16
- data/lib/nrser/rspex/example_group/describe_attribute.rb +24 -0
- data/lib/nrser/rspex/example_group/describe_called_with.rb +1 -6
- data/lib/nrser/rspex/example_group/{describe_use_case.rb → describe_case.rb} +6 -3
- data/lib/nrser/rspex/example_group/describe_class.rb +1 -0
- data/lib/nrser/rspex/example_group/describe_group.rb +29 -0
- data/lib/nrser/rspex/example_group/describe_instance_method.rb +2 -2
- data/lib/nrser/rspex/example_group/describe_message.rb +35 -0
- data/lib/nrser/rspex/example_group/describe_method.rb +23 -2
- data/lib/nrser/rspex/example_group/describe_module.rb +19 -0
- data/lib/nrser/rspex/example_group/describe_response_to.rb +32 -0
- data/lib/nrser/rspex/example_group/describe_section.rb +38 -0
- data/lib/nrser/rspex/example_group/describe_sent_to.rb +52 -0
- data/lib/nrser/rspex/example_group/describe_source_file.rb +49 -0
- data/lib/nrser/rspex/example_group/describe_spec_file.rb +41 -108
- data/lib/nrser/rspex/example_group/describe_when.rb +14 -7
- data/lib/nrser/rspex/example_group/describe_x.rb +39 -12
- data/lib/nrser/rspex/example_group/overrides.rb +66 -0
- data/lib/nrser/rspex/example_group.rb +20 -252
- data/lib/nrser/rspex/format.rb +83 -17
- data/lib/nrser/rspex.rb +4 -34
- data/lib/nrser/sugar/method_missing_forwarder.rb +50 -0
- data/lib/nrser/{env → sys/env}/path.rb +1 -2
- data/lib/nrser/{env.rb → sys/env.rb} +2 -1
- data/lib/nrser/sys.rb +5 -0
- data/lib/nrser/types/any.rb +36 -7
- data/lib/nrser/types/{array.rb → arrays.rb} +32 -81
- data/lib/nrser/types/attrs.rb +68 -15
- data/lib/nrser/types/booleans.rb +95 -34
- data/lib/nrser/types/bounded.rb +12 -10
- data/lib/nrser/types/combinators.rb +74 -37
- data/lib/nrser/types/errors/check_error.rb +86 -0
- data/lib/nrser/types/errors/from_string_error.rb +82 -0
- data/lib/nrser/types/factory.rb +91 -0
- data/lib/nrser/types/hashes.rb +171 -26
- data/lib/nrser/types/in.rb +25 -12
- data/lib/nrser/types/is.rb +50 -18
- data/lib/nrser/types/is_a.rb +52 -33
- data/lib/nrser/types/labels.rb +6 -33
- data/lib/nrser/types/maybe.rb +12 -4
- data/lib/nrser/types/nil.rb +24 -4
- data/lib/nrser/types/not.rb +6 -16
- data/lib/nrser/types/numbers.rb +94 -57
- data/lib/nrser/types/pairs.rb +57 -57
- data/lib/nrser/types/paths.rb +112 -133
- data/lib/nrser/types/responds.rb +64 -74
- data/lib/nrser/types/shape.rb +29 -24
- data/lib/nrser/types/strings.rb +25 -17
- data/lib/nrser/types/symbols.rb +19 -17
- data/lib/nrser/types/trees.rb +18 -70
- data/lib/nrser/types/tuples.rb +36 -40
- data/lib/nrser/types/type.rb +342 -91
- data/lib/nrser/types/when.rb +40 -18
- data/lib/nrser/types/where.rb +94 -9
- data/lib/nrser/types.rb +72 -63
- data/lib/nrser/version.rb +1 -1
- data/lib/nrser.rb +18 -18
- data/spec/lib/nrser/{functions/binding/template_spec.rb → core_ext/binding/erb_spec.rb} +5 -5
- data/spec/lib/nrser/{functions → core_ext}/enumerable/find_map_spec.rb +8 -6
- data/spec/lib/nrser/{refinements → core_ext}/hash_spec.rb +9 -22
- data/spec/lib/nrser/errors/abstract_method_error_spec.rb +12 -5
- data/spec/lib/nrser/functions/enumerable/{to_h_by_spec.rb → associate_spec.rb} +1 -1
- data/spec/lib/nrser/functions/merge_by_spec.rb +1 -1
- data/spec/lib/nrser/functions/tree/each_branch_spec.rb +3 -3
- data/spec/lib/nrser/functions/tree/transform_spec.rb +14 -15
- data/spec/lib/nrser/gem_ext/hamster/json_spec.rb +4 -0
- data/spec/lib/nrser/meta/source/location_spec.rb +86 -0
- data/spec/lib/nrser/props/immutable/hash_spec.rb +297 -0
- data/spec/lib/nrser/props/immutable/vector_spec.rb +296 -0
- data/spec/lib/nrser/{meta/props_spec.rb → props/original_props_spec.rb} +11 -16
- data/spec/lib/nrser/{meta/props → props}/to_and_from_data_spec.rb +10 -8
- data/spec/lib/nrser/refinements/array_spec.rb +2 -15
- data/spec/lib/nrser/refinements/erb_spec.rb +5 -7
- data/spec/lib/nrser/refinements/set_spec.rb +2 -15
- data/spec/lib/nrser/{env → sys/env}/path/insert_spec.rb +4 -2
- data/spec/lib/nrser/{env → sys/env}/path_spec.rb +4 -2
- data/spec/lib/nrser/types/array_spec.rb +8 -8
- data/spec/lib/nrser/types/paths_spec.rb +15 -18
- data/spec/spec_helper.rb +4 -0
- metadata +109 -69
- data/lib/nrser/ext/binding.rb +0 -36
- data/lib/nrser/ext/module.rb +0 -62
- data/lib/nrser/ext.rb +0 -8
- data/lib/nrser/functions/binding.rb +0 -76
- data/lib/nrser/functions/enumerable/map_keys.rb +0 -0
- data/lib/nrser/functions/enumerable/map_values.rb +0 -94
- data/lib/nrser/functions/hash/deep_merge.rb +0 -57
- data/lib/nrser/functions/hash/except_keys.rb +0 -44
- data/lib/nrser/functions/hash/slice_keys.rb +0 -43
- data/lib/nrser/functions/hash/stringify_keys.rb +0 -55
- data/lib/nrser/functions/hash/symbolize_keys.rb +0 -57
- data/lib/nrser/functions/hash/transform_keys.rb +0 -140
- data/lib/nrser/functions/module/methods.rb +0 -206
- data/lib/nrser/functions/module/source_locations.rb +0 -213
- data/lib/nrser/logging/appender.rb +0 -3
- data/lib/nrser/logging.rb +0 -353
- data/lib/nrser/meta/props/base.rb +0 -31
- data/lib/nrser/meta/props.rb +0 -357
- data/lib/nrser/refinements/array.rb +0 -133
- data/lib/nrser/refinements/binding.rb +0 -6
- data/lib/nrser/refinements/enumerator.rb +0 -5
- data/lib/nrser/refinements/exception.rb +0 -35
- data/lib/nrser/refinements/hash.rb +0 -150
- data/lib/nrser/refinements/module.rb +0 -5
- data/lib/nrser/refinements/object.rb +0 -42
- data/lib/nrser/refinements/open_struct.rb +0 -28
- data/lib/nrser/refinements/pathname.rb +0 -5
- data/lib/nrser/refinements/set.rb +0 -5
- data/lib/nrser/refinements/string.rb +0 -5
- data/lib/nrser/refinements/symbol.rb +0 -20
- data/lib/nrser/rspex/described.rb +0 -99
- data/spec/design/mapping_spec.rb +0 -42
- data/spec/lib/nrser/functions/hash_spec.rb +0 -41
- data/spec/lib/nrser/functions/string/truncate_spec.rb +0 -11
- data/spec/lib/nrser/refinements/truncate_spec.rb +0 -10
data/lib/nrser/meta/props.rb
DELETED
@@ -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,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
|