adf_builder 0.4.0 → 1.1.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.
data/lib/adf_builder.rb CHANGED
@@ -4,154 +4,22 @@ require "ox"
4
4
  require "json"
5
5
 
6
6
  require_relative "adf_builder/version"
7
-
8
- # CUSTOMER
9
- require_relative "adf_builder/customer/customer"
10
- require_relative "adf_builder/customer/timeframe"
11
-
12
- # BASE
13
- require_relative "adf_builder/base/base"
14
- require_relative "adf_builder/base/prospect"
15
- require_relative "adf_builder/base/request_date"
16
-
17
- # PROVIDER
18
- require_relative "adf_builder/provider/provider"
19
-
20
- # SHARED
21
- require_relative "adf_builder/shared/id"
22
- require_relative "adf_builder/shared/contact"
23
-
24
- # VEHICLES
25
- require_relative "adf_builder/vehicles/vehicles"
26
- require_relative "adf_builder/vehicles/colorcombinations"
27
- require_relative "adf_builder/vehicles/price"
28
-
29
- # VENDOR
30
- require_relative "adf_builder/vendor/vendor"
7
+ require_relative "adf_builder/validations"
8
+
9
+ # Nodes
10
+ require_relative "adf_builder/nodes/node"
11
+ require_relative "adf_builder/nodes/prospect"
12
+ require_relative "adf_builder/nodes/shared"
13
+ require_relative "adf_builder/nodes/vehicle"
14
+ require_relative "adf_builder/nodes/vehicle_nodes"
15
+ require_relative "adf_builder/nodes/customer"
16
+ require_relative "adf_builder/nodes/vendor"
17
+ require_relative "adf_builder/nodes/provider"
18
+
19
+ # Core
20
+ require_relative "adf_builder/serializer"
21
+ require_relative "adf_builder/dsl"
31
22
 
32
23
  module AdfBuilder
33
24
  class Error < StandardError; end
34
-
35
- class Builder
36
- def initialize
37
- @doc = init_doc
38
- @base = Base.new(@doc)
39
- end
40
-
41
- def prospect
42
- @base.prospect
43
- end
44
-
45
- # output the XML
46
- def to_xml
47
- Ox.dump(@doc, {})
48
- end
49
-
50
- # def an example of minimal XML taken from ADF spec file http://adfxml.info/adf_spec.pdf
51
- def minimal_lead
52
- prospect = Ox::Element.new("prospect")
53
-
54
- request_date = Ox::Element.new("requestdate")
55
- request_date << "2000-03-30T15:30:20-08:00"
56
-
57
- vehicle = Ox::Element.new("vehicle")
58
- year = Ox::Element.new("year")
59
- year << "1999"
60
-
61
- make = Ox::Element.new("make")
62
- make << "Chevrolet"
63
-
64
- model = Ox::Element.new("model")
65
- model << "Blazer"
66
-
67
- vehicle << year << make << model
68
-
69
- customer = Ox::Element.new("customer")
70
-
71
- contact = Ox::Element.new("contact")
72
-
73
- name = Ox::Element.new("name")
74
- name[:part] = "full"
75
- name << "John Doe"
76
-
77
- phone = Ox::Element.new("phone")
78
- phone << "393-999-3922"
79
-
80
- contact << name << phone
81
- customer << contact
82
-
83
- vendor = Ox::Element.new("vendor")
84
-
85
- contact = Ox::Element.new("contact")
86
- name = Ox::Element.new("name")
87
- name[:part] = "full"
88
- name << "Acura of Bellevue"
89
-
90
- contact << name
91
- vendor << contact
92
-
93
- prospect << request_date << vehicle << customer << vendor
94
- @doc.remove_children_by_path("adf/prospect")
95
- @doc.adf << prospect
96
- Ox.dump(@doc, {})
97
- end
98
-
99
- # go back to the initial structure
100
- def reset_doc
101
- @doc.adf.prospect.remove_children_by_path("*")
102
- end
103
-
104
- # all the files will start with this same header
105
- def init_doc
106
- doc = Ox::Document.new
107
- instruct = Ox::Instruct.new(:xml)
108
- instruct[:version] = "1.0"
109
- doc << instruct
110
- doc << Ox::Raw.new("")
111
- instruct = Ox::Instruct.new("ADF")
112
- instruct[:version] = "1.0"
113
- doc << instruct
114
- adf = Ox::Element.new("adf")
115
- doc << adf
116
- doc
117
- end
118
-
119
- # we will either create a new node with the value or replace the one if it is available
120
- def self.update_node(parent_node, key, value, params = {})
121
- key = key.to_s
122
- value = value.to_s
123
- if parent_node.locate(key).size.positive?
124
- node = parent_node.locate(key).first
125
- node.replace_text(value)
126
- else
127
- node = (Ox::Element.new(key) << value)
128
- parent_node << node
129
- end
130
-
131
- AdfBuilder::Builder.update_params(node, key, params)
132
- end
133
-
134
- # update the params by first checking if they are valid params and then checking if the values are valid if necessary
135
- def self.update_params(node, key, params)
136
- return true if params.empty?
137
-
138
- key = key.to_sym
139
- valid_values = params[:valid_values]
140
- valid_parameters = params[:valid_parameters]
141
- _params = AdfBuilder::Builder.whitelabel_params(params, valid_parameters, key)
142
- _params.each do |k, v|
143
- node[k] = v if (valid_values[key][k] == true) || valid_values[key][k].include?(v.to_s)
144
- end
145
- end
146
-
147
- # clear out the opts that don't match valid keys
148
- def self.whitelabel_params(opts, valid_parameters, key)
149
- opts.slice(*valid_parameters[key])
150
- end
151
-
152
- def self.valid_child?(parent, tag_name, index)
153
- child = parent.locate(tag_name)[index]
154
- [!child.nil?, child]
155
- end
156
- end
157
25
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: adf_builder
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - marcus.salinas
@@ -23,6 +23,20 @@ dependencies:
23
23
  - - "~>"
