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,22 +1,107 @@
1
- require 'nrser/refinements'
2
- using NRSER
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
3
+
4
+ require_relative './type'
3
5
 
4
6
  module NRSER::Types
7
+
8
+ # {Where} instances are predicate functions¹ as a type.
9
+ #
10
+ # They have a {#predicate} block, and {#test?} calls it with values and
11
+ # returns the boolean of the result (double-bangs it `!!`).
12
+ #
13
+ # Super simple, right? And easy! Why don't we just use these things all over
14
+ # the place?
15
+ #
16
+ # If you're been around the programing block a few times, you probably saw
17
+ # this coming a mile away: you should avoid using them.
18
+ #
19
+ # Yeah, sorry. Here's the reasons:
20
+ #
21
+ # 1. They're **opaque** - it's hard to see inside a {Proc}... even if you
22
+ # got the source code (which seems like it requires gems and involves
23
+ # some amount of hackery), that wouldn't really give you the whole
24
+ # picture because you need to look at the binding as well... Ruby
25
+ # procs capture their entire environment.
26
+ #
27
+ # Essentially, they suck to easily and/or comprehensively communicate
28
+ # what they hell they do.
29
+ #
30
+ # 2. Like {When}, they're totally Ruby-centric... we can't really serialize
31
+ # them and pass them off anywhere, so they're shitty for APIs and
32
+ # property types and stuff that you may want or need to expose outside
33
+ # the runtime.
34
+ #
35
+ # In this sense they're ok as implementations of types like {.file_path}
36
+ # that represent an *idea* to be communicated to the outside world,
37
+ # where each system that handles that idea will need to have it's own
38
+ # implementation of it.
39
+ #
40
+ # Lit addresses a lot of this with serializable functions, but that's
41
+ # nowhere near ready to rock, and support for it would probably be
42
+ # added along side {Where}, not in place of it (since {Where} is
43
+ # probably still going to be used and useful).
44
+ #
45
+ # So please be aware of those, and be reasonable about your {Where}s.
46
+ #
47
+ # > ¹ I say *functions*, because they really *should* be functions (same
48
+ # > input always gets same output, pure, etc.).
49
+ # >
50
+ # > Yeah, there's not much stopping you from making them state-based or
51
+ # > random or whatever, but please don't do that shit unless you've really
52
+ # > thought it through. And if you still do, please write me and tell me
53
+ # > what you thought and why it's a reasonable idea and I'll update this.
54
+ #
5
55
  class Where < NRSER::Types::Type
56
+
57
+ # Predicate {Proc} used to test value for membership.
58
+ #
59
+ # @return [Proc<(V) => Boolean>]
60
+ # Really, we double-bang (`!!`) whatever the predicate returns to
61
+ # get the result in {#test?}, but you get the idea... the response will
62
+ # be evaluated on its truthiness.
63
+ #
6
64
  attr_reader :predicate
7
65
 
8
- def initialize predicate, **options
66
+
67
+ # Make a new {Where}.
68
+ #
69
+ # @param [Proc<(V) => Boolean>] &predicate
70
+ # See {#predicate}.
71
+ #
72
+ # @param **options (see NRSER::Types::Type#initialize)
73
+ #
74
+ def initialize **options, &predicate
9
75
  super **options
76
+
77
+ unless predicate.arity == 1
78
+ raise NRSER::ArgumentError.new \
79
+ "Predicate block must have arity 1",
80
+ predicate: predicate,
81
+ options: options
82
+ end
83
+
10
84
  @predicate = predicate
11
85
  end
12
86
 
13
- def test value
87
+
88
+ # Test a value for membership.
89
+ #
90
+ # @param (see NRSER::Types::Type#test?)
91
+ # @return (see NRSER::Types::Type#test?)
92
+ # @raise (see NRSER::Types::Type#test?)
93
+ #
94
+ def test? value
14
95
  !!@predicate.call(value)
15
96
  end
16
- end # Where
97
+
98
+ end # class Where
17
99
 
