rmarc 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,4 +1,5 @@
1
- # $Id: constants.rb,v 1.2 2005/12/02 16:57:26 bpeters Exp $
1
+ #--
2
+ # $Id: constants.rb,v 1.3 2005/12/09 15:26:03 bpeters Exp $
2
3
  #
3
4
  # Copyright (c) 2005 Bas Peters
4
5
  #
@@ -17,13 +18,13 @@
17
18
  # You should have received a copy of the GNU Lesser General Public
18
19
  # License along with RMARC; if not, write to the Free Software
19
20
  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
- #
21
+ #++
21
22
  module RMARC
22
23
 
23
24
  class Constants
24
25
 
25
26
  def Constants.VERSION
26
- return "1.0rc1"
27
+ return "0.1.2"
27
28
  end
28
29
 
29
30
  def Constants.RT
@@ -1,4 +1,5 @@
1
- # $Id: marc_stream_reader.rb,v 1.3 2005/12/05 19:36:41 bpeters Exp $
1
+ #--
2
+ # $Id: marc_stream_reader.rb,v 1.5 2005/12/11 15:33:22 bpeters Exp $
2
3
  #
3
4
  # Copyright (c) 2005 Bas Peters
4
5
  #
@@ -17,30 +18,41 @@
17
18
  # You should have received a copy of the GNU Lesser General Public
18
19
  # License along with RMARC; if not, write to the Free Software
19
20
  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
- #
21
+ #++
21
22
  module RMARC
22
23
 
23
- # An iterator over a collection of MARC records in ISO 2709 format.
24
+ # This class provides an iterator over a collection of MARC records in ISO 2709 format.
24
25
  #
25
26
  # Example usage:
26
27
  #
27
- # File.open("file.mrc", "r") do |file|
28
- # reader = RMARC::MarcStreamReader.new(file)
29
- # while reader.has_next
30
- # record = reader.next()
31
- # end
28
+ # reader = RMARC::MarcStreamReader.new("file.mrc")
29
+ # while reader.has_next
30
+ # record = reader.next()
31
+ # end
32
+ #
33
+ # You can also pass a file object:
34
+ #
35
+ # input = File.new("file.mrc")
36
+ # reader = RMARC::MarcStreamReader.new(input)
37
+ # while reader.has_next
38
+ # record = reader.next()
39
+ # end
40
+ # input.close
41
+ #
42
+ # Or any other IO subclass.
43
+
32
44
  class MarcStreamReader
33
45
 
34
- $input = nil
46
+ private
35
47
 
36
48
  def parse_data_field(entry)
37
49
  msg = "Unexpected EOF while reading field with tag #{entry.tag}"
38
50
 
39
- ind1 = $input.read(1)
51
+ ind1 = @input.read(1)
40
52
 
41
53
  raise msg if ind1 == nil
42
54
 
43
- ind2 = $input.read(1)
55
+ ind2 = @input.read(1)
44
56
 
45
57
  raise msg if ind2 == nil
46
58
 
@@ -51,12 +63,12 @@ module RMARC
51
63
  i = 2
52
64
 
53
65
  while i < entry.length
54
- s = $input.read(1)
66
+ s = @input.read(1)
55
67
  if s == nil
56
68
  raise msg
57
69
  elsif s == Constants.US
58
70
  field.add(Subfield.new(code, data)) if code != nil
59
- code = $input.read(1)
71
+ code = @input.read(1)
60
72
  i += 1
61
73
  data = ""
62
74
  elsif s == Constants.FT
@@ -69,9 +81,11 @@ module RMARC
69
81
  return field
70
82
  end
71
83
 
84
+ public
85
+
72
86
  # Returns the next record in the iteration.
73
87
  def next
74
- ldr = $input.read(24)
88
+ ldr = @input.read(24)
75
89
 
76
90
  raise "Unexpected EOF while reading record label" if ldr == nil
77
91
 
@@ -83,18 +97,18 @@ module RMARC
83
97
 
84
98
  raise "Invalid directory" if length % 12 != 0
85
99
 
86
- dir = $input.read(length)
100
+ dir = @input.read(length)
87
101
 
88
102
  entries = length / 12
89
103
 
90
- raise "Expected field terminator" if $input.read(1) != Constants.FT
104
+ raise "Expected field terminator" if @input.read(1) != Constants.FT
91
105
 
92
106
  start = 0
93
107
 
94
108
  entries.times do
95
109
  entry = Directory.new(dir[start, 3], dir[start += 3, 4], dir[start += 4, 5])
