diffend 0.2.26 → 0.2.27

Sign up to get free protection for your applications and to get access to all the features.
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