diffend-monitor 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.
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'byebug' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("byebug", "byebug")
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'htmldiff' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("diff-lcs", "htmldiff")
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'ldiff' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("diff-lcs", "ldiff")
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'rake' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("rake", "rake")
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'rspec' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("rspec-core", "rspec")
@@ -0,0 +1,25 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIEODCCAqCgAwIBAgIBATANBgkqhkiG9w0BAQsFADAjMSEwHwYDVQQDDBhtYWNp
3
+ ZWovREM9bWVuc2ZlbGQvREM9cGwwHhcNMjAwODExMDkxNTM3WhcNMjEwODExMDkx
4
+ NTM3WjAjMSEwHwYDVQQDDBhtYWNpZWovREM9bWVuc2ZlbGQvREM9cGwwggGiMA0G
5
+ CSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQDCpXsCgmINb6lHBXXBdyrgsBPSxC4/
6
+ 2H+weJ6L9CruTiv2+2/ZkQGtnLcDgrD14rdLIHK7t0o3EKYlDT5GhD/XUVhI15JE
7
+ N7IqnPUgexe1fbZArwQ51afxz2AmPQN2BkB2oeQHXxnSWUGMhvcEZpfbxCCJH26w
8
+ hS0Ccsma8yxA6hSlGVhFVDuCr7c2L1di6cK2CtIDpfDaWqnVNJEwBYHIxrCoWK5g
9
+ sIGekVt/admS9gRhIMaIBg+Mshth5/DEyWO2QjteTodItlxfTctrfmiAl8X8T5JP
10
+ VXeLp5SSOJ5JXE80nShMJp3RFnGw5fqjX/ffjtISYh78/By4xF3a25HdWH9+qO2Z
11
+ tx0wSGc9/4gqNM0APQnjN/4YXrGZ4IeSjtE+OrrX07l0TiyikzSLFOkZCAp8oBJi
12
+ Fhlosz8xQDJf7mhNxOaZziqASzp/hJTU/tuDKl5+ql2icnMv5iV/i6SlmvU29QNg
13
+ LCV71pUv0pWzN+OZbHZKWepGhEQ3cG9MwvkCAwEAAaN3MHUwCQYDVR0TBAIwADAL
14
+ BgNVHQ8EBAMCBLAwHQYDVR0OBBYEFImGed2AXS070ohfRidiCEhXEUN+MB0GA1Ud
15
+ EQQWMBSBEm1hY2llakBtZW5zZmVsZC5wbDAdBgNVHRIEFjAUgRJtYWNpZWpAbWVu
16
+ c2ZlbGQucGwwDQYJKoZIhvcNAQELBQADggGBAKiHpwoENVrMi94V1zD4o8/6G3AU
17
+ gWz4udkPYHTZLUy3dLznc/sNjdkJFWT3E6NKYq7c60EpJ0m0vAEg5+F5pmNOsvD3
18
+ 2pXLj9kisEeYhR516HwXAvtngboUcb75skqvBCU++4Pu7BRAPjO1/ihLSBexbwSS
19
+ fF+J5OWNuyHHCQp+kGPLtXJe2yUYyvSWDj3I2//Vk0VhNOIlaCS1+5/P3ZJThOtm
20
+ zJUBI7h3HgovwRpcnmk2mXTmU4Zx/bCzX8EA6VY0khEvnmiq7S6eBF0H9qH8KyQ6
21
+ EkVLpvmUDFcf/uNaBQdazEMB5jYtwoA8gQlANETNGPi51KlkukhKgaIEDMkBDJOx
22
+ 65N7DzmkcyY0/GwjIVIxmRhcrCt1YeCUElmfFx0iida1/YRm6sB2AXqScc1+ECRi
23
+ 2DND//YJUikn1zwbz1kT70XmHd97B4Eytpln7K+M1u2g1pHVEPW4owD/ammXNpUy
24
+ nt70FcDD4yxJQ+0YNiHd0N8IcVBM1TMIVctMNQ==
25
+ -----END CERTIFICATE-----
@@ -0,0 +1,25 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIERDCCAqygAwIBAgIBATANBgkqhkiG9w0BAQsFADAmMSQwIgYDVQQDDBt0b21l
3
+ ay9EQz1wb2xpc2hnZWVrcy9EQz1jb20wHhcNMjAwNzA3MTY0NjU0WhcNMjEwNzA3
4
+ MTY0NjU0WjAmMSQwIgYDVQQDDBt0b21lay9EQz1wb2xpc2hnZWVrcy9EQz1jb20w
5
+ ggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQDPRTvPuofdtL/wFEPOwPUr
6
+ vR0XHzM/ADb2GBuzu6fzgmoxaYXBe8A++0BbgFvK47T04i8bsbXnfkxrkz/nupQ5
7
+ SK2DPgS4HWnADuyBuyBY7LT4O1wwlytdlHtJgQV6NIcbprcOs/ZQKnimZpW9uByu
8
+ FoN3i94pAEQhuzK0S+wWPvSm22+6XGtCuOzyFGdnCJjGUOkCRno5Nx34MWz0NpJ3
9
+ 9Ekkyy8g2cLvBcUdfeSrY7WsJ5cPCNrBs5cMuV426s1dDrhuvsW+sacwwY/4/LBw
10
+ JzEX4/zS+lsVIX+iOoIFGJdeGnpEWqKgWoaskxqseFi661td1n9UaMXxgoaYh/oX
11
+ 3fJOy2jsZFboZ/eJ5rfciXLiCqSERGkEA+QcA2/jC/d77YJ1FfJW9uwJs3kptf4D
12
+ p6h8wuA3T6rN4QrxkGBYzOfUJ2zSQy1cFu0rTZiYdKo9X6BunnxhmUExNng7advu
13
+ qo8IDinyRlqA5+sOLXd4W3AS/RfF2nrayZNa3khTmmUCAwEAAaN9MHswCQYDVR0T
14
+ BAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFHRFOZPwpgOd2m8FIOodOii+OiID
15
+ MCAGA1UdEQQZMBeBFXRvbWVrQHBvbGlzaGdlZWtzLmNvbTAgBgNVHRIEGTAXgRV0
16
+ b21la0Bwb2xpc2hnZWVrcy5jb20wDQYJKoZIhvcNAQELBQADggGBAKWFwYTGZVoy
17
+ Bj3L9lvGOXpz8VWNoptFNHdncpaw1MMhS8UHcPQOUEiExX5ZH7MARy1fBjMXzIh9
18
+ 41ZpCjR+S6uCEpzUcg5Z/kEWa/wOW6tqrX+zfyxFATDI20pYaQWOLepjbDxePFMZ
19
+ GAlIX5UNsze04A+wArXAttZB4oPt6loS1ao0GNdMb+syYMLzZUTW/sY2rm8zP4Mz
20
+ Kt+zjoqMxQ1Jf+EwH+0uq8Tj5BJcmG6mWYM+ljvRbxBwfimoUBUCQe6KIDouF0Og
21
+ uwLMY7X3jSERta4SxyY+iY7qNLsmG370GIGYbHuIiCwubFXt8jiPJZEdPE1xuzVF
22
+ CLsYItzC28UQEWrVe6sJ0Fuqv5VHM6t8jNClkXDwzf95efFlGSCFN4t+/dywVIK8
23
+ 9MmF6uCQa1EjK2p8tYT0MnbHrFkoehxdX4VO9y99GAkhZyJNKPYPtyAUFV27sT2V
24
+ LfCJRk4ifKIN/FUCwDSn8Cz0m6oH265q0p6wdzI6qrWOjP8tGOMBTA==
25
+ -----END CERTIFICATE-----
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'diffend'
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = 'diffend'
9
+ spec.version = Diffend::VERSION
10
+ spec.authors = ['Tomasz Pajor']
11
+ spec.email = ['contact@diffend.io']
12
+
13
+ spec.summary = 'OSS supply chain security and management platform'
14
+ spec.summary = 'OSS supply chain security and management platform.'
15
+ spec.homepage = Diffend::HOMEPAGE
16
+ spec.license = 'Prosperity Public License'
17
+
18
+ if $PROGRAM_NAME.end_with?('gem')
19
+ spec.signing_key = File.expand_path('~/.ssh/gem-private_key.pem')
20
+ end
21
+
22
+ spec.cert_chain = %w[certs/tomaszpajor.pem]
23
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(spec)/}) }
24
+ spec.require_paths = %w[lib]
25
+
26
+ spec.add_development_dependency 'bundler'
27
+ spec.add_development_dependency 'rake'
28
+ end
@@ -0,0 +1,142 @@
1
+ # frozen_string_literal: true
2
+
3
+ %w[
4
+ bundler
5
+ ].each(&method(:require))
6
+
7
+ %w[
8
+ build_bundler_definition
9
+ errors
10
+ config/fetcher
11
+ config/file_finder
12
+ config/validator
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
20
+ voting
21
+ track
22
+ ].each { |file| require "diffend/#{file}" }
23
+
24
+ %w[
25
+ versions/local
26
+ versions/remote
27
+ ].each { |file| require "diffend/voting/#{file}" }
28
+
29
+ # Diffend main namespace
30
+ module Diffend
31
+ # Current plugin version
32
+ VERSION = '0.2.27'
33
+ # Diffend homepage
34
+ HOMEPAGE = 'https://diffend.io'
35
+
36
+ class << self
37
+ # Registers the plugin and add before install all hook
38
+ def register
39
+ Bundler::Plugin.add_hook('before-install-all') do |_|
40
+ execute
41
+ end
42
+ end
43
+
44
+ # Execute diffend plugin
45
+ def execute
46
+ return unless enabled?
47
+
48
+ verify_version
49
+
50
+ config = fetch_config
51
+
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'
63
+
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
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
122
+ end
123
+
124
+ # Command that was run with bundle
125
+ #
126
+ # @return [String]
127
+ def command
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
+ )
140
+ end
141
+ end
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
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Diffend
4
+ # Modules grouping supported bundler commands
5
+ module Commands
6
+ # Bundler install command
7
+ INSTALL = 'install'
8
+ # Bundler update command
9
+ UPDATE = 'update'
10
+ # Bundler exec command
11
+ EXEC = 'exec'
12
+ end
13
+ end
@@ -0,0 +1,117 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'yaml'
4
+
5
+ module Diffend
6
+ # Module for all the components related to setting up the config
7
+ module Config
8
+ # Class responsible for fetching the config from .diffend.yml
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
+ class << self
19
+ # @param build_path [String] path of the current build
20
+ #
21
+ # @return [OpenStruct] open struct with config details
22
+ #
23
+ # @example
24
+ # details = Fetcher.new.call('./')
25
+ # details.build_path #=> './'
26
+ def call(build_path)
27
+ build(build_path)
28
+ rescue Errors::MissingConfigurationFile
29
+ Bundler.ui.error(build_missing_error_message(build_path))
30
+
31
+ raise Diffend::Errors::HandledException
32
+ rescue Errors::EmptyConfigurationFile
33
+ Bundler.ui.error(build_empty_error_message(build_path))
34
+
35
+ raise Diffend::Errors::HandledException
36
+ 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))
42
+
43
+ raise Diffend::Errors::HandledException
44
+ end
45
+
46
+ private
47
+
48
+ # @param build_path [String] path of the current build
49
+ #
50
+ # @return [OpenStruct] open struct with config details
51
+ def build(build_path)
52
+ content = ERB.new(
53
+ File.read(
54
+ FileFinder.call(build_path)
55
+ )
56
+ ).result
57
+
58
+ raise Errors::EmptyConfigurationFile if content.empty?
59
+
60
+ OpenStruct.new(parse_file(content).merge(build_path: build_path))
61
+ .tap(&Validator.method(:call))
62
+ end
63
+
64
+ def parse_file(content)
65
+ YAML.safe_load(content)
66
+ rescue Psych::SyntaxError
67
+ raise Errors::MalformedConfigurationFile
68
+ end
69
+
70
+ # @param build_path [String] path of the current build
71
+ #
72
+ # @return [String] missing configuration file message
73
+ def build_missing_error_message(build_path)
74
+ <<~MSG
75
+ \nWe were unable to locate Diffend configuration file.\n
76
+ Please make sure that .diffend.yml is present in #{build_path} folder.\n
77
+ MSG
78
+ end
79
+
80
+ # @return [String] empty configuration file message
81
+ def build_empty_error_message
82
+ <<~MSG
83
+ \nYour Diffend configuration file is empty.\n
84
+ Please re-setup.\n
85
+ MSG
86
+ end
87
+
88
+ # @return [String] malformed configuration file message
89
+ def build_malformed_error_message
90
+ <<~MSG
91
+ \nYour Diffend configuration file is malformed.\n
92
+ Please re-setup.\n
93
+ MSG
94
+ 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
+ end
115
+ end
116
+ end
117
+ end