vimpk 0.3.0 → 0.5.0

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: 3352cab20c957f4b4fc580b6d9f2f0c91d0021cac3713ab6294111192ce5167d
4
- data.tar.gz: 1044a2130c51433400d29c970be3e841d86469ab7dd5ddfeab615b3115a88626
3
+ metadata.gz: c1ddacdbd87289382f61dff2859903c4091456cd64ace528029ad8e497d12b0e
4
+ data.tar.gz: 72186f79e1e2fd67ff630d658fc6540410954cd18924d2756fec039b8adbedfa
5
5
  SHA512:
6
- metadata.gz: 31a0432618e7f85059b10d25b7aa2034ed18bf64b077b04665e08ae8f216402a8195a343ea53767911232af0908d7e2043e8ea3e8d234a81dbda53badac9f53f
7
- data.tar.gz: 6ed9798aedf9bfd255abffe3d93acb6d9aa5e3378c2462a4be569b55b10bc40b840cf8d3242a04fcd2f61098dc99cdfcf5d6b6fd68c245163170c6dea6071453
6
+ metadata.gz: b89b712ec4278d72e87f10c62040251eeae5a3c8f3cd438a97b2507cb3083eb05e794935b311f08fedc453ab23d67557483e72e747d4336eb01a1ba942ca816e
7
+ data.tar.gz: 5b85de54d8df5318fb988e981dca5e1f502578eb9cdb1b5de505c453e9357b4ff131ad65ea4b384684f940d1526d96d71392390b8480895edaf2d2173bdeaf22
data/lib/vimpk/cli.rb CHANGED
@@ -19,6 +19,7 @@ module VimPK
19
19
  def call
20
20
  if @command
21
21
  send(@command, *@argv)
22
+ exit 0
22
23
  else
23
24
  puts @parser.parser
24
25
  end
@@ -37,6 +38,8 @@ module VimPK
37
38
  case name
38
39
  when "i", "install"
39
40
  :install_command
41
+ when "l", "list"
42
+ :list_command
40
43
  when "mv", "move"
41
44
  :move_command
42
45
  when "u", "update"
@@ -49,43 +52,49 @@ module VimPK
49
52
  end
50
53
  end
51
54
 
55
+ def list_command
56
+ command = Commands::List.new(@options)
57
+ list = command.call
58
+ puts list.sort_by(&:downcase)
59
+ end
60
+
52
61
  def install_command(package = nil)
53
62
  time = Time.now
54
- install = Install.new(package, @options[:path], @options[:pack], @options[:type])
55
- puts "Installing #{package} to #{install.dest}…"
56
- install.call
57
- puts colorize("Installed #{package} to #{install.dest}. Took #{Time.now - time} seconds.", color: :green)
63
+ command = Commands::Install.new(package, @options)
64
+ puts "Installing #{package} to #{command.dest}…"
65
+ command.call
66
+ puts colorize("Installed #{package} to #{command.dest}. Took #{Time.now - time} seconds.", color: :green)
58
67
  rescue Git::GitError => e
59
68
  warn colorize("Error: #{e.message}", color: :yellow)
60
69
  abort e.output.lines.map { |line| " #{line}" }.join
61
- rescue Install::PackageExistsError => e
70
+ rescue PackageExistsError => e
62
71
  abort colorize("Error: #{e.message}", color: :red)
63
72
  rescue ArgumentError => e
64
73
  abort colorize("Error: #{e.message}", color: :red)
65
74
  end
66
75
 
67
76
  def move_command(name = nil)
68
- move = Move.new(name, @options[:path], @options[:pack], @options[:type])
69
- move.call
70
- puts colorize("Moved #{name} to #{move.dest}.", color: :green)
71
- rescue Move::PackageNotFoundError, Move::MultiplePackagesFoundError, ArgumentError => e
77
+ command = Commands::Move.new(name, @options)
78
+ command.call
79
+ puts colorize("Moved #{name} to #{command.dest}.", color: :green)
80
+ rescue PackageNotFoundError, MultiplePackagesFoundError, ArgumentError => e
72
81
  abort colorize(e.message, color: :red)
