bibtex-ruby 4.4.7 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of bibtex-ruby might be problematic. Click here for more details.

Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +23 -24
  3. data/History.txt +4 -0
  4. data/Rakefile +23 -25
  5. data/bibtex-ruby.gemspec +1 -1
  6. data/examples/bib2html.rb +5 -6
  7. data/examples/bib2yaml.rb +2 -2
  8. data/features/step_definitions/bibtex_steps.rb +3 -6
  9. data/features/step_definitions/name_steps.rb +1 -2
  10. data/lib/bibtex.rb +11 -13
  11. data/lib/bibtex/bibliography.rb +45 -58
  12. data/lib/bibtex/compatibility.rb +3 -5
  13. data/lib/bibtex/elements.rb +49 -42
  14. data/lib/bibtex/entry.rb +80 -84
  15. data/lib/bibtex/entry/citeproc_converter.rb +47 -52
  16. data/lib/bibtex/entry/rdf_converter.rb +97 -63
  17. data/lib/bibtex/error.rb +10 -11
  18. data/lib/bibtex/extensions.rb +2 -5
  19. data/lib/bibtex/filters.rb +4 -9
  20. data/lib/bibtex/filters/latex.rb +0 -2
  21. data/lib/bibtex/filters/linebreaks.rb +0 -2
  22. data/lib/bibtex/lexer.rb +81 -81
  23. data/lib/bibtex/names.rb +24 -28
  24. data/lib/bibtex/replaceable.rb +15 -17
  25. data/lib/bibtex/utilities.rb +5 -10
  26. data/lib/bibtex/value.rb +28 -34
  27. data/lib/bibtex/version.rb +6 -6
  28. data/test/benchmark.rb +20 -22
  29. data/test/bibtex/entry/test_rdf_converter.rb +3 -5
  30. data/test/bibtex/test_bibliography.rb +22 -35
  31. data/test/bibtex/test_elements.rb +7 -15
  32. data/test/bibtex/test_entry.rb +78 -87
  33. data/test/bibtex/test_filters.rb +8 -7
  34. data/test/bibtex/test_lexer.rb +10 -13
  35. data/test/bibtex/test_name_parser.rb +6 -9
  36. data/test/bibtex/test_names.rb +50 -55
  37. data/test/bibtex/test_parser.rb +30 -34
  38. data/test/bibtex/test_string.rb +8 -9
  39. data/test/bibtex/test_utilities.rb +6 -9
  40. data/test/bibtex/test_value.rb +41 -43
  41. data/test/helper.rb +3 -6
  42. data/test/macruby.rb +12 -13
  43. data/test/profile.rb +16 -16
  44. data/test/test_bibtex.rb +10 -15
  45. data/test/test_export.rb +5 -13
  46. metadata +4 -4
@@ -2,31 +2,32 @@ require 'helper.rb'
2
2
 
3
3
  module BibTeX
4
4
  class FiltersTest < Minitest::Spec
5
-
6
- it "should Filters should be singleton classes" do
5
+ it 'should Filters should be singleton classes' do
7
6
  assert_equal false, Filter.respond_to?(:new)
8
7
  assert_equal Filter.instance.object_id, Filter.instance.object_id
9
8
  end
10
9
 
11
10
  describe 'Filters.resolve' do
12
- it "should return the filter if a filter is given" do
11
+ it 'should return the filter if a filter is given' do
13
12
  assert_equal Filter.instance.object_id, Filters.resolve(Filter.instance).object_id
14
13
  end
15
14
 
16
- it "should return the parameter if it quacks like a filter" do
15
+ it 'should return the parameter if it quacks like a filter' do
17
16
  f = Object.new
18
- def f.apply; nil; end
17
+ def f.apply
18
+ nil
19
+ end
19
20
  assert_equal f.object_id, Filters.resolve(f).object_id
20
21
  end
21
22
 
22
- it "should return the filter if there is a filter by that name" do
23
+ it 'should return the filter if there is a filter by that name' do
23
24
  class FooBar < Filter; end
24
25
  assert_equal FooBar.instance.object_id, Filters.resolve(:foobar).object_id
25
26
  assert_equal FooBar.instance.object_id, Filters.resolve('foobar').object_id
