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.
Files changed (188) hide show
  1. checksums.yaml +4 -4
  2. data/lib/nrser/char/alpha_numeric_sub.rb +1 -2
  3. data/lib/nrser/char.rb +0 -6
  4. data/lib/nrser/core_ext/array.rb +120 -0
  5. data/lib/nrser/core_ext/binding.rb +44 -0
  6. data/lib/nrser/{functions → core_ext}/enumerable/find_map.rb +18 -15
  7. data/lib/nrser/{ext → core_ext}/enumerable.rb +10 -24
  8. data/lib/nrser/core_ext/exception.rb +30 -0
  9. data/lib/nrser/core_ext/hash/extract_values_at.rb +49 -0
  10. data/lib/nrser/core_ext/hash/transform_values_with_keys.rb +24 -0
  11. data/lib/nrser/core_ext/hash.rb +50 -0
  12. data/lib/nrser/core_ext/module/method_objects.rb +96 -0
  13. data/lib/nrser/core_ext/module/names.rb +69 -0
  14. data/lib/nrser/core_ext/module/source_locations.rb +214 -0
  15. data/lib/nrser/core_ext/module.rb +2 -0
  16. data/lib/nrser/core_ext/object/lazy_var.rb +31 -0
  17. data/lib/nrser/core_ext/object.rb +46 -0
  18. data/lib/nrser/core_ext/open_struct.rb +6 -0
  19. data/lib/nrser/{ext → core_ext}/pathname.rb +8 -5
  20. data/lib/nrser/{ext → core_ext}/string.rb +6 -12
  21. data/lib/nrser/core_ext/symbol.rb +13 -0
  22. data/lib/nrser/core_ext/time.rb +46 -0
  23. data/lib/nrser/core_ext.rb +13 -0
  24. data/lib/nrser/errors/abstract_method_error.rb +150 -0
  25. data/lib/nrser/errors/argument_error.rb +42 -0
  26. data/lib/nrser/errors/nicer_error.rb +298 -72
  27. data/lib/nrser/errors/type_error.rb +46 -0
  28. data/lib/nrser/errors.rb +4 -53
  29. data/lib/nrser/ext/tree.rb +3 -0
  30. data/lib/nrser/functions/enumerable/associate.rb +6 -9
  31. data/lib/nrser/functions/enumerable/include_slice.rb +2 -3
  32. data/lib/nrser/functions/enumerable.rb +1 -3
  33. data/lib/nrser/functions/exception.rb +1 -1
  34. data/lib/nrser/functions/hash.rb +0 -6
  35. data/lib/nrser/functions/merge_by.rb +2 -2
  36. data/lib/nrser/functions/module/method_objects.rb +77 -0
  37. data/lib/nrser/functions/module.rb +1 -2
  38. data/lib/nrser/functions/open_struct.rb +25 -35
  39. data/lib/nrser/functions/proc.rb +1 -6
  40. data/lib/nrser/functions/string/looks_like.rb +32 -1
  41. data/lib/nrser/functions/string.rb +1 -40
  42. data/lib/nrser/functions/text/lines.rb +2 -1
  43. data/lib/nrser/functions.rb +0 -1
  44. data/lib/nrser/graph/tsorter.rb +41 -0
  45. data/lib/nrser/labs/core_ext/binding.rb +37 -0
  46. data/lib/nrser/labs/stash.rb +372 -0
  47. data/lib/nrser/{logging → log}/appender/sync.rb +3 -3
  48. data/lib/nrser/log/appender.rb +3 -0
  49. data/lib/nrser/{logging → log}/formatters/color.rb +47 -20
  50. data/lib/nrser/log/formatters/mixin.rb +270 -0
  51. data/lib/nrser/{logging → log}/formatters.rb +0 -0
  52. data/lib/nrser/log/logger.rb +229 -0
  53. data/lib/nrser/log/mixin.rb +56 -0
  54. data/lib/nrser/log.rb +723 -0
  55. data/lib/nrser/message.rb +24 -3
  56. data/lib/nrser/meta/source/location.rb +158 -0
  57. data/lib/nrser/meta.rb +1 -1
  58. data/lib/nrser/props/class_methods.rb +118 -0
  59. data/lib/nrser/props/immutable/hash.rb +111 -0
  60. data/lib/nrser/props/immutable/hash_variable.rb +82 -0
  61. data/lib/nrser/props/immutable/instance_variables.rb +48 -0
  62. data/lib/nrser/props/immutable/vector.rb +107 -0
  63. data/lib/nrser/props/instance_methods.rb +184 -0
  64. data/lib/nrser/props/metadata.rb +359 -0
  65. data/lib/nrser/props/mutable/instance_variables.rb +60 -0
  66. data/lib/nrser/props/mutable/stash.rb +199 -0
  67. data/lib/nrser/{meta/props → props}/prop.rb +217 -112
  68. data/lib/nrser/props/storage/instance_variable.rb +85 -0
  69. data/lib/nrser/props/storage/instance_variables.rb +67 -0
  70. data/lib/nrser/props/storage/key.rb +88 -0
  71. data/lib/nrser/props.rb +9 -0
  72. data/lib/nrser/refinements/sugar.rb +41 -0
  73. data/lib/nrser/refinements/types.rb +2 -2
  74. data/lib/nrser/refinements.rb +14 -16
  75. data/lib/nrser/rspex/example_group/describe_attribute.rb +24 -0
  76. data/lib/nrser/rspex/example_group/describe_called_with.rb +1 -6
  77. data/lib/nrser/rspex/example_group/{describe_use_case.rb → describe_case.rb} +6 -3
  78. data/lib/nrser/rspex/example_group/describe_class.rb +1 -0
  79. data/lib/nrser/rspex/example_group/describe_group.rb +29 -0
  80. data/lib/nrser/rspex/example_group/describe_instance_method.rb +2 -2
  81. data/lib/nrser/rspex/example_group/describe_message.rb +35 -0
  82. data/lib/nrser/rspex/example_group/describe_method.rb +23 -2
  83. data/lib/nrser/rspex/example_group/describe_module.rb +19 -0
  84. data/lib/nrser/rspex/example_group/describe_response_to.rb +32 -0
  85. data/lib/nrser/rspex/example_group/describe_section.rb +38 -0
  86. data/lib/nrser/rspex/example_group/describe_sent_to.rb +52 -0
  87. data/lib/nrser/rspex/example_group/describe_source_file.rb +49 -0
  88. data/lib/nrser/rspex/example_group/describe_spec_file.rb +41 -108
  89. data/lib/nrser/rspex/example_group/describe_when.rb +14 -7
  90. data/lib/nrser/rspex/example_group/describe_x.rb +39 -12
  91. data/lib/nrser/rspex/example_group/overrides.rb +66 -0
  92. data/lib/nrser/rspex/example_group.rb +20 -252
  93. data/lib/nrser/rspex/format.rb +83 -17
  94. data/lib/nrser/rspex.rb +4 -34
  95. data/lib/nrser/sugar/method_missing_forwarder.rb +50 -0
  96. data/lib/nrser/{env → sys/env}/path.rb +1 -2
  97. data/lib/nrser/{env.rb → sys/env.rb} +2 -1
  98. data/lib/nrser/sys.rb +5 -0
  99. data/lib/nrser/types/any.rb +36 -7
  100. data/lib/nrser/types/{array.rb → arrays.rb} +32 -81
  101. data/lib/nrser/types/attrs.rb +68 -15
  102. data/lib/nrser/types/booleans.rb +95 -34
  103. data/lib/nrser/types/bounded.rb +12 -10
  104. data/lib/nrser/types/combinators.rb +74 -37
  105. data/lib/nrser/types/errors/check_error.rb +86 -0
  106. data/lib/nrser/types/errors/from_string_error.rb +82 -0
  107. data/lib/nrser/types/factory.rb +91 -0
  108. data/lib/nrser/types/hashes.rb +171 -26
  109. data/lib/nrser/types/in.rb +25 -12
  110. data/lib/nrser/types/is.rb +50 -18
  111. data/lib/nrser/types/is_a.rb +52 -33
  112. data/lib/nrser/types/labels.rb +6 -33
  113. data/lib/nrser/types/maybe.rb +12 -4
  114. data/lib/nrser/types/nil.rb +24 -4
  115. data/lib/nrser/types/not.rb +6 -16
  116. data/lib/nrser/types/numbers.rb +94 -57
  117. data/lib/nrser/types/pairs.rb +57 -57
  118. data/lib/nrser/types/paths.rb +112 -133
  119. data/lib/nrser/types/responds.rb +64 -74
  120. data/lib/nrser/types/shape.rb +29 -24
  121. data/lib/nrser/types/strings.rb +25 -17
  122. data/lib/nrser/types/symbols.rb +19 -17
  123. data/lib/nrser/types/trees.rb +18 -70
  124. data/lib/nrser/types/tuples.rb +36 -40
  125. data/lib/nrser/types/type.rb +342 -91
  126. data/lib/nrser/types/when.rb +40 -18
  127. data/lib/nrser/types/where.rb +94 -9
  128. data/lib/nrser/types.rb +72 -63
  129. data/lib/nrser/version.rb +1 -1
  130. data/lib/nrser.rb +18 -18
  131. data/spec/lib/nrser/{functions/binding/template_spec.rb → core_ext/binding/erb_spec.rb} +5 -5
  132. data/spec/lib/nrser/{functions → core_ext}/enumerable/find_map_spec.rb +8 -6
  133. data/spec/lib/nrser/{refinements → core_ext}/hash_spec.rb +9 -22
  134. data/spec/lib/nrser/errors/abstract_method_error_spec.rb +12 -5
  135. data/spec/lib/nrser/functions/enumerable/{to_h_by_spec.rb → associate_spec.rb} +1 -1
  136. data/spec/lib/nrser/functions/merge_by_spec.rb +1 -1
  137. data/spec/lib/nrser/functions/tree/each_branch_spec.rb +3 -3
  138. data/spec/lib/nrser/functions/tree/transform_spec.rb +14 -15
  139. data/spec/lib/nrser/gem_ext/hamster/json_spec.rb +4 -0
  140. data/spec/lib/nrser/meta/source/location_spec.rb +86 -0
  141. data/spec/lib/nrser/props/immutable/hash_spec.rb +297 -0
  142. data/spec/lib/nrser/props/immutable/vector_spec.rb +296 -0
  143. data/spec/lib/nrser/{meta/props_spec.rb → props/original_props_spec.rb} +11 -16
  144. data/spec/lib/nrser/{meta/props → props}/to_and_from_data_spec.rb +10 -8
  145. data/spec/lib/nrser/refinements/array_spec.rb +2 -15
  146. data/spec/lib/nrser/refinements/erb_spec.rb +5 -7
  147. data/spec/lib/nrser/refinements/set_spec.rb +2 -15
  148. data/spec/lib/nrser/{env → sys/env}/path/insert_spec.rb +4 -2
  149. data/spec/lib/nrser/{env → sys/env}/path_spec.rb +4 -2
  150. data/spec/lib/nrser/types/array_spec.rb +8 -8
  151. data/spec/lib/nrser/types/paths_spec.rb +15 -18
  152. data/spec/spec_helper.rb +4 -0
  153. metadata +109 -69
  154. data/lib/nrser/ext/binding.rb +0 -36
  155. data/lib/nrser/ext/module.rb +0 -62
  156. data/lib/nrser/ext.rb +0 -8
  157. data/lib/nrser/functions/binding.rb +0 -76
  158. data/lib/nrser/functions/enumerable/map_keys.rb +0 -0
  159. data/lib/nrser/functions/enumerable/map_values.rb +0 -94
  160. data/lib/nrser/functions/hash/deep_merge.rb +0 -57
  161. data/lib/nrser/functions/hash/except_keys.rb +0 -44
  162. data/lib/nrser/functions/hash/slice_keys.rb +0 -43
  163. data/lib/nrser/functions/hash/stringify_keys.rb +0 -55
  164. data/lib/nrser/functions/hash/symbolize_keys.rb +0 -57
  165. data/lib/nrser/functions/hash/transform_keys.rb +0 -140
  166. data/lib/nrser/functions/module/methods.rb +0 -206
  167. data/lib/nrser/functions/module/source_locations.rb +0 -213
  168. data/lib/nrser/logging/appender.rb +0 -3
  169. data/lib/nrser/logging.rb +0 -353
  170. data/lib/nrser/meta/props/base.rb +0 -31
  171. data/lib/nrser/meta/props.rb +0 -357
  172. data/lib/nrser/refinements/array.rb +0 -133
  173. data/lib/nrser/refinements/binding.rb +0 -6
  174. data/lib/nrser/refinements/enumerator.rb +0 -5
  175. data/lib/nrser/refinements/exception.rb +0 -35
  176. data/lib/nrser/refinements/hash.rb +0 -150
  177. data/lib/nrser/refinements/module.rb +0 -5
  178. data/lib/nrser/refinements/object.rb +0 -42
  179. data/lib/nrser/refinements/open_struct.rb +0 -28
  180. data/lib/nrser/refinements/pathname.rb +0 -5
  181. data/lib/nrser/refinements/set.rb +0 -5
  182. data/lib/nrser/refinements/string.rb +0 -5
  183. data/lib/nrser/refinements/symbol.rb +0 -20
  184. data/lib/nrser/rspex/described.rb +0 -99
  185. data/spec/design/mapping_spec.rb +0 -42
  186. data/spec/lib/nrser/functions/hash_spec.rb +0 -41
  187. data/spec/lib/nrser/functions/string/truncate_spec.rb +0 -11
  188. data/spec/lib/nrser/refinements/truncate_spec.rb +0 -10