73
82
  end
74
83
 
75
84
  def update_command
76
- update = Update.new(@options[:path])
77
- puts "Updating #{update.plugins.size} packages in #{@options[:path]}…"
85
+ command = Commands::Update.new(@options)
86
+ puts "Updating #{command.plugins.size} packages in #{@options[:path]}…"
78
87
  start_time = Time.now
79
- update.call
88
+ command.call
80
89
 
81
90
  statuses = {}
82
91
 
83
- while (log = update.logs.pop)
92
+ while (log = command.logs.pop)
84
93
  basename = log[:basename]
85
94
  statuses[basename] = log[:log]
86
95
  end
87
96
 
88
- basenames = update.plugins.map { |dir| File.basename(dir) }.sort_by(&:downcase)
97
+ basenames = command.plugins.map { |dir| File.basename(dir) }.sort_by(&:downcase)
89
98
 
90
99
  max_name_length = statuses.keys.map(&:length).max
91
100
 
@@ -97,11 +106,11 @@ module VimPK
97
106
  end
98
107
  end
99
108
 
100
- if statuses.size < update.jobs.size
101
- puts "The remaining #{update.jobs.size - statuses.size} plugins are up to date."
109
+ if statuses.size < command.jobs.size
110
+ puts "The remaining #{command.jobs.size - statuses.size} plugins are up to date."
102
111
  end
103
112
 
104
- puts colorize("Finished updating #{update.jobs.size} plugins. Took #{Time.now - start_time} seconds.")
113
+ puts colorize("Finished updating #{command.jobs.size} plugins. Took #{Time.now - start_time} seconds.")
105
114
 
106
115
  if statuses.size.nonzero?
107
116
  print "Display diffs? (Y/n) "
@@ -112,18 +121,22 @@ module VimPK
112
121
  puts
113
122
  puts "Displaying diffs…"
114
123
 
115
- statuses.each do |basename, status|
116
- puts status.lines.map { |line| "#{basename}: #{colorize_diff line}" }.join
124
+ IO.popen("less", "w") do |io|
125
+ statuses.each do |basename, status|
126
+ status.lines.each do |line|
127
+ io.puts "#{basename}: #{colorize_diff line}"
128
+ end
129
+ end
117
130
  end
118
131
  end
119
132
  end
120
133
  end
121
134
 
122
135
  def remove_command(name = nil)
123
- Remove.new(name, @options[:path]).call
136
+ Commands::Remove.new(name, @options).call
124
137
 
125
138
  puts colorize("Package #{name} removed.", color: :green)
126
- rescue ArgumentError, VimPK::Remove::PackageNotFoundError => e
139
+ rescue ArgumentError, PackageNotFoundError => e
127
140
  abort colorize(e.message, color: :red)
128
141
  end
129
142
  end
