madeline 0.1.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.
data/Manifest ADDED
@@ -0,0 +1,8 @@
1
+ README.md
2
+ Rakefile
3
+ ext/madeline2-linux-x86_64
4
+ lib/madeline.rb
5
+ lib/madeline/interface.rb
6
+ test/madeline_test.rb
7
+ test/pedigree.txt
8
+ Manifest
data/README.md ADDED
@@ -0,0 +1,45 @@
1
+ Madeline
2
+ ========
3
+
4
+ Rails gem for running madeline on a pedigree hash
5
+
6
+ Installation
7
+ ------------
8
+
9
+ <pre>
10
+ sudo gem install madeline
11
+ </pre>
12
+
13
+ Usage
14
+ -----
15
+
16
+ The *Madeline::Interface* has a single method, `draw`, which can be passed a string or an open *IO* object, and returns the Madeline XML. The result is returned as a string, or, if a block is passed, yields as an *IO* object for streaming writes.
17
+
18
+ <pre>
19
+ require 'rubygems'
20
+ require 'madeline'
21
+ Madeline::Interface.new.draw(File.open('pedigree.txt', 'r'))
22
+ </pre>
23
+
24
+ When creating a *Madeline::Interface*, you can pass [any options that the madeline2 program accepts](http://eyegene.ophthy.med.umich.edu/madeline/documentation.php) to the interface and they'll be forwarded. For example, to create an embedded result:
25
+
26
+ <pre>
27
+ artist = Madeline::Interface.new(:embedded => true)
28
+ artist.draw(File.open('pedigree.txt', 'r'))
29
+ </pre>
30
+
31
+ The default values of all the madeline2 flags are identical to the command-line version.
32
+
33
+ A *Madeline::Error* exception will be raised if draw fails for any reason.
34
+
35
+ Madeline Location
36
+ -----------------
37
+
38
+ The *Madeline::Interface* initializer can take a `madeline` option, overriding the location of the madeline2 program.
39
+
40
+ <pre>
41
+ artist = Madeline::Interface.new(
42
+ :madeline => '/usr/local/bin/madeline2'
43
+ )
44
+ </pre>
45
+
data/Rakefile ADDED
@@ -0,0 +1,35 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'echoe'
4
+ require 'rake/testtask'
5
+ require 'rake/rdoctask'
6
+
7
+ Echoe.new('madeline','0.1.1') do |p|
8
+ p.description = "Interface to Madeline2"
9
+ p.url = "http://github.com/dmauldin/madeline"
10
+ p.author = "Denise Mauldin"
11
+ p.email = "denise.mauldin@gmail.com"
12
+ p.ignore_pattern = ["tmp/*", "script/*"]
13
+ p.development_dependencies = []
14
+ end
15
+
16
+ Dir["#{File.dirname(__FILE__)}/tasks/*.rake"].sort.each { |ext| load ext}
17
+
18
+ desc 'Default: run unit tests.'
19
+ task :default => :test
20
+
21
+ desc 'Test the madeline plugin.'
22
+ Rake::TestTask.new(:test) do |t|
23
+ t.libs << 'lib'
24
+ t.pattern = 'test/**/*_test.rb'
25
+ t.verbose = true
26
+ end
27
+
28
+ desc 'Generate documentation for the madeline plugin.'
29
+ Rake::RDocTask.new(:rdoc) do |rdoc|
30
+ rdoc.rdoc_dir = 'rdoc'
31
+ rdoc.title = 'Madeline'
32
+ rdoc.options << '--line-numbers' << '--inline-source'
33
+ rdoc.rdoc_files.include('README')
34
+ rdoc.rdoc_files.include('lib/**/*.rb')
35
+ end
Binary file
data/lib/madeline.rb ADDED
@@ -0,0 +1,13 @@
1
+ module Madeline
2
+
3
+ VERSION = "0.1.0"
4
+
5
+ MADELINE_VERSION = "2.0"
6
+
7
+ MADELINE_COMMAND = "ext/madeline2-linux-x86_64"
8
+
9
+ MADELINE_ROOT = File.expand_path(File.dirname(__FILE__))
10
+
11
+ end
12
+
13
+ require 'madeline/interface'
@@ -0,0 +1,74 @@
1
+ require 'stringio'
2
+ require 'tempfile'
3
+
4
+ module Madeline
5
+
6
+ class Error < StandardError; end
7
+
8
+ class Interface
9
+
10
+ DEFAULT_OPTIONS = {}
11
+
12
+ def initialize(options={})
13
+ @madeline = options.delete(:madeline) || MADELINE_COMMAND
14
+ @options = serialize_options(DEFAULT_OPTIONS.merge(options))
15
+ end
16
+
17
+ def draw(io)
18
+ tempfile = Tempfile.new('madeline')
19
+ if io.respond_to? :read
20
+ while buffer = io.read(4096) do
21
+ tempfile.write(buffer)
22
+ end
23
+ else
24
+ tempfile.write(io.to_s)
25
+ end
26
+ tempfile.flush
27
+ tempoutfile = Tempfile.new('madeline_output')
28
+ begin
29
+ log = `#{command} --outputprefix #{tempoutfile.path} --outputext .xml #{tempfile.path}`
30
+ unless (log.match(/Pedigree output file is/)) then
31
+ raise Error, "Madeline failed to run. Check Madeline path."
32
+ end
33
+ filename = "#{tempoutfile.path}.xml"
34
+ if (!File.exists?(filename)) then
35
+ raise Error, "Output File doesn't exist."
36
+ end
37
+ f = File.new(filename,"r")
38
+ return f.read
39
+ rescue Exception
40
+ raise Error, "Madeline failed to run. Tried #{@madeline}"
41
+ ensure
42
+ tempfile.close!
43
+ end
44
+ unless $?.exitstatus.zero?
45
+ raise Error, result
46
+ end
47
+
48
+ yield(StringIO.new(result)) if block_given?
49
+ result
50
+ end
51
+
52
+ private
53
+
54
+ def serialize_options(options)
55
+ options.map do |k, v|
56
+ next if k == 'outputext'
57
+ next if k == 'outputprefix'
58
+ if (v == true || v == "true")
59
+ ["--#{k}"]
60
+ elsif (v.is_a?(Array))
61
+ v.map {|v2| ["--#{k}", v2.to_s]}
62
+ else
63
+ ["--#{k}", v.to_s]
64
+ end
65
+ end.flatten
66
+ end
67
+
68
+ def command
69
+ [@madeline, @options].flatten.join(' ')
70
+ end
71
+
72
+ end
73
+
74
+ end
data/madeline.gemspec ADDED
@@ -0,0 +1,30 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = "madeline"
5
+ s.version = "0.1.1"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Denise Mauldin"]
9
+ s.date = "2011-09-06"
10
+ s.description = "Interface to Madeline2"
11
+ s.email = "denise.mauldin@gmail.com"
12
+ s.extra_rdoc_files = ["README.md", "ext/madeline2-linux-x86_64", "lib/madeline.rb", "lib/madeline/interface.rb"]
13
+ s.files = ["README.md", "Rakefile", "ext/madeline2-linux-x86_64", "lib/madeline.rb", "lib/madeline/interface.rb", "test/madeline_test.rb", "test/pedigree.txt", "Manifest", "madeline.gemspec"]
14
+ s.homepage = "http://github.com/dmauldin/madeline"
15
+ s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Madeline", "--main", "README.md"]
16
+ s.require_paths = ["lib", "ext"]
17
+ s.rubyforge_project = "madeline"
18
+ s.rubygems_version = "1.8.10"
19
+ s.summary = "Interface to Madeline2"
20
+ s.test_files = ["test/madeline_test.rb"]
21
+
22
+ if s.respond_to? :specification_version then
23
+ s.specification_version = 3
24
+
25
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
26
+ else
27
+ end
28
+ else
29
+ end
30
+ end
@@ -0,0 +1,56 @@
1
+ require 'test/unit'
2
+ require 'stringio'
3
+
4
+ class MadelineTest < Test::Unit::TestCase
5
+ require 'madeline'
6
+
7
+ def setup
8
+ @pedigree_out = "<?xml version=\"1.0\" standalone=\"no\"?>\n <svg version=\"1.1\" id=\"svgDC\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"370.44\" height=\"380.481\" onload=\"init()\" >\n <defs>\n <style type=\"text/css\"><![CDATA[\n\nline{\n\tstroke:#000;\n\tstroke-width:0.5mm;\n\tstroke-linejoin:miter;\n\tstroke-linecap:square;\n}\n\nrect{\n\tstroke:#000;\n\tstroke-width:0.5mm;\n\tstroke-linejoin:miter;\n\tstroke-linecap:square;\n}\n\nellipse{\n\tstroke: #000;\n fill: #fff;\n\tstroke-width:0.25mm;\n}\n\ntext{\n\tfont-family:\"DejaVu Sans\",sans-serif;\n\tfont-size:12px;\n}\n\n.smallText{\n\tfont-family:\"DejaVu Sans\",sans-serif;\n\tfont-size:9px;\n\tfill:#444;\n}\n\n.layer text{\n\tfill:#930;\n}\n\n.layer line{\n\tstroke:#000;\n}\n\n.birthOrder,.unknownTwins{\n\tfont-size: 8px;\n}\n\n.header{\n\tfont-size:18px;\n\tfont-weight:bold;\n}\n\n.keyBox{\n\tfill:#e5e5e5;\n\tstroke:#000;\n\tstroke-width:0.5mm;\n\tstroke-linejoin:miter;\n\tstroke-linecap:square;\n}\n\n.mating:hover{\n\tstroke-width:1mm;\n\tstroke:#d56300;\n}\n\n.selectedIndividual{\n\tstroke-width:1mm;\n\tstroke-linecap:square;\n\tstroke-linejoin:miter;\n\tstroke:#d00;\n fill:none;\n}\n\n.selectedIndividual:hover{\n\tstroke:#d00;\n\tfill:#ffbbbb;\n\tfill-opacity:0.70;\n}\n\n.solid{\n\tstroke-width:0.5mm;\n\tstroke-linecap:square;\n\tstroke-linejoin:miter;\n\tstroke:#000;\n\tfill:none;\n}\n\n.dashed{\n\tstroke-width:0.5mm;\n\tstroke-linecap:square;\n\tstroke-linejoin:miter;\n\tstroke:#98afc7;\n\tstroke-dasharray:2mm,1mm;\n\tstroke-dashoffset:1.0mm;\n\tfill:none;\n}\n\n.solid:hover{\n\tfill:#ffb787;\n\tfill-opacity:0.70;\n\tstroke:#d56300;\n\tstroke-width:1mm;\n}\n\n.dashed:hover{\n\tfill:#ffb787;\n\tfill-opacity:0.70;\n\tstroke:#d56300;\n\tstroke-width:1mm;\n}\n\n.filled{\n\tstroke-width:0.5mm;\n\tstroke-linecap:square;\n\tstroke-linejoin:miter;\n\tstroke:#000;\n\tfill:#000;\n}\n\n.specialIcons{\n\tstroke-width:0.25mm;\n\tstroke-linecap:round;\n\tstroke-linejoin:miter;\n\tstroke:#000;\n\tfill:#fff;\n}\n\n.specialLines{\n\tstroke-linecap:square;\n\tstroke-linejoin:miter;\n\tstroke:#000;\n\tstroke-width:0.5mm;\n\tfill:none;\n}\n\n.thinLine{\n\tfill:none;\n\tstroke: #000;\n\tstroke-width:0.25mm;\n}\n\n.curvedConnector{\n\tstroke-linecap:square;\n\tstroke-linejoin:miter;\n\tstroke:#98afc7;\n\tstroke-width:0.5mm;\n\tstroke-dasharray:2mm,1mm;\n\tstroke-dashoffset:1.0mm;\n\tfill:none;\n}\n\n.curvedConnector:hover{\n\tstroke:#d56300;\n}\n\n.whiteInkLetter_1{\n\tfont-size: 12px;\n\tfill: #fff;\n}\n\n.whiteInkLetter_2{\n\tfont-size: 10px;\n\tfill: #fff;\n}\n\n.whiteInkLetter_3{\n\tfont-size: 8px;\n\tfill: #fff;\n}\n\n.whiteInkLetter{\n\tfont-size: 8px;\n\tfill: #fff;\n}\n\n.blackInkLetter_1{\n\tfont-size: 12px;\n}\n\n.blackInkLetter_2{\n\tfont-size: 10px;\n}\n\n.blackInkLetter_3{\n\tfont-size: 8px;\n}\n\n.blackInkLetter{\n\tfont-size: 8px;\n\tfill: #000;\n}\n\n]]></style>\n <script type=\"text/javascript\" xlink:href=\"javascript/madeline.js\"></script>\n <marker id=\"endArrow\" viewBox=\"0 0 10 10\" refX=\"1\" refY=\"5\" markerUnits=\"strokeWidth\" orient=\"auto\" markerWidth=\"5\" markerHeight=\"4\"> <polyline points=\"0,0 10,5 0,10 1,5\" fill=\"#000\" /> </marker>\n </defs>\n <g class=\"pedigree\" transform=\"translate(-462.86)\">\n\n <g id=\"bottomLayer\" class=\"layer\" >\n\n </g>\n <g id=\"layer0\" class=\"layer\" >\n </g>\n\n <g class=\"drawing\">\n <text x=\"557.36\" y=\"30\" text-anchor=\"middle\" class=\"header\" >madTest</text>\n <rect x=\"500.66\" y=\"38.66\" width=\"22.68\" height=\"22.68\" id=\"g43\" class=\"solid\"/>\n <text x=\"512\" y=\"92.5845\" text-anchor=\"middle\" >g43</text>\n <line x1=\"523.34\" y1=\"50\" x2=\"591.38\" y2=\"50\" />\n<circle cx=\"602.72\" cy=\"50\" r=\"11.34\" id=\"g44\" class=\"solid\"/>\n <text x=\"602.72\" y=\"92.5845\" text-anchor=\"middle\" >g44</text>\n <line class=\"mating\" id=\"g44:g43\" x1=\"557.36\" y1=\"50\" x2=\"557.36\" y2=\"123.907\" />\n <line class=\"solid\" x1=\"512\" y1=\"123.907\" x2=\"512\" y2=\"152.257\" />\n<circle cx=\"512\" cy=\"163.597\" r=\"11.34\" id=\"g47\" class=\"solid\"/>\n <text x=\"512\" y=\"206.181\" text-anchor=\"middle\" >g47</text>\n <line class=\"solid\" x1=\"648.08\" y1=\"123.907\" x2=\"648.08\" y2=\"152.257\" />\n<circle cx=\"648.08\" cy=\"163.597\" r=\"11.34\" id=\"g49\" class=\"solid\"/>\n <text x=\"648.08\" y=\"206.181\" text-anchor=\"middle\" >g49</text>\n <line x1=\"659.42\" y1=\"163.597\" x2=\"727.46\" y2=\"163.597\" />\n <rect x=\"727.46\" y=\"152.257\" width=\"22.68\" height=\"22.68\" id=\"g48\" class=\"solid\"/>\n <text x=\"738.8\" y=\"206.181\" text-anchor=\"middle\" >g48</text>\n <line class=\"mating\" id=\"g49:g48\" x1=\"693.44\" y1=\"163.597\" x2=\"693.44\" y2=\"237.504\" />\n <line class=\"solid\" x1=\"602.72\" y1=\"237.504\" x2=\"602.72\" y2=\"265.854\" />\n<circle cx=\"602.72\" cy=\"277.194\" r=\"11.34\" id=\"g50\" class=\"solid\"/>\n <text x=\"602.72\" y=\"319.778\" text-anchor=\"middle\" >g50</text>\n <line class=\"solid\" x1=\"693.44\" y1=\"237.504\" x2=\"693.44\" y2=\"265.854\" />\n<circle cx=\"693.44\" cy=\"277.194\" r=\"11.34\" id=\"g51\" class=\"solid\"/>\n <text x=\"693.44\" y=\"319.778\" text-anchor=\"middle\" >g51</text>\n <line class=\"solid\" x1=\"784.16\" y1=\"237.504\" x2=\"784.16\" y2=\"265.854\" />\n <rect x=\"772.82\" y=\"265.854\" width=\"22.68\" height=\"22.68\" id=\"g52\" class=\"solid\"/>\n <text x=\"784.16\" y=\"319.778\" text-anchor=\"middle\" >g52</text>\n <line x1=\"602.72\" y1=\"237.504\" x2=\"784.16\" y2=\"237.504\" />\n <line x1=\"512\" y1=\"123.907\" x2=\"648.08\" y2=\"123.907\" />\n </g>\n\n </g>\n </svg>\n\n"
9
+ @arial_out = "<?xml version=\"1.0\" standalone=\"no\"?>\n <svg version=\"1.1\" id=\"svgDC\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"370.44\" height=\"380.481\" onload=\"init()\" >\n <defs>\n <style type=\"text/css\"><![CDATA[\n\nline{\n\tstroke:#000;\n\tstroke-width:0.5mm;\n\tstroke-linejoin:miter;\n\tstroke-linecap:square;\n}\n\nrect{\n\tstroke:#000;\n\tstroke-width:0.5mm;\n\tstroke-linejoin:miter;\n\tstroke-linecap:square;\n}\n\nellipse{\n\tstroke: #000;\n fill: #fff;\n\tstroke-width:0.25mm;\n}\n\ntext{\n\tfont-family:\"Arial\",sans-serif;\n\tfont-size:12px;\n}\n\n.smallText{\n\tfont-family:\"Arial\",sans-serif;\n\tfont-size:9px;\n\tfill:#444;\n}\n\n.layer text{\n\tfill:#930;\n}\n\n.layer line{\n\tstroke:#000;\n}\n\n.birthOrder,.unknownTwins{\n\tfont-size: 8px;\n}\n\n.header{\n\tfont-size:18px;\n\tfont-weight:bold;\n}\n\n.keyBox{\n\tfill:#e5e5e5;\n\tstroke:#000;\n\tstroke-width:0.5mm;\n\tstroke-linejoin:miter;\n\tstroke-linecap:square;\n}\n\n.mating:hover{\n\tstroke-width:1mm;\n\tstroke:#d56300;\n}\n\n.selectedIndividual{\n\tstroke-width:1mm;\n\tstroke-linecap:square;\n\tstroke-linejoin:miter;\n\tstroke:#d00;\n fill:none;\n}\n\n.selectedIndividual:hover{\n\tstroke:#d00;\n\tfill:#ffbbbb;\n\tfill-opacity:0.70;\n}\n\n.solid{\n\tstroke-width:0.5mm;\n\tstroke-linecap:square;\n\tstroke-linejoin:miter;\n\tstroke:#000;\n\tfill:none;\n}\n\n.dashed{\n\tstroke-width:0.5mm;\n\tstroke-linecap:square;\n\tstroke-linejoin:miter;\n\tstroke:#98afc7;\n\tstroke-dasharray:2mm,1mm;\n\tstroke-dashoffset:1.0mm;\n\tfill:none;\n}\n\n.solid:hover{\n\tfill:#ffb787;\n\tfill-opacity:0.70;\n\tstroke:#d56300;\n\tstroke-width:1mm;\n}\n\n.dashed:hover{\n\tfill:#ffb787;\n\tfill-opacity:0.70;\n\tstroke:#d56300;\n\tstroke-width:1mm;\n}\n\n.filled{\n\tstroke-width:0.5mm;\n\tstroke-linecap:square;\n\tstroke-linejoin:miter;\n\tstroke:#000;\n\tfill:#000;\n}\n\n.specialIcons{\n\tstroke-width:0.25mm;\n\tstroke-linecap:round;\n\tstroke-linejoin:miter;\n\tstroke:#000;\n\tfill:#fff;\n}\n\n.specialLines{\n\tstroke-linecap:square;\n\tstroke-linejoin:miter;\n\tstroke:#000;\n\tstroke-width:0.5mm;\n\tfill:none;\n}\n\n.thinLine{\n\tfill:none;\n\tstroke: #000;\n\tstroke-width:0.25mm;\n}\n\n.curvedConnector{\n\tstroke-linecap:square;\n\tstroke-linejoin:miter;\n\tstroke:#98afc7;\n\tstroke-width:0.5mm;\n\tstroke-dasharray:2mm,1mm;\n\tstroke-dashoffset:1.0mm;\n\tfill:none;\n}\n\n.curvedConnector:hover{\n\tstroke:#d56300;\n}\n\n.whiteInkLetter_1{\n\tfont-size: 12px;\n\tfill: #fff;\n}\n\n.whiteInkLetter_2{\n\tfont-size: 10px;\n\tfill: #fff;\n}\n\n.whiteInkLetter_3{\n\tfont-size: 8px;\n\tfill: #fff;\n}\n\n.whiteInkLetter{\n\tfont-size: 8px;\n\tfill: #fff;\n}\n\n.blackInkLetter_1{\n\tfont-size: 12px;\n}\n\n.blackInkLetter_2{\n\tfont-size: 10px;\n}\n\n.blackInkLetter_3{\n\tfont-size: 8px;\n}\n\n.blackInkLetter{\n\tfont-size: 8px;\n\tfill: #000;\n}\n\n]]></style>\n <script type=\"text/javascript\" xlink:href=\"javascript/madeline.js\"></script>\n <marker id=\"endArrow\" viewBox=\"0 0 10 10\" refX=\"1\" refY=\"5\" markerUnits=\"strokeWidth\" orient=\"auto\" markerWidth=\"5\" markerHeight=\"4\"> <polyline points=\"0,0 10,5 0,10 1,5\" fill=\"#000\" /> </marker>\n </defs>\n <g class=\"pedigree\" transform=\"translate(-462.86)\">\n\n <g id=\"bottomLayer\" class=\"layer\" >\n\n </g>\n <g id=\"layer0\" class=\"layer\" >\n </g>\n\n <g class=\"drawing\">\n <text x=\"557.36\" y=\"30\" text-anchor=\"middle\" class=\"header\" >madTest</text>\n <rect x=\"500.66\" y=\"38.66\" width=\"22.68\" height=\"22.68\" id=\"g43\" class=\"solid\"/>\n <text x=\"512\" y=\"92.5845\" text-anchor=\"middle\" >g43</text>\n <line x1=\"523.34\" y1=\"50\" x2=\"591.38\" y2=\"50\" />\n<circle cx=\"602.72\" cy=\"50\" r=\"11.34\" id=\"g44\" class=\"solid\"/>\n <text x=\"602.72\" y=\"92.5845\" text-anchor=\"middle\" >g44</text>\n <line class=\"mating\" id=\"g44:g43\" x1=\"557.36\" y1=\"50\" x2=\"557.36\" y2=\"123.907\" />\n <line class=\"solid\" x1=\"512\" y1=\"123.907\" x2=\"512\" y2=\"152.257\" />\n<circle cx=\"512\" cy=\"163.597\" r=\"11.34\" id=\"g47\" class=\"solid\"/>\n <text x=\"512\" y=\"206.181\" text-anchor=\"middle\" >g47</text>\n <line class=\"solid\" x1=\"648.08\" y1=\"123.907\" x2=\"648.08\" y2=\"152.257\" />\n<circle cx=\"648.08\" cy=\"163.597\" r=\"11.34\" id=\"g49\" class=\"solid\"/>\n <text x=\"648.08\" y=\"206.181\" text-anchor=\"middle\" >g49</text>\n <line x1=\"659.42\" y1=\"163.597\" x2=\"727.46\" y2=\"163.597\" />\n <rect x=\"727.46\" y=\"152.257\" width=\"22.68\" height=\"22.68\" id=\"g48\" class=\"solid\"/>\n <text x=\"738.8\" y=\"206.181\" text-anchor=\"middle\" >g48</text>\n <line class=\"mating\" id=\"g49:g48\" x1=\"693.44\" y1=\"163.597\" x2=\"693.44\" y2=\"237.504\" />\n <line class=\"solid\" x1=\"602.72\" y1=\"237.504\" x2=\"602.72\" y2=\"265.854\" />\n<circle cx=\"602.72\" cy=\"277.194\" r=\"11.34\" id=\"g50\" class=\"solid\"/>\n <text x=\"602.72\" y=\"319.778\" text-anchor=\"middle\" >g50</text>\n <line class=\"solid\" x1=\"693.44\" y1=\"237.504\" x2=\"693.44\" y2=\"265.854\" />\n<circle cx=\"693.44\" cy=\"277.194\" r=\"11.34\" id=\"g51\" class=\"solid\"/>\n <text x=\"693.44\" y=\"319.778\" text-anchor=\"middle\" >g51</text>\n <line class=\"solid\" x1=\"784.16\" y1=\"237.504\" x2=\"784.16\" y2=\"265.854\" />\n <rect x=\"772.82\" y=\"265.854\" width=\"22.68\" height=\"22.68\" id=\"g52\" class=\"solid\"/>\n <text x=\"784.16\" y=\"319.778\" text-anchor=\"middle\" >g52</text>\n <line x1=\"602.72\" y1=\"237.504\" x2=\"784.16\" y2=\"237.504\" />\n <line x1=\"512\" y1=\"123.907\" x2=\"648.08\" y2=\"123.907\" />\n </g>\n\n </g>\n </svg>\n\n"
10
+ @embedded_out = " <svg version=\"1.1\" id=\"svgDC\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"370.44\" height=\"380.481\" onload=\"init()\" >\n <defs>\n <style type=\"text/css\"><![CDATA[\n\nline{\n\tstroke:#000;\n\tstroke-width:0.5mm;\n\tstroke-linejoin:miter;\n\tstroke-linecap:square;\n}\n\nrect{\n\tstroke:#000;\n\tstroke-width:0.5mm;\n\tstroke-linejoin:miter;\n\tstroke-linecap:square;\n}\n\nellipse{\n\tstroke: #000;\n fill: #fff;\n\tstroke-width:0.25mm;\n}\n\ntext{\n\tfont-family:\"DejaVu Sans\",sans-serif;\n\tfont-size:12px;\n}\n\n.smallText{\n\tfont-family:\"DejaVu Sans\",sans-serif;\n\tfont-size:9px;\n\tfill:#444;\n}\n\n.layer text{\n\tfill:#930;\n}\n\n.layer line{\n\tstroke:#000;\n}\n\n.birthOrder,.unknownTwins{\n\tfont-size: 8px;\n}\n\n.header{\n\tfont-size:18px;\n\tfont-weight:bold;\n}\n\n.keyBox{\n\tfill:#e5e5e5;\n\tstroke:#000;\n\tstroke-width:0.5mm;\n\tstroke-linejoin:miter;\n\tstroke-linecap:square;\n}\n\n.mating:hover{\n\tstroke-width:1mm;\n\tstroke:#d56300;\n}\n\n.selectedIndividual{\n\tstroke-width:1mm;\n\tstroke-linecap:square;\n\tstroke-linejoin:miter;\n\tstroke:#d00;\n fill:none;\n}\n\n.selectedIndividual:hover{\n\tstroke:#d00;\n\tfill:#ffbbbb;\n\tfill-opacity:0.70;\n}\n\n.solid{\n\tstroke-width:0.5mm;\n\tstroke-linecap:square;\n\tstroke-linejoin:miter;\n\tstroke:#000;\n\tfill:none;\n}\n\n.dashed{\n\tstroke-width:0.5mm;\n\tstroke-linecap:square;\n\tstroke-linejoin:miter;\n\tstroke:#98afc7;\n\tstroke-dasharray:2mm,1mm;\n\tstroke-dashoffset:1.0mm;\n\tfill:none;\n}\n\n.solid:hover{\n\tfill:#ffb787;\n\tfill-opacity:0.70;\n\tstroke:#d56300;\n\tstroke-width:1mm;\n}\n\n.dashed:hover{\n\tfill:#ffb787;\n\tfill-opacity:0.70;\n\tstroke:#d56300;\n\tstroke-width:1mm;\n}\n\n.filled{\n\tstroke-width:0.5mm;\n\tstroke-linecap:square;\n\tstroke-linejoin:miter;\n\tstroke:#000;\n\tfill:#000;\n}\n\n.specialIcons{\n\tstroke-width:0.25mm;\n\tstroke-linecap:round;\n\tstroke-linejoin:miter;\n\tstroke:#000;\n\tfill:#fff;\n}\n\n.specialLines{\n\tstroke-linecap:square;\n\tstroke-linejoin:miter;\n\tstroke:#000;\n\tstroke-width:0.5mm;\n\tfill:none;\n}\n\n.thinLine{\n\tfill:none;\n\tstroke: #000;\n\tstroke-width:0.25mm;\n}\n\n.curvedConnector{\n\tstroke-linecap:square;\n\tstroke-linejoin:miter;\n\tstroke:#98afc7;\n\tstroke-width:0.5mm;\n\tstroke-dasharray:2mm,1mm;\n\tstroke-dashoffset:1.0mm;\n\tfill:none;\n}\n\n.curvedConnector:hover{\n\tstroke:#d56300;\n}\n\n.whiteInkLetter_1{\n\tfont-size: 12px;\n\tfill: #fff;\n}\n\n.whiteInkLetter_2{\n\tfont-size: 10px;\n\tfill: #fff;\n}\n\n.whiteInkLetter_3{\n\tfont-size: 8px;\n\tfill: #fff;\n}\n\n.whiteInkLetter{\n\tfont-size: 8px;\n\tfill: #fff;\n}\n\n.blackInkLetter_1{\n\tfont-size: 12px;\n}\n\n.blackInkLetter_2{\n\tfont-size: 10px;\n}\n\n.blackInkLetter_3{\n\tfont-size: 8px;\n}\n\n.blackInkLetter{\n\tfont-size: 8px;\n\tfill: #000;\n}\n\n]]></style>\n <script type=\"text/javascript\" xlink:href=\"javascript/madeline.js\"></script>\n <marker id=\"endArrow\" viewBox=\"0 0 10 10\" refX=\"1\" refY=\"5\" markerUnits=\"strokeWidth\" orient=\"auto\" markerWidth=\"5\" markerHeight=\"4\"> <polyline points=\"0,0 10,5 0,10 1,5\" fill=\"#000\" /> </marker>\n </defs>\n <g class=\"pedigree\" transform=\"translate(-462.86)\">\n\n <g id=\"bottomLayer\" class=\"layer\" >\n\n </g>\n <g id=\"layer0\" class=\"layer\" >\n </g>\n\n <g class=\"drawing\">\n <text x=\"557.36\" y=\"30\" text-anchor=\"middle\" class=\"header\" >madTest</text>\n <rect x=\"500.66\" y=\"38.66\" width=\"22.68\" height=\"22.68\" id=\"g43\" class=\"solid\"/>\n <text x=\"512\" y=\"92.5845\" text-anchor=\"middle\" >g43</text>\n <line x1=\"523.34\" y1=\"50\" x2=\"591.38\" y2=\"50\" />\n<circle cx=\"602.72\" cy=\"50\" r=\"11.34\" id=\"g44\" class=\"solid\"/>\n <text x=\"602.72\" y=\"92.5845\" text-anchor=\"middle\" >g44</text>\n <line class=\"mating\" id=\"g44:g43\" x1=\"557.36\" y1=\"50\" x2=\"557.36\" y2=\"123.907\" />\n <line class=\"solid\" x1=\"512\" y1=\"123.907\" x2=\"512\" y2=\"152.257\" />\n<circle cx=\"512\" cy=\"163.597\" r=\"11.34\" id=\"g47\" class=\"solid\"/>\n <text x=\"512\" y=\"206.181\" text-anchor=\"middle\" >g47</text>\n <line class=\"solid\" x1=\"648.08\" y1=\"123.907\" x2=\"648.08\" y2=\"152.257\" />\n<circle cx=\"648.08\" cy=\"163.597\" r=\"11.34\" id=\"g49\" class=\"solid\"/>\n <text x=\"648.08\" y=\"206.181\" text-anchor=\"middle\" >g49</text>\n <line x1=\"659.42\" y1=\"163.597\" x2=\"727.46\" y2=\"163.597\" />\n <rect x=\"727.46\" y=\"152.257\" width=\"22.68\" height=\"22.68\" id=\"g48\" class=\"solid\"/>\n <text x=\"738.8\" y=\"206.181\" text-anchor=\"middle\" >g48</text>\n <line class=\"mating\" id=\"g49:g48\" x1=\"693.44\" y1=\"163.597\" x2=\"693.44\" y2=\"237.504\" />\n <line class=\"solid\" x1=\"602.72\" y1=\"237.504\" x2=\"602.72\" y2=\"265.854\" />\n<circle cx=\"602.72\" cy=\"277.194\" r=\"11.34\" id=\"g50\" class=\"solid\"/>\n <text x=\"602.72\" y=\"319.778\" text-anchor=\"middle\" >g50</text>\n <line class=\"solid\" x1=\"693.44\" y1=\"237.504\" x2=\"693.44\" y2=\"265.854\" />\n<circle cx=\"693.44\" cy=\"277.194\" r=\"11.34\" id=\"g51\" class=\"solid\"/>\n <text x=\"693.44\" y=\"319.778\" text-anchor=\"middle\" >g51</text>\n <line class=\"solid\" x1=\"784.16\" y1=\"237.504\" x2=\"784.16\" y2=\"265.854\" />\n <rect x=\"772.82\" y=\"265.854\" width=\"22.68\" height=\"22.68\" id=\"g52\" class=\"solid\"/>\n <text x=\"784.16\" y=\"319.778\" text-anchor=\"middle\" >g52</text>\n <line x1=\"602.72\" y1=\"237.504\" x2=\"784.16\" y2=\"237.504\" />\n <line x1=\"512\" y1=\"123.907\" x2=\"648.08\" y2=\"123.907\" />\n </g>\n\n </g>\n </svg>\n\n"
11
+ end
12
+
13
+ def test_init
14
+ assert_nothing_raised do
15
+ madeline = Madeline::Interface.new()
16
+ end
17
+ end
18
+
19
+ def test_construction
20
+ artist = Madeline::Interface.new()
21
+ pedigree = artist.draw(File.open('test/pedigree.txt','r'))
22
+ assert_equal(@pedigree_out, pedigree)
23
+ end
24
+
25
+ def test_madeline_location
26
+ artist = Madeline::Interface.new(:madeline => '/u5/tools/bin/madeline2')
27
+ pedigree = artist.draw(File.open('test/pedigree.txt','r'))
28
+ assert_equal(@pedigree_out, pedigree)
29
+ end
30
+
31
+ def test_bad_madeline_location
32
+ artist = Madeline::Interface.new(:madeline => 'jkfldsjkklfa')
33
+ assert_raises Madeline::Error do
34
+ artist.draw(File.open('test/pedigree.txt','r'))
35
+ end
36
+ end
37
+
38
+ def test_arial
39
+ artist = Madeline::Interface.new(:font => "Arial")
40
+ pedigree = artist.draw(File.open('test/pedigree.txt','r'))
41
+ assert_equal(@arial_out, pedigree)
42
+ end
43
+
44
+ def test_embedded
45
+ artist = Madeline::Interface.new(:embedded => true)
46
+ pedigree = artist.draw(File.open('test/pedigree.txt','r'))
47
+ assert_equal(@embedded_out, pedigree)
48
+ end
49
+
50
+ def test_bad_file_location
51
+ artist = Madeline::Interface.new()
52
+ assert_raises(Errno::ENOENT,"No such file or directory") do
53
+ pedigree = artist.draw(File.open('test/blah.txt','r'))
54
+ end
55
+ end
56
+ end
data/test/pedigree.txt ADDED
@@ -0,0 +1,9 @@
1
+ FamilyID IndividualID Gender Father Mother C1 C2 C3 1739
2
+ madTest g44 F . . Y . . non
3
+ madTest g43 M . . . . . .
4
+ madTest g50 F g48 g49 . . . .
5
+ madTest g47 F g43 g44 Y . . non
6
+ madTest g51 F g48 g49 Y . . non
7
+ madTest g48 M . . . . . .
8
+ madTest g52 M g48 g49 Y Y Y non
9
+ madTest g49 F g43 g44 Y . . non
metadata ADDED
@@ -0,0 +1,71 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: madeline
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.1.1
6
+ platform: ruby
7
+ authors:
8
+ - Denise Mauldin
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-09-06 00:00:00 Z
14
+ dependencies: []
15
+
16
+ description: Interface to Madeline2
17
+ email: denise.mauldin@gmail.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files:
23
+ - README.md
24
+ - ext/madeline2-linux-x86_64
25
+ - lib/madeline.rb
26
+ - lib/madeline/interface.rb
27
+ files:
28
+ - README.md
29
+ - Rakefile
30
+ - ext/madeline2-linux-x86_64
31
+ - lib/madeline.rb
32
+ - lib/madeline/interface.rb
33
+ - test/madeline_test.rb
34
+ - test/pedigree.txt
35
+ - Manifest
36
+ - madeline.gemspec
37
+ homepage: http://github.com/dmauldin/madeline
38
+ licenses: []
39
+
40
+ post_install_message:
41
+ rdoc_options:
42
+ - --line-numbers
43
+ - --inline-source
44
+ - --title
45
+ - Madeline
46
+ - --main
47
+ - README.md
48
+ require_paths:
49
+ - lib
50
+ - ext
51
+ required_ruby_version: !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: "0"
57
+ required_rubygems_version: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: "1.2"
63
+ requirements: []
64
+
65
+ rubyforge_project: madeline
66
+ rubygems_version: 1.8.10
67
+ signing_key:
68
+ specification_version: 3
69
+ summary: Interface to Madeline2
70
+ test_files:
71
+ - test/madeline_test.rb