scaffold_parser 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7899b91e50516ffec5a13ce5215f131b9f80c630
4
- data.tar.gz: 3162f40dede2ddef1a450b742f0dd6caa536b8b3
3
+ metadata.gz: a9ecbc5c73c858c25d5f97806fb148720065dcae
4
+ data.tar.gz: ca3a1f63c84c8dc18c08f6d8099167eb884797fd
5
5
  SHA512:
6
- metadata.gz: 0bb8061b4f380d647698737b2c41c468a183855e384e32e4724fc4b9cee7a72b753fb775b3d5e9ad0e2a9d4dc7ed09e21d852247637b7e1080bb8d489ec646ac
7
- data.tar.gz: 1e65927bacc4af7a59cbf6f9af928f00bb24833abed33afbdb2e74a75adf7316f0550b584eb62c7e03ba78d371ce787942eb7189e0bfbb915a67a2e6b7ea23af
6
+ metadata.gz: a4490d4c87ef3d9512b6b69997705ca613b62f788ee77d95b7df721b97dab4e397f8995a7fced42aae3ffb58b2a02138df6e70591d70dd2b8e08f90b880fae9d
7
+ data.tar.gz: efdd40de39de53466c90a607b2d301b6aa4c1d9345478091440140d57391fbee9c712855c0c2c74e3946d2fa6639f90fc91460df349d1b9899d0dd6c25958445
data/bin/scaffold_parser CHANGED
@@ -10,9 +10,13 @@ abort 'Path to schema file as a first argument is required' unless path
10
10
  OptionParser.new do |opts|
11
11
  opts.banner = 'Usage: scaffold_parser <path_to_schema> [options]'
12
12
 
13
- opts.on("-nNAMESPACE", "--namespace=NAMESPACE") do |v|
13
+ opts.on('-nNAMESPACE', '--namespace=NAMESPACE', 'Output all classes in given namespace') do |v|
14
14
  options[:namespace] = v
15
15
  end
16
+
17
+ opts.on('-v', '--verbose', 'Run verbosely') do |v|
18
+ options[:verbose] = v
19
+ end
16
20
  end.parse!
17
21
 
18
22
  ScaffoldParser.scaffold(path, options)
@@ -18,15 +18,15 @@ module ScaffoldParser
18
18
  end
19
19
 
20
20
  def submodel_nodes
21
- attribute_elements.select(&:parent_type?) + extension.submodel_nodes
21
+ @submodel_nodes ||= attribute_elements.select(&:parent_type?) + extension.submodel_nodes
22
22
  end
23
23
 
24
24
  def value_nodes
25
- attribute_elements.select(&:end_type?) + extension.value_nodes
25
+ @value_nodes ||= attribute_elements.select(&:end_type?) + extension.value_nodes
26
26
  end
27
27
 
28
28
  def array_nodes
29
- attribute_elements.select(&:list_type?) + extension.array_nodes
29
+ @array_nodes ||= attribute_elements.select(&:list_type?) + extension.array_nodes
30
30
  end
31
31
 
32
32
  def end_type?
@@ -57,7 +57,7 @@ module ScaffoldParser
57
57
  end
58
58
 
59
59
  def named_list?
60
- definition.list_element.present? && definition.list_element.max_occurs > 1
60
+ !simple_list? && definition.list_element.present? && definition.list_element.max_occurs > 1
61
61
  end
62
62
 
63
63
  def list_element
@@ -89,11 +89,12 @@ module ScaffoldParser
89
89
  end
90
90
 
91
91
  def definition
92
- if self['type'].present? && !self['type'].start_with?('xs:')
93
- find_type(self['type'])
94
- else
95
- self
96
- end
92
+ @definition ||=
93
+ if self['type'].present? && !self['type'].start_with?('xs:')
94
+ find_type(self['type'])
95
+ else
96
+ self
97
+ end
97
98
  end
98
99
 
99
100
  def extension
