graphml2json 0.0.3 → 0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 85a006e64ad99c3a3cfef569ff3e9d7ace0feb8410862c2a1071fa32d3ec0b8e
4
- data.tar.gz: 502cd8e34f527f93d533605e6c4c0c395b2c629d2fd1cad240fa15cbc09fb476
3
+ metadata.gz: 90e038ecdb0e2038bb4f4b5a274e2d30c112c29f6f47fb0d8ba07f5436e9aece
4
+ data.tar.gz: b30c4012708853363a099c210818a9614c283e4ad71e89cedc99175ad8cce775
5
5
  SHA512:
6
- metadata.gz: 8185062c1c258c4147e3adacc7faa90457216ad25ecf69ab88346def5e1dac4d0f68332e4d826c2a9ae5e755af5cce4f56db9f1d6a20d1558210192d14ffbd7c
7
- data.tar.gz: f4e23ea06a4c5718fb9f33effbdb9886218480af08398e05e69e0e02e02d1e288dbffcc1aed607a58dc933a7e376816f4d6b8b4aeb71c7aeb1967c24db8e4b7d
6
+ metadata.gz: d365932f68e60f125c41db42e62b8d50c86ec5660d7a110951631abac8a5428a17166f57dd69f807ec947dc057c6df732775a4c463966a4f06cb557bd257cf9f
7
+ data.tar.gz: 93d9b6fd54733783286915763e6502d7611507004a03fdd37cf6b1f7c98bc7e2a13546f1c792696ff1a63160b5e606e7613e74e09c1baab524cb14304084007b
@@ -0,0 +1,17 @@
1
+ # 0.1.0 / 2018-12-30
2
+
3
+ * Add command line excutable helper
4
+ * Add data nodes to attributes
5
+
6
+ # 0.0.3 / 2018-12-28
7
+
8
+ * Update Nokogiri dependency
9
+
10
+ # 0.0.2 / 2013-11-14
11
+
12
+ * make work with namespacing
13
+ * add specs
14
+
15
+ # 0.0.1 / 2013-08-05
16
+
17
+ * initial release
@@ -1,4 +1,4 @@
1
- Copyright (c) 2013 Gregory Ostermayr
1
+ Copyright (c) 2018 Gregory Ostermayr
2
2
 
3
3
  MIT License
4
4
 
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Graphml2json
2
2
 
3
- Takes graphml and converts it to json for use in D3
3
+ This utility takes graphml and converts it to json suitable for use in D3
4
4
 
5
5
  ## Installation
6
6
 
@@ -18,20 +18,91 @@ Or install it yourself as:
18
18
 
19
19
  ## Usage
20
20
 
