adf_builder 0.0.1 → 0.0.5

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
  SHA256:
3
- metadata.gz: 273896ee8ce6282f9b8c8f2b1a5c2ff9dd50617d88cd98a9a165e7bf319f48d8
4
- data.tar.gz: 87dda47e5a500c476fef3ecf67e6a8160a8cb061ef134830c1bda8613f6615bb
3
+ metadata.gz: '0806861185a24169f9427bfdc78e01f699ea30523cd6db4e055ac951a811e21d'
4
+ data.tar.gz: 7b5574210760b69ad5e7bb5b2cbc8d3a4e16b58967cfe7c7c94edd3ff3266d15
5
5
  SHA512:
6
- metadata.gz: 2e3ea523f1c88100648a915b23fd3f83d728ce504ba4f51b720041627f1d85235675123c9579a91867729ee00a216d346a2540d0817e0050f889fafaf5f12af8
7
- data.tar.gz: ef93592778d5e317ea816e330c5b86d054222481e0821ce1976f1afe7a19c5ab76b8f2fd3f9f7b21e23b8ecdbb856f3d0923f295bdf850ed6221018d546a0928
6
+ metadata.gz: 453cbe5ebca171565d2cb3be708130979bb782287d96e622fbdaa8ded37ecff51e63004a6ba3c25dd4b9d37e1f552918dfa4924698a4c7867981eea1677c3ab0
7
+ data.tar.gz: b2d3ebcd64bbcd89034a1b8d9f1dc56518c3147eee88ec44774d8ce4ee877c2347a28820c72fb24b80fed267518457fd58ff6e43504cafce39970bf4f304fa66
data/CHANGELOG.md CHANGED
@@ -1,6 +1,34 @@
1
1
  ## [Unreleased]
2
+ - Vehicle Structure
3
+ - Remaining Optional Tags that are not free text
4
+ - odometer
5
+ - condition
6
+ - colorcombination
7
+ - imagetag
8
+ - price
9
+ - option
10
+ - finance
11
+ - Expand Structures for all parameters
12
+ - Customer
13
+ - Vehicle
14
+ - Contact
15
+
16
+ ### In many moons
17
+ - Add Provider structure
18
+ - Add Price structure
19
+
20
+ ## [0.0.4] - 2021-08-08
21
+ - Added Customer, Contact, Vendor basic structure
22
+
23
+
24
+ ## [0.0.3] - 2021-08-04
25
+ - Added ability to add simple vehicle structures
26
+
27
+ ## [0.0.2] - 2021-08-04
28
+
29
+ - Can create a prospect and dynamically update params and values for the base and parent level
2
30
 
3
31
  ## [0.0.1] - 2021-08-03
4
32
 
5
33
  - Initial release
6
- - Can return the sample XML given from spec doc
34
+ - Can return the minimal XML given from spec doc
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- adf_builder (0.0.1)
4
+ adf_builder (0.0.4)
5
5
  ox (~> 2.14)
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -1,8 +1,5 @@
1
1
  # AdfBuilder
2
-
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/adf_builder`. To experiment with that code, run `bin/console` for an interactive prompt.
4
-
5
- TODO: Delete this and the text above, and describe your gem
2
+ Hopefully this will help with development in the ADF format. The goal is to intuitively create and update an ADF XML file that can easily be added to an email or saved to a file.
6
3
 
7
4
  ## Installation
8
5
 
@@ -13,17 +10,195 @@ gem 'adf_builder'
13
10
  ```
14
11
 
15
12
  And then execute:
16
-
17
- $ bundle install
13
+ ```shell
14
+ $ bundle install
15
+ ```
18
16
 
19
17
  Or install it yourself as:
20
-
21
- $ gem install adf_builder
18
+ ```shell
19
+ $ gem install adf_builder
20
+ ```
22
21
 
23
22
  ## Usage
24
23
 
