nrser 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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
+ ##