pakman 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/Manifest.txt CHANGED
@@ -2,4 +2,16 @@ History.markdown
2
2
  Manifest.txt
3
3
  README.markdown
4
4
  Rakefile
5
+ bin/pakman
5
6
  lib/pakman.rb
7
+ lib/pakman/cli/commands/fetch.rb
8
+ lib/pakman/cli/commands/gen.rb
9
+ lib/pakman/cli/commands/list.rb
10
+ lib/pakman/cli/helpers.rb
11
+ lib/pakman/cli/opts.rb
12
+ lib/pakman/cli/runner.rb
13
+ lib/pakman/copier.rb
14
+ lib/pakman/fetcher.rb
15
+ lib/pakman/finder.rb
16
+ lib/pakman/manifest.rb
17
+ lib/pakman/version.rb
data/Rakefile CHANGED
@@ -1,5 +1,5 @@
1
1
  require 'hoe'
2
- require './lib/pakman.rb'
2
+ require './lib/pakman/version.rb'
3
3
 
4
4
  Hoe.spec 'pakman' do
5
5
 
@@ -12,6 +12,10 @@ Hoe.spec 'pakman' do
12
12
 
13
13
  self.author = 'Gerald Bauer'
14
14
  self.email = 'webslideshow@googlegroups.com'
15
+
16
+ self.extra_deps = [
17
+ ['fetcher','>= 0.1.0']
18
+ ]
15
19
 
16
20
  # switch extension to .rdoc for gihub formatting
17
21
  self.readme_file = 'README.markdown'
data/bin/pakman ADDED
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ ###################
4
+ # == DEV TIPS:
5
+ #
6
+ # For local testing run like:
7
+ #
8
+ # ruby -Ilib bin/pakman
9
+ #
10
+ # Set the executable bit in Linux. Example:
11
+ #
12
+ # % chmod a+x bin/pakman
13
+ #
14
+
15
+ require 'pakman'
16
+
17
+ Pakman.main
data/lib/pakman.rb CHANGED
@@ -1,3 +1,52 @@
1
+ ###
2
+ # NB: for local testing run like:
3
+ #
4
+ # 1.8.x: ruby -Ilib -rrubygems lib/pakman.rb
5
+ # 1.9.x: ruby -Ilib lib/pakman.rb
6
+
7
+ # core and stlibs
8
+
9
+ require 'yaml'
10
+ require 'pp'
11
+ require 'logger'
12
+ require 'optparse'
13
+ require 'fileutils'
14
+
15
+ # rubygems
16
+
17
+ require 'fetcher' # fetch (download) files
18
+
19
+ # our own code
20
+
21
+ require 'pakman/copier'
22
+ require 'pakman/fetcher'
23
+ require 'pakman/finder'
24
+ require 'pakman/manifest'
25
+ require 'pakman/version'
26
+
27
+ require 'pakman/cli/helpers'
28
+ require 'pakman/cli/opts'
29
+ require 'pakman/cli/runner'
30
+ require 'pakman/cli/commands/fetch'
31
+ require 'pakman/cli/commands/gen'
32
+ require 'pakman/cli/commands/list'
33
+
34
+
1
35
  module Pakman