21
+ ### From ruby
21
22
  ```
22
- gregors$ irb --simple-prompt
23
- >> file = File.open('simple.graphml', 'rb')
24
- => #<File:simple.graphml>
25
- >> graphml = file.read
26
- => "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<graphml xmlns=\"http://graphml.graphdrawing.org/xmlns\" \n xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n xsi:schemaLocation=\"http://graphml.graphdrawing.org/xmlns\n http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd\">\n <graph id=\"G\" edgedefault=\"undirected\">\n <node id=\"n0\"/>\n <node id=\"n1\"/>\n <node id=\"n2\"/>\n <node id=\"n3\"/>\n <node id=\"n4\"/>\n <node id=\"n5\"/>\n <node id=\"n6\"/>\n <node id=\"n7\"/>\n <node id=\"n8\"/>\n <node id=\"n9\"/>\n <node id=\"n10\"/>\n <edge source=\"n0\" target=\"n2\"/>\n <edge source=\"n1\" target=\"n2\"/>\n <edge source=\"n2\" target=\"n3\"/>\n <edge source=\"n3\" target=\"n5\"/>\n <edge source=\"n3\" target=\"n4\"/>\n <edge source=\"n4\" target=\"n6\"/>\n <edge source=\"n6\" target=\"n5\"/>\n <edge source=\"n5\" target=\"n7\"/>\n <edge source=\"n6\" target=\"n8\"/>\n <edge source=\"n8\" target=\"n7\"/>\n <edge source=\"n8\" target=\"n9\"/>\n <edge source=\"n8\" target=\"n10\"/>\n </graph>\n</graphml>\n"
23
+ >> require 'open-uri'
27
24
  >> require 'graphml2json'
28
- => true
29
- >> json = Graphml2Json.generate(graphml)
30
- => "{\"nodes\":[{\"name\":0},{\"name\":1},{\"name\":2},{\"name\":3},{\"name\":4},{\"name\":5},{\"name\":6},{\"name\":7},{\"name\":8},{\"name\":9},{\"name\":10}],\"edges\":[{\"source\":0,\"target\":2},{\"source\":1,\"target\":2},{\"source\":2,\"target\":3},{\"source\":3,\"target\":5},{\"source\":3,\"target\":4},{\"source\":4,\"target\":6},{\"source\":6,\"target\":5},{\"source\":5,\"target\":7},{\"source\":6,\"target\":8},{\"source\":8,\"target\":7},{\"source\":8,\"target\":9},{\"source\":8,\"target\":10}]}"
25
+
26
+ >> data = open('http://graphml.graphdrawing.org/primer/attributes.graphml').read
27
+ => "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- This file was written by the JAVA GraphML Library.-->\n<graphml xmlns=\"http://graphml.graphdrawing.org/xmlns\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\nxsi:schemaLocation=\"http://graphml.graphdrawing.org/xmlns http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd\">\n <key id=\"d0\" for=\"node\" attr.name=\"color\" attr.type=\"string\">\n <default>yellow</default>\n </key>\n <key id=\"d1\" for=\"edge\" attr.name=\"weight\" attr.type=\"double\"/>\n <graph id=\"G\" edgedefault=\"undirected\">\n <node id=\"n0\">\n <data key=\"d0\">green</data>\n </node>\n <node id=\"n1\"/>\n <node id=\"n2\">\n <data key=\"d0\">blue</data>\n </node>\n <node id=\"n3\">\n <data key=\"d0\">red</data>\n </node>\n <node id=\"n4\"/>\n <node id=\"n5\">\n <data key=\"d0\">turquoise</data>\n </node>\n <edge id=\"e0\" source=\"n0\" target=\"n2\">\n <data key=\"d1\">1.0</data>\n </edge>\n <edge id=\"e1\" source=\"n0\" target=\"n1\">\n <data key=\"d1\">1.0</data>\n </edge>\n <edge id=\"e2\" source=\"n1\" target=\"n3\">\n <data key=\"d1\">2.0</data>\n </edge>\n <edge id=\"e3\" source=\"n3\" target=\"n2\"/>\n <edge id=\"e4\" source=\"n2\" target=\"n4\"/>\n <edge id=\"e5\" source=\"n3\" target=\"n5\"/>\n <edge id=\"e6\" source=\"n5\" target=\"n4\">\n <data key=\"d1\">1.1</data>\n </edge>\n </graph>\n</graphml>\n"
28
+
29
+ >> Graphml2Json.generate(data)
30
+
31
+ => "{\"nodes\":[{\"name\":0,\"d0\":\"green\"},{\"name\":1},{\"name\":2,\"d0\":\"blue\"},{\"name\":3,\"d0\":\"red\"},{\"name\":4},{\"name\":5,\"d0\":\"turquoise\"}],\"edges\":[{\"source\":0,\"target\":2,\"d1\":\"1.0\"},{\"source\":0,\"target\":1,\"d1\":\"1.0\"},{\"source\":1,\"target\":3,\"d1\":\"2.0\"},{\"source\":3,\"target\":2},{\"source\":2,\"target\":4},{\"source\":3,\"target\":5},{\"source\":5,\"target\":4,\"d1\":\"1.1\"}]}"
32
+ ```
33
+
34
+ ### From a terminal
35
+
36
+ You can also invoke the `graphml2json` utility from the command line. It takes stdin as input.
37
+
31
38
  ```
39
+ $ curl http://graphml.graphdrawing.org/primer/attributes.graphml | graphml2json | json_pp
40
+ {
41
+ "nodes" : [
42
+ {
43
+ "d0" : "green",
44
+ "name" : 0
45
+ },
46
+ {
47
+ "name" : 1
48
+ },
49
+ {
50
+ "name" : 2,
51
+ "d0" : "blue"
52
+ },
53
+ {
54
+ "name" : 3,
55
+ "d0" : "red"
56
+ },
57
+ {
58
+ "name" : 4
59
+ },
60
+ {
61
+ "d0" : "turquoise",
62
+ "name" : 5
63
+ }
64
+ ],
65
+ "edges" : [
66
+ {
67
+ "d1" : "1.0",
68
+ "source" : 0,
69
+ "target" : 2
70
+ },
71
+ {
72
+ "target" : 1,
73
+ "d1" : "1.0",
74
+ "source" : 0
75
+ },
76
+ {
77
+ "source" : 1,
78
+ "d1" : "2.0",
79
+ "target" : 3
80
+ },
81
+ {
82
+ "target" : 2,
83
+ "source" : 3
84
+ },
85
+ {
86
+ "source" : 2,
87
+ "target" : 4
88
+ },
89
+ {
90
+ "source" : 3,
91
+ "target" : 5
92
+ },
93
+ {
94
+ "d1" : "1.1",
95
+ "source" : 5,
96
+ "target" : 4
97
+ }
98
+ ]
99
+ }
100
+
101
+ ```
102
+
103
+ ## Changelog
32
104
 
