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,86 @@
|
|
1
|
+
module ScaffoldParser
|
2
|
+
module Scaffolders
|
3
|
+
class XSD
|
4
|
+
class Parser
|
5
|
+
module Handlers
|
6
|
+
class ListMethod
|
7
|
+
include BaseMethod
|
8
|
+
include Utils
|
9
|
+
|
10
|
+
attr_accessor :at, :item_class
|
11
|
+
|
12
|
+
def initialize(source)
|
13
|
+
@source = source
|
14
|
+
@at = [source.name]
|
15
|
+
|
16
|
+
yield self if block_given?
|
17
|
+
end
|
18
|
+
|
19
|
+
def method_body
|
20
|
+
"array_of_at(#{item_class}, #{single_quote(at)})"
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_h_with_attrs_method
|
24
|
+
if item_class == 'String'
|
25
|
+
"hash[:#{method_name}] = #{method_name} if has? '#{source.name}'"
|
26
|
+
else
|
27
|
+
"hash[:#{method_name}] = #{method_name}.map(&:to_h_with_attrs) if has? '#{source.name}'"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def to_builder
|
32
|
+
f = StringIO.new
|
33
|
+
|
34
|
+
f.puts "if data.key? :#{method_name}"
|
35
|
+
if item_class == 'String'
|
36
|
+
f.puts " data[:#{method_name}].map { |i| Ox::Element.new('#{at.first}') << i }.each { |i| root << i }"
|
37
|
+
else
|
38
|
+
f.puts " data[:#{method_name}].each { |i| root << #{item_class}.new('#{at.first}', i).builder }"
|
39
|
+
end
|
40
|
+
f.puts 'end'
|
41
|
+
|
42
|
+
f.string.strip
|
43
|
+
end
|
44
|
+
|
45
|
+
def to_proxy_list(source, path)
|
46
|
+
ProxyListMethod.new(source) do |m|
|
47
|
+
m.at = [path] + @at
|
48
|
+
m.item_class = @item_class
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def sequence(_)
|
53
|
+
self
|
54
|
+
end
|
55
|
+
|
56
|
+
def choice(_)
|
57
|
+
self
|
58
|
+
end
|
59
|
+
|
60
|
+
def all(_)
|
61
|
+
self
|
62
|
+
end
|
63
|
+
|
64
|
+
def complex_type(source)
|
65
|
+
if source.has_name?
|
66
|
+
STACK.push Klass.new(source.name, [self])
|
67
|
+
else
|
68
|
+
self
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def element(source)
|
73
|
+
if source.has_name?
|
74
|
+
to_proxy_list(source, source.name)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def extension(source)
|
79
|
+
Extension.new(self, source.attributes)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'scaffold_parser/scaffolders/xsd/parser/module_template'
|
2
|
+
|
3
|
+
module ScaffoldParser
|
4
|
+
module Scaffolders
|
5
|
+
class XSD
|
6
|
+
class Parser
|
7
|
+
module Handlers
|
8
|
+
class Module
|
9
|
+
include Utils
|
10
|
+
|
11
|
+
attr_accessor :name, :namespace, :methods, :includes
|
12
|
+
|
13
|
+
def initialize(name = nil, methods = [])
|
14
|
+
@name = name&.camelize
|
15
|
+
@methods = methods
|
16
|
+
|
17
|
+
yield self if block_given?
|
18
|
+
end
|
19
|
+
|
20
|
+
def schema(_)
|
21
|
+
STACK
|
22
|
+
end
|
23
|
+
|
24
|
+
def to_s
|
25
|
+
ModuleTemplate.new(name.demodulize) do |template|
|
26
|
+
template.namespaces = ['Groups', 'Parsers', namespace].compact
|
27
|
+
|
28
|
+
methods.each { |method| template.methods << indent(method.to_s.lines).join }
|
29
|
+
|
30
|
+
meth = StringIO.new
|
31
|
+
meth.puts " def to_h_with_attrs"
|
32
|
+
meth.puts " hash = HashWithAttributes.new({}, attributes)"
|
33
|
+
meth.puts
|
34
|
+
methods.each { |method| meth.puts " #{method.to_h_with_attrs_method}" }
|
35
|
+
meth.puts
|
36
|
+
meth.puts " hash"
|
37
|
+
meth.puts " end"
|
38
|
+
|
39
|
+
template.methods << meth.string
|
40
|
+
end.to_s
|
41
|
+
end
|
42
|
+
|
43
|
+
def to_builder_s
|
44
|
+
ModuleTemplate.new(name.demodulize) do |template|
|
45
|
+
template.namespaces = ['Groups', 'Builders', namespace].compact
|
46
|
+
|
47
|
+
meth = StringIO.new
|
48
|
+
meth.puts " def builder"
|
49
|
+
meth.puts " root = Ox::Element.new(name)"
|
50
|
+
meth.puts " if data.respond_to? :attributes"
|
51
|
+
meth.puts " data.attributes.each { |k, v| root[k] = v }"
|
52
|
+
meth.puts " end"
|
53
|
+
meth.puts
|
54
|
+
meth.puts methods.map { |method| indent(indent(method.to_builder.lines)).join }.join("\n")
|
55
|
+
meth.puts
|
56
|
+
meth.puts " root"
|
57
|
+
meth.puts " end"
|
58
|
+
|
59
|
+
template.methods = [meth.string]
|
60
|
+
end.to_s
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module ScaffoldParser
|
2
|
+
module Scaffolders
|
3
|
+
class XSD
|
4
|
+
class Parser
|
5
|
+
module Handlers
|
6
|
+
class ModuleInclude
|
7
|
+
attr_reader :ref
|
8
|
+
|
9
|
+
def initialize(ref)
|
10
|
+
@ref = ref&.camelize
|
11
|
+
end
|
12
|
+
|
13
|
+
def sequence(_)
|
14
|
+
Sequence.new self
|
15
|
+
end
|
16
|
+
|
17
|
+
def complex_type(new_source)
|
18
|
+
if new_source.has_name?
|
19
|
+
STACK.push Klass.new(new_source.name.camelize, self)
|
20
|
+
else
|
21
|
+
self
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def element(new_source)
|
26
|
+
if new_source.has_name?
|
27
|
+
new_class = STACK.push Klass.new(new_source.name.camelize, self)
|
28
|
+
|
29
|
+
SubmodelMethod.new(new_source, new_class.name.camelize)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module ScaffoldParser
|
2
|
+
module Scaffolders
|
3
|
+
class XSD
|
4
|
+
class Parser
|
5
|
+
module Handlers
|
6
|
+
class ProxyListMethod
|
7
|
+
include BaseMethod
|
8
|
+
include Utils
|
9
|
+
|
10
|
+
attr_accessor :at, :item_class
|
11
|
+
|
12
|
+
def initialize(source)
|
13
|
+
@source = source
|
14
|
+
yield self if block_given?
|
15
|
+
end
|
16
|
+
|
17
|
+
def method_body
|
18
|
+
"array_of_at(#{item_class}, #{single_quote(at)})"
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_h_with_attrs_method
|
22
|
+
if item_class == 'String'
|
23
|
+
"hash[:#{method_name}] = #{method_name} if has? '#{source.name}'"
|
24
|
+
else
|
25
|
+
"hash[:#{method_name}] = #{method_name}.map(&:to_h_with_attrs) if has? '#{source.name}'"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def to_builder
|
30
|
+
f = StringIO.new
|
31
|
+
|
32
|
+
f.puts "if data.key? :#{method_name}"
|
33
|
+
f.puts " element = Ox::Element.new('#{at.first}')"
|
34
|
+
if item_class == 'String'
|
35
|
+
f.puts " data[:#{method_name}].map { |i| Ox::Element.new('#{at.last}') << i }.each { |i| element << i }"
|
36
|
+
else
|
37
|
+
f.puts " data[:#{method_name}].each { |i| element << #{item_class}.new('#{at.last}', i).builder }"
|
38
|
+
end
|
39
|
+
f.puts ' root << element'
|
40
|
+
f.puts 'end'
|
41
|
+
|
42
|
+
f.string.strip
|
43
|
+
end
|
44
|
+
|
45
|
+
def sequence(_)
|
46
|
+
Sequence.new self
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'scaffold_parser/scaffolders/xsd/parser/handlers/blank'
|
2
|
+
require 'scaffold_parser/scaffolders/xsd/parser/handlers/complex_type'
|
3
|
+
require 'scaffold_parser/scaffolders/xsd/parser/handlers/elements'
|
4
|
+
require 'scaffold_parser/scaffolders/xsd/parser/handlers/sequence'
|
5
|
+
require 'scaffold_parser/scaffolders/xsd/parser/handlers/all'
|
6
|
+
require 'scaffold_parser/scaffolders/xsd/parser/handlers/choice'
|
7
|
+
require 'scaffold_parser/scaffolders/xsd/parser/handlers/include'
|
8
|
+
require 'scaffold_parser/scaffolders/xsd/parser/handlers/import'
|
9
|
+
require 'scaffold_parser/scaffolders/xsd/parser/handlers/utils'
|
10
|
+
require 'scaffold_parser/scaffolders/xsd/parser/handlers/base_method'
|
11
|
+
require 'scaffold_parser/scaffolders/xsd/parser/handlers/module_include'
|
12
|
+
require 'scaffold_parser/scaffolders/xsd/parser/handlers/class_inherit'
|
13
|
+
require 'scaffold_parser/scaffolders/xsd/parser/handlers/at_method'
|
14
|
+
require 'scaffold_parser/scaffolders/xsd/parser/handlers/klass'
|
15
|
+
require 'scaffold_parser/scaffolders/xsd/parser/handlers/list_method'
|
16
|
+
require 'scaffold_parser/scaffolders/xsd/parser/handlers/module'
|
17
|
+
require 'scaffold_parser/scaffolders/xsd/parser/handlers/proxy_list_method'
|
18
|
+
require 'scaffold_parser/scaffolders/xsd/parser/handlers/submodel_method'
|
19
|
+
require 'scaffold_parser/scaffolders/xsd/parser/handlers/extension'
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module ScaffoldParser
|
2
|
+
module Scaffolders
|
3
|
+
class XSD
|
4
|
+
class Parser
|
5
|
+
module Handlers
|
6
|
+
class Sequence
|
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 complex_type(source)
|
27
|
+
if source.has_name?
|
28
|
+
STACK.push Klass.new(source.name, elements)
|
29
|
+
end
|
30
|
+
|
31
|
+
ComplexType.new elements
|
32
|
+
end
|
33
|
+
|
34
|
+
def group(source)
|
35
|
+
STACK.push Module.new("Groups::#{source.name.camelize}", elements)
|
36
|
+
end
|
37
|
+
|
38
|
+
def choice(_)
|
39
|
+
self
|
40
|
+
end
|
41
|
+
|
42
|
+
def extension(source)
|
43
|
+
Extension.new elements, source.attributes
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module ScaffoldParser
|
2
|
+
module Scaffolders
|
3
|
+
class XSD
|
4
|
+
class Parser
|
5
|
+
module Handlers
|
6
|
+
class SubmodelMethod
|
7
|
+
include BaseMethod
|
8
|
+
include Utils
|
9
|
+
|
10
|
+
attr_accessor :submodel_class
|
11
|
+
|
12
|
+
def initialize(source, submodel_class = nil)
|
13
|
+
@source = source
|
14
|
+
@submodel_class = submodel_class || source.type.camelize
|
15
|
+
end
|
16
|
+
|
17
|
+
def method_body
|
18
|
+
"submodel_at(#{submodel_class}, '#{source.name}')"
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_h_with_attrs_method
|
22
|
+
"hash[:#{method_name}] = #{method_name}.to_h_with_attrs if has? '#{source.name}'"
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_builder
|
26
|
+
f = StringIO.new
|
27
|
+
|
28
|
+
f.puts "if data.key? :#{method_name}"
|
29
|
+
f.puts " root << #{submodel_class}.new('#{source.name}', data[:#{source.name.underscore}]).builder"
|
30
|
+
f.puts 'end'
|
31
|
+
|
32
|
+
f.string.strip
|
33
|
+
end
|
34
|
+
|
35
|
+
def sequence(_)
|
36
|
+
Sequence.new self
|
37
|
+
end
|
38
|
+
|
39
|
+
def choice(_)
|
40
|
+
Choice.new self
|
41
|
+
end
|
42
|
+
|
43
|
+
def all(_)
|
44
|
+
All.new self
|
45
|
+
end
|
46
|
+
|
47
|
+
def schema(_)
|
48
|
+
STACK
|
49
|
+
end
|
50
|
+
|
51
|
+
def to_at_method
|
52
|
+
AtMethod.new(source)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module ScaffoldParser
|
2
|
+
module Scaffolders
|
3
|
+
class XSD
|
4
|
+
class Parser
|
5
|
+
module Handlers
|
6
|
+
module Utils
|
7
|
+
def indent(lines_or_string)
|
8
|
+
if lines_or_string.is_a? Array
|
9
|
+
lines_or_string.map { |line| indent_string(line) }
|
10
|
+
else
|
11
|
+
indent_string(lines_or_string)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def indent_string(string)
|
16
|
+
string == "\n" ? string : string.prepend(' ')
|
17
|
+
end
|
18
|
+
|
19
|
+
def single_quote(string)
|
20
|
+
string.to_s.gsub('"', '\'')
|
21
|
+
end
|
22
|
+
|
23
|
+
def wrap_in_namespace(klass, namespace)
|
24
|
+
return klass unless namespace
|
25
|
+
|
26
|
+
lines = klass.lines
|
27
|
+
indented = indent(lines)
|
28
|
+
|
29
|
+
indented.unshift "module #{namespace}\n"
|
30
|
+
indented << "\nend"
|
31
|
+
|
32
|
+
indented.join
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'scaffold_parser/scaffolders/xsd/parser/handlers/utils'
|
2
|
+
|
3
|
+
module ScaffoldParser
|
4
|
+
module Scaffolders
|
5
|
+
class XSD
|
6
|
+
class Parser
|
7
|
+
class ModuleTemplate
|
8
|
+
include Handlers::Utils
|
9
|
+
|
10
|
+
attr_accessor :name, :methods, :namespaces
|
11
|
+
|
12
|
+
def initialize(name = nil)
|
13
|
+
@name = name
|
14
|
+
@methods = []
|
15
|
+
@namespaces = []
|
16
|
+
|
17
|
+
yield self if block_given?
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_s
|
21
|
+
f = StringIO.new
|
22
|
+
|
23
|
+
f.puts "module #{name}"
|
24
|
+
f.puts methods.join("\n\n")
|
25
|
+
|
26
|
+
f.puts "end"
|
27
|
+
string = f.string.strip
|
28
|
+
|
29
|
+
namespaces.inject(string) { |string, n| wrap_in_namespace(string, n) }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|