subconv 0.1.0 → 1.0.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.
@@ -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