@@ -0,0 +1,25 @@
1
+ module VimPK
2
+ module Commands
3
+ class Install
4
+ include VimPK::Colorizer
5
+
6
+ attr_reader :dest
7
+
8
+ def initialize(package, options)
9
+ @package = package || raise(ArgumentError, "Package name is required")
10
+ @path = options.path
11
+ @pack = options.pack || options.default_pack
12
+ @type = options.type || options.default_type
13
+ @dest = File.join(@path, @pack, @type, File.basename(@package))
14
+ @source = "https://github.com/#{package}.git"
15
+ @git = Git
16
+ end
17
+
18
+ def call
19
+ raise PackageExistsError, "Package #{@package} already exists at #{@dest}" if File.exist?(@dest)
20
+
21
+ Git.clone(@source, @dest, dir: @path)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,24 @@
1
+ require "fileutils"
2
+
3
+ module VimPK
4
+ module Commands
5
+ class List
6
+ attr_reader :dest
7
+
8
+ def initialize(options)
9
+ @path = options.path
10
+ @pack = options.pack || "*"
11
+ @type = options.type || "{start,opt}"
12
+ end
13
+
14
+ def call
15
+ pattern = File.join(@path, @pack, @type, "*")
16
+ glob = Dir.glob(pattern)
17
+
18
+ raise PackageNotFoundError, "No packages were found in #{pattern}." if glob.empty?
19
+
20
+ glob
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,40 @@
1
+ require "fileutils"
2
+
3
+ module VimPK
4
+ module Commands
5
+ class Move
6
+ attr_reader :dest
7
+
8
+ def initialize(name, options)
9
+ raise ArgumentError, "New pack or type is required" unless options.pack || options.type
10
+ @name = name || raise(ArgumentError, "Package name is required")
11
+ @path = options.path
12
+ @pack = options.pack
13
+ @type = options.type
14
+ end
15
+
16
+ def call
17
+ glob = Dir.glob(File.join(@path, "*", "{start,opt}", @name))
18
+
19
+ if glob.empty?
20
+ raise PackageNotFoundError, "Package #{@name} not found in #{@path}."
21
+ elsif glob.size > 1
22
+ raise MultiplePackagesFoundError, "Multiple packages #{@name} found in #{glob.join(" and ")}."
23
+ else
24
+ source = glob.first
25
+ current_type = File.basename(File.dirname(source))
26
+ current_pack = File.basename(File.dirname(File.dirname(source)))
27
+ @dest = File.join(@path, @pack || current_pack, @type || current_type, @name)
28
+
29
+ if File.exist?(dest)
30
+ raise ArgumentError, "Package #{@name} already exists in #{dest}."
31
+ else
32
+ FileUtils.mkdir_p(File.dirname(dest))
33
+ end
34
+
35
+ FileUtils.mv(source, dest)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,24 @@
1
+ require "fileutils"
2
+
3
+ module VimPK
4
+ module Commands
5
+ class Remove
6
+ def initialize(name, options)
7
+ @name = name || raise(ArgumentError, "Package name is required")
8
+ @path = options.path
9
+ end
10
+
11
+ def call
12
+ glob = Dir.glob(File.join(@path, "*", "{start,opt}", @name))
13
+
14
+ if glob.empty?
15
+ raise PackageNotFoundError, "Package #{@name} not found in #{@path}."
16
+ else
17
+ glob.each do |dir|
18
+ FileUtils.rm_rf(dir)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,26 @@
1
+ module VimPK
2
+ module Commands
3
+ class Update
4
+ include VimPK::Colorizer
5
+
6
+ attr_reader :jobs, :logs, :plugins
7
+
8
+ def initialize(options)
9
+ @pack_dir = File.expand_path(options.path)
10
+ @logs = Queue.new
11
+ @pool = ThreadPool.new
12
+ @plugins = Dir.glob(File.join(@pack_dir, "*", "{start,opt}", "*", ".git")).sort.map(&File.method(:dirname))
13
+ @jobs = []
14
+ end
15
+
16
+ def call
17
+ @jobs = @plugins.map do |dir|
18
+ @pool.schedule Job.new(dir, @logs)
19
+ end
20
+
21
+ @pool.shutdown
22
+ @logs.close
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,9 @@
1
+ module VimPK
2
+ module Commands
3
+ autoload :Install, "vimpk/commands/install"
4
+ autoload :List, "vimpk/commands/list"
5
+ autoload :Move, "vimpk/commands/move"
6
+ autoload :Remove, "vimpk/commands/remove"
7
+ autoload :Update, "vimpk/commands/update"
8
+ end
9
+ end
data/lib/vimpk/options.rb CHANGED
@@ -10,11 +10,11 @@ module VimPK
10
10
  DEFAULT_TYPE = "start"
11
11
  DEFAULT_PACK = "plugins"
12
12
 
13
- DefaultOptions = Struct.new(:path, :pack, :type)
13
+ DefaultOptions = Struct.new(:path, :pack, :type, :default_pack, :default_type)
14
14
 
15
15
  def initialize(argv)
