diffend 0.2.26 → 0.2.27

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: f22ef308037176744a8795a6371eb3340f01d597b706c66e45b8355dbf2d41a9
4
- data.tar.gz: 1e5734925c51663f20e804ecef8d329f7b24a05dfce891b33366f1e867edbf78
3
+ metadata.gz: f6539b727e33d38eb0b3fb6f38f25c3fd2abda05f337f50af2db1fe135575510
4
+ data.tar.gz: c6808082290c195a846117fd4c16a4fa4cb20f65cc289cbadbd71532f8ae5713
5
5
  SHA512:
6
- metadata.gz: 8930d5dfc0e3c8438515069ab5c472ae93aaf934c6d16c595c70b9167384347d7c0358c4c50fc49d18b1a4024ed959be4fff00485731c9e622b8c8e89f7c1a98
7
- data.tar.gz: e9741f2fe2db83a7650dd2272b9f79cfa7e5bc4b3c2989cae0d8390215459a386a545f23eb0163e350e6e32a7dca7963c9a9bfcdb65496dfa062051a2c023aad
6
+ metadata.gz: 9eb4e7749b9a9a0824770921d150e180ed5b40ba19a7f22d1f65154474347110221dc96049c2b4b5d7136c850c5775c07bc4e840b005dda13043742ac74238d2
7
+ data.tar.gz: 427d6b00c913174e535de300020f8fe715bda9b3f946f1fbe25906dfa734bb4dd3c349735470fbacb9740c287dd5252bcf6b481e40120daba3138afda6f334e9
Binary file
data.tar.gz.sig CHANGED
Binary file
@@ -2,8 +2,13 @@
2
2
 
3
3
  ## [Unreleased][master]
4
4
 