96
110
  if (entry.tag.to_i < 10)
97
- data = $input.read(entry.length)
111
+ data = @input.read(entry.length)
98
112
 
99
113
  raise "Unexpected EOF while reading field with tag #{entry.tag}" if data == nil
100
114
 
@@ -105,14 +119,14 @@ module RMARC
105
119
  start += 5
106
120
  end
107
121
 
108
- raise "Expected record terminator" if $input.read(1) != Constants.RT
122
+ raise "Expected record terminator" if @input.read(1) != Constants.RT
109
123
 
110
124
  return record
111
125
  end
112
126
 
113
127
  # Returns true if the iteration has more records, false otherwise.
114
128
  def has_next
115
- if $input.eof == false
129
+ if @input.eof == false
116
130
  return true
117
131
  else
118
132
  return false
@@ -121,7 +135,13 @@ module RMARC
121
135
 
122
136
  # Default constructor
123
137
  def initialize(input)
124
- $input = input
138
+ if input.class == String
139
+ @input = File.new(input)
140
+ elsif input.class == File
141
+ @input = input
142
+ else
143
+ throw "Unable to read from path or file"
144
+ end
125
145
  end
126
146
  end
127
147
 
@@ -1,4 +1,5 @@
1
- # $Id: marc_stream_writer.rb,v 1.3 2005/12/05 19:36:41 bpeters Exp $
1
+ #--
2
+ # $Id: marc_stream_writer.rb,v 1.5 2005/12/11 15:33:22 bpeters Exp $
2
3
  #
3
4
  # Copyright (c) 2005 Bas Peters
4
5
  #
@@ -17,28 +18,26 @@
17
18
  # You should have received a copy of the GNU Lesser General Public
18
19
  # License along with RMARC; if not, write to the Free Software
19
20
  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
- #
21
+ # ++
21
22
  module RMARC
22
23
 
23
24
  # Class for writing MARC record objects in ISO 2709 format.
24
25
  #
25
- # The following example reads a file with MARCXML records
26
+ # The following example reads a file with MARC XML records
26
27
  # and outputs the record set in ISO 2709 format:
27
28
  #
28
- # File.open("file.mrc", "r") do |file|
29
- # reader = RMARC::MarcStreamReader.new(file)
30
- # writer = RMARC::MarcStreamWriter.new(STDOUT)
31
- # while reader.has_next
32
- # record = reader.next()
33
- # writer.write_record(record)
34
- # end
29
+ # writer = RMARC::MarcStreamWriter.new(STDOUT)
30
+ # reader = RMARC::MarcXmlReader.new("file.xml")
31
+ # while reader.has_next
32
+ # record = reader.next()
33
+ # writer.write_record(record)
34
+ # end
35
+
35
36
  class MarcStreamWriter
36
37
 
37
- $output = nil
38
-
39
38
  # Default constructor.
40
39
  def initialize(output)
41
- $output = output
40
+ @output = output
42
41
  end
43
42
 
44
43
  # Writes a single record to the given output stream.
@@ -66,7 +65,7 @@ module RMARC
66
65
  leader.base_address = 24 + dir.length
67
66
  leader.record_length = leader.base_address + data.length + 1
68
67
 
69
- $output.write(leader.to_s << dir << data << Constants.RT)
68
+ @output.write(leader.to_s << dir << data << Constants.RT)
70
69
  end
71
70
  end
72
71
 
@@ -1,4 +1,5 @@
1
- # $Id: marc_xml_reader.rb,v 1.3 2005/12/05 19:36:41 bpeters Exp $
1
+ #--
2
+ # $Id: marc_xml_reader.rb,v 1.5 2005/12/11 15:33:22 bpeters Exp $
2
3
  #
3
4
  # Copyright (c) 2005 Bas Peters
4
5
  #
@@ -17,7 +18,7 @@
17
18
  # You should have received a copy of the GNU Lesser General Public
18
19
  # License along with RMARC; if not, write to the Free Software
19
20
  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
- #
21
+ #++
21
22
  require 'rexml/document'
22
23
  require 'thread'
23
24
 
@@ -25,38 +26,32 @@ module RMARC
25
26
 
26
27
  class RecordStack < SizedQueue
27
28
 
28
- attr_reader :has_next
29
- attr_writer :has_next
29
+ attr_accessor :has_next
30
+
30
31
  end
31
32
 
32
33
  class Listener
33
34
 
34
- $record = nil
35
- $queue = nil
36
- $field = nil
37
- $subfield = nil
38
- $data = nil
39
-
40
35
  def tag_start(name, attrs)
