breezer 0.3.0
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 +7 -0
- data/.gitignore +1 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +27 -0
- data/README.md +74 -0
- data/Rakefile +12 -0
- data/bin/breezer +61 -0
- data/breezer.gemspec +32 -0
- data/images/demo.gif +0 -0
- data/lib/breezer.rb +59 -0
- data/lib/breezer/freezer.rb +114 -0
- data/lib/breezer/parser.rb +11 -0
- data/test/samples/Gemfile +29 -0
- data/test/samples/Gemfile.checked +29 -0
- data/test/samples/Gemfile.final.minor +29 -0
- data/test/samples/Gemfile.final.patch +29 -0
- data/test/samples/Gemfile.lock +129 -0
- data/test/test_breezer.rb +52 -0
- data/test/test_freezer.rb +107 -0
- data/test/test_parser.rb +13 -0
- metadata +132 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 8f8f19ad6f1beb64e5de2db0bbb603e5111e58898f6fba612aac9b36cdee9e11
|
4
|
+
data.tar.gz: 6fcf0b5f2de83d2257e8084e39be2cd0457c1714c03bd8f8a925c9deea9c484c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 0e60d519e028b0833ed30d71b1bcffd4aeb7515f8189c278a7b3070b74b7dc8fe7249eb6ba566e3d7a81956346a108199804dc112acc4bf91246cb8ad70acd38
|
7
|
+
data.tar.gz: 00a05a1b47bf03df92c20a557a6cf38d676699e9bde45c7e42aaac2f4926c820f673366cc2023115ec936b0effcdc103b26e5a081157f01e84933b1b76f2baaa
|
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
*.gem
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
breezer (0.3.0)
|
5
|
+
bundler (> 1.0)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: https://rubygems.org/
|
9
|
+
specs:
|
10
|
+
bump (0.8.0)
|
11
|
+
minitest (5.14.0)
|
12
|
+
minitest-around (0.5.0)
|
13
|
+
minitest (~> 5.0)
|
14
|
+
rake (13.0.1)
|
15
|
+
|
16
|
+
PLATFORMS
|
17
|
+
ruby
|
18
|
+
|
19
|
+
DEPENDENCIES
|
20
|
+
breezer!
|
21
|
+
bump
|
22
|
+
minitest
|
23
|
+
minitest-around
|
24
|
+
rake (>= 10.0.0)
|
25
|
+
|
26
|
+
BUNDLED WITH
|
27
|
+
2.1.4
|
data/README.md
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
# breezer
|
2
|
+
|
3
|
+
[](http://badge.fury.io/rb/breezer) [](https://travis-ci.org/lambda2/breezer) [](https://codeclimate.com/github/lambda2/breezer) [](https://codeclimate.com/github/lambda2/breezer)
|
4
|
+
|
5
|
+
|
6
|
+
A cli to automatically set all your Gemfile dependancies to your current version.
|
7
|
+
|
8
|
+
## TL;DR
|
9
|
+
|
10
|
+

|
11
|
+
|
12
|
+
## In short
|
13
|
+
|
14
|
+
* Updates your Gemfile with your actual used version (from the Gemfile.lock)
|
15
|
+
* Set if you want to constraint the exact version (ex: = 4.3.2), the patch level (ex: ~> 1.2.3) or the minor level (ex: 1.2).
|
16
|
+
* Run a check on your Gemfile to ensure all your deps are properly constrained.
|
17
|
+
* No deps except bundler.
|
18
|
+
|
19
|
+
## Cli
|
20
|
+
|
21
|
+
```bash
|
22
|
+
Usage: breezer DIR [options]
|
23
|
+
-l, --level LEVEL Set the minimum level of gem updates (default: patch). Set to 'exact' to lock gems versions (not recommended).
|
24
|
+
-L, --lockfile NAME Use different lockfile (default: Gemfile.lock)
|
25
|
+
-d, --dry-run Print the updated Gemfile instead of writing it
|
26
|
+
-o, --output FILE The output file (default: Gemfile)
|
27
|
+
-c, --check Check that all gems have version constraints
|
28
|
+
-h, --help Show this help message
|
29
|
+
```
|
30
|
+
|
31
|
+
## Library
|
32
|
+
|
33
|
+
```ruby
|
34
|
+
require 'breezer'
|
35
|
+
|
36
|
+
Breezer.freeze!('Gemfile', 'Gemfile.lock', {level: :minor})
|
37
|
+
```
|
38
|
+
|
39
|
+
## Requirements
|
40
|
+
|
41
|
+
* `bundler`
|
42
|
+
|
43
|
+
## Install
|
44
|
+
|
45
|
+
* `gem install breezer`
|
46
|
+
|
47
|
+
## License
|
48
|
+
|
49
|
+
[MIT License](http://www.opensource.org/licenses/mit-license.php)
|
50
|
+
|
51
|
+
## Authors
|
52
|
+
|
53
|
+
* [André Aubin](https://github.com/lambda2)
|
54
|
+
|
55
|
+
## Contributing
|
56
|
+
|
57
|
+
1. Fork it
|
58
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
59
|
+
3. Commit your changes (`git commit -am 'Added some feature'`)
|
60
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
61
|
+
5. Create new Pull Request
|
62
|
+
|
63
|
+
## Test
|
64
|
+
|
65
|
+
```Bash
|
66
|
+
bundle exec rake test
|
67
|
+
```
|
68
|
+
|
69
|
+
## Release
|
70
|
+
|
71
|
+
```Bash
|
72
|
+
bundle exec rake bump:{patch|minor|major}
|
73
|
+
bundle exec rake release
|
74
|
+
```
|
data/Rakefile
ADDED
data/bin/breezer
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'bundler'
|
5
|
+
require 'breezer'
|
6
|
+
require 'optparse'
|
7
|
+
|
8
|
+
gemfile_dir = ARGV.first || '.'
|
9
|
+
|
10
|
+
gemfile_file = File.directory?(gemfile_dir) ? File.join(gemfile_dir, 'Gemfile') : gemfile_dir
|
11
|
+
lockfile_file = "#{gemfile_file}.lock"
|
12
|
+
|
13
|
+
options = {
|
14
|
+
debug: false
|
15
|
+
}
|
16
|
+
|
17
|
+
OptionParser.new do |parser|
|
18
|
+
parser.banner = 'Usage: breezer DIR [options]'
|
19
|
+
|
20
|
+
parser.on('-l', '--level LEVEL', "Set the minimum level of gem updates (default: patch). Set to 'exact' to lock gems versions (not recommended).") do |v|
|
21
|
+
unless %w[major minor patch exact].include?(v)
|
22
|
+
raise "Error: level must be one of: 'major', 'minor', 'patch' or 'exact', #{v} given."
|
23
|
+
end
|
24
|
+
|
25
|
+
options[:level] = v
|
26
|
+
end
|
27
|
+
|
28
|
+
parser.on('-L', '--lockfile NAME', 'Use different lockfile (default: Gemfile.lock)') do |v|
|
29
|
+
lockfile_file = v
|
30
|
+
end
|
31
|
+
|
32
|
+
parser.on('-d', '--dry-run', 'Print the updated Gemfile instead of writing it') do
|
33
|
+
options[:dry] = true
|
34
|
+
end
|
35
|
+
|
36
|
+
parser.on('-o', '--output FILE', 'The output file (default: Gemfile)') do |v|
|
37
|
+
options[:output] = v
|
38
|
+
end
|
39
|
+
|
40
|
+
parser.on('-c', '--check', 'Check that all gems have version constraints') do |_v|
|
41
|
+
options[:check] = true
|
42
|
+
end
|
43
|
+
|
44
|
+
parser.on('-h', '--help', 'Show this help message') do
|
45
|
+
puts parser
|
46
|
+
exit(0)
|
47
|
+
end
|
48
|
+
end.parse!
|
49
|
+
|
50
|
+
unless File.file?(gemfile_file)
|
51
|
+
puts "Unable to find a Gemfile (searched in #{gemfile_file})"
|
52
|
+
exit(1)
|
53
|
+
end
|
54
|
+
|
55
|
+
unless File.file?(lockfile_file)
|
56
|
+
puts "Unable to find a Lockfile (Gemfile.lock). If you don't have a Gemfile.lock yet, you can run 'bundle install' first. (searched in #{lockfile_file})"
|
57
|
+
exit(1)
|
58
|
+
end
|
59
|
+
|
60
|
+
r = Breezer.freeze!(gemfile_file, lockfile_file, options)
|
61
|
+
exit(r == false ? 2 : 0)
|
data/breezer.gemspec
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = 'breezer'
|
5
|
+
s.version = '0.3.0'
|
6
|
+
|
7
|
+
s.authors = ['André Aubin']
|
8
|
+
s.date = '2020-02-05'
|
9
|
+
s.description = 'Automatically set versions in your Gemfile'
|
10
|
+
s.email = 'hello@andral.xyz'
|
11
|
+
glob = ->(patterns) { s.files & Dir[*patterns] }
|
12
|
+
|
13
|
+
s.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
|
14
|
+
|
15
|
+
s.executables = glob['bin/*'].map { |path| File.basename(path) }
|
16
|
+
s.default_executable = s.executables.first if Gem::VERSION < '1.7.'
|
17
|
+
|
18
|
+
s.homepage = 'http://rubygems.org/gems/breezer'
|
19
|
+
s.require_paths = ['lib']
|
20
|
+
s.summary = 'Breezer!'
|
21
|
+
s.license = 'MIT'
|
22
|
+
|
23
|
+
s.required_ruby_version = '>= 2.4.0'
|
24
|
+
s.required_rubygems_version = '>= 2.7.0'
|
25
|
+
|
26
|
+
s.add_development_dependency 'bump'
|
27
|
+
s.add_development_dependency 'minitest'
|
28
|
+
s.add_development_dependency 'minitest-around'
|
29
|
+
s.add_development_dependency 'rake', '>= 10.0.0'
|
30
|
+
|
31
|
+
s.add_runtime_dependency('bundler', '> 1.0')
|
32
|
+
end
|
data/images/demo.gif
ADDED
Binary file
|
data/lib/breezer.rb
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# This is our main class.
|
5
|
+
# Call Breezer.freeze! to update the Gemfile
|
6
|
+
#
|
7
|
+
class Breezer
|
8
|
+
def self.freeze!(gemfile_path, lockfile_path, **options)
|
9
|
+
absolute_lockfile_path = File.join(lockfile_path)
|
10
|
+
absolute_gemfile_path = File.join(gemfile_path)
|
11
|
+
ENV['BUNDLE_GEMFILE'] = absolute_gemfile_path
|
12
|
+
|
13
|
+
deps = Parser.deps(absolute_lockfile_path, options)
|
14
|
+
|
15
|
+
gemfile = Bundler.read_file(absolute_gemfile_path)
|
16
|
+
if options[:check]
|
17
|
+
check_gemfile!(gemfile, deps, options)
|
18
|
+
else
|
19
|
+
update_gemfile!(gemfile, deps, options, options[:output] || absolute_gemfile_path)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.check_gemfile!(gemfile, deps, options)
|
24
|
+
checks = Freezer.check_gemfile!(gemfile, deps, options)
|
25
|
+
print_check_results(checks)
|
26
|
+
checks.values.map { |e| e[:valid] }.all?
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.update_gemfile!(gemfile, deps, options, output)
|
30
|
+
updated_gemfile = Freezer.update_gemfile!(gemfile, deps, options)
|
31
|
+
write_or_print_output(updated_gemfile, output, options)
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.write_or_print_output(updated_gemfile, output_path, **options)
|
35
|
+
if options[:dry]
|
36
|
+
puts updated_gemfile
|
37
|
+
else
|
38
|
+
File.open(output_path, 'w') do |file|
|
39
|
+
file.write(updated_gemfile)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
updated_gemfile
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.print_check_results(checks)
|
46
|
+
invalid = checks.reject { |_k, v| v[:valid] }
|
47
|
+
if invalid.empty?
|
48
|
+
(puts 'Gemfile dependencies are properly constrained' && return)
|
49
|
+
end
|
50
|
+
puts "#{invalid.values.count} dependencies are not properly set"
|
51
|
+
invalid.each do |no, line|
|
52
|
+
suggested = line[:proposed_version] ? " (Suggested: '~> #{line[:proposed_version]}')" : ''
|
53
|
+
puts format('Line %-3d: gem %-20s%s', no, "'#{line[:name]}'", suggested)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
require 'breezer/parser'
|
59
|
+
require 'breezer/freezer'
|
@@ -0,0 +1,114 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'bundler'
|
4
|
+
|
5
|
+
class Breezer::Freezer
|
6
|
+
GEM_REGEX = /gem[\s]+(?<fullname>['"](?<name>[\w\-_]+)['"])(?<fullversion>,?[\s]?['"](?<version>[~><=]+[\s]?[\d\.]+)['"])?(?<fullsecversion>,?[\s]?['"](?<secversion>[~><=]+[\s]?[\d\.]+)['"])?/.freeze
|
7
|
+
|
8
|
+
def self.update_gemfile!(gemfile, deps, **options)
|
9
|
+
new_gemfile = []
|
10
|
+
gemfile.split("\n").each { |line| new_gemfile << parse(line, deps, options) }
|
11
|
+
[*new_gemfile, ''].join("\n")
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.check_gemfile!(gemfile, deps, **options)
|
15
|
+
gemfile.split("\n").each_with_index.map do |line, no|
|
16
|
+
[no + 1, check(line, deps, options)]
|
17
|
+
end.to_h
|
18
|
+
end
|
19
|
+
|
20
|
+
# Parse a gemfile line, and return the line updated with dependencies
|
21
|
+
def self.parse(line, deps, **options)
|
22
|
+
return line unless valid_line?(line)
|
23
|
+
|
24
|
+
matches = line.match(GEM_REGEX)
|
25
|
+
|
26
|
+
# return the line if we didn't matched a name
|
27
|
+
return line unless matches[:name]
|
28
|
+
|
29
|
+
proposed_version = deps[matches[:name]]
|
30
|
+
version_string = version_for_name(proposed_version, options)
|
31
|
+
|
32
|
+
# return the line if we didn't find a version
|
33
|
+
return line unless proposed_version && version_string
|
34
|
+
|
35
|
+
# if we already have a version and we don't want to override
|
36
|
+
return line if matches[:version] && options[:preserve]
|
37
|
+
|
38
|
+
transform_line_for_version(line, matches, version_string)
|
39
|
+
end
|
40
|
+
|
41
|
+
# Return false if there is no deps declaration in the given line
|
42
|
+
def self.valid_line?(line)
|
43
|
+
# Drop lines if no gem declared
|
44
|
+
return false if (line =~ /gem[\s]+/).nil?
|
45
|
+
|
46
|
+
# Drop line if it's a comment
|
47
|
+
return false unless (line =~ /^[\s]?#/).nil?
|
48
|
+
|
49
|
+
# Drop line if it contains a skip comment
|
50
|
+
return false unless (line =~ /breezer-disable/).nil?
|
51
|
+
|
52
|
+
true
|
53
|
+
end
|
54
|
+
|
55
|
+
# Parse a gemfile line, and return true or false wether the line is valid
|
56
|
+
def self.check(line, deps, **options)
|
57
|
+
return { valid: true } unless valid_line?(line)
|
58
|
+
|
59
|
+
matches = line.match(GEM_REGEX)
|
60
|
+
|
61
|
+
# return the line if we didn't matched a name
|
62
|
+
return { valid: true } unless matches[:name]
|
63
|
+
|
64
|
+
proposed_version = deps[matches[:name]]
|
65
|
+
version_for_name(proposed_version, options)
|
66
|
+
|
67
|
+
# Do we have a version ?
|
68
|
+
{
|
69
|
+
name: matches[:name],
|
70
|
+
proposed_version: proposed_version,
|
71
|
+
valid: !matches[:version].nil?
|
72
|
+
}
|
73
|
+
end
|
74
|
+
|
75
|
+
# Will rewrite the old deps line with the good version
|
76
|
+
def self.transform_line_for_version(line, matches, version_string)
|
77
|
+
# We remove the other version
|
78
|
+
line = line.gsub(matches[:fullsecversion], '') if matches[:fullsecversion]
|
79
|
+
|
80
|
+
# If we had a version
|
81
|
+
if matches[:version]
|
82
|
+
line.gsub(matches[:version], version_string)
|
83
|
+
else
|
84
|
+
line.gsub(matches[:fullname], "#{matches[:fullname]}, '#{version_string}'")
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
# Will return the Gemfile.lock version of a deps
|
89
|
+
def self.version_for_name(proposed_version, options)
|
90
|
+
get_version_string(proposed_version, options)
|
91
|
+
end
|
92
|
+
|
93
|
+
# Will convert the version according to the given level (default 'patch')
|
94
|
+
def self.get_version_string(version, options)
|
95
|
+
options = { level: 'patch' }.merge(options)
|
96
|
+
|
97
|
+
gv = Gem::Version.create(version)
|
98
|
+
return unless gv
|
99
|
+
|
100
|
+
segments = [*gv.canonical_segments, 0, 0, 0].first(3)
|
101
|
+
case options[:level].to_s
|
102
|
+
when 'major'
|
103
|
+
"~> #{segments.first}"
|
104
|
+
when 'minor'
|
105
|
+
"~> #{segments.first(2).join('.')}"
|
106
|
+
when 'patch'
|
107
|
+
"~> #{segments.first(3).join('.')}"
|
108
|
+
when 'exact'
|
109
|
+
"= #{version}"
|
110
|
+
else
|
111
|
+
raise("Unsupported option: #{options[:level]}")
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'bundler'
|
4
|
+
|
5
|
+
class Breezer::Parser
|
6
|
+
def self.deps(lockfile_path = 'Gemfile.lock', **_options)
|
7
|
+
lockfile = Bundler::LockfileParser.new(Bundler.read_file(lockfile_path))
|
8
|
+
specs = lockfile.specs
|
9
|
+
specs.map { |h| [h.name, h.version.version] }.to_h
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
git_source(:github) {|repo| "https://github.com/#{repo}.git" }
|
3
|
+
|
4
|
+
ruby '2.6.5'
|
5
|
+
|
6
|
+
gem 'colorize'
|
7
|
+
|
8
|
+
gem 'ruby-progressbar'
|
9
|
+
|
10
|
+
gem 'bootsnap', '>= 1.4.2', require: false
|
11
|
+
|
12
|
+
group :development, :test do
|
13
|
+
gem 'bullet'
|
14
|
+
gem 'byebug', platforms: %i[mri mingw x64_mingw]
|
15
|
+
gem 'rubocop', '~> 0.79.0'
|
16
|
+
end
|
17
|
+
|
18
|
+
group :development do
|
19
|
+
gem 'listen', '>= 3.0.5', '< 3.2'
|
20
|
+
gem 'web-console', '>= 3.3.0'
|
21
|
+
gem 'spring'
|
22
|
+
gem 'spring-watcher-listen', '~> 2.0.0'
|
23
|
+
end
|
24
|
+
|
25
|
+
group :test do
|
26
|
+
gem 'simplecov', require: false
|
27
|
+
end
|
28
|
+
|
29
|
+
gem 'tzinfo-data', platforms: %i[mingw mswin x64_mingw jruby]
|
@@ -0,0 +1,29 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
git_source(:github) {|repo| "https://github.com/#{repo}.git" }
|
3
|
+
|
4
|
+
ruby '2.6.5'
|
5
|
+
|
6
|
+
gem 'colorize', '~> 0.8.1'
|
7
|
+
|
8
|
+
gem 'ruby-progressbar', '~> 1.10.1'
|
9
|
+
|
10
|
+
gem 'bootsnap', '~> 1.4.5', require: false
|
11
|
+
|
12
|
+
group :development, :test do
|
13
|
+
gem 'bullet', '~> 6.1.0'
|
14
|
+
gem 'byebug', '~> 11.1.1', platforms: %i[mri mingw x64_mingw]
|
15
|
+
gem 'rubocop', '~> 0.79.0'
|
16
|
+
end
|
17
|
+
|
18
|
+
group :development do
|
19
|
+
gem 'listen', '~> 3.1.5'
|
20
|
+
gem 'web-console', '~> 4.0.1'
|
21
|
+
gem 'spring', '~> 2.1.0'
|
22
|
+
gem 'spring-watcher-listen', '~> 2.0.1'
|
23
|
+
end
|
24
|
+
|
25
|
+
group :test do
|
26
|
+
gem 'simplecov', '~> 0.18.1', require: false
|
27
|
+
end
|
28
|
+
|
29
|
+
gem 'tzinfo-data', platforms: %i[mingw mswin x64_mingw jruby] # breezer-disable
|
@@ -0,0 +1,29 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
git_source(:github) {|repo| "https://github.com/#{repo}.git" }
|
3
|
+
|
4
|
+
ruby '2.6.5'
|
5
|
+
|
6
|
+
gem 'colorize', '~> 0.8'
|
7
|
+
|
8
|
+
gem 'ruby-progressbar', '~> 1.10'
|
9
|
+
|
10
|
+
gem 'bootsnap', '~> 1.4', require: false
|
11
|
+
|
12
|
+
group :development, :test do
|
13
|
+
gem 'bullet', '~> 6.1'
|
14
|
+
gem 'byebug', '~> 11.1', platforms: %i[mri mingw x64_mingw]
|
15
|
+
gem 'rubocop', '~> 0.79'
|
16
|
+
end
|
17
|
+
|
18
|
+
group :development do
|
19
|
+
gem 'listen', '~> 3.1'
|
20
|
+
gem 'web-console', '~> 4.0'
|
21
|
+
gem 'spring', '~> 2.1'
|
22
|
+
gem 'spring-watcher-listen', '~> 2.0'
|
23
|
+
end
|
24
|
+
|
25
|
+
group :test do
|
26
|
+
gem 'simplecov', '~> 0.18', require: false
|
27
|
+
end
|
28
|
+
|
29
|
+
gem 'tzinfo-data', platforms: %i[mingw mswin x64_mingw jruby]
|
@@ -0,0 +1,29 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
git_source(:github) {|repo| "https://github.com/#{repo}.git" }
|
3
|
+
|
4
|
+
ruby '2.6.5'
|
5
|
+
|
6
|
+
gem 'colorize', '~> 0.8.1'
|
7
|
+
|
8
|
+
gem 'ruby-progressbar', '~> 1.10.1'
|
9
|
+
|
10
|
+
gem 'bootsnap', '~> 1.4.5', require: false
|
11
|
+
|
12
|
+
group :development, :test do
|
13
|
+
gem 'bullet', '~> 6.1.0'
|
14
|
+
gem 'byebug', '~> 11.1.1', platforms: %i[mri mingw x64_mingw]
|
15
|
+
gem 'rubocop', '~> 0.79.0'
|
16
|
+
end
|
17
|
+
|
18
|
+
group :development do
|
19
|
+
gem 'listen', '~> 3.1.5'
|
20
|
+
gem 'web-console', '~> 4.0.1'
|
21
|
+
gem 'spring', '~> 2.1.0'
|
22
|
+
gem 'spring-watcher-listen', '~> 2.0.1'
|
23
|
+
end
|
24
|
+
|
25
|
+
group :test do
|
26
|
+
gem 'simplecov', '~> 0.18.1', require: false
|
27
|
+
end
|
28
|
+
|
29
|
+
gem 'tzinfo-data', platforms: %i[mingw mswin x64_mingw jruby]
|
@@ -0,0 +1,129 @@
|
|
1
|
+
GEM
|
2
|
+
remote: https://rubygems.org/
|
3
|
+
specs:
|
4
|
+
actionpack (6.0.2.1)
|
5
|
+
actionview (= 6.0.2.1)
|
6
|
+
activesupport (= 6.0.2.1)
|
7
|
+
rack (~> 2.0, >= 2.0.8)
|
8
|
+
rack-test (>= 0.6.3)
|
9
|
+
rails-dom-testing (~> 2.0)
|
10
|
+
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
11
|
+
actionview (6.0.2.1)
|
12
|
+
activesupport (= 6.0.2.1)
|
13
|
+
builder (~> 3.1)
|
14
|
+
erubi (~> 1.4)
|
15
|
+
rails-dom-testing (~> 2.0)
|
16
|
+
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
17
|
+
activemodel (6.0.2.1)
|
18
|
+
activesupport (= 6.0.2.1)
|
19
|
+
activesupport (6.0.2.1)
|
20
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
21
|
+
i18n (>= 0.7, < 2)
|
22
|
+
minitest (~> 5.1)
|
23
|
+
tzinfo (~> 1.1)
|
24
|
+
zeitwerk (~> 2.2)
|
25
|
+
ast (2.4.0)
|
26
|
+
bindex (0.8.1)
|
27
|
+
bootsnap (1.4.5)
|
28
|
+
msgpack (~> 1.0)
|
29
|
+
builder (3.2.4)
|
30
|
+
bullet (6.1.0)
|
31
|
+
activesupport (>= 3.0.0)
|
32
|
+
uniform_notifier (~> 1.11)
|
33
|
+
byebug (11.1.1)
|
34
|
+
colorize (0.8.1)
|
35
|
+
concurrent-ruby (1.1.5)
|
36
|
+
crass (1.0.6)
|
37
|
+
docile (1.3.2)
|
38
|
+
erubi (1.9.0)
|
39
|
+
ffi (1.12.2)
|
40
|
+
i18n (1.8.2)
|
41
|
+
concurrent-ruby (~> 1.0)
|
42
|
+
jaro_winkler (1.5.4)
|
43
|
+
listen (3.1.5)
|
44
|
+
rb-fsevent (~> 0.9, >= 0.9.4)
|
45
|
+
rb-inotify (~> 0.9, >= 0.9.7)
|
46
|
+
ruby_dep (~> 1.2)
|
47
|
+
loofah (2.4.0)
|
48
|
+
crass (~> 1.0.2)
|
49
|
+
nokogiri (>= 1.5.9)
|
50
|
+
method_source (0.9.2)
|
51
|
+
mini_portile2 (2.4.0)
|
52
|
+
minitest (5.14.0)
|
53
|
+
msgpack (1.3.3)
|
54
|
+
nokogiri (1.10.7)
|
55
|
+
mini_portile2 (~> 2.4.0)
|
56
|
+
parallel (1.19.1)
|
57
|
+
parser (2.7.0.2)
|
58
|
+
ast (~> 2.4.0)
|
59
|
+
rack (2.1.2)
|
60
|
+
rack-test (1.1.0)
|
61
|
+
rack (>= 1.0, < 3)
|
62
|
+
rails-dom-testing (2.0.3)
|
63
|
+
activesupport (>= 4.2.0)
|
64
|
+
nokogiri (>= 1.6)
|
65
|
+
rails-html-sanitizer (1.3.0)
|
66
|
+
loofah (~> 2.3)
|
67
|
+
railties (6.0.2.1)
|
68
|
+
actionpack (= 6.0.2.1)
|
69
|
+
activesupport (= 6.0.2.1)
|
70
|
+
method_source
|
71
|
+
rake (>= 0.8.7)
|
72
|
+
thor (>= 0.20.3, < 2.0)
|
73
|
+
rainbow (3.0.0)
|
74
|
+
rake (13.0.1)
|
75
|
+
rb-fsevent (0.10.3)
|
76
|
+
rb-inotify (0.10.1)
|
77
|
+
ffi (~> 1.0)
|
78
|
+
rubocop (0.79.0)
|
79
|
+
jaro_winkler (~> 1.5.1)
|
80
|
+
parallel (~> 1.10)
|
81
|
+
parser (>= 2.7.0.1)
|
82
|
+
rainbow (>= 2.2.2, < 4.0)
|
83
|
+
ruby-progressbar (~> 1.7)
|
84
|
+
unicode-display_width (>= 1.4.0, < 1.7)
|
85
|
+
ruby-progressbar (1.10.1)
|
86
|
+
ruby_dep (1.5.0)
|
87
|
+
simplecov (0.18.1)
|
88
|
+
docile (~> 1.1)
|
89
|
+
simplecov-html (~> 0.11.0)
|
90
|
+
simplecov-html (0.11.0)
|
91
|
+
spring (2.1.0)
|
92
|
+
spring-watcher-listen (2.0.1)
|
93
|
+
listen (>= 2.7, < 4.0)
|
94
|
+
spring (>= 1.2, < 3.0)
|
95
|
+
thor (1.0.1)
|
96
|
+
thread_safe (0.3.6)
|
97
|
+
tzinfo (1.2.6)
|
98
|
+
thread_safe (~> 0.1)
|
99
|
+
unicode-display_width (1.6.1)
|
100
|
+
uniform_notifier (1.13.0)
|
101
|
+
web-console (4.0.1)
|
102
|
+
actionview (>= 6.0.0)
|
103
|
+
activemodel (>= 6.0.0)
|
104
|
+
bindex (>= 0.4.0)
|
105
|
+
railties (>= 6.0.0)
|
106
|
+
zeitwerk (2.2.2)
|
107
|
+
|
108
|
+
PLATFORMS
|
109
|
+
ruby
|
110
|
+
|
111
|
+
DEPENDENCIES
|
112
|
+
bootsnap (>= 1.4.2)
|
113
|
+
bullet
|
114
|
+
byebug
|
115
|
+
colorize
|
116
|
+
listen (>= 3.0.5, < 3.2)
|
117
|
+
rubocop (~> 0.79.0)
|
118
|
+
ruby-progressbar
|
119
|
+
simplecov
|
120
|
+
spring
|
121
|
+
spring-watcher-listen (~> 2.0.0)
|
122
|
+
tzinfo-data
|
123
|
+
web-console (>= 3.3.0)
|
124
|
+
|
125
|
+
RUBY VERSION
|
126
|
+
ruby 2.6.5p114
|
127
|
+
|
128
|
+
BUNDLED WITH
|
129
|
+
2.0.2
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'minitest/autorun'
|
4
|
+
require 'minitest/around/spec'
|
5
|
+
require 'breezer'
|
6
|
+
|
7
|
+
describe Breezer do
|
8
|
+
around do |test|
|
9
|
+
files = Dir["#{File.dirname(__FILE__)}/samples/*"]
|
10
|
+
Dir.mktmpdir do |dir|
|
11
|
+
@dir = dir
|
12
|
+
FileUtils.cp files, dir
|
13
|
+
Bundler::SharedHelpers.chdir(dir) do
|
14
|
+
test.call
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'run without options' do
|
20
|
+
_specs = Breezer.freeze!('Gemfile', 'Gemfile.lock', {})
|
21
|
+
_(File.read('Gemfile')).must_equal File.read('Gemfile.final.patch')
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'run with minor level options' do
|
25
|
+
_specs = Breezer.freeze!('Gemfile', 'Gemfile.lock', level: :minor)
|
26
|
+
_(File.read('Gemfile')).must_equal File.read('Gemfile.final.minor')
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'run with dry run' do
|
30
|
+
specs = Breezer.freeze!('Gemfile', 'Gemfile.lock', dry: true)
|
31
|
+
_(specs).must_equal File.read('Gemfile.final.patch')
|
32
|
+
_(File.read('Gemfile')).wont_be_same_as File.read('Gemfile.final.patch')
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'run with custom output' do
|
36
|
+
specs = Breezer.freeze!('Gemfile', 'Gemfile.lock', output: 'Gemfile.custom')
|
37
|
+
_(specs).must_equal File.read('Gemfile.final.patch')
|
38
|
+
_(File.read('Gemfile')).wont_be_same_as File.read('Gemfile.final.patch')
|
39
|
+
_(File.read('Gemfile.custom')).must_equal File.read('Gemfile.final.patch')
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'run with checks on invalid gemfile' do
|
43
|
+
specs = Breezer.freeze!('Gemfile', 'Gemfile.lock', check: true)
|
44
|
+
_(specs).must_equal false
|
45
|
+
_(File.read('Gemfile')).wont_be_same_as File.read('Gemfile.final.patch')
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'run with checks on valid gemfile' do
|
49
|
+
specs = Breezer.freeze!('Gemfile.checked', 'Gemfile.lock', check: true)
|
50
|
+
_(specs).must_equal true
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'minitest/autorun'
|
4
|
+
require 'breezer'
|
5
|
+
|
6
|
+
class TestBreezer < Minitest::Test
|
7
|
+
DEPS = {
|
8
|
+
'actionpack' => '6.0.2.1',
|
9
|
+
'actionview' => '6.0.2.1',
|
10
|
+
'activemodel' => '6.0.2.1',
|
11
|
+
'activesupport' => '6.0.2.1',
|
12
|
+
'ast' => '2.4.0',
|
13
|
+
'bindex' => '0.8.1',
|
14
|
+
'bootsnap' => '1.4.5',
|
15
|
+
'builder' => '3.2.4',
|
16
|
+
'bullet' => '6.1.0',
|
17
|
+
'byebug' => '11.1.1',
|
18
|
+
'colorize' => '0.8.1',
|
19
|
+
'concurrent-ruby' => '1.1.5',
|
20
|
+
'crass' => '1.0.6',
|
21
|
+
'docile' => '1.3.2',
|
22
|
+
'erubi' => '1.9.0',
|
23
|
+
'ffi' => '1.12.2',
|
24
|
+
'i18n' => '1.8.2',
|
25
|
+
'jaro_winkler' => '1.5.4',
|
26
|
+
'listen' => '3.1.5',
|
27
|
+
'loofah' => '2.4.0',
|
28
|
+
'method_source' => '0.9.2',
|
29
|
+
'mini_portile2' => '2.4.0',
|
30
|
+
'minitest' => '5.14.0',
|
31
|
+
'msgpack' => '1.3.3',
|
32
|
+
'nokogiri' => '1.10.7',
|
33
|
+
'parallel' => '1.19.1',
|
34
|
+
'parser' => '2.7.0.2',
|
35
|
+
'rack' => '2.1.2',
|
36
|
+
'rack-test' => '1.1.0',
|
37
|
+
'rails-dom-testing' => '2.0.3',
|
38
|
+
'rails-html-sanitizer' => '1.3.0',
|
39
|
+
'railties' => '6.0.2.1',
|
40
|
+
'rainbow' => '3.0.0',
|
41
|
+
'rake' => '13.0.1',
|
42
|
+
'rb-fsevent' => '0.10.3',
|
43
|
+
'rb-inotify' => '0.10.1',
|
44
|
+
'rubocop' => '0.79.0',
|
45
|
+
'ruby-progressbar' => '1.10.1',
|
46
|
+
'ruby_dep' => '1.5.0',
|
47
|
+
'simplecov' => '0.18.1',
|
48
|
+
'simplecov-html' => '0.11.0',
|
49
|
+
'spring' => '2.1.0',
|
50
|
+
'spring-watcher-listen' => '2.0.1',
|
51
|
+
'thor' => '1.0.1',
|
52
|
+
'thread_safe' => '0.3.6',
|
53
|
+
'tzinfo' => '1.2.6',
|
54
|
+
'unicode-display_width' => '1.6.1',
|
55
|
+
'uniform_notifier' => '1.13.0',
|
56
|
+
'web-console' => '4.0.1',
|
57
|
+
'zeitwerk' => '2.2.2'
|
58
|
+
}.freeze
|
59
|
+
|
60
|
+
def test_good_matchs
|
61
|
+
[
|
62
|
+
[
|
63
|
+
"gem 'colorize'",
|
64
|
+
"gem 'colorize', '~> 0.8.1'"
|
65
|
+
],
|
66
|
+
[
|
67
|
+
"gem 'ruby-progressbar'",
|
68
|
+
"gem 'ruby-progressbar', '~> 1.10.1'"
|
69
|
+
],
|
70
|
+
[
|
71
|
+
"gem 'bootsnap', '>= 1.4.2', require: false",
|
72
|
+
"gem 'bootsnap', '~> 1.4.5', require: false"
|
73
|
+
],
|
74
|
+
[
|
75
|
+
" gem 'bullet'",
|
76
|
+
" gem 'bullet', '~> 6.1.0'"
|
77
|
+
],
|
78
|
+
[
|
79
|
+
" gem 'byebug', platforms: %i[mri mingw x64_mingw]",
|
80
|
+
" gem 'byebug', '~> 11.1.1', platforms: %i[mri mingw x64_mingw]"
|
81
|
+
],
|
82
|
+
[
|
83
|
+
" gem 'rubocop', '~> 0.79.0'",
|
84
|
+
" gem 'rubocop', '~> 0.79.0'"
|
85
|
+
],
|
86
|
+
[
|
87
|
+
" gem 'listen', '>= 3.0.5', '< 3.2'",
|
88
|
+
" gem 'listen', '~> 3.1.5'"
|
89
|
+
],
|
90
|
+
[
|
91
|
+
" gem 'web-console', '>= 3.3.0'",
|
92
|
+
" gem 'web-console', '~> 4.0.1'"
|
93
|
+
],
|
94
|
+
[
|
95
|
+
" gem 'spring'",
|
96
|
+
" gem 'spring', '~> 2.1.0'"
|
97
|
+
],
|
98
|
+
[
|
99
|
+
" gem 'spring-watcher-listen', '~> 2.0.0'",
|
100
|
+
" gem 'spring-watcher-listen', '~> 2.0.1'"
|
101
|
+
]
|
102
|
+
].each do |line|
|
103
|
+
old_line, new_line = line
|
104
|
+
assert_equal new_line, Breezer::Freezer.parse(old_line, DEPS)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
data/test/test_parser.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'minitest/autorun'
|
4
|
+
require 'breezer'
|
5
|
+
|
6
|
+
class TestParser < Minitest::Test
|
7
|
+
def test_simple_load
|
8
|
+
Bundler::SharedHelpers.chdir("#{File.dirname(__FILE__)}/samples") do
|
9
|
+
specs = Breezer::Parser.deps('Gemfile.lock')
|
10
|
+
assert_equal specs['colorize'], '0.8.1'
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
metadata
ADDED
@@ -0,0 +1,132 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: breezer
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.3.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- André Aubin
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-02-05 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bump
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: minitest
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: minitest-around
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rake
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 10.0.0
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 10.0.0
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: bundler
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '1.0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '1.0'
|
83
|
+
description: Automatically set versions in your Gemfile
|
84
|
+
email: hello@andral.xyz
|
85
|
+
executables:
|
86
|
+
- breezer
|
87
|
+
extensions: []
|
88
|
+
extra_rdoc_files: []
|
89
|
+
files:
|
90
|
+
- ".gitignore"
|
91
|
+
- Gemfile
|
92
|
+
- Gemfile.lock
|
93
|
+
- README.md
|
94
|
+
- Rakefile
|
95
|
+
- bin/breezer
|
96
|
+
- breezer.gemspec
|
97
|
+
- images/demo.gif
|
98
|
+
- lib/breezer.rb
|
99
|
+
- lib/breezer/freezer.rb
|
100
|
+
- lib/breezer/parser.rb
|
101
|
+
- test/samples/Gemfile
|
102
|
+
- test/samples/Gemfile.checked
|
103
|
+
- test/samples/Gemfile.final.minor
|
104
|
+
- test/samples/Gemfile.final.patch
|
105
|
+
- test/samples/Gemfile.lock
|
106
|
+
- test/test_breezer.rb
|
107
|
+
- test/test_freezer.rb
|
108
|
+
- test/test_parser.rb
|
109
|
+
homepage: http://rubygems.org/gems/breezer
|
110
|
+
licenses:
|
111
|
+
- MIT
|
112
|
+
metadata: {}
|
113
|
+
post_install_message:
|
114
|
+
rdoc_options: []
|
115
|
+
require_paths:
|
116
|
+
- lib
|
117
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
118
|
+
requirements:
|
119
|
+
- - ">="
|
120
|
+
- !ruby/object:Gem::Version
|
121
|
+
version: 2.4.0
|
122
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
123
|
+
requirements:
|
124
|
+
- - ">="
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: 2.7.0
|
127
|
+
requirements: []
|
128
|
+
rubygems_version: 3.0.6
|
129
|
+
signing_key:
|
130
|
+
specification_version: 4
|
131
|
+
summary: Breezer!
|
132
|
+
test_files: []
|