subconv 0.1.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  module Subconv
@@ -79,15 +81,15 @@ module Subconv
79
81
  # (which may change in the future)
80
82
  # Perhaps it would be better to compare independent of the exact order of the nodes
81
83
  expect(transform_test_style(style)).to eq(single_caption_with_content(
82
- ColorNode.new(:magenta, [
83
- UnderlineNode.new([
84
- ItalicsNode.new([
85
- FlashNode.new([
86
- TextNode.new('Test')
87
- ])
88
- ])
89
- ])
90
- ])
84
+ ColorNode.new(:magenta, [
85
+ UnderlineNode.new([
86
+ ItalicsNode.new([
87
+ FlashNode.new([
88
+ TextNode.new('Test')
89
+ ])
90
+ ])
91
+ ])
92
+ ])
91
93
  ))
92
94
  end
93
95
 
@@ -106,26 +108,25 @@ module Subconv
106
108
  grid.insert_text(0, 5, 'f', style.dup)
107
109
  transformed = @transformer.transform(single_scc_caption_with_grid(grid))
108
110
  expect(transformed).to eq(single_caption_with_content(
109
- [
110
- TextNode.new('a'),
111
- ItalicsNode.new([
112
- ColorNode.new(:blue, [
113
- FlashNode.new([
114
- TextNode.new('b'),
115
- UnderlineNode.new([
116
- TextNode.new('cde')
117
- ])
118
- ])
119
- ]),
120
- ColorNode.new(:cyan, [
121
- UnderlineNode.new([
122
- TextNode.new('f')
123
- ])
124
- ])
125
- ])
126
- ]
127
- )
128
- )
111
+ [
112
+ TextNode.new('a'),
113
+ ItalicsNode.new([
114
+ ColorNode.new(:blue, [
115
+ FlashNode.new([
116
+ TextNode.new('b'),
117
+ UnderlineNode.new([
118
+ TextNode.new('cde')
119
+ ])
120
+ ])
121
+ ]),
122
+ ColorNode.new(:cyan, [
123
+ UnderlineNode.new([
124
+ TextNode.new('f')
125
+ ])
126
+ ])
127
+ ])
128
+ ]
129
+ ))
129
130
  end
130
131
 
131
132
  it 'should handle this other complicated combination of styles and text' do
@@ -143,25 +144,144 @@ module Subconv
143
144
  grid.insert_text(0, 6, 'jkl', style.dup)
144
145
  transformed = @transformer.transform(single_scc_caption_with_grid(grid))
