diffend 0.2.31 → 0.2.32

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: 7b14e2973870903bee26272a50713c543934f7dbe5c0f2aab495dba99d6ee177
4
- data.tar.gz: 900edb2cd152dce431f81029becec9e76662ef2bd5f19a7b082f9276bf9050cc
3
+ metadata.gz: 8e0efaea5a8bb4c724e24057821578b6c257a5eb313c472ac17dd60747fe10e4
4
+ data.tar.gz: af3b702fa128eabcc8f6f054895c0e64097f38672b650697e292ab705b749b69
5
5
  SHA512:
6
- metadata.gz: 33eb4745a8a8e909c266efdbd6a06647c7377e480886eb5d03aa6dbc78a65ce567ad3533df24c85e93cef714094c528f6f15c2738cd512874af4d09bbbe74173
7
- data.tar.gz: ee68d0977516bce252304aa150ff2b6bde0788b06a135e9485ad5b22a351637f293fe533ea771e09f81446bac1a39b06427b0bf305ab575ce3f41ecbd0b97608
6
+ metadata.gz: 00e60e3f610e03cad43a65b11c1b7f17d839d4b43009dde4436b9eebd96b82bdbf0035860eb85fb0e57c7042221403894a1aaf5f89cb606a86dd15e94f65bc58
7
+ data.tar.gz: f45b310e0e376b50e27b7a1876f3704a3f282dbadac5c868b4548a4a6a2d582632aeb3f204e47fda5545f47807446e648b0bf2fe70b4a0abdefb17ea40cf1ff1
Binary file
data.tar.gz.sig CHANGED
Binary file
@@ -2,6 +2,15 @@
2
2
 
3
3
  ## [Unreleased][master]
4
4
 
