as_colour 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.
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AsColour
4
+ class AsColourError < StandardError
5
+ # attr_reader :error
6
+ # attr_reader :raw
7
+ # attr_reader :response_code
8
+
9
+ # def initialize(http_response)
10
+ # @raw = http_response
11
+ # @response_code = @raw.response_code
12
+
13
+ # data = process_response_body
14
+ # if data.nil?
15
+ # set_default_error_message
16
+ # else
17
+ # @error = data
18
+ # end
19
+ # end
20
+
21
+ # def error?
22
+ # true
23
+ # end
24
+
25
+ # def to_s
26
+ # return remove_extra_quotes(@error) if @error.is_a?(String)
27
+
28
+ # retval = @error.each_with_object([]) do |(key, value), str|
29
+ # str_value = value.is_a?(Array) ? value.join(', ') : value
30
+ # str_value = remove_extra_quotes(str_value)
31
+ # str << "#{key}: #{str_value}"
32
+ # end
33
+ # retval.join(', ')
34
+ # end
35
+ # alias message to_s
36
+
37
+ # private
38
+
39
+ # def remove_extra_quotes(str)
40
+ # str.tr('"', '')
41
+ # end
42
+
43
+ # def process_response_body
44
+ # JSON.parse(@raw.body, symbolize_names: true).to_snake_keys unless @raw.body.empty?
45
+ # rescue StandardError
46
+ # @raw.body.strip
47
+ # end
48
+
49
+ # def set_default_error_message
50
+ # require 'uri'
51
+ # api_path = URI.parse(@raw.effective_url).path
52
+ # @error = "ASColour API returned an error for #{api_path}."
53
+
54
+ # if @response_code == 401
55
+ # @error += ' Please check your credentials.'
56
+ # elsif @response_code == 404
57
+ # @error += ' Please check your API path.'
58
+ # end
59
+ # end
60
+ end
61
+ end
@@ -0,0 +1,13 @@
1
+ module AsColour
2
+ class Client
3
+ module Colours
4
+ def colours(args = {})
5
+ results = process_request(:get, 'catalog/colours', params: args)
6
+ return results if results.is_a?(AsColourError)
7
+
8
+ results[:data].map { |row| AsColour::Colour.new(row) }
9
+ end
10
+ alias list_colours colours
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,20 @@
1
+ module AsColour
2
+ class Client
3
+ module InventoryItems
4
+ def items(args = {})
5
+ results = process_request(:get, 'inventory/items', params: args)
6
+ return results if results.is_a?(AsColourError)
7
+
8
+ results[:data].map { |row| AsColour::InventoryItem.new(row) }
9
+ end
10
+ alias list_items items
11
+
12
+ def item(sku)
13
+ results = process_request(:get, "inventory/items/#{sku}")
14
+ return results if results.is_a?(AsColourError)
15
+
16
+ results[:data].map { |row| AsColour::InventoryItem.new(row) }
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,13 @@
1
+ module AsColour
2
+ class Client
3
+ module PriceList
4
+ def price_list(args = {})
5
+ args.merge!(auth_token_required: true)
6
+ results = process_request(:get, 'catalog/pricelist', params: args)
7
+ return results if results.is_a?(AsColourError)
8
+
9
+ results[:data].map { |row| AsColour::PriceListItem.new(row) }
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,33 @@
1
+ module AsColour
2
+ class Client
3
+ module ProductVariants
4
+ def product_variants(style_code, args = {})
5
+ results = process_request(:get, "catalog/products/#{style_code}/variants", params: args)
6
+ return results if results.is_a?(AsColourError)
7
+
8
+ results[:data].map { |row| AsColour::Product.new(row) }
9
+ end
10
+
11
+ def product_variant(style_code, variant_id)
12
+ result = process_request(:get, "catalog/products/#{style_code}/variants/#{variant_id}")
13
+ return result if result.is_a?(AsColourError)
14
+
15
+ AsColour::Product.new(result)
16
+ end
17
+
18
+ def product_variant_inventory(style_code, variant_id)
19
+ results = process_request(:get, "catalog/products/#{style_code}/variants/#{variant_id}/inventory")
20
+ return results if results.is_a?(AsColourError)
21
+
22
+ results[:data].map { |row| AsColour::ProductInventory.new(row) }
23
+ end
24
+
25
+ def product_variant_inventory_inbound(style_code, variant_id)
26
+ result = process_request(:get, "catalog/products/#{style_code}/variants/#{variant_id}/inbound")
27
+ return result if result.is_a?(AsColourError)
28
+
29
+ AsColour::Product.new(result)
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,27 @@
1
+ module AsColour
2
+ class Client
3
+ module Products
4
+ def products(args = {})
5
+ results = process_request(:get, 'catalog/products', params: args)
6
+ return results if results.is_a?(AsColourError)
7
+
8
+ results[:data].map { |row| AsColour::Product.new(row) }
9
+ end
10
+ alias list_products products
11
+
12
+ def product(style_code)
13
+ result = process_request(:get, "catalog/products/#{style_code}")
14
+ return result if result.is_a?(AsColourError)
15
+
16
+ AsColour::Product.new(result)
17
+ end
18
+
19
+ def product_images(style_code)
20
+ results = process_request(:get, "catalog/products/#{style_code}/images")
21
+ return results if results.is_a?(AsColourError)
22
+
23
+ results[:data].map { |row| AsColour::ProductImage.new(row) }
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,105 @@
1
+ require_relative 'client/colours'
2
+ require_relative 'client/products'
3
+ require_relative 'client/product_variants'
4
+ require_relative 'client/inventory_items'
5
+ require_relative 'client/price_list'
6
+
7
+ require_relative 'model/as_colour_model'
8
+ require_relative 'model/colour'
9
+ require_relative 'model/inventory_item'
10
+ require_relative 'model/price_list_item'
11
+ require_relative 'model/product'
12
+ require_relative 'model/product_image'
13
+ require_relative 'model/product_inventory'
14
+ require_relative 'model/product_variant'
15
+
16
+ module AsColour
17
+ class Client
18
+ include AsColour::Client::Colours
19
+ include AsColour::Client::Products
20
+ include AsColour::Client::ProductVariants
21
+ include AsColour::Client::InventoryItems
22
+ include AsColour::Client::PriceList
23
+
24
+ def initialize(auth = nil)
25
+ @auth = auth || load_from_environment
26
+
27
+ if @auth.nil?
28
+ raise AsColourError, 'API authentication incomplete! You need the subscription key.'
29
+ end
30
+ end
31
+
32
+ private
33
+
34
+ def as_colour_auth_headers(auth_token_required)
35
+ retval = {
36
+ 'Content-Type' => 'application/json',
37
+ 'charset' => 'utf-8',
38
+ 'Subscription-Key' => @auth[:subscription_key]
39
+ }
40
+ retval['Authorization'] = "Bearer #{process_auth_token_request}" if auth_token_required
41
+ retval
42
+ end
43
+
44
+ def load_from_environment
45
+ return if ENV['ASCOLOUR_SUBSCRIPTION_KEY'].nil?
46
+
47
+ {
48
+ subscription_key: ENV['ASCOLOUR_SUBSCRIPTION_KEY'],
49
+ email: ENV['ASCOLOUR_EMAIL'],
50
+ password: ENV['ASCOLOUR_PASSWORD']
51
+ }
52
+ end
53
+
54
+ def process_as_colour_response(response_body)
55
+ JSON.parse(response_body, symbolize_names: true).to_snake_keys
56
+ rescue
57
+ response_body
58
+ end
59
+
60
+ def process_auth_token_request
61
+ request_params = {
62
+ method: :post,
63
+ headers: as_colour_auth_headers(nil),
64
+ body: {
65
+ email: @auth[:email],
66
+ password: @auth[:password]
67
+ }.to_json
68
+ }
69
+
70
+ proxy = @auth[:proxy] || ENV['PROXY']
71
+ request_params[:proxy] = proxy unless proxy.nil?
72
+
73
+ response = Typhoeus::Request.new(
74
+ "https://api.ascolour.com/v1/api/authentication",
75
+ request_params
76
+ ).run
77
+ return AsColourError.new(response) unless response.success?
78
+
79
+ retval = process_as_colour_response(response.body)
80
+ retval[:token]
81
+ end
82
+
83
+ def process_request(request_type, url_path, options = {})
84
+ options_params = options[:params] || {}
85
+ auth_token_required = options_params.delete(:auth_token_required) || false
86
+ request_params = {
87
+ method: request_type,
88
+ params: options_params.to_camelback_keys,
89
+ headers: as_colour_auth_headers(auth_token_required),
90
+ body: options[:body]&.to_json
91
+ }
92
+
93
+ proxy = @auth[:proxy] || ENV['PROXY']
94
+ request_params[:proxy] = proxy unless proxy.nil?
95
+
96
+ response = Typhoeus::Request.new(
97
+ "https://api.ascolour.com/v1/#{url_path}",
98
+ request_params
99
+ ).run
100
+ return AsColourError.new(response) unless response.success?
101
+
102
+ process_as_colour_response(response.body)
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,7 @@
1
+ module AsColour
2
+ class AsColourModel < OpenStruct
3
+ def initialize(data = {})
4
+ super(data)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module AsColour
2
+ class Colour < AsColourModel
3
+ def initialize(data = {})
4
+ super(data)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module AsColour
2
+ class InventoryItem < AsColourModel
3
+ def initialize(data = {})
4
+ super(data)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module AsColour
2
+ class PriceListItem < AsColourModel
3
+ def initialize(data = {})
4
+ super(data)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module AsColour
2
+ class Product < AsColourModel
3
+ def initialize(data = {})
4
+ super(data)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module AsColour
2
+ class ProductImage < AsColourModel
3
+ def initialize(data = {})
4
+ super(data)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module AsColour
2
+ class ProductInventory < AsColourModel
3
+ def initialize(data = {})
4
+ super(data)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module AsColour
2
+ class ProductVariant < AsColourModel
3
+ def initialize(data = {})
4
+ super(data)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AsColour
4
+ VERSION = '0.1.0'
5
+ end
data/lib/as_colour.rb ADDED
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rubygems'
4
+ require 'json'
5
+ require 'typhoeus'
6
+ require 'awrence'
7
+ require 'plissken'
8
+ require 'base64'
9
+ require 'ostruct'
10
+
11
+ require_relative 'as_colour/version'
12
+ require_relative 'as_colour/client'
13
+ require_relative 'as_colour/as_colour_error'
metadata ADDED
@@ -0,0 +1,154 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: as_colour
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Wes Hays
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2025-05-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: typhoeus
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.4'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.4'
27
+ - !ruby/object:Gem::Dependency
28
+ name: json
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.12'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.12'
41
+ - !ruby/object:Gem::Dependency
42
+ name: plissken
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: awrence
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ type: :runtime
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: ostruct
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 0.6.1
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 0.6.1
83
+ description: Ruby API wrapper for the ASColour.com API
84
+ email:
85
+ - weshays@gmail.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - ".gitignore"
91
+ - ".rspec"
92
+ - ".rubocop.yml"
93
+ - CHANGELOG.md
94
+ - CODE_OF_CONDUCT.md
95
+ - Dockerfile
96
+ - Gemfile
97
+ - Gemfile.lock
98
+ - LICENSE
99
+ - README.md
100
+ - Rakefile
101
+ - as_colour.gemspec
102
+ - as_colour_api.pdf
103
+ - bin/console
104
+ - bin/setup
105
+ - docker-compose.yml
106
+ - examples/catalog_colours.rb
107
+ - examples/catalog_products.rb
108
+ - examples/inventory.rb
109
+ - examples/price_list.rb
110
+ - lib/as_colour.rb
111
+ - lib/as_colour/as_colour_error.rb
112
+ - lib/as_colour/client.rb
113
+ - lib/as_colour/client/colours.rb
114
+ - lib/as_colour/client/inventory_items.rb
115
+ - lib/as_colour/client/price_list.rb
116
+ - lib/as_colour/client/product_variants.rb
117
+ - lib/as_colour/client/products.rb
118
+ - lib/as_colour/model/as_colour_model.rb
119
+ - lib/as_colour/model/colour.rb
120
+ - lib/as_colour/model/inventory_item.rb
121
+ - lib/as_colour/model/price_list_item.rb
122
+ - lib/as_colour/model/product.rb
123
+ - lib/as_colour/model/product_image.rb
124
+ - lib/as_colour/model/product_inventory.rb
125
+ - lib/as_colour/model/product_variant.rb
126
+ - lib/as_colour/version.rb
127
+ homepage: https://github.com/BenefitMany/as_colour
128
+ licenses:
129
+ - MIT
130
+ metadata:
131
+ source_code_uri: https://github.com/BenefitMany/as_colour
132
+ bug_tracker_uri: https://github.com/BenefitMany/as_colour/issues
133
+ changelog_uri: https://github.com/BenefitMany/as_colour/blob/main/CHANGELOG.md
134
+ documentation_uri: https://github.com/BenefitMany/as_colour/blob/main/as_colour_api.pdf
135
+ post_install_message:
136
+ rdoc_options: []
137
+ require_paths:
138
+ - lib
139
+ required_ruby_version: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - ">="
142
+ - !ruby/object:Gem::Version
143
+ version: 2.4.0
144
+ required_rubygems_version: !ruby/object:Gem::Requirement
145
+ requirements:
146
+ - - ">="
147
+ - !ruby/object:Gem::Version
148
+ version: '0'
149
+ requirements: []
150
+ rubygems_version: 3.5.22
151
+ signing_key:
152
+ specification_version: 4
153
+ summary: Ruby API wrapper for the ASColour.com API
154
+ test_files: []