gfa 0.1.2 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,3 @@
1
+ class GFA::RecordSet::WalkSet < GFA::RecordSet
2
+ CODE = :W
3
+ end
@@ -0,0 +1,99 @@
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, :gfa
27
+
28
+ def initialize(gfa)
29
+ @set = []
30
+ @index = {}
31
+ @gfa = gfa
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 index_id(v)
76
+ v[index_field]&.value
77
+ end
78
+
79
+ def index(v)
80
+ save_index(index_id(v), v) if index_field
81
+
82
+ # Whenever present, index also by ID
83
+ save_index(v[:ID].value, v) if v[:ID] && v[:ID].value =~ index_id(v)
84
+ end
85
+
86
+ def save_index(k, v)
87
+ return unless gfa.opts[:index] && k
88
+
89
+ if @index[k]
90
+ warn "#{type} already registered with field #{index_field}: #{k}"
91
+ end
92
+ @index[k] = v
93
+ end
94
+
95
+ def find_index(k)
96
+ k = k.value if k.is_a? GFA::Field
97
+ @index[k]
98
+ end
99
+ end
data/lib/gfa/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  class GFA
2
- VERSION = "0.1.2"
2
+ VERSION = '0.3.1'
3
3
  VERSION_ARRAY = VERSION.split(/\./).map { |x| x.to_i } # :nodoc:
4
4
  VERSION_MAJOR = VERSION_ARRAY[0] # :nodoc:
5
5
  VERSION_MINOR = VERSION_ARRAY[1] # :nodoc:
data/lib/gfa.rb CHANGED
@@ -1,4 +1,4 @@
1
- require "gfa/common"
2
- require "gfa/parser"
3
- require "gfa/generator"
4
- require "gfa/graph"
1
+ require 'gfa/common'
2
+ require 'gfa/parser'
3
+ require 'gfa/generator'
4
+ require 'gfa/graph'
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("tsooq", /^.$/, "Not a char")
7
+ GFA.assert_format('tsooq', /^.$/, 'Not a char')
8
8
  end
9
9
  assert_nothing_raised do
10
- GFA.assert_format("z", /^.$/, "Not a char")
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("zooq", gfa.records[:Containment].first)
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("%", f.value)
8
- assert_raise do
9
- GFA::Field::Char.new(" ")
10
- end
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("1.3e-5")
17
+ f = GFA::Field::Float.new('1.3e-5')
24
18
  assert_equal(1.3e-5, f.value)
25
- assert_raise do
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("C3F0")
35
- assert_equal("C3F0", f.value)
36
- assert_raise do
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("i,1,2,3")
43
- assert_equal(%w[1 2 3], f.array)
44
- assert_equal("i", f.modifier)
45
- assert_raise do
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,46 +2,83 @@ 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
- pre_fhs = ObjectSpace.each_object(IO).count{ |i| not i.closed? }
10
- sample = GFA.load(sample_f)
11
- post_fhs = ObjectSpace.each_object(IO).count{ |i| not i.closed? }
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
- assert_equal(1, sample.headers.size)
14
- assert_equal(6, sample.segments.size)
15
- assert_equal(4, sample.links.size)
16
- assert(sample.containments.empty?)
17
- assert(sample.paths.empty?)
18
- assert_respond_to(sample, :records)
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
+ sample = GFA.load(path, index: false)
53
+ assert_nil(sample.path('first'))
19
54
  end
20
55
 
21
56
  def test_version_suppport
22
57
  gfa = GFA.new
23
- assert_raise { gfa.set_gfa_version("0.9") }
24
- assert_raise { gfa.set_gfa_version("1.1") }
25
- assert_nothing_raised { gfa.set_gfa_version("1.0") }
58
+ assert_raise { gfa.set_gfa_version('0.9') }
59
+ assert_raise { gfa.set_gfa_version('2.1') }
60
+ assert_nothing_raised { gfa.set_gfa_version('1.0') }
26
61
  end
27
62
 
28
63
  def test_line_by_line
29
64
  gfa = GFA.new
30
65
  assert_respond_to(gfa, :<<)
66
+
31
67
  # Empty
32
- gfa << " "
68
+ gfa << ' '
33
69
  assert(gfa.empty?)
34
- gfa << "H"
70
+ gfa << 'H'
35
71
  assert(gfa.empty?)
72
+
36
73
  # Segment
37
74
  assert_equal(0, gfa.segments.size)
38
- gfa << "S\t1\tACTG"
75
+ gfa << "S\t1\tACTG\n"
39
76
  assert(!gfa.empty?)
40
77
  assert_equal(1, gfa.segments.size)
78
+
41
79
  # Version
42
80
  assert_nil(gfa.gfa_version)