5
+ ## [0.2.32] (2020-10-02)
6
+ - fix how we build platform from `Gem::Platform` ([#56](https://github.com/diffend-io/diffend-ruby/pull/56))
7
+ - introduce `Diffend::LatestVersion` ([#57](https://github.com/diffend-io/diffend-ruby/pull/57))
8
+ - refactor `Diffend::Config` ([#58](https://github.com/diffend-io/diffend-ruby/pull/58))
9
+ - set command in `Diffend::Config` ([#59](https://github.com/diffend-io/diffend-ruby/pull/59))
10
+ - introduce `Diffend::Logger` ([#60](https://github.com/diffend-io/diffend-ruby/pull/60))
11
+ - set severity to `FATAL` in `Diffend::Monitor` ([#61](https://github.com/diffend-io/diffend-ruby/pull/61))
12
+ - handle `Bundler::VersionConflict` ([#62](https://github.com/diffend-io/diffend-ruby/pull/62))
13
+
5
14
  ## [0.2.31] (2020-09-24)
6
15
  - change request timeout to 15 seconds ([#53](https://github.com/diffend-io/diffend-ruby/pull/53))
7
16
  - report request issues as warnings ([#54](https://github.com/diffend-io/diffend-ruby/pull/54))
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- diffend (0.2.31)
4
+ diffend (0.2.32)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -6,7 +6,7 @@ module Diffend
6
6
  class << self
7
7
  # Build clean instance of bundler definition, as we don't want to pollute the main one
8
8
  #
9
- # @param command [String] bundler command that we are executing
9
+ # @param command [String] command executed via bundler
10
10
  # @param gemfile [String] path to Gemfile
11
11
  # @param lockfile [String] path to Gemfile.lock
12
12
  #
@@ -2,18 +2,80 @@
2
2
 
3
3
  module Diffend
4
4
  # Diffend config object
5
- module Config
6
- class << self
7
- # Build diffend config object
8
- #
9
- # @return [OpenStruct, nil]
10
- #
11
- # @raise [Errors::MissingConfigurationFile] when no config file
12
- def call
13
- Diffend::Config::Fetcher.call(
14
- File.expand_path('..', ::Bundler.bin_path)
15
- )
16
- end
5
+ class Config
6
+ attr_reader :project_id, :shareable_id, :shareable_key, :build_path, :env, :command
7
+
8
+ # Build diffend config object
9
+ #
10
+ # @return [Diffend::Config]
11
+ #
12
+ # @raise [Errors::MissingConfigurationFile] when no config file
13
+ def initialize(command: nil, severity: nil, build_path: nil)
14
+ @log_level = severity
15
+ build(command, build_path)
16
+ validate
17
+ end
18
+
19
+ def logger
20
+ @logger ||= Diffend::Logger.new(@log_level)
21
+ end
22
+
23
+ def ignore_errors?
24
+ @ignore_errors
25
+ end
26
+
27
+ def development?
28
+ @development
29
+ end
30
+
31
+ # Provides diffend commands endpoint url
32
+ #
33
+ # @return [String]
34
+ def commands_url
35
+ return ENV['DIFFEND_COMMANDS_URL'] if ENV.key?('DIFFEND_COMMANDS_URL')
36
+
37
+ "https://my.diffend.io/api/projects/#{project_id}/bundle/#{command}"
38
+ end
39
+
40
+ # Provides diffend errors endpoint url
41
+ #
42
+ # @return [String]
43
+ def errors_url
44
+ return ENV['DIFFEND_ERRORS_URL'] if ENV.key?('DIFFEND_ERRORS_URL')
45
+
46
+ "https://my.diffend.io/api/projects/#{project_id}/errors"
47
+ end
48
+
49
+ # @param request_id [String]
50
+ #
51
+ # @return [String]
52
+ def track_url(request_id)
53
+ "https://my.diffend.io/api/projects/#{project_id}/bundle/#{request_id}/track"
54
+ end
55
+
56
+ private
57
+
58
+ def build(command, build_path)
59
+ build_path ||= File.expand_path('..', ::Bundler.bin_path)
60
+ hash = Diffend::Configs::Fetcher.call(logger, build_path)
61
+ hash['build_path'] = build_path
62
+ hash['env'] = ENV['DIFFEND_ENV'] || 'development'
63
+ hash['ignore_errors'] = ENV['DIFFEND_IGNORE_ERRORS'] == 'true'
64
+ hash['development'] = ENV['DIFFEND_DEVELOPMENT'] == 'true'
65
+ hash['command'] = command || build_command
66
+
67
+ hash.each { |key, value| instance_variable_set(:"@#{key}", value) }
68
+ end
69
+
70
+ def validate
71
+ Diffend::Configs::Validator.call(self)
72
+ end
73
+
74
+ # Command that was run with bundle
75
+ #
76
+ # @return [String]
77
+ def build_command
78
+ ARGV.first || ::Bundler.feature_flag.default_cli_command.to_s
17
79
  end
18
80
  end
19
81
  end
@@ -4,41 +4,33 @@ require 'yaml'
4
4
 
5
5
  module Diffend
6
6
  # Module for all the components related to setting up the config
7
- module Config
7
+ module Configs
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
-
18
10
  class << self
11
+ # @param logger [Diffend::Logger]
19
12
  # @param build_path [String] path of the current build
20
13
  #
21
- # @return [OpenStruct] open struct with config details
14
+ # @return [Hash] details from configuration file
22
15
  #
23
16
  # @example
24
17
  # details = Fetcher.new.call('./')
25
18
  # details.build_path #=> './'
26
- def call(build_path)
19
+ def call(logger, build_path)
27
20
  build(build_path)
28
21
  rescue Errors::MissingConfigurationFile
29
- Bundler.ui.error(build_missing_error_message(build_path))
22
+ build_missing_error_message(build_path)
23
+ .tap(&logger.method(:fatal))
30
24
 
31
25
  raise Diffend::Errors::HandledException
32
26
  rescue Errors::EmptyConfigurationFile
33
- Bundler.ui.error(build_empty_error_message(build_path))
27
+ build_empty_error_message(build_path)
28
+ .tap(&logger.method(:fatal))
34
29
 
35
30
  raise Diffend::Errors::HandledException
36
31
  rescue Errors::MalformedConfigurationFile
37
- Bundler.ui.error(build_malformed_error_message(build_path))
38
-
39
- raise Diffend::Errors::HandledException
40
- rescue *MISSING_KEY_ERRORS => e
41
- Bundler.ui.error(build_missing_key_error_message(e))
32
+ build_malformed_error_message(build_path)
33
+ .tap(&logger.method(:fatal))
42
34
 
43
35
  raise Diffend::Errors::HandledException
44
36
  end
@@ -57,8 +49,7 @@ module Diffend
57
49
 
58
50
  raise Errors::EmptyConfigurationFile if content.empty?
59
51
 
60
- OpenStruct.new(parse_file(content).merge(build_path: build_path))
61
- .tap(&Validator.method(:call))
52
+ parse_file(content)
62
53
  end
63
54
 
64
55
  def parse_file(content)
@@ -92,25 +83,6 @@ module Diffend
92
83
  Please re-setup.\n
93
84
  MSG
94
85
  end
95
-
96
- # @return [String] malformed configuration file message
97
- def build_missing_key_error_message(exception)
98
- missing_key = missing_key_from_exception(exception)
99
-
100
- <<~MSG
101
- \nYour Diffend configuration file is missing #{missing_key} key.\n
102
- Please re-setup.\n
103
- MSG
104
- end
105
-
106
- def missing_key_from_exception(exception)
107
- case exception
108
- when Errors::ProjectIdMissingInConfigurationFile then 'project_id'
109
- when Errors::ShareableIdMissingInConfigurationFile then 'shareable_id'
110
- when Errors::ShareableKeyMissingInConfigurationFile then 'shareable_key'
111
- when Errors::BuildPathMissingInConfigurationFile then 'build_path'
112
- end
113
- end
114
86
  end
115
87
  end
116
88
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Diffend
4
- module Config
4
+ module Configs
5
5
  # Class used to figure out the file from which we should load the settings
6
6
  module FileFinder
7
7
  # Names of the files or paths where we will look for the settings
@@ -0,0 +1,85 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Diffend
4
+ # Module for all the components related to setting up the config
5
+ module Configs
6
+ # Class responsible for validating the config from .diffend.yml
7
+ module Validator
8
+ KNOWN_KEYS = {
9
+ project_id: [String],
10
+ shareable_id: [String],
11
+ shareable_key: [String],
12
+ build_path: [String],
13
+ env: [String],
14
+ command: [String],
15
+ ignore_errors?: [TrueClass, FalseClass],
16
+ development?: [TrueClass, FalseClass]
17
+ }.freeze
18
+
19
+ class << self
20
+ # @param config [Diffend::Config]
21
+ def call(config)
22
+ KNOWN_KEYS.each_key do |key|
23
+ if missing?(config, key)
24
+ missing_key_message(key)
25
+ .tap(&config.logger.method(:fatal))
26
+
27
+ raise Diffend::Errors::HandledException
28
+ end
29
+
30
+ if invalid?(config, key)
31
+ invalid_key_message(config, key)
32
+ .tap(&config.logger.method(:fatal))
33
+
34
+ raise Diffend::Errors::HandledException
35
+ end
36
+ end
37
+ end
38
+
39
+ private
40
+
41
+ # @param config [Diffend::Config]
42
+ # @param key [String]
43
+ #
44
+ # @return [Boolean] true if we are missing a key, false otherwise
45
+ def missing?(config, key)
46
+ value = config.public_send(key)
47
+
48
+ value.nil? || (value.respond_to?(:empty?) && value.empty?)
49
+ end
50
+
51
+ # @param config [Diffend::Config]
52
+ # @param key [String]
53
+ #
54
+ # @return [Boolean] true if we are missing a key, false otherwise
55
+ def invalid?(config, key)
56
+ !KNOWN_KEYS[key].include?(config.public_send(key).class)
57
+ end
58
+
59
+ # Missing key message
60
+ #
61
+ # @param key [String] missing key
62
+ #
63
+ # @return [String]
64
+ def missing_key_message(key)
65
+ <<~MSG
66
+ \nDiffend configuration is missing #{key} key.\n
67
+ MSG
68
+ end
69
+
70
+ # Invalid key message
71
+ #
72
+ # @param hash [Hash] config hash
73
+ # @param key [String] invalid key
74
+ #
75
+ # @return [String]
76
+ def invalid_key_message(hash, key)
77
+ <<~MSG
78
+ \nDiffend configuration value for #{key} is invalid.\n
79
+ It should be #{KNOWN_KEYS[key].join(' or ')} but is #{hash.public_send(key).class}.\n
80
+ MSG
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
@@ -6,12 +6,11 @@ module Diffend
6
6
  class << self
7
7
  # Build verdict
8
8
  #
9
- # @param command [String] either install or update
10
- # @param config [OpenStruct] diffend config
11
- def call(command, config)
9
+ # @param config [Diffend::Config]
10
+ def call(config)
12
11
  Diffend::RequestVerdict
13
- .call(command, config, build_definition(command))
14
- .tap { |response| build_message(command, config, response) }
12
+ .call(config, build_definition(config.command))
13
+ .tap { |response| build_message(config, response) }
15
14
  rescue Diffend::Errors::DependenciesResolveException
16
15
  # We are unable to resolve dependencies, no message will be printed
17
16
  end
@@ -27,14 +26,13 @@ module Diffend
27
26
  )
28
27
  end
29
28
 
30
- # @param command [String] either install or update
31
- # @param config [OpenStruct] diffend config
29
+ # @param config [Diffend::Config]
32
30
  # @param response [Hash] response from diffend API
33
- def build_message(command, config, response)
31
+ def build_message(config, response)
34
32
  if response.key?('error')
35
- build_error(response)
33
+ build_error(config, response)
36
34
  elsif response.key?('action')
37
- build_verdict(command, config, response)
35
+ build_verdict(config, response)
38
36
  else
39
37
  Diffend::HandleErrors::Report.call(
40
38
  config: config,
@@ -48,25 +46,24 @@ module Diffend
48
46
  # @param response [Hash] response from diffend API
49
47
  def build_error(response)
50
48
  build_error_message(response)
51
- .tap(&Bundler.ui.method(:error))
49
+ .tap(&config.logger.method(:error))
52
50
 
53
51
  raise Diffend::Errors::HandledException
54
52
  end
55
53
 
56
- # @param command [String] either install or update
57
- # @param config [OpenStruct] diffend config
54
+ # @param config [Diffend::Config]
58
55
  # @param response [Hash] response from diffend API
59
- def build_verdict(command, config, response)
56
+ def build_verdict(config, response)
60
57
  case response['action']
61
58
  when 'allow'
62
- build_allow_message(command, response)
63
- .tap(&Bundler.ui.method(:confirm))
59
+ build_allow_message(config.command, response)
60
+ .tap(&config.logger.method(:info))
64
61
  when 'warn'
65
- build_warn_message(command, response)
66
- .tap(&Bundler.ui.method(:warn))
62
+ build_warn_message(config.command, response)
63
+ .tap(&config.logger.method(:warn))
67
64
  when 'deny'
68
- build_deny_message(command, response)
69
- .tap(&Bundler.ui.method(:error))
65
+ build_deny_message(config.command, response)
66
+ .tap(&config.logger.method(:error))
70
67
 
71
68
  exit 1
72
69
  else
@@ -89,7 +86,7 @@ module Diffend
89
86
  MSG
90
87
  end
91
88
 
92
- # @param command [String] either install or update
89
+ # @param command [String] command executed via bundler
93
90
  # @param response [Hash] response from diffend API
94
91
  #
95
92
  # @return [String]
@@ -101,7 +98,7 @@ module Diffend
101
98
  MSG
102
99
  end
103
100
 
104
- # @param command [String] either install or update
101
+ # @param command [String] command executed via bundler
105
102
  # @param response [Hash] response from diffend API
106
103
  #
107
104
  # @return [String]
@@ -113,7 +110,7 @@ module Diffend
113
110
  MSG
114
111
  end
115
112
 
116
- # @param command [String] either install or update
113
+ # @param command [String] command executed via bundler
117
114
  # @param response [Hash] response from diffend API
118
115
  #
119
116
  # @return [String]
@@ -126,7 +123,7 @@ module Diffend
126
123
  end
127
124
 
128
125
  # @param type [String] verdict type
129
- # @param command [String] either install or update
126
+ # @param command [String] command executed via bundler
130
127
  #
131
128
  # @return [String]
132
129
  def build_message_header(type, command)
@@ -7,10 +7,10 @@ module Diffend
7
7
  class << self
8
8
  # Execute request to Diffend
9
9
  #
10
+ # @param config [Diffend::Config]
11
+ # @param message [Symbol] message that we want to display
10
12
  # @param exception [Exception] expection that was raised
11
13
  # @param payload [Hash] with versions to check
12
- # @param config [OpenStruct] Diffend config
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
15
  # @param raise_exception [Boolean] if true we will raise an exception
16
16
  #
@@ -18,8 +18,11 @@ module Diffend
18
18
  def call(config:, message:, exception: nil, payload: {}, report: false, raise_exception: true)
19
19
  exception_payload = prepare_exception_payload(exception, payload)
20
20
 
21
- Bundler.ui.error(Diffend::HandleErrors::Messages::PAYLOAD_DUMP)
22
- Bundler.ui.error(Diffend::HandleErrors::Messages.const_get(message.to_s.upcase))
21
+ Diffend::HandleErrors::Messages::PAYLOAD_DUMP
22
+ .tap(&config.logger.method(:error))
23
+ Diffend::HandleErrors::Messages
24
+ .const_get(message.to_s.upcase)
25
+ .tap(&config.logger.method(:error))
23
26
 
24
27
  if report
25
28
  Diffend::Request.call(
@@ -30,14 +33,14 @@ module Diffend
30
33
  raise Diffend::Errors::HandledException if raise_exception
31
34
  end
32
35
 
33
- # @param config [OpenStruct] diffend config
36
+ # @param config [Diffend::Config]
34
37
  # @param payload [Hash]
35
38
  #
36
39
  # @return [Diffend::RequestObject]
37
40
  def build_request_object(config, payload)
38
41
  Diffend::RequestObject.new(
39
42
  config: config,
40
- url: errors_url(config.project_id),
43
+ url: config.errors_url,
41
44
  payload: payload,
42
45
  request_method: :post
43
46
  )
@@ -54,17 +57,6 @@ module Diffend
54
57
  .call(exception, payload)
55
58
  .tap(&Diffend::HandleErrors::DisplayToStdout.method(:call))
56
59
  end
57
-
58
- # Provides diffend errors endpoint url
59
- #
60
- # @param project_id [String] diffend project_id
61
- #
62
- # @return [String] diffend endpoint
63
- def errors_url(project_id)
64
- return ENV['DIFFEND_ERROR_URL'] if ENV.key?('DIFFEND_ERROR_URL')
65
-
66
- "https://my.diffend.io/api/projects/#{project_id}/errors"
67
- end
68
60
  end
69
61
  end
70
62
  end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Diffend
4
+ # Verify if we are running latest version of the plugin
5
+ module LatestVersion
6
+ class << self
7
+ # Verify if we are running latest version of the plugin
8
+ #
9
+ # @param config [Diffend::Config]
10
+ def call(config)
11
+ return if config.development?
12
+ return if installed_version == Diffend::VERSION
13
+
14
+ print_message(config, installed_version)
15
+
16
+ exit 2
17
+ end
18
+
19
+ private
20
+
21
+ # @return [String] installed plugin version
22
+ def installed_version
23
+ ::Bundler::Plugin
24
+ .index
25
+ .plugin_path('diffend')
26
+ .basename
27
+ .to_s
28
+ .split('-')
29
+ .last
30
+ end
31
+
32
+ # @param config [Diffend::Config]
33
+ # @param version [Hash] installed version
34
+ def print_message(config, version)
35
+ build_message(version)
36
+ .tap(&config.logger.method(:error))
37
+ end
38
+
39
+ # @param version [Hash] installed version
40
+ #
41
+ # @return [String]
42
+ def build_message(version)
43
+ <<~MSG
44
+ \nYou are running an outdated version (#{version}) of the plugin, which will lead to issues.
45
+ \nPlease upgrade to the latest one (#{Diffend::VERSION}) by executing "rm -rf .bundle/plugin".\n
46
+ MSG
47
+ end
48
+ end
49
+ end
50
+ end
@@ -6,16 +6,15 @@ module Diffend
6
6
  class << self
7
7
  # Build diffend, host, packages, and platform specific information
8
8
  #
9
- # @param command [String] either install or update
10
- # @param project_id [String] diffend project_id
9
+ # @param config [Diffend::Config]
11
10
  # @param definition [Bundler::Definition] definition for your source
12
11
  #
13
12
  # @return [Hash] payload for diffend endpoint
14
- def call(command, project_id, definition)
13
+ def call(config, definition)
15
14
  {
16
- 'diffend' => Diffend.call(project_id),
15
+ 'diffend' => Diffend.call(config),
17
16
  'host' => Host.call,
18
- 'packages' => Packages.call(command, definition),
17
+ 'packages' => Packages.call(config.command, definition),
19
18
  'platform' => Platform.call
20
19
  }.freeze
21
20
  end
@@ -15,14 +15,14 @@ module Diffend
15
15
  class << self
16
16
  # Build diffend information
17
17
  #
18
- # @param project_id [String, nil] diffend project_id
18
+ # @param config [Diffend::Config]
19
19
  #
20
20
  # @return [Hash]
21
- def call(project_id)
21
+ def call(config)
22
22
  {
23
23
  'api_version' => API_VERSION,
24
- 'environment' => ENV['DIFFEND_ENV'],
25
- 'project_id' => project_id,
24
+ 'environment' => config.env,
25
+ 'project_id' => config.project_id,
26
26
  'type' => PLATFORM_TYPE,
27
27
  'version' => ::Diffend::VERSION
28
28
  }.freeze
@@ -31,7 +31,7 @@ module Diffend
31
31
  }.freeze
32
32
 
33
33
  class << self
34
- # @param command [String] either install or update
34
+ # @param command [String] command executed via bundler
35
35
  # @param definition [Bundler::Definition] definition for your source
36
36
  def call(command, definition)
37
37
  Bundler.ui.silence { definition.resolve_remotely! }
@@ -161,7 +161,7 @@ module Diffend
161
161
  def parse_platform(platform)
162
162
  case platform
163
163
  when String then platform
164
- when Gem::Platform then platform.os
164
+ when Gem::Platform then platform.to_s
165
165
  end
166
166
  end
167
167
 
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Diffend
4
+ # Diffend logging
5
+ class Logger
6
+ # Low-level information, mostly for developers.
7
+ DEBUG = 0
8
+ # Generic (useful) information about system operation.
9
+ INFO = 1
10
+ # A warning.
11
+ WARN = 2
12
+ # A handleable error condition.
13
+ ERROR = 3
14
+ # An unhandleable error that results in a program crash.
15
+ FATAL = 4
16
+ # An unknown message that should always be logged.
17
+ UNKNOWN = 5
18
+
19
+ # @param level [Integer] logging severity threshold
20
+ def initialize(level = INFO)
21
+ @level = level
22
+ end
23
+
24
+ # @param message [String]
25
+ def debug(message)
26
+ log(DEBUG, message)
27
+ end
28
+
29
+ # @param message [String]
30
+ def info(message)
31
+ log(INFO, message)
32
+ end
33
+
34
+ # @param message [String]
35
+ def warn(message)
36
+ log(WARN, message)
37
+ end
38
+
39
+ # @param message [String]
40
+ def error(message)
41
+ log(ERROR, message)
42
+ end
43
+
44
+ # @param message [String]
45
+ def fatal(message)
46
+ log(FATAL, message)
47
+ end
48
+
49
+ private
50
+
51
+ # @param severity [Integer]
52
+ # @param message [String]
53
+ def log(severity, message)
54
+ return if severity < @level
55
+
56
+ case severity
57
+ when INFO
58
+ Bundler.ui.confirm(message)
59
+ when WARN
60
+ Bundler.ui.warn(message)
61
+ when ERROR, FATAL
62
+ Bundler.ui.error(message)
63
+ end
64
+ end
65
+ end
66
+ end
@@ -1,16 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- ENV['DIFFEND_ENV'] ||= 'development'
4
-
5
3
  %w[
6
4
  version
5
+ logger
7
6
  errors
8
7
  build_bundler_definition
9
8
  commands
10
9
  config
11
- config/fetcher
12
- config/file_finder
13
- config/validator
10
+ configs/fetcher
11
+ configs/file_finder
12
+ configs/validator
14
13
  handle_errors/messages
15
14
  handle_errors/build_exception_payload
16
15
  handle_errors/display_to_stdout
@@ -27,10 +26,14 @@ ENV['DIFFEND_ENV'] ||= 'development'
27
26
  track
28
27
  ].each { |file| require "diffend/#{file}" }
29
28
 
30
- return if ENV['DIFFEND_ENV'].strip.empty?
31
- return if %w[development test].include?(ENV['DIFFEND_ENV'])
29
+ config = Diffend::Config.new(
30
+ command: Diffend::Commands::EXEC,
31
+ severity: Diffend::Logger::FATAL
32
+ )
33
+
34
+ return if %w[development test].include?(config.env)
32
35
 
33
36
  Thread.new do
34
- track = Diffend::Track.new
37
+ track = Diffend::Track.new(config)
35
38
  track.start
36
39
  end
@@ -1,20 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- ENV['DIFFEND_ENV'] ||= 'development'
4
-
5
3
  %w[
6
4
  bundler
7
5
  ].each(&method(:require))
8
6
 
9
7
  %w[
10
8
  version
9
+ logger
10
+ latest_version
11
11
  errors
12
12
  build_bundler_definition
13
13
  commands
14
14
  config
15
- config/fetcher
16
- config/file_finder
17
- config/validator
15
+ configs/fetcher
16
+ configs/file_finder
17
+ configs/validator
18
18
  handle_errors/messages
19
19
  handle_errors/build_exception_payload
20
20
  handle_errors/display_to_stdout
@@ -45,13 +45,13 @@ module Diffend
45
45
  def execute
46
46
  return unless enabled?
47
47
 
48
- verify_version
48
+ config = Diffend::Config.new(severity: Diffend::Logger::INFO)
49
49
 
50
- config = Diffend::Config.call
50
+ Diffend::LatestVersion.call(config)
51
51
 
52
- Diffend::Execute.call(command, config)
52
+ Diffend::Execute.call(config)
53
53
  rescue Diffend::Errors::HandledException
54
- return if ENV['DIFFEND_IGNORE_ERRORS'] == 'true'
54
+ return if config.ignore_errors?
55
55
 
56
56
  exit 255
57
57
  rescue StandardError => e
@@ -63,32 +63,11 @@ module Diffend
63
63
  raise_exception: false
64
64
  )
65
65
 
66
- return if ENV['DIFFEND_IGNORE_ERRORS'] == 'true'
66
+ return if config.ignore_errors?
67
67
 
68
68
  exit 255
69
69
  end
70
70
 
71
- def verify_version
72
- return if ENV['DIFFEND_DEVELOPMENT'] == 'true'
73
- return if installed_version == Diffend::VERSION
74
-
75
- build_outdated_version_message(installed_version)
76
- .tap(&::Bundler.ui.method(:error))
77
-
78
- exit 2
79
- end
80
-
81
- # @return [String] installed plugin version
82
- def installed_version
83
- ::Bundler::Plugin
84
- .index
85
- .plugin_path('diffend')
86
- .basename
87
- .to_s
88
- .split('-')
89
- .last
90
- end
91
-
92
71
  # Checks if plugin is enabled
93
72
  #
94
73
  # @return [Boolean] true if enabled, false otherwise
@@ -102,23 +81,6 @@ module Diffend
102
81
  .select { |line| line.start_with?('plugin') }
103
82
  .any? { |line| line.include?('diffend') }
104
83
  end
105
-
106
- # @param version [Hash] installed version
107
- #
108
- # @return [String]
109
- def build_outdated_version_message(version)
110
- <<~MSG
111
- \nYou are running an outdated version (#{version}) of the plugin, which will lead to issues.
112
- \nPlease upgrade to the latest one (#{VERSION}) by executing "rm -rf .bundle/plugin".\n
113
- MSG
114
- end
115
-
116
- # Command that was run with bundle
117
- #
118
- # @return [String]
119
- def command
120
- ARGV.first || ::Bundler.feature_flag.default_cli_command.to_s
121
- end
122
84
  end
123
85
  end
124
86
  end
@@ -67,7 +67,7 @@ module Diffend
67
67
  rescue Diffend::Errors::RequestServerError => e
68
68
  retry_count += 1
69
69
 
70
- retry if handle_retry(SERVER_ERROR_MESSAGE, retry_count)
70
+ retry if handle_retry(request_object.config, SERVER_ERROR_MESSAGE, retry_count)
71
71
 
72
72
  Diffend::HandleErrors::Report.call(
73
73
  exception: e,
@@ -78,7 +78,7 @@ module Diffend
78
78
  rescue *CONNECTION_EXCEPTIONS => e
79
79
  retry_count += 1
80
80
 
81
- retry if handle_retry(CONNECTION_MESSAGE, retry_count)
81
+ retry if handle_retry(request_object.config, CONNECTION_MESSAGE, retry_count)
82
82
 
83
83
  Diffend::HandleErrors::Report.call(
84
84
  exception: e,
@@ -89,7 +89,7 @@ module Diffend
89
89
  rescue *TIMEOUT_EXCEPTIONS => e
90
90
  retry_count += 1
91
91
 
92
- retry if handle_retry(TIMEOUT_MESSAGE, retry_count)
92
+ retry if handle_retry(request_object.config, TIMEOUT_MESSAGE, retry_count)
93
93
 
94
94
  Diffend::HandleErrors::Report.call(
95
95
  exception: e,
@@ -101,12 +101,13 @@ module Diffend
101
101
 
102
102
  # Handle retry
103
103
  #
104
+ # @param config [Diffend::Config]
104
105
  # @param message [String] message we want to display
105
106
  # @param retry_count [Integer]
106
- def handle_retry(message, retry_count)
107
+ def handle_retry(config, message, retry_count)
107
108
  return false if retry_count == RETRIES
108
109
 
109
- Bundler.ui.warn(message)
110
+ config.logger.warn(message)
110
111
  sleep(exponential_backoff(retry_count))
111
112
 
112
113
  retry_count < RETRIES
@@ -132,7 +133,7 @@ module Diffend
132
133
  #
133
134
  # @param uri [URI::HTTPS]
134
135
  # @param request_method [Symbol]
135
- # @param config [OpenStruct] Diffend config
136
+ # @param config [Diffend::Config]
136
137
  # @param payload [Hash] with versions to check
137
138
  #
138
139
  # @return [Net::HTTP::Post, Net::HTTP::Put]
@@ -160,9 +161,8 @@ module Diffend
160
161
  # Assigns basic authorization if provided in the config
161
162
  #
162
163
  # @param request [Net::HTTP::Post] prepared http post
163
- # @param config [OpenStruct] Diffend config
164
+ # @param config [Diffend::Config]
164
165
  def assign_auth(request, config)
165
- return unless config
166
166
  return unless config.shareable_id
167
167
  return unless config.shareable_key
168
168
 
@@ -6,18 +6,17 @@ module Diffend
6
6
  # Module responsible for fetching diffend verdict on local context
7
7
  module RequestVerdict
8
8
  class << self
9
- # @param command [String] either install or update
9
+ # @param config [Diffend::Config]
10
10
  # @param definition [Bundler::Definition] definition for your source
11
- # @param config [OpenStruct] diffend config
12
- def call(command, config, definition)
13
- payload = Diffend::LocalContext.call(command, config.project_id, definition)
11
+ def call(config, definition)
12
+ payload = Diffend::LocalContext.call(config, definition)
14
13
 
15
14
  response = Diffend::Request.call(
16
- build_request_object(command, config, payload)
15
+ build_request_object(config, payload)
17
16
  )
18
17
 
19
18
  JSON.parse(response.body)
20
- rescue Bundler::GemNotFound
19
+ rescue Bundler::GemNotFound, Bundler::VersionConflict
21
20
  raise ::Diffend::Errors::DependenciesResolveException
22
21
  rescue StandardError => e
23
22
  Diffend::HandleErrors::Report.call(
@@ -29,31 +28,18 @@ module Diffend
29
28
  )
30
29
  end
31
30
 
32
- # @param command [String] either install or update
33
- # @param config [OpenStruct] diffend config
31
+ # @param config [Diffend::Config]
34
32
  # @param payload [Hash]
35
33
  #
36
34
  # @return [Diffend::RequestObject]
37
- def build_request_object(command, config, payload)
35
+ def build_request_object(config, payload)
38
36
  Diffend::RequestObject.new(
39
37
  config: config,
40
- url: commands_url(command, config.project_id),
38
+ url: config.commands_url,
41
39
  payload: payload,
42
40
  request_method: :post
43
41
  )
44
42
  end
45
-
46
- # Provides diffend command endpoint url
47
- #
48
- # @param command [String] either install or update
49
- # @param project_id [String] diffend project_id
50
- #
51
- # @return [String] diffend endpoint
52
- def commands_url(command, project_id)
53
- return ENV['DIFFEND_COMMAND_URL'] if ENV.key?('DIFFEND_COMMAND_URL')
54
-
55
- "https://my.diffend.io/api/projects/#{project_id}/bundle/#{command}"
56
- end
57
43
  end
58
44
  end
59
45
  end
@@ -9,14 +9,16 @@ module Diffend
9
9
  RETRY_SLEEP = 15
10
10
 
11
11
  # Initialize tracking
12
- def initialize
12
+ #
13
+ # @param config [Diffend::Config]
14
+ def initialize(config)
13
15
  @mutex = Mutex.new
14
- @config = Diffend::Config.call
16
+ @config = config
15
17
  end
16
18
 
17
19
  # Start tracking
18
20
  def start
19
- response = exec_request
21
+ response = Diffend::Execute.call(@config)
20
22
 
21
23
  perform(response['id'])
22
24
  rescue Diffend::Errors::HandledException
@@ -40,19 +42,12 @@ module Diffend
40
42
  # @param request_id [String]
41
43
  def perform(request_id)
42
44
  loop do
43
- @mutex.synchronize do
44
- track_request(request_id)
45
- end
45
+ @mutex.synchronize { track_request(request_id) }
46
46
 
47
47
  sleep(TRACK_SLEEP)
48
48
  end
49
49
  end
50
50
 
51
- # Perform an exec request
52
- def exec_request
53
- Diffend::Execute.call(Diffend::Commands::EXEC, @config)
54
- end
55
-
56
51
  # Perform a track request
57
52
  #
58
53
  # @param request_id [String]
@@ -68,18 +63,10 @@ module Diffend
68
63
  def build_request_object(request_id)
69
64
  Diffend::RequestObject.new(
70
65
  config: @config,
71
- url: track_url(@config.project_id, request_id),
66
+ url: @config.track_url(request_id),
72
67
  payload: { id: request_id }.freeze,
73
68
  request_method: :put
74
69
  ).freeze
75
70
  end
76
-
77
- # @param project_id [String] diffend project_id
78
- # @param request_id [String]
79
- #
80
- # @return [String]
81
- def track_url(project_id, request_id)
82
- "https://my.diffend.io/api/projects/#{project_id}/bundle/#{request_id}/track"
83
- end
84
71
  end
85
72
  end
@@ -2,5 +2,5 @@
2
2
 
3
3
  module Diffend
4
4
  # Current version
5
- VERSION = '0.2.31'
5
+ VERSION = '0.2.32'
6
6
  end
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.31
4
+ version: 0.2.32
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-24 00:00:00.000000000 Z
37
+ date: 2020-10-02 00:00:00.000000000 Z
38
38
  dependencies:
39
39
  - !ruby/object:Gem::Dependency
40
40
  name: bundler
@@ -95,20 +95,22 @@ files:
95
95
  - lib/diffend/build_bundler_definition.rb
96
96
  - lib/diffend/commands.rb
97
97
  - lib/diffend/config.rb
98
- - lib/diffend/config/fetcher.rb
99
- - lib/diffend/config/file_finder.rb
100
- - lib/diffend/config/validator.rb
98
+ - lib/diffend/configs/fetcher.rb
99
+ - lib/diffend/configs/file_finder.rb
100
+ - lib/diffend/configs/validator.rb
101
101
  - lib/diffend/errors.rb
102
102
  - lib/diffend/execute.rb
103
103
  - lib/diffend/handle_errors/build_exception_payload.rb
104
104
  - lib/diffend/handle_errors/display_to_stdout.rb
105
105
  - lib/diffend/handle_errors/messages.rb
106
106
  - lib/diffend/handle_errors/report.rb
107
+ - lib/diffend/latest_version.rb
107
108
  - lib/diffend/local_context.rb
108
109
  - lib/diffend/local_context/diffend.rb
109
110
  - lib/diffend/local_context/host.rb
110
111
  - lib/diffend/local_context/packages.rb
111
112
  - lib/diffend/local_context/platform.rb
113
+ - lib/diffend/logger.rb
112
114
  - lib/diffend/monitor.rb
113
115
  - lib/diffend/plugin.rb
114
116
  - lib/diffend/request.rb
metadata.gz.sig CHANGED
Binary file
@@ -1,25 +0,0 @@
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