26
27
  Filter.subclasses.delete(FooBar)
27
28
  end
28
29
 
29
- it "should return nil if there is no filter by that name" do
30
+ it 'should return nil if there is no filter by that name' do
30
31
  assert_equal nil, Filters.resolve(:foobar)
31
32
  assert_equal nil, Filters.resolve('foobar')
32
33
  assert_equal nil, Filters.resolve(nil)
@@ -1,42 +1,39 @@
1
- # coding: utf-8
2
-
3
1
  require 'helper.rb'
4
2
 
5
3
  module BibTeX
6
4
  class LexerTest < Minitest::Spec
7
-
8
5
  it 'correctly scans a string literal' do
9
- assert_equal Lexer.new.analyse(%q(@string{ x = "foo" })).symbols, [:AT,:STRING,:LBRACE,:NAME,:EQ,:STRING_LITERAL,:RBRACE,false]
6
+ assert_equal Lexer.new.analyse('@string{ x = "foo" }').symbols, [:AT, :STRING, :LBRACE, :NAME, :EQ, :STRING_LITERAL, :RBRACE, false]
10
7
  end
11
8
 
12
9
  it 'strips line breaks by default' do
13
- Lexer.new.analyse(%Q(@string{ x = "foo\nbar" })).stack[-3].must_be :==,
14
- [:STRING_LITERAL, 'foo bar']
10
+ Lexer.new.analyse(%(@string{ x = "foo\nbar" })).stack[-3].must_be :==,
11
+ [:STRING_LITERAL, 'foo bar']
15
12
  end
16
13
 
17
14
  it 'strips whitespace after line breaks by default' do
18
- Lexer.new.analyse(%Q(@string{ x = "foo\n bar" })).stack[-3].must_be :==,
19
- [:STRING_LITERAL, 'foo bar']
15
+ Lexer.new.analyse(%(@string{ x = "foo\n bar" })).stack[-3].must_be :==,
16
+ [:STRING_LITERAL, 'foo bar']
20
17
  end
21
18
 
22
19
  it 'matches KEY tokens' do
23
- Lexer.new.analyse("@misc{foo, }").symbols.must_be :==, [:AT, :NAME, :LBRACE, :KEY, :RBRACE, false]
20
+ Lexer.new.analyse('@misc{foo, }').symbols.must_be :==, [:AT, :NAME, :LBRACE, :KEY, :RBRACE, false]
24
21
  end
25
22
 
26
23
  it 'matches KEY tokens with non-ascii characters' do
27
- Lexer.new.analyse("@misc{löwe, }").symbols.must_be :==, [:AT, :NAME, :LBRACE, :KEY, :RBRACE, false]
24
+ Lexer.new.analyse('@misc{löwe, }').symbols.must_be :==, [:AT, :NAME, :LBRACE, :KEY, :RBRACE, false]
28
25
  end
29
26
 
30
27
  it 'matches KEY tokens after whitespace' do
31
- Lexer.new.analyse("@misc{ foo, }").symbols.must_be :==, [:AT, :NAME, :LBRACE, :KEY, :RBRACE, false]
28
+ Lexer.new.analyse('@misc{ foo, }').symbols.must_be :==, [:AT, :NAME, :LBRACE, :KEY, :RBRACE, false]
32
29
  end
33
30
 
34
31
  it "doesn't start a comment for types starting with but not equal @comment" do
35
- Lexer.new.analyse("@commentary{staudinger, }").symbols.must_be :==, [:AT, :NAME, :LBRACE, :KEY, :RBRACE, false]
32
+ Lexer.new.analyse('@commentary{staudinger, }').symbols.must_be :==, [:AT, :NAME, :LBRACE, :KEY, :RBRACE, false]
36
33
  end
37
34
 
38
35
  it "doesn't start a preamble for types starting with but not equal @preamble" do
39
- Lexer.new.analyse("@preamblestring{ preamble }").symbols.must_be :==, [:AT, :NAME, :LBRACE, :NAME, :RBRACE, false]
36
+ Lexer.new.analyse('@preamblestring{ preamble }').symbols.must_be :==, [:AT, :NAME, :LBRACE, :NAME, :RBRACE, false]
40
37
  end
