ruby-graphml 0.0.1

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.
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in ruby-graphml.gemspec
4
+ gemspec
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,183 @@
1
+ require 'nokogiri'
2
+
3
+ module GraphML
4
+ VERSION = "0.0.1"
5
+
6
+ class Key
7
+ attr_accessor :id, :for, :name, :type, :desc, :default
8
+ def initialize(attrs)
9
+ attrs.each do |key, val|
10
+ case key
11
+ when 'id'
12
+ @id = val
13
+ when 'for'
14
+ @for = val
15
+ when 'attr.name'
16
+ @name = val
17
+ when 'attr.type'
18
+ @type = val
19
+ end
20
+ end
21
+ @desc = ''
22
+ @default = ''
23
+ end
24
+
25
+ def append(key, val)
26
+ if key == 'desc'
27
+ @desc += val
28
+ elsif key == 'default'
29
+ @default += val
30
+ end
31
+ end
32
+ end
33
+
34
+ class Edge
35
+ def initialize(attrs, graph)
36
+ attrs.each do |key, val|
37
+ if key == 'source'
38
+ @source = val
39
+ elsif key == 'target'
40
+ @target = val
41
+ end
42
+ end
43
+ @graph = graph
44
+ source.out_edges << self
45
+ target.in_edges << self
46
+ end
47
+
48
+ def source
49
+ @graph.nodes[@source]
50
+ end
51
+
52
+ def target
53
+ @graph.nodes[@target]
54
+ end
55
+ end
56
+
57
+ class Node
58
+ attr_accessor :id, :data, :in_edges, :out_edges
59
+ def initialize(attrs, graph)
60
+ attrs.each do |key, val|
61
+ if key == 'id'
62
+ @id = val
63
+ end
64
+ end
65
+ @data = {}
66
+ @in_edges = []
67
+ @out_edges = []
68
+ @graph = graph
69
+ end
70
+
71
+ def key(name)
72
+ key_obj = @graph.key_names[name]
73
+ val = @data[key_obj.id]
74
+ return key_obj.default if val.nil?
75
+ val
76
+ end
77
+ end
78
+
79
+ class Graph
80
+ attr_accessor :keys, :key_names, :nodes, :edges
81
+
82
+ def initialize
83
+ @keys = {}
84
+ @key_names = {}
85
+ @nodes = {}
86
+ @edges = []
87
+ end
88
+ end
89
+
90
+ class Parser < Nokogiri::XML::SAX::Document
91
+ attr_reader :graph
92
+
93
+ def self.parse!(path)
94
+ parser = self.new
95
+ graph = parser.graph
96
+ parser = Nokogiri::XML::SAX::Parser.new(parser).parse(File.open(path, 'rb'))
97
+ graph
98
+ end
99
+
100
+ def initialize
101
+ @current_node = nil
102
+ @current_key = nil
103
+ @current_edge = nil
104
+ @state = nil
105
+ @sub_state = nil
106
+ @graph = Graph.new
107
+ end
108
+
109
+ def start_element(name, attrs=[])
110
+ case @state
111
+ # creating a new key, node or edge
112
+ when nil
113
+ case name
114
+ when 'key'
115
+ @current_key = Key.new(attrs)
116
+ @graph.keys[@current_key.id] = @current_key
117
+ @graph.key_names[@current_key.name] = @current_key
118
+ when 'node'
119
+ @current_node = Node.new(attrs, @graph)
120
+ @graph.nodes[@current_node.id] = @current_node
121
+ when 'edge'
122
+ @current_edge = Edge.new(attrs, @graph)
123
+ @graph.edges << @current_edge
124
+ else
125
+ return
126
+ end
127
+ @state = name
128
+ @sub_state = nil
129
+
130
+ # adding to a key
131
+ when 'key'
132
+ raise 'Missing key object' if @current_key.nil?
133
+ @sub_state = name
134
+
135
+ # adding a key value to a node
136
+ when 'node'
137
+ raise 'Missing node object' if @current_node.nil?
138
+ raise 'Unexpected attribute' if attrs[0][0] != 'key'
139
+ @sub_state = attrs[0][1]
140
+ end
141
+ end
142
+
143
+ def characters(string)
144
+ return if @sub_state.nil?
145
+ case @state
146
+ when 'key'
147
+ raise 'Missing key object' if @current_key.nil?
148
+ @current_key.append(@sub_state, string)
149
+ when 'node'
150
+ raise 'Missing node object' if @current_node.nil?
151
+ @current_node.data[@sub_state] ||= ''
152
+ @current_node.data[@sub_state] += string
153
+ end
154
+ end
155
+
156
+ def end_element(name)
157
+ case @state
158
+ when 'node'
159
+ if name == 'node'
160
+ @current_node = nil
161
+ @state = nil
162
+ else
163
+ @sub_state = nil
164
+ end
165
+ when 'edge'
166
+ if name == 'edge'
167
+ @current_edge = nil
168
+ @state = nil
169
+ else
170
+ @sub_state = nil
171
+ end
172
+ when 'key'
173
+ if name == 'key'
174
+ @current_key = nil
175
+ @state = nil
176
+ else
177
+ @sub_state = nil
178
+ end
179
+ end
180
+ end
181
+ end
182
+
183
+ end
@@ -0,0 +1,22 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "ruby-graphml"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "ruby-graphml"
7
+ s.version = GraphML::VERSION
8
+ s.authors = ["Will"]
9
+ s.email = ["me@willcannings.com"]
10
+ s.homepage = ""
11
+ s.summary = %q{Ruby GraphML Parser}
12
+ s.description = %q{Ruby GraphML Parser}
13
+
14
+ s.files = `git ls-files`.split("\n")
15
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
16
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
17
+ s.require_paths = ["lib"]
18
+
19
+ # specify any dependencies here; for example:
20
+ # s.add_development_dependency "rspec"
21
+ s.add_runtime_dependency "nokogiri"
22
+ end
metadata ADDED
@@ -0,0 +1,61 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ruby-graphml
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Will
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-10-25 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: nokogiri
16
+ requirement: &70124370008660 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70124370008660
25
+ description: Ruby GraphML Parser
26
+ email:
27
+ - me@willcannings.com
28
+ executables: []
29
+ extensions: []
30
+ extra_rdoc_files: []
31
+ files:
32
+ - .gitignore
33
+ - Gemfile
34
+ - Rakefile
35
+ - lib/ruby-graphml.rb
36
+ - ruby-graphml.gemspec
37
+ homepage: ''
38
+ licenses: []
39
+ post_install_message:
40
+ rdoc_options: []
41
+ require_paths:
42
+ - lib
43
+ required_ruby_version: !ruby/object:Gem::Requirement
44
+ none: false
45
+ requirements:
46
+ - - ! '>='
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ required_rubygems_version: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ requirements: []
56
+ rubyforge_project:
57
+ rubygems_version: 1.8.10
58
+ signing_key:
59
+ specification_version: 3
60
+ summary: Ruby GraphML Parser
61
+ test_files: []