uddf 0.1.0 → 0.2.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.
data/lib/uddf/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Uddf
4
- VERSION = "0.1.0"
3
+ module UDDF
4
+ VERSION = "0.2.0"
5
5
  end
data/lib/uddf.rb CHANGED
@@ -1,8 +1,71 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "uddf/version"
3
+ require "happymapper"
4
+ require "nokogiri"
4
5
 
5
- module Uddf
6
- class Error < StandardError; end
7
- # Your code goes here...
6
+ require "uddf/version"
7
+
8
+ # Universal Dive Data Format (UDDF) parser and validator
9
+ module UDDF
10
+ SUPPORTED_SCHEMA_VERSIONS = %w[3.0.0 3.0.1 3.1.0 3.2.0 3.2.1 3.2.2 3.2.3 3.3.0 3.3.1].freeze
11
+ SUPPORTED_PARSER_VERSIONS = %w[3.2.3].freeze
12
+
13
+ @schema_cache_mutex = Mutex.new
14
+
15
+ def self.load(path, force_version: nil)
16
+ xml = File.read(path)
17
+ parse(xml, force_version: force_version)
18
+ end
19
+
20
+ def self.parse(xml, force_version: nil)
21
+ version = force_version || extract_version(xml)
22
+ model_class = load_models_for_version(version)
23
+
24
+ model_class.parse(xml)
25
+ end
26
+
27
+ def self.validate(xml, force_version: nil)
28
+ version = force_version || extract_version(xml)
29
+ schema = load_schema_for_version(version)
30
+ doc = Nokogiri::XML::Document.parse(xml)
31
+
32
+ schema.validate(doc)
33
+ end
34
+
35
+ def self.extract_version(xml)
36
+ doc = Nokogiri::XML(xml)
37
+ doc.root&.[]("version")
38
+ end
39
+
40
+ def self.load_schema_for_version(version)
41
+ @schema_cache_mutex.synchronize do
42
+ @schema_cache ||= {}
43
+ @schema_cache[version] ||= begin
44
+ validate_version_support(version, :schema)
45
+ schema_path = File.join(__dir__, "uddf", "v#{version.tr(".", "")}", "schema.xsd")
46
+ Nokogiri::XML::Schema.new(File.read(schema_path))
47
+ end
48
+ end
49
+ end
50
+
51
+ def self.load_models_for_version(version)
52
+ validate_version_support(version, :parse)
53
+
54
+ case version
55
+ when "3.2.3"
56
+ require "uddf/v323/models"
57
+ V323::Models::Uddf
58
+ end
59
+ end
60
+
61
+ def self.validate_version_support(version, operation)
62
+ supported = case operation
63
+ when :parse then SUPPORTED_PARSER_VERSIONS
64
+ when :schema then SUPPORTED_SCHEMA_VERSIONS
65
+ end
66
+
67
+ return if supported.include?(version)
68
+
69
+ raise "Unsupported UDDF version for #{operation}, got '#{version}'"
70
+ end
8
71
  end