41
38
  end
42
39
  end
@@ -2,7 +2,6 @@ require 'helper'
2
2
 
3
3
  module BibTeX
4
4
  class NameParserTest < Minitest::Spec
5
-
6
5
  describe "parse a number of entries having a 'van' or 'van den' name prefix" do
7
6
  before do
8
7
  @a = Names.parse('van den Bout, D. E.')
@@ -10,20 +9,18 @@ module BibTeX
10
9
  end
11
10
 
12
11
  it "should parse 'van den' part starting with lowercase letter" do
13
- assert_equal(@a[0].to_s, "van den Bout, D. E.")
14
- assert_equal(@a[0].prefix, "van den")
12
+ assert_equal(@a[0].to_s, 'van den Bout, D. E.')
13
+ assert_equal(@a[0].prefix, 'van den')
15
14
  end
16
15
 
17
16
  it "should parse 'Van den' part starting with uppercase letter" do
18
- assert_equal(@b[0].to_s, "Van den Bout, D. E.")
19
- assert_equal(@b[0].prefix, "Van den")
17
+ assert_equal(@b[0].to_s, 'Van den Bout, D. E.')
18
+ assert_equal(@b[0].prefix, 'Van den')
20
19
  end
21
20
 
22
- it "should accept empty strings" do
23
- assert_equal '', Names.parse("").to_s
21
+ it 'should accept empty strings' do
22
+ assert_equal '', Names.parse('').to_s
24
23
  end
25
-
26
24
  end
27
-
28
25
  end
29
26
  end
@@ -1,17 +1,14 @@
1
- # coding: utf-8
2
-
3
1
  require 'helper'
4
2
 
5
3
  module BibTeX
6
4
  class NamesTest < Minitest::Spec
7
-
8
5
  before do
9
- @poe = Name.new(:first => 'Edgar Allen', :last => 'Poe')
6
+ @poe = Name.new(first: 'Edgar Allen', last: 'Poe')
10
7
  end
11
8
 
12
9
  describe 'string behaviour' do
13
10
  before do
14
- @name = Name.new(:first => 'Charles Louis Xavier Joseph', :prefix => 'de la', :last => 'Vallee Poussin', :suffix => 'Jr.')
11
+ @name = Name.new(first: 'Charles Louis Xavier Joseph', prefix: 'de la', last: 'Vallee Poussin', suffix: 'Jr.')
15
12
  end
16
13
  it 'should implement upcase!' do
17
14
  assert_equal 'DE LA VALLEE POUSSIN, JR., CHARLES LOUIS XAVIER JOSEPH', @name.upcase!.to_s
@@ -30,7 +27,7 @@ module BibTeX
30
27
  end
31
28
 
32
29
  it 'accepts the :initials option' do
33
- @poe.display_order(:initials => true).must_be :==, 'E.A. Poe'
30
+ @poe.display_order(initials: true).must_be :==, 'E.A. Poe'
34
31
  end
35
32
  end
36
33
 
@@ -40,7 +37,7 @@ module BibTeX
40
37
  end
41
38
 
42
39
  it 'accepts the :initials option' do
43
- @poe.sort_order(:initials => true).must_be :==, 'Poe, E.A.'
40
+ @poe.sort_order(initials: true).must_be :==, 'Poe, E.A.'
44
41
  end
45
42
  end
46
43
 
@@ -64,26 +61,26 @@ module BibTeX
64
61
 
65
62
  describe '#rename_if' do
66
63
  it 'renames the name to the given attributes if no condition is given' do
67
- @poe.rename_if({ :first => 'E.A.' }).first.must_equal 'E.A.'
64
+ @poe.rename_if(first: 'E.A.').first.must_equal 'E.A.'
68
65
  end
69
66
 
70
67
  it 'renames the name to the given attributes if all conditions match' do
71
- @poe.rename_if({ :first => 'E.A.' }, { :last => @poe.last }).first.must_equal 'E.A.'
72
- @poe.rename_if({ :first => 'E.A.' }, { :last => @poe.last, :first => @poe.first }).first.must_equal 'E.A.'
68
+ @poe.rename_if({ first: 'E.A.' }, last: @poe.last).first.must_equal 'E.A.'
69
+ @poe.rename_if({ first: 'E.A.' }, last: @poe.last, first: @poe.first).first.must_equal 'E.A.'
73
70
  end