18
- # create a type based on a predicate
19
- def self.where **options, &block
20
- Where.new block, **options
100
+
101
+ # Get a type based on a predicate.
102
+ #
103
+ def_factory :where do |**options, &predicate|
104
+ Where.new **options, &predicate
21
105
  end
22
- end # NRSER::Types
106
+
107
+ end # NRSER::Types
data/lib/nrser/types.rb CHANGED
@@ -1,3 +1,6 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
3
+
1
4
  # Abstract infrastructure for type creation - stuff that doesn't define any
2
5
  # concrete type instances.
3
6
  #
@@ -6,13 +9,9 @@
6
9
  # uncontrollable mutability of Ruby and the importance of type checks)
7
10
  # need to be required in the "Post-Processing" section at the bottom.
8
11
  #
9
- require_relative './types/type'
10
-
11
- # Refinements
12
- # =======================================================================
13
-
14
- using NRSER
15
12
 
13
+ # Want to mix logging in
14
+ require 'nrser/log'
16
15
 
17
16
  # Stuff to help you define, test, check and match types in Ruby.
18
17
  #
@@ -20,9 +19,31 @@ using NRSER
20
19
  #
21
20
  module NRSER::Types
22
21
 
22
+ # Sub-Tree Requirements
23
+ # ========================================================================
24
+
25
+ require_relative './types/type'
26
+ require_relative './types/factory'
27
+
28
+
29
+ # Mixins
30
+ # ========================================================================
31
+
32
+ extend Factory
33
+ include NRSER::Log::Mixin
34
+
35
+
36
+ # Constants
37
+ # ========================================================================
38
+
23
39
  L_PAREN = '(' # '❪'
24
40
  R_PAREN = ')' # '❫'
25
41
  RESPONDS_WITH = '→'
42
+ ASSOC = '=>'
43
+
44
+
45
+ # Module Methods
46
+ # ========================================================================
26
47
 
27
48
  # Make a {NRSER::Types::Type} from a value.
28
49
  #
@@ -55,17 +76,56 @@ module NRSER::Types
55
76
  end
56
77
 
57
78
 
58
- # raise an error if value doesn't match type.
59
- def self.check value, type
60
- make(type).check value
79
+ # The {.make} method reference; for easy map and such.
80
+ #
81
+ # @return [Method]
82
+ #
83
+ def self.maker
84
+ method :make
85
+ end
86
+
87
+
88
+ # Create a {NRSER::Types::Type} from `type` with {.make} and check that
89
+ # `value` satisfies it, raising if it doesn't.
90
+ #
91
+ # @param [*] value
92
+ # Value to type check.
93
+ #
94
+ # @param [*] type
95
+ # Type to check value against.
96
+ #
97
+ # @return
98
+ # The `value` parameter.
99
+ #
100
+ # @raise [NRSER::Types::CheckError]
101
+ # If the value fails the type check.
102
+ #
103
+ def self.check! value, type
104
+ make( type ).check! value
61
105
  end
62
106
 
107
+ # Old name
108
+ singleton_class.send :alias_method, :check, :check!
109
+
63
110
 
64
- def self.test value, type
111
+ # Create a {NRSER::Types::Type} from `type` with {.make} and test if
112
+ # `value` satisfies it.
113
+ #
114
+ # @return [Boolean]
115
+ # `true` if `value` satisfies `type`.
116
+ #
117
+ def self.test? value, type
65
118
  make(type).test value
66
119
  end
67
120
 
121
+ # Old name
122
+ singleton_class.send :alias_method, :test, :test?
123
+
68
124
 
125
+ # @todo
126
+ # Switch {NRSER::Types.match} to use `===`! Should allow us to avoid
127
+ # making types for everything?
128
+ #
69
129
  def self.match value, *clauses
70
130
  if clauses.empty?
71
131
  raise ArgumentError.new NRSER.dedent <<-END
@@ -95,7 +155,7 @@ module NRSER::Types
95
155
  end