145
146
  expect(transformed).to eq(single_caption_with_content(
146
- [
147
- ColorNode.new(:red, [
148
- ItalicsNode.new([
149
- TextNode.new('xyz'),
150
- UnderlineNode.new([
151
- FlashNode.new([
152
- TextNode.new('abc')
153
- ])
154
- ])
155
- ])
156
- ]),
157
- ColorNode.new(:yellow, [
158
- UnderlineNode.new([
159
- TextNode.new('jkl')
160
- ])
161
- ])
162
- ]
163
- )
164
- )
147
+ [
148
+ ColorNode.new(:red, [
149
+ ItalicsNode.new([
150
+ TextNode.new('xyz'),
151
+ UnderlineNode.new([
152
+ FlashNode.new([
153
+ TextNode.new('abc')
154
+ ])
155
+ ])
156
+ ])
157
+ ]),
158
+ ColorNode.new(:yellow, [
159
+ UnderlineNode.new([
160
+ TextNode.new('jkl')
161
+ ])
162
+ ])
163
+ ]
164
+ ))
165
+ end
166
+
167
+ context 'when combining paint-on captions' do
168
+ it 'should not eat single paint-on captions' do
169
+ expect(@transformer.combine_paint_on_captions(grids_to_captions(:paint_on, 1 => 'Test'))).to eq(grids_to_captions(:pop_on, 1 => 'Test'))
170
+ end
171
+
172
+ it 'should correctly combine simple paint-on captions into one' do
173
+ expect(@transformer.combine_paint_on_captions(
174
+ grids_to_captions(:paint_on, 1 => 'Te', 2 => 'Test', 3 => 'TestTe', 4 => 'TestText')
175
+ )).to eq(
176
+ grids_to_captions(1 => 'TestText')
177
+ )
178
+ end
179
+
180
+ it 'should produce combined paint-on captions when an empty grid is encountered' do
181
+ expect(@transformer.combine_paint_on_captions(
182
+ grids_to_captions(:paint_on, 1 => 'Te', 2 => 'Test', 3 => nil)
183
+ )).to eq(
184
+ grids_to_captions(1 => 'Test', 3 => nil)
185
+ )
186
+ end
187
+
188
+ it 'should not combine paint-on captions with an empty grid' do
189
+ expect(@transformer.combine_paint_on_captions(
190
+ grids_to_captions(:paint_on, 1 => 'Te', 2 => 'Test', 3 => nil, 4 => 'Text')
191
+ )).to eq(
192
+ grids_to_captions(1 => 'Test', 3 => nil, 4 => 'Text')
193
+ )
194
+ end
195
+
196
+ it 'should not start a new caption segment when a character is replaced with an extended one' do
197
+ expect(@transformer.combine_paint_on_captions([
198
+ Scc::Caption.new(timecode: Timecode.new(1, default_fps), grid: Scc::Grid.new.insert_text(0, 0, 'Te'), mode: :paint_on),
199
+ Scc::Caption.new(timecode: Timecode.new(2, default_fps), grid: Scc::Grid.new.insert_text(0, 0, 'Të'), mode: :paint_on, char_replacement: true),
200
+ Scc::Caption.new(timecode: Timecode.new(3, default_fps), grid: Scc::Grid.new.insert_text(0, 0, 'Tëst'), mode: :paint_on)
201
+ ])).to eq(
202
+ grids_to_captions(1 => 'Tëst')
203
+ )
204
+ end
205
+
206
+ it 'should start a new caption segment when paint-on captions disappear' do
207
+ expect(@transformer.combine_paint_on_captions(
208
+ grids_to_captions(:paint_on, 1 => 'Te', 2 => 'Test', 3 => 'Tes', 4 => 'Te', 5 => 'Text')
209
+ )).to eq(
210
+ grids_to_captions(1 => 'Test', 3 => 'Tes', 4 => 'Text')
211
+ )
212
+ end
213
+
214
+ it 'should insert a new caption when paint-on captions change' do
215
+ expect(@transformer.combine_paint_on_captions(
216
+ grids_to_captions(:paint_on, 1 => 'Te', 2 => 'Test', 5 => 'Text')
217
+ )).to eq(
218
+ grids_to_captions(1 => 'Test', 5 => 'Text')
219
+ )
220
+ end
221
+
222
+ it 'should start a new caption segment when paint-on captions change' do
223
+ expect(@transformer.combine_paint_on_captions(
224
+ grids_to_captions(:paint_on, 1 => 'Te', 2 => 'Test', 5 => 'Text', 7 => 'TextTest')
225
+ )).to eq(
226
+ grids_to_captions(1 => 'Test', 5 => 'TextTest')
227
+ )
228
+ end
229
+
230
+ it 'should flush single paint-on captions when switching to pop-on captions momentarily' do
231
+ expect(@transformer.combine_paint_on_captions([
232
+ Scc::Caption.new(timecode: Timecode.new(1, default_fps), grid: Scc::Grid.new.insert_text(0, 0, 'Test'), mode: :paint_on),
233
+ Scc::Caption.new(timecode: Timecode.new(2, default_fps), grid: Scc::Grid.new.insert_text(0, 0, 'Text'), mode: :pop_on)
234
+ ])).to eq(
235
+ grids_to_captions(1 => 'Test', 2 => 'Text')
236
+ )
237
+ end
238
+
239
+ it 'should flush combined paint-on captions when switching to pop-on captions momentarily' do
240
+ expect(@transformer.combine_paint_on_captions([
241
+ Scc::Caption.new(timecode: Timecode.new(1, default_fps), grid: Scc::Grid.new.insert_text(0, 0, 'Test'), mode: :paint_on),
242
+ Scc::Caption.new(timecode: Timecode.new(2, default_fps), grid: Scc::Grid.new.insert_text(0, 0, 'TestText'), mode: :paint_on),
243
+ Scc::Caption.new(timecode: Timecode.new(3, default_fps), grid: Scc::Grid.new.insert_text(0, 0, 'asdf'), mode: :pop_on)
244
+ ])).to eq(
245
+ grids_to_captions(1 => 'TestText', 3 => 'asdf')
246
+ )
247
+ end
248
+
249
+ it 'should flush combined paint-on captions when switching to pop-on captions after an empty paint-on caption' do
250
+ expect(@transformer.combine_paint_on_captions([
251
+ Scc::Caption.new(timecode: Timecode.new(1, default_fps), grid: Scc::Grid.new.insert_text(0, 0, 'Test'), mode: :paint_on),
252
+ Scc::Caption.new(timecode: Timecode.new(2, default_fps), grid: Scc::Grid.new.insert_text(0, 0, 'TestText'), mode: :paint_on),
253
+ Scc::Caption.new(timecode: Timecode.new(3, default_fps), mode: :paint_on),
254
+ Scc::Caption.new(timecode: Timecode.new(4, default_fps), grid: Scc::Grid.new.insert_text(0, 0, 'asdf'), mode: :pop_on)
255
+ ])).to eq(
256
+ grids_to_captions(1 => 'TestText', 3 => nil, 4 => 'asdf')
257
+ )
258
+ end
259
+
260
+ it 'should flush combined paint-on captions when switching to pop-on captions after an empty pop-on caption' do
261
+ expect(@transformer.combine_paint_on_captions([
262
+ Scc::Caption.new(timecode: Timecode.new(1, default_fps), grid: Scc::Grid.new.insert_text(0, 0, 'Test'), mode: :paint_on),
263
+ Scc::Caption.new(timecode: Timecode.new(2, default_fps), grid: Scc::Grid.new.insert_text(0, 0, 'TestText'), mode: :paint_on),
264
+ Scc::Caption.new(timecode: Timecode.new(3, default_fps), mode: :pop_on),
265
+ Scc::Caption.new(timecode: Timecode.new(4, default_fps), grid: Scc::Grid.new.insert_text(0, 0, 'asdf'), mode: :pop_on)
266
+ ])).to eq(
267
+ grids_to_captions(1 => 'TestText', 3 => nil, 4 => 'asdf')
268
+ )
269
+ end
270
+
271
+ it 'should handle combinations of pop-on and paint-on captions' do
272
+ expect(@transformer.combine_paint_on_captions([
273
+ Scc::Caption.new(timecode: Timecode.new(1, default_fps), grid: Scc::Grid.new.insert_text(0, 0, 'Test1'), mode: :paint_on),
274
+ Scc::Caption.new(timecode: Timecode.new(2, default_fps), mode: :pop_on),
275
+ Scc::Caption.new(timecode: Timecode.new(3, default_fps), grid: Scc::Grid.new.insert_text(0, 0, 'Test2'), mode: :pop_on),
276
+ Scc::Caption.new(timecode: Timecode.new(4, default_fps), grid: Scc::Grid.new.insert_text(0, 0, 'Test3'), mode: :pop_on),
277
+ Scc::Caption.new(timecode: Timecode.new(5, default_fps), grid: Scc::Grid.new.insert_text(0, 0, 'Test4'), mode: :paint_on),
278
+ Scc::Caption.new(timecode: Timecode.new(6, default_fps), mode: :paint_on),
279
+ Scc::Caption.new(timecode: Timecode.new(7, default_fps), grid: Scc::Grid.new.insert_text(0, 0, 'Test'), mode: :paint_on),
280
+ Scc::Caption.new(timecode: Timecode.new(8, default_fps), grid: Scc::Grid.new.insert_text(0, 0, 'Test5'), mode: :paint_on)
281
+ ])).to eq(
282
+ grids_to_captions(1 => 'Test1', 2 => nil, 3 => 'Test2', 4 => 'Test3', 5 => 'Test4', 6 => nil, 7 => 'Test5')
283
+ )
284
+ end
165
285
  end