16
16
  @argv = argv
17
- @options = DefaultOptions.new(DEFAULT_PATH, DEFAULT_PACK, DEFAULT_TYPE)
17
+ @options = DefaultOptions.new(DEFAULT_PATH, nil, nil, DEFAULT_PACK, DEFAULT_TYPE)
18
18
 
19
19
  @parser = OptionParser.new do |parser|
20
20
  parser.banner = "Usage: #{parser.program_name} [options] [command [options]"
@@ -54,7 +54,8 @@ module VimPK
54
54
  parser.separator ""
55
55
  parser.separator "Commands:"
56
56
  parser.separator " i|install REPO/NAME [--opt|--start] [--pack=PATH] [--path=PATH] Install a package"
57
- parser.separator " mv|move Move a package"
57
+ parser.separator " l|list [--opt|--start] [--pack=PATH] [--path=PATH] List packages"
58
+ parser.separator " mv|move NAME [--opt|--start] [--pack=PATH] Move a package"
58
59
  parser.separator " u|update Update all packages"
59
60
  parser.separator " rm|remove NAME Remove all occurrences of a package"
60
61
  end
@@ -1,6 +1,7 @@
1
1
  module VimPK
2
2
  class ThreadPool
3
3
  def initialize(size = Etc.nprocessors * 2)
4
+ Thread.abort_on_exception = true
4
5
  @size = size
5
6
  @jobs = Queue.new
6
7
  @workers = Array.new(size) do
data/lib/vimpk/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module VimPK
4
- VERSION = "0.3.0"
4
+ VERSION = "0.5.0"
5
5
  end
data/lib/vimpk.rb CHANGED
@@ -5,19 +5,17 @@ require "etc"
5
5
 
6
6
  require_relative "vimpk/version"
7
7
 
8
- Thread.abort_on_exception = true
9
-
10
8
  module VimPK
11
- class Error < StandardError; end
9
+ Error = Class.new(StandardError)
10
+ PackageExistsError = Class.new(Error)
11
+ PackageNotFoundError = Class.new(Error)
12
+ MultiplePackagesFoundError = Class.new(Error)
12
13
 
13
14
  autoload :CLI, "vimpk/cli"
15
+ autoload :Commands, "vimpk/commands"
14
16
  autoload :Colorizer, "vimpk/colorizer"
15
17
  autoload :Git, "vimpk/git"
16
- autoload :Install, "vimpk/install"
17
18
  autoload :Job, "vimpk/job"
18
- autoload :Move, "vimpk/move"
19
19
  autoload :Options, "vimpk/options"
20
- autoload :Remove, "vimpk/remove"
21
20
  autoload :ThreadPool, "vimpk/thread_pool"
22
- autoload :Update, "vimpk/update"
23
21
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vimpk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Usewicz
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-03-16 00:00:00.000000000 Z
11
+ date: 2024-03-22 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email:
@@ -24,14 +24,16 @@ files:
24
24
  - lib/vimpk.rb
25
25
  - lib/vimpk/cli.rb
26
26
  - lib/vimpk/colorizer.rb
27
+ - lib/vimpk/commands.rb
28
+ - lib/vimpk/commands/install.rb
29
+ - lib/vimpk/commands/list.rb
30
+ - lib/vimpk/commands/move.rb
31
+ - lib/vimpk/commands/remove.rb
32
+ - lib/vimpk/commands/update.rb
27
33
  - lib/vimpk/git.rb
28
- - lib/vimpk/install.rb
29
34
  - lib/vimpk/job.rb
30
- - lib/vimpk/move.rb
31
35
  - lib/vimpk/options.rb
32
- - lib/vimpk/remove.rb
33
36
  - lib/vimpk/thread_pool.rb
34
- - lib/vimpk/update.rb
35
37
  - lib/vimpk/version.rb
36
38
  - vimpk.gemspec
37
39
  homepage: https://github.com/pusewicz/vimpk