2
- VERSION = '0.0.1'
3
- end
36
+
37
+ def self.banner
38
+ "pakman #{VERSION} on Ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}]"
39
+ end
40
+
41
+ def self.root
42
+ "#{File.expand_path( File.dirname(File.dirname(__FILE__)) )}"
43
+ end
44
+
45
+ def self.main
46
+ Runner.new.run(ARGV)
47
+ end
48
+
49
+ end # module Pakman
50
+
51
+
52
+ Pakman.main if __FILE__ == $0
@@ -0,0 +1,33 @@
1
+ module Pakman
2
+
3
+ class Fetch
4
+
5
+ def initialize( logger, opts )
6
+ @logger = logger
7
+ @opts = opts
8
+ end
9
+
10
+ attr_reader :logger, :opts
11
+
12
+
13
+ def run
14
+ logger.debug "fetch_uri=#{opts.fetch_uri}"
15
+
16
+ src = opts.fetch_uri
17
+
18
+ # src = 'http://github.com/geraldb/slideshow/raw/d98e5b02b87ee66485431b1bee8fb6378297bfe4/code/templates/fullerscreen.txt'
19
+ # src = 'http://github.com/geraldb/sandbox/raw/13d4fec0908fbfcc456b74dfe2f88621614b5244/s5blank/s5blank.txt'
20
+ uri = URI.parse( src )
21
+ logger.debug "scheme: #{uri.scheme}, host: #{uri.host}, port: #{uri.port}, path: #{uri.path}"
22
+
23
+ basename = File.basename( uri.path, '.*' ) # e.g. fullerscreen (without extension)
24
+ logger.debug "basename: #{basename}"
25
+
26
+ pakpath = File.expand_path( "#{opts.config_path}/#{basename}" )
27
+ logger.debug "pakpath: #{pakpath}"
28
+
29
+ Fetcher.new( logger ).fetch_pak( src, pakpath )
30
+ end # method run
31
+
32
+ end # class Fetch
33
+ end # module Pakman
@@ -0,0 +1,42 @@
1
+ module Pakman
2
+
3
+ class Gen
4
+
5
+ include ManifestHelper
6
+
7
+ def initialize( logger, opts )
8
+ @logger = logger
9
+ @opts = opts
10
+ end
11
+
12
+ attr_reader :logger, :opts
13
+
14
+ def run
15
+ manifest_name = opts.manifest
16
+
17
+ # add .txt file extension if missing (for convenience)
18
+ ## fix: might not work with impress.js or deck.js
19
+ ## check if extname is txt and add it to become deck.js.txt etc.
20
+ manifest_name << ".txt" if File.extname( manifest_name ).empty?
21
+
22
+ logger.debug "manifest=#{manifest_name}"
23
+
24
+ manifests = installed_template_manifests
25
+
26
+ # check for builtin generator manifests
27
+ matches = manifests.select { |m| m[0] == manifest_name }
28
+
29
+ if matches.empty?
30
+ puts "*** error: unknown template manifest '#{manifest_name}'"
31
+ # todo: list installed manifests
32
+ exit 2
33
+ end
34
+
35
+ manifestsrc = matches[0][1]
36
+ pakpath = opts.output_path
37
+
38
+ Copier.new( logger ).copy_pak( manifestsrc, pakpath )
39
+ end
40
+
41
+ end # class Gen
42
+ end # module Pakman
@@ -0,0 +1,30 @@
1
+ module Pakman
2
+
3
+ class List
4
+
5
+ include ManifestHelper
6
+
7
+ def initialize( logger, opts )
8
+ @logger = logger
9
+ @opts = opts
10
+ end
11
+
12
+ attr_reader :logger, :opts
13
+
14
+ def run
15
+ manifests = installed_template_manifests
16
+
17
+ puts 'Installed template packs in search path'
18
+
19
+ installed_template_manifest_patterns.each_with_index do |pattern,i|
20
+ puts " [#{i+1}] #{pattern}"
21
+ end
22
+ puts ' include:'
23
+
24
+ manifests.each do |manifest|
25
+ puts "%16s (%s)" % [manifest[0], manifest[1]]
26
+ end
27
+ end
28
+
29
+ end # class List
30
+ end # module Pakman
@@ -0,0 +1,33 @@
1
+ module Pakman
2
+
3
+ module ManifestHelper
4
+
5
+ def installed_template_manifest_patterns
6
+ # 1) search . # that is, working/current dir
7
+ # 2) search <config_dir>
8
+ # 3) search <gem>/templates
9
+
10
+ builtin_patterns = [
11
+ "#{Pakman.root}/templates/*.txt"
12
+ ]
13
+ config_patterns = [
14
+ "#{File.expand_path(opts.config_path)}/*.txt",
15
+ "#{File.expand_path(opts.config_path)}/*/*.txt"
16
+ ]
17
+ current_patterns = [
18
+ "*.txt",
19
+ "*/*.txt"
20
+ ]
21
+
22
+ patterns = []
23
+ patterns += current_patterns
24
+ patterns += config_patterns
25
+ patterns += builtin_patterns
26
+ end
27
+
28
+ def installed_template_manifests
29
+ Finder.new( logger ).find_manifests( installed_template_manifest_patterns )
30
+ end
31
+
32
+ end # module ManifestHelper
33
+ end # module Pakman
@@ -0,0 +1,66 @@
1
+ module Pakman
2
+
3
+ class Opts
4
+
5
+ def list=(value)
6
+ @list = value
7
+ end
8
+
9
+ def list?
10
+ return false if @list.nil? # default list flag is false
11
+ @list == true
12
+ end
13
+
14
+
15
+ def generate=(value)
16
+ @generate = value
17
+ end
18
+
19
+ def generate?
20
+ return false if @generate.nil? # default generate flag is false
21
+ @generate == true
22
+ end
23
+
24
+
25
+ def fetch_uri=(value)
26
+ @fetch_uri = value
27
+ end
28
+
29
+ def fetch_uri
30
+ @fetch_uri || '-fetch uri required-'
31
+ end
32
+
33
+ def fetch?
34
+ @fetch_uri.nil? ? false : true
35
+ end
36
+
37
+
38
+ def manifest=(value)
39
+ @manifest = value
40
+ end
41
+
42
+ ## fix:/todo: use a different default manifest
43
+ def manifest
44
+ @manifest || 's6.txt'
45
+ end
46
+
47
+
48
+ def config_path=(value)
49
+ @config_path = value
50
+ end
51
+
52
+ def config_path
53
+ @config_path || '~/.pak'
54
+ end
55
+
56
+
57
+ def output_path=(value)
58
+ @output_path = value
59
+ end
60
+
61
+ def output_path
62
+ @output_path || '.'
63
+ end
64
+
65
+ end # class Opts
66
+ end # module Pakman
@@ -0,0 +1,89 @@
1
+ module Pakman
2
+
3
+ class Runner
4
+
5
+ def initialize
6
+ @logger = Logger.new(STDOUT)
7
+ @logger.level = Logger::INFO
8
+
9
+ @opts = Opts.new
10
+ end
11
+
12
+ attr_reader :logger, :opts
13
+
14
+ def run( args )
15
+ opt=OptionParser.new do |cmd|
16
+
17
+ cmd.banner = "Usage: pakman [options]"
18
+
19
+ cmd.on( '-f', '--fetch URI', 'Fetch Templates' ) do |uri|
20
+ opts.fetch_uri = uri
21
+ end
22
+
23
+ cmd.on( '-t', '--template MANIFEST', 'Generate Templates' ) do |manifest|
24
+ opts.generate = true
25
+ opts.manifest = manifest
26
+ end
27
+
28
+ cmd.on( '-l', '--list', "List Installed Templates" ) { opts.list = true }
29
+
30
+ cmd.on( '-c', '--config PATH', "Configuration Path (default is #{opts.config_path})" ) do |path|
31
+ opts.config_path = path
32
+ end
33
+
34
+ cmd.on( '-o', '--output PATH', "Output Path (default is #{opts.output_path})" ) { |path| opts.output_path = path }
35
+
36
+ cmd.on( '-v', '--version', "Show version" ) do
37
+ puts Pakman.banner
38
+ exit
39
+ end
40
+
41
+ cmd.on( "--verbose", "Show debug trace" ) do
42
+ logger.datetime_format = "%H:%H:%S"
43
+ logger.level = Logger::DEBUG
44
+ end
45
+
46
+ cmd.on_tail( "-h", "--help", "Show this message" ) do
47
+ puts <<EOS
48
+
49
+ pakman - Lets you manage template packs.
50
+
51
+ #{cmd.help}
52
+
53
+ Examples:
54
+ pakman -f URI # to be done
55
+ pakman -f URI -c ~/.slideshow/templates
56
+
57
+ pakman -l # to be done
58
+ pakman -l -c ~/.slideshow/templates
59
+
60
+ pakman -t s6
61
+ pakman -t s6 -o o
62
+ pakman -t s6 -c ~/.slideshow/templates
63
+
64
+ Further information:
65
+ http://geraldb.github.com/pakman
66
+
67
+ EOS
68
+ exit
69
+ end
70
+ end
71
+
72
+ opt.parse!( args )
73
+
74
+ puts Pakman.banner
75
+
76
+ if opts.list?
77
+ List.new( logger, opts ).run
78
+ elsif opts.generate?
79
+ Gen.new( logger, opts ).run
80
+ elsif opts.fetch?
81
+ Fetch.new( logger, opts ).run
82
+ else
83
+ puts "-- No command do nothing for now. --" ## run help??
84
+ puts "Done."
85
+ end
86
+ end # method run
87
+
88
+ end # class Runner
89
+ end # module Pakman
@@ -0,0 +1,47 @@
1
+ module Pakman
2
+
3
+ class Copier
4
+
5
+ attr_reader :logger
6
+
7
+ def initialize( logger )
8
+ @logger = logger
9
+ end
10
+
11
+ def copy_pak( manifestsrc, pakpath )
12
+
13
+ manifest = Manifest.load_file( logger, manifestsrc )
14
+
15
+ # expand output path in current dir (if relative) and make sure output path exists
16
+ outpath = File.expand_path( pakpath )
17
+ logger.debug "outpath=#{outpath}"
18
+ FileUtils.makedirs( outpath ) unless File.directory? outpath
19
+
20
+ manifest.each do |entry|
21
+ dest = entry[0]
22
+ source = entry[1]
23
+
24
+ puts "Copying to #{dest} from #{source}..."
25
+ FileUtils.copy( source, with_output_path( dest, outpath ) )
26
+ end
27
+
28
+ puts "Done."
29
+ end # method copy_pak
30
+
31
+ private
32
+
33
+ ## fix: remove with_output_path helper (code it directly w/o helper)
34
+
35
+ def with_output_path( dest, output_path )
36
+ dest_full = File.expand_path( dest, output_path )
37
+ logger.debug "dest_full=#{dest_full}"
38
+
39
+ # make sure dest path exists
40
+ dest_path = File.dirname( dest_full )
41
+ logger.debug "dest_path=#{dest_path}"
42
+ FileUtils.makedirs( dest_path ) unless File.directory? dest_path
43
+ dest_full
44
+ end
45
+
46
+ end # class Copier
47
+ end # module Pakman
@@ -0,0 +1,76 @@
1
+ module Pakman
2
+
3
+ class Fetcher
4
+
5
+ attr_reader :logger
6
+
7
+ def initialize( logger )
8
+ @logger = logger
9
+ end
10
+
11
+
12
+ def fetch_pak( manifestsrc, pakpath )
13
+
14
+ # src = 'http://github.com/geraldb/slideshow/raw/d98e5b02b87ee66485431b1bee8fb6378297bfe4/code/templates/fullerscreen.txt'
15
+ # src = 'http://github.com/geraldb/sandbox/raw/13d4fec0908fbfcc456b74dfe2f88621614b5244/s5blank/s5blank.txt'
16
+ uri = URI.parse( manifestsrc )
17
+
18
+ logger.debug "scheme: #{uri.scheme}, host: #{uri.host}, port: #{uri.port}, path: #{uri.path}"
19
+
20
+ dirname = File.dirname( uri.path )
21
+ basename = File.basename( uri.path, '.*' ) # e.g. fullerscreen (without extension)
22
+ filename = File.basename( uri.path ) # e.g. fullerscreen.txt (with extension)
23
+
24
+ logger.debug "dirname: #{dirname}"
25
+ logger.debug "basename: #{basename}, filename: #{filename}"
26
+
27
+ dlbase = "#{uri.scheme}://#{uri.host}:#{uri.port}#{dirname}"
28
+
29
+ logger.debug "dlpath: #{dlbase}"
30
+ logger.debug "pakpath: #{pakpath}"
31
+
32
+ FileUtils.makedirs( pakpath ) unless File.directory? pakpath
33
+
34
+ puts "Fetching template package '#{basename}'"
35
+ puts " : from '#{dlbase}'"
36
+ puts " : saving to '#{pakpath}'"
37
+
38
+ # download manifest
39
+ dest = "#{pakpath}/#{filename}"
40
+
41
+ puts " Downloading manifest '#{filename}'..."
42
+
43
+ fetch_file( manifestsrc, dest )
44
+
45
+ manifest = Manifest.load_file_core( logger, dest )
46
+
47
+ # download templates listed in manifest
48
+ manifest.each do |values|
49
+ values[1..-1].each do |file|
50
+
51
+ dest = "#{pakpath}/#{file}"
52
+
53
+ # make sure path exists
54
+ destpath = File.dirname( dest )
55
+ FileUtils.makedirs( destpath ) unless File.directory? destpath
56
+
57
+ src = "#{dlbase}/#{file}"
58
+
59
+ puts " Downloading template '#{file}'..."
60
+ fetch_file( src, dest )
61
+ end
62
+ end
63
+ puts "Done."
64
+ end # method fetch_pak
65
+
66
+ private
67
+
68
+ def fetch_file( src, dest )
69
+ ## note: code moved to its own gem, that is, fetcher
70
+ ## see https://github.com/geraldb/fetcher
71
+
72
+ ::Fetcher::Worker.new( logger ).copy( src, dest )
73
+ end
74
+
75
+ end # class Fetcher
76
+ end # module Pakman
@@ -0,0 +1,27 @@
1
+ module Pakman
2
+
3
+ class Finder
4
+
5
+ attr_reader :logger
6
+
7
+ def initialize( logger )
8
+ @logger = logger
9
+ end
10
+
11
+ def find_manifests( patterns )
12
+ manifests = []
13
+
14
+ patterns.each do |pattern|
15
+ pattern.gsub!( '\\', '/') # normalize path; make sure all path use / only
16
+ logger.debug "Checking #{pattern}"
17
+ Dir.glob( pattern ) do |file|
18
+ logger.debug " Found manifest: #{file}"
19
+ manifests << [ File.basename( file ), file ]
20
+ end
21
+ end
22
+
23
+ manifests
24
+ end
25
+
26
+ end # class Finder
27
+ end # module Pakman
@@ -0,0 +1,73 @@
1
+ module Pakman
2
+
3
+ class Manifest
4
+
5
+ attr_reader :logger
6
+
7
+ def initialize( logger )
8
+ @logger = logger
9
+ @manifest = []
10
+ end
11
+
12
+ def self.load_file_core( logger, path )
13
+ obj = self.new( logger )
14
+ obj.load_file_core_worker( path )
15
+ obj
16
+ end
17
+
18
+ def self.load_file( logger, path )
19
+ obj = self.new( logger )
20
+ obj.load_file_worker( path )
21
+ obj
22
+ end
23
+
24
+ def each
25
+ @manifest.each { |ary| yield ary }
26
+ end
27
+
28
+
29
+
30
+ def load_file_core_worker( path )
31
+ @manifest = []
32
+
33
+ File.open( path ).readlines.each_with_index do |line,i|
34
+ case line
35
+ when /^\s*$/
36
+ # skip empty lines
37
+ when /^\s*#.*$/
38
+ # skip comment lines
39
+ else
40
+ logger.debug "line #{i+1}: #{line.strip}"
41
+ values = line.strip.split( /[ <,+]+/ )
42
+
43
+ # add source for shortcuts (assumes relative path; if not issue warning/error)
44
+ values << values[0] if values.size == 1
45
+
46
+ @manifest << values
47
+ end
48
+ end
49
+ end
50
+
51
+ def load_file_worker( path )
52
+ filename = path
53
+
54
+ puts " Loading template manifest #{filename}..."
55
+ load_file_core_worker( filename )
56
+
57
+ # post-processing
58
+ # normalize all source paths (1..-1) /make full path/add template dir
59
+
60
+ templatesdir = File.dirname( path )
61
+ logger.debug "templatesdir=#{templatesdir}"
62
+
63
+ @manifest.each do |values|
64
+ (1..values.size-1).each do |i|
65
+ values[i] = "#{templatesdir}/#{values[i]}"
66
+ logger.debug " path[#{i}]=>#{values[i]}<"
67
+ end
68
+ end
69
+ end
70
+
71
+
72
+ end # class Manifest
73
+ end # module Pakman
@@ -0,0 +1,3 @@
1
+ module Pakman
2
+ VERSION = '0.1.0'
3
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pakman
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 27
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 0
9
8
  - 1