41
36
  re = /(\w+):(\w+)/
42
37
  md = re.match(name)
43
38
  name = $2 if ($2 != nil)
44
39
  case name
45
40
  when "collection"
46
- $queue.has_next = true
41
+ @queue.has_next = true
47
42
  when "record"
48
- $record = Record.new
43
+ @record = Record.new
49
44
  when "controlfield"
50
- $field = ControlField.new(attrs["tag"])
45
+ @field = ControlField.new(attrs["tag"])
51
46
  when "datafield"
52
- $field = DataField.new(attrs["tag"], attrs["ind1"], attrs["ind2"])
47
+ @field = DataField.new(attrs["tag"], attrs["ind1"], attrs["ind2"])
53
48
  when "subfield"
54
- $subfield = Subfield.new(attrs["code"])
49
+ @subfield = Subfield.new(attrs["code"])
55
50
  end
56
51
  end
57
52
 
58
53
  def text(text)
59
- $data = text
54
+ @data = text
60
55
  end
61
56
 
62
57
  def tag_end(name)
@@ -65,23 +60,23 @@ module RMARC
65
60
  name = $2 if ($2 != nil)
66
61
  case name
67
62
  when "collection"
68
- $queue.has_next = false
63
+ @queue.has_next = false
69
64
  when "record"
70
- $queue.push($record)
65
+ @queue.push(@record)
71
66
  when "leader"
72
- leader = Leader.new($data)
73
- $data = ""
74
- $record.leader = leader
67
+ leader = Leader.new(@data)
68
+ @data = ""
69
+ @record.leader = leader
75
70
  when "controlfield"
76
- $field.data = $data
77
- $data = ""
78
- $record.add($field)
71
+ @field.data = @data
72
+ @data = ""
73
+ @record.add(@field)
79
74
  when "datafield"
80
- $record.add($field)
75
+ @record.add(@field)
81
76
  when "subfield"
82
- $subfield.data = $data
83
- $data = ""
84
- $field.add($subfield)
77
+ @subfield.data = @data
78
+ @data = ""
79
+ @field.add(@subfield)
85
80
  end
86
81
  end
87
82
 
@@ -89,38 +84,52 @@ module RMARC
89
84
  end
90
85
 
91
86
  def initialize(queue)
92
- $queue = queue
87
+ @queue = queue
93
88
  end
94
89
 
95
90
  end
96
91
 
97
- # An iterator over a collection of MARC XML records.
92
+ # This class provides an iterator over a collection of MARC XML records.
98
93
  #
99
94
  # Example usage:
100
95
  #
101
- # File.open("test/file.xml", "r") do |file|
102
- # reader = RMARC::MarcXmlReader.new(file)
103
- # while reader.has_next
104
- # record = reader.next()
105
- # end
96
+ # reader = RMARC::MarcXmlReader.new("file.xml")
97
+ # while reader.has_next
98
+ # record = reader.next()
99
+ # end
100
+ #
101
+ # You can also pass a file object:
102
+ #
103
+ # input = File.new("file.mrc")
104
+ # reader = RMARC::MarcXmlReader.new(input)
105
+ # while reader.has_next
106
+ # record = reader.next()
107
+ # end
108
+ # input.close
109
+ #
110
+ # Or any other IO subclass.
111
+
106
112
  class MarcXmlReader
107
113
 
108
- $queue = nil
109
- $input = nil
110
-
111
114
  # Default constructor
112
115
  def initialize(input)
113
- $input = input
114
- $queue = RecordStack.new(1)
116
+ if input.class == String
117
+ @input = File.new(input)
118
+ elsif input.class == File
119
+ @input = input
120
+ else
121
+ throw "Unable to read from path or file"
122
+ end
123
+ @queue = RecordStack.new(1)
115
124
  Thread.new do
116
- producer = Listener.new($queue)
117
- REXML::Document.parse_stream($input, producer)
125
+ producer = Listener.new(@queue)
126
+ REXML::Document.parse_stream(@input, producer)
118
127
  end
119
128
  end
120
129
 
121
130
  # Returns true if the iteration has more records, false otherwise.
122
131
  def has_next
123
- if ($queue.has_next == false && $queue.empty?)
132
+ if (@queue.has_next == false && @queue.empty?)
124
133
  return false
125
134
  else
126
135
  return true
@@ -129,7 +138,7 @@ module RMARC
129
138
 
130
139
  # Returns the next record in the iteration.
