fangkuai.rb 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +10 -0
- data/README.md +1 -0
- data/lib/square.rb +61 -0
- data/lib/square/api/apple_pay_api.rb +50 -0
- data/lib/square/api/bank_accounts_api.rb +136 -0
- data/lib/square/api/base_api.rb +43 -0
- data/lib/square/api/cash_drawers_api.rb +150 -0
- data/lib/square/api/catalog_api.rb +572 -0
- data/lib/square/api/checkout_api.rb +49 -0
- data/lib/square/api/customer_groups_api.rb +182 -0
- data/lib/square/api/customer_segments_api.rb +78 -0
- data/lib/square/api/customers_api.rb +418 -0
- data/lib/square/api/devices_api.rb +120 -0
- data/lib/square/api/disputes_api.rb +398 -0
- data/lib/square/api/employees_api.rb +87 -0
- data/lib/square/api/inventory_api.rb +296 -0
- data/lib/square/api/invoices_api.rb +358 -0
- data/lib/square/api/labor_api.rb +630 -0
- data/lib/square/api/locations_api.rb +151 -0
- data/lib/square/api/loyalty_api.rb +543 -0
- data/lib/square/api/merchants_api.rb +83 -0
- data/lib/square/api/mobile_authorization_api.rb +52 -0
- data/lib/square/api/o_auth_api.rb +163 -0
- data/lib/square/api/orders_api.rb +280 -0
- data/lib/square/api/payments_api.rb +279 -0
- data/lib/square/api/refunds_api.rb +145 -0
- data/lib/square/api/subscriptions_api.rb +251 -0
- data/lib/square/api/team_api.rb +326 -0
- data/lib/square/api/terminal_api.rb +141 -0
- data/lib/square/api/transactions_api.rb +369 -0
- data/lib/square/api/v1_employees_api.rb +723 -0
- data/lib/square/api/v1_items_api.rb +1686 -0
- data/lib/square/api/v1_locations_api.rb +65 -0
- data/lib/square/api/v1_transactions_api.rb +572 -0
- data/lib/square/api_helper.rb +276 -0
- data/lib/square/client.rb +211 -0
- data/lib/square/configuration.rb +101 -0
- data/lib/square/exceptions/api_exception.rb +15 -0
- data/lib/square/http/api_response.rb +45 -0
- data/lib/square/http/auth/o_auth2.rb +12 -0
- data/lib/square/http/faraday_client.rb +55 -0
- data/lib/square/http/http_call_back.rb +19 -0
- data/lib/square/http/http_client.rb +99 -0
- data/lib/square/http/http_method_enum.rb +8 -0
- data/lib/square/http/http_request.rb +45 -0
- data/lib/square/http/http_response.rb +24 -0
- data/lib/square/utilities/file_wrapper.rb +12 -0
- data/spec/user_journey_spec.rb +148 -0
- data/test/api/api_test_base.rb +24 -0
- data/test/api/test_catalog_api.rb +59 -0
- data/test/api/test_customers_api.rb +45 -0
- data/test/api/test_employees_api.rb +36 -0
- data/test/api/test_labor_api.rb +74 -0
- data/test/api/test_locations_api.rb +35 -0
- data/test/api/test_merchants_api.rb +40 -0
- data/test/api/test_payments_api.rb +42 -0
- data/test/api/test_refunds_api.rb +41 -0
- data/test/http_response_catcher.rb +19 -0
- data/test/test_helper.rb +94 -0
- metadata +199 -0
@@ -0,0 +1,101 @@
|
|
1
|
+
module Square
|
2
|
+
# All configuration including auth info and base URI for the API access
|
3
|
+
# are configured in this class.
|
4
|
+
class Configuration
|
5
|
+
# The attribute readers for properties.
|
6
|
+
attr_reader :http_client
|
7
|
+
attr_reader :timeout
|
8
|
+
attr_reader :max_retries
|
9
|
+
attr_reader :retry_interval
|
10
|
+
attr_reader :backoff_factor
|
11
|
+
attr_reader :environment
|
12
|
+
attr_reader :square_version
|
13
|
+
attr_reader :access_token
|
14
|
+
|
15
|
+
def additional_headers
|
16
|
+
@additional_headers.clone
|
17
|
+
end
|
18
|
+
|
19
|
+
class << self
|
20
|
+
attr_reader :environments
|
21
|
+
end
|
22
|
+
|
23
|
+
def initialize(timeout: 60, max_retries: 0, retry_interval: 1,
|
24
|
+
backoff_factor: 1, environment: 'production',
|
25
|
+
square_version: '2020-08-26', access_token: 'TODO: Replace',
|
26
|
+
additional_headers: {})
|
27
|
+
# The value to use for connection timeout
|
28
|
+
@timeout = timeout
|
29
|
+
|
30
|
+
# The number of times to retry an endpoint call if it fails
|
31
|
+
@max_retries = max_retries
|
32
|
+
|
33
|
+
# Pause in seconds between retries
|
34
|
+
@retry_interval = retry_interval
|
35
|
+
|
36
|
+
# The amount to multiply each successive retry's interval amount
|
37
|
+
# by in order to provide backoff
|
38
|
+
@backoff_factor = backoff_factor
|
39
|
+
|
40
|
+
# Current API environment
|
41
|
+
@environment = String(environment)
|
42
|
+
|
43
|
+
# Square Connect API versions
|
44
|
+
@square_version = square_version
|
45
|
+
|
46
|
+
# OAuth 2.0 Access Token
|
47
|
+
@access_token = access_token
|
48
|
+
|
49
|
+
# Additional headers to add to each API request
|
50
|
+
@additional_headers = additional_headers.clone
|
51
|
+
|
52
|
+
# The Http Client to use for making requests.
|
53
|
+
@http_client = create_http_client
|
54
|
+
end
|
55
|
+
|
56
|
+
def clone_with(timeout: nil, max_retries: nil, retry_interval: nil,
|
57
|
+
backoff_factor: nil, environment: nil, square_version: nil,
|
58
|
+
access_token: nil, additional_headers: nil)
|
59
|
+
timeout ||= self.timeout
|
60
|
+
max_retries ||= self.max_retries
|
61
|
+
retry_interval ||= self.retry_interval
|
62
|
+
backoff_factor ||= self.backoff_factor
|
63
|
+
environment ||= self.environment
|
64
|
+
square_version ||= self.square_version
|
65
|
+
access_token ||= self.access_token
|
66
|
+
additional_headers ||= self.additional_headers
|
67
|
+
|
68
|
+
Configuration.new(timeout: timeout, max_retries: max_retries,
|
69
|
+
retry_interval: retry_interval,
|
70
|
+
backoff_factor: backoff_factor,
|
71
|
+
environment: environment,
|
72
|
+
square_version: square_version,
|
73
|
+
access_token: access_token,
|
74
|
+
additional_headers: additional_headers)
|
75
|
+
end
|
76
|
+
|
77
|
+
def create_http_client
|
78
|
+
FaradayClient.new(timeout: timeout, max_retries: max_retries,
|
79
|
+
retry_interval: retry_interval,
|
80
|
+
backoff_factor: backoff_factor)
|
81
|
+
end
|
82
|
+
|
83
|
+
# All the environments the SDK can run in.
|
84
|
+
ENVIRONMENTS = {
|
85
|
+
'production' => {
|
86
|
+
'default' => 'https://connect.squareup.com'
|
87
|
+
},
|
88
|
+
'sandbox' => {
|
89
|
+
'default' => 'https://connect.squareupsandbox.com'
|
90
|
+
}
|
91
|
+
}.freeze
|
92
|
+
|
93
|
+
# Generates the appropriate base URI for the environment and the server.
|
94
|
+
# @param [Configuration::Server] The server enum for which the base URI is
|
95
|
+
# required.
|
96
|
+
# @return [String] The base URI.
|
97
|
+
def get_base_uri(server = 'default')
|
98
|
+
ENVIRONMENTS[environment][server].clone
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Square
|
2
|
+
# Class for exceptions when there is a network error, status code error, etc.
|
3
|
+
class APIException < StandardError
|
4
|
+
attr_reader :response, :response_code
|
5
|
+
|
6
|
+
# The constructor.
|
7
|
+
# @param [String] The reason for raising an exception.
|
8
|
+
# @param [HttpResponse] The HttpReponse of the API call.
|
9
|
+
def initialize(reason, response)
|
10
|
+
super(reason)
|
11
|
+
@response = response
|
12
|
+
@response_code = response.status_code
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Square
|
2
|
+
# Http response received.
|
3
|
+
class ApiResponse
|
4
|
+
attr_reader(:status_code, :reason_phrase, :headers, :raw_body, :request,
|
5
|
+
:data, :errors, :body, :cursor)
|
6
|
+
|
7
|
+
# The constructor
|
8
|
+
# @param [HttpResponse] The original, raw response from the api.
|
9
|
+
# @param [Object] The data field specified for the response.
|
10
|
+
# @param [Array<String>] Any errors returned by the server.
|
11
|
+
def initialize(http_response,
|
12
|
+
data: nil,
|
13
|
+
errors: nil)
|
14
|
+
@status_code = http_response.status_code
|
15
|
+
@reason_phrase = http_response.reason_phrase
|
16
|
+
@headers = http_response.headers
|
17
|
+
@raw_body = http_response.raw_body
|
18
|
+
@request = http_response.request
|
19
|
+
@errors = errors
|
20
|
+
|
21
|
+
if data.is_a? Hash
|
22
|
+
if data.keys.any?
|
23
|
+
@body = Struct.new(*data.keys) do
|
24
|
+
define_method(:to_s) { http_response.raw_body }
|
25
|
+
end.new(*data.values)
|
26
|
+
|
27
|
+
@cursor = data.fetch(:cursor, nil)
|
28
|
+
data.reject! { |k| k == :cursor || k == :errors }
|
29
|
+
@data = Struct.new(*data.keys).new(*data.values) if data.keys.any?
|
30
|
+
end
|
31
|
+
else
|
32
|
+
@data = data
|
33
|
+
@body = data
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def success?
|
38
|
+
status_code >= 200 && status_code < 300
|
39
|
+
end
|
40
|
+
|
41
|
+
def error?
|
42
|
+
status_code >= 400 && status_code < 600
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Square
|
2
|
+
# Utility class for OAuth 2 authorization and token management.
|
3
|
+
class OAuth2
|
4
|
+
# Add OAuth2 authentication to the http request.
|
5
|
+
# @param [HttpRequest] The HttpRequest object to which authentication will
|
6
|
+
# be added.
|
7
|
+
def self.apply(config, http_request)
|
8
|
+
token = config.access_token
|
9
|
+
http_request.headers['Authorization'] = "Bearer #{token}"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'faraday/http_cache'
|
2
|
+
require 'faraday_middleware'
|
3
|
+
|
4
|
+
module Square
|
5
|
+
# An implementation of HttpClient.
|
6
|
+
class FaradayClient < HttpClient
|
7
|
+
# The constructor.
|
8
|
+
def initialize(timeout:, max_retries:, retry_interval:,
|
9
|
+
backoff_factor:, cache: false, verify: true)
|
10
|
+
@connection = Faraday.new do |faraday|
|
11
|
+
faraday.use Faraday::HttpCache, serializer: Marshal if cache
|
12
|
+
faraday.use FaradayMiddleware::FollowRedirects
|
13
|
+
faraday.request :multipart
|
14
|
+
faraday.request :url_encoded
|
15
|
+
faraday.ssl[:ca_file] = Certifi.where
|
16
|
+
faraday.ssl[:verify] = verify
|
17
|
+
faraday.request :retry, max: max_retries, interval: retry_interval,
|
18
|
+
backoff_factor: backoff_factor
|
19
|
+
faraday.adapter Faraday.default_adapter
|
20
|
+
faraday.options[:params_encoder] = Faraday::FlatParamsEncoder
|
21
|
+
faraday.options[:timeout] = timeout if timeout > 0
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Method overridden from HttpClient.
|
26
|
+
def execute_as_string(http_request)
|
27
|
+
response = @connection.send(
|
28
|
+
http_request.http_method.downcase,
|
29
|
+
http_request.query_url
|
30
|
+
) do |request|
|
31
|
+
request.headers = http_request.headers
|
32
|
+
request.body = http_request.parameters
|
33
|
+
end
|
34
|
+
convert_response(response, http_request)
|
35
|
+
end
|
36
|
+
|
37
|
+
# Method overridden from HttpClient.
|
38
|
+
def execute_as_binary(http_request)
|
39
|
+
response = @connection.send(
|
40
|
+
http_request.http_method.downcase,
|
41
|
+
http_request.query_url
|
42
|
+
) do |request|
|
43
|
+
request.headers = http_request.headers
|
44
|
+
request.body = http_request.parameters
|
45
|
+
end
|
46
|
+
convert_response(response, http_request)
|
47
|
+
end
|
48
|
+
|
49
|
+
# Method overridden from HttpClient.
|
50
|
+
def convert_response(response, http_request)
|
51
|
+
HttpResponse.new(response.status, response.reason_phrase,
|
52
|
+
response.headers, response.body, http_request)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Square
|
2
|
+
# HttpCallBack allows defining callables for pre and post API calls.
|
3
|
+
class HttpCallBack
|
4
|
+
# A controller will call this method before making an HTTP Request.
|
5
|
+
# @param [HttpRequest] The HttpRequest object which the HttpClient
|
6
|
+
# will execute.
|
7
|
+
def on_before_request(_http_request)
|
8
|
+
raise NotImplementedError, 'This method needs
|
9
|
+
to be implemented in a child class.'
|
10
|
+
end
|
11
|
+
|
12
|
+
# A controller will call this method after making an HTTP Request.
|
13
|
+
# @param [HttpResponse] The HttpReponse of the API call.
|
14
|
+
def on_after_response(_http_response)
|
15
|
+
raise NotImplementedError, 'This method needs
|
16
|
+
to be implemented in a child class.'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
module Square
|
2
|
+
# An interface for the methods that an HTTP Client must implement.
|
3
|
+
#
|
4
|
+
# This class should not be instantiated but should be used as a base class
|
5
|
+
# for HTTP Client classes.
|
6
|
+
class HttpClient
|
7
|
+
# Execute an HttpRequest when the response is expected to be a string.
|
8
|
+
# @param [HttpRequest] The HttpRequest to be executed.
|
9
|
+
def execute_as_string(_http_request)
|
10
|
+
raise NotImplementedError, 'This method needs
|
11
|
+
to be implemented in a child class.'
|
12
|
+
end
|
13
|
+
|
14
|
+
# Execute an HttpRequest when the response is expected to be binary.
|
15
|
+
# @param [HttpRequest] The HttpRequest to be executed.
|
16
|
+
def execute_as_binary(_http_request)
|
17
|
+
raise NotImplementedError, 'This method needs
|
18
|
+
to be implemented in a child class.'
|
19
|
+
end
|
20
|
+
|
21
|
+
# Converts the HTTP Response from the client to an HttpResponse object.
|
22
|
+
# @param [Dynamic] The response object received from the client.
|
23
|
+
def convert_response(_response)
|
24
|
+
raise NotImplementedError, 'This method needs
|
25
|
+
to be implemented in a child class.'
|
26
|
+
end
|
27
|
+
|
28
|
+
# Get a GET HttpRequest object.
|
29
|
+
# @param [String] The URL to send the request to.
|
30
|
+
# @param [Hash, Optional] The headers for the HTTP Request.
|
31
|
+
def get(query_url,
|
32
|
+
headers: {})
|
33
|
+
HttpRequest.new(HttpMethodEnum::GET,
|
34
|
+
query_url,
|
35
|
+
headers: headers)
|
36
|
+
end
|
37
|
+
|
38
|
+
# Get a HEAD HttpRequest object.
|
39
|
+
# @param [String] The URL to send the request to.
|
40
|
+
# @param [Hash, Optional] The headers for the HTTP Request.
|
41
|
+
def head(query_url,
|
42
|
+
headers: {})
|
43
|
+
HttpRequest.new(HttpMethodEnum::HEAD,
|
44
|
+
query_url,
|
45
|
+
headers: headers)
|
46
|
+
end
|
47
|
+
|
48
|
+
# Get a POST HttpRequest object.
|
49
|
+
# @param [String] The URL to send the request to.
|
50
|
+
# @param [Hash, Optional] The headers for the HTTP Request.
|
51
|
+
# @param [Hash, Optional] The parameters for the HTTP Request.
|
52
|
+
def post(query_url,
|
53
|
+
headers: {},
|
54
|
+
parameters: {})
|
55
|
+
HttpRequest.new(HttpMethodEnum::POST,
|
56
|
+
query_url,
|
57
|
+
headers: headers,
|
58
|
+
parameters: parameters)
|
59
|
+
end
|
60
|
+
|
61
|
+
# Get a PUT HttpRequest object.
|
62
|
+
# @param [String] The URL to send the request to.
|
63
|
+
# @param [Hash, Optional] The headers for the HTTP Request.
|
64
|
+
# @param [Hash, Optional] The parameters for the HTTP Request.
|
65
|
+
def put(query_url,
|
66
|
+
headers: {},
|
67
|
+
parameters: {})
|
68
|
+
HttpRequest.new(HttpMethodEnum::PUT,
|
69
|
+
query_url,
|
70
|
+
headers: headers,
|
71
|
+
parameters: parameters)
|
72
|
+
end
|
73
|
+
|
74
|
+
# Get a PATCH HttpRequest object.
|
75
|
+
# @param [String] The URL to send the request to.
|
76
|
+
# @param [Hash, Optional] The headers for the HTTP Request.
|
77
|
+
# @param [Hash, Optional] The parameters for the HTTP Request.
|
78
|
+
def patch(query_url,
|
79
|
+
headers: {},
|
80
|
+
parameters: {})
|
81
|
+
HttpRequest.new(HttpMethodEnum::PATCH,
|
82
|
+
query_url,
|
83
|
+
headers: headers,
|
84
|
+
parameters: parameters)
|
85
|
+
end
|
86
|
+
|
87
|
+
# Get a DELETE HttpRequest object.
|
88
|
+
# @param [String] The URL to send the request to.
|
89
|
+
# @param [Hash, Optional] The headers for the HTTP Request.
|
90
|
+
def delete(query_url,
|
91
|
+
headers: {},
|
92
|
+
parameters: {})
|
93
|
+
HttpRequest.new(HttpMethodEnum::DELETE,
|
94
|
+
query_url,
|
95
|
+
headers: headers,
|
96
|
+
parameters: parameters)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Square
|
2
|
+
# Represents a single Http Request.
|
3
|
+
class HttpRequest
|
4
|
+
attr_accessor :http_method, :query_url, :headers,
|
5
|
+
:parameters, :username, :password
|
6
|
+
|
7
|
+
# The constructor.
|
8
|
+
# @param [HttpMethodEnum] The HTTP method.
|
9
|
+
# @param [String] The URL to send the request to.
|
10
|
+
# @param [Hash, Optional] The headers for the HTTP Request.
|
11
|
+
# @param [Hash, Optional] The parameters for the HTTP Request.
|
12
|
+
def initialize(http_method,
|
13
|
+
query_url,
|
14
|
+
headers: {},
|
15
|
+
parameters: {})
|
16
|
+
@http_method = http_method
|
17
|
+
@query_url = query_url
|
18
|
+
@headers = headers
|
19
|
+
@parameters = parameters
|
20
|
+
end
|
21
|
+
|
22
|
+
# Add a header to the HttpRequest.
|
23
|
+
# @param [String] The name of the header.
|
24
|
+
# @param [String] The value of the header.
|
25
|
+
def add_header(name, value)
|
26
|
+
@headers[name] = value
|
27
|
+
end
|
28
|
+
|
29
|
+
# Add a parameter to the HttpRequest.
|
30
|
+
# @param [String] The name of the parameter.
|
31
|
+
# @param [String] The value of the parameter.
|
32
|
+
def add_parameter(name, value)
|
33
|
+
@parameters[name] = value
|
34
|
+
end
|
35
|
+
|
36
|
+
# Add a query parameter to the HttpRequest.
|
37
|
+
# @param [String] The name of the query parameter.
|
38
|
+
# @param [String] The value of the query parameter.
|
39
|
+
def add_query_parameter(name, value)
|
40
|
+
@query_url = APIHelper.append_url_with_query_parameters(@query_url,
|
41
|
+
name => value)
|
42
|
+
@query_url = APIHelper.clean_url(@query_url)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Square
|
2
|
+
# Http response received.
|
3
|
+
class HttpResponse
|
4
|
+
attr_reader :status_code, :reason_phrase, :headers, :raw_body, :request
|
5
|
+
|
6
|
+
# The constructor
|
7
|
+
# @param [Integer] The status code returned by the server.
|
8
|
+
# @param [String] The reason phrase returned by the server.
|
9
|
+
# @param [Hash] The headers sent by the server in the response.
|
10
|
+
# @param [String] The raw body of the response.
|
11
|
+
# @param [HttpRequest] The request that resulted in this response.
|
12
|
+
def initialize(status_code,
|
13
|
+
reason_phrase,
|
14
|
+
headers,
|
15
|
+
raw_body,
|
16
|
+
request)
|
17
|
+
@status_code = status_code
|
18
|
+
@reason_phrase = reason_phrase
|
19
|
+
@headers = headers
|
20
|
+
@raw_body = raw_body
|
21
|
+
@request = request
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Square
|
2
|
+
# A utility to allow users to set the content-type for files
|
3
|
+
class FileWrapper
|
4
|
+
attr_reader :content_type
|
5
|
+
attr_reader :file
|
6
|
+
|
7
|
+
def initialize(file, content_type: 'application/octet-stream')
|
8
|
+
@file = file
|
9
|
+
@content_type = content_type
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|