96
156
 
97
157
  enum.each { |type, expression|
98
- if test value, type
158
+ if test? value, type
99
159
  # OK, we matched! Is the corresponding expression callable?
100
160
  if expression.respond_to? :call
101
161
  # It is; invoke and return result.
@@ -138,57 +198,6 @@ module NRSER::Types
138
198
  }
139
199
  end # .from_repr
140
200
 
141
-
142
- # Define a type factory.
143
- #
144
- # @!macro [attach] factory
145
- # @param [Hash] **options
146
- # Common type construction options, see {Type#initialize}.
147
- #
148
- # @return [NRSER::Types::Type]
149
- # The type.
150
- #
151
- def self.def_factory name, maybe: true, aliases: [], &body
152
- define_singleton_method name, &body
153
-
154
- aliases.each do |alias_name|
155
- singleton_class.send :alias_method, alias_name, name
156
- end
157
-
158
- if maybe && !name.to_s.end_with?( '?' )
159
- maybe_name = "#{ name }?".to_sym
160
-
161
- # HACK Ugh maybe I wrote this quick to fix it, not sure if it's a decent
162
- # idea.. basically, need to figure out what `options` keys go
163
- # to {.maybe} and which ones go to the regular factory... matters
164
- # for shit like {.attrs} and {.hash_type} 'cause they use option
165
- # keys (whether they *should* is something I've debated... sigh,
166
- # it is what it is for now).
167
- #
168
- # So they options that go to {.maybe} just go strait through to
169
- # {Type#initialize}, so just grab that method, see what keys it
170
- # takes, and then can slice and dice off that...
171
- #
172
- maybe_option_keys = Set.new \
173
- Type.
174
- instance_method( :initialize ).
175
- parameters.
176
- select { |param_type, name| param_type == :key }.
177
- map { |param_type, name| name }
178
-
179
- define_singleton_method maybe_name do |*args, **options|
180
- maybe_options = options.slice *maybe_option_keys
181
- factory_options = options.except *maybe_option_keys
182
-
183
- maybe public_send( name, *args, **factory_options ), **maybe_options
184
- end
185
-
186
- aliases.each do |alias_name|
187
- singleton_class.send :alias_method, "#{ alias_name }?", maybe_name
188
- end
189
- end
190
- end
191
-
192
201
  end # NRSER::Types
193
202
 
194
203
 
@@ -218,7 +227,7 @@ require_relative './types/numbers'
218
227
  require_relative './types/strings'
219
228
  require_relative './types/symbols'
220
229
  require_relative './types/labels'
221
- require_relative './types/array'
230
+ require_relative './types/arrays'
222
231
  require_relative './types/hashes'
223
232
  require_relative './types/paths'
224
233
  require_relative './types/tuples'
data/lib/nrser/version.rb CHANGED
@@ -18,7 +18,7 @@ module NRSER
18
18
  #
19
19
  # @return [String]
20
20
  #
21
- VERSION = '0.2.2'
21
+ VERSION = '0.3.0'
22
22
 
23
23
 
24
24
  module Version
data/lib/nrser.rb CHANGED
@@ -14,13 +14,20 @@ require 'pp'
14
14
  require 'ostruct'
15
15
  require 'json'
16
16
  require 'yaml'
17
- require 'logger'
18
17
  require 'singleton'
19
18
 
20
19
  # Deps
21
20
  # -----------------------------------------------------------------------
22
21
  require 'hamster'
23
22
 
23
+ ### Active Support
24
+ #
25
+ # We're not going to import all of it, but here we'll import the stuff we
26
+ # always want to use and then add pieces in places as needed.
27
+ #
28
+ require 'active_support/json'
29
+ # require 'active_support/core_ext/object/json'
30
+
24
31
 
25
32
  # Hi there!
26
33
  #
@@ -47,33 +54,26 @@ require 'hamster'
47
54
  # Enjoy!
48
55
  #
49
56
 
