square_graph 1.0.0 → 1.1.0
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.
- data/lib/square_graph.rb +70 -2
- data/lib/square_graph/face.rb +7 -0
- data/spec/face_spec.rb +33 -7
- data/spec/square_graph_spec.rb +162 -14
- metadata +6 -4
data/lib/square_graph.rb
CHANGED
@@ -63,6 +63,13 @@ class SquareGraph
|
|
63
63
|
end)
|
64
64
|
end
|
65
65
|
|
66
|
+
def each
|
67
|
+
return nil if @sg.empty?
|
68
|
+
@sg.each_pair do |p, f|
|
69
|
+
yield(f)
|
70
|
+
end if block_given?
|
71
|
+
end
|
72
|
+
|
66
73
|
def each_obj
|
67
74
|
return nil if @sg.empty?
|
68
75
|
@sg.each_pair do |f, o|
|
@@ -74,8 +81,8 @@ class SquareGraph
|
|
74
81
|
def each_pos
|
75
82
|
return nil if @sg.empty?
|
76
83
|
pos = Array.new
|
77
|
-
@length.downto(1).each do |l|
|
78
|
-
@width.downto(1).each do |w|
|
84
|
+
(@length||@sg.keys.max(&comp('x'))[0]).downto(@sized?1:@sg.keys.min(&comp('x'))[0]).each do |l|
|
85
|
+
(@width||@sg.keys.max(&comp('y'))[1]).downto(@sized?1:@sg.keys.min(&comp('y'))[1]).each do |w|
|
79
86
|
p = Hash.new
|
80
87
|
p[:x] = l
|
81
88
|
p[:y] = w
|
@@ -97,6 +104,57 @@ class SquareGraph
|
|
97
104
|
rt
|
98
105
|
end
|
99
106
|
|
107
|
+
def truthy
|
108
|
+
if @sized
|
109
|
+
result = SquareGraph.new(@length, @width)
|
110
|
+
else
|
111
|
+
result = SquareGraph.new
|
112
|
+
end
|
113
|
+
@sg.each_pair do |p, f|
|
114
|
+
result.fill(f.x, f.y, f.object) if f.truthy?
|
115
|
+
end
|
116
|
+
return nil if result.objects.nil?
|
117
|
+
result
|
118
|
+
end
|
119
|
+
|
120
|
+
def need_truthy
|
121
|
+
result = Array.new
|
122
|
+
@sg.each_pair do |p, f|
|
123
|
+
result.push(f.object.class) if not f.object.class.method_defined? :truthy?
|
124
|
+
end
|
125
|
+
return nil if result.empty?
|
126
|
+
result
|
127
|
+
end
|
128
|
+
|
129
|
+
def self.create_truthy (objClass, &truthyMethod)
|
130
|
+
return nil if objClass.method_defined? :truthy?
|
131
|
+
objClass.send :define_method, :truthy?, truthyMethod
|
132
|
+
end
|
133
|
+
|
134
|
+
def self.create_truthy! (objClass, &truthyMethod)
|
135
|
+
objClass.send :define_method, :truthy?, truthyMethod
|
136
|
+
end
|
137
|
+
|
138
|
+
def truthy? (&alt_cond)
|
139
|
+
return false if @sg.size == 0
|
140
|
+
@sg.each_pair do |p, f|
|
141
|
+
return false if not f.truthy?(&alt_cond)
|
142
|
+
end
|
143
|
+
true
|
144
|
+
end
|
145
|
+
|
146
|
+
def falsey?
|
147
|
+
return false if @sg.size == 0
|
148
|
+
self.truthy.nil?
|
149
|
+
end
|
150
|
+
|
151
|
+
def == sg2
|
152
|
+
sg2.each_pos do |p|
|
153
|
+
return false if self.get(p[:x], p[:y]) != sg2.get(p[:x], p[:y])
|
154
|
+
end
|
155
|
+
true
|
156
|
+
end
|
157
|
+
|
100
158
|
private
|
101
159
|
|
102
160
|
def test_fixnum(*value)
|
@@ -109,6 +167,16 @@ class SquareGraph
|
|
109
167
|
value.any? {|pair| pair[0] > pair[1]}
|
110
168
|
end
|
111
169
|
|
170
|
+
def comp(pos)
|
171
|
+
Proc.new do |x,y|
|
172
|
+
if pos == 'x'
|
173
|
+
x[0] <=> y[0]
|
174
|
+
else
|
175
|
+
x[1] <=> y[1]
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
112
180
|
end
|
113
181
|
|
114
182
|
require 'square_graph/face'
|
data/lib/square_graph/face.rb
CHANGED
data/spec/face_spec.rb
CHANGED
@@ -1,14 +1,40 @@
|
|
1
1
|
require 'square_graph/face'
|
2
2
|
|
3
|
-
|
3
|
+
class DummyObject
|
4
|
+
attr_accessor :value
|
5
|
+
def initialize (value)
|
6
|
+
@value = value
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
describe SquareGraph::Face, "#new" do
|
4
11
|
it "accepts an x, y, object and can display them easily" do
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
12
|
+
f = SquareGraph::Face.new(5, 5, true)
|
13
|
+
f.x.should eql(5)
|
14
|
+
f.y.should eql(5)
|
15
|
+
f.object.should eql(true)
|
16
|
+
end
|
17
|
+
it "accepts objects too!" do
|
18
|
+
du = DummyObject.new(0)
|
19
|
+
f = SquareGraph::Face.new(5,5, du)
|
20
|
+
f.object.should eql(du)
|
9
21
|
end
|
10
22
|
end
|
11
23
|
|
12
|
-
describe SquareGraph::Face,
|
13
|
-
|
24
|
+
describe SquareGraph::Face, "#truthy?" do
|
25
|
+
before(:each) {DummyObject.send(:remove_method, :truthy?) if DummyObject.method_defined? :truthy?}
|
26
|
+
it "asks an object whether it is true or not" do
|
27
|
+
f = SquareGraph::Face.new(5,5, true)
|
28
|
+
f.truthy?.should eql(true)
|
29
|
+
end
|
30
|
+
it "returns nil if the object doesn't have a truthy method" do
|
31
|
+
du = DummyObject.new(0)
|
32
|
+
f = SquareGraph::Face.new(5,5, du)
|
33
|
+
f.truthy?.should be_nil
|
34
|
+
end
|
35
|
+
it "accepts a block that will override a truthy method or in replace of a truthy method" do
|
36
|
+
du = DummyObject.new(0)
|
37
|
+
f = SquareGraph::Face.new(5,5, du)
|
38
|
+
(f.truthy?{|o| o.value == 0}).should eql(true)
|
39
|
+
end
|
14
40
|
end
|
data/spec/square_graph_spec.rb
CHANGED
@@ -62,7 +62,7 @@ describe SquareGraph, "#fill, #get" do
|
|
62
62
|
it "fills a single position with a TrueClass and gets it back with get" do
|
63
63
|
sg = SquareGraph.new(5,5)
|
64
64
|
sg.fill(2,2)
|
65
|
-
sg.get(2,2).should
|
65
|
+
sg.get(2,2).should be_true
|
66
66
|
end
|
67
67
|
it "can also fill a single position with an object by specifying a third parameter" do
|
68
68
|
du = DummyObject.new (3)
|
@@ -86,7 +86,7 @@ describe SquareGraph, "#fill, #get" do
|
|
86
86
|
sg.fill(0,0)
|
87
87
|
sg.objects.size.should eql(1)
|
88
88
|
sg.fill(0,0,nil).should be_nil
|
89
|
-
sg.empty?.should
|
89
|
+
sg.empty?.should be_true
|
90
90
|
end
|
91
91
|
it "doesn't allow fills of outside the graph" do
|
92
92
|
sg = SquareGraph.new(5,10)
|
@@ -104,7 +104,7 @@ describe SquareGraph, "#fill, #get" do
|
|
104
104
|
sg = SquareGraph.new
|
105
105
|
sg.fill(2,2)
|
106
106
|
sg.fill(-1, -3)
|
107
|
-
sg.get(-1, -3).should
|
107
|
+
sg.get(-1, -3).should be_true
|
108
108
|
end
|
109
109
|
it "nils if getting something that doesn't exist yet" do
|
110
110
|
sg = SquareGraph.new
|
@@ -132,7 +132,7 @@ describe SquareGraph, "#remove" do
|
|
132
132
|
it "removes any objects from a certain position" do
|
133
133
|
sg = SquareGraph.new
|
134
134
|
sg.fill(2,2)
|
135
|
-
sg.get(2,2).should
|
135
|
+
sg.get(2,2).should be_true
|
136
136
|
sg.remove(2,2)
|
137
137
|
sg.get(2,2).should be_nil
|
138
138
|
end
|
@@ -150,7 +150,7 @@ describe SquareGraph, "#clear" do
|
|
150
150
|
it "removes every object in the graph" do
|
151
151
|
sg = SquareGraph.new
|
152
152
|
(0..5).each {|x| sg.fill(x, x)}
|
153
|
-
(1..6).each {|x| sg.get(x-1, x-1).should
|
153
|
+
(1..6).each {|x| sg.get(x-1, x-1).should be_true}
|
154
154
|
sg.clear
|
155
155
|
(2..7).each {|x| sg.get(x-2, x-2).should be_nil}
|
156
156
|
end
|
@@ -164,15 +164,15 @@ describe SquareGraph, "#empty?" do
|
|
164
164
|
sg.fill(x,y)
|
165
165
|
end
|
166
166
|
end
|
167
|
-
sg.get(3, 3).should
|
167
|
+
sg.get(3, 3).should be_true
|
168
168
|
sg.clear
|
169
|
-
sg.empty?.should
|
169
|
+
sg.empty?.should be_true
|
170
170
|
end
|
171
171
|
it "informs us even if we just remove the items" do
|
172
172
|
sg = SquareGraph.new
|
173
173
|
sg.fill(0,0)
|
174
174
|
sg.remove(0, 0)
|
175
|
-
sg.empty?.should
|
175
|
+
sg.empty?.should be_true
|
176
176
|
end
|
177
177
|
it "returns false if the graph isn't empty" do
|
178
178
|
sg = SquareGraph.new
|
@@ -196,6 +196,27 @@ describe SquareGraph, "#each_pos" do
|
|
196
196
|
sg.fill(3,3)
|
197
197
|
sg.each_pos.class.should eql(Enumerator)
|
198
198
|
end
|
199
|
+
it "works for non-dimentioned graphs by using the max/min points" do
|
200
|
+
sg = SquareGraph.new
|
201
|
+
sg.fill(0,0)
|
202
|
+
sg.fill(2,2)
|
203
|
+
i = 0
|
204
|
+
sg.each_pos do |p|
|
205
|
+
i += 1
|
206
|
+
end
|
207
|
+
i.should eql(9)
|
208
|
+
end
|
209
|
+
it "works if there are negative positions too" do
|
210
|
+
sg = SquareGraph.new
|
211
|
+
sg.fill(-3, -4)
|
212
|
+
sg.fill(1, 4)
|
213
|
+
sg.fill(-1, 8)
|
214
|
+
i = 0
|
215
|
+
sg.each_pos do |p|
|
216
|
+
i += 1
|
217
|
+
end
|
218
|
+
i.should eql(65)
|
219
|
+
end
|
199
220
|
end
|
200
221
|
|
201
222
|
describe SquareGraph, "#each_obj" do
|
@@ -229,7 +250,7 @@ describe SquareGraph, "#[][]" do
|
|
229
250
|
#TODO do this stuff later patches this is epics
|
230
251
|
#sg = SquareGraph.new
|
231
252
|
#sg.fill(0,0)
|
232
|
-
#sg[0][0].should
|
253
|
+
#sg[0][0].should be_true
|
233
254
|
end
|
234
255
|
end
|
235
256
|
|
@@ -238,7 +259,7 @@ describe SquareGraph, "#[][]=" do
|
|
238
259
|
#TODO dothis stuff later, if you need reminder, need row and column classes
|
239
260
|
#sg = SquareGraph.new
|
240
261
|
#sg[0][0] = true
|
241
|
-
#sg[0][0].should
|
262
|
+
#sg[0][0].should be_true
|
242
263
|
end
|
243
264
|
end
|
244
265
|
|
@@ -249,7 +270,7 @@ describe SquareGraph, "#objects" do
|
|
249
270
|
sg.fill(2,2)
|
250
271
|
sg.fill(3,3)
|
251
272
|
sg.objects.each do |i|
|
252
|
-
i.should
|
273
|
+
i.should be_true
|
253
274
|
end
|
254
275
|
end
|
255
276
|
it "returns nil if there aren't any objects" do
|
@@ -258,9 +279,136 @@ describe SquareGraph, "#objects" do
|
|
258
279
|
end
|
259
280
|
end
|
260
281
|
|
261
|
-
describe SquareGraph, "#
|
262
|
-
it "
|
263
|
-
|
282
|
+
describe SquareGraph, "#truthy?" do
|
283
|
+
it "checks if any of the objects result in truthy" do
|
284
|
+
sg = SquareGraph.new
|
285
|
+
sg.truthy?.should eql(false)
|
286
|
+
sg.fill(0,0)
|
287
|
+
sg.truthy?.should be_true
|
288
|
+
end
|
289
|
+
it "lets users pass a block that will be used as truthy? for each object" do
|
290
|
+
sg = SquareGraph.new
|
291
|
+
du = DummyObject.new(0)
|
292
|
+
sg.fill(0,0, du)
|
293
|
+
sg.truthy?{|o| o.value == 0}.should be_true
|
294
|
+
sg.truthy?{|o| o.value == 1}.should eql(false)
|
295
|
+
end
|
296
|
+
end
|
297
|
+
|
298
|
+
describe SquareGraph, "#falsey?" do
|
299
|
+
it "checks if any of the objects results in falsey" do
|
300
|
+
sg = SquareGraph.new
|
301
|
+
sg.falsey?.should eql(false)
|
302
|
+
sg.fill(0,0)
|
303
|
+
sg.falsey?.should eql(false)
|
304
|
+
end
|
305
|
+
end
|
306
|
+
describe SquareGraph, "#truthy" do
|
307
|
+
it "returns a SquareGraph that contains only the truthy elements" do
|
308
|
+
sg = SquareGraph.new
|
309
|
+
sg.fill(0,0)
|
310
|
+
tsg = sg.truthy
|
311
|
+
sg.should eq(tsg)
|
312
|
+
end
|
313
|
+
it "returns nil if there aren't any truthy objects" do
|
314
|
+
sg = SquareGraph.new
|
315
|
+
sg.truthy?.should eql(false)
|
316
|
+
sg.truthy.should be_nil
|
317
|
+
end
|
318
|
+
end
|
319
|
+
|
320
|
+
describe SquareGraph, "#need_truthy" do
|
321
|
+
before(:each) {DummyObject.send(:remove_method, :truthy?) if DummyObject.method_defined? :truthy?}
|
322
|
+
it "provides an array of all the classes in the squareGraph that need a truthy method" do
|
323
|
+
sg = SquareGraph.new
|
324
|
+
du = DummyObject.new(0)
|
325
|
+
sg.fill(0,0, du)
|
326
|
+
sg.need_truthy.include?(DummyObject).should be_true
|
327
|
+
end
|
328
|
+
it "returns nil if there all the elements in the squareGraph have a truthy method" do
|
329
|
+
sg = SquareGraph.new
|
330
|
+
du = DummyObject.new(0)
|
331
|
+
tehTruthy = Proc.new do
|
332
|
+
p "hello world"
|
333
|
+
end
|
334
|
+
SquareGraph.create_truthy(DummyObject, &tehTruthy)
|
335
|
+
sg.need_truthy.should be_nil
|
264
336
|
end
|
265
337
|
end
|
266
338
|
|
339
|
+
describe SquareGraph, ".create_truthy" do
|
340
|
+
before(:each) {DummyObject.send(:remove_method, :truthy?) if DummyObject.method_defined? :truthy?}
|
341
|
+
it "helps define truthy methods for classes" do
|
342
|
+
sg = SquareGraph.new
|
343
|
+
du = DummyObject.new(0)
|
344
|
+
SquareGraph.create_truthy(DummyObject) do
|
345
|
+
value == 0
|
346
|
+
end
|
347
|
+
du.truthy?.should be_true
|
348
|
+
end
|
349
|
+
it "will nil if truthy is already defined" do
|
350
|
+
sg = SquareGraph.new
|
351
|
+
du = DummyObject.new(0)
|
352
|
+
SquareGraph.create_truthy(DummyObject) do
|
353
|
+
value == 1
|
354
|
+
end
|
355
|
+
du.truthy?.should eql(false)
|
356
|
+
SquareGraph.create_truthy(DummyObject) do
|
357
|
+
value == 0
|
358
|
+
end.should be_nil
|
359
|
+
du.truthy?.should eql(false)
|
360
|
+
end
|
361
|
+
end
|
362
|
+
|
363
|
+
describe SquareGraph, ".create_truthy!" do
|
364
|
+
before(:each) {DummyObject.send(:remove_method, :truthy?) if DummyObject.method_defined? :truthy?}
|
365
|
+
it "does the same as .create_truthy" do
|
366
|
+
sg = SquareGraph.new
|
367
|
+
du = DummyObject.new(0)
|
368
|
+
SquareGraph.create_truthy!(DummyObject) do
|
369
|
+
value == 0
|
370
|
+
end
|
371
|
+
du.truthy?.should be_true
|
372
|
+
end
|
373
|
+
it "overwrite truthy methods!" do
|
374
|
+
sg = SquareGraph.new
|
375
|
+
du = DummyObject.new(0)
|
376
|
+
SquareGraph.create_truthy(DummyObject) do
|
377
|
+
value == 1
|
378
|
+
end
|
379
|
+
du.truthy?.should eql(false)
|
380
|
+
SquareGraph.create_truthy!(DummyObject) do
|
381
|
+
value == 0
|
382
|
+
end.should_not be_nil
|
383
|
+
du.truthy?.should be_true
|
384
|
+
end
|
385
|
+
end
|
386
|
+
|
387
|
+
describe SquareGraph, "#each" do
|
388
|
+
it "returns an iterator of faces." do
|
389
|
+
sg = SquareGraph.new
|
390
|
+
sg.fill(0,0)
|
391
|
+
sg.fill(1,1)
|
392
|
+
sg.each do |f|
|
393
|
+
f.truthy?.should be_true
|
394
|
+
end
|
395
|
+
end
|
396
|
+
end
|
397
|
+
|
398
|
+
describe SquareGraph, "#==" do
|
399
|
+
it "compares two squaregraphs without identites" do
|
400
|
+
sg1 = SquareGraph.new
|
401
|
+
sg2 = SquareGraph.new
|
402
|
+
(sg1 == sg2).should be_true
|
403
|
+
sg1.should == sg2
|
404
|
+
end
|
405
|
+
it "compares objects without identies too" do
|
406
|
+
du = DummyObject.new(5)
|
407
|
+
sg1 = SquareGraph.new
|
408
|
+
sg2 = SquareGraph.new
|
409
|
+
sg1.fill(0,0,du)
|
410
|
+
sg2.fill(0,0,du)
|
411
|
+
(sg1 == sg2).should be_true
|
412
|
+
sg1.should == sg2
|
413
|
+
end
|
414
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: square_graph
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,13 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-03-26 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: A dimensionable graph that acts kinda like a grid. You can fill in spots
|
15
|
-
with objects and then iterate over the entire grid or just objects.
|
16
|
-
|
15
|
+
with objects and then iterate over the entire grid or just objects. Now, there is
|
16
|
+
a new concept called truthy which will return given a certain condition. Each object
|
17
|
+
in the graph can be given a truthy? method and you can use that to iterate through
|
18
|
+
objects in the graphs more efficiently.
|
17
19
|
email: Austin.L.D4L@gmail.com
|
18
20
|
executables: []
|
19
21
|
extensions: []
|