74
71
 
75
72
  it 'renames the name to the given attributes if the block returns true' do
76
- @poe.rename_if({ :first => 'E.A.' }) {|n| true}.first.must_equal 'E.A.'
73
+ @poe.rename_if(first: 'E.A.') { |_n| true }.first.must_equal 'E.A.'
77
74
  end
78
75
 
79
76
  it 'does not rename the name to the given attributes if at least one condition does not match' do
80
- @poe.rename_if({ :first => 'E.A.' }, { :last => 'foo' }).first.wont_equal 'E.A.'
81
- @poe.rename_if({ :first => 'E.A.' }, { :last => 'foo', :first => @poe.first }).first.wont_equal 'E.A.'
82
- @poe.rename_if({ :first => 'E.A.' }, { :last => @poe.last, :first => 'foo' }).first.wont_equal 'E.A.'
77
+ @poe.rename_if({ first: 'E.A.' }, last: 'foo').first.wont_equal 'E.A.'
78
+ @poe.rename_if({ first: 'E.A.' }, last: 'foo', first: @poe.first).first.wont_equal 'E.A.'
79
+ @poe.rename_if({ first: 'E.A.' }, last: @poe.last, first: 'foo').first.wont_equal 'E.A.'
83
80
  end
84
81
 
85
82
  it 'does not rename the name to the given attributes if the block returns false' do
86
- @poe.rename_if({ :first => 'E.A.' }) {|n| false}.first.wont_equal 'E.A.'
83
+ @poe.rename_if(first: 'E.A.') { |_n| false }.first.wont_equal 'E.A.'
87
84
  end
88
85
  end
89
86
 
@@ -96,73 +93,71 @@ module BibTeX
96
93
 
97
94
  it 'merges different names' do
98
95
  n1 = Names.new(@poe)
99
- n2 = Names.new(Name.new(:last => 'Plato'))
100
- assert_equal "#{@poe.to_s} and Plato", n1.merge!(n2).to_s
96
+ n2 = Names.new(Name.new(last: 'Plato'))
97
+ assert_equal "#{@poe} and Plato", n1.merge!(n2).to_s
101
98
  end
102
99
  end
103
100
 
104
101
  describe '#normalize_initials' do
105
102
  it 'returns normalized initials of existing initials only' do
106
- Name.new(:first => 'Edgar A.', :last => 'Poe').normalize_initials.must_equal 'Edgar A.'
107
- Name.new(:first => 'E.A.', :last => 'Poe').normalize_initials.must_equal 'E.A.'
108
- Name.new(:first => 'E. A.', :last => 'Poe').normalize_initials.must_equal 'E.A.'
109
- Name.new(:first => 'E. A', :last => 'Poe').normalize_initials.must_equal 'E.A.'
110
- Name.new(:first => 'E A', :last => 'Poe').normalize_initials.must_equal 'E.A.'
111
- Name.new(:first => 'Edgar A P', :last => 'Poe').normalize_initials.must_equal 'Edgar A.P.'
103
+ Name.new(first: 'Edgar A.', last: 'Poe').normalize_initials.must_equal 'Edgar A.'
104
+ Name.new(first: 'E.A.', last: 'Poe').normalize_initials.must_equal 'E.A.'
105
+ Name.new(first: 'E. A.', last: 'Poe').normalize_initials.must_equal 'E.A.'
106
+ Name.new(first: 'E. A', last: 'Poe').normalize_initials.must_equal 'E.A.'
107
+ Name.new(first: 'E A', last: 'Poe').normalize_initials.must_equal 'E.A.'
108
+ Name.new(first: 'Edgar A P', last: 'Poe').normalize_initials.must_equal 'Edgar A.P.'
112
109
  end
113
110
  end
114
111
 
115
112
  describe '#extend_initials' do
116
113
  it 'extends the first name if the last name and initials match' do
