enhanced_marc 0.2.3 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,14 +1,17 @@
1
+ # Methods for Computer records
1
2
  module ComputerType
2
3
  include RecordType
3
- public :form, :audience_level, :is_govdoc?
4
- def file_type(human_readable=false)
5
- return false unless self.contains_type?("COM")
6
- file_map = {'a'=>'Numeric data', 'b'=>'Computer program', 'c'=>'Representational',
7
- 'd'=>'Document', 'e'=>'Bibliographic data', 'f'=>'Font', 'g'=>'Game',
8
- 'h'=>'Sounds', 'i'=>'Interactive multimedia', 'j'=>'Online', 'm'=>'Combination',
9
- 'u'=>'Unknown', 'z'=>'Other'}
4
+ public :form, :audience_level, :is_govdoc?, :govdoc?, :conference?
5
+ def file_type(human_readable = false)
6
+ return false unless contains_type?('COM')
7
+ file_map = { 'a' => 'Numeric data', 'b' => 'Computer program',
8
+ 'c' => 'Representational', 'd' => 'Document',
9
+ 'e' => 'Bibliographic data', 'f' => 'Font', 'g' => 'Game',
10
+ 'h' => 'Sounds', 'i' => 'Interactive multimedia',
11
+ 'j' => 'Online', 'm' => 'Combination', 'u' => 'Unknown',
12
+ 'z' => 'Other' }
10
13
  human_readable = file_map if human_readable
11
- return self.field_parser({:match=>'COM', :start=>26,:end=>1}, {:match=>'m', :start=>9,:end=>1}, human_readable)
12
- end
13
-
14
- end
14
+ field_parser({ match: 'COM', start: 26, end: 1 },
15
+ { match: 'm', start: 9, end: 1 }, human_readable)
16
+ end
17
+ end
@@ -1,132 +1,130 @@
1
1
  module MARC
2
-
2
+
3
3
  # A class for accessing the MARC Leader
4
4
  class Leader < String
5
- attr_reader :leader, :record_type, :bibliographic_level, :encoding_level, :fixed_fields
5
+ attr_reader :leader, :fixed_fields
6
6
  def initialize(leader)
7
- super
7
+ super
8
8
  # leader defaults:
9
9
  # http://www.loc.gov/marc/bibliographic/ecbdldrd.html
10
10
  self[10..11] = '22'
11
- self[20..23] = '4500'
12
- end
13
-
14
- def parse_leader
15
- self.get_type
16
- self.get_blvl
17
- self.get_elvl
11
+ self[20..23] = '4500'
18
12
  end
19
-
20
- def get_type_code
21
- return self[6,1]
13
+
14
+ def type_code
15
+ self[6, 1]
22
16
  end
23
-
24
- def get_blvl_code
25
- return self[7,1]
17
+
18
+ alias get_type_code type_code
19
+
20
+ def blvl_code
21
+ self[7, 1]
26
22
  end
27
-
28
- def get_type
29
- return @record_type = self.type_translator(self.get_type_code, self.get_blvl_code)
23
+
24
+ alias get_blvl_code blvl_code
25
+
26
+ def record_type
27
+ type_translator(get_type_code, get_blvl_code)
30
28
  end
31
-
32
- def is_archival?
33
- return true if self[8,1] == 'a'
34
- return false
29
+
30
+ alias get_type record_type
31
+
32
+ def archival?
33
+ return true if self[8, 1] == 'a'
34
+ false
35
35
  end
36
36
 
37
- def get_blvl
37
+ alias is_archival? archival?
38
+
39
+ def blvl
38
40
  blvls = {
39
- 'a'=>'Monographic component part',
40
- 'b'=>'Serial component part',
41
- 'c'=>'Collection',
42
- 'd'=>'Subunit',
43
- 'i'=>'Integrating resource',
44
- 'm'=>'Monograph/Item',
45
- 's'=>'Serial'
41
+ 'a' => 'Monographic component part',
42
+ 'b' => 'Serial component part',
43
+ 'c' => 'Collection',
44
+ 'd' => 'Subunit',
45
+ 'i' => 'Integrating resource',
46
+ 'm' => 'Monograph/Item',
47
+ 's' => 'Serial'
46
48
  }
