libis-tools 0.9.1
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/.coveralls.yml +2 -0
- data/.gitignore +16 -0
- data/.rspec +2 -0
- data/.travis.yml +37 -0
- data/Gemfile +7 -0
- data/LICENSE.txt +22 -0
- data/README.md +289 -0
- data/Rakefile +6 -0
- data/lib/libis-tools.rb +1 -0
- data/lib/libis/tools.rb +16 -0
- data/lib/libis/tools/assert.rb +41 -0
- data/lib/libis/tools/checksum.rb +84 -0
- data/lib/libis/tools/command.rb +40 -0
- data/lib/libis/tools/config.rb +160 -0
- data/lib/libis/tools/dc_record.rb +47 -0
- data/lib/libis/tools/extend/empty.rb +7 -0
- data/lib/libis/tools/extend/hash.rb +107 -0
- data/lib/libis/tools/extend/ostruct.rb +3 -0
- data/lib/libis/tools/extend/string.rb +85 -0
- data/lib/libis/tools/extend/struct.rb +29 -0
- data/lib/libis/tools/logger.rb +71 -0
- data/lib/libis/tools/mets_file.rb +575 -0
- data/lib/libis/tools/parameter.rb +172 -0
- data/lib/libis/tools/sharepoint_mapping.rb +118 -0
- data/lib/libis/tools/sharepoint_record.rb +260 -0
- data/lib/libis/tools/version.rb +5 -0
- data/lib/libis/tools/xml_document.rb +574 -0
- data/libis-tools.gemspec +39 -0
- data/spec/assert_spec.rb +65 -0
- data/spec/checksum_spec.rb +132 -0
- data/spec/command_spec.rb +68 -0
- data/spec/config_spec.rb +86 -0
- data/spec/data/test.data +9 -0
- data/spec/data/test.xml +8 -0
- data/spec/data/test.yml +1 -0
- data/spec/logger_spec.rb +107 -0
- data/spec/parameter_container_spec.rb +83 -0
- data/spec/parameter_spec.rb +139 -0
- data/spec/spec_helper.rb +12 -0
- data/spec/test.xsd +20 -0
- data/spec/xmldocument_spec.rb +413 -0
- data/test/test_helper.rb +7 -0
- data/test/webservices/test_ca_item_info.rb +59 -0
- data/test/webservices/test_ca_search.rb +35 -0
- metadata +244 -0
@@ -0,0 +1,172 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'date'
|
3
|
+
require 'libis/tools/extend/struct'
|
4
|
+
|
5
|
+
module Libis
|
6
|
+
module Tools
|
7
|
+
|
8
|
+
# noinspection RubyConstantNamingConvention
|
9
|
+
Parameter = ::Struct.new(:name, :default, :datatype, :description, :constraint, :options) do
|
10
|
+
|
11
|
+
VALID_PARAMETER_KEYS = [:name, :default, :datatype, :description, :constraint, :options]
|
12
|
+
|
13
|
+
def initialize(*args)
|
14
|
+
# noinspection RubySuperCallWithoutSuperclassInspection
|
15
|
+
super(*args)
|
16
|
+
self.options = {} unless self.options
|
17
|
+
end
|
18
|
+
|
19
|
+
TRUE_BOOL = %w'true yes t y 1'
|
20
|
+
FALSE_BOOL = %w'false no f n 0'
|
21
|
+
|
22
|
+
def parse(value = nil)
|
23
|
+
result = if value.nil?
|
24
|
+
send(:default)
|
25
|
+
else
|
26
|
+
dtype = guess_datatype.to_s.downcase
|
27
|
+
convert(dtype, value)
|
28
|
+
end
|
29
|
+
check_constraint(result)
|
30
|
+
result
|
31
|
+
end
|
32
|
+
|
33
|
+
def valid_value?(value)
|
34
|
+
begin
|
35
|
+
parse(value)
|
36
|
+
rescue
|
37
|
+
return false
|
38
|
+
end
|
39
|
+
true
|
40
|
+
end
|
41
|
+
|
42
|
+
def guess_datatype
|
43
|
+
return send(:datatype) if send(:datatype)
|
44
|
+
case send(:default)
|
45
|
+
when TrueClass, FalseClass
|
46
|
+
'bool'
|
47
|
+
when NilClass
|
48
|
+
'string'
|
49
|
+
when Integer
|
50
|
+
'int'
|
51
|
+
when Float
|
52
|
+
'float'
|
53
|
+
when DateTime, Date, Time
|
54
|
+
'datetime'
|
55
|
+
else
|
56
|
+
send(:default).class.name.downcase
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
def convert(dtype, v)
|
63
|
+
case dtype.to_s.downcase
|
64
|
+
when 'boolean', 'bool'
|
65
|
+
return true if TRUE_BOOL.include?(v.to_s.downcase)
|
66
|
+
return false if FALSE_BOOL.include?(v.to_s.downcase)
|
67
|
+
raise ArgumentError, "No boolean information in '#{v.to_s}'. Valid values are: '#{TRUE_BOOL.join('\', \'')}' and '#{FALSE_BOOL.join('\', \'')}'."
|
68
|
+
when 'string'
|
69
|
+
return v.to_s.gsub('%s', Time.now.strftime('%Y%m%d%H%M%S'))
|
70
|
+
when 'int'
|
71
|
+
return Integer(v)
|
72
|
+
when 'float'
|
73
|
+
return Float(v)
|
74
|
+
when 'datetime'
|
75
|
+
return v.to_datetime if v.respond_to? :to_datetime
|
76
|
+
return DateTime.parse(v)
|
77
|
+
else
|
78
|
+
raise RuntimeError, "Datatype not supported: '#{dtype}'"
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def check_constraint(v, constraint = nil)
|
83
|
+
constraint ||= send(:constraint)
|
84
|
+
return if constraint.nil?
|
85
|
+
raise ArgumentError, "Value '#{v}' is not allowed (constraint: #{constraint})." unless constraint_checker(v, constraint)
|
86
|
+
end
|
87
|
+
|
88
|
+
def constraint_checker(v, constraint)
|
89
|
+
|
90
|
+
case constraint
|
91
|
+
when Array
|
92
|
+
constraint.each do |c|
|
93
|
+
return true if (constraint_checker(v, c) rescue false)
|
94
|
+
end
|
95
|
+
return true if constraint.include? v
|
96
|
+
when Range
|
97
|
+
return true if constraint.cover? v
|
98
|
+
when Regexp
|
99
|
+
return true if v =~ constraint
|
100
|
+
else
|
101
|
+
return true if v == constraint
|
102
|
+
end
|
103
|
+
false
|
104
|
+
end
|
105
|
+
|
106
|
+
end # Parameter
|
107
|
+
|
108
|
+
module ParameterContainer
|
109
|
+
|
110
|
+
module ClassMethods
|
111
|
+
|
112
|
+
def parameter(options = {})
|
113
|
+
if options.is_a? Hash
|
114
|
+
return nil if options.keys.empty?
|
115
|
+
param_def = options.shift
|
116
|
+
name = param_def.first.to_s.to_sym
|
117
|
+
default = param_def.last
|
118
|
+
parameters[name] = Parameter.new(name, default) if parameters[name].nil?
|
119
|
+
VALID_PARAMETER_KEYS.each { |key| parameters[name][key] = options[key] if options[key] }
|
120
|
+
else
|
121
|
+
parameters[options]
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
protected
|
126
|
+
|
127
|
+
def parameters
|
128
|
+
@parameters ||= Hash.new
|
129
|
+
end
|
130
|
+
|
131
|
+
end
|
132
|
+
|
133
|
+
def self.included(base)
|
134
|
+
base.extend(ClassMethods)
|
135
|
+
end
|
136
|
+
|
137
|
+
NO_VALUE = '##NAV##'
|
138
|
+
|
139
|
+
def parameter(name, value = NO_VALUE)
|
140
|
+
param_def = get_parameter_definition(name)
|
141
|
+
return NO_VALUE unless param_def
|
142
|
+
if value.equal? NO_VALUE
|
143
|
+
param_value = parameters[name]
|
144
|
+
param_def.parse(param_value)
|
145
|
+
else
|
146
|
+
return NO_VALUE unless param_def.valid_value?(value)
|
147
|
+
parameters[name] = value
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
def [](name)
|
152
|
+
parameter(name)
|
153
|
+
end
|
154
|
+
|
155
|
+
def []=(name, value)
|
156
|
+
parameter name, value
|
157
|
+
end
|
158
|
+
|
159
|
+
protected
|
160
|
+
|
161
|
+
def parameters
|
162
|
+
@parameters ||= Hash.new
|
163
|
+
end
|
164
|
+
|
165
|
+
def get_parameter_definition(name)
|
166
|
+
self.class.parameter(name)
|
167
|
+
end
|
168
|
+
|
169
|
+
end # ParameterContainer
|
170
|
+
|
171
|
+
end # Tools
|
172
|
+
end # Libis
|
@@ -0,0 +1,118 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'csv'
|
4
|
+
require 'yaml'
|
5
|
+
|
6
|
+
require 'libis/tools/extend/hash'
|
7
|
+
|
8
|
+
module Libis
|
9
|
+
module Tools
|
10
|
+
|
11
|
+
class SharepointMapping < Hash
|
12
|
+
|
13
|
+
def initialize(mapping_file)
|
14
|
+
|
15
|
+
|
16
|
+
CSV.foreach(mapping_file, headers: true, skip_blanks: true) do |row|
|
17
|
+
next unless row[1]
|
18
|
+
# next unless (row[2] || row[3])
|
19
|
+
|
20
|
+
# compensation for bug in library that reads the Excel data
|
21
|
+
0.upto(5) { |i| row[i] = row[i].gsub(/_x005F(_x[0-9a-fA-F]{4}_)/, '\1') if row[i] }
|
22
|
+
|
23
|
+
name = row[0] ? row[0].strip : nil
|
24
|
+
label = row[1].strip.to_sym
|
25
|
+
dc_tag = row[2] ? row[2].strip : ''
|
26
|
+
db_column = row[3] ? row[3].strip : nil
|
27
|
+
db_datatype = row[4] ? row[4].strip.upcase.to_sym : nil
|
28
|
+
db_valuemask = row[5] ? row[5] : nil
|
29
|
+
# scope_tag = row[6] ? row[6].strip : nil
|
30
|
+
# scope_id = (row[7] and row[7] =~ /[0-9]+/ ? Integer(row[7].strip) : nil)
|
31
|
+
|
32
|
+
|
33
|
+
mapping = {}
|
34
|
+
mapping[:fancy_name] = name if name
|
35
|
+
mapping[:db_column] = db_column if db_column
|
36
|
+
mapping[:db_datatype] = :STRING
|
37
|
+
mapping[:db_datatype] = db_datatype if db_datatype
|
38
|
+
mapping[:db_valuemask] = (mapping[:db_datatype] == :STRING ? "'@@'" : '@@')
|
39
|
+
mapping[:db_valuemask] = db_valuemask if db_valuemask
|
40
|
+
# mapping[:scope_tag] = scope_tag if scope_tag
|
41
|
+
# mapping[:scope_id] = scope_id if scope_id
|
42
|
+
|
43
|
+
if dc_tag.match(/^\s*"(.*)"\s*(<.*)$/)
|
44
|
+
mapping[:dc_prefix] = $1
|
45
|
+
dc_tag = $2
|
46
|
+
end
|
47
|
+
|
48
|
+
if dc_tag.match(/^\s*<dc:[^.]+\.([^.>]+)>(.*)$/)
|
49
|
+
mapping[:dc_tag] = "dcterms:#{$1}"
|
50
|
+
dc_tag = $2
|
51
|
+
|
52
|
+
elsif dc_tag.match(/^\s*<dc:([^.>]+)>(.*)$/)
|
53
|
+
mapping[:dc_tag] = "dc:#{$1}"
|
54
|
+
dc_tag = $2
|
55
|
+
end
|
56
|
+
|
57
|
+
if dc_tag.match(/^\s*"(.*)"\s*$/)
|
58
|
+
mapping[:dc_postfix] = $1
|
59
|
+
end
|
60
|
+
|
61
|
+
self[label] = mapping.empty? ? nil : mapping
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
File.open('mapping.yml', 'wt') { |fp|
|
66
|
+
fp.puts self.to_yaml
|
67
|
+
}
|
68
|
+
super nil
|
69
|
+
|
70
|
+
end
|
71
|
+
|
72
|
+
def name(label)
|
73
|
+
mapping = self[label]
|
74
|
+
mapping = mapping[:fancy_name] if mapping
|
75
|
+
mapping || label
|
76
|
+
end
|
77
|
+
|
78
|
+
def fancy_label(label)
|
79
|
+
mapping = self[label]
|
80
|
+
mapping = mapping[:fancy_name] if mapping
|
81
|
+
"#{label}#{mapping ? '(' + mapping + ')' : ''}"
|
82
|
+
end
|
83
|
+
|
84
|
+
def dc_tag(label)
|
85
|
+
mapping = self[label]
|
86
|
+
mapping = mapping[:dc_tag] if mapping
|
87
|
+
mapping
|
88
|
+
end
|
89
|
+
|
90
|
+
def dc_prefix(label)
|
91
|
+
mapping = self[label]
|
92
|
+
mapping = mapping[:dc_prefix] if mapping
|
93
|
+
mapping
|
94
|
+
end
|
95
|
+
|
96
|
+
def dc_postfix(label)
|
97
|
+
mapping = self[label]
|
98
|
+
mapping = mapping[:dc_postfix] if mapping
|
99
|
+
mapping
|
100
|
+
end
|
101
|
+
|
102
|
+
def db_column(label)
|
103
|
+
mapping = self[label]
|
104
|
+
mapping = mapping[:db_column] if mapping
|
105
|
+
mapping
|
106
|
+
end
|
107
|
+
|
108
|
+
def db_value(label, value)
|
109
|
+
mapping = self[label]
|
110
|
+
return nil unless mapping
|
111
|
+
mask = mapping[:db_valuemask]
|
112
|
+
mask.gsub('@@', value.to_s)
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
end
|
@@ -0,0 +1,260 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'uri'
|
4
|
+
|
5
|
+
require 'libis/tools/extend/hash'
|
6
|
+
require 'libis/tools/xml_document'
|
7
|
+
|
8
|
+
module Libis
|
9
|
+
module Tools
|
10
|
+
|
11
|
+
# noinspection RubyTooManyMethodsInspection
|
12
|
+
class SharepointRecord < Hash
|
13
|
+
|
14
|
+
attr_accessor :node
|
15
|
+
|
16
|
+
def initialize
|
17
|
+
@node = nil
|
18
|
+
self[:label_prefix] = ''
|
19
|
+
super nil
|
20
|
+
end
|
21
|
+
|
22
|
+
def label_prefix
|
23
|
+
self[:label_prefix]
|
24
|
+
end
|
25
|
+
|
26
|
+
def label_prefix=(value)
|
27
|
+
self[:label_prefix] = value
|
28
|
+
end
|
29
|
+
|
30
|
+
def label
|
31
|
+
(self[:ows_Title1] || self[:ows_BaseName] || file_name).to_s
|
32
|
+
end
|
33
|
+
|
34
|
+
def title
|
35
|
+
self[:label_prefix] + ' ' + self.label
|
36
|
+
end
|
37
|
+
|
38
|
+
def content_type
|
39
|
+
self[:ows_ContentType]
|
40
|
+
end
|
41
|
+
|
42
|
+
def file_name
|
43
|
+
self[:ows_FileLeafRef]
|
44
|
+
end
|
45
|
+
|
46
|
+
def file_path
|
47
|
+
self[:ows_FileRef]
|
48
|
+
end
|
49
|
+
|
50
|
+
def file_size
|
51
|
+
self[:ows_FileSizeDisplay]
|
52
|
+
end
|
53
|
+
|
54
|
+
def url
|
55
|
+
# self[:ows_EncodedAbsUrl]
|
56
|
+
# 'https://www.groupware.kuleuven.be' + URI.escape(self[:ows_ServerUrl], Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))
|
57
|
+
# 'https://www.groupware.kuleuven.be' + URI.escape(self[:ows_ServerUrl])
|
58
|
+
URI.escape(URI.unescape(self[:ows_EncodedAbsUrl]))
|
59
|
+
end
|
60
|
+
|
61
|
+
def relative_path
|
62
|
+
return file_path.gsub(/^sites\/lias\/Gedeelde documenten\//, '') if file_path
|
63
|
+
nil
|
64
|
+
end
|
65
|
+
|
66
|
+
def local_path(sub_dir)
|
67
|
+
return relative_path unless sub_dir
|
68
|
+
sub_dir += '/' unless sub_dir[-1] == '/'
|
69
|
+
return relative_path.gsub(/^#{sub_dir}/, '') if relative_path
|
70
|
+
nil
|
71
|
+
end
|
72
|
+
|
73
|
+
def is_file?
|
74
|
+
return true if [:file, :mfile].include? simple_content_type
|
75
|
+
false
|
76
|
+
end
|
77
|
+
|
78
|
+
def is_described?
|
79
|
+
=begin
|
80
|
+
self[:ows_Title1] and
|
81
|
+
( self[:ows_Creation_x0020_date_x0028_s_x0029_] or
|
82
|
+
self[:ows_Startdate] or
|
83
|
+
self[:ows_Enddate]
|
84
|
+
)
|
85
|
+
=end
|
86
|
+
self[:ows_Unit_of_description]
|
87
|
+
end
|
88
|
+
|
89
|
+
def simple_content_type
|
90
|
+
case content_type
|
91
|
+
when /^Archief/i
|
92
|
+
return :archive
|
93
|
+
when /^Bestanddeel \(folder\)/i
|
94
|
+
return :map
|
95
|
+
when /^Bestanddeel of stuk \(document\)/i
|
96
|
+
return :file
|
97
|
+
when /^Meervoudige beschrijving \(folder\)/i
|
98
|
+
return :mmap
|
99
|
+
when /^Meervoudige beschrijving \(document\)/i
|
100
|
+
return :mfile
|
101
|
+
when /^Tussenniveau/i
|
102
|
+
return :map
|
103
|
+
when /^Film/i
|
104
|
+
return :file
|
105
|
+
when /^Object/i
|
106
|
+
return :file
|
107
|
+
when /^Document/i
|
108
|
+
return :file
|
109
|
+
else
|
110
|
+
# type code here
|
111
|
+
end
|
112
|
+
:unknown
|
113
|
+
end
|
114
|
+
|
115
|
+
def content_code
|
116
|
+
case simple_content_type
|
117
|
+
when :archive
|
118
|
+
'a'
|
119
|
+
when :map
|
120
|
+
'm'
|
121
|
+
when :file
|
122
|
+
'f'
|
123
|
+
when :mmap
|
124
|
+
'v'
|
125
|
+
when :mfile
|
126
|
+
'<'
|
127
|
+
when :unknown
|
128
|
+
'-'
|
129
|
+
else
|
130
|
+
' '
|
131
|
+
end + (is_described? ? '*' : ' ')
|
132
|
+
end
|
133
|
+
|
134
|
+
def ingest_model
|
135
|
+
return self[:ows_Ingestmodel] if self[:ows_Ingestmodel]
|
136
|
+
return self.node.parent.content.ingest_model if node and node.parent and node.parent.content
|
137
|
+
nil
|
138
|
+
end
|
139
|
+
|
140
|
+
def accessright_model
|
141
|
+
return self[:ows_Access_x0020_rights_x0020_model] if self[:ows_Access_x0020_rights_x0020_model]
|
142
|
+
return self.node.parent.content.accessright_model if node and node.parent and node.parent.content
|
143
|
+
nil
|
144
|
+
end
|
145
|
+
|
146
|
+
def to_raw
|
147
|
+
self
|
148
|
+
end
|
149
|
+
|
150
|
+
def to_xml
|
151
|
+
|
152
|
+
xml_doc = Libis::Tools::XmlDocument.new
|
153
|
+
|
154
|
+
xml_doc.root = xml_doc.create_node('record')
|
155
|
+
|
156
|
+
self.each do |label, value|
|
157
|
+
|
158
|
+
unless label == :node
|
159
|
+
#noinspection RubyResolve
|
160
|
+
xml_doc.root << xml_doc.create_text_node(label.to_s, value.to_s)
|
161
|
+
end
|
162
|
+
|
163
|
+
end
|
164
|
+
|
165
|
+
xml_doc
|
166
|
+
|
167
|
+
end
|
168
|
+
|
169
|
+
def self.from_xml(xml_node)
|
170
|
+
|
171
|
+
record = Libis::Tools::SharepointRecord.new
|
172
|
+
|
173
|
+
xml_node.element_children.each do |node|
|
174
|
+
record[node.name.to_sym] = node.content
|
175
|
+
end
|
176
|
+
|
177
|
+
record
|
178
|
+
|
179
|
+
end
|
180
|
+
|
181
|
+
# @param [Libis::Tools::SharepointMapping] mapping
|
182
|
+
def to_dc(mapping)
|
183
|
+
|
184
|
+
return nil unless mapping and mapping.is_a? Hash
|
185
|
+
|
186
|
+
xml_doc = Libis::Tools::XmlDocument.new
|
187
|
+
|
188
|
+
#noinspection RubyStringKeysInHashInspection
|
189
|
+
xml_doc.root = xml_doc.create_node(
|
190
|
+
'record',
|
191
|
+
namespaces: {
|
192
|
+
'dc' => 'http://purl.org/dc/elements/1.1/',
|
193
|
+
'xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
|
194
|
+
'dcterms' => 'http://purl.org/dc/terms/'})
|
195
|
+
|
196
|
+
self.each do |label, value|
|
197
|
+
dc_tag = mapping.dc_tag(label)
|
198
|
+
next unless dc_tag
|
199
|
+
dc_value = (mapping.dc_prefix(label) || '') + value.to_s + (mapping.dc_postfix(label) || '')
|
200
|
+
#noinspection RubyResolve
|
201
|
+
xml_doc.root << xml_doc.create_text_node(dc_tag, dc_value)
|
202
|
+
end
|
203
|
+
|
204
|
+
if xml_doc.xpath('//dc:title').size == 0
|
205
|
+
xml_doc.root << xml_doc.create_text_node('dc:title', self[:ows_BaseName])
|
206
|
+
end
|
207
|
+
|
208
|
+
xml_doc
|
209
|
+
|
210
|
+
end
|
211
|
+
|
212
|
+
# @param [Libis::Tools::SharepointMapping] mapping
|
213
|
+
def to_sql(mapping)
|
214
|
+
sql_fields = []
|
215
|
+
sql_values = []
|
216
|
+
|
217
|
+
self.each do |label, value|
|
218
|
+
db_column = mapping.db_column(label)
|
219
|
+
next unless db_column
|
220
|
+
db_value = mapping.db_value(label, value)
|
221
|
+
next unless db_value and db_value != "''"
|
222
|
+
sql_fields << db_column
|
223
|
+
sql_values << db_value.escape_for_sql
|
224
|
+
end
|
225
|
+
|
226
|
+
sql_fields.each_with_index { |element, index| (index % 10 == 0) && (sql_fields[index] = "\n " + element)
|
227
|
+
}
|
228
|
+
sql_values.each_with_index { |element, index| (index % 10 == 0) && (sql_values[index] = "\n " + element)
|
229
|
+
}
|
230
|
+
|
231
|
+
'INSERT INTO @TABLE_NAME@ (' + sql_fields.join(',') + ")\n VALUES (" + sql_values.join(',') + ');'
|
232
|
+
|
233
|
+
end
|
234
|
+
|
235
|
+
def create_dc(dir, mapping)
|
236
|
+
xml_doc = to_dc mapping
|
237
|
+
dc_file = "#{dir}/dc_#{self[:index].to_s}.xml"
|
238
|
+
xml_doc.save dc_file
|
239
|
+
dc_file
|
240
|
+
end
|
241
|
+
|
242
|
+
def to_s
|
243
|
+
super
|
244
|
+
end
|
245
|
+
|
246
|
+
def print_metadata(f, mapping)
|
247
|
+
f.printf "%6d -------------------------------------------------------------------------\n", self[:index].to_i
|
248
|
+
self.each do |label, value|
|
249
|
+
next if label == :node
|
250
|
+
# next if label == :index
|
251
|
+
name = mapping.fancy_label(label)
|
252
|
+
f.printf " %40s : %s\n", name, value
|
253
|
+
end
|
254
|
+
|
255
|
+
end
|
256
|
+
|
257
|
+
end
|
258
|
+
|
259
|
+
end
|
260
|
+
end
|