117
- Name.new(:first => 'E.A.', :last => 'Poe').extend_initials('Edgar Allen', 'Poe').first.must_equal 'Edgar Allen'
118
- Name.new(:first => 'Edgar A.', :last => 'Poe').extend_initials('Edgar Allen', 'Poe').first.must_equal 'Edgar Allen'
119
- Name.new(:first => 'E. A.', :last => 'Poe').extend_initials('Edgar Allen', 'Poe').first.must_equal 'Edgar Allen'
120
- Name.new(:first => 'E. A', :last => 'Poe').extend_initials('Edgar Allen', 'Poe').first.must_equal 'Edgar Allen'
121
- Name.new(:first => 'E A', :last => 'Poe').extend_initials('Edgar Allen', 'Poe').first.must_equal 'Edgar Allen'
122
- Name.new(:first => 'E. Allen', :last => 'Poe').extend_initials('Edgar Allen', 'Poe').first.must_equal 'Edgar Allen'
123
- Name.new(:first => 'E.A.', :last => 'Poe').extend_initials('Edgar A.', 'Poe').first.must_equal 'Edgar A.'
114
+ Name.new(first: 'E.A.', last: 'Poe').extend_initials('Edgar Allen', 'Poe').first.must_equal 'Edgar Allen'
115
+ Name.new(first: 'Edgar A.', last: 'Poe').extend_initials('Edgar Allen', 'Poe').first.must_equal 'Edgar Allen'
116
+ Name.new(first: 'E. A.', last: 'Poe').extend_initials('Edgar Allen', 'Poe').first.must_equal 'Edgar Allen'
117
+ Name.new(first: 'E. A', last: 'Poe').extend_initials('Edgar Allen', 'Poe').first.must_equal 'Edgar Allen'
118
+ Name.new(first: 'E A', last: 'Poe').extend_initials('Edgar Allen', 'Poe').first.must_equal 'Edgar Allen'
119
+ Name.new(first: 'E. Allen', last: 'Poe').extend_initials('Edgar Allen', 'Poe').first.must_equal 'Edgar Allen'
120
+ Name.new(first: 'E.A.', last: 'Poe').extend_initials('Edgar A.', 'Poe').first.must_equal 'Edgar A.'
124
121
 
125
- Name.new(:first => 'Edgar-A.', :last => 'Poe').extend_initials('Edgar-Allen', 'Poe').first.must_equal 'Edgar-Allen'
126
- Name.new(:first => 'E.-Allen', :last => 'Poe').extend_initials('Edgar-Allen', 'Poe').first.must_equal 'Edgar-Allen'
127
- Name.new(:first => 'E.-A.', :last => 'Poe').extend_initials('Edgar-Allen', 'Poe').first.must_equal 'Edgar-Allen'
128
- Name.new(:first => 'E.-A', :last => 'Poe').extend_initials('Edgar-Allen', 'Poe').first.must_equal 'Edgar-Allen'
129
- Name.new(:first => 'E-A', :last => 'Poe').extend_initials('Edgar-Allen', 'Poe').first.must_equal 'Edgar-Allen'
122
+ Name.new(first: 'Edgar-A.', last: 'Poe').extend_initials('Edgar-Allen', 'Poe').first.must_equal 'Edgar-Allen'
123
+ Name.new(first: 'E.-Allen', last: 'Poe').extend_initials('Edgar-Allen', 'Poe').first.must_equal 'Edgar-Allen'
124
+ Name.new(first: 'E.-A.', last: 'Poe').extend_initials('Edgar-Allen', 'Poe').first.must_equal 'Edgar-Allen'
125
+ Name.new(first: 'E.-A', last: 'Poe').extend_initials('Edgar-Allen', 'Poe').first.must_equal 'Edgar-Allen'
126
+ Name.new(first: 'E-A', last: 'Poe').extend_initials('Edgar-Allen', 'Poe').first.must_equal 'Edgar-Allen'
130
127
  end
131
128
 
132
129
  it 'extends the first name if the last name and initials name match with extra middle names' do