166
286
  end
167
287
  end
data/spec/spec_helper.rb CHANGED
@@ -1,5 +1,11 @@
1
- require 'coveralls'
2
- Coveralls.wear!
1
+ # frozen_string_literal: true
2
+
3
+ require 'simplecov'
4
+ require 'simplecov-console'
5
+
6
+ SimpleCov.formatter = SimpleCov::Formatter::Console
7
+
8
+ SimpleCov.start
3
9
 
4
10
  require 'subconv'
5
11
  require 'test_helpers'
data/spec/test_helpers.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Subconv
2
4
  module TestHelpers
3
5
  def default_fps
@@ -40,6 +42,22 @@ module Subconv
40
42
  [Scc::Caption.new(timecode: t1, grid: grid), Scc::Caption.new(timecode: t2)]
41
43
  end
42
44
 
45
+ # Convert a map of frame indices to grids to a caption array
46
+ # First argument is default caption type
47
+ def grids_to_captions(*args)
48
+ # Default to pop-on mode
49
+ mode = args.first.is_a?(Symbol) ? args.shift : :pop_on
50
+ grids = args.shift
51
+
52
+ grids.sort.map do |frame, grid|
53
+ if !grid.nil? && !grid.instance_of?(Scc::Grid)
54
+ # Auto-create grid from text or similar
55
+ grid = Scc::Grid.new.insert_text(0, 0, grid.to_s)
56
+ end
57
+ Scc::Caption.new(timecode: Timecode.new(frame, default_fps), grid: grid, mode: mode)
58
+ end
59
+ end
60
+
43
61
  def single_caption_with_content(content)
