ds-convert 0.1.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.
Files changed (87) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +294 -0
  3. data/Rakefile +12 -0
  4. data/config/settings.yml +150 -0
  5. data/exe/ds-convert +149 -0
  6. data/exe/ds-recon +275 -0
  7. data/exe/ds-validate-csv +40 -0
  8. data/exe/marc-mrc-to-xml.rb +80 -0
  9. data/lib/ds/cli.rb +102 -0
  10. data/lib/ds/constants.rb +166 -0
  11. data/lib/ds/converter/converter.rb +124 -0
  12. data/lib/ds/converter/writer.rb +50 -0
  13. data/lib/ds/converter.rb +7 -0
  14. data/lib/ds/csv_util.rb +43 -0
  15. data/lib/ds/data/berkeley-arks.txt +4000 -0
  16. data/lib/ds/data/getty-aat-centuries.csv +71 -0
  17. data/lib/ds/data/iiif_manifests.csv +122 -0
  18. data/lib/ds/data/legacy-iiif-manifests.csv +77 -0
  19. data/lib/ds/ds_error.rb +1 -0
  20. data/lib/ds/extractor/base_record_locator.rb +24 -0
  21. data/lib/ds/extractor/base_term.rb +79 -0
  22. data/lib/ds/extractor/csv_record_locator.rb +13 -0
  23. data/lib/ds/extractor/ds_csv_extractor.rb +695 -0
  24. data/lib/ds/extractor/ds_mets_xml_extractor.rb +1114 -0
  25. data/lib/ds/extractor/genre.rb +45 -0
  26. data/lib/ds/extractor/language.rb +31 -0
  27. data/lib/ds/extractor/marc_xml_extractor.rb +1172 -0
  28. data/lib/ds/extractor/material.rb +12 -0
  29. data/lib/ds/extractor/name.rb +50 -0
  30. data/lib/ds/extractor/place.rb +11 -0
  31. data/lib/ds/extractor/subject.rb +58 -0
  32. data/lib/ds/extractor/tei_xml_extractor.rb +687 -0
  33. data/lib/ds/extractor/title.rb +52 -0
  34. data/lib/ds/extractor/xml_record_locator.rb +38 -0
  35. data/lib/ds/extractor.rb +24 -0
  36. data/lib/ds/institutions.rb +55 -0
  37. data/lib/ds/manifest/base_id_validator.rb +76 -0
  38. data/lib/ds/manifest/constants.rb +67 -0
  39. data/lib/ds/manifest/ds_csv_id_validator.rb +15 -0
  40. data/lib/ds/manifest/entry.rb +133 -0
  41. data/lib/ds/manifest/manifest.rb +74 -0
  42. data/lib/ds/manifest/manifest_validator.rb +256 -0
  43. data/lib/ds/manifest/simple_xml_id_validator.rb +42 -0
  44. data/lib/ds/manifest.rb +30 -0
  45. data/lib/ds/mapper/base_mapper.rb +221 -0
  46. data/lib/ds/mapper/ds_csv_mapper.rb +77 -0
  47. data/lib/ds/mapper/ds_mets_mapper.rb +85 -0
  48. data/lib/ds/mapper/marc_mapper.rb +87 -0
  49. data/lib/ds/mapper/tei_xml_mapper.rb +79 -0
  50. data/lib/ds/mapper.rb +13 -0
  51. data/lib/ds/recon/constants.rb +56 -0
  52. data/lib/ds/recon/ds_csv_enumerator.rb +16 -0
  53. data/lib/ds/recon/ds_mets_xml_enumerator.rb +14 -0
  54. data/lib/ds/recon/marc_xml_enumerator.rb +15 -0
  55. data/lib/ds/recon/recon_builder.rb +183 -0
  56. data/lib/ds/recon/recon_data.rb +37 -0
  57. data/lib/ds/recon/recon_manager.rb +92 -0
  58. data/lib/ds/recon/source_enumerator.rb +21 -0
  59. data/lib/ds/recon/tei_xml_enumerator.rb +14 -0
  60. data/lib/ds/recon/type/all_subjects.rb +18 -0
  61. data/lib/ds/recon/type/genres.rb +50 -0
  62. data/lib/ds/recon/type/languages.rb +38 -0
  63. data/lib/ds/recon/type/materials.rb +40 -0
  64. data/lib/ds/recon/type/named_subjects.rb +20 -0
  65. data/lib/ds/recon/type/names.rb +65 -0
  66. data/lib/ds/recon/type/places.rb +40 -0
  67. data/lib/ds/recon/type/recon_type.rb +136 -0
  68. data/lib/ds/recon/type/splits.rb +34 -0
  69. data/lib/ds/recon/type/subjects.rb +65 -0
  70. data/lib/ds/recon/type/titles.rb +38 -0
  71. data/lib/ds/recon/url_lookup.rb +52 -0
  72. data/lib/ds/recon.rb +292 -0
  73. data/lib/ds/source/base_source.rb +32 -0
  74. data/lib/ds/source/ds_csv.rb +18 -0
  75. data/lib/ds/source/ds_mets_xml.rb +20 -0
  76. data/lib/ds/source/marc_xml.rb +22 -0
  77. data/lib/ds/source/source_cache.rb +69 -0
  78. data/lib/ds/source/tei_xml.rb +22 -0
  79. data/lib/ds/source.rb +20 -0
  80. data/lib/ds/util/cache.rb +111 -0
  81. data/lib/ds/util/csv_validator.rb +209 -0
  82. data/lib/ds/util/csv_writer.rb +42 -0
  83. data/lib/ds/util/strings.rb +194 -0
  84. data/lib/ds/util.rb +37 -0
  85. data/lib/ds/version.rb +5 -0
  86. data/lib/ds.rb +237 -0
  87. metadata +246 -0