24
24
  - !ruby/object:Gem::Version
25
25
  version: '2.14'
26
+ - !ruby/object:Gem::Dependency
27
+ name: nokogiri
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '1.15'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '1.15'
26
40
  - !ruby/object:Gem::Dependency
27
41
  name: rake
28
42
  requirement: !ruby/object:Gem::Requirement
@@ -86,19 +100,18 @@ files:
86
100
  - bin/console
87
101
  - bin/setup
88
102
  - lib/adf_builder.rb
89
- - lib/adf_builder/base/base.rb
90
- - lib/adf_builder/base/prospect.rb
91
- - lib/adf_builder/base/request_date.rb
92
- - lib/adf_builder/customer/customer.rb
93
- - lib/adf_builder/customer/timeframe.rb
94
103
  - lib/adf_builder/data/iso-4217-currency-codes.json
95
- - lib/adf_builder/provider/provider.rb
96
- - lib/adf_builder/shared/contact.rb
97
- - lib/adf_builder/shared/id.rb
98
- - lib/adf_builder/vehicles/colorcombinations.rb
99
- - lib/adf_builder/vehicles/price.rb
100
- - lib/adf_builder/vehicles/vehicles.rb
101
- - lib/adf_builder/vendor/vendor.rb
104
+ - lib/adf_builder/dsl.rb
105
+ - lib/adf_builder/nodes/customer.rb
106
+ - lib/adf_builder/nodes/node.rb
107
+ - lib/adf_builder/nodes/prospect.rb
108
+ - lib/adf_builder/nodes/provider.rb
109
+ - lib/adf_builder/nodes/shared.rb
110
+ - lib/adf_builder/nodes/vehicle.rb
111
+ - lib/adf_builder/nodes/vehicle_nodes.rb
112
+ - lib/adf_builder/nodes/vendor.rb
113
+ - lib/adf_builder/serializer.rb
114
+ - lib/adf_builder/validations.rb
102
115
  - lib/adf_builder/version.rb