47
- return @bibliographic_level = blvls[self.get_blvl_code]
49
+ blvls[get_blvl_code]
48
50
  end
49
51
 
50
- def set_type(type)
52
+ alias bibliographic_level blvl
53
+ alias get_blvl blvl
54
+
55
+ def record_type=(type)
51
56
  if type.length == 1
52
- translated_type = self.types(type)
53
- raise ArgumentError, "Invalid Type" if translated_type.nil?
57
+ translated_type = types(type)
58
+ raise ArgumentError, 'Invalid Type' if translated_type.nil?
54
59
  elsif type.length > 1
55
- translated_type = type
56
- type = self.types(type)
57
- raise ArgumentError, "Invalid Type" if type.nil?
60
+ type = types(type)
61
+ raise ArgumentError, 'Invalid Type' if type.nil?
58
62
  else
59
- raise ArgumentError, "Invalid Type"
60
- end
61
- self[6] = type
63
+ raise ArgumentError, 'Invalid Type'
64
+ end
65
+ self[6] = type
62
66
  end
63
-
67
+
68
+ alias set_type record_type=
69
+
64
70
  def type_translator(type_code, blvl_code)
65
- valid_types = ['a','t','g','k','r','o','p','e','f','c','d','i','j','m']
66
- unless valid_types.index(type_code)
67
- raise ArgumentError, "Invalid Type!"
68
- return
69
- end
71
+ valid_types = %w[a t g k r o p e f c d i j m]
72
+ raise ArgumentError, 'Invalid Type!' unless valid_types.index(type_code)
73
+
70
74
  rec_types = {
71
- 'BKS' => { :type => /[at]{1}/, :blvl => /[acdm]{1}/ },
72
- 'SER' => { :type => /[a]{1}/, :blvl => /[bs]{1}/ },
73
- 'VIS' => { :type => /[gkro]{1}/, :blvl => /[abcdims]{1}/ },
74
- 'MIX' => { :type => /[p]{1}/, :blvl => /[cd]{1}/ },
75
- 'MAP' => { :type => /[ef]{1}/, :blvl => /[abcdims]{1}/ },
76
- 'SCO' => { :type => /[cd]{1}/, :blvl => /[abcdims]{1}/ },
77
- 'REC' => { :type => /[ij]{1}/, :blvl => /[abcdims]{1}/ },
78
- 'COM' => { :type => /[m]{1}/, :blvl => /[abcdims]{1}/ }
79
- }
80
-
81
- rec_types.each_key { | type |
82
- return type if type_code.match(rec_types[type][:type]) and blvl_code.match(rec_types[type][:blvl])
83
- }
84
- raise ArgumentError, "Invalid BLvl!"
85
- return nil
86
- end
87
-
88
- def get_elvl_code
89
- return self[17,1]
90
- end
91
-
92
- def get_elvl
93
- elvls = {
94
- ' '=>'Full',
95
- '1'=>'Full, not examined',
96
- '2'=>'Less-than-full',
97
- '3'=>'Abbreviated',
98
- '4'=>'Core',
99
- '5'=>'Partial',
100
- '7'=>'Minimal',
101
- '8'=>'Prepublication',
102
- 'I'=>'Full-level input by OCLC participants',
103
- 'K'=>'Less-than-full input by OCLC participants',
104
- 'L'=>'Full-level input added from a batch process',
105
- 'M'=>'Less-than-full added from a batch process',
106
- 'E'=>'System-identified MARC error in batchloaded record',
107
- 'J'=>'Deleted record'
75
+ 'BKS' => { type: /[at]{1}/, blvl: /[acdm]{1}/ },
76
+ 'SER' => { type: /[a]{1}/, blvl: /[bs]{1}/ },
77
+ 'VIS' => { type: /[gkro]{1}/, blvl: /[abcdims]{1}/ },
78
+ 'MIX' => { type: /[p]{1}/, blvl: /[cd]{1}/ },
79
+ 'MAP' => { type: /[ef]{1}/, blvl: /[abcdims]{1}/ },
80
+ 'SCO' => { type: /[cd]{1}/, blvl: /[abcdims]{1}/ },
81
+ 'REC' => { type: /[ij]{1}/, blvl: /[abcdims]{1}/ },
82
+ 'COM' => { type: /[m]{1}/, blvl: /[abcdims]{1}/ }
108
83
  }