131
140
  def next
132
- obj = $queue.pop
141
+ obj = @queue.pop
133
142
  return obj
134
143
  end
135
144
  end
@@ -1,4 +1,5 @@
1
- # $Id: marc_xml_writer.rb,v 1.3 2005/12/05 19:36:41 bpeters Exp $
1
+ #--
2
+ # $Id: marc_xml_writer.rb,v 1.5 2005/12/11 15:33:22 bpeters Exp $
2
3
  #
3
4
  # Copyright (c) 2005 Bas Peters
4
5
  #
@@ -17,39 +18,65 @@
17
18
  # You should have received a copy of the GNU Lesser General Public
18
19
  # License along with RMARC; if not, write to the Free Software
19
20
  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
- #
21
+ #++
21
22
  require 'rexml/document'
22
23
 
23
24
  module RMARC
24
-
25
+
25
26
  # Class for writing MARC record objects in MARC XML format.
26
- #
27
- # writer = RMARC::MarcXmlWriter.new(STDOUT)
28
- # File.open("file.mrc", "r") do |file|
29
- # reader = RMARC::MarcStreamReader.new(file)
30
- # writer.start_document
31
- # while reader.has_next
32
- # record = reader.next()
33
- # writer.write_record(record)
34
- # end
35
- # writer.end_document
27
+ #
28
+ # The following example reads a file with MARC records
29
+ # and outputs the record set in MARC XML format:
30
+ #
31
+ # writer = RMARC::MarcXmlWriter.new(STDOUT)
32
+ # reader = RMARC::MarcStreamReader.new("file.mrc")
33
+ # writer.start_document
34
+ # while reader.has_next
35
+ # record = reader.next()
36
+ # writer.write_record(record)
37
+ # end
38
+ # writer.end_document
39
+ #
40
+ # See: http://www.loc.gov/standards/marcxml for more information about MARC XML.
41
+
36
42
  class MarcXmlWriter
37
43
 
38
- $output = nil
39
-
40
44
  # Default constructor.
41
45
  def initialize(output)
42
- $output = output
46
+ @output = output
43
47
  end
44
48
 
45
- # Writes the XML declaration and the collection start tag.
46
- def start_document
47
- $output.write(REXML::XMLDecl.new)
48
- $output.write("\n<collection xmlns=\"http://www.loc.gov/MARC21/slim\">\n ")
49
+ # Writes the XML declaration and the collection start tag:
50
+ #
51
+ # <?xml version='1.0' encoding='UTF-8'?>
52
+ # <collection xmlns="http://www.loc.gov/MARC21/slim">
53
+ #
54
+ # The default encoding is UTF-8.
55
+ def start_document(encoding = nil)
56
+ decl = REXML::XMLDecl.new
57
+ if encoding
58
+ decl.encoding = encoding
59
+ else
60
+ decl.encoding = "UTF-8"
61
+ end
62
+ @output.write(decl)
63
+ @output.write("\n<collection xmlns=\"http://www.loc.gov/MARC21/slim\">")
49
64
  end
50
65
 
51
- # Writes a single record element.
66
+ # Writes a single record element:
67
+ #
68
+ # <record>
69
+ # <leader>00714cam a2200205 a 4500</leader>
70
+ # <controlfield tag='001'>12883376</controlfield>
71
+ # ...
72
+ # <datafield tag='245' ind1='1' ind2='0'>
73
+ # <subfield code='a'>Summerland /</subfield>
74
+ # <subfield code='c'>Michael Chabon.</subfield>
75
+ # </datafield>
76
+ # ...
77
+ # </record>
52
78
  def write_record(record)
79
+ @output.write("\n ")
53
80
  rec = REXML::Element.new('record')
54
81
  ldr = REXML::Element.new('leader')
55
82
  ldr.add_text(record.leader.to_s)
@@ -75,12 +102,14 @@ module RMARC
75
102
  rec.add_element(fld)
76
103
  end
77
104
  }
78
- rec.write($output, 1)
105
+ rec.write(@output, 1)
79
106
  end
80
107
 
81
- # Writes the collection end tag.
108
+ # Writes the collection end tag:
109
+ #
110
+ # </collection>
82
111
  def end_document
83
- $output.write("\n</collection>")
112
+ @output.write("\n</collection>")
84
113
  end
85
114
 
86
115
  end
@@ -1,4 +1,5 @@
1
- # $Id: control_field.rb,v 1.3 2005/12/05 19:36:41 bpeters Exp $
1
+ #--
2
+ # $Id: control_field.rb,v 1.4 2005/12/09 15:25:52 bpeters Exp $
2
3
  #
