potrubi 0.0.3 → 0.0.4

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 (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
@@ -3,51 +3,97 @@
3
3
 
4
4
  # various useful methods
5
5
 
6
- require_relative '../core'
6
+ # Notes *ONLY* need bootstrap
7
7
 
8
- #requireList = %w(bootstrap)
9
- #requireList.each {|r| require_relative "#{r}"}
8
+ require_relative '../bootstrap'
10
9
 
11
10
  mixinContent = Module.new do
11
+
12
+ def potrubi_util_merge_arrays_or_croak(*arrays)
13
+ r = arrays.compact.inject({}) {|s, a| s.concat(potrubi_bootstrap_mustbe_array_or_croak(a)) }
14
+ r.empty? ? nil : r
15
+ end
16
+ alias_method :potrubi_util_merge_arrays, :potrubi_util_merge_arrays_or_croak
17
+ alias_method :potrubi_util_reduce_arrays, :potrubi_util_merge_arrays_or_croak
12
18
 
13
- #=begin
14
- def potrubi_util_merge_hashes_or_croak(*hashes)
15
- r = hashes.flatten.compact.inject({}) {|s, h| s.merge(potrubi_bootstrap_mustbe_hash_or_croak(h))}
19
+ def potrubi_util_merge_hashes_or_croak(*hashes, &mergeBlok)
20
+ r = hashes.flatten.compact.inject({}) {|s, h| s.merge(potrubi_bootstrap_mustbe_hash_or_croak(h), &mergeBlok)}
16
21
  r.empty? ? nil : r
17
22
  end
18
23
  alias_method :potrubi_util_merge_hashes, :potrubi_util_merge_hashes_or_croak
19
- #=end
24
+ alias_method :potrubi_util_reduce_hashes_or_croak, :potrubi_util_merge_hashes_or_croak
25
+ alias_method :potrubi_util_reduce_hashes, :potrubi_util_merge_hashes_or_croak
20
26
 
27
+ def potrubi_util_merge_hashes_concatenate_array_values_or_croak(*hashes)
28
+ potrubi_util_merge_hashes_or_croak(*hashes) do | k, oldV, newV |
29
+ case
30
+ when oldV.is_a?(Array) && newV.is_a?(Array) then [].concat(oldV).concat(newV)
31
+ else
32
+ newV
33
+ end
34
+ end
35
+ end
36
+
21
37
  # Apply a proc to the hash values and return a new hash with new values
22
38
 
23
- #=begin
24
39
  def potrubi_util_apply_proc_to_hash_or_croak(srceHash, &srceBlok)
25
- mustbe_proc_or_croak(srceBlok)
26
- mustbe_hash_or_croak(srceHash).each_with_object({}) {|(k,v),h| h[k] = srceBlok.call(k, v) }
40
+ potrubi_bootstrap_mustbe_proc_or_croak(srceBlok)
41
+ potrubi_bootstrap_mustbe_hash_or_croak(srceHash).each_with_object({}) {|(k,v),h| h[k] = srceBlok.call(k, v) }
27
42
  end
28
43
  alias_method :potrubi_util_map_hash_value, :potrubi_util_apply_proc_to_hash_or_croak
29
44
  alias_method :potrubi_util_map_hash_v, :potrubi_util_apply_proc_to_hash_or_croak
30
- #=end
31
- #=begin
45
+
32
46
  def potrubi_util_map_hash_key_and_value_or_croak(srceHash, &srceBlok)
33
- mustbe_proc_or_croak(srceBlok)
34
- mustbe_hash_or_croak(srceHash).each_with_object({}) {|(k,v),h| r = mustbe_array_or_croak(srceBlok.call(k, v)); h[r[0]] = r[1] }
47
+ potrubi_bootstrap_mustbe_proc_or_croak(srceBlok)
48
+ potrubi_bootstrap_mustbe_hash_or_croak(srceHash).each_with_object({}) {|(k,v),h| r = potrubi_bootstrap_mustbe_array_or_croak(srceBlok.call(k, v)); h[r[0]] = r[1] }
35
49
  end
36
50
  alias_method :potrubi_util_map_hash_kv, :potrubi_util_map_hash_key_and_value_or_croak
37
- #=end
38
51
 
39
- #=begin
52
+ # find hash keys recursively
53
+ def potrubi_util_find_hash_keys_or_croak(srceHash, *srceKeys, &srceBlok)
54
+ potrubi_bootstrap_mustbe_hash_or_croak(srceHash)
55
+
56
+ # puts "potrubi_util_find_hash_keys_or_croak srceHash #{srceHash}"
57
+ # puts "potrubi_util_find_hash_keys_or_croak srceKeys #{srceKeys}"
58
+
59
+ r = srceKeys.flatten.compact.reduce(srceHash) do | s, k |
60
+ # puts "potrubi_util_find_hash_keys_or_croak k #{k} s #{s}"
61
+ ###(s.is_a?(Hash) && s.has_key?(k)) ? s[k] : break
62
+ (s.is_a?(Hash) && s.has_key?(k)) ? s[k] : potrubi_bootstrap_mustbe_key_or_croak(s, k, 'potrubi_util_find_hash_keys_or_croak')
63
+ end
64
+ # any blok? - call even if nil (i.e key was found and value was nil)
65
+ srceBlok ? srceBlok.call(r) : r
66
+ end
67
+
68
+ def potrubi_util_find_hash_keys(srceHash, *srceKeys, &srceBlok)
69
+ potrubi_util_find_hash_keys_or_croak(srceHash, *srceKeys, &srceBlok) rescue nil
70
+ end
71
+
40
72
  def potrubi_util_array_to_hash(aVal, &procBlok)
41
- mustbe_array_or_croak(aVal)
73
+ aVal.is_a?(Array) || aVal.is_a?(Enumerator) || potrubi_bootstrap_mustbe_array_or_croak(aVal)
42
74
  case
43
- when Kernel.block_given? then aVal.each_with_object({}) {|a, h| r = mustbe_array_or_croak(procBlok.call(a)); h[r[0]] = r[1] } # k&v from proc
75
+ when Kernel.block_given? then aVal.each_with_object({}) {|a, h| r = potrubi_bootstrap_mustbe_array_or_croak(procBlok.call(a)); h[r[0]] = r[1] } # k&v from proc
44
76
  else
45
77
  aVal.each_with_object({}) {|a, h| h[a] = nil } # values to nil
46
78
  end
47
79
  end
48
- #=end
80
+
81
+ def potrubi_util_setter_or_croak(setTarget, *hashes, &mergeBlok)
82
+ potrubi_util_merge_hashes_or_croak(*hashes, &mergeBlok).each {|k, v| setTarget.__send__("#{k}=", v) }
83
+ setTarget
84
+ end
85
+ alias_method :potrubi_util_set_attributes_or_croak, :potrubi_util_setter_or_croak
86
+
87
+ end
88
+
89
+ module Potrubi
90
+ module Mixin
91
+ module Util
92
+ end
93
+ end
49
94
  end
50
95
 
51
- Potrubi::Core.assign_module_constant_or_croak(mixinContent, :Potrubi, :Mixin, :Util)
96
+ Potrubi::Mixin::Util.__send__(:include, mixinContent) # Instance Methods
52
97
 
53
98
  __END__
99
+
@@ -2,5 +2,5 @@
2
2
  # Version for Potrubi
3
3
 
4
4
  module Potrubi
5
- VERSION = "0.0.3"
5
+ VERSION = "0.0.4"
6
6
  end
@@ -0,0 +1,205 @@
1
+
2
+ # Potrubi Test Bootstrap Common Mixin
3
+
4
+ require 'minitest/autorun'
5
+ require 'minitest/spec'
6
+
7
+ require 'potrubi/mixin/logger'
8
+ require 'potrubi/mixin/bootstrap_common'
9
+
10
+ class TestClass1
11
+
12
+
13
+ include Potrubi::Mixin::Logger
14
+ include Potrubi::Mixin::BootstrapCommon
15
+
16
+ end
17
+
18
+ describe TestClass1 do
19
+
20
+ before do
21
+ @mixConstant = Potrubi::Mixin::BootstrapCommon
22
+ @t = TestClass1.new
23
+ @validClassMethods = [#:logger,
24
+ #:new_logger,
25
+ ]
26
+
27
+ @validLoggerInstanceMethods = [
28
+ :logger,
29
+ :logger_instance_telltale,
30
+ :logger_me,
31
+ :logger_mx,
32
+ :logger_ms,
33
+ :logger_ca,
34
+ :logger_beg,
35
+ :logger_fin,
36
+ :logger_fmt,
37
+ :logger_fmt_kls,
38
+ :logger_fmt_kls_size,
39
+ :logger_fmt_who,
40
+ :logger_fmt_who_only,
41
+
42
+ ].map {|m| "potrubi_bootstrap_#{m}" }
43
+
44
+
45
+ @validContractInstanceMethods = [:hash,
46
+ :array,
47
+ :fixnum,
48
+ :string,
49
+ :symbol,
50
+ :float,
51
+ :class,
52
+ :module,
53
+ :proc,
54
+ :key,
55
+ :file,
56
+ :directory,
57
+ :not_nil,
58
+ :not_empty,
59
+ :empty
60
+ ].map {|m| "potrubi_bootstrap_mustbe_#{m}_or_croak"}
61
+
62
+ @validExceptionInstanceMethods = [:raise,
63
+ :surprise,
64
+ :duplicate,
65
+ :missing,
66
+ ].map {|m| "potrubi_bootstrap_#{m}_exception" }
67
+
68
+ @validInstanceMethods = [@validContractInstanceMethods,
69
+ @validLoggerInstanceMethods,
70
+ @validExceptionInstanceMethods,
71
+ ].flatten
72
+
73
+ @validContractTests = {
74
+ hash: {},
75
+ array: [],
76
+ string: 'Hi There',
77
+ symbol: :'A symbol',
78
+ fixnum: 1,
79
+ float: 2.3,
80
+
81
+ class: Class.new,
82
+ module: Module.new,
83
+
84
+ file: __FILE__,
85
+ directory: File.dirname(__FILE__),
86
+
87
+ #empty: [],
88
+ #not_empty: %w(this is not empty),
89
+ #not_nil: 'definitely is not nil',
90
+ ###proc: ->(p) {true}, # can't test proc for some reason - confuses Minitest?
91
+ }
92
+
93
+ @invalidContractTests = {
94
+ hash: {},
95
+ array: [],
96
+ string: 'Hi There',
97
+ symbol: :'A symbol',
98
+ fixnum: 1,
99
+ float: 2.3,
100
+
101
+ #class: Class.new,
102
+ module: Module.new,
103
+
104
+ #file: __FILE__,
105
+ #directory: File.dirname(__FILE__),
106
+
107
+
108
+ ###proc: ->(p) {true}, # can't test proc for some reason - confuses Minitest?
109
+ }
110
+
111
+ @validContractSpecialTests = {
112
+ empty: [],
113
+ not_empty: %w(this is not empty),
114
+ not_nil: 'definitely is not nil',
115
+ }
116
+ end
117
+
118
+ describe 'mixin reponds to only module methods' do
119
+
120
+ it 'has valid module methods' do
121
+ @validClassMethods.each { | methodName | @mixConstant.must_respond_to methodName }
122
+ end
123
+
124
+ it 'mixin doesnt repond to instance methods' do
125
+ @validInstanceMethods.each { | methodName | @mixConstant.wont_respond_to methodName }
126
+ end
127
+
128
+
129
+ end
130
+
131
+ describe 'class reponds to instance methods' do
132
+
133
+ it 'has valid instance methods' do
134
+ @validInstanceMethods.each { | methodName | @t.must_respond_to methodName }
135
+ end
136
+
137
+ end
138
+
139
+ describe 'does contracts' do
140
+
141
+ it 'valid one value contracts' do
142
+
143
+ validContracts = @validContractTests
144
+
145
+
146
+ validContracts.each do | contractName, contractTest |
147
+ contractMethod = "potrubi_bootstrap_mustbe_#{contractName}_or_croak"
148
+ puts("VALID contractName >#{contractName}< contractMethod >#{contractMethod}< contractTest >#{contractTest.class}<")
149
+ @t.__send__(contractMethod, contractTest).must_equal(contractTest)
150
+ end
151
+
152
+
153
+ end
154
+
155
+ it 'valid one value speical contracts' do
156
+
157
+ validContracts = @validContractSpecialTests
158
+
159
+ validContracts.each do | contractName, contractTest |
160
+ contractMethod = "potrubi_bootstrap_mustbe_#{contractName}_or_croak"
161
+ puts("VALID SPEICAL contractName >#{contractName}< contractMethod >#{contractMethod}< contractTest >#{contractTest.class}<")
162
+ @t.__send__(contractMethod, contractTest).must_equal(contractTest)
163
+ end
164
+
165
+
166
+ end
167
+
168
+ it 'invalid one value contracts' do
169
+
170
+ validContracts = @validContractTests
171
+ invalidContracts = @invalidContractTests
172
+
173
+ ##invalidContracts = invalidContractsNom.select {|k,v| k != contractName}
174
+
175
+ invalidContracts.each do | invalidContractName, invalidContractTest |
176
+
177
+ validContractsSel = validContracts.select {|k,v| k != invalidContractName}
178
+
179
+ ###validContracts.has_key?(invalidContractName) || next # invliad only a subset
180
+
181
+ validContractsSel.each do | contractName, contractTest |
182
+ contractMethod = "potrubi_bootstrap_mustbe_#{contractName}_or_croak"
183
+
184
+ puts("INVALID contractName >#{contractName}< contractMethod >#{contractMethod}< invalidContractTest >#{invalidContractTest.class}< invalidContractName >#{invalidContractName}<")
185
+ ##@t.__send__(contractMethod, contractTest).must_equal(contractTest)
186
+ proc do
187
+ @t.__send__(contractMethod, invalidContractTest)
188
+ end.must_raise ArgumentError
189
+
190
+ end
191
+
192
+
193
+ end
194
+
195
+
196
+ end
197
+
198
+
199
+ end
200
+
201
+ end
202
+
203
+
204
+ __END__
205
+
@@ -0,0 +1,216 @@
1
+
2
+ # Potrubi Test Konstant Mixin
3
+
4
+ require 'minitest'
5
+ require 'minitest/autorun'
6
+ require 'minitest/spec'
7
+
8
+ require 'potrubi/bootstrap'
9
+ require 'potrubi/mixin/konstant'
10
+
11
+ class TestClass1
12
+
13
+ include Potrubi::Bootstrap
14
+
15
+ end
16
+
17
+ describe TestClass1 do
18
+
19
+ before do
20
+ @mixConstant = Potrubi::Mixin::Konstant
21
+ end
22
+
23
+ describe 'makes modules' do
24
+
25
+ it 'valid one value contracts' do
26
+
27
+ makeModules = {
28
+ #[:A] => 'A',
29
+ }
30
+
31
+ makeModules.each do | moduleSpec, moduleWantName |
32
+
33
+ puts("MAKE MODULE moduleSpec >#{moduleSpec}< moduleWantName >#{moduleWantName}<")
34
+
35
+ moduleConstant = @mixConstant.create_module_constant_or_croak(moduleSpec)
36
+
37
+ puts("MAKE MODULE moduleSpec >#{moduleSpec}< moduleWantName >#{moduleWantName}< moduleConstant >#{moduleConstant.class}< >#{moduleConstant}< ")
38
+
39
+ moduleConstant.must_be_instance_of(Module)
40
+
41
+ moduleFindName = moduleConstant.name
42
+
43
+ moduleFindName.must_equal(moduleWantName)
44
+
45
+ end
46
+
47
+ end
48
+
49
+ end
50
+
51
+ end
52
+
53
+
54
+ __END__
55
+
56
+
57
+ it 'valid one value speical contracts' do
58
+
59
+ validContracts = @validContractSpecialTests
60
+
61
+ validContracts.each do | contractName, contractTest |
62
+ contractMethod = "potrubi_bootstrap_mustbe_#{contractName}_or_croak"
63
+ puts("VALID SPEICAL contractName >#{contractName}< contractMethod >#{contractMethod}< contractTest >#{contractTest.class}<")
64
+ @t.__send__(contractMethod, contractTest).must_equal(contractTest)
65
+ end
66
+
67
+
68
+ end
69
+
70
+ it 'invalid one value contracts' do
71
+
72
+ validContracts = @validContractTests
73
+ invalidContracts = @invalidContractTests
74
+
75
+ ##invalidContracts = invalidContractsNom.select {|k,v| k != contractName}
76
+
77
+ invalidContracts.each do | invalidContractName, invalidContractTest |
78
+
79
+ validContractsSel = validContracts.select {|k,v| k != invalidContractName}
80
+
81
+ ###validContracts.has_key?(invalidContractName) || next # invliad only a subset
82
+
83
+ validContractsSel.each do | contractName, contractTest |
84
+ contractMethod = "potrubi_bootstrap_mustbe_#{contractName}_or_croak"
85
+
86
+ puts("INVALID contractName >#{contractName}< contractMethod >#{contractMethod}< invalidContractTest >#{invalidContractTest.class}< invalidContractName >#{invalidContractName}<")
87
+ ##@t.__send__(contractMethod, contractTest).must_equal(contractTest)
88
+ proc do
89
+ @t.__send__(contractMethod, invalidContractTest)
90
+ end.must_raise ArgumentError
91
+
92
+ end
93
+
94
+
95
+ end
96
+
97
+
98
+ end
99
+
100
+
101
+ describe 'mixin reponds to only module methods' do
102
+
103
+ it 'has valid module methods' do
104
+ @validClassMethods.each { | methodName | @mixConstant.must_respond_to methodName }
105
+ end
106
+
107
+ it 'mixin doesnt repond to instance methods' do
108
+ @validInstanceMethods.each { | methodName | @mixConstant.wont_respond_to methodName }
109
+ end
110
+
111
+
112
+ end
113
+
114
+ describe 'class reponds to instance methods' do
115
+
116
+ it 'has valid instance methods' do
117
+ @validInstanceMethods.each { | methodName | @t.must_respond_to methodName }
118
+ end
119
+
120
+ end
121
+
122
+ @mixConstant = Potrubi::Mixin::BootstrapCommon
123
+ @t = TestClass1.new
124
+ @validClassMethods = [#:logger,
125
+ #:new_logger,
126
+ ]
127
+
128
+ @validLoggerInstanceMethods = [
129
+ :logger,
130
+ :logger_instance_telltale,
131
+ :logger_me,
132
+ :logger_mx,
133
+ :logger_ms,
134
+ :logger_ca,
135
+ :logger_beg,
136
+ :logger_fin,
137
+ :logger_fmt,
138
+ :logger_fmt_kls,
139
+ :logger_fmt_kls_size,
140
+ :logger_fmt_who,
141
+ :logger_fmt_who_only,
142
+
143
+ ].map {|m| "potrubi_bootstrap_#{m}" }
144
+
145
+
146
+ @validContractInstanceMethods = [:hash,
147
+ :array,
148
+ :fixnum,
149
+ :string,
150
+ :symbol,
151
+ :float,
152
+ :class,
153
+ :module,
154
+ :proc,
155
+ :key,
156
+ :file,
157
+ :directory,
158
+ :not_nil,
159
+ :not_empty,
160
+ :empty
161
+ ].map {|m| "potrubi_bootstrap_mustbe_#{m}_or_croak"}
162
+
163
+ @validExceptionInstanceMethods = [:raise,
164
+ :surprise,
165
+ :duplicate,
166
+ :missing,
167
+ ].map {|m| "potrubi_bootstrap_#{m}_exception" }
168
+
169
+ @validInstanceMethods = [@validContractInstanceMethods,
170
+ @validLoggerInstanceMethods,
171
+ @validExceptionInstanceMethods,
172
+ ].flatten
173
+
174
+ @validContractTests = {
175
+ hash: {},
176
+ array: [],
177
+ string: 'Hi There',
178
+ symbol: :'A symbol',
179
+ fixnum: 1,
180
+ float: 2.3,
181
+
182
+ class: Class.new,
183
+ module: Module.new,
184
+
185
+ file: __FILE__,
186
+ directory: File.dirname(__FILE__),
187
+
188
+ #empty: [],
189
+ #not_empty: %w(this is not empty),
190
+ #not_nil: 'definitely is not nil',
191
+ ###proc: ->(p) {true}, # can't test proc for some reason - confuses Minitest?
192
+ }
193
+
194
+ @invalidContractTests = {
195
+ hash: {},
196
+ array: [],
197
+ string: 'Hi There',
198
+ symbol: :'A symbol',
199
+ fixnum: 1,
200
+ float: 2.3,
201
+
202
+ #class: Class.new,
203
+ module: Module.new,
204
+
205
+ #file: __FILE__,
206
+ #directory: File.dirname(__FILE__),
207
+
208
+
209
+ ###proc: ->(p) {true}, # can't test proc for some reason - confuses Minitest?
210
+ }
211
+
212
+ @validContractSpecialTests = {
213
+ empty: [],
214
+ not_empty: %w(this is not empty),
215
+ not_nil: 'definitely is not nil',
216
+ }