rbib 2.0.1
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/Manifest +19 -0
- data/README.rdoc +19 -0
- data/Rakefile +14 -0
- data/examples/example.bib +753 -0
- data/examples/glom_citeulike.rb +23 -0
- data/examples/tara_no_url.rb +15 -0
- data/lib/bibtex.rb +9 -0
- data/lib/bibtex/bibliography.rb +46 -0
- data/lib/bibtex/entry.rb +89 -0
- data/lib/bibtex/field.rb +17 -0
- data/lib/bibtex/lexer.rb +123 -0
- data/lib/bibtex/parser.rb +116 -0
- data/rbib.gemspec +32 -0
- data/test/run_unit_tests.rb +15 -0
- data/test/test_bibliography.rb +76 -0
- data/test/test_entry.rb +70 -0
- data/test/test_field.rb +17 -0
- data/test/test_lexer.rb +116 -0
- data/test/test_parser.rb +27 -0
- metadata +102 -0
data/rbib.gemspec
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{rbib}
|
5
|
+
s.version = "2.0.1"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Nick Gasson, Aur\303\251lien Malisart", "Pjotr Prins"]
|
9
|
+
s.date = %q{2009-05-10}
|
10
|
+
s.description = %q{BibTeX parser written in Ruby}
|
11
|
+
s.email = %q{aurelien.malisart@gmail.com}
|
12
|
+
s.extra_rdoc_files = ["lib/bibtex/bibliography.rb", "lib/bibtex/entry.rb", "lib/bibtex/field.rb", "lib/bibtex/lexer.rb", "lib/bibtex/parser.rb", "lib/bibtex.rb", "README.rdoc"]
|
13
|
+
s.files = ["examples/example.bib", "examples/glom_citeulike.rb", "examples/tara_no_url.rb", "lib/bibtex/bibliography.rb", "lib/bibtex/entry.rb", "lib/bibtex/field.rb", "lib/bibtex/lexer.rb", "lib/bibtex/parser.rb", "lib/bibtex.rb", "Manifest", "Rakefile", "rbib.gemspec", "README.rdoc", "test/run_unit_tests.rb", "test/test_bibliography.rb", "test/test_entry.rb", "test/test_field.rb", "test/test_lexer.rb", "test/test_parser.rb"]
|
14
|
+
s.has_rdoc = true
|
15
|
+
s.homepage = %q{http://github.com/aurels/rbib}
|
16
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Rbib", "--main", "README.rdoc"]
|
17
|
+
s.require_paths = ["lib"]
|
18
|
+
s.rubyforge_project = %q{rbib}
|
19
|
+
s.rubygems_version = %q{1.3.1}
|
20
|
+
s.summary = %q{BibTeX parser written in Ruby}
|
21
|
+
s.test_files = ["test/test_bibliography.rb", "test/test_entry.rb", "test/test_field.rb", "test/test_lexer.rb", "test/test_parser.rb"]
|
22
|
+
|
23
|
+
if s.respond_to? :specification_version then
|
24
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
25
|
+
s.specification_version = 2
|
26
|
+
|
27
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
28
|
+
else
|
29
|
+
end
|
30
|
+
else
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
#
|
4
|
+
# Run all the unit tests in the current directory.
|
5
|
+
#
|
6
|
+
|
7
|
+
require 'test/unit'
|
8
|
+
|
9
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
10
|
+
require "bibtex"
|
11
|
+
|
12
|
+
Dir.glob(File.join(File.dirname(__FILE__), '..', 'test', 'test_*.rb')).each do |file|
|
13
|
+
require file
|
14
|
+
end
|
15
|
+
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'bibtex/bibliography'
|
2
|
+
require 'test/unit'
|
3
|
+
|
4
|
+
class TestBibliography < Test::Unit::TestCase
|
5
|
+
include Bibtex
|
6
|
+
|
7
|
+
def setup
|
8
|
+
@b = Bibliography.new
|
9
|
+
|
10
|
+
@foo01 = Entry.new(EntryType::Book, 'foo01')
|
11
|
+
@foo01.add_field :author, 'C. Doof'
|
12
|
+
@foo01.add_field :year, 2007
|
13
|
+
@foo01.add_field Field.new(:url, 'www.doof.me.uk')
|
14
|
+
|
15
|
+
@bar99 = Entry.new(EntryType::Article, 'bar99')
|
16
|
+
@bar99.add_field :author, 'N. Cakesniffer'
|
17
|
+
@bar99.add_field :year, 1999
|
18
|
+
@bar99.add_field Field.new(:url, 'www.cakesniffer.co.uk')
|
19
|
+
|
20
|
+
@b << @foo01
|
21
|
+
@b << @bar99
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_basic
|
25
|
+
assert_equal 2, @b.entries.length
|
26
|
+
assert_equal @foo01, @b['foo01']
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_map
|
30
|
+
expect = <<END
|
31
|
+
@article{bar99,
|
32
|
+
author = {N. Cakesniffer},
|
33
|
+
year = {1999}
|
34
|
+
}
|
35
|
+
|
36
|
+
@book{foo01,
|
37
|
+
author = {C. Doof},
|
38
|
+
year = {2007}
|
39
|
+
}
|
40
|
+
|
41
|
+
END
|
42
|
+
urlless = @b.map do |e|
|
43
|
+
e.reject_fields [:url]
|
44
|
+
end
|
45
|
+
assert_equal expect, urlless.to_s
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_to_s
|
49
|
+
expect = <<END
|
50
|
+
@article{bar99,
|
51
|
+
author = {N. Cakesniffer},
|
52
|
+
url = {www.cakesniffer.co.uk},
|
53
|
+
year = {1999}
|
54
|
+
}
|
55
|
+
|
56
|
+
@book{foo01,
|
57
|
+
author = {C. Doof},
|
58
|
+
url = {www.doof.me.uk},
|
59
|
+
year = {2007}
|
60
|
+
}
|
61
|
+
|
62
|
+
END
|
63
|
+
assert_equal expect, @b.to_s
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_save
|
67
|
+
fname = '/tmp/_test.bib'
|
68
|
+
@b.save fname
|
69
|
+
|
70
|
+
f = File.new(fname)
|
71
|
+
assert_equal @b.to_s, f.read
|
72
|
+
f.close
|
73
|
+
File.delete fname
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
data/test/test_entry.rb
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'bibtex/entry'
|
2
|
+
require 'test/unit'
|
3
|
+
|
4
|
+
class TestEntry < Test::Unit::TestCase
|
5
|
+
include Bibtex
|
6
|
+
|
7
|
+
def setup
|
8
|
+
@e = Entry.new(EntryType::Book, 'foo01')
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_basic
|
12
|
+
assert_equal EntryType::Book, @e.type
|
13
|
+
assert_equal 'foo01', @e.key
|
14
|
+
end
|
15
|
+
|
16
|
+
def add_default_fields
|
17
|
+
@e.add_field :author, 'C. Doof'
|
18
|
+
@e.add_field :year, 2007
|
19
|
+
@e.add_field Field.new(:url, 'www.doof.me.uk')
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_fields
|
23
|
+
add_default_fields
|
24
|
+
|
25
|
+
assert_equal 'C. Doof', @e[:author]
|
26
|
+
assert_equal 2007, @e[:year]
|
27
|
+
assert_equal 'www.doof.me.uk', @e[:url]
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_to_s
|
31
|
+
add_default_fields
|
32
|
+
|
33
|
+
expect = <<END
|
34
|
+
@book{foo01,
|
35
|
+
author = {C. Doof},
|
36
|
+
url = {www.doof.me.uk},
|
37
|
+
year = {2007}
|
38
|
+
}
|
39
|
+
|
40
|
+
END
|
41
|
+
assert_equal expect, @e.to_s
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_reject
|
45
|
+
add_default_fields
|
46
|
+
|
47
|
+
expect = <<END
|
48
|
+
@book{foo01,
|
49
|
+
author = {C. Doof},
|
50
|
+
year = {2007}
|
51
|
+
}
|
52
|
+
|
53
|
+
END
|
54
|
+
r = @e.reject_fields [:url]
|
55
|
+
assert_equal expect, r.to_s
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_select
|
59
|
+
add_default_fields
|
60
|
+
|
61
|
+
expect = <<END
|
62
|
+
@book{foo01,
|
63
|
+
url = {www.doof.me.uk}
|
64
|
+
}
|
65
|
+
|
66
|
+
END
|
67
|
+
r = @e.select_fields [:url]
|
68
|
+
assert_equal expect, r.to_s
|
69
|
+
end
|
70
|
+
end
|
data/test/test_field.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'bibtex/field'
|
2
|
+
require 'test/unit'
|
3
|
+
|
4
|
+
class TestField < Test::Unit::TestCase
|
5
|
+
include Bibtex
|
6
|
+
|
7
|
+
def test_basic
|
8
|
+
f = Field.new(:author, 'C. Doof')
|
9
|
+
assert_equal :author, f.key
|
10
|
+
assert_equal 'C. Doof', f.value
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_to_s
|
14
|
+
f = Field.new(:author, 'C. Doof')
|
15
|
+
assert_equal 'author = {C. Doof}', f.to_s
|
16
|
+
end
|
17
|
+
end
|
data/test/test_lexer.rb
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
require 'bibtex/lexer'
|
2
|
+
require 'test/unit'
|
3
|
+
|
4
|
+
class TestLexer < Test::Unit::TestCase
|
5
|
+
include Bibtex
|
6
|
+
|
7
|
+
def test_basic
|
8
|
+
l = Lexer.new do |rules|
|
9
|
+
rules.match /a/, :a
|
10
|
+
rules.match /b+/, :bs
|
11
|
+
rules.match /\s+/, :space
|
12
|
+
rules.match /hello/, :hello
|
13
|
+
end
|
14
|
+
l.feed 'aabbb hello'
|
15
|
+
|
16
|
+
assert_equal :a, l.next_token!
|
17
|
+
assert_equal :a, l.next_token!
|
18
|
+
assert_equal :bs, l.next_token!
|
19
|
+
assert_equal :space, l.next_token!
|
20
|
+
assert_equal :hello, l.peek_token
|
21
|
+
assert_equal 'hello', l.peek_lval
|
22
|
+
assert_equal :hello, l.next_token!
|
23
|
+
|
24
|
+
assert (not l.more_tokens?)
|
25
|
+
assert_raise LexerError do
|
26
|
+
l.next_token!
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_prec
|
31
|
+
l = Lexer.new do |rules|
|
32
|
+
rules.match /a/, :aye
|
33
|
+
rules.match /a+/, :bad
|
34
|
+
rules.match /.*/, :other
|
35
|
+
end
|
36
|
+
l.feed 'aa'
|
37
|
+
assert_equal :aye, l.next_token!
|
38
|
+
assert_equal :aye, l.next_token!
|
39
|
+
assert (not l.more_tokens?)
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_whitespace
|
43
|
+
l = Lexer.new(false) do |rules|
|
44
|
+
rules.match /\w+/, :word
|
45
|
+
end
|
46
|
+
l.feed " hello\t\n world "
|
47
|
+
|
48
|
+
assert (not l.ignore_whitespace)
|
49
|
+
l.ignore_whitespace = true
|
50
|
+
|
51
|
+
assert_equal :word, l.next_token!
|
52
|
+
assert_equal 'hello', l.lval
|
53
|
+
assert_equal :word, l.next_token!
|
54
|
+
assert_equal 'world', l.lval
|
55
|
+
assert (not l.more_tokens?)
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_src_pos
|
59
|
+
l = Lexer.new do |rules|
|
60
|
+
rules.match /a/, :a
|
61
|
+
rules.match /\n/, :newline
|
62
|
+
end
|
63
|
+
l.feed 'aaaab'
|
64
|
+
|
65
|
+
4.times { l.next_token! }
|
66
|
+
begin
|
67
|
+
l.next_token!
|
68
|
+
flunk 'No exception raised'
|
69
|
+
rescue LexerError => e
|
70
|
+
assert_kind_of SourcePos, e.src_pos
|
71
|
+
assert_equal 1, e.src_pos.line
|
72
|
+
assert_equal 4, e.src_pos.column
|
73
|
+
end
|
74
|
+
|
75
|
+
l.ignore_newlines = false
|
76
|
+
l.feed "aa\nab"
|
77
|
+
|
78
|
+
l.file_name = 'My File'
|
79
|
+
|
80
|
+
2.times { l.next_token! }
|
81
|
+
assert_equal :newline, l.next_token!
|
82
|
+
assert_equal :a, l.next_token!
|
83
|
+
begin
|
84
|
+
l.next_token!
|
85
|
+
flunk 'No error raised'
|
86
|
+
rescue LexerError => e
|
87
|
+
assert_equal 2, e.src_pos.line
|
88
|
+
assert_equal 1, e.src_pos.column
|
89
|
+
assert_equal 'My File', e.src_pos.file
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_literals
|
94
|
+
l = Lexer.new do |rules|
|
95
|
+
rules.literals [:aye, :bee]
|
96
|
+
end
|
97
|
+
l.feed 'ayebeebee'
|
98
|
+
|
99
|
+
assert_equal :aye, l.next_token!
|
100
|
+
assert_equal :bee, l.next_token!
|
101
|
+
assert_equal :bee, l.next_token!
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_refeed
|
105
|
+
l = Lexer.new do |rules|
|
106
|
+
rules.match /a/, :a
|
107
|
+
rules.match /b/, :b
|
108
|
+
end
|
109
|
+
l.feed 'aaa'
|
110
|
+
|
111
|
+
assert_equal :a, l.next_token!
|
112
|
+
l.feed 'bb'
|
113
|
+
assert l.more_tokens?
|
114
|
+
assert_equal :b, l.next_token!
|
115
|
+
end
|
116
|
+
end
|
data/test/test_parser.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'bibtex/parser'
|
2
|
+
require 'test/unit'
|
3
|
+
|
4
|
+
class TestParser < Test::Unit::TestCase
|
5
|
+
include Bibtex
|
6
|
+
|
7
|
+
def test_basic
|
8
|
+
b = Parser.parse 'examples/example.bib'
|
9
|
+
|
10
|
+
ryan98 = b['ryan98']
|
11
|
+
assert_kind_of Entry, ryan98
|
12
|
+
assert_equal EntryType::Article, ryan98.type
|
13
|
+
assert_equal 1998, ryan98[:year].to_i
|
14
|
+
|
15
|
+
heys01 = b['heys01']
|
16
|
+
assert_equal "March", heys01[:month]
|
17
|
+
assert_equal 2001, heys01[:year].to_i
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_parse_reparse
|
21
|
+
fname = '/tmp/example.bib.stripped'
|
22
|
+
b = Parser.parse 'examples/example.bib'
|
23
|
+
b.save fname
|
24
|
+
Parser.parse fname
|
25
|
+
File.delete fname
|
26
|
+
end
|
27
|
+
end
|
metadata
ADDED
@@ -0,0 +1,102 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rbib
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 13
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 2
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 2.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- "Nick Gasson, Aur\xC3\xA9lien Malisart"
|
14
|
+
- Pjotr Prins
|
15
|
+
autorequire:
|
16
|
+
bindir: bin
|
17
|
+
cert_chain: []
|
18
|
+
|
19
|
+
date: 2009-05-10 00:00:00 +02:00
|
20
|
+
default_executable:
|
21
|
+
dependencies: []
|
22
|
+
|
23
|
+
description: BibTeX parser written in Ruby
|
24
|
+
email: aurelien.malisart@gmail.com
|
25
|
+
executables: []
|
26
|
+
|
27
|
+
extensions: []
|
28
|
+
|
29
|
+
extra_rdoc_files:
|
30
|
+
- lib/bibtex/bibliography.rb
|
31
|
+
- lib/bibtex/entry.rb
|
32
|
+
- lib/bibtex/field.rb
|
33
|
+
- lib/bibtex/lexer.rb
|
34
|
+
- lib/bibtex/parser.rb
|
35
|
+
- lib/bibtex.rb
|
36
|
+
- README.rdoc
|
37
|
+
files:
|
38
|
+
- examples/example.bib
|
39
|
+
- examples/glom_citeulike.rb
|
40
|
+
- examples/tara_no_url.rb
|
41
|
+
- lib/bibtex/bibliography.rb
|
42
|
+
- lib/bibtex/entry.rb
|
43
|
+
- lib/bibtex/field.rb
|
44
|
+
- lib/bibtex/lexer.rb
|
45
|
+
- lib/bibtex/parser.rb
|
46
|
+
- lib/bibtex.rb
|
47
|
+
- Manifest
|
48
|
+
- Rakefile
|
49
|
+
- rbib.gemspec
|
50
|
+
- README.rdoc
|
51
|
+
- test/run_unit_tests.rb
|
52
|
+
- test/test_bibliography.rb
|
53
|
+
- test/test_entry.rb
|
54
|
+
- test/test_field.rb
|
55
|
+
- test/test_lexer.rb
|
56
|
+
- test/test_parser.rb
|
57
|
+
has_rdoc: true
|
58
|
+
homepage: http://github.com/aurels/rbib
|
59
|
+
licenses: []
|
60
|
+
|
61
|
+
post_install_message:
|
62
|
+
rdoc_options:
|
63
|
+
- --line-numbers
|
64
|
+
- --inline-source
|
65
|
+
- --title
|
66
|
+
- Rbib
|
67
|
+
- --main
|
68
|
+
- README.rdoc
|
69
|
+
require_paths:
|
70
|
+
- lib
|
71
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
73
|
+
requirements:
|
74
|
+
- - ">="
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
hash: 3
|
77
|
+
segments:
|
78
|
+
- 0
|
79
|
+
version: "0"
|
80
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ">="
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
hash: 11
|
86
|
+
segments:
|
87
|
+
- 1
|
88
|
+
- 2
|
89
|
+
version: "1.2"
|
90
|
+
requirements: []
|
91
|
+
|
92
|
+
rubyforge_project: rbib
|
93
|
+
rubygems_version: 1.4.1
|
94
|
+
signing_key:
|
95
|
+
specification_version: 2
|
96
|
+
summary: BibTeX parser written in Ruby
|
97
|
+
test_files:
|
98
|
+
- test/test_bibliography.rb
|
99
|
+
- test/test_entry.rb
|
100
|
+
- test/test_field.rb
|
101
|
+
- test/test_lexer.rb
|
102
|
+
- test/test_parser.rb
|