graphs 0.1.6-x86-linux → 0.1.7-x86-linux
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/graph.rb +78 -24
- data/tests/edge_tests.rb +46 -0
- data/tests/graph_tests.rb +47 -0
- data/tests/node_tests.rb +11 -0
- metadata +9 -7
data/lib/graph.rb
CHANGED
@@ -65,7 +65,15 @@ class Graph
|
|
65
65
|
@attrs == other.attrs
|
66
66
|
end
|
67
67
|
|
68
|
+
def update(h)
|
69
|
+
Node.new super(h)
|
70
|
+
end
|
71
|
+
|
68
72
|
def method_missing(method, *args, &block)
|
73
|
+
|
74
|
+
return @attrs[method.to_sym] if @attrs.has_key? method.to_sym
|
75
|
+
return @attrs[method.to_s] if @attrs.has_key? method.to_s
|
76
|
+
|
69
77
|
@attrs.send(method, *args, &block)
|
70
78
|
end
|
71
79
|
|
@@ -89,7 +97,15 @@ class Graph
|
|
89
97
|
@attrs == other.attrs
|
90
98
|
end
|
91
99
|
|
100
|
+
def update(h)
|
101
|
+
Edge.new super(h)
|
102
|
+
end
|
103
|
+
|
92
104
|
def method_missing(method, *args, &block)
|
105
|
+
|
106
|
+
return @attrs[method.to_sym] if @attrs.has_key? method.to_sym
|
107
|
+
return @attrs[method.to_s] if @attrs.has_key? method.to_s
|
108
|
+
|
93
109
|
@attrs.send(method, *args, &block)
|
94
110
|
end
|
95
111
|
|
@@ -117,11 +133,14 @@ class Graph
|
|
117
133
|
# @param n [Node]
|
118
134
|
def push(n)
|
119
135
|
if (!n.is_a?(Hash) && !n.is_a?(Node))
|
120
|
-
raise TypeError.new "#{n.inspect} is not an Hash
|
136
|
+
raise TypeError.new "#{n.inspect} is not an Hash nor a Node!"
|
121
137
|
end
|
122
138
|
|
139
|
+
n = Node.new(n) if (n.is_a?(Hash))
|
140
|
+
|
123
141
|
super(n.clone.update(@defaults))
|
124
142
|
end
|
143
|
+
|
125
144
|
end
|
126
145
|
|
127
146
|
# An array of Edge objects
|
@@ -146,11 +165,14 @@ class Graph
|
|
146
165
|
# @param e [Edge]
|
147
166
|
def push(e)
|
148
167
|
if (!e.is_a?(Hash) && !e.is_a?(Edge))
|
149
|
-
raise TypeError.new "#{e.inspect} is not an Hash
|
168
|
+
raise TypeError.new "#{e.inspect} is not an Hash nor an Edge!"
|
150
169
|
end
|
151
170
|
|
171
|
+
e = Edge.new(e) if (e.is_a?(Hash))
|
172
|
+
|
152
173
|
super(e.clone.update(@defaults))
|
153
174
|
end
|
175
|
+
|
154
176
|
end
|
155
177
|
|
156
178
|
attr_accessor :nodes, :edges, :attrs
|
@@ -313,7 +335,7 @@ class Graph
|
|
313
335
|
# @see Graph#in_degree_of
|
314
336
|
# @see Graph#out_degree_of
|
315
337
|
def degree_of(n)
|
316
|
-
label = Graph::
|
338
|
+
label = Graph::get_label(n)
|
317
339
|
|
318
340
|
degree = 0
|
319
341
|
|
@@ -337,7 +359,7 @@ class Graph
|
|
337
359
|
# @see Graph#degree_of
|
338
360
|
# @see Graph#out_degree_of
|
339
361
|
def in_degree_of(n)
|
340
|
-
label = Graph::
|
362
|
+
label = Graph::get_label(n)
|
341
363
|
|
342
364
|
degree = 0
|
343
365
|
|
@@ -358,7 +380,7 @@ class Graph
|
|
358
380
|
# @see Graph#degree_of
|
359
381
|
# @see Graph#out_degree_of
|
360
382
|
def out_degree_of(n)
|
361
|
-
label = Graph::
|
383
|
+
label = Graph::get_label(n)
|
362
384
|
|
363
385
|
degree = 0
|
364
386
|
|
@@ -369,36 +391,68 @@ class Graph
|
|
369
391
|
degree
|
370
392
|
end
|
371
393
|
|
372
|
-
#
|
373
|
-
#
|
374
|
-
|
375
|
-
# Edges must have the 'node1' and 'node2' attributes, which must contain
|
376
|
-
# the 'label' attributes of nodes.
|
377
|
-
#
|
378
|
-
# @param n [Node,String] A node or a label of one
|
379
|
-
# @see Graph#degree_of
|
380
|
-
# @see Graph#out_degree_of
|
381
|
-
def in_degree_of(n)
|
382
|
-
label = Graph::get_label_from_node(n)
|
394
|
+
# return the first node which mach the given label in the current graph
|
395
|
+
# @param label [String] A node's label
|
396
|
+
def get_node(label)
|
383
397
|
|
384
|
-
|
398
|
+
label = Graph::get_label(label)
|
399
|
+
|
400
|
+
self.nodes.find { |n| n.label == label }
|
401
|
+
|
402
|
+
end
|
403
|
+
|
404
|
+
# return an array of the neighbours of a node in the current graph.
|
405
|
+
# @param n [Node,String] A node with a 'label' or :label attribute, or a string
|
406
|
+
def get_neighbours(n)
|
407
|
+
|
408
|
+
label = Graph::get_label(n)
|
409
|
+
neighbours = NodeArray.new []
|
385
410
|
|
386
|
-
# This is more efficient than in_degree_of(n)+out_degree_of(n)
|
387
|
-
# since it goes only once through the edges array
|
388
411
|
self.edges.each do |e|
|
389
|
-
|
412
|
+
|
413
|
+
begin
|
414
|
+
|
415
|
+
l1 = e.node1
|
416
|
+
l2 = e.node2
|
417
|
+
|
418
|
+
rescue NoMethodError; next; end
|
419
|
+
|
420
|
+
if l2 && l1 == label
|
421
|
+
|
422
|
+
n2 = self.get_node l2
|
423
|
+
|
424
|
+
unless neighbours.include?(l2)
|
425
|
+
|
426
|
+
neighbours.push(n2)
|
427
|
+
|
428
|
+
end
|
429
|
+
|
430
|
+
end
|
431
|
+
|
432
|
+
if l1 && l2 == label && self.directed?
|
433
|
+
|
434
|
+
n1 = self.get_node l1
|
435
|
+
|
436
|
+
unless neighbours.include?(n1)
|
437
|
+
|
438
|
+
neighbours.push(n1)
|
439
|
+
|
440
|
+
end
|
441
|
+
|
442
|
+
end
|
443
|
+
|
390
444
|
end
|
391
445
|
|
392
|
-
|
393
|
-
end
|
446
|
+
neighbours
|
394
447
|
|
448
|
+
end
|
395
449
|
|
396
450
|
# return the label of a node. Raise a TypeError exception if the argument
|
397
451
|
# is not a Node nor a String object.
|
398
452
|
# @param n [Node,String] A node with a 'label' or :label attribute, or a string
|
399
|
-
def Graph::
|
453
|
+
def Graph::get_label(n)
|
400
454
|
label = n.is_a?(Node) \
|
401
|
-
?
|
455
|
+
? n.label.to_s \
|
402
456
|
: n.is_a?(String) ? n : nil
|
403
457
|
|
404
458
|
raise TypeError.new("#{n.inspect} must be a Node or String object.") if label.nil?
|
data/tests/edge_tests.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
#! /usr/bin/ruby1.9.1
|
2
|
+
# -*- coding: UTF-8 -*-
|
3
|
+
|
4
|
+
class Edge_test < Test::Unit::TestCase
|
5
|
+
|
6
|
+
def setup
|
7
|
+
@@empty = Graph::Node.new
|
8
|
+
@@alice = Graph::Node.new('label' => 'Alice')
|
9
|
+
|
10
|
+
# Alice ----> Bob
|
11
|
+
# ↑ ↑
|
12
|
+
# | |
|
13
|
+
# Oscar -------'
|
14
|
+
@@sample_graph = Graph.new(
|
15
|
+
[
|
16
|
+
{ 'label' => 'Alice' },
|
17
|
+
{ 'label' => 'Bob' },
|
18
|
+
{ 'label' => 'Oscar' }
|
19
|
+
],
|
20
|
+
[
|
21
|
+
{ 'node1' => 'Alice', 'node2' => 'Bob' },
|
22
|
+
{ :node1 => 'Oscar', 'node2' => 'Alice'},
|
23
|
+
{ 'node1' => 'Oscar', :node2 => 'Bob'}
|
24
|
+
]
|
25
|
+
)
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_edge_node1_attr
|
30
|
+
assert_equal('Alice', @@sample_graph.edges[0].node1)
|
31
|
+
assert_equal('Oscar', @@sample_graph.edges[1].node1)
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_edge_node2_attr
|
35
|
+
assert_equal('Alice', @@sample_graph.edges[1].node2)
|
36
|
+
assert_equal('Bob', @@sample_graph.edges[2].node2)
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_edge_update
|
40
|
+
|
41
|
+
e = Graph::Edge.new
|
42
|
+
|
43
|
+
assert_equal(true, e.update({}).is_a?(Graph::Edge))
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
data/tests/graph_tests.rb
CHANGED
@@ -551,4 +551,51 @@ class Graph_test < Test::Unit::TestCase
|
|
551
551
|
end
|
552
552
|
assert_equal(false, File.exists?(f))
|
553
553
|
end
|
554
|
+
|
555
|
+
# == Graph#get_node == #
|
556
|
+
|
557
|
+
def test_graph_get_node_unexisting_label
|
558
|
+
|
559
|
+
n = @@sample_graph.get_node 'foobar'
|
560
|
+
|
561
|
+
assert_equal(nil, n)
|
562
|
+
end
|
563
|
+
|
564
|
+
def test_graph_get_node_existing_label
|
565
|
+
|
566
|
+
g = @@sample_graph;
|
567
|
+
|
568
|
+
n = g.get_node 'foo'
|
569
|
+
|
570
|
+
assert_equal(g.nodes[0], n)
|
571
|
+
end
|
572
|
+
|
573
|
+
# == Graph#get_neighbours == #
|
574
|
+
|
575
|
+
def test_graph_get_neighbours_unexisting_node_label
|
576
|
+
|
577
|
+
n = @@sample_graph.get_neighbours 'moo'
|
578
|
+
|
579
|
+
assert_equal([], n)
|
580
|
+
|
581
|
+
end
|
582
|
+
|
583
|
+
def test_graph_get_neighbours_unexisting_node_object
|
584
|
+
|
585
|
+
n = @@sample_graph.get_neighbours Graph::Node.new( :label => 'moo' )
|
586
|
+
|
587
|
+
assert_equal([], n)
|
588
|
+
|
589
|
+
end
|
590
|
+
|
591
|
+
def test_graph_get_neighbours
|
592
|
+
|
593
|
+
g = @@sample_graph
|
594
|
+
|
595
|
+
n = g.get_neighbours 'foo'
|
596
|
+
|
597
|
+
assert_equal([ 'bar', 'chuck' ], n.map { |m| m.label })
|
598
|
+
|
599
|
+
end
|
600
|
+
|
554
601
|
end
|
data/tests/node_tests.rb
CHANGED
@@ -81,4 +81,15 @@ class Node_test < Test::Unit::TestCase
|
|
81
81
|
assert_equal(1, @@sample_graph.out_degree_of(@@alice))
|
82
82
|
end
|
83
83
|
|
84
|
+
def test_node_label_attr
|
85
|
+
assert_equal('Alice', @@alice.label)
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_node_update
|
89
|
+
|
90
|
+
n = Graph::Node.new
|
91
|
+
|
92
|
+
assert_equal(true, n.update({}).is_a?(Graph::Node))
|
93
|
+
end
|
94
|
+
|
84
95
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: graphs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.7
|
5
5
|
prerelease:
|
6
6
|
platform: x86-linux
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-02-12 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: Provide functions to (un)parse GDF/JSON files and generate graphs
|
15
15
|
email: batifon@yahoo.fr
|
@@ -20,10 +20,11 @@ files:
|
|
20
20
|
- lib/graph.rb
|
21
21
|
- lib/graphs/gdf.rb
|
22
22
|
- lib/graphs/json.rb
|
23
|
-
- tests/graph_tests.rb
|
24
23
|
- tests/tests.rb
|
25
|
-
- tests/
|
24
|
+
- tests/graph_tests.rb
|
25
|
+
- tests/edge_tests.rb
|
26
26
|
- tests/gdf_tests.rb
|
27
|
+
- tests/node_tests.rb
|
27
28
|
- tests/gexf_tests.rb
|
28
29
|
- tests/json_tests.rb
|
29
30
|
homepage: https://github.com/bfontaine/Graphs.rb
|
@@ -47,14 +48,15 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
47
48
|
version: '0'
|
48
49
|
requirements: []
|
49
50
|
rubyforge_project:
|
50
|
-
rubygems_version: 1.8.
|
51
|
+
rubygems_version: 1.8.24
|
51
52
|
signing_key:
|
52
53
|
specification_version: 3
|
53
54
|
summary: Utilities to manipulate graph files
|
54
55
|
test_files:
|
55
|
-
- tests/graph_tests.rb
|
56
56
|
- tests/tests.rb
|
57
|
-
- tests/
|
57
|
+
- tests/graph_tests.rb
|
58
|
+
- tests/edge_tests.rb
|
58
59
|
- tests/gdf_tests.rb
|
60
|
+
- tests/node_tests.rb
|
59
61
|
- tests/gexf_tests.rb
|
60
62
|
- tests/json_tests.rb
|