sequitur 0.1.18 → 0.1.23

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/lib/sequitur.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # File: sequitur.rb
2
4
  # This file acts as a jumping-off point for loading dependencies expected
3
5
  # for a Sequitur client.
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative '../spec_helper'
2
4
 
3
5
  # Load the class under test
@@ -5,28 +7,28 @@ require_relative '../../lib/sequitur/digram'
5
7
 
6
8
  module Sequitur # Re-open the module to get rid of qualified names
7
9
  describe Digram do
8
- let(:two_symbols) { [:b, :c] }
10
+ let(:two_symbols) { %i[b c] }
9
11
  let(:production) { double('sample-production') }
10
12
 
11
13
  context 'Standard creation & initialization:' do
12
14
  it 'should be created with 3 arguments' do
13
15
  instance = Digram.new(:b, :c, production)
14
-
16
+
15
17
  expect(instance.symbols).to eq(two_symbols)
16
18
  expect(instance.production).to eq(production)
17
19
  end
18
-
20
+
19
21
  it 'should return the production that it refers to' do
20
22
  instance = Digram.new(:b, :c, production)
21
23
  expect(instance.production).to eq(production)
22
24
  end
23
-
25
+
24
26
  it 'should whether its symbols are the same' do
25
27
  instance1 = Digram.new(:a, :a, production)
26
28
  expect(instance1).to be_repeating
27
-
29
+
28
30
  instance1 = Digram.new(:a, :b, production)
29
- expect(instance1).not_to be_repeating
31
+ expect(instance1).not_to be_repeating
30
32
  end
31
33
  end # context
32
34
 
@@ -35,11 +37,11 @@ describe Digram do
35
37
  instance1 = Digram.new(:a, :b, production)
36
38
  same = Digram.new(:a, :b, production)
37
39
  different = Digram.new(:b, :c, production)
38
-
40
+
39
41
  expect(instance1).to eq(instance1)
40
42
  expect(instance1).to eq(same)
41
43
  expect(instance1).not_to eq(different)
42
- expect(same).not_to eq(different)
44
+ expect(same).not_to eq(different)
43
45
  end
44
46
  end # context
45
47
  end # describe
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative '../spec_helper'
2
4
 
3
5
  # Load the class under test
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative '../../spec_helper'
2
4
  require 'stringio'
3
5
 
@@ -32,11 +34,11 @@ describe BaseText do
32
34
  grm
33
35
  end
34
36
 
35
- let(:destination) { StringIO.new('', 'w') }
37
+ let(:destination) { StringIO.new(+'', 'w') }
36
38
 
37
39
  context 'Standard creation & initialization:' do
38
40
  it 'should be initialized with an IO argument' do
39
- expect { BaseText.new(StringIO.new('', 'w')) }.not_to raise_error
41
+ expect { BaseText.new(StringIO.new(+'', 'w')) }.not_to raise_error
40
42
  end
41
43
 
42
44
  it 'should know its output destination' do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative '../../spec_helper'
2
4
  require 'stringio'
3
5
 
@@ -32,11 +34,11 @@ describe Debug do
32
34
  grm
33
35
  end
34
36
 
35
- let(:destination) { StringIO.new('', 'w') }
37
+ let(:destination) { StringIO.new(+'', 'w') }
36
38
 
37
39
  context 'Standard creation & initialization:' do
38
40
  it 'should be initialized with an IO argument' do
39
- expect { Debug.new(StringIO.new('', 'w')) }.not_to raise_error
41
+ expect { Debug.new(StringIO.new(+'', 'w')) }.not_to raise_error
40
42
  end
41
43
 
42
44
  it 'should know its output destination' do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative '../spec_helper'
2
4
 
3
5
  # Load the class under test
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative '../spec_helper'
2
4
 
3
5
  # Load the class under test
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative '../spec_helper'
2
4
 
3
5
  # Load the class under test
@@ -66,7 +68,7 @@ describe Production do
66
68
  expect(subject.references).to be_empty
67
69
 
68
70
  # Case 2: production without references
69
- symbols = [:a, :b, :c]
71
+ symbols = %i[a b c]
70
72
  symbols.each { |symb| subject.append_symbol(symb) }
71
73
  expect(subject.references).to be_empty
72
74
  expect(subject.references_of(p_a)).to be_empty
@@ -90,14 +92,14 @@ describe Production do
90
92
  end
91
93
 
