pakman 0.0.1 → 0.1.0

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.
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