second_amendment_wholesale 1.0.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 4c6dc62dec7aaa29aa9f7d791e5b6e2193c2227b00132705c27da2cf6aefd286
4
+ data.tar.gz: 431681c04ff0ee903be3ea997ded67e2a7b5ffafec75292cff7202148ebf66d0
5
+ SHA512:
6
+ metadata.gz: d42091bad047796546521ffd8f88b1ffc1c6f69f0b14a1213a5c806b742885e5000fa6220daca787e5544ca485a02774935874c9e2ea3696bb9c3b364ee58d3d
7
+ data.tar.gz: 4cf9df3bf699bcbeac456a651c24d04350f77aced813522bc61ff829dae91435a7eb40607049a7540d166ae0ec1aeea346b9b31fbebdfa947445be7bca2d42e7
@@ -0,0 +1,42 @@
1
+
2
+
3
+ # Ruby CircleCI 2.0 configuration file
4
+ #
5
+ # Check https://circleci.com/docs/2.0/language-ruby/ for more details
6
+ #
7
+ version: 2
8
+ jobs:
9
+ build:
10
+ docker:
11
+ # specify the version you desire here
12
+ - image: circleci/ruby:2.6.6-node-browsers
13
+
14
+ working_directory: ~/repo
15
+
16
+ steps:
17
+ - checkout
18
+
19
+ # Download and cache dependencies
20
+ - restore_cache:
21
+ keys:
22
+ - v1-dependencies-{{ checksum "second_amendment_wholesale.gemspec" }}
23
+ # fallback to using the latest cache if no exact match is found
24
+ - v1-dependencies-
25
+
26
+ - run:
27
+ name: install dependencies
28
+ command: |
29
+ bundle install --jobs=4 --retry=3 --path vendor/bundle
30
+ - save_cache:
31
+ paths:
32
+ - ./vendor/bundle
33
+ key: v1-dependencies-{{ checksum "Gemfile.lock" }}
34
+
35
+ # run tests!
36
+ - run:
37
+ name: run tests
38
+ command: |
39
+ mkdir /tmp/test-results
40
+ TEST_FILES="$(circleci tests glob "spec/**/*_spec.rb" | circleci tests split --split-by=timings)"
41
+
42
+ bundle exec rspec --format documentation $TEST_FILES
data/.gitignore ADDED
@@ -0,0 +1,12 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+ .vscode/
10
+
11
+ # rspec failure tracking
12
+ .rspec_status
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ second_amendment_wholesale
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.6.6
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source "https://rubygems.org"
2
+
3
+ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
+
5
+ # Specify your gem's dependencies in second_amendment_wholesale.gemspec
6
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,60 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ second_amendment_wholesale (0.1.0)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ activesupport (5.2.8.1)
10
+ concurrent-ruby (~> 1.0, >= 1.0.2)
11
+ i18n (>= 0.7, < 2)
12
+ minitest (~> 5.1)
13
+ tzinfo (~> 1.1)
14
+ addressable (2.8.1)
15
+ public_suffix (>= 2.0.2, < 6.0)
16
+ concurrent-ruby (1.2.0)
17
+ crack (0.4.5)
18
+ rexml
19
+ diff-lcs (1.5.0)
20
+ hashdiff (1.0.1)
21
+ i18n (1.12.0)
22
+ concurrent-ruby (~> 1.0)
23
+ minitest (5.17.0)
24
+ public_suffix (5.0.1)
25
+ rake (10.5.0)
26
+ rexml (3.2.5)
27
+ rspec (3.12.0)
28
+ rspec-core (~> 3.12.0)
29
+ rspec-expectations (~> 3.12.0)
30
+ rspec-mocks (~> 3.12.0)
31
+ rspec-core (3.12.1)
32
+ rspec-support (~> 3.12.0)
33
+ rspec-expectations (3.12.2)
34
+ diff-lcs (>= 1.2.0, < 2.0)
35
+ rspec-support (~> 3.12.0)
36
+ rspec-mocks (3.12.3)
37
+ diff-lcs (>= 1.2.0, < 2.0)
38
+ rspec-support (~> 3.12.0)
39
+ rspec-support (3.12.0)
40
+ thread_safe (0.3.6)
41
+ tzinfo (1.2.11)
42
+ thread_safe (~> 0.1)
43
+ webmock (2.3.2)
44
+ addressable (>= 2.3.6)
45
+ crack (>= 0.3.2)
46
+ hashdiff
47
+
48
+ PLATFORMS
49
+ ruby
50
+
51
+ DEPENDENCIES
52
+ activesupport (~> 5)
53
+ bundler (~> 1.17)
54
+ rake (~> 10.0)
55
+ rspec (~> 3.0)
56
+ second_amendment_wholesale!
57
+ webmock (~> 2.3)
58
+
59
+ BUNDLED WITH
60
+ 1.17.2
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2023 AmmoReady.com
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # SecondAmendmentWholesale
2
+
3
+ Ruby library for 2nd Amendment Wholesale's API
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "second_amendment_wholesale"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,70 @@
1
+ require 'net/http'
2
+
3
+ module SecondAmendmentWholesale
4
+ module API
5
+
6
+ ROOT_API_URL = 'https://staging.2ndamendmentwholesale.com/rest/V1'.freeze
7
+
8
+ def get_request(endpoint, headers = {})
9
+ request = Net::HTTP::Get.new(request_url(endpoint))
10
+
11
+ submit_request(request, {}, headers)
12
+ end
13
+
14
+ def post_request(endpoint, data = {}, headers = {})
15
+ request = Net::HTTP::Post.new(request_url(endpoint))
16
+
17
+ submit_request(request, data, headers)
18
+ end
19
+
20
+ def put_request(endpoint, data = {}, headers = {})
21
+ request = Net::HTTP::Put.new(request_url(endpoint))
22
+
23
+ submit_request(request, data, headers)
24
+ end
25
+
26
+ def delete_request(endpoint, headers = {})
27
+ request = Net::HTTP::Delete.new(request_url(endpoint))
28
+
29
+ submit_request(request, {}, headers)
30
+ end
31
+
32
+ private
33
+
34
+ def submit_request(request, data, headers)
35
+ set_request_headers(request, headers)
36
+
37
+ request.body = data.is_a?(Hash) ? data.to_json : data
38
+
39
+ process_request(request)
40
+ end
41
+
42
+ def process_request(request)
43
+ uri = URI(request.path)
44
+
45
+ response = Net::HTTP.start(uri.host, uri.port, SecondAmendmentWholesale.config.proxy_address, SecondAmendmentWholesale.config.proxy_port, use_ssl: true) do |http|
46
+ http.request(request)
47
+ end
48
+
49
+ SecondAmendmentWholesale::Response.new(response)
50
+ end
51
+
52
+ def set_request_headers(request, headers)
53
+ request['User-Agent'] = SecondAmendmentWholesale.config.user_agent
54
+
55
+ headers.each { |header, value| request[header] = value }
56
+ end
57
+
58
+ def auth_header(token)
59
+ { 'Authorization' => "Bearer #{token}" }
60
+ end
61
+
62
+ def content_type_header(type)
63
+ { 'Content-Type' => type }
64
+ end
65
+
66
+ def request_url(endpoint)
67
+ [ROOT_API_URL, endpoint].join('/')
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,27 @@
1
+ module SecondAmendmentWholesale
2
+ class Attribute < Base
3
+
4
+ include SecondAmendmentWholesale::API
5
+
6
+ def initialize(options = {})
7
+ requires!(options, :token)
8
+
9
+ @options = options
10
+ end
11
+
12
+ def self.all(options = {})
13
+ requires!(options, :token)
14
+
15
+ new(options).all
16
+ end
17
+
18
+ def all
19
+ headers = [
20
+ *auth_header(@options[:token]),
21
+ *content_type_header('application/json'),
22
+ ].to_h
23
+
24
+ get_request('feed/attributes', headers).body
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,26 @@
1
+ module SecondAmendmentWholesale
2
+ class Base
3
+
4
+ protected
5
+
6
+ def requires!(*args)
7
+ self.class.requires!(*args)
8
+ end
9
+
10
+ def self.requires!(hash, *params)
11
+ hash_keys = hash.collect { |k, v| v.is_a?(Array) ? [k, v.collect(&:keys)] : k }.flatten
12
+
13
+ params.each do |param|
14
+ if param.is_a?(Array)
15
+ raise ArgumentError.new("Missing required parameter: #{param.first}") unless hash_keys.include?(param.first)
16
+
17
+ valid_options = param[1..-1]
18
+ raise ArgumentError.new("Parameter: #{param.first} must be one of: #{valid_options.join(', ')}") unless valid_options.include?(hash[param.first])
19
+ else
20
+ raise ArgumentError.new("Missing required parameter: #{param}") unless hash_keys.include?(param)
21
+ end
22
+ end
23
+ end
24
+
25
+ end
26
+ end
@@ -0,0 +1,96 @@
1
+ module SecondAmendmentWholesale
2
+ class Catalog < Base
3
+
4
+ include SecondAmendmentWholesale::API
5
+
6
+ def initialize(options = {})
7
+ requires!(options, :token)
8
+
9
+ @options = options
10
+ @headers = [
11
+ *auth_header(@options[:token]),
12
+ *content_type_header('application/json'),
13
+ ].to_h
14
+
15
+ @categories = SecondAmendmentWholesale::Category.all(@options)
16
+ @attributes = SecondAmendmentWholesale::Attribute.all(@options)
17
+ end
18
+
19
+ def self.all(options = {})
20
+ requires!(options, :token)
21
+
22
+ new(options).all
23
+ end
24
+
25
+ def all
26
+ products = []
27
+
28
+ response = get_request("feed/productV2", @headers)
29
+
30
+ response.body.each do |item|
31
+ products << map_product(item) unless item[:allocated_closeout] == "Allocated"
32
+ end
33
+
34
+ products
35
+ end
36
+
37
+ private
38
+
39
+ def map_product(item)
40
+ {
41
+ name: item[:product_description],
42
+ model: item[:model],
43
+ upc: item[:upc],
44
+ long_description: item[:description],
45
+ short_description: item[:product_description],
46
+ category: get_category(item[:category_ids]),
47
+ price: item[:dealer_price],
48
+ map_price: item[:retail_map],
49
+ msrp: item[:retail_price],
50
+ quantity: item[:inventory_qty],
51
+ weight: item[:weight],
52
+ item_identifier: item[:stock_number],
53
+ brand: item[:manufacturer_name],
54
+ mfg_number: item[:mpn],
55
+ features: get_features(item[:stock_number]),
56
+ }
57
+ end
58
+
59
+ def get_category(category_ids)
60
+ categories = []
61
+
62
+ category_ids.each do |category_id|
63
+ categories << @categories.find { |category| category[:id] == category_id.to_i }
64
+ end
65
+
66
+ categories.compact.pluck(:name).join(" ")
67
+ end
68
+
69
+ def get_features(sku)
70
+ attributes = @attributes.find{ |attribute| attribute[:sku] == sku }
71
+
72
+ {
73
+ caliber: attributes[:caliber1],
74
+ action: attributes[:action_type],
75
+ barrel_type: attributes[:barrel_type],
76
+ barrel_length: attributes[:barrel_length],
77
+ capacity: attributes[:capacity],
78
+ finish: attributes[:finish_color],
79
+ length: attributes[:size],
80
+ frame: attributes[:frame_material],
81
+ safety: attributes[:safety],
82
+ sights: attributes[:sights],
83
+ stock_frame_grips: attributes[:stockFrameGrips],
84
+ magazine: attributes[:magazine],
85
+ chamber: attributes[:chamber],
86
+ casing: attributes[:finish_color],
87
+ feet_per_second: attributes[:feet_per_second],
88
+ grain: attributes[:grain_weight],
89
+ hand: attributes[:left],
90
+ model: attributes[:model1],
91
+ units_per_box: attributes[:units_per_box],
92
+ }
93
+ end
94
+
95
+ end
96
+ end
@@ -0,0 +1,56 @@
1
+ module SecondAmendmentWholesale
2
+ class Category < Base
3
+
4
+ include SecondAmendmentWholesale::API
5
+
6
+ #Excludes brands and other non-categories returned from 2AW's Categories endpoint
7
+ EXCLUDED_CATEGORY_IDS = [3, 26, 27]
8
+
9
+ def initialize(options = {})
10
+ requires!(options, :token)
11
+
12
+ @options = options
13
+ end
14
+
15
+ def self.all(options = {})
16
+ requires!(options, :token)
17
+
18
+ new(options).all
19
+ end
20
+
21
+ def all
22
+ headers = [
23
+ *auth_header(@options[:token]),
24
+ *content_type_header('application/json'),
25
+ ].to_h
26
+
27
+ response = get_request('categories', headers)
28
+
29
+ extract_categories(response.body[:children_data])
30
+ end
31
+
32
+ protected
33
+
34
+ def extract_categories(response, categories = [])
35
+ response.each do |category|
36
+ unless EXCLUDED_CATEGORY_IDS.include?(category[:id])
37
+ categories << map_hash(category) unless category[:name] == "Firearms"
38
+
39
+ if category[:children_data].present?
40
+ extract_categories(category[:children_data], categories)
41
+ end
42
+ end
43
+ end
44
+
45
+ categories
46
+ end
47
+
48
+ def map_hash(hash)
49
+ {
50
+ id: hash[:id],
51
+ name: hash[:name],
52
+ parent_id: hash[:parent_id],
53
+ }
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,11 @@
1
+ module SecondAmendmentWholesale
2
+ class Error < StandardError
3
+
4
+ class BadRequest < SecondAmendmentWholesale::Error; end
5
+ class NotAuthorized < SecondAmendmentWholesale::Error; end
6
+ class NotFound < SecondAmendmentWholesale::Error; end
7
+ class RequestError < SecondAmendmentWholesale::Error; end
8
+ class TimeoutError < SecondAmendmentWholesale::Error; end
9
+
10
+ end
11
+ end
@@ -0,0 +1,24 @@
1
+ module SecondAmendmentWholesale
2
+ class Image < Base
3
+
4
+ include SecondAmendmentWholesale::API
5
+
6
+ def initialize(options = {})
7
+ requires!(options, :token)
8
+ @options = options
9
+
10
+ @headers = [
11
+ *auth_header(@options[:token]),
12
+ *content_type_header('application/json'),
13
+ ].to_h
14
+ end
15
+
16
+ def url(item_number)
17
+ response = get_request("products/#{item_number}/media", @headers).body
18
+
19
+ return response.first[:file] if response.present?
20
+ nil
21
+ end
22
+
23
+ end
24
+ end
@@ -0,0 +1,46 @@
1
+ module SecondAmendmentWholesale
2
+ class Inventory < Base
3
+
4
+ include SecondAmendmentWholesale::API
5
+
6
+ def initialize(options = {})
7
+ requires!(options, :token)
8
+
9
+ @options = options
10
+ @headers = [
11
+ *auth_header(@options[:token]),
12
+ *content_type_header('application/json'),
13
+ ].to_h
14
+ end
15
+
16
+ def self.all(options = {})
17
+ requires!(options, :token)
18
+
19
+ new(options).all
20
+ end
21
+ class << self; alias_method :quantity, :all; end
22
+
23
+ def all
24
+ items = []
25
+
26
+ response = get_request("feed/stockV2", @headers)
27
+
28
+ response.body.each do |item|
29
+ items << map_hash(item)
30
+ end
31
+
32
+ items
33
+ end
34
+
35
+ private
36
+
37
+ def map_hash(item)
38
+ {
39
+ item_identifier: item[:sku],
40
+ quantity: item[:qty],
41
+ price: item[:dealer_price],
42
+ }
43
+ end
44
+
45
+ end
46
+ end
@@ -0,0 +1,140 @@
1
+ module SecondAmendmentWholesale
2
+ class Order < Base
3
+
4
+ include SecondAmendmentWholesale::API
5
+
6
+ ENDPOINTS = {
7
+ billing_address: 'customers/me/billingAddress'.freeze,
8
+ cart: 'carts/mine'.freeze,
9
+ customer_note: 'carts/mine/set-customer-note'.freeze,
10
+ items: 'carts/mine/items'.freeze,
11
+ licence: "carts/licence".freeze,
12
+ payment_information: 'carts/mine/payment-information'.freeze,
13
+ po_number: 'carts/mine/set-po-number'.freeze,
14
+ regions: 'directory/countries/US'.freeze,
15
+ shipping_information: 'carts/mine/shipping-information'.freeze,
16
+ shipping_methods: 'carts/mine/estimate-shipping-methods'.freeze,
17
+ }
18
+
19
+ def initialize(options = {})
20
+ requires!(options, :token)
21
+
22
+ @options = options
23
+ @headers = [
24
+ *auth_header(@options[:token]),
25
+ *content_type_header('application/json'),
26
+ ].to_h
27
+ end
28
+
29
+ def get_cart
30
+ endpoint = ENDPOINTS[:cart]
31
+
32
+ get_request(endpoint, @headers)
33
+ end
34
+
35
+ def create_cart
36
+ endpoint = ENDPOINTS[:cart]
37
+
38
+ post_request(endpoint, {}, @headers)
39
+ end
40
+
41
+ def delete_cart_items(cart_items)
42
+ responses = []
43
+
44
+ cart_items.each do |item|
45
+ responses << delete_request([ENDPOINTS[:items], item[:item_id]].join("/"), @headers).body
46
+ end
47
+
48
+ responses.all?
49
+ end
50
+
51
+ def add_cart_item(item)
52
+ endpoint = ENDPOINTS[:items]
53
+
54
+ post_request(endpoint, item, @headers)
55
+ end
56
+
57
+ def add_po_number(po_number, quote_id)
58
+ endpoint = ENDPOINTS[:po_number]
59
+
60
+ body = {
61
+ "cartId": "#{quote_id}",
62
+ "poNumber": {
63
+ "poNumber": "#{po_number}"
64
+ }
65
+ }
66
+
67
+ put_request(endpoint, body, @headers)
68
+ end
69
+
70
+ def get_regions
71
+ endpoint = ENDPOINTS[:regions]
72
+
73
+ get_request(endpoint, @headers)[:available_regions]
74
+ end
75
+
76
+ def get_shipping_methods(address)
77
+ endpoint = ENDPOINTS[:shipping_methods]
78
+
79
+ body = {
80
+ "address": address
81
+ }
82
+
83
+ post_request(endpoint, body, @headers)
84
+ end
85
+
86
+ def get_billing_address
87
+ endpoint = ENDPOINTS[:billing_address]
88
+
89
+ get_request(endpoint, @headers)
90
+ end
91
+
92
+ def add_shipping_information(address_info)
93
+ endpoint = ENDPOINTS[:shipping_information]
94
+
95
+ body = {
96
+ "address_information": address_info
97
+ }
98
+
99
+ post_request(endpoint, body, @headers)
100
+ end
101
+
102
+ def submit_payment(payment_method)
103
+ endpoint = ENDPOINTS[:payment_information]
104
+
105
+ body = {
106
+ "payment_method": {
107
+ "method": payment_method,
108
+ "extension_attributes": {
109
+ "agreement_ids": get_agreement_ids
110
+ }
111
+ }
112
+ }
113
+
114
+ post_request(endpoint, body, @headers)
115
+ end
116
+
117
+ def get_increment_id(order_id)
118
+ get_request("orders/#{order_id}", @headers)
119
+ end
120
+
121
+ def add_customer_note(customer_note)
122
+ body = {
123
+ "customerNote": {
124
+ "customer_note": customer_note
125
+ }
126
+ }
127
+
128
+ put_request(ENDPOINTS[:customer_note], body, @headers)
129
+ end
130
+
131
+ private
132
+
133
+ def get_agreement_ids
134
+ endpoint = ENDPOINTS[:licence]
135
+
136
+ get_request(endpoint, @headers).body.pluck(:agreement_id)
137
+ end
138
+
139
+ end
140
+ end
@@ -0,0 +1,40 @@
1
+ module SecondAmendmentWholesale
2
+ class Response
3
+
4
+ def initialize(response)
5
+ @response = response
6
+
7
+ case @response
8
+ when Net::HTTPUnauthorized
9
+ raise SecondAmendmentWholesale::Error::NotAuthorized.new(@response.body)
10
+ when Net::HTTPNotFound
11
+ raise SecondAmendmentWholesale::Error::NotFound.new(@response.body)
12
+ when Net::HTTPBadRequest
13
+ raise SecondAmendmentWholesale::Error::BadRequest.new(@response.body)
14
+ when Net::HTTPOK, Net::HTTPSuccess
15
+ _data = (JSON.parse(@response.body) if @response.body.present?)
16
+
17
+ @data = case
18
+ when _data.is_a?(Hash)
19
+ _data.deep_symbolize_keys
20
+ when _data.is_a?(Array)
21
+ _data.map(&:deep_symbolize_keys)
22
+ else
23
+ _data
24
+ end
25
+ else
26
+ raise SecondAmendmentWholesale::Error::RequestError.new(@response.body)
27
+ end
28
+
29
+ end
30
+
31
+ def [](key)
32
+ @data&.[](key)
33
+ end
34
+
35
+ def body
36
+ @data
37
+ end
38
+
39
+ end
40
+ end
@@ -0,0 +1,24 @@
1
+ module SecondAmendmentWholesale
2
+ class Shipping < Base
3
+
4
+ include SecondAmendmentWholesale::API
5
+
6
+ def initialize(options = {})
7
+ requires!(options, :token)
8
+
9
+ @options = options
10
+ @headers = [
11
+ *auth_header(@options[:token]),
12
+ *content_type_header('application/json'),
13
+ ].to_h
14
+ end
15
+
16
+ def fetch(since_date = nil)
17
+ since_date = (since_date || Time.now.prev_day).strftime('%Y/%m/%d')
18
+ endpoint = "shipmentsInformation/me?fromShipmentCreateAt=#{since_date}"
19
+
20
+ orders = get_request(endpoint, @headers)
21
+ end
22
+
23
+ end
24
+ end
@@ -0,0 +1,27 @@
1
+ module SecondAmendmentWholesale
2
+ class User < Base
3
+
4
+ include SecondAmendmentWholesale::API
5
+
6
+ def initialize(options = {})
7
+ requires!(options, :token)
8
+
9
+ @options = options
10
+ end
11
+
12
+ def authenticated?
13
+ headers = [
14
+ *auth_header(@options[:token]),
15
+ *content_type_header('application/json'),
16
+ ].to_h
17
+
18
+ response = get_request(
19
+ 'token/validate',
20
+ headers
21
+ )
22
+
23
+ response.body.present?
24
+ end
25
+
26
+ end
27
+ end
@@ -0,0 +1,3 @@
1
+ module SecondAmendmentWholesale
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,41 @@
1
+ require "second_amendment_wholesale/base"
2
+ require "second_amendment_wholesale/version"
3
+
4
+ require "second_amendment_wholesale/api"
5
+ require "second_amendment_wholesale/attribute"
6
+ require "second_amendment_wholesale/catalog"
7
+ require "second_amendment_wholesale/category"
8
+ require "second_amendment_wholesale/error"
9
+ require "second_amendment_wholesale/image"
10
+ require "second_amendment_wholesale/inventory"
11
+ require "second_amendment_wholesale/order"
12
+ require "second_amendment_wholesale/response"
13
+ require "second_amendment_wholesale/shipping"
14
+ require "second_amendment_wholesale/user"
15
+
16
+ module SecondAmendmentWholesale
17
+
18
+ class << self
19
+ attr_accessor :config
20
+ end
21
+
22
+ def self.config
23
+ @config ||= Configuration.new
24
+ end
25
+
26
+ def self.configure
27
+ yield(config)
28
+ end
29
+
30
+ class Configuration
31
+ attr_accessor :proxy_address
32
+ attr_accessor :proxy_port
33
+ attr_accessor :user_agent
34
+
35
+ def initialize
36
+ @proxy_address ||= nil
37
+ @proxy_port ||= nil
38
+ @user_agent ||= "SecondAmendmentWholesaleRubyGem/#{SecondAmendmentWholesale::VERSION}".freeze
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,30 @@
1
+ lib = File.expand_path("../lib", __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+
4
+ require "second_amendment_wholesale/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "second_amendment_wholesale"
8
+ spec.version = SecondAmendmentWholesale::VERSION
9
+ spec.authors = ["Kevin Brown"]
10
+ spec.email = ["brownkm531@gmail.com"]
11
+
12
+ spec.summary = %q{Ruby library for 2nd Amendment Wholesale's API.}
13
+ spec.description = %q{}
14
+ spec.homepage = ""
15
+ spec.license = "MIT"
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
18
+ f.match(%r{^(test|spec|features)/})
19
+ end
20
+
21
+ spec.bindir = "exe"
22
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
+ spec.require_paths = ["lib"]
24
+
25
+ spec.add_development_dependency "activesupport", "~> 5"
26
+ spec.add_development_dependency "bundler", "~> 1.17"
27
+ spec.add_development_dependency "rake", "~> 10.0"
28
+ spec.add_development_dependency "rspec", "~> 3.0"
29
+ spec.add_development_dependency "webmock", "~> 2.3"
30
+ end
metadata ADDED
@@ -0,0 +1,140 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: second_amendment_wholesale
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Kevin Brown
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2023-08-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '5'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '5'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.17'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.17'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: webmock
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '2.3'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '2.3'
83
+ description: ''
84
+ email:
85
+ - brownkm531@gmail.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - ".circleci/config.yml"
91
+ - ".gitignore"
92
+ - ".rspec"
93
+ - ".ruby-gemset"
94
+ - ".ruby-version"
95
+ - Gemfile
96
+ - Gemfile.lock
97
+ - LICENSE
98
+ - README.md
99
+ - Rakefile
100
+ - bin/console
101
+ - bin/setup
102
+ - lib/second_amendment_wholesale.rb
103
+ - lib/second_amendment_wholesale/api.rb
104
+ - lib/second_amendment_wholesale/attribute.rb
105
+ - lib/second_amendment_wholesale/base.rb
106
+ - lib/second_amendment_wholesale/catalog.rb
107
+ - lib/second_amendment_wholesale/category.rb
108
+ - lib/second_amendment_wholesale/error.rb
109
+ - lib/second_amendment_wholesale/image.rb
110
+ - lib/second_amendment_wholesale/inventory.rb
111
+ - lib/second_amendment_wholesale/order.rb
112
+ - lib/second_amendment_wholesale/response.rb
113
+ - lib/second_amendment_wholesale/shipping.rb
114
+ - lib/second_amendment_wholesale/user.rb
115
+ - lib/second_amendment_wholesale/version.rb
116
+ - second_amendment_wholesale.gemspec
117
+ homepage: ''
118
+ licenses:
119
+ - MIT
120
+ metadata: {}
121
+ post_install_message:
122
+ rdoc_options: []
123
+ require_paths:
124
+ - lib
125
+ required_ruby_version: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ version: '0'
130
+ required_rubygems_version: !ruby/object:Gem::Requirement
131
+ requirements:
132
+ - - ">="
133
+ - !ruby/object:Gem::Version
134
+ version: '0'
135
+ requirements: []
136
+ rubygems_version: 3.4.6
137
+ signing_key:
138
+ specification_version: 4
139
+ summary: Ruby library for 2nd Amendment Wholesale's API.
140
+ test_files: []