scaffold_parser 0.5.0 → 0.6.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.
- checksums.yaml +4 -4
- data/Gemfile +2 -0
- data/lib/scaffold_parser.rb +29 -25
- data/lib/scaffold_parser/scaffolders/xsd.rb +140 -33
- data/lib/scaffold_parser/scaffolders/xsd/parser.rb +37 -106
- data/lib/scaffold_parser/scaffolders/xsd/parser/handlers/all.rb +29 -0
- data/lib/scaffold_parser/scaffolders/xsd/parser/handlers/at_method.rb +38 -0
- data/lib/scaffold_parser/scaffolders/xsd/parser/handlers/base_method.rb +36 -0
- data/lib/scaffold_parser/scaffolders/xsd/parser/handlers/blank.rb +73 -0
- data/lib/scaffold_parser/scaffolders/xsd/parser/handlers/choice.rb +38 -0
- data/lib/scaffold_parser/scaffolders/xsd/parser/handlers/class_inherit.rb +17 -0
- data/lib/scaffold_parser/scaffolders/xsd/parser/handlers/complex_type.rb +46 -0
- data/lib/scaffold_parser/scaffolders/xsd/parser/handlers/elements.rb +60 -0
- data/lib/scaffold_parser/scaffolders/xsd/parser/handlers/extension.rb +30 -0
- data/lib/scaffold_parser/scaffolders/xsd/parser/handlers/import.rb +15 -0
- data/lib/scaffold_parser/scaffolders/xsd/parser/handlers/include.rb +15 -0
- data/lib/scaffold_parser/scaffolders/xsd/parser/handlers/klass.rb +121 -0
- data/lib/scaffold_parser/scaffolders/xsd/parser/handlers/list_method.rb +86 -0
- data/lib/scaffold_parser/scaffolders/xsd/parser/handlers/module.rb +67 -0
- data/lib/scaffold_parser/scaffolders/xsd/parser/handlers/module_include.rb +37 -0
- data/lib/scaffold_parser/scaffolders/xsd/parser/handlers/proxy_list_method.rb +53 -0
- data/lib/scaffold_parser/scaffolders/xsd/parser/handlers/requires.rb +19 -0
- data/lib/scaffold_parser/scaffolders/xsd/parser/handlers/sequence.rb +50 -0
- data/lib/scaffold_parser/scaffolders/xsd/parser/handlers/submodel_method.rb +59 -0
- data/lib/scaffold_parser/scaffolders/xsd/parser/handlers/utils.rb +39 -0
- data/lib/scaffold_parser/scaffolders/xsd/parser/module_template.rb +35 -0
- data/lib/scaffold_parser/scaffolders/xsd/parser/stack.rb +50 -0
- data/scaffold_parser.gemspec +2 -1
- metadata +39 -6
- data/lib/scaffold_parser/file_patches.rb +0 -13
- data/lib/scaffold_parser/nokogiri_patches.rb +0 -194
- data/lib/scaffold_parser/scaffolders/xsd/builder.rb +0 -105
@@ -0,0 +1,29 @@
|
|
1
|
+
module ScaffoldParser
|
2
|
+
module Scaffolders
|
3
|
+
class XSD
|
4
|
+
class Parser
|
5
|
+
module Handlers
|
6
|
+
class All
|
7
|
+
attr_accessor :elements
|
8
|
+
|
9
|
+
def initialize(elements = [])
|
10
|
+
@elements = [*elements]
|
11
|
+
end
|
12
|
+
|
13
|
+
def group(new_source)
|
14
|
+
STACK.push Module.new("Groups::#{new_source.name.camelize}", elements)
|
15
|
+
end
|
16
|
+
|
17
|
+
def complex_type(source)
|
18
|
+
if source.has_name?
|
19
|
+
STACK.push Klass.new(source.name, elements)
|
20
|
+
end
|
21
|
+
|
22
|
+
ComplexType.new elements
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module ScaffoldParser
|
2
|
+
module Scaffolders
|
3
|
+
class XSD
|
4
|
+
class Parser
|
5
|
+
module Handlers
|
6
|
+
class AtMethod
|
7
|
+
include BaseMethod
|
8
|
+
include Utils
|
9
|
+
|
10
|
+
def method_body
|
11
|
+
"at '#{source.name}'"
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_h_with_attrs_method
|
15
|
+
"hash[:#{method_name}] = #{method_name} if has? '#{source.name}'"
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_builder
|
19
|
+
"root << build_element('#{source.name}', data[:#{source.name.underscore}]) if data.key? :#{source.name.underscore}"
|
20
|
+
end
|
21
|
+
|
22
|
+
def sequence(_)
|
23
|
+
Sequence.new self
|
24
|
+
end
|
25
|
+
|
26
|
+
def choice(_)
|
27
|
+
Choice.new self
|
28
|
+
end
|
29
|
+
|
30
|
+
def all(_)
|
31
|
+
All.new self
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module ScaffoldParser
|
2
|
+
module Scaffolders
|
3
|
+
class XSD
|
4
|
+
class Parser
|
5
|
+
module Handlers
|
6
|
+
module BaseMethod
|
7
|
+
attr_accessor :source
|
8
|
+
|
9
|
+
def initialize(source)
|
10
|
+
@source = source
|
11
|
+
end
|
12
|
+
|
13
|
+
def method_name
|
14
|
+
source.name.underscore
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_s
|
18
|
+
f = StringIO.new
|
19
|
+
|
20
|
+
f.puts "def #{method_name}"
|
21
|
+
f.puts indent(method_body.lines).join
|
22
|
+
f.puts "end"
|
23
|
+
|
24
|
+
f.string.strip
|
25
|
+
end
|
26
|
+
|
27
|
+
def ==(other)
|
28
|
+
method_name == other.method_name &&
|
29
|
+
method_body == other.method_body
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
module ScaffoldParser
|
2
|
+
module Scaffolders
|
3
|
+
class XSD
|
4
|
+
class Parser
|
5
|
+
module Handlers
|
6
|
+
class Blank
|
7
|
+
def elements
|
8
|
+
[]
|
9
|
+
end
|
10
|
+
|
11
|
+
def element(source)
|
12
|
+
if source.multiple?
|
13
|
+
if elements.any?
|
14
|
+
new_class = STACK.push Klass.new(source.name, elements)
|
15
|
+
|
16
|
+
ListMethod.new(source) do |template|
|
17
|
+
template.item_class = new_class.name.classify
|
18
|
+
end
|
19
|
+
else
|
20
|
+
ListMethod.new(source) do |template|
|
21
|
+
template.item_class = source.has_custom_type? ? source&.type&.classify : 'String'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
elsif source.has_custom_type?
|
25
|
+
SubmodelMethod.new(source)
|
26
|
+
else
|
27
|
+
if elements.any?
|
28
|
+
new_class = STACK.push Klass.new(source.name, elements)
|
29
|
+
SubmodelMethod.new(source, new_class.name.camelize)
|
30
|
+
else
|
31
|
+
AtMethod.new(source)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def complex_type(source)
|
37
|
+
if source.has_name?
|
38
|
+
STACK.push Klass.new(source.name)
|
39
|
+
else
|
40
|
+
ComplexType.new
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def extension(source)
|
45
|
+
if source.custom_extension?
|
46
|
+
Extension.new(elements, source.attributes)
|
47
|
+
else # basic xsd extension
|
48
|
+
self
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
def include(_)
|
54
|
+
Include.new
|
55
|
+
end
|
56
|
+
|
57
|
+
def import(_)
|
58
|
+
Import.new
|
59
|
+
end
|
60
|
+
|
61
|
+
def schema(_)
|
62
|
+
STACK
|
63
|
+
end
|
64
|
+
|
65
|
+
def group(source)
|
66
|
+
ModuleInclude.new(source.ref)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module ScaffoldParser
|
2
|
+
module Scaffolders
|
3
|
+
class XSD
|
4
|
+
class Parser
|
5
|
+
module Handlers
|
6
|
+
class Choice
|
7
|
+
attr_accessor :elements
|
8
|
+
|
9
|
+
def initialize(elements = [])
|
10
|
+
@elements = [*elements]
|
11
|
+
end
|
12
|
+
|
13
|
+
def complex_type(source)
|
14
|
+
if source.has_name?
|
15
|
+
STACK.push Klass.new(source.name, elements)
|
16
|
+
else
|
17
|
+
ComplexType.new(elements)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def sequence(_)
|
22
|
+
flattened = elements.flat_map do |element|
|
23
|
+
case element
|
24
|
+
when Sequence, Choice, All
|
25
|
+
then element.elements
|
26
|
+
else
|
27
|
+
element
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
Sequence.new flattened
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module ScaffoldParser
|
2
|
+
module Scaffolders
|
3
|
+
class XSD
|
4
|
+
class Parser
|
5
|
+
module Handlers
|
6
|
+
class ComplexType
|
7
|
+
attr_accessor :elements
|
8
|
+
|
9
|
+
def initialize(elements = [])
|
10
|
+
@elements = elements
|
11
|
+
end
|
12
|
+
|
13
|
+
def schema(_)
|
14
|
+
STACK
|
15
|
+
end
|
16
|
+
|
17
|
+
def element(source)
|
18
|
+
if source.multiple?
|
19
|
+
if elements.any?
|
20
|
+
new_class = STACK.push Klass.new(source.name, elements)
|
21
|
+
|
22
|
+
ListMethod.new(source) do |template|
|
23
|
+
template.item_class = new_class.name.camelize
|
24
|
+
end
|
25
|
+
else
|
26
|
+
ListMethod.new(source) do |template|
|
27
|
+
template.item_class = source.has_custom_type? ? source&.type&.classify : 'String'
|
28
|
+
end
|
29
|
+
end
|
30
|
+
elsif source.has_custom_type?
|
31
|
+
SubmodelMethod.new(source)
|
32
|
+
else
|
33
|
+
if elements.any?
|
34
|
+
new_class = STACK.push Klass.new(source.name, elements)
|
35
|
+
SubmodelMethod.new(source, new_class.name.camelize)
|
36
|
+
else
|
37
|
+
AtMethod.new(source)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module ScaffoldParser
|
2
|
+
module Scaffolders
|
3
|
+
class XSD
|
4
|
+
class Parser
|
5
|
+
module Handlers
|
6
|
+
class Elements
|
7
|
+
attr_accessor :elements
|
8
|
+
|
9
|
+
def initialize(elements = [])
|
10
|
+
@elements = elements
|
11
|
+
end
|
12
|
+
|
13
|
+
def sequence(_)
|
14
|
+
flattened = elements.flat_map do |element|
|
15
|
+
case element
|
16
|
+
when Sequence, Choice, All
|
17
|
+
then element.elements
|
18
|
+
else
|
19
|
+
element
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
Sequence.new flattened
|
24
|
+
end
|
25
|
+
|
26
|
+
def all(_)
|
27
|
+
flattened = elements.flat_map do |element|
|
28
|
+
case element
|
29
|
+
when Sequence, Choice, All
|
30
|
+
then element.elements
|
31
|
+
else
|
32
|
+
element
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
All.new flattened
|
37
|
+
end
|
38
|
+
|
39
|
+
def schema(_)
|
40
|
+
STACK
|
41
|
+
end
|
42
|
+
|
43
|
+
def choice(_)
|
44
|
+
flattened = elements.flat_map do |element|
|
45
|
+
case element
|
46
|
+
when Sequence, Choice, All
|
47
|
+
then element.elements
|
48
|
+
else
|
49
|
+
element
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
Choice.new flattened
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module ScaffoldParser
|
2
|
+
module Scaffolders
|
3
|
+
class XSD
|
4
|
+
class Parser
|
5
|
+
module Handlers
|
6
|
+
class Extension
|
7
|
+
attr_accessor :elements, :attributes
|
8
|
+
|
9
|
+
def initialize(elements = [], attributes)
|
10
|
+
@elements = [*elements]
|
11
|
+
@attributes = attributes
|
12
|
+
end
|
13
|
+
|
14
|
+
def complex_type(source)
|
15
|
+
if source.has_name?
|
16
|
+
template = Klass.new(source.name.camelize, elements) do |template|
|
17
|
+
template.inherit_from = attributes['base'].camelize
|
18
|
+
end
|
19
|
+
|
20
|
+
STACK.push template
|
21
|
+
else
|
22
|
+
ComplexType.new elements + [ClassInherit.new(attributes['base'])]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,121 @@
|
|
1
|
+
module ScaffoldParser
|
2
|
+
module Scaffolders
|
3
|
+
class XSD
|
4
|
+
class Parser
|
5
|
+
module Handlers
|
6
|
+
class Klass
|
7
|
+
include Utils
|
8
|
+
|
9
|
+
attr_accessor :name, :namespace, :methods, :inherit_from, :includes
|
10
|
+
|
11
|
+
def initialize(name = nil, elements = [])
|
12
|
+
@name = name&.camelize
|
13
|
+
|
14
|
+
includes, methods = [*elements].partition do |e|
|
15
|
+
e.is_a? ModuleInclude
|
16
|
+
end
|
17
|
+
inherits, methods = methods.partition do |e|
|
18
|
+
e.is_a? ClassInherit
|
19
|
+
end
|
20
|
+
|
21
|
+
@methods = methods
|
22
|
+
@includes = includes
|
23
|
+
@inherit_from = inherits.first.base if inherits.any?
|
24
|
+
|
25
|
+
yield self if block_given?
|
26
|
+
end
|
27
|
+
|
28
|
+
def schema(_)
|
29
|
+
STACK
|
30
|
+
end
|
31
|
+
|
32
|
+
def ==(other)
|
33
|
+
name == other.name &&
|
34
|
+
namespace == other.namespace &&
|
35
|
+
methods == other.methods &&
|
36
|
+
inherit_from == other.inherit_from
|
37
|
+
end
|
38
|
+
|
39
|
+
def to_s
|
40
|
+
f = StringIO.new
|
41
|
+
|
42
|
+
if inherit_from
|
43
|
+
f.puts "class #{name} < #{inherit_from}"
|
44
|
+
else
|
45
|
+
f.puts "class #{name}"
|
46
|
+
end
|
47
|
+
f.puts " include BaseParser"
|
48
|
+
includes.each { |incl| f.puts " include Groups::#{incl.ref}" }
|
49
|
+
if methods.any? || includes.any?
|
50
|
+
f.puts if methods.any?
|
51
|
+
f.puts methods.map { |method| indent(method.to_s.lines).join }.join("\n\n")
|
52
|
+
f.puts if methods.any?
|
53
|
+
f.puts " def to_h_with_attrs"
|
54
|
+
f.puts " hash = HashWithAttributes.new({}, attributes)"
|
55
|
+
f.puts
|
56
|
+
methods.each { |method| f.puts " #{method.to_h_with_attrs_method}" }
|
57
|
+
f.puts if methods.any?
|
58
|
+
if includes.any?
|
59
|
+
f.puts " mega.inject(hash) { |memo, r| memo.merge r }"
|
60
|
+
else
|
61
|
+
f.puts " hash"
|
62
|
+
end
|
63
|
+
if inherit_from
|
64
|
+
f.puts " super.merge(hash)"
|
65
|
+
end
|
66
|
+
f.puts " end"
|
67
|
+
end
|
68
|
+
|
69
|
+
f.puts "end"
|
70
|
+
|
71
|
+
string = f.string.strip
|
72
|
+
|
73
|
+
wrapped = wrap_in_namespace(string, 'Parsers')
|
74
|
+
wrapped = wrap_in_namespace(wrapped, namespace) if namespace
|
75
|
+
|
76
|
+
wrapped
|
77
|
+
end
|
78
|
+
|
79
|
+
def to_builder_s
|
80
|
+
f = StringIO.new
|
81
|
+
|
82
|
+
if inherit_from
|
83
|
+
f.puts "class #{name} < #{inherit_from}"
|
84
|
+
else
|
85
|
+
f.puts "class #{name}"
|
86
|
+
end
|
87
|
+
f.puts " include BaseBuilder"
|
88
|
+
f.puts
|
89
|
+
f.puts " def builder"
|
90
|
+
f.puts " root = Ox::Element.new(name)"
|
91
|
+
f.puts " if data.respond_to? :attributes"
|
92
|
+
f.puts " data.attributes.each { |k, v| root[k] = v }"
|
93
|
+
f.puts " end"
|
94
|
+
f.puts
|
95
|
+
if inherit_from
|
96
|
+
f.puts " super.nodes.each do |n|"
|
97
|
+
f.puts " root << n"
|
98
|
+
f.puts " end"
|
99
|
+
f.puts
|
100
|
+
end
|
101
|
+
|
102
|
+
f.puts methods.map { |method| indent(indent(method.to_builder.lines)).join }.join("\n")
|
103
|
+
f.puts
|
104
|
+
f.puts " root"
|
105
|
+
f.puts " end"
|
106
|
+
|
107
|
+
f.puts "end"
|
108
|
+
|
109
|
+
string = f.string.strip
|
110
|
+
|
111
|
+
wrapped = wrap_in_namespace(string, 'Builders')
|
112
|
+
wrapped = wrap_in_namespace(wrapped, namespace) if namespace
|
113
|
+
|
114
|
+
wrapped
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|