133
- Name.new(:first => 'E.', :last => 'Poe').extend_initials('Edgar Allen', 'Poe').first.must_equal 'Edgar Allen'
134
- Name.new(:first => 'E', :last => 'Poe').extend_initials('Edgar Allen', 'Poe').first.must_equal 'Edgar Allen'
135
- Name.new(:first => 'Edgar', :last => 'Poe').extend_initials('Edgar Allen', 'Poe').first.must_equal 'Edgar Allen'
130
+ Name.new(first: 'E.', last: 'Poe').extend_initials('Edgar Allen', 'Poe').first.must_equal 'Edgar Allen'
131
+ Name.new(first: 'E', last: 'Poe').extend_initials('Edgar Allen', 'Poe').first.must_equal 'Edgar Allen'
132
+ Name.new(first: 'Edgar', last: 'Poe').extend_initials('Edgar Allen', 'Poe').first.must_equal 'Edgar Allen'
136
133
 
137
- Name.new(:first => 'E.A.', :last => 'Poe').extend_initials('Edgar', 'Poe').first.must_equal 'E.A.'
138
- Name.new(:first => 'A.', :last => 'Poe').extend_initials('Edgar', 'Poe').first.must_equal 'A.'
134
+ Name.new(first: 'E.A.', last: 'Poe').extend_initials('Edgar', 'Poe').first.must_equal 'E.A.'
135
+ Name.new(first: 'A.', last: 'Poe').extend_initials('Edgar', 'Poe').first.must_equal 'A.'
139
136
  end
140
137
 
141
138
  it 'does not extend the first name if the last name or initials do not match' do
142
- Name.new(:first => 'E.A.', :last => 'Poe').extend_initials('Edgar Allen', 'Poser').first.wont_equal 'Edgar Allen'
143
- Name.new(:first => 'E.A.', :last => 'Poe').extend_initials('Edgar Ellen', 'Poe').first.wont_equal 'Edgar Ellen'
144
- Name.new(:first => 'E.R.', :last => 'Poe').extend_initials('Edgar Allen', 'Poe').first.wont_equal 'Edgar Allen'
139
+ Name.new(first: 'E.A.', last: 'Poe').extend_initials('Edgar Allen', 'Poser').first.wont_equal 'Edgar Allen'
140
+ Name.new(first: 'E.A.', last: 'Poe').extend_initials('Edgar Ellen', 'Poe').first.wont_equal 'Edgar Ellen'
141
+ Name.new(first: 'E.R.', last: 'Poe').extend_initials('Edgar Allen', 'Poe').first.wont_equal 'Edgar Allen'
145
142
  end
146
143
  end
147
144
 
148
- describe "conversions" do
145
+ describe 'conversions' do
149
146
  class UpcaseAll < BibTeX::Filter
150
- def apply (value)
147
+ def apply(value)
151
148
  value.upcase
152
149
  end
153
150
  end
154
151
 
155
- describe "#convert" do
156
- it "converts the value when given a filter instance" do
157
- Names.parse('Poe and Hawthorne').convert(UpcaseAll.instance).to_s.must_be :==, 'POE and HAWTHORNE'
152
+ describe '#convert' do
153
+ it 'converts the value when given a filter instance' do
154
+ Names.parse('Poe and Hawthorne').convert(UpcaseAll.instance).to_s.must_be :==, 'POE and HAWTHORNE'
158
155
  end
159
156
 
160
- it "converts LaTeX umlauts" do
161
- Names.parse("S{\\o}ren Kirkegaard and Emmanuel L\\'evinas").convert(:latex).to_s.must_be :==, 'Kirkegaard, Søren and Lévinas, Emmanuel'
162
- end
163
- end
164
- end
165
-
157
+ it 'converts LaTeX umlauts' do
158
+ Names.parse("S{\\o}ren Kirkegaard and Emmanuel L\\'evinas").convert(:latex).to_s.must_be :==, 'Kirkegaard, Søren and Lévinas, Emmanuel'
159
+ end
160
+ end
161
+ end
166
162
  end
167
-
168
163
  end
@@ -2,10 +2,9 @@ require 'helper.rb'
2
2
 
3
3
  module BibTeX
4
4
  class ParserTest < Minitest::Spec
5
-
6
5
  describe 'given a set of valid @entries' do
7
6
  before do
8
- @bib = Parser.new(:debug => false).parse(File.read(Test.fixtures(:entry)))
7
+ @bib = Parser.new(debug: false).parse(File.read(Test.fixtures(:entry)))
9
8
  end
10
9
 