@@ -184,6 +185,10 @@ module ScaffoldParser
184
185
  def array_nodes
185
186
  []
186
187
  end
188
+
189
+ def definition
190
+ self
191
+ end
187
192
  end
188
193
  end
189
194
  end
@@ -0,0 +1,106 @@
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(element_name)"
37
+
38
+ node.value_nodes.each do |node|
39
+ f.puts
40
+ f.putsi " if attributes.key? :#{node.to_name.underscore}"
41
+ f.putsi " element = Ox::Element.new('#{node.to_name}')"
42
+ f.putsi " element << attributes[:#{node.to_name.underscore}] if attributes[:#{node.to_name.underscore}]"
43
+ f.putsi " root << element"
44
+ f.putsi " end"
45
+ end
46
+
47
+ node.submodel_nodes.each do |node|
48
+ f.puts
49
+ f.putsi " if attributes.key? :#{node.to_name.underscore}"
50
+ f.putsi " root << #{node.to_class_name}.new(attributes[:#{node.to_name.underscore}], '#{node.to_name}').builder"
51
+ f.putsi " end"
52
+ end
53
+
54
+ node.array_nodes.reject { |l| l.list_element.xs_type? }.each do |node|
55
+ if node.named_list?
56
+ f.puts
57
+ f.putsi " if attributes.key? :#{node.to_name.underscore}"
58
+ f.putsi " element = Ox::Element.new('#{node.to_name}')"
59
+ f.putsi " attributes[:#{node.to_name.underscore}].each { |i| element << #{node.list_element.to_class_name}.new(i, '#{node.list_element.to_name}').builder }"
60
+ f.putsi " root << element"
61
+ f.putsi " end"
62
+ else # simple_list
63
+ f.puts
64
+ f.putsi " if attributes.key? :#{node.to_name.underscore}"
65
+ f.putsi " attributes[:#{node.to_name.underscore}].each { |i| root << #{node.list_element.to_class_name}.new(i, '#{node.list_element.to_name}').builder }"
66
+ f.putsi " end"
67
+ end
68
+ end
69
+
70
+ node.array_nodes.select { |l| l.list_element.xs_type? }.each do |node|
71
+ f.puts
72
+
73
+ if node.named_list?
74
+ f.putsi " if attributes.key? :#{node.to_name.underscore}"
75
+ f.putsi " element = Ox::Element.new('#{node.to_name}')"
76
+ f.putsi " attributes[:#{node.to_name.underscore}].map { |i| Ox::Element.new('#{node.list_element.to_name}') << i }.each { |i| element << i }"
77
+ f.putsi " root << element"
78
+ f.putsi " end"
79
+ else #simple_list
80
+ f.putsi " if attributes.key? :#{node.to_name.underscore}"
81
+ f.putsi " attributes[:#{node.to_name.underscore}].map { |i| Ox::Element.new('#{node.to_name}') << i }.each { |i| root << i }"
82
+ f.putsi " end"
83
+ end
84
+ end
85
+
86
+ f.puts
87
+ f.putsi " root"
88
+ f.putsi " end"
89
+
90
+
91
+ f.putsi " end"
92
+ f.putsi "end"
93
+ f.puts "end" if @options[:namespace]
94
+
95
+ ["builders/#{node.to_class_name.underscore}.rb", f.string.strip]
96
+ end
97
+
98
+ private
99
+
100
+ def namespaced(path)
101
+ [@options[:namespace]&.underscore, path].compact.join('/')
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
@@ -14,97 +14,105 @@ module ScaffoldParser
14
14
  end
15
15
 
16
16
  def call
17
- path = "./tmp/#{node.to_class_name.underscore}.rb"
17
+ puts "Scaffolding parser for #{node.to_name}" if @options[:verbose]
18
18
 
19
- File.open(path, 'wb') do |f|
20
- f.indent = true if @options[:namespace]
19
+ f = StringIO.new
20
+ f.indent = true if @options[:namespace]
21
21
 