3
4
  # Copyright (c) 2005 Bas Peters
4
5
  #
@@ -17,16 +18,16 @@
17
18
  # You should have received a copy of the GNU Lesser General Public
18
19
  # License along with RMARC; if not, write to the Free Software
19
20
  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
- #
21
+ #++
21
22
  require 'rmarc/model/variable_field'
22
23
 
23
24
  module RMARC
24
25
 
25
- # Represents a control field in a MARC record.
26
+ # This class represents a control field in a MARC record.
27
+
26
28
  class ControlField < VariableField
27
- attr_reader :data
28
-
29
- attr_writer :data
29
+
30
+ attr_accessor :data
30
31
 
31
32
  def initialize(tag, data = nil)
32
33
  super(tag)
@@ -34,6 +35,10 @@ module RMARC
34
35
  end
35
36
 
36
37
  # Returns a string representaiton for a conctrol field.
38
+ #
39
+ # Example:
40
+ #
41
+ # 001 11939876
37
42
  def to_s
38
43
  super + "#@data"
39
44
  end
@@ -1,4 +1,5 @@
1
- ## $Id: data_field.rb,v 1.3 2005/12/05 19:37:09 bpeters Exp $
1
+ #--
2
+ # $Id: data_field.rb,v 1.4 2005/12/09 15:25:52 bpeters Exp $
2
3
  #
3
4
  # Copyright (c) 2005 Bas Peters
4
5
  #
@@ -17,19 +18,31 @@
17
18
  # You should have received a copy of the GNU Lesser General Public
18
19
  # License along with RMARC; if not, write to the Free Software
19
20
  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
- #
21
+ #++
21
22
  require 'rmarc/model/variable_field'
22
23
 
23
24
  module RMARC
24
25
 
25
- # Represents a data field in a MARC record. The module Enumerable is
26
- # mixed in to enable searching within subfields using each.
26
+ # This class represents a data field in a MARC record.
27
+ #
28
+ # The module Enumerable is included to enable searching within subfields using each.
29
+ #
30
+ # To iterate over all subfields:
31
+ #
32
+ # field.each { |s| print s }
33
+ #
34
+ # To retrieve subfield with code 'a':
35
+ #
36
+ # field.find {|s| s.code == 'a'}
37
+ #
38
+ # To retrieve subfields with code 'a' through 'c':
39
+ #
40
+ # field.find_all {|s| ('a'..'c' === s.code)}
41
+
27
42
  class DataField < VariableField
28
43
  include Enumerable
29
44
 
30
- attr_reader :ind1, :ind2, :subfields
31
-
32
- attr_writer :ind1, :ind2, :subfields
45
+ attr_accessor :ind1, :ind2, :subfields
33
46
 
34
47
  def initialize(tag, ind1, ind2)
35
48
  super(tag)
@@ -57,6 +70,10 @@ module RMARC
57
70
  end
58
71
 
59
72
  # Returns a string representation of the data field.
73
+ #
74
+ # Example:
75
+ #
76
+ # 100 1 $aChabon, Michael.
60
77
  def to_s
61
78
  a = ""
62
79
  a << super << @ind1 << @ind2
@@ -1,4 +1,5 @@
1
- # $Id: directory.rb,v 1.3 2005/12/05 19:36:41 bpeters Exp $
1
+ #--
2
+ # $Id: directory.rb,v 1.4 2005/12/09 15:25:52 bpeters Exp $
2
3
  #
3
4
  # Copyright (c) 2005 Bas Peters
4
5
  #
@@ -17,15 +18,15 @@
17
18
  # You should have received a copy of the GNU Lesser General Public
18
19
  # License along with RMARC; if not, write to the Free Software
19
20
  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
- #
21
+ #++
21
22
  module RMARC
22
23
 
23
- # Represents a directory in a MARC record.
24
+ # This class represents a directory in a MARC record.
25
+
24
26
  class Directory
25
- attr_reader :tag, :length, :start
26
-
27
- attr_writer :tag, :length, :start
28
-
27
+
28
+ attr_accessor :tag, :length, :start
29
+
29
30
  def initialize(tag, length, start)
30
31
  @tag = tag
31
32
  @length = length.to_i
@@ -1,4 +1,5 @@
1
- # $Id: leader.rb,v 1.4 2005/12/07 19:50:35 bpeters Exp $
1
+ #--
2
+ # $Id: leader.rb,v 1.5 2005/12/09 15:25:52 bpeters Exp $
2
3
  #
