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
@@ -0,0 +1,77 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module NRSER
|
5
|
+
|
6
|
+
# @!group Module Functions
|
7
|
+
# ==========================================================================
|
8
|
+
|
9
|
+
# Core private method that supports all the other "method getters".
|
10
|
+
#
|
11
|
+
# @private
|
12
|
+
#
|
13
|
+
# @param [Module] mod
|
14
|
+
# Module in question.
|
15
|
+
#
|
16
|
+
# @param [Boolean] include_super
|
17
|
+
# When `true`, includes inherited class methods.
|
18
|
+
#
|
19
|
+
# @param [:class | :instance] type:
|
20
|
+
# Get class or instance methods.
|
21
|
+
#
|
22
|
+
# @param [Boolean] sort:
|
23
|
+
# If `true`, will sort the methods by name, which is usually
|
24
|
+
# the useful way to look at and use them.
|
25
|
+
#
|
26
|
+
# @return [Array<(Method | UnboundMethod)>]
|
27
|
+
# List of method objects (all bound to `mod`).
|
28
|
+
#
|
29
|
+
def self.method_objects_for mod,
|
30
|
+
include_super,
|
31
|
+
type:,
|
32
|
+
sort:,
|
33
|
+
include_initialize: false
|
34
|
+
initialize_method = nil
|
35
|
+
|
36
|
+
get_names, get_method = case type
|
37
|
+
when :class
|
38
|
+
[:methods, :method]
|
39
|
+
|
40
|
+
when :instance
|
41
|
+
if include_initialize
|
42
|
+
# Only way I can figure out to find out if it is defined it to try
|
43
|
+
# to get the object and handle the error
|
44
|
+
begin
|
45
|
+
initialize_method = mod.instance_method :initialize
|
46
|
+
rescue NameError => error
|
47
|
+
else
|
48
|
+
# Don't want to include it if we're not `include_super` and it's
|
49
|
+
# inherited from a different module
|
50
|
+
unless include_super || initialize_method.owner == mod
|
51
|
+
initialize_method = nil
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
[:instance_methods, :instance_method]
|
57
|
+
|
58
|
+
else
|
59
|
+
raise ArgumentError,
|
60
|
+
"`type:` must be `:class` or `:instance`, found #{ type.inspect }"
|
61
|
+
|
62
|
+
end # case type
|
63
|
+
|
64
|
+
methods = mod.send( get_names, include_super ).map { |name|
|
65
|
+
mod.send get_method, name
|
66
|
+
}
|
67
|
+
|
68
|
+
methods << initialize_method unless initialize_method.nil?
|
69
|
+
|
70
|
+
methods.sort! { |a, b| a.name <=> b.name } if sort
|
71
|
+
|
72
|
+
methods
|
73
|
+
end # .method_objects_for
|
74
|
+
|
75
|
+
# @!endgroup Module Functions
|
76
|
+
|
77
|
+
end # module NRSER
|
@@ -1,2 +1 @@
|
|
1
|
-
require_relative './module/
|
2
|
-
require_relative './module/source_locations'
|
1
|
+
require_relative './module/method_objects'
|
@@ -1,9 +1,4 @@
|
|
1
1
|
module NRSER
|
2
|
-
|
3
|
-
# Eigenclass (Singleton Class)
|
4
|
-
# ========================================================================
|
5
|
-
#
|
6
|
-
class << self
|
7
2
|
|
8
3
|
# Deeply convert a {Hash} to an {OpenStruct}.
|
9
4
|
#
|
@@ -14,7 +9,7 @@ module NRSER
|
|
14
9
|
# @raise [TypeError]
|
15
10
|
# If `hash` is not a {Hash}.
|
16
11
|
#
|
17
|
-
def to_open_struct hash, freeze: false
|
12
|
+
def self.to_open_struct hash, freeze: false
|
18
13
|
unless hash.is_a? Hash
|
19
14
|
raise TypeError,
|
20
15
|
"Argument must be hash (found #{ hash.inspect })"
|
@@ -23,38 +18,33 @@ module NRSER
|
|
23
18
|
_to_open_struct hash, freeze: freeze
|
24
19
|
end # #to_open_struct
|
25
20
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
# Just assume it's already taken care of if it's already an OpenStruct
|
33
|
-
value
|
34
|
-
|
35
|
-
when Hash
|
36
|
-
OpenStruct.new(
|
37
|
-
map_values(value) { |k, v| _to_open_struct v, freeze: freeze }
|
38
|
-
)
|
39
|
-
|
40
|
-
when Array
|
41
|
-
value.map { |v| _to_open_struct v, freeze: freeze }
|
42
|
-
|
43
|
-
when Set
|
44
|
-
Set.new value.map { |v| _to_open_struct v, freeze: freeze }
|
21
|
+
|
22
|
+
def self._to_open_struct value, freeze:
|
23
|
+
result = case value
|
24
|
+
when OpenStruct
|
25
|
+
# Just assume it's already taken care of if it's already an OpenStruct
|
26
|
+
value
|
45
27
|
|
46
|
-
|
47
|
-
|
48
|
-
|
28
|
+
when Hash
|
29
|
+
OpenStruct.new(
|
30
|
+
value.transform_values { |v| _to_open_struct v, freeze: freeze }
|
31
|
+
)
|
49
32
|
|
50
|
-
|
51
|
-
|
52
|
-
end
|
33
|
+
when Array
|
34
|
+
value.map { |v| _to_open_struct v, freeze: freeze }
|
53
35
|
|
54
|
-
|
55
|
-
|
56
|
-
|
36
|
+
when Set
|
37
|
+
Set.new value.map { |v| _to_open_struct v, freeze: freeze }
|
38
|
+
|
39
|
+
else
|
40
|
+
value
|
41
|
+
end
|
42
|
+
|
43
|
+
result.freeze if freeze
|
44
|
+
|
45
|
+
result
|
46
|
+
end # ._to_open_struct
|
57
47
|
|
58
|
-
|
48
|
+
private_class_method :_to_open_struct
|
59
49
|
|
60
50
|
end # module NRSER
|
data/lib/nrser/functions/proc.rb
CHANGED
@@ -41,7 +41,6 @@ module NRSER
|
|
41
41
|
end # .public_sender
|
42
42
|
|
43
43
|
singleton_class.send :alias_method, :sender, :public_sender
|
44
|
-
singleton_class.send :alias_method, :sndr, :public_sender
|
45
44
|
|
46
45
|
|
47
46
|
# Create a {Proc} that sends the arguments to a receiver via `#send`,
|
@@ -94,8 +93,6 @@ module NRSER
|
|
94
93
|
}
|
95
94
|
end # .chainer
|
96
95
|
|
97
|
-
singleton_class.send :alias_method, :chnr, :chainer
|
98
|
-
|
99
96
|
|
100
97
|
# Return a {Proc} that accepts a single argument that must respond to `#[]`
|
101
98
|
# and retrieves `key` from it.
|
@@ -107,9 +104,7 @@ module NRSER
|
|
107
104
|
#
|
108
105
|
def self.retriever key
|
109
106
|
->( indexed ) { indexed[key] }
|
110
|
-
end # .
|
111
|
-
|
112
|
-
singleton_class.send :alias_method, :rtvr, :retriever
|
107
|
+
end # .retriever
|
113
108
|
|
114
109
|
|
115
110
|
end # module NRSER
|
@@ -23,10 +23,16 @@ module NRSER
|
|
23
23
|
JSON_ARRAY_RE = /\A\s*\[.*\]\s*\z/m.freeze
|
24
24
|
|
25
25
|
|
26
|
+
# Regexp used to guess if a string is a JSON-encoded object.
|
27
|
+
#
|
28
|
+
# @return [Regexp]
|
29
|
+
#
|
30
|
+
JSON_OBJECT_RE = /\A\s*\{.*\}\s*\z/m.freeze
|
31
|
+
|
32
|
+
|
26
33
|
# Functions
|
27
34
|
# ============================================================================
|
28
35
|
|
29
|
-
|
30
36
|
# Test if a string looks like it might encode an array in JSON format by
|
31
37
|
# seeing if it's first non-whitespace character is `[` and last
|
32
38
|
# non-whitespace character is `]`.
|
@@ -41,4 +47,29 @@ module NRSER
|
|
41
47
|
!!( string =~ JSON_ARRAY_RE )
|
42
48
|
end # #looks_like_json_array
|
43
49
|
|
50
|
+
|
51
|
+
# Test if a string looks like it might encode an object in JSON format
|
52
|
+
# (JSON object becomes a {Hash} in Ruby) by seeing if it's first
|
53
|
+
# non-whitespace character is `{` and last non-whitespace character is `}`.
|
54
|
+
#
|
55
|
+
# @param [String] string
|
56
|
+
# String to test.
|
57
|
+
#
|
58
|
+
# @return [Boolean]
|
59
|
+
# `true` if we think `string` encodes a JSON object.
|
60
|
+
#
|
61
|
+
def self.looks_like_json_object? string
|
62
|
+
!!( string =~ JSON_OBJECT_RE )
|
63
|
+
end # .looks_like_json_object?
|
64
|
+
|
65
|
+
|
66
|
+
def self.looks_like_yaml_object? string
|
67
|
+
# YAML is (now) a super-set of JSON, so anything that looks like a JSON
|
68
|
+
# object is kosh
|
69
|
+
looks_like_json_object?( string ) || string.lines.all? { |line|
|
70
|
+
line.start_with?( '---', ' ', '#' ) || line =~ /[^\ ].*\:/
|
71
|
+
}
|
72
|
+
end
|
73
|
+
|
74
|
+
|
44
75
|
end # module NRSER
|
@@ -95,45 +95,6 @@ module NRSER
|
|
95
95
|
|
96
96
|
end # .lazy_filter_repeated_blank_lines
|
97
97
|
|
98
|
-
|
99
|
-
# Truncates a given +text+ after a given <tt>length</tt> if +text+ is longer than <tt>length</tt>:
|
100
|
-
#
|
101
|
-
# 'Once upon a time in a world far far away'.truncate(27)
|
102
|
-
# # => "Once upon a time in a wo..."
|
103
|
-
#
|
104
|
-
# Pass a string or regexp <tt>:separator</tt> to truncate +text+ at a natural break:
|
105
|
-
#
|
106
|
-
# 'Once upon a time in a world far far away'.truncate(27, separator: ' ')
|
107
|
-
# # => "Once upon a time in a..."
|
108
|
-
#
|
109
|
-
# 'Once upon a time in a world far far away'.truncate(27, separator: /\s/)
|
110
|
-
# # => "Once upon a time in a..."
|
111
|
-
#
|
112
|
-
# The last characters will be replaced with the <tt>:omission</tt> string (defaults to "...")
|
113
|
-
# for a total length not exceeding <tt>length</tt>:
|
114
|
-
#
|
115
|
-
# 'And they found that many people were sleeping better.'.truncate(25, omission: '... (continued)')
|
116
|
-
# # => "And they f... (continued)"
|
117
|
-
#
|
118
|
-
# adapted from
|
119
|
-
#
|
120
|
-
# <https://github.com/rails/rails/blob/7847a19f476fb9bee287681586d872ea43785e53/activesupport/lib/active_support/core_ext/string/filters.rb#L46>
|
121
|
-
#
|
122
|
-
def self.truncate(str, truncate_at, options = {})
|
123
|
-
return str.dup unless str.length > truncate_at
|
124
|
-
|
125
|
-
omission = options[:omission] || '...'
|
126
|
-
length_with_room_for_omission = truncate_at - omission.length
|
127
|
-
stop = \
|
128
|
-
if options[:separator]
|
129
|
-
str.rindex(options[:separator], length_with_room_for_omission) || length_with_room_for_omission
|
130
|
-
else
|
131
|
-
length_with_room_for_omission
|
132
|
-
end
|
133
|
-
|
134
|
-
"#{str[0, stop]}#{omission}"
|
135
|
-
end # .truncate
|
136
|
-
|
137
98
|
|
138
99
|
# Cut the middle out of a sliceable object with length and stick an ellipsis
|
139
100
|
# in there instead.
|
@@ -141,7 +102,7 @@ module NRSER
|
|
141
102
|
# Categorized with {String} functions 'cause that's where it started, and
|
142
103
|
# that's probably how it will primarily continue to be used, but tested to
|
143
104
|
# work on {Array} and should for other classes that satisfy the same
|
144
|
-
# slice and
|
105
|
+
# slice and interface.
|
145
106
|
#
|
146
107
|
# @param [V & #length & #slice & #<< & #+] source
|
147
108
|
# Source object. In practice, {String} and {Array} work. In theory,
|
data/lib/nrser/functions.rb
CHANGED
@@ -7,7 +7,6 @@ require_relative './functions/proc'
|
|
7
7
|
require_relative './functions/object'
|
8
8
|
require_relative './functions/string'
|
9
9
|
require_relative './functions/text'
|
10
|
-
require_relative './functions/binding'
|
11
10
|
require_relative './functions/exception'
|
12
11
|
require_relative './functions/enumerable'
|
13
12
|
require_relative './functions/hash'
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
# Requirements
|
5
|
+
# =======================================================================
|
6
|
+
|
7
|
+
# Stdlib
|
8
|
+
# -----------------------------------------------------------------------
|
9
|
+
|
10
|
+
# Topological sorting
|
11
|
+
require 'tsort'
|
12
|
+
|
13
|
+
|
14
|
+
# Declarations
|
15
|
+
# =======================================================================
|
16
|
+
|
17
|
+
module NRSER; end
|
18
|
+
module NRSER::Graph; end
|
19
|
+
|
20
|
+
|
21
|
+
# Definitions
|
22
|
+
# =======================================================================
|
23
|
+
|
24
|
+
# Topologically sorts an {Enumerable} by a user-provided `child_node` block.
|
25
|
+
#
|
26
|
+
class NRSER::Graph::TSorter
|
27
|
+
include TSort
|
28
|
+
|
29
|
+
def initialize entries, &each_child
|
30
|
+
@entries = entries
|
31
|
+
@each_child = each_child
|
32
|
+
end
|
33
|
+
|
34
|
+
def tsort_each_node &block
|
35
|
+
@entries.each &block
|
36
|
+
end
|
37
|
+
|
38
|
+
def tsort_each_child node, &block
|
39
|
+
@each_child.call node, &block
|
40
|
+
end
|
41
|
+
end # class NRSER::Graph::TSorter
|
@@ -0,0 +1,37 @@
|
|
1
|
+
class Binding
|
2
|
+
|
3
|
+
# Experimental "adaptive" call from local variable names.
|
4
|
+
#
|
5
|
+
def call_block *args, &block
|
6
|
+
arg_count = 0
|
7
|
+
arg_rest = false
|
8
|
+
call_kwds = {}
|
9
|
+
block.parameters.each do |type, name|
|
10
|
+
logger.debug "Processing", type: type, name: name
|
11
|
+
|
12
|
+
case type
|
13
|
+
when :req, :opt
|
14
|
+
arg_count += 1
|
15
|
+
when :keyreq, :key
|
16
|
+
if self.local_variable_defined? name
|
17
|
+
call_kwds[name] = self.local_variable_get name
|
18
|
+
end
|
19
|
+
when :rest
|
20
|
+
arg_rest = true
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
call_args = if arg_rest
|
25
|
+
args
|
26
|
+
else
|
27
|
+
args[0...arg_count]
|
28
|
+
end
|
29
|
+
|
30
|
+
logger.debug "CALLING WITH",
|
31
|
+
args: call_args,
|
32
|
+
kwds: call_kwds
|
33
|
+
|
34
|
+
block.call *call_args, **call_kwds
|
35
|
+
end
|
36
|
+
|
37
|
+
end # class Binding
|