bibsync 0.0.2 → 0.0.3

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/.travis.yml CHANGED
@@ -6,5 +6,6 @@ rvm:
6
6
  - jruby-19mode
7
7
  - rbx-19mode
8
8
  before_install:
9
- - sudo apt-get install -qq poppler-utils
9
+ - sudo apt-get update -qq
10
+ - sudo apt-get install -qq poppler-utils jabref
10
11
 
@@ -0,0 +1,19 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!DOCTYPE preferences SYSTEM "http://java.sun.com/dtd/preferences.dtd">
3
+ <preferences EXTERNAL_XML_VERSION="1.0">
4
+ <root type="user">
5
+ <map/>
6
+ <node name="net">
7
+ <map/>
8
+ <node name="sf">
9
+ <map/>
10
+ <node name="jabref">
11
+ <map>
12
+ <entry key="exportInOriginalOrder" value="true"/>
13
+ <entry key="saveInOriginalOrder" value="true"/>
14
+ </map>
15
+ </node>
16
+ </node>
17
+ </node>
18
+ </root>
19
+ </preferences>
@@ -13,7 +13,7 @@ module BibSync
13
13
  if File.read(@bib.file, 80) !~ /JabRef/
14
14
  notice 'Transforming file with JabRef'
15
15
  tmp_file = "#{@bib.file}.tmp.bib"
16
- `jabref --nogui --import #{Shellwords.escape @bib.file} --output #{Shellwords.escape tmp_file} 2>&1 >/dev/null`
16
+ `jabref --primp #{Shellwords.escape File.join(File.dirname(__FILE__), 'jabref.xml')} --nogui --import #{Shellwords.escape @bib.file} --output #{Shellwords.escape tmp_file} 2>&1 >/dev/null`
17
17
  File.rename(tmp_file, @bib.file) if File.exists?(tmp_file)
18
18
  end
19
19
  end
@@ -25,7 +25,7 @@ module BibSync
25
25
  files.each do |key, file|
26
26
  unless entry = @bib[key]
27
27
  info('New file', key: key)
28
- entry = Bibliography::Entry.new(key: key)
28
+ entry = Entry.new(key: key)
29
29
  @bib << entry
30
30
  end
31
31
 
@@ -49,7 +49,7 @@ module BibSync
49
49
  info('Downloading DOI metadata', key: entry)
50
50
  text = fetch("http://dx.doi.org/#{entry[:doi]}", 'Accept' => 'text/bibliography; style=bibtex')
51
51
  raise text if text == 'Unknown DOI'
52
- Bibliography::Entry.parse(text).each {|k, v| entry[k] = v }
52
+ Entry.parse(text).each {|k, v| entry[k] = v }
53
53
  rescue => ex
54
54
  entry.delete(:doi)
55
55
  error('DOI download failed', key: entry, ex: ex)
@@ -112,7 +112,7 @@ module BibSync
112
112
  date = xml.xpath('//arXiv/updated').map(&:content).first || xml.xpath('//arXiv/created').map(&:content).first
113
113
  date = Date.parse(date)
114
114
  entry[:year] = date.year
115
- entry[:month] = Bibliography::RawValue.new(%w(jan feb mar apr may jun jul aug sep oct nov dec)[date.month - 1])
115
+ entry[:month] = Literal.new(%w(jan feb mar apr may jun jul aug sep oct nov dec)[date.month - 1])
116
116
  doi = xml.xpath('//arXiv/doi').map(&:content).first
117
117
  entry[:doi] = doi if doi
118
118
  journal = xml.xpath('//arXiv/journal-ref').map(&:content).first
@@ -27,7 +27,7 @@ module BibSync
27
27
  end
28
28
 
29
29
  def [](key)
30
- @entries[key]
30
+ @entries[key.to_s]
31
31
  end
32
32
 
33
33
  def delete(entry)
@@ -102,7 +102,7 @@ module BibSync
102
102
  else
103
103
  entry = Entry.new
104
104
  text = entry.parse(text)
105
- entry.key ||= @entries.size
105
+ entry.key ||= "entry#{@entries.size}" # Number of entries for comment id
106
106
  self << entry
107
107
  end
108
108
  end
@@ -112,170 +112,5 @@ module BibSync
112
112
  "% #{DateTime.now}\n% Encoding: UTF8\n\n" <<