3
4
  # Copyright (c) 2005 Bas Peters
4
5
  #
@@ -17,15 +18,14 @@
17
18
  # You should have received a copy of the GNU Lesser General Public
18
19
  # License along with RMARC; if not, write to the Free Software
19
20
  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
- #
21
+ #++
21
22
  module RMARC
22
23
 
23
- # Represents a leader or record label in a MARC record.
24
+ # This class represents a leader or record label in a MARC record.
25
+
24
26
  class Leader
25
27
 
26
- attr_reader :record_length, :record_status, :record_type, :impl_defined1, :char_coding, :indicator_count, :subfield_code_length, :base_address, :impl_defined2, :entry_map
27
-
28
- attr_writer :record_length, :record_status, :record_type, :impl_defined1, :char_coding, :indicator_count, :subfield_code_length, :base_address, :impl_defined2, :entry_map
28
+ attr_accessor :record_length, :record_status, :record_type, :impl_defined1, :char_coding, :indicator_count, :subfield_code_length, :base_address, :impl_defined2, :entry_map
29
29
 
30
30
  def initialize(ldr = nil)
31
31
  if (ldr == nil)
@@ -53,7 +53,11 @@ module RMARC
53
53
  end
54
54
  end
55
55
 
56
- # Returns a string representation for a MARC record.
56
+ # Returns a string representation for a leader.
57
+ #
58
+ # Example:
59
+ #
60
+ # 00714cam a2200205 a 4500
57
61
  def to_s
58
62
  "%05d" % @record_length +
59
63
  "#@record_status#@record_type#@impl_defined1#@char_coding" +
@@ -1,4 +1,5 @@
1
- # $Id: record.rb,v 1.3 2005/12/05 19:37:09 bpeters Exp $
1
+ #--
2
+ # $Id: record.rb,v 1.5 2005/12/11 15:32:37 bpeters Exp $
2
3
  #
3
4
  # Copyright (c) 2005 Bas Peters
4
5
  #
@@ -17,18 +18,25 @@
17
18
  # You should have received a copy of the GNU Lesser General Public
18
19
  # License along with RMARC; if not, write to the Free Software
19
20
  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
- #
21
+ #++
21
22
  module RMARC
22
23
 
23
- # Represents a MARC record. The module Enumerable is
24
- # mixed in to enable searching within variable fields
25
- # using each.
24
+ # This class represents a MARC record.
25
+ #
26
+ # The module Enumerable is included to enable searching within variable fields using each.
27
+ #
28
+ # To iterate over all fields:
29
+ #
30
+ # record.each { |f| print f }
31
+ #
32
+ # To retrieve the data field for tag 245:
33
+ #
34
+ # field = record.find {|f| f.tag == '245'}
35
+
26
36
  class Record
27
37
  include Enumerable
28
38
 
29
- attr_reader :leader, :fields
30
-
31
- attr_writer :leader, :fields
39
+ attr_accessor :leader, :fields
32
40
 
33
41
  def initialize(leader = nil)
34
42
  @leader = leader
@@ -45,8 +53,7 @@ module RMARC
45
53
  @fields.delete(fld)
46
54
  end
47
55
 
48
- # Implements Enumarable.each to provide an iterator over all
49
- # variable fields.
56
+ # Implements Enumarable.each to provide an iterator over all variable fields.
50
57
  def each
51
58
  for field in @fields
52
59
  yield field
@@ -54,6 +61,26 @@ module RMARC
54
61
  end
55
62
 
56
63
  # Returns a string representation of the record.
64
+ #
65
+ # Example:
66
+ #
67
+ # Leader: 00714cam a2200205 a 4500
68
+ # 001 12883376
69
+ # 005 20030616111422.0
70
+ # 008 020805s2002 nyu j 000 1 eng
71
+ # 020 $a0786808772
72
+ # 020 $a0786816155 (pbk.)
73
+ # 040 $aDLC$cDLC$dDLC
74
+ # 100 1 $aChabon, Michael.
75
+ # 245 10$aSummerland /$cMichael Chabon.
76
+ # 250 $a1st ed.
77
+ # 260 $aNew York :$bMiramax Books/Hyperion Books for Children,$cc2002.
78
+ # 300 $a500 p. ;$c22 cm.
79
+ # 650 1$aFantasy.
80
+ # 650 1$aBaseball$vFiction.
81
+ # 650 1$aMagic$vFiction.
82
+ #
83
+ # Use RMARC::MarcStreamWriter to serialize records to ISO 2709 format.
57
84
  def to_s