50
- # 1. Load up version, which has {NRSER::ROOT} in it and depends on nothing
51
- # else, then logging
57
+ # Load up version, which has {NRSER::ROOT} in it and depends on nothing else
52
58
  require_relative './nrser/version'
53
- require_relative './nrser/logging'
54
59
 
55
- # 2. Load up extension mixins first - they don't invoke anything, just define
56
- # methods
57
- require_relative './nrser/ext'
60
+ # {Module.safe_name} is really useful all around, including in logging
61
+ require_relative './nrser/core_ext/module/names'
58
62
 
59
- # 3. Then load up the refinements, which either include the extension mixins
60
- # or directly define proxies and methods (but don't execute them).
61
- #
62
- # This way everything else should be able to use them.
63
- #
64
- require_relative './nrser/refinements'
63
+ # Then logging can come in...
64
+ require_relative './nrser/log'
65
65
 
66
- # 4. Then everything else...
66
+ # Tons need this for error messages
67
+ require_relative './nrser/core_ext/binding'
68
+
69
+ # Then everything else...
67
70
  require_relative './nrser/char'
68
71
  require_relative './nrser/errors'
69
72
  require_relative './nrser/no_arg'
70
73
  require_relative './nrser/message'
71
- require_relative './nrser/env'
72
74
  require_relative './nrser/collection'
73
75
  require_relative './nrser/functions'
74
76
  require_relative './nrser/types'
75
77
  require_relative './nrser/meta'
78
+ require_relative './nrser/props'
76
79
  require_relative './nrser/mean_streak'
77
-
78
- # 5. Stuff that *uses* the refinements *at require time* (usually defining
79
- # constants or meta-programming)
@@ -1,11 +1,11 @@
1
- require 'spec_helper'
1
+ require 'nrser/core_ext/binding'
2
2
 
3
- describe 'NRSER.template' do
3
+ describe 'Binding#erb' do
4
4
  it "processes a simple template" do
5
5
  x = 1
6
6
 
7
7
  expect(
8
- NRSER.template binding, <<-BLOCK
8
+ binding.erb <<-BLOCK
9
9
  x is <%= x %>
10
10
  BLOCK
11
11
  ).to eq NRSER.dedent <<-BLOCK
@@ -14,7 +14,7 @@ describe 'NRSER.template' do
14
14
  end
15
15
 
16
16
  it "handles edge cases" do
17
- expect( NRSER.template binding, '' ).to eq ''
18
- expect( NRSER.template binding, 'blah' ).to eq 'blah'
17
+ expect( binding.erb '' ).to eq ''
18
+ expect( binding.erb 'blah' ).to eq 'blah'
19
19
  end
20
20
  end # template
@@ -1,13 +1,15 @@
1
+ require 'nrser/core_ext/enumerable/find_map'
2
+
1
3
  describe_spec_file(
2
4
  spec_path: __FILE__,
3
- module: NRSER,
4
- method: :find_map,
5
+ module: Enumerable,
6
+ instance_method: :find_map,
5
7
  ) do
6
8
 
7
9
  describe "when a result is found" do
8
10
  it "should return the block result" do
