codestrap 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.
- checksums.yaml +7 -0
- data/.gitignore +20 -0
- data/.travis.yml +4 -0
- data/.yardopts +3 -0
- data/BOILERPLATE.md +151 -0
- data/CODESTRAPFILE.md +28 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +13 -0
- data/README.md +69 -0
- data/Rakefile +51 -0
- data/bin/strap +8 -0
- data/bin/upstrap +8 -0
- data/codestrap.gemspec +37 -0
- data/config/projects/codestrap.rb +22 -0
- data/config/software/codestrap.rb +20 -0
- data/config/software/ruby.rb +247 -0
- data/config/software/zlib.rb +86 -0
- data/features/client.feature +99 -0
- data/features/fixtures/client/home/codestrap/bin/.empty +0 -0
- data/features/fixtures/client/home/codestrap/content/bash.erb +3 -0
- data/features/fixtures/client/home/codestrap/content/gem/dir/file +0 -0
- data/features/fixtures/client/home/codestrap/content/gem/dir/template +3 -0
- data/features/fixtures/client/home/codestrap/content/gem/file +1 -0
- data/features/fixtures/client/home/codestrap/content/gem/template +3 -0
- data/features/fixtures/client/home/codestrap/content/local_remote.erb +1 -0
- data/features/fixtures/client/home/codestrap/content/local_remote/dir/file +0 -0
- data/features/fixtures/client/home/codestrap/content/local_remote/dir/template +3 -0
- data/features/fixtures/client/home/codestrap/content/local_remote/file +1 -0
- data/features/fixtures/client/home/codestrap/content/local_remote/template +3 -0
- data/features/fixtures/client/home/codestrap/objects/local.json +3 -0
- data/features/fixtures/client/output/.empty +0 -0
- data/features/fixtures/client/var/lib/codestrap/bin/.empty +0 -0
- data/features/fixtures/client/var/lib/codestrap/content/bashremote.erb +3 -0
- data/features/fixtures/client/var/lib/codestrap/content/gemremote/dir/file +0 -0
- data/features/fixtures/client/var/lib/codestrap/content/gemremote/dir/template +3 -0
- data/features/fixtures/client/var/lib/codestrap/content/gemremote/file +0 -0
- data/features/fixtures/client/var/lib/codestrap/content/gemremote/template +3 -0
- data/features/fixtures/client/var/lib/codestrap/content/remote_local.erb +1 -0
- data/features/fixtures/client/var/lib/codestrap/content/remote_local/dir/file +0 -0
- data/features/fixtures/client/var/lib/codestrap/content/remote_local/dir/template +3 -0
- data/features/fixtures/client/var/lib/codestrap/content/remote_local/file +1 -0
- data/features/fixtures/client/var/lib/codestrap/content/remote_local/template +3 -0
- data/features/fixtures/client/var/lib/codestrap/content/remote_remote.erb +1 -0
- data/features/fixtures/client/var/lib/codestrap/content/remote_remote/dir/file +0 -0
- data/features/fixtures/client/var/lib/codestrap/content/remote_remote/dir/template +3 -0
- data/features/fixtures/client/var/lib/codestrap/content/remote_remote/file +0 -0
- data/features/fixtures/client/var/lib/codestrap/content/remote_remote/template +3 -0
- data/features/fixtures/client/var/lib/codestrap/objects/remote.json +3 -0
- data/features/fixtures/logging/home/logging/codestrap/bin/stubdirectory/.empty +0 -0
- data/features/fixtures/logging/home/logging/codestrap/bin/stubnotlink +0 -0
- data/features/fixtures/logging/home/logging/codestrap/content/.empty +0 -0
- data/features/fixtures/logging/home/logging/codestrap/objects/.empty +0 -0
- data/features/fixtures/server/mixed/var/lib/stub/content/address.erb +3 -0
- data/features/fixtures/server/mixed/var/lib/stub/content/cell.erb +3 -0
- data/features/fixtures/server/mixed/var/lib/stub/content/email.erb +3 -0
- data/features/fixtures/server/mixed/var/lib/stub/content/mobile.erb +3 -0
- data/features/fixtures/server/mixed/var/lib/stub/content/name.erb +3 -0
- data/features/fixtures/server/mixed/var/lib/stub/content/phone.erb +3 -0
- data/features/fixtures/server/mixed/var/lib/stub/content/puppetmodule/Modulefile +12 -0
- data/features/fixtures/server/mixed/var/lib/stub/content/puppetmodule/README +17 -0
- data/features/fixtures/server/mixed/var/lib/stub/content/puppetmodule/manifests/init.pp +42 -0
- data/features/fixtures/server/mixed/var/lib/stub/content/puppetmodule/spec/spec_helper.rb +18 -0
- data/features/fixtures/server/mixed/var/lib/stub/content/puppetmodule/tests/init.pp +13 -0
- data/features/fixtures/server/mixed/var/lib/stub/objects/contact.json +8 -0
- data/features/fixtures/server/mixed/var/lib/stub/objects/shadow/contact.json +8 -0
- data/features/fixtures/strap/projects/etc/.empty +0 -0
- data/features/fixtures/strap/projects/home/user/dir/bin/.empty +0 -0
- data/features/fixtures/strap/projects/home/user/dir/content/puppetmodule/Modulefile +12 -0
- data/features/fixtures/strap/projects/home/user/dir/content/puppetmodule/README +17 -0
- data/features/fixtures/strap/projects/home/user/dir/content/puppetmodule/manifests/:stub:project.name:/subclass.pp +3 -0
- data/features/fixtures/strap/projects/home/user/dir/content/puppetmodule/manifests/init.pp +42 -0
- data/features/fixtures/strap/projects/home/user/dir/content/puppetmodule/spec/spec_helper.rb +18 -0
- data/features/fixtures/strap/projects/home/user/dir/content/puppetmodule/tests/init.pp +13 -0
- data/features/fixtures/strap/projects/home/user/dir/objects/contact.json +8 -0
- data/features/fixtures/strap/projects/home/user/dir/objects/shadow/contact.json +8 -0
- data/features/fixtures/strap/projects/output/.empty +0 -0
- data/features/fixtures/stub/contact/etc/.empty +0 -0
- data/features/fixtures/stub/contact/home/user/dir/bin/.empty +0 -0
- data/features/fixtures/stub/contact/home/user/dir/content/address.erb +3 -0
- data/features/fixtures/stub/contact/home/user/dir/content/cell.erb +3 -0
- data/features/fixtures/stub/contact/home/user/dir/content/email.erb +3 -0
- data/features/fixtures/stub/contact/home/user/dir/content/mobile.erb +3 -0
- data/features/fixtures/stub/contact/home/user/dir/content/name.erb +3 -0
- data/features/fixtures/stub/contact/home/user/dir/content/phone.erb +3 -0
- data/features/fixtures/stub/contact/home/user/dir/objects/contact.json +8 -0
- data/features/fixtures/stub/contact/home/user/dir/objects/shadow/contact.json +8 -0
- data/features/fixtures/stub/contact/output/.empty +0 -0
- data/features/fixtures/stub/date/etc/.empty +0 -0
- data/features/fixtures/stub/date/home/user/stub/bin/.empty +0 -0
- data/features/fixtures/stub/date/home/user/stub/content/day.erb +3 -0
- data/features/fixtures/stub/date/home/user/stub/content/hour.erb +3 -0
- data/features/fixtures/stub/date/home/user/stub/content/minute.erb +3 -0
- data/features/fixtures/stub/date/home/user/stub/content/month.erb +3 -0
- data/features/fixtures/stub/date/home/user/stub/content/second.erb +3 -0
- data/features/fixtures/stub/date/home/user/stub/content/year.erb +3 -0
- data/features/fixtures/stub/date/home/user/stub/objects/.empty +0 -0
- data/features/fixtures/stub/date/output/.empty +0 -0
- data/features/fixtures/stub/script/etc/.empty +0 -0
- data/features/fixtures/stub/script/home/user/stub/bin/.empty +0 -0
- data/features/fixtures/stub/script/home/user/stub/content/credentials.erb +6 -0
- data/features/fixtures/stub/script/home/user/stub/objects/credentials.rb +11 -0
- data/features/fixtures/stub/script/output/.empty +0 -0
- data/features/logging.feature +39 -0
- data/features/object_scripts.feature +13 -0
- data/features/server.feature +36 -0
- data/features/step_definitions/client_steps.rb +99 -0
- data/features/step_definitions/logging_steps.rb +65 -0
- data/features/step_definitions/object_scripts_steps.rb +26 -0
- data/features/step_definitions/server_steps.rb +112 -0
- data/features/step_definitions/strap_steps.rb +69 -0
- data/features/step_definitions/stub_option_simple_steps.rb +31 -0
- data/features/step_definitions/stub_steps.rb +94 -0
- data/features/strap.feature +34 -0
- data/features/stub.feature +157 -0
- data/features/stub_option_simple.feature +14 -0
- data/features/stub_packages.feature +15 -0
- data/features/support/env.rb +197 -0
- data/lib/codestrap.rb +415 -0
- data/lib/codestrap/cli.rb +76 -0
- data/lib/codestrap/client.rb +179 -0
- data/lib/codestrap/config.rb +199 -0
- data/lib/codestrap/log.rb +56 -0
- data/lib/codestrap/mixin.rb +20 -0
- data/lib/codestrap/namespace.rb +19 -0
- data/lib/codestrap/object/abstract.rb +33 -0
- data/lib/codestrap/object/factory.rb +86 -0
- data/lib/codestrap/object/standard/datetime.rb +24 -0
- data/lib/codestrap/object/standard/files.rb +40 -0
- data/lib/codestrap/object/standard/project.rb +33 -0
- data/lib/codestrap/object/standard/rest.rb +30 -0
- data/lib/codestrap/patch.rb +122 -0
- data/lib/codestrap/server/rest.rb +177 -0
- data/lib/codestrap/server/version.rb +5 -0
- data/lib/codestrap/strap/abstract.rb +135 -0
- data/lib/codestrap/strap/factory.rb +85 -0
- data/lib/codestrap/strap/standard.rb +95 -0
- data/lib/codestrap/stub/abstract.rb +156 -0
- data/lib/codestrap/stub/factory.rb +87 -0
- data/lib/codestrap/stub/standard.rb +23 -0
- data/lib/codestrap/version.rb +3 -0
- data/omnibus.rb +53 -0
- data/package-scripts/codestrap/postinst +25 -0
- data/package-scripts/codestrap/postrm +17 -0
- data/package-scripts/codestrap/preinst +7 -0
- data/package-scripts/codestrap/prerm +15 -0
- data/resources/codestrap/pkg/background.png +0 -0
- data/resources/codestrap/pkg/distribution.xml.erb +22 -0
- data/resources/codestrap/pkg/license.html.erb +202 -0
- data/resources/codestrap/pkg/welcome.html.erb +7 -0
- metadata +466 -0
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
require 'codestrap/mixin'
|
|
2
|
+
require 'tmpdir'
|
|
3
|
+
|
|
4
|
+
module Codestrap
|
|
5
|
+
module Strap
|
|
6
|
+
# @abstract
|
|
7
|
+
#
|
|
8
|
+
# Boilerplate renderer class
|
|
9
|
+
#
|
|
10
|
+
# Methods (aliased to #abstract) that require overriding
|
|
11
|
+
#
|
|
12
|
+
# #pre
|
|
13
|
+
#
|
|
14
|
+
# Pre execution
|
|
15
|
+
#
|
|
16
|
+
# #execute
|
|
17
|
+
#
|
|
18
|
+
# Render execution
|
|
19
|
+
#
|
|
20
|
+
# Methods that may be overridden
|
|
21
|
+
#
|
|
22
|
+
# #post
|
|
23
|
+
#
|
|
24
|
+
class Abstract
|
|
25
|
+
include Codestrap::Mixin::Exceptions::Template
|
|
26
|
+
|
|
27
|
+
# Objects utilized in templates
|
|
28
|
+
# @!attribute [rw] objects
|
|
29
|
+
# @return [Codestrap::Object::Factory]
|
|
30
|
+
attr_accessor :objects
|
|
31
|
+
|
|
32
|
+
# List of files to ignore
|
|
33
|
+
# @!attribute [rw] ignore
|
|
34
|
+
# @return [Array]
|
|
35
|
+
attr_accessor :ignore
|
|
36
|
+
|
|
37
|
+
# List methods aliased to Codestrap::Template::Abstract#abstract
|
|
38
|
+
# @return [Array]
|
|
39
|
+
def self.abstract_methods
|
|
40
|
+
instance_methods.group_by { |m| instance_method(m) }.map(&:last).keep_if { |sym| sym.length > 1 }.map { |methods|
|
|
41
|
+
if methods.include?('abstract'.to_sym)
|
|
42
|
+
return methods.map { |method| method.to_s }.select { |method| method != 'abstract' }
|
|
43
|
+
end
|
|
44
|
+
}
|
|
45
|
+
[]
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Path to project
|
|
49
|
+
# @!attribute [r] src
|
|
50
|
+
# @return [String]
|
|
51
|
+
attr_reader :src
|
|
52
|
+
|
|
53
|
+
# Path to destination file
|
|
54
|
+
# @!attribute [r] dst
|
|
55
|
+
# @return [String]
|
|
56
|
+
attr_reader :dst
|
|
57
|
+
|
|
58
|
+
# Allow overwrite of files
|
|
59
|
+
# @!attribute [rw] overwrite
|
|
60
|
+
# @return [true|false]
|
|
61
|
+
attr_accessor :overwrite
|
|
62
|
+
|
|
63
|
+
# Check overwrite attribute
|
|
64
|
+
# @return [true|false]
|
|
65
|
+
def overwrite?
|
|
66
|
+
!!@overwrite
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Set source project
|
|
70
|
+
#
|
|
71
|
+
# @param [String] src
|
|
72
|
+
# Path to source directory
|
|
73
|
+
def src=(src)
|
|
74
|
+
raise Exception, %q[File doesn't exist] unless File.exist?(src)
|
|
75
|
+
@src = src
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# Set destination project
|
|
79
|
+
#
|
|
80
|
+
# @param [String] dst
|
|
81
|
+
# Path to destination directory
|
|
82
|
+
def dst=(dst)
|
|
83
|
+
if !overwrite? and File.exist? dst
|
|
84
|
+
Codestrap::Core.logger.error(:FILEEXISTS, dst)
|
|
85
|
+
exit 255
|
|
86
|
+
end
|
|
87
|
+
unless File.exist?(File.dirname(dst))
|
|
88
|
+
Codestrap::Core.logger.error(:NOPATH, dst)
|
|
89
|
+
exit 255
|
|
90
|
+
end
|
|
91
|
+
@dst = dst
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# Abstract class. Raise error on instantiation
|
|
95
|
+
def initialize
|
|
96
|
+
raise RendererAbstractOnly, 'Abstract Class Requires implementation'
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# @abstract
|
|
100
|
+
# Method(s) aliased to this method are considered abstract
|
|
101
|
+
# @raise [RendererRequiredMethod]
|
|
102
|
+
# Raise an error if a method remains aliased to this method
|
|
103
|
+
def abstract
|
|
104
|
+
raise RendererRequiredMethod, "Method #{__method__.to_s} not implemented"
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# Pre execution abstract method
|
|
108
|
+
alias :pre :abstract
|
|
109
|
+
|
|
110
|
+
# Execution abstract method
|
|
111
|
+
alias :execute :abstract
|
|
112
|
+
|
|
113
|
+
# Post execution method
|
|
114
|
+
def post
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
# Creates and returns path to working directory
|
|
118
|
+
#
|
|
119
|
+
# @return [Dir]
|
|
120
|
+
def working_dir
|
|
121
|
+
@working_dir ||= Dir.new(Dir.mktmpdir('strap'))
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
# Moves #working_dir contents to #dst
|
|
125
|
+
#
|
|
126
|
+
# @return [Integer]
|
|
127
|
+
# Returns 0 on success
|
|
128
|
+
def to_disk
|
|
129
|
+
FileUtils.mv self.working_dir.path, self.dst
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
alias_method :file, :working_dir
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
end
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
require 'codestrap/mixin'
|
|
2
|
+
|
|
3
|
+
module Codestrap
|
|
4
|
+
module Strap
|
|
5
|
+
# Factory for instantiating classes from the Codestrap::Strap namespace
|
|
6
|
+
class Factory
|
|
7
|
+
include Codestrap::Mixin::Exceptions::Factory
|
|
8
|
+
|
|
9
|
+
attr_reader :klass
|
|
10
|
+
|
|
11
|
+
# Factory constructor for Codestrap::Template::* Classes
|
|
12
|
+
#
|
|
13
|
+
# @param [Class, Symbol, String] nklass
|
|
14
|
+
# @return [Codestrap::Stub::Factory]
|
|
15
|
+
def initialize(nklass)
|
|
16
|
+
self.klass = nklass
|
|
17
|
+
enforce_methods
|
|
18
|
+
ensure_required
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Constructor for Codestrap::Strap::* Classes
|
|
22
|
+
#
|
|
23
|
+
# @param [Array] args
|
|
24
|
+
# Arguments to pass to constructor of child object
|
|
25
|
+
# @return [Object]
|
|
26
|
+
# Return the object as specified Factory#klass.new(args)
|
|
27
|
+
def construct(*args)
|
|
28
|
+
self.klass.new(args)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Dynamic Class creation.
|
|
32
|
+
# Looks for Classes in Codestrap::Strap::NKLASS
|
|
33
|
+
#
|
|
34
|
+
# @param [String|Symbol] nklass
|
|
35
|
+
# Look for Codestrap::Template::nklass
|
|
36
|
+
# @raise [FactoryArgumentError]
|
|
37
|
+
# Raised if nklass is not type String or type Symbol
|
|
38
|
+
# @return [Codestrap::Stub::KLASS]
|
|
39
|
+
# Return class Codestrap::Template::KLASS
|
|
40
|
+
def to_class nklass
|
|
41
|
+
case
|
|
42
|
+
when nklass.is_a?(Symbol)
|
|
43
|
+
klass = nklass.to_s
|
|
44
|
+
when nklass.is_a?(String)
|
|
45
|
+
klass = nklass
|
|
46
|
+
else
|
|
47
|
+
raise ArgumentError, %Q(Could not find Class Codestrap::Strap::#{nklass.to_s})
|
|
48
|
+
end
|
|
49
|
+
@klass = ['Codestrap', 'Strap', klass].reduce(Module, :const_get)
|
|
50
|
+
@klass
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
alias :klass= :to_class
|
|
54
|
+
|
|
55
|
+
# Ensure self.klass has the following methods
|
|
56
|
+
#
|
|
57
|
+
# klass.pre
|
|
58
|
+
# klass.execute
|
|
59
|
+
#
|
|
60
|
+
# Inherited from Codestrap::Template::Factory
|
|
61
|
+
# klass.file
|
|
62
|
+
# klass.finalize
|
|
63
|
+
#
|
|
64
|
+
# @raise [FactoryMethodEnforcement]
|
|
65
|
+
# Raised if a enforced method doesn't exist in the child
|
|
66
|
+
# @return [TrueClass, FalseClass]
|
|
67
|
+
def enforce_methods
|
|
68
|
+
[:pre, :execute, :overwrite, :overwrite=, :working_dir, :to_disk].each do |method|
|
|
69
|
+
next if @klass.method_defined? method
|
|
70
|
+
raise FactoryException, "Error missing method #{@klass.to_s}##{method}"
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Ensures any methods aliased to abstract_method are overridden
|
|
75
|
+
# @raise [FactoryAbstractMethod]
|
|
76
|
+
# Raised if a abstract method (A method aliased to abstract_method), is not created in the child
|
|
77
|
+
def ensure_required
|
|
78
|
+
if @klass.abstract_methods.length > 0
|
|
79
|
+
methods = @klass.abstract_methods.map{ |method| "#{@klass.to_s}##{method}" }
|
|
80
|
+
raise FactoryException, "Abstract Method(s) #{methods.join(', ')} not overridden"
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
require 'erb'
|
|
2
|
+
require 'find'
|
|
3
|
+
require 'fileutils'
|
|
4
|
+
require 'ostruct'
|
|
5
|
+
require 'codestrap/namespace'
|
|
6
|
+
require 'codestrap/patch'
|
|
7
|
+
require 'codestrap/strap/abstract'
|
|
8
|
+
require 'ptools'
|
|
9
|
+
require 'tmpdir'
|
|
10
|
+
|
|
11
|
+
module Codestrap
|
|
12
|
+
module Strap
|
|
13
|
+
# Standard project renderer
|
|
14
|
+
#
|
|
15
|
+
class Standard < Abstract
|
|
16
|
+
|
|
17
|
+
def initialize(*args)
|
|
18
|
+
self.working_dir
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def pre
|
|
22
|
+
@compiled ||= []
|
|
23
|
+
|
|
24
|
+
# Take ignored array from Codestrap.config
|
|
25
|
+
ignore_hash = {}
|
|
26
|
+
Array(self.ignore).each do |ignore|
|
|
27
|
+
ignore_hash[ignore] = true
|
|
28
|
+
end
|
|
29
|
+
Find.find(self.src) do |src|
|
|
30
|
+
# Ignore files
|
|
31
|
+
if ignore_hash.has_key? File.basename(src)
|
|
32
|
+
Find.prune
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
proj_path = String(src.gsub(/^#{Regexp.escape(self.src)}/, ''))
|
|
36
|
+
|
|
37
|
+
# Destination path substitutions
|
|
38
|
+
proj_path =~ /:(?:stub|strap):(.+?):/
|
|
39
|
+
object = $1
|
|
40
|
+
replacement = proj_path.gsub(/:(?:stub|strap):.+?:/, "<%= #{object} %>")
|
|
41
|
+
if proj_path != replacement
|
|
42
|
+
# Regex replacement
|
|
43
|
+
ns = Codestrap::Namespace.new(self.objects.objects)
|
|
44
|
+
erb = ERB.new(replacement)
|
|
45
|
+
proj_path = erb.result(ns.get_binding)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
dst = File.join(self.working_dir, proj_path)
|
|
49
|
+
|
|
50
|
+
# Directories
|
|
51
|
+
if File.directory? src
|
|
52
|
+
@compiled.push({file: proj_path, src: src, dst: dst, type: :dir})
|
|
53
|
+
next
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Files
|
|
57
|
+
file = Codestrap::Patch::File.new src
|
|
58
|
+
if file.stat.file?
|
|
59
|
+
# Read modeline
|
|
60
|
+
if not File.binary?(src) and file.has_mode_line?
|
|
61
|
+
# Templates
|
|
62
|
+
@compiled.push({file: proj_path, src: src, dst: dst, type: file.template})
|
|
63
|
+
else
|
|
64
|
+
# Files
|
|
65
|
+
@compiled.push({file: proj_path, src: src, dst: dst, type: :regular})
|
|
66
|
+
end
|
|
67
|
+
next
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def execute
|
|
73
|
+
@compiled.each do |obj|
|
|
74
|
+
case obj[:type]
|
|
75
|
+
when :dir
|
|
76
|
+
FileUtils.mkpath obj[:dst]
|
|
77
|
+
when :regular
|
|
78
|
+
FileUtils.install obj[:src], obj[:dst]
|
|
79
|
+
when :erb
|
|
80
|
+
renderer = Codestrap::Stub::Factory.new('Standard').construct
|
|
81
|
+
renderer.objects = self.objects
|
|
82
|
+
renderer.src = obj[:src]
|
|
83
|
+
renderer.dst = obj[:dst]
|
|
84
|
+
renderer.pre
|
|
85
|
+
renderer.execute
|
|
86
|
+
renderer.post
|
|
87
|
+
renderer.to_disk
|
|
88
|
+
else
|
|
89
|
+
raise Exception, "Unknown type: #{obj[:type].to_s}"
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
require 'singleton'
|
|
2
|
+
require 'ostruct'
|
|
3
|
+
require 'erb'
|
|
4
|
+
require 'codestrap/mixin'
|
|
5
|
+
require 'tempfile'
|
|
6
|
+
|
|
7
|
+
module Codestrap
|
|
8
|
+
module Stub
|
|
9
|
+
# @abstract
|
|
10
|
+
#
|
|
11
|
+
# Template renderer class
|
|
12
|
+
#
|
|
13
|
+
# Methods (aliased to #abstract) that require overriding
|
|
14
|
+
#
|
|
15
|
+
# #pre
|
|
16
|
+
#
|
|
17
|
+
# Pre execution
|
|
18
|
+
#
|
|
19
|
+
# #execute
|
|
20
|
+
#
|
|
21
|
+
# Render execution
|
|
22
|
+
#
|
|
23
|
+
# Methods that may be overridden
|
|
24
|
+
#
|
|
25
|
+
# #post
|
|
26
|
+
#
|
|
27
|
+
class Abstract
|
|
28
|
+
include Codestrap::Mixin::Exceptions::Template
|
|
29
|
+
|
|
30
|
+
# Objects utilized in templates
|
|
31
|
+
# @!attribute [rw] objects
|
|
32
|
+
# @return [Array<Codestrap::Object::Factory>]
|
|
33
|
+
attr_accessor :objects
|
|
34
|
+
|
|
35
|
+
# List methods aliased Codestrap::Template::Abstract#abstract
|
|
36
|
+
# @return [Array]
|
|
37
|
+
def self.abstract_methods
|
|
38
|
+
instance_methods.group_by { |m| instance_method(m) }.map(&:last).keep_if { |sym| sym.length > 1 }.map { |methods|
|
|
39
|
+
if methods.include?('abstract'.to_sym)
|
|
40
|
+
return methods.map { |method| method.to_s }.select { |method| method != 'abstract' }
|
|
41
|
+
end
|
|
42
|
+
}
|
|
43
|
+
[]
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Set file object
|
|
47
|
+
# @!attribute [w] file
|
|
48
|
+
# @return [File]
|
|
49
|
+
attr_writer :file
|
|
50
|
+
|
|
51
|
+
# Path to template
|
|
52
|
+
# @!attribute [r] src
|
|
53
|
+
# @return [String]
|
|
54
|
+
attr_reader :src
|
|
55
|
+
|
|
56
|
+
# Path to destination project
|
|
57
|
+
# @!attribute [r] dst
|
|
58
|
+
# @return [String]
|
|
59
|
+
attr_reader :dst
|
|
60
|
+
|
|
61
|
+
# Allow overwriting of files
|
|
62
|
+
# @!attribute [rw] overwrite
|
|
63
|
+
# @return [true|false]
|
|
64
|
+
attr_accessor :overwrite
|
|
65
|
+
|
|
66
|
+
# Check overwrite attribute
|
|
67
|
+
# @return [true|false]
|
|
68
|
+
def overwrite?
|
|
69
|
+
!!@overwite
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Set source template
|
|
73
|
+
#
|
|
74
|
+
# @param [String] src
|
|
75
|
+
# Path to source file
|
|
76
|
+
def src=(src)
|
|
77
|
+
raise Exception, %q[File doesn't exist] unless File.exist?(src)
|
|
78
|
+
@src = src
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Set destination file
|
|
82
|
+
#
|
|
83
|
+
# @param [String] dst
|
|
84
|
+
# Path to destination file
|
|
85
|
+
def dst=(dst)
|
|
86
|
+
if !overwrite? and File.exist? dst
|
|
87
|
+
Codestrap::Core.logger.error(:FILEEXISTS, dst)
|
|
88
|
+
exit 255
|
|
89
|
+
end
|
|
90
|
+
unless File.exist?(File.dirname(dst))
|
|
91
|
+
Codestrap::Core.logger.error(:NOPATH, dst)
|
|
92
|
+
exit 255
|
|
93
|
+
end
|
|
94
|
+
@dst = dst
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# Abstract class. Raise error on instantiation
|
|
98
|
+
def initialize()
|
|
99
|
+
raise RendererAbstractOnly, 'Abstract Class Requires implementation'
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# @abstract
|
|
103
|
+
# Method(s) aliased to this method are considered abstract
|
|
104
|
+
# @raise [RendererRequiredMethod]
|
|
105
|
+
# Raise an error if a method remains aliased to this method
|
|
106
|
+
def abstract
|
|
107
|
+
raise RendererRequiredMethod, "Method #{__method__.to_s} not implemented"
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# Pre execution method
|
|
111
|
+
alias :pre :abstract
|
|
112
|
+
|
|
113
|
+
# Execution method
|
|
114
|
+
alias :execute :abstract
|
|
115
|
+
|
|
116
|
+
# Post execution method
|
|
117
|
+
def post
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# Creates and returns Tempfile to working file
|
|
121
|
+
#
|
|
122
|
+
# @return [Tempfile]
|
|
123
|
+
# Path to temporary file
|
|
124
|
+
def file
|
|
125
|
+
@file ||= Tempfile.new('codestrap')
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# Moves #file contents to #dst
|
|
129
|
+
#
|
|
130
|
+
# @return [Integer]
|
|
131
|
+
# Returns 0 on success
|
|
132
|
+
def to_disk
|
|
133
|
+
@file.close
|
|
134
|
+
tmp = open(@file.path)
|
|
135
|
+
final = Tempfile.new('codestrap')
|
|
136
|
+
strip_modeline(tmp, final)
|
|
137
|
+
|
|
138
|
+
tmp.close
|
|
139
|
+
File.unlink(@file.path)
|
|
140
|
+
final.close(unlink_now = false)
|
|
141
|
+
|
|
142
|
+
FileUtils.mv final.path, self.dst
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
private
|
|
146
|
+
|
|
147
|
+
def strip_modeline(src, dst, line_count=10)
|
|
148
|
+
i = 0
|
|
149
|
+
src.each_line do |line|
|
|
150
|
+
i += 1
|
|
151
|
+
dst.write(line) unless line =~ /(?:\b|^)(?:strap|stub):(?:erb|)(?:\b|$)/ and i <= line_count
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
end
|