11
10
  it 'returns a Bibliography instance' do
@@ -18,11 +17,11 @@ module BibTeX
18
17
  end
19
18
 
20
19
  it 'parses the key values' do
21
- assert_equal %w{ key:0 key:1 foo staudinger }, @bib.map(&:key)
20
+ assert_equal %w[key:0 key:1 foo staudinger], @bib.map(&:key)
22
21
  end
23
22
 
24
23
  it 'should parse the entry types' do
25
- assert_equal [:book, :article, :article, :commentary], @bib.map(&:type)
24
+ assert_equal %i[book article article commentary], @bib.map(&:type)
26
25
  end
27
26
 
28
27
  it 'should parse all values correctly' do
@@ -35,63 +34,62 @@ module BibTeX
35
34
  assert_equal 'American Library', @bib[:'key:0'].publisher
36
35
  assert_equal 'American Library', @bib[:'key:1'].publisher
37
36
 
38
- assert_equal %q[Selected \emph{Poetry} and `Tales'], @bib[:'key:0'].title
37
+ assert_equal %q(Selected \emph{Poetry} and `Tales'), @bib[:'key:0'].title
39
38
  assert_equal 'Tales and Sketches', @bib[:'key:1'].title
40
39
  end
41
40
  end
42
41
 
43
42
  describe 'key parsing' do
44
43
  it 'handles whitespace in keys' do
45
- input = "@Misc{George Martin06,title = {FEAST FOR CROWS}}"
46
- bib = Parser.new(:debug => false, :strict => false).parse(input)
47
- assert_equal "George Martin06", bib.first.key
44
+ input = '@Misc{George Martin06,title = {FEAST FOR CROWS}}'
45
+ bib = Parser.new(debug: false, strict: false).parse(input)
46
+ assert_equal 'George Martin06', bib.first.key
48
47
  assert bib[:"George Martin06"]
49
48
  end
50
49
 
51
50
  it 'handles plus symbols in keys' do
52
- input = "@Misc{foo+bar,title = {Foobar}}"
53
- bib = Parser.new(:debug => false, :strict => false).parse(input)
54
- assert_equal "foo+bar", bib.first.key
51
+ input = '@Misc{foo+bar,title = {Foobar}}'
52
+ bib = Parser.new(debug: false, strict: false).parse(input)
53
+ assert_equal 'foo+bar', bib.first.key
55
54
  assert bib[:"foo+bar"]
56
55
  end
57
56
 
58
57
  it 'allows semicolons in keys' do
59
- input = "@Misc{Gomez;,title = {Foobar}}"
60
- bib = Parser.new(:debug => false, :strict => false).parse(input)
61
- assert_equal "Gomez;", bib.first.key
58
+ input = '@Misc{Gomez;,title = {Foobar}}'
59
+ bib = Parser.new(debug: false, strict: false).parse(input)
60
+ assert_equal 'Gomez;', bib.first.key
62
61
  assert bib[:"Gomez;"]
63
62
  end
64
63
 
65
64
  it 'allows quotes in keys' do
66
- input = %|@Misc{Gomez'1",title = {Foobar}}|
67
- bib = Parser.new(:debug => false, :strict => false).parse(input)
68
- assert_equal %{Gomez'1"}, bib.first.key
65
+ input = %(@Misc{Gomez'1",title = {Foobar}})
66
+ bib = Parser.new(debug: false, strict: false).parse(input)
67
+ assert_equal %(Gomez'1"), bib.first.key
69
68
  assert bib[:"Gomez'1\""]
70
69
  end
71
70
 
72
71
  it 'fails when there is no cite-key' do
73
- input = "@misc{title = {Crime and Punishment}}"
72
+ input = '@misc{title = {Crime and Punishment}}'
74
73
  assert_raises ParseError do
75
- Parser.new(:debug => false, :strict => false).parse(input)
74
+ Parser.new(debug: false, strict: false).parse(input)
76
75
  end
77
76
  end
78
77
 
79
78
  it 'tolerates missing key with :allow_missing_keys set' do
80
- input = "@misc{title = {Crime and Punishment}}"
81
- assert_equal :misc, Parser.new({
82
- :debug => false, :strict => false, :allow_missing_keys => true
83
- }).parse(input)[0].type
79
+ input = '@misc{title = {Crime and Punishment}}'
80
+ assert_equal :misc, Parser.new(
81
+ debug: false, strict: false, allow_missing_keys: true
82
+ ).parse(input)[0].type
84
83
  end
85
84
  end
86
85
 
87
86
  describe 'backslashes and escape sequences' do
88
-
89
87
  it 'leaves backslashes intact' do
90
88
  Parser.new.parse(%q(@misc{key, title = "a backslash: \"}))[0].title.must_be :==, 'a backslash: \\'
91
89
  end
92
90
 
93
91
  it 'parses LaTeX escaped quotes {"}' do
94
- Parser.new.parse(%q(@misc{key, title = "{"}"}))[0].title.must_be :==, '{"}'
92
+ Parser.new.parse('@misc{key, title = "{"}"}')[0].title.must_be :==, '{"}'
95
93
  end
96
94
 
97
95
  it 'parses complex LaTeX markup' do
@@ -110,12 +108,11 @@ module BibTeX
110
108
  b.booktitle.must_be :==, "Perception et Intermodalit\\'{e}: Approches Actuelles De La Question De Molyneux"
111
109
  b.editor.to_s.must_be :==, 'Proust, Jo\"{e}lle'
112
110
  end
113
-
114
111
  end
115
112
 
116
113
  describe 'given a set of explicit and implicit comments' do
117
114
  before do
118
- @bib = Parser.new(:debug => false, :include => [:meta_content]).parse(File.read(Test.fixtures(:comment)))
115
+ @bib = Parser.new(debug: false, include: [:meta_content]).parse(File.read(Test.fixtures(:comment)))
119
116
  end
120
117
 
121
118
  it 'should parses all @comments' do
@@ -128,13 +125,13 @@ module BibTeX
128
125
 
129
126
  it 'should parse @comment content as string' do
130
127
  assert_equal ' A comment can contain pretty much anything ', @bib.comments[0].content
131
- assert_equal %Q[\n@string{ foo = "bar" }\n\n@string{ bar = "foo" }\n], @bib.comments[1].content
128
+ assert_equal %(\n@string{ foo = "bar" }\n\n@string{ bar = "foo" }\n), @bib.comments[1].content
132
129
  end
133
130
  end
134
131
 
135
132
  describe 'given a set of @preambles' do
136
133
  before do
137
- @bib = Parser.new(:debug => false).parse(File.read(Test.fixtures(:preamble)))
134
+ @bib = Parser.new(debug: false).parse(File.read(Test.fixtures(:preamble)))
138
135
  end
139
136
 
140
137
  it 'should parse all @preambles' do
@@ -150,8 +147,8 @@ module BibTeX
150
147
 
151
148
  describe 'given an entry containing a multi-line literals' do
152
149
  before do
153
- @braces = %Q[@TechReport{key,\n author = {Donald,\n Duck}\n}]
154
- @string = %Q[@TechReport{key,\n author = "Donald,\n Duck"\n}]
150
+ @braces = %(@TechReport{key,\n author = {Donald,\n Duck}\n})
151
+ @string = %(@TechReport{key,\n author = "Donald,\n Duck"\n})
155
152
  end
156
153
 
157
154
  it 'should parse string literals' do
@@ -161,18 +158,17 @@ module BibTeX
161
158
  it 'should parse braced literals' do
162
159
  refute_nil Parser.new.parse(@braces)[:key]
163
160
  end
164
-
165
161
  end
166
162
 
167
163
  describe 'year values' do
168
164
  it 'parses non-numeric year literals' do
169
165
  assert_equal 'to appear',
170
- Parser.new.parse("@article{x, year = {to appear}}")['x'].year.to_s
166
+ Parser.new.parse('@article{x, year = {to appear}}')['x'].year.to_s
171
167
  end
172
168
 
173
169
  it 'parses numeric year literals' do
174
170
  assert_equal 1993,
175
- Parser.new.parse("@article{x, year = { 1993 }}")['x'].year.to_i
171
+ Parser.new.parse('@article{x, year = { 1993 }}')['x'].year.to_i
176
172
  end
177
173
  end
178
174