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.
@@ -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] == ' '