data/lib/ds.rb ADDED
@@ -0,0 +1,237 @@
1
+ require 'config'
2
+ require 'active_support/all'
3
+
4
+ require_relative 'ds/ds_error'
5
+ require_relative 'ds/util'
6
+ require_relative 'ds/recon/recon_data'
7
+ require_relative 'ds/constants'
8
+ require_relative 'ds/source'
9
+ require_relative 'ds/extractor'
10
+ require_relative 'ds/extractor/ds_mets_xml_extractor'
11
+ require_relative 'ds/extractor/tei_xml_extractor'
12
+ require_relative 'ds/extractor/marc_xml_extractor'
13
+ require_relative 'ds/csv_util'
14
+ require_relative 'ds/extractor/ds_csv_extractor'
15
+ require_relative 'ds/recon'
16
+ require_relative 'ds/institutions'
17
+ require_relative 'ds/mapper'
18
+ require_relative 'ds/manifest'
19
+ require_relative 'ds/converter'
20
+ require_relative 'ds/version'
21
+
22
+ module DS
23
+ include DS::Constants
24
+
25
+ def self.root
26
+ File.expand_path '../..', __FILE__
27
+ end
28
+
29
+ def self.env
30
+ @@env ||= 'production'
31
+ end
32
+
33
+ def self.env= environment
34
+ @@env = environment
35
+ end
36
+
37
+ def self.normalize_key key
38
+ return '' if key.blank?
39
+ key.to_s.downcase.strip.gsub %r{\W+}, ''
40
+ end
41
+
42
+ def self.data_dir
43
+ File.join root, 'data'
44
+ end
45
+
46
+ def self.configure!
47
+ config_dir = File.join root, 'config'
48
+ # Set Settings, so you can do things like Settings.recon.key ...
49
+ Config.load_and_set_settings(Config.setting_files config_dir, DS.env)
50
+ end
51
+
52
+ module ClassMethods
53
+ def mark_long s
54
+ return s if s.to_s.size <= DS::MAX_WIKIBASE_FIELD_LENGTH
55
+
56
+ splits = Recon::Type::Splits._lookup_single s, from_column: 'authorized_label'
57
+ return "SPLIT: #{s}" if splits.blank?
58
+ splits
59
+ end
60
+
61
+ ##
62
+ # Given a pipe separated list of single years or ranges of years, return
63
+ # a pipe- and semicolon-separated list of century integers. Year ranges
64
+ # are separated by the +^+ character, so that +-+ can unambiguously be
65
+ # used for BCE years as negative integers (<tt>1099-1000 BCE</tt> =>
66
+ # <tt>-1099^-1000</tt>)
67
+ #
68
+ # For example,
69
+ #
70
+ # DS.transform_dates_to_centuries('1400') # => '15'
71
+ # DS.transform_dates_to_centuries('1400^1499') # => '15'
72
+ # DS.transform_dates_to_centuries('1325|1400^1499') # => '14|15'
73
+ # DS.transform_dates_to_centuries('890^1020') # => '9;10;11'
74
+ # DS.transform_dates_to_centuries('-800^-701') # => '-8'
75
+ #
76
+ # @param [String] dates a pipe separated list of single dates or date
77
+ # ranges: '1832', '1350^1520'
78
+ # @return [String] a pipe-separated century integers
79
+ def transform_dates_to_centuries dates
80
+ return if dates.blank?
81
+ dates.to_s.split('|').flat_map { |date_range|
82
+ next [] if date_range.strip.empty? # don't process empty values
83
+ # Adjust ranges to return sensible centuries for ranges like
84
+ # '1400-1499' or '1401-1500'
85
+ date_range = adjust_for_century date_range
86
+ # turn the date/date range into a [min,max] array of century integers:
87
+ # 1350-1550 => [14,16]
88
+ # 1350 => [14]
89
+ centuries = date_range.split('^').map { |i| calculate_century i }.sort
90
+ # get an array for the range of centuries:
91
+ # [14,16] => 14, 15, 16
92
+ # join them; throw away zero if range spans BCE/CE
93
+ (centuries.first..centuries.last).to_a.reject(&:zero?).join ';' # join list of centuries by semicolons
94
+ }.join '|'
95
+ end
96
+
97
+ ##
98
+ # Take a formatted string of century integers and return the string AAT
99
+ # century URIs, retaining the divisions.
100
+ #
101
+ # @param [String] centuries_string
102
+ # @return [String]
103
+ def transform_centuries_to_aat centuries_string, rec_sep: '|', sub_sep: ';'
104
+ return if centuries_string.to_s.strip.empty?
105
+
106
+ centuries_string.split(rec_sep).map { |century_range|
107
+ century_range.split(sub_sep).map { |century_int|
108
+ lookup_century century_int
109
+ }.join sub_sep
110
+ }.join rec_sep
111
+ end
112
+
113
+ ##
114
+ # Adjust date ranges so that intended results are returned for century
115
+ # values. Thus:
116
+ #
117
+ # 1400 to 1499 => 15th C. CE
118
+ # 1401 to 1500 => 15th C. CE
119
+ #
120
+ # And, thus:
121
+ #
122
+ # -1499 to -1400 => 15th C. BCE
123
+ # -1500 to -1401 => 15th C. BCE
124
+ #
125
+ # This method adjusts the end year for CE dates and the start
126
+ # year for BCE dates as needed:
127
+ #
128
+ # DS.adjust_for_century '1325' # => '1325'; no change needed
129
+ # DS.adjust_for_century '1400^1499' # => '1400^1499'; no change needed
130
+ # DS.adjust_for_century '1401^1500' # => '1401^1499'
131
+ # DS.adjust_for_century '-1500^-1401' # => '-1500^-1401'; no change needed
132
+ # DS.adjust_for_century '-1499^-1400' # => '-1499^-1401'
133
+ #
134
+ # @param [String] range a single year or +^+-separated date range
135
+ # @return [String] the range, adjusted if needed
136
+ def adjust_for_century range
137
+ # return a single date
138
+ return range if range =~ %r{^-?\d+$}
139
+
140
+ start_year, end_year = range.split('^')
141
+ start_int, end_int = start_year.to_i, end_year.to_i
142
+
143
+ # end dates divisible by 100 need to be reduced by one:
144
+ # 1500 => 1499; -1500 => -1501
145
+ end_int -= 1 if end_int % 100 == 0
146
+ [start_int, end_int].uniq.join '^'
147
+ end
148
+
149
+ ##
150
+ # Given a year, return to the corresponding century as an integer following
151
+ # this pattern:
152
+ #
153
+ # - the 16th C. CE is years 1500 to 1599
154
+ # - the 1st C. CE is years 0 to 99
155
+ # - the 16th C. BCE is years -1599 to -1501
156
+ #
157
+ # Thus:
158
+ #
159
+ # DS.calculate_century '1501' # => 16
160
+ # DS.calculate_century '1600' # => 17
161
+ # DS.calculate_century '-1600' # => -16
162
+ # DS.calculate_century '-1501' # => -16
163
+ # DS.calculate_century '1' # => 1
164
+ # DS.calculate_century '0' # => 1
165
+ #
166
+ # @param [Integer] year an integer year value
167
+ # @return [Integer] an integer representation of the century
168
+ def calculate_century year
169
+ # remove leading 0s; 4-digit numbers starting with 0 are octal
170
+ year_int = Integer year
171
+ # year <=> 0 returns 1 if year > 0; -1 if year < 0; 0 if year == 0
172
+ # 0 is a special year; its sign is 1 and its absolute value is 1
173
+ sign = year_int == 0 ? 1 : (year_int <=> 0)
174
+ abs_val = year_int == 0 ? 1 : year_int.abs
175
+ offset = sign < 0 ? 1 : 0
176
+
177
+ # if year is 1501, sign == 1 and abs_val == 1501
178
+ # => 1 * ((1501 - 1)/100 +1) => 1 * (1500/100 + 1) => 1 * (15 + 1) = 16
179
+ # if year is 1500, sign == 1 and abs_val == 1500
180
+ # => 1 * ((1500 - 1)/100 +1) => 1 * (1499/100 + 1) => 1 * (14 + 1) = 15
181
+ sign * ((abs_val - offset) / 100 + 1)
182
+ end
183
+
184
+ def timestamp
185
+ DateTime.now.iso8601.to_s
186
+ end
187
+
188
+ @@centuries = nil
189
+ ##
190
+ # Look up the URI for +century+, where century is an integer like +1+, +12+,
191
+ # +-3+, etc.
192
+ # Values are read in from the file `data/getty-aat-centuries.csv` and
193
+ # converted to a hash of Getty AAT century URIs. Keys are century integers,
194
+ # like '1', '2', '3', '-1', '-2', '-3', etc. and values are AAT URIs.
195
+ #
196
+ # @param [Integer] century an integer like +1+, +12+, +-3+, etc.
197
+ # @return [String] the AAT URI for the century
198
+ def lookup_century century
199
+ if @@centuries.nil?
200
+ path = File.expand_path '../ds/data/getty-aat-centuries.csv', __FILE__
201
+
202
+ # aat_id,label,number
203
+ # http://vocab.getty.edu/aat/300404465,fifteenth century (dates CE),15
204
+ # http://vocab.getty.edu/aat/300404493,first century (dates CE),1
205
+ @@centuries = CSV.read(path).inject({}) do |h, row|
206
+ if row.first == 'aat_id'
207
+ h
208
+ else
209
+ h.update({ row.last => row.first })
210
+ end
211
+ end.freeze
212
+ end
213
+ @@centuries[century.to_s]
214
+ end
215
+
216
+ @@logger = nil
217
+ @@loggers = {}
218
+ def logger
219
+ return @@logger if @@logger
220
+ @@logger = DS.logger_for self.class.name
221
+ end
222
+
223
+
224
+ def logger_for(classname)
225
+ @@loggers[classname] ||= configure_logger_for(classname)
226
+ end
227
+
228
+ def configure_logger_for(classname)
229
+ logger = Logger.new(STDOUT)
230
+ logger.progname = classname
231
+ logger.level = Settings.ds.log_level || :warn
232
+ logger
233
+ end
234
+ end
235
+
236
+ self.extend ClassMethods
237
+ end
metadata ADDED
@@ -0,0 +1,246 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ds-convert
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Doug Emery
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: activesupport
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: 8.0.2
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: 8.0.2
26
+ - !ruby/object:Gem::Dependency
27
+ name: colorize
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: 1.1.0
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: 1.1.0
40
+ - !ruby/object:Gem::Dependency
41
+ name: config
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '3'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '3'
54
+ - !ruby/object:Gem::Dependency
55
+ name: csv
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: 3.3.5
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: 3.3.5
68
+ - !ruby/object:Gem::Dependency
69
+ name: git
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: 1.11.0
75
+ type: :runtime
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: 1.11.0
82
+ - !ruby/object:Gem::Dependency
83
+ name: marc
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: 1.1.1
89
+ type: :runtime
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: 1.1.1
96
+ - !ruby/object:Gem::Dependency
97
+ name: nokogiri
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: 1.15.3
103
+ type: :runtime
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: 1.15.3
110
+ - !ruby/object:Gem::Dependency
111
+ name: thor
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: 1.2.1
117
+ type: :runtime
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: 1.2.1
124
+ description: 'Scripts for converting Digital Scriptorium member data to the DS import
125
+ spreadsheet format and for extracting values for authority file reconciliation.
126
+
127
+ '
128
+ email:
129
+ - emeryr@upenn.edu
130
+ executables:
131
+ - ds-convert
132
+ - ds-recon
133
+ - ds-validate-csv
134
+ - marc-mrc-to-xml.rb
135
+ extensions: []
136
+ extra_rdoc_files: []
137
+ files:
138
+ - README.md
139
+ - Rakefile
140
+ - config/settings.yml
141
+ - exe/ds-convert
142
+ - exe/ds-recon
143
+ - exe/ds-validate-csv
144
+ - exe/marc-mrc-to-xml.rb
145
+ - lib/ds.rb
146
+ - lib/ds/cli.rb
147
+ - lib/ds/constants.rb
148
+ - lib/ds/converter.rb
149
+ - lib/ds/converter/converter.rb
150
+ - lib/ds/converter/writer.rb
151
+ - lib/ds/csv_util.rb
152
+ - lib/ds/data/berkeley-arks.txt
153
+ - lib/ds/data/getty-aat-centuries.csv
154
+ - lib/ds/data/iiif_manifests.csv
155
+ - lib/ds/data/legacy-iiif-manifests.csv
156
+ - lib/ds/ds_error.rb
157
+ - lib/ds/extractor.rb
158
+ - lib/ds/extractor/base_record_locator.rb
159
+ - lib/ds/extractor/base_term.rb
160
+ - lib/ds/extractor/csv_record_locator.rb
161
+ - lib/ds/extractor/ds_csv_extractor.rb
162
+ - lib/ds/extractor/ds_mets_xml_extractor.rb
163
+ - lib/ds/extractor/genre.rb
164
+ - lib/ds/extractor/language.rb
165
+ - lib/ds/extractor/marc_xml_extractor.rb
166
+ - lib/ds/extractor/material.rb
167
+ - lib/ds/extractor/name.rb
168
+ - lib/ds/extractor/place.rb
169
+ - lib/ds/extractor/subject.rb
170
+ - lib/ds/extractor/tei_xml_extractor.rb
171
+ - lib/ds/extractor/title.rb
172
+ - lib/ds/extractor/xml_record_locator.rb
173
+ - lib/ds/institutions.rb
174
+ - lib/ds/manifest.rb
175
+ - lib/ds/manifest/base_id_validator.rb
176
+ - lib/ds/manifest/constants.rb
177
+ - lib/ds/manifest/ds_csv_id_validator.rb
178
+ - lib/ds/manifest/entry.rb
179
+ - lib/ds/manifest/manifest.rb
180
+ - lib/ds/manifest/manifest_validator.rb
181
+ - lib/ds/manifest/simple_xml_id_validator.rb
182
+ - lib/ds/mapper.rb
183
+ - lib/ds/mapper/base_mapper.rb
184
+ - lib/ds/mapper/ds_csv_mapper.rb
185
+ - lib/ds/mapper/ds_mets_mapper.rb
186
+ - lib/ds/mapper/marc_mapper.rb
187
+ - lib/ds/mapper/tei_xml_mapper.rb
188
+ - lib/ds/recon.rb
189
+ - lib/ds/recon/constants.rb
190
+ - lib/ds/recon/ds_csv_enumerator.rb
191
+ - lib/ds/recon/ds_mets_xml_enumerator.rb
192
+ - lib/ds/recon/marc_xml_enumerator.rb
193
+ - lib/ds/recon/recon_builder.rb
194
+ - lib/ds/recon/recon_data.rb
195
+ - lib/ds/recon/recon_manager.rb
196
+ - lib/ds/recon/source_enumerator.rb
197
+ - lib/ds/recon/tei_xml_enumerator.rb
198
+ - lib/ds/recon/type/all_subjects.rb
199
+ - lib/ds/recon/type/genres.rb
200
+ - lib/ds/recon/type/languages.rb
201
+ - lib/ds/recon/type/materials.rb
202
+ - lib/ds/recon/type/named_subjects.rb
203
+ - lib/ds/recon/type/names.rb
204
+ - lib/ds/recon/type/places.rb
205
+ - lib/ds/recon/type/recon_type.rb
206
+ - lib/ds/recon/type/splits.rb
207
+ - lib/ds/recon/type/subjects.rb
208
+ - lib/ds/recon/type/titles.rb
209
+ - lib/ds/recon/url_lookup.rb
210
+ - lib/ds/source.rb
211
+ - lib/ds/source/base_source.rb
212
+ - lib/ds/source/ds_csv.rb
213
+ - lib/ds/source/ds_mets_xml.rb
214
+ - lib/ds/source/marc_xml.rb
215
+ - lib/ds/source/source_cache.rb
216
+ - lib/ds/source/tei_xml.rb
217
+ - lib/ds/util.rb
218
+ - lib/ds/util/cache.rb
219
+ - lib/ds/util/csv_validator.rb
220
+ - lib/ds/util/csv_writer.rb
221
+ - lib/ds/util/strings.rb
222
+ - lib/ds/version.rb
223
+ homepage: https://github.com/DigitalScriptorium/ds-convert
224
+ licenses: []
225
+ metadata:
226
+ allowed_push_host: https://rubygems.org
227
+ homepage_uri: https://github.com/DigitalScriptorium/ds-convert
228
+ source_code_uri: https://github.com/DigitalScriptorium/ds-convert
229
+ rdoc_options: []
230
+ require_paths:
231
+ - lib
232
+ required_ruby_version: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - ">="
235
+ - !ruby/object:Gem::Version
236
+ version: '3.3'
237
+ required_rubygems_version: !ruby/object:Gem::Requirement
238
+ requirements:
239
+ - - ">="
240
+ - !ruby/object:Gem::Version
241
+ version: '0'
242
+ requirements: []
243
+ rubygems_version: 3.6.9
244
+ specification_version: 4
245
+ summary: ETL scripts for managing Digital Scriptorium member data
246
+ test_files: []