44
62
  # Auto-promote the content to a TextNode if necessary
45
63
  content = TextNode.new(content) if content.instance_of?(String)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  module Subconv
@@ -31,16 +33,16 @@ module Subconv
31
33
  Caption.new(timespan: Utility::Timespan.new(Timecode.new(25, default_fps), Timecode.new(35, default_fps)), position: left_top, content: root_with_text('Test 3'), align: :start)
32
34
  ]
33
35
 
34
- expected = header + <<"END".rstrip
35
- 00:00:00.400 --> 00:00:00.800 align:start line:10.000% position:20.000%
36
- Test 1
36
+ expected = header + <<~"VTT".rstrip
37
+ 00:00:00.400 --> 00:00:00.800 align:start line:10.000% position:20.000%
38
+ Test 1
37
39
 
38
- 00:00:00.400 --> 00:00:00.800 align:start line:30.000% position:20.000%
39
- Test 2
40
+ 00:00:00.400 --> 00:00:00.800 align:start line:30.000% position:20.000%
41
+ Test 2
40
42
 
41
- 00:00:01.000 --> 00:00:01.400 align:start line:10.000% position:20.000%
42
- Test 3
43
- END
43
+ 00:00:01.000 --> 00:00:01.400 align:start line:10.000% position:20.000%
44
+ Test 3
45
+ VTT
44
46
  expect(write(captions)).to eq(expected)
45
47
  end
46
48
 
@@ -51,13 +53,13 @@ END
51
53
  Caption.new(timespan: t2_3, position: :bottom, content: root_with_text('Test 2'), align: :middle)
52
54
  ]
53
55
 
54
- expected = header + <<"END".rstrip
55
- 00:00:00.400 --> 00:00:00.800 align:start line:5%
56
- Test 1
56
+ expected = header + <<~"VTT".rstrip
57
+ 00:00:00.400 --> 00:00:00.800 align:start line:5%
58
+ Test 1
57
59
 
58
- 00:00:00.800 --> 00:00:01.200 line:-1,end
59
- Test 2
60
- END
60
+ 00:00:00.800 --> 00:00:01.200 line:-1,end
61
+ Test 2
62
+ VTT
61
63
  expect(write(captions)).to eq(expected)
62
64
  end
63
65
 
data/subconv.gemspec CHANGED
@@ -1,5 +1,6 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
5
  require 'subconv/version'
5
6
 
@@ -8,7 +9,7 @@ Gem::Specification.new do |s|
8
9
  s.version = Subconv::VERSION
9
10
 
10
11
  s.required_rubygems_version = Gem::Requirement.new('>= 0') if s.respond_to? :required_rubygems_version=
11
- s.required_ruby_version = '>= 2.0'
12
+ s.required_ruby_version = '>= 2.4'
12
13
  s.authors = ['Philipp Kerling']
13
14
  s.email = ['pkerling@casix.org']
14
15
  s.homepage = 'https://github.com/pkerling/subconv'
@@ -19,16 +20,15 @@ Gem::Specification.new do |s|
19
20
  s.license = 'MIT'
20
21
 
21
22
  s.rdoc_options = ['--charset=UTF-8']
22
- s.require_paths = ['lib']
23
23
 
24
24
  s.rubygems_version = '1.3.7'
25
25
  s.summary = 'Subtitle conversion (SCC to WebVTT)'
