qwandry/qwandry.rb

121 lines
2.5 KiB
Ruby
Raw Normal View History

#!/usr/bin/env ruby
require 'optparse'
2010-08-06 00:49:12 +00:00
# Informal Spec:
#
# A User may have multiple Repositories
# A Repositories contains Packages
#
# A User will search for a repository giving a name and optional version
# Each Repository will be scanned for matching Packages
# If only one Package matches, that Package will be opened
# If more than one Package matches, then the user will be prompted to pick one
# While any two Packages share the same name their parent dir is appended
# If no Repository matches, then qwandry will exit with a -404 (repo not found)
#
module Qwandry
2010-08-06 00:49:12 +00:00
class Repository
2010-08-09 04:15:20 +00:00
attr_reader :name
def initialize(name, path)
@name = name
2010-08-06 00:49:12 +00:00
@path = path.chomp('/')
end
def scan(name)
[]
end
2010-08-06 16:48:52 +00:00
def package(name, paths)
Package.new(name, paths, self)
end
2010-08-06 00:49:12 +00:00
end
2010-08-06 00:49:12 +00:00
# Directories look like:
# Repository
# lib-0.1
# lib-0.2
class FlatRepository < Repository
def scan(name)
2010-08-06 16:48:52 +00:00
results = []
Dir["#{@path}/*"].select do |path|
if File.basename(path).start_with?(name)
results << package(File.basename(path), [path])
end
end
2010-08-09 04:15:20 +00:00
2010-08-06 16:48:52 +00:00
results
2010-08-06 00:49:12 +00:00
end
end
2010-08-06 16:48:52 +00:00
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)
`mate #{package.paths.join(' ')}`
end
module_function :launch
end
2010-08-06 00:49:12 +00:00
if __FILE__ == $0
2010-08-09 04:15:20 +00:00
load('repositories.rb')
load('~/.qwandry/repositories.rb') if File.exists?('~/.qwandry/repositories.rb')
2010-08-09 04:15:20 +00:00
2010-08-06 00:49:12 +00:00
opts = OptionParser.new do |opts|
opts.banner = "Usage: qwandry [options] name [version]"
2010-08-06 00:49:12 +00:00
opts.separator ""
opts.separator "Known Repositories:"
2010-08-09 04:15:20 +00:00
@repositories.keys.each do |repo_label|
opts.separator " #{repo_label}"
end
end
2010-08-06 00:49:12 +00:00
opts.parse! ARGV
if ARGV.length != 1
puts opts
exit(-1)
end
name = ARGV.pop
2010-08-06 16:48:52 +00:00
packages = []
2010-08-06 00:49:12 +00:00
@repositories.each do |set, repos|
repos.each do |repo|
2010-08-06 16:48:52 +00:00
packages.concat(repo.scan(name))
2010-08-06 00:49:12 +00:00
end
end
package = nil
2010-08-17 04:06:58 +00:00
case packages.length
when 0
puts "No packages matched '#{name}'"
exit 1
when 1
package = packages.first
else
packages.each_with_index do |package, index|
puts "%3d. %s" % [index+1, package.name]
end
print ">> "
index = gets.to_i-1
package = packages[index]
2010-08-06 00:49:12 +00:00
end
Qwandry.launch package if package
2010-08-06 00:49:12 +00:00
end