Reorganizing files, cleaning up.
This commit is contained in:
parent
c694a1608b
commit
0306e71f47
|
@ -14,73 +14,23 @@ require 'optparse'
|
||||||
# If no Repository matches, then qwandry will exit with a 404 (repo not found)
|
# If no Repository matches, then qwandry will exit with a 404 (repo not found)
|
||||||
#
|
#
|
||||||
module Qwandry
|
module Qwandry
|
||||||
|
autoload :Launcher, "qwandry/launcher"
|
||||||
class Repository
|
autoload :Repository, "qwandry/repository"
|
||||||
attr_reader :name
|
autoload :FlatRepository, "qwandry/flat_repository"
|
||||||
|
autoload :Package, "qwandry/package"
|
||||||
def initialize(name, path)
|
|
||||||
@name = name
|
|
||||||
@path = path.chomp('/')
|
|
||||||
end
|
|
||||||
|
|
||||||
def scan(name)
|
|
||||||
[]
|
|
||||||
end
|
|
||||||
|
|
||||||
def package(name, paths)
|
|
||||||
Package.new(name, paths, self)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# Directories look like:
|
|
||||||
# Repository
|
|
||||||
# lib-0.1
|
|
||||||
# lib-0.2
|
|
||||||
class FlatRepository < Repository
|
|
||||||
def scan(name)
|
|
||||||
results = []
|
|
||||||
Dir["#{@path}/*"].select do |path|
|
|
||||||
if File.basename(path).start_with?(name)
|
|
||||||
results << package(File.basename(path), [path])
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
results
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
class Package
|
|
||||||
attr_reader :name
|
|
||||||
attr_reader :repository
|
|
||||||
attr_reader :paths
|
|
||||||
|
|
||||||
def initialize(name, paths, repository)
|
|
||||||
@name = name
|
|
||||||
@repository = repository
|
|
||||||
@paths = paths
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def launch(package, editor=nil)
|
|
||||||
editor ||= ENV['VISUAL'] || ENV['EDITOR']
|
|
||||||
system editor, *package.paths
|
|
||||||
end
|
|
||||||
module_function :launch
|
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
if __FILE__ == $0
|
if __FILE__ == $0
|
||||||
load('repositories.rb')
|
@qwandry = Qwandry::Launcher.new
|
||||||
load('~/.qwandry/repositories.rb') if File.exists?('~/.qwandry/repositories.rb')
|
load('~/.qwandry/repositories.rb') if File.exists?('~/.qwandry/repositories.rb')
|
||||||
|
|
||||||
opts = OptionParser.new do |opts|
|
opts = OptionParser.new do |opts|
|
||||||
opts.banner = "Usage: qwandry [options] name [version]"
|
opts.banner = "Usage: qwandry [options] name [version]"
|
||||||
opts.separator ""
|
opts.separator ""
|
||||||
|
|
||||||
opts.separator "Known Repositories: #{@repositories.keys.join(", ")}"
|
opts.separator "Known Repositories: #{@qwandry.repositories.keys.join(", ")}"
|
||||||
opts.on("-e", "--editor EDITOR", "Use EDITOR to open the package") do |editor|
|
opts.on("-e", "--editor EDITOR", "Use EDITOR to open the package") do |editor|
|
||||||
@editor = editor
|
@qwandry.editor = editor
|
||||||
end
|
end
|
||||||
|
|
||||||
opts.on_tail("-h", "--help", "Show this message") do
|
opts.on_tail("-h", "--help", "Show this message") do
|
||||||
|
@ -97,13 +47,7 @@ if __FILE__ == $0
|
||||||
end
|
end
|
||||||
|
|
||||||
name = ARGV.pop
|
name = ARGV.pop
|
||||||
packages = []
|
packages = @qwandry.find(name)
|
||||||
|
|
||||||
@repositories.each do |set, repos|
|
|
||||||
repos.each do |repo|
|
|
||||||
packages.concat(repo.scan(name))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
package = nil
|
package = nil
|
||||||
case packages.length
|
case packages.length
|
||||||
|
@ -122,5 +66,5 @@ if __FILE__ == $0
|
||||||
package = packages[index]
|
package = packages[index]
|
||||||
end
|
end
|
||||||
|
|
||||||
Qwandry.launch(package, @editor) if package
|
@qwandry.launch(package) if package
|
||||||
end
|
end
|
|
@ -0,0 +1,18 @@
|
||||||
|
module Qwandry
|
||||||
|
# Directories look like:
|
||||||
|
# Repository
|
||||||
|
# lib-0.1
|
||||||
|
# lib-0.2
|
||||||
|
class FlatRepository < Qwandry::Repository
|
||||||
|
def scan(name)
|
||||||
|
results = []
|
||||||
|
Dir["#{@path}/*"].select do |path|
|
||||||
|
if File.basename(path).start_with?(name)
|
||||||
|
results << package(File.basename(path), [path])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
results
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,61 @@
|
||||||
|
# Launcher is the core Qwandry class, it coordinates finding and launching
|
||||||
|
# a package. It is driven externaly by a UI.
|
||||||
|
module Qwandry
|
||||||
|
class Launcher
|
||||||
|
# The default editor to be used by Qwandry#launch.
|
||||||
|
attr_accessor :editor
|
||||||
|
|
||||||
|
# Returns the repositories the Launcher will use.
|
||||||
|
attr_reader :repositories
|
||||||
|
|
||||||
|
def initialize
|
||||||
|
@repositories = Hash.new{|h,k| h[k] = []}
|
||||||
|
add_ruby_repositories
|
||||||
|
add_gem_repositories
|
||||||
|
end
|
||||||
|
|
||||||
|
# Adds a repository path to Qwandry's Launcher.
|
||||||
|
# `label` is used to label packages residing in the folder `path`.
|
||||||
|
# The `repository_type` controls the class used to index the `path`.
|
||||||
|
def add(label, path, repository_type=Qwandry::FlatRepository)
|
||||||
|
label = label.to_s
|
||||||
|
@repositories[label] << repository_type.new(label, path)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Searches all of the loaded repositories for `name`
|
||||||
|
def find(name)
|
||||||
|
packages = []
|
||||||
|
@repositories.each do |label, repos|
|
||||||
|
repos.each do |repo|
|
||||||
|
packages.concat(repo.scan(name))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
packages
|
||||||
|
end
|
||||||
|
|
||||||
|
# Launches a `package`, unless set, `editor` will check against the environment.
|
||||||
|
def launch(package, editor=nil)
|
||||||
|
editor ||= @editor || ENV['VISUAL'] || ENV['EDITOR']
|
||||||
|
system editor, *package.paths
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
# Add ruby standard libraries, ignore the platform specific ones since they
|
||||||
|
# tend to contain only binaries
|
||||||
|
def add_ruby_repositories
|
||||||
|
($:).grep(/lib\/ruby/).reject{|path| path =~ /#{RUBY_PLATFORM}$/}.each do |path|
|
||||||
|
add :ruby, path
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Add gem repositories:
|
||||||
|
# Using the ruby load paths, determine the common gem root paths, and add those.
|
||||||
|
# This assumes gem paths look like:
|
||||||
|
def add_gem_repositories
|
||||||
|
($:).grep(/gems/).map{|p| p[/.+\/gems\//]}.uniq.each do |path|
|
||||||
|
add :gem, path
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,13 @@
|
||||||
|
module Qwandry
|
||||||
|
class Package
|
||||||
|
attr_reader :name
|
||||||
|
attr_reader :repository
|
||||||
|
attr_reader :paths
|
||||||
|
|
||||||
|
def initialize(name, paths, repository)
|
||||||
|
@name = name
|
||||||
|
@repository = repository
|
||||||
|
@paths = paths
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,18 @@
|
||||||
|
module Qwandry
|
||||||
|
class Repository
|
||||||
|
attr_reader :name
|
||||||
|
|
||||||
|
def initialize(name, path)
|
||||||
|
@name = name
|
||||||
|
@path = path.chomp('/')
|
||||||
|
end
|
||||||
|
|
||||||
|
def scan(name)
|
||||||
|
[]
|
||||||
|
end
|
||||||
|
|
||||||
|
def package(name, paths)
|
||||||
|
Package.new(name, paths, self)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,19 +0,0 @@
|
||||||
@repositories = Hash.new{|h,k| h[k] = []}
|
|
||||||
|
|
||||||
def add(label, path, repository_type=Qwandry::FlatRepository)
|
|
||||||
label = label.to_s
|
|
||||||
@repositories[label] << repository_type.new(label, path)
|
|
||||||
end
|
|
||||||
|
|
||||||
# Add gem repositories:
|
|
||||||
# Using the ruby load paths, determine the common gem root paths, and add those.
|
|
||||||
# This assumes gem paths look like:
|
|
||||||
($:).grep(/gems/).map{|p| p[/.+\/gems\//]}.uniq.each do |path|
|
|
||||||
add :gem, path
|
|
||||||
end
|
|
||||||
|
|
||||||
# Add ruby standard libraries, ignore the platform specific ones since they
|
|
||||||
# tend to contain only binaries
|
|
||||||
($:).grep(/lib\/ruby/).reject{|path| path =~ /#{RUBY_PLATFORM}$/}.each do |path|
|
|
||||||
add :ruby, path
|
|
||||||
end
|
|
Loading…
Reference in New Issue