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
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 866f9b21a10a8770d932228f5ad747e12782a4ba
|
4
|
+
data.tar.gz: bc50260a343986944cfe31e16d7d0e495360ab03
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0a77767059fb6d66420094f0e20f3fbad8e01e2cf37720df0ef0d20bd86f01193f85df842966a7f1e6fb8175b436f7abc0b5ee9cec6b802cec693ff02186cf0d
|
7
|
+
data.tar.gz: 93f5875dc928e78c86206b3552c5a3b7ac7b84b5af4dff1456498cc48a56b6d62d0582420e6a20cc64115f37c4968321bf1993dec1deb38ea8b5eec6901aa90f
|
data/lib/nrser/char.rb
CHANGED
@@ -0,0 +1,120 @@
|
|
1
|
+
class Array
|
2
|
+
include NRSER::Ext::Tree
|
3
|
+
|
4
|
+
|
5
|
+
# @return [Array]
|
6
|
+
# new array consisting of all elements after the first (which may be
|
7
|
+
# none, resulting in an empty array).
|
8
|
+
#
|
9
|
+
def rest
|
10
|
+
NRSER.rest self
|
11
|
+
end # #rest
|
12
|
+
|
13
|
+
|
14
|
+
def extract! &block
|
15
|
+
NRSER.extract_from_array! self, &block
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
# Calls {NRSER.ellipsis} on `self`.
|
20
|
+
def ellipsis *args
|
21
|
+
NRSER.ellipsis self, *args
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
# `to_*` Converters
|
26
|
+
# =====================================================================
|
27
|
+
|
28
|
+
# Checks that length is 2 and returns `self`.
|
29
|
+
#
|
30
|
+
# @return [Array]
|
31
|
+
# Array of length 2.
|
32
|
+
#
|
33
|
+
# @raise [TypeError]
|
34
|
+
# If length is not 2.
|
35
|
+
#
|
36
|
+
def to_pair
|
37
|
+
unless length == 2
|
38
|
+
raise TypeError,
|
39
|
+
"Array is not of length 2: #{ self.inspect }"
|
40
|
+
end
|
41
|
+
|
42
|
+
self
|
43
|
+
end # #to_pair
|
44
|
+
|
45
|
+
|
46
|
+
# To Operation Objects
|
47
|
+
# ---------------------------------------------------------------------
|
48
|
+
|
49
|
+
# Creates a new {NRSER::Message} from the array.
|
50
|
+
#
|
51
|
+
# @example
|
52
|
+
#
|
53
|
+
# message = [:fetch, :x].to_message
|
54
|
+
# message.send_to x: 'ex', y: 'why?'
|
55
|
+
# # => 'ex'
|
56
|
+
#
|
57
|
+
# @return [NRSER::Message]
|
58
|
+
#
|
59
|
+
def to_message
|
60
|
+
NRSER::Message.new *self
|
61
|
+
end # #to_message
|
62
|
+
|
63
|
+
alias_method :to_m, :to_message
|
64
|
+
|
65
|
+
|
66
|
+
# Create a {Proc} that accepts a single `receiver` and provides this array's
|
67
|
+
# entries as the arguments to `#public_send` (or `#send` if the `publicly`
|
68
|
+
# option is `false`).
|
69
|
+
#
|
70
|
+
# Equivalent to
|
71
|
+
#
|
72
|
+
# to_message.to_proc publicly: boolean
|
73
|
+
#
|
74
|
+
# @example
|
75
|
+
#
|
76
|
+
# [:fetch, :x].sender.call x: 'ex'
|
77
|
+
# # => 'ex'
|
78
|
+
#
|
79
|
+
# @param [Boolean] publicly:
|
80
|
+
# When `true`, uses `#public_send` in liu of `#send`.
|
81
|
+
#
|
82
|
+
# @return [Proc]
|
83
|
+
#
|
84
|
+
def to_sender publicly: true
|
85
|
+
to_message.to_proc publicly: publicly
|
86
|
+
end
|
87
|
+
|
88
|
+
|
89
|
+
# See {NRSER.chainer}.
|
90
|
+
#
|
91
|
+
def to_chainer publicly: true
|
92
|
+
NRSER.chainer self, publicly: publicly
|
93
|
+
end # #to_chainer
|
94
|
+
|
95
|
+
|
96
|
+
# Returns a lambda that calls accepts a single arg and calls `#dig` on it
|
97
|
+
# with the elements of *this* array as arguments.
|
98
|
+
#
|
99
|
+
# @example
|
100
|
+
# list = [{id: 1, name: "Neil"}, {id: 2, name: "Mica"}]
|
101
|
+
# list.assoc_by &[:id].to_digger
|
102
|
+
# # => {
|
103
|
+
# # 1 => {id: 1, name: "Neil"},
|
104
|
+
# # 2 => {id: 2, name: "Mica"},
|
105
|
+
# # }
|
106
|
+
#
|
107
|
+
# @todo
|
108
|
+
# I wanted to use `#to_proc` so that you could use `&[:id]`, but unary
|
109
|
+
# `&` doesn't invoke refinements, and I don't really want to monkey-patch
|
110
|
+
# anything, especially something as core as `#to_proc` and `Array`.
|
111
|
+
#
|
112
|
+
# @return [Proc]
|
113
|
+
# Lambda proc that accepts a single argument and calls `#dig` with this
|
114
|
+
# array's contents as the `#dig` arguments.
|
115
|
+
#
|
116
|
+
def to_digger
|
117
|
+
NRSER::Message.new( :dig, *self ).to_proc
|
118
|
+
end # #to_digger
|
119
|
+
|
120
|
+
end # class Array
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require_relative './string'
|
2
|
+
require_relative './enumerable'
|
3
|
+
|
4
|
+
# Extension methods for {Binding}
|
5
|
+
#
|
6
|
+
class Binding
|
7
|
+
|
8
|
+
# Calls {NRSER.template} with `self` prepended to `*args`
|
9
|
+
#
|
10
|
+
# @param (see NRSER.erb)
|
11
|
+
# @return (see NRSER.erb)
|
12
|
+
#
|
13
|
+
def erb source
|
14
|
+
require 'erb'
|
15
|
+
|
16
|
+
NRSER.filter_repeated_blank_lines(
|
17
|
+
NRSER.with_indent_tagged( NRSER.dedent( source ) ) { |tagged_str|
|
18
|
+
ERB.new( tagged_str ).result( self )
|
19
|
+
},
|
20
|
+
remove_leading: true
|
21
|
+
)
|
22
|
+
end
|
23
|
+
|
24
|
+
alias_method :template, :erb
|
25
|
+
|
26
|
+
|
27
|
+
# Get a {Hash} of all local variable names (as {Symbol}) to values.
|
28
|
+
#
|
29
|
+
# @return [Hash<Symbol, Object>]
|
30
|
+
#
|
31
|
+
def locals
|
32
|
+
self.local_variables.assoc_to { |symbol| local_variable_get symbol }
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
# Get a {Array} of all local variable values.
|
37
|
+
#
|
38
|
+
# @return [Array<Object>]
|
39
|
+
#
|
40
|
+
def local_values
|
41
|
+
self.local_variables.map { |symbol| local_variable_get symbol }
|
42
|
+
end
|
43
|
+
|
44
|
+
end # class Binding
|
@@ -1,25 +1,20 @@
|
|
1
|
-
module
|
2
|
-
|
3
|
-
# @!group Enumerable Functions
|
1
|
+
module Enumerable
|
4
2
|
|
5
3
|
# Find the first truthy (not `nil` or `false`) result of calling `&block`
|
6
|
-
#
|
4
|
+
# on entries.
|
7
5
|
#
|
8
|
-
# Like {Enumerable#find},
|
6
|
+
# Like {Enumerable#find}, accepts an optional `ifnone` procedure to call if
|
9
7
|
# no match is found.
|
10
8
|
#
|
11
9
|
# @example
|
12
10
|
#
|
13
|
-
#
|
11
|
+
# [1, 2, 3, 4].find_map do |i|
|
14
12
|
# if i.even?
|
15
13
|
# "#{ i } is even!"
|
16
14
|
# end
|
17
15
|
# end
|
18
16
|
# # => "2 is even!"
|
19
17
|
#
|
20
|
-
# @param [Enumerable<E>] enum
|
21
|
-
# Entries to search (in order).
|
22
|
-
#
|
23
18
|
# @param [nil | Proc<()=>DEFAULT>] ifnone
|
24
19
|
# Optional lambda to call for the return value when no match is found.
|
25
20
|
#
|
@@ -27,19 +22,27 @@ module NRSER
|
|
27
22
|
# Block mapping entires to results.
|
28
23
|
#
|
29
24
|
# @return [nil]
|
30
|
-
# When `block.call( E )` is `nil` or `false` for all `E`
|
25
|
+
# When `block.call( E )` is `nil` or `false` for all entries `E`
|
31
26
|
# *and* `ifnone` is `nil` or not provided.
|
32
27
|
#
|
33
28
|
# @return [V]
|
34
|
-
# When `block.call( E )` is `nil` or `false` for all `E`
|
29
|
+
# When `block.call( E )` is `nil` or `false` for all entries `E`
|
35
30
|
# *and* `ifnone` is a lambda that returns `DEFAULT`.
|
36
31
|
#
|
37
|
-
# @return [
|
32
|
+
# @return [RESULT]
|
38
33
|
# The first result `RESLUT = block.call( E )`
|
39
34
|
# where `RESLUT` is not `nil` or `false`.
|
40
35
|
#
|
41
|
-
|
42
|
-
|
36
|
+
# @return [DEFAULT]
|
37
|
+
# When `ifnone` procedure is provided and `&block` returns `nil` or
|
38
|
+
# `false` for all entries.
|
39
|
+
#
|
40
|
+
# @return [nil]
|
41
|
+
# When `ifnone` procedure is *not* provided and `&block` returns `nil` or
|
42
|
+
# `false` for all entries.
|
43
|
+
#
|
44
|
+
def find_map ifnone = nil, &block
|
45
|
+
each do |entry|
|
43
46
|
if result = block.call( entry )
|
44
47
|
# Found a match, short-circuit
|
45
48
|
return result
|
@@ -48,6 +51,6 @@ module NRSER
|
|
48
51
|
|
49
52
|
# No matches, return `ifnone`
|
50
53
|
ifnone.call if ifnone
|
51
|
-
end #
|
54
|
+
end # #find_map
|
52
55
|
|
53
56
|
end # module NRSER
|
@@ -1,15 +1,9 @@
|
|
1
|
-
|
1
|
+
require_relative './enumerable/find_map'
|
2
|
+
|
3
|
+
|
4
|
+
# Instance methods to extend {Enumerable}.
|
2
5
|
#
|
3
|
-
|
4
|
-
# and may be independently used as well.
|
5
|
-
#
|
6
|
-
module NRSER::Ext::Enumerable
|
7
|
-
|
8
|
-
# See {NRSER.map_values}
|
9
|
-
def map_values &block
|
10
|
-
NRSER.map_values self, &block
|
11
|
-
end
|
12
|
-
|
6
|
+
module Enumerable
|
13
7
|
|
14
8
|
# See {NRSER.find_bounded}
|
15
9
|
def find_bounded bounds, &block
|
@@ -24,17 +18,14 @@ module NRSER::Ext::Enumerable
|
|
24
18
|
|
25
19
|
|
26
20
|
# See {NRSER.assoc_by}
|
27
|
-
def assoc_by &block
|
28
|
-
NRSER.assoc_by self, &block
|
21
|
+
def assoc_by *args, &block
|
22
|
+
NRSER.assoc_by self, *args, &block
|
29
23
|
end
|
30
24
|
|
31
|
-
# Old name
|
32
|
-
alias_method :to_h_by, :assoc_by
|
33
|
-
|
34
25
|
|
35
26
|
# See {NRSER.assoc_to}
|
36
|
-
def assoc_to &block
|
37
|
-
NRSER.assoc_to
|
27
|
+
def assoc_to *args, &block
|
28
|
+
NRSER.assoc_to self, *args, &block
|
38
29
|
end
|
39
30
|
|
40
31
|
|
@@ -68,15 +59,10 @@ module NRSER::Ext::Enumerable
|
|
68
59
|
end
|
69
60
|
|
70
61
|
|
71
|
-
# See {NRSER.find_map}
|
72
|
-
def find_map *args, &block
|
73
|
-
NRSER.find_map self, *args, &block
|
74
|
-
end
|
75
|
-
|
76
62
|
# See {NRSER.slice?}
|
77
63
|
def slice? *args, &block
|
78
64
|
NRSER.slice? self, *args, &block
|
79
65
|
end
|
80
66
|
|
81
67
|
|
82
|
-
end # module
|
68
|
+
end # module Enumerable
|
@@ -0,0 +1,30 @@
|
|
1
|
+
class Exception
|
2
|
+
def format
|
3
|
+
NRSER.format_exception self
|
4
|
+
end
|
5
|
+
|
6
|
+
# Create a new instance from the squished message.
|
7
|
+
#
|
8
|
+
# See {NRSER.squish}.
|
9
|
+
#
|
10
|
+
# @param [String] message
|
11
|
+
#
|
12
|
+
# @return [Exception]
|
13
|
+
#
|
14
|
+
def self.squished message
|
15
|
+
new NRSER.squish( message )
|
16
|
+
end
|
17
|
+
|
18
|
+
# Create a new instance from the dedented message.
|
19
|
+
#
|
20
|
+
# See {NRSER.dedent}.
|
21
|
+
#
|
22
|
+
# @param [String] message
|
23
|
+
#
|
24
|
+
# @return [Exception]
|
25
|
+
#
|
26
|
+
def self.dedented message
|
27
|
+
new NRSER.dedent( message )
|
28
|
+
end
|
29
|
+
|
30
|
+
end # NRSER
|
@@ -0,0 +1,49 @@
|
|
1
|
+
class Hash
|
2
|
+
# Like {#extract!} combined with {Hash#values_at} - extracts `keys` and
|
3
|
+
# appends (via `#<<`) the values to `into` (in order of `keys`).
|
4
|
+
#
|
5
|
+
# `into` default to an empty Array.
|
6
|
+
#
|
7
|
+
# @example Basic Usage
|
8
|
+
# hash = { a: 1, b: 2, c: 3, d: 4 }
|
9
|
+
#
|
10
|
+
# hash.extract_values_at! :a, :b
|
11
|
+
# # => [1, 2]
|
12
|
+
#
|
13
|
+
# hash
|
14
|
+
# # => {c: 3, d: 4}
|
15
|
+
#
|
16
|
+
# hash = { a: 1, b: 2, c: 3, d: 4 }
|
17
|
+
#
|
18
|
+
# hash.extract_values_at! :b, :a
|
19
|
+
# # => [2, 1]
|
20
|
+
#
|
21
|
+
# hash
|
22
|
+
# # => {c: 3, d: 4}
|
23
|
+
#
|
24
|
+
# @example Custom `into
|
25
|
+
# hash = { a: 1, b: 2, c: 3, d: 4 }
|
26
|
+
# into = Set[1, 3, 5]
|
27
|
+
#
|
28
|
+
# hash.extract_values_at! :a, :b, into: into
|
29
|
+
# # => #<Set: {1, 3, 5, 2}>
|
30
|
+
#
|
31
|
+
# hash
|
32
|
+
# # => {:c=>3, :d=>4}
|
33
|
+
#
|
34
|
+
# @param *keys
|
35
|
+
# Hash keys to extract.
|
36
|
+
#
|
37
|
+
# @param [#<<] into:
|
38
|
+
# Object to extract values at `keys` into.
|
39
|
+
#
|
40
|
+
# @return [into]
|
41
|
+
# The `into` object with the extracted values (if any are found).
|
42
|
+
#
|
43
|
+
def extract_values_at! *keys, into: []
|
44
|
+
keys.each_with_object( into ) { |key, result|
|
45
|
+
result << delete(key) if has_key?( key )
|
46
|
+
}
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
class Hash
|
2
|
+
# Just like {Hash#transform_values} but yields `key, value`.
|
3
|
+
#
|
4
|
+
def transform_values_with_keys &block
|
5
|
+
return enum_for( __method__ ) { size } unless block_given?
|
6
|
+
return {} if empty?
|
7
|
+
result = self.class.new
|
8
|
+
each do |key, value|
|
9
|
+
result[key] = block.call key, value
|
10
|
+
end
|
11
|
+
result
|
12
|
+
end
|
13
|
+
|
14
|
+
|
15
|
+
# Just like {#transform_values_with_keys} but mutates `self`.
|
16
|
+
#
|
17
|
+
def transform_values_with_keys! &block
|
18
|
+
return enum_for( __method__ ) { size } unless block_given?
|
19
|
+
each do |key, value|
|
20
|
+
self[key] = block.call key, value
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'active_support/core_ext/hash'
|
2
|
+
|
3
|
+
require 'nrser/ext/tree'
|
4
|
+
|
5
|
+
require_relative './hash/extract_values_at'
|
6
|
+
require_relative './hash/transform_values_with_keys'
|
7
|
+
|
8
|
+
class Hash
|
9
|
+
include NRSER::Ext::Tree
|
10
|
+
|
11
|
+
# Short names
|
12
|
+
alias_method :sym_keys!, :symbolize_keys!
|
13
|
+
alias_method :sym_keys, :symbolize_keys
|
14
|
+
|
15
|
+
alias_method :str_keys!, :stringify_keys!
|
16
|
+
alias_method :str_keys, :stringify_keys
|
17
|
+
|
18
|
+
|
19
|
+
# See {NRSER.bury!}
|
20
|
+
def bury! key_path,
|
21
|
+
value,
|
22
|
+
parsed_key_type: :guess,
|
23
|
+
clobber: false
|
24
|
+
NRSER.bury! self,
|
25
|
+
key_path,
|
26
|
+
value,
|
27
|
+
parsed_key_type: parsed_key_type,
|
28
|
+
clobber: clobber
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
# Checks that `self` contains a single key/value pair (`#length` of 1)
|
33
|
+
# and returns it as an array of length 2.
|
34
|
+
#
|
35
|
+
# @return [Array]
|
36
|
+
# Array of length 2.
|
37
|
+
#
|
38
|
+
# @raise [TypeError]
|
39
|
+
# If `self` has more than one key/value pair.
|
40
|
+
#
|
41
|
+
def to_pair
|
42
|
+
unless length == 1
|
43
|
+
raise TypeError,
|
44
|
+
"Hash has more than one pair: #{ self.inspect }"
|
45
|
+
end
|
46
|
+
|
47
|
+
first
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
# Extension methods for {Module}
|
2
|
+
#
|
3
|
+
class Module
|
4
|
+
|
5
|
+
# @!group {Method} Object Readers
|
6
|
+
# ==========================================================================
|
7
|
+
|
8
|
+
# Get class methods for this {Module} ({Class} are also {Module}, so works
|
9
|
+
# same for those).
|
10
|
+
#
|
11
|
+
# @param include_super (see NRSER.method_objects_for)
|
12
|
+
# @param sort: (see NRSER.method_objects_for)
|
13
|
+
#
|
14
|
+
# @return [Array<Method>]
|
15
|
+
# List of method objects (all bound to `self`).
|
16
|
+
#
|
17
|
+
def class_method_objects include_super = true, sort: true
|
18
|
+
NRSER.method_objects_for self,
|
19
|
+
include_super,
|
20
|
+
type: :class,
|
21
|
+
sort: sort
|
22
|
+
end
|
23
|
+
|
24
|
+
alias_method :class_Methods, :class_method_objects
|
25
|
+
|
26
|
+
|
27
|
+
# Just get the class methods defined in this module (or class) itself,
|
28
|
+
# omitting inherited ones.
|
29
|
+
#
|
30
|
+
# Equivalent to
|
31
|
+
#
|
32
|
+
# #class_method_objects false
|
33
|
+
#
|
34
|
+
# @param sort: (see .class_method_objects)
|
35
|
+
# @return (see .class_method_objects)
|
36
|
+
#
|
37
|
+
def own_class_method_objects sort: true
|
38
|
+
class_method_objects false, sort: sort
|
39
|
+
end
|
40
|
+
|
41
|
+
alias_method :own_class_Methods, :own_class_method_objects
|
42
|
+
|
43
|
+
|
44
|
+
# Get instance methods for this {Module} (or {Class}).
|
45
|
+
#
|
46
|
+
# @param include_super (see NRSER.method_objects_for)
|
47
|
+
# @param sort: (see NRSER.method_objects_for)
|
48
|
+
#
|
49
|
+
# @param [Boolean] include_initialize:
|
50
|
+
# When `true`, include `#initialize` method if it's defined, which is
|
51
|
+
# normally excluded from {Module#instance_methods}.
|
52
|
+
#
|
53
|
+
# Respects `include_super` - won't include it if we are only looking for
|
54
|
+
# own instance methods and it's inherited.
|
55
|
+
#
|
56
|
+
# @return [Array<UnboundMethod>]
|
57
|
+
# List of method objects (all unbound).
|
58
|
+
#
|
59
|
+
def instance_method_objects include_super = true,
|
60
|
+
sort: true,
|
61
|
+
include_initialize: false
|
62
|
+
NRSER.method_objects_for \
|
63
|
+
self,
|
64
|
+
include_super,
|
65
|
+
type: :instance,
|
66
|
+
sort: sort,
|
67
|
+
include_initialize: include_initialize
|
68
|
+
end # #instance_method_objects
|
69
|
+
|
70
|
+
alias_method :instance_Methods, :instance_method_objects
|
71
|
+
|
72
|
+
|
73
|
+
# Just get the instance methods defined in this {Module} (or {Class}) itself,
|
74
|
+
# omitting inherited ones.
|
75
|
+
#
|
76
|
+
# Equivalent to
|
77
|
+
#
|
78
|
+
# #instance_method_objects false
|
79
|
+
#
|
80
|
+
# @param sort: (see #instance_method_objects)
|
81
|
+
# @param include_initialize: (see #instance_method_objects)
|
82
|
+
#
|
83
|
+
# @return (see #instance_method_objects)
|
84
|
+
#
|
85
|
+
def own_instance_method_objects sort: true,
|
86
|
+
include_initialize: false
|
87
|
+
instance_method_objects false,
|
88
|
+
sort: sort,
|
89
|
+
include_initialize: include_initialize
|
90
|
+
end
|
91
|
+
|
92
|
+
alias_method :own_instance_Methods, :own_instance_method_objects
|
93
|
+
|
94
|
+
# @!endgroup {Method} Object Readers
|
95
|
+
|
96
|
+
end # class Module
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
# Requirements
|
5
|
+
# =======================================================================
|
6
|
+
|
7
|
+
# Stdlib
|
8
|
+
# -----------------------------------------------------------------------
|
9
|
+
|
10
|
+
# Deps
|
11
|
+
# -----------------------------------------------------------------------
|
12
|
+
|
13
|
+
# Need {String#demodulize}
|
14
|
+
require 'active_support/core_ext/string/inflections'
|
15
|
+
|
16
|
+
|
17
|
+
# Project / Package
|
18
|
+
# -----------------------------------------------------------------------
|
19
|
+
|
20
|
+
|
21
|
+
# Definitions
|
22
|
+
# =======================================================================
|
23
|
+
|
24
|
+
class Module
|
25
|
+
|
26
|
+
# Like {Module#name} but also returns a {String} for anonymous classes.
|
27
|
+
#
|
28
|
+
# So you don't need to do any testing or trying when you want to work
|
29
|
+
# with the name of a module (or class, which are modules).
|
30
|
+
#
|
31
|
+
# @return [String]
|
32
|
+
#
|
33
|
+
def safe_name
|
34
|
+
name = self.name
|
35
|
+
return name if name.is_a? String
|
36
|
+
|
37
|
+
# Slice out whatever that hex thingy that anon modules dump in their
|
38
|
+
# `#to_s`... `"#<Class:0x00007fa6958c1700>" => "0x00007fa6958c1700"`
|
39
|
+
#
|
40
|
+
# Might as well use that as an identifier so it matches their `#to_s`,
|
41
|
+
# and this should still succeed in whatever funky way even if `#to_s`
|
42
|
+
# returns something totally unexpected.
|
43
|
+
#
|
44
|
+
to_s_hex = self.to_s.split( ':' ).last[0...-1]
|
45
|
+
|
46
|
+
type_name = if self.is_a?( Class ) then "Class" else "Module" end
|
47
|
+
|
48
|
+
"Anon#{ type_name }_#{ to_s_hex }"
|
49
|
+
end # #safe_name
|
50
|
+
|
51
|
+
|
52
|
+
# Get the {#safe_name} and run ActiveSupport's {String#demodulize} on it
|
53
|
+
# to get the module (or class) name without the namespace.
|
54
|
+
#
|
55
|
+
# @example
|
56
|
+
# NRSER::Types.demod_name
|
57
|
+
# # => 'Types'
|
58
|
+
#
|
59
|
+
# @return [String]
|
60
|
+
#
|
61
|
+
def demodulize_name
|
62
|
+
safe_name.demodulize
|
63
|
+
end # #demodulize_name
|
64
|
+
|
65
|
+
# Because I always screw up spelling 'demodulize'
|
66
|
+
alias_method :demod_name, :demodulize_name
|
67
|
+
|
68
|
+
|
69
|
+
end
|