strong_versions 0.3.0 → 0.3.1

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: 1c22d65fb8950d91b5f8303c8f5eba7842a39d6ea9410b70071ccd7cf5944a0c
4
- data.tar.gz: 840a9a7c0dd86371ca55a2b8884a7a7b86688342c1cadd038d501ffd864f6166
3
+ metadata.gz: adffa925b8acf616a7d80b8f7122efcd450375d3dd001dbf7a7735a13199a415
4
+ data.tar.gz: 3495a49f991f76bff0f75ea9d726a324eac68819b821dd419a1a8f8ea5b8e641
5
5
  SHA512:
6
- metadata.gz: 460734cdc1a68bdc008f7bb496895da1f0735e9e4b29db2a1f816f41895717cae236ae27e14242ca92f25d0fe5346ff1cdb1532115a8997f63f86dfcee0e10ab
7
- data.tar.gz: 634139436aec6caa3d9be60723a6fea378c702799046ffc6929d84e38a61d1927cf8c5f3820dc79c5f67c4e2628c0238da7caeb0fd71b57536b4cea897d5555a
6
+ metadata.gz: f88d7e3db8ad162490eb0426a48638fa8c5195d1b7ffc2342d8084166cd7af46fe5bd0667a2703ce68e3ef0fb54addc32739b0a1e8612f2dd5651d68d8848a5e
7
+ data.tar.gz: 9a798e3a31a229f9191daf7e631171c5cd757bbf1d01db4426b905caa7b6ac6f4bfa76f3234fba778a96f131e11bd43fdb58fae4d20a7f1047cc14fef462c9b1
data/.rubocop.yml CHANGED
@@ -5,6 +5,10 @@ Metrics/BlockLength:
5
5
  Exclude:
6
6
  - 'spec/**/*'
7
7
 
8
+ Style/FormatStringToken:
9
+ Exclude:
10
+ # The `Paint` gem requires this format of string template.
11
+ - 'lib/strong_versions/terminal.rb'
8
12
  AllCops:
9
13
  Exclude:
10
14
  - 'bin/**/*'
@@ -0,0 +1,2 @@
1
+ ignore:
2
+ - i18n
data/Makefile ADDED
@@ -0,0 +1,5 @@
1
+ .PHONY: test
2
+ test:
3
+ bin/rspec
4
+ bin/rubocop
5
+ bundle exec bin/strong_versions
data/README.md CHANGED
@@ -28,7 +28,7 @@ The benefit of applying this standard is that, if all gems follow [Semantic Vers
28
28
  Add the gem to your `Gemfile`
29
29
 
30
30
  ```ruby
31
- gem 'strong_versions', '~> 0.3.0'
31
+ gem 'strong_versions', '~> 0.3.1'
32
32
  ```
33
33
 
34
34
  And rebuild your bundle:
data/bin/strong_versions CHANGED
@@ -4,8 +4,7 @@ require 'strong_versions'
4
4
 
5
5
  config_path = Bundler.root.join('.strong_versions.yml')
6
6
  config = StrongVersions::Config.new(config_path)
7
- dependencies = Bundler.definition.dependencies
8
-
7
+ dependencies = StrongVersions::DependencyFinder.new.dependencies
9
8
  valid = StrongVersions::Dependencies.new(dependencies).validate!(
10
9
  except: config.exceptions,
11
10
  on_failure: 'warn'
@@ -1,6 +1,15 @@
1
1
  en:
2
- errors:
3
- operator: "Expected pessimistic operator (~>), found:"
4
- version: "Expected major and minor version (e.g. 1.2), found:"
5
- unknown_on_failure: "StrongVersions: Unknown value for `on_failure` in .strong_versions.yml: '%{on_failure}'. Expected one of %{expected}"
6
- version_not_specified: "[not specified]"
2
+ strong_versions:
3
+ checked: "gem definitions inspected"
4
+ no_issues: 'no issues'
5
+ issue: 'issue'
6
+ issues: 'issues'
7
+ detected: 'detected'
8
+
9
+ errors:
10
+ failure: "StrongVersions Failure"
11
+ operator: "Expected pessimistic operator:"
12
+ version: "Expected major and minor version or unstable version, e.g."
13
+ unknown_on_failure: "StrongVersions: Unknown value for `on_failure` in .strong_versions.yml: '%{on_failure}'. Expected one of %{expected}"
14
+ suggested: 'Suggested: '
15
+ version_not_specified: "[not specified]"
@@ -2,32 +2,24 @@
2
2
 
3
3
  require 'yaml'
4
4
 
5
- begin
6
- require 'i18n'
7
- I18n.config.available_locales = :en
8
- I18n.load_path += Dir[
9
- File.join(
10
- File.expand_path('..', __dir__), 'config', 'locales', '**', '*.yml'
11
- )
12
- ]
13
- rescue LoadError
14
- require 'strong_versions/i18n_stub'
15
- end
5
+ require 'i18n'
6
+ require 'paint'
16
7
 
17
8
  require 'strong_versions/config'
18
9
  require 'strong_versions/dependency'
10
+ require 'strong_versions/dependency_finder'
19
11
  require 'strong_versions/dependencies'
20
- require 'strong_versions/gemfile_dsl'
21
- require 'strong_versions/install_detector'
12
+ require 'strong_versions/suggestion'
22
13
  require 'strong_versions/terminal'
23
14
  require 'strong_versions/version'
24
15
 
25
16
  module StrongVersions
26
- def self.installed?
27
- InstallDetector.new.installed?
28
- end
29
-
30
17
  def self.root
31
18
  Pathname.new(File.dirname(__dir__))
32
19
  end
33
20
  end
21
+
22
+ I18n.config.available_locales = :en
23
+ I18n.load_path += Dir[
24
+ StrongVersions.root.join('config', 'locales', '**', '*.yml')
25
+ ]
@@ -3,19 +3,19 @@
3
3
  module StrongVersions
4
4
  class Config
5
5
  def initialize(path)
6
- @config = (YAML.load_file(path) if File.exist?(path))
6
+ @config = YAML.load_file(path) if File.exist?(path)
7
7
 
8
8
  validate_on_failure
9
9
  end
10
10
 
11
11
  def exceptions
12
- return [] if @config.nil?
12
+ return [] unless @config
13
13
 
14
14
  @config.fetch('ignore', [])
15
15
  end
16
16
 
17
17
  def on_failure
18
- return 'raise' if @config.nil?
18
+ return 'raise' unless @config
19
19
 
20
20
  @config.fetch('on_failure', 'raise')
21
21
  end
@@ -29,8 +29,8 @@ module StrongVersions
29
29
 
30
30
  raise Bundler::BundlerError,
31
31
  I18n.t(
32
- 'errors.unknown_on_failure', on_failure: strategy,
33
- expected: expected
32
+ 'strong_versions.errors.unknown_on_failure',
33
+ on_failure: strategy, expected: expected
34
34
  )
35
35
  end
36
36
  end
@@ -7,19 +7,17 @@ module StrongVersions
7
7
  Dependency.new(raw_dependency)
8
8
  end
9
9
  @invalid_gems = []
10
+ @terminal = Terminal.new
10
11
  end
11
12
 
12
13
  def validate!(options = {})
13
- return true if validate(options)
14
-
15
- on_failure = options.fetch(:on_failure, 'raise')
16
- case on_failure
17
- when 'raise'
18
- raise_failure
19
- when 'warn'
20
- warn_failure
14
+ if validate(options)
15
+ summary
16
+ return true
21
17
  end
22
18
 
19
+ raise_or_warn(options.fetch(:on_failure, 'raise'))
20
+ summary
23
21
  false
24
22
  end
25
23
 
@@ -35,6 +33,19 @@ module StrongVersions
35
33
 
36
34
  private
37
35
 
36
+ def summary
37
+ @terminal.summary(@dependencies.size, @invalid_gems.size)
38
+ end
39
+
40
+ def raise_or_warn(on_failure)
41
+ case on_failure
42
+ when 'raise'
43
+ raise_failure
44
+ when 'warn'
45
+ warn_failure
46
+ end
47
+ end
48
+
38
49
  def raise_failure
39
50
  warn_failure
40
51
  # We must raise an error that Bundler recognises otherwise it prints a
@@ -44,17 +55,19 @@ module StrongVersions
44
55
  end
45
56
 
46
57
  def warn_failure
47
- terminal = Terminal.new
48
- terminal.warn("\nStrongVersions expectations not met:\n")
58
+ @terminal.warn("\n#{I18n.t('strong_versions.errors.failure')}\n")
49
59
  @invalid_gems.each do |gem|
50
- terminal.output_errors(gem.name, gem.errors)
60
+ @terminal.output_errors(gem)
51
61
  end
52
- terminal.puts("\n")
62
+ @terminal.puts("\n")
53
63
  end
54
64
 
55
65
  def raise_unknown(on_failure)
56
66
  raise Bundler::Error,
57
- I18n.t('errors.unknown_on_failure', on_failure: on_failure)
67
+ I18n.t(
68
+ 'strong_versions.errors.unknown_on_failure',
69
+ on_failure: on_failure
70
+ )
58
71
  end
59
72
  end
60
73
  end
@@ -4,10 +4,11 @@ module StrongVersions
4
4
  class Dependency
5
5
  attr_reader :name, :errors
6
6
 
7
- def initialize(dependency)
7
+ def initialize(dependency, lockfile = nil)
8
8
  @dependency = dependency
9
9
  @name = dependency.name
10
10
  @errors = []
11
+ @lockfile = lockfile || default_lockfile
11
12
 
12
13
  versions.each do |operator, version|
13
14
  validate_version(operator, version)
@@ -18,6 +19,14 @@ module StrongVersions
18
19
  @errors.empty?
19
20
  end
20
21
 
22
+ def suggestion
23
+ Suggestion.new(lockfile_version)
24
+ end
25
+
26
+ def definition
27
+ versions.map { |operator, version| "'#{operator} #{version}'" }.join(', ')
28
+ end
29
+
21
30
  private
22
31
 
23
32
  def versions
@@ -28,13 +37,25 @@ module StrongVersions
28
37
 
29
38
  def parse_version(requirement)
30
39
  operator, version_obj = Gem::Requirement.parse(requirement)
31
- if version_obj.respond_to?(:version)
32
- # Ruby >= 2.3.0: `version_obj` is a `Gem::Version`
33
- [operator, version_obj.version]
34
- else
35
- # Ruby < 2.3.0: `version_obj` is a `String`
36
- [operator, version_obj]
37
- end
40
+ [operator, version(version_obj)]
41
+ end
42
+
43
+ def lockfile_version
44
+ @lockfile_version ||= version(
45
+ @lockfile.specs.find { |spec| spec.name == @name }&.version
46
+ )
47
+ end
48
+
49
+ def default_lockfile
50
+ Bundler::LockfileParser.new(Bundler.read_file(Bundler.default_lockfile))
51
+ end
52
+
53
+ def version(version_obj)
54
+ # Ruby >= 2.3.0: `version_obj` is a `Gem::Version`
55
+ return version_obj.version if version_obj.respond_to?(:version)
56
+
57
+ # Ruby < 2.3.0: `version_obj` is a `String`
58
+ version_obj
38
59
  end
39
60
 
40
61
  def validate_version(operator, version)
@@ -54,8 +75,12 @@ module StrongVersions
54
75
  def check_valid_version(version)
55
76
  return if valid_version?(version)
56
77
 
57
- version = I18n.t('version_not_specified') if version == '0'
58
- @errors << { type: :version, value: version }
78
+ value = if version == '0'
79
+ I18n.t('strong_versions.version_not_specified')
80
+ else
81
+ version
82
+ end
83
+ @errors << { type: :version, value: value }
59
84
  end
60
85
 
61
86
  def pessimistic?(operator)
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module StrongVersions
4
+ class DependencyFinder
5
+ def dependencies
6
+ development + runtime
7
+ end
8
+
9
+ private
10
+
11
+ def development
12
+ # Gem runtime dependencies are not included here:
13
+ Bundler.definition.dependencies
14
+ end
15
+
16
+ def runtime
17
+ gemspecs.compact.map(&:dependencies).flatten.select do |spec|
18
+ spec.type == :runtime
19
+ end
20
+ end
21
+
22
+ def gemspecs
23
+ gemspec_paths.map { |path| Bundler.load_gemspec(path) }
24
+ end
25
+
26
+ def gemspec_paths
27
+ Dir[File.join(Bundler.default_gemfile.dirname, '{,*}.gemspec')]
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ module StrongVersions
4
+ class Suggestion
5
+ def initialize(version)
6
+ @parts = version.split('.') unless version.nil?
7
+ end
8
+
9
+ def to_s
10
+ return version.to_s if version.nil?
11
+
12
+ "'~> #{version}'"
13
+ end
14
+
15
+ def missing?
16
+ return false if stable?
17
+ return false if unstable?
18
+
19
+ true
20
+ end
21
+
22
+ private
23
+
24
+ def version
25
+ major, minor, patch = @parts if standard?
26
+
27
+ return "#{major}.#{minor}" if stable?
28
+ return "#{major}.#{minor}.#{patch}" if unstable?
29
+
30
+ nil
31
+ end
32
+
33
+ def unstable?
34
+ standard? && @parts.first.to_i.zero?
35
+ end
36
+
37
+ def stable?
38
+ standard? && @parts.first.to_i >= 1
39
+ end
40
+
41
+ def standard?
42
+ return false if @parts.nil?
43
+ return false unless @parts.size == 3
44
+ return false unless numeric?
45
+
46
+ true
47
+ end
48
+
49
+ def numeric?
50
+ @parts.all? { |part| part =~ /\A[0-9]+\Z/ }
51
+ end
52
+ end
53
+ end
@@ -2,50 +2,105 @@
2
2
 
3
3
  module StrongVersions
4
4
  class Terminal
5
- COLOR_CODES = {
6
- red: 31,
7
- green: 32,
8
- light_red: 91
9
- }.freeze
10
-
11
5
  def initialize(file = STDERR)
12
6
  @file = file
13
- check_i18n
14
7
  end
15
8
 
16
9
  def warn(string)
17
- puts(color(:red, string))
10
+ puts(color(string, :underline, :bright, :red))
18
11
  end
19
12
 
20
- def output_errors(name, errors)
21
- puts(format_errors(name, errors))
13
+ def summary(count, failed)
14
+ return puts(success(count)) if failed.zero?
15
+
16
+ puts(failure(count, failed))
22
17
  end
23
18
 
24
- def puts(string)
19
+ def output_errors(gem)
20
+ puts(name_and_definition(gem))
21
+
22
+ puts(format_errors(gem.errors))
23
+ suggestion(gem)
24
+ puts
25
+ end
26
+
27
+ def puts(string = '')
25
28
  @file.puts(string)
26
29
  end
27
30
 
28
31
  private
29
32
 
30
- def format_errors(name, errors)
31
- message = color(:green, "#{name}: ")
32
- message + errors.map do |error|
33
- type = color(:red, I18n.t("errors.#{error[:type]}"))
34
- value = color(:light_red, error[:value])
35
- color(:red, '"') + "#{type} #{value}" + color(:red, '"')
36
- end.join(color(:red, ', '))
33
+ def t(name)
34
+ I18n.t("strong_versions.#{name}")
35
+ end
36
+
37
+ # Success and failure output format brazenly stolen from Rubocop.
38
+ def success(count)
39
+ color(
40
+ "#{count} #{t('checked')}, %{no_issues} #{t('detected')}",
41
+ :default,
42
+ no_issues: [t('no_issues'), :green]
43
+ )
37
44
  end
38
45
 
39
- def color(name, string)
40
- code = COLOR_CODES.fetch(name)
41
- "\033[#{code}m#{string}\033[39m"
46
+ def failure(count, failed)
47
+ issues = "#{failed} " + (failed == 1 ? t('issue') : t('issues'))
48
+ color(
49
+ "#{count} #{t('checked')}, %{issues} #{t('detected')}",
50
+ :default,
51
+ issues: [issues, :red]
52
+ )
42
53
  end
43
54
 
44
- def check_i18n
45
- return unless I18n.respond_to?(:_strong_versions__stub)
55
+ def format_errors(errors)
56
+ errors.map do |error|
57
+ type = t("errors.#{error[:type]}")
58
+ color(
59
+ ' %{type} %{example}, found: %{found}',
60
+ :default,
61
+ type: [type, :default],
62
+ example: example(error[:type]),
63
+ found: [error[:value], :red]
64
+ )
65
+ end
66
+ end
67
+
68
+ def suggestion(gem)
69
+ suggested = ' ' + t('errors.suggested')
70
+ puts(
71
+ color(
72
+ "#{suggested} %{suggestion}",
73
+ :default,
74
+ suggestion: [gem.suggestion.to_s, :green]
75
+ )
76
+ )
77
+ end
78
+
79
+ def name_and_definition(gem)
80
+ color(
81
+ '`%{name}`: %{definition}',
82
+ :default,
83
+ name: [gem.name, :reset, :bright, :red],
84
+ definition: [gem.definition, :reset, :red]
85
+ )
86
+ end
87
+
88
+ def example(type)
89
+ case type
90
+ when :operator
91
+ color('~>', :green)
92
+ when :version
93
+ color('%{major} or %{minor}', :default, major: ['1.2', :green],
94
+ minor: ['0.2.3', :green])
95
+ else
96
+ raise ArgumentError
97
+ end
98
+ end
46
99
 
47
- warn("\n`i18n` not installed. Using fallback.")
48
- warn('Output will improve when your bundle installation completes.')
100
+ def color(string, *substitutions)
101
+ # rubocop:disable Style/FormatString, Layout/SpaceAroundOperators
102
+ Paint%[string.dup, *substitutions]
103
+ # rubocop:enable Style/FormatString, Layout/SpaceAroundOperators
49
104
  end
50
105
  end
51
106
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module StrongVersions
4
- VERSION = '0.3.0'
4
+ VERSION = '0.3.1'
5
5
  end
@@ -29,7 +29,9 @@ Gem::Specification.new do |spec|
29
29
  # I will do a release that is locked to '~> 1.0' and Rails 4 users can use
30
30
  # an older version of the gem but we are not quite there yet.
31
31
  spec.add_dependency 'i18n', '>= 0.5.0'
32
+ spec.add_dependency 'paint', '~> 2.0'
32
33
 
34
+ spec.add_development_dependency 'betterp', '~> 0.1.2'
33
35
  spec.add_development_dependency 'bundler', '~> 1.16'
34
36
  spec.add_development_dependency 'byebug', '~> 10.0'
35
37
  spec.add_development_dependency 'rake', '~> 10.0'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: strong_versions
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bob Farrell
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-12-10 00:00:00.000000000 Z
11
+ date: 2018-12-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: i18n
@@ -24,6 +24,34 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: 0.5.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: paint
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: betterp
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.1.2
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.1.2
27
55
  - !ruby/object:Gem::Dependency
28
56
  name: bundler
29
57
  requirement: !ruby/object:Gem::Requirement
@@ -120,9 +148,11 @@ files:
120
148
  - ".rspec"
121
149
  - ".rubocop.yml"
122
150
  - ".ruby-version"
151
+ - ".strong_versions.yml"
123
152
  - ".travis.yml"
124
153
  - Gemfile
125
154
  - LICENSE
155
+ - Makefile
126
156
  - README.md
127
157
  - Rakefile
128
158
  - bin/console
@@ -137,12 +167,10 @@ files:
137
167
  - lib/strong_versions/config.rb
138
168
  - lib/strong_versions/dependencies.rb
139
169
  - lib/strong_versions/dependency.rb
140
- - lib/strong_versions/gemfile_dsl.rb
141
- - lib/strong_versions/i18n_stub.rb
142
- - lib/strong_versions/install_detector.rb
170
+ - lib/strong_versions/dependency_finder.rb
171
+ - lib/strong_versions/suggestion.rb
143
172
  - lib/strong_versions/terminal.rb
144
173
  - lib/strong_versions/version.rb
145
- - plugins.rb
146
174
  - strong_versions.gemspec
147
175
  homepage: https://github.com/bobf/strong_versions
148
176
  licenses: []
@@ -1,29 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module StrongVersions
4
- class GemfileDSL
5
- attr_reader :_strong_versions__installed
6
-
7
- def initialize
8
- @_strong_versions__installed = false
9
- end
10
-
11
- def plugin(name, *_args)
12
- @_strong_versions__installed = true if name == 'strong_versions'
13
- end
14
-
15
- # If we don't explicitly define this method then RubyGems' Kernel#gem is
16
- # called instead.
17
- def gem(*_args); end
18
-
19
- private
20
-
21
- # rubocop:disable Style/MethodMissingSuper
22
- def method_missing(_method, *_args, &_block); end
23
- # rubocop:enable Style/MethodMissingSuper
24
-
25
- def respond_to_missing?(_method)
26
- true
27
- end
28
- end
29
- end
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class I18n
4
- def self.t(key)
5
- key
6
- end
7
-
8
- def self._strong_versions__stub; end
9
- end
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module StrongVersions
4
- class InstallDetector
5
- def initialize(gemfiles = nil)
6
- @gemfiles = gemfiles.nil? ? Bundler.definition.gemfiles : gemfiles
7
- @dsl = GemfileDSL.new
8
- end
9
-
10
- def installed?
11
- @gemfiles.each do |gemfile|
12
- # Bundler uses the same strategy to parse Gemfiles.
13
- @dsl.instance_eval(
14
- Bundler.read_file(gemfile).dup.untaint, gemfile.to_s, 1
15
- )
16
- end
17
-
18
- @dsl._strong_versions__installed
19
- end
20
- end
21
- end
data/plugins.rb DELETED
@@ -1,28 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # XXX: StrongVersions was intended to be a Bundler plugin but, unfortunately,
4
- # the plugin system is still in its infancy and has many issues which make it
5
- # not fit for purpose. If those issues get resolved then I will re-add
6
- # documentation for use as a plugin.
7
-
8
- require 'strong_versions'
9
-
10
- Bundler::Plugin.add_hook('before-install-all') do |dependencies|
11
- # `StrongVersions.installed?` checks to see if 'strong_versions' is a
12
- # dependency (i.e. included in the `Gemfile`). The reason for this is that,
13
- # once a plugin has been installed, removing it from the `Gemfile` does not
14
- # remove the plugin or its hooks so the hook will still run on every
15
- # `bundle install`. I think that is not what a user would expect so we check
16
- # that the plugin is explicitly referenced in the `Gemfile`.
17
- run_hook(dependencies) if StrongVersions.installed?
18
- end
19
-
20
- def run_hook(dependencies)
21
- config_path = Bundler.root.join('.strong_versions.yml')
22
- config = StrongVersions::Config.new(config_path)
23
-
24
- StrongVersions::Dependencies.new(dependencies).validate!(
25
- except: config.exceptions,
26
- on_failure: config.on_failure
27
- )
28
- end