22
- f.puts "require '#{namespaced('base_element')}'"
23
- node.submodel_nodes.map { |n| namespaced(n.to_class_name.underscore) }.uniq.each { |n| f.puts "require '#{n}'" }
24
- node.array_nodes.reject { |l| l.list_element.xs_type? }.each { |n| f.puts "require '#{namespaced(n.list_element.to_class_name.underscore)}'" }
22
+ f.puts "require '#{namespaced('parsers/base_parser')}'"
23
+ node.submodel_nodes.map { |n| namespaced(n.to_class_name.underscore.prepend('parsers/')) }.uniq.each { |n| f.puts "require '#{n}'" }
24
+ node.array_nodes.reject { |l| l.list_element.xs_type? }.each { |n| f.puts "require '#{namespaced(n.list_element.to_class_name.underscore.prepend('parsers/'))}'" }
25
+ f.puts
26
+
27
+ f.puts "module #{@options[:namespace]}" if @options[:namespace]
28
+ f.putsi "module Parsers"
29
+ f.putsi " class #{node.to_class_name}"
30
+ f.putsi " include BaseParser"
31
+
32
+ node.value_nodes.each do |method|
25
33
  f.puts
26
34
 
27
- f.puts "module #{@options[:namespace]}" if @options[:namespace]
28
- f.putsi "class #{node.to_class_name}"
29
- f.putsi " include BaseElement"
35
+ method_name = method.to_name.underscore
36
+ at = method.to_name
30
37
 
31
- node.value_nodes.each do |method|
32
- f.puts
38
+ f.putsi " def #{method_name}"
39
+ f.putsi " at :#{at}"
40
+ f.putsi " end"
41
+ end
33
42
 
34
- method_name = method.to_name.underscore
35
- at = method.to_name
43
+ node.submodel_nodes.each do |method|
44
+ f.puts
36
45
 
37
- f.putsi " def #{method_name}"
38
- f.putsi " at :#{at}"
39
- f.putsi " end"
40
- end
46
+ klass = method.to_class_name
47
+ method_name = method.to_name.underscore
48
+ at = method.to_name
41
49
 
42
- node.submodel_nodes.each do |method|
43
- f.puts
50
+ f.putsi " def #{method_name}"
51
+ f.putsi " submodel_at(#{klass}, :#{at})"
52
+ f.putsi " end"
53
+ end
44
54
 
45
- klass = method.to_class_name
46
- method_name = method.to_name.underscore
47
- at = method.to_name
55
+ node.array_nodes.reject { |l| l.list_element.xs_type? }.each do |method|
56
+ f.puts
48
57
 
49
- f.putsi " def #{method_name}"
50
- f.putsi " submodel_at(#{klass}, :#{at})"
51
- f.putsi " end"
52
- end
58
+ list_element_klass = method.list_element_klass
59
+ method_name = method.to_name.underscore
60
+ list_element_at = method.list_element_at.map { |e| ":#{e}" }.join(', ')
53
61
 
54
- node.array_nodes.reject { |l| l.list_element.xs_type? }.each do |method|
55
- f.puts
62
+ f.putsi " def #{method_name}"
63
+ f.putsi " array_of_at(#{list_element_klass}, [#{list_element_at}])"
64
+ f.putsi " end"
65
+ end
56
66
 
57
- list_element_klass = method.list_element_klass
58
- method_name = method.to_name.underscore
59
- list_element_at = method.list_element_at.map { |e| ":#{e}" }.join(', ')
67
+ node.array_nodes.select { |l| l.list_element.xs_type? }.each do |method|
68
+ f.puts
60
69
 
61
- f.putsi " def #{method_name}"
62
- f.putsi " array_of_at(#{list_element_klass}, [#{list_element_at}])"
63
- f.putsi " end"
64
- end
70
+ list_element_klass = method.list_element_klass
71
+ method_name = method.to_name.underscore
72
+ list_element_at = method.list_element_at.map { |e| ":#{e}" }.join(', ')
65
73
 