@@ -0,0 +1,311 @@
1
+ <uddf version="3.3.0">
2
+ <!-- die <generator>-Sektion muß in jeder UDDF-Datei stehen -->
3
+ <generator>
4
+ <!-- Beschreibung des die UDDF-Datei erzeugenden Programmes -->
5
+ <name>STL - Super-Taucher-Logbuch</name>
6
+ <type>logbook</type>
7
+ <manufacturer id="tauchhelden-cmp">
8
+ <name>Tauchhelden-Company</name>
9
+ <address>
10
+ <!-- Adreßdaten des Herstellers -->
11
+ </address>
12
+ <contact>
13
+ <!-- Kontaktdaten des Herstellers -->
14
+ </contact>
15
+ </manufacturer>
16
+ <version>3.14159</version>
17
+ <datetime>2004-09-30</datetime>
18
+ </generator>
19
+ <mediadata>
20
+ <image id="img_arnos_plattfuesse">
21
+ <title>Arnos Plattfüße...</title>
22
+ <objectname>plattfuss.jpg</objectname>
23
+ </image>
24
+ </mediadata>
25
+ <maker>
26
+ <!-- Beschreibung von Herstellern - so kann nachfolgend darauf referenziert werden, -->
27
+ <!-- ohne daß die Daten eines Herstellers mehrmals bei verschiedenen Ausrüstungsteilen -->
28
+ <!-- angegeben werden müßten -->
29
+ <manufacturer id="hersteller_froschkoenig">
30
+ <name>Froschkönig AG</name>
31
+ <address>
32
+ <street>Teichstr. 12</street>
33
+ <city>Seeheim</city>
34
+ <postcode>91827</postcode>
35
+ <country>Deutschland</country>
36
+ <province>Berlin-Brandenburg</province>
37
+ </address>
38
+ <contact>
39
+ <language>deutsch</language>
40
+ <phone>01234/234567</phone>
41
+ <mobilephone>0123/123123123</mobilephone>
42
+ <email>info@froschkoenig-ag.de</email>
43
+ <homepage>http://www.froschkoenig-ag.de</homepage>
44
+ </contact>
45
+ </manufacturer>
46
+ <!-- hier können weitere Hersteller aufgeführt werden -->
47
+ </maker>
48
+ <business>
49
+ <!-- Beschreibung von Tauchgeschäften - so kann nachfolgend darauf referenziert werden, -->
50
+ <!-- ohne daß die Daten eines Geschäftes mehrmals bei verschiedenen Ausrüstungsteilen -->
51
+ <!-- bzw. Käufen angegeben werden müßten -->
52
+ <shop id="shop_fuw-gmbh">
53
+ <name>Freizeit und Wassersport GmbH</name>
54
+ <address>
55
+ <!-- Adresse des Geschäftes, in dem das Ausrüstungsteil gekauft wurde -->
56
+ <street>Hans Hass Str. 1</street>
57
+ <city>Seedorf</city>
58
+ <postcode>15243</postcode>
59
+ <country>Deutschland</country>
60
+ </address>
61
+ <contact>
62
+ <!-- weitere Angaben (Telefonnr., EMail-Adresse etc.) -->
63
+ <phone>03456/615243</phone>
64
+ <mobilephone>0123/567567567</mobilephone>
65
+ <email>info@fuw-gmbh.de</email>
66
+ <homepage>http://www.fuw-gmbh.de</homepage>
67
+ </contact>
68
+ <notes>
69
+ <!-- zusätzliche Bemerkungen, Bilder usw. -->
70
+ </notes>
71
+ </shop>
72
+ <shop id="shop_die-flachtaucher">
73
+ <name>Die Flachtaucher</name>
74
+ <address>
75
+ <!-- Adresse des Geschäftes, in dem das Ausrüstungsteil gekauft wurde -->
76
+ </address>
77
+ <contact>
78
+ <!-- weitere Angaben (Telefonnr., EMail-Adresse etc.) -->
79
+ </contact>
80
+ <notes>
81
+ <!-- zusätzliche Bemerkungen, Bilder usw. -->
82
+ </notes>
83
+ </shop>
84
+ </business>
85
+ <diver>
86
+ <!-- hier werden zunächst die eigenen Daten (soweit gewünscht) abgelegt... -->
87
+ <owner id="owner_arno">
88
+ <!-- Beschreibung des Besitzers der UDDF-Datei (also die -->
89
+ <!-- eigenen Daten angegeben) -->
90
+ <personal>
91
+ <firstname>Arno</firstname>
92
+ <middlename>Albert</middlename>
93
+ <lastname>Alzheimer</lastname>
94
+ <honorific>Dr.</honorific>
95
+ <sex>male</sex>
96
+ <birthdate>
97
+ <datetime>1919-02-30</datetime>
98
+ </birthdate
99
+ <passport>987654321</passport>
100
+ <height>1.8</height>
101
+ <weight>86.0</weight>
102
+ <smoking>0</smoking>
103
+ <bloodgroup>A</bloodgroup>
104
+ <numberofdives timeinterval="P13Y/2006-02-16" dives="1234"/>
105
+ <membership organisation=="VDST/CMAS" memberid="123456"/>
106
+ </personal>
107
+ <address>
108
+ <street>Auf der Heide 12</street>
109
+ <city>Aheim</city>
110
+ <postcode>12345</postcode>
111
+ <country>Deutschland</country>
112
+ <!-- Bundesland nicht angegeben -->
113
+ </address>
114
+ <contact>
115
+ <language>deutsch</language>
116
+ <phone>01234/567890</phone>
117
+ <email>arno@arno-alzheimer.org</email>
118
+ <homepage>http://www.tieftauchen.info/arno</homepage>
119
+ </contact>
120
+ <equipment>
121
+ <!-- Auflistung der Ausrüstungsteile des Besitzers der UDDF-Datei -->
122
+ <buoyancycontroldevice id="mein_jacket">
123
+ <name>ABC</name>
124
+ <manufacturer>
125
+ <!-- Referenzierung des in der <maker>-Sektion deklarierten Herstellers -->
126
+ <link ref="hersteller_froschkoenig"/>
127
+ </manufacturer>
128
+ <model>Underwater Camping Team</model>
129
+ <serialnumber>123456789</serialnumber>
130
+ <purchase>
131
+ <datetime>1960-05-31</datetime>
132
+ <price currency="DM">100.00</price>
133
+ <shop>
134
+ <!-- Referenzierung des in der <business>-Sektion deklarierten Tauchgeschäfts -->
135
+ <link ref="shop_fuw-gmbh"/>
136
+ </shop>
137
+ </purchase>
138
+ <!-- Wartung jedes Jahr -->
139
+ <serviceinterval>365</serviceinterval>
140
+ <nextservicedate>
141
+ <datetime>2006-05-31</datetime>
142
+ </nextservicedate>
143
+ </buoyancycontroldevice>
144
+ <boots id="meine_fuesslinge">
145
+ <name>noname</name>
146
+ <manufacturer>
147
+ <!-- Referenzierung des in der <maker>-Sektion deklarierten Herstellers -->
148
+ <link ref="hersteller_froschkoenig"/>
149
+ </manufacturer>
150
+ <model>Größe 48</model>
151
+ <!-- Seriennummer gibt es hier nicht :-) -->
152
+ <purchase>
153
+ <datetime>1970-10-07</datetime>
154
+ <price currency="DM">10.00</price>
155
+ <shop>
156
+ <!-- Referenzierung des in der <business>-Sektion deklarierten Tauchgeschäfts -->
157
+ <link ref="shop_die-flachtaucher"/>
158
+ </shop>
159
+ </purchase>
160
+ <!-- besser einmal pro Monat waschen... ;-) -->
161
+ <serviceinterval>30</serviceinterval>
162
+ <!-- genaues "Serviceintervall" existiert nicht ;-) -->
163
+ </boots>
164
+ <!-- hier die Auflistung weiterer Ausrüstungsteile des Besitzers der UDDF-Datei -->
165
+ </equipment>
166
+ <medical>
167
+ <examination>
168
+ <datetime>2003-04-12</datetime>
169
+ <doctor id="doctorDusel">
170
+ <personal>
171
+ <firstname>Dirk</firstname>
172
+ <lastname>Dusel</lastname>
173
+ <honorific>Dr.</honorific>
174
+ <sex>male</sex>
175
+ <birthdate>
176
+ <!-- falls Geburtsdaten bekannt, können sie hier angegeben werden -->
177
+ </birthdate
178
+ </personal>
179
+ <address>
180
+ <street>Duddelstr. 34</street>
181
+ <city>Dortmund</city>
182
+ <postcode>54321</postcode>
183
+ <country>Deutschland</country>
184
+ <province>Nordrhein-Westfalen</province>
185
+ </address>
186
+ <contact>
187
+ <language>deutsch</language>
188
+ <phone>01234/987654</phone>
189
+ <!-- weder EMail-Adresse noch Homepage bekannt -->
190
+ </contact>
191
+ </doctor>
192
+ <examinationresult>passed</examinationresult>
193
+ <notes>
194
+ <para>
195
+ Plattfüße scheinen die Tauchtauglichkeit nicht zu beeinflussen :-)
196
+ </para>
197
+ <link ref="img_arnos_plattfuesse"/>
198
+ </notes>
199
+ </examination>
200
+ <examination>
201
+ <datetime>2004-04-20</datetime>
202
+ <!-- nachfolgend eine Referenzierung auf den untersuchenden Arzt, -->
203
+ <!-- da die Angaben zur Person bereits oben erfolgten -->
204
+ <link ref="doctorDusel"/>
205
+ <examinationresult>passed</examinationresult>
206
+ </examination>
207
+ </medical>
208
+ <education>
209
+ <!-- alle Stufen der Tauchausbildung -> mehrere -->
210
+ <!-- <certification>-Elemente hintereinander -->
211
+ <certification>
212
+ <level>Bronze</level>
213
+ <certificatenumber>192837</certificatenumber>
214
+ <organisation>VDST/CMAS</organisation>
215
+ <!-- da der damalige Tauchlehrer nicht in einer UDDF-Datei -->
216
+ <!-- eingetragen wurde, entfällt auch die Referenz darauf -->
217
+ <!-- mittels <link ref="..."/> -->
218
+ <issuedate>
219
+ <datetime>1994-03-15</datetime>
220
+ </issuedate>
221
+ </certification>
222
+ <certification>
223
+ <specialty>Orientierung</specialty>
224
+ <organisation>VDST/CMAS</organisation>
225
+ <!-- da der damalige Tauchlehrer nicht in einer UDDF-Datei -->
226
+ <!-- eingetragen wurde, entfällt auch die Referenz darauf -->
227
+ <!-- mittels <link ref="..."/> -->
228
+ <issuedate>
229
+ <datetime>1995-01-22</datetime>
230
+ </issuedate>
231
+ </certification>
232
+ <certification>
233
+ <level>Silber</level>
234
+ <certificatenumber>283746</certificatenumber>
235
+ <organisation>VDST/CMAS</organisation>
236
+ <!-- da der damalige Tauchlehrer nicht in einer UDDF-Datei -->
237
+ <!-- eingetragen wurde, entfällt auch die Referenz darauf -->
238
+ <!-- mittels <link ref="..."/> -->
239
+ <issuedate>
240
+ <datetime>1997-11-26</datetime>
241
+ </issuedate>
242
+ </certification>
243
+ <certification>
244
+ <level>Gold</level>
245
+ <certificatenumber>374650</certificatenumber>
246
+ <organisation>VDST/CMAS</organisation>
247
+ <!-- da der damalige Tauchlehrer nicht in einer UDDF-Datei -->
248
+ <!-- eingetragen wurde, entfällt auch die Referenz darauf -->
249
+ <!-- mittels <link ref="..."/> -->
250
+ <issuedate>
251
+ <datetime>2000-05-10</datetime>
252
+ </issuedate>
253
+ </certification>
254
+ </education>
255
+ <divepermissions>
256
+ <!-- hier können beliebig viele Genehmigungen aufgelistet werden -->
257
+ <permit>
258
+ <name>DiveCard</name>
259
+ <region>Österreich</region>
260
+ <issuedate> <!-- Ausstellungsdatum -->
261
+ <datetime>2004-08-24</datetime>
262
+ </issuedate>
263
+ <validdate> <!-- Gültigkeitsdatum -->
264
+ <datetime>2005-08-23</datetime>
265
+ </validdate>
266
+ </permit>
267
+ <permit>
268
+ <name>Zeeland</name>
269
+ <region>Zeeland (Niederlande)</region>
270
+ <issuedate> <!-- Ausstellungsdatum -->
271
+ <datetime>1996-09-03</datetime>
272
+ </issuedate>
273
+ <validdate> <!-- Gültigkeitsdatum -->
274
+ <datetime>2001-08-31</datetime>
275
+ </validdate>
276
+ </permit>
277
+ <!-- hier gegebenenfalls weitere Genehmigungen -->
278
+ </divepermissions>
279
+ <!-- da keine zusätzlichen Tauchunfall-Versicherungen abgeschlossen -->
280
+ <!-- wurden, entfällt <diveinsurances>...</diveinsurances> -->
281
+ </owner>
282
+ <!-- ... und nun folgen die Daten aller Tauchpartner (soweit bekannt) -->
283
+ <buddy id="buddy_bert_der_luftsauger">
284
+ <!-- Daten des ersten Tauchpartners -->
285
+ <personal>
286
+ <firstname>Bert</firstname>
287
+ <lastname>Bammel</lastname>
288
+ </personal>
289
+ <!-- keine Adreßdaten angegeben - <address>...</address> entfällt -->
290
+ <contact>
291
+ <email>luftsauger@tieftauchen.de</email>
292
+ <homepage>http://www.tieftauchen.info/bert</homepage>
293
+ </contact>
294
+ </buddy>
295
+ <buddy id="buddyCarsten">
296
+ <!-- Beschreibung eines weiteren Tauchpartners -->
297
+ <personal>
298
+ <firstname>Carsten</firstname>
299
+ <lastname>Cabuff</lastname>
300
+ </personal>
301
+ <!-- Adreßdaten nicht bekannt - <address>...</address> entfällt -->
302
+ <contact>
303
+ <email>lurchi@abcde.com</email>
304
+ <homepage>http://www.tieftauchen.info/carsten</homepage>
305
+ </contact>
306
+ </buddy>
307
+ <!-- hier können noch Beschreibungen von weiteren Tauchpartnern eingefügt werden -->
308
+ </diver>
309
+ <!-- hier könnten weitere Sektionen folgen, z. B. die Tauchprofildaten -->
310
+ <!-- oder zur Generierung von Austauchtabellen -->
311
+ </uddf>
data/uddf.gemspec CHANGED
@@ -4,7 +4,7 @@ require_relative "lib/uddf/version"
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = "uddf"
7
- spec.version = Uddf::VERSION
7
+ spec.version = UDDF::VERSION
8
8
  spec.authors = ["Flipez"]
