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.
@@ -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
@@ -0,0 +1,12 @@
1
+ root = true
2
+
3
+ [*]
4
+ indent_style = space
5
+ indent_size = 2
6
+ end_of_line = lf
7
+ charset = utf-8
8
+ trim_trailing_whitespace = true
9
+ insert_final_newline = true
10
+
11
+ [*.{sh,markdown}]
12
+ indent_size = 4
@@ -0,0 +1,2 @@
1
+
2
+ Gemfile.lock
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
@@ -0,0 +1,7 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.0
4
+ - 2.2
5
+ - 2.3
6
+ - jruby
7
+ script: bundle exec rspec spec
data/Changes CHANGED
@@ -1 +1,2 @@
1
- 2009-08-07: Refactored to monkeypatch ruby-marc rather than replace it.
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
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+ source "https://rubygems.org"
3
+
4
+ gem 'marc'
5
+ gem 'locale'
6
+
7
+ group :test do
8
+ gem 'rspec'
9
+ end
@@ -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
+ [![Build Status](https://travis-ci.org/rsinger/enhanced-marc.svg?branch=master)](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
@@ -1,4 +1,4 @@
1
- RUBY_ENHANCED_MARC_VERSION = '0.1'
1
+ RUBY_ENHANCED_MARC_VERSION = '0.3.0'
2
2
 
3
3
  require 'rubygems'
4
4
  require 'rake'
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.1
1
+ 0.3.0
@@ -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.2.3"
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
- "README"
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"]
@@ -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
- self.extend BookType
15
- self.inspect_fixed_fields
13
+ extend BookType
14
+ inspect_fixed_fields
16
15
  end
17
-
18
- def is_valid_type?
19
- return false unless @leader[6,1].match(/[at]{1}/)
20
- return true
16
+
17
+ def valid_type?
18
+ return false unless @leader[6, 1] =~ /[at]{1}/
19
+ true
21
20
  end
22
- def is_valid_blvl?
23
- return false unless @leader[7,1].match(/[acdm]{1}/)
24
- return true
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 { | var |
31
+ record.instance_variables.each do |var|
29
32
  rec.instance_variable_set(var, record.instance_variable_get(var))
30
- }
31
- return Exception.new("Incorrect type declaration in leader") unless rec.is_valid_type?
32
- return Exception.new("Incorrect bibliographic declaration in leader") unless rec.is_valid_blvl?
33
- return rec
34
- end
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, :form, :has_index?
4
- # Checks the leader and any 006 fields to
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 is_manuscript?
9
+ def manuscript?
8
10
  return true if @leader[6,1] == 't'
9
- @fields.find_all {|f| ('006') === f.tag}.each { | fxd_fld |
10
- return true if fxd_fld.value[0,1] == 't'
11
- }
12
- return false
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
- def set_manuscript(value=false, field=nil)
16
+
17
+ alias is_manuscript? manuscript?
18
+
19
+ def set_manuscript(value = false, field = nil)
16
20
  if field
17
- return Exception.new("Field is not an 006") unless field.tag == '006'
18
- if value
19
- field.value[0] = 't'
20
- else
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
- 'd'=>'Drama', 'e'=>'Essay', 'f'=>'Novel', 'h'=>'Humor/satire', 'i'=>'Letter', 'j'=>'Short story',
35
- 'm'=>'Mixed', 'p'=>'Poetry', 's'=>'Speech', 'u'=>'Unknown'}
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
- return self.field_parser({:match=>'BKS', :start=>33,:end=>1}, {:match=>/[at]{1}/, :start=>16,:end=>1}, human_readable)
38
- end
39
-
40
- def is_biography?(human_readable=false)
41
- biog_map = {'a'=>'Autobiography', 'b'=>'Individual biography',
42
- 'c'=>'Collective biography', 'd'=>'Contains biographical information'}
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
- return self.field_parser({:match=>'BKS', :start=>34,:end=>1}, {:match=>/[at]{1}/, :start=>17,:end=>1}, human_readable)
45
- end
46
-
47
- def is_festschrift?
48
- return true if self['008'].value[30,1] == "1" and @record_type == "BKS"
49
- @fields.find_all {|f| ('006') === f.tag}.each { | fxd_fld |
50
- next unless fxd_fld.value[0,1].match(/[at]{1}/) and fxd_fld.value[13,1] == "1"
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
- return false
54
- end
55
-
56
- def is_illustrated?(human_readable=false)
57
- ills_map = {'a'=>'Illustrations','b'=>'Maps','c'=>'Portraits','d'=>'Charts',
58
- 'e'=>'Plans', 'f'=>'Plates', 'g'=>'Music', 'h'=>'Facsimilies', 'i'=>'Coats of arms',
59
- 'j'=>'Genealogical tables', 'k'=>'Forms', 'l'=>'Samples',
60
- 'm'=>'Phonodisc', 'o'=>'Photographs', 'p'=>'Illuminations'}
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 self.record_type == 'BKS'
64
- self['008'].value[18,4].split(//).each { | char |
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.find_all {|f| ('006') === f.tag}.each { | fxd_fld |
74
- next unless fxd_fld.value[0,1].match(/[at]{1}/)
75
- fxd_fld.value[1,4].split(//).each { | char |
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
- return contents
86
- end
87
- end
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
- self.extend ComputerType
15
- self.inspect_fixed_fields
13
+ extend ComputerType
14
+ inspect_fixed_fields
16
15
  end
17
-
18
- def is_valid_type?
19
- return false unless @leader[6,1].match('m')
20
- return true
16
+
17
+ def valid_type?
18
+ return false unless @leader[6, 1] == 'm'
19
+ true
21
20
  end
22
- def is_valid_blvl?
23
- return false unless @leader[7,1].match(/[abcdims]{1}/)
24
- return true
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 { | var |
31
+ record.instance_variables.each do |var|
29
32
  rec.instance_variable_set(var, record.instance_variable_get(var))
30
- }
31
- return Exception.new("Incorrect type declaration in leader") unless rec.is_valid_type?
32
- return Exception.new("Incorrect bibliographic declaration in leader") unless rec.is_valid_blvl?
33
- return rec
34
- end
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