groundwork 0.0.6 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.6
1
+ 1.0.0
@@ -0,0 +1,27 @@
1
+ module Groundwork
2
+ module Commands
3
+ def self.unpack args
4
+ cmd_opts = Trollop::options(args) do
5
+ opt :force, "Delete directory if exists", :default=>false
6
+ banner <<-STR
7
+ Usage:
8
+ groundwork unpack <name>
9
+
10
+ Expands an installed recipe to the current directory
11
+ STR
12
+ end
13
+
14
+ raise RuntimeError.new("Recipe not found: #{args[0]}") unless Groundwork.known_recipes[args[0]]
15
+
16
+ if File.exists?(args[0])
17
+ if cmd_opts[:force]
18
+ FileUtils.rm_rf args[0]
19
+ else
20
+ raise RuntimeError.new("Directory already exists: #{args[0]}\nUse -f to replace")
21
+ end
22
+ end
23
+
24
+ Groundwork::Recipe.unpack args[0], Groundwork.known_recipes[args[0]]
25
+ end
26
+ end
27
+ end
@@ -6,6 +6,7 @@ require File.join(File.dirname(__FILE__), "options.rb")
6
6
  require File.join(File.dirname(__FILE__), "tar_wrapper.rb")
7
7
  require File.join(File.dirname(__FILE__), "recipe.rb")
8
8
  require File.join(File.dirname(__FILE__), "recipe_class.rb")
9
+ require File.join(File.dirname(__FILE__), "recipe_unpacker.rb")
9
10
 
10
11
  module Groundwork
11
12
 
@@ -68,7 +68,7 @@ module Groundwork
68
68
  # nothing when the script is actually run.
69
69
  def possible name ; end
70
70
 
71
- private
71
+ protected
72
72
 
73
73
  def read_file name
74
74
  if @tar
@@ -1,111 +1,131 @@
1
1
  module Groundwork
2
- class Recipe
3
- class << self
2
+ class Recipe
3
+ class << self
4
4
 
5
- # Takes a block and lists the files that that block will require as templates.
6
- # See Groundwork::Recipe#possible
7
- def required_files &block
8
- dummy = Object.new
9
- files = []
5
+ # Takes a block and lists the files that that block will require as templates.
6
+ # See Groundwork::Recipe#possible
7
+ def required_files &block
8
+ dummy = Object.new
9
+ files = []
10
10
 
11
- class << dummy
12
- attr_reader :files
11
+ class << dummy
12
+ attr_reader :files
13
13
 
14
- def directory *args
15
- yield if block_given?
16
- end
14
+ def directory *args
15
+ yield if block_given?
16
+ end
17
17
 
18
- def file name, opts=nil
19
- @files << opts[:from] if opts[:from]
20
- @files << opts[:from_erb] if opts[:from_erb]
21
- end
18
+ def file name, opts=nil
19
+ @files << opts[:from] if opts[:from]
20
+ @files << opts[:from_erb] if opts[:from_erb]
21
+ end
22
22
 
23
- def possible name
24
- @files << name
25
- end
23
+ def possible name
24
+ @files << name
25
+ end
26
26
 
27
- def method_missing *args ; end
28
- end
27
+ def method_missing *args ; end
28
+ end
29
29
 
30
- dummy.instance_variable_set "@files", []
31
- dummy.instance_eval &block
30
+ dummy.instance_variable_set "@files", []
31
+ dummy.instance_eval &block
32
32
 
33
- dummy.files
34
- end
33
+ dummy.files
34
+ end
35
35
 
36
- def compile_file filename
37
- compile File.read(filename), File.dirname(filename)
38
- end
36
+ def compile_file filename
37
+ compile File.read(filename), File.dirname(filename)
38
+ end
39
39
 
40
- # Takes a script file, finds the files it requires (paths relative to the script file),
41
- # reads/tars them and returns a string containing the script and the TAR blob, ready
42
- # to write to a file
43
- def compile script, in_directory
44
- out = StringIO.new
45
- data = nil
40
+ # Takes a script file, finds the files it requires (paths relative to the script file),
41
+ # reads/tars them and returns a string containing the script and the TAR blob, ready
42
+ # to write to a file
43
+ def compile script, in_directory
44
+ out = StringIO.new
45
+ data = nil
46
46
 
47
- FileUtils.cd(in_directory) do
48
- files = required_files do
49
- eval script
50
- end
47
+ FileUtils.cd(in_directory) do
48
+ files = required_files do
49
+ eval script
50
+ end
51
51
 
52
- data = TarWrapper.compress files
53
- end
52
+ data = TarWrapper.compress files
53
+ end
54
54
 
55
- out.puts script
56
- out.puts ""
57
- out.puts "__END__"
58
- out.puts data
55
+ out.puts script
56
+ out.puts ""
57
+ out.puts "__END__"
58
+ out.puts data
59
59
 
60
- out.string
61
- end
60
+ out.string
61
+ end
62
62
 
63
- # Takes a filename and runs the script contained in it. The file should be
64
- # the results of Groundwork::Recipe#compile
65
- def run script_file, args=[]
66
- (script, data) = File.read(script_file).split("\n__END__\n")
63
+ # Takes a filename and runs the script contained in it. The file should be
64
+ # the results of Groundwork::Recipe#compile
65
+ def run script_file, args=[]
66
+ (script, data) = File.read(script_file).split("\n__END__\n")
67
67
 
