noe 1.0.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/CHANGELOG.md +5 -0
- data/LICENCE.txt +20 -0
- data/README.md +117 -0
- data/Rakefile +24 -0
- data/bin/noe +5 -0
- data/lib/noe.rb +39 -0
- data/lib/noe/commons.rb +18 -0
- data/lib/noe/config.rb +60 -0
- data/lib/noe/config.yaml +29 -0
- data/lib/noe/create.rb +77 -0
- data/lib/noe/go.rb +194 -0
- data/lib/noe/help.rb +26 -0
- data/lib/noe/install.rb +89 -0
- data/lib/noe/list.rb +39 -0
- data/lib/noe/main.rb +79 -0
- data/lib/noe/template.rb +144 -0
- data/noe.gemspec +36 -0
- data/spec/noe_spec.rb +8 -0
- data/spec/spec_helper.rb +4 -0
- data/spec/template/entry/relocate_spec.rb +41 -0
- data/spec/template/entry/rename_one_spec.rb +31 -0
- data/templates/ruby/CHANGELOG.md +3 -0
- data/templates/ruby/README.md +24 -0
- data/templates/ruby/noespec.yaml +32 -0
- data/templates/ruby/src/CHANGELOG.md +5 -0
- data/templates/ruby/src/LICENCE.txt +20 -0
- data/templates/ruby/src/README.md +3 -0
- data/templates/ruby/src/Rakefile +42 -0
- data/templates/ruby/src/__lower__.gemspec +31 -0
- data/templates/ruby/src/lib/__lower__.rb +6 -0
- data/templates/ruby/src/spec/__lower___spec.rb +8 -0
- data/templates/ruby/src/spec/spec_helper.rb +4 -0
- metadata +183 -0
data/CHANGELOG.md
ADDED
data/LICENCE.txt
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2011 - Bernard Lambeau
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,117 @@
|
|
1
|
+
# Noe - A simple and extensible project generator
|
2
|
+
|
3
|
+
Noe helps development by providing support for project templates and instantiation.
|
4
|
+
|
5
|
+
## Why?
|
6
|
+
|
7
|
+
I'm pretty sure I have seen announcements for similar projects on ruby-lang in the past,
|
8
|
+
but I could not find them anymore... so I started mine. Please let me know alternatives
|
9
|
+
and I'll add them below:
|
10
|
+
|
11
|
+
See also:
|
12
|
+
|
13
|
+
* ...
|
14
|
+
|
15
|
+
Other reasons:
|
16
|
+
|
17
|
+
* Noe is agnostic: it does not make any assumption about project semantics
|
18
|
+
* Noe does not restrict itself to generation of ruby projects
|
19
|
+
* Noe is not required at runtime: once your project is generated you're done
|
20
|
+
* I don't like magic
|
21
|
+
|
22
|
+
## Getting started
|
23
|
+
|
24
|
+
[sudo] gem install noe
|
25
|
+
[noe --help]
|
26
|
+
[noe help install]
|
27
|
+
noe install
|
28
|
+
|
29
|
+
Have a loot at ~/.noerc and ~/.noe for configuration and a default ruby
|
30
|
+
template.
|
31
|
+
|
32
|
+
## Usage summary
|
33
|
+
|
34
|
+
Maintain your templates under ~/.noe (or what you provided at installation time). Have a
|
35
|
+
look at github to find xxx.noe projects to find well-designed/documented templates for
|
36
|
+
specific needs.
|
37
|
+
|
38
|
+
To create a fresh new project:
|
39
|
+
|
40
|
+
# Given a template xxx under ~/.noe/xxx
|
41
|
+
noe create --template=xxx foo
|
42
|
+
cd foo
|
43
|
+
|
44
|
+
# Edit the template configuration foo/foo.noespec
|
45
|
+
edit foo/foo.noespec
|
46
|
+
|
47
|
+
# Launch template instantiation
|
48
|
+
noe go
|
49
|
+
|
50
|
+
That's it! But also have a look at 'noe help create' and 'not help go' for additional
|
51
|
+
options.
|
52
|
+
|
53
|
+
## About templates
|
54
|
+
|
55
|
+
Under ~/.noe, a valid template folder (say xxx) has the following structure
|
56
|
+
|
57
|
+
xxx # Template name
|
58
|
+
README(.md|.txt|...) # Information about the template and it's usage
|
59
|
+
CHANGELOG(.md|.txt|...) # Change information
|
60
|
+
noespec.yaml # Template specification
|
61
|
+
src # Source folder, contains files to be instantiated
|
62
|
+
... # [everything that will be instantiated]
|
63
|
+
|
64
|
+
### noespec.yaml
|
65
|
+
|
66
|
+
The noespec.yaml file of a template is used to formally describe the template. When a project
|
67
|
+
(say foo) is created (see 'noe create') using a template (say ruby) the file
|
68
|
+
~/.noe/ruby/noespec.yaml is used to generate foo/foo.noespec. The later is then used by
|
69
|
+
'noe go' to instantiate the project.
|
70
|
+
|
71
|
+
The noespec.yaml file should ressemble something like this:
|
72
|
+
|
73
|
+
# DO NOT TOUCH 'name' entry and specify the other
|
74
|
+
template-info:
|
75
|
+
name: !{template_name}
|
76
|
+
description: ...
|
77
|
+
version: ...
|
78
|
+
author: ...
|
79
|
+
|
80
|
+
#
|
81
|
+
# The following is a hash of template-related variables. They are
|
82
|
+
# used to provide dynamic file names and instantiate file contents.
|
83
|
+
#
|
84
|
+
# Current version of Noe only supports variable names matching /[a-z]+/
|
85
|
+
#
|
86
|
+
variables:
|
87
|
+
...
|
88
|
+
|
89
|
+
Have a look at ~/.noe/ruby/noespec.yaml and ~/.noe/ruby/src for an example.
|
90
|
+
|
91
|
+
### Instantiation process
|
92
|
+
|
93
|
+
The instantiation process is really simple. Given the variables described in the noespec.yaml
|
94
|
+
file (for which values are specified in your .noespec file) templates can use the following
|
95
|
+
meta-constructions:
|
96
|
+
|
97
|
+
* Template files and directories containing `__variable__` in their name are automatically
|
98
|
+
renamed (`__variable__` is replaced by the corresponding value).
|
99
|
+
* All template files are instantiated by [wlang](https://github.com/blambeau/wlang). You don't
|
100
|
+
have to know wlang in depth. You simply have to know that `!{ruby_expression}` in a file is
|
101
|
+
replaced by the expression evaluation. Variables are automatically in scope of such expressions,
|
102
|
+
so that `!{variable}` is replaced by its value.
|
103
|
+
|
104
|
+
## Contributing
|
105
|
+
|
106
|
+
Fork Noe on github! I'm particularly interested in the following enhancements:
|
107
|
+
|
108
|
+
* Extend test coverage, which is ugly so far.
|
109
|
+
* Enhance the default ruby template, but remember "documentation matters, not magic!"
|
110
|
+
* Add support for other generators than _wlang_
|
111
|
+
* Add support for multi-generated files from arrays in .noespec files
|
112
|
+
* ...
|
113
|
+
|
114
|
+
If you think that your template is worth considering for (ruby, rails, js, latex, or anything
|
115
|
+
else) please let me known and I'll add it to the list below.
|
116
|
+
|
117
|
+
* ...
|
data/Rakefile
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require "rake/gempackagetask"
|
2
|
+
require "rspec/core/rake_task"
|
3
|
+
require "yard"
|
4
|
+
|
5
|
+
# We run tests by default
|
6
|
+
task :default => :spec
|
7
|
+
|
8
|
+
desc "Run all examples"
|
9
|
+
RSpec::Core::RakeTask.new(:spec) do |t|
|
10
|
+
t.rspec_opts = %w[--color]
|
11
|
+
t.verbose = false
|
12
|
+
end
|
13
|
+
|
14
|
+
# About yard documentation
|
15
|
+
YARD::Rake::YardocTask.new do |t|
|
16
|
+
t.files = ['lib/**/*.rb']
|
17
|
+
t.options = ['--output-dir', 'doc/api', '-', "README.md", "CHANGELOG.md"]
|
18
|
+
end
|
19
|
+
|
20
|
+
desc "Create the .gem package"
|
21
|
+
$spec = Kernel.eval(File.read(File.expand_path('../noe.gemspec', __FILE__)))
|
22
|
+
Rake::GemPackageTask.new($spec) do |pkg|
|
23
|
+
pkg.need_tar = true
|
24
|
+
end
|
data/bin/noe
ADDED
data/lib/noe.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
module Noe
|
2
|
+
|
3
|
+
# Noe's version
|
4
|
+
VERSION = "1.0.0".freeze
|
5
|
+
|
6
|
+
# Requires some gem
|
7
|
+
def self.require(gem_name, version = nil, retried = false)
|
8
|
+
begin
|
9
|
+
Kernel.require gem_name
|
10
|
+
rescue LoadError
|
11
|
+
if retried
|
12
|
+
raise
|
13
|
+
else
|
14
|
+
retried = true
|
15
|
+
require 'rubygems'
|
16
|
+
gem gem_name, version
|
17
|
+
retry
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
class Error < StandardError; end
|
23
|
+
|
24
|
+
end # module Noe
|
25
|
+
|
26
|
+
Noe.require('quickl', ">= 0.2.0")
|
27
|
+
Noe.require('wlang', ">= 0.9")
|
28
|
+
require 'yaml'
|
29
|
+
require 'fileutils'
|
30
|
+
require 'noe/config'
|
31
|
+
require 'noe/template'
|
32
|
+
require 'noe/main'
|
33
|
+
require 'noe/commons'
|
34
|
+
require 'noe/install'
|
35
|
+
require 'noe/help'
|
36
|
+
require 'noe/list'
|
37
|
+
require 'noe/create'
|
38
|
+
require 'noe/go'
|
39
|
+
|
data/lib/noe/commons.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
module Noe
|
2
|
+
module Commons
|
3
|
+
|
4
|
+
# Returns configuration to use
|
5
|
+
def config
|
6
|
+
requester.config
|
7
|
+
end
|
8
|
+
|
9
|
+
def templates_dir
|
10
|
+
config.templates_dir
|
11
|
+
end
|
12
|
+
|
13
|
+
def template(name = config.default)
|
14
|
+
Template.new(File.join(templates_dir, name))
|
15
|
+
end
|
16
|
+
|
17
|
+
end # module Commons
|
18
|
+
end # module Noe
|
data/lib/noe/config.rb
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
module Noe
|
2
|
+
class Config
|
3
|
+
|
4
|
+
# Default configuration hash
|
5
|
+
DEFAULT_CONFIG = {
|
6
|
+
'version' => Noe::VERSION,
|
7
|
+
'templates-dir' => File.expand_path('../../../templates', __FILE__),
|
8
|
+
'default' => 'ruby'
|
9
|
+
}
|
10
|
+
|
11
|
+
# Path to the configuration file
|
12
|
+
attr_reader :file
|
13
|
+
|
14
|
+
# Loaded configuration hash
|
15
|
+
attr_reader :config
|
16
|
+
|
17
|
+
# Creates a config instance from some .noerc file
|
18
|
+
def initialize(file = nil)
|
19
|
+
@config = DEFAULT_CONFIG
|
20
|
+
@file = file
|
21
|
+
__load unless file.nil?
|
22
|
+
end
|
23
|
+
|
24
|
+
# Loads configuration from YAML file
|
25
|
+
def __load
|
26
|
+
if File.file?(file) and File.readable?(file)
|
27
|
+
loaded = YAML::load(File.read(file))
|
28
|
+
if loaded.is_a?(Hash)
|
29
|
+
@config.merge!(loaded)
|
30
|
+
else
|
31
|
+
raise Noe::Error, "Corrupted or invalid config file: #{file}"
|
32
|
+
end
|
33
|
+
else
|
34
|
+
raise Noe::Error, "Not a file or not readable: #{file}"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Returns folder where templates are located
|
39
|
+
def templates_dir
|
40
|
+
dir = config['templates-dir']
|
41
|
+
if File.directory?(dir) and File.readable?(dir)
|
42
|
+
dir
|
43
|
+
else
|
44
|
+
raise Noe::Error, "Invalid noe config, not a directory or unreadable: #{dir}"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# Returns the name of the default template to use
|
49
|
+
def default
|
50
|
+
config['default']
|
51
|
+
end
|
52
|
+
|
53
|
+
# Sets the name of the default template to use
|
54
|
+
def default=(name)
|
55
|
+
config['default'] = name
|
56
|
+
end
|
57
|
+
|
58
|
+
private :__load
|
59
|
+
end # class Config
|
60
|
+
end # module Noe
|
data/lib/noe/config.yaml
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#
|
2
|
+
# .noerc - Configuration of Noe, a simple project generator.
|
3
|
+
#
|
4
|
+
# This file provides Noe's configuration. More information can be
|
5
|
+
# found at https://github.com/blambeau/noe.
|
6
|
+
#
|
7
|
+
# If you want to regenerate a fresh new file, simply run:
|
8
|
+
#
|
9
|
+
# noe install
|
10
|
+
#
|
11
|
+
|
12
|
+
# This is Noe's version, change only if you known what you
|
13
|
+
# are doing!
|
14
|
+
version:
|
15
|
+
!{Noe::VERSION}
|
16
|
+
|
17
|
+
#
|
18
|
+
# Absolute path to the folder containing Noe's templates.
|
19
|
+
#
|
20
|
+
templates-dir:
|
21
|
+
!{templates_dir}
|
22
|
+
|
23
|
+
#
|
24
|
+
# Name of the default template that you want to use. Commands
|
25
|
+
# that need a template (see 'noe help create', for example) use this
|
26
|
+
# by default, and allow overriding this via a --template=NAME option.
|
27
|
+
#
|
28
|
+
default:
|
29
|
+
ruby
|
data/lib/noe/create.rb
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
module Noe
|
3
|
+
class Main
|
4
|
+
#
|
5
|
+
# Create a fresh new project
|
6
|
+
#
|
7
|
+
# SYNOPSIS
|
8
|
+
# #{program_name} #{command_name} [options] PROJECT_NAME
|
9
|
+
#
|
10
|
+
# OPTIONS
|
11
|
+
# #{summarized_options}
|
12
|
+
#
|
13
|
+
# DESCRIPTION
|
14
|
+
# This command guides you with the creation of a new project whose
|
15
|
+
# name is given as first argument. A new folder is created and a .noespec
|
16
|
+
# file is generated in it. The template specified in ~/.noerc under :default
|
17
|
+
# is used by default. Use --template to override this.
|
18
|
+
#
|
19
|
+
# After creation, you'll have to edit the generated .noespec file then run
|
20
|
+
# 'noe go' in the new directory.
|
21
|
+
#
|
22
|
+
# TYPICAL USAGE
|
23
|
+
#
|
24
|
+
# # start creation of a ruby project
|
25
|
+
# noe create --ruby hello_world
|
26
|
+
# cd hello_world
|
27
|
+
#
|
28
|
+
# # edit the configuration
|
29
|
+
# edit hello_world.noespec
|
30
|
+
#
|
31
|
+
# # launch template generation
|
32
|
+
# noe go
|
33
|
+
#
|
34
|
+
class Create < Quickl::Command(__FILE__, __LINE__)
|
35
|
+
include Noe::Commons
|
36
|
+
|
37
|
+
# Install options
|
38
|
+
options do |opt|
|
39
|
+
opt.on('--template=TPLNAME',
|
40
|
+
'Set the template to use') do |name|
|
41
|
+
config.default = name
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def execute(args)
|
46
|
+
raise Quickl::Help unless args.size == 1
|
47
|
+
|
48
|
+
# get project name and check folder and template
|
49
|
+
pname = args.first
|
50
|
+
if File.exists?(pname)
|
51
|
+
raise Noe::Error, "File #{pname} already exists, remove it first."
|
52
|
+
end
|
53
|
+
tpl = template
|
54
|
+
|
55
|
+
# create folder now
|
56
|
+
FileUtils.mkdir(pname)
|
57
|
+
|
58
|
+
# instantiate the configuration
|
59
|
+
File.open(File.join(pname, "#{pname}.noespec"), 'w') do |out|
|
60
|
+
context = {'template_name' => tpl.name}
|
61
|
+
out << WLang::file_instantiate(tpl.spec_file, context, "wlang/active-string")
|
62
|
+
end
|
63
|
+
|
64
|
+
# what's next
|
65
|
+
puts "Project successfully started !"
|
66
|
+
puts
|
67
|
+
puts "What's next?"
|
68
|
+
puts " * cd #{pname}"
|
69
|
+
puts " * vim #{pname}.noespec"
|
70
|
+
puts " * noe go"
|
71
|
+
puts
|
72
|
+
puts "Thank you for using Noe (v#{Noe::VERSION}), enjoy!"
|
73
|
+
end
|
74
|
+
|
75
|
+
end # class Create
|
76
|
+
end # class Main
|
77
|
+
end # module Noe
|
data/lib/noe/go.rb
ADDED
@@ -0,0 +1,194 @@
|
|
1
|
+
module Noe
|
2
|
+
class Main
|
3
|
+
#
|
4
|
+
# Instantiate a project template using a .noespec file.
|
5
|
+
#
|
6
|
+
# SYNOPSIS
|
7
|
+
# #{program_name} #{command_name} [options] [SPEC_FILE]
|
8
|
+
#
|
9
|
+
# OPTIONS
|
10
|
+
# #{summarized_options}
|
11
|
+
#
|
12
|
+
# DESCRIPTION
|
13
|
+
# This command instantiate a project template using a .noespec file
|
14
|
+
# given as first argument. If no spec file is specified, Noe expects
|
15
|
+
# one .noespec file to be present in the current directory and uses it.
|
16
|
+
#
|
17
|
+
# This command is generally used immediately after invoking 'create',
|
18
|
+
# on an almost empty directory. By default it safely fails if any file
|
19
|
+
# or directory would be overriden by the instantiation process. This
|
20
|
+
# safe behavior can be bypassed through the --force and --add-only
|
21
|
+
# options.
|
22
|
+
#
|
23
|
+
# TYPICAL USAGE
|
24
|
+
#
|
25
|
+
# When a fresh new project is created, this command is typically used
|
26
|
+
# with the following scenario
|
27
|
+
#
|
28
|
+
# noe create --ruby hello_world
|
29
|
+
# cd hello_world
|
30
|
+
# edit hello_world.noespec
|
31
|
+
# noe go
|
32
|
+
#
|
33
|
+
# If you modify your .noespec file and want to force overriding of all
|
34
|
+
# files:
|
35
|
+
#
|
36
|
+
# noe go --force
|
37
|
+
#
|
38
|
+
# If you want to regenerate some files only (README and gemspec, for
|
39
|
+
# example):
|
40
|
+
#
|
41
|
+
# rm README.md hello_world.gemspec
|
42
|
+
# noe go --add-only
|
43
|
+
#
|
44
|
+
class Go < Quickl::Command(__FILE__, __LINE__)
|
45
|
+
include Noe::Commons
|
46
|
+
|
47
|
+
# Dry-run mode ?
|
48
|
+
attr_reader :dry_run
|
49
|
+
|
50
|
+
# Force mode ?
|
51
|
+
attr_reader :force
|
52
|
+
|
53
|
+
# Only make additions ?
|
54
|
+
attr_reader :adds_only
|
55
|
+
|
56
|
+
# Install options
|
57
|
+
options do |opt|
|
58
|
+
@dry_run = false
|
59
|
+
opt.on('--dry-run', '-d',
|
60
|
+
"Say what would be done but don't do it"){
|
61
|
+
@dry_run = true
|
62
|
+
}
|
63
|
+
@force = false
|
64
|
+
opt.on('--force', '-f',
|
65
|
+
"Force overriding on all existing files"){
|
66
|
+
@force = true
|
67
|
+
}
|
68
|
+
@adds_only = false
|
69
|
+
opt.on('--add-only', '-a',
|
70
|
+
"Only make additions, do not override any existing file"){
|
71
|
+
@adds_only = true
|
72
|
+
}
|
73
|
+
end
|
74
|
+
|
75
|
+
def build_one(entry, variables)
|
76
|
+
relocated = entry.relocate(variables)
|
77
|
+
todo = []
|
78
|
+
|
79
|
+
# The file already exists, we should maybe do something
|
80
|
+
if File.exists?(relocated)
|
81
|
+
if force
|
82
|
+
unless entry.directory? and File.directory?(relocated)
|
83
|
+
todo << Rm.new(entry, variables)
|
84
|
+
end
|
85
|
+
elsif adds_only
|
86
|
+
return todo
|
87
|
+
else
|
88
|
+
raise Noe::Error, "Noe aborted: file #{relocated} already exists.\n"\
|
89
|
+
"Use --force to override."
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
# Create directories
|
94
|
+
if entry.directory? and not(File.exists?(relocated))
|
95
|
+
todo << MkDir.new(entry, variables)
|
96
|
+
|
97
|
+
# Create files
|
98
|
+
elsif entry.file?
|
99
|
+
todo << FileInstantiate.new(entry, variables)
|
100
|
+
|
101
|
+
end
|
102
|
+
todo
|
103
|
+
end
|
104
|
+
|
105
|
+
def execute(args)
|
106
|
+
raise Quickl::Help if args.size > 1
|
107
|
+
|
108
|
+
# Find spec file
|
109
|
+
spec_file = if args.size == 1
|
110
|
+
valid_read_file!(args.first)
|
111
|
+
else
|
112
|
+
spec_files = Dir['*.noespec']
|
113
|
+
if spec_files.size > 1
|
114
|
+
raise Noe::Error, "Ambiguous request, multiple specs: #{spec_files.join(', ')}"
|
115
|
+
end
|
116
|
+
spec_files.first
|
117
|
+
end
|
118
|
+
|
119
|
+
# Load spec now
|
120
|
+
spec = YAML::load(File.read(spec_file))
|
121
|
+
template = template(spec['template-info']['name'])
|
122
|
+
variables = spec['variables']
|
123
|
+
|
124
|
+
# Build what has to be done
|
125
|
+
commands = template.collect{|entry|
|
126
|
+
build_one(entry, variables)
|
127
|
+
}.flatten
|
128
|
+
|
129
|
+
# let's go now
|
130
|
+
if dry_run
|
131
|
+
commands.each{|c| puts c}
|
132
|
+
else
|
133
|
+
commands.each{|c| c.run}
|
134
|
+
end
|
135
|
+
|
136
|
+
end
|
137
|
+
|
138
|
+
class DoSomething
|
139
|
+
|
140
|
+
attr_reader :entry
|
141
|
+
attr_reader :variables
|
142
|
+
|
143
|
+
def initialize(entry, variables)
|
144
|
+
@entry, @variables = entry, variables
|
145
|
+
end
|
146
|
+
|
147
|
+
def relocated
|
148
|
+
entry.relocate(variables)
|
149
|
+
end
|
150
|
+
|
151
|
+
end
|
152
|
+
|
153
|
+
class MkDir < DoSomething
|
154
|
+
|
155
|
+
def run
|
156
|
+
FileUtils.mkdir relocated
|
157
|
+
end
|
158
|
+
|
159
|
+
def to_s
|
160
|
+
"mkdir #{relocated}"
|
161
|
+
end
|
162
|
+
|
163
|
+
end # class MkDir
|
164
|
+
|
165
|
+
class Rm < DoSomething
|
166
|
+
|
167
|
+
def run
|
168
|
+
FileUtils.rm_rf relocated
|
169
|
+
end
|
170
|
+
|
171
|
+
def to_s
|
172
|
+
"rm -rf #{relocated}"
|
173
|
+
end
|
174
|
+
|
175
|
+
end # class Rm
|
176
|
+
|
177
|
+
class FileInstantiate < DoSomething
|
178
|
+
|
179
|
+
def run
|
180
|
+
File.open(relocated, 'w') do |out|
|
181
|
+
dialect = "wlang/active-string"
|
182
|
+
out << WLang::file_instantiate(entry.realpath, variables, dialect)
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
def to_s
|
187
|
+
"wlang #{entry.path} > #{relocated}"
|
188
|
+
end
|
189
|
+
|
190
|
+
end
|
191
|
+
|
192
|
+
end # class Go
|
193
|
+
end # class Main
|
194
|
+
end # module Noe
|