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
@@ -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
+ }