gfa 0.2.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +22 -18
- data/bin/gfa-add-gaf +70 -0
- data/bin/gfa-subgraph +41 -0
- data/lib/gfa/common.rb +33 -8
- data/lib/gfa/field/char.rb +2 -1
- data/lib/gfa/field/float.rb +18 -1
- data/lib/gfa/field/hex.rb +18 -1
- data/lib/gfa/field/json.rb +10 -1
- data/lib/gfa/field/numarray.rb +29 -4
- data/lib/gfa/field/sigint.rb +14 -1
- data/lib/gfa/field/string.rb +10 -1
- data/lib/gfa/field.rb +82 -10
- data/lib/gfa/generator.rb +3 -3
- data/lib/gfa/graph.rb +139 -4
- data/lib/gfa/parser.rb +78 -22
- data/lib/gfa/record/comment.rb +7 -2
- data/lib/gfa/record/containment.rb +12 -7
- data/lib/gfa/record/has_from_to.rb +47 -0
- data/lib/gfa/record/header.rb +2 -0
- data/lib/gfa/record/jump.rb +11 -30
- data/lib/gfa/record/link.rb +11 -29
- data/lib/gfa/record/path.rb +32 -6
- data/lib/gfa/record/segment.rb +8 -4
- data/lib/gfa/record/walk.rb +6 -6
- data/lib/gfa/record.rb +34 -14
- data/lib/gfa/record_set/comment_set.rb +3 -0
- data/lib/gfa/record_set/containment_set.rb +4 -0
- data/lib/gfa/record_set/header_set.rb +3 -0
- data/lib/gfa/record_set/jump_set.rb +3 -0
- data/lib/gfa/record_set/link_set.rb +3 -0
- data/lib/gfa/record_set/path_set.rb +4 -0
- data/lib/gfa/record_set/segment_set.rb +4 -0
- data/lib/gfa/record_set/walk_set.rb +3 -0
- data/lib/gfa/record_set.rb +121 -0
- data/lib/gfa/version.rb +1 -1
- data/test/common_test.rb +5 -5
- data/test/field_test.rb +52 -26
- data/test/parser_test.rb +52 -13
- data/test/record_test.rb +7 -0
- data/test/test_helper.rb +5 -0
- metadata +18 -6
data/lib/gfa/record.rb
CHANGED
@@ -15,7 +15,7 @@ class GFA::Record
|
|
15
15
|
TYPES = CODES.values
|
16
16
|
TYPES.each { |t| require "gfa/record/#{t.downcase}" }
|
17
17
|
|
18
|
-
[
|
18
|
+
%i[CODES REQ_FIELDS OPT_FIELDS TYPES].each do |x|
|
19
19
|
define_singleton_method(x) { const_get(x) }
|
20
20
|
end
|
21
21
|
|
@@ -29,18 +29,34 @@ class GFA::Record
|
|
29
29
|
const_get(name)
|
30
30
|
end
|
31
31
|
|
32
|
+
def self.[](string)
|
33
|
+
return nil if string.nil? || string =~ /^\s*$/
|
34
|
+
|
35
|
+
split = string[0] == '#' ? ['', 2] : ["\t", 0]
|
36
|
+
code, *values = string.chomp.split(*split)
|
37
|
+
code_class(code).new(*values)
|
38
|
+
end
|
39
|
+
|
32
40
|
# Instance-level
|
33
41
|
|
34
42
|
attr :fields
|
35
43
|
|
36
|
-
def [](k)
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
def
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
+
def [](k)
|
45
|
+
fields[k]
|
46
|
+
end
|
47
|
+
|
48
|
+
def type
|
49
|
+
CODES[code]
|
50
|
+
end
|
51
|
+
|
52
|
+
def code
|
53
|
+
self.class.const_get(:CODE)
|
54
|
+
end
|
55
|
+
|
56
|
+
def empty?
|
57
|
+
fields.empty?
|
58
|
+
end
|
59
|
+
|
44
60
|
def to_s
|
45
61
|
o = [code.to_s]
|
46
62
|
self.class.REQ_FIELDS.each_index do |i|
|
@@ -52,7 +68,11 @@ class GFA::Record
|
|
52
68
|
end
|
53
69
|
o.join("\t")
|
54
70
|
end
|
55
|
-
|
71
|
+
|
72
|
+
def dup
|
73
|
+
self.class[to_s]
|
74
|
+
end
|
75
|
+
|
56
76
|
def hash
|
57
77
|
{ code => fields }.hash
|
58
78
|
end
|
@@ -64,19 +84,19 @@ class GFA::Record
|
|
64
84
|
alias == eql?
|
65
85
|
|
66
86
|
private
|
67
|
-
|
87
|
+
|
68
88
|
def add_field(f_tag, f_type, f_value, format = nil)
|
69
89
|
unless format.nil?
|
70
90
|
msg = (f_tag.is_a?(Integer) ? "column #{f_tag}" : "#{f_tag} field")
|
71
91
|
GFA.assert_format(f_value, format, "Bad #{type} #{msg}")
|
72
92
|
end
|
73
93
|
|
74
|
-
@fields[
|
94
|
+
@fields[f_tag] = GFA::Field.code_class(f_type).new(f_value)
|
75
95
|
end
|
76
|
-
|
96
|
+
|
77
97
|
def add_opt_field(f, known)
|
78
98
|
m = /^([A-Za-z]+):([A-Za-z]+):(.*)$/.match(f)
|
79
|
-
raise "Cannot parse field: '#{f}'
|
99
|
+
raise "Cannot parse field: '#{f}'" unless m
|
80
100
|
|
81
101
|
f_tag = m[1].to_sym
|
82
102
|
f_type = m[2].to_sym
|
@@ -0,0 +1,121 @@
|
|
1
|
+
|
2
|
+
require 'gfa/record'
|
3
|
+
|
4
|
+
class GFA::RecordSet
|
5
|
+
INDEX_FIELD = nil
|
6
|
+
TYPES = GFA::Record.TYPES.map { |i| :"#{i}Set" }
|
7
|
+
GFA::Record.TYPES.each { |t| require "gfa/record_set/#{t.downcase}_set" }
|
8
|
+
|
9
|
+
%i[TYPES].each do |x|
|
10
|
+
define_singleton_method(x) { const_get(x) }
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.code_class(code)
|
14
|
+
name = GFA::Record.CODES[code.to_sym]
|
15
|
+
raise "Unknown record type: #{code}." if name.nil?
|
16
|
+
name_class(name)
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.name_class(name)
|
20
|
+
name = "#{name}Set" unless name =~ /Set$/
|
21
|
+
const_get(name)
|
22
|
+
end
|
23
|
+
|
24
|
+
# Instance-level
|
25
|
+
|
26
|
+
attr_reader :set, :index, :gfa
|
27
|
+
|
28
|
+
def initialize(gfa = nil)
|
29
|
+
@set = []
|
30
|
+
@index = {}
|
31
|
+
@gfa = gfa || GFA.new
|
32
|
+
end
|
33
|
+
|
34
|
+
def [](k)
|
35
|
+
return set[k] if k.is_a?(Integer)
|
36
|
+
find_index(k)
|
37
|
+
end
|
38
|
+
|
39
|
+
def type
|
40
|
+
GFA::Record.CODES[code]
|
41
|
+
end
|
42
|
+
|
43
|
+
def code
|
44
|
+
self.class.const_get(:CODE)
|
45
|
+
end
|
46
|
+
|
47
|
+
def index_field
|
48
|
+
self.class.const_get(:INDEX_FIELD)
|
49
|
+
end
|
50
|
+
|
51
|
+
%i[empty? hash size count length first last].each do |i|
|
52
|
+
define_method(i) { set.send(i) }
|
53
|
+
end
|
54
|
+
|
55
|
+
def to_s
|
56
|
+
set.map(&:to_s).join("\n")
|
57
|
+
end
|
58
|
+
|
59
|
+
def eql?(rec)
|
60
|
+
hash == rec.hash
|
61
|
+
end
|
62
|
+
|
63
|
+
alias == eql?
|
64
|
+
|
65
|
+
def <<(v)
|
66
|
+
v = v.split("\t") if v.is_a? String
|
67
|
+
v = GFA::Record.code_class(code).new(*v) if v.is_a? Array
|
68
|
+
raise "Not a GFA Record: #{v}" unless v.is_a? GFA::Record
|
69
|
+
raise "Wrong type of record: #{v.type}" if v.type != type
|
70
|
+
|
71
|
+
@set << v
|
72
|
+
index!(v)
|
73
|
+
end
|
74
|
+
|
75
|
+
def indexed?
|
76
|
+
(empty? || !index_field) ? gfa.opts[:index] : !index.empty?
|
77
|
+
end
|
78
|
+
|
79
|
+
def rebuild_index!
|
80
|
+
@index = {}
|
81
|
+
set.each { |v| index!(v) }
|
82
|
+
end
|
83
|
+
|
84
|
+
def index_id(v)
|
85
|
+
v[index_field]&.value
|
86
|
+
end
|
87
|
+
|
88
|
+
def index!(v)
|
89
|
+
save_index(index_id(v), v) if index_field
|
90
|
+
|
91
|
+
# Whenever present, index also by ID
|
92
|
+
if gfa.opts[:index_id] && v[:ID] && v[:ID].value =~ index_id(v)
|
93
|
+
save_index(v[:ID].value, v)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def save_index(k, v)
|
98
|
+
return unless gfa.opts[:index] && k
|
99
|
+
|
100
|
+
if @index[k]
|
101
|
+
f = index_field.is_a?(Integer) ? '' : "#{index_field}: "
|
102
|
+
raise "#{type} already registered: #{f}#{k}"
|
103
|
+
end
|
104
|
+
@index[k] = v
|
105
|
+
end
|
106
|
+
|
107
|
+
def find_index(k)
|
108
|
+
k = k.value if k.is_a? GFA::Field
|
109
|
+
@index[k]
|
110
|
+
end
|
111
|
+
|
112
|
+
def merge!(record_set)
|
113
|
+
raise "Not a record set" unless record_set.is_a?(GFA::RecordSet)
|
114
|
+
if record_set.type != type
|
115
|
+
raise "Wrong type of record set: #{record_set.type}"
|
116
|
+
end
|
117
|
+
|
118
|
+
record_set.set.each { |i| @set << i }
|
119
|
+
record_set.index.each { |k, v| save_index(k, v) }
|
120
|
+
end
|
121
|
+
end
|
data/lib/gfa/version.rb
CHANGED
data/test/common_test.rb
CHANGED
@@ -4,10 +4,10 @@ class CommonTest < Test::Unit::TestCase
|
|
4
4
|
|
5
5
|
def test_assert_format
|
6
6
|
assert_raise do
|
7
|
-
GFA.assert_format(
|
7
|
+
GFA.assert_format('tsooq', /^.$/, 'Not a char')
|
8
8
|
end
|
9
9
|
assert_nothing_raised do
|
10
|
-
GFA.assert_format(
|
10
|
+
GFA.assert_format('z', /^.$/, 'Not a char')
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
@@ -20,15 +20,15 @@ class CommonTest < Test::Unit::TestCase
|
|
20
20
|
def test_record_getters
|
21
21
|
gfa = GFA.new
|
22
22
|
assert_respond_to(gfa, :headers)
|
23
|
-
assert_equal([], gfa.links)
|
23
|
+
assert_equal([], gfa.links.set)
|
24
24
|
assert_nil( gfa.segment(0) )
|
25
25
|
end
|
26
26
|
|
27
27
|
def test_record_setters
|
28
28
|
gfa = GFA.new
|
29
29
|
assert_respond_to(gfa, :add_path)
|
30
|
-
gfa.add_containment("zooq")
|
31
|
-
assert_equal(
|
30
|
+
gfa.add_containment("zooq\t+\ttsuk\t-\t1\t*")
|
31
|
+
assert_equal('zooq', gfa.records[:Containment].first.from.value)
|
32
32
|
end
|
33
33
|
|
34
34
|
end
|
data/test/field_test.rb
CHANGED
@@ -3,48 +3,74 @@ require "test_helper"
|
|
3
3
|
class FieldTest < Test::Unit::TestCase
|
4
4
|
|
5
5
|
def test_char
|
6
|
-
f = GFA::Field::Char.new(
|
7
|
-
assert_equal(
|
8
|
-
assert_raise
|
9
|
-
|
10
|
-
|
11
|
-
assert_raise do
|
12
|
-
GFA::Field::Char.new("")
|
13
|
-
end
|
14
|
-
assert_raise do
|
15
|
-
GFA::Field::Char.new("^.^")
|
16
|
-
end
|
6
|
+
f = GFA::Field::Char.new('%')
|
7
|
+
assert_equal('%', f.value)
|
8
|
+
assert_raise { GFA::Field::Char.new(' ') }
|
9
|
+
assert_raise { GFA::Field::Char.new('') }
|
10
|
+
assert_raise { GFA::Field::Char.new('^.^') }
|
17
11
|
end
|
18
12
|
|
19
13
|
def test_sigint
|
20
14
|
end
|
21
15
|
|
22
16
|
def test_float
|
23
|
-
f = GFA::Field::Float.new(
|
17
|
+
f = GFA::Field::Float.new('1.3e-5')
|
24
18
|
assert_equal(1.3e-5, f.value)
|
25
|
-
assert_raise
|
26
|
-
GFA::Field::Float.new("e-5")
|
27
|
-
end
|
19
|
+
assert_raise { GFA::Field::Float.new('e-5') }
|
28
20
|
end
|
29
21
|
|
30
22
|
def test_string
|
31
23
|
end
|
32
24
|
|
33
25
|
def test_hex
|
34
|
-
f = GFA::Field::Hex.new(
|
35
|
-
assert_equal(
|
36
|
-
assert_raise
|
37
|
-
GFA::Field::Hex.new("C3PO")
|
38
|
-
end
|
26
|
+
f = GFA::Field::Hex.new('C3F0')
|
27
|
+
assert_equal('C3F0', f.value)
|
28
|
+
assert_raise { GFA::Field::Hex.new('C3PO') }
|
39
29
|
end
|
40
30
|
|
41
31
|
def test_numarray
|
42
|
-
f = GFA::Field::NumArray.new(
|
43
|
-
assert_equal(
|
44
|
-
assert_equal(
|
45
|
-
assert_raise
|
46
|
-
GFA::Field::NumArray.new("c,1,e,3")
|
47
|
-
end
|
32
|
+
f = GFA::Field::NumArray.new('i,1,2,3')
|
33
|
+
assert_equal([1, 2, 3], f.array)
|
34
|
+
assert_equal('i', f.modifier)
|
35
|
+
assert_raise { GFA::Field::NumArray.new('c,1,e,3') }
|
48
36
|
end
|
49
37
|
|
38
|
+
def test_equal
|
39
|
+
f = GFA::Field::SigInt.new('123')
|
40
|
+
j = GFA::Field::String.new('123')
|
41
|
+
k = GFA::Field::Float.new('123')
|
42
|
+
assert(f == 123)
|
43
|
+
assert(123 == f)
|
44
|
+
assert(f != 123.0)
|
45
|
+
assert(f != '123')
|
46
|
+
assert(f.eql?(123))
|
47
|
+
assert(f != j)
|
48
|
+
assert(f != k)
|
49
|
+
assert(f != k.value)
|
50
|
+
assert(f.value == k.value)
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_equivalent
|
54
|
+
# String comparisons
|
55
|
+
assert(GFA::Field['Z:a'].~ GFA::Field['A:a'])
|
56
|
+
assert(GFA::Field['Z:ab'] !~ GFA::Field['A:a'])
|
57
|
+
assert(GFA::Field['Z:{"a":1}'].~ GFA::Field['J:{"a":1}'])
|
58
|
+
assert(GFA::Field['J:{"a":1}'].~ GFA::Field['Z:{"a":1}'])
|
59
|
+
|
60
|
+
# Numeric comparisons
|
61
|
+
assert(GFA::Field['Z:123'].~ GFA::Field['i:123'])
|
62
|
+
assert(GFA::Field['Z:123'].~ GFA::Field['i:123'])
|
63
|
+
assert(GFA::Field['i:123'].~ GFA::Field['f:123'])
|
64
|
+
assert(GFA::Field['f:123'].~ GFA::Field['B:i,123'])
|
65
|
+
assert(GFA::Field['B:i,123'].~ GFA::Field['H:7B'])
|
66
|
+
assert(GFA::Field['H:7B'].~ GFA::Field['f:123.0'])
|
67
|
+
assert(GFA::Field['Z:123'] !~ GFA::Field['H:7B']) # In hex-space!
|
68
|
+
assert(GFA::Field['f:1e3'].~ GFA::Field['f:1000'])
|
69
|
+
assert(GFA::Field['f:1e3'].~ 1e3)
|
70
|
+
assert(GFA::Field['B:i,123,456'].~ [123, 456.0])
|
71
|
+
|
72
|
+
# Non-commutative
|
73
|
+
assert(GFA::Field['i:123'].~ GFA::Field['f:123.4'])
|
74
|
+
assert(GFA::Field['f:123.4'] !~ GFA::Field['i:123'])
|
75
|
+
end
|
50
76
|
end
|
data/test/parser_test.rb
CHANGED
@@ -2,20 +2,57 @@ require "test_helper"
|
|
2
2
|
require "gfa/parser"
|
3
3
|
|
4
4
|
class ParserTest < Test::Unit::TestCase
|
5
|
-
|
5
|
+
|
6
6
|
def test_load
|
7
|
-
sample_f = File.expand_path('../fixtures/sample.gfa', __FILE__)
|
8
7
|
assert_respond_to(GFA, :load)
|
9
|
-
|
10
|
-
|
11
|
-
|
8
|
+
|
9
|
+
# Can load files and close pointers properly
|
10
|
+
pre_fhs = ObjectSpace.each_object(IO).count { |i| not i.closed? }
|
11
|
+
assert_nothing_raised do
|
12
|
+
GFA.load(fixture_path('sample1.gfa'))
|
13
|
+
end
|
14
|
+
assert_nothing_raised do
|
15
|
+
GFA.load(fixture_path('sample2.gfa'))
|
16
|
+
end
|
17
|
+
assert_nothing_raised do
|
18
|
+
GFA.load(fixture_path('sample3.gfa'))
|
19
|
+
end
|
20
|
+
assert_raise do
|
21
|
+
GFA.load(fixture_path('sample4.gfa'))
|
22
|
+
end
|
23
|
+
post_fhs = ObjectSpace.each_object(IO).count { |i| not i.closed? }
|
12
24
|
assert_equal(pre_fhs, post_fhs)
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_records
|
28
|
+
# Samples are properly parsed
|
29
|
+
sample1 = GFA.load(fixture_path('sample1.gfa'))
|
30
|
+
assert_equal(1, sample1.headers.size)
|
31
|
+
assert_equal(6, sample1.segments.size)
|
32
|
+
assert_equal(4, sample1.links.size)
|
33
|
+
assert(sample1.containments.empty?)
|
34
|
+
assert(sample1.paths.empty?)
|
35
|
+
assert_respond_to(sample1, :records)
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_comments
|
39
|
+
path = fixture_path('sample2.gfa')
|
40
|
+
sample = GFA.load(path)
|
41
|
+
assert(sample.comments.empty?)
|
42
|
+
sample = GFA.load(path, comments: true)
|
43
|
+
assert(!sample.comments.empty?)
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_index
|
47
|
+
path = fixture_path('sample3.gfa')
|
48
|
+
sample = GFA.load(path)
|
49
|
+
assert(sample.path('first').is_a?(GFA::Record))
|
50
|
+
assert(sample.paths['first'].is_a?(GFA::Record))
|
51
|
+
assert_equal('first', sample.path('first')[2]&.value)
|
52
|
+
assert(sample.indexed?)
|
53
|
+
sample = GFA.load(path, index: false)
|
54
|
+
assert_nil(sample.path('first'))
|
55
|
+
assert(!sample.indexed?)
|
19
56
|
end
|
20
57
|
|
21
58
|
def test_version_suppport
|
@@ -28,20 +65,22 @@ class ParserTest < Test::Unit::TestCase
|
|
28
65
|
def test_line_by_line
|
29
66
|
gfa = GFA.new
|
30
67
|
assert_respond_to(gfa, :<<)
|
68
|
+
|
31
69
|
# Empty
|
32
70
|
gfa << ' '
|
33
71
|
assert(gfa.empty?)
|
34
72
|
gfa << 'H'
|
35
73
|
assert(gfa.empty?)
|
74
|
+
|
36
75
|
# Segment
|
37
76
|
assert_equal(0, gfa.segments.size)
|
38
|
-
gfa << "S\t1\tACTG"
|
77
|
+
gfa << "S\t1\tACTG\n"
|
39
78
|
assert(!gfa.empty?)
|
40
79
|
assert_equal(1, gfa.segments.size)
|
80
|
+
|
41
81
|
# Version
|
42
82
|
assert_nil(gfa.gfa_version)
|
43
83
|
gfa << GFA::Record::Header.new('VN:Z:1.0')
|
44
84
|
assert_equal('1.0', gfa.gfa_version)
|
45
85
|
end
|
46
|
-
|
47
86
|
end
|
data/test/record_test.rb
CHANGED
@@ -17,6 +17,13 @@ class RecordTest < Test::Unit::TestCase
|
|
17
17
|
assert_equal("P\ta\tb\t*", $rec_p.to_s)
|
18
18
|
end
|
19
19
|
|
20
|
+
def test_init_by_string
|
21
|
+
p = GFA::Record["P\ta\tb\t*"]
|
22
|
+
assert_equal('a', p.path_name&.value)
|
23
|
+
c = GFA::Record["# doink!\n"]
|
24
|
+
assert_equal(' doink!', c.comment&.value)
|
25
|
+
end
|
26
|
+
|
20
27
|
def test_hash
|
21
28
|
other_h = GFA::Record::Header.new("VN:Z:1.0")
|
22
29
|
assert_equal($rec_h.hash, other_h.hash)
|
data/test/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gfa
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Luis M. Rodriguez-R
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-03-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rgl
|
@@ -63,6 +63,8 @@ files:
|
|
63
63
|
- LICENSE
|
64
64
|
- README.md
|
65
65
|
- Rakefile
|
66
|
+
- bin/gfa-add-gaf
|
67
|
+
- bin/gfa-subgraph
|
66
68
|
- lib/gfa.rb
|
67
69
|
- lib/gfa/common.rb
|
68
70
|
- lib/gfa/field.rb
|
@@ -79,12 +81,22 @@ files:
|
|
79
81
|
- lib/gfa/record.rb
|
80
82
|
- lib/gfa/record/comment.rb
|
81
83
|
- lib/gfa/record/containment.rb
|
84
|
+
- lib/gfa/record/has_from_to.rb
|
82
85
|
- lib/gfa/record/header.rb
|
83
86
|
- lib/gfa/record/jump.rb
|
84
87
|
- lib/gfa/record/link.rb
|
85
88
|
- lib/gfa/record/path.rb
|
86
89
|
- lib/gfa/record/segment.rb
|
87
90
|
- lib/gfa/record/walk.rb
|
91
|
+
- lib/gfa/record_set.rb
|
92
|
+
- lib/gfa/record_set/comment_set.rb
|
93
|
+
- lib/gfa/record_set/containment_set.rb
|
94
|
+
- lib/gfa/record_set/header_set.rb
|
95
|
+
- lib/gfa/record_set/jump_set.rb
|
96
|
+
- lib/gfa/record_set/link_set.rb
|
97
|
+
- lib/gfa/record_set/path_set.rb
|
98
|
+
- lib/gfa/record_set/segment_set.rb
|
99
|
+
- lib/gfa/record_set/walk_set.rb
|
88
100
|
- lib/gfa/version.rb
|
89
101
|
- test/common_test.rb
|
90
102
|
- test/field_test.rb
|
@@ -94,7 +106,7 @@ files:
|
|
94
106
|
homepage: https://github.com/lmrodriguezr/gfa
|
95
107
|
licenses: []
|
96
108
|
metadata: {}
|
97
|
-
post_install_message:
|
109
|
+
post_install_message:
|
98
110
|
rdoc_options:
|
99
111
|
- lib
|
100
112
|
- README.md
|
@@ -115,8 +127,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
115
127
|
- !ruby/object:Gem::Version
|
116
128
|
version: '0'
|
117
129
|
requirements: []
|
118
|
-
rubygems_version: 3.
|
119
|
-
signing_key:
|
130
|
+
rubygems_version: 3.1.6
|
131
|
+
signing_key:
|
120
132
|
specification_version: 4
|
121
133
|
summary: Graphical Fragment Assembly (GFA) for Ruby
|
122
134
|
test_files: []
|