5
+ ## [0.2.27] (2020-09-16)
6
+ - introduce `Diffend::RequestObject` ([#40](https://github.com/diffend-io/diffend-ruby/pull/40))
7
+ - clean up error codes and introduce `DIFFEND_INGORE_EXCEPTIONS` ([#41](https://github.com/diffend-io/diffend-ruby/pull/41))
8
+ - introduce `Diffend::Monitor` and `Diffend::Track` ([#15](https://github.com/diffend-io/diffend-ruby/pull/15))
9
+
5
10
  ## [0.2.26] (2020-09-10)
6
- - introduce DIFFEND_DEVELOPMENT environment variable ([#36](https://github.com/diffend-io/diffend-ruby/pull/36))
11
+ - introduce `DIFFEND_DEVELOPMENT` environment variable ([#36](https://github.com/diffend-io/diffend-ruby/pull/36))
7
12
  - adjust message for allow verdict ([#37](https://github.com/diffend-io/diffend-ruby/pull/37))
8
13
  - do not run the plugin when it is not enabled ([#38](https://github.com/diffend-io/diffend-ruby/pull/38))
9
14
 
@@ -55,7 +60,8 @@
55
60
 
56
61
  - initial release
57
62
 
58
- [master]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.26...HEAD
63
+ [master]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.27...HEAD
64
+ [0.2.27]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.26...v0.2.27
59
65
  [0.2.26]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.25...v0.2.26
60
66
  [0.2.25]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.24...v0.2.25
61
67
  [0.2.24]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.23...v0.2.24
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- diffend (0.2.26)
4
+ diffend (0.2.27)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -15,8 +15,10 @@
15
15
  handle_errors/build_exception_payload
16
16
  handle_errors/display_to_stdout
17
17
  handle_errors/report
18
+ request_object
18
19
  request
19
20
  voting
21
+ track
20
22
  ].each { |file| require "diffend/#{file}" }
21
23
 
22
24
  %w[
@@ -27,7 +29,7 @@
27
29
  # Diffend main namespace
28
30
  module Diffend
29
31
  # Current plugin version
30
- VERSION = '0.2.26'
32
+ VERSION = '0.2.27'
31
33
  # Diffend homepage
32
34
  HOMEPAGE = 'https://diffend.io'
33
35
 
@@ -56,13 +58,22 @@ module Diffend
56
58
  Bundler.default_lockfile
57
59
  )
58
60
  )
61
+ rescue Diffend::Errors::HandledException
62
+ return if ENV['DIFFEND_IGNORE_ERRORS'] == 'true'
63
+
64
+ exit 255
59
65
  rescue StandardError => e
60
66
  Diffend::HandleErrors::Report.call(
61
67
  exception: e,
62
68
  config: config,
63
69
  message: :unhandled_exception,
64
- report: true
70
+ report: true,
71
+ raise_exception: false
65
72
  )
73
+
74
+ return if ENV['DIFFEND_IGNORE_ERRORS'] == 'true'
75
+
76
+ exit 255
66
77
  end
67
78
 
68
79
  def verify_version
@@ -72,7 +83,7 @@ module Diffend
72
83
  build_outdated_version_message(installed_version)
73
84
  .tap(&Bundler.ui.method(:error))
74
85
 
75
- exit 1
86
+ exit 2
76
87
  end
77
88
 
78
89
  # @return [String] installed plugin version
@@ -3,9 +3,11 @@
3
3
  module Diffend
4
4
  # Modules grouping supported bundler commands
5
5
  module Commands
6
- # Install bundler command
6
+ # Bundler install command
7
7
  INSTALL = 'install'
8
- # Update bundler command
8
+ # Bundler update command
9
9
  UPDATE = 'update'
10
+ # Bundler exec command
11
+ EXEC = 'exec'
10
12
  end
11
13
  end
@@ -27,16 +27,20 @@ module Diffend
27
27
  build(build_path)
28
28
  rescue Errors::MissingConfigurationFile
29
29
  Bundler.ui.error(build_missing_error_message(build_path))
30
- exit 1
30
+
31
+ raise Diffend::Errors::HandledException
31
32
  rescue Errors::EmptyConfigurationFile
32
33
  Bundler.ui.error(build_empty_error_message(build_path))
33
- exit 1
34
+
35
+ raise Diffend::Errors::HandledException
34
36
  rescue Errors::MalformedConfigurationFile
35
37
  Bundler.ui.error(build_malformed_error_message(build_path))
36
- exit 1
38
+
39
+ raise Diffend::Errors::HandledException
37
40
  rescue *MISSING_KEY_ERRORS => e
38
41
  Bundler.ui.error(build_missing_key_error_message(e))
39
- exit 1
42
+
43
+ raise Diffend::Errors::HandledException
40
44
  end
41
45
 
42
46
  private
@@ -21,5 +21,7 @@ module Diffend
21
21
  BuildPathMissingInConfigurationFile = Class.new(BaseError)
22
22
  # Raised when server-side error occurs
23
23
  RequestServerError = Class.new(BaseError)
24
+ # Raised when we had an exception that we know how to handle
25
+ HandledException = Class.new(BaseError)
24
26
  end
25
27
  end
@@ -12,9 +12,10 @@ module Diffend
12
12
  # @param config [OpenStruct] Diffend config
13
13
  # @param message [Symbol] message that we want to display
14
14
  # @param report [Boolean] if true we will report the issue to diffend
15
+ # @param raise_exception [Boolean] if true we will raise an exception
15
16
  #
16
17
  # @return [Net::HTTPResponse] response from Diffend
17
- def call(config:, message:, exception: nil, payload: {}, report: false)
18
+ def call(config:, message:, exception: nil, payload: {}, report: false, raise_exception: true)
18
19
  exception_payload = prepare_exception_payload(exception, payload)
19
20
 
20
21
  Bundler.ui.error(Diffend::HandleErrors::Messages::PAYLOAD_DUMP)
@@ -22,13 +23,24 @@ module Diffend
22
23
 
23
24
  if report
24
25
  Diffend::Request.call(
25
- config,
26
- errors_url(config.project_id),
27
- exception_payload
26
+ build_request_object(config, exception_payload)
28
27
  )
29
28
  end
30
29
 
31
- exit 1
30
+ raise Diffend::Errors::HandledException if raise_exception
31
+ end
32
+
33
+ # @param config [OpenStruct] diffend config
34
+ # @param payload [Hash]
35
+ #
36
+ # @return [Diffend::RequestObject]
37
+ def build_request_object(config, payload)
38
+ Diffend::RequestObject.new(
39
+ config: config,
40
+ url: errors_url(config.project_id),
41
+ payload: payload,
42
+ request_method: :post
43
+ )
32
44
  end
33
45
 
34
46
  # Prepare exception payload and display it to stdout
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ %w[
4
+ build_bundler_definition
5
+ errors
6
+ config/fetcher
7
+ config/file_finder
8
+ config/validator
9
+ commands
10
+ handle_errors/messages
11
+ handle_errors/build_exception_payload
12
+ handle_errors/display_to_stdout
13
+ handle_errors/report
14
+ request_object
15
+ request
16
+ voting
17
+ track
18
+ ].each { |file| require "diffend/#{file}" }
19
+
20
+ %w[
21
+ versions/local
22
+ versions/remote
23
+ ].each { |file| require "diffend/voting/#{file}" }
24
+
25
+ Thread.new do
26
+ track = Diffend::Track.new
27
+ track.start
28
+ end
@@ -42,16 +42,21 @@ module Diffend
42
42
  class << self
43
43
  # Execute request
44
44
  #
45
- # @param config [OpenStruct] diffend config
46
- # @param endpoint_url [String]
47
- # @param payload [Hash]
45
+ # @param request_object [Diffend::RequestObject]
48
46
  #
49
47
  # @return [Net::HTTPResponse] response from Diffend
50
- def call(config, endpoint_url, payload)
48
+ def call(request_object)
51
49
  retry_count ||= -1
52
50
 
53
- build_http(endpoint_url) do |http, uri|
54
- response = http.request(build_request(uri, config, payload))
51
+ build_http(request_object.url) do |http, uri|
52
+ response = http.request(
53
+ build_request(
54
+ uri,
55
+ request_object.request_method,
56
+ request_object.config,
57
+ request_object.payload
58
+ )
59
+ )
55
60
 
56
61
  if SERVER_ERRORS.include?(response.code.to_i)
57
62
  raise Diffend::Errors::RequestServerError, response.code.to_i
@@ -66,8 +71,8 @@ module Diffend
66
71
 
67
72
  Diffend::HandleErrors::Report.call(
68
73
  exception: e,
69
- payload: payload,
70
- config: config,
74
+ payload: request_object.payload,
75
+ config: request_object.config,
71
76
  message: :request_error
72
77
  )
73
78
  rescue *CONNECTION_EXCEPTIONS => e
@@ -77,8 +82,8 @@ module Diffend
77
82
 
78
83
  Diffend::HandleErrors::Report.call(
79
84
  exception: e,
80
- payload: payload,
81
- config: config,
85
+ payload: request_object.payload,
86
+ config: request_object.config,
82
87
  message: :request_error
83
88
  )
84
89
  rescue *TIMEOUT_EXCEPTIONS => e
@@ -88,8 +93,8 @@ module Diffend
88
93
 
89
94
  Diffend::HandleErrors::Report.call(
90
95
  exception: e,
91
- payload: payload,
92
- config: config,
96
+ payload: request_object.payload,
97
+ config: request_object.config,
93
98
  message: :request_error
94
99
  )
95
100
  end
@@ -126,17 +131,32 @@ module Diffend
126
131
  # Build http post request and assigns headers and payload
127
132
  #
128
133
  # @param uri [URI::HTTPS]
134
+ # @param request_method [Symbol]
129
135
  # @param config [OpenStruct] Diffend config
130
136
  # @param payload [Hash] with versions to check
131
137
  #
132
- # @return [Net::HTTP::Post]
133
- def build_request(uri, config, payload)
134
- Net::HTTP::Post
138
+ # @return [Net::HTTP::Post, Net::HTTP::Put]
139
+ def build_request(uri, request_method, config, payload)
140
+ pick_request_method(request_method)
135
141
  .new(uri.request_uri, HEADERS)
136
142
  .tap { |request| assign_auth(request, config) }
137
143
  .tap { |request| assign_payload(request, payload) }
138
144
  end
139
145
 
146
+ # Pick request method
147
+ #
148
+ # @param request_method [Symbol]
149
+ #
150
+ # @return [Net::HTTP::Post, Net::HTTP::Put]
151
+ def pick_request_method(request_method)
152
+ case request_method
153
+ when :post
154
+ Net::HTTP::Post
155
+ when :put
156
+ Net::HTTP::Put
157
+ end
158
+ end
159
+
140
160
  # Assigns basic authorization if provided in the config
141
161
  #
142
162
  # @param request [Net::HTTP::Post] prepared http post
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Diffend
4
+ # Class responsible for preparing diffend request object
5
+ RequestObject = Struct.new(:config, :url, :payload, :request_method, keyword_init: true)
6
+ end
@@ -0,0 +1,104 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Diffend
4
+ # Track what is run in production
5
+ class Track
6
+ # Time that we want to wait between track requests
7
+ TRACK_SLEEP = 15
8
+ # Time that we want to wait before we retry
9
+ RETRY_SLEEP = 15
10
+
11
+ # Initialize tracking
12
+ def initialize
13
+ @mutex = Mutex.new
14
+ @config = fetch_config
15
+ end
16
+
17
+ # Start tracking
18
+ def start
19
+ response = exec_request
20
+
21
+ perform(response['id'])
22
+ rescue Diffend::Errors::HandledException
23
+ sleep(RETRY_SLEEP)
24
+
25
+ retry
26
+ rescue StandardError => e
27
+ Diffend::HandleErrors::Report.call(
28
+ exception: e,
29
+ config: @config,
30
+ message: :unhandled_exception,
31
+ report: true,
32
+ raise_exception: false
33
+ )
34
+
35
+ sleep(RETRY_SLEEP)
36
+
37
+ retry
38
+ end
39
+
40
+ # @param request_id [String]
41
+ def perform(request_id)
42
+ loop do
43
+ @mutex.synchronize do
44
+ track_request(request_id)
45
+ end
46
+
47
+ sleep(TRACK_SLEEP)
48
+ end
49
+ end
50
+
51
+ # Perform an exec request
52
+ def exec_request
53
+ Diffend::Voting.call(
54
+ Diffend::Commands::EXEC,
55
+ @config,
56
+ Diffend::BuildBundlerDefinition.call(
57
+ Diffend::Commands::EXEC,
58
+ Bundler.default_gemfile,
59
+ Bundler.default_lockfile
60
+ )
61
+ )
62
+ end
63
+
64
+ # Perform a track request
65
+ #
66
+ # @param request_id [String]
67
+ def track_request(request_id)
68
+ Diffend::Request.call(
69
+ build_request_object(request_id)
70
+ )
71
+ end
72
+
73
+ # @param request_id [String]
74
+ #
75
+ # @return [Diffend::RequestObject]
76
+ def build_request_object(request_id)
77
+ Diffend::RequestObject.new(
78
+ config: @config,
79
+ url: track_url(@config.project_id, request_id),
80
+ payload: { id: request_id }.freeze,
81
+ request_method: :put
82
+ ).freeze
83
+ end
84
+
85
+ # Fetch diffend config file
86
+ #
87
+ # @return [OpenStruct, nil] configuration object
88
+ #
89
+ # @raise [Errors::MissingConfigurationFile] when no config file
90
+ def fetch_config
91
+ Config::Fetcher.call(
92
+ File.expand_path('..', Bundler.bin_path)
93
+ )
94
+ end
95
+
96
+ # @param project_id [String] diffend project_id
97
+ # @param request_id [String]
98
+ #
99
+ # @return [String]
100
+ def track_url(project_id, request_id)
101
+ "https://my.diffend.io/api/projects/#{project_id}/bundle/#{request_id}/track"
102
+ end
103
+ end
104
+ end
@@ -38,7 +38,7 @@ module Diffend
38
38
  build_error_message(response)
39
39
  .tap(&Bundler.ui.method(:error))
40
40
 
41
- exit 1
41
+ raise Diffend::Errors::HandledException
42
42
  end
43
43
 
44
44
  # @param command [String] either install or update
@@ -40,7 +40,7 @@ module Diffend
40
40
  instance = new(definition)
41
41
 
42
42
  case command
43
- when Commands::INSTALL then instance.build_install
43
+ when Commands::INSTALL, Commands::EXEC then instance.build_install
44
44
  when Commands::UPDATE then instance.build_update
45
45
  else
46
46
  raise ArgumentError, "invalid command: #{command}"
@@ -25,9 +25,7 @@ module Diffend
25
25
  payload = payload(command, config.project_id, definition)
26
26
 
27
27
  response = Diffend::Request.call(
28
- config,
29
- commands_url(command, config.project_id),
30
- payload
28
+ build_request_object(command, config, payload)
31
29
  )
32
30
 
33
31
  JSON.parse(response.body)
@@ -41,6 +39,20 @@ module Diffend
41
39
  )
42
40
  end
43
41
 
42
+ # @param command [String] either install or update
43
+ # @param config [OpenStruct] diffend config
44
+ # @param payload [Hash]
45
+ #
46
+ # @return [Diffend::RequestObject]
47
+ def build_request_object(command, config, payload)
48
+ Diffend::RequestObject.new(
49
+ config: config,
50
+ url: commands_url(command, config.project_id),
51
+ payload: payload,
52
+ request_method: :post
53
+ )
54
+ end
55
+
44
56
  # Build diffend, host, packages, and platform specific information
45
57
  #
46
58
  # @param command [String] either install or update
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: diffend
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.26
4
+ version: 0.2.27
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tomasz Pajor
@@ -34,7 +34,7 @@ cert_chain:
34
34
  9MmF6uCQa1EjK2p8tYT0MnbHrFkoehxdX4VO9y99GAkhZyJNKPYPtyAUFV27sT2V
35
35
  LfCJRk4ifKIN/FUCwDSn8Cz0m6oH265q0p6wdzI6qrWOjP8tGOMBTA==
36
36
  -----END CERTIFICATE-----
37
- date: 2020-09-10 00:00:00.000000000 Z
37
+ date: 2020-09-16 00:00:00.000000000 Z
38
38
  dependencies:
39
39
  - !ruby/object:Gem::Dependency
40
40
  name: bundler
@@ -102,7 +102,10 @@ files:
102
102
  - lib/diffend/handle_errors/display_to_stdout.rb
103
103
  - lib/diffend/handle_errors/messages.rb
104
104
  - lib/diffend/handle_errors/report.rb
105
+ - lib/diffend/monitor.rb
105
106
  - lib/diffend/request.rb
107
+ - lib/diffend/request_object.rb
108
+ - lib/diffend/track.rb
106
109
  - lib/diffend/voting.rb
107
110
  - lib/diffend/voting/versions/local.rb
108
111
  - lib/diffend/voting/versions/remote.rb
metadata.gz.sig CHANGED
Binary file