vigilem-support 0.0.9

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 (42) hide show
  1. checksums.yaml +7 -0
  2. data/lib/vigilem/ffi.rb +19 -0
  3. data/lib/vigilem/ffi/array_pointer_sync.rb +382 -0
  4. data/lib/vigilem/ffi/struct.rb +54 -0
  5. data/lib/vigilem/ffi/utils.rb +240 -0
  6. data/lib/vigilem/ffi/utils/struct.rb +93 -0
  7. data/lib/vigilem/support.rb +31 -0
  8. data/lib/vigilem/support/core_ext.rb +13 -0
  9. data/lib/vigilem/support/core_ext/debug_puts.rb +5 -0
  10. data/lib/vigilem/support/core_ext/enumerable.rb +25 -0
  11. data/lib/vigilem/support/key_map.rb +323 -0
  12. data/lib/vigilem/support/key_map_info.rb +85 -0
  13. data/lib/vigilem/support/lazy_simple_delegator.rb +81 -0
  14. data/lib/vigilem/support/max_size_error.rb +17 -0
  15. data/lib/vigilem/support/metadata.rb +13 -0
  16. data/lib/vigilem/support/obj_space.rb +28 -0
  17. data/lib/vigilem/support/patch/cucumber/c_lexer.rb +30 -0
  18. data/lib/vigilem/support/patch/ffi/pointer.rb +19 -0
  19. data/lib/vigilem/support/size_error.rb +6 -0
  20. data/lib/vigilem/support/sys.rb +5 -0
  21. data/lib/vigilem/support/system.rb +92 -0
  22. data/lib/vigilem/support/transmutable_hash.rb +206 -0
  23. data/lib/vigilem/support/utils.rb +224 -0
  24. data/lib/vigilem/support/version.rb +5 -0
  25. data/spec/spec_helper.rb +9 -0
  26. data/spec/vigilem/ffi/array_pointer_sync_spec.rb +728 -0
  27. data/spec/vigilem/ffi/struct_spec.rb +22 -0
  28. data/spec/vigilem/ffi/utils/struct_spec.rb +79 -0
  29. data/spec/vigilem/ffi/utils_spec.rb +240 -0
  30. data/spec/vigilem/support/core_ext/enumerable_spec.rb +38 -0
  31. data/spec/vigilem/support/data/cached.kmap +130 -0
  32. data/spec/vigilem/support/data/cached_UTF-8_del.kmap +142 -0
  33. data/spec/vigilem/support/data/cached_short.kmap +38 -0
  34. data/spec/vigilem/support/data/dump_keys_short.kmap +128 -0
  35. data/spec/vigilem/support/key_map_spec.rb +767 -0
  36. data/spec/vigilem/support/lazy_simple_delegator_spec.rb +77 -0
  37. data/spec/vigilem/support/obj_space_spec.rb +47 -0
  38. data/spec/vigilem/support/sys_spec.rb +21 -0
  39. data/spec/vigilem/support/system_spec.rb +31 -0
  40. data/spec/vigilem/support/transmutable_hash_spec.rb +175 -0
  41. data/spec/vigilem/support/utils_spec.rb +214 -0
  42. metadata +240 -0
