potrubi 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. data/lib/potrubi.rb +1 -1
  2. data/lib/potrubi/bootstrap.rb +1 -1
  3. data/lib/potrubi/core.rb +3 -3
  4. data/lib/potrubi/dsl.rb +86 -0
  5. data/lib/potrubi/dsl/accessor.rb +76 -0
  6. data/lib/potrubi/dsl/cache_2d.rb +811 -0
  7. data/lib/potrubi/dsl/contract.rb +731 -0
  8. data/lib/potrubi/dsl/super.rb +517 -0
  9. data/lib/potrubi/klass/syntax/alias.rb +150 -0
  10. data/lib/potrubi/klass/syntax/braket.rb +115 -25
  11. data/lib/potrubi/klass/syntax/builder.rb +45 -0
  12. data/lib/potrubi/klass/syntax/method.rb +436 -0
  13. data/lib/potrubi/klass/syntax/mixin/name_generation.rb +85 -0
  14. data/lib/potrubi/klass/syntax/mixin/new_aliases.rb +76 -0
  15. data/lib/potrubi/klass/syntax/mixin/new_brakets.rb +89 -0
  16. data/lib/potrubi/klass/syntax/mixin/new_methods.rb +158 -0
  17. data/lib/potrubi/klass/syntax/mixin/new_snippets.rb +74 -0
  18. data/lib/potrubi/klass/syntax/mixin/new_statements.rb +0 -0
  19. data/lib/potrubi/klass/syntax/mixin/statement_management.rb +69 -0
  20. data/lib/potrubi/klass/syntax/mixin/synel_management.rb +168 -0
  21. data/lib/potrubi/klass/syntax/snippet.rb +386 -0
  22. data/lib/potrubi/klass/syntax/statement.rb +91 -0
  23. data/lib/potrubi/klass/syntax/super.rb +88 -0
  24. data/lib/potrubi/mixin/bootstrap_common.rb +38 -12
  25. data/lib/potrubi/mixin/configuration.rb +31 -3
  26. data/lib/potrubi/mixin/contract.rb +5 -14
  27. data/lib/potrubi/mixin/contract/recipes.rb +307 -0
  28. data/lib/potrubi/mixin/dynamic-recipes.rb +1 -11
  29. data/lib/potrubi/mixin/dynamic.rb +223 -115
  30. data/lib/potrubi/mixin/exception.rb +3 -22
  31. data/lib/potrubi/mixin/filesys.rb +5 -21
  32. data/lib/potrubi/mixin/initialize.rb +11 -6
  33. data/lib/potrubi/mixin/konstant.rb +14 -118
  34. data/lib/potrubi/mixin/logger.rb +28 -41
  35. data/lib/potrubi/mixin/pathandnames.rb +4 -34
  36. data/lib/potrubi/mixin/persistence.rb +115 -10
  37. data/lib/potrubi/mixin/script.rb +0 -5
  38. data/lib/potrubi/mixin/{text-snippets → snippet-dictionaries}/methods-text-snippets.rb +138 -49
  39. data/lib/potrubi/mixin/{text-snippets.rb → snippet-manager.rb} +51 -39
  40. data/lib/potrubi/mixin/util.rb +66 -20
  41. data/lib/potrubi/version.rb +1 -1
  42. data/test/potrubi/mixin/bootstrap_common.rb +205 -0
  43. data/test/potrubi/mixin/konstant.rb +216 -0
  44. data/test/potrubi/mixin/logger.rb +124 -0
  45. data/test/ts_bootstrap_mixins.rb +16 -0
  46. data/test/ts_core_mixins.rb +7 -0
  47. metadata +31 -6
  48. data/lib/potrubi/mixin/contract-recipes.rb +0 -226
@@ -1,5 +1,5 @@
1
1
 
2
- # Potrubi
2
+ # Potrubi gem
3
3
 
4
4
  gemName = 'potrubi'
5
5
 
@@ -6,7 +6,7 @@ requireList.each {|r| require_relative "mixin/#{r}"}
6
6
 
7
7
  mixinContent = Module.new do
8
8
 
9
- # Include the mixins becuase of class method usage
9
+ # Include the mixins because of class method usage
10
10
 
