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