9
11
  expect(
10
- subject.call( [1, 2, 3, 4] ) do |i|
12
+ [1, 2, 3, 4].find_map do |i|
11
13
  if i.even?
12
14
  "#{ i } is even!"
13
15
  end
@@ -20,7 +22,7 @@ describe_spec_file(
20
22
  describe "when block returns `false`" do
21
23
  it "should not be considered 'found'" do
22
24
  expect(
23
- subject.call( [1, 2, 3] ) { |i| false }
25
+ [1, 2, 3].find_map { |i| false }
24
26
  ).to be nil
25
27
  end
26
28
  end
@@ -29,10 +31,10 @@ describe_spec_file(
29
31
  describe "when none found and `ifnone` provided" do
30
32
  it "should call `ifnone` and return the response" do
31
33
  expect(
32
- subject.call( [], ->(){ 'blah' } ) { |i| false }
34
+ [].find_map( -> { 'blah' } ) { |i| false }
33
35
  ).to eq 'blah'
34
36
  end
35
37
  end # "when none found and `ifnone` provided"
36
38
 
37
39
 
38
- end
40
+ end # spec_file
@@ -1,19 +1,6 @@
1
- require 'spec_helper'
1
+ require 'nrser/core_ext/hash'
2
2
 
3
- using NRSER
4
-
5
- describe 'Refinement Hash#map_values' do
6
- it do
7
- expect(
8
- {x: 1, y: 2}.map_values { |key, value| value + 1 }
9
- ).to eq(
10
- {x: 2, y: 3}
11
- )
12
- end
13
- end # 'Hash#map_values'
14
-
15
-
16
- describe 'Refinement Hash#find_bounded' do
3
+ describe 'Hash#find_bounded' do
17
4
  subject { {a: 1, b: 2, c: 3} }
18
5
 
19
6
  it do
@@ -25,10 +12,10 @@ describe 'Refinement Hash#find_bounded' do
25
12
  subject.find_bounded(length: 2) { |k, v| v == 2 }
26
13
  }.to raise_error TypeError
27
14
  end
28
- end # Refinement Hash#map_values
15
+ end # Hash#find_bounded
29
16
 
30
17
 
31
- describe 'Refinement Hash#find_only' do
18
+ describe 'Hash#find_only' do
32
19
  subject { {a: 1, b: 2, c: 3} }
33
20
 
34
21
  it do
@@ -40,17 +27,17 @@ describe 'Refinement Hash#find_only' do
40
27
  subject.find_only { |k, i| i >= 2 }
41
28
  }.to raise_error TypeError
42
29
  end
43
- end # Refinement Hash#map_values
30
+ end # Hash#find_only
44
31
 
45
32
 
46
- describe "Refinement Hash#leaves" do
33
+ describe "Hash#leaves" do
47
34
  subject { {a: 1, b: 2, c: 3}.leaves }
48
35
 
49
36
  it { is_expected.to eq( {[:a] => 1, [:b] => 2, [:c] => 3}) }
50
- end # Refinement Hash#leaves
37
+ end # Hash#leaves
51
38
 
52
39
 
53
- describe "Refinement Hash#each_branch" do
40
+ describe "Hash#each_branch" do
54
41
  let( :abc_hash ) { {a: 1, b: 2, c: 3} }
55
42
 
56
43
  context "called with no block" do
@@ -74,4 +61,4 @@ describe "Refinement Hash#each_branch" do
74
61
  it { is_expected.to eq(a: 1, b: 4, c: 9) }
75
62
  end # called with a block
76
63
 
77
- end # Refinement Hash#each_branch
64
+ end # Hash#each_branch
@@ -23,7 +23,7 @@ describe_class NRSER::AbstractMethodError do
23
23
  NRSER::TestFixtures::AbstractMethodError::Base.new.f
24
24
  }.to raise_error(
25
25
  NRSER::AbstractMethodError,
26
- /Base is an abstract class/
26
+ /Method #f is abstract/
27
27
  )
28
28
  end
29
29
 
@@ -34,10 +34,17 @@ describe_class NRSER::AbstractMethodError do
34
34
  it "explains that an implementing class needs to be found or written" do
35
35
  expect {
36
36
  NRSER::TestFixtures::AbstractMethodError::Sub.new.f
37
- }.to raise_error(
38
- NRSER::AbstractMethodError,
39
- /find a subclass of .*Sub to instantiate or write your own/
40
- )
37
+ }.to raise_error NRSER::AbstractMethodError
38
+
39
+
40
+ message = begin
41
+ NRSER::TestFixtures::AbstractMethodError::Sub.new.f
42
+ rescue Exception => e
43
+ e.to_s
44
+ end
45
+
46
+ expect( message ).to match \
47
+ /find a subclass of NRSER::TestFixtures::AbstractMethodError::Sub to instantiate/
41
48
  end
42
49
 
