veeqo 0.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.
- checksums.yaml +7 -0
- data/.gitignore +10 -0
- data/.hound.yml +3 -0
- data/.rspec +1 -0
- data/.rubocop.yml +629 -0
- data/.sample.pryrc +4 -0
- data/.travis.yml +5 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +574 -0
- data/Rakefile +6 -0
- data/bin/console +10 -0
- data/bin/rspec +17 -0
- data/bin/setup +8 -0
- data/lib/veeqo.rb +16 -0
- data/lib/veeqo/actions/base.rb +13 -0
- data/lib/veeqo/actions/delete.rb +11 -0
- data/lib/veeqo/actions/find.rb +11 -0
- data/lib/veeqo/actions/list.rb +11 -0
- data/lib/veeqo/allocation.rb +32 -0
- data/lib/veeqo/base.rb +26 -0
- data/lib/veeqo/company.rb +17 -0
- data/lib/veeqo/configuration.rb +17 -0
- data/lib/veeqo/customer.rb +24 -0
- data/lib/veeqo/delivery_method.rb +19 -0
- data/lib/veeqo/errors.rb +30 -0
- data/lib/veeqo/errors/forbidden.rb +9 -0
- data/lib/veeqo/errors/request_error.rb +15 -0
- data/lib/veeqo/errors/server_error.rb +9 -0
- data/lib/veeqo/errors/unauthorized.rb +9 -0
- data/lib/veeqo/order.rb +25 -0
- data/lib/veeqo/product.rb +25 -0
- data/lib/veeqo/purchase_order.rb +11 -0
- data/lib/veeqo/request.rb +89 -0
- data/lib/veeqo/response.rb +27 -0
- data/lib/veeqo/shipment.rb +30 -0
- data/lib/veeqo/store.rb +19 -0
- data/lib/veeqo/supplier.rb +19 -0
- data/lib/veeqo/version.rb +3 -0
- data/lib/veeqo/warehouse.rb +19 -0
- data/spec/fixtures/allocation_created.json +554 -0
- data/spec/fixtures/company.json +3 -0
- data/spec/fixtures/customer.json +4 -0
- data/spec/fixtures/customer_created.json +15 -0
- data/spec/fixtures/customers.json +38 -0
- data/spec/fixtures/delivery_method.json +3 -0
- data/spec/fixtures/delivery_method_created.json +4 -0
- data/spec/fixtures/delivery_methods.json +5 -0
- data/spec/fixtures/empty.json +0 -0
- data/spec/fixtures/order.json +3 -0
- data/spec/fixtures/order_created.json +554 -0
- data/spec/fixtures/orders.json +5 -0
- data/spec/fixtures/ping.json +3 -0
- data/spec/fixtures/product.json +4 -0
- data/spec/fixtures/product_created.json +137 -0
- data/spec/fixtures/products.json +5 -0
- data/spec/fixtures/purchase_orders.json +177 -0
- data/spec/fixtures/shipment_created.json +19 -0
- data/spec/fixtures/store.json +3 -0
- data/spec/fixtures/store_created.json +4 -0
- data/spec/fixtures/stores.json +5 -0
- data/spec/fixtures/supplier.json +3 -0
- data/spec/fixtures/supplier_created.json +4 -0
- data/spec/fixtures/suppliers.json +5 -0
- data/spec/fixtures/warehouse.json +3 -0
- data/spec/fixtures/warehouse_created.json +4 -0
- data/spec/fixtures/warehouses.json +5 -0
- data/spec/spec_helper.rb +15 -0
- data/spec/support/fake_veeqo_api.rb +408 -0
- data/spec/veeqo/actions/list_spec.rb +38 -0
- data/spec/veeqo/allocation_spec.rb +49 -0
- data/spec/veeqo/base_spec.rb +23 -0
- data/spec/veeqo/company_spec.rb +23 -0
- data/spec/veeqo/configuration_spec.rb +24 -0
- data/spec/veeqo/customer_spec.rb +77 -0
- data/spec/veeqo/delivery_method_spec.rb +65 -0
- data/spec/veeqo/order_spec.rb +93 -0
- data/spec/veeqo/product_spec.rb +82 -0
- data/spec/veeqo/purchase_order_spec.rb +14 -0
- data/spec/veeqo/request_spec.rb +40 -0
- data/spec/veeqo/shipment_spec.rb +38 -0
- data/spec/veeqo/store_spec.rb +61 -0
- data/spec/veeqo/supplier_spec.rb +61 -0
- data/spec/veeqo/warehouse_spec.rb +61 -0
- data/veeqo.gemspec +26 -0
- metadata +198 -0
@@ -0,0 +1,38 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
RSpec.describe Veeqo::Actions::List do
|
4
|
+
describe ".list" do
|
5
|
+
context "without any filter arguments" do
|
6
|
+
it "retrieves the list of all items" do
|
7
|
+
stub_veeqo_product_list_api
|
8
|
+
|
9
|
+
items = TestProduct.list
|
10
|
+
|
11
|
+
expect(items.count).to eq(1)
|
12
|
+
expect(items.first.id).not_to be_nil
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
context "with custom filter arguments" do
|
17
|
+
it "retrieves the list of filterred item" do
|
18
|
+
filters = { page: 1, page_size: 10 }
|
19
|
+
|
20
|
+
stub_veeqo_product_list_api(filters)
|
21
|
+
items = TestProduct.list(filters)
|
22
|
+
|
23
|
+
expect(items.count).to eq(1)
|
24
|
+
expect(items.first.id).not_to be_nil
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class TestProduct < Veeqo::Base
|
30
|
+
include Veeqo::Actions::List
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def end_point
|
35
|
+
"products"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
RSpec.describe Veeqo::Allocation do
|
4
|
+
describe ".create" do
|
5
|
+
it "creates a new allocation" do
|
6
|
+
stub_veeqo_allocation_create_api(allocation_attributes)
|
7
|
+
allocation = Veeqo::Allocation.create(allocation_attributes)
|
8
|
+
|
9
|
+
expect(allocation.id).not_to be_nil
|
10
|
+
expect(allocation.line_items.first.sellable.id).to eq(1226615)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe ".update" do
|
15
|
+
it "updates an existing allocation" do
|
16
|
+
allocation_id = 123_456
|
17
|
+
|
18
|
+
stub_veeqo_allocation_update_api(allocation_id, allocation_attributes)
|
19
|
+
allocation_update = Veeqo::Allocation.update(
|
20
|
+
allocation_id, allocation_attributes
|
21
|
+
)
|
22
|
+
|
23
|
+
expect(allocation_update.successful?).to be_truthy
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe ".delete" do
|
28
|
+
it "deletes the specified allocation" do
|
29
|
+
order_id = 123_456
|
30
|
+
allocation_id = 456_789
|
31
|
+
|
32
|
+
stub_veeqo_allocation_delete_api(order_id, allocation_id)
|
33
|
+
allocation_delete = Veeqo::Allocation.delete(order_id, allocation_id)
|
34
|
+
|
35
|
+
expect(allocation_delete.successful?).to be_truthy
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def allocation_attributes
|
40
|
+
{
|
41
|
+
order_id: 447452,
|
42
|
+
warehouse_id: 5,
|
43
|
+
line_items: [{
|
44
|
+
sellable_id: 1226615,
|
45
|
+
quantity: 1,
|
46
|
+
}],
|
47
|
+
}
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
RSpec.describe Veeqo::Base do
|
4
|
+
describe ".method_missing" do
|
5
|
+
context "with existing instance method" do
|
6
|
+
it "creates a new instace and invoke the method" do
|
7
|
+
expect(InheritedBase.valid?).to be_truthy
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
context "with non existing instance method" do
|
12
|
+
it "raise an default method error" do
|
13
|
+
expect { InheritedBase.invalid_method }.to raise_error(NoMethodError)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class InheritedBase < Veeqo::Base
|
19
|
+
def valid?
|
20
|
+
true
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
RSpec.describe Veeqo::Company do
|
4
|
+
describe ".find" do
|
5
|
+
it "retrieves the current company" do
|
6
|
+
stub_veeqo_company_find_api
|
7
|
+
company = Veeqo::Company.find
|
8
|
+
|
9
|
+
expect(company.name).not_to be_nil
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe ".update" do
|
14
|
+
it "updates the current company with new attributes" do
|
15
|
+
new_attributes = { name: "ACME" }
|
16
|
+
|
17
|
+
stub_veeqo_company_update_api(new_attributes)
|
18
|
+
company_update = Veeqo::Company.update(new_attributes)
|
19
|
+
|
20
|
+
expect(company_update.successful?).to be_truthy
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
RSpec.describe Veeqo::Configuration do
|
4
|
+
describe ".configuration" do
|
5
|
+
it "returns the client configuration object" do
|
6
|
+
veeqo_api_host = "api.veeqo.com"
|
7
|
+
configuration = Veeqo.configuration
|
8
|
+
|
9
|
+
expect(configuration.api_host).to eq(veeqo_api_host)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe ".configure" do
|
14
|
+
it "allows user to cofigure their keys" do
|
15
|
+
veeqo_api_key = "VEEQO_API_KEY"
|
16
|
+
|
17
|
+
Veeqo.configure do |config|
|
18
|
+
config.api_key = veeqo_api_key
|
19
|
+
end
|
20
|
+
|
21
|
+
expect(Veeqo.configuration.api_key).to eq(veeqo_api_key)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
RSpec.describe Veeqo::Customer do
|
4
|
+
describe ".list" do
|
5
|
+
it "retrieves the list of all customers" do
|
6
|
+
filters = { page: 1, page_size: 12 }
|
7
|
+
|
8
|
+
stub_veeqo_customer_list_api(filters)
|
9
|
+
customers = Veeqo::Customer.list(filters)
|
10
|
+
|
11
|
+
expect(customers.count).to eq(1)
|
12
|
+
expect(customers.first.id).not_to be_nil
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe ".find" do
|
17
|
+
it "retrives the details for a customer" do
|
18
|
+
customer_id = 123
|
19
|
+
|
20
|
+
stub_veeqo_customer_find_api(customer_id)
|
21
|
+
customer = Veeqo::Customer.find(customer_id)
|
22
|
+
|
23
|
+
expect(customer.id).to eq(123)
|
24
|
+
expect(customer.email).not_to be_nil
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe ".create" do
|
29
|
+
it "creates a new customer" do
|
30
|
+
stub_veeqo_customer_create_api(customer_attributes)
|
31
|
+
customer = Veeqo::Customer.create(customer_attributes)
|
32
|
+
|
33
|
+
expect(customer.id).to eq(123)
|
34
|
+
expect(customer.email).to eq(customer_attributes[:email])
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe ".update" do
|
39
|
+
it "updates the customer with new attributes" do
|
40
|
+
customer_id = 123
|
41
|
+
new_attributes = { email: "customer@example.com" }
|
42
|
+
|
43
|
+
stub_veeqo_customer_update_api(customer_id, new_attributes)
|
44
|
+
customer_update = Veeqo::Customer.update(customer_id, new_attributes)
|
45
|
+
|
46
|
+
expect(customer_update.successful?).to be_truthy
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe ".delete" do
|
51
|
+
it "deletes the specified customer" do
|
52
|
+
customer_id = 123
|
53
|
+
|
54
|
+
stub_veeqo_customer_delete_api(customer_id)
|
55
|
+
customer_deletion = Veeqo::Customer.delete(customer_id)
|
56
|
+
|
57
|
+
expect(customer_deletion.successful?).to be_truthy
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def customer_attributes
|
62
|
+
{
|
63
|
+
email: "customer@example.com",
|
64
|
+
phone: "01792 720740",
|
65
|
+
mobile: "07329023903",
|
66
|
+
billing_address: {
|
67
|
+
first_name: "John",
|
68
|
+
last_name: "Doe",
|
69
|
+
company: "FooBar Ltd",
|
70
|
+
address1: "221 High Street Lane",
|
71
|
+
city: "Swansea",
|
72
|
+
country: "GB",
|
73
|
+
zip: "SA1 1NW",
|
74
|
+
},
|
75
|
+
}
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
RSpec.describe Veeqo::DeliveryMethod do
|
4
|
+
describe ".list" do
|
5
|
+
it "retrieves all the develiery methods" do
|
6
|
+
filters = { page: 1, page_size: 12 }
|
7
|
+
|
8
|
+
stub_veeqo_delivery_method_list_api(filters)
|
9
|
+
delivery_methods = Veeqo::DeliveryMethod.list(filters)
|
10
|
+
|
11
|
+
expect(delivery_methods.count).to eq(1)
|
12
|
+
expect(delivery_methods.first.id).not_to be_nil
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe ".find" do
|
17
|
+
it "retrieves the details for a delivery method" do
|
18
|
+
delivery_method_id = 123
|
19
|
+
|
20
|
+
stub_veeqo_delivery_method_find_api(delivery_method_id)
|
21
|
+
delivery_method = Veeqo::DeliveryMethod.find(delivery_method_id)
|
22
|
+
|
23
|
+
expect(delivery_method.name).not_to be_nil
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe ".create" do
|
28
|
+
it "creates a new deliver method" do
|
29
|
+
attributes = { name: "Next Day Delivery" }
|
30
|
+
|
31
|
+
stub_veeqo_delivery_method_create_api(attributes)
|
32
|
+
delivery_method = Veeqo::DeliveryMethod.create(attributes)
|
33
|
+
|
34
|
+
expect(delivery_method.id).not_to be_nil
|
35
|
+
expect(delivery_method.name).to eq(attributes[:name])
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe ".update" do
|
40
|
+
it "updates a delivery method with new attributes" do
|
41
|
+
delivery_method_id = 123
|
42
|
+
new_attributes = { name: "Next Day Delivery" }
|
43
|
+
|
44
|
+
stub_veeqo_delivery_method_update_api(delivery_method_id, new_attributes)
|
45
|
+
delivery_method_update = Veeqo::DeliveryMethod.update(
|
46
|
+
delivery_method_id, new_attributes
|
47
|
+
)
|
48
|
+
|
49
|
+
expect(delivery_method_update.successful?).to be_truthy
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe ".delete" do
|
54
|
+
it "deletes a specific delivery method" do
|
55
|
+
delivery_method_id = 123
|
56
|
+
|
57
|
+
stub_veeqo_delivery_method_delete_api(delivery_method_id)
|
58
|
+
delivery_method_deletion = Veeqo::DeliveryMethod.delete(
|
59
|
+
delivery_method_id,
|
60
|
+
)
|
61
|
+
|
62
|
+
expect(delivery_method_deletion.successful?).to be_truthy
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
RSpec.describe Veeqo::Order do
|
4
|
+
describe ".list" do
|
5
|
+
it "retrives the all of the orders" do
|
6
|
+
filters = { page: "2", page_size: "25" }
|
7
|
+
|
8
|
+
stub_veeqo_order_list_api(filters)
|
9
|
+
orders = Veeqo::Order.list(filters)
|
10
|
+
|
11
|
+
expect(orders.count).to eq(1)
|
12
|
+
expect(orders.first.id).to eq(123)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe ".find" do
|
17
|
+
it "retrieves a specific order" do
|
18
|
+
order_id = 123
|
19
|
+
stub_veeqo_order_find_api(order_id)
|
20
|
+
order = Veeqo::Order.find(order_id)
|
21
|
+
|
22
|
+
expect(order.number).not_to be_nil
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe ".create" do
|
27
|
+
it "creates a new order" do
|
28
|
+
stub_veeqo_order_create_api(order_attributes)
|
29
|
+
order = Veeqo::Order.create(order_attributes)
|
30
|
+
|
31
|
+
expect(order.id).not_to be_nil
|
32
|
+
expect(order.deliver_to.first_name).to eq("Sky")
|
33
|
+
expect(order.payment.payment_type).not_to be_nil
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe ".update" do
|
38
|
+
it "updates the order with new attributes" do
|
39
|
+
order_id = 123
|
40
|
+
new_attributes = { number: "Inv #123" }
|
41
|
+
|
42
|
+
stub_veeqo_order_update_api(order_id, new_attributes)
|
43
|
+
order_update = Veeqo::Order.update(order_id, new_attributes)
|
44
|
+
|
45
|
+
expect(order_update.successful?).to be_truthy
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe ".delete" do
|
50
|
+
it "deletes a specific order" do
|
51
|
+
order_id = 123
|
52
|
+
stub_veeqo_order_delete_api(order_id)
|
53
|
+
order_delete = Veeqo::Order.delete(order_id)
|
54
|
+
|
55
|
+
expect(order_delete.successful?).to be_truthy
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def order_attributes
|
60
|
+
{
|
61
|
+
channel_id: "3525",
|
62
|
+
customer_id: "516208",
|
63
|
+
delivery_method_id: "92298",
|
64
|
+
deliver_to_attributes: {
|
65
|
+
address1: "294 queenstown road",
|
66
|
+
city: "london",
|
67
|
+
country: "GB",
|
68
|
+
customer_id: "516208",
|
69
|
+
first_name: "Sky",
|
70
|
+
last_name: "Schonhuber",
|
71
|
+
phone: "07734450718",
|
72
|
+
state: "london",
|
73
|
+
zip: "sw8 4lt",
|
74
|
+
},
|
75
|
+
deliver_to_id: "1086864",
|
76
|
+
line_items_attributes: [
|
77
|
+
{
|
78
|
+
price_per_unit: "13.99",
|
79
|
+
quantity: "1",
|
80
|
+
sellable_id: "1226615",
|
81
|
+
tax_rate: "0",
|
82
|
+
},
|
83
|
+
],
|
84
|
+
payment_attributes: {
|
85
|
+
payment_type: "bank_transfer",
|
86
|
+
reference_number: "123456789",
|
87
|
+
},
|
88
|
+
send_notification_email: "false",
|
89
|
+
total_discounts: "0",
|
90
|
+
total_tax: "0",
|
91
|
+
}
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
RSpec.describe Veeqo::Product do
|
4
|
+
describe ".list" do
|
5
|
+
it "retrieve the lists of products" do
|
6
|
+
product_filters = { page_size: 10 }
|
7
|
+
|
8
|
+
stub_veeqo_product_list_api(product_filters)
|
9
|
+
products = Veeqo::Product.list(product_filters)
|
10
|
+
|
11
|
+
expect(products.count).to eq(1)
|
12
|
+
expect(products.first.id).not_to be_nil
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe ".find" do
|
17
|
+
it "retrieves the specific product" do
|
18
|
+
product_id = 123
|
19
|
+
|
20
|
+
stub_veeqo_product_find_api(product_id)
|
21
|
+
product = Veeqo::Product.find(product_id)
|
22
|
+
|
23
|
+
expect(product.id).to eq(product_id)
|
24
|
+
expect(product.title).not_to be_nil
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe ".create" do
|
29
|
+
it "creates a new product" do
|
30
|
+
stub_veeqo_product_create_api(product_attributes)
|
31
|
+
product = Veeqo::Product.create(product_attributes)
|
32
|
+
|
33
|
+
expect(product.id).not_to be_nil
|
34
|
+
expect(product.title).to eq("T-Shirt")
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe ".update" do
|
39
|
+
it "updates the product with new attributes" do
|
40
|
+
product_id = 123
|
41
|
+
new_attributes = { title: "Best T Shirt" }
|
42
|
+
|
43
|
+
stub_veeqo_product_update_api(product_id, new_attributes)
|
44
|
+
product_update = Veeqo::Product.update(product_id, new_attributes)
|
45
|
+
|
46
|
+
expect(product_update.successful?).to be_truthy
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe ".delete" do
|
51
|
+
it "deletes the specific product" do
|
52
|
+
product_id = 123
|
53
|
+
stub_veeqo_product_delete_api(product_id)
|
54
|
+
product_delete = Veeqo::Product.delete(product_id)
|
55
|
+
|
56
|
+
expect(product_delete.successful?).to be_truthy
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def product_attributes
|
61
|
+
{
|
62
|
+
title: "T Shirt",
|
63
|
+
variants: [
|
64
|
+
{
|
65
|
+
cost_price: "10",
|
66
|
+
min_reorder_level: "0",
|
67
|
+
price: "15",
|
68
|
+
quantity_to_reorder: "0",
|
69
|
+
sku_code: "t-shirt-large",
|
70
|
+
tax_rate: "0",
|
71
|
+
title: "Large",
|
72
|
+
},
|
73
|
+
],
|
74
|
+
images: [
|
75
|
+
{
|
76
|
+
display_position: "1",
|
77
|
+
src: "http://veeqo.com/t-shirt.jpg",
|
78
|
+
},
|
79
|
+
],
|
80
|
+
}
|
81
|
+
end
|
82
|
+
end
|