66
- node.array_nodes.select { |l| l.list_element.xs_type? }.each do |method|
67
- f.puts
74
+ f.putsi " def #{method_name}"
75
+ f.putsi " array_of_at(String, [#{list_element_at}])"
76
+ f.putsi " end"
77
+ end
68
78
 
69
- list_element_klass = method.list_element_klass
70
- method_name = method.to_name.underscore
71
- list_element_at = method.list_element_at.map { |e| ":#{e}" }.join(', ')
79
+ ### to_h method
80
+ lines = []
81
+ node.value_nodes.each do |node|
82
+ lines << "hash[:#{node.to_name.underscore}] = #{node.to_name.underscore} if raw.key? :#{node.to_name}"
83
+ end
72
84
 
73
- f.putsi " def #{method_name}"
74
- f.putsi " array_of_at(String, [#{list_element_at}])"
75
- f.putsi " end"
76
- end
85
+ node.submodel_nodes.each do |node|
86
+ lines << "hash[:#{node.to_name.underscore}] = #{node.to_name.underscore}.to_h if raw.key? :#{node.to_name}"
87
+ end
88
+ node.array_nodes.reject { |l| l.list_element.xs_type? }.each do |node|
89
+ lines << "hash[:#{node.to_name.underscore}] = #{node.to_name.underscore}.map(&:to_h) if raw.key? :#{node.to_name}"
90
+ end
91
+ node.array_nodes.select { |l| l.list_element.xs_type? }.each do |node|
92
+ lines << "hash[:#{node.to_name.underscore}] = #{node.to_name.underscore} if raw.key? :#{node.to_name}"
93
+ end
94
+ if lines.any?
95
+ f.puts
96
+ # lines.last.chop!
97
+ # first_line = lines.shift
77
98
 
78
- ### to_h method
79
- lines = []
80
- node.value_nodes.each do |node|
81
- lines << "#{node.to_name.underscore}: #{node.to_name.underscore},"
82
- end
83
- node.submodel_nodes.each do |node|
84
- lines << "#{node.to_name.underscore}: #{node.to_name.underscore}.to_h,"
85
- end
86
- node.array_nodes.reject { |l| l.list_element.xs_type? }.each do |node|
87
- lines << "#{node.to_name.underscore}: #{node.to_name.underscore}.map(&:to_h),"
88
- end
89
- node.array_nodes.select { |l| l.list_element.xs_type? }.each do |node|
90
- lines << "#{node.to_name.underscore}: #{node.to_name.underscore},"
91
- end
92
- if lines.any?
93
- f.puts
94
- lines.last.chop!
95
- first_line = lines.shift
96
-
97
- f.putsi " def to_h"
98
- f.putsi " { #{first_line}"
99
- lines.each do |line|
100
- f.putsi " #{line}"
101
- end
102
- f.putsi " }.delete_if { |k, v| v.nil? || v.empty? }"
103
- f.putsi " end"
99
+ f.putsi " def to_h"
100
+ f.putsi " hash = {}"
101
+ f.puts
102
+
103
+ lines.each do |line|
104
+ f.putsi " #{line}"
104
105
  end
105
- f.putsi "end"
106
- f.puts "end" if @options[:namespace]
106
+ f.puts
107
+
108
+ f.putsi " hash"
109
+ f.putsi " end"
107
110
  end
111
+ f.putsi " end"
112
+ f.putsi "end"
113
+ f.puts "end" if @options[:namespace]
114
+
115
+ ["parsers/#{node.to_class_name.underscore}.rb", f.string.strip]
108
116
  end
109
117
 
110
118
  private
@@ -1,40 +1,130 @@
1
1
  require 'scaffold_parser/scaffolders/xsd/parser'