11
11
  includeList = [Potrubi::Mixin::Logger,
12
12
  Potrubi::Mixin::BootstrapCommon,
@@ -1,14 +1,14 @@
1
1
 
2
- # Core Mixin
2
+ # Potrubi Core Mixin
3
3
 
4
4
  require_relative 'bootstrap'
5
5
 
6
- requireList = %w(dynamic text-snippets exception contract konstant pathandnames)
6
+ requireList = %w(dynamic snippet-manager exception contract konstant pathandnames)
7
7
  requireList.each {|r| require_relative "mixin/#{r}"}
8
8
 
9
9
  mixinContent = Module.new do
10
10
 
11
- # Include the mixins becuase of class method usage
11
+ # Include the mixins because of class method usage
12
12
 
13
13
  includeList = [Potrubi::Bootstrap,
14
14
  Potrubi::Mixin::Dynamic,
@@ -0,0 +1,86 @@
1
+
2
+ # potrubi dsl
3
+
4
+ # to ease the creation of verbs, accessors, etc in class bodies
5
+
6
+ # Uses conventions for names etc dedined by (in) verb mixin
7
+
8
+ require_relative './bootstrap'
9
+
10
+ requireList = %w(mixin/util dsl/super)
11
+ requireList.each {|r| require_relative "#{r}"}
12
+
13
+ classMethods = Module.new do
14
+
15
+ include Potrubi::Bootstrap
16
+ include Potrubi::Mixin::Util
17
+
18
+ def dsl(dslTarget, dslDefs=nil, &dslBlok)
19
+ eye = :'DSL::dsl'
20
+
21
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_me(eye, potrubi_bootstrap_logger_fmt_who(dslTarget: dslTarget, dslDefs: dslDefs, dslBlok: dslBlok))
22
+
23
+ require_relative "dsl"
24
+
25
+ potrubi_bootstrap_mustbe_module_or_croak(dslTarget, eye)
26
+
27
+ dslDefs && potrubi_bootstrap_mustbe_hash_or_croak(dslDefs, eye)
28
+
29
+ if Kernel.block_given? then
30
+
31
+ dslVerb = Potrubi::DSL::Super.new_verb({target: dslTarget, verb: :Super}, dslDefs, &dslBlok)
32
+
33
+ dslVerb.assert
34
+
35
+ end
36
+
37
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_mx(eye, potrubi_bootstrap_logger_fmt_who(dslTarget: dslTarget, dslDefs: dslDefs))
38
+
39
+ self
40
+
41
+ end
42
+
43
+ end
44
+
45
+ instanceMethods = Module.new do
46
+
47
+ include Potrubi::Bootstrap
48
+
49
+ def to_s
50
+ @to_s ||= potrubi_bootstrap_logger_fmt(potrubi_bootstrap_logger_instance_telltale('PotDSL'))
51
+ end
52
+
53
+ # Initialization
54
+ # ##############
55
+
56
+ def initialize(dslArgs=nil, &dslBlok)
57
+ eye = :'ctx_dsl i'
58
+
59
+ dslAttr = 'wantbeused'
60
+
61
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_me(eye, potrubi_bootstrap_logger_fmt_who(dslArgs: dslArgs, dslBlok: dslBlok))
62
+
63
+ case dslArgs
64
+ when NilClass then nil
65
+ when Hash then potrubi_bootstrap_mustbe_hash_or_croak(dslArgs, eye).each {|k, v| __send__("#{k}=", v) }
66
+ else
67
+ potrubi_bootstrap_surprise_exception(dslArgs, eye, "dslArgs is what?")
68
+ end
69
+
70
+ Kernel.block_given? && instance_eval(&dslBlok)
71
+
72
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_mx(eye, potrubi_bootstrap_logger_fmt_who(subVerbs: get_subverbs.size, dslArgs: dslArgs, dslBlok: dslBlok))
73
+
74
+ end
75
+
76
+ end
77
+
78
+ module Potrubi
79
+ class DSL
80
+ end
81
+ end
82
+
83
+ Potrubi::DSL.__send__(:include, instanceMethods) # Instance Methods
84
+ Potrubi::DSL.extend(classMethods) # Class Methods
85
+
86
+ __END__
@@ -0,0 +1,76 @@
1
+
2
+ # potrubi contract dsl
3
+
4
+ # to ease the creation of contracts, accessors, etc in class bodies
5
+
6
+ # Uses conventions for names etc dedined by (in) contract mixin
7
+
8
+ requireList = %w(contract ../mixin/util)
9
+ requireList.each {|r| require_relative "#{r}"}
10
+ require "potrubi/klass/syntax/braket"
11
+
12
+ instanceMethods = Module.new do
13
+
14
+ def to_s
15
+ potrubi_bootstrap_logger_fmt(potrubi_bootstrap_logger_instance_telltale('DSLAcc'), potrubi_bootstrap_logger_fmt(n: name))
16
+ end
17
+
18
+ def type_handlers
19
+ puts "ACCESSOR TYPE_HANDLERS"
20
+ @type_handlers ||=
21
+ begin
22
+ {
23
+ accessor: :accessor,
24
+ }.each_with_object({}) {|(k,v), h| h[k] = "make_contract_description_#{v}_or_croak".to_sym }
25
+ end
26
+ end
27
+
28
+ def express_or_croak
29
+ make_contract_description_accessor_or_croak
30
+ end
31
+
32
+ # Accessor Handlers
33
+ # #################
34
+
35
+ def make_contract_description_accessor_or_croak(descArgs=nil, &descBlok)
36
+ eye = :'DSLAcc::m_ctx_desc_acc'
37
+
38
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_me(eye, potrubi_bootstrap_logger_fmt_who(descArgs: descArgs, descBlok: descBlok))
39
+
40
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_ms(eye, potrubi_bootstrap_logger_fmt_who(default: default))
41
+
42
+ descContract = case
43
+ when (descDefault = default) then
44
+ descDefaultText = case descDefault
45
+ when NilClass then 'nil'
46
+ when String then "'#{descDefault}'" # need quotes
47
+ when Symbol then ":#{descDefault}" # need to supply colon
48
+ when Proc then descDefault.call
49
+ else
50
+ descDefault.to_s
51
+ end
52
+ {name => {edit: {ACCESSOR_DEFAULT: descDefaultText}, spec: spec}}
53
+
54
+ else
55
+ {name => type}
56
+ end
57
+
58
+
59
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_ca(eye, potrubi_bootstrap_logger_fmt_who(descContract: descContract, descArgs: descArgs, descBlok: descBlok))
60
+
61
+ descContract
62
+
63
+ end
64
+
65
+ end
66
+
67
+ module Potrubi
68
+ class DSL
69
+ class Accessor < Potrubi::DSL::Contract
70
+ end
71
+ end
72
+ end
73
+
74
+ Potrubi::DSL::Accessor.__send__(:include, instanceMethods) # Instance Methods
75
+
76
+ __END__
@@ -0,0 +1,811 @@
1
+
2
+ # potrubi contract dsl
3
+
4
+ # to ease the creation of a 2d cache (e.g. hash) with named methods
5
+ # and using contracts
6
+
7
+ # Uses conventions for names etc dedined by (in) contract mixin
8
+
9
+ requireList = %w(../klass/syntax/builder ../mixin/util ../klass/syntax/method)
10
+ requireList.each {|r| require_relative "#{r}"}
11
+
12
+ classMethods = Module.new do
13
+
14
+ def prepare_order(*a, &b)
15
+ @prepare_order ||= {
16
+ validate: :validate,
17
+ name: :prepare_name,
18
+ scope: :prepare_scope,
19
+ }.each_with_object({}) {|(k,v),h| h[k] = "#{v}_or_croak".to_sym }
20
+ end
21
+
22
+ def syntax_order(*a, &b)
23
+ @syntax_order ||= {
24
+ scope: :scope,
25
+ add: :add,
26
+ delete: :delete,
27
+ each: :each,
28
+ select: :select,
29
+ size: :size,
30
+ }.each_with_object({}) {|(k,v),h| h[k] = "make_syntax_#{v}_or_croak".to_sym }
31
+ end
32
+
33
+ def syntax_builder
34
+ @syntax_builder ||= Potrubi::Klass::Syntax::Builder
35
+ end
36
+
37
+ end
38
+
39
+ instanceMethods = Module.new do
40
+
41
+ include Potrubi::Mixin::Util
42
+
43
+ attr_accessor :singular_name, :plural_name
44
+ attr_accessor :scope
45
+ attr_accessor :key, :key_n, :key_v, :key_validate_method, :key_normalise_method
46
+ attr_accessor :value, :value_n, :value_v, :value_validate_method, :value_normalise_method
47
+ attr_accessor :cache_variable, :cache_container, :cache_validate_method, :cache_new_method, :cache_instance_variable, :cache_local_variable
48
+
49
+ # Find Accessor Methods
50
+ # #####################
51
+
52
+ findAttrs = {
53
+ name: :symbol,
54
+ singular_name: :symbol,
55
+ plural_name: :symbol,
56
+ key_v: :symbol,
57
+ value_v: :symbol,
58
+ }
59
+
60
+ findAttrsTexts = findAttrs.map do | attrName, attrCtx |
61
+ "def find_#{attrName}_or_croak
62
+ r = potrubi_bootstrap_mustbe_#{attrCtx}_or_croak(#{attrName}, :'f_#{attrName}')
63
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_ca(:'f_#{attrName}', potrubi_bootstrap_logger_fmt_who('#{attrName}' => r))
64
+ r
65
+ end
66
+ "
67
+ end
68
+
69
+ findAttrsText = findAttrsTexts.flatten.compact.join("\n")
70
+
71
+ module_eval(findAttrsText)
72
+
73
+ findNames = {
74
+ singular: :symbol,
75
+ plural: :symbol,
76
+ }
77
+
78
+ findNamesTexts = findNames.map do | nameName, nameCtx |
79
+ "
80
+ def find_#{nameName}_or_croak_method_name_or_croak(*names)
81
+ r = syntax_builder.name_builder_method_or_croak(*names, find_#{nameName}_name_or_croak)
82
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_ca(:'f_#{nameName}_or_croak_method_name', potrubi_bootstrap_logger_fmt_who('#{nameName}' => r))
83
+ r
84
+ end
85
+ def find_#{nameName}_method_name_or_croak(*names)
86
+ r = syntax_builder.name_builder_method(*names, find_#{nameName}_name_or_croak)
87
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_ca(:'f_#{nameName}_method_name', potrubi_bootstrap_logger_fmt_who('#{nameName}' => r))
88
+ r
89
+ end
90
+ "
91
+ end
92
+
93
+ findNamesText = findNamesTexts.flatten.compact.join("\n")
94
+
95
+ module_eval(findNamesText)
96
+
97
+ def edits
98
+ @edits ||= []
99
+ end
100
+
101
+ def specs
102
+ @specs ||= []
103
+ end
104
+
105
+ def add_edits_or_croak(*newEdits)
106
+ eye = :a_edits
107
+ newEditsNrm = newEdits.flatten.compact
108
+ newEdistNrm.each {|a| potrubi_bootstrap_mustbe_hash_or_croak(a) } # validate
109
+ curEdits = edits.concat(newEditsNrm) # concat updates self
110
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_me(eye, potrubi_bootstrap_logger_fmt_who(curEdits: curEdits, newEdits: newEditsNrm))
111
+ curEdits
112
+ end
113
+
114
+ def add_specs_or_croak(*newSpecs)
115
+ eye = :a_specs
116
+ newSpecsNrm = newSpecs.flatten.compact
117
+ newSpecsNrm.each {|a| potrubi_bootstrap_mustbe_hash_or_croak(a) } # validate
118
+ curSpecs = specs.concat(newSpecsNrm) # concat updates self
119
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_me(eye, potrubi_bootstrap_logger_fmt_who(curSpecs: curSpecs, newSpecs: newSpecsNrm))
120
+ curSpecs
121
+ end
122
+
123
+ def reduce_specs_or_croak
124
+ eye = :'rdc_specs'
125
+
126
+ specHash = potrubi_util_reduce_hashes_or_croak(*specs)
127
+
128
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_me(eye, potrubi_bootstrap_logger_fmt_who(specHash: specHash))
129
+
130
+ specHash
131
+ end
132
+
133
+ def make_syntax_specs_or_croak
134
+ eye = 'DSL:C2d:m_syn_specs'
135
+
136
+ syntaxSpecs = reduce_specs_or_croak.values.map {|s| s.to_s }.join("\n")
137
+
138
+ syntaxSpecs
139
+
140
+ end
141
+
142
+
143
+ def to_s
144
+ potrubi_bootstrap_logger_fmt(potrubi_bootstrap_logger_instance_telltale('DSLC2d'), potrubi_bootstrap_logger_fmt(n: name))
145
+ end
146
+
147
+
148
+ def type_handlers
149
+ @type_handlers ||=
150
+ begin
151
+ {
152
+ d2: :prepare,
153
+ }.each_with_object({}) {|(k,v), h| h[k] = "#{v}_or_croak".to_sym }
154
+ end
155
+ end
156
+
157
+ def assert_self
158
+ prepare_or_croak
159
+ express
160
+ end
161
+
162
+ def express
163
+ make_syntax_or_croak
164
+ end
165
+
166
+
167
+
168
+ # Prepare Methods
169
+ # ###############
170
+
171
+
172
+ def prepare_or_croak(descArgs=nil, &descBlok)
173
+ eye = :'DSLC2d::pro'
174
+
175
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_me(eye, potrubi_bootstrap_logger_fmt_who(descArgs: descArgs, descBlok: descBlok))
176
+
177
+ prepareOrder = self.class.prepare_order(type)
178
+
179
+ prepareOrder.each {|k, v| __send__(v, k) }
180
+
181
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_ca(eye, potrubi_bootstrap_logger_fmt_who(descArgs: descArgs, descBlok: descBlok))
182
+
183
+ self
184
+
185
+ end
186
+
187
+ def normalise_cache_name_or_croak(cacheName=nil)
188
+ cacheName ? cacheName.to_s.to_sym : nil
189
+ end
190
+
191
+ def pluralise_cache_name_or_croak(cacheSingularName)
192
+ "#{cacheSingularName}_plu_name"
193
+ end
194
+
195
+ def singularise_cache_name_or_croak(cachePluralName)
196
+ "#{cachePluralName}_snl_name"
197
+ end
198
+
199
+
200
+ def prepare_name_or_croak(prcsArgs=nil, &prcsBlok)
201
+ eye = :'DSLC2d::pre_name'
202
+
203
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_me(eye, potrubi_bootstrap_logger_fmt_who(prcsArgs: prcsArgs, prcsBlok: prcsBlok))
204
+
205
+ cacheName = find_name_or_croak
206
+
207
+ cacheSingularName = normalise_cache_name_or_croak(singular_name)
208
+ cachePluralName = normalise_cache_name_or_croak(plural_name)
209
+
210
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_ms(eye, 'PRE NORM', potrubi_bootstrap_logger_fmt_who(cacheName: cacheName, cacheSingularName: cacheSingularName, cachePluralName: cachePluralName))
211
+
212
+ # cache name expected to be the plural name
213
+
214
+ cachePluralName ||= cacheName
215
+
216
+ cacheSingularName ||= singularise_cache_name_or_croak(cachePluralName)
217
+
218
+
219
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_ms(eye, 'POST NORM', potrubi_bootstrap_logger_fmt_who(cacheName: cacheName, cacheSingularName: cacheSingularName, cachePluralName: cachePluralName))
220
+
221
+ cacheSingularNameNrm = normalise_cache_name_or_croak(cacheSingularName)
222
+ cachePluralNameNrm = normalise_cache_name_or_croak(cachePluralName)
223
+
224
+ potrubi_bootstrap_mustbe_symbol_or_croak(cacheSingularNameNrm)
225
+ potrubi_bootstrap_mustbe_symbol_or_croak(cachePluralNameNrm)
226
+
227
+ (cacheSingularNameNrm == cachePluralNameNrm) && potrubi_bootstrap_duplicate_exception(cacheSingularNameNrm, eye, "singular and plural names the same")
228
+
229
+ self.singular_name = cacheSingularNameNrm
230
+ self.plural_name = cachePluralNameNrm
231
+
232
+ self
233
+
234
+ end
235
+
236
+ def prepare_scope_or_croak(prcsArgs=nil, &prcsBlok)
237
+ eye = :'DSLC2d::pro_scope'
238
+
239
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_me(eye, potrubi_bootstrap_logger_fmt_who(prcsArgs: prcsArgs, prcsBlok: prcsBlok))
240
+
241
+ cacheName = name
242
+ cacheScope = scope
243
+
244
+ scopeVariable = case cacheScope
245
+ when :local then "@LOCAL_CACHE_VARIABLE_#{cacheName}_#{rand(1000000000)}".downcase
246
+ when :global then "$POTRUBI_GLOBAL_CACHE_VARIABLE_#{cacheName}".upcase
247
+ else
248
+ potrubi_bootstrap_surprise_exception(cacheScope, eye, "cacheScope >#{cacheScope}< is what?")
249
+ end
250
+
251
+ self.cache_variable = scopeVariable
252
+
253
+ self.cache_instance_variable ||= :cache_store # name of the instance variable holding the cache in getter/setter
254
+ self.cache_local_variable ||= :cacheStore # name of the local variable for the cache
255
+
256
+ cacheContainer = (cache_container || :hash).to_s.capitalize
257
+
258
+ case cacheContainer
259
+ when 'Hash' then
260
+ self.cache_validate_method ||= 'potrubi_bootstrap_mustbe_hash_or_croak'
261
+ self.cache_new_method ||= '{}'
262
+ else
263
+ self.cache_new_method ||= "#{cacheContainer}.new"
264
+ end
265
+
266
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_ca(eye, potrubi_bootstrap_logger_fmt_who(cacheName: cacheName, scopeVariable: scopeVariable, cacheScope: cacheScope))
267
+
268
+ self
269
+
270
+ end
271
+
272
+
273
+ # Syntax Methods
274
+ # ##############
275
+
276
+ def make_syntax_or_croak(descArgs=nil, &descBlok)
277
+ eye = :'DSLC2d::m_syn'
278
+
279
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_me(eye, potrubi_bootstrap_logger_fmt_who(descArgs: descArgs, descBlok: descBlok))
280
+
281
+ syntaxOrder = self.class.syntax_order(type)
282
+
283
+ syntaxOrder.each {|k, v| __send__(v, k) }
284
+
285
+ make_syntax_specs_or_croak
286
+
287
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_ca(eye, potrubi_bootstrap_logger_fmt_who(descArgs: descArgs, descBlok: descBlok))
288
+
289
+ self
290
+
291
+ end
292
+
293
+ # Scope Syntax Methods
294
+ # ####################
295
+
296
+ def make_syntax_scope_or_croak(descArgs=nil, &descBlok)
297
+ eye = :'DSLC2d::m_syn_scope'
298
+
299
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_me(eye, potrubi_bootstrap_logger_fmt_who(descArgs: descArgs, descBlok: descBlok))
300
+
301
+ syntaxBuilder = syntax_builder
302
+
303
+ cacheName = find_name_or_croak
304
+
305
+ cacheVariable = cache_variable
306
+ cacheInstanceVariable = cache_instance_variable
307
+ cacheNewMethod = cache_new_method
308
+ cacheValidateMethod = cache_validate_method
309
+
310
+ syntaxScopeGetter = syntaxBuilder.new_method do
311
+
312
+ getter_name cacheName
313
+
314
+ getter_eye cacheName
315
+
316
+ syntaxCacheVariable = named_expression :assign_if_not_set, cacheVariable, cacheNewMethod
317
+
318
+ assign_instance_variable cacheInstanceVariable, syntaxCacheVariable
319
+
320
+ syntaxCacheInstanceVariable = instance_variable cacheInstanceVariable
321
+
322
+ logger_call who_only: {cacheInstanceVariable => syntaxCacheInstanceVariable}
323
+
324
+ result syntaxCacheInstanceVariable
325
+
326
+ end
327
+
328
+ syntaxScopeSetter = nil
329
+
330
+ syntaxScopeSetter = syntaxBuilder.new_method do
331
+
332
+ setter_name cacheName
333
+
334
+ setter_eye cacheName
335
+
336
+ signature :newCache
337
+
338
+ syntaxCacheInstanceVariable = instance_variable cacheInstanceVariable
339
+
340
+ assign_instance_variable cacheInstanceVariable,
341
+ named_expression(:method_call, cacheValidateMethod, get_signature)
342
+
343
+
344
+ logger_call who_only: {cacheInstanceVariable => syntaxCacheInstanceVariable}
345
+
346
+ result syntaxCacheInstanceVariable
347
+
348
+ end
349
+
350
+ add_specs_or_croak(scope_getter: syntaxScopeGetter, scope_setter: syntaxScopeSetter)
351
+
352
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_ca(eye, potrubi_bootstrap_logger_fmt_who(descArgs: descArgs, descBlok: descBlok))
353
+
354
+ self
355
+
356
+ end
357
+
358
+ # Add Syntax Methods
359
+ # ##################
360
+
361
+ # add is semantically merge
362
+
363
+ def normalise_and_validate_method_map
364
+ @normalise_and_validate_method_map ||= { key_normalise_method: :nVal,
365
+ value_normalise_method: :vVal,
366
+ key_validate_method: :nVal,
367
+ value_validate_method: :vVal,
368
+ }
369
+ end
370
+
371
+ def make_syntax_add_or_croak(descArgs=nil, &descBlok)
372
+ eye = :'DSLC2d::m_syn_add'
373
+
374
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_me(eye, potrubi_bootstrap_logger_fmt_who(descArgs: descArgs, descBlok: descBlok))
375
+
376
+ syntaxBuilder = syntax_builder
377
+
378
+ self.key_normalise_method = 'key_norm_thd' # TESTING
379
+ self.value_validate_method = 'val_val_mth'
380
+
381
+ add_specs_or_croak(add_multiple_or_croak: make_syntax_add_plural_or_croak,
382
+ add_multiple_rescue: syntaxBuilder.new_method_rescue(:add, find_plural_name_or_croak),
383
+ add_single_or_croak:
384
+ syntaxBuilder.new_method_caller_callee(caller: find_singular_or_croak_method_name_or_croak(:add),
385
+ callee: find_plural_or_croak_method_name_or_croak(:add),
386
+ caller_sig: [:x, :y],
387
+ callee_args: '{x => y}',
388
+ ),
389
+ add_singular_rescue: syntaxBuilder.new_method_rescue(:add, find_singular_name_or_croak),
390
+
391
+ add_merge_aliases:
392
+ syntaxBuilder.new_aliases(find_plural_or_croak_method_name_or_croak(:add) => find_plural_method_name_or_croak(:merge),
393
+ )
394
+
395
+ )
396
+
397
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_ca(eye, potrubi_bootstrap_logger_fmt_who(descArgs: descArgs, descBlok: descBlok))
398
+
399
+ self
400
+
401
+ end
402
+
403
+ def make_syntax_add_plural_or_croak(descArgs=nil, &descBlok)
404
+ eye = :'DSLC2d::m_syn_add_plu'
405
+
406
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_me(eye, potrubi_bootstrap_logger_fmt_who(descArgs: descArgs, descBlok: descBlok))
407
+
408
+ syntaxBuilder = syntax_builder
409
+
410
+ cacheName = find_name_or_croak
411
+ cachePluralName = find_plural_name_or_croak
412
+
413
+ cacheInstanceVariable = cache_instance_variable
414
+ cacheLocalVariable = cache_local_variable
415
+
416
+ syntaxAddPLUOrCroak = syntaxBuilder.new_method(parent: self) do
417
+
418
+ syntaxCacheInstanceVariable = instance_variable cacheInstanceVariable
419
+
420
+ croak_name :add, cachePluralName
421
+
422
+ set_eye :a, cachePluralName
423
+
424
+ signature :args_and_block, :add
425
+
426
+ contracts addArgs: :hash
427
+
428
+ assign_local_variable cacheLocalVariable, name_builder_method_getter(cacheName)
429
+
430
+ iterator :each, :addValues, :nVal, :vVal do
431
+
432
+ snippet "
433
+ #{cacheLocalVariable}[nVal] = case
434
+ when (r = #{cacheInstanceVariable}.has_key?(nVal)) then
435
+ Kernel.block_given? ? addBlok.call(nVal, r, vVal) : potrubi_bootstrap_duplicate_exception(nVal, eye, 'nVal seen twice')
436
+ else
437
+ vVal
438
+ end
439
+ "
440
+
441
+ end
442
+
443
+ logger_call who_only: {cacheInstanceVariable => syntaxCacheInstanceVariable}
444
+
445
+ set_result_self
446
+
447
+ end
448
+
449
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_ca(eye, potrubi_bootstrap_logger_fmt_who(descArgs: descArgs, descBlok: descBlok))
450
+
451
+ syntaxAddPLUOrCroak
452
+
453
+ end
454
+
455
+ # Delete Syntax Methods
456
+ # ##################
457
+
458
+ def make_syntax_delete_or_croak(descArgs=nil, &descBlok)
459
+ eye = :'DSLC2d::m_syn_delete'
460
+
461
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_me(eye, potrubi_bootstrap_logger_fmt_who(descArgs: descArgs, descBlok: descBlok))
462
+
463
+ syntaxBuilder = syntax_builder
464
+
465
+ self.key_normalise_method = 'key_norm_thd' # TESTING
466
+ self.value_validate_method = 'val_val_mth'
467
+
468
+ add_specs_or_croak(
469
+ delete_multiple_or_croak: make_syntax_delete_plural_or_croak,
470
+ delete_multiple_rescue: syntaxBuilder.new_method_rescue(:delete, find_plural_name_or_croak),
471
+
472
+ delete_single_or_croak:
473
+ syntaxBuilder.new_method_caller_callee(caller: find_singular_or_croak_method_name_or_croak(:delete),
474
+ callee: find_plural_or_croak_method_name_or_croak(:delete),
475
+ caller_sig: [:x, :y],
476
+ callee_args: '{x => y}',
477
+ ),
478
+ delete_singular_rescue: syntaxBuilder.new_method_rescue(:delete, find_singular_name_or_croak),
479
+
480
+
481
+
482
+ )
483
+
484
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_ca(eye, potrubi_bootstrap_logger_fmt_who(descArgs: descArgs, descBlok: descBlok))
485
+
486
+ self
487
+
488
+ end
489
+
490
+ def make_syntax_delete_plural_or_croak(descArgs=nil, &descBlok)
491
+ eye = :'DSLC2d::m_syn_delete_plu'
492
+
493
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_me(eye, potrubi_bootstrap_logger_fmt_who(descArgs: descArgs, descBlok: descBlok))
494
+
495
+ syntaxBuilder = syntax_builder
496
+
497
+ cacheName = find_name_or_croak
498
+ cachePluralName = find_plural_name_or_croak
499
+
500
+ cacheInstanceVariable = cache_instance_variable
501
+ cacheLocalVariable = cache_local_variable
502
+
503
+ syntaxDeletePLUOrCroak = syntaxBuilder.new_method(parent: self) do
504
+
505
+ syntaxCacheInstanceVariable = instance_variable cacheInstanceVariable
506
+
507
+ croak_name :delete, cachePluralName
508
+
509
+ set_eye :d, cachePluralName
510
+
511
+ signature :values_and_block, :del
512
+
513
+ assign_local_variable cacheLocalVariable, name_builder_method_getter(cacheName)
514
+
515
+ snippet "
516
+ deleteResult = delValues.flatten.compact.each_with_object({}) {|k,h| #{cacheLocalVariable}.has_key?(k) && (h[k] = #{cacheLocalVariable}[k]) }
517
+ "
518
+
519
+ logger_call who_only: {'deleteResult' => :deleteResult}
520
+
521
+ result :deleteResult
522
+
523
+ end
524
+
525
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_ca(eye, potrubi_bootstrap_logger_fmt_who(descArgs: descArgs, descBlok: descBlok))
526
+
527
+ syntaxDeletePLUOrCroak
528
+
529
+ end
530
+
531
+
532
+ # Each Syntax Methods
533
+ # ###################
534
+
535
+ def make_syntax_each_or_croak(descArgs=nil, &descBlok)
536
+ eye = :'DSLC2d::m_syn_each'
537
+
538
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_me(eye, potrubi_bootstrap_logger_fmt_who(descArgs: descArgs, descBlok: descBlok))
539
+
540
+ syntaxBuilder = syntax_builder
541
+
542
+ add_specs_or_croak(each: make_syntax_each_singular_or_croak)
543
+
544
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_ca(eye, potrubi_bootstrap_logger_fmt_who(descArgs: descArgs, descBlok: descBlok))
545
+
546
+ self
547
+
548
+ end
549
+
550
+ def make_syntax_each_singular_or_croak(descArgs=nil, &descBlok)
551
+ eye = :'DSLC2d::m_syn_each_snl'
552
+
553
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_me(eye, potrubi_bootstrap_logger_fmt_who(descArgs: descArgs, descBlok: descBlok))
554
+
555
+ syntaxBuilder = syntax_builder
556
+
557
+ cacheName = find_name_or_croak
558
+ cacheSingularName = find_singular_name_or_croak
559
+
560
+ cacheInstanceVariable = cache_instance_variable
561
+ cacheLocalVariable = cache_local_variable
562
+
563
+ syntaxEachSNLOrCroak = syntaxBuilder.new_method(parent: self) do
564
+
565
+ name :each, cacheSingularName
566
+
567
+ set_eye :e, cacheSingularName
568
+
569
+ signature :args_and_block, :each
570
+
571
+ assign_local_variable cacheLocalVariable, name_builder_method_getter(cacheName)
572
+
573
+ snippet "
574
+ eachResult = case
575
+ when Kernel.block_given? then
576
+ #{cacheLocalVariable}.each {|v| yield v }
577
+ self
578
+ else
579
+ #{cacheLocalVariable}.to_enum(:each)
580
+ end
581
+ "
582
+
583
+ logger_call who_only: {'eachResult' => :eachResult}
584
+
585
+ result :eachResult
586
+
587
+ end
588
+
589
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_ca(eye, potrubi_bootstrap_logger_fmt_who(descArgs: descArgs, descBlok: descBlok))
590
+
591
+ syntaxEachSNLOrCroak
592
+
593
+ end
594
+
595
+ # Select / Reject Syntax Methods
596
+ # ##############################
597
+
598
+ def make_syntax_select_or_croak(descArgs=nil, &descBlok)
599
+ eye = :'DSLC2d::m_syn_select'
600
+
601
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_me(eye, potrubi_bootstrap_logger_fmt_who(descArgs: descArgs, descBlok: descBlok))
602
+
603
+ syntaxBuilder = syntax_builder
604
+
605
+ add_specs_or_croak(select: make_syntax_select_plural_or_croak,
606
+ reject: make_syntax_reject_plural_or_croak)
607
+
608
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_ca(eye, potrubi_bootstrap_logger_fmt_who(descArgs: descArgs, descBlok: descBlok))
609
+
610
+ self
611
+
612
+ end
613
+
614
+ def make_syntax_select_plural_or_croak(descArgs=nil, &descBlok)
615
+ eye = :'DSLC2d::m_syn_select_snl'
616
+
617
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_me(eye, potrubi_bootstrap_logger_fmt_who(descArgs: descArgs, descBlok: descBlok))
618
+
619
+ syntaxBuilder = syntax_builder
620
+
621
+ cacheName = find_name_or_croak
622
+ cachePluralName = find_plural_name_or_croak
623
+
624
+ cacheLocalVariable = cache_local_variable
625
+
626
+ syntaxSelectPLUOrCroak = syntaxBuilder.new_method(parent: self) do
627
+
628
+ name :select, cachePluralName
629
+
630
+ set_eye :sel, cachePluralName
631
+
632
+ signature :args_and_block, :sel
633
+
634
+ assign_local_variable cacheLocalVariable, name_builder_method_getter(cacheName)
635
+
636
+ snippet "
637
+ selectResult = case
638
+ when Kernel.block_given? then #{cacheLocalVariable}.select {|v| yield v }
639
+ else
640
+ #{cacheLocalVariable}.to_enum(:each)
641
+ end
642
+ "
643
+
644
+ logger_call who_only: {'selectResult' => :selectResult}
645
+
646
+ result :selectResult
647
+
648
+ end
649
+
650
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_ca(eye, potrubi_bootstrap_logger_fmt_who(descArgs: descArgs, descBlok: descBlok))
651
+
652
+ syntaxSelectPLUOrCroak
653
+
654
+ end
655
+
656
+ def make_syntax_reject_plural_or_croak(descArgs=nil, &descBlok)
657
+ eye = :'DSLC2d::m_syn_reject_snl'
658
+
659
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_me(eye, potrubi_bootstrap_logger_fmt_who(descArgs: descArgs, descBlok: descBlok))
660
+
661
+ syntaxBuilder = syntax_builder
662
+
663
+ cacheName = find_name_or_croak
664
+ cachePluralName = find_plural_name_or_croak
665
+ cacheLocalVariable = cache_local_variable
666
+
667
+ syntaxRejectPLUOrCroak = syntaxBuilder.new_method(parent: self) do
668
+
669
+ name :reject, cachePluralName
670
+
671
+ set_eye :rej, cachePluralName
672
+
673
+ signature :args_and_block, :rej
674
+
675
+ assign_local_variable cacheLocalVariable, name_builder_method_getter(cacheName)
676
+
677
+ snippet "
678
+ rejectResult = case
679
+ when Kernel.block_given? then #{cacheLocalVariable}.reject {|v| yield v }
680
+ else
681
+ #{cacheLocalVariable}.to_enum(:each)
682
+ end
683
+ "
684
+
685
+ logger_call who_only: {'rejectResult' => :rejectResult}
686
+
687
+ result :rejectResult
688
+
689
+ end
690
+
691
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_ca(eye, potrubi_bootstrap_logger_fmt_who(descArgs: descArgs, descBlok: descBlok))
692
+
693
+ syntaxRejectPLUOrCroak
694
+
695
+ end
696
+
697
+ # Size Syntax Methods
698
+ # ###################
699
+
700
+ def make_syntax_size_or_croak(descArgs=nil, &descBlok)
701
+ eye = :'DSLC2d::m_syn_size'
702
+
703
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_me(eye, potrubi_bootstrap_logger_fmt_who(descArgs: descArgs, descBlok: descBlok))
704
+
705
+ syntaxBuilder = syntax_builder
706
+
707
+ add_specs_or_croak(size: make_syntax_size_plural_or_croak)
708
+
709
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_ca(eye, potrubi_bootstrap_logger_fmt_who(descArgs: descArgs, descBlok: descBlok))
710
+
711
+ self
712
+
713
+ end
714
+
715
+ def make_syntax_size_plural_or_croak(descArgs=nil, &descBlok)
716
+ eye = :'DSLC2d::m_syn_size_snl'
717
+
718
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_me(eye, potrubi_bootstrap_logger_fmt_who(descArgs: descArgs, descBlok: descBlok))
719
+
720
+ syntaxBuilder = syntax_builder
721
+
722
+ cacheName = find_name_or_croak
723
+ cachePluralName = find_plural_name_or_croak
724
+ cacheInstanceVariable = cache_instance_variable
725
+
726
+ syntaxSizeSNLOrCroak = syntaxBuilder.new_method(parent: self) do
727
+
728
+ syntaxCacheInstanceVariable = instance_variable cacheInstanceVariable
729
+
730
+ name :size, cachePluralName
731
+
732
+ set_eye :e, cachePluralName
733
+
734
+ snippet "
735
+ sizeResult = defined?(#{syntaxCacheInstanceVariable}) ? #{syntaxCacheInstanceVariable}.size : 0
736
+ "
737
+
738
+ logger_call who_only: {'sizeResult' => :sizeResult}
739
+
740
+ result :sizeResult
741
+
742
+ end
743
+
744
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_ca(eye, potrubi_bootstrap_logger_fmt_who(descArgs: descArgs, descBlok: descBlok))
745
+
746
+ syntaxSizeSNLOrCroak
747
+
748
+ end
749
+
750
+ # Assign Statement Methods for Normalise and Validate
751
+ # ###################################################
752
+
753
+ methodTexts = { key_normalise_method: :nVal,
754
+ value_normalise_method: :vVal,
755
+ key_validate_method: :nVal,
756
+ value_validate_method: :vVal,
757
+ }.map do | mthName, argNameDef |
758
+ "def add_statement_#{mthName}(mthInst=self, varName=nil);
759
+ callName = #{mthName}; # any method defined?
760
+ callName ? begin
761
+ argName = varName || '#{argNameDef}';
762
+ mthInst.add_statement_assign_local_variable(argName, mthInst.new_statement_method_call(callName, argName));
763
+ end
764
+ : self;
765
+ end;
766
+ "
767
+ end
768
+
769
+ methodText = methodTexts.flatten.compact.join("\n")
770
+
771
+ module_eval(methodText)
772
+
773
+ # Syntax Builder Methods
774
+ # ######################
775
+
776
+ def syntax_builder
777
+ @syntax_builder ||= self.class.syntax_builder
778
+ end
779
+
780
+ # Support Methods
781
+ # ###############
782
+
783
+ def validate_or_croak(prcsArgs=nil, &prcsBlok)
784
+ eye = :'DSLC2d::val'
785
+
786
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_me(eye, potrubi_bootstrap_logger_fmt_who(prcsArgs: prcsArgs, prcsBlok: prcsBlok))
787
+
788
+ potrubi_bootstrap_mustbe_symbol_or_croak(name, eye)
789
+ potrubi_bootstrap_mustbe_symbol_or_croak(scope, eye)
790
+ potrubi_bootstrap_mustbe_not_nil_or_croak(key, eye)
791
+ potrubi_bootstrap_mustbe_not_nil_or_croak(value, eye)
792
+
793
+ $DEBUG_POTRUBI_BOOTSTRAP && potrubi_bootstrap_logger_ca(eye, potrubi_bootstrap_logger_fmt_who(prcsArgs: prcsArgs, prcsBlok: prcsBlok))
794
+
795
+ self
796
+
797
+ end
798
+
799
+ end
800
+
801
+ module Potrubi
802
+ class DSL
803
+ class Cache2D < Potrubi::DSL::Super
804
+ end
805
+ end
806
+ end
807
+
808
+ Potrubi::DSL::Cache2D.__send__(:include, instanceMethods) # Instance Methods
809
+ Potrubi::DSL::Cache2D.extend(classMethods) # Class Methods
810
+
811
+ __END__