109
- return @encoding_level = elvls[self.get_elvl_code]
84
+
85
+ rec_types.each_key do |type|
86
+ if type_code.match(rec_types[type][:type]) && blvl_code.match(rec_types[type][:blvl])
87
+ return type
88
+ end
89
+ end
90
+ raise ArgumentError, 'Invalid BLvl!'
110
91
  end
111
-
112
- def ELvl
113
- self.get_elvl unless @encoding_level
114
- return @encoding_level
92
+
93
+ def elvl_code
94
+ self[17, 1]
115
95
  end
116
-
117
- def get_desc_code
118
- return self[18,1]
96
+ alias get_elvl_code elvl_code
97
+
98
+ def elvl
99
+ elvls = { ' ' => 'Full', '1' => 'Full, not examined',
100
+ '2' => 'Less-than-full', '3' => 'Abbreviated',
101
+ '4' => 'Core', '5' => 'Partial', '7' => 'Minimal',
102
+ '8' => 'Prepublication', 'J' => 'Deleted record',
103
+ 'I' => 'Full-level input by OCLC participants',
104
+ 'K' => 'Less-than-full input by OCLC participants',
105
+ 'L' => 'Full-level input added from a batch process',
106
+ 'M' => 'Less-than-full added from a batch process',
107
+ 'E' => 'System-identified MARC error in batchloaded record' }
108
+ elvls[get_elvl_code]
119
109
  end
120
-
121
- def get_desc
122
- codes = {' '=>'Non-ISBD', 'a'=>'AACR2', 'i'=>'ISBD', 'u'=>'Unknown'}
123
- return @descriptive_cataloging_form = codes[self.get_desc_code]
110
+ alias encoding_level elvl
111
+ alias ELvl elvl
112
+ alias get_elvl elvl
113
+
114
+ def desc_code
115
+ self[18, 1]
124
116
  end
125
-
126
- def Desc
127
- self.get_desc unless @descriptive_cataloging_form
128
- return @descriptive_cataloging_form
117
+
118
+ alias get_desc_code desc_code
119
+
120
+ def desc
121
+ codes = {
122
+ ' ' => 'Non-ISBD', 'a' => 'AACR2', 'i' => 'ISBD', 'u' => 'Unknown'
123
+ }
124
+ codes[get_desc_code]
129
125
  end
130
-
126
+ alias descriptive_cataloging_form desc
127
+ alias Desc desc
128
+ alias get_desc desc
131
129
  end
132
130
  end
@@ -1,38 +1,46 @@
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 MapRecord < Record
7
6
 
8
7
  def initialize
9
8
  super
10
- @leader[6] = 'e' if @leader[6,1] == ' '
11
- @leader[7] = 'm' if @leader[7,1] == ' '
12
- @record_type = 'MAP'
9
+ @leader[6] = 'e' if @leader[6, 1] == ' '
10
+ @leader[7] = 'm' if @leader[7, 1] == ' '
11
+ @record_type = 'MAP'
13
12
  @bibliographic_level = @leader.get_blvl
14
- self.extend MapType
15
- self.inspect_fixed_fields
13
+ extend MapType
14
+ inspect_fixed_fields
16
15
  end
17
-
18
- def is_valid_type?
19
- return false unless @leader[6,1].match(/[ef]{1}/)
20
- return true
16
+
17
+ def valid_type?
18
+ return false unless @leader[6, 1] =~ /[ef]{1}/
19
+ true
21
20
  end
22
- def is_valid_blvl?
23
- return true if @leader[7,1].match(/[acdim]{1}/) and @leader[6,1].match('f')
24
- return true if @leader[7,1].match(/[abcdims]{1}/) and @leader[6,1].match('e')
25
- return false
21
+ alias is_valid_type? valid_type?
22
+ def valid_blvl?
23
+ if @leader[7, 1] =~ /[acdim]{1}/ && @leader[6, 1] == 'f'
24
+ true
25
+ elsif @leader[7, 1] =~ /[abcdims]{1}/ && @leader[6, 1] == 'e'
26
+ true
27
+ else
28
+ false
29
+ end
26
30
  end