9
9
  spec.email = ["gh@flipez.net"]
10
10
 
@@ -16,6 +16,7 @@ Gem::Specification.new do |spec|
16
16
  spec.metadata["homepage_uri"] = spec.homepage
17
17
  spec.metadata["source_code_uri"] = "https://github.com/Flipez/ruby-uddf"
18
18
  spec.metadata["changelog_uri"] = "https://github.com/Flipez/ruby-uddf"
19
+ spec.metadata["rubygems_mfa_required"] = "true"
19
20
 
20
21
  # Specify which files should be added to the gem when it is released.
21
22
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
@@ -26,9 +27,10 @@ Gem::Specification.new do |spec|
26
27
  spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
27
28
  spec.require_paths = ["lib"]
28
29
 
29
- # Uncomment to register a new dependency of your gem
30
- # spec.add_dependency "example-gem", "~> 1.0"
30
+ spec.add_dependency "nokogiri-happymapper"
31
31
 
32
- # For more information and examples about making a new gem, checkout our
33
- # guide at: https://bundler.io/guides/creating_gem.html
32
+ spec.add_development_dependency "irb"
33
+ spec.add_development_dependency "rake", "~> 13.0"
34
+ spec.add_development_dependency "rubocop", "~> 1.7"
35
+ spec.add_development_dependency "rubocop-rake", "~> 0.7"
34
36
  end