2
+ require 'scaffold_parser/scaffolders/xsd/builder'
2
3
 
3
4
  module ScaffoldParser
4
5
  module Scaffolders
5
6
  class XSD
6
- def self.call(doc, options, already_scaffolded_subelements = [])
7
- self.new(doc, options, already_scaffolded_subelements).call
7
+ def self.call(doc, options)
8
+ self.new(doc, options).call
8
9
  end
9
10
 
10
- def initialize(doc, options, already_scaffolded_subelements)
11
+ def initialize(doc, options)
11
12
  @doc = doc
12
13
  @options = options
13
- @already_scaffolded_subelements = already_scaffolded_subelements
14
14
  end
15
15
 
16
16
  def call
17
- unless Dir.exists?('./tmp/')
18
- Dir.mkdir('./tmp/')
19
- puts './tmp/ directory created'
20
- end
17
+ puts "Starting collectiong elements to scaffold" if @options[:verbose]
18
+
19
+ unscaffolded_elements = collect_unscaffolded_subelements(@doc) + @doc.submodel_nodes
21
20
 
22
- unscaffolded_subelements.each do |subelement|
23
- @already_scaffolded_subelements << subelement.to_class_name
21
+ puts "Collected #{unscaffolded_elements.size} elements to scaffold" if @options[:verbose]
24
22
 
25
- Parser.call(subelement.definition, @options)
26
- self.class.call(subelement.definition, @options, @already_scaffolded_subelements)
23
+ code = unscaffolded_elements.flat_map do |element|
24
+ [Parser.call(element.definition, @options), Builder.call(element.definition, @options)]
27
25
  end
26
+
27
+ code.push ['parsers/base_parser.rb', base_element_template]
28
+ code.push ['builders/base_builder.rb', base_builder_template]
28
29
  end
29
30
 
30
31
  private
31
32
 
32
- def unscaffolded_subelements
33
- all = @doc.submodel_nodes.to_a + @doc.array_nodes.map(&:list_element)
34
-
35
- all
33
+ def collect_unscaffolded_subelements(node, collected = [])
34
+ subelements = node.definition.submodel_nodes.to_a + node.definition.array_nodes.map(&:list_element)
36
35
  .reject(&:xs_type?)
37
- .reject { |node| @already_scaffolded_subelements.include?(node.to_class_name) }
36
+ .reject { |node| collected.include?(node.to_class_name) }
37
+
38
+ subelements.each do |element|
39
+ if collected.none? { |c| c.to_class_name == element.to_class_name }
40
+ collected << element
41
+
42
+ puts "Collected #{element.to_name} element" if @options[:verbose]
43
+
44
+ collect_unscaffolded_subelements(element, collected)
45
+ end
46
+ end
47
+
48
+ collected
49
+ end
50
+
51
+ def base_element_template
52
+ <<~TEMPLATE
53
+ module Parsers
54
+ module BaseParser
55
+ EMPTY_ARRAY = []
56
+
57
+ attr_accessor :raw
58
+
59
+ def initialize(raw)
60
+ @raw = raw
61
+ end
62
+
63
+ private
64
+
65
+ def at(locator)
66
+ return nil if raw.nil?
67
+
68
+ raw[locator]
69
+ end
70
+
71
+ def submodel_at(klass, locator)
72
+ element_xml = at locator
73
+
74
+ klass.new(element_xml) if element_xml
75
+ end
76
+
77
+ def array_of_at(klass, locator)
78
+ return EMPTY_ARRAY if raw.nil?
79
+
80
+ elements = raw.dig(*locator) || EMPTY_ARRAY
81
+ if elements.is_a?(Hash) || elements.is_a?(String)
82
+ elements = [elements]
83
+ end
84
+
85
+ elements.map do |raw|
86
+ klass.new(raw)
87
+ end
88
+ end
89
+
90
+ def all(locator)
91
+ return EMPTY_ARRAY if raw.nil?
92
+
93
+ result = raw[locator]
94
+
95
+ if result.is_a? Hash
96
+ [result]
97
+ elsif result.is_a? Array
98
+ result
99
+ else
100
+ EMPTY_ARRAY
101
+ end
102
+ end
103
+ end
104
+ end
105
+ TEMPLATE
106
+ end
107
+
108
+ def base_builder_template
109
+ <<~TEMPLATE
110
+ module Builders
111
+ module BaseBuilder
112
+ attr_accessor :attributes, :element_name
113
+
114
+ def initialize(attributes = {}, element_name)
115
+ @element_name = element_name
116
+ @attributes = attributes || {}
117
+ end
118
+
119
+ def to_xml
120
+ doc = Ox::Document.new(version: '1.0')
121
+ doc << builder
122
+
123
+ Ox.dump(doc, with_xml: true)
124
+ end
125
+ end
126
+ end
127
+ TEMPLATE
38
128
  end
