diffend 0.2.19 → 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: 0f18edf14b16e7f2ec3ce0c574ade976e78e3eac84f8395e45fc53595a8e3f91
4
- data.tar.gz: 292e755dac0d191787b77fb8556b5e2f90f9e040ee9e28486de90601b2c2a67c
3
+ metadata.gz: f6539b727e33d38eb0b3fb6f38f25c3fd2abda05f337f50af2db1fe135575510
4
+ data.tar.gz: c6808082290c195a846117fd4c16a4fa4cb20f65cc289cbadbd71532f8ae5713
5
5
  SHA512:
6
- metadata.gz: 73326da64425debc8c27ad1dd216df34313a45795a2c6f555d0e5df067dfc17977ae9ee6e8307ab1df33af58a87ca23511ed3920eaa9c0bcec566fef602c30c3
7
- data.tar.gz: eabf666e6c1ef7a08afaadf519011edac2416f0a2fa13152a9112b898b94dde1f598f23866a9823220be308aa091d9dab6b6d03e95191f3d22ba43509d3933fa
6
+ metadata.gz: 9eb4e7749b9a9a0824770921d150e180ed5b40ba19a7f22d1f65154474347110221dc96049c2b4b5d7136c850c5775c07bc4e840b005dda13043742ac74238d2
7
+ data.tar.gz: 427d6b00c913174e535de300020f8fe715bda9b3f946f1fbe25906dfa734bb4dd3c349735470fbacb9740c287dd5252bcf6b481e40120daba3138afda6f334e9
@@ -1,2 +1,2 @@
1
- 4��
2
- -���s?�<>�sQ�W��fAR�� ��Y�|��-?�4n o}s�Y��m��J��Y���r*L>6J��8�\�� ~[�Ş�5Y��ՃF4��0'e��cG�����0�Ӆ��l��Ć�*���*�mx9d�l���+
1
+ �Ękoش�_��Ip��B�GZ�hήO���D�[���S�;��o��x�"Q�������#I� �ir� h����H��o�� ��E��R^��[Ñ~����fg*��ᢩ{H-�s'�:��2cI�NX��r]w˛� �qo���$��_�5�9��.G�H�P�
2
+ ������2��LE>��=�L$6�;Y��{���`{�=��G���_JĬ��V{#jB-G!b��*{�T9= ��_cC��7��̂̈́V�9>m*Fs���� 0���0�$�X�:u4��� ��"�5D��{K9CIz` �K�1��O�P��Py��Ѱ�3����\���_����S:��<;�vA����9 �;�@�+#�&�
data.tar.gz.sig CHANGED
Binary file
@@ -9,6 +9,9 @@ jobs:
9
9
  matrix:
10
10
  ruby:
11
11
  - '2.7'
12
+ - '2.6'
13
+ - '2.5'
14
+ - 'jruby'
12
15
  include:
13
16
  - ruby: '2.7'
14
17
  coverage: 'true'
@@ -31,6 +34,8 @@ jobs:
31
34
  run: |
32
35
  gem install bundler --no-document
33
36
  - name: Bundle install
37
+ env:
38
+ DIFFEND_DEVELOPMENT: true
34
39
  run: |
35
40
  bundle config path vendor/bundle
36
41
  bundle install --jobs 4 --retry 3
@@ -2,6 +2,44 @@
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
+
10
+ ## [0.2.26] (2020-09-10)
11
+ - introduce `DIFFEND_DEVELOPMENT` environment variable ([#36](https://github.com/diffend-io/diffend-ruby/pull/36))
12
+ - adjust message for allow verdict ([#37](https://github.com/diffend-io/diffend-ruby/pull/37))
13
+ - do not run the plugin when it is not enabled ([#38](https://github.com/diffend-io/diffend-ruby/pull/38))
14
+
15
+ ## [0.2.25] (2020-09-09)
16
+ - add support for a warn verdict ([#34](https://github.com/diffend-io/diffend-ruby/pull/34))
17
+
18
+ ## [0.2.24] (2020-09-08)
19
+ - better error handling of response ([#28](https://github.com/diffend-io/diffend-ruby/pull/28))
20
+ - fix jruby specs ([#29](https://github.com/diffend-io/diffend-ruby/pull/29))
21
+ - handle request server errors ([#30](https://github.com/diffend-io/diffend-ruby/pull/30))
22
+ - better detection of gem source ([#31](https://github.com/diffend-io/diffend-ruby/pull/31))
23
+ - detect if we are running outdated version of the plugin ([#32](https://github.com/diffend-io/diffend-ruby/pull/32))
24
+
25
+ ## [0.2.23] (2020-09-06)
26
+ - fix how we build gem platform ([#26](https://github.com/diffend-io/diffend-ruby/pull/26))
27
+ - test against jruby, ruby-2.5 and ruby-2.6 ([#25](https://github.com/diffend-io/diffend-ruby/pull/25))
28
+
29
+ ## [0.2.22] (2020-09-03)
30
+ - fix how we build host command
31
+
32
+ ## [0.2.21] (2020-09-03)
33
+ - bring back support for ruby 2.5.x
34
+
35
+ ## [0.2.20] (2020-09-03)
36
+ - expose host command ([#21](https://github.com/diffend-io/diffend-ruby/pull/21))
37
+ - expose host pid ([#20](https://github.com/diffend-io/diffend-ruby/pull/20))
38
+ - use `Bundler.feature_flag.default_cli_command` which is used as the default task if no command provided, instead of `Diffend::Commands::INSTALL` ([#19](https://github.com/diffend-io/diffend-ruby/pull/19))
39
+ - better error handling ([#18](https://github.com/diffend-io/diffend-ruby/pull/18))
40
+ - better detection of gem versions ([#17](https://github.com/diffend-io/diffend-ruby/pull/17))
41
+ - introduce `Diffend::BuildBundlerDefinition` ([#16](https://github.com/diffend-io/diffend-ruby/pull/16))
42
+
5
43
  ## [0.2.19] (2020-08-18)
6
44
 
7
45
  - better detection of gem sources ([#13](https://github.com/diffend-io/diffend-ruby/pull/13))
@@ -22,7 +60,15 @@
22
60
 
23
61
  - initial release
24
62
 
25
- [master]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.19...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
65
+ [0.2.26]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.25...v0.2.26
66
+ [0.2.25]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.24...v0.2.25
67
+ [0.2.24]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.23...v0.2.24
68
+ [0.2.23]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.22...v0.2.23
69
+ [0.2.22]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.21...v0.2.22
70
+ [0.2.21]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.20...v0.2.21
71
+ [0.2.20]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.19...v0.2.20
26
72
  [0.2.19]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.18...v0.2.19
27
73
  [0.2.18]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.17...v0.2.18
28
74
  [0.2.17]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.16...v0.2.17
data/Gemfile CHANGED
@@ -7,6 +7,7 @@ plugin 'diffend'
7
7
  gemspec
8
8
 
9
9
  group :development, :test do
10
- gem 'byebug'
10
+ gem 'byebug', platform: :ruby
11
+ gem 'pry', platform: :jruby
11
12
  gem 'rspec'
12
13
  end
@@ -1,13 +1,20 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- diffend (0.2.19)
4
+ diffend (0.2.27)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
9
  byebug (11.1.3)
10
+ coderay (1.1.3)
10
11
  diff-lcs (1.4.4)
12
+ ffi (1.13.1-java)
13
+ method_source (1.0.0)
14
+ pry (0.13.1-java)
15
+ coderay (~> 1.1)
16
+ method_source (~> 1.0)
17
+ spoon (~> 0.0)
11
18
  rake (13.0.1)
12
19
  rspec (3.9.0)
13
20
  rspec-core (~> 3.9.0)
@@ -22,14 +29,18 @@ GEM
22
29
  diff-lcs (>= 1.2.0, < 2.0)
23
30
  rspec-support (~> 3.9.0)
24
31
  rspec-support (3.9.3)
32
+ spoon (0.0.6)
33
+ ffi
25
34
 
26
35
  PLATFORMS
36
+ java
27
37
  ruby
28
38
 
29
39
  DEPENDENCIES
30
40
  bundler
31
41
  byebug
32
42
  diffend!
43
+ pry
33
44
  rake
34
45
  rspec
35
46
 
@@ -5,16 +5,23 @@
5
5
  ].each(&method(:require))
6
6
 
7
7
  %w[
8
+ build_bundler_definition
8
9
  errors
9
10
  config/fetcher
10
11
  config/file_finder
11
12
  config/validator
12
13
  commands
14
+ handle_errors/messages
15
+ handle_errors/build_exception_payload
16
+ handle_errors/display_to_stdout
17
+ handle_errors/report
18
+ request_object
19
+ request
13
20
  voting
21
+ track
14
22
  ].each { |file| require "diffend/#{file}" }
15
23
 
16
24
  %w[
17
- request
18
25
  versions/local
19
26
  versions/remote
20
27
  ].each { |file| require "diffend/voting/#{file}" }
@@ -22,7 +29,7 @@
22
29
  # Diffend main namespace
23
30
  module Diffend
24
31
  # Current plugin version
25
- VERSION = '0.2.19'
32
+ VERSION = '0.2.27'
26
33
  # Diffend homepage
27
34
  HOMEPAGE = 'https://diffend.io'
28
35
 
@@ -30,35 +37,106 @@ module Diffend
30
37
  # Registers the plugin and add before install all hook
31
38
  def register
32
39
  Bundler::Plugin.add_hook('before-install-all') do |_|
33
- Diffend::Voting.call(
34
- command,
35
- build_definition(command)
36
- )
40
+ execute
37
41
  end
38
42
  end
39
43
 
40
- # Build clean instance of bundler definition, as we don't want to pollute the main one
41
- #
42
- # @param command [String] bundler command that we are executing
43
- #
44
- # @return [Bundler::Definition]
45
- def build_definition(command)
46
- unlock = command == 'update' ? true : nil
44
+ # Execute diffend plugin
45
+ def execute
46
+ return unless enabled?
47
+
48
+ verify_version
49
+
50
+ config = fetch_config
47
51
 
48
- Bundler.configure
52
+ Diffend::Voting.call(
53
+ command,
54
+ config,
55
+ Diffend::BuildBundlerDefinition.call(
56
+ command,
57
+ Bundler.default_gemfile,
58
+ Bundler.default_lockfile
59
+ )
60
+ )
61
+ rescue Diffend::Errors::HandledException
62
+ return if ENV['DIFFEND_IGNORE_ERRORS'] == 'true'
49
63
 
50
- Bundler::Definition.build(
51
- Bundler.default_gemfile,
52
- Bundler.default_lockfile,
53
- unlock
64
+ exit 255
65
+ rescue StandardError => e
66
+ Diffend::HandleErrors::Report.call(
67
+ exception: e,
68
+ config: config,
69
+ message: :unhandled_exception,
70
+ report: true,
71
+ raise_exception: false
54
72
  )
73
+
74
+ return if ENV['DIFFEND_IGNORE_ERRORS'] == 'true'
75
+
76
+ exit 255
77
+ end
78
+
79
+ def verify_version
80
+ return if ENV['DIFFEND_DEVELOPMENT'] == 'true'
81
+ return if installed_version == VERSION
82
+
83
+ build_outdated_version_message(installed_version)
84
+ .tap(&Bundler.ui.method(:error))
85
+
86
+ exit 2
87
+ end
88
+
89
+ # @return [String] installed plugin version
90
+ def installed_version
91
+ Bundler::Plugin
92
+ .index
93
+ .plugin_path('diffend')
94
+ .basename
95
+ .to_s
96
+ .split('-')
97
+ .last
98
+ end
99
+
100
+ # Checks if plugin is enabled
101
+ #
102
+ # @return [Boolean] true if enabled, false otherwise
103
+ def enabled?
104
+ Bundler
105
+ .default_gemfile
106
+ .read
107
+ .split("\n")
108
+ .reject(&:empty?)
109
+ .map(&:strip)
110
+ .select { |line| line.start_with?('plugin') }
111
+ .any? { |line| line.include?('diffend') }
112
+ end
113
+
114
+ # @param version [Hash] installed version
115
+ #
116
+ # @return [String]
117
+ def build_outdated_version_message(version)
118
+ <<~MSG
119
+ \nYou are running an outdated version (#{version}) of the plugin, which will lead to issues.
120
+ \nPlease upgrade to the latest one (#{VERSION}) by executing "rm -rf .bundle/plugin".\n
121
+ MSG
55
122
  end
56
123
 
57
124
  # Command that was run with bundle
58
125
  #
59
126
  # @return [String]
60
127
  def command
61
- ARGV.first || Diffend::Commands::INSTALL
128
+ ARGV.first || Bundler.feature_flag.default_cli_command.to_s
129
+ end
130
+
131
+ # Fetch diffend config file
132
+ #
133
+ # @return [OpenStruct, nil] configuration object
134
+ #
135
+ # @raise [Errors::MissingConfigurationFile] when no config file
136
+ def fetch_config
137
+ Config::Fetcher.call(
138
+ File.expand_path('..', Bundler.bin_path)
139
+ )
62
140
  end
63
141
  end
64
142
  end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Diffend
4
+ # Builds bundler definition used within the plugin
5
+ module BuildBundlerDefinition
6
+ class << self
7
+ # Build clean instance of bundler definition, as we don't want to pollute the main one
8
+ #
9
+ # @param command [String] bundler command that we are executing
10
+ # @param gemfile [String] path to Gemfile
11
+ # @param lockfile [String] path to Gemfile.lock
12
+ #
13
+ # @return [Bundler::Definition]
14
+ def call(command, gemfile, lockfile)
15
+ unlock = command == 'update' ? true : nil
16
+
17
+ Bundler.configure
18
+ Bundler::Fetcher.disable_endpoint = nil
19
+
20
+ Bundler::Definition
21
+ .build(gemfile, lockfile, unlock)
22
+ .tap(&:validate_runtime!)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -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
@@ -19,9 +19,9 @@ module Diffend
19
19
  ShareableKeyMissingInConfigurationFile = Class.new(BaseError)
20
20
  # Raised when build_path is missing in configuration file
21
21
  BuildPathMissingInConfigurationFile = Class.new(BaseError)
22
- # When unsupported response returned from the endpoint
23
- UnsupportedResponse = Class.new(BaseError)
24
- # When unsupported action returned from the endpoint
25
- UnsupportedAction = Class.new(BaseError)
22
+ # Raised when server-side error occurs
23
+ RequestServerError = Class.new(BaseError)
24
+ # Raised when we had an exception that we know how to handle
25
+ HandledException = Class.new(BaseError)
26
26
  end
27
27
  end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ module Diffend
6
+ module HandleErrors
7
+ # Module responsible for building exception payload
8
+ module BuildExceptionPayload
9
+ class << self
10
+ # Build exception payload
11
+ #
12
+ # @param exception [Exception, NilClass] expection that was raised
13
+ # @param payload [Hash] with versions to check
14
+ #
15
+ # @return [Hash]
16
+ def call(exception, payload)
17
+ {
18
+ request_id: SecureRandom.uuid,
19
+ payload: payload,
20
+ exception: {
21
+ class: exception&.class,
22
+ message: exception&.message,
23
+ backtrace: exception&.backtrace
24
+ }
25
+ }.freeze
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Diffend
4
+ module HandleErrors
5
+ # Module responsible for displaying exception payload to stdout
6
+ module DisplayToStdout
7
+ class << self
8
+ # Display exception payload to stdout
9
+ #
10
+ # @param exception_payload [Hash]
11
+ def call(exception_payload)
12
+ puts exception_payload.to_json
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Diffend
4
+ module HandleErrors
5
+ module Messages
6
+ PAYLOAD_DUMP = '^^^ Above is the dump of your request ^^^'
7
+ UNHANDLED_EXCEPTION = <<~MSG
8
+ \nSomething went really wrong. We recorded this incident in our system and will review it.\n
9
+ This is a bug, don't hesitate.\n
10
+ Create an issue at https://github.com/diffend-io/diffend-ruby/issues\n
11
+ MSG
12
+ UNSUPPORTED_RESPONSE = <<~MSG
13
+ \nAPI returned an unsupported response. We recorded this incident in our system and will review it.\n
14
+ This is a bug, don't hesitate.\n
15
+ Create an issue at https://github.com/diffend-io/diffend-ruby/issues\n
16
+ MSG
17
+ UNSUPPORTED_VERDICT = <<~MSG
18
+ \nAPI returned an unsupported verdict. We recorded this incident in our system and will review it.\n
19
+ This is a bug, don't hesitate.\n
20
+ Create an issue at https://github.com/diffend-io/diffend-ruby/issues\n
21
+ MSG
22
+ REQUEST_ERROR = <<~MSG
23
+ \nWe were unable to process your request at this time. We recorded this incident in our system and will review it.\n
24
+ If you think that this is a bug, don't hesitate.\n
25
+ Create an issue at https://github.com/diffend-io/diffend-ruby/issues\n
26
+ MSG
27
+ end
28
+ end
29
+ end