polyrex 1.1.13 → 1.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (6) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/lib/polyrex.rb +87 -33
  5. metadata +39 -75
  6. metadata.gz.sig +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 7b5969096e2a90c6076f804745cd2722cc88f908
4
- data.tar.gz: 9f98b301dd9c402b8d3398986366aff7403500ed
2
+ SHA256:
3
+ metadata.gz: ba4f6a16445a6fbd95a21f6e5a5641a7d9f5003f22fb7ed2091e89e93668d6cb
4
+ data.tar.gz: a240d4e392b9b09556e26009bc72c59bd3a502f8a35292204df3ac201e8d5a7e
5
5
  SHA512:
6
- metadata.gz: fa339d87856a0284db91be4042c8a18cc9b20013ff023b5d3d5bfd2d003322edbf04c9962d1b5bf2ff277e8ee041d7836f5cbec535f25a9994beadd9cac7e820
7
- data.tar.gz: 2d546271156b0ce4cc4e6f77fd77da81f7f148a56bee31423600d73df23ce226bb98546c734d9c68906180a9a2e5abf9665bb8d86b683024efa19b85ce62e0c2
6
+ metadata.gz: 732161598ed4e13790d649ba5f531e82e91c6b1d9236b12f3b9acca5cdc4f62dec2538bd3eeee6c40258f677f5b491b01d37d3d20213cd9af47a319bb436a50a
7
+ data.tar.gz: '028715744fce1de173a07353cc193b0481a5b6be848fce8c9c39e7be09fe601044114ae0aea2fc97680c174c72ef9fac79bfa9d05ae053763fd55bf4ea2c4ca4'
checksums.yaml.gz.sig CHANGED
Binary file
data.tar.gz.sig CHANGED
Binary file
data/lib/polyrex.rb CHANGED
@@ -3,10 +3,10 @@
3
3
  # file: polyrex.rb
4
4
 
5
5
  #require 'open-uri'
6
- require 'polyrex-schema'
6
+ #require 'polyrex-schema'
7
7
  #require 'line-tree'
8
8
  require 'polyrex-objects'
9
- require 'polyrex-createobject'
9
+ #require 'polyrex-createobject'
10
10
  require 'polyrex-object-methods'
11
11
  require 'recordx-xslt'
12
12
  #require 'rexle'
@@ -42,18 +42,23 @@ class Polyrex
42
42
  attr_accessor :summary_fields, :xslt_schema, :id_counter,
43
43
  :schema, :type, :delimiter, :xslt, :format_masks
44
44
 
45
- def initialize(location=nil, schema: nil, id_counter: '1')
45
+ def initialize(location=nil, schema: nil, id_counter: '1', debug: false)
46
46
 
47
47
 
48
- @id_counter = id_counter
48
+ @id_counter, @debug = id_counter, debug
49
49
  @format_masks = []
50
50
  @delimiter = ''
51
51
 
52
52
  self.method(:schema=).call(schema) if schema
53
53
 
54
- if location then
54
+ if location then
55
55
 
56
- openx(location)
56
+ s, type = RXFHelper.read(location)
57
+ return import(s) if s =~ /^\<\?polyrex\b/
58
+
59
+ @local_filepath = location if type == :file or type == :dfs
60
+
61
+ openx(s)
57
62
 
58
63
  if schema then
59
64
 
@@ -70,6 +75,7 @@ class Polyrex
70
75
  end
71
76
 
72
77
  @polyrex_xslt = RecordxXSLT.new
78
+ #@parent_node = @doc.root if @doc
73
79
  end
74
80
 
75
81
  def add(pxobj)
@@ -80,15 +86,9 @@ class Polyrex
80
86
  CGI.unescapeHTML(to_xml(options))
81
87
  end
82
88
 
83
- def create(id: nil)
84
-
85
- # @create is a PolyrexCreateObject,
86
- # @parent_node is a Rexle::Element pointing to the current record
87
-
88
- @create.id = id || @id_counter
89
- @create.record = @parent_node.name == 'records' ? \
90
- @parent_node.root : @parent_node.root.element('records')
91
- @create
89
+ def create(id: @id_counter)
90
+ puts 'id: ' + id.inspect if @debug
91
+ @create = PolyrexCreateObject.new(id: id, record: @doc.root)
92
92
  end