58
85
  a = "Leader: #{@leader.to_s}\n"
59
86
  @fields.each { |f| a << "#{f.to_s}\n" }
@@ -1,4 +1,5 @@
1
- # $Id: subfield.rb,v 1.3 2005/12/05 19:36:41 bpeters Exp $
1
+ #--
2
+ # $Id: subfield.rb,v 1.4 2005/12/09 15:25:52 bpeters Exp $
2
3
  #
3
4
  # Copyright (c) 2005 Bas Peters
4
5
  #
@@ -17,20 +18,26 @@
17
18
  # You should have received a copy of the GNU Lesser General Public
18
19
  # License along with RMARC; if not, write to the Free Software
19
20
  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
- #
21
+ #++
21
22
  module RMARC
22
23
 
23
- # Represents a subfield in a MARC record.
24
+ # This class represents a subfield in a MARC record.
25
+
24
26
  class Subfield
25
- attr_reader :code, :data
26
-
27
- attr_writer :code, :data
27
+
28
+ attr_accessor :code, :data
28
29
 
30
+ # Default constructor
29
31
  def initialize(code, data = nil)
30
32
  @code = code
31
33
  @data = data
32
34
  end
33
35
 
36
+ # Returns a string representation for a subfield.
37
+ #
38
+ # Example:
39
+ #
40
+ # $aChabon, Michael.
34
41
  def to_s
35
42
  "$#@code#@data"
36
43
  end
@@ -1,4 +1,5 @@
1
- # $Id: variable_field.rb,v 1.3 2005/12/05 19:36:41 bpeters Exp $
1
+ #--
2
+ # $Id: variable_field.rb,v 1.4 2005/12/09 15:25:52 bpeters Exp $
2
3
  #
3
4
  # Copyright (c) 2005 Bas Peters
4
5
  #
@@ -17,19 +18,21 @@
17
18
  # You should have received a copy of the GNU Lesser General Public
18
19
  # License along with RMARC; if not, write to the Free Software
19
20
  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
- #
21
+ #++
21
22
  module RMARC
22
23
 
23
- # Represents a variable field in a MARC record.
24
+ # This class represents a variable field in a MARC record.
25
+
24
26
  class VariableField
25
- attr_reader :tag
26
-
27
- attr_writer :tag
27
+
28
+ attr_accessor :tag
28
29
 
30
+ # Default constructor
29
31
  def initialize(tag)
30
32
  @tag = tag
31
33
  end
32
34
 
35
+ # Returns a string representation for the tag value.
33
36
  def to_s
34
37
  "#@tag "
35
38
  end
@@ -1,4 +1,5 @@
1
- # $Id: test_model.rb,v 1.1 2005/12/07 19:56:56 bpeters Exp $
1
+ #--
2
+ # $Id: test_model.rb,v 1.3 2005/12/10 16:27:52 bpeters Exp $
2
3
  #
3
4
  # Copyright (c) 2005 Bas Peters
4
5
  #
@@ -17,7 +18,7 @@
17
18
  # You should have received a copy of the GNU Lesser General Public
18
19
  # License along with RMARC; if not, write to the Free Software
19
20
  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
- #
21
+ #++
21
22
  $: << File.dirname(__FILE__) + "/.." << File.dirname(__FILE__) + "/../lib"
22
23
 
23
24
  require 'test/unit'
@@ -38,17 +39,26 @@ class TestModel < Test::Unit::TestCase
38
39
  end
39
40
 
40
41
  def test_data_field
41
- field = RMARC::DataField.new("245", "1", "0")
42
+ field = RMARC::DataField.new("245", "1", "0")
42
43
  assert_equal("245", field.tag)
43
44
  assert_equal("1", field.ind1)
44
45
  assert_equal("0", field.ind2)
45
46
  assert_equal(0, field.subfields.length)
47
+
46
48
  subfield = RMARC::Subfield.new("a", "Summerland")
47
49
  field.add(subfield)
48
50
  assert_equal(1, field.subfields.length)
51
+
49
52
  subfield = RMARC::Subfield.new("c", "Michael Chabon")
50
53
  field.add(subfield)
51
54
  assert_equal(2, field.subfields.length)
55
+
56
+ author = field.find {|s| s.code == 'c'}
57
+ assert_equal("Michael Chabon", author.data)
58
+
59
+ all = field.find_all {|s| ('a'..'e' === s.code)}
60
+ assert_equal(2, all.length)
61
+
52
62
  field.remove(subfield)