92
94
  it 'should know the position(s) of a given digram' do
93
- sequence1 = [:a, :b, :c, :a, :b, :a, :b, :d]
95
+ sequence1 = %i[a b c a b a b d]
94
96
  sequence1.each { |symb| subject.append_symbol(symb) }
95
97
  positions = [0, 3, 5]
96
98
  expect(subject.positions_of(:a, :b)).to eq(positions)
97
99
 
98
100
  subject.clear_rhs
99
101
  # Case of overlapping digrams
100
- sequence2 = [:a, :a, :b, :a, :a, :a, :c, :d]
102
+ sequence2 = %i[a a b a a a c d]
101
103
  sequence2.each { |symb| subject.append_symbol(symb) }
102
104
  positions = [0, 3]
103
105
  expect(subject.positions_of(:a, :a)).to eq(positions)
@@ -114,15 +116,15 @@ describe Production do
114
116
  it 'should append a symbol when has one symbol' do
115
117
  subject.append_symbol(:a)
116
118
  subject.append_symbol(:b)
117
- expect(subject.rhs).to eq([:a, :b])
118
- expect(subject.last_digram.symbols).to eq([:a, :b])
119
+ expect(subject.rhs).to eq(%i[a b])
120
+ expect(subject.last_digram.symbols).to eq(%i[a b])
119
121
  end
120
122
 
121
123
  it 'should append a symbol when rhs has several symbols' do
122
- symbols = [:a, :b, :c, :d, :e, :f]
124
+ symbols = %i[a b c d e f]
123
125
  symbols.each { |symb| subject.append_symbol(symb) }
124
126
  expect(subject.rhs).to eq(symbols)
125
- expect(subject.last_digram.symbols).to eq([:e, :f])
127
+ expect(subject.last_digram.symbols).to eq(%i[e f])
126
128
  end
127
129
 
128
130
  it 'should append a production in its rhs' do
@@ -176,7 +178,7 @@ describe Production do
176
178
  instance = Production.new
177
179
  symbols = [:a, :b, 'c', :d, :e, 1000, instance]
178
180
  symbols.each { |symb| subject.append_symbol(symb) }
179
- expectation = "#{subject.object_id} : "
181
+ expectation = +"#{subject.object_id} : "
180
182
  expectation << "a b 'c' d e 1000 #{instance.object_id}."
181
183
  expect(subject.to_string).to eq(expectation)
182
184
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative '../spec_helper'
2
4
 
3
5
  # Load the class under test
@@ -7,7 +9,7 @@ module Sequitur # Re-open the module to get rid of qualified names
7
9
  describe SequiturGrammar do
8
10
  # Factory method. Returns an empty enumerator (
9
11
  # i.e. without elements to iterate)
10
- def empty_enum()
12
+ def empty_enum
11
13
  return [].to_enum
12
14
  end
13
15
 
@@ -36,28 +38,28 @@ describe SequiturGrammar do
36
38
 
37
39
  it 'could be created with multiple unique tokens' do
38
40
  # Creation
39
- instance = SequiturGrammar.new([:a, :b, :c, :d].to_enum)
41
+ instance = SequiturGrammar.new(%i[a b c d].to_enum)
40
42
 
41
43
  # Initialization
42
44
  expect(instance.productions.size).to eq(1)
43
45
  expect(instance.start).to eq(instance.productions.first)
44
- expect(instance.start.rhs).to eq([:a, :b, :c, :d])
46
+ expect(instance.start.rhs).to eq(%i[a b c d])
45
47
  end
46
48
 
47
49
  it 'could be created with a repeating digram' do
48
- instance = SequiturGrammar.new([:a, :b, :a, :b].to_enum)
50
+ instance = SequiturGrammar.new(%i[a b a b].to_enum)
49
51
 
50
52
  # Expectations:
51
53
  # S : A A.
52
54
  # A : a b.
53
55
  expect(instance.productions.size).to eq(2)
54
56
  p_a = instance.productions[1]
55
- expect(p_a.rhs).to eq([:a, :b])
57
+ expect(p_a.rhs).to eq(%i[a b])
56
58
  expect(instance.start.rhs).to eq([p_a, p_a])
57
59
  end
58
60
 
59
61
  it 'should enforce the utility rule' do
60
- instance = SequiturGrammar.new([:a, :b, :c, :a, :b, :c].to_enum)
62
+ instance = SequiturGrammar.new(%i[a b c a b c].to_enum)
61
63
 