43
- gfa << GFA::Record::Header.new("VN:Z:1.0")
44
- assert_equal("1.0", gfa.gfa_version)
81
+ gfa << GFA::Record::Header.new('VN:Z:1.0')
82
+ assert_equal('1.0', gfa.gfa_version)
45
83
  end
46
-
47
84
  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
@@ -1,6 +1,11 @@
1
- require "codeclimate-test-reporter"
2
- CodeClimate::TestReporter.start
1
+ require 'simplecov'
2
+ SimpleCov.start
3
+
4
+ require 'rubygems'
5
+ require 'test/unit'
6
+ require 'gfa/common'
7
+
8
+ def fixture_path(file)
9
+ File.expand_path("../fixtures/#{file}", __FILE__)
10
+ end
3
11
 
4
- require "rubygems"
5
- require "test/unit"
6
- require "gfa/common"
metadata CHANGED
@@ -1,55 +1,55 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gfa
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Luis M. Rodriguez-R
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-25 00:00:00.000000000 Z
11
+ date: 2023-02-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rgl
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0.5'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0.5'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
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
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: test-unit
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '>='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  description: GFA is a graph representation of fragment assemblies
@@ -59,34 +59,47 @@ extensions: []
59
59
  extra_rdoc_files:
60
60
  - README.md
61
61
  files:
62
+ - Gemfile
63
+ - LICENSE
64
+ - README.md
65
+ - Rakefile
66
+ - lib/gfa.rb
62
67
  - lib/gfa/common.rb
68
+ - lib/gfa/field.rb
63
69
  - lib/gfa/field/char.rb
64
70
  - lib/gfa/field/float.rb
65
71
  - lib/gfa/field/hex.rb
72
+ - lib/gfa/field/json.rb
66
73
  - lib/gfa/field/numarray.rb
67
74
  - lib/gfa/field/sigint.rb
68
75
  - lib/gfa/field/string.rb
69
- - lib/gfa/field.rb
70
76
  - lib/gfa/generator.rb
71
77
  - lib/gfa/graph.rb
72
78
  - lib/gfa/parser.rb
79
+ - lib/gfa/record.rb
80
+ - lib/gfa/record/comment.rb
73
81
  - lib/gfa/record/containment.rb
74
82
  - lib/gfa/record/header.rb
83
+ - lib/gfa/record/jump.rb
75
84
  - lib/gfa/record/link.rb
76
85
  - lib/gfa/record/path.rb
77
86
  - lib/gfa/record/segment.rb
78
- - lib/gfa/record.rb
87
+ - lib/gfa/record/walk.rb
88
+ - lib/gfa/record_set.rb
89
+ - lib/gfa/record_set/comment_set.rb
90
+ - lib/gfa/record_set/containment_set.rb
91
+ - lib/gfa/record_set/header_set.rb
92
+ - lib/gfa/record_set/jump_set.rb
93
+ - lib/gfa/record_set/link_set.rb
94
+ - lib/gfa/record_set/path_set.rb
95
+ - lib/gfa/record_set/segment_set.rb
96
+ - lib/gfa/record_set/walk_set.rb
79
97
  - lib/gfa/version.rb
80
- - lib/gfa.rb
81
98
  - test/common_test.rb
82
99
  - test/field_test.rb
83
100
  - test/parser_test.rb
84
101
  - test/record_test.rb
85
102
  - test/test_helper.rb
86
- - Gemfile
87
- - Rakefile
88
- - README.md
89
- - LICENSE
90
103
  homepage: https://github.com/lmrodriguezr/gfa
91
104
  licenses: []
92
105
  metadata: {}
@@ -94,25 +107,24 @@ post_install_message:
94
107
  rdoc_options:
95
108
  - lib
96
109
  - README.md
97
- - --main
110
+ - "--main"
98
111
  - README.md
99
- - --title
112
+ - "--title"
100
113
  - Graphical Fragment Assembly (GFA) for Ruby
101
114
  require_paths:
102
115
  - lib
103
116
  required_ruby_version: !ruby/object:Gem::Requirement
104
117
  requirements:
105
- - - '>='
118
+ - - ">="
106
119
  - !ruby/object:Gem::Version
107
120
  version: '0'
108
121
  required_rubygems_version: !ruby/object:Gem::Requirement
109
122
  requirements:
110
- - - '>='
123
+ - - ">="
111
124
  - !ruby/object:Gem::Version
112
125
  version: '0'
113
126
  requirements: []
114
- rubyforge_project:
115
- rubygems_version: 2.0.14
127
+ rubygems_version: 3.1.6
116
128
  signing_key:
117
129
  specification_version: 4
118
130
  summary: Graphical Fragment Assembly (GFA) for Ruby