@@ -1,44 +0,0 @@
1
- # Definitions
2
- # =======================================================================
3
-
4
- module NRSER
5
-
6
- # @!group Hash Functions
7
-
8
- # Removes the given keys from hash and returns it.
9
- #
10
- # Lifted from ActiveSupport.
11
- #
12
- # @see http://www.rubydoc.info/gems/activesupport/5.1.3/Hash:except!
13
- #
14
- # @param [Hash] hash
15
- # Hash to mutate.
16
- #
17
- # @return [Hash]
18
- #
19
- def self.except_keys! hash, *keys
20
- keys.each { |key| hash.delete(key) }
21
- hash
22
- end
23
-
24
- singleton_class.send :alias_method, :omit_keys!, :except_keys!
25
-
26
-
27
- # Returns a new hash without `keys`.
28
- #
29
- # Lifted from ActiveSupport.
30
- #
31
- # @see http://www.rubydoc.info/gems/activesupport/5.1.3/Hash:except
32
- #
33
- # @param [Hash] hash
34
- # Source hash.
35
- #
36
- # @return [Hash]
37
- #
38
- def self.except_keys hash, *keys
39
- except_keys! hash.dup, *keys
40
- end
41
-
42
- singleton_class.send :alias_method, :omit_keys, :except_keys
43
-
44
- end # module NRSER
@@ -1,43 +0,0 @@
1
- # Definitions
2
- # =======================================================================
3
-
4
- module NRSER
5
-
6
- # @!group Hash Functions
7
-
8
- # Lifted from ActiveSupport.
9
- #
10
- # @see http://www.rubydoc.info/gems/activesupport/5.1.3/Hash:slice
11
- #
12
- #
13
- def self.slice_keys hash, *keys
14
- # We're not using this, but, whatever, leave it in...
15
- if hash.respond_to?(:convert_key, true)
16
- keys.map! { |key| hash.send :convert_key, key }
17
- end
18
-
19
- keys.each_with_object(hash.class.new) { |k, new_hash|
20
- new_hash[k] = hash[k] if hash.has_key?(k)
21
- }
22
- end
23
-
24
-
25
- # Meant to be a drop-in replacement for the ActiveSupport version, though
26
- # I've changed the implementation a bit... because honestly I didn't
27
- # understand why they were doing it the way they do :/
28
- #
29
- # @see http://www.rubydoc.info/gems/activesupport/5.1.3/Hash:slice!
30
- #
31
- #
32
- def self.slice_keys! hash, *keys
33
- # We're not using this, but, whatever, leave it in...
34
- if hash.respond_to?(:convert_key, true)
35
- keys.map! { |key| hash.send :convert_key, key }
36
- end
37
-
38
- slice_keys( hash, *keys ).tap { |slice|
39
- except_keys! hash, *keys
40
- }
41
- end
42
-
43
- end # module NRSER
@@ -1,55 +0,0 @@
1
- # Definitions
2
- # =======================================================================
3
-
4
- module NRSER
5
-
6
- # @!group Hash Functions
7
-
8
- # Converts all keys into strings by calling `#to_s` on them. **Mutates the
9
- # hash.**
10
- #
11
- # Lifted from ActiveSupport.
12
- #
13
- # @param [Hash] hash
14
- #
15
- # @return [Hash<String, *>]
16
- #
17
- def self.stringify_keys! hash
18
- transform_keys! hash, &:to_s
19
- end
20
-
21
- singleton_class.send :alias_method, :to_s_keys!, :stringify_keys!
22
-
23
-
24
- # Returns a new hash with all keys transformed to strings by calling `#to_s`
25
- # on them.
26
- #
27
- # Lifted from ActiveSupport.
28
- #
29
- # @param [Hash] hash
30
- #
31
- # @return [Hash<String, *>]
32
- #
33
- def self.stringify_keys hash
34
- transform_keys hash, &:to_s
35
- end
36
-
37
- singleton_class.send :alias_method, :to_s_keys, :stringify_keys
38
-
39
-
40
- # @todo Document deep_stringify_keys method.
41
- #
42
- # @param [type] arg_name
43
- # @todo Add name param description.
44
- #
45
- # @return [return_type]
46
- # @todo Document return value.
47
- #
48
- def self.deep_stringify_keys object
49
- deep_transform_keys object, &:to_s
50
- end # .deep_stringify_keys
51
-
52
- singleton_class.send :alias_method, :to_s_keys_r, :deep_stringify_keys
53
-
54
-
55
- end # module NRSER
@@ -1,57 +0,0 @@
1
- # Definitions
2
- # =======================================================================
3
-
4
- module NRSER
5
-
6
- # @!group Hash Functions
7
-
8
- # Mutates `hash` by converting all keys that respond to `#to_sym` to symbols.
9
- #
10
- # Lifted from ActiveSupport.
11
- #
12
- # @see http://www.rubydoc.info/gems/activesupport/5.1.3/Hash:symbolize_keys!
13
- #
14
- # @param [Hash] hash
15
- #
16
- # @return [Hash]
17
- #
18
- def self.symbolize_keys! hash
19
- transform_keys!(hash) { |key| key.to_sym rescue key }
20
- end # .symbolize_keys!
21
-
22
- singleton_class.send :alias_method, :to_sym_keys!, :symbolize_keys!
23
-
24
-
25
- # Returns a new hash with all keys that respond to `#to_sym` converted to
26
- # symbols.
27
- #
28
- # Lifted from ActiveSupport.
29
- #
30
- # @see http://www.rubydoc.info/gems/activesupport/5.1.3/Hash:symbolize_keys
31
- #
32
- # @param [Hash] hash
33
- #
34
- # @return [Hash]
35
- #
36
- def self.symbolize_keys hash
37
- # File 'lib/active_support/core_ext/hash/keys.rb', line 54
38
- transform_keys(hash) { |key| key.to_sym rescue key }
39
- end
40
-
41
- singleton_class.send :alias_method, :to_sym_keys, :symbolize_keys
42
-
43
-
44
- # @todo Document deep_symbolize_keys method.
45
- #
46
- # @param [type] arg_name
47
- # @todo Add name param description.
48
- #
49
- # @return [return_type]
50
- # @todo Document return value.
51
- #
52
- def self.deep_symbolize_keys object, &block
53
- deep_transform_keys( object ) { |key| key.to_sym rescue key }
54
- end # .deep_symbolize_keys
55
-
56
-
57
- end # module NRSER
@@ -1,140 +0,0 @@
1
- module NRSER
2
-
3
- # @!group Hash Functions
4
-
5
- # Lifted from ActiveSupport.
6
- #
7
- # @see http://www.rubydoc.info/gems/activesupport/5.1.3/Hash:transform_keys!
8
- #
9
- # @param [Hash] hash
10
- # Hash to mutate keys.
11
- #
12
- # @return [Hash]
13
- # The mutated hash.
14
- #
15
- def self.transform_keys! hash
16
- # File 'lib/active_support/core_ext/hash/keys.rb', line 23
17
- hash.keys.each do |key|
18
- hash[yield(key)] = hash.delete(key)
19
- end
20
- hash
21
- end
22
-
23
-
24
- # Returns a new hash with each key transformed by the provided block.
25
- #
26
- # Lifted from ActiveSupport.
27
- #
28
- # @see http://www.rubydoc.info/gems/activesupport/5.1.3/Hash:transform_keys
29
- #
30
- # @param [Hash] hash
31
- #
32
- # @return [Hash]
33
- # New hash with transformed keys.
34
- #
35
- def self.transform_keys hash, &block
36
- # File 'lib/active_support/core_ext/hash/keys.rb', line 12
37
- result = {}
38
- hash.each_key do |key|
39
- result[yield(key)] = hash[key]
40
- end
41
- result
42
- end
43
-
44
- # My-style names
45
- singleton_class.send :alias_method, :map_keys, :transform_keys
46
- singleton_class.send :alias_method, :rekey, :transform_keys
47
-
48
-
49
- # Deeply transform Hash keys that we can find by traversing Hash and Array
50
- # instances that we can find from `object` and piping keys through `block`.
51
- #
52
- # @example Hash top node
53
- #
54
- # NRSER.deep_transform_keys({
55
- # people: {
56
- # jane: {fav_color: 'red'},
57
- # joe: {fav_color: 'blue'},
58
- # }
59
- # }) { |key| key.to_s.upcase }
60
- # # => {
61
- # # "PEOPLE" => {
62
- # # "JANE" => {"FAV_COLOR" => 'red'},
63
- # # "JOE" => {"FAV_COLOR" => 'blue'},
64
- # # }
65
- #
66
- # @example Array top node
67
- #
68
- # NRSER.deep_transform_keys(
69
- # [{x: 2}, {y: 'blue'}, 3]
70
- # ) { |key| key.to_s.upcase }
71
- # # => [{'X' => 2}, {'Y' => 'blue'}, 3]
72
- #
73
- #
74
- # @example Non-array or hash value
75
- #
76
- # NRSER.deep_transform_keys 'blah'
77
- # # => 'blah'
78
- #
79
- # From ActiveSupport.
80
- #
81
- # @see http://www.rubydoc.info/gems/activesupport/5.1.3/Hash:deep_transform_keys
82
- #
83
- # @todo Maybe this is a tree function?
84
- #
85
- # @param [Object] object
86
- # Anything; see examples.
87
- #
88
- # @param [Proc] &block
89
- # Proc that should accept each key as it's only argument and return the
90
- # new key to replace it with.
91
- #
92
- def self.deep_transform_keys object, &block
93
- case object
94
- when Hash
95
- object.each_with_object( {} ) do |(key, value), result|
96
- result[block.call( key )] = deep_transform_keys value, &block
97
- end
98
- when Array
99
- object.map { |entry| deep_transform_keys entry, &block }
100
- else
101
- object
102
- end
103
- end
104
-
105
- singleton_class.send :alias_method, :deep_map_keys, :deep_transform_keys
106
- singleton_class.send :alias_method, :map_keys_r, :deep_transform_keys
107
- singleton_class.send :alias_method, :deep_rekey, :deep_transform_keys
108
- singleton_class.send :alias_method, :rekey_r, :deep_transform_keys
109
-
110
-
111
- # Like {NRSER.deep_transform_keys} but mutates the objects (works in place).
112
- #
113
- # @param object (see NRSER.deep_transform_keys)
114
- # @param &block (see NRSER.deep_transform_keys)
115
- #
116
- # @return [Object]
117
- # The `object` that was passed in, post mutations.
118
- #
119
- def self.deep_transform_keys! object, &block
120
- case object
121
- when Hash
122
- object.keys.each do |key|
123
- value = object.delete key
124
- object[block.call( key )] = deep_transform_keys! value, &block
125
- end
126
- object
127
- when Array
128
- object.map! {|e| deep_transform_keys!(e, &block)}
129
- else
130
- object
131
- end
132
- end
133
-
134
- singleton_class.send :alias_method, :deep_map_keys!, :deep_transform_keys!
135
- singleton_class.send :alias_method, :map_keys_r!, :deep_transform_keys!
136
- singleton_class.send :alias_method, :deep_rekey!, :deep_transform_keys!
137
- singleton_class.send :alias_method, :rekey_r!, :deep_transform_keys!
138
-
139
-
140
- end # module NRSER
@@ -1,206 +0,0 @@
1
- # encoding: UTF-8
2
- # frozen_string_literal: true
3
- ##
4
- # Functions to get {Method} and {UnboundMethod} instances for class and
5
- # instance methods (respectively) of a {Module}.
6
- #
7
- # @note
8
- # Methods added to {NRSER::Ext::Module} can't be named the same as they will
9
- # be in the extension due to shadowing.
10
- #
11
- ##
12
-
13
-
14
- # Definitions
15
- # =======================================================================
16
-
17
- module NRSER
18
-
19
- # @!group Module Functions
20
- # ==========================================================================
21
-
22
- # Core private method that supports all the other "method getters".
23
- #
24
- # @private
25
- #
26
- # @param [Module] mod
27
- # Module in question.
28
- #
29
- # @param [Boolean] include_super
30
- # When `true`, includes inherited class methods.
31
- #
32
- # @param [:class | :instance] type:
33
- # Get class or instance methods.
34
- #
35
- # @param [Boolean] sort:
36
- # If `true`, will sort the methods by name, which is usually
37
- # the useful way to look at and use them.
38
- #
39
- # @return [Array<(Method | UnboundMethod)>]
40
- # List of method objects (all bound to `mod`).
41
- #
42
- def self.method_objects_for mod,
43
- include_super,
44
- type:,
45
- sort:,
46
- include_initialize: false
47
- initialize_method = nil
48
-
49
- get_names, get_method = case type
50
- when :class
51
- [:methods, :method]
52
-
53
- when :instance
54
- if include_initialize
55
- # Only way I can figure out to find out if it is defined it to try
56
- # to get the object and handle the error
57
- begin
58
- initialize_method = mod.instance_method :initialize
59
- rescue NameError => error
60
- else
61
- # Don't want to include it if we're not `include_super` and it's
62
- # inherited from a different module
63
- unless include_super || initialize_method.owner == mod
64
- initialize_method = nil
65
- end
66
- end
67
- end
68
-
69
- [:instance_methods, :instance_method]
70
-
71
- else
72
- raise ArgumentError,
73
- "`type:` must be `:class` or `:instance`, found #{ type.inspect }"
74
-
75
- end # case type
76
-
77
- methods = mod.send( get_names, include_super ).map { |name|
78
- mod.send get_method, name
79
- }
80
-
81
- methods << initialize_method unless initialize_method.nil?
82
-
83
- methods.sort! { |a, b| a.name <=> b.name } if sort
84
-
85
- methods
86
- end # .method_objects_for
87
-
88
- private_class_method :method_objects_for
89
-
90
-
91
- # Get class methods for a {Module} ({Class} are also {Module}, so works
92
- # same for those).
93
- #
94
- # @param mod (see .method_objects_for)
95
- # @param include_super (see .method_objects_for)
96
- # @param sort: (see .method_objects_for)
97
- #
98
- # @return [Array<Method>]
99
- # List of method objects (all bound to `mod`).
100
- #
101
- def self.class_method_objects_for mod, include_super = true, sort: true
102
- method_objects_for mod, include_super, type: :class, sort: sort
103
- end # .class_method_objects_for
104
-
105
- # Much shorter name
106
- #
107
- # @todo Not sure if I like this...
108
- #
109
- singleton_class.send :alias_method,
110
- :class_Methods_for, :class_method_objects_for
111
-
112
-
113
- # Just get the class methods defined in `mod` itself, omitting inherited
114
- # ones.
115
- #
116
- # Equivalent to
117
- #
118
- # NRSER.class_method_objects_for false
119
- #
120
- # @param mod (see .class_method_objects_for)
121
- # @param sort: (see .class_method_objects_for)
122
- # @return (see .class_method_objects_for)
123
- #
124
- def self.own_class_method_objects_for mod, sort: true
125
- class_method_objects_for mod, false, sort: sort
126
- end # .own_class_method_objects_for
127
-
128
- # Much shorter name
129
- #
130
- # @todo Not sure if I like this...
131
- #
132
- singleton_class.send :alias_method,
133
- :own_class_Methods_for,
134
- :own_class_method_objects_for
135
-
136
-
137
- # Get instance methods for a {Module} ({Class} are also {Module}, so works
138
- # same for those).
139
- #
140
- # @param mod (see .method_objects_for)
141
- # @param include_super (see .method_objects_for)
142
- # @param sort: (see .method_objects_for)
143
- #
144
- # @param [Boolean] include_initialize:
145
- # When `true`, include `#initialize` method if it's defined, which is
146
- # normally excluded from {Module#instance_methods}.
147
- #
148
- # Respects `include_super` - won't include it if we are only looking for
149
- # own instance methods and it's inherited.
150
- #
151
- # @return [Array<UnboundMethod>]
152
- # List of method objects (all unbound).
153
- #
154
- def self.instance_method_objects_for mod,
155
- include_super = true,
156
- sort: true,
157
- include_initialize: false
158
- method_objects_for \
159
- mod,
160
- include_super,
161
- type: :instance,
162
- sort: sort,
163
- include_initialize: include_initialize
164
- end # .instance_method_objects_for
165
-
166
- # Much shorter name
167
- #
168
- # @todo Not sure if I like this...
169
- #
170
- singleton_class.send :alias_method,
171
- :instance_Methods_for, :instance_method_objects_for
172
-
173
-
174
- # Just get the instance methods defined in `mod` itself, omitting inherited
175
- # ones.
176
- #
177
- # Equivalent to
178
- #
179
- # NRSER.instance_method_objects_for false
180
- #
181
- # @param mod (see .instance_method_objects_for)
182
- # @param sort: (see .instance_method_objects_for)
183
- # @return (see .instance_method_objects_for)
184
- #
185
- def self.own_instance_method_objects_for mod,
186
- sort: true,
187
- include_initialize: false
188
- instance_method_objects_for \
189
- mod,
190
- false,
191
- sort: sort,
192
- include_initialize: include_initialize
193
- end # .own_instance_method_objects_for
194
-
195
- # Much shorter name
196
- #
197
- # @todo Not sure if I like this...
198
- #
199
- singleton_class.send :alias_method,
200
- :own_instance_Methods_for,
201
- :own_instance_method_objects_for
202
-
203
-
204
- # @!endgroup Module Functions
205
-
206
- end # module NRSER