113
113
  @entries.values.join("\n") << "\n"
114
114
  end
115
-
116
- class RawValue < String; end
117
-
118
- class Entry
119
- include Enumerable
120
-
121
- attr_accessor :bibliography, :type
122
- attr_reader :key
123
-
124
- def self.parse(text)
125
- Entry.new.tap {|e| e.parse(text) }
126
- end
127
-
128
- def initialize(fields = {})
129
- self.key = fields.delete(:key) if fields.include?(:key)
130
- self.type = fields.delete(:type) if fields.include?(:type)
131
- @fields = fields
132
- end
133
-
134
- def key=(key)
135
- key = key.to_s
136
- raise 'Key cannot be empty' if key.empty?
137
- if bib = bibliography
138
- bib.delete(self)
139
- @key = key
140
- bib << self
141
- else
142
- @key = key
143
- end
144
- end
145
-
146
- def file=(file)
147
- raise 'No bibliography set' unless bibliography
148
- file =~ /\.(\w+)\Z/
149
- self[:file] = ":#{bibliography.relative_path(file)}:#{$1.upcase}" # JabRef file format "description:path:type"
150
- file
151
- end
152
-
153
- def file
154
- if self[:file]
155
- raise 'No bibliography set' unless bibliography
156
- _, file, type = self[:file].split(':', 3)
157
- path = File.join(File.absolute_path(File.dirname(bibliography.file)), file)
158
- { name: File.basename(path), type: type.upcase.to_sym, path: path }
159
- end
160
- end
161
-
162
- def [](key)
163
- @fields[convert_key(key)]
164
- end
165
-
166
- def []=(key, value)
167
- if value
168
- key = convert_key(key)
169
- value = RawValue === value ? RawValue.new(value.to_s.strip) : value.to_s.strip
170
- if @fields[key] != value || @fields[key].class != value.class
171
- @fields[key] = value
172
- dirty!
173
- end
174
- else
175
- delete(key)
176
- end
177
- end
178
-
179
- def delete(key)
180
- key = convert_key(key)
181
- if @fields.include?(key)
182
- @fields.delete(key)
183
- dirty!
184
- end
185
- end
186
-
187
- def each(&block)
188
- @fields.each(&block)
189
- end
190
-
191
- def comment?
192
- type.to_s.downcase == 'comment'
193
- end
194
-
195
- def dirty!
196
- bibliography.dirty! if bibliography
197
- end
198
-
199
- def to_s
200
- s = "@#{type}{"
201
- if comment?
202
- s << self[:comment]
203
- else
204
- s << "#{key},\n" << to_a.map {|k,v| RawValue === v ? " #{k} = #{v}" : " #{k} = {#{v}}" }.join(",\n") << "\n"
205
- end
206
- s << "}\n"
207
- end
208
-
209
- def parse(text)
210
- raise 'Unexpected token' if text !~ /\A\s*@(\w+)\s*\{/
211
- self.type = $1
212
- text = $'
213
-
214
- if comment?
215
- text, self[:comment] = parse_field(text)
216
- else
217
- raise 'Expected entry key' if text !~ /([^,]+),\s*/
218
- self.key = $1.strip
219
- text = $'
220
-
221
- until text.empty?
222
- case text
223
- when /\A(\s+|%[^\n]+\n)/
224
- text = $'
225
- when /\A\s*(\w+)\s*=\s*/
226
- text, key = $', $1
227
- if text =~ /\A\{/
228
- text, self[key] = parse_field(text)
229
- else
230
- text, value = parse_field(text)
231
- self[key] = RawValue.new(value)
232
- end
233
- else
234
- break
235
- end
236
- end
237
- end
238
-
239
- raise 'Expected closing }' unless text =~ /\A\s*\}/
240
- $'
241
- end
242
-
243
- private
244
-
245
- def parse_field(text)
246
- value = ''
247
- count = 0
248
- until text.empty?
249
- case text
250
- when /\A\{/
251
- text = $'
252
- value << $& if count > 0
253
- count += 1
254
- when /\A\}/
255
- break if count == 0
256
- count -= 1
257
- text = $'
258
- value << $& if count > 0
259
- when /\A,/
260
- text = $'
261
- break if count == 0
262
- value << $&
263
- when /\A[^\}\{,]+/
264
- text = $'
265
- value << $&
266
- else
267
- break
268
- end
269
- end
270
-
271
- raise 'Expected closing }' if count != 0
272
-
273
- return text, value
274
- end
275
-
276
- def convert_key(key)
277
- key.to_s.downcase.to_sym
278
- end
279
- end
280
115
  end
281
116
  end
@@ -0,0 +1,164 @@
1
+ module BibSync
2
+ class Entry
3
+ include Enumerable
4
+
5
+ attr_accessor :bibliography, :type
6
+ attr_reader :key
7
+
8
+ def self.parse(text)
9
+ Entry.new.tap {|e| e.parse(text) }
10
+ end
11
+
12
+ def initialize(fields = {})
13
+ self.key = fields.delete(:key) if fields.include?(:key)
14
+ self.type = fields.delete(:type) if fields.include?(:type)
15
+ @fields = fields
16
+ end
17
+
18
+ def key=(key)
19
+ key = key.to_s
20
+ raise 'Key cannot be empty' if key.empty?
21
+ if bib = bibliography
22
+ bib.delete(self)
23
+ @key = key
24
+ bib << self
25
+ else
26
+ @key = key
27
+ end
28
+ end
29
+
30
+ def file=(file)
31
+ raise 'No bibliography set' unless bibliography
32
+ file =~ /\.(\w+)\Z/
33
+ self[:file] = ":#{bibliography.relative_path(file)}:#{$1.upcase}" # JabRef file format "description:path:type"
34
+ file
35
+ end
36
+
37
+ def file
38
+ if self[:file]
39
+ raise 'No bibliography set' unless bibliography
40
+ _, file, type = self[:file].split(':', 3)
41
+ path = File.join(File.absolute_path(File.dirname(bibliography.file)), file)
42
+ { name: File.basename(path), type: type.upcase.to_sym, path: path }
43
+ end
44
+ end
45
+
46
+ def [](key)
47
+ @fields[convert_key(key)]
48
+ end
49
+
50
+ def []=(key, value)
51
+ if value
52
+ key = convert_key(key)
53
+ value = Literal === value ? Literal.new(value.to_s.strip) : value.to_s.strip
54
+ if @fields[key] != value || @fields[key].class != value.class
55
+ @fields[key] = value
56
+ dirty!
57
+ end
58
+ else
59
+ delete(key)
60
+ end
61
+ end
62
+
63
+ def delete(key)
64
+ key = convert_key(key)
65
+ if @fields.include?(key)
66
+ @fields.delete(key)
67
+ dirty!
68
+ end
69
+ end
70
+
71
+ def each(&block)
72
+ @fields.each(&block)
73
+ end
74
+
75
+ def comment?
76
+ type.to_s.downcase == 'comment'
77
+ end
78
+
79
+ def dirty!
80
+ bibliography.dirty! if bibliography
81
+ end
82
+
83
+ def to_s
84
+ s = "@#{type}{"
85
+ if comment?
86
+ s << self[:comment]
87
+ else
88
+ s << "#{key},\n" << to_a.map {|k,v| Literal === v ? " #{k} = #{v}" : " #{k} = {#{v}}" }.join(",\n") << "\n"
89
+ end
90
+ s << "}\n"
91
+ end
92
+
93
+ def parse(text)
94
+ raise 'Unexpected token' if text !~ /\A\s*@(\w+)\s*\{/
95
+ self.type = $1
96
+ text = $'
97
+
98
+ if comment?
99
+ text, self[:comment] = parse_field(text)
100
+ else
101
+ raise 'Expected entry key' if text !~ /([^,]+),\s*/
102
+ self.key = $1.strip
103
+ text = $'
104
+
105
+ until text.empty?
106
+ case text
107
+ when /\A(\s+|%[^\n]+\n)/
108
+ text = $'
109
+ when /\A\s*(\w+)\s*=\s*/
110
+ text, key = $', $1
111
+ if text =~ /\A\{/
112
+ text, self[key] = parse_field(text)
113
+ else
114
+ text, value = parse_field(text)
115
+ self[key] = Literal.new(value)
116
+ end
117
+ else
118
+ break
119
+ end
120
+ end
121
+ end
122
+
123
+ raise 'Expected closing }' unless text =~ /\A\s*\}/
124
+ $'
125
+ end
126
+
127
+ private
128
+
129
+ def parse_field(text)
130
+ value = ''
131
+ count = 0
132
+ until text.empty?
133
+ case text
134
+ when /\A\{/
135
+ text = $'
136
+ value << $& if count > 0
137
+ count += 1
138
+ when /\A\}/
139
+ break if count == 0
140
+ count -= 1
141
+ text = $'
142
+ value << $& if count > 0
143
+ when /\A,/
144
+ text = $'
145
+ break if count == 0
146
+ value << $&
147
+ when /\A[^\}\{,]+/
148
+ text = $'
149
+ value << $&
150
+ else
151
+ break
152
+ end
153
+ end
154
+
155
+ raise 'Expected closing }' if count != 0
156
+
157
+ return text, value
158
+ end
159
+
160
+ def convert_key(key)
161
+ key.to_s.downcase.to_sym
162
+ end
163
+ end
164
+ end
@@ -0,0 +1,3 @@
1
+ module BibSync
2
+ class Literal < String; end
3
+ end
@@ -6,6 +6,23 @@ module BibSync
6
6
  bib.each do |entry|
7
7
  next if entry.comment?
8
8
 
9
+ # Fix math mode of title and abstract
10
+ [:title, :abstract].each do |k|
11
+ next unless v = entry[k]
12
+
13
+ parts = v.split('$', -1)
14
+ parts.each_with_index do |part, i|
15
+ if i % 2 == 0 # Not in math mode
16
+
17
+ # Fix underscores which are not wrapped by $
18
+ parts[i].gsub!(/(\s|\A)([^\s]*?_[^\s]*?)([:\.,]|(\-\w+))?(\s|\Z)/) do
19
+ "#{$1}$#{$2}$#{$3}#{$5}"
20
+ end
21
+ end
22
+ end
23
+ entry[k] = parts.join('$')
24
+ end
25
+
9
26
  if entry[:author]
10
27
  entry[:author] = entry[:author].gsub(/\{(\w+)\}/, '\\1').gsub(/#/, ' and ')
11
28
  end
@@ -20,7 +37,7 @@ module BibSync
20
37
  end
21
38
 
22
39
  if entry[:month]
23
- entry[:month] = Bibliography::RawValue.new(entry[:month].downcase)
40
+ entry[:month] = Literal.new(entry[:month].downcase)
24
41
  end
25
42
 
26
43
  if entry[:journal]
data/lib/bibsync/utils.rb CHANGED
@@ -32,7 +32,7 @@ module BibSync
32
32
 
33
33
  def arxiv_id(arxiv, opts = {})
34
34
  raise unless opts.include?(:prefix) && opts.include?(:version)
35
- arxiv = arxiv[:arxiv] if Bibliography::Entry === arxiv
35
+ arxiv = arxiv[:arxiv] if Entry === arxiv
36
36
  if arxiv
37
37
  arxiv = arxiv.sub(/\A.*\//, '') unless opts[:prefix]
38
38
  arxiv = arxiv.sub(/v\d+\Z/, '') unless opts[:version]
@@ -1,3 +1,3 @@
1
1
  module BibSync
2
- VERSION = '0.0.2'
2
+ VERSION = '0.0.3'
3
3
  end
data/lib/bibsync.rb CHANGED
@@ -4,7 +4,9 @@ require 'date'
4
4
  require 'pathname'
5
5
  require 'bibsync/version'
6
6
  require 'bibsync/utils'
7
+ require 'bibsync/log'
7
8
  require 'bibsync/transformer'
8
9
  require 'bibsync/bibliography'
9
- require 'bibsync/log'
10
+ require 'bibsync/entry'
11
+ require 'bibsync/literal'
10
12
  require 'bibsync/actions'
@@ -1,4 +1,22 @@
1
1
  require 'helper'
2
2
 
3
3
  describe BibSync::Actions::FetchFromArXiv do
4
+ before do
5
+ @tmpdir = File.join(testdir, 'tmp')
6
+ FileUtils.mkdir(@tmpdir)
7
+ end
8
+
9
+ after do
10
+ FileUtils.rm_rf(@tmpdir)
11
+ end
12
+
13
+ let(:action) do
14
+ BibSync::Actions::FetchFromArXiv.new(dir: @tmpdir, fetch: %w(0911.2512v1 http://arxiv.org/abs/0911.1461))
15
+ end
16
+
17
+ it 'should download files' do
18
+ action.run
19
+ File.exists?(File.join(@tmpdir, '0911.2512v3.pdf')).must_equal true
20
+ File.exists?(File.join(@tmpdir, '0911.1461v3.pdf')).must_equal true
21
+ end
4
22
  end
@@ -1,4 +1,25 @@
1
1
  require 'helper'
2
2
 
3
3
  describe BibSync::Actions::JabRefFormat do
4
+ before do
5
+ @tmpfile = File.join(fixturedir, 'tmp.bib')
6
+ FileUtils.copy(File.join(fixturedir, 'test.bib'), @tmpfile)
7
+ end
8
+
9
+ after do
10
+ File.unlink(@tmpfile) if File.exists?(@tmpfile)
11
+ end
12
+
13
+ let(:bib) do
14
+ BibSync::Bibliography.new(@tmpfile)
15
+ end
16
+
17
+ let(:action) do
18
+ BibSync::Actions::JabRefFormat.new(bib: bib)
19
+ end
20
+
21
+ it 'should format file' do
22
+ action.run
23
+ File.read(@tmpfile).must_match(/created\s+with\s+JabRef/)
24
+ end
4
25
  end
@@ -1,4 +1,33 @@
1
1
  require 'helper'
2
2
 
3
3
  describe BibSync::Actions::SynchronizeFiles do
4
+ before do
5
+ @tmpdir = File.join(fixturedir, 'tmp')
6
+ FileUtils.mkdir(@tmpdir)
7
+ end
8
+
9
+ after do
10
+ FileUtils.rm_rf(@tmpdir)
11
+ end
12
+
13
+ let(:bib) do
14
+ BibSync::Bibliography.new(File.join(@tmpdir, 'test.bib'))
15
+ end
16
+
17
+ let(:action) do
18
+ BibSync::Actions::SynchronizeFiles.new(bib: bib, dir: @tmpdir)
19
+ end
20
+
21
+ it 'should synchronize files' do
22
+ 10.times do |i|
23
+ bib << BibSync::Entry.new(key: i) if i % 2 == 0
24
+ FileUtils.touch(File.join(@tmpdir, "#{i}.pdf"))
25
+ end
26
+ bib.size.must_equal 5
27
+ action.run
28
+ bib.size.must_equal 10
29
+ 10.times do |i|
30
+ bib[i].file[:name].must_equal "#{i}.pdf"
31
+ end
32
+ end
4
33
  end
@@ -1,4 +1,15 @@
1
1
  require 'helper'
2
2
 
3
3
  describe BibSync::Actions::Validate do
4
+ let(:bib) do
5
+ BibSync::Bibliography.new(File.join(fixturedir, 'test.bib'))
6
+ end
7
+
8
+ let(:action) do
9
+ BibSync::Actions::Validate.new(bib: bib)
10
+ end
11
+
12
+ it 'should not raise an exception' do
13
+ action.run
14
+ end
4
15
  end
data/test/helper.rb CHANGED
@@ -7,8 +7,12 @@ BibSync::Log.level = :error
7
7
  BibSync::Log.trace = true
8
8
 
9
9
  module Helper
10
+ def testdir
11
+ File.dirname(__FILE__)
12
+ end
13
+
10
14
  def fixturedir
11
- File.join(File.dirname(__FILE__), 'fixture')
15
+ File.join(testdir, 'fixture')
12
16
  end
13
17
  end
14
18
 
@@ -29,7 +29,7 @@ describe BibSync::Bibliography do
29
29
  end
30
30
 
31
31
  it 'must be true after adding an entry' do
32
- bib << BibSync::Bibliography::Entry.new(key: 'test')
32
+ bib << BibSync::Entry.new(key: 'test')
33
33
  bib.dirty?.must_equal true
34
34
  end
35
35
 
@@ -54,7 +54,7 @@ describe BibSync::Bibliography do
54
54
  end
55
55
 
56
56
  it 'must be false after adding an entry' do
57
- newbib << BibSync::Bibliography::Entry.new(key: 'test')
57
+ newbib << BibSync::Entry.new(key: 'test')
58
58
  newbib.empty?.must_equal false
59
59
  end
60
60
  end
@@ -66,7 +66,7 @@ describe BibSync::Bibliography do
66
66
 
67
67
  it 'must increment after adding an entry' do
68
68
  size = bib.size
69
- bib << BibSync::Bibliography::Entry.new(key: 'test')
69
+ bib << BibSync::Entry.new(key: 'test')
70
70
  bib.size.must_equal size + 1
71
71
  end
72
72
  end
@@ -77,7 +77,7 @@ describe BibSync::Bibliography do
77
77
  end
78
78
 
79
79
  it 'must return entry' do
80
- bib['TestBook'].must_be_instance_of BibSync::Bibliography::Entry
80
+ bib['TestBook'].must_be_instance_of BibSync::Entry
81
81
  bib['TestBook'].key.must_equal 'TestBook'
82
82
  end
83
83
  end
@@ -106,7 +106,7 @@ describe BibSync::Bibliography do
106
106
  it 'must iterate over entries' do
107
107
  found = false
108
108
  bib.each do |entry|
109
- entry.must_be_instance_of BibSync::Bibliography::Entry
109
+ entry.must_be_instance_of BibSync::Entry
110
110
  found = true
111
111
  end
112
112
  found.must_equal true
@@ -118,7 +118,7 @@ describe BibSync::Bibliography do
118
118
 
119
119
  describe '#<<' do
120
120
  it 'must support adding an entry' do
121
- entry = BibSync::Bibliography::Entry.new(key: 'test')
121
+ entry = BibSync::Entry.new(key: 'test')
122
122
  bib << entry
123
123
  bib['test'].must_be_same_as entry
124
124
  end
@@ -136,87 +136,3 @@ describe BibSync::Bibliography do
136
136
  describe '#to_s' do
137
137
  end
138
138
  end
139
-
140
- describe BibSync::Bibliography::Entry do
141
- describe '#self.parse' do
142
- it 'should parse entry' do
143
- entry = BibSync::Bibliography::Entry.parse(File.read(File.join(fixturedir, 'entry.bib')))
144
- entry.type.must_equal 'BOOK'
145
- entry.key.must_equal 'TestBook'
146
- entry[:title].must_equal 'BookTitle'
147
- entry[:publisher].must_equal 'BookPublisher'
148
- entry[:year].must_equal '2000'
149
- entry[:month].must_equal 'jan'
150
- entry[:month].must_be_instance_of BibSync::Bibliography::RawValue
151
- entry[:author].must_equal 'BookAuthor'
152
- entry[:volume].must_equal 'BookVolume'
153
- end
154
- end
155
-
156
- describe '#initialize' do
157
- it 'should not set type and key' do
158
- entry = BibSync::Bibliography::Entry.new
159
- entry.type.must_be_nil
160
- entry.key.must_be_nil
161
- entry[:author].must_be_nil
162
- end
163
-
164
- it 'should initialize fields' do
165
- entry = BibSync::Bibliography::Entry.new(type: 'ARTICLE', key: 'key', author: 'Daniel')
166
- entry.type.must_equal 'ARTICLE'
167
- entry.key.must_equal 'key'
168
- entry[:author].must_equal 'Daniel'
169
- end
170
- end
171
-
172
- describe '#file=' do
173
- end
174
-
175
- describe '#file' do
176
- end
177
-
178
- describe '#[]' do
179
- end
180
-
181
- describe '#[]=' do
182
- end
183
-
184
- describe '#delete' do
185
- end
186
-
187
- describe '#each' do
188
- end
189
-
190
- describe '#comment?' do
191
- it 'should return true for a comment entry' do
192
- BibSync::Bibliography::Entry.new(type: 'coMMent').comment?.must_equal true
193
- end
194
-
195
- it 'should return false for a non-comment entry' do
196
- BibSync::Bibliography::Entry.new.comment?.must_equal false
197
- BibSync::Bibliography::Entry.new(type: 'article').comment?.must_equal false
198
- end
199
- end
200
-
201
- describe '#dirty!' do
202
- end
203
-
204
- describe '#to_s' do
205
- end
206
-
207
- describe '#parse' do
208
- it 'should parse entry' do
209
- entry = BibSync::Bibliography::Entry.new
210
- entry.parse(File.read(File.join(fixturedir, 'entry.bib')))
211
- entry.type.must_equal 'BOOK'
212
- entry.key.must_equal 'TestBook'
213
- entry[:title].must_equal 'BookTitle'
214
- entry[:publisher].must_equal 'BookPublisher'
215
- entry[:year].must_equal '2000'
216
- entry[:month].must_equal 'jan'
217
- entry[:month].must_be_instance_of BibSync::Bibliography::RawValue
218
- entry[:author].must_equal 'BookAuthor'
219
- entry[:volume].must_equal 'BookVolume'
220
- end
221
- end
222
- end
@@ -0,0 +1,84 @@
1
+
2
+ describe BibSync::Entry do
3
+ describe '#self.parse' do
4
+ it 'should parse entry' do
5
+ entry = BibSync::Entry.parse(File.read(File.join(fixturedir, 'entry.bib')))
6
+ entry.type.must_equal 'BOOK'
7
+ entry.key.must_equal 'TestBook'
8
+ entry[:title].must_equal 'BookTitle'
9
+ entry[:publisher].must_equal 'BookPublisher'
10
+ entry[:year].must_equal '2000'
11
+ entry[:month].must_equal 'jan'
12
+ entry[:month].must_be_instance_of BibSync::Literal
13
+ entry[:author].must_equal 'BookAuthor'
14
+ entry[:volume].must_equal 'BookVolume'
15
+ end
16
+ end
17
+
18
+ describe '#initialize' do
19
+ it 'should not set type and key' do
20
+ entry = BibSync::Entry.new
21
+ entry.type.must_be_nil
22
+ entry.key.must_be_nil
23
+ entry[:author].must_be_nil
24
+ end
25
+
26
+ it 'should initialize fields' do
27
+ entry = BibSync::Entry.new(type: 'ARTICLE', key: 'key', author: 'Daniel')
28
+ entry.type.must_equal 'ARTICLE'
29
+ entry.key.must_equal 'key'
30
+ entry[:author].must_equal 'Daniel'
31
+ end
32
+ end
33
+
34
+ describe '#file=' do
35
+ end
36
+
37
+ describe '#file' do
38
+ end
39
+
40
+ describe '#[]' do
41
+ end
42
+
43
+ describe '#[]=' do
44
+ end
45
+
46
+ describe '#delete' do
47
+ end
48
+
49
+ describe '#each' do
50
+ end
51
+
52
+ describe '#comment?' do
53
+ it 'should return true for a comment entry' do
54
+ BibSync::Entry.new(type: 'coMMent').comment?.must_equal true
55
+ end
56
+
57
+ it 'should return false for a non-comment entry' do
58
+ BibSync::Entry.new.comment?.must_equal false
59
+ BibSync::Entry.new(type: 'article').comment?.must_equal false
60
+ end
61
+ end
62
+
63
+ describe '#dirty!' do
64
+ end
65
+
66
+ describe '#to_s' do
67
+ end
68
+
69
+ describe '#parse' do
70
+ it 'should parse entry' do
71
+ entry = BibSync::Entry.new
72
+ entry.parse(File.read(File.join(fixturedir, 'entry.bib')))
73
+ entry.type.must_equal 'BOOK'
74
+ entry.key.must_equal 'TestBook'
75
+ entry[:title].must_equal 'BookTitle'
76
+ entry[:publisher].must_equal 'BookPublisher'
77
+ entry[:year].must_equal '2000'
78
+ entry[:month].must_equal 'jan'
79
+ entry[:month].must_be_instance_of BibSync::Literal
80
+ entry[:author].must_equal 'BookAuthor'
81
+ entry[:volume].must_equal 'BookVolume'
82
+ end
83
+ end
84
+ end
metadata CHANGED
@@ -1,55 +1,62 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bibsync
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
+ prerelease:
5
6
  platform: ruby
6
7
  authors:
7
8
  - Daniel Mendler
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2013-04-07 00:00:00.000000000 Z
12
+ date: 2013-04-09 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: nokogiri
15
16
  requirement: !ruby/object:Gem::Requirement
17
+ none: false
16
18
  requirements:
17
- - - '>='
19
+ - - ! '>='
18
20
  - !ruby/object:Gem::Version
19
21
  version: '0'
20
22
  type: :runtime
21
23
  prerelease: false
22
24
  version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
23
26
  requirements:
24
- - - '>='
27
+ - - ! '>='
25
28
  - !ruby/object:Gem::Version
26
29
  version: '0'
27
30
  - !ruby/object:Gem::Dependency
28
31
  name: rake
29
32
  requirement: !ruby/object:Gem::Requirement
33
+ none: false
30
34
  requirements:
31
- - - '>='
35
+ - - ! '>='
32
36
  - !ruby/object:Gem::Version
33
37
  version: '0'
34
38
  type: :development
35
39
  prerelease: false
36
40
  version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
37
42
  requirements:
38
- - - '>='
43
+ - - ! '>='
39
44
  - !ruby/object:Gem::Version
40
45
  version: '0'
41
46
  - !ruby/object:Gem::Dependency
42
47
  name: minitest
43
48
  requirement: !ruby/object:Gem::Requirement
49
+ none: false
44
50
  requirements:
45
- - - '>='
51
+ - - ! '>='
46
52
  - !ruby/object:Gem::Version
47
53
  version: '0'
48
54
  type: :development
49
55
  prerelease: false
50
56
  version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
51
58
  requirements:
52
- - - '>='
59
+ - - ! '>='
53
60
  - !ruby/object:Gem::Version
54
61
  version: '0'
55
62
  description: BibSync is a tool to synchronize scientific papers and BibTeX bibliography
@@ -75,12 +82,15 @@ files:
75
82
  - lib/bibsync/actions/determine_arxiv_doi.rb
76
83
  - lib/bibsync/actions/fetch_from_arxiv.rb
77
84
  - lib/bibsync/actions/find_my_citations.rb
85
+ - lib/bibsync/actions/jabref.xml
78
86
  - lib/bibsync/actions/jabref_format.rb
79
87
  - lib/bibsync/actions/synchronize_files.rb
80
88
  - lib/bibsync/actions/synchronize_metadata.rb
81
89
  - lib/bibsync/actions/validate.rb
82
90
  - lib/bibsync/bibliography.rb
83
91
  - lib/bibsync/command.rb
92
+ - lib/bibsync/entry.rb
93
+ - lib/bibsync/literal.rb
84
94
  - lib/bibsync/log.rb
85
95
  - lib/bibsync/transformer.rb
86
96
  - lib/bibsync/utils.rb
@@ -101,29 +111,31 @@ files:
101
111
  - test/fixture/test.bib
102
112
  - test/helper.rb
103
113
  - test/test_bibliography.rb
114
+ - test/test_entry.rb
104
115
  - test/test_utils.rb
105
116
  homepage: https://github.com/minad/bibsync
106
117
  licenses: []
107
- metadata: {}
108
118
  post_install_message:
109
119
  rdoc_options: []
110
120
  require_paths:
111
121
  - lib
112
122
  required_ruby_version: !ruby/object:Gem::Requirement
123
+ none: false
113
124
  requirements:
114
- - - '>='
125
+ - - ! '>='
115
126
  - !ruby/object:Gem::Version
116
127
  version: '0'
117
128
  required_rubygems_version: !ruby/object:Gem::Requirement
129
+ none: false
118
130
  requirements:
119
- - - '>='
131
+ - - ! '>='
120
132
  - !ruby/object:Gem::Version
121
133
  version: '0'
122
134
  requirements: []
123
135
  rubyforge_project: bibsync
124
- rubygems_version: 2.0.0
136
+ rubygems_version: 1.8.24
125
137
  signing_key:
126
- specification_version: 4
138
+ specification_version: 3
127
139
  summary: BibSync is a tool to synchronize scientific papers and BibTeX bibliography
128
140
  files
129
141
  test_files: []
checksums.yaml DELETED
@@ -1,7 +0,0 @@
1
- ---
2
- SHA1:
3
- metadata.gz: 21c0564e45a66b0339bf5b7bafaef25633adcd8e
4
- data.tar.gz: 34a9ae41d395ba912e95accbb0c2cb87c8de69c3
5
- SHA512:
6
- metadata.gz: 46e87958376899e94b3bec951241bb02e3085f2e5141146477d9f8bb0de533e27c0c8d07b4c4e5a314f2d734cd386ee092362d38307e18a4d49303a746ad42c0
7
- data.tar.gz: 46b15a8cf96461ce3fa3e45aef1585e6806177be668a20410ca940687c5d1f5667d30b1e76701b37503984c0a5ca0aa23025728b0154ee306c868ba8bcdaf1db