53
63
  assert_equal(1, field.subfields.length)
54
64
  assert_equal("a", field.subfields.last.code)
@@ -68,11 +78,14 @@ class TestModel < Test::Unit::TestCase
68
78
  field = RMARC::ControlField.new("001", "12883376")
69
79
  record.add(field)
70
80
  assert_equal(1, record.fields.length)
81
+
71
82
  field = RMARC::DataField.new("245", "1", "0")
72
83
  record.add(field)
73
- assert_equal(2, record.fields.length)
74
- record.remove(field)
75
- assert_equal("001", record.fields.last.tag)
84
+ df = record.find {|f| f.tag == '245'}
85
+ assert_equal('245', df.tag)
86
+
87
+ record.remove(field)
88
+ assert_equal('001', record.fields.last.tag)
76
89
  end
77
90
 
78
91
  end
@@ -1,4 +1,5 @@
1
- # $Id: test_reader.rb,v 1.1 2005/12/07 19:56:56 bpeters Exp $
1
+ #--
2
+ # $Id: test_reader.rb,v 1.3 2005/12/09 15:30:46 bpeters Exp $
2
3
  #
3
4
  # Copyright (c) 2005 Bas Peters
4
5
  #
@@ -17,32 +18,30 @@
17
18
  # You should have received a copy of the GNU Lesser General Public
18
19
  # License along with RMARC; if not, write to the Free Software
19
20
  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
- #
21
+ #++
21
22
  $: << File.dirname(__FILE__) + "/.." << File.dirname(__FILE__) + "/../lib"
22
23
 
23
24
  require 'test/unit'
24
25
  require 'rmarc'
25
26
 
26
- class TestMarcReader < Test::Unit::TestCase
27
+ class TestReader < Test::Unit::TestCase
27
28
 
28
29
  def test_parse_marc
29
30
  assert_nothing_raised() {
30
- File.open("test/chabon.mrc", "r") do |file|
31
- reader = RMARC::MarcStreamReader.new(file)
32
- while reader.has_next
33
- record = reader.next()
34
- end
31
+ reader = RMARC::MarcStreamReader.new("test/chabon.mrc")
32
+ while reader.has_next
33
+ record = reader.next()
34
+ puts record.to_s
35
35
  end
36
36
  }
37
37
  end
38
38
 
39
39
  def test_parse_marc_xml
40
40
  assert_nothing_raised() {
41
- File.open("test/chabon.xml", "r") do |file|
42
- reader = RMARC::MarcXmlReader.new(file)
43
- while reader.has_next
44
- record = reader.next()
45
- end
41
+ reader = RMARC::MarcXmlReader.new("test/chabon.xml")
42
+ while reader.has_next
43
+ record = reader.next()
44
+ puts record.to_s
46
45
  end
47
46
  }
48
47
  end
@@ -1,4 +1,5 @@
1
- # $Id: test_writer.rb,v 1.1 2005/12/07 19:56:56 bpeters Exp $
1
+ #--
2
+ # $Id: test_writer.rb,v 1.3 2005/12/09 15:30:46 bpeters Exp $
2
3
  #
3
4
  # Copyright (c) 2005 Bas Peters
4
5
  #
@@ -17,13 +18,13 @@
17
18
  # You should have received a copy of the GNU Lesser General Public
18
19
  # License along with RMARC; if not, write to the Free Software
19
20
  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
- #
21
+ #++
21
22
  $: << File.dirname(__FILE__) + "/.." << File.dirname(__FILE__) + "/../lib"
22
23
 
23
24
  require 'test/unit'
24
25
  require 'rmarc'
25
26
 
26
- class TestMarcWriter < Test::Unit::TestCase
27
+ class TestWriter < Test::Unit::TestCase
27
28
 
28
29
  def test_write_marc
29
30
  assert_nothing_raised() {
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.10
3
3
  specification_version: 1
4
4
  name: rmarc
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.1.1
7
- date: 2005-12-07
6
+ version: 0.2.0
7
+ date: 2005-12-13
8
8
  summary: RMARC is a library for working with MARC and MARC XML data in Ruby
9
9
  require_paths:
10
10
  - lib
@@ -15,7 +15,7 @@ description:
15
15
  autorequire:
16
16
  default_executable:
17
17
  bindir: bin
18
- has_rdoc: false
18
+ has_rdoc: true
19
19
  required_ruby_version: !ruby/object:Gem::Version::Requirement
20
20
  requirements:
21
21
  -