25
- TODO: Write usage instructions here
24
+ Quickly create the minimal lead found in the spec document
25
+ ```ruby
26
+ builder = AdfBuilder::Builder.new
27
+ builder.minimal_lead
28
+ ```
29
+ Start Building
30
+ ```ruby
31
+ builder = AdfBuilder::Builder.new
32
+ builder.to_xml
33
+ ```
34
+
35
+
36
+ Outputs
37
+ ```xml
38
+ <?ADF version="1.0"?>
39
+
40
+ <?xml version="1.0"?>
41
+ <adf>
42
+ <prospect status="new">
43
+ <requestdate>2021-08-04T15:18:30+04:00</requestdate>
44
+ </prospect>
45
+ </adf>
46
+ ```
47
+
48
+
49
+ Update Requestdate value
50
+ ```ruby
51
+ builder = AdfBuilder::Builder.new
52
+ builder.prospect.request_date.update_val(Date.new(2021,12,12))
53
+ ```
54
+ Outputs
55
+
56
+ ```xml
57
+ <?ADF version="1.0"?>
58
+
59
+ <?xml version="1.0"?>
60
+ <adf>
61
+ <prospect status="new">
62
+ <requestdate>2021-12-12T00:00:00+00:00</requestdate>
63
+ </prospect>
64
+ </adf>
65
+ ```
66
+
67
+
68
+ Add ID tag to Prospect
69
+ ```ruby
70
+ builder = AdfBuilder::Builder.new
71
+ builder.prospect.add_id('howdy', 'Ag')
72
+ ```
73
+
74
+ Outputs
75
+ ```xml
76
+ <?ADF version="1.0"?>
77
+
78
+ <?xml version="1.0"?>
79
+ <adf>
80
+ <prospect status="new">
81
+ <id sequence="1" source="Ag">howdy</id>
82
+ <requestdate>2021-08-04T15:24:16+04:00</requestdate>
83
+ </prospect>
84
+ </adf>
85
+ ```
86
+
87
+ Add Vehicle
88
+
89
+ ```ruby
90
+ builder = AdfBuilder::Builder.new
91
+ builder.prospect.vehicles.add(2021, 'Ford', 'Raptor')
92
+ ```
93
+
94
+ Outputs
95
+
96
+ ```xml
97
+ <?ADF version="1.0"?>
98
+
99
+ <?xml version="1.0"?>
100
+ <adf>
101
+ <prospect status="new">
102
+ <requestdate>2021-08-04T18:08:50+04:00</requestdate>
103
+ <vehicle interest="buy" status="new">
104
+ <year>2021</year>
105
+ <make>Ford</make>
106
+ <model>Raptor</model>
107
+ </vehicle>
108
+ </prospect>
109
+ </adf>
110
+ ```
111
+ Add Vehicle with tags
112
+
113
+ ```ruby
114
+ builder = AdfBuilder::Builder.new
115
+ builder.prospect.vehicles.add(2021, 'Toyota', 'Prius', {
116
+ interest: :sell,
117
+ status: :used,
118
+ vin: 'XXXXXXXXXX',
119
+ })
120
+ ```
121
+
122
+ Outputs
123
+
124
+ ```xml
125
+ <?ADF version="1.0"?>
126
+
127
+ <?xml version="1.0"?>
128
+ <adf>
129
+ <prospect status="new">
130
+ <requestdate>2021-08-04T18:16:31+04:00</requestdate>
131
+ <vehicle interest="sell" status="used">
132
+ <year>2021</year>
133
+ <make>Toyota</make>
134
+ <model>Prius</model>
135
+ <vin>XXXXXXXXXX</vin>
136
+ </vehicle>
137
+ </prospect>
138
+ </adf>
26
139
 
140
+ ```
141
+
142
+ Add Vendor
143
+
144
+ ```ruby
145
+ builder = AdfBuilder::Builder.new
146
+ builder.prospect.vendor.add('Dealer One', 'Manager Name', {
147
+ part: 'full',
148
+ type: 'individual'
149
+ }) # options for customer object that is required in vendor
150
+ ```
151
+
152
+ Outputs
153
+
154
+ ```xml
155
+ <?ADF version="1.0"?>
156
+
157
+ <?xml version="1.0"?>
158
+ <adf>
159
+ <prospect status="new">
160
+ <requestdate>2021-08-08T18:43:02+04:00</requestdate>
161
+ <customer/>
162
+ <vendor>
163
+ <vendorname>Dealer One</vendorname>
164
+ <contact>
165
+ <name part="full" type="individual">Manager Name</name>
166
+ </contact>
167
+ </vendor>
168
+ </prospect>
169
+ </adf>
170
+ ```
171
+
172
+ Add Contact with phone
173
+
174
+ ```ruby
175
+ builder = AdfBuilder::Builder.new
176
+ builder.prospect.customer.add('New Guy', {
177
+ part: 'full',
178
+ type: 'individual'
179
+ })
180
+ builder.prospect.customer.contact.add_phone('(555)-444-3333')
181
+ ```
182
+
183
+ Outputs
184
+
185
+ ```xml
186
+ <?ADF version="1.0"?>
187
+
188
+ <?xml version="1.0"?>
189
+ <adf>
190
+ <prospect status="new">
191
+ <requestdate>2021-08-08T18:44:45+04:00</requestdate>
192
+ <customer>
193
+ <contact>
194
+ <name part="full" type="individual">New Guy</name>
195
+ <phone>(555)-444-3333</phone>
196
+ </contact>
197
+ </customer>
198
+ <vendor/>
199
+ </prospect>
200
+ </adf>
201
+ ```
27
202
  ## Development
