diffend 0.2.16 → 0.2.24

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: d23a558405ac69141d76368e9a642d153300c2a9bb01fd67b9c8f3c949a9225b
4
- data.tar.gz: 5d74b929a8debf7c7a32aa0cb8d01e9f51c373b0859468a3936e40a1bccc1004
3
+ metadata.gz: 5bc33803e8086ca502424fae528475182c196daf3b5971200a7988fca0936822
4
+ data.tar.gz: 138b0750cff7e555d62f82ca8716b4d21dbd32fd5c6de898fd7c7653d7c56501
5
5
  SHA512:
6
- metadata.gz: 8fe13be65aad9dda4c8a4cf3341851d691f253e4dc2d3d4a31e1da2bba92bffb2902e69ea08f78a5d3a9c6a5fb3f233abf72dd569d732df317aa5f0d8748830b
7
- data.tar.gz: 86929a3b0259f8de839edfdd2901c203ed0e69d35a733d31860d6628c71a5874097efd3a08fb4203e4fa4768f110d5d36ec192f064b144b1a99c8c208111be0f
6
+ metadata.gz: bf6b14a1ca18e978b709905159b17caacb5cc5a2812ecb1b655961041e44134eed33d840ac3679b451aa49b33f2dcf7f96ffa6e5535a102f7799cf927fb8e9af
7
+ data.tar.gz: 39e1f326632af4f2f658d027ebb8277fd1b24262a9e1fd90a10747c8d85e1bf7ead72c65c44716af7a4d4f06a746d0be008b1a76fb82ba88034c1b1c6cdcf04f
Binary file
data.tar.gz.sig CHANGED
Binary file
@@ -3,16 +3,27 @@ name: ci
3
3
  jobs:
4
4
  specs:
5
5
  runs-on: ubuntu-latest
6
+
6
7
  strategy:
7
8
  fail-fast: false
8
9
  matrix:
9
10
  ruby:
10
11
  - '2.7'
12
+ - '2.6'
13
+ - '2.5'
14
+ - 'jruby'
11
15
  include:
12
16
  - ruby: '2.7'
13
17
  coverage: 'true'
18
+
14
19
  steps:
15
20
  - uses: actions/checkout@v2
21
+ - uses: actions/cache@v2
22
+ with:
23
+ path: vendor/bundle
24
+ key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }}
25
+ restore-keys: |
26
+ ${{ runner.os }}-gems-
16
27
  - name: Install package dependencies
17
28
  run: "[ -e $APT_DEPS ] || sudo apt-get install -y --no-install-recommends $APT_DEPS"
18
29
  - name: Set up Ruby
@@ -22,10 +33,9 @@ jobs:
22
33
  - name: Install latest bundler
23
34
  run: |
24
35
  gem install bundler --no-document
25
- bundle config set without 'tools benchmarks docs'
26
36
  - name: Bundle install
27
37
  run: |
28
- bundle config set without development
38
+ bundle config path vendor/bundle
29
39
  bundle install --jobs 4 --retry 3
30
40
  - name: Run all tests
31
41
  env:
@@ -0,0 +1,59 @@
1
+ # Changelog
2
+
3
+ ## [Unreleased][master]
4
+
5
+ ## [0.2.24] (2020-09-08)
6
+ - better error handling of response ([#28](https://github.com/diffend-io/diffend-ruby/pull/28))
7
+ - fix jruby specs ([#29](https://github.com/diffend-io/diffend-ruby/pull/29))
8
+ - handle request server errors ([#30](https://github.com/diffend-io/diffend-ruby/pull/30))
9
+ - better detection of gem source ([#31](https://github.com/diffend-io/diffend-ruby/pull/31))
10
+ - detect if we are running outdated version of the plugin ([#32](https://github.com/diffend-io/diffend-ruby/pull/32))
11
+
12
+ ## [0.2.23] (2020-09-06)
13
+ - fix how we build gem platform ([#26](https://github.com/diffend-io/diffend-ruby/pull/26))
14
+ - test against jruby, ruby-2.5 and ruby-2.6 ([#25](https://github.com/diffend-io/diffend-ruby/pull/25))
15
+
16
+ ## [0.2.22] (2020-09-03)
17
+ - fix how we build host command
18
+
19
+ ## [0.2.21] (2020-09-03)
20
+ - bring back support for ruby 2.5.x
21
+
22
+ ## [0.2.20] (2020-09-03)
23
+ - expose host command ([#21](https://github.com/diffend-io/diffend-ruby/pull/21))
24
+ - expose host pid ([#20](https://github.com/diffend-io/diffend-ruby/pull/20))
25
+ - 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))
26
+ - better error handling ([#18](https://github.com/diffend-io/diffend-ruby/pull/18))
27
+ - better detection of gem versions ([#17](https://github.com/diffend-io/diffend-ruby/pull/17))
28
+ - introduce `Diffend::BuildBundlerDefinition` ([#16](https://github.com/diffend-io/diffend-ruby/pull/16))
29
+
30
+ ## [0.2.19] (2020-08-18)
31
+
32
+ - better detection of gem sources ([#13](https://github.com/diffend-io/diffend-ruby/pull/13))
33
+
34
+ ## [0.2.18] (2020-08-05)
35
+
36
+ - use `Etc.getpwuid` instead of `Etc.getlogin` for fetching host user ([#11](https://github.com/diffend-io/diffend-ruby/pull/11))
37
+
38
+ ## [0.2.17] (2020-08-05)
39
+
40
+ - introduce config validation ([#9](https://github.com/diffend-io/diffend-ruby/pull/9))
41
+
42
+ ## [0.2.16] (2020-07-28)
43
+
44
+ - report unexpected errors ([#8](https://github.com/diffend-io/diffend-ruby/pull/8))
45
+
46
+ ## 0.2.15 (2020-06-07)
47
+
48
+ - initial release
49
+
50
+ [master]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.24...HEAD
51
+ [0.2.24]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.23...v0.2.24
52
+ [0.2.23]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.22...v0.2.23
53
+ [0.2.22]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.21...v0.2.22
54
+ [0.2.21]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.20...v0.2.21
55
+ [0.2.20]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.19...v0.2.20
56
+ [0.2.19]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.18...v0.2.19
57
+ [0.2.18]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.17...v0.2.18
58
+ [0.2.17]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.16...v0.2.17
59
+ [0.2.16]: https://github.com/diffend-io/diffend-ruby/compare/v0.2.15...v0.2.16
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.16)
4
+ diffend (0.2.24)
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
 
File without changes
@@ -5,15 +5,21 @@
5
5
  ].each(&method(:require))
6
6
 
7
7
  %w[
8
+ build_bundler_definition
9
+ errors
8
10
  config/fetcher
9
11
  config/file_finder
12
+ config/validator
10
13
  commands
11
- errors
14
+ handle_errors/messages
15
+ handle_errors/build_exception_payload
16
+ handle_errors/display_to_stdout
17
+ handle_errors/report
18
+ request
12
19
  voting
13
20
  ].each { |file| require "diffend/#{file}" }
14
21
 
15
22
  %w[
16
- request
17
23
  versions/local
18
24
  versions/remote
19
25
  ].each { |file| require "diffend/voting/#{file}" }
@@ -21,7 +27,7 @@
21
27
  # Diffend main namespace
22
28
  module Diffend
23
29
  # Current plugin version
24
- VERSION = '0.2.16'
30
+ VERSION = '0.2.24'
25
31
  # Diffend homepage
26
32
  HOMEPAGE = 'https://diffend.io'
27
33
 
@@ -29,35 +35,80 @@ module Diffend
29
35
  # Registers the plugin and add before install all hook
30
36
  def register
31
37
  Bundler::Plugin.add_hook('before-install-all') do |_|
32
- Diffend::Voting.call(
33
- command,
34
- build_definition(command)
35
- )
38
+ execute
36
39
  end
37
40
  end
38
41
 
39
- # Build clean instance of bundler definition, as we don't want to pollute the main one
40
- #
41
- # @param command [String] bundler command that we are executing
42
- #
43
- # @return [Bundler::Definition]
44
- def build_definition(command)
45
- unlock = command == 'update' ? true : nil
42
+ # Execute diffend plugin
43
+ def execute
44
+ detect_installed_version
46
45
 
47
- Bundler.configure
46
+ config = fetch_config
48
47
 
49
- Bundler::Definition.build(
50
- Bundler.default_gemfile,
51
- Bundler.default_lockfile,
52
- unlock
48
+ Diffend::Voting.call(
49
+ command,
50
+ config,
51
+ Diffend::BuildBundlerDefinition.call(
52
+ command,
53
+ Bundler.default_gemfile,
54
+ Bundler.default_lockfile
55
+ )
53
56
  )
57
+ rescue StandardError => e
58
+ Diffend::HandleErrors::Report.call(
59
+ exception: e,
60
+ config: config,
61
+ message: :unhandled_exception,
62
+ report: true
63
+ )
64
+ end
65
+
66
+ def detect_installed_version
67
+ return if installed_version == VERSION
68
+
69
+ build_outdated_version_message(installed_version)
70
+ .tap(&Bundler.ui.method(:error))
71
+
72
+ exit 1
73
+ end
74
+
75
+ # @param version [Hash] installed version
76
+ #
77
+ # @return [String]
78
+ def build_outdated_version_message(version)
79
+ <<~MSG
80
+ \nYou are running an outdated version (#{version}) of the plugin, which will lead to issues.
81
+ \nPlease upgrade to the latest one (#{VERSION}) by executing "rm -rf .bundle/plugin".\n
82
+ MSG
83
+ end
84
+
85
+ # @return [String] installed plugin version
86
+ def installed_version
87
+ Bundler::Plugin
88
+ .index
89
+ .plugin_path('diffend')
90
+ .basename
91
+ .to_s
92
+ .split('-')
93
+ .last
54
94
  end
55
95
 
56
96
  # Command that was run with bundle
57
97
  #
58
98
  # @return [String]
59
99
  def command
60
- ARGV.first || Diffend::Commands::INSTALL
100
+ ARGV.first || Bundler.feature_flag.default_cli_command.to_s
101
+ end
102
+
103
+ # Fetch diffend config file
104
+ #
105
+ # @return [OpenStruct, nil] configuration object
106
+ #
107
+ # @raise [Errors::MissingConfigurationFile] when no config file
108
+ def fetch_config
109
+ Config::Fetcher.call(
110
+ File.expand_path('..', Bundler.bin_path)
111
+ )
61
112
  end
62
113
  end
63
114
  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
@@ -7,22 +7,105 @@ module Diffend
7
7
  module Config
8
8
  # Class responsible for fetching the config from .diffend.yml
9
9
  module Fetcher
10
+ # All the errors for missing keys in the configuration file
11
+ MISSING_KEY_ERRORS = [
12
+ Errors::ProjectIdMissingInConfigurationFile,
13
+ Errors::ShareableIdMissingInConfigurationFile,
14
+ Errors::ShareableKeyMissingInConfigurationFile,
15
+ Errors::BuildPathMissingInConfigurationFile
16
+ ].freeze
17
+
10
18
  class << self
11
19
  # @param build_path [String] path of the current build
20
+ #
12
21
  # @return [OpenStruct] open struct with config details
22
+ #
13
23
  # @example
14
24
  # details = Fetcher.new.call('./')
15
25
  # details.build_path #=> './'
16
26
  def call(build_path)
17
- OpenStruct.new(
18
- YAML.safe_load(
19
- ERB.new(
20
- File.read(
21
- FileFinder.call(build_path)
22
- )
23
- ).result
24
- ).merge(build_path: build_path)
25
- )
27
+ build(build_path)
28
+ rescue Errors::MissingConfigurationFile
29
+ Bundler.ui.error(build_missing_error_message(build_path))
30
+ exit 1
31
+ rescue Errors::EmptyConfigurationFile
32
+ Bundler.ui.error(build_empty_error_message(build_path))
33
+ exit 1
34
+ rescue Errors::MalformedConfigurationFile
35
+ Bundler.ui.error(build_malformed_error_message(build_path))
36
+ exit 1
37
+ rescue *MISSING_KEY_ERRORS => e
38
+ Bundler.ui.error(build_missing_key_error_message(e))
39
+ exit 1
40
+ end
41
+
42
+ private
43
+
44
+ # @param build_path [String] path of the current build
45
+ #
46
+ # @return [OpenStruct] open struct with config details
47
+ def build(build_path)
48
+ content = ERB.new(
49
+ File.read(
50
+ FileFinder.call(build_path)
51
+ )
52
+ ).result
53
+
54
+ raise Errors::EmptyConfigurationFile if content.empty?
55
+
56
+ OpenStruct.new(parse_file(content).merge(build_path: build_path))
57
+ .tap(&Validator.method(:call))
58
+ end
59
+
60
+ def parse_file(content)
61
+ YAML.safe_load(content)
62
+ rescue Psych::SyntaxError
63
+ raise Errors::MalformedConfigurationFile
64
+ end
65
+
66
+ # @param build_path [String] path of the current build
67
+ #
68
+ # @return [String] missing configuration file message
69
+ def build_missing_error_message(build_path)
70
+ <<~MSG
71
+ \nWe were unable to locate Diffend configuration file.\n
72
+ Please make sure that .diffend.yml is present in #{build_path} folder.\n
73
+ MSG
74
+ end
75
+
76
+ # @return [String] empty configuration file message
77
+ def build_empty_error_message
78
+ <<~MSG
79
+ \nYour Diffend configuration file is empty.\n
80
+ Please re-setup.\n
81
+ MSG
82
+ end
83
+
84
+ # @return [String] malformed configuration file message
85
+ def build_malformed_error_message
86
+ <<~MSG
87
+ \nYour Diffend configuration file is malformed.\n
88
+ Please re-setup.\n
89
+ MSG
90
+ end
91
+
92
+ # @return [String] malformed configuration file message
93
+ def build_missing_key_error_message(exception)
94
+ missing_key = missing_key_from_exception(exception)
95
+
96
+ <<~MSG
97
+ \nYour Diffend configuration file is missing #{missing_key} key.\n
98
+ Please re-setup.\n
99
+ MSG
100
+ end
101
+
102
+ def missing_key_from_exception(exception)
103
+ case exception
104
+ when Errors::ProjectIdMissingInConfigurationFile then 'project_id'
105
+ when Errors::ShareableIdMissingInConfigurationFile then 'shareable_id'
106
+ when Errors::ShareableKeyMissingInConfigurationFile then 'shareable_key'
107
+ when Errors::BuildPathMissingInConfigurationFile then 'build_path'
108
+ end
26
109
  end
27
110
  end
28
111
  end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Diffend
4
+ # Module for all the components related to setting up the config
5
+ module Config
6
+ # Class responsible for validating the config from .diffend.yml
7
+ module Validator
8
+ class << self
9
+ # @param config [OpenStruct] path of the current build
10
+ def call(config)
11
+ raise Errors::ProjectIdMissingInConfigurationFile if missing?(config, 'project_id')
12
+ raise Errors::ShareableIdMissingInConfigurationFile if missing?(config, 'shareable_id')
13
+ raise Errors::ShareableKeyMissingInConfigurationFile if missing?(config, 'shareable_key')
14
+ raise Errors::BuildPathMissingInConfigurationFile if missing?(config, 'build_path')
15
+ end
16
+
17
+ private
18
+
19
+ def missing?(config, key)
20
+ config.public_send(key).nil? || config.public_send(key).empty?
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end