68
- Groundwork::Recipe.new args do
69
- self.tar = data if data
70
- eval script
71
- end
72
- end
73
-
74
- # Generate a tree of file and directory calls that would create the given
75
- # directory
76
- def generate dir = FileUtils.pwd, options = {}
77
- base = Pathname.new dir
78
-
79
- handle_dir = lambda do |d, output, indent|
80
- FileUtils.cd d do
81
- Dir["*"].each do |file|
82
- rel = Pathname.new(File.join(FileUtils.pwd,file))
83
- relpath = rel.relative_path_from(base).to_s
84
-
85
- next if options[:ignore] && options[:ignore].any?{|p| File.fnmatch(p,relpath) }
86
-
87
- if File.directory? file
88
- if Dir[File.join(file,"*")].empty?
89
- output.puts((" "*indent)+"directory \"#{file}\"")
90
- else
91
- output.puts("")
92
- output.puts((" "*indent)+"directory \"#{file}\" do")
93
- handle_dir[file, output, indent+2]
94
- output.puts((" "*indent)+"end")
95
- output.puts("")
68
+ Groundwork::Recipe.new args do
69
+ self.tar = data if data
70
+ eval script
96
71
  end
97
- else
98
- output.puts((" "*indent)+"file \"#{file}\", :from => \"#{relpath}\"")
99
- end
100
72
  end
101
- end
102
- end
103
73
 
104
- str = StringIO.new
105
- handle_dir[dir, str, 0]
106
- str.string.gsub(/\n\n+/,"\n\n") # Collapse adjacent blank lines
107
- end
74
+ # Takes the name of a directory and a block, and unpacks the script given
75
+ # in the block into the directory.
76
+ #
77
+ # If the second argument is given, the script is loaded from that filename instead
78
+ # of using the block
79
+ def unpack unpack_to, filename
80
+ (recipe, data) = File.read(filename).split("\n__END__\n")
81
+
82
+ FileUtils.mkdir unpack_to
108
83
 
84
+ FileUtils.cd unpack_to do
85
+ Groundwork::RecipeUnpacker.new do
86
+ self.tar = data if data
87
+ eval recipe
88
+ end
89
+
90
+ File.open("#{unpack_to}.recipe","w"){|f| f.puts recipe }
91
+ end
92
+ end
93
+
94
+ # Generate a tree of file and directory calls that would create the given
95
+ # directory
96
+ def generate dir = FileUtils.pwd, options = {}
97
+ base = Pathname.new dir
98
+
99
+ handle_dir = lambda do |d, output, indent|
100
+ FileUtils.cd d do
101
+ Dir["*"].each do |file|
102
+ rel = Pathname.new(File.join(FileUtils.pwd,file))
103
+ relpath = rel.relative_path_from(base).to_s
104
+
105
+ next if options[:ignore] && options[:ignore].any?{|p| File.fnmatch(p,relpath) }
106
+
107
+ if File.directory? file
108
+ if Dir[File.join(file,"*")].empty?
109
+ output.puts((" "*indent)+"directory \"#{file}\"")
110
+ else
111
+ output.puts("")
112
+ output.puts((" "*indent)+"directory \"#{file}\" do")
113
+ handle_dir[file, output, indent+2]
114
+ output.puts((" "*indent)+"end")
115
+ output.puts("")
116
+ end
117
+ else
118
+ output.puts((" "*indent)+"file \"#{file}\", :from => \"#{relpath}\"")
119
+ end
120
+ end
121
+ end
122
+ end
123
+
124
+ str = StringIO.new
125
+ handle_dir[dir, str, 0]
126
+ str.string.gsub(/\n\n+/,"\n\n") # Collapse adjacent blank lines
127
+ end
128
+
129
+ end
109
130
  end
110
- end
111
131
  end
@@ -0,0 +1,18 @@
1
+ module Groundwork
2
+ class RecipeUnpacker < Recipe
3
+ def directory *args, &block
4
+ yield if block_given?
5
+ end
6
+
7
+ def file name, opts = nil
8
+ if opts.is_a? Hash
9
+ if filename = (opts[:from] || opts[:from_erb])
10
+ FileUtils.mkdir_p File.dirname(filename)
11
+ File.open(filename,"w"){|f| f.print read_file(filename) }
12
+ end
13
+ end
14
+ end
15
+
16
+ def method_missing *args ; end
17
+ end
18
+ end
metadata CHANGED
@@ -3,10 +3,10 @@ name: groundwork
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
+ - 1
6
7
  - 0
7
8
  - 0
8
- - 6
9
- version: 0.0.6
9
+ version: 1.0.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Andrews, Ross
@@ -59,11 +59,13 @@ files:
59
59
  - lib/options.rb
60
60
  - lib/recipe.rb
61
61
  - lib/recipe_class.rb
62
+ - lib/recipe_unpacker.rb
62
63
  - lib/tar_wrapper.rb
63
64
  - commands/compile.rb
64
65
  - commands/generate.rb
65
66
  - commands/install.rb
66
67
  - commands/list.rb
68
+ - commands/unpack.rb
67
69
  - recipes/gem.recipe
68
70
  - recipes/hello.recipe
69
71
  has_rdoc: true