93
93
 
94
94
  def delete(x=nil)
@@ -176,6 +176,7 @@ class Polyrex
176
176
 
177
177
  buffer = yield if block_given?
178
178
  string_parse buffer.clone, options
179
+
179
180
  self
180
181
  end
181
182
 
@@ -212,9 +213,10 @@ class Polyrex
212
213
 
213
214
  def records
214
215
 
215
- @doc.root.xpath("records/*").map do |record|
216
- @objects_a[0].new(record)
216
+ @doc.root.xpath("records/*").map do |node|
217
+ Kernel.const_get(node.name.capitalize).new node, id: @id_counter
217
218
  end
219
+
218
220
  end
219
221
 
220
222
  def rxpath(s)
@@ -222,7 +224,9 @@ class Polyrex
222
224
  a = @doc.root.xpath s.split('/').map \
223
225
  {|x| x.sub('[','[summary/').prepend('records/')}.join('/')
224
226
 
225
- a.map {|x| @objects[x.name].new(x, id: x.attributes[:id]) }
227
+ a.map do |node|
228
+ Kernel.const_get(node.name.capitalize).new node, id: node.attributes[:id]
229
+ end
226
230
 
227
231
  end
228
232
 
@@ -265,6 +269,32 @@ class Polyrex
265
269
 
266
270
  make_dynarex(root)
267
271
  end
