rxsd 0.2
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/COPYING +8 -0
- data/LICENSE +165 -0
- data/README +19 -0
- data/bin/rxsd-test.rb +41 -0
- data/lib/rxsd.rb +22 -0
- data/lib/rxsd/builder.rb +159 -0
- data/lib/rxsd/builders/ruby_class.rb +79 -0
- data/lib/rxsd/builders/ruby_definition.rb +54 -0
- data/lib/rxsd/builders/ruby_object.rb +59 -0
- data/lib/rxsd/builtin_types.rb +82 -0
- data/lib/rxsd/common.rb +69 -0
- data/lib/rxsd/exceptions.rb +25 -0
- data/lib/rxsd/libxml_adapter.rb +77 -0
- data/lib/rxsd/loader.rb +33 -0
- data/lib/rxsd/parser.rb +135 -0
- data/lib/rxsd/resolver.rb +52 -0
- data/lib/rxsd/translator.rb +127 -0
- data/lib/rxsd/xml.rb +92 -0
- data/lib/rxsd/xsd/attribute.rb +119 -0
- data/lib/rxsd/xsd/attribute_group.rb +90 -0
- data/lib/rxsd/xsd/choice.rb +109 -0
- data/lib/rxsd/xsd/complex_content.rb +87 -0
- data/lib/rxsd/xsd/complex_type.rb +136 -0
- data/lib/rxsd/xsd/element.rb +162 -0
- data/lib/rxsd/xsd/extension.rb +138 -0
- data/lib/rxsd/xsd/group.rb +100 -0
- data/lib/rxsd/xsd/list.rb +101 -0
- data/lib/rxsd/xsd/restriction.rb +186 -0
- data/lib/rxsd/xsd/schema.rb +114 -0
- data/lib/rxsd/xsd/sequence.rb +108 -0
- data/lib/rxsd/xsd/simple_content.rb +86 -0
- data/lib/rxsd/xsd/simple_type.rb +101 -0
- metadata +106 -0
@@ -0,0 +1,114 @@
|
|
1
|
+
# The XSD Schema definition
|
2
|
+
#
|
3
|
+
# Copyright (C) 2009 Mohammed Morsi <movitto@yahoo.com>
|
4
|
+
# See COPYING for the License of this software
|
5
|
+
|
6
|
+
module RXSD
|
7
|
+
module XSD
|
8
|
+
|
9
|
+
# Schema defintion, top level XSD element
|
10
|
+
# http://www.w3schools.com/Schema/el_schema.asp
|
11
|
+
class Schema
|
12
|
+
|
13
|
+
# hash of prefix => namespace values
|
14
|
+
# " is the key of the default namespace (or use default_namespace)
|
15
|
+
attr_accessor :namespaces
|
16
|
+
|
17
|
+
# schema attribute values
|
18
|
+
attr_accessor :version, :targetNamespace, :elementFormDefault, :attributeFormDefault
|
19
|
+
|
20
|
+
# arrays of children in schema
|
21
|
+
attr_accessor :elements, :simple_types, :complex_types, :attributes, :attribute_groups, :groups
|
22
|
+
|
23
|
+
# parent, always nil but here for conformity
|
24
|
+
attr_accessor :parent
|
25
|
+
|
26
|
+
# return default namespace
|
27
|
+
def default_namespace
|
28
|
+
@namespaces[""]
|
29
|
+
end
|
30
|
+
|
31
|
+
# xml tag name
|
32
|
+
def self.tag_name
|
33
|
+
"schema"
|
34
|
+
end
|
35
|
+
|
36
|
+
# return xsd node info
|
37
|
+
def info
|
38
|
+
"schema"
|
39
|
+
end
|
40
|
+
|
41
|
+
# returns array of all schema children
|
42
|
+
def children
|
43
|
+
([@elements] + [@simple_types] + [@complex_types] + [@attributes] + [@attribute] + [@attribute_groups] + [@groups]).flatten
|
44
|
+
end
|
45
|
+
|
46
|
+
# node passed in should be a xml root node representing the schema
|
47
|
+
def self.from_xml(node)
|
48
|
+
schema = Schema.new
|
49
|
+
schema.parent = nil
|
50
|
+
node.related= schema
|
51
|
+
|
52
|
+
# set namespaces
|
53
|
+
schema.namespaces = {}
|
54
|
+
node.namespaces.each{ |ns| schema.namespaces[ns.prefix] = ns.href }
|
55
|
+
|
56
|
+
# parse version out of attrs
|
57
|
+
schema.version = node.attrs["version"]
|
58
|
+
|
59
|
+
# parse target namespace out of attrs
|
60
|
+
schema.targetNamespace = node.attrs["targetNamespace"]
|
61
|
+
|
62
|
+
# parse elementFormDefault out of attrs
|
63
|
+
schema.elementFormDefault = node.attrs["elementFormDefault"]
|
64
|
+
|
65
|
+
# parse attributeFormDefault out of attrs
|
66
|
+
schema.attributeFormDefault = node.attrs["attributeFormDefault"]
|
67
|
+
|
68
|
+
# TODO schema attrs: | blockDefault / finalDefault / anyAttr
|
69
|
+
# TODO schema children: | import, notation, redefine / anyChild
|
70
|
+
# FIXME handle "xs:include" (use Loader?)
|
71
|
+
|
72
|
+
# parse elements
|
73
|
+
schema.elements = node.children_objs Element
|
74
|
+
|
75
|
+
# parse simple types
|
76
|
+
schema.simple_types = node.children_objs SimpleType
|
77
|
+
|
78
|
+
# parse complex types
|
79
|
+
schema.complex_types = node.children_objs ComplexType
|
80
|
+
|
81
|
+
# parse attributes
|
82
|
+
schema.attributes = node.children_objs Attribute
|
83
|
+
|
84
|
+
# parse attribute groups
|
85
|
+
schema.attribute_groups = node.children_objs AttributeGroup
|
86
|
+
|
87
|
+
# parse groups
|
88
|
+
schema.groups = node.children_objs Group
|
89
|
+
|
90
|
+
return schema
|
91
|
+
end
|
92
|
+
|
93
|
+
# resolve hanging references given complete xsd node object array
|
94
|
+
def resolve(node_objs)
|
95
|
+
# right now does nothing
|
96
|
+
# (possible resolve include/import here)
|
97
|
+
end
|
98
|
+
|
99
|
+
# convert schema to array of class builders
|
100
|
+
def to_class_builders
|
101
|
+
unless defined? @class_builder
|
102
|
+
@class_builders = []
|
103
|
+
@elements.each { |e|
|
104
|
+
@class_builders.push e.to_class_builder
|
105
|
+
}
|
106
|
+
end
|
107
|
+
|
108
|
+
return @class_builders
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
112
|
+
|
113
|
+
end # module XSD
|
114
|
+
end # module RXSD
|
@@ -0,0 +1,108 @@
|
|
1
|
+
# The XSD Sequence definition
|
2
|
+
#
|
3
|
+
# Copyright (C) 2009 Mohammed Morsi <movitto@yahoo.com>
|
4
|
+
# See COPYING for the License of this software
|
5
|
+
|
6
|
+
module RXSD
|
7
|
+
module XSD
|
8
|
+
|
9
|
+
# XSD Sequence defintion
|
10
|
+
# http://www.w3schools.com/Schema/el_sequence.asp
|
11
|
+
class Sequence
|
12
|
+
|
13
|
+
# sequence attributes
|
14
|
+
attr_accessor :id, :maxOccurs, :minOccurs
|
15
|
+
|
16
|
+
# sequence children
|
17
|
+
attr_accessor :elements, :groups, :choices, :sequences
|
18
|
+
|
19
|
+
# sequence parent
|
20
|
+
attr_accessor :parent
|
21
|
+
|
22
|
+
# xml tag name
|
23
|
+
def self.tag_name
|
24
|
+
"sequence"
|
25
|
+
end
|
26
|
+
|
27
|
+
# return xsd node info
|
28
|
+
def info
|
29
|
+
"sequence id: #{@id}"
|
30
|
+
end
|
31
|
+
|
32
|
+
# returns array of all children
|
33
|
+
def children
|
34
|
+
@elements + @groups + @choices + @sequences
|
35
|
+
end
|
36
|
+
|
37
|
+
# node passed in should be a xml node representing the group
|
38
|
+
def self.from_xml(node)
|
39
|
+
sequence = Sequence.new
|
40
|
+
sequence.parent = node.parent.related
|
41
|
+
node.related = sequence
|
42
|
+
|
43
|
+
# TODO sequence attributes: | anyAttributes
|
44
|
+
sequence.id = node.attrs["id"]
|
45
|
+
|
46
|
+
sequence.maxOccurs = node.attrs.has_key?("maxOccurs") ?
|
47
|
+
(node.attrs["maxOccurs"] == "unbounded" ? "unbounded" : node.attrs["maxOccurs"].to_i) : 1
|
48
|
+
sequence.minOccurs = node.attrs.has_key?("minOccurs") ?
|
49
|
+
(node.attrs["minOccurs"] == "unbounded" ? "unbounded" : node.attrs["minOccurs"].to_i) : 1
|
50
|
+
|
51
|
+
# TODO sequence children: | any
|
52
|
+
sequence.elements = node.children_objs Element
|
53
|
+
sequence.groups = node.children_objs Group
|
54
|
+
sequence.choices = node.children_objs Choice
|
55
|
+
sequence.sequences = node.children_objs Sequence
|
56
|
+
|
57
|
+
return sequence
|
58
|
+
end
|
59
|
+
|
60
|
+
# resolve hanging references given complete xsd node object array
|
61
|
+
def resolve(node_objs)
|
62
|
+
end
|
63
|
+
|
64
|
+
# convert sequence to array of class builders
|
65
|
+
def to_class_builders
|
66
|
+
# FIXME enforce "all attributes must appear in set order"
|
67
|
+
|
68
|
+
unless defined? @class_builders
|
69
|
+
@class_builders = []
|
70
|
+
@elements.each { |e|
|
71
|
+
@class_builders.push e.to_class_builder
|
72
|
+
}
|
73
|
+
@groups.each { |g|
|
74
|
+
g.to_class_builders.each { |gcb|
|
75
|
+
@class_builders.push gcb
|
76
|
+
}
|
77
|
+
}
|
78
|
+
@choices.each { |c|
|
79
|
+
c.to_class_builders.each { |ccb|
|
80
|
+
@class_builders.push ccb
|
81
|
+
}
|
82
|
+
}
|
83
|
+
@sequences.each { |s|
|
84
|
+
s.to_class_builders.each { |scb|
|
85
|
+
@class_builders.push scb
|
86
|
+
}
|
87
|
+
}
|
88
|
+
end
|
89
|
+
|
90
|
+
return @class_builders
|
91
|
+
end
|
92
|
+
|
93
|
+
# return all child attributes assocaited w/ choice
|
94
|
+
def child_attributes
|
95
|
+
atts = []
|
96
|
+
@elements.each { |elem|
|
97
|
+
ca = elem.child_attributes
|
98
|
+
atts += ca unless ca.nil?
|
99
|
+
} unless @elements.nil?
|
100
|
+
@sequences.each { |seq| atts += seq.child_attributes } unless @sequences.nil?
|
101
|
+
@choices.each { |ch| atts += ch.child_attributes } unless @choices.nil?
|
102
|
+
@groups.each { |gr| atts += gr.child_attributes } unless @groups.nil?
|
103
|
+
return atts
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
end # module XSD
|
108
|
+
end # module RXSD
|
@@ -0,0 +1,86 @@
|
|
1
|
+
# The XSD SimpleContent definition
|
2
|
+
#
|
3
|
+
# Copyright (C) 2009 Mohammed Morsi <movitto@yahoo.com>
|
4
|
+
# See COPYING for the License of this software
|
5
|
+
|
6
|
+
module RXSD
|
7
|
+
module XSD
|
8
|
+
|
9
|
+
# XSD SimpleContent defintion
|
10
|
+
# http://www.w3schools.com/Schema/el_simpleContent.asp
|
11
|
+
class SimpleContent
|
12
|
+
|
13
|
+
# simple content attributes
|
14
|
+
attr_accessor :id
|
15
|
+
|
16
|
+
# simple content children
|
17
|
+
attr_accessor :restriction, :extension
|
18
|
+
|
19
|
+
# simple content parent
|
20
|
+
attr_accessor :parent
|
21
|
+
|
22
|
+
# xml tag name
|
23
|
+
def self.tag_name
|
24
|
+
"simpleContent"
|
25
|
+
end
|
26
|
+
|
27
|
+
# return xsd node info
|
28
|
+
def info
|
29
|
+
"simple_content id: #{@id}"
|
30
|
+
end
|
31
|
+
|
32
|
+
# returns array of all children
|
33
|
+
def children
|
34
|
+
c = []
|
35
|
+
c.push @restriction unless @restriction.nil?
|
36
|
+
c.push @extension unless @extension.nil?
|
37
|
+
return c
|
38
|
+
end
|
39
|
+
|
40
|
+
# node passed in should be a xml node representing the group
|
41
|
+
def self.from_xml(node)
|
42
|
+
simple_content = SimpleContent.new
|
43
|
+
simple_content.parent = node.parent.related
|
44
|
+
node.related = simple_content
|
45
|
+
|
46
|
+
# TODO group attributes: | anyAttributes
|
47
|
+
simple_content.id = node.attrs["id"]
|
48
|
+
|
49
|
+
simple_content.restriction = node.child_obj Restriction
|
50
|
+
simple_content.extension = node.child_obj Extension
|
51
|
+
|
52
|
+
return simple_content
|
53
|
+
end
|
54
|
+
|
55
|
+
# resolve hanging references given complete xsd node object array
|
56
|
+
def resolve(node_objs)
|
57
|
+
end
|
58
|
+
|
59
|
+
# convert simple content to class builder
|
60
|
+
def to_class_builder(cb = nil)
|
61
|
+
unless defined? @class_builder
|
62
|
+
# dispatch to child restriction/extension
|
63
|
+
@class_builder = cb
|
64
|
+
|
65
|
+
if !@restriction.nil?
|
66
|
+
@class_builder= @restriction.to_class_builder(@class_builder)
|
67
|
+
elsif !@extension.nil?
|
68
|
+
@class_builder= @extension.to_class_builder(@class_builder)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
return @class_builder
|
73
|
+
end
|
74
|
+
|
75
|
+
# return all child attributes associated w/ simple content
|
76
|
+
def child_attributes
|
77
|
+
atts = []
|
78
|
+
atts += @restriction.child_attributes unless @restriction.nil?
|
79
|
+
atts += @extension.child_attributes unless @extension.nil?
|
80
|
+
return atts
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
|
85
|
+
end # module XSD
|
86
|
+
end # module RXSD
|
@@ -0,0 +1,101 @@
|
|
1
|
+
# The XSD SimpleType definition
|
2
|
+
#
|
3
|
+
# Copyright (C) 2009 Mohammed Morsi <movitto@yahoo.com>
|
4
|
+
# See COPYING for the License of this software
|
5
|
+
|
6
|
+
module RXSD
|
7
|
+
module XSD
|
8
|
+
|
9
|
+
# XSD SimpleType defintion
|
10
|
+
# http://www.w3schools.com/Schema/el_simpletype.asp
|
11
|
+
class SimpleType
|
12
|
+
|
13
|
+
# simple type attribute values
|
14
|
+
attr_accessor :id, :name
|
15
|
+
|
16
|
+
# children in schema (only one will be populated)
|
17
|
+
attr_accessor :list, :restriction
|
18
|
+
|
19
|
+
# simpleType parent
|
20
|
+
attr_accessor :parent
|
21
|
+
|
22
|
+
# xml tag name
|
23
|
+
def self.tag_name
|
24
|
+
"simpleType"
|
25
|
+
end
|
26
|
+
|
27
|
+
# return xsd node info
|
28
|
+
def info
|
29
|
+
"simple_type id: #{@id} name: #{@name}"
|
30
|
+
end
|
31
|
+
|
32
|
+
# returns array of all children
|
33
|
+
def children
|
34
|
+
c = []
|
35
|
+
c.push @list unless @list.nil?
|
36
|
+
c.push @restriction unless @restriction.nil?
|
37
|
+
return c
|
38
|
+
end
|
39
|
+
|
40
|
+
# node passed in should be a xml node representing the simple type
|
41
|
+
def self.from_xml(node)
|
42
|
+
simpleType = SimpleType.new
|
43
|
+
simpleType.parent = node.parent.related
|
44
|
+
node.related = simpleType
|
45
|
+
|
46
|
+
# TODO simpleType attributes: | anyAttr
|
47
|
+
simpleType.id = node.attrs["id"]
|
48
|
+
simpleType.name = node.attrs["name"]
|
49
|
+
|
50
|
+
# parse lists
|
51
|
+
simpleType.list = node.child_obj List
|
52
|
+
|
53
|
+
# parse restrictions
|
54
|
+
simpleType.restriction = node.child_obj Restriction
|
55
|
+
|
56
|
+
# TODO simpleType children: | unions
|
57
|
+
#simpleType.unions = node.child_obj Union
|
58
|
+
|
59
|
+
return simpleType
|
60
|
+
end
|
61
|
+
|
62
|
+
# resolve hanging references given complete xsd node object array
|
63
|
+
def resolve(node_objs)
|
64
|
+
end
|
65
|
+
|
66
|
+
# convert simple type to class builder
|
67
|
+
def to_class_builder
|
68
|
+
unless defined? @class_builder
|
69
|
+
@class_builder = nil
|
70
|
+
|
71
|
+
if !@list.nil?
|
72
|
+
# dispatch to child list
|
73
|
+
@class_builder = @list.to_class_builder
|
74
|
+
|
75
|
+
elsif !@restriction.nil?
|
76
|
+
# grab restriction class builder w/ base class and facets
|
77
|
+
@class_builder = @restriction.to_class_builder
|
78
|
+
|
79
|
+
#else
|
80
|
+
# @class_builder = ClassBuilder.new
|
81
|
+
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
@class_builder.klass_name = @name.camelize unless @name.nil?
|
86
|
+
return @class_builder
|
87
|
+
end
|
88
|
+
|
89
|
+
# return all child_attributes associated w/ simple type
|
90
|
+
def child_attributes
|
91
|
+
if !@list.nil?
|
92
|
+
return @list.child_attributes
|
93
|
+
elsif !@restriction.nil?
|
94
|
+
return @restriction.child_attributes
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
|
100
|
+
end # module XSD
|
101
|
+
end # module RXSD
|
metadata
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rxsd
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: "0.2"
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Mohammed Morsi
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2010-01-09 00:00:00 -05:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: libxml-ruby
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 1.1.3
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: activesupport
|
27
|
+
type: :runtime
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 2.3.4
|
34
|
+
version:
|
35
|
+
description: RXSD is a library to translate xsd schemas and xml implementations into ruby classes/objects
|
36
|
+
email: movitto@yahoo.com
|
37
|
+
executables: []
|
38
|
+
|
39
|
+
extensions: []
|
40
|
+
|
41
|
+
extra_rdoc_files:
|
42
|
+
- README
|
43
|
+
files:
|
44
|
+
- LICENSE
|
45
|
+
- COPYING
|
46
|
+
- bin/rxsd-test.rb
|
47
|
+
- lib/rxsd.rb
|
48
|
+
- lib/rxsd/builder.rb
|
49
|
+
- lib/rxsd/builtin_types.rb
|
50
|
+
- lib/rxsd/common.rb
|
51
|
+
- lib/rxsd/exceptions.rb
|
52
|
+
- lib/rxsd/libxml_adapter.rb
|
53
|
+
- lib/rxsd/loader.rb
|
54
|
+
- lib/rxsd/parser.rb
|
55
|
+
- lib/rxsd/resolver.rb
|
56
|
+
- lib/rxsd/translator.rb
|
57
|
+
- lib/rxsd/xml.rb
|
58
|
+
- lib/rxsd/builders/ruby_class.rb
|
59
|
+
- lib/rxsd/builders/ruby_definition.rb
|
60
|
+
- lib/rxsd/builders/ruby_object.rb
|
61
|
+
- lib/rxsd/xsd/attribute_group.rb
|
62
|
+
- lib/rxsd/xsd/attribute.rb
|
63
|
+
- lib/rxsd/xsd/choice.rb
|
64
|
+
- lib/rxsd/xsd/complex_content.rb
|
65
|
+
- lib/rxsd/xsd/complex_type.rb
|
66
|
+
- lib/rxsd/xsd/element.rb
|
67
|
+
- lib/rxsd/xsd/extension.rb
|
68
|
+
- lib/rxsd/xsd/group.rb
|
69
|
+
- lib/rxsd/xsd/list.rb
|
70
|
+
- lib/rxsd/xsd/restriction.rb
|
71
|
+
- lib/rxsd/xsd/schema.rb
|
72
|
+
- lib/rxsd/xsd/sequence.rb
|
73
|
+
- lib/rxsd/xsd/simple_content.rb
|
74
|
+
- lib/rxsd/xsd/simple_type.rb
|
75
|
+
- README
|
76
|
+
has_rdoc: true
|
77
|
+
homepage: http://projects.morsi.org/RXSD
|
78
|
+
licenses: []
|
79
|
+
|
80
|
+
post_install_message:
|
81
|
+
rdoc_options:
|
82
|
+
- --inline-source
|
83
|
+
- --charset=UTF-8
|
84
|
+
require_paths:
|
85
|
+
- lib
|
86
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - ">="
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: "0"
|
91
|
+
version:
|
92
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 1.3.1
|
97
|
+
version:
|
98
|
+
requirements: []
|
99
|
+
|
100
|
+
rubyforge_project:
|
101
|
+
rubygems_version: 1.3.5
|
102
|
+
signing_key:
|
103
|
+
specification_version: 3
|
104
|
+
summary: RXSD is a library to translate xsd schemas and xml implementations into ruby classes/objects
|
105
|
+
test_files: []
|
106
|
+
|