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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 63269c49afd5a3ed49f2a21df8a3e4f102b4206f807ec2b856c0e35a62cea05a
4
- data.tar.gz: 5a31d04b8d8a7d45f08921a32d470e80d717b0e76d5e01757eb2c6ff6a3fe22c
3
+ metadata.gz: 2cd27cee73fe0ca1c7df7893b35f52f3cdf54f9ae32a4559c739cc804d80bd4a
4
+ data.tar.gz: 5194f43286bf53cd04ea22b01d261268c32749b0b9dc8d5db24cc778d6b1ae70
5
5
  SHA512:
6
- metadata.gz: adffdd3bf7d3746d1256509f5572e52d4ab7be28cc064efc9dabc870ab6c0846ee81e5523ed37e641b13a870b686a53e84be2cb7c9ec478466c009c7aa0074e1
7
- data.tar.gz: 2b93cf2f5299db27f9a8dec86df24803641d58f641ec484437b21f943848da29068953952b96d236a2d95cf9de0588726fd2f28a52d562b2e0b3581247d9328f
6
+ metadata.gz: 10885ee89ef3960ba1d192ff6b5c32f51193b235d5c10d10831af1dc28b6583e65547a69d1db2c2738fe22ba94bcf72ff2bbccabdcbed9b27ab38fee6a14565c
7
+ data.tar.gz: 783e67561264e6734caeca1bffc8ab67f758c09675ec261ed0f6238bf1c13bf523356f6d114c6f56c6d9869f5625b5975f1e6c6e2bba06217139d0ccb9e50b9b
@@ -8,7 +8,7 @@ jobs:
8
8
 
9
9
  strategy:
10
10
  matrix:
11
- ruby-version: ['3.0', '2.7', '2.6', '2.5', '2.4', '2.3']
11
+ ruby-version: ['3.0', '3.3', '3.4']
12
12
 
13
13
  steps:
14
14
  - uses: actions/checkout@v2
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
- ExcludedMethods: ['class_eval']
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.0.2
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 `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
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
 
@@ -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', '>= 0.17.3', '< 1.9.0'
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', '~> 13.0'
43
- spec.add_development_dependency 'reek', '< 6.0'
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', '< 0.82.0'
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 @results if defined?(@results)
76
+ return @all if defined?(@all)
76
77
 
77
- @results =
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 :json # Encode request bodies as JSON
30
- faraday.request :retry # Retry transient failures
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 ErpIntegration::Middleware::ErrorHandling
33
+ faraday.use :error_handling
37
34
  # Custom middleware for rotating API keys
38
- faraday.use ErpIntegration::Middleware::ApiKeysRotation, rotation_options
35
+ faraday.use :api_keys_rotation, rotation_options
39
36
  # Custom middleware for logging requests and responses
40
- faraday.use ErpIntegration::Middleware::Logger, @logger, formatter: FORMATTER if @logger
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) { yield }
18
+ logger.tagged(*tags) { block.call }
19
19
  else
20
20
  logger.info("Requested ERP with #{tags.join(', ')}")
21
21
  yield
@@ -38,3 +38,5 @@ module ErpIntegration
38
38
  end
39
39
  end
40
40
  end
41
+
42
+ Faraday::Middleware.register_middleware(api_keys_rotation: ErpIntegration::Middleware::ApiKeysRotation)
@@ -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::Response::Middleware
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)
@@ -49,3 +49,5 @@ module ErpIntegration
49
49
  end
50
50
  end
51
51
  end
52
+
53
+ Faraday::Middleware.register_middleware(custom_logger: ErpIntegration::Middleware::Logger)
@@ -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
- # rubocop:disable Style/MissingRespondToMissing
109
- if RUBY_VERSION < '2.7'
110
- def method_missing(method_name, *args, &block)
111
- if adapter.respond_to?(method_name)
112
- adapter.send(method_name, *args, &block)
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.
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ErpIntegration
4
- VERSION = '0.62.0'
4
+ VERSION = '1.0.0'
5
5
  end
@@ -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.62.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-03 00:00:00.000000000 Z
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: '1.3'
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: '1.3'
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: '6.0'
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: '6.0'
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: 0.82.0
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: 0.82.0
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