28
203
 
29
204
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
data/adf_builder.gemspec CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
8
8
  spec.authors = ["marcus.salinas"]
9
9
  spec.email = ["12.marcus.salinas@gmail.com"]
10
10
 
11
- spec.summary = "Create XML for the Auto-lead Date Format"
12
- spec.description = "Useful in order to easily create XML so in ADF format to send by email."
11
+ spec.summary = "Create XML for the Auto-base Date Format"
12
+ spec.description = "Easily create XML in ADF format to send by email."
13
13
  spec.homepage = "https://github.com/jippylong12/adf_builder"
14
14
  spec.license = "MIT"
15
15
  spec.required_ruby_version = ">= 2.4.0"
data/lib/adf_builder.rb CHANGED
@@ -1,24 +1,45 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'ox'
3
4
  require_relative "adf_builder/version"
4
- require_relative 'adf_builder/lead'
5
5
 
6
- require 'ox'
6
+ # CUSTOMER
7
+ require_relative 'adf_builder/customer/customer'
8
+
9
+ # BASE
10
+ require_relative 'adf_builder/base/base'
11
+ require_relative 'adf_builder/base/prospect'
12
+ require_relative 'adf_builder/base/request_date'
13
+
14
+ # SHARED
15
+ require_relative 'adf_builder/shared/id'
16
+ require_relative 'adf_builder/shared/contact'
17
+
18
+ # VEHICLES
19
+ require_relative 'adf_builder/vehicles/vehicles'
20
+
21
+ # VENDER
22
+ require_relative 'adf_builder/vendor/vendor'
7
23
 
8
24
  module AdfBuilder
9
25
  class Error < StandardError; end
10
26
  class Builder
11
27
  def initialize
12
28
  @doc = self.init_doc
13
- @lead = Lead.new(@doc)
29
+ @base = Base.new(@doc)
14
30
  end
15
31
 
16
- def lead
17
- @lead
32
+ def prospect
33
+ @base.prospect
34
+ end
35
+
36
+ # output the XML
37
+ def to_xml
38
+ Ox.dump(@doc, {})
18
39
  end