data/lib/vimpk/install.rb DELETED
@@ -1,25 +0,0 @@
1
- module VimPK
2
- class Install
3
- include VimPK::Colorizer
4
-
5
- PackageExistsError = Class.new(StandardError)
6
-
7
- attr_reader :dest
8
-
9
- def initialize(package, path, pack, type)
10
- @package = package || raise(ArgumentError, "Package name is required")
11
- @path = path
12
- @pack = pack
13
- @type = type
14
- @dest = File.join(@path, @pack, @type, File.basename(@package))
15
- @source = "https://github.com/#{package}.git"
16
- @git = Git
17
- end
18
-
19
- def call
20
- raise PackageExistsError, "Package #{@package} already exists at #{@dest}" if File.exist?(@dest)
21
-
22
- Git.clone(@source, @dest, dir: @path)
23
- end
24
- end
25
- end
data/lib/vimpk/move.rb DELETED
@@ -1,41 +0,0 @@
1
- require "fileutils"
2
-
3
- module VimPK
4
- class Move
5
- PackageNotFoundError = Class.new(StandardError)
6
- MultiplePackagesFoundError = Class.new(StandardError)
7
-
8
- attr_reader :dest
9
-
10
- def initialize(name, path, pack = nil, type = nil)
11
- @name = name || raise(ArgumentError, "Package name is required")
12
- raise ArgumentError, "New pack or type is required" unless pack || type
13
- @path = path
14
- @pack = pack
15
- @type = type
16
- end
17
-
18
- def call
19
- glob = Dir.glob(File.join(@path, "*", "{start,opt}", @name))
20
-
21
- if glob.empty?
22
- raise PackageNotFoundError, "Package #{@name} not found in #{@path}."
23
- elsif glob.size > 1
24
- raise MultiplePackagesFoundError, "Multiple packages #{@name} found in #{glob.join(" and ")}."
25
- else
26
- source = glob.first
27
- current_type = File.basename(File.dirname(source))
28
- current_pack = File.basename(File.dirname(File.dirname(source)))
29
- @dest = File.join(@path, @pack || current_pack, @type || current_type, @name)
30
-
31
- if File.exist?(dest)
32
- raise ArgumentError, "Package #{@name} already exists in #{dest}."
33
- else
34
- FileUtils.mkdir_p(File.dirname(dest))
35
- end
36
-
37
- FileUtils.mv(source, dest)
38
- end
39
- end
40
- end
41
- end
data/lib/vimpk/remove.rb DELETED
@@ -1,24 +0,0 @@
1
- require "fileutils"
2
-
3
- module VimPK
4
- class Remove
5
- PackageNotFoundError = Class.new(StandardError)
6
-
7
- def initialize(name, path)
8
- @name = name || raise(ArgumentError, "Package name is required")
9
- @path = path
10
- end
11
-
12
- def call
13
- glob = Dir.glob(File.join(@path, "*", "{start,opt}", @name))
14
-
15
- if glob.empty?
16
- raise PackageNotFoundError, "Package #{@name} not found in #{@path}."
17
- else
18
- glob.each do |dir|
19
- FileUtils.rm_rf(dir)
20
- end
21
- end
22
- end
23
- end
24
- end
data/lib/vimpk/update.rb DELETED
@@ -1,24 +0,0 @@
1
- module VimPK
2
- class Update
3
- include VimPK::Colorizer
4
-
5
- attr_reader :jobs, :logs, :plugins
6
-
7
- def initialize(path)
8
- @pack_dir = File.expand_path(path)
9
- @logs = Queue.new
10
- @pool = ThreadPool.new
11
- @plugins = Dir.glob(File.join(@pack_dir, "*", "{start,opt}", "*", ".git")).sort.map(&File.method(:dirname))
12
- @jobs = []
13
- end
14
-
15
- def call
16
- @jobs = @plugins.map do |dir|
17
- @pool.schedule Job.new(dir, @logs)
18
- end
19
-
20
- @pool.shutdown
21
- @logs.close
22
- end
23
- end
24
- end