62
64
  # Expectations without utility rule:
63
65
  # S : B B.
@@ -69,7 +71,7 @@ describe SequiturGrammar do
69
71
  # A : a b c.
70
72
  expect(instance.productions.size).to eq(2)
71
73
  p_a = instance.productions.last
72
- expect(p_a.rhs).to eq([:a, :b, :c])
74
+ expect(p_a.rhs).to eq(%i[a b c])
73
75
  expect(instance.start.rhs).to eq([p_a, p_a])
74
76
  end
75
77
 
@@ -105,9 +107,7 @@ describe SequiturGrammar do
105
107
  raw_input = 'bbebeebebebbebee'
106
108
 
107
109
  # Convert them into multichar strings
108
- input = raw_input.chars.map do |ch|
109
- 'letter_' + ch
110
- end
110
+ input = raw_input.chars.map { |ch| "letter_#{ch}" }
111
111
 
112
112
  # Creation
113
113
  instance = SequiturGrammar.new(input.to_enum)
@@ -124,7 +124,7 @@ describe SequiturGrammar do
124
124
  expect(p2.rhs).to eq([p1, p1])
125
125
  expect(p3.rhs).to eq(['letter_b', p2, 'letter_e'])
126
126
  end
127
-
127
+
128
128
  it 'should work with Symbol instead of single char input tokens' do
129
129
  # Raw input is sequence of single characters
130
130
  raw_input = 'bbebeebebebbebee'
@@ -143,7 +143,7 @@ describe SequiturGrammar do
143
143
  expect(instance.productions.size).to eq(4)
144
144
  (p1, p2, p3) = instance.productions[1..3]
145
145
  expect(instance.start.rhs).to eq([p3, p2, p3])
146
- expect(p1.rhs).to eq([:b, :e])
146
+ expect(p1.rhs).to eq(%i[b e])
147
147
  expect(p2.rhs).to eq([p1, p1])
148
148
  expect(p3.rhs).to eq([:b, p2, :e])
149
149
  end
@@ -279,7 +279,7 @@ SNIPPET
279
279
  expect(instance.productions.size).to eq(3)
280
280
  (p1, p2) = instance.productions[1..2]
281
281
  expect(instance.start.rhs).to eq([p2, p2])
282
- expect(p1.rhs).to eq([:a, :b])
282
+ expect(p1.rhs).to eq(%i[a b])
283
283
  expect(p2.rhs).to eq([p1, :c, p1, :d])
284
284
  end
285
285
  end # context
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative '../spec_helper'
2
4
 
3
5
  # Load the class under test
@@ -24,7 +26,7 @@ describe SymbolSequence do
24
26
 
25
27
  subject do
26
28
  an_instance = SymbolSequence.new
27
- [:a, :b, :c].each { |a_sym| an_instance << a_sym }
29
+ %i[a b c].each { |a_sym| an_instance << a_sym }
28
30
  an_instance
29
31
  end
30
32
 
@@ -63,7 +65,7 @@ describe SymbolSequence do
63
65
  expect(instance).to eq(instance)
64
66
 
65
67
  expect(subject).not_to eq(instance)
66
- [:a, :b, :c].each { |a_sym| instance << a_sym }
68
+ %i[a b c].each { |a_sym| instance << a_sym }
67
69
  expect(subject).to eq(instance)
68
70
 
69
71
  # Check that element order is relevant
@@ -72,10 +74,10 @@ describe SymbolSequence do
72
74
  end
73
75
 
74
76
  it 'should know whether it is equal to an array' do
75
- expect(subject).to eq([:a, :b, :c])
77
+ expect(subject).to eq(%i[a b c])
76
78
 
77
79
  # Check that element order is relevant
78
- expect(subject).not_to eq([:c, :b, :a])
80
+ expect(subject).not_to eq(%i[c b a])
79
81
  end
80
82
 
81
83
  it 'should know that is not equal to something else' do
data/spec/spec_helper.rb CHANGED
@@ -1,17 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # File: spec_helper.rb
2
4
  # Purpose: utility file that is loaded by all our RSpec files
3
5
 
4
- require 'simplecov'
5
- require 'coveralls'
6
-
7
- Coveralls.wear!
8
-
9
- SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
10
- SimpleCov::Formatter::HTMLFormatter,
11
- Coveralls::SimpleCov::Formatter
12
- ]
13
-
14
-
15
6
  require 'rspec' # Use the RSpec framework