19
40
 
20
41
  # def an example of minimal XML taken from ADF spec file http://adfxml.info/adf_spec.pdf
21
- def minimal_xml
42
+ def minimal_lead
22
43
  adf = Ox::Element.new("adf")
23
44
 
24
45
  prospect = Ox::Element.new("prospect")
@@ -69,9 +90,6 @@ module AdfBuilder
69
90
  end
70
91
 
71
92
 
72
- private
73
-
74
-
75
93
  # all the files will start with this same header
76
94
  def init_doc
77
95
  doc = Ox::Document.new
@@ -82,6 +100,8 @@ module AdfBuilder
82
100
  instruct = Ox::Instruct.new(:xml)
83
101
  instruct[:version] = '1.0'
84
102
  doc << instruct
103
+ adf = Ox::Element.new("adf")
104
+ doc << adf
85
105
  doc
86
106
  end
87
107
  end
@@ -0,0 +1,13 @@
1
+ module AdfBuilder
2
+ class Base
3
+ # initialize the prospect, id, and requestdate node
4
+ def initialize(doc)
5
+ @doc = doc
6
+ @prospect = Prospect.new(@doc)
7
+ end
8
+
9
+ def prospect
10
+ @prospect
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,46 @@
1
+ module AdfBuilder
2
+ class Prospect
3
+ STATUSES = {
4
+ new: :new,
5
+ resend: :resend
6
+ }
7
+
8
+ def initialize(doc)
9
+ @doc = doc
10
+ @doc.adf << Ox::Element.new("prospect")
11
+ @prospect = @doc.adf.prospect
12
+ @prospect[:status] = STATUSES[:new]
13
+
14
+
15
+ @request_date = RequestDate.new(@prospect)
16
+ @vehicles = Vehicles.new(@prospect)
17
+ @customer = Customer.new(@prospect)
18
+ @vendor = Vendor.new(@prospect)
19
+ end
20
+
21
+ def request_date
22
+ @request_date
23
+ end
24
+
25
+ def vehicles
26
+ @vehicles
27
+ end
28
+
29
+ def customer
30
+ @customer
31
+ end
32
+
33
+ def vendor
34
+ @vendor
35
+ end
36
+
37
+ # set status to renew
38
+ def set_renew
39
+ @prospect[:status] = STATUSES[:resend]
40
+ end
41
+
42
+ def add_id(value, source=nil, sequence=1)
43
+ Id.new.add(@prospect, value, source, sequence)
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,20 @@
1
+ module AdfBuilder
2
+ class RequestDate
3
+ WITH_SYMBOLS = '%FT%T%:z'
4
+ WITHOUT_SYMBOLS = '%Y%m%dT%H%M%S%z'
5
+
6
+ def initialize(prospect_node)
7
+ @request_date_node = Ox::Element.new('requestdate')
8
+ @request_date_node << DateTime.now.strftime('%FT%T%:z')
9
+ prospect_node << @request_date_node
10
+ end
11
+
12
+ def update_val(datetime_value, format=1)
13
+ if format == 1
14
+ @request_date_node.replace_text(datetime_value.strftime(WITH_SYMBOLS))
15
+ elsif format == 2
16
+ @request_date_node.replace_text(datetime_value.strftime(WITHOUT_SYMBOLS))
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,27 @@
1
+ module AdfBuilder
2
+ class Customer
3
+ def initialize(prospect)
4
+ @customer = Ox::Element.new('customer')
5
+ @contact = nil
6
+
7
+ prospect << @customer
8
+ end
9
+
10
+ def contact
11
+ @contact
12
+ end
13
+
14
+ def add(name, opts={})
15
+ @contact = Contact.new(@customer, name, opts)
16
+ end
17
+
18
+ def add_id(index, value, source=nil, sequence=1)
19
+ if @prospect.locate("customer").empty?
20
+ false
21
+ else
22
+ Id.new.add(@prospect.customer(index), value, source, sequence)
23
+ end
24
+ end
25
+
26
+ end
27
+ end
@@ -0,0 +1,55 @@
1
+ module AdfBuilder
2
+ class Contact
3
+ VALID_PARAMETERS = {
4
+ name: [:part, :type, :primarycontact],
5
+ email: [:preferredcontact],
6
+ phone: [:type, :time, :preferredcontact]
7
+ }
8
+
9
+ PHONE_TYPES = [:phone, :fax, :cellphone, :pager]
10
+
11
+ def initialize(parent_node, name, opts={})
12
+ @contact = Ox::Element.new('contact') << (Ox::Element.new('name') << name)
13
+ parent_node << @contact
14
+
15
+ opts = whitelabel_opts(opts, :name)
16
+
17
+ if opts[:primary_contact]
18
+ @contact[:primarycontact] = opts[:primary_contact].to_s
19
+ end
20
+
21
+ opts.each do |k,v|
22
+ @contact.locate("name")[0][k] = v.to_s
23
+ end
24
+
25
+ end
26
+
27
+ def add_email(email, opts={})
28
+ @contact << (Ox::Element.new('email') << email)
29
+ opts = whitelabel_opts(opts, :phone)
30
+
31
+ opts.each do |k,v|
32
+ @contact.email[k] = v.to_s
33
+ end
34
+ end
35
+
36
+ def add_phone(phone, opts={})
37
+ @contact << (Ox::Element.new('phone') << phone)
38
+ opts = whitelabel_opts(opts, :phone)
39
+
40
+ opts.each do |k,v|
41
+ @contact.phone[k] = v.to_s
42
+ end
43
+ end
44
+
45
+
46
+
47
+
48
+ private
49
+
50
+ # clear out the opts that don't match valid keys
51
+ def whitelabel_opts(opts, key)
52
+ opts.slice(*VALID_PARAMETERS[key])
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,20 @@
1
+ module AdfBuilder
2
+ class Id
3
+ def initialize
4
+
5
+ end
6
+
7
+ # add id tag to the form
8
+ def add(parent_node, value, source=nil, sequence=1)
9
+ id_node = Ox::Element.new('id')
10
+ id_node << value
11
+ id_node[:sequence] = sequence
12
+
13
+ if source
14
+ id_node[:source] = source
15
+ end
16
+
17
+ parent_node.prepend_child(id_node)
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,69 @@
1
+ module AdfBuilder
2
+ class Vehicles
3
+ INTEREST_VALUES = {
4
+ buy: 'buy',
5
+ lease: 'lease',
6
+ sell: 'sell',
7
+ trade_in: 'trade-in',
8
+ test_drive: 'test-drive'
9
+ }
10
+
11
+ STATUS_VALUES = {
12
+ new: 'new',
13
+ used: 'used'
14
+ }
15
+
16
+ FREE_TEXT_OPTIONAL_TAGS = {
17
+ vin: :vin,
18
+ stock: :stock,
19
+ trim: :trim,
20
+ doors: :doors,
21
+ bodystyle: :bodystyle,
22
+ transmission: :transmission,
23
+ pricecomments: :pricecomments,
24
+ comments: :comments
25
+ }
26
+
27
+ def initialize(prospect)
28
+ @prospect = prospect
29
+ end
30
+
31
+ def add(year, make, model, tags={})
32
+ vehicle = Ox::Element.new('vehicle')
33
+
34
+ if tags[:interest]
35
+ interest = INTEREST_VALUES[tags[:interest].to_sym]
36
+ tags.delete(:interest)
37
+ vehicle[:interest] = interest
38
+ end
39
+
40
+ if tags[:status]
41
+ status = STATUS_VALUES[tags[:status].to_sym]
42
+ tags.delete(:status)
43
+ vehicle[:status] = status
44
+ end
45
+
46
+
47
+ vehicle << (Ox::Element.new('year') << year.to_s)
48
+ vehicle << (Ox::Element.new('make') << make)
49
+ vehicle << (Ox::Element.new('model') << model)
50
+
51
+ tags.each do |key, value|
52
+ if FREE_TEXT_OPTIONAL_TAGS.include? key.to_sym
53
+ vehicle << (Ox::Element.new(key.to_s) << value)
54
+ end
55
+ end
56
+
57
+ @prospect << vehicle
58
+ end
59
+
60
+ def add_id(index, value, source=nil, sequence=1)
61
+ if @prospect.locate("vehicle").empty? or @prospect.vehicle(index).nil?
62
+ false
63
+ else
64
+ Id.new.add(@prospect.vehicle(index), value, source, sequence)
65
+ end
66
+ end
67
+
68
+ end
69
+ end
@@ -0,0 +1,34 @@
1
+ module AdfBuilder
2
+ class Vendor
3
+ def initialize(prospect)
4
+ @vendor = Ox::Element.new('vendor')
5
+ @contact = nil
6
+ prospect << @vendor
7
+ end
8
+
9
+ def contact
10
+ @contact
11
+ end
12
+
13
+ def add(name, contact_name, opts={})
14
+ @vendor << (Ox::Element.new('vendorname') << name)
15
+ @contact = Contact.new(@vendor, contact_name, opts)
16
+ end
17
+
18
+ def add_url(url)
19
+ if @vendor.locate("url").size > 0
20
+ @vendor.remove_children(@vendor.url)
21
+ end
22
+ @vendor << (Ox::Element.new('url') << url)
23
+ end
24
+
25
+ def add_id(index, value, source=nil, sequence=1)
26
+ if @prospect.locate("vendor").empty?
27
+ false
28
+ else
29
+ Id.new.add(@prospect.vendor(index), value, source, sequence)
30
+ end
31
+ end
32
+
33
+ end
34
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module AdfBuilder
4
- VERSION = "0.0.1"
4
+ VERSION = "0.0.5"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: adf_builder
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - marcus.salinas
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-08-03 00:00:00.000000000 Z
11
+ date: 2021-08-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ox
@@ -24,7 +24,7 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '2.14'
27
- description: Useful in order to easily create XML so in ADF format to send by email.
27
+ description: Easily create XML in ADF format to send by email.
28
28
  email:
29
29
  - 12.marcus.salinas@gmail.com
30
30
  executables: []
@@ -45,7 +45,14 @@ files:
45
45
  - bin/console
46
46
  - bin/setup
47
47
  - lib/adf_builder.rb
48
- - lib/adf_builder/lead.rb
48
+ - lib/adf_builder/base/base.rb
49
+ - lib/adf_builder/base/prospect.rb
50
+ - lib/adf_builder/base/request_date.rb
51
+ - lib/adf_builder/customer/customer.rb
52
+ - lib/adf_builder/shared/contact.rb
53
+ - lib/adf_builder/shared/id.rb
54
+ - lib/adf_builder/vehicles/vehicles.rb
55
+ - lib/adf_builder/vendor/vendor.rb
49
56
  - lib/adf_builder/version.rb
50
57
  homepage: https://github.com/jippylong12/adf_builder
51
58
  licenses:
@@ -72,5 +79,5 @@ requirements: []
72
79
  rubygems_version: 3.1.4
73
80
  signing_key:
74
81
  specification_version: 4
75
- summary: Create XML for the Auto-lead Date Format
82
+ summary: Create XML for the Auto-base Date Format
76
83
  test_files: []
@@ -1,13 +0,0 @@
1
- require 'ox'
2
-
3
- module AdfBuilder
4
- class Lead
5
- def initialize(doc)
6
- @doc = doc
7
- end
8
-
9
- def base_xml
10
- Ox.dump(@doc, {})
11
- end
12
- end
13
- end