39
129
  end
40
130
  end
@@ -6,10 +6,35 @@ require 'scaffold_parser/scaffolders/xsd'
6
6
 
7
7
  Nokogiri::XML::Element.include ScaffoldParser::NokogiriPatches::Element
8
8
  Nokogiri::XML::Document.include ScaffoldParser::NokogiriPatches::Document
9
- File.include ScaffoldParser::FilePatches
9
+ StringIO.include ScaffoldParser::FilePatches
10
10
 
11
11
  module ScaffoldParser
12
12
  def self.scaffold(path, options = {})
13
+ unless Dir.exists?('./tmp/')
14
+ Dir.mkdir('./tmp/')
15
+ puts './tmp/ directory created'
16
+ end
17
+
18
+ unless Dir.exists?('./tmp/builders')
19
+ Dir.mkdir('./tmp/builders')
20
+ puts './tmp/builders directory created'
21
+ end
22
+
23
+ unless Dir.exists?('./tmp/parsers')
24
+ Dir.mkdir('./tmp/parsers')
25
+ puts './tmp/parsers directory created'
26
+ end
27
+
28
+ scaffold_to_string(path, options).each do |path, content|
29
+ complete_path = path.prepend('./tmp/')
30
+
31
+ puts "Writing out #{complete_path}" if options[:verbose]
32
+
33
+ File.open(complete_path, 'wb') { |f| f.write content }
34
+ end
35
+ end
36
+
37
+ def self.scaffold_to_string(path, options = {})
13
38
  doc = Nokogiri::XML(File.open(path))
14
39
 
15
40
  Scaffolders::XSD.call(doc, options)
@@ -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.2.0'
6
+ spec.version = '0.3.0'
7
7
  spec.authors = ['Premysl Donat']
8
8
  spec.email = ['pdonat@seznam.cz']
9
9
 
@@ -25,4 +25,5 @@ Gem::Specification.new do |spec|
25
25
  spec.add_development_dependency 'pry'
26
26
  spec.add_development_dependency 'nokogiri'
27
27
  spec.add_development_dependency 'activesupport'
28
+ spec.add_development_dependency 'saharspec'
28
29
  end
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.2.0
4
+ version: 0.3.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-02-25 00:00:00.000000000 Z
11
+ date: 2018-03-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -94,6 +94,20 @@ dependencies:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: saharspec
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
97
111
  description: ''
98
112
  email:
99
113
  - pdonat@seznam.cz
@@ -116,6 +130,7 @@ files:
116
130
  - lib/scaffold_parser/file_patches.rb
117
131
  - lib/scaffold_parser/nokogiri_patches.rb
118
132
  - lib/scaffold_parser/scaffolders/xsd.rb
133
+ - lib/scaffold_parser/scaffolders/xsd/builder.rb
119
134
  - lib/scaffold_parser/scaffolders/xsd/parser.rb
120
135
  - scaffold_parser.gemspec
121
136
  homepage: https://github.com/Masa331/scaffold_parser