@@ -0,0 +1,77 @@
1
+ require 'vigilem/support/lazy_simple_delegator'
2
+
3
+ describe Vigilem::Support::LazySimpleDelegator do
4
+
5
+ class Dino
6
+ def rawr!
7
+ puts 'rawr!'
8
+ end
9
+ end
10
+
11
+ context 'before __setobj__' do
12
+ it %q<won't error with nil argument on instantiation> do
13
+ expect { described_class.new() }.to_not raise_error
14
+ end
15
+ end
16
+
17
+ subject { described_class.new() }
18
+
19
+ let(:before___setobj___to_s) { subject.to_s }
20
+
21
+ context 'after __setobj__' do
22
+
23
+ let(:dino) { Dino.new }
24
+
25
+ before(:each) do
26
+ subject.__setobj__(dino)
27
+ end
28
+
29
+ it 'will not allow delegation to self' do
30
+ expect { subject.__setobj__(subject) }.to raise_error(ArgumentError, 'cannot delegate to self')
31
+ end
32
+
33
+ it 'will have its own to_s unlike built in ruby delegate' do
34
+ expect(subject.to_s).to eql before___setobj___to_s
35
+ end
36
+
37
+ it 'will have its own inspect unlike built in ruby delegate' do
38
+ expect(subject.inspect).not_to eql dino.inspect
39
+ end
40
+
41
+ describe 'delegation' do
42
+ it 'will take on object methods' do
43
+ expect(subject).to respond_to :rawr!
44
+ end
45
+ end
46
+
47
+ describe '#strict_eql=, #strict_eql?, #use_strict_eql' do
48
+
49
+ context 'default behavior' do
50
+ it '#strict_eql?, defaults to false' do
51
+ expect(subject.strict_eql?).to be_falsey
52
+ end
53
+ end
54
+
55
+ describe '#strict_eql=' do
56
+ it %q<#strict_eql?, is true compares a delegator's __getobj__.object_id's> do
57
+ subject.strict_eql = true
58
+ expect(subject.eql?(SimpleDelegator.new(dino))).to be_truthy
59
+ end
60
+
61
+ it %q<#strict_eql?, is true compares a non Delegators object_id to this __getobj__.object_id> do
62
+ subject.strict_eql = true
63
+ expect(subject.eql?(dino)).to be_truthy
64
+ end
65
+ end
66
+
67
+ describe '#use_strict_eql' do
68
+ it %q<#use_strict_eql, sets strict_eql? to true and returns self> do
69
+ expect(subject.use_strict_eql).to eql(subject) and
70
+ an_object_having_attributes(:strict_eql? => true)
71
+ end
72
+ end
73
+
74
+ end
75
+
76
+ end
77
+ end
@@ -0,0 +1,47 @@
1
+ require 'vigilem/support/obj_space'
2
+
3
+ describe Vigilem::Support::ObjSpace do
4
+
5
+ class ObjSpaceHost
6
+ extend Vigilem::Support::ObjSpace
7
+ end
8
+
9
+ class SubObjSpaceHost < ObjSpaceHost
10
+ end
11
+
12
+ after(:each) do
13
+ ObjSpaceHost.all.replace([])
14
+ SubObjSpaceHost.all.replace([])
15
+ end
16
+
17
+ describe '#all' do
18
+ it 'defaults to []' do
19
+ expect(ObjSpaceHost.all).to eql([])
20
+ end
21
+ end
22
+
23
+ describe '#obj_register' do
24
+ it 'returns the obj registered' do
25
+ expect(ObjSpaceHost.obj_register('asdf')).to eql('asdf')
26
+ end
27
+
28
+ it 'adds the obj to #all' do
29
+ ObjSpaceHost.obj_register('asdf')
30
+ expect(ObjSpaceHost.all).to include('asdf')
31
+ end
32
+ end
33
+
34
+ context 'subclass' do
35
+ it %q<will add to the parent class #all> do
36
+ SubObjSpaceHost.obj_register('test')
37
+ expect(ObjSpaceHost.all).to include('test')
38
+ end
39
+
40
+ it 'will not list the parent class objects' do
41
+ ObjSpaceHost.obj_register('asdf')
42
+ expect(SubObjSpaceHost.all).not_to include('asdf')
43
+ end
44
+
45
+ end
46
+
47
+ end
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+
3
+ require 'vigilem/support/sys'
4
+
5
+ describe Vigilem::Support::Sys do
6
+ describe '::sizeof' do
7
+ describe 'returns the size of a string variable format' do
8
+ Given 'ii' do
9
+ Then { expect(described_class.sizeof(given_value)).to eql(8) }
10
+ end
11
+
12
+ it 'with number repeats' do
13
+ expect(described_class.sizeof('CCSI32C')).to eql(133)
14
+ end
15
+
16
+ it 'with !' do
17
+ expect(described_class.sizeof('CCS!I32C')).to eql(133)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,31 @@
1
+
2
+ require 'vigilem/support/system'
3
+
4
+ describe Vigilem::Support::System do
5
+
6
+ describe '::`mask_name`' do
7
+ it 'will respond_to? :mac?' do
8
+ expect(described_class).to respond_to(:mac?)
9
+ end
10
+
11
+ it 'will respond_to? :linux?' do
12
+ expect(described_class).to respond_to(:linux?)
13
+ end
14
+
15
+ it 'will respond_to? :windows?' do
16
+ expect(described_class).to respond_to(:windows?)
17
+ end
18
+
19
+ it 'will respond_to? :bsd?' do
20
+ expect(described_class).to respond_to(:bsd?)
21
+ end
22
+
23
+ it 'will respond_to? :nix?' do
24
+ expect(described_class).to respond_to(:nix?)
25
+ end
26
+
27
+ it 'will respond_to? :aix?' do
28
+ expect(described_class).to respond_to(:aix?)
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,175 @@
1
+ require 'spec_helper'
2
+
3
+ require 'vigilem/support/transmutable_hash'
4
+
5
+ # {:key1=>["a", "b", "c"], :key2=>["e", "f"], :key => "d" }
6
+ # {:key1=>["a", "b", "c"], :key2=>["d", "e", "f"]} becomes
7
+ # {"a"=>:key1, "b"=>:key1, "c"=>:key1, "d"=>:key2, "e"=>:key2, "f"=>:key2 }
8
+ # it will have a different object_id, because technically its a different hash
9
+ describe Vigilem::Support::TransmutableHash do
10
+ Given(:hash_map) { described_class.new({:key1 => %w(a b c), :key2 => %w(e f), :key => 'd' }, 'default') }
11
+
12
+ Given(:dump_key_hash) {
13
+ {"keycode1"=>"Escape", ["shift", "keycode1"]=>"Escape", ["altgr", "keycode1"]=>"Escape",
14
+ ["shift", "altgr", "keycode1"]=>"Escape", ["control", "keycode1"]=>"Escape",
15
+ ["shift", "control", "keycode1"]=>"Escape", ["altgr", "control", "keycode1"]=>"Escape",
16
+ ["shift", "altgr", "control", "keycode1"]=>"Escape", ["alt", "keycode1"]=>"Meta_Escape",
17
+ ["shift","alt", "keycode1"]=>"Meta_Escape", ["altgr", "alt", "keycode1"]=>"Meta_Escape",
18
+ ["shift", "altgr", "alt", "keycode1"]=>"Meta_Escape",
19
+ ["control", "alt", "keycode1"]=>"Meta_Escape", ["shift", "control", "alt", "keycode1"]=>"Meta_Escape"
20
+ }
21
+ }
22
+
23
+
24
+ describe '#invert' do
25
+ When(:result) { hash_map.invert }
26
+
27
+ Then { result == { "a" => :key1, "b" => :key1, "c" => :key1, "d" => :key, "e" => :key2, "f" => :key2 } }
28
+
29
+ Then { hash_map.send(:_invert_cache_) == result }
30
+
31
+ end
32
+
33
+ describe '#invert!' do
34
+ Given(:original) { described_class.new({%w(this is a key) => :value, :key2=>["e", "f"], :key => "d"}) }
35
+ Given(:hsh) { described_class.new({%w(this is a key) => :value, :key2=>["e", "f"], :key => "d"}) }
36
+
37
+ it 'updates inplace the inversion' do
38
+ hsh.invert!
39
+ expect(hsh).to eql(original.invert)
40
+ expect(hsh).not_to eql(original)
41
+ end
42
+
43
+ end
44
+
45
+ describe '::fuse_vaue' do
46
+
47
+ it 'concats values to when keys match' do
48
+ hsh = {%w(this is a key) => :value, :key2=>["e", "f"], :key => "d"}
49
+ expect(described_class.fuse_value(hsh, :key, 'my_value')).to eql(
50
+ {["this", "is", "a", "key"]=>:value, :key2=>["e", "f"], :key=>["d", "my_value"]}
51
+ )
52
+ end
53
+
54
+ it 'inserts arrays when keys match' do
55
+ hsh = {%w(this is a key) => :value, :key2=>["e", "f"], :key => "d"}
56
+ expect(described_class.fuse_value(hsh, :key2, ['my_value'])).to eql(
57
+ {["this", "is", "a", "key"]=>:value, :key2=>["e", "f", ['my_value']], :key=>"d"}
58
+ )
59
+ end
60
+
61
+ it 'acts like merge' do
62
+ hsh = {%w(this is a key) => :value, :key2=>["e", "f"], :key => "d"}
63
+ expect(described_class.fuse_value(hsh, %w(my new key), 'my_value')).to eql(
64
+ {["this", "is", "a", "key"]=>:value, :key2=>["e", "f"], :key=>"d", ["my", "new", "key"]=>"my_value"}
65
+ )
66
+ end
67
+
68
+ it 'acts like merge and wraps an array value' do
69
+ hsh = {%w(this is a key) => :value, :key2=>["e", "f"], :key => "d"}
70
+ expect(described_class.fuse_value(hsh, %w(my new key), ['my_value'])).to eql(
71
+ {["this", "is", "a", "key"]=>:value, :key2=>["e", "f"], :key=>"d", ["my", "new", "key"]=>[["my_value"]]}
72
+ )
73
+ end
74
+
75
+ end
76
+
77
+ describe '::transmute' do
78
+
79
+ it 'inverts the hash and splits up array values into keys' do
80
+ hsh = described_class.transmute({:key => [1,2,3] })
81
+ expect(hsh).to eql({1 => :key, 2 => :key, 3 => :key })
82
+ end
83
+
84
+ it 'inverts the hash and wraps Array keys to prevent split up' do
85
+ hsh = described_class.transmute(
86
+ {["this", "is", "a", "key"]=>:value, :key2=>["e", "f"], :key=>"d"}
87
+ )
88
+
89
+ expect(hsh).to eql(
90
+ {:value=>[["this", "is", "a", "key"]], "e"=>:key2, "f"=>:key2, "d"=>:key}
91
+ )
92
+ end
93
+
94
+ describe 'prevent invert!.invert from breaking down the hash' do
95
+ it 'prevents Array keys from being split up on invert' do
96
+ hsh = described_class.new(
97
+ {["this", "is", "a", "key"]=>:value, :key2=>["e", "f"], :key=>"d"}
98
+ )
99
+ expect(hsh.invert!.invert).to eql(
100
+ {["this", "is", "a", "key"]=>:value, :key2=>["e", "f"], :key=>"d"}
101
+ )
102
+ end
103
+ end
104
+ end
105
+
106
+ context 'setting default' do
107
+
108
+ describe 'values' do
109
+ Given(:default_value) { 'default' }
110
+
111
+ describe 'with #new(default_value),' do
112
+ When(:instantiated) { described_class.new(default_value) }
113
+
114
+ Then { expect(instantiated.default).to eql default_value }
115
+ Then { expect(instantiated.invert_default).to eql default_value }
116
+ end
117
+
118
+ describe 'with #default=,' do
119
+ When(:assigned_default) do
120
+ sbj = described_class.new
121
+ sbj.default = default_value
122
+ sbj
123
+ end
124
+
125
+ Then { expect(assigned_default.default).to eql default_value }
126
+ Then { expect(assigned_default.invert_default).to eql nil }
127
+ end
128
+
129
+ describe 'with #defaults=,' do
130
+ When(:assigned_defaults) do
131
+ sbj = described_class.new
132
+ sbj.defaults = default_value
133
+ sbj
134
+ end
135
+
136
+ Then { expect(assigned_defaults.defaults).to eql [default_value, default_value] }
137
+ end
138
+
139
+ end
140
+
141
+ describe 'procs' do
142
+ let(:proc) { lambda {|h,k| h[k] = Hash.new() } }
143
+
144
+ describe 'with #new(&proc),' do
145
+
146
+ When(:instantiated) { described_class.new(&proc) }
147
+
148
+ Then { expect(instantiated.default_proc).to eql proc }
149
+ Then { expect(instantiated.invert_default_proc).to eql proc }
150
+ end
151
+
152
+ describe 'with #default_proc=,' do
153
+
154
+ When(:assigned_default_proc) do
155
+ sbj = described_class.new
156
+ sbj.default_proc = proc
157
+ sbj
158
+ end
159
+
160
+ Then { expect(assigned_default_proc.default_proc).to eql proc }
161
+ Then { expect(assigned_default_proc.invert_default_proc).to eql nil }
162
+ end
163
+
164
+ describe 'with #default_procs=,' do
165
+ When(:assigned_default_procs) do
166
+ sbj = described_class.new
167
+ sbj.default_procs = proc
168
+ sbj
169
+ end
170
+
171
+ Then { expect(assigned_default_procs.default_procs).to eql [proc, proc] }
172
+ end
173
+ end
174
+ end
175
+ end
@@ -0,0 +1,214 @@
1
+ require 'spec_helper'
2
+
3
+ require 'vigilem/support/utils'
4
+
5
+ describe Vigilem::Support::Utils do
6
+
7
+ describe '::_offset_from_length' do
8
+ it 'returns the amount that len is over the size of object' do
9
+ expect(subject._offset_from_length('tests', 7)).to eql(2)
10
+ end
11
+
12
+ it 'returns 0 if the len passed in is lower than obj.size' do
13
+ expect(subject._offset_from_length('tests', 3)).to eql(0)
14
+ end
15
+ end
16
+
17
+ context 'ArrayAndStringUtils' do
18
+
19
+ describe '#split_at' do
20
+ Given(:str) { 'asdfqwer' }
21
+
22
+ When(:result) { subject.split_at(str, 3) }
23
+
24
+ Then { result == ['asd', 'fqwer'] }
25
+ end
26
+
27
+ describe '#split_on' do
28
+
29
+ let(:str) { ['keycode 2', '=', 'U+0031', 'U+0021', 'U+0031', 'U+0031', 'VoidSymbol'] }
30
+
31
+ it 'acts like String#split in which it removes the item split on' do
32
+ expect(subject.split_on(str, 1)).to eql([['keycode 2'], ['U+0031', 'U+0021', 'U+0031', 'U+0031', 'VoidSymbol']])
33
+ end
34
+ end
35
+
36
+ describe '#offset!, #offset' do
37
+
38
+ context 'String param' do
39
+
40
+ Given(:str) { 'tests' }
41
+ Given(:orig_str) { str }
42
+
43
+ context 'len < str' do
44
+
45
+ describe '#offset!' do
46
+ When(:result) { subject.offset!(str, 2) }
47
+
48
+ Then { result == ['te', 0] }
49
+ Then { str == 'sts' }
50
+ end
51
+ describe '#offset' do
52
+ When(:result) { subject.offset(str, 2) }
53
+
54
+ Then { result == ['te', 0] }
55
+ Then { result.object_id != str.object_id }
56
+ Then { str == orig_str }
57
+ end
58
+ end
59
+
60
+ context 'len > str' do
61
+ describe '#offset' do
62
+ When(:result) { subject.offset!(str, 7) }
63
+
64
+ Then { result == ['tests', 2] }
65
+ end
66
+ describe '#offset' do
67
+ When(:result) { subject.offset(str, 7) }
68
+
69
+ Then { result == ['tests', 2] }
70
+ Then { str == orig_str }
71
+ end
72
+ end
73
+
74
+ end
75
+
76
+ context 'Array param' do
77
+
78
+ Given(:ary) { ['a', 'b', 'c', 'd'] }
79
+ Given(:orig_ary) { ary }
80
+
81
+ context 'len < ary' do
82
+ describe '#offset!' do
83
+ When(:result) { subject.offset!(ary, 2) }
84
+
85
+ Then { result == [['a', 'b'], 0] }
86
+ end
87
+ describe '#offset' do
88
+ When(:result) { subject.offset(ary, 2) }
89
+
90
+ Then { result == [['a', 'b'], 0] }
91
+ Then { ary == orig_ary }
92
+ end
93
+ end
94
+
95
+ context 'len > ary' do
96
+ describe '#offset!' do
97
+ When(:result) { subject.offset!(ary, 7) }
98
+
99
+ Then { result == [['a', 'b', 'c', 'd'], 3] }
100
+ end
101
+ describe '#offset' do
102
+ When(:result) { subject.offset(ary, 7) }
103
+
104
+ Then { result == [['a', 'b', 'c', 'd'], 3] }
105
+ Then { ary == orig_ary }
106
+ end
107
+ end
108
+
109
+ end
110
+ end
111
+
112
+ describe '#unwrap_ary' do
113
+ it 'pops the item off the array when there is only one item in it' do
114
+ expect(described_class.unwrap_ary([1])).to eql(1)
115
+ end
116
+
117
+ it 'leaves the array as is if there is more than one item in it' do
118
+ expect(described_class.unwrap_ary([1,2,3])).to eql([1,2,3])
119
+ end
120
+ end
121
+
122
+ describe '#in_ranged_array?' do
123
+ it 'is the number included in an array of ranged items' do
124
+ expect(described_class.in_ranged_array?([0..12, 17..21], 18)).to be_truthy
125
+ end
126
+
127
+ it 'handles a mixed array of Integer and ranges' do
128
+ expect(described_class.in_ranged_array?([0..12, 17, 19, 21], 19)).to be_truthy
129
+ end
130
+ end
131
+
132
+ end
133
+
134
+ context 'NumericUtils' do
135
+
136
+ describe '#clamp' do
137
+ it 'returns the lower bounds if lower than it' do
138
+ expect(subject.clamp(-12, min: 0)).to eql(0)
139
+ end
140
+
141
+ it 'returns the upper bounds if greater than it' do
142
+ expect(subject.clamp(15, max: 12)).to eql(12)
143
+ end
144
+
145
+ it 'returns the variable given in if between the limits' do
146
+ expect(subject.clamp(5, min: 3, max: 12)).to eql(5)
147
+ end
148
+ end
149
+
150
+ describe '#ceil_div' do
151
+ Given(:num) { 10 }
152
+ Given(:denom) { 7 }
153
+
154
+ When(:result) { subject.ceil_div(num, denom) }
155
+
156
+ Then { result == 2 }
157
+ end
158
+ end
159
+
160
+ # @todo
161
+ describe 'GemUtils' do
162
+
163
+ describe '::data_dir' do
164
+
165
+ end
166
+
167
+ describe '::gem_path' do
168
+
169
+ end
170
+
171
+ end
172
+
173
+ describe 'KernelUtils' do
174
+
175
+ describe '#get_class' do
176
+
177
+ before(:all) { TempClass = Class.new }
178
+
179
+ it 'will return the objects class' do
180
+ expect(described_class.get_class(TempClass.new)).to eql(TempClass)
181
+ end
182
+
183
+ it 'will the Class if given one' do
184
+ expect(described_class.get_class(TempClass)).to eql(TempClass)
185
+ end
186
+ end
187
+
188
+ describe '#send_all_or_no_args' do
189
+ it %q<won't send any arguments if the arity == 0> do
190
+ str = 'test'
191
+ expect(described_class.send_all_or_no_args(str.method(:to_s), 'hmm', 'this shouldn\'t do anything')).to eql(str)
192
+ end
193
+ end
194
+ end
195
+
196
+ describe 'ObjectUtils' do
197
+ describe '#_deep_dup' do
198
+
199
+ end
200
+
201
+ describe '#deep_dup' do
202
+
203
+ end
204
+
205
+ describe '#inspect_id' do
206
+
207
+ end
208
+
209
+ describe '#inspect_shell' do
210
+
211
+ end
212
+ end
213
+
214
+ end