16
7
  require 'pp' # Use pretty-print for debugging purposes
17
8
 
@@ -25,5 +16,4 @@ RSpec.configure do |config|
25
16
  config.full_backtrace = true
26
17
  end
27
18
 
28
-
29
19
  # End of file
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sequitur
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.18
4
+ version: 0.1.23
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dimitri Geshef
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-12-21 00:00:00.000000000 Z
11
+ date: 2021-09-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -36,48 +36,20 @@ dependencies:
36
36
  requirements:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
- version: 2.1.0
39
+ version: 3.0.0
40
40
  - - ">="
41
41
  - !ruby/object:Gem::Version
42
- version: 2.1.0
42
+ version: 3.0.0
43
43
  type: :development
44
44
  prerelease: false
45
45
  version_requirements: !ruby/object:Gem::Requirement
46
46
  requirements:
47
47
  - - "~>"
48
48
  - !ruby/object:Gem::Version
49
- version: 2.1.0
49
+ version: 3.0.0
50
50
  - - ">="
51
51
  - !ruby/object:Gem::Version
52
- version: 2.1.0
53
- - !ruby/object:Gem::Dependency
54
- name: simplecov
55
- requirement: !ruby/object:Gem::Requirement
56
- requirements:
57
- - - ">="
58
- - !ruby/object:Gem::Version
59
- version: 0.8.0
60
- type: :development
61
- prerelease: false
62
- version_requirements: !ruby/object:Gem::Requirement
63
- requirements:
64
- - - ">="
65
- - !ruby/object:Gem::Version
66
- version: 0.8.0
67
- - !ruby/object:Gem::Dependency
68
- name: coveralls
69
- requirement: !ruby/object:Gem::Requirement
70
- requirements:
71
- - - ">="
72
- - !ruby/object:Gem::Version
73
- version: 0.7.0
74
- type: :development
75
- prerelease: false
76
- version_requirements: !ruby/object:Gem::Requirement
77
- requirements:
78
- - - ">="
79
- - !ruby/object:Gem::Version
80
- version: 0.7.0
52
+ version: 3.0.0
81
53
  - !ruby/object:Gem::Dependency
82
54
  name: rubygems
83
55
  requirement: !ruby/object:Gem::Requirement
@@ -98,11 +70,14 @@ dependencies:
98
70
  - - ">="
99
71
  - !ruby/object:Gem::Version
100
72
  version: 2.0.0
101
- description: "Ruby implementation of the Sequitur algorithm. This algorithm automatically
102
- \nfinds repetitions and hierarchical structures in a given sequence of input \ntokens.
103
- It encodes the input into a context-free grammar. \nThe Sequitur algorithm can be
104
- used to \na) compress a sequence of items,\nb) discover patterns in an sequence,
105
- \nc) generate grammar rules that can represent a given input.\n"
73
+ description: |
74
+ Ruby implementation of the Sequitur algorithm. This algorithm automatically
75
+ finds repetitions and hierarchical structures in a given sequence of input
76
+ tokens. It encodes the input into a context-free grammar.
77
+ The Sequitur algorithm can be used to
78
+ a) compress a sequence of items,
79
+ b) discover patterns in an sequence,
80
+ c) generate grammar rules that can represent a given input.
106
81
  email: famished.tiger@yahoo.com
107
82
  executables: []
108
83
  extensions: []
@@ -112,8 +87,6 @@ files:
112
87
  - ".rspec"
113
88
  - ".rubocop.yml"
114
89
  - ".ruby-gemset"
115
- - ".ruby-version"
116
- - ".simplecov"
117
90
  - ".travis.yml"
118
91
  - ".yardopts"
119
92
  - CHANGELOG.md
@@ -165,16 +138,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
165
138
  requirements:
166
139
  - - ">="
167
140
  - !ruby/object:Gem::Version
168
- version: 2.0.0
141
+ version: 2.5.0
169
142
  required_rubygems_version: !ruby/object:Gem::Requirement
170
143
  requirements:
171
144
  - - ">="
172
145
  - !ruby/object:Gem::Version
173
146
  version: '0'
174
147
  requirements: []
175
- rubyforge_project:
176
- rubygems_version: 2.6.7
177
- signing_key:
148
+ rubygems_version: 3.1.4
149
+ signing_key:
178
150
  specification_version: 4
179
151
  summary: Ruby implementation of the Sequitur algorithm
180
152
  test_files: