ruby-marc-spec 0.1.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/.github/workflows/build.yml +18 -0
- data/.gitignore +388 -0
- data/.gitmodules +3 -0
- data/.idea/codeStyles/codeStyleConfig.xml +5 -0
- data/.idea/go.imports.xml +6 -0
- data/.idea/inspectionProfiles/Project_Default.xml +23 -0
- data/.idea/marc_spec.iml +102 -0
- data/.idea/misc.xml +6 -0
- data/.idea/modules.xml +8 -0
- data/.idea/templateLanguages.xml +6 -0
- data/.idea/vcs.xml +7 -0
- data/.rubocop.yml +269 -0
- data/.ruby-version +1 -0
- data/.simplecov +8 -0
- data/CHANGES.md +3 -0
- data/Gemfile +6 -0
- data/LICENSE.md +21 -0
- data/README.md +172 -0
- data/Rakefile +20 -0
- data/lib/.rubocop.yml +5 -0
- data/lib/marc/spec/module_info.rb +14 -0
- data/lib/marc/spec/parsing/closed_int_range.rb +28 -0
- data/lib/marc/spec/parsing/closed_lc_alpha_range.rb +28 -0
- data/lib/marc/spec/parsing/parser.rb +213 -0
- data/lib/marc/spec/parsing.rb +1 -0
- data/lib/marc/spec/queries/al_num_range.rb +105 -0
- data/lib/marc/spec/queries/applicable.rb +18 -0
- data/lib/marc/spec/queries/character_spec.rb +81 -0
- data/lib/marc/spec/queries/comparison_string.rb +45 -0
- data/lib/marc/spec/queries/condition.rb +133 -0
- data/lib/marc/spec/queries/condition_context.rb +49 -0
- data/lib/marc/spec/queries/dsl.rb +80 -0
- data/lib/marc/spec/queries/indicator_value.rb +77 -0
- data/lib/marc/spec/queries/operator.rb +129 -0
- data/lib/marc/spec/queries/part.rb +63 -0
- data/lib/marc/spec/queries/position.rb +59 -0
- data/lib/marc/spec/queries/position_or_range.rb +27 -0
- data/lib/marc/spec/queries/query.rb +94 -0
- data/lib/marc/spec/queries/query_executor.rb +52 -0
- data/lib/marc/spec/queries/selector.rb +12 -0
- data/lib/marc/spec/queries/subfield.rb +88 -0
- data/lib/marc/spec/queries/subfield_value.rb +63 -0
- data/lib/marc/spec/queries/tag.rb +107 -0
- data/lib/marc/spec/queries/transform.rb +154 -0
- data/lib/marc/spec/queries.rb +1 -0
- data/lib/marc/spec.rb +32 -0
- data/rakelib/.rubocop.yml +19 -0
- data/rakelib/bundle.rake +8 -0
- data/rakelib/coverage.rake +11 -0
- data/rakelib/gem.rake +54 -0
- data/rakelib/parser_specs/formatter.rb +31 -0
- data/rakelib/parser_specs/parser_specs.rb.txt.erb +35 -0
- data/rakelib/parser_specs/rule.rb +95 -0
- data/rakelib/parser_specs/suite.rb +91 -0
- data/rakelib/parser_specs/test.rb +97 -0
- data/rakelib/parser_specs.rb +1 -0
- data/rakelib/rubocop.rake +18 -0
- data/rakelib/spec.rake +27 -0
- data/ruby-marc-spec.gemspec +42 -0
- data/spec/.rubocop.yml +46 -0
- data/spec/README.md +16 -0
- data/spec/data/b23161018-sru.xml +182 -0
- data/spec/data/sandburg.xml +82 -0
- data/spec/generated/char_indicator_spec.rb +174 -0
- data/spec/generated/char_spec.rb +113 -0
- data/spec/generated/comparison_string_spec.rb +74 -0
- data/spec/generated/field_tag_spec.rb +156 -0
- data/spec/generated/index_char_spec.rb +669 -0
- data/spec/generated/index_indicator_spec.rb +174 -0
- data/spec/generated/index_spec.rb +113 -0
- data/spec/generated/index_sub_spec_spec.rb +1087 -0
- data/spec/generated/indicators_spec.rb +75 -0
- data/spec/generated/position_or_range_spec.rb +110 -0
- data/spec/generated/sub_spec_spec.rb +208 -0
- data/spec/generated/sub_spec_sub_spec_spec.rb +1829 -0
- data/spec/generated/subfield_char_spec.rb +405 -0
- data/spec/generated/subfield_range_range_spec.rb +48 -0
- data/spec/generated/subfield_range_spec.rb +87 -0
- data/spec/generated/subfield_range_sub_spec_spec.rb +214 -0
- data/spec/generated/subfield_tag_range_spec.rb +477 -0
- data/spec/generated/subfield_tag_sub_spec_spec.rb +3216 -0
- data/spec/generated/subfield_tag_tag_spec.rb +5592 -0
- data/spec/marc/spec/parsing/closed_int_range_spec.rb +49 -0
- data/spec/marc/spec/parsing/closed_lc_alpha_range_spec.rb +49 -0
- data/spec/marc/spec/parsing/parser_spec.rb +545 -0
- data/spec/marc/spec/queries/al_num_range_spec.rb +114 -0
- data/spec/marc/spec/queries/character_spec_spec.rb +28 -0
- data/spec/marc/spec/queries/comparison_string_spec.rb +28 -0
- data/spec/marc/spec/queries/indicator_value_spec.rb +28 -0
- data/spec/marc/spec/queries/query_spec.rb +200 -0
- data/spec/marc/spec/queries/subfield_spec.rb +92 -0
- data/spec/marc/spec/queries/subfield_value_spec.rb +31 -0
- data/spec/marc/spec/queries/tag_spec.rb +144 -0
- data/spec/marc/spec/queries/transform_spec.rb +459 -0
- data/spec/marc_spec_spec.rb +247 -0
- data/spec/scratch_spec.rb +112 -0
- data/spec/spec_helper.rb +23 -0
- metadata +341 -0
@@ -0,0 +1,91 @@
|
|
1
|
+
require_relative 'formatter'
|
2
|
+
require_relative 'test'
|
3
|
+
|
4
|
+
module ParserSpecs
|
5
|
+
class Suite
|
6
|
+
include Formatter
|
7
|
+
include Comparable
|
8
|
+
|
9
|
+
attr_reader :description, :rule, :parse_method, :json_path
|
10
|
+
|
11
|
+
# rubocop:disable Metrics/ParameterLists
|
12
|
+
def initialize(description, rule, wild, parse_method, json_path, tests = {})
|
13
|
+
@description = normalize_description(description)
|
14
|
+
@rule = rule
|
15
|
+
@wild = wild
|
16
|
+
@parse_method = parse_method
|
17
|
+
@json_path = json_path
|
18
|
+
tests.each { |t| add_test(t) }
|
19
|
+
end
|
20
|
+
# rubocop:enable Metrics/ParameterLists
|
21
|
+
|
22
|
+
def wild?
|
23
|
+
@wild
|
24
|
+
end
|
25
|
+
|
26
|
+
def tests_by_group
|
27
|
+
@tests_by_group ||= {}
|
28
|
+
end
|
29
|
+
|
30
|
+
def each_test(&block)
|
31
|
+
return to_enum(:each_test) unless block_given?
|
32
|
+
|
33
|
+
tests_by_group.each_value { |tests| tests.each(&block) }
|
34
|
+
end
|
35
|
+
|
36
|
+
def add_test(t)
|
37
|
+
tests_for_group = (tests_by_group[t.group] ||= [])
|
38
|
+
return (tests_for_group << t) unless (existing = tests_for_group.find { |t1| t1.merge?(t) })
|
39
|
+
|
40
|
+
existing.merge(t)
|
41
|
+
end
|
42
|
+
|
43
|
+
def merge?(o)
|
44
|
+
return false unless o.class == self.class
|
45
|
+
raise ArgumentError, "Can't merge #{quote(description)} with self" if o.equal?(self)
|
46
|
+
|
47
|
+
o.description == description && o.parse_method == parse_method
|
48
|
+
end
|
49
|
+
|
50
|
+
def merge(o)
|
51
|
+
o.each_test { |t| add_test(t) }
|
52
|
+
end
|
53
|
+
|
54
|
+
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity
|
55
|
+
def <=>(other)
|
56
|
+
return unless other.class == self.class
|
57
|
+
return 0 if other.equal?(self)
|
58
|
+
|
59
|
+
order = description <=> other.description
|
60
|
+
return order if order != 0
|
61
|
+
|
62
|
+
order = parse_method <=> other.parse_method
|
63
|
+
return order if order != 0
|
64
|
+
|
65
|
+
order = tests.size <=> other.tests.size
|
66
|
+
return order if order != 0
|
67
|
+
|
68
|
+
tests.zip(other.tests).each do |t1, t2|
|
69
|
+
order = t1 <=> t2
|
70
|
+
return order if order != 0
|
71
|
+
end
|
72
|
+
|
73
|
+
0
|
74
|
+
end
|
75
|
+
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity
|
76
|
+
|
77
|
+
class << self
|
78
|
+
def from_ostruct(ostr, rule, wild, json_path)
|
79
|
+
parse_method = wild ? 'marc_spec' : rule
|
80
|
+
tests = ostr.tests.map { |t| Test.from_ostruct(t, parse_method, json_path) }
|
81
|
+
Suite.new(ostr.description, rule, wild, parse_method, json_path, tests)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
private
|
86
|
+
|
87
|
+
def normalize_description(desc)
|
88
|
+
desc.sub(/^wild combination of /, 'marc_spec: ')
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require_relative 'formatter'
|
2
|
+
|
3
|
+
module ParserSpecs
|
4
|
+
class Test
|
5
|
+
include Formatter
|
6
|
+
include Comparable
|
7
|
+
|
8
|
+
GROUP_RE = /^(?<group>[^&]+) (?<detail>&& .*)$/.freeze
|
9
|
+
|
10
|
+
attr_reader :description
|
11
|
+
attr_reader :valid
|
12
|
+
attr_reader :parse_method
|
13
|
+
attr_reader :group
|
14
|
+
attr_reader :detail
|
15
|
+
attr_reader :json_path
|
16
|
+
|
17
|
+
def initialize(description, valid, parse_method, json_path, assertions = {})
|
18
|
+
@description = normalize_description(description)
|
19
|
+
@valid = valid
|
20
|
+
@parse_method = parse_method
|
21
|
+
@group, @detail = group_and_detail_from(@description)
|
22
|
+
@json_path = json_path
|
23
|
+
assertions.each { |d, v| add_assertion(d, v) }
|
24
|
+
end
|
25
|
+
|
26
|
+
def assertions
|
27
|
+
@assertions ||= {}
|
28
|
+
end
|
29
|
+
|
30
|
+
def rspec_assertions
|
31
|
+
assertions.map do |data, valid|
|
32
|
+
"expect(parser.#{parse_method}).#{valid ? 'to' : 'not_to'} parse(#{quote(data)}, trace: true, reporter: reporter)"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def add_assertion(data, valid)
|
37
|
+
raise ArgumentError, "#{quote(description)}: #{quote(data)}: #{valid} != #{self.valid}" if valid != self.valid
|
38
|
+
|
39
|
+
assertions[data] = valid
|
40
|
+
end
|
41
|
+
|
42
|
+
def merge?(o)
|
43
|
+
return false unless o.class == self.class
|
44
|
+
raise ArgumentError, "Can't merge #{quote(description)} with self" if o.equal?(self)
|
45
|
+
|
46
|
+
o.description == description && o.valid == valid && o.parse_method == parse_method
|
47
|
+
end
|
48
|
+
|
49
|
+
def merge(o)
|
50
|
+
o.assertions.each { |d, v| add_assertion(d, v) }
|
51
|
+
end
|
52
|
+
|
53
|
+
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
54
|
+
def <=>(other)
|
55
|
+
return unless other.class == self.class
|
56
|
+
return 0 if other.equal?(self)
|
57
|
+
|
58
|
+
order = description <=> other.description
|
59
|
+
return order if order != 0
|
60
|
+
|
61
|
+
order = valid <=> other.valid
|
62
|
+
return order if order != 0
|
63
|
+
|
64
|
+
order = parse_method <=> other.parse_method
|
65
|
+
return order if order != 0
|
66
|
+
|
67
|
+
order = assertions.size <=> other.assertions.size
|
68
|
+
return order if order != 0
|
69
|
+
|
70
|
+
assertions.keys.zip(other.assertions.keys).each do |d1, d2|
|
71
|
+
order = d1 <=> d2
|
72
|
+
return order if order != 0
|
73
|
+
end
|
74
|
+
|
75
|
+
0
|
76
|
+
end
|
77
|
+
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
78
|
+
|
79
|
+
class << self
|
80
|
+
def from_ostruct(ostr, parse_method, json_path)
|
81
|
+
Test.new(ostr.description, ostr.valid, parse_method, json_path, { ostr.data => ostr.valid })
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
private
|
86
|
+
|
87
|
+
def group_and_detail_from(desc)
|
88
|
+
return unless (match_data = GROUP_RE.match(desc))
|
89
|
+
|
90
|
+
[match_data[:group], match_data[:detail]]
|
91
|
+
end
|
92
|
+
|
93
|
+
def normalize_description(desc)
|
94
|
+
desc.sub(/^.* wild combination: /, '').to_s
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
Dir.glob(File.expand_path('parser_specs/*.rb', __dir__)).sort.each(&method(:require))
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'rubocop'
|
2
|
+
require 'rubocop/rake_task'
|
3
|
+
|
4
|
+
desc 'Run rubocop with HTML output'
|
5
|
+
RuboCop::RakeTask.new(:rubocop) do |cop|
|
6
|
+
output = ENV['RUBOCOP_OUTPUT'] || 'artifacts/rubocop/index.html'
|
7
|
+
puts "Writing RuboCop inspection report to #{output}"
|
8
|
+
|
9
|
+
cop.verbose = false
|
10
|
+
cop.formatters = ['html']
|
11
|
+
cop.options = ['--out', output]
|
12
|
+
end
|
13
|
+
|
14
|
+
desc 'Run RuboCop with auto-correct, and output results to console'
|
15
|
+
task :ra do
|
16
|
+
# b/c we want console output, we can't just use `rubocop:auto_correct`
|
17
|
+
RuboCop::CLI.new.run(['--auto-correct'])
|
18
|
+
end
|
data/rakelib/spec.rake
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'rspec/core/rake_task'
|
2
|
+
require 'pathname'
|
3
|
+
|
4
|
+
# TODO: generate comprehensive transform specs if possible
|
5
|
+
namespace :spec do
|
6
|
+
specs_dir = File.expand_path('../spec', __dir__)
|
7
|
+
generated_specs_dir = 'generated'
|
8
|
+
|
9
|
+
desc "regenerates spec/#{generated_specs_dir} from MARCSpec-Test-Suite"
|
10
|
+
task :generate do
|
11
|
+
require_relative 'parser_specs'
|
12
|
+
|
13
|
+
in_dir = File.join(specs_dir, 'suite')
|
14
|
+
out_dir = File.join(specs_dir, generated_specs_dir)
|
15
|
+
|
16
|
+
ParserSpecs::Rule.all_from_json(in_dir).each do |rule|
|
17
|
+
rule.write_rspec_to(out_dir)
|
18
|
+
end
|
19
|
+
|
20
|
+
RuboCop::CLI.new.run([out_dir])
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
RSpec::Core::RakeTask.new do |task|
|
25
|
+
task.rspec_opts = %w[--color --format documentation --order default]
|
26
|
+
task.pattern = 'spec/**/*_spec.rb'
|
27
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
File.expand_path('lib', __dir__).tap do |lib|
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
end
|
4
|
+
|
5
|
+
ruby_version = begin
|
6
|
+
ruby_version_file = File.expand_path('.ruby-version', __dir__)
|
7
|
+
File.read(ruby_version_file).strip
|
8
|
+
end
|
9
|
+
|
10
|
+
require 'marc/spec/module_info'
|
11
|
+
|
12
|
+
Gem::Specification.new do |spec|
|
13
|
+
spec.name = MARC::Spec::ModuleInfo::NAME
|
14
|
+
spec.author = MARC::Spec::ModuleInfo::AUTHOR
|
15
|
+
spec.email = MARC::Spec::ModuleInfo::AUTHOR_EMAIL
|
16
|
+
spec.summary = MARC::Spec::ModuleInfo::SUMMARY
|
17
|
+
spec.description = MARC::Spec::ModuleInfo::DESCRIPTION
|
18
|
+
spec.license = MARC::Spec::ModuleInfo::LICENSE
|
19
|
+
spec.version = MARC::Spec::ModuleInfo::VERSION
|
20
|
+
spec.homepage = MARC::Spec::ModuleInfo::HOMEPAGE
|
21
|
+
|
22
|
+
spec.files = `git ls-files -z`.split("\x0")
|
23
|
+
spec.require_paths = ['lib']
|
24
|
+
|
25
|
+
spec.required_ruby_version = ">= #{ruby_version}"
|
26
|
+
|
27
|
+
spec.add_dependency 'marc', '~> 1.1'
|
28
|
+
spec.add_dependency 'parslet', '~> 2.0'
|
29
|
+
spec.add_dependency 'typesafe_enum', '~> 0.3'
|
30
|
+
|
31
|
+
spec.add_development_dependency 'bundle-audit', '~> 0.1'
|
32
|
+
spec.add_development_dependency 'ci_reporter_rspec', '~> 1.0'
|
33
|
+
spec.add_development_dependency 'colorize', '~> 0.8'
|
34
|
+
spec.add_development_dependency 'dotenv', '~> 2.7'
|
35
|
+
spec.add_development_dependency 'irb', '~> 1.2' # workaroundfor https://github.com/bundler/bundler/issues/6929
|
36
|
+
spec.add_development_dependency 'listen', '>= 3.0.5', '< 3.2'
|
37
|
+
spec.add_development_dependency 'rake', '~> 13.0'
|
38
|
+
spec.add_development_dependency 'rspec', '~> 3.9'
|
39
|
+
spec.add_development_dependency 'rubocop', '~> 0.91.0'
|
40
|
+
spec.add_development_dependency 'simplecov', '~> 0.16.1'
|
41
|
+
spec.add_development_dependency 'simplecov-rcov', '~> 0.2'
|
42
|
+
end
|
data/spec/.rubocop.yml
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
inherit_from: ../.rubocop.yml
|
2
|
+
|
3
|
+
AllCops:
|
4
|
+
# Exclude generated files
|
5
|
+
Exclude:
|
6
|
+
- 'suite/**/*'
|
7
|
+
|
8
|
+
Style/ClassAndModuleChildren:
|
9
|
+
Enabled: false
|
10
|
+
|
11
|
+
Style/ParallelAssignment:
|
12
|
+
Enabled: false
|
13
|
+
|
14
|
+
Layout/LineLength:
|
15
|
+
Enabled: false
|
16
|
+
|
17
|
+
Lint/UnderscorePrefixedVariableName:
|
18
|
+
Enabled: false
|
19
|
+
|
20
|
+
Metrics/AbcSize:
|
21
|
+
Enabled: false
|
22
|
+
|
23
|
+
Metrics/BlockLength:
|
24
|
+
Enabled: false
|
25
|
+
|
26
|
+
Metrics/ClassLength:
|
27
|
+
Enabled: false
|
28
|
+
|
29
|
+
Metrics/CyclomaticComplexity:
|
30
|
+
Enabled: false
|
31
|
+
|
32
|
+
Metrics/ModuleLength:
|
33
|
+
Enabled: false
|
34
|
+
|
35
|
+
Metrics/MethodLength:
|
36
|
+
Enabled: false
|
37
|
+
|
38
|
+
Metrics/PerceivedComplexity:
|
39
|
+
Enabled: false
|
40
|
+
|
41
|
+
############################################################
|
42
|
+
# Added in Rubocop 0.89
|
43
|
+
|
44
|
+
# Sometimes we're testing the operator
|
45
|
+
Lint/BinaryOperatorWithIdenticalOperands:
|
46
|
+
Enabled: false
|
data/spec/README.md
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
# suite
|
2
|
+
|
3
|
+
The `suite` directory is a Git [submodule](https://git-scm.com/book/en/v2/Git-Tools-Submodules) cloned from
|
4
|
+
[MARCspec/MARCspec-Test-Suite](https://github.com/MARCspec/MARCspec-Test-Suite). Specs in
|
5
|
+
[generated](generated) are generated based on the JSON in this suite via the
|
6
|
+
[spec::generate](../rakelib/spec.rake) rake task.
|
7
|
+
|
8
|
+
Note that after cloning this project for the first time you’ll need to initialize and pull
|
9
|
+
the submodule:
|
10
|
+
|
11
|
+
```sh
|
12
|
+
git submodule init
|
13
|
+
git submodule update
|
14
|
+
```
|
15
|
+
|
16
|
+
See the [Git submodule docs](https://git-scm.com/book/en/v2/Git-Tools-Submodules) for more information.
|
@@ -0,0 +1,182 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?><searchRetrieveResponse xmlns="http://www.loc.gov/zing/srw/">
|
2
|
+
<version>1.2</version>
|
3
|
+
<numberOfRecords>1</numberOfRecords>
|
4
|
+
<records>
|
5
|
+
<record>
|
6
|
+
<recordSchema>marcxml</recordSchema>
|
7
|
+
<recordPacking>xml</recordPacking>
|
8
|
+
<recordData>
|
9
|
+
<record xmlns="http://www.loc.gov/MARC21/slim">
|
10
|
+
<leader>01139njm a22002775a 4500</leader>
|
11
|
+
<controlfield tag="001">991033920629706532</controlfield>
|
12
|
+
<controlfield tag="005">20210907132140.0</controlfield>
|
13
|
+
<controlfield tag="007">cr |||||||||||</controlfield>
|
14
|
+
<controlfield tag="008">151210q19601969enk o d</controlfield>
|
15
|
+
<datafield ind1=" " ind2=" " tag="035">
|
16
|
+
<subfield code="a">(CUY)UCB-b23161018x-01ucs_ber</subfield>
|
17
|
+
</datafield>
|
18
|
+
<datafield ind1=" " ind2=" " tag="035">
|
19
|
+
<subfield code="a">(OCoLC)932121906</subfield>
|
20
|
+
<subfield code="9">ExL</subfield>
|
21
|
+
</datafield>
|
22
|
+
<datafield ind1=" " ind2=" " tag="035">
|
23
|
+
<subfield code="a">(EXLNZ-01UCS_NETWORK)9913574292606531</subfield>
|
24
|
+
</datafield>
|
25
|
+
<datafield ind1=" " ind2=" " tag="040">
|
26
|
+
<subfield code="a">CUY</subfield>
|
27
|
+
<subfield code="c">CUY</subfield>
|
28
|
+
</datafield>
|
29
|
+
<datafield ind1="1" ind2="0" tag="100">
|
30
|
+
<subfield code="a">MacLeod, Donald,</subfield>
|
31
|
+
<subfield code="d">1916-1982.</subfield>
|
32
|
+
</datafield>
|
33
|
+
<datafield ind1="1" ind2="0" tag="245">
|
34
|
+
<subfield code="a">Instructional tape</subfield>
|
35
|
+
<subfield code="h">[electronic resource] :</subfield>
|
36
|
+
<subfield code="b">piobareachd /</subfield>
|
37
|
+
<subfield code="c">Donald MacLeod.</subfield>
|
38
|
+
</datafield>
|
39
|
+
<datafield ind1=" " ind2=" " tag="260">
|
40
|
+
<subfield code="a">[Britain :</subfield>
|
41
|
+
<subfield code="b">s.n.,</subfield>
|
42
|
+
<subfield code="c">196-?]</subfield>
|
43
|
+
</datafield>
|
44
|
+
<datafield ind1=" " ind2=" " tag="300">
|
45
|
+
<subfield code="a">20 streaming audio files.</subfield>
|
46
|
+
</datafield>
|
47
|
+
<datafield ind1=" " ind2=" " tag="500">
|
48
|
+
<subfield code="a">Lessons and demonstrations in playing Scottish bagpipe music.</subfield>
|
49
|
+
</datafield>
|
50
|
+
<datafield ind1=" " ind2=" " tag="500">
|
51
|
+
<subfield code="a">Reels 1 and 5, 7 in.; reel 1, 3 3/4 ips.</subfield>
|
52
|
+
</datafield>
|
53
|
+
<datafield ind1=" " ind2=" " tag="500">
|
54
|
+
<subfield code="a">Includes table of contents (manuscript) in each container.</subfield>
|
55
|
+
</datafield>
|
56
|
+
<datafield ind1=" " ind2=" " tag="533">
|
57
|
+
<subfield code="a">Electronic reproduction.</subfield>
|
58
|
+
<subfield code="b">San Francisco, Calif. :</subfield>
|
59
|
+
<subfield code="c">Digital Revolution,</subfield>
|
60
|
+
<subfield code="d">2014.</subfield>
|
61
|
+
</datafield>
|
62
|
+
<datafield ind1=" " ind2=" " tag="534">
|
63
|
+
<subfield code="p">Original version:</subfield>
|
64
|
+
<subfield code="e">20 sound tape reels : analog, 7 1/2 ips ; 5-7 in.</subfield>
|
65
|
+
</datafield>
|
66
|
+
<datafield ind1=" " ind2=" " tag="538">
|
67
|
+
<subfield code="a">System requirements: Streaming audio player and an internet connection.</subfield>
|
68
|
+
</datafield>
|
69
|
+
<datafield ind1=" " ind2=" " tag="538">
|
70
|
+
<subfield code="a">Mode of access: World Wide Web.</subfield>
|
71
|
+
</datafield>
|
72
|
+
<datafield ind1=" " ind2=" " tag="588">
|
73
|
+
<subfield code="a">Description based on sound recording record.</subfield>
|
74
|
+
</datafield>
|
75
|
+
<datafield ind1=" " ind2="0" tag="650">
|
76
|
+
<subfield code="a">Pibrochs.</subfield>
|
77
|
+
</datafield>
|
78
|
+
<datafield ind1=" " ind2="0" tag="650">
|
79
|
+
<subfield code="a">Music</subfield>
|
80
|
+
<subfield code="z">Scotland.</subfield>
|
81
|
+
</datafield>
|
82
|
+
<datafield ind1=" " ind2=" " tag="955">
|
83
|
+
<subfield code="a">20151210</subfield>
|
84
|
+
<subfield code="b">Music Audio Tapes MUSI_Project_Bib_Records.out.marc</subfield>
|
85
|
+
<subfield code="9">LOCAL</subfield>
|
86
|
+
</datafield>
|
87
|
+
<datafield ind1="4" ind2="0" tag="956">
|
88
|
+
<subfield code="z">Music Library Audio Tapes. Freely available for streaming.</subfield>
|
89
|
+
<subfield code="u">https://avplayer.lib.berkeley.edu/music/b23161018</subfield>
|
90
|
+
<subfield code="9">LOCAL</subfield>
|
91
|
+
</datafield>
|
92
|
+
<datafield ind1="0" ind2=" " tag="973">
|
93
|
+
<subfield code="a">Music Library audio tapes.</subfield>
|
94
|
+
<subfield code="5">CU</subfield>
|
95
|
+
<subfield code="9">LOCAL</subfield>
|
96
|
+
</datafield>
|
97
|
+
<datafield ind1=" " ind2=" " tag="996">
|
98
|
+
<subfield code="a">b23161018x</subfield>
|
99
|
+
<subfield code="b">Updated: 02-02-20</subfield>
|
100
|
+
<subfield code="c">Created: 12-10-15</subfield>
|
101
|
+
<subfield code="d">CatDate: 12-10-15</subfield>
|
102
|
+
<subfield code="9">LOCAL</subfield>
|
103
|
+
</datafield>
|
104
|
+
<datafield ind1=" " ind2=" " tag="998">
|
105
|
+
<subfield code="a">00:47:49</subfield>
|
106
|
+
<subfield code="t">reel 1, part 1</subfield>
|
107
|
+
<subfield code="g">C040790863_1.mp3</subfield>
|
108
|
+
<subfield code="a">00:23:29</subfield>
|
109
|
+
<subfield code="t">reel 2, part 1</subfield>
|
110
|
+
<subfield code="g">C040790960_1.mp3</subfield>
|
111
|
+
<subfield code="a">00:22:56</subfield>
|
112
|
+
<subfield code="t">reel 3, part 1</subfield>
|
113
|
+
<subfield code="g">C040791061_1.mp3</subfield>
|
114
|
+
<subfield code="a">00:21:46</subfield>
|
115
|
+
<subfield code="t">reel 4, part 1</subfield>
|
116
|
+
<subfield code="g">C040791168_1.mp3</subfield>
|
117
|
+
<subfield code="a">00:24:19</subfield>
|
118
|
+
<subfield code="t">reel 5, part 1</subfield>
|
119
|
+
<subfield code="g">C040790872_1.mp3</subfield>
|
120
|
+
<subfield code="a">00:24:18</subfield>
|
121
|
+
<subfield code="t">reel 6, part 1</subfield>
|
122
|
+
<subfield code="g">C040790979_1.mp3</subfield>
|
123
|
+
<subfield code="a">00:24:18</subfield>
|
124
|
+
<subfield code="t">reel 7, part 1</subfield>
|
125
|
+
<subfield code="g">C040791070_1.mp3</subfield>
|
126
|
+
<subfield code="a">00:23:23</subfield>
|
127
|
+
<subfield code="t">reel 8, part 1</subfield>
|
128
|
+
<subfield code="g">C040791177_1.mp3</subfield>
|
129
|
+
<subfield code="a">00:20:01</subfield>
|
130
|
+
<subfield code="t">reel 9, part 1</subfield>
|
131
|
+
<subfield code="g">C040790881_1.mp3</subfield>
|
132
|
+
<subfield code="a">00:22:38</subfield>
|
133
|
+
<subfield code="t">reel 10</subfield>
|
134
|
+
<subfield code="g">C040790988.mp3</subfield>
|
135
|
+
<subfield code="a">00:23:44</subfield>
|
136
|
+
<subfield code="t">reel 11</subfield>
|
137
|
+
<subfield code="g">C040791089.mp3</subfield>
|
138
|
+
<subfield code="a">00:22:27</subfield>
|
139
|
+
<subfield code="t">reel 12</subfield>
|
140
|
+
<subfield code="g">C040791186.mp3</subfield>
|
141
|
+
<subfield code="a">00:21:57</subfield>
|
142
|
+
<subfield code="t">reel 13, part 1</subfield>
|
143
|
+
<subfield code="g">C040790890_1.mp3</subfield>
|
144
|
+
<subfield code="a">00:44:28</subfield>
|
145
|
+
<subfield code="t">reel 14, part 1</subfield>
|
146
|
+
<subfield code="g">C040790997_1.mp3</subfield>
|
147
|
+
<subfield code="a">00:44:33</subfield>
|
148
|
+
<subfield code="t">reel 15, part 1</subfield>
|
149
|
+
<subfield code="g">C040791098_1.mp3</subfield>
|
150
|
+
<subfield code="a">00:44:01</subfield>
|
151
|
+
<subfield code="t">reel 16, part 1</subfield>
|
152
|
+
<subfield code="g">C040790906_1.mp3</subfield>
|
153
|
+
<subfield code="a">00:46:58</subfield>
|
154
|
+
<subfield code="t">reel 17, part 1</subfield>
|
155
|
+
<subfield code="g">C040791007_1.mp3</subfield>
|
156
|
+
<subfield code="a">00:42:49</subfield>
|
157
|
+
<subfield code="t">reel 18, part 1</subfield>
|
158
|
+
<subfield code="g">C040791104_1.mp3</subfield>
|
159
|
+
<subfield code="a">00:44:35</subfield>
|
160
|
+
<subfield code="t">reel 19, part 1</subfield>
|
161
|
+
<subfield code="g">C040791195_1.mp3</subfield>
|
162
|
+
<subfield code="a">00:40:12</subfield>
|
163
|
+
<subfield code="t">reel 20, part 1</subfield>
|
164
|
+
<subfield code="g">C040791201_1.mp3</subfield>
|
165
|
+
<subfield code="9">LOCAL</subfield>
|
166
|
+
</datafield>
|
167
|
+
<datafield ind1=" " ind2=" " tag="AVE">
|
168
|
+
<subfield code="8">531002912470006532</subfield>
|
169
|
+
<subfield code="e">Available</subfield>
|
170
|
+
<subfield code="n">Music Library Audio Tapes. Freely available for streaming.</subfield>
|
171
|
+
</datafield>
|
172
|
+
</record>
|
173
|
+
</recordData>
|
174
|
+
<recordIdentifier>991033920629706532</recordIdentifier>
|
175
|
+
<recordPosition>1</recordPosition>
|
176
|
+
</record>
|
177
|
+
</records>
|
178
|
+
<extraResponseData xmlns:xb="http://www.exlibris.com/repository/search/xmlbeans/">
|
179
|
+
<xb:exact>true</xb:exact>
|
180
|
+
<xb:responseDate>2021-09-23T13:14:41-0700</xb:responseDate>
|
181
|
+
</extraResponseData>
|
182
|
+
</searchRetrieveResponse>
|
@@ -0,0 +1,82 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!-- from https://www.loc.gov/standards/marcxml/Sandburg/sandburg.xml -->
|
3
|
+
<collection xmlns="http://www.loc.gov/MARC21/slim">
|
4
|
+
<record>
|
5
|
+
<leader>01142cam 2200301 a 4500</leader>
|
6
|
+
<controlfield tag="001"> 92005291 </controlfield>
|
7
|
+
<controlfield tag="003">DLC</controlfield>
|
8
|
+
<controlfield tag="005">19930521155141.9</controlfield>
|
9
|
+
<controlfield tag="008">920219s1993 caua j 000 0 eng </controlfield>
|
10
|
+
<datafield tag="010" ind1=" " ind2=" ">
|
11
|
+
<subfield code="a"> 92005291 </subfield>
|
12
|
+
</datafield>
|
13
|
+
<datafield tag="020" ind1=" " ind2=" ">
|
14
|
+
<subfield code="a">0152038655 :</subfield>
|
15
|
+
<subfield code="c">$15.95</subfield>
|
16
|
+
</datafield>
|
17
|
+
<datafield tag="040" ind1=" " ind2=" ">
|
18
|
+
<subfield code="a">DLC</subfield>
|
19
|
+
<subfield code="c">DLC</subfield>
|
20
|
+
<subfield code="d">DLC</subfield>
|
21
|
+
</datafield>
|
22
|
+
<datafield tag="042" ind1=" " ind2=" ">
|
23
|
+
<subfield code="a">lcac</subfield>
|
24
|
+
</datafield>
|
25
|
+
<datafield tag="050" ind1="0" ind2="0">
|
26
|
+
<subfield code="a">PS3537.A618</subfield>
|
27
|
+
<subfield code="b">A88 1993</subfield>
|
28
|
+
</datafield>
|
29
|
+
<datafield tag="082" ind1="0" ind2="0">
|
30
|
+
<subfield code="a">811/.52</subfield>
|
31
|
+
<subfield code="2">20</subfield>
|
32
|
+
</datafield>
|
33
|
+
<datafield tag="100" ind1="1" ind2=" ">
|
34
|
+
<subfield code="a">Sandburg, Carl,</subfield>
|
35
|
+
<subfield code="d">1878-1967.</subfield>
|
36
|
+
</datafield>
|
37
|
+
<datafield tag="245" ind1="1" ind2="0">
|
38
|
+
<subfield code="a">Arithmetic /</subfield>
|
39
|
+
<subfield code="c">Carl Sandburg ; illustrated as an anamorphic adventure by Ted Rand.</subfield>
|
40
|
+
</datafield>
|
41
|
+
<datafield tag="250" ind1=" " ind2=" ">
|
42
|
+
<subfield code="a">1st ed.</subfield>
|
43
|
+
</datafield>
|
44
|
+
<datafield tag="260" ind1=" " ind2=" ">
|
45
|
+
<subfield code="a">San Diego :</subfield>
|
46
|
+
<subfield code="b">Harcourt Brace Jovanovich,</subfield>
|
47
|
+
<subfield code="c">c1993.</subfield>
|
48
|
+
</datafield>
|
49
|
+
<datafield tag="300" ind1=" " ind2=" ">
|
50
|
+
<subfield code="a">1 v. (unpaged) :</subfield>
|
51
|
+
<subfield code="b">ill. (some col.) ;</subfield>
|
52
|
+
<subfield code="c">26 cm.</subfield>
|
53
|
+
</datafield>
|
54
|
+
<datafield tag="500" ind1=" " ind2=" ">
|
55
|
+
<subfield code="a">One Mylar sheet included in pocket.</subfield>
|
56
|
+
</datafield>
|
57
|
+
<datafield tag="520" ind1=" " ind2=" ">
|
58
|
+
<subfield code="a">A poem about numbers and their characteristics. Features anamorphic, or distorted, drawings which can be restored to normal by viewing from a particular angle or by viewing the image's reflection in the provided Mylar cone.</subfield>
|
59
|
+
</datafield>
|
60
|
+
<datafield tag="650" ind1=" " ind2="0">
|
61
|
+
<subfield code="a">Arithmetic</subfield>
|
62
|
+
<subfield code="x">Juvenile poetry.</subfield>
|
63
|
+
</datafield>
|
64
|
+
<datafield tag="650" ind1=" " ind2="0">
|
65
|
+
<subfield code="a">Children's poetry, American.</subfield>
|
66
|
+
</datafield>
|
67
|
+
<datafield tag="650" ind1=" " ind2="1">
|
68
|
+
<subfield code="a">Arithmetic</subfield>
|
69
|
+
<subfield code="x">Poetry.</subfield>
|
70
|
+
</datafield>
|
71
|
+
<datafield tag="650" ind1=" " ind2="1">
|
72
|
+
<subfield code="a">American poetry.</subfield>
|
73
|
+
</datafield>
|
74
|
+
<datafield tag="650" ind1=" " ind2="1">
|
75
|
+
<subfield code="a">Visual perception.</subfield>
|
76
|
+
</datafield>
|
77
|
+
<datafield tag="700" ind1="1" ind2=" ">
|
78
|
+
<subfield code="a">Rand, Ted,</subfield>
|
79
|
+
<subfield code="e">ill.</subfield>
|
80
|
+
</datafield>
|
81
|
+
</record>
|
82
|
+
</collection>
|