xml2go 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem "nokogiri"
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Cesar Rodriguez
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,59 @@
1
+ XML2Go
2
+ =========================
3
+
4
+ Convert an XML file to a Go struct.
5
+
6
+ Usage
7
+ -------------------------
8
+ bin/xml2go [options] <xml_file> <go_output_file>
9
+
10
+ Example
11
+ -------------------------
12
+
13
+ Input:
14
+
15
+ <?xml version="1.0"?>
16
+ <?xml-stylesheet type="text/css" href="nutrition.css"?>
17
+ <nutrition>
18
+ <food>
19
+ <name>Avocado Dip</name>
20
+ <mfr>Sunnydale</mfr>
21
+ <serving units="g">29</serving>
22
+ <calories total="110" fat="100"/>
23
+ <total-fat>11</total-fat>
24
+ <saturated-fat>3</saturated-fat>
25
+ <cholesterol>5.0</cholesterol>
26
+ <sodium>210</sodium>
27
+ <carb>2</carb>
28
+ <fiber>0</fiber>
29
+ <protein>1.1</protein>
30
+ <natural>false</natural>
31
+ </food>
32
+ </nutrition>
33
+
34
+ Output:
35
+
36
+ package main
37
+
38
+ type Food struct {
39
+ Name string `xml:"name"`
40
+ Mfr string `xml:"mfr"`
41
+ Serving int `xml:"serving"`
42
+ Calories string `xml:"calories"`
43
+ TotalFat int `xml:"total-fat"`
44
+ SaturatedFat int `xml:"saturated-fat"`
45
+ Cholesterol float64 `xml:"cholesterol"`
46
+ Sodium int `xml:"sodium"`
47
+ Carb int `xml:"carb"`
48
+ Fiber int `xml:"fiber"`
49
+ Protein float64 `xml:"protein"`
50
+ Natural bool `xml:"natural"`
51
+ }
52
+
53
+ type Nutrition struct {
54
+ Food Food `xml:"food"`
55
+ }
56
+
57
+ type Document struct {
58
+ Nutrition Nutrition `xml:"nutrition"`
59
+ }
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/bin/xml2go ADDED
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'xml2go'
4
+
5
+ def parse_options(args)
6
+ @@config = {}
7
+ optparse = OptionParser.new do|opts|
8
+ opts.banner = "Usage: xml2go [options] <input_xml_file> <output_file>"
9
+
10
+ opts.on("-a", "--add-attrs", "Add XML attributes as part of the struct") do |a|
11
+ @@config[:add_attrs] = true
12
+ end
13
+
14
+ opts.on("-p", "--plural-arrays", "Pluralize array names") do |p|
15
+ @@config[:plural_arrays] = true
16
+ end
17
+
18
+ opts.on("-t", "--detect-type",
19
+ "Attempt to detect the type of a primitive by searching in the attrs") do |p|
20
+ @@config[:detect_type] = true
21
+ end
22
+
23
+ end
24
+ optparse.parse!(args)
25
+ end
26
+
27
+ # parse the CLI args
28
+ parse_options(ARGV)
29
+ # load the XML file
30
+ Xml2Go::load(File.open(ARGV[-2], "r"))
31
+ # perform the parsing
32
+ Xml2Go::parse(@@config)
33
+ # print the results
34
+ Xml2Go::write_to_file(ARGV[-1])
35
+ # format the results
36
+ v = `gofmt -w --tabs=false --tabwidth=4 #{ARGV[-1]}`
data/lib/xml2go.rb ADDED
@@ -0,0 +1,48 @@
1
+ require "nokogiri"
2
+ require "optparse"
3
+
4
+ require 'xml2go/struct'
5
+ require 'xml2go/parser'
6
+
7
+ module Xml2Go
8
+
9
+ def self.get_const_name(str)
10
+ final_str = ""
11
+ return str.gsub(/([A-Z])/){|c| "_#{c}"}.gsub(/^_/, "").upcase
12
+ end
13
+
14
+ def self.load(file_handle)
15
+ @@doc = Nokogiri::XML(file_handle)
16
+ @@structs = {}
17
+ end
18
+
19
+ def self.parse(config)
20
+ @@config = config
21
+ parse_element(@@doc)
22
+ end
23
+
24
+ def self.parse_element(element)
25
+ @@parser = Xml2Go::Parser.new(@@config)
26
+ @@parser.parse_element(element)
27
+ @@structs = @@parser.structs
28
+ return
29
+ end
30
+
31
+ def self.write_to_file(filename)
32
+ file_handle = File.new(filename, "w")
33
+ file_handle.write("package main\n\n")
34
+ file_handle.write(@@structs.values.join("\n"))
35
+ file_handle.close()
36
+ end
37
+
38
+ def self.write_mocks_to_file(filename)
39
+ file_handle = File.new(filename, "w")
40
+ file_handle.write("package main\n\n")
41
+ consts = @@structs.values.map{ |v| v.get_consts }
42
+ file_handle.write(consts.join("\n"))
43
+ blobs = @@structs.values.map { |v| v.to_declaration}
44
+ file_handle.write(blobs.join("\n"))
45
+ file_handle.close()
46
+ end
47
+
48
+ end
@@ -0,0 +1,185 @@
1
+
2
+ module Xml2Go
3
+
4
+ class Parser
5
+
6
+ SUPPORTED_TYPES = ["bool", "int", "float64", "string"]
7
+ INVALID_CHARS = ["-"]
8
+
9
+ attr_reader :structs
10
+
11
+ def initialize(config)
12
+ @config = config
13
+ @structs = {}
14
+ end
15
+
16
+ # ruby's .capitalize ignores Camel case
17
+ def cap(s)
18
+ s[0] = s[0].upcase
19
+ return s
20
+ end
21
+
22
+
23
+ # ruby's .capitalize ignores Camel case
24
+ def low(s)
25
+ dup = s.dup
26
+ dup[0] = dup[0].downcase
27
+ return dup
28
+ end
29
+
30
+
31
+ # remove invalid chars, capitalize and camelcase it
32
+ def normalize(s)
33
+ s = cap(s)
34
+ INVALID_CHARS.each do |char|
35
+ s.gsub!(char, "_")
36
+ end
37
+
38
+ return s.gsub(/(?<=_|^)(\w)/){$1.upcase}.gsub(/(?:_)(\w)/,'\1')
39
+ end
40
+
41
+ def numeric?(str)
42
+ Float(str) != nil rescue false
43
+ end
44
+
45
+ # take 's' out of string and return if it was plural or not
46
+ def singularize(string)
47
+ return [string, false]
48
+ if string[-1] == "s" then
49
+ string = string[0..-2]
50
+ return [string, true]
51
+ end
52
+ end
53
+
54
+ def get_struct_member(element)
55
+ type = normalize(element.name)
56
+ var_name = type
57
+ xml_tag = element.name
58
+ [var_name, type, xml_tag]
59
+ end
60
+
61
+ def add_field_to_struct(struct, var_name, type, xml_tag)
62
+ if struct.fields.has_key?(var_name) &&
63
+ !struct.fields[var_name].type.include?("[]") then
64
+
65
+ type = struct.fields[var_name].type
66
+ # Ignore the 's' at the end
67
+ if type[-1] == "s" then
68
+ # update the struct
69
+ @structs[type].name = type[0..-2]
70
+ type = type[0..-2]
71
+ end
72
+
73
+ struct.fields[var_name].type = "[]" + type
74
+
75
+ if @config[:plural_arrays] then
76
+ struct.fields[var_name].name << "s" if struct.fields[var_name].name[-1] != "s"
77
+ end
78
+
79
+ else
80
+ struct.add_field(var_name, type, xml_tag)
81
+ end
82
+ end
83
+
84
+ # adds the XML attrs of element to the Go struct
85
+ def add_attrs_to_struct(element, struct)
86
+ if element.respond_to?(:attributes) then
87
+ element.attributes.each do |attri, value|
88
+ var_name = attri.dup
89
+ add_field_to_struct(struct, normalize(var_name), get_type(value.text), "#{attri},attr")
90
+ end
91
+ end
92
+ end
93
+
94
+ # Add XML node, which contains more child nodes, as a member struct
95
+ def add_xml_node(element, struct)
96
+ var_name, type, xml_tag = get_struct_member(element)
97
+
98
+ type, plural = singularize(type)
99
+ type = "[]" + type if plural
100
+
101
+ begin
102
+ xml_tag = element.namespace.prefix << ":" << xml_tag
103
+ rescue => e
104
+ # :)
105
+ end
106
+
107
+ add_field_to_struct(struct, var_name, type, xml_tag)
108
+ end
109
+
110
+ # Add XML node, which contains no child nodes, as a primitive type
111
+ # if it contains attrs, add it as a struct.
112
+ def add_xml_primitive(element, struct)
113
+ var_name, type, xml_tag = get_struct_member(element)
114
+
115
+ # is this a primitive with attrs?
116
+ prim_attrs = element.attributes.select{ |k,v| !k.include?("type") }
117
+ if prim_attrs.length > 0 then
118
+
119
+ add_field_to_struct(struct, var_name, type, xml_tag)
120
+ parse_element(element)
121
+ else
122
+
123
+ type = get_type_from_elem(element)
124
+ add_field_to_struct(struct, var_name, type, xml_tag)
125
+ end
126
+ end
127
+
128
+ def parse_element(element)
129
+ struct_name = normalize(element.name)
130
+ # TODO: maybe we DO want to process repeated structs
131
+ # to capture arrays don't process to structs
132
+ return if @structs.has_key?(struct_name)
133
+
134
+ struct = Xml2Go::Struct.new(struct_name)
135
+
136
+ # add attributes as properties
137
+ if @config[:add_attrs] then
138
+ add_attrs_to_struct(element, struct)
139
+ end
140
+
141
+ element.elements.each do |child|
142
+ # this is a struct
143
+ if child.elements.count > 0 then
144
+ add_xml_node(child, struct)
145
+ parse_element(child)
146
+
147
+ else # this is an XML primitive
148
+ add_xml_primitive(child, struct)
149
+ end
150
+ end
151
+
152
+ @structs[struct.name] = struct
153
+ end
154
+
155
+ # analyses the xml element to try and fetch the type
156
+ # if can't figure it out, returns 'string'
157
+ def get_type_from_elem(element)
158
+
159
+ if @config[:detect_type] then
160
+ # check and see if the type is provided in the attributes
161
+ element.attributes.each do |k,v|
162
+ if k.include?("type") then
163
+ type = v.value.split(":").last
164
+ return type if SUPPORTED_TYPES.include?(type)
165
+ end
166
+ end
167
+ end
168
+
169
+ return get_type(element.child.to_s)
170
+ end
171
+
172
+ def get_type(string)
173
+ # try to figure out the type
174
+ if numeric?(string) then
175
+ return "float64" if Float(string).to_s.length == string.length
176
+ return "int"
177
+ end
178
+ return "bool" if ["true", "false"].include?(string)
179
+ return "string"
180
+ end
181
+
182
+ end
183
+
184
+
185
+ end
@@ -0,0 +1,74 @@
1
+
2
+ module Xml2Go
3
+
4
+ # class representing a Go struct
5
+ class Struct
6
+ attr_accessor :fields, :name
7
+
8
+ # represents member variables
9
+ class Field
10
+ attr_accessor :type, :name, :xml_tag, :value
11
+
12
+ def initialize(name, type, xml_tag, value)
13
+ @name = name
14
+ @type = type
15
+ @xml_tag = xml_tag
16
+ @value = value
17
+ @const_name = Xml2Go::get_const_name(@name)
18
+ end
19
+
20
+ def to_s
21
+ "#{@name} #{@type} `xml:\"#{@xml_tag}\"`"
22
+ end
23
+
24
+ def to_declaration
25
+ value = @value.nil? ? Xml2Go::low(@name) : @const_name
26
+ "#{@name}: #{value},"
27
+ end
28
+
29
+ def to_const
30
+ if !value.nil? then
31
+ return "#{@const_name} = \"#{@value}\""
32
+ end
33
+ return ""
34
+ end
35
+
36
+ end
37
+
38
+ def initialize(name)
39
+ @name = name
40
+ @fields = {}
41
+ end
42
+
43
+ # adds member variable to struct
44
+ def add_field(var_name, type, xml_tag, value=nil)
45
+ @fields[var_name] = Field.new(var_name, type, xml_tag, value)
46
+ end
47
+
48
+ # adds member variable to struct
49
+ def delete_field(var_name)
50
+ @fields.delete(var_name)
51
+ end
52
+
53
+ def to_s
54
+ fields_string = @fields.values.join("\n")
55
+ "type #{@name} struct {\n
56
+ #{fields_string}
57
+ }
58
+ "
59
+ end
60
+
61
+ def to_declaration
62
+ fields_string = @fields.values.map { |v| v.to_declaration}
63
+ "#{Xml2Go::low(@name)} := #{@name} {
64
+ #{fields_string.join("\n")}
65
+ }"
66
+ end
67
+
68
+ def get_consts
69
+ consts_string = @fields.values.map{ |v| v.to_const}
70
+ "// #{@name} info \n" << consts_string.join("\n")
71
+ end
72
+
73
+ end
74
+ end
@@ -0,0 +1,3 @@
1
+ module Xml2go
2
+ VERSION = "0.0.1"
3
+ end
data/sample.xml ADDED
@@ -0,0 +1,326 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <soap:Envelope
3
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4
+ xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
5
+ xmlns:vin="http://soap.vindicia.com/v4_0/Vindicia"
6
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
7
+ soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
8
+ xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
9
+ <soap:Body>
10
+ <fetchAllResponse xmlns="http://soap.vindicia.com/v4_0/Product">
11
+ <return xmlns="" xsi:type="vin:Return">
12
+ <returnCode xsi:type="vin:ReturnCode">200</returnCode>
13
+
14
+ <soapId xsi:type="xsd:string">1d6427aec1200109f81806a271d0199cc0c6f3ca</soapId>
15
+
16
+ <returnString xsi:type="xsd:string">OK</returnString>
17
+ </return>
18
+
19
+ <products xmlns="" xsi:type="vin:Product">
20
+ <VID xmlns="" xsi:type="xsd:string">2ececbcefe8f018f2ef95005787d61f90eba5fbc</VID>
21
+
22
+ <merchantProductId xmlns="" xsi:type="xsd:string">standard_product</merchantProductId>
23
+
24
+ <descriptions xmlns="" xsi:type="vin:ProductDescription">
25
+ <language xmlns="" xsi:type="xsd:string">EN</language>
26
+
27
+ <description xmlns="" xsi:type="xsd:string">Standard product</description>
28
+ </descriptions>
29
+
30
+ <status xmlns="" xsi:type="vin:ProductStatus">Active</status>
31
+
32
+ <taxClassification xmlns="" xsi:type="vin:TaxClassification">OtherTaxable</taxClassification>
33
+
34
+ <defaultBillingPlan xmlns="" xsi:type="vin:BillingPlan">
35
+ <VID xmlns="" xsi:type="xsd:string">b105366817bbd96ecfd8c9af5d9a5a3d065b8e81</VID>
36
+
37
+ <merchantBillingPlanId xmlns="" xsi:type="xsd:string">standard_billing</merchantBillingPlanId>
38
+
39
+ <description xmlns="" xsi:type="xsd:string">Standard access</description>
40
+
41
+ <status xmlns="" xsi:type="vin:BillingPlanStatus">Active</status>
42
+
43
+ <periods xmlns="" xsi:type="vin:BillingPlanPeriod">
44
+ <type xmlns="" xsi:type="vin:BillingPeriodType">Month</type>
45
+
46
+ <quantity xmlns="" xsi:type="xsd:int">1</quantity>
47
+
48
+ <cycles xmlns="" xsi:type="xsd:int">1</cycles>
49
+
50
+ <prices xmlns="" xsi:type="vin:BillingPlanPrice">
51
+ <amount xmlns="" xsi:type="xsd:decimal">0</amount>
52
+
53
+ <currency xmlns="" xsi:type="xsd:string">USD</currency>
54
+ </prices>
55
+
56
+ <doNotNotifyFirstBill xmlns="" xsi:type="xsd:boolean">1</doNotNotifyFirstBill>
57
+
58
+ <free xmlns="" xsi:type="xsd:boolean">1</free>
59
+ </periods>
60
+
61
+ <periods xmlns="" xsi:type="vin:BillingPlanPeriod">
62
+ <type xmlns="" xsi:type="vin:BillingPeriodType">Month</type>
63
+
64
+ <quantity xmlns="" xsi:type="xsd:int">1</quantity>
65
+
66
+ <cycles xmlns="" xsi:type="xsd:int">0</cycles>
67
+
68
+ <prices xmlns="" xsi:type="vin:BillingPlanPrice">
69
+ <amount xmlns="" xsi:type="xsd:decimal">50</amount>
70
+
71
+ <currency xmlns="" xsi:type="xsd:string">USD</currency>
72
+ </prices>
73
+
74
+ <doNotNotifyFirstBill xmlns="" xsi:type="xsd:boolean">1</doNotNotifyFirstBill>
75
+ </periods>
76
+
77
+ <prenotifyDays xmlns="" xsi:type="xsd:int">4</prenotifyDays>
78
+
79
+ <merchantEntitlementIds xmlns="" xsi:type="vin:MerchantEntitlementId">
80
+ <id xmlns="" xsi:type="xsd:string">standard_entitlement&amp;amp;#39;</id>
81
+ </merchantEntitlementIds>
82
+
83
+ <billingStatementIdentifier xmlns="" xsi:type="xsd:string">Seymore.tv</billingStatementIdentifier>
84
+ </defaultBillingPlan>
85
+
86
+ <creditGranted xmlns="" xsi:type="vin:Credit" />
87
+ </products>
88
+
89
+ <products xmlns="" xsi:type="vin:Product">
90
+ <VID xmlns="" xsi:type="xsd:string">5e156ffa360f716c2f359d3b9820d7d7d64001ed</VID>
91
+
92
+ <merchantProductId xmlns="" xsi:type="xsd:string">Omar_test</merchantProductId>
93
+
94
+ <descriptions xmlns="" xsi:type="vin:ProductDescription">
95
+ <language xmlns="" xsi:type="xsd:string">EN</language>
96
+
97
+ <description xmlns="" xsi:type="xsd:string">Testing</description>
98
+ </descriptions>
99
+
100
+ <status xmlns="" xsi:type="vin:ProductStatus">Active</status>
101
+
102
+ <taxClassification xmlns="" xsi:type="vin:TaxClassification">OtherTaxable</taxClassification>
103
+
104
+ <creditGranted xmlns="" xsi:type="vin:Credit" />
105
+ </products>
106
+
107
+ <products xmlns="" xsi:type="vin:Product">
108
+ <VID xmlns="" xsi:type="xsd:string">d257eada072f0f88f3a74d66c8d8cffccd5b70b1</VID>
109
+
110
+ <merchantProductId xmlns="" xsi:type="xsd:string">my_product</merchantProductId>
111
+
112
+ <status xmlns="" xsi:type="vin:ProductStatus">Active</status>
113
+ </products>
114
+
115
+ <products xmlns="" xsi:type="vin:Product">
116
+ <VID xmlns="" xsi:type="xsd:string">28e49460f07de9ae6689a89605764a0522f00700</VID>
117
+
118
+ <merchantProductId xmlns="" xsi:type="xsd:string">pepe</merchantProductId>
119
+
120
+ <descriptions xmlns="" xsi:type="vin:ProductDescription">
121
+ <language xmlns="" xsi:type="xsd:string">EN</language>
122
+
123
+ <description xmlns="" xsi:type="xsd:string">Standard product</description>
124
+ </descriptions>
125
+
126
+ <status xmlns="" xsi:type="vin:ProductStatus">Suspended</status>
127
+ </products>
128
+
129
+ <products xmlns="" xsi:type="vin:Product">
130
+ <VID xmlns="" xsi:type="xsd:string">621cd6a05344936fe9046abe68b67441a271ef93</VID>
131
+
132
+ <merchantProductId xmlns="" xsi:type="xsd:string">aaaapepe</merchantProductId>
133
+
134
+ <descriptions xmlns="" xsi:type="vin:ProductDescription">
135
+ <language xmlns="" xsi:type="xsd:string">EN</language>
136
+
137
+ <description xmlns="" xsi:type="xsd:string">Standard product</description>
138
+ </descriptions>
139
+
140
+ <status xmlns="" xsi:type="vin:ProductStatus">Active</status>
141
+ </products>
142
+
143
+ <products xmlns="" xsi:type="vin:Product">
144
+ <VID xmlns="" xsi:type="xsd:string">4bebf3e91ae660fc34acf13b28b0c4881293385e</VID>
145
+
146
+ <merchantProductId xmlns="" xsi:type="xsd:string">omar2</merchantProductId>
147
+
148
+ <status xmlns="" xsi:type="vin:ProductStatus">Active</status>
149
+
150
+ <defaultBillingPlan xmlns="" xsi:type="vin:BillingPlan">
151
+ <VID xmlns="" xsi:type="xsd:string">0cea0648d9cb8533c24180118383c6ad72ad2ff9</VID>
152
+
153
+ <merchantBillingPlanId xmlns="" xsi:type="xsd:string">odion_default_billing_plan</merchantBillingPlanId>
154
+
155
+ <description xmlns="" xsi:type="xsd:string">Billing Plan used for Odion product.</description>
156
+
157
+ <status xmlns="" xsi:type="vin:BillingPlanStatus">Active</status>
158
+
159
+ <periods xmlns="" xsi:type="vin:BillingPlanPeriod">
160
+ <type xmlns="" xsi:type="vin:BillingPeriodType">Month</type>
161
+
162
+ <quantity xmlns="" xsi:type="xsd:int">1</quantity>
163
+
164
+ <cycles xmlns="" xsi:type="xsd:int">1</cycles>
165
+
166
+ <prices xmlns="" xsi:type="vin:BillingPlanPrice">
167
+ <amount xmlns="" xsi:type="xsd:decimal">0</amount>
168
+
169
+ <currency xmlns="" xsi:type="xsd:string">USD</currency>
170
+ </prices>
171
+
172
+ <doNotNotifyFirstBill xmlns="" xsi:type="xsd:boolean">1</doNotNotifyFirstBill>
173
+
174
+ <free xmlns="" xsi:type="xsd:boolean">1</free>
175
+ </periods>
176
+
177
+ <periods xmlns="" xsi:type="vin:BillingPlanPeriod">
178
+ <type xmlns="" xsi:type="vin:BillingPeriodType">Month</type>
179
+
180
+ <quantity xmlns="" xsi:type="xsd:int">1</quantity>
181
+
182
+ <cycles xmlns="" xsi:type="xsd:int">0</cycles>
183
+
184
+ <prices xmlns="" xsi:type="vin:BillingPlanPrice">
185
+ <amount xmlns="" xsi:type="xsd:decimal">50</amount>
186
+
187
+ <currency xmlns="" xsi:type="xsd:string">USD</currency>
188
+ </prices>
189
+
190
+ <doNotNotifyFirstBill xmlns="" xsi:type="xsd:boolean">1</doNotNotifyFirstBill>
191
+
192
+ <free xmlns="" xsi:type="xsd:boolean">0</free>
193
+ </periods>
194
+ </defaultBillingPlan>
195
+ </products>
196
+
197
+ <products xmlns="" xsi:type="vin:Product">
198
+ <VID xmlns="" xsi:type="xsd:string">42442538413503c041b3654d01339b11adeb7879</VID>
199
+
200
+ <merchantProductId xmlns="" xsi:type="xsd:string">odion_product</merchantProductId>
201
+
202
+ <descriptions xmlns="" xsi:type="vin:ProductDescription">
203
+ <language xmlns="" xsi:type="xsd:string">EN</language>
204
+
205
+ <description xmlns="" xsi:type="xsd:string">Test Product for Odion Account</description>
206
+ </descriptions>
207
+
208
+ <status xmlns="" xsi:type="vin:ProductStatus">Active</status>
209
+
210
+ <defaultBillingPlan xmlns="" xsi:type="vin:BillingPlan">
211
+ <VID xmlns="" xsi:type="xsd:string">0cea0648d9cb8533c24180118383c6ad72ad2ff9</VID>
212
+
213
+ <merchantBillingPlanId xmlns="" xsi:type="xsd:string">odion_default_billing_plan</merchantBillingPlanId>
214
+
215
+ <description xmlns="" xsi:type="xsd:string">Billing Plan used for Odion product.</description>
216
+
217
+ <status xmlns="" xsi:type="vin:BillingPlanStatus">Active</status>
218
+
219
+ <periods xmlns="" xsi:type="vin:BillingPlanPeriod">
220
+ <type xmlns="" xsi:type="vin:BillingPeriodType">Month</type>
221
+
222
+ <quantity xmlns="" xsi:type="xsd:int">1</quantity>
223
+
224
+ <cycles xmlns="" xsi:type="xsd:int">1</cycles>
225
+
226
+ <prices xmlns="" xsi:type="vin:BillingPlanPrice">
227
+ <amount xmlns="" xsi:type="xsd:decimal">0</amount>
228
+
229
+ <currency xmlns="" xsi:type="xsd:string">USD</currency>
230
+ </prices>
231
+
232
+ <doNotNotifyFirstBill xmlns="" xsi:type="xsd:boolean">1</doNotNotifyFirstBill>
233
+
234
+ <free xmlns="" xsi:type="xsd:boolean">1</free>
235
+ </periods>
236
+
237
+ <periods xmlns="" xsi:type="vin:BillingPlanPeriod">
238
+ <type xmlns="" xsi:type="vin:BillingPeriodType">Month</type>
239
+
240
+ <quantity xmlns="" xsi:type="xsd:int">1</quantity>
241
+
242
+ <cycles xmlns="" xsi:type="xsd:int">0</cycles>
243
+
244
+ <prices xmlns="" xsi:type="vin:BillingPlanPrice">
245
+ <amount xmlns="" xsi:type="xsd:decimal">50</amount>
246
+
247
+ <currency xmlns="" xsi:type="xsd:string">USD</currency>
248
+ </prices>
249
+
250
+ <doNotNotifyFirstBill xmlns="" xsi:type="xsd:boolean">1</doNotNotifyFirstBill>
251
+
252
+ <free xmlns="" xsi:type="xsd:boolean">0</free>
253
+ </periods>
254
+ </defaultBillingPlan>
255
+ </products>
256
+
257
+ <products xmlns="" xsi:type="vin:Product">
258
+ <VID xmlns="" xsi:type="xsd:string">910533526550db530999c729e4e94d82fca819e7</VID>
259
+
260
+ <merchantProductId xmlns="" xsi:type="xsd:string">main_product</merchantProductId>
261
+
262
+ <descriptions xmlns="" xsi:type="vin:ProductDescription">
263
+ <language xmlns="" xsi:type="xsd:string">EN</language>
264
+
265
+ <description xmlns="" xsi:type="xsd:string">Test Product for Odion Account</description>
266
+ </descriptions>
267
+
268
+ <status xmlns="" xsi:type="vin:ProductStatus">Active</status>
269
+
270
+ <defaultBillingPlan xmlns="" xsi:type="vin:BillingPlan">
271
+ <VID xmlns="" xsi:type="xsd:string">0cea0648d9cb8533c24180118383c6ad72ad2ff9</VID>
272
+
273
+ <merchantBillingPlanId xmlns="" xsi:type="xsd:string">odion_default_billing_plan</merchantBillingPlanId>
274
+
275
+ <description xmlns="" xsi:type="xsd:string">Billing Plan used for Odion product.</description>
276
+
277
+ <status xmlns="" xsi:type="vin:BillingPlanStatus">Active</status>
278
+
279
+ <periods xmlns="" xsi:type="vin:BillingPlanPeriod">
280
+ <type xmlns="" xsi:type="vin:BillingPeriodType">Month</type>
281
+
282
+ <quantity xmlns="" xsi:type="xsd:int">1</quantity>
283
+
284
+ <cycles xmlns="" xsi:type="xsd:int">1</cycles>
285
+
286
+ <prices xmlns="" xsi:type="vin:BillingPlanPrice">
287
+ <amount xmlns="" xsi:type="xsd:decimal">0</amount>
288
+
289
+ <currency xmlns="" xsi:type="xsd:string">USD</currency>
290
+ </prices>
291
+
292
+ <doNotNotifyFirstBill xmlns="" xsi:type="xsd:boolean">1</doNotNotifyFirstBill>
293
+
294
+ <free xmlns="" xsi:type="xsd:boolean">1</free>
295
+ </periods>
296
+
297
+ <periods xmlns="" xsi:type="vin:BillingPlanPeriod">
298
+ <type xmlns="" xsi:type="vin:BillingPeriodType">Month</type>
299
+
300
+ <quantity xmlns="" xsi:type="xsd:int">1</quantity>
301
+
302
+ <cycles xmlns="" xsi:type="xsd:int">0</cycles>
303
+
304
+ <prices xmlns="" xsi:type="vin:BillingPlanPrice">
305
+ <amount xmlns="" xsi:type="xsd:decimal">50</amount>
306
+
307
+ <currency xmlns="" xsi:type="xsd:string">USD</currency>
308
+ </prices>
309
+
310
+ <doNotNotifyFirstBill xmlns="" xsi:type="xsd:boolean">1</doNotNotifyFirstBill>
311
+
312
+ <free xmlns="" xsi:type="xsd:boolean">0</free>
313
+ </periods>
314
+ </defaultBillingPlan>
315
+
316
+ <merchantEntitlementIds xmlns="" xsi:type="vin:MerchantEntitlementId">
317
+ <id xmlns="" xsi:type="xsd:string">main_entitlement</id>
318
+
319
+ <description xmlns="" xsi:type="xsd:string">Main Product Entitlement</description>
320
+ </merchantEntitlementIds>
321
+
322
+ <creditGranted xmlns="" xsi:type="vin:Credit" />
323
+ </products>
324
+ </fetchAllResponse>
325
+ </soap:Body>
326
+ </soap:Envelope>
data/xml2go.gemspec ADDED
@@ -0,0 +1,23 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'xml2go/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "xml2go"
8
+ spec.version = Xml2go::VERSION
9
+ spec.authors = ["Cesar Rodriguez"]
10
+ spec.email = ["cesar@ooyala.com"]
11
+ spec.summary = %q{Convert XML to Go structs}
12
+ spec.description = ""
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = "xml2go"
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.5"
22
+ spec.add_development_dependency "rake"
23
+ end
metadata ADDED
@@ -0,0 +1,90 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: xml2go
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Cesar Rodriguez
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-06-19 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '1.5'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '1.5'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rake
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ description: ''
47
+ email:
48
+ - cesar@ooyala.com
49
+ executables:
50
+ - xml2go
51
+ extensions: []
52
+ extra_rdoc_files: []
53
+ files:
54
+ - Gemfile
55
+ - LICENSE.txt
56
+ - README.md
57
+ - Rakefile
58
+ - bin/xml2go
59
+ - lib/xml2go.rb
60
+ - lib/xml2go/parser.rb
61
+ - lib/xml2go/struct.rb
62
+ - lib/xml2go/version.rb
63
+ - sample.xml
64
+ - xml2go.gemspec
65
+ homepage: ''
66
+ licenses:
67
+ - MIT
68
+ post_install_message:
69
+ rdoc_options: []
70
+ require_paths:
71
+ - lib
72
+ required_ruby_version: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ required_rubygems_version: !ruby/object:Gem::Requirement
79
+ none: false
80
+ requirements:
81
+ - - ! '>='
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ requirements: []
85
+ rubyforge_project:
86
+ rubygems_version: 1.8.23
87
+ signing_key:
88
+ specification_version: 3
89
+ summary: Convert XML to Go structs
90
+ test_files: []