33
- sample file used taken from:
34
- http://graphml.graphdrawing.org/primer/graphml-primer.html
105
+ * [changelog](https://github.com/gregors/graphml2json/blob/master/CHANGELOG.md)
35
106
 
36
107
  ## Contributing
37
108
 
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative '../lib/graphml2json.rb'
4
+
5
+ puts Graphml2Json.generate(ARGF.read)
@@ -4,22 +4,22 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
  require 'graphml2json/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
- spec.name = "graphml2json"
7
+ spec.name = 'graphml2json'
8
8
  spec.version = Graphml2Json::VERSION
9
- spec.authors = ["Gregory Ostermayr"]
10
- spec.email = ["<gregory.ostermayr@gmail.com>"]
11
- spec.description = %q{Convert graphml to json}
12
- spec.summary = %q{Convert graphml to json}
13
- spec.homepage = "https://github.com/gregors/graphml2json"
14
- spec.license = "MIT"
9
+ spec.authors = ['Gregory Ostermayr']
10
+ spec.email = ['<gregory.ostermayr@gmail.com>']
11
+ spec.description = %q{Convert graphml to json for D3 use}
12
+ spec.summary = %q{Convert graphml to json for D3 use}
13
+ spec.homepage = 'https://github.com/gregors/graphml2json'
14
+ spec.license = 'MIT'
15
15
 
16
16
  spec.files = `git ls-files`.split($/)
17
17
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
- spec.require_paths = ["lib"]
19
+ spec.require_paths = ['lib']
20
20
 
21
21
  spec.add_dependency 'nokogiri', '>= 1.8.2'
22
- spec.add_development_dependency "bundler", "~> 1.3"
23
- spec.add_development_dependency "rspec", "~> 2.14.1"
22
+ spec.add_development_dependency 'bundler', '~> 1.6'
23
+ spec.add_development_dependency "rspec", '~> 2.14.1'
24
24
  spec.add_development_dependency "rake"
25
25
  end
@@ -3,7 +3,7 @@ require 'json'
3
3
 
4
4
  module Graphml2Json
5
5
 
6
- def self.generate(xml_string)
6
+ def self.generate(xml_string)
7
7
  doc = Nokogiri::XML(xml_string)
8
8
  doc.remove_namespaces!
9
9
  graph = doc.xpath('//graph')
@@ -14,21 +14,38 @@ module Graphml2Json
14
14
  @json_nodes = []
15
15
 
16
16
  @graph = {}
17
- @graph[:nodes] = []
18
- @graph[:edges] = []
17
+ @graph[:nodes] = []
18
+ @graph[:edges] = []
19
19
 
20
20
  nodes.each_with_index do |n, index|
21
- @mapping[n[:id]] = index
22
- @graph[:nodes] << {:name => index}
21
+
22
+ attributes = data_attributes(n)
23
+ @mapping[n[:id]] = index
24
+ new_node = {:name => index}.merge(attributes)
25
+ @graph[:nodes] << new_node
23
26
  end
24
27
 
25
- @json_edges = []
28
+ @json_edges = []
26
29
  edges.each do |e|
27
30
  source = @mapping[e[:source]]
28
31
  target = @mapping[e[:target]]
29
- @graph[:edges] << { :source => source, :target => target }
32
+ attributes = data_attributes(e)
33
+ new_edge = { :source => source, :target => target }.merge(attributes)
34
+ @graph[:edges] << new_edge
30
35
  end
31
36
 
32
37
  JSON.generate(@graph)
33
38
  end
39
+
40
+ private
41
+
42
+ def self.data_attributes(node)
43
+ data_nodes = node.xpath('./data')
44
+
45
+ attributes = data_nodes.map do |d|
46
+ {d[:key] => d.text}
47
+ end.inject(&:merge)
48
+
49
+ attributes || {}
50
+ end
34
51
  end
@@ -1,3 +1,3 @@
1
1
  module Graphml2Json
2
- VERSION = '0.0.3'
2
+ VERSION = '0.1.0'
3
3
  end
@@ -0,0 +1,39 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3
+ xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd">
4
+ <key id="d0" for="node" attr.name="color" attr.type="string">
5
+ <default>yellow</default>
6
+ </key>
7
+ <key id="d1" for="edge" attr.name="weight" attr.type="double"/>
8
+ <graph id="G" edgedefault="undirected">
9
+ <node id="n0">
10
+ <data key="color">green</data>
11
+ </node>
12
+ <node id="n1"/>
13
+ <node id="n2">
14
+ <data key="color">blue</data>
15
+ </node>
16
+ <node id="n3">
17
+ <data key="color">red</data>
18
+ </node>
19
+ <node id="n4"/>
20
+ <node id="n5">
21
+ <data key="color">turquoise</data>
22
+ </node>
23
+ <edge id="e0" source="n0" target="n2">
24
+ <data key="size">1.0</data>
25
+ </edge>
26
+ <edge id="e1" source="n0" target="n1">
27
+ <data key="size">1.0</data>
28
+ </edge>
29
+ <edge id="e2" source="n1" target="n3">
30
+ <data key="size">2.0</data>
31
+ </edge>
32
+ <edge id="e3" source="n3" target="n2"/>
33
+ <edge id="e4" source="n2" target="n4"/>
34
+ <edge id="e5" source="n3" target="n5"/>
35
+ <edge id="e6" source="n5" target="n4">
36
+ <data key="size">1.1</data>
37
+ </edge>
38
+ </graph>
39
+ </graphml>
@@ -1,23 +1,30 @@
1
1
  require 'spec_helper'
2
- require 'graphml2json'
3
2
 
4
3
  describe Graphml2Json do
5
4
  let(:json) {'{"nodes":[{"name":0},{"name":1},{"name":2},{"name":3}],"edges":[{"source":0,"target":1},{"source":1,"target":2},{"source":2,"target":3},{"source":3,"target":null}]}'}
6
5
 
7
- describe ".generate" do
8
- context "missing proper namespace" do
6
+ describe '.generate' do
7
+ context 'missing proper namespace' do
9
8
  it 'returns valid json' do
10
- graphml = File.read("spec/fixtures/graphml_without_namespacing.txt")
9
+ graphml = File.read('spec/fixtures/graphml_without_namespacing.txt')
11
10
  Graphml2Json::generate(graphml).should == json
12
11
  end
13
12
  end
14
13
 
15
- context "with namespace" do
14
+ context 'with namespace' do
16
15
  it 'returns valid json' do
17
- graphml = File.read("spec/fixtures/graphml_with_namespacing.txt")
16
+ graphml = File.read('spec/fixtures/graphml_with_namespacing.txt')
17
+ Graphml2Json::generate(graphml).should == json
18
+ end
19
+ end
20
+
21
+ context 'with nodes' do
22
+ let(:json){'{"nodes":[{"name":0,"color":"green"},{"name":1},{"name":2,"color":"blue"},{"name":3,"color":"red"},{"name":4},{"name":5,"color":"turquoise"}],"edges":[{"source":0,"target":2,"size":"1.0"},{"source":0,"target":1,"size":"1.0"},{"source":1,"target":3,"size":"2.0"},{"source":3,"target":2},{"source":2,"target":4},{"source":3,"target":5},{"source":5,"target":4,"size":"1.1"}]}'}
23
+
24
+ it 'returns data as attributes' do
25
+ graphml = File.read('spec/fixtures/attributes.graphml')
18
26
  Graphml2Json::generate(graphml).should == json
19
27
  end
20
28
  end
21
29
  end
22
30
  end
23
-
@@ -4,6 +4,7 @@
4
4
  # loaded once.
5
5
  #
6
6
  # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
7
+ require 'graphml2json'
7
8
 
8
9
  RSpec.configure do |config|
9
10
  config.treat_symbols_as_metadata_keys_with_true_values = true
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: graphml2json
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gregory Ostermayr
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-12-28 00:00:00.000000000 Z
11
+ date: 2018-12-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '1.3'
33
+ version: '1.6'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '1.3'
40
+ version: '1.6'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -66,22 +66,26 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
- description: Convert graphml to json
69
+ description: Convert graphml to json for D3 use
70
70
  email:
71
71
  - "<gregory.ostermayr@gmail.com>"
72
- executables: []
72
+ executables:
73
+ - graphml2json
73
74
  extensions: []
74
75
  extra_rdoc_files: []
75
76
  files:
76
77
  - ".gitignore"
77
78
  - ".rspec"
79
+ - CHANGELOG.md
78
80
  - Gemfile
79
81
  - LICENSE.txt
80
82
  - README.md
81
83
  - Rakefile
84
+ - bin/graphml2json
82
85
  - graphml2json.gemspec
83
86
  - lib/graphml2json.rb
84
87
  - lib/graphml2json/version.rb
88
+ - spec/fixtures/attributes.graphml
85
89
  - spec/fixtures/graphml_with_namespacing.txt
86
90
  - spec/fixtures/graphml_without_namespacing.txt
87
91
  - spec/graphml2json_spec.rb
@@ -106,11 +110,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
106
110
  version: '0'
107
111
  requirements: []
108
112
  rubyforge_project:
109
- rubygems_version: 2.7.8
113
+ rubygems_version: 2.7.7
110
114
  signing_key:
111
115
  specification_version: 4
112
- summary: Convert graphml to json
116
+ summary: Convert graphml to json for D3 use
113
117
  test_files:
118
+ - spec/fixtures/attributes.graphml
114
119
  - spec/fixtures/graphml_with_namespacing.txt
115
120
  - spec/fixtures/graphml_without_namespacing.txt
116
121
  - spec/graphml2json_spec.rb