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,50 @@
|
|
1
|
+
module ScaffoldParser
|
2
|
+
module Scaffolders
|
3
|
+
class XSD
|
4
|
+
class Parser
|
5
|
+
class Stack
|
6
|
+
include Singleton
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@stack = []
|
10
|
+
end
|
11
|
+
|
12
|
+
def push(value)
|
13
|
+
similar_classes = @stack.select { |klass| klass.name.start_with? value.name }
|
14
|
+
|
15
|
+
if similar_classes.any?
|
16
|
+
same_structure_class = similar_classes.find do |kl|
|
17
|
+
kl.namespace == value.namespace &&
|
18
|
+
kl.methods == value.methods &&
|
19
|
+
kl.inherit_from == value.inherit_from
|
20
|
+
end
|
21
|
+
|
22
|
+
if same_structure_class
|
23
|
+
same_structure_class
|
24
|
+
else
|
25
|
+
name_base = value.name
|
26
|
+
while @stack.find { |klass| klass.name == value.name }
|
27
|
+
counter ||= 1
|
28
|
+
value.name = "#{name_base}#{counter += 1}"
|
29
|
+
end
|
30
|
+
@stack.push value
|
31
|
+
value
|
32
|
+
end
|
33
|
+
else
|
34
|
+
@stack.push value
|
35
|
+
value
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def clear
|
40
|
+
@stack.clear
|
41
|
+
end
|
42
|
+
|
43
|
+
def to_a
|
44
|
+
@stack
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
data/scaffold_parser.gemspec
CHANGED
@@ -3,7 +3,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
3
3
|
|
4
4
|
Gem::Specification.new do |spec|
|
5
5
|
spec.name = 'scaffold_parser'
|
6
|
-
spec.version = '0.
|
6
|
+
spec.version = '0.6.0'
|
7
7
|
spec.authors = ['Premysl Donat']
|
8
8
|
spec.email = ['pdonat@seznam.cz']
|
9
9
|
|
@@ -23,6 +23,7 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.add_development_dependency 'rake', '~> 10.0'
|
24
24
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
25
25
|
spec.add_development_dependency 'pry'
|
26
|
+
spec.add_development_dependency 'pry-byebug'
|
26
27
|
spec.add_development_dependency 'nokogiri'
|
27
28
|
spec.add_development_dependency 'activesupport'
|
28
29
|
spec.add_development_dependency 'saharspec'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: scaffold_parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Premysl Donat
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-05-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: pry-byebug
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: nokogiri
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -127,11 +141,30 @@ files:
|
|
127
141
|
- bin/scaffold_parser
|
128
142
|
- bin/setup
|
129
143
|
- lib/scaffold_parser.rb
|
130
|
-
- lib/scaffold_parser/file_patches.rb
|
131
|
-
- lib/scaffold_parser/nokogiri_patches.rb
|
132
144
|
- lib/scaffold_parser/scaffolders/xsd.rb
|
133
|
-
- lib/scaffold_parser/scaffolders/xsd/builder.rb
|
134
145
|
- lib/scaffold_parser/scaffolders/xsd/parser.rb
|
146
|
+
- lib/scaffold_parser/scaffolders/xsd/parser/handlers/all.rb
|
147
|
+
- lib/scaffold_parser/scaffolders/xsd/parser/handlers/at_method.rb
|
148
|
+
- lib/scaffold_parser/scaffolders/xsd/parser/handlers/base_method.rb
|
149
|
+
- lib/scaffold_parser/scaffolders/xsd/parser/handlers/blank.rb
|
150
|
+
- lib/scaffold_parser/scaffolders/xsd/parser/handlers/choice.rb
|
151
|
+
- lib/scaffold_parser/scaffolders/xsd/parser/handlers/class_inherit.rb
|
152
|
+
- lib/scaffold_parser/scaffolders/xsd/parser/handlers/complex_type.rb
|
153
|
+
- lib/scaffold_parser/scaffolders/xsd/parser/handlers/elements.rb
|
154
|
+
- lib/scaffold_parser/scaffolders/xsd/parser/handlers/extension.rb
|
155
|
+
- lib/scaffold_parser/scaffolders/xsd/parser/handlers/import.rb
|
156
|
+
- lib/scaffold_parser/scaffolders/xsd/parser/handlers/include.rb
|
157
|
+
- lib/scaffold_parser/scaffolders/xsd/parser/handlers/klass.rb
|
158
|
+
- lib/scaffold_parser/scaffolders/xsd/parser/handlers/list_method.rb
|
159
|
+
- lib/scaffold_parser/scaffolders/xsd/parser/handlers/module.rb
|
160
|
+
- lib/scaffold_parser/scaffolders/xsd/parser/handlers/module_include.rb
|
161
|
+
- lib/scaffold_parser/scaffolders/xsd/parser/handlers/proxy_list_method.rb
|
162
|
+
- lib/scaffold_parser/scaffolders/xsd/parser/handlers/requires.rb
|
163
|
+
- lib/scaffold_parser/scaffolders/xsd/parser/handlers/sequence.rb
|
164
|
+
- lib/scaffold_parser/scaffolders/xsd/parser/handlers/submodel_method.rb
|
165
|
+
- lib/scaffold_parser/scaffolders/xsd/parser/handlers/utils.rb
|
166
|
+
- lib/scaffold_parser/scaffolders/xsd/parser/module_template.rb
|
167
|
+
- lib/scaffold_parser/scaffolders/xsd/parser/stack.rb
|
135
168
|
- scaffold_parser.gemspec
|
136
169
|
homepage: https://github.com/Masa331/scaffold_parser
|
137
170
|
licenses:
|
@@ -153,7 +186,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
153
186
|
version: '0'
|
154
187
|
requirements: []
|
155
188
|
rubyforge_project:
|
156
|
-
rubygems_version: 2.6.14
|
189
|
+
rubygems_version: 2.6.14.1
|
157
190
|
signing_key:
|
158
191
|
specification_version: 4
|
159
192
|
summary: Tool for fast parser scaffolding
|
@@ -1,194 +0,0 @@
|
|
1
|
-
module ScaffoldParser
|
2
|
-
module NokogiriPatches
|
3
|
-
class DefinitionNotFound < StandardError; end
|
4
|
-
|
5
|
-
module Element
|
6
|
-
class BlankExtension
|
7
|
-
def submodel_nodes
|
8
|
-
[]
|
9
|
-
end
|
10
|
-
|
11
|
-
def value_nodes
|
12
|
-
[]
|
13
|
-
end
|
14
|
-
|
15
|
-
def array_nodes
|
16
|
-
[]
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
def submodel_nodes
|
21
|
-
@submodel_nodes ||= attribute_elements.select(&:parent_type?) + extension.submodel_nodes
|
22
|
-
end
|
23
|
-
|
24
|
-
def value_nodes
|
25
|
-
@value_nodes ||= attribute_elements.select(&:end_type?) + extension.value_nodes
|
26
|
-
end
|
27
|
-
|
28
|
-
def array_nodes
|
29
|
-
@array_nodes ||= attribute_elements.select(&:list_type?) + extension.array_nodes
|
30
|
-
end
|
31
|
-
|
32
|
-
def end_type?
|
33
|
-
(xs_type? && !list_type?) || (no_type? && complex_types.empty? && !complex_type? && !list_type?)
|
34
|
-
end
|
35
|
-
|
36
|
-
def parent_type?
|
37
|
-
(complex_type? || complex_types.any?) && !list_type?
|
38
|
-
end
|
39
|
-
|
40
|
-
def max_occurs
|
41
|
-
case self['maxOccurs']
|
42
|
-
when 'unbounded'
|
43
|
-
Float::INFINITY
|
44
|
-
when String
|
45
|
-
self['maxOccurs'].to_i
|
46
|
-
else
|
47
|
-
1
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
def list_type?
|
52
|
-
simple_list? || named_list?
|
53
|
-
end
|
54
|
-
|
55
|
-
def simple_list?
|
56
|
-
max_occurs > 1
|
57
|
-
end
|
58
|
-
|
59
|
-
def named_list?
|
60
|
-
!simple_list? && definition.list_element.present? && definition.list_element.max_occurs > 1
|
61
|
-
end
|
62
|
-
|
63
|
-
def list_element
|
64
|
-
if simple_list?
|
65
|
-
self
|
66
|
-
else
|
67
|
-
xpath('xs:complexType/xs:sequence/xs:element').first
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
def list_element_klass
|
72
|
-
if simple_list?
|
73
|
-
definition.to_name.camelize
|
74
|
-
elsif named_list?
|
75
|
-
list_element.definition.to_name.camelize
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
def list_element_at
|
80
|
-
if simple_list?
|
81
|
-
[to_name]
|
82
|
-
elsif named_list?
|
83
|
-
[at_xpath('xs:complexType').to_name, list_element.to_name]
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
def to_class_name
|
88
|
-
definition.to_name.camelize
|
89
|
-
end
|
90
|
-
|
91
|
-
def definition
|
92
|
-
@definition ||=
|
93
|
-
if self['type'].present? && !self['type'].start_with?('xs:')
|
94
|
-
find_type(self['type'])
|
95
|
-
else
|
96
|
-
self
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
def extension
|
101
|
-
complex_ext = at_xpath('xs:complexType/xs:complexContent/xs:extension')
|
102
|
-
# Can be also simple extension but i don't have to do anything with these:
|
103
|
-
# simple_ext = at_xpath('xs:complexType/xs:simpleContent/xs:extension')
|
104
|
-
|
105
|
-
complex_ext ? find_type(complex_ext['base']) : BlankExtension.new
|
106
|
-
end
|
107
|
-
|
108
|
-
def extended_simple_type?
|
109
|
-
simple_ext = at_xpath('xs:complexType/xs:simpleContent/xs:extension')
|
110
|
-
|
111
|
-
simple_ext.present?
|
112
|
-
end
|
113
|
-
|
114
|
-
def xs_type?
|
115
|
-
(definition['type'].present? && definition['type'].start_with?('xs:')) || extended_simple_type?
|
116
|
-
end
|
117
|
-
|
118
|
-
def complex_type?
|
119
|
-
definition.name == 'complexType'
|
120
|
-
end
|
121
|
-
|
122
|
-
def complex_types
|
123
|
-
definition.xpath('xs:complexType[not(xs:simpleContent)]')
|
124
|
-
end
|
125
|
-
|
126
|
-
def no_type?
|
127
|
-
definition['type'].blank?
|
128
|
-
end
|
129
|
-
|
130
|
-
def to_name
|
131
|
-
self['name'] || at_xpath('..')['name']
|
132
|
-
end
|
133
|
-
|
134
|
-
private
|
135
|
-
|
136
|
-
def attribute_elements
|
137
|
-
xpath('xs:sequence/xs:element',
|
138
|
-
'xs:sequence/xs:sequence/xs:element',
|
139
|
-
'xs:sequence/xs:choice/xs:sequence/xs:element',
|
140
|
-
'xs:sequence/xs:choice/xs:element',
|
141
|
-
'xs:complexType/xs:sequence/xs:element',
|
142
|
-
'xs:complexType/xs:choice/xs:element',
|
143
|
-
'xs:complexType/xs:complexContent/xs:extension/xs:sequence/xs:element',
|
144
|
-
'xs:complexContent/xs:extension/xs:sequence/xs:element'
|
145
|
-
)
|
146
|
-
end
|
147
|
-
|
148
|
-
def find_type(name)
|
149
|
-
if element = document.at_xpath("//*[@name='#{name}']")
|
150
|
-
return element
|
151
|
-
else
|
152
|
-
definition_schema = collect_includes.find do |doc|
|
153
|
-
doc.at_xpath("//*[@name='#{name}']").present?
|
154
|
-
end
|
155
|
-
|
156
|
-
if definition_schema.blank?
|
157
|
-
fail DefinitionNotFound.new("Couldn't find type definiton for '#{name}' in any included schema.")
|
158
|
-
end
|
159
|
-
|
160
|
-
definition_schema.at_xpath("//*[@name='#{name}']")
|
161
|
-
end
|
162
|
-
end
|
163
|
-
|
164
|
-
def collect_includes(doc = self, collection = [], names = [])
|
165
|
-
new_names = doc.xpath('//xs:include').map { |incl| incl['schemaLocation'] }
|
166
|
-
|
167
|
-
(new_names - names).each do |name|
|
168
|
-
new_doc = Nokogiri::XML(File.open(name))
|
169
|
-
|
170
|
-
collection << new_doc
|
171
|
-
names << name
|
172
|
-
|
173
|
-
collect_includes(new_doc, collection, names)
|
174
|
-
end
|
175
|
-
|
176
|
-
collection
|
177
|
-
end
|
178
|
-
end
|
179
|
-
|
180
|
-
module Document
|
181
|
-
def submodel_nodes
|
182
|
-
xpath('xs:schema/xs:complexType|xs:schema/xs:element')
|
183
|
-
end
|
184
|
-
|
185
|
-
def array_nodes
|
186
|
-
[]
|
187
|
-
end
|
188
|
-
|
189
|
-
def definition
|
190
|
-
self
|
191
|
-
end
|
192
|
-
end
|
193
|
-
end
|
194
|
-
end
|
@@ -1,105 +0,0 @@
|
|
1
|
-
module ScaffoldParser
|
2
|
-
module Scaffolders
|
3
|
-
class XSD
|
4
|
-
class Builder
|
5
|
-
attr_reader :node
|
6
|
-
|
7
|
-
def self.call(node, options)
|
8
|
-
self.new(node, options).call
|
9
|
-
end
|
10
|
-
|
11
|
-
def initialize(node, options)
|
12
|
-
@node = node
|
13
|
-
@options = options
|
14
|
-
end
|
15
|
-
|
16
|
-
def call
|
17
|
-
puts "Scaffolding builder for #{node.to_name}" if @options[:verbose]
|
18
|
-
|
19
|
-
f = StringIO.new
|
20
|
-
f.indent = true if @options[:namespace]
|
21
|
-
|
22
|
-
f.puts "require '#{namespaced('builders/base_builder')}'"
|
23
|
-
requires = node.submodel_nodes.map { |n| n.to_class_name.underscore }.uniq
|
24
|
-
requires.each { |r| f.puts "require '#{namespaced(r.prepend('builders/'))}'" }
|
25
|
-
requires = node.array_nodes.reject { |l| l.list_element.xs_type? }.uniq
|
26
|
-
requires.each { |n| f.puts "require '#{namespaced(n.list_element.to_class_name.underscore.prepend('builders/'))}'" }
|
27
|
-
f.puts
|
28
|
-
|
29
|
-
f.puts "module #{@options[:namespace]}" if @options[:namespace]
|
30
|
-
f.putsi "module Builders"
|
31
|
-
f.putsi " class #{node.to_class_name}"
|
32
|
-
f.putsi " include BaseBuilder"
|
33
|
-
f.puts
|
34
|
-
|
35
|
-
f.putsi " def builder"
|
36
|
-
f.putsi " root = Ox::Element.new(name)"
|
37
|
-
f.putsi " if data.respond_to? :attributes"
|
38
|
-
f.putsi " data.attributes.each { |k, v| root[k] = v }"
|
39
|
-
f.putsi " end"
|
40
|
-
|
41
|
-
f.puts if node.value_nodes.any?
|
42
|
-
node.value_nodes.each do |node|
|
43
|
-
f.putsi " root << build_element('#{node.to_name}', data[:#{node.to_name.underscore}]) if data.key? :#{node.to_name.underscore}"
|
44
|
-
end
|
45
|
-
|
46
|
-
node.submodel_nodes.each do |node|
|
47
|
-
f.puts
|
48
|
-
f.putsi " if data.key? :#{node.to_name.underscore}"
|
49
|
-
f.putsi " root << #{node.to_class_name}.new('#{node.to_name}', data[:#{node.to_name.underscore}]).builder"
|
50
|
-
f.putsi " end"
|
51
|
-
end
|
52
|
-
|
53
|
-
node.array_nodes.reject { |l| l.list_element.xs_type? }.each do |node|
|
54
|
-
if node.named_list?
|
55
|
-
f.puts
|
56
|
-
f.putsi " if data.key? :#{node.to_name.underscore}"
|
57
|
-
f.putsi " element = Ox::Element.new('#{node.to_name}')"
|
58
|
-
f.putsi " data[:#{node.to_name.underscore}].each { |i| element << #{node.list_element.to_class_name}.new('#{node.list_element.to_name}', i).builder }"
|
59
|
-
f.putsi " root << element"
|
60
|
-
f.putsi " end"
|
61
|
-
else # simple_list
|
62
|
-
f.puts
|
63
|
-
f.putsi " if data.key? :#{node.to_name.underscore}"
|
64
|
-
f.putsi " data[:#{node.to_name.underscore}].each { |i| root << #{node.list_element.to_class_name}.new('#{node.list_element.to_name}', i).builder }"
|
65
|
-
f.putsi " end"
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
node.array_nodes.select { |l| l.list_element.xs_type? }.each do |node|
|
70
|
-
f.puts
|
71
|
-
|
72
|
-
if node.named_list?
|
73
|
-
f.putsi " if data.key? :#{node.to_name.underscore}"
|
74
|
-
f.putsi " element = Ox::Element.new('#{node.to_name}')"
|
75
|
-
f.putsi " data[:#{node.to_name.underscore}].map { |i| Ox::Element.new('#{node.list_element.to_name}') << i }.each { |i| element << i }"
|
76
|
-
f.putsi " root << element"
|
77
|
-
f.putsi " end"
|
78
|
-
else #simple_list
|
79
|
-
f.putsi " if data.key? :#{node.to_name.underscore}"
|
80
|
-
f.putsi " data[:#{node.to_name.underscore}].map { |i| Ox::Element.new('#{node.to_name}') << i }.each { |i| root << i }"
|
81
|
-
f.putsi " end"
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
f.puts
|
86
|
-
f.putsi " root"
|
87
|
-
f.putsi " end"
|
88
|
-
|
89
|
-
|
90
|
-
f.putsi " end"
|
91
|
-
f.putsi "end"
|
92
|
-
f.puts "end" if @options[:namespace]
|
93
|
-
|
94
|
-
["builders/#{node.to_class_name.underscore}.rb", f.string.strip]
|
95
|
-
end
|
96
|
-
|
97
|
-
private
|
98
|
-
|
99
|
-
def namespaced(path)
|
100
|
-
[@options[:namespace]&.underscore, path].compact.join('/')
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|
105
|
-
end
|