272
+
273
+ def to_opml()
274
+
275
+ puts '@schema: ' + @schema.inspect if @debug
276
+
277
+ head, body = @schema.split(/(?<=\])/,2)
278
+ schema_body = body.gsub(/(?<=\[)[^\]]+/) do |x|
279
+ x.split(/\s*,\s*/).map {|field| '@' + field + ':' + field}.join(', ')
280
+ end
281
+ schema_head = head.gsub(/(?<=\[)[^\]]+/) do |x|
282
+ x.split(/\s*,\s*/).map {|field| field + ':' + field}.join(', ')
283
+ end
284
+
285
+ puts 'schema_body: ' + schema_body.inspect if @debug
286
+ puts 'schema_head: ' + schema_head.inspect if @debug
287
+ xslt_schema = schema_head.sub(/^\w+/,'opml>head') +
288
+ schema_body.gsub(/\w+(?=\[)/,'outline')\
289
+ .sub(/\/(\w+)(?=\[)/,'/body>outline')
290
+
291
+ puts 'xslt_schema: ' + xslt_schema.inspect if @debug
292
+
293
+ recxslt = RecordxXSLT.new(schema: @schema, xslt_schema: xslt_schema)
294
+
295
+ Rexslt.new(recxslt.to_xslt, self.to_xml).to_s
296
+
297
+ end
268
298
 
269
299
  def to_s(header: true)
270
300
 
@@ -275,11 +305,12 @@ class Polyrex
275
305
  summary = item.element 'summary'
276
306
  format_mask = summary.text('format_mask').to_s
277
307
  line = format_mask.gsub(/\[![^\]]+\]/){|x| summary.text(x[2..-2]).to_s}
308
+ puts 'line: ' + line.inspect if @debug
278
309
 
279
- records = item.element('records').elements.to_a
310
+ recordsx = item.element('records').elements.to_a
280
311
 
281
- if records.length > 0 then
282
- line = line + "\n" + build(records, indent + 1).join("\n")
312
+ if recordsx.length > 0 then
313
+ line = line + "\n" + build(recordsx, indent + 1).join("\n")
283
314
  end
284
315
  (' ' * indent) + line
285
316
  end
@@ -312,11 +343,23 @@ class Polyrex
312
343
  declaration = %Q(<?polyrex %s?>\n) % s
313
344
  end
314
345
 
315
- docheader = declaration + sumry
346
+ docheader = declaration + "\n" + sumry
316
347
  out = build(self.records).join("\n")
317
348
  header ? docheader + "\n" + out : out
318
349
 
319
350
  end
351
+
352
+ def to_tree()
353
+
354
+ s = @schema.gsub(/(?<=\[)[^\]]+/) do |x|
355
+ x.split(/\s*,\s*/).map {|field| '@' + field + ':' + field}.join(', ')
356
+ end
357
+
358
+ xslt_schema = s.gsub(/\w+(?=\[)/,'item').sub(/^\w+/,'tree')
359
+ recxslt = RecordxXSLT.new(schema: @schema, xslt_schema: xslt_schema)
360
+ Rexslt.new(recxslt.to_xslt, self.to_xml).to_s
361
+
362
+ end
320
363
 
321
364
  def to_xslt()
322
365
  @polyrex_xslt.schema = @schema
@@ -492,7 +535,7 @@ xsl_buffer = '
492
535
 
493
536
  end
494
537
 
495
- raw_lines = buffer.strip.lines.map(&:rstrip)
538
+ raw_lines = buffer.lstrip.lines.map(&:chomp)
496
539
 
497
540
  raw_summary = schema[/^\w+\[([^\]]+)/,1]
498
541
 
@@ -513,7 +556,9 @@ xsl_buffer = '
513
556
  @parent_node = records.parent
514
557
  records.delete
515
558
 
516
- lines = LineTree.new(raw_lines.join("\n").strip, ignore_label: true).to_a
559
+ puts 'raw_lines: ' + raw_lines.inspect if @debug
560
+ lines = LineTree.new(raw_lines.join("\n"), ignore_label: true).to_a
561
+ puts 'lines: ' + lines.inspect if @debug
517
562
  @parent_node.root.add format_line!( lines)
518
563
 
519
564
  end
@@ -524,10 +569,9 @@ xsl_buffer = '
524
569
 
525
570
  def load_handlers(schema)
526
571
 
527
- @create = PolyrexCreateObject.new(schema, id: @id_counter)
528
- objects = PolyrexObjects.new(schema)
572
+ objects = PolyrexObjects.new(schema, debug: @debug)
529
573
  h = objects.to_h
530
-
574
+ puts 'h: ' + h.inspect if @debug
531
575
  @objects = h.inject({}){|r,x| r.merge x[0].downcase => x[-1]}
532
576
 
533
577
  @objects_a = objects.to_a
@@ -582,12 +626,18 @@ xsl_buffer = '
582
626
  next
583
627
  end
584
628
 
629
+ puts '@schema: ' + @schema.inspect if @debug
630
+ schema_a = @schema.split('/')[1..-1]
631
+
632
+ if @debug then
633
+ puts 'schema_a: ' + schema_a.inspect
634
+ puts 'i: ' + i.inspect
635
+ end
636
+
585
637
  unless @format_masks[i][/^\(.*\)$/] then
586
638
 
587
639
  @field_names, field_values = RXRawLineParser.new(format_masks[i])\
588
640
  .parse(line)
589
-
590
- schema_a = @schema.split('/')[1..-1]
591
641
 
592
642
  @field_names = schema_a[i] ? \
593
643
  schema_a[i][/\[([^\]]+)/,1].split(/\s*,\s*/).map(&:to_sym) : \
@@ -625,7 +675,9 @@ xsl_buffer = '
625
675
 
626
676
  format_mask = @format_masks[i].to_s
627
677
 
628
- schema = "%s[%s]" % [tag_name, @field_names.join(', ')]
678
+ index = i >= schema_a.length ? schema_a.length - 1 : i
679
+
680
+ schema = schema_a[index..-1].join('/')
629
681
  summary.add Rexle::Element.new('format_mask').add_text(format_mask)
630
682
  summary.add Rexle::Element.new('schema').add_text(schema)
631
683
  summary.add Rexle::Element.new('recordx_type').add_text('polyrex')
@@ -752,7 +804,7 @@ xsl_buffer = '
752
804
  node = #{xpath}
753
805
 
754
806
  if node then
755
- @objects['#{class_name}'].new(node, id: @id, objects: @objects)
807
+ Kernel.const_get(node.name.capitalize).new node, id: @id
756
808
  else
757
809
  nil
758
810
  end
@@ -765,7 +817,7 @@ xsl_buffer = '
765
817
 
766
818
  if nodes then
767
819
  nodes.map do |node|
768
- @objects['#{class_name}'].new(node, id: @id, objects: @objects)
820
+ Kernel.const_get(node.name.capitalize).new node, id: @id
769
821
  end
770
822
  else
771
823
  nil
@@ -785,7 +837,9 @@ xsl_buffer = '
785
837
  def refresh_summary()
786
838
 
787
839
  summary = @doc.root.element('summary')
788
- @summary.to_h.each do |k,v|
840
+ @summary.to_h.each do |k,v|
841
+
842
+ puts "k: %s; v: %s" % [k, v] if @debug
789
843
  e = summary.element(k.to_s)
790
844
  if e then
791
845
  e.text = v
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: polyrex
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.13
4
+ version: 1.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Robertson
@@ -10,88 +10,53 @@ bindir: bin
10
10
  cert_chain:
11
11
  - |
12
12
  -----BEGIN CERTIFICATE-----
13
- MIIDXjCCAkagAwIBAgIBATANBgkqhkiG9w0BAQUFADAsMSowKAYDVQQDDCFnZW1t
14
- YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMTgwMzE3MTMwMzQ5WhcN
15
- MTkwMzE3MTMwMzQ5WjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
16
- cnRzb24vREM9ZXUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDB5D1x
17
- ISNvSg+4OuXCG4Y+tqBVWrAlJWI8WJoklmuV7abVRJbEHSiWgkmd5HAYyfJUrtO0
18
- JELlNk2KTaLJDUV5TA/se4gUVZbw4+bw81GPvfRl4xa0XXdMwzZVLKP6coryCxqe
19
- CBep7jJD6a16d6Ewbh8p+mnpBOOBNc7A8aw3RUZKkO+uNUdyv0RQTYb8/FNtj7aO
20
- cUR8zY+uGbdtEpjxeBorXIVGfcFHjlXIyxiVB0VnX970MND8dLJ8Ubm3OmjfhykX
21
- xXpdpNpKjwzxsZOe0Sfbs1D1tDrjyh4omZzYeRBwyhFtD79MnWT6tAFQaJE8sDvP
22
- zDR446MQzuPKImqnAgMBAAGjgYowgYcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAw
23
- HQYDVR0OBBYEFMaIbFeAIfEO6gdh724pxagKOOGGMCYGA1UdEQQfMB2BG2dlbW1h
24
- c3RlckBqYW1lc3JvYmVydHNvbi5ldTAmBgNVHRIEHzAdgRtnZW1tYXN0ZXJAamFt
25
- ZXNyb2JlcnRzb24uZXUwDQYJKoZIhvcNAQEFBQADggEBALZ2aN4EOqoF/ZlaLdrm
26
- CoZYCjnJ1+1+GgOC/didbwwVpoDNFpACwtg4ALyB9mWVr11ni5uK/mpS/mp7Zczz
27
- 3t4EM2O/r45ZJsNaScjx3OnIYaYKCsL22ka9s8RSSbTn81z4+9bQ+wgRoxn1UHiM
28
- DXHQiStNHZ8UmnqJhGVfAen2FL7JXsAqwyYQe7dPwXTaCxARyJFWjzwDbDNAK7fP
29
- IjDmZnQD2Smm70yVWSqJYC2ej7dH9gbZ/m1f5TSib7KCreZ66jZN4Dsi4Nibs6D6
30
- hCr2pfiPoS3nhbgAf3XvP4D146WaQbEgU87QlxPJLhz3yXKi7lwa9XgHQzuifNDi
31
- OXU=
13
+ MIIEXjCCAsagAwIBAgIBATANBgkqhkiG9w0BAQsFADAsMSowKAYDVQQDDCFnZW1t
14
+ YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMjEwNTI0MTI1MjMzWhcN
15
+ MjIwNTI0MTI1MjMzWjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
16
+ cnRzb24vREM9ZXUwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQDxKAjh
17
+ s6uPs8gcMaoia91NWkBsYkIRp98yXB/MeTcAcK+jM3Y3jbKfbsOa1QVETY+KNZPH
18
+ byDLynjQE7xOQhZjMrtDB128+iWT+fCvF/OQS0tMMT5ki3qHQDJSqUfxKngwK9p2
19
+ TlV4EVRaejuPYwGvXxb8qmx9jrR9S3HZVQMHd6aMNAwBb1ZNkSQymWQeEoM+45Un
20
+ pN3XHGEd2zejUOLNrSiZbBvq5fMb/V2a6LPAfg2WvZzWSZgl4jPjVtvUZVp1BUaU
21
+ YAXBUsKZ77FC6jR9lb+9iVJAwDTdsI2G6pX5W8EZG0L7i9jeLMQB8bCCzu2zlAhc
22
+ YJ06owu1LJhPWSxm/3aw6JTKQx0hFepF4mUKHe5iRhDgsVhHNkopzOCQ4JwwHu8G
23
+ PDi1kUQcFVVkWxRr/m/GRQFkYVn3omgIBMWp/JB8mmevqZ5gaCKvHF55wmDpFzyJ
24
+ cPDfCtP/wl8wqf363VQdgiru7EcgxQFtPgx6PyMNzfouhRhkBZIY7wYgROkCAwEA
25
+ AaOBijCBhzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUcuJiQueO
26
+ q5BdutOcNGPDMgOla5kwJgYDVR0RBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
27
+ c29uLmV1MCYGA1UdEgQfMB2BG2dlbW1hc3RlckBqYW1lc3JvYmVydHNvbi5ldTAN
28
+ BgkqhkiG9w0BAQsFAAOCAYEA1AnaW09JSrJOdlLTeiItH/Mfj6vcAuodI4Ys3PCh
29
+ UfQsIJUedcMysvo+6J0M+hEYL02w6ynWahcQbzvYPr+NwV/8FqMGGAyDpBSaLtrz
30
+ 9J4cxy4p/mq2dF2lEsCUNoSBWvDpvQI4c2w79/gpWE+w0abHyX97r3N2wWv/OiwV
31
+ u06GMpESpRj4RAhhy88aDhGDUfMWd+nZ20gWcs2YR1yJf/JyaDfRcOFqLMgVw35Y
32
+ oQhEZldZrsYsF4FNEBmH2mx2iLq6VbCyZZ3M6jsIHUEDZdrDjbs8ejPvWfEdTW+1
33
+ x7007qRZCfLvIsqAf7GViMWXgbiv0ZFSKgV7qtK0IgVBg0NDor3xc9w/3VLqshTZ
34
+ jIqQb9u4Zkhtsp+Ly/HVroN0cylu1t/el2qILTDOkyKnAikvhKpX1wujv+VVqWwd
35
+ rivEdfkvT/8GV5Nip0lSS+cuk20UhOdJR9QIcCJp0QL4NUik9VYljGbQbQQS6Isc
36
+ iIwZ6uFJfcp9SWBRrSZmlI52
32
37
  -----END CERTIFICATE-----
33
- date: 2018-03-17 00:00:00.000000000 Z
38
+ date: 2021-05-24 00:00:00.000000000 Z
34
39
  dependencies:
35
- - !ruby/object:Gem::Dependency
36
- name: polyrex-schema
37
- requirement: !ruby/object:Gem::Requirement
38
- requirements:
39
- - - "~>"
40
- - !ruby/object:Gem::Version
41
- version: '0.4'
42
- - - ">="
43
- - !ruby/object:Gem::Version
44
- version: 0.4.2
45
- type: :runtime
46
- prerelease: false
47
- version_requirements: !ruby/object:Gem::Requirement
48
- requirements:
49
- - - "~>"
50
- - !ruby/object:Gem::Version
51
- version: '0.4'
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: 0.4.2
55
40
  - !ruby/object:Gem::Dependency
56
41
  name: polyrex-objects
57
42
  requirement: !ruby/object:Gem::Requirement
58
43
  requirements:
59
44
  - - "~>"
60
45
  - !ruby/object:Gem::Version
61
- version: '0.9'
62
- - - ">="
63
- - !ruby/object:Gem::Version
64
- version: 0.9.8
65
- type: :runtime
66
- prerelease: false
67
- version_requirements: !ruby/object:Gem::Requirement
68
- requirements:
69
- - - "~>"
70
- - !ruby/object:Gem::Version
71
- version: '0.9'
72
- - - ">="
73
- - !ruby/object:Gem::Version
74
- version: 0.9.8
75
- - !ruby/object:Gem::Dependency
76
- name: polyrex-createobject
77
- requirement: !ruby/object:Gem::Requirement
78
- requirements:
79
- - - "~>"
80
- - !ruby/object:Gem::Version
81
- version: '0.6'
46
+ version: '1.0'
82
47
  - - ">="
83
48
  - !ruby/object:Gem::Version
84
- version: 0.6.1
49
+ version: 1.0.1
85
50
  type: :runtime
86
51
  prerelease: false
87
52
  version_requirements: !ruby/object:Gem::Requirement
88
53
  requirements:
89
54
  - - "~>"
90
55
  - !ruby/object:Gem::Version
91
- version: '0.6'
56
+ version: '1.0'
92
57
  - - ">="
93
58
  - !ruby/object:Gem::Version
94
- version: 0.6.1
59
+ version: 1.0.1
95
60
  - !ruby/object:Gem::Dependency
96
61
  name: polyrex-object-methods
97
62
  requirement: !ruby/object:Gem::Requirement
@@ -118,40 +83,40 @@ dependencies:
118
83
  requirements:
119
84
  - - "~>"
120
85
  - !ruby/object:Gem::Version
121
- version: '0.1'
86
+ version: '0.2'
122
87
  - - ">="
123
88
  - !ruby/object:Gem::Version
124
- version: 0.1.6
89
+ version: 0.2.2
125
90
  type: :runtime
126
91
  prerelease: false
127
92
  version_requirements: !ruby/object:Gem::Requirement
128
93
  requirements:
129
94
  - - "~>"
130
95
  - !ruby/object:Gem::Version
131
- version: '0.1'
96
+ version: '0.2'
132
97
  - - ">="
133
98
  - !ruby/object:Gem::Version
134
- version: 0.1.6
99
+ version: 0.2.2
135
100
  - !ruby/object:Gem::Dependency
136
101
  name: dynarex
137
102
  requirement: !ruby/object:Gem::Requirement
138
103
  requirements:
139
104
  - - "~>"
140
105
  - !ruby/object:Gem::Version
141
- version: '1.7'
106
+ version: '1.8'
142
107
  - - ">="
143
108
  - !ruby/object:Gem::Version
144
- version: 1.7.30
109
+ version: 1.8.19
145
110
  type: :runtime
146
111
  prerelease: false
147
112
  version_requirements: !ruby/object:Gem::Requirement
148
113
  requirements:
149
114
  - - "~>"
150
115
  - !ruby/object:Gem::Version
151
- version: '1.7'
116
+ version: '1.8'
152
117
  - - ">="
153
118
  - !ruby/object:Gem::Version
154
- version: 1.7.30
119
+ version: 1.8.19
155
120
  description:
156
121
  email: james@jamesrobertson.eu
157
122
  executables: []
@@ -178,8 +143,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
178
143
  - !ruby/object:Gem::Version
179
144
  version: '0'
180
145
  requirements: []
181
- rubyforge_project:
182
- rubygems_version: 2.6.13
146
+ rubygems_version: 3.1.2
183
147
  signing_key:
184
148
  specification_version: 4
185
149
  summary: A flavour of XML for storing and retrieveing records in a Polyrex hierarchy
metadata.gz.sig CHANGED
Binary file