bibtex-ruby 1.3.3 → 1.3.4
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.
Potentially problematic release.
This version of bibtex-ruby might be problematic. Click here for more details.
- data/Gemfile.lock +9 -5
- data/History.txt +5 -1
- data/Manifest +3 -1
- data/Rakefile +15 -3
- data/bibtex-ruby.gemspec +2 -0
- data/lib/bibtex/bibtex.y +1 -1
- data/lib/bibtex/lexer.rb +81 -89
- data/lib/bibtex/parser.rb +1 -1
- data/lib/bibtex/version.rb +1 -1
- data/test/benchmark.rb +74 -47
- data/{Bibliography.bib → test/fixtures/benchmark.bib} +0 -0
- data/test/profile.dot +130 -0
- data/test/profile.rb +29 -0
- metadata +28 -4
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
bibtex-ruby (1.3.
|
4
|
+
bibtex-ruby (1.3.4)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: http://rubygems.org/
|
@@ -11,15 +11,16 @@ GEM
|
|
11
11
|
watchr
|
12
12
|
builder (3.0.0)
|
13
13
|
columnize (0.3.2)
|
14
|
-
cucumber (0.10.
|
14
|
+
cucumber (0.10.5)
|
15
15
|
builder (>= 2.1.2)
|
16
16
|
diff-lcs (>= 1.1.2)
|
17
|
-
gherkin (
|
17
|
+
gherkin (~> 2.4.0)
|
18
18
|
json (>= 1.4.6)
|
19
19
|
term-ansicolor (>= 1.0.5)
|
20
20
|
diff-lcs (1.1.2)
|
21
|
-
gherkin (2.
|
21
|
+
gherkin (2.4.0)
|
22
22
|
json (>= 1.4.6)
|
23
|
+
gnuplot (2.3.6)
|
23
24
|
json (1.5.1)
|
24
25
|
linecache (0.43)
|
25
26
|
linecache19 (0.5.12)
|
@@ -30,7 +31,7 @@ GEM
|
|
30
31
|
mynyml-redgreen (0.7.1)
|
31
32
|
term-ansicolor (>= 1.0.4)
|
32
33
|
racc (1.4.6)
|
33
|
-
rake (0.9.
|
34
|
+
rake (0.9.2)
|
34
35
|
ruby-debug (0.10.4)
|
35
36
|
columnize (>= 0.1)
|
36
37
|
ruby-debug-base (~> 0.10.4.0)
|
@@ -44,6 +45,7 @@ GEM
|
|
44
45
|
columnize (>= 0.3.1)
|
45
46
|
linecache19 (>= 0.5.11)
|
46
47
|
ruby-debug-base19 (>= 0.11.19)
|
48
|
+
ruby-prof (0.10.7)
|
47
49
|
ruby_core_source (0.1.5)
|
48
50
|
archive-tar-minitar (>= 0.5.2)
|
49
51
|
term-ansicolor (1.0.5)
|
@@ -56,6 +58,7 @@ DEPENDENCIES
|
|
56
58
|
autowatchr (>= 0.1)
|
57
59
|
bibtex-ruby!
|
58
60
|
cucumber (>= 0.10)
|
61
|
+
gnuplot (>= 2.3)
|
59
62
|
json (>= 1.5)
|
60
63
|
mini_shoulda (>= 0.3)
|
61
64
|
mynyml-redgreen (>= 0.7)
|
@@ -63,3 +66,4 @@ DEPENDENCIES
|
|
63
66
|
rake (>= 0.8)
|
64
67
|
ruby-debug
|
65
68
|
ruby-debug19
|
69
|
+
ruby-prof (>= 0.10)
|
data/History.txt
CHANGED
data/Manifest
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
Bibliography.bib
|
2
1
|
Gemfile
|
3
2
|
Gemfile.lock
|
4
3
|
History.txt
|
@@ -61,6 +60,7 @@ test/bibtex/test_string.rb
|
|
61
60
|
test/bibtex/test_utilities.rb
|
62
61
|
test/bibtex/test_value.rb
|
63
62
|
test/fixtures
|
63
|
+
test/fixtures/benchmark.bib
|
64
64
|
test/fixtures/bibdesk.bib
|
65
65
|
test/fixtures/comment.bib
|
66
66
|
test/fixtures/decoret.bib
|
@@ -71,5 +71,7 @@ test/fixtures/no_bibtex.bib
|
|
71
71
|
test/fixtures/preamble.bib
|
72
72
|
test/fixtures/roundtrip.bib
|
73
73
|
test/helper.rb
|
74
|
+
test/profile.dot
|
75
|
+
test/profile.rb
|
74
76
|
test/test_bibtex.rb
|
75
77
|
test/test_export.rb
|
data/Rakefile
CHANGED
@@ -4,14 +4,14 @@ $LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
|
|
4
4
|
require 'rubygems'
|
5
5
|
require 'bundler/setup'
|
6
6
|
|
7
|
-
require 'rake'
|
8
7
|
require 'rake/clean'
|
9
8
|
require 'rake/testtask'
|
10
|
-
|
9
|
+
|
10
|
+
require 'rdoc/task'
|
11
11
|
|
12
12
|
require 'bibtex/version'
|
13
13
|
|
14
|
-
|
14
|
+
RDoc::Task.new(:rdoc_task) do |rd|
|
15
15
|
rd.main = 'README.md'
|
16
16
|
rd.title = "BibTeX-Ruby Documentation"
|
17
17
|
rd.rdoc_files.include('README.md',"lib/**/*.rb")
|
@@ -59,6 +59,18 @@ file 'lib/bibtex/name_parser.rb' => ['lib/bibtex/names.y'] do
|
|
59
59
|
sh 'racc -v -o lib/bibtex/name_parser.rb lib/bibtex/names.y'
|
60
60
|
end
|
61
61
|
|
62
|
+
desc 'Runs the benchmarks (and plots the results)'
|
63
|
+
task :benchmark => ['racc'] do
|
64
|
+
require File.expand_path('../test/benchmark.rb', __FILE__)
|
65
|
+
end
|
66
|
+
task :bm => ['benchmark']
|
67
|
+
|
68
|
+
desc 'Runs the profiler'
|
69
|
+
task :profile => ['racc'] do
|
70
|
+
require File.expand_path('../test/profile.rb', __FILE__)
|
71
|
+
end
|
72
|
+
|
73
|
+
|
62
74
|
desc 'Updates the Manifest file'
|
63
75
|
task :manifest => ['clean', 'racc'] do
|
64
76
|
m = File.open('Manifest', 'w')
|
data/bibtex-ruby.gemspec
CHANGED
@@ -25,6 +25,8 @@ Gem::Specification.new do |s|
|
|
25
25
|
s.add_development_dependency('autowatchr', ['>= 0.1'])
|
26
26
|
s.add_development_dependency('cucumber', ['>= 0.10'])
|
27
27
|
s.add_development_dependency('json', ['>= 1.5'])
|
28
|
+
s.add_development_dependency('ruby-prof', ['>= 0.10'])
|
29
|
+
s.add_development_dependency('gnuplot', ['>= 2.3'])
|
28
30
|
|
29
31
|
s.files = File.open('Manifest').readlines.map(&:chomp)
|
30
32
|
s.test_files = Dir.glob('test/**/test*.rb')
|
data/lib/bibtex/bibtex.y
CHANGED
data/lib/bibtex/lexer.rb
CHANGED
@@ -26,8 +26,11 @@ module BibTeX
|
|
26
26
|
#
|
27
27
|
class Lexer
|
28
28
|
|
29
|
-
attr_reader :
|
30
|
-
|
29
|
+
attr_reader :data, :options, :stack, :mode
|
30
|
+
|
31
|
+
DEFAULTS = { :include => [:errors], :strict => true }.freeze
|
32
|
+
|
33
|
+
|
31
34
|
#
|
32
35
|
# Creates a new instance. Possible options and their respective
|
33
36
|
# default values are:
|
@@ -41,27 +44,26 @@ module BibTeX
|
|
41
44
|
# expected to start after a new line (leading white space is permitted).
|
42
45
|
#
|
43
46
|
def initialize(options = {})
|
44
|
-
|
45
|
-
@
|
46
|
-
@options[:strict] = true unless @options.has_key?(:strict)
|
47
|
-
@src = nil
|
47
|
+
@options = DEFAULTS.merge(options)
|
48
|
+
@data = nil
|
48
49
|
end
|
49
50
|
|
50
51
|
# Sets the source for the lexical analysis and resets the internal state.
|
51
|
-
def
|
52
|
+
def data=(string)
|
52
53
|
@stack = []
|
53
54
|
@brace_level = 0
|
54
55
|
@mode = :meta
|
55
56
|
@active_object = nil
|
56
|
-
@
|
57
|
-
|
58
|
-
|
59
|
-
|
57
|
+
@data = StringScanner.new(string)
|
58
|
+
|
59
|
+
# @line_breaks = []
|
60
|
+
# @line_breaks << @data.pos until @data.scan_until(/\n|$/).empty?
|
61
|
+
# @data.reset
|
60
62
|
end
|
61
63
|
|
62
64
|
# Returns the line number at a given position in the source.
|
63
65
|
def line_number_at(index)
|
64
|
-
(@line_breaks.find_index { |n| n >= index } || 0) + 1
|
66
|
+
0 # (@line_breaks.find_index { |n| n >= index } || 0) + 1
|
65
67
|
end
|
66
68
|
|
67
69
|
# Returns the next token from the parse stack.
|
@@ -70,7 +72,7 @@ module BibTeX
|
|
70
72
|
end
|
71
73
|
|
72
74
|
def mode=(mode)
|
73
|
-
|
75
|
+
# Log.debug("Lexer: switching to #{mode} mode...")
|
74
76
|
|
75
77
|
@active_object = case
|
76
78
|
when [:comment,:string,:preamble,:entry].include?(mode) then mode
|
@@ -81,73 +83,63 @@ module BibTeX
|
|
81
83
|
@mode = mode
|
82
84
|
end
|
83
85
|
|
84
|
-
def mode
|
85
|
-
@mode
|
86
|
-
end
|
87
|
-
|
88
86
|
# Returns true if the lexer is currenty parsing a BibTeX object.
|
89
87
|
def bibtex_mode?
|
90
88
|
[:bibtex,:comment,:string,:preamble,:entry].include?(self.mode)
|
91
89
|
end
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
90
|
+
|
91
|
+
%w{ meta literal content }.each do |m|
|
92
|
+
define_method "#{m}_mode?" do
|
93
|
+
mode == m.to_sym
|
94
|
+
end
|
96
95
|
end
|
97
96
|
|
98
|
-
# Returns true if the lexer is currently parsing a braced-out expression.
|
99
|
-
def content_mode?
|
100
|
-
self.mode == :content
|
101
|
-
end
|
102
|
-
|
103
|
-
# Returns true if the lexer is currently parsing a string literal.
|
104
|
-
def literal_mode?
|
105
|
-
self.mode == :literal
|
106
|
-
end
|
107
|
-
|
108
97
|
# Returns true if the lexer is currently parsing the given object type.
|
109
|
-
def
|
98
|
+
def active?(object)
|
110
99
|
@active_object == object
|
111
100
|
end
|
112
101
|
|
102
|
+
# Returns true if the lexer is currently in strict mode.
|
103
|
+
def strict?; !!(@options[:strict]); end
|
104
|
+
|
113
105
|
# Pushes a value onto the parse stack.
|
114
106
|
def push(value)
|
115
107
|
case
|
116
108
|
when ([:CONTENT,:STRING_LITERAL].include?(value[0]) && value[0] == @stack.last[0])
|
117
109
|
@stack.last[1][0] << value[1]
|
118
|
-
@stack.last[1][1] = line_number_at(@
|
110
|
+
@stack.last[1][1] = line_number_at(@data.pos)
|
119
111
|
when value[0] == :ERROR
|
120
112
|
@stack.push(value) if @options[:include].include?(:errors)
|
121
113
|
leave_object
|
122
114
|
when value[0] == :META_CONTENT
|
123
115
|
if @options[:include].include?(:meta_content)
|
124
|
-
value[1] = [value[1], line_number_at(@
|
116
|
+
value[1] = [value[1], line_number_at(@data.pos)]
|
125
117
|
@stack.push(value)
|
126
118
|
end
|
127
119
|
else
|
128
|
-
value[1] = [value[1], line_number_at(@
|
120
|
+
value[1] = [value[1], line_number_at(@data.pos)]
|
129
121
|
@stack.push(value)
|
130
122
|
end
|
131
|
-
|
123
|
+
self
|
132
124
|
end
|
133
125
|
|
134
126
|
# Start the lexical analysis.
|
135
|
-
def analyse(
|
136
|
-
raise(ArgumentError, 'Lexer: failed to start analysis: no source given!') if
|
127
|
+
def analyse(data=nil)
|
128
|
+
raise(ArgumentError, 'Lexer: failed to start analysis: no source given!') if data.nil? && @data.nil?
|
137
129
|
Log.debug('Lexer: starting lexical analysis...')
|
138
130
|
|
139
|
-
self.
|
140
|
-
|
131
|
+
self.data = data || @data.string
|
132
|
+
@data.reset
|
141
133
|
|
142
|
-
until
|
134
|
+
until @data.eos?
|
143
135
|
case
|
144
|
-
when
|
136
|
+
when bibtex_mode?
|
145
137
|
parse_bibtex
|
146
|
-
when
|
138
|
+
when meta_mode?
|
147
139
|
parse_meta
|
148
|
-
when
|
140
|
+
when content_mode?
|
149
141
|
parse_content
|
150
|
-
when
|
142
|
+
when literal_mode?
|
151
143
|
parse_literal
|
152
144
|
end
|
153
145
|
end
|
@@ -158,53 +150,53 @@ module BibTeX
|
|
158
150
|
|
159
151
|
def parse_bibtex
|
160
152
|
case
|
161
|
-
when
|
162
|
-
when
|
153
|
+
when @data.scan(/[\t\r\n\s]+/o)
|
154
|
+
when @data.scan(/\{/o)
|
163
155
|
@brace_level += 1
|
164
156
|
push [:LBRACE,'{']
|
165
|
-
if (@brace_level == 1 &&
|
157
|
+
if (@brace_level == 1 && active?(:comment)) || (@brace_level == 2 && active?(:entry))
|
166
158
|
self.mode = :content
|
167
159
|
end
|
168
|
-
when
|
160
|
+
when @data.scan(/\}/o)
|
169
161
|
return error_unbalanced_braces if @brace_level < 1
|
170
162
|
@brace_level -= 1
|
171
163
|
push [:RBRACE,'}']
|
172
164
|
leave_object if @brace_level == 0
|
173
|
-
when
|
165
|
+
when @data.scan( /=/o)
|
174
166
|
push [:EQ,'=']
|
175
|
-
when
|
167
|
+
when @data.scan(/,/o)
|
176
168
|
push [:COMMA,',']
|
177
|
-
when
|
169
|
+
when @data.scan(/#/o)
|
178
170
|
push [:SHARP,'#']
|
179
|
-
when
|
180
|
-
push [:NUMBER
|
181
|
-
when
|
182
|
-
push [:NAME
|
183
|
-
when
|
171
|
+
when @data.scan(/\d+/o)
|
172
|
+
push [:NUMBER,@data.matched]
|
173
|
+
when @data.scan(/[a-z\d\/:_!$\.%&*-]+/io)
|
174
|
+
push [:NAME,@data.matched]
|
175
|
+
when @data.scan(/"/o)
|
184
176
|
self.mode = :literal
|
185
|
-
when
|
177
|
+
when @data.scan(/@/o)
|
186
178
|
error_unexpected_token
|
187
179
|
enter_object
|
188
|
-
when
|
180
|
+
when @data.scan(/./o)
|
189
181
|
error_unexpected_token
|
190
182
|
enter_object
|
191
183
|
end
|
192
184
|
end
|
193
185
|
|
194
186
|
def parse_meta
|
195
|
-
match =
|
196
|
-
unless
|
187
|
+
match = @data.scan_until(strict? ? /@[\t ]*/o : /(^|\n)[\t ]*@[\t ]*/o)
|
188
|
+
unless @data.matched.nil?
|
197
189
|
push [:META_CONTENT, match.chop]
|
198
190
|
enter_object
|
199
191
|
else
|
200
|
-
push [:META_CONTENT
|
201
|
-
|
192
|
+
push [:META_CONTENT,@data.rest]
|
193
|
+
@data.terminate
|
202
194
|
end
|
203
195
|
end
|
204
196
|
|
205
197
|
def parse_content
|
206
|
-
match =
|
207
|
-
case
|
198
|
+
match = @data.scan_until(/\{|\}/o)
|
199
|
+
case @data.matched
|
208
200
|
when '{'
|
209
201
|
@brace_level += 1
|
210
202
|
push [:CONTENT,match]
|
@@ -218,7 +210,7 @@ module BibTeX
|
|
218
210
|
push [:CONTENT,match.chop]
|
219
211
|
push [:RBRACE,'}']
|
220
212
|
leave_object
|
221
|
-
when @brace_level == 1 &&
|
213
|
+
when @brace_level == 1 && active?(:entry)
|
222
214
|
push [:CONTENT,match.chop]
|
223
215
|
push [:RBRACE,'}']
|
224
216
|
self.mode = :bibtex
|
@@ -226,15 +218,15 @@ module BibTeX
|
|
226
218
|
push [:CONTENT, match]
|
227
219
|
end
|
228
220
|
else
|
229
|
-
push [:CONTENT
|
230
|
-
|
221
|
+
push [:CONTENT,@data.rest]
|
222
|
+
@data.terminate
|
231
223
|
error_unterminated_content
|
232
224
|
end
|
233
225
|
end
|
234
226
|
|
235
227
|
def parse_literal
|
236
|
-
match =
|
237
|
-
case
|
228
|
+
match = @data.scan_until(/[\{\}"\n]/o)
|
229
|
+
case @data.matched
|
238
230
|
when '{'
|
239
231
|
@brace_level += 1
|
240
232
|
push [:STRING_LITERAL,match]
|
@@ -257,8 +249,8 @@ module BibTeX
|
|
257
249
|
push [:STRING_LITERAL,match.chop]
|
258
250
|
error_unterminated_string
|
259
251
|
else
|
260
|
-
push [:STRING_LITERAL,self.
|
261
|
-
|
252
|
+
push [:STRING_LITERAL,self.data.rest]
|
253
|
+
@data.terminate
|
262
254
|
error_unterminated_string
|
263
255
|
end
|
264
256
|
end
|
@@ -270,18 +262,18 @@ module BibTeX
|
|
270
262
|
push [:AT,'@']
|
271
263
|
|
272
264
|
case
|
273
|
-
when
|
265
|
+
when @data.scan(/string/io)
|
274
266
|
self.mode = :string
|
275
|
-
push [:STRING,
|
276
|
-
when
|
267
|
+
push [:STRING, @data.matched]
|
268
|
+
when @data.scan(/preamble/io)
|
277
269
|
self.mode = :preamble
|
278
|
-
push [:PREAMBLE, self.
|
279
|
-
when
|
270
|
+
push [:PREAMBLE, self.data.matched]
|
271
|
+
when @data.scan(/comment/io)
|
280
272
|
self.mode = :comment
|
281
|
-
push [:COMMENT, self.
|
282
|
-
when
|
273
|
+
push [:COMMENT, self.data.matched]
|
274
|
+
when @data.scan(/[a-z\d:_!\.$%&*-]+/io)
|
283
275
|
self.mode = :entry
|
284
|
-
push [:NAME,
|
276
|
+
push [:NAME, @data.matched]
|
285
277
|
end
|
286
278
|
end
|
287
279
|
|
@@ -293,27 +285,27 @@ module BibTeX
|
|
293
285
|
|
294
286
|
|
295
287
|
def error_unbalanced_braces
|
296
|
-
n = line_number_at(
|
288
|
+
n = line_number_at(@data.pos)
|
297
289
|
Log.warn("Lexer: unbalanced braces on line #{n}; brace level #{@brace_level}; mode #{@mode.inspect}.")
|
298
|
-
backtrace [:E_UNBALANCED_BRACES, [self.
|
290
|
+
backtrace [:E_UNBALANCED_BRACES, [self.data.matched,n]]
|
299
291
|
end
|
300
292
|
|
301
293
|
def error_unterminated_string
|
302
|
-
n = line_number_at(
|
294
|
+
n = line_number_at(@data.pos)
|
303
295
|
Log.warn("Lexer: unterminated string on line #{n}; brace level #{@brace_level}; mode #{@mode.inspect}.")
|
304
|
-
backtrace [:E_UNTERMINATED_STRING, [
|
296
|
+
backtrace [:E_UNTERMINATED_STRING, [@data.matched,n]]
|
305
297
|
end
|
306
298
|
|
307
299
|
def error_unterminated_content
|
308
|
-
n = line_number_at(
|
300
|
+
n = line_number_at(@data.pos)
|
309
301
|
Log.warn("Lexer: unterminated content on line #{n}; brace level #{@brace_level}; mode #{@mode.inspect}.")
|
310
|
-
backtrace [:E_UNTERMINATED_CONTENT, [
|
302
|
+
backtrace [:E_UNTERMINATED_CONTENT, [@data.matched,n]]
|
311
303
|
end
|
312
304
|
|
313
305
|
def error_unexpected_token
|
314
|
-
n = line_number_at(
|
315
|
-
Log.warn("Lexer: unexpected token `#{
|
316
|
-
backtrace [:E_UNEXPECTED_TOKEN, [
|
306
|
+
n = line_number_at(@data.pos)
|
307
|
+
Log.warn("Lexer: unexpected token `#{@data.matched}' on line #{n}; brace level #{@brace_level}; mode #{@mode.inspect}.")
|
308
|
+
backtrace [:E_UNEXPECTED_TOKEN, [@data.matched,n]]
|
317
309
|
end
|
318
310
|
|
319
311
|
def backtrace(error)
|
data/lib/bibtex/parser.rb
CHANGED
data/lib/bibtex/version.rb
CHANGED
data/test/benchmark.rb
CHANGED
@@ -1,52 +1,79 @@
|
|
1
1
|
require File.expand_path('../../lib/bibtex.rb', __FILE__)
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
END
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'bundler/setup'
|
5
|
+
|
6
|
+
require 'benchmark'
|
7
|
+
include Benchmark
|
8
|
+
|
9
|
+
# data = File.open(BibTeX::Test.fixtures(:benchmark)).read
|
10
|
+
|
11
|
+
input = <<-END
|
12
|
+
@book{pickaxe,
|
13
|
+
Address = {Raleigh, North Carolina},
|
14
|
+
Author = {Thomas, Dave, and Fowler, Chad, and Hunt, Andy},
|
15
|
+
Date-Added = {2010-08-05 09:54:07 +0200},
|
16
|
+
Date-Modified = {2010-08-05 10:07:01 +0200},
|
17
|
+
Keywords = {ruby},
|
18
|
+
Publisher = {The Pragmatic Bookshelf},
|
19
|
+
Series = {The Facets of Ruby},
|
20
|
+
Title = {Programming Ruby 1.9: The Pragmatic Programmer's Guide},
|
21
|
+
Year = {2009}
|
22
|
+
}
|
23
|
+
END
|
24
|
+
|
25
|
+
n, k = 1001, 20
|
26
|
+
lexer = BibTeX::Lexer.new
|
27
|
+
|
28
|
+
f = []
|
29
|
+
g = []
|
30
|
+
|
31
|
+
Benchmark.benchmark((" "*15) + CAPTION, 7, FMTSTR, '%14s:' % 'sum(f)', '%14s:' % 'sum(g)') do |b|
|
32
|
+
|
33
|
+
1.step(n,k) do |i|
|
34
|
+
|
35
|
+
f << b.report('%14s:' % "f(#{i})") do
|
36
|
+
i.times do
|
37
|
+
lexer.data = input
|
38
|
+
lexer.analyse
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
data = input * i
|
43
|
+
|
44
|
+
g << b.report('%14s:' % "g(#{i})") do
|
45
|
+
lexer.data = data
|
46
|
+
lexer.analyse
|
48
47
|
end
|
48
|
+
|
49
49
|
end
|
50
|
+
|
51
|
+
[f.inject(:+), g.inject(:+)]
|
50
52
|
end
|
51
53
|
|
52
|
-
|
54
|
+
require 'gnuplot'
|
55
|
+
|
56
|
+
f = f.map(&:total)
|
57
|
+
g = g.map(&:total)
|
58
|
+
|
59
|
+
x = 1.step(n,k).to_a
|
60
|
+
|
61
|
+
Gnuplot.open do |gp|
|
62
|
+
Gnuplot::Plot.new(gp) do |plot|
|
63
|
+
|
64
|
+
plot.title 'BibTeX-Ruby Benchmark'
|
65
|
+
plot.ylabel 't'
|
66
|
+
plot.xlabel 'n'
|
67
|
+
|
68
|
+
plot.data << Gnuplot::DataSet.new([x,f]) do |ds|
|
69
|
+
ds.with = 'linespoints'
|
70
|
+
ds.title = 'f'
|
71
|
+
end
|
72
|
+
|
73
|
+
plot.data << Gnuplot::DataSet.new([x,g]) do |ds|
|
74
|
+
ds.with = 'linespoints'
|
75
|
+
ds.title = 'g'
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
end
|
File without changes
|
data/test/profile.dot
ADDED
@@ -0,0 +1,130 @@
|
|
1
|
+
digraph "Profile" {
|
2
|
+
label="PROCESS_TIME >=5%\nTotal: 2.810879";
|
3
|
+
labelloc=t;
|
4
|
+
labeljust=l;
|
5
|
+
subgraph "Thread 2151955260" {
|
6
|
+
2157659280 [label="parse_names\n(9%)"];
|
7
|
+
2157659280 -> 2157643080 [label="50/3353" fontsize=10 fontcolor="#666666"];
|
8
|
+
2157659200 [label="call\n(9%)"];
|
9
|
+
2157659200 -> 2157659280 [label="50/50" fontsize=10 fontcolor="#666666"];
|
10
|
+
2157656740 [label="matches?\n(7%)"];
|
11
|
+
2157656220 [label="each\n(9%)"];
|
12
|
+
2157656220 -> 2157643080 [label="52/3353" fontsize=10 fontcolor="#666666"];
|
13
|
+
2157655660 [label="select\n(9%)"];
|
14
|
+
2157655660 -> 2157656220 [label="52/52" fontsize=10 fontcolor="#666666"];
|
15
|
+
2157652320 [label="query\n(9%)"];
|
16
|
+
2157652320 -> 2157655660 [label="52/52" fontsize=10 fontcolor="#666666"];
|
17
|
+
2157651980 [label="parse_names\n(9%)"];
|
18
|
+
2157651980 -> 2157652320 [label="1/52" fontsize=10 fontcolor="#666666"];
|
19
|
+
2157643080 [label="each\n(10%)"];
|
20
|
+
2157643080 -> 2157659200 [label="100/100" fontsize=10 fontcolor="#666666"];
|
21
|
+
2157643080 -> 2157656740 [label="2600/2600" fontsize=10 fontcolor="#666666"];
|
22
|
+
2157643080 -> 2157652320 [label="50/52" fontsize=10 fontcolor="#666666"];
|
23
|
+
2157634620 [label="parse_content\n(25%)"];
|
24
|
+
2157634620 -> 2157625160 [label="900/3002" fontsize=10 fontcolor="#666666"];
|
25
|
+
2157634260 [label="parse_bibtex\n(55%)"];
|
26
|
+
2157634260 -> 2157625160 [label="1950/3002" fontsize=10 fontcolor="#666666"];
|
27
|
+
2157626660 [label="find_index\n(75%)"];
|
28
|
+
2157626440 [label="line_number_at\n(75%)"];
|
29
|
+
2157626440 -> 2157626660 [label="2951/2951" fontsize=10 fontcolor="#666666"];
|
30
|
+
2157625160 [label="push\n(78%)"];
|
31
|
+
2157625160 -> 2157626440 [label="2951/2951" fontsize=10 fontcolor="#666666"];
|
32
|
+
2157618760 [label="analyse\n(86%)"];
|
33
|
+
2157618760 -> 2157634260 [label="3350/3350" fontsize=10 fontcolor="#666666"];
|
34
|
+
2157618760 -> 2157634620 [label="450/450" fontsize=10 fontcolor="#666666"];
|
35
|
+
2157618760 -> 2157625160 [label="1/3002" fontsize=10 fontcolor="#666666"];
|
36
|
+
2157616120 [label="parse\n(90%)"];
|
37
|
+
2157616120 -> 2157618760 [label="1/1" fontsize=10 fontcolor="#666666"];
|
38
|
+
2157613960 [label="parse\n(100%)"];
|
39
|
+
2157613960 -> 2157616120 [label="1/1" fontsize=10 fontcolor="#666666"];
|
40
|
+
2157613960 -> 2157651980 [label="1/1" fontsize=10 fontcolor="#666666"];
|
41
|
+
2157613840 [label="parse\n(100%)"];
|
42
|
+
2157613840 -> 2157613960 [label="1/1" fontsize=10 fontcolor="#666666"];
|
43
|
+
2157613760 [label="[No method]\n(100%)"];
|
44
|
+
2157613760 -> 2157613840 [label="1/1" fontsize=10 fontcolor="#666666"];
|
45
|
+
}
|
46
|
+
subgraph cluster_2159557740 {
|
47
|
+
label = "Global";
|
48
|
+
fontcolor = "#666666";
|
49
|
+
fontsize = 16;
|
50
|
+
color = "#666666";
|
51
|
+
2157613760;
|
52
|
+
}
|
53
|
+
subgraph cluster_2159558100 {
|
54
|
+
label = "<Module::BibTeX>";
|
55
|
+
fontcolor = "#666666";
|
56
|
+
fontsize = 16;
|
57
|
+
color = "#666666";
|
58
|
+
2157613840;
|
59
|
+
}
|
60
|
+
subgraph cluster_2159572300 {
|
61
|
+
label = "<Class::BibTeX::Bibliography>";
|
62
|
+
fontcolor = "#666666";
|
63
|
+
fontsize = 16;
|
64
|
+
color = "#666666";
|
65
|
+
2157613960;
|
66
|
+
}
|
67
|
+
subgraph cluster_2159574340 {
|
68
|
+
label = "BibTeX::Parser";
|
69
|
+
fontcolor = "#666666";
|
70
|
+
fontsize = 16;
|
71
|
+
color = "#666666";
|
72
|
+
2157616120;
|
73
|
+
}
|
74
|
+
subgraph cluster_2159578300 {
|
75
|
+
label = "BibTeX::Lexer";
|
76
|
+
fontcolor = "#666666";
|
77
|
+
fontsize = 16;
|
78
|
+
color = "#666666";
|
79
|
+
2157618760;
|
80
|
+
2157625160;
|
81
|
+
2157626440;
|
82
|
+
2157634260;
|
83
|
+
2157634620;
|
84
|
+
}
|
85
|
+
subgraph cluster_2159613500 {
|
86
|
+
label = "Array";
|
87
|
+
fontcolor = "#666666";
|
88
|
+
fontsize = 16;
|
89
|
+
color = "#666666";
|
90
|
+
2157626660;
|
91
|
+
2157643080;
|
92
|
+
}
|
93
|
+
subgraph cluster_2159621220 {
|
94
|
+
label = "BibTeX::Entry";
|
95
|
+
fontcolor = "#666666";
|
96
|
+
fontsize = 16;
|
97
|
+
color = "#666666";
|
98
|
+
2157659280;
|
99
|
+
}
|
100
|
+
subgraph cluster_2159625420 {
|
101
|
+
label = "BibTeX::Bibliography";
|
102
|
+
fontcolor = "#666666";
|
103
|
+
fontsize = 16;
|
104
|
+
color = "#666666";
|
105
|
+
2157651980;
|
106
|
+
2157652320;
|
107
|
+
2157656220;
|
108
|
+
}
|
109
|
+
subgraph cluster_2159645280 {
|
110
|
+
label = "BibTeX::Element";
|
111
|
+
fontcolor = "#666666";
|
112
|
+
fontsize = 16;
|
113
|
+
color = "#666666";
|
114
|
+
2157656740;
|
115
|
+
}
|
116
|
+
subgraph cluster_2159651300 {
|
117
|
+
label = "Enumerable";
|
118
|
+
fontcolor = "#666666";
|
119
|
+
fontsize = 16;
|
120
|
+
color = "#666666";
|
121
|
+
2157655660;
|
122
|
+
}
|
123
|
+
subgraph cluster_2159654320 {
|
124
|
+
label = "Proc";
|
125
|
+
fontcolor = "#666666";
|
126
|
+
fontsize = 16;
|
127
|
+
color = "#666666";
|
128
|
+
2157659200;
|
129
|
+
}
|
130
|
+
}
|
data/test/profile.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
require File.expand_path('../../lib/bibtex.rb', __FILE__)
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'bundler/setup'
|
5
|
+
|
6
|
+
require 'ruby-prof'
|
7
|
+
|
8
|
+
data = <<-END
|
9
|
+
@book{pickaxe,
|
10
|
+
Address = {Raleigh, North Carolina},
|
11
|
+
Author = {Thomas, Dave, and Fowler, Chad, and Hunt, Andy},
|
12
|
+
Date-Added = {2010-08-05 09:54:07 +0200},
|
13
|
+
Date-Modified = {2010-08-05 10:07:01 +0200},
|
14
|
+
Keywords = {ruby},
|
15
|
+
Publisher = {The Pragmatic Bookshelf},
|
16
|
+
Series = {The Facets of Ruby},
|
17
|
+
Title = {Programming Ruby 1.9: The Pragmatic Programmer's Guide},
|
18
|
+
Year = {2009}
|
19
|
+
}
|
20
|
+
END
|
21
|
+
|
22
|
+
data = data * 50
|
23
|
+
|
24
|
+
result = RubyProf.profile do
|
25
|
+
BibTeX.parse(data)
|
26
|
+
end
|
27
|
+
|
28
|
+
printer = RubyProf::DotPrinter.new(result)
|
29
|
+
printer.print(File.open(File.expand_path('../profile.dot', __FILE__), 'w'), :min_percent => 5)
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: bibtex-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 1.3.
|
5
|
+
version: 1.3.4
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Sylvester Keil
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-06-
|
13
|
+
date: 2011-06-07 00:00:00 +02:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -90,6 +90,28 @@ dependencies:
|
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: *id007
|
93
|
+
- !ruby/object:Gem::Dependency
|
94
|
+
name: ruby-prof
|
95
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
96
|
+
none: false
|
97
|
+
requirements:
|
98
|
+
- - ">="
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
version: "0.10"
|
101
|
+
type: :development
|
102
|
+
prerelease: false
|
103
|
+
version_requirements: *id008
|
104
|
+
- !ruby/object:Gem::Dependency
|
105
|
+
name: gnuplot
|
106
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
107
|
+
none: false
|
108
|
+
requirements:
|
109
|
+
- - ">="
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: "2.3"
|
112
|
+
type: :development
|
113
|
+
prerelease: false
|
114
|
+
version_requirements: *id009
|
93
115
|
description: A (fairly complete) BibTeX library and parser written in Ruby. Includes a name parser and supports regular BibTeX entries, @comments, string replacement via @string. Allows for easy export/conversion to formats such as YAML, JSON, and XML.
|
94
116
|
email: http://sylvester.keil.or.at
|
95
117
|
executables: []
|
@@ -99,7 +121,6 @@ extensions: []
|
|
99
121
|
extra_rdoc_files:
|
100
122
|
- README.md
|
101
123
|
files:
|
102
|
-
- Bibliography.bib
|
103
124
|
- Gemfile
|
104
125
|
- Gemfile.lock
|
105
126
|
- History.txt
|
@@ -152,6 +173,7 @@ files:
|
|
152
173
|
- test/bibtex/test_string.rb
|
153
174
|
- test/bibtex/test_utilities.rb
|
154
175
|
- test/bibtex/test_value.rb
|
176
|
+
- test/fixtures/benchmark.bib
|
155
177
|
- test/fixtures/bibdesk.bib
|
156
178
|
- test/fixtures/comment.bib
|
157
179
|
- test/fixtures/decoret.bib
|
@@ -162,6 +184,8 @@ files:
|
|
162
184
|
- test/fixtures/preamble.bib
|
163
185
|
- test/fixtures/roundtrip.bib
|
164
186
|
- test/helper.rb
|
187
|
+
- test/profile.dot
|
188
|
+
- test/profile.rb
|
165
189
|
- test/test_bibtex.rb
|
166
190
|
- test/test_export.rb
|
167
191
|
has_rdoc: true
|
@@ -185,7 +209,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
185
209
|
requirements:
|
186
210
|
- - ">="
|
187
211
|
- !ruby/object:Gem::Version
|
188
|
-
hash:
|
212
|
+
hash: 1653592792088481803
|
189
213
|
segments:
|
190
214
|
- 0
|
191
215
|
version: "0"
|