26
- s.add_dependency 'solid-struct'
27
- s.add_dependency 'timecode'
26
+ s.add_dependency 'solid-struct', '~> 0.1'
27
+ s.add_dependency 'timecode', '~> 2.2'
28
28
  s.add_development_dependency 'bundler', '~> 1.7'
29
- s.add_development_dependency 'rspec', '~> 3.4.0'
30
- s.add_development_dependency 'rake'
31
- s.add_development_dependency 'rubocop'
32
- s.add_development_dependency 'json'
33
- s.add_development_dependency 'coveralls'
29
+ s.add_development_dependency 'rake', '~> 12.3'
30
+ s.add_development_dependency 'rspec', '~> 3.8.0'
31
+ s.add_development_dependency 'rubocop', '~> 0.72'
32
+ s.add_development_dependency 'simplecov', '~> 0.17'
33
+ s.add_development_dependency 'simplecov-console', '~> 0.5'
34
34
  end
metadata CHANGED
@@ -1,43 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: subconv
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Philipp Kerling
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-26 00:00:00.000000000 Z
11
+ date: 2019-07-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: solid-struct
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: '0.1'
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
- version: '0'
26
+ version: '0.1'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: timecode
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: '2.2'
34
34
  type: :runtime
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: '0'
40
+ version: '2.2'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -53,75 +53,75 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '1.7'
55
55
  - !ruby/object:Gem::Dependency
56
- name: rspec
56
+ name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 3.4.0
61
+ version: '12.3'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 3.4.0
68
+ version: '12.3'
69
69
  - !ruby/object:Gem::Dependency
70
- name: rake
70
+ name: rspec
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ">="
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '0'
75
+ version: 3.8.0
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ">="
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '0'
82
+ version: 3.8.0
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: rubocop
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ">="
87
+ - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '0'
89
+ version: '0.72'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ">="
94
+ - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '0'
96
+ version: '0.72'
97
97
  - !ruby/object:Gem::Dependency
98
- name: json
98
+ name: simplecov
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - ">="
101
+ - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '0'
103
+ version: '0.17'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - ">="
108
+ - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '0'
110
+ version: '0.17'
111
111
  - !ruby/object:Gem::Dependency
112
- name: coveralls
112
+ name: simplecov-console
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - ">="
115
+ - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: '0'
117
+ version: '0.5'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - ">="
122
+ - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: '0'
124
+ version: '0.5'
125
125
  description:
126
126
  email:
127
127
  - pkerling@casix.org
@@ -131,9 +131,11 @@ extensions: []
131
131
  extra_rdoc_files: []
132
132
  files:
133
133
  - ".gitignore"
134
+ - ".gitlab-ci.yml"
134
135
  - ".rubocop.yml"
135
136
  - ".travis.yml"
136
137
  - Gemfile
138
+ - Gemfile.lock
137
139
  - LICENSE
138
140
  - README.md
139
141
  - Rakefile
@@ -147,6 +149,7 @@ files:
147
149
  - lib/subconv/utility.rb
148
150
  - lib/subconv/version.rb
149
151
  - lib/subconv/webvtt/writer.rb
152
+ - spec/.rubocop.yml
150
153
  - spec/caption_filter_spec.rb
151
154
  - spec/scc/reader_spec.rb
152
155
  - spec/scc/transformer_spec.rb
@@ -167,19 +170,19 @@ required_ruby_version: !ruby/object:Gem::Requirement
167
170
  requirements:
168
171
  - - ">="
169
172
  - !ruby/object:Gem::Version
170
- version: '2.0'
173
+ version: '2.4'
171
174
  required_rubygems_version: !ruby/object:Gem::Requirement
172
175
  requirements:
173
176
  - - ">="
174
177
  - !ruby/object:Gem::Version
175
178
  version: '0'
176
179
  requirements: []
177
- rubyforge_project:
178
- rubygems_version: 2.4.8
180
+ rubygems_version: 3.0.4
179
181
  signing_key:
180
182
  specification_version: 4
181
183
  summary: Subtitle conversion (SCC to WebVTT)
182
184
  test_files:
185
+ - spec/.rubocop.yml
183
186
  - spec/caption_filter_spec.rb
184
187
  - spec/scc/reader_spec.rb
185
188
  - spec/scc/transformer_spec.rb