enhanced_marc 0.2.3 → 0.3.0
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.
- checksums.yaml +7 -0
- data/.editorconfig +12 -0
- data/.gitignore +2 -0
- data/.rspec +2 -0
- data/.travis.yml +7 -0
- data/Changes +2 -1
- data/Gemfile +9 -0
- data/README.md +59 -0
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/enhanced_marc.gemspec +3 -39
- data/lib/enhanced_marc.rb +0 -1
- data/lib/enhanced_marc/book_record.rb +26 -21
- data/lib/enhanced_marc/book_type.rb +76 -62
- data/lib/enhanced_marc/computer_record.rb +27 -22
- data/lib/enhanced_marc/computer_type.rb +14 -11
- data/lib/enhanced_marc/leader.rb +99 -101
- data/lib/enhanced_marc/map_record.rb +31 -23
- data/lib/enhanced_marc/map_type.rb +27 -23
- data/lib/enhanced_marc/record.rb +5 -2
- data/lib/enhanced_marc/record_type.rb +87 -96
- data/lib/enhanced_marc/score_type.rb +3 -2
- data/lib/enhanced_marc/serial_type.rb +19 -19
- data/lib/enhanced_marc/sound_type.rb +3 -2
- data/lib/enhanced_marc/visual_type.rb +9 -9
- data/pkg/enhanced_marc-0.1.5.gem +0 -0
- data/pkg/enhanced_marc-0.1.gem +0 -0
- data/pkg/enhanced_marc-0.1.tgz +0 -0
- data/pkg/enhanced_marc-0.1.zip +0 -0
- data/pkg/enhanced_marc-0.1/Changes +1 -0
- data/pkg/enhanced_marc-0.1/LICENSE +21 -0
- data/{README → pkg/enhanced_marc-0.1/README} +2 -2
- data/pkg/enhanced_marc-0.1/Rakefile +23 -0
- data/pkg/enhanced_marc-0.1/test/ts_enhanced_marc.rb +5 -0
- metadata +61 -67
- data/lib/enhanced_marc/xmlreader.rb +0 -58
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 6ad98f5c0586a829731494c6607834f40172ecaa
|
4
|
+
data.tar.gz: 66b1336d2b53c0d3e961369afb600cd9c19f68d2
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 01f621f5eed7ccca3d200284d9c0241c65122a134e545837262d78074fe4126388f18b0697fec18c17f8cc6769fdbb70df105be880ea4192c21c540a8ce845b2
|
7
|
+
data.tar.gz: 6c065bbd2ff56ffff49b31630614252ca302238d0a18753295d506822e0c26b4da12801cc51878a8a69f156ce04a682f25ddaeb0680eb0fa0df5f9d0df09fcf5
|
data/.editorconfig
ADDED
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Changes
CHANGED
@@ -1 +1,2 @@
|
|
1
|
-
|
1
|
+
2017-05-20: Fixed a bug with how leader was parsed from MARC::Reader, added some specs, style changes
|
2
|
+
2009-08-07: Refactored to monkeypatch ruby-marc rather than replace it.
|
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
Enhanced MARC is a set of classes, modules and methods that sit on top of ruby-marc (http://rubyforge.org/projects/marc) to help parse the contents of MARC records more easily and conveniently.
|
2
|
+
|
3
|
+
[](https://travis-ci.org/rsinger/enhanced-marc)
|
4
|
+
|
5
|
+
Installation:
|
6
|
+
sudo gem install enhanced_marc
|
7
|
+
|
8
|
+
Usage:
|
9
|
+
```
|
10
|
+
require 'enhanced_marc'
|
11
|
+
|
12
|
+
reader = MARC::Reader.new('marc.dat')
|
13
|
+
|
14
|
+
records = []
|
15
|
+
|
16
|
+
reader.each do | record |
|
17
|
+
records << record
|
18
|
+
end
|
19
|
+
```
|
20
|
+
Note: enhanced-marc only works directly with `MARC::Reader`. If you want to use it with MARCXML or MARC-JSON, etc.
|
21
|
+
you'll need to do something like:
|
22
|
+
```
|
23
|
+
reader.each do | record |
|
24
|
+
records << record.to_typed_record
|
25
|
+
end
|
26
|
+
```
|
27
|
+
for the same effect
|
28
|
+
```
|
29
|
+
>> records[0].class
|
30
|
+
=> MARC::BookRecord
|
31
|
+
|
32
|
+
>> records[0].is_conference?
|
33
|
+
=> false
|
34
|
+
|
35
|
+
>> records[0].is_manuscript?
|
36
|
+
=> false
|
37
|
+
|
38
|
+
# Send a boolean true if you want human readable forms, rather than MARC codes.
|
39
|
+
>> records[0].literary_form(true)
|
40
|
+
=> "Non-fiction"
|
41
|
+
|
42
|
+
>> records[0].nature_of_contents(true)
|
43
|
+
=> ["Bibliography", "Catalog"]
|
44
|
+
|
45
|
+
>> records[1].class
|
46
|
+
=> MARC::SoundRecord
|
47
|
+
|
48
|
+
>> records[1].composition_form(true)
|
49
|
+
=> "Jazz"
|
50
|
+
|
51
|
+
>> records[2].class
|
52
|
+
=> MARC::MapRecord
|
53
|
+
|
54
|
+
>> records[2].projection(true)
|
55
|
+
=> ["Cylindrical", "Mercator"]
|
56
|
+
|
57
|
+
>> records[2].relief(true)
|
58
|
+
=> ["Color"]
|
59
|
+
```
|
data/Rakefile
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
data/enhanced_marc.gemspec
CHANGED
@@ -1,11 +1,6 @@
|
|
1
|
-
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
-
# -*- encoding: utf-8 -*-
|
5
|
-
|
6
1
|
Gem::Specification.new do |s|
|
7
2
|
s.name = %q{enhanced_marc}
|
8
|
-
s.version = "0.
|
3
|
+
s.version = "0.3.0"
|
9
4
|
|
10
5
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
6
|
s.authors = ["Ross Singer"]
|
@@ -14,40 +9,9 @@ Gem::Specification.new do |s|
|
|
14
9
|
s.email = %q{rossfsinger@gmail.com}
|
15
10
|
s.extra_rdoc_files = [
|
16
11
|
"LICENSE",
|
17
|
-
|
18
|
-
]
|
19
|
-
s.files = [
|
20
|
-
"Changes",
|
21
|
-
"LICENSE",
|
22
|
-
"README",
|
23
|
-
"Rakefile",
|
24
|
-
"VERSION",
|
25
|
-
"enhanced_marc.gemspec",
|
26
|
-
"lib/enhanced_marc.rb",
|
27
|
-
"lib/enhanced_marc/book_record.rb",
|
28
|
-
"lib/enhanced_marc/book_type.rb",
|
29
|
-
"lib/enhanced_marc/computer_record.rb",
|
30
|
-
"lib/enhanced_marc/computer_type.rb",
|
31
|
-
"lib/enhanced_marc/leader.rb",
|
32
|
-
"lib/enhanced_marc/leftovers.rb",
|
33
|
-
"lib/enhanced_marc/map_record.rb",
|
34
|
-
"lib/enhanced_marc/map_type.rb",
|
35
|
-
"lib/enhanced_marc/mixed_record.rb",
|
36
|
-
"lib/enhanced_marc/mixed_type.rb",
|
37
|
-
"lib/enhanced_marc/reader.rb",
|
38
|
-
"lib/enhanced_marc/record.rb",
|
39
|
-
"lib/enhanced_marc/record_type.rb",
|
40
|
-
"lib/enhanced_marc/score_record.rb",
|
41
|
-
"lib/enhanced_marc/score_type.rb",
|
42
|
-
"lib/enhanced_marc/serial_record.rb",
|
43
|
-
"lib/enhanced_marc/serial_type.rb",
|
44
|
-
"lib/enhanced_marc/sound_record.rb",
|
45
|
-
"lib/enhanced_marc/sound_type.rb",
|
46
|
-
"lib/enhanced_marc/visual_record.rb",
|
47
|
-
"lib/enhanced_marc/visual_type.rb",
|
48
|
-
"lib/enhanced_marc/xmlreader.rb",
|
49
|
-
"test/ts_enhanced_marc.rb"
|
12
|
+
"README.md"
|
50
13
|
]
|
14
|
+
s.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
51
15
|
s.homepage = %q{http://github.com/rsinger/enhanced-marc/tree}
|
52
16
|
s.rdoc_options = ["--charset=UTF-8"]
|
53
17
|
s.require_paths = ["lib"]
|
data/lib/enhanced_marc.rb
CHANGED
@@ -2,7 +2,6 @@ require 'marc'
|
|
2
2
|
require 'locale/info'
|
3
3
|
require File.dirname(__FILE__) + '/enhanced_marc/reader'
|
4
4
|
require File.dirname(__FILE__) + '/enhanced_marc/record'
|
5
|
-
require File.dirname(__FILE__) + '/enhanced_marc/xmlreader'
|
6
5
|
require File.dirname(__FILE__) + '/enhanced_marc/leader'
|
7
6
|
require File.dirname(__FILE__) + '/enhanced_marc/book_record'
|
8
7
|
require File.dirname(__FILE__) + '/enhanced_marc/serial_record'
|
@@ -1,37 +1,42 @@
|
|
1
1
|
module MARC
|
2
2
|
|
3
3
|
# A class that represents an individual MARC record. Every record
|
4
|
-
# is made up of a collection of MARC::Field objects.
|
5
|
-
|
4
|
+
# is made up of a collection of MARC::Field objects.
|
6
5
|
class BookRecord < Record
|
7
6
|
|
8
7
|
def initialize
|
9
8
|
super
|
10
|
-
@leader[6] = 'a' if @leader[6,1] == ' '
|
11
|
-
@leader[7] = 'm' if @leader[7,1] == ' '
|
12
|
-
@record_type = 'BKS'
|
9
|
+
@leader[6] = 'a' if @leader[6, 1] == ' '
|
10
|
+
@leader[7] = 'm' if @leader[7, 1] == ' '
|
11
|
+
@record_type = 'BKS'
|
13
12
|
@bibliographic_level = @leader.get_blvl
|
14
|
-
|
15
|
-
|
13
|
+
extend BookType
|
14
|
+
inspect_fixed_fields
|
16
15
|
end
|
17
|
-
|
18
|
-
def
|
19
|
-
return false unless @leader[6,1]
|
20
|
-
|
16
|
+
|
17
|
+
def valid_type?
|
18
|
+
return false unless @leader[6, 1] =~ /[at]{1}/
|
19
|
+
true
|
21
20
|
end
|
22
|
-
|
23
|
-
|
24
|
-
|
21
|
+
alias is_valid_type? valid_type?
|
22
|
+
|
23
|
+
def valid_blvl?
|
24
|
+
return false unless @leader[7, 1] =~ /[acdm]{1}/
|
25
|
+
true
|
25
26
|
end
|
27
|
+
alias is_valid_blvl? valid_blvl?
|
28
|
+
|
26
29
|
def self.new_from_record(record)
|
27
30
|
rec = BookRecord.new
|
28
|
-
record.instance_variables.each
|
31
|
+
record.instance_variables.each do |var|
|
29
32
|
rec.instance_variable_set(var, record.instance_variable_get(var))
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
33
|
+
end
|
34
|
+
error = rec.valid_type? ? nil : 'Incorrect type declaration in leader'
|
35
|
+
if !error && !rec.valid_blvl?
|
36
|
+
error = 'Incorrect bibliographic declaration in leader'
|
37
|
+
end
|
38
|
+
return Exception.new(error) if error
|
39
|
+
rec
|
40
|
+
end
|
36
41
|
end
|
37
42
|
end
|
@@ -1,87 +1,101 @@
|
|
1
|
+
# Methods for Book records
|
1
2
|
module BookType
|
2
3
|
include RecordType
|
3
|
-
public :is_govdoc?, :nature_of_contents, :is_conference?, :audience_level,
|
4
|
-
|
4
|
+
public :is_govdoc?, :nature_of_contents, :is_conference?, :audience_level,
|
5
|
+
:form, :has_index?, :govdoc?, :conference?
|
6
|
+
# Checks the leader and any 006 fields to
|
5
7
|
# determine if the record is a manuscript.
|
6
8
|
# Returns a boolean.
|
7
|
-
def
|
9
|
+
def manuscript?
|
8
10
|
return true if @leader[6,1] == 't'
|
9
|
-
@fields.
|
10
|
-
return true if fxd_fld.value[0,1] == 't'
|
11
|
-
|
12
|
-
|
11
|
+
@fields.each_by_tag('006') do |fxd_fld|
|
12
|
+
return true if fxd_fld.value[0, 1] == 't'
|
13
|
+
end
|
14
|
+
false
|
13
15
|
end
|
14
|
-
|
15
|
-
|
16
|
+
|
17
|
+
alias is_manuscript? manuscript?
|
18
|
+
|
19
|
+
def set_manuscript(value = false, field = nil)
|
16
20
|
if field
|
17
|
-
return Exception.new(
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
field.value[0] = 'a'
|
22
|
-
end
|
23
|
-
else
|
24
|
-
if value
|
25
|
-
@leader[6] = 't'
|
26
|
-
else
|
27
|
-
@leader[6] = 'a'
|
28
|
-
end
|
21
|
+
return Exception.new('Field is not an 006') unless field.tag == '006'
|
22
|
+
field.value[0] = value ? 't' : 'a'
|
23
|
+
else
|
24
|
+
@leader[6] = value ? 't' : 'a'
|
29
25
|
end
|
30
26
|
end
|
31
|
-
|
32
|
-
def literary_form(human_readable=false)
|
33
|
-
lit_map={'0'=>'Non-fiction', '1'=>'Fiction', 'c'=>'Comic',
|
34
|
-
|
35
|
-
|
27
|
+
|
28
|
+
def literary_form(human_readable = false)
|
29
|
+
lit_map = { '0' => 'Non-fiction', '1' => 'Fiction', 'c' => 'Comic',
|
30
|
+
'd' => 'Drama', 'e' => 'Essay', 'f' => 'Novel',
|
31
|
+
'h' => 'Humor/satire', 'i' => 'Letter', 'j' => 'Short story',
|
32
|
+
'm' => 'Mixed', 'p' => 'Poetry', 's' => 'Speech',
|
33
|
+
'u' => 'Unknown' }
|
36
34
|
human_readable = lit_map if human_readable
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
35
|
+
field_parser({ match: 'BKS', start: 33, end: 1 },
|
36
|
+
{ match: /[at]{1}/, start: 16, end: 1 },
|
37
|
+
human_readable)
|
38
|
+
end
|
39
|
+
|
40
|
+
def biography?(human_readable = false)
|
41
|
+
biog_map = { 'a' => 'Autobiography', 'b' => 'Individual biography',
|
42
|
+
'c' => 'Collective biography',
|
43
|
+
'd' => 'Contains biographical information' }
|
43
44
|
human_readable = biog_map if human_readable
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
45
|
+
field_parser({ match: 'BKS', start: 34, end: 1},
|
46
|
+
{ match: /[at]{1}/, start: 17, end: 1},
|
47
|
+
human_readable)
|
48
|
+
end
|
49
|
+
|
50
|
+
alias is_biography? biography?
|
51
|
+
|
52
|
+
def festschrift?
|
53
|
+
return true if self['008'].value[30, 1] == '1' && @record_type == 'BKS'
|
54
|
+
@fields.each_by_tag('006') do |fxd_fld|
|
55
|
+
if fxd_fld.value[0, 1].match(/[at]{1}/) && fxd_fld.value[13, 1] == '1'
|
56
|
+
next
|
57
|
+
end
|
51
58
|
return true
|
52
|
-
|
53
|
-
|
54
|
-
end
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
59
|
+
end
|
60
|
+
false
|
61
|
+
end
|
62
|
+
|
63
|
+
alias is_festchrift? festschrift?
|
64
|
+
|
65
|
+
# TODO: simplify this method
|
66
|
+
def illustrated?(human_readable = false)
|
67
|
+
ills_map = { 'a' => 'Illustrations', 'b' => 'Maps', 'c' => 'Portraits',
|
68
|
+
'd' => 'Charts', 'e' => 'Plans', 'f' => 'Plates',
|
69
|
+
'g' => 'Music', 'h' => 'Facsimilies', 'i' => 'Coats of arms',
|
70
|
+
'j' => 'Genealogical tables', 'k' => 'Forms', 'l' => 'Samples',
|
71
|
+
'm' => 'Phonodisc', 'o' => 'Photographs',
|
72
|
+
'p' => 'Illuminations' }
|
73
|
+
|
62
74
|
contents = []
|
63
|
-
if
|
64
|
-
self['008'].value[18,4].split(//).each
|
65
|
-
next if char ==
|
75
|
+
if record_type == 'BKS'
|
76
|
+
self['008'].value[18, 4].split(//).each do |char|
|
77
|
+
next if char == ' '
|
66
78
|
if human_readable
|
67
79
|
contents << ills_map[char] if ills_map[char]
|
68
80
|
else
|
69
81
|
contents << char
|
70
82
|
end
|
71
|
-
|
83
|
+
end
|
72
84
|
end
|
73
|
-
@fields.
|
74
|
-
next unless fxd_fld.value[0,1]
|
75
|
-
fxd_fld.value[1,4].split(//).each
|
76
|
-
next if char ==
|
85
|
+
@fields.each_by_tag('006') do |fxd_fld|
|
86
|
+
next unless fxd_fld.value[0, 1] =~ /[at]{1}/
|
87
|
+
fxd_fld.value[1, 4].split(//).each do |char|
|
88
|
+
next if char == ' '
|
77
89
|
if human_readable
|
78
90
|
contents << ills_map[char] if ills_map[char]
|
79
91
|
else
|
80
92
|
contents << char
|
81
93
|
end
|
82
|
-
|
83
|
-
|
94
|
+
end
|
95
|
+
end
|
84
96
|
return false if contents.empty?
|
85
|
-
|
86
|
-
end
|
87
|
-
|
97
|
+
contents
|
98
|
+
end
|
99
|
+
|
100
|
+
alias is_illustrated? illustrated?
|
101
|
+
end
|
@@ -1,37 +1,42 @@
|
|
1
1
|
module MARC
|
2
2
|
|
3
3
|
# A class that represents an individual MARC record. Every record
|
4
|
-
# is made up of a collection of MARC::Field objects.
|
5
|
-
|
4
|
+
# is made up of a collection of MARC::Field objects.
|
6
5
|
class ComputerRecord < Record
|
7
|
-
|
6
|
+
|
8
7
|
def initialize
|
9
8
|
super
|
10
9
|
@leader[6] = 'm' if @leader[6,1] == ' '
|
11
|
-
@leader[7] = 'm' if @leader[7,1] == ' '
|
12
|
-
@record_type = 'COM'
|
10
|
+
@leader[7] = 'm' if @leader[7,1] == ' '
|
11
|
+
@record_type = 'COM'
|
13
12
|
@bibliographic_level = @leader.get_blvl
|
14
|
-
|
15
|
-
|
13
|
+
extend ComputerType
|
14
|
+
inspect_fixed_fields
|
16
15
|
end
|
17
|
-
|
18
|
-
def
|
19
|
-
return false unless @leader[6,1]
|
20
|
-
|
16
|
+
|
17
|
+
def valid_type?
|
18
|
+
return false unless @leader[6, 1] == 'm'
|
19
|
+
true
|
21
20
|
end
|
22
|
-
|
23
|
-
|
24
|
-
|
21
|
+
alias is_valid_type? valid_type?
|
22
|
+
|
23
|
+
def valid_blvl?
|
24
|
+
return false unless @leader[7, 1] =~ /[abcdims]{1}/
|
25
|
+
true
|
25
26
|
end
|
27
|
+
alias is_valid_blvl? valid_blvl?
|
28
|
+
|
26
29
|
def self.new_from_record(record)
|
27
30
|
rec = ComputerRecord.new
|
28
|
-
record.instance_variables.each
|
31
|
+
record.instance_variables.each do |var|
|
29
32
|
rec.instance_variable_set(var, record.instance_variable_get(var))
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
33
|
+
end
|
34
|
+
error = rec.valid_type? ? nil : 'Incorrect type declaration in leader'
|
35
|
+
if !error && !rec.valid_blvl?
|
36
|
+
error = 'Incorrect bibliographic declaration in leader'
|
37
|
+
end
|
38
|
+
return Exception.new(error) if error
|
39
|
+
rec
|
40
|
+
end
|
36
41
|
end
|
37
|
-
end
|
42
|
+
end
|