erp_integration 0.62.0 → 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 +4 -4
- data/.github/workflows/main.yml +1 -1
- data/.rubocop.yml +6 -1
- data/.ruby-version +1 -1
- data/README.md +1 -1
- data/erp_integration.gemspec +4 -5
- data/lib/erp_integration/fulfil/api_resource.rb +3 -2
- data/lib/erp_integration/fulfil/client.rb +5 -8
- data/lib/erp_integration/fulfil/query.rb +1 -1
- data/lib/erp_integration/logger.rb +2 -2
- data/lib/erp_integration/middleware/api_keys_rotation.rb +2 -0
- data/lib/erp_integration/middleware/error_handling.rb +3 -1
- data/lib/erp_integration/middleware/json_decode.rb +27 -0
- data/lib/erp_integration/middleware/json_encode.rb +21 -0
- data/lib/erp_integration/middleware/logger.rb +2 -0
- data/lib/erp_integration/resource.rb +5 -17
- data/lib/erp_integration/version.rb +1 -1
- data/lib/erp_integration.rb +5 -1
- metadata +18 -42
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2cd27cee73fe0ca1c7df7893b35f52f3cdf54f9ae32a4559c739cc804d80bd4a
|
4
|
+
data.tar.gz: 5194f43286bf53cd04ea22b01d261268c32749b0b9dc8d5db24cc778d6b1ae70
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 10885ee89ef3960ba1d192ff6b5c32f51193b235d5c10d10831af1dc28b6583e65547a69d1db2c2738fe22ba94bcf72ff2bbccabdcbed9b27ab38fee6a14565c
|
7
|
+
data.tar.gz: 783e67561264e6734caeca1bffc8ab67f758c09675ec261ed0f6238bf1c13bf523356f6d114c6f56c6d9869f5625b5975f1e6c6e2bba06217139d0ccb9e50b9b
|
data/.github/workflows/main.yml
CHANGED
data/.rubocop.yml
CHANGED
@@ -16,7 +16,7 @@ Metrics/BlockLength:
|
|
16
16
|
# 1. Specs tend to include big blocks (e.g. `RSpec.describe` or `it`).
|
17
17
|
# 2. `mejuri-web` also has disabled the `Metrics/BlockLength` for specs.
|
18
18
|
- spec/**/*
|
19
|
-
|
19
|
+
AllowedMethods: ['class_eval']
|
20
20
|
|
21
21
|
Lint/AmbiguousBlockAssociation:
|
22
22
|
Enabled: true
|
@@ -88,3 +88,8 @@ Metrics/ClassLength:
|
|
88
88
|
|
89
89
|
Style/AndOr:
|
90
90
|
EnforcedStyle: conditionals
|
91
|
+
|
92
|
+
Lint/ConstantDefinitionInBlock:
|
93
|
+
Exclude:
|
94
|
+
- spec/**/*
|
95
|
+
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.
|
1
|
+
3.3.6
|
data/README.md
CHANGED
@@ -155,7 +155,7 @@ $ ErpIntegration::SalesOrder.select(:id, :reference).find_by(reference: 'MT1000S
|
|
155
155
|
|
156
156
|
## Development
|
157
157
|
|
158
|
-
After checking out the repo, run `bin/setup` to install dependencies. Then, run `
|
158
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `bundle exec rspec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
159
159
|
|
160
160
|
### Releasing
|
161
161
|
|
data/erp_integration.gemspec
CHANGED
@@ -32,17 +32,16 @@ Gem::Specification.new do |spec|
|
|
32
32
|
spec.add_dependency 'activesupport', '>= 4.1.16'
|
33
33
|
|
34
34
|
# Faraday is a HTTP/REST API client library to interact with third-party API vendors
|
35
|
-
spec.add_dependency 'faraday', '
|
36
|
-
spec.add_dependency 'faraday_middleware', '>= 0.14', '< 1.3'
|
35
|
+
spec.add_dependency 'faraday', '~> 2.12'
|
37
36
|
|
38
37
|
# Development dependencies
|
39
38
|
spec.add_development_dependency 'byebug', '~> 11.0'
|
40
39
|
spec.add_development_dependency 'flay', '~> 2.12', '>= 2.12.1'
|
41
40
|
spec.add_development_dependency 'github_changelog_generator', '~> 1.15.2'
|
42
|
-
spec.add_development_dependency 'rake', '
|
43
|
-
spec.add_development_dependency 'reek', '
|
41
|
+
spec.add_development_dependency 'rake', '>= 13.0'
|
42
|
+
spec.add_development_dependency 'reek', '<= 6.4.0'
|
44
43
|
spec.add_development_dependency 'rspec', '~> 3.10'
|
45
|
-
spec.add_development_dependency 'rubocop', '
|
44
|
+
spec.add_development_dependency 'rubocop', '~> 1.71'
|
46
45
|
spec.add_development_dependency 'rubocop-rake', '~> 0.5'
|
47
46
|
spec.add_development_dependency 'rubocop-rspec', '< 1.39.0'
|
48
47
|
spec.add_development_dependency 'webmock', '~> 3.18.1'
|
@@ -17,6 +17,7 @@ module ErpIntegration
|
|
17
17
|
include QueryMethods
|
18
18
|
|
19
19
|
attr_accessor :resource_klass
|
20
|
+
|
20
21
|
delegate :api_keys_pool=, :client, :model_name, to: 'self.class'
|
21
22
|
|
22
23
|
def initialize(resource_klass)
|
@@ -72,9 +73,9 @@ module ErpIntegration
|
|
72
73
|
# be executed and the results will be fetched.
|
73
74
|
# @return [Array] An enumerable collection object with all API results.
|
74
75
|
def all
|
75
|
-
return @
|
76
|
+
return @all if defined?(@all)
|
76
77
|
|
77
|
-
@
|
78
|
+
@all =
|
78
79
|
client.put(
|
79
80
|
api_resource_path,
|
80
81
|
Query.new(
|
@@ -26,18 +26,15 @@ module ErpIntegration
|
|
26
26
|
@connection ||= Faraday.new(url: base_url) do |faraday|
|
27
27
|
faraday.headers = default_headers
|
28
28
|
|
29
|
-
faraday.request :
|
30
|
-
faraday.
|
31
|
-
|
32
|
-
faraday.response :follow_redirects
|
33
|
-
faraday.response :json # Decode response bodies as JSON
|
29
|
+
faraday.request :json_encode # Encode request bodies as JSON
|
30
|
+
faraday.response :json_decode # Decode response bodies as JSON
|
34
31
|
|
35
32
|
# Custom error handling for the error response
|
36
|
-
faraday.use
|
33
|
+
faraday.use :error_handling
|
37
34
|
# Custom middleware for rotating API keys
|
38
|
-
faraday.use
|
35
|
+
faraday.use :api_keys_rotation, rotation_options
|
39
36
|
# Custom middleware for logging requests and responses
|
40
|
-
faraday.use
|
37
|
+
faraday.use :custom_logger, @logger, formatter: FORMATTER if @logger
|
41
38
|
|
42
39
|
# Adapter definition should be last in order to make the json parsers be loaded correctly
|
43
40
|
faraday.adapter faraday_adapter
|
@@ -29,7 +29,7 @@ module ErpIntegration
|
|
29
29
|
# @param alternative_filters [Array<OrClause>] A list of or clauses for Fulfil.
|
30
30
|
# @param offset [Integer] Offset for pagination.
|
31
31
|
# @param limit [Integer] Limit for pagination.
|
32
|
-
def initialize(fields:, filters:, alternative_filters: [], offset: nil, limit: nil)
|
32
|
+
def initialize(fields:, filters:, alternative_filters: [], offset: nil, limit: nil) # rubocop:disable Metrics/CyclomaticComplexity
|
33
33
|
@fields = (fields || DEFAULT_FIELDS).map(&:to_s).uniq
|
34
34
|
@filters = (filters || []).map(&:to_filter).uniq
|
35
35
|
@filters += alternative_filters.map(&:to_filter).uniq if alternative_filters&.any?
|
@@ -11,11 +11,11 @@ module ErpIntegration
|
|
11
11
|
|
12
12
|
# Logs the given tags if the logger is present.
|
13
13
|
# If the logger does not respond to `tagged`, it logs the tags as an info message.
|
14
|
-
def with_tags(*tags)
|
14
|
+
def with_tags(*tags, &block)
|
15
15
|
return yield unless logger
|
16
16
|
|
17
17
|
if logger.respond_to?(:tagged)
|
18
|
-
logger.tagged(*tags) {
|
18
|
+
logger.tagged(*tags) { block.call }
|
19
19
|
else
|
20
20
|
logger.info("Requested ERP with #{tags.join(', ')}")
|
21
21
|
yield
|
@@ -4,7 +4,7 @@ module ErpIntegration
|
|
4
4
|
module Middleware
|
5
5
|
# The `ErrorHandling` middleware allows to raise our own exceptions that
|
6
6
|
# are easier to catch for the host application (e.g. `mejuri-web`).
|
7
|
-
class ErrorHandling < Faraday::
|
7
|
+
class ErrorHandling < Faraday::Middleware
|
8
8
|
HTTP_ERROR_CODES = {
|
9
9
|
400 => ErpIntegration::HttpError::BadRequest,
|
10
10
|
401 => ErpIntegration::HttpError::AuthorizationRequired,
|
@@ -29,3 +29,5 @@ module ErpIntegration
|
|
29
29
|
end
|
30
30
|
end
|
31
31
|
end
|
32
|
+
|
33
|
+
Faraday::Middleware.register_middleware(error_handling: ErpIntegration::Middleware::ErrorHandling)
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ErpIntegration
|
4
|
+
module Middleware
|
5
|
+
class JsonDecode < Faraday::Middleware
|
6
|
+
class ParseError < StandardError; end
|
7
|
+
|
8
|
+
def call(env)
|
9
|
+
@app.call(env).on_complete { |response| on_complete(response) }
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def on_complete(env)
|
15
|
+
return unless env.body.is_a?(String)
|
16
|
+
|
17
|
+
begin
|
18
|
+
env.body = env.body.empty? ? nil : JSON.parse(env.body)
|
19
|
+
rescue JSON::ParserError
|
20
|
+
raise ParseError, "Failed to parse JSON response: #{env.body}"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
Faraday::Response.register_middleware(json_decode: ErpIntegration::Middleware::JsonDecode)
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ErpIntegration
|
4
|
+
module Middleware
|
5
|
+
class JsonEncode < Faraday::Middleware
|
6
|
+
def call(env)
|
7
|
+
on_request(env)
|
8
|
+
|
9
|
+
@app.call(env)
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def on_request(env)
|
15
|
+
env.body = env.body.to_json if env.body
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
Faraday::Request.register_middleware(json_encode: ErpIntegration::Middleware::JsonEncode)
|
@@ -105,25 +105,13 @@ module ErpIntegration
|
|
105
105
|
# @param kwargs [Hash] The list of arguments for the missing method.
|
106
106
|
# @param block [Proc] Any block given to the missing method.
|
107
107
|
#
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
else
|
114
|
-
super
|
115
|
-
end
|
116
|
-
end
|
117
|
-
else
|
118
|
-
def method_missing(method_name, *args, **kwargs, &block)
|
119
|
-
if adapter.respond_to?(method_name)
|
120
|
-
adapter.send(method_name, *args, **kwargs, &block)
|
121
|
-
else
|
122
|
-
super
|
123
|
-
end
|
108
|
+
def method_missing(method_name, *args, **kwargs, &block)
|
109
|
+
if adapter.respond_to?(method_name)
|
110
|
+
adapter.send(method_name, *args, **kwargs, &block)
|
111
|
+
else
|
112
|
+
super
|
124
113
|
end
|
125
114
|
end
|
126
|
-
# rubocop:enable Style/MissingRespondToMissing
|
127
115
|
|
128
116
|
# The `respond_to_missing?` complements the `method_missing` method.
|
129
117
|
# @param method_name [Symbol] The name of the missing method.
|
data/lib/erp_integration.rb
CHANGED
@@ -5,7 +5,6 @@ require 'active_support/core_ext/string/inflections'
|
|
5
5
|
require 'active_support/core_ext/module/delegation' # Allows using `delegate`
|
6
6
|
require 'active_support/core_ext/object/blank'
|
7
7
|
require 'faraday'
|
8
|
-
require 'faraday_middleware'
|
9
8
|
require 'json'
|
10
9
|
|
11
10
|
require_relative 'erp_integration/version'
|
@@ -20,9 +19,13 @@ require_relative 'erp_integration/middleware/api_keys_rotation'
|
|
20
19
|
require_relative 'erp_integration/middleware/error_handling'
|
21
20
|
require_relative 'erp_integration/middleware/logger'
|
22
21
|
require_relative 'erp_integration/middleware/formatter'
|
22
|
+
require_relative 'erp_integration/middleware/json_encode'
|
23
|
+
require_relative 'erp_integration/middleware/json_decode'
|
23
24
|
|
24
25
|
# HTTP clients
|
25
26
|
require_relative 'erp_integration/fulfil/client'
|
27
|
+
require_relative 'erp_integration/fulfil/persistence'
|
28
|
+
require_relative 'erp_integration/fulfil/api_resource'
|
26
29
|
|
27
30
|
# The `ErpIntegration` integrates Mejuri with third-party ERP vendors.
|
28
31
|
module ErpIntegration
|
@@ -66,6 +69,7 @@ module ErpIntegration
|
|
66
69
|
autoload :Persistence, 'erp_integration/resources/persistence'
|
67
70
|
autoload :Validations, 'erp_integration/resources/validations'
|
68
71
|
end
|
72
|
+
|
69
73
|
module Types
|
70
74
|
autoload :Decimal, 'erp_integration/types/decimal'
|
71
75
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: erp_integration
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stefan Vermaas
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2025-02-
|
11
|
+
date: 2025-02-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -28,42 +28,16 @@ dependencies:
|
|
28
28
|
name: faraday
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: 0.17.3
|
34
|
-
- - "<"
|
35
|
-
- !ruby/object:Gem::Version
|
36
|
-
version: 1.9.0
|
37
|
-
type: :runtime
|
38
|
-
prerelease: false
|
39
|
-
version_requirements: !ruby/object:Gem::Requirement
|
40
|
-
requirements:
|
41
|
-
- - ">="
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
version: 0.17.3
|
44
|
-
- - "<"
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
version: 1.9.0
|
47
|
-
- !ruby/object:Gem::Dependency
|
48
|
-
name: faraday_middleware
|
49
|
-
requirement: !ruby/object:Gem::Requirement
|
50
|
-
requirements:
|
51
|
-
- - ">="
|
52
|
-
- !ruby/object:Gem::Version
|
53
|
-
version: '0.14'
|
54
|
-
- - "<"
|
31
|
+
- - "~>"
|
55
32
|
- !ruby/object:Gem::Version
|
56
|
-
version: '
|
33
|
+
version: '2.12'
|
57
34
|
type: :runtime
|
58
35
|
prerelease: false
|
59
36
|
version_requirements: !ruby/object:Gem::Requirement
|
60
37
|
requirements:
|
61
|
-
- - "
|
62
|
-
- !ruby/object:Gem::Version
|
63
|
-
version: '0.14'
|
64
|
-
- - "<"
|
38
|
+
- - "~>"
|
65
39
|
- !ruby/object:Gem::Version
|
66
|
-
version: '
|
40
|
+
version: '2.12'
|
67
41
|
- !ruby/object:Gem::Dependency
|
68
42
|
name: byebug
|
69
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -116,30 +90,30 @@ dependencies:
|
|
116
90
|
name: rake
|
117
91
|
requirement: !ruby/object:Gem::Requirement
|
118
92
|
requirements:
|
119
|
-
- - "
|
93
|
+
- - ">="
|
120
94
|
- !ruby/object:Gem::Version
|
121
95
|
version: '13.0'
|
122
96
|
type: :development
|
123
97
|
prerelease: false
|
124
98
|
version_requirements: !ruby/object:Gem::Requirement
|
125
99
|
requirements:
|
126
|
-
- - "
|
100
|
+
- - ">="
|
127
101
|
- !ruby/object:Gem::Version
|
128
102
|
version: '13.0'
|
129
103
|
- !ruby/object:Gem::Dependency
|
130
104
|
name: reek
|
131
105
|
requirement: !ruby/object:Gem::Requirement
|
132
106
|
requirements:
|
133
|
-
- - "
|
107
|
+
- - "<="
|
134
108
|
- !ruby/object:Gem::Version
|
135
|
-
version:
|
109
|
+
version: 6.4.0
|
136
110
|
type: :development
|
137
111
|
prerelease: false
|
138
112
|
version_requirements: !ruby/object:Gem::Requirement
|
139
113
|
requirements:
|
140
|
-
- - "
|
114
|
+
- - "<="
|
141
115
|
- !ruby/object:Gem::Version
|
142
|
-
version:
|
116
|
+
version: 6.4.0
|
143
117
|
- !ruby/object:Gem::Dependency
|
144
118
|
name: rspec
|
145
119
|
requirement: !ruby/object:Gem::Requirement
|
@@ -158,16 +132,16 @@ dependencies:
|
|
158
132
|
name: rubocop
|
159
133
|
requirement: !ruby/object:Gem::Requirement
|
160
134
|
requirements:
|
161
|
-
- - "
|
135
|
+
- - "~>"
|
162
136
|
- !ruby/object:Gem::Version
|
163
|
-
version:
|
137
|
+
version: '1.71'
|
164
138
|
type: :development
|
165
139
|
prerelease: false
|
166
140
|
version_requirements: !ruby/object:Gem::Requirement
|
167
141
|
requirements:
|
168
|
-
- - "
|
142
|
+
- - "~>"
|
169
143
|
- !ruby/object:Gem::Version
|
170
|
-
version:
|
144
|
+
version: '1.71'
|
171
145
|
- !ruby/object:Gem::Dependency
|
172
146
|
name: rubocop-rake
|
173
147
|
requirement: !ruby/object:Gem::Requirement
|
@@ -322,6 +296,8 @@ files:
|
|
322
296
|
- lib/erp_integration/middleware/api_keys_rotation.rb
|
323
297
|
- lib/erp_integration/middleware/error_handling.rb
|
324
298
|
- lib/erp_integration/middleware/formatter.rb
|
299
|
+
- lib/erp_integration/middleware/json_decode.rb
|
300
|
+
- lib/erp_integration/middleware/json_encode.rb
|
325
301
|
- lib/erp_integration/middleware/logger.rb
|
326
302
|
- lib/erp_integration/party_address.rb
|
327
303
|
- lib/erp_integration/product.rb
|