103
116
  homepage: https://github.com/jippylong12/adf_builder
104
117
  licenses:
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module AdfBuilder
4
- class Base
5
- # initialize the prospect, id, and requestdate node
6
- def initialize(doc)
7
- @doc = doc
8
- @prospect = Prospect.new(@doc)
9
- end
10
-
11
- attr_reader :prospect
12
- end
13
- end
@@ -1,34 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module AdfBuilder
4
- class Prospect
5
- STATUSES = {
6
- new: :new,
7
- resend: :resend
8
- }.freeze
9
-
10
- def initialize(doc)
11
- @doc = doc
12
- @doc.adf << Ox::Element.new("prospect")
13
- @prospect = @doc.adf.prospect
14
- @prospect[:status] = STATUSES[:new]
15
-
16
- @request_date = RequestDate.new(@prospect)
17
- @vehicles = Vehicles.new(@prospect)
18
- @customer = Customer.new(@prospect)
19
- @vendor = Vendor.new(@prospect)
20
- @provider = Provider.new(@prospect)
21
- end
22
-
23
- attr_reader :request_date, :vehicles, :customer, :vendor, :provider
24
-
25
- # set status to renew
26
- def set_renew
27
- @prospect[:status] = STATUSES[:resend]
28
- end
29
-
30
- def add_id(value, source = nil, sequence = 1)
31
- Id.new.add(@prospect, value, source, sequence)
32
- end
33
- end
34
- end
@@ -1,22 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module AdfBuilder
4
- class RequestDate
5
- WITH_SYMBOLS = "%FT%T%:z"
6
- WITHOUT_SYMBOLS = "%Y%m%dT%H%M%S%z"
7
-
8
- def initialize(prospect_node)
9
- @request_date_node = Ox::Element.new("requestdate")
10
- @request_date_node << DateTime.now.strftime("%FT%T%:z")
11
- prospect_node << @request_date_node
12
- end
13
-
14
- def update_val(datetime_value, format = 1)
15
- if format == 1
16
- @request_date_node.replace_text(datetime_value.strftime(WITH_SYMBOLS))
17
- elsif format == 2
18
- @request_date_node.replace_text(datetime_value.strftime(WITHOUT_SYMBOLS))
19
- end
20
- end
21
- end
22
- end
@@ -1,50 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module AdfBuilder
4
- class Customer
5
- def initialize(prospect)
6
- @customer = Ox::Element.new("customer")
7
- @contact = nil
8
- @timeframe = nil
9
-
10
- prospect << @customer
11
- end
12
-
13
- attr_reader :contact, :timeframe
14
-
15
- def add(name, opts = {})
16
- @contact = Contact.new(@customer, name, opts)
17
- end
18
-
19
- def add_id(index, value, source = nil, sequence = 1)
20
- if @prospect.locate("customer").empty?
21
- false
22
- else
23
- Id.new.add(@prospect.customer(index), value, source, sequence)
24
- end
25
- end
26
-
27
- # @param descriptin [String] - Description of customer’s timing intention.
28
- # @param earliest_date [DateTime] - Earliest date customer is interested in. If timeframe tag
29
- # is present, it is required to specify earliestdate and/or
30
- # latestdate
31
- # @param latest_date [DateTime] - Latest date customer is interested in. If timeframe tag
32
- # is present, it is required to specify earliestdate and/or
33
- # latestdate
34
- def add_timeframe(description, earliest_date = nil, latest_date = nil)
35
- return false if earliest_date.nil? && latest_date.nil?
36
-
37
- return false if earliest_date && (earliest_date.class != DateTime)
38
-
39
- return false if latest_date && (latest_date.class != DateTime)
40
-
41
- @timeframe = Timeframe.new(@customer, description, earliest_date, latest_date) if @timeframe.nil?
42
- end
43
-
44
- def update_comments(comments)
45
- return false if comments.class != String
46
-
47
- AdfBuilder::Builder.update_node(@customer, :comments, comments)
48
- end
49
- end
50
- end
@@ -1,44 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module AdfBuilder
4
- class Timeframe
5
- def initialize(customer, description, earliest_date, latest_date)
6
- begin
7
- earliest_date = earliest_date.strftime("%FT%T%:z") if earliest_date
8
- latest_date = latest_date.strftime("%FT%T%:z") if latest_date
9
- rescue StandardError
10
- return nil
11
- end
12
-
13
- @timeframe = Ox::Element.new("timeframe")
14
-
15
- @timeframe << (Ox::Element.new("description") << description)
16
- @timeframe << (Ox::Element.new("earliestdate") << earliest_date) if earliest_date
17
- @timeframe << (Ox::Element.new("latestdate") << latest_date) if latest_date
18
- customer << @timeframe
19
- end
20
-
21
- def update_description(description)
22
- AdfBuilder::Builder.update_node(@timeframe, :description, description)
23
- end
24
-
25
- def update_earliest_date(date)
26
- begin
27
- date = date.strftime("%FT%T%:z")
28
- rescue StandardError
29
- return false
30
- end
31
- AdfBuilder::Builder.update_node(@timeframe, :earliestdate, date)
32
- end
33
-
34
- def update_latest_date(date)
35
- begin
36
- date = date.strftime("%FT%T%:z")
37
- rescue StandardError
38
- return false
39
- end
40
-
41
- AdfBuilder::Builder.update_node(@timeframe, :latestdate, date)
42
- end
43
- end
44
- end
@@ -1,53 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module AdfBuilder
4
- class Provider
5
- FREE_TEXT_OPTIONAL_TAGS = %i[service url].freeze
6
-
7
- def initialize(prospect)
8
- @prospect = prospect
9
- @provider = nil
10
- @contact = nil
11
- end
12
-
13
- attr_reader :contact
14
-
15
- def add(name, params = {})
16
- @provider = Ox::Element.new("provider")
17
- params.merge!({ valid_values: AdfBuilder::Contact::VALID_VALUES,
18
- valid_parameters: AdfBuilder::Contact::VALID_PARAMETERS })
19
- AdfBuilder::Builder.update_node(@provider, :name, name, params)
20
- @prospect << @provider
21
- end
22
-
23
- def add_contact(name, opts = {})
24
- @contact = Contact.new(@provider, name, opts)
25
- end
26
-
27
- def add_phone(phone, params = {})
28
- params.merge!({ valid_values: AdfBuilder::Contact::VALID_VALUES,
29
- valid_parameters: AdfBuilder::Contact::VALID_PARAMETERS })
30
- AdfBuilder::Builder.update_node(@provider, :phone, phone, params)
31
- end
32
-
33
- def add_email(email, params = {})
34
- params.merge!({ valid_values: AdfBuilder::Contact::VALID_VALUES,
35
- valid_parameters: AdfBuilder::Contact::VALID_PARAMETERS })
36
- AdfBuilder::Builder.update_node(@provider, :email, email, params)
37
- end
38
-
39
- def update_tags_with_free_text(tags)
40
- tags.each do |key, value|
41
- AdfBuilder::Builder.update_node(@provider, key, value) if FREE_TEXT_OPTIONAL_TAGS.include? key.to_sym
42
- end
43
- end
44
-
45
- def add_id(index, value, source = nil, sequence = 1)
46
- if @prospect.locate("provider").empty?
47
- false
48
- else
49
- Id.new.add(@prospect.provider(index), value, source, sequence)
50
- end
51
- end
52
- end
53
- end
@@ -1,44 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module AdfBuilder
4
- class Contact
5
- VALID_PARAMETERS = {
6
- name: %i[part type primarycontact],
7
- email: [:preferredcontact],
8
- phone: %i[type time preferredcontact]
9
- }.freeze
10
-
11
- VALID_VALUES = {
12
- name: {
13
- part: %w[first middle suffix last full],
14
- type: %w[individual business],
15
- primarycontact: %w[0 1]
16
- },
17
- email: {
18
- preferredcontact: %w[0 1]
19
- },
20
- phone: {
21
- preferredcontact: %w[0 1],
22
- type: %w[phone fax cellphone pager],
23
- time: %w[morning afternoon evening nopreference day]
24
- }
25
- }.freeze
26
-
27
- def initialize(parent_node, name, params = {})
28
- @contact = Ox::Element.new("contact")
29
- params.merge!({ valid_values: VALID_VALUES, valid_parameters: VALID_PARAMETERS })
30
- AdfBuilder::Builder.update_node(@contact, :name, name, params)
31
- parent_node << @contact
32
- end
33
-
34
- def add_phone(phone, params = {})
35
- params.merge!({ valid_values: VALID_VALUES, valid_parameters: VALID_PARAMETERS })
36
- AdfBuilder::Builder.update_node(@contact, :phone, phone, params)
37
- end
38
-
39
- def add_email(email, params = {})
40
- params.merge!({ valid_values: VALID_VALUES, valid_parameters: VALID_PARAMETERS })
41
- AdfBuilder::Builder.update_node(@contact, :email, email, params)
42
- end
43
- end
44
- end
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module AdfBuilder
4
- class Id
5
- def initialize; 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
- id_node[:source] = source if source
14
-
15
- parent_node.prepend_child(id_node)
16
- end
17
- end
18
- end
@@ -1,30 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module AdfBuilder
4
- class ColorCombinations
5
- FREE_TEXT_OPTIONAL_TAGS = %i[interiorcolor exteriorcolor preference].freeze
6
-
7
- def initialize(vehicle)
8
- @vehicle = vehicle
9
- @color_combination = nil
10
- end
11
-
12
- def add(interior_color, exterior_color, preference)
13
- @color_combination = Ox::Element.new("colorcombination")
14
- @color_combination <<
15
- (Ox::Element.new("interiorcolor") << interior_color) <<
16
- (Ox::Element.new("exteriorcolor") << exterior_color) <<
17
- (Ox::Element.new("preference") << preference.to_s)
18
- @vehicle << @color_combination
19
- end
20
-
21
- def update_tags(index, tags)
22
- valid, vehicle = AdfBuilder::Builder.valid_child?(@vehicle, "colorcombination", index)
23
- return unless valid
24
-
25
- tags.each do |key, value|
26
- AdfBuilder::Builder.update_node(vehicle, key, value) if FREE_TEXT_OPTIONAL_TAGS.include? key.to_sym
27
- end
28
- end
29
- end
30
- end
@@ -1,43 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module AdfBuilder
4
- class Price
5
- VALID_PARAMETERS = {
6
- price: %i[type currency delta relativeto source]
7
- }.freeze
8
-
9
- VALID_VALUES = {
10
- price: {
11
- type: %w[quote offer msrp invoice call appraisal asking],
12
- currency: true,
13
- delta: %w[absolute relative percentage],
14
- relativeto: %w[msrp invoice],
15
- source: true
16
- }
17
- }.freeze
18
-
19
- def initialize(parent_node, value, params = {})
20
- @parent_node = parent_node
21
- params.merge!({ valid_values: VALID_VALUES, valid_parameters: VALID_PARAMETERS })
22
- validate_currency(params)
23
- AdfBuilder::Builder.update_node(@parent_node, :price, value, params)
24
- @price = @parent_node.price
25
- end
26
-
27
- def update(value, params = {})
28
- params.merge!({ valid_values: VALID_VALUES, valid_parameters: VALID_PARAMETERS })
29
- AdfBuilder::Builder.update_node(@parent_node, :price, value, params)
30
- end
31
-
32
- def validate_currency(params)
33
- code = params[:currency]
34
- return unless code
35
-
36
- json = JSON.parse(File.read("./lib/adf_builder/data/iso-4217-currency-codes.json"))
37
- codes = json.map { |j| j["Alphabetic_Code"] }.reject(&:nil?)
38
- return if codes.include? code
39
-
40
- params.delete(:currency)
41
- end
42
- end
43
- end