metadata CHANGED
@@ -1,15 +1,85 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: uddf
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Flipez
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2025-08-20 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2025-08-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: nokogiri-happymapper
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: irb
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '13.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '13.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubocop
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.7'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.7'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop-rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.7'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.7'
13
83
  description: A Ruby library for parsing and writing UDDF (Universal Data Description
14
84
  Format) files.
15
85
  email:
@@ -23,12 +93,28 @@ files:
23
93
  - ".rubocop.yml"
24
94
  - CHANGELOG.md
25
95
  - Gemfile
96
+ - Gemfile.lock
26
97
  - README.md
27
98
  - Rakefile
28
99
  - bin/console
29
100
  - bin/setup
101
+ - dive_files/BaMQZdEhp3djeDxQ5HyCreOntBm1-1753908953.uddf
102
+ - dive_files/Peregrine TX[93CBB2BB]#140_2025-03-21.uddf
103
+ - dive_files/Peregrine TX[93CBB2BB]#148_2025-06-26.uddf
30
104
  - lib/uddf.rb
105
+ - lib/uddf/base/models.rb
106
+ - lib/uddf/v300/schema.xsd
107
+ - lib/uddf/v301/schema.xsd
108
+ - lib/uddf/v310/schema.xsd
109
+ - lib/uddf/v320/schema.xsd
110
+ - lib/uddf/v321/schema.xsd
111
+ - lib/uddf/v322/schema.xsd
112
+ - lib/uddf/v323/models.rb
113
+ - lib/uddf/v323/schema.xsd
114
+ - lib/uddf/v330/schema.xsd
115
+ - lib/uddf/v331/schema.xsd
31
116
  - lib/uddf/version.rb
117
+ - test_files/v330/diver_data.uddf
32
118
  - uddf.gemspec
33
119
  homepage: https://github.com/Flipez/ruby-uddf
34
120
  licenses: []
@@ -36,6 +122,7 @@ metadata:
36
122
  homepage_uri: https://github.com/Flipez/ruby-uddf
37
123
  source_code_uri: https://github.com/Flipez/ruby-uddf
38
124
  changelog_uri: https://github.com/Flipez/ruby-uddf
125
+ rubygems_mfa_required: 'true'
39
126
  post_install_message:
40
127
  rdoc_options: []
41
128
  require_paths: