binbundle 1.0.9 → 1.0.10

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: 593e189840e9f90dc770daa8af1bded80d6a732cf9f7e35589b86314b884f4fa
4
- data.tar.gz: ae7314de2c67a750210a57462fdc64fbd3ba61fa99f0a2a7393747dbc20b2c68
3
+ metadata.gz: 5004c2ef304f3a5f5fd17c78847d857090408f0e9a1a2bea3ce23553006362bf
4
+ data.tar.gz: c4b5d368b0166251fd6a6e60e46dd867c54901945e0d47d642430b3638bb66d9
5
5
  SHA512:
6
- metadata.gz: 9d4e06a1f4063f3b92a273380d616681b069b41e024047fc6974276dabd767b4fadef660ad38d7bc62dd510ed0043906a0e20125d5172e81b44e9853b4a1d876
7
- data.tar.gz: 870dffb7b79c27871ab90bd7f5875dd9dbf4952ff3db254d44d12d73b807f65901a238b2d42fdaeb8f96e52aa95569c4bf1bd6937b0a24bf292548301b89e70b
6
+ metadata.gz: 970e55c036810e670b77e276c8da27b98552e4410e1a15741c7d60e7a03a7fd7243ffdb13d7fa64c190c0bd2cf7d59a16f7219a81534131c9a7c8e3971a67aa9
7
+ data.tar.gz: c28dfe8cb48c87f1f1aef43fd3b3e8afb986815297ba13f264aca90880b7b71526df27d1780afeffdb473c3216d0f07a511984bc233ffdf6da2afc0308b53096
data/.irbrc ADDED
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+ `gem rdoc binbundle --ri`
3
+
4
+ # rubocop:disable Style/MixinUsage
5
+ include Binbundle # standard:disable all
6
+ # rubocop:enable Style/MixinUsage
data/.rubocop.yml CHANGED
@@ -34,3 +34,6 @@ Metrics/PerceivedComplexity:
34
34
 
35
35
  Metrics/AbcSize:
36
36
  Max: 40
37
+
38
+ Metrics/CyclomaticComplexity:
39
+ Max: 15
data/CHANGELOG.md CHANGED
@@ -1,3 +1,12 @@
1
+ ### 1.0.10
2
+
3
+ 2024-08-04 06:48
4
+
5
+ #### IMPROVED
6
+
7
+ - Code refactoring, tests
8
+ - More tests, more fixes
9
+
1
10
  ### 1.0.9
2
11
 
3
12
  2024-08-02 10:42
data/Gemfile.lock CHANGED
@@ -1,14 +1,16 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- binbundle (1.0.9)
4
+ binbundle (1.0.10)
5
5
  tty-spinner (~> 0.9)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
+ ansi (1.5.0)
10
11
  ast (2.4.2)
11
12
  diff-lcs (1.5.1)
13
+ docile (1.4.1)
12
14
  json (2.7.2)
13
15
  language_server-protocol (3.17.0.3)
14
16
  parallel (1.25.1)
@@ -52,13 +54,27 @@ GEM
52
54
  rubocop-rspec (3.0.3)
53
55
  rubocop (~> 1.61)
54
56
  ruby-progressbar (1.13.0)
57
+ simplecov (0.22.0)
58
+ docile (~> 1.1)
59
+ simplecov-html (~> 0.11)
60
+ simplecov_json_formatter (~> 0.1)
61
+ simplecov-console (0.9.1)
62
+ ansi
63
+ simplecov
64
+ terminal-table
65
+ simplecov-html (0.12.3)
66
+ simplecov_json_formatter (0.1.4)
55
67
  strscan (3.1.0)
68
+ terminal-table (3.0.2)
69
+ unicode-display_width (>= 1.1.1, < 3)
56
70
  tty-cursor (0.7.1)
57
71
  tty-spinner (0.9.3)
58
72
  tty-cursor (~> 0.7)
59
73
  unicode-display_width (2.5.0)
74
+ yard (0.9.36)
60
75
 
61
76
  PLATFORMS
77
+ arm64-darwin-20
62
78
  x86_64-darwin-20
63
79
 
64
80
  DEPENDENCIES
@@ -68,6 +84,9 @@ DEPENDENCIES
68
84
  rubocop (~> 1.21)
69
85
  rubocop-rake
70
86
  rubocop-rspec
87
+ simplecov (~> 0.21)
88
+ simplecov-console (~> 0.9)
89
+ yard (~> 0.9, >= 0.9.26)
71
90
 
72
91
  BUNDLED WITH
73
92
  2.2.29
data/README.md CHANGED
@@ -55,7 +55,7 @@ Use either info command with `--local` to parse installed gems rather than a Bin
55
55
 
56
56
  ### Recommendations
57
57
 
58
- I recommend using Binbundle along with a tool like Dotfiles. Commit your bundle to a repo that you can easily clone to a new machine and then make `gem install binbundle` and `binbundle install ~/dotfiles/Binfile` part of your restore process.
58
+ I recommend using Binbundle along with a tool like [Dotbot](https://github.com/anishathalye/dotbot). Commit your bundle to a repo that you can easily clone to a new machine and then make `gem install binbundle` and `binbundle install ~/dotfiles/Binfile` part of your restore process.
59
59
 
60
60
 
61
61
  ### Support
data/README.rdoc ADDED
@@ -0,0 +1,6 @@
1
+ = Binbundle
2
+
3
+ A command line tool for bundling installed gem binaries and restoring them.
4
+
5
+
6
+
data/Rakefile CHANGED
@@ -7,6 +7,7 @@ require 'rdoc/task'
7
7
  require 'bundler/gem_tasks'
8
8
  require 'rspec/core/rake_task'
9
9
  require 'rubocop/rake_task'
10
+ require 'yard'
10
11
 
11
12
  desc 'Run test suite'
12
13
  task test: %i[rubocop spec]
@@ -26,6 +27,12 @@ Rake::RDocTask.new do |rd|
26
27
  rd.title = 'binbundle'
27
28
  end
28
29
 
30
+ YARD::Rake::YardocTask.new do |t|
31
+ t.files = ['lib/binbundle/*.rb']
32
+ t.options = ['--markup-provider=redcarpet', '--markup=markdown', '--no-private', '-p', 'yard_templates']
33
+ # t.stats_options = ['--list-undoc']
34
+ end
35
+
29
36
  desc 'Development version check'
30
37
  task :ver do
31
38
  gver = `git ver`
data/binbundle.gemspec CHANGED
@@ -31,5 +31,9 @@ Gem::Specification.new do |s|
31
31
  s.executables = s.files.grep(%r{\Abin/}) { |f| File.basename(f) }
32
32
  s.require_paths = ['lib']
33
33
 
34
+ s.add_development_dependency 'simplecov', '~> 0.21'
35
+ s.add_development_dependency 'simplecov-console', '~> 0.9'
36
+ s.add_development_dependency 'yard', '~> 0.9', '>= 0.9.26'
37
+
34
38
  s.add_runtime_dependency('tty-spinner', '~> 0.9')
35
39
  end
@@ -3,20 +3,43 @@
3
3
  module Binbundle
4
4
  # Main class
5
5
  class GemBins
6
- def local_gems
7
- Gem::Specification.sort_by { |g| [g.name.downcase, g.version] }.group_by(&:name)
8
- end
9
-
6
+ # Get gem for bin :gem_for
7
+ attr_writer :gem_for
8
+
9
+ # Get bins for gem :bin_for
10
+ attr_writer :bin_for
11
+
12
+ # Set options (for testing)
13
+ attr_writer :file, :dry_run
14
+
15
+ ##
16
+ ## Create a new GemBins object
17
+ ##
18
+ ## @param options The options
19
+ ## @option options [Boolean] :include_version Include version number in output
20
+ ## @option options [Boolean] :sudo Include sudo in output
21
+ ## @option options [Boolean] :user_install Include --user-install in output
22
+ ## @option options [Boolean] :dry_run Output to STDOUT
23
+ ## @option options [String] :file File to parse
24
+ ## @option options [Boolean] :local Work from local gems instead of Binfile
25
+ ##
10
26
  def initialize(options = {})
11
27
  @include_version = options[:include_version] || false
12
28
  @user_install = options[:user_install]
13
29
  @sudo = options[:sudo]
14
30
  @dry_run = options[:dry_run]
15
31
  @file = File.expand_path(options[:file])
16
-
17
- @local_gems = local_gems.delete_if { |_, specs| specs.delete_if { |spec| spec.executables.empty? }.empty? }
18
32
  end
19
33
 
34
+ ##
35
+ ## Retrieve info (bin_for or gem_for)
36
+ ##
37
+ ## @param options The options
38
+ ## @option options [Boolean] :local Work from local gems instead of Binfile
39
+ ## @option options [String] :gem_for Find gem for this binary
40
+ ## @option options [String] :bin_for Find bins for this gem
41
+ ##
42
+ ## @return [String] resulting gem or bins
20
43
  def info(options)
21
44
  unless File.exist?(@file) || options[:local]
22
45
  puts "File #{@file} not found"
@@ -29,7 +52,10 @@ module Binbundle
29
52
  IO.read(@file)
30
53
  end
31
54
 
32
- gem_list = GemList.new(contents, include_version: @include_version)
55
+ gem_list = JewelryBox.new(contents: contents,
56
+ include_version: @include_version,
57
+ sudo: @sudo,
58
+ user_install: @user_install)
33
59
  if options[:gem_for]
34
60
  gem_list.gem_for_bin(options[:gem_for])
35
61
  elsif options[:bin_for]
@@ -37,30 +63,29 @@ module Binbundle
37
63
  end
38
64
  end
39
65
 
66
+ ##
67
+ ## Install all gems in Binfile
68
+ ##
40
69
  def install
41
70
  unless File.exist?(@file)
42
71
  puts "File #{@file} not found"
43
72
  Process.exit 1
44
73
  end
45
74
 
46
- res = Prompt.yn("Install gems from #{File.basename(@file)}", default_response: true)
75
+ contents = IO.read(@file)
76
+ lines = JewelryBox.new(contents: contents, include_version: @include_version, sudo: @sudo,
77
+ user_install: @user_install)
47
78
 
79
+ total = lines.count
80
+ successes = 0
81
+ failures = 0
82
+ res = Prompt.yn("Install #{total} gems from #{File.basename(@file)}", default_response: true)
48
83
  Process.exit 0 unless res
49
84
 
50
85
  puts "Installing gems from #{@file}"
51
86
 
52
- contents = IO.read(@file)
53
- gem_list = GemList.new(contents, include_version: @include_version)
54
- lines = if @sudo
55
- gem_list.sudo
56
- elsif @user_install
57
- gem_list.user_install
58
- else
59
- gem_list.normal_install
60
- end
61
-
62
87
  if @dry_run
63
- puts lines.join("\n")
88
+ puts lines
64
89
  Process.exit 0
65
90
  end
66
91
 
@@ -79,40 +104,38 @@ module Binbundle
79
104
  result = $CHILD_STATUS.success?
80
105
 
81
106
  if result
107
+ successes += 1
82
108
  spinner.success
83
109
  spinner.stop
84
110
  else
111
+ failures += 1
85
112
  spinner.error
86
113
  spinner.stop
87
114
  @errors << output
88
115
  end
89
116
  end
90
117
 
118
+ puts "Total #{total}, installed: #{successes}, #{failures} errors."
119
+
91
120
  return if @errors.empty?
92
121
 
93
122
  puts 'ERRORS:'
94
123
  puts @errors.join("\n")
124
+ Process.exit 1
95
125
  end
96
126
 
97
- def gem_command(gem, attrs)
98
- ver = @include_version ? " -v '#{attrs[:version]}'" : ''
99
- ui = @user_install ? '--user-install ' : ''
100
- sudo = @sudo ? 'sudo ' : ''
101
- "# Executables: #{attrs[:bins].join(', ')}\n#{sudo}gem install #{ui}#{gem}#{ver}"
102
- end
103
-
127
+ ##
128
+ ## Output all gems as Binfile format
129
+ ##
130
+ ## @return [String] Binfile format
131
+ ##
104
132
  def bins_to_s
105
- gems_with_bins = {}
106
-
107
- @local_gems.each do |g, specs|
108
- versions = specs.map { |spec| spec.version.to_s }
109
- bins = specs.map(&:executables)
110
- gems_with_bins[g] = { version: versions.max, bins: bins.sort.uniq }
111
- end
112
-
113
- gems_with_bins.map { |gem, attrs| gem_command(gem, attrs) }.join("\n\n")
133
+ local_gems.map(&:gem_command).join("\n\n")
114
134
  end
115
135
 
136
+ ##
137
+ ## Output or write Binfile
138
+ ##
116
139
  def generate
117
140
  output = bins_to_s
118
141
 
@@ -123,6 +146,9 @@ module Binbundle
123
146
  end
124
147
  end
125
148
 
149
+ ##
150
+ ## Writes to Binfile
151
+ ##
126
152
  def write_file(output)
127
153
  if File.exist?(@file)
128
154
  res = Prompt.yn("#{@file} already exists, overwrite", default_response: false)
@@ -144,5 +170,24 @@ module Binbundle
144
170
  FileUtils.chmod 0o777, @file
145
171
  puts 'Made file executable'
146
172
  end
173
+
174
+ private
175
+
176
+ ##
177
+ ## Find local gems and group by name
178
+ ##
179
+ ## @return [Array] array of local gems as Hashes
180
+ ##
181
+ def local_gems
182
+ gems_with_bins = JewelryBox.new(include_version: @include_version, sudo: @sudo, user_install: @user_install)
183
+
184
+ all = Gem::Specification.sort_by { |g| [g.name.downcase, g.version] }.group_by(&:name)
185
+ all.delete_if { |_, specs| specs.delete_if { |spec| spec.executables.empty? }.empty? }
186
+ all.each do |g, specs|
187
+ gems_with_bins << Jewel.new(g, specs.last.executables.sort.uniq, specs.last.version.to_s)
188
+ end
189
+
190
+ gems_with_bins
191
+ end
147
192
  end
148
193
  end
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Binbundle
4
+ # String helpers
5
+ class Jewel
6
+ # Include version info in output
7
+ attr_writer :include_version
8
+
9
+ # Include sudo
10
+ attr_writer :sudo
11
+
12
+ # Include --user-install
13
+ attr_writer :user_install
14
+
15
+ # Binaries
16
+ attr_reader :bins
17
+
18
+ # Gem name
19
+ attr_reader :gem
20
+
21
+ ##
22
+ ## Create a new Jewel object
23
+ ##
24
+ ## @param gem_name [String] The gem name
25
+ ## @param bins [Array|String] The executables
26
+ ## @param version [String] The semantic version
27
+ ##
28
+ ## @return [Jewel] new jewel object
29
+ ##
30
+ def initialize(gem_name = '', bins = [], version = nil)
31
+ @gem = gem_name
32
+ @bins = if bins.is_a?(String)
33
+ bins.split(/ *, */)
34
+ else
35
+ bins
36
+ end
37
+ @version = version
38
+ @include_version = true
39
+ end
40
+
41
+ ##
42
+ ## Output Jewel as command
43
+ ##
44
+ ## @return [String] Command representation of the object.
45
+ ##
46
+ def to_s
47
+ version = @include_version && @version ? " -v '#{@version}'" : ''
48
+ if @sudo
49
+ "sudo gem install #{@gem}#{version}"
50
+ elsif @user_install
51
+ "gem install --user-install #{@gem}#{version}"
52
+ else
53
+ "gem install #{@gem}#{version}"
54
+ end
55
+ end
56
+
57
+ ##
58
+ ## Output a Binfile-ready version of the Jewel
59
+ ##
60
+ ## @return [String] Binfile string
61
+ ##
62
+ def gem_command
63
+ ver = @include_version ? " -v '#{@version}'" : ''
64
+ ui = @user_install ? '--user-install ' : ''
65
+ sudo = @sudo ? 'sudo ' : ''
66
+ "# Executables: #{@bins.join(', ')}\n#{to_s}"
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Binbundle
4
+ # String helpers
5
+ class JewelryBox < Array
6
+ # Include version info in output
7
+ attr_writer :include_version
8
+
9
+ # Include sudo
10
+ attr_writer :sudo
11
+
12
+ # Include --user-install
13
+ attr_writer :user_install
14
+
15
+ ##
16
+ ## Create a new JewelryBox object
17
+ ##
18
+ ## @param include_version [Boolean] include version
19
+ ## @param sudo [Boolean] include sudo
20
+ ## @param user_install [Boolean] include --user-install
21
+ ## @param contents [String] The contents to parse
22
+ ##
23
+ ## @return [JewelryBox] New JewelryBox object
24
+ def initialize(include_version: true, sudo: false, user_install: false, contents: nil)
25
+ @include_version = include_version
26
+ @sudo = sudo
27
+ @user_install = user_install
28
+
29
+ super()
30
+
31
+ return unless contents
32
+
33
+ init_from_contents(contents)
34
+ end
35
+
36
+ ##
37
+ ## Read and parse a Binfile for gems to install
38
+ ##
39
+ ## @param contents [String] The contents
40
+ ##
41
+ def init_from_contents(contents)
42
+ rx = /(?mix)(?:\#\sExecutables:\s(?<bins>[\S\s,]+?)\n)?(?:sudo\s)?gem\sinstall
43
+ \s(?:--user-install\s)?
44
+ (?<gem>\S+)(?:\s(?:-v|--version)\s'(?<version>[0-9.]+)')?/
45
+ contents.to_enum(:scan, rx).map { Regexp.last_match }.each do |m|
46
+ g = Jewel.new(m['gem'], m['bins'], m['version'])
47
+ g.include_version = @include_version
48
+ g.sudo = @sudo
49
+ g.user_install = @user_install
50
+ push(g)
51
+ end
52
+ end
53
+
54
+ ##
55
+ ## Find a gem for a given binary name
56
+ ##
57
+ ## @param bin [String] The bin to search for
58
+ ##
59
+ ## @return [String] Associated gem name
60
+ ##
61
+ def gem_for_bin(bin)
62
+ m = select { |gem| gem.bins&.include?(bin) }.first
63
+ return "Gem for #{bin} not found" unless m
64
+
65
+ m.gem
66
+ end
67
+
68
+ ##
69
+ ## List binaries for a given gem name
70
+ ##
71
+ ## @param gem [String] The gem name to search for
72
+ ##
73
+ def bins_for_gem(gem)
74
+ m = select { |g| g.gem == gem }.first
75
+ return "Gem #{gem} not found" unless m
76
+
77
+ m.bins ? m.bins.join(', ') : 'Missing info'
78
+ end
79
+
80
+ ##
81
+ ## Output a Binfile version of the JewelryBox
82
+ ##
83
+ ## @return [String] String representation of the object.
84
+ ##
85
+ def to_s
86
+ map(&:to_s).join("\n")
87
+ end
88
+ end
89
+ end
@@ -23,7 +23,7 @@ module Binbundle
23
23
  end
24
24
 
25
25
  # if this isn't an interactive shell, answer default
26
- return default unless $stdout.isatty
26
+ return default if !$stdout.isatty || ENV['TESTING'] == 'true'
27
27
 
28
28
  # clear the buffer
29
29
  if ARGV&.length
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # Main bundle
3
4
  module Binbundle
4
- VERSION = '1.0.9'
5
+ # Version
6
+ VERSION = '1.0.10'
5
7
  end
data/lib/binbundle.rb CHANGED
@@ -6,10 +6,13 @@ require 'tty-spinner'
6
6
  require 'english'
7
7
  require_relative 'binbundle/version'
8
8
  require_relative 'binbundle/prompt'
9
- require_relative 'binbundle/gem_list'
9
+ require_relative 'binbundle/jewel'
10
+ require_relative 'binbundle/jewelry_box'
10
11
  require_relative 'binbundle/gem_bins'
11
12
 
13
+ # Parent module
12
14
  module Binbundle
15
+ # StandardError class
13
16
  class Error < StandardError; end
14
17
  # Your code goes here...
15
18
  end
data/src/_README.md CHANGED
@@ -55,7 +55,7 @@ Use either info command with `--local` to parse installed gems rather than a Bin
55
55
 
56
56
  ### Recommendations
57
57
 
58
- I recommend using Binbundle along with a tool like Dotfiles. Commit your bundle to a repo that you can easily clone to a new machine and then make `gem install binbundle` and `binbundle install ~/dotfiles/Binfile` part of your restore process.
58
+ I recommend using Binbundle along with a tool like [Dotbot](https://github.com/anishathalye/dotbot). Commit your bundle to a repo that you can easily clone to a new machine and then make `gem install binbundle` and `binbundle install ~/dotfiles/Binfile` part of your restore process.
59
59
 
60
60
  <!--GITHUB-->
61
61
  ### Support
metadata CHANGED
@@ -1,15 +1,63 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: binbundle
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.9
4
+ version: 1.0.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brett Terpstra
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-08-02 00:00:00.000000000 Z
11
+ date: 2024-08-04 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: simplecov
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.21'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.21'
27
+ - !ruby/object:Gem::Dependency
28
+ name: simplecov-console
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.9'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.9'
41
+ - !ruby/object:Gem::Dependency
42
+ name: yard
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.9'
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: 0.9.26
51
+ type: :development
52
+ prerelease: false
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - "~>"
56
+ - !ruby/object:Gem::Version
57
+ version: '0.9'
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: 0.9.26
13
61
  - !ruby/object:Gem::Dependency
14
62
  name: tty-spinner
15
63
  requirement: !ruby/object:Gem::Requirement
@@ -33,6 +81,7 @@ executables:
33
81
  extensions: []
34
82
  extra_rdoc_files: []
35
83
  files:
84
+ - ".irbrc"
36
85
  - ".rspec"
37
86
  - ".rubocop.yml"
38
87
  - CHANGELOG.md
@@ -41,12 +90,14 @@ files:
41
90
  - Gemfile.lock
42
91
  - LICENSE.txt
43
92
  - README.md
93
+ - README.rdoc
44
94
  - Rakefile
45
95
  - bin/binbundle
46
96
  - binbundle.gemspec
47
97
  - lib/binbundle.rb
48
98
  - lib/binbundle/gem_bins.rb
49
- - lib/binbundle/gem_list.rb
99
+ - lib/binbundle/jewel.rb
100
+ - lib/binbundle/jewelry_box.rb
50
101
  - lib/binbundle/prompt.rb
51
102
  - lib/binbundle/version.rb
52
103
  - src/_README.md
@@ -72,7 +123,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
72
123
  - !ruby/object:Gem::Version
73
124
  version: '0'
74
125
  requirements: []
75
- rubygems_version: 3.2.15
126
+ rubygems_version: 3.2.16
76
127
  signing_key:
77
128
  specification_version: 4
78
129
  summary: Bundle all your gem binaries.
@@ -1,61 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Binbundle
4
- # String helpers
5
- class GemList
6
- attr_writer :include_version
7
-
8
- def initialize(contents, include_version: true)
9
- @contents = contents
10
- @include_version = include_version
11
- end
12
-
13
- def gem_list
14
- return @gem_list if @gem_list
15
-
16
- rx = /(?mix)(?:\#\sExecutables:\s(?<bins>[\S\s,]+?)\n)?(?:sudo\s)?gem\sinstall
17
- \s(?:--user-install\s)?
18
- (?<gem>\S+)(?:\s(?:-v|--version)\s'(?<version>[0-9.]+)')?/
19
- @gem_list = []
20
- @contents.to_enum(:scan, rx).map { Regexp.last_match }.each do |m|
21
- @gem_list << { gem: m['gem'], bins: m['bins']&.split(', '), version: m['version'] }
22
- end
23
- @gem_list
24
- end
25
-
26
- def sudo
27
- gem_list.map do |gem|
28
- version = @include_version && gem[:version] ? " -v '#{gem[:version]}'" : ''
29
- "sudo gem install #{gem[:gem]}#{version}"
30
- end
31
- end
32
-
33
- def user_install
34
- gem_list.map do |gem|
35
- version = @include_version && gem[:version] ? " -v '#{gem[:version]}'" : ''
36
- "gem install --user-install #{gem[:gem]}#{version}"
37
- end
38
- end
39
-
40
- def normal_install
41
- gem_list.map do |gem|
42
- version = @include_version && gem[:version] ? " -v '#{gem[:version]}'" : ''
43
- "gem install #{gem[:gem]}#{version}"
44
- end
45
- end
46
-
47
- def gem_for_bin(bin)
48
- m = gem_list.select { |gem| gem[:bins].include?(bin) }.first
49
- return "Gem for #{bin} not found" unless m
50
-
51
- m[:gem]
52
- end
53
-
54
- def bins_for_gem(gem)
55
- m = gem_list.select { |g| g[:gem] == gem }.first
56
- return "Gem #{gem} not found" unless m
57
-
58
- m[:bins] ? m[:bins].join("\n") : 'Missing info'
59
- end
60
- end
61
- end