31
+ alias is_valid_blvl? valid_blvl?
27
32
  def self.new_from_record(record)
28
33
  rec = MapRecord.new
29
- record.instance_variables.each { | var |
34
+ record.instance_variables.each do |var|
30
35
  rec.instance_variable_set(var, record.instance_variable_get(var))
31
- }
32
- return Exception.new("Incorrect type declaration in leader") unless rec.is_valid_type?
33
- return Exception.new("Incorrect bibliographic declaration in leader") unless rec.is_valid_blvl?
34
- return rec
35
- end
36
-
36
+ end
37
+ error = rec.valid_type? ? nil : 'Incorrect type declaration in leader'
38
+ if !error && !rec.valid_blvl?
39
+ error = 'Incorrect bibliographic declaration in leader'
40
+ end
41
+ return Exception.new(error) if error
42
+ rec
43
+ end
44
+
37
45
  end
38
- end
46
+ end
@@ -1,22 +1,26 @@
1
+ # Methods for Map records
1
2
  module MapType
2
3
  include RecordType
3
- public :is_govdoc?, :form, :has_index?
4
- def cartographic_type(human_readable=false)
5
- crtp_map = {'a'=>'Map', 'b'=>'Map series', 'c'=>'Map serial', 'd'=>'Globe', 'e'=>'Atlas',
6
- 'f'=>'Supplement', 'g'=>'Bound as part of another work', 'u'=>'Unknown', 'z'=>'Other'}
4
+ public :is_govdoc?, :form, :has_index?, :govdoc?, :conference?
5
+ def cartographic_type(human_readable = false)
6
+ crtp_map = { 'a' => 'Map', 'b' => 'Map series', 'c' => 'Map serial',
7
+ 'd' => 'Globe', 'e' => 'Atlas', 'f' => 'Supplement',
8
+ 'g' => 'Bound as part of another work', 'u' => 'Unknown',
9
+ 'z' => 'Other' }
7
10
  human_readable = crtp_map if human_readable
8
- return self.field_parser({:match=>'MAP', :start=>25,:end=>1}, {:match=>/[ef]{1}/, :start=>8,:end=>1}, human_readable)
9
- end
10
-
11
- def relief(human_readable=false)
11
+ field_parser({ match: 'MAP', start: 25, end:1 },
12
+ { match: /[ef]{1}/, start: 8, end: 1 }, human_readable)
13
+ end
14
+
15
+ def relief(human_readable = false)
12
16
  relief_map = {'a'=>'Contours', 'b'=>'Shading', 'c'=>'Grading and bathymetric tints',
13
17
  'd'=>'Hachures', 'e'=>'Bathymetry, soundings', 'f'=>'Form lines', 'g'=>'Spot heights',
14
- 'h'=>'Color', 'i'=>'Pictorially', 'j'=>'Land forms', 'k'=>'Bathymetry, isolines',
18
+ 'h'=>'Color', 'i'=>'Pictorially', 'j'=>'Land forms', 'k'=>'Bathymetry, isolines',
15
19
  'm'=>'Rock drawings', 'z'=>'Other'
16
20
  }
17
21
  contents = []
18
22
  if self.record_type == 'MAP'