43
50
  end # when raising method is invoked through instance of a subclass
@@ -1,7 +1,7 @@
1
1
  describe_spec_file(
2
2
  spec_path: __FILE__,
3
3
  module: NRSER,
4
- method: :to_h_by,
4
+ method: :assoc_by,
5
5
  ) do
6
6
 
7
7
  describe "when map does not result in duplicate keys" do
@@ -42,7 +42,7 @@ describe "NRSER.merge_by" do
42
42
  }
43
43
 
44
44
  subject {
45
- super().call current, update, &[:item_id].digger
45
+ super().call current, update, &[:item_id].to_digger
46
46
  }
47
47
 
48
48
  it {
@@ -9,14 +9,14 @@ describe "NRSER.each_branch" do
9
9
 
10
10
  context "called without a block" do
11
11
  context "called with arrays" do
12
- when_called_with( [] ) {
12
+ describe_called_with( [] ) {
13
13
  it {
14
14
  is_expected.to be_a( Enumerator ).
15
15
  and have_attributes size: 0
16
16
  }
17
17
  }
18
18
 
19
- when_called_with( [:x, :y, :z] ) {
19
+ describe_called_with( [:x, :y, :z] ) {
20
20
  it {
21
21
  is_expected.to be_a( Enumerator ).
22
22
  and have_attributes size: 3
@@ -25,7 +25,7 @@ describe "NRSER.each_branch" do
25
25
  end # called with arrays
26
26
 
27
27
  context "called with hashes" do
28
- when_called_with( {} ) {
28
+ describe_called_with( {} ) {
29
29
  it {
30
30
  is_expected.to be_a( Enumerator ).
31
31
  and have_attributes size: 0
@@ -13,8 +13,8 @@ describe "NRSER.transform" do
13
13
 
14
14
  let( :tree ) {
15
15
  {
16
- x: :y.retriever,
17
- y: :x.retriever,
16
+ x: :y.to_retriever,
17
+ y: :x.to_retriever,
18
18
  }
19
19
  } # let :tree
20
20
 
@@ -35,8 +35,8 @@ describe "NRSER.transform" do
35
35
  let :tree do
36
36
  {
37
37
  users: {
38
- { id: :id.retriever } => {
39
- name: :name.retriever,
38
+ { id: :id.to_retriever } => {
39
+ name: :name.to_retriever,
40
40
  }
41
41
  }
42
42
  }
@@ -65,8 +65,8 @@ describe "NRSER.transform" do
65
65
  let :tree do
66
66
  {
67
67
  list: [
68
- { name: :name.rtvr },
69
- { age: :age.rtvr },
68
+ { name: :name.to_retriever },
69
+ { age: :age.to_retriever },
70
70
  ]
71
71
  }
72
72
  end
@@ -119,15 +119,15 @@ describe "NRSER.transform" do
119
119
  let :tree do
120
120
  {
121
121
  users: {
122
- { contact_id: [ :parent, :id ].chainer } => {
122
+ { contact_id: [ :parent, :id ].to_chainer } => {
123
123
  addresses: {
124
- {
125
- address_id: [ :id ].sender } => {
126
- district: :address.retriever,
127
- line_1: :street2.retriever,
128
- city: :city.retriever,
129
- province: :state.retriever,
130
- post_code: :zip.retriever,
124
+ {
125
+ address_id: [ :id ].to_sender } => {
126
+ district: :address.to_retriever,
127
+ line_1: :street2.to_retriever,
128
+ city: :city.to_retriever,
129
+ province: :state.to_retriever,
130
+ post_code: :zip.to_retriever,
131
131
  }
132
132
  }
133
133
  }
@@ -159,4 +159,3 @@ describe "NRSER.transform" do
159
159
 
160
160
 
161
161
  end # NRSER.transform
162
-
@@ -0,0 +1,4 @@
1
+ ##
2
+ # We want {Hamster} containers to automatically encode as JSON, even though
3
+ # it obviously won't automatically go two-ways.
4
+ ##