10
- version: 0.0.1
9
+ - 0
10
+ version: 0.1.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Gerald Bauer
@@ -15,12 +15,28 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-06-17 00:00:00 Z
18
+ date: 2012-06-18 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
- name: rdoc
21
+ name: fetcher
22
22
  prerelease: false
23
23
  requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ hash: 27
29
+ segments:
30
+ - 0
31
+ - 1
32
+ - 0
33
+ version: 0.1.0
34
+ type: :runtime
35
+ version_requirements: *id001
36
+ - !ruby/object:Gem::Dependency
37
+ name: rdoc
38
+ prerelease: false
39
+ requirement: &id002 !ruby/object:Gem::Requirement
24
40
  none: false
25
41
  requirements:
26
42
  - - ~>
@@ -31,11 +47,11 @@ dependencies:
31
47
  - 10
32
48
  version: "3.10"
33
49
  type: :development
34
- version_requirements: *id001
50
+ version_requirements: *id002
35
51
  - !ruby/object:Gem::Dependency
36
52
  name: hoe
37
53
  prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
54
+ requirement: &id003 !ruby/object:Gem::Requirement
39
55
  none: false
40
56
  requirements:
41
57
  - - ~>
@@ -46,11 +62,11 @@ dependencies:
46
62
  - 0
47
63
  version: "3.0"
48
64
  type: :development
49
- version_requirements: *id002
65
+ version_requirements: *id003
50
66
  description: pakman - Template Pack Manager
51
67
  email: webslideshow@googlegroups.com
52
- executables: []
53
-
68
+ executables:
69
+ - pakman
54
70
  extensions: []
55
71
 
56
72
  extra_rdoc_files:
@@ -60,7 +76,19 @@ files:
60
76
  - Manifest.txt
61
77
  - README.markdown
62
78
  - Rakefile
79
+ - bin/pakman
63
80
  - lib/pakman.rb
81
+ - lib/pakman/cli/commands/fetch.rb
82
+ - lib/pakman/cli/commands/gen.rb
83
+ - lib/pakman/cli/commands/list.rb
84
+ - lib/pakman/cli/helpers.rb
85
+ - lib/pakman/cli/opts.rb
86
+ - lib/pakman/cli/runner.rb
87
+ - lib/pakman/copier.rb
88
+ - lib/pakman/fetcher.rb
89
+ - lib/pakman/finder.rb
90
+ - lib/pakman/manifest.rb
91
+ - lib/pakman/version.rb
64
92
  homepage: http://geraldb.github.com/pakman
65
93
  licenses: []
66
94