19
- self['008'].value[18,4].split(//).each { | char |
23
+ self['008'].value[18,4].split(//).each { | char |
20
24
  next if char == " "
21
25
  if human_readable
22
26
  contents << relief_map[char]
@@ -26,8 +30,8 @@ module MapType
26
30
  }
27
31
  end
28
32
  @fields.find_all {|f| ('006') === f.tag}.each { | fxd_fld |
29
- next unless fxd_fld.value[0,1].match(/[ef]{1}/)
30
- fxd_fld.value[1,4].split(//).each { | char |
33
+ next unless fxd_fld.value[0,1].match(/[ef]{1}/)
34
+ fxd_fld.value[1,4].split(//).each { | char |
31
35
  next if char == " "
32
36
  if human_readable
33
37
  contents << relief_map[char]
@@ -35,11 +39,11 @@ module MapType
35
39
  contents << char
36
40
  end
37
41
  }
38
- }
42
+ }
39
43
  return false if contents.empty?
40
- return contents
44
+ contents
41
45
  end
42
-
46
+
43
47
  def projection(human_readable=false)
44
48
  proj_map = {'Azimuthal'=>{'aa'=>'Aitoff','ab'=>'Gnomic','ac'=>"Lambert's equal area",
45
49
  'ad'=>'Orthographic','ae'=>'Azithumal equidistant', 'af'=>'Stereographic',
@@ -56,7 +60,7 @@ module MapType
56
60
  },
57
61
  'Other'=>{'da'=>'Armadillo','db'=>'Butterfly','dc'=>'Eckert','dd'=>"Goode's homolosine",
58
62
  'de'=>"Miller's bipolar oblique conformal conic",'df'=>'Van Der Grinten',
59
- 'dg'=>'Dymaxion','dh'=>'Cordiform','dl'=>'Lambert conformal','zz'=>'Other'
63
+ 'dg'=>'Dymaxion','dh'=>'Cordiform','dl'=>'Lambert conformal','zz'=>'Other'
60
64
  }
61
65
  }
62
66
  if @record_type == "MAP"
@@ -70,7 +74,7 @@ module MapType
70
74
  return self['008'].value[22,2]
71
75
  end
72
76
  end
73
- end
77
+ end
74
78
  @fields.find_all {|f| ('006') === f.tag}.each { | fxd_fld |
75
79
  next unless fxd_fld.value[0,1].match(/[ef]{1}/)
76
80
  unless fxd_fld.value[5,2] == ' '
@@ -78,15 +82,15 @@ module MapType
78
82
  proj_map.each_key { | general |
79
83
  next unless proj_map[general].keys.index(fxd_fld.value[5,2])
80
84
  return [general,proj_map[general][fxd_fld.value[5,2]]]
81
- }
85
+ }
82
86
  else
83
87
  return fxd_fld.value[5,2]
84
88
  end
85
89
  end
86
- }
87
- return false
90
+ }
91
+ false
88
92
  end
89
-
93
+
90
94
  def special_format(human_readable=false)
91
95
  spfm_map = {'a'=>'Blueprint photocopy','b'=>'Other photocopy','c'=>'Negative photocopy',
92
96
  'd'=>'Film negative','f'=>'Facsimile','g'=>'Relief model','h'=>'Rare (pre-1800)',
@@ -94,6 +98,6 @@ module MapType
94
98
  'm'=>'Braille, tactile','n'=>'Game','o'=>'Wall map','p'=>'Playing cards',
95
99
  'q'=>'Loose-leaf','z'=>'Other'}
96
100
  human_readable = spfm_map if human_readable
97
- return self.field_parser({:match=>'MAP', :start=>33,:end=>2}, {:match=>/[ef]{1}/, :start=>16,:end=>2}, human_readable)
101
+ return self.field_parser({:match=>'MAP', :start=>33,:end=>2}, {:match=>/[ef]{1}/, :start=>16,:end=>2}, human_readable)
98
102
  end
99
- end
103
+ end
@@ -1,7 +1,7 @@
1
1
  module MARC
2
2
  class Record
3
3
 
4
- attr_reader :record_type, :bibliographic_level
4
+ attr_reader :record_type
5
5
 
6
6
  # Creates a new MARC::Record using MARC::Leader
7
7
  # to work with the leader, rather than a string
@@ -33,7 +33,7 @@ module MARC
33
33
  when 'SCO' then MARC::ScoreRecord.new_from_record(record)
34
34
  when 'REC' then MARC::SoundRecord.new_from_record(record)
35
35
  when 'COM' then MARC::ComputerRecord.new_from_record(record)
36
- end
36
+ end
37
37
  typed_record.fields.reindex
38
38
  typed_record
39
39
  end
@@ -50,6 +50,9 @@ module MARC
50
50
  def composition_form(human_readable=false)
51
51
  end
52
52
 
53
+ def bibliographic_level
54
+ @leader.get_blvl
55
+ end
53
56
 
54
57
  def publication_country
55
58
  return self['008'].value[15,3].strip unless self['008'].value[15,3] == ' '