folder_template 0.1.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +5 -3
- data/README.md +16 -3
- data/bin/setup_folder +5 -0
- data/folder_template.gemspec +5 -1
- data/lib/folder_template/context.rb +124 -0
- data/lib/folder_template/fs_adapter.rb +7 -21
- data/lib/folder_template/setup_folder_cmd.rb +52 -0
- data/lib/folder_template/template_folder.rb +25 -26
- data/lib/folder_template/template_folder_entry.rb +1 -1
- data/lib/folder_template/template_registry.rb +71 -0
- data/lib/folder_template/template_string.rb +4 -4
- data/lib/folder_template/version.rb +1 -1
- data/lib/folder_template.rb +8 -2
- data/rakefile.rb +84 -16
- data/templates/rubyclass/context.rb +15 -0
- data/{test/data/test1 → templates/rubyclass}/template/lib/>>{{project_name}}.rb +0 -0
- data/{test/data/test_append → templates/rubyclass}/template/lib/{{project_name}}/{{class_filename}}.rb +7 -5
- data/{test/data/test1/template/test_/_test_{{class_filename}}.rb → templates/rubyclass/template/test/test_{{class_filename}}.rb} +9 -6
- data/templates/rubygem/context.rb +15 -0
- data/templates/rubygem/template/Gemfile +13 -0
- data/templates/rubygem/template/LICENSE +22 -0
- data/templates/rubygem/template/README.md +49 -0
- data/{test/data/test1/template/lib/{{project_name}}/{{class_filename}}.rb → templates/rubygem/template/lib/{{project_name}}/version.rb} +4 -5
- data/templates/rubygem/template/lib/{{project_name}}.rb +12 -0
- data/templates/rubygem/template/rakefile.rb +110 -0
- data/templates/rubygem/template/test/_test_env.rb +27 -0
- data/{test/data/test_append/template/test_/_test_{{class_filename}}.rb → templates/rubygem/template/test/test_version.rb} +13 -10
- data/templates/rubygem/template/{{_}}.codeclimate.yml +25 -0
- data/templates/rubygem/template/{{_}}.gitignore +4 -0
- data/templates/rubygem/template/{{_}}.rubocop.yml +1156 -0
- data/templates/rubygem/template/{{_}}.travis.yml +7 -0
- data/templates/rubygem/template/{{project_name}}.gemspec +37 -0
- data/test/_test_env.rb +7 -7
- data/test/test_context.rb +116 -0
- data/test/test_fs_adapter.rb +8 -10
- data/test/test_setup_folder_cmd.rb +44 -0
- data/test/test_template_folder.rb +22 -27
- data/test/test_template_string.rb +24 -10
- data/test_data/rubygem/actual_output/Gemfile +13 -0
- data/test_data/rubygem/actual_output/LICENSE +22 -0
- data/test_data/rubygem/actual_output/README.md +108 -0
- data/test_data/rubygem/actual_output/_.codeclimate.yml +25 -0
- data/test_data/rubygem/actual_output/_.gitignore +4 -0
- data/test_data/rubygem/actual_output/_.rubocop.yml +1156 -0
- data/test_data/rubygem/actual_output/_.travis.yml +7 -0
- data/test_data/rubygem/actual_output/folder_name.gemspec +37 -0
- data/test_data/rubygem/actual_output/lib/folder_name/version.rb +12 -0
- data/test_data/rubygem/actual_output/lib/folder_name.rb +12 -0
- data/test_data/rubygem/actual_output/rakefile.rb +56 -0
- data/test_data/rubygem/actual_output/test/_test_env.rb +27 -0
- data/test_data/rubygem/actual_output/test/test_version.rb +23 -0
- data/test_data/rubygem/expected_output/Gemfile +13 -0
- data/test_data/rubygem/expected_output/LICENSE +22 -0
- data/test_data/rubygem/expected_output/README.md +108 -0
- data/test_data/rubygem/expected_output/_.codeclimate.yml +25 -0
- data/test_data/rubygem/expected_output/_.gitignore +4 -0
- data/test_data/rubygem/expected_output/_.rubocop.yml +1156 -0
- data/test_data/rubygem/expected_output/_.travis.yml +7 -0
- data/test_data/rubygem/expected_output/folder_name.gemspec +37 -0
- data/test_data/rubygem/expected_output/lib/folder_name/version.rb +12 -0
- data/test_data/rubygem/expected_output/lib/folder_name.rb +12 -0
- data/test_data/rubygem/expected_output/rakefile.rb +56 -0
- data/test_data/rubygem/expected_output/test/_test_env.rb +27 -0
- data/test_data/rubygem/expected_output/test/test_version.rb +23 -0
- data/test_data/rubygem/template_definition/context.rb +13 -0
- data/test_data/rubygem/template_definition/template/Gemfile +13 -0
- data/test_data/rubygem/template_definition/template/LICENSE +22 -0
- data/test_data/rubygem/template_definition/template/README.md +108 -0
- data/test_data/rubygem/template_definition/template/lib/{{project_name}}/version.rb +12 -0
- data/test_data/rubygem/template_definition/template/lib/{{project_name}}.rb +12 -0
- data/test_data/rubygem/template_definition/template/rakefile.rb +56 -0
- data/test_data/rubygem/template_definition/template/test/_test_env.rb +27 -0
- data/test_data/rubygem/template_definition/template/test/test_version.rb +23 -0
- data/test_data/rubygem/template_definition/template/{{_}}.codeclimate.yml +25 -0
- data/test_data/rubygem/template_definition/template/{{_}}.gitignore +4 -0
- data/test_data/rubygem/template_definition/template/{{_}}.rubocop.yml +1156 -0
- data/test_data/rubygem/template_definition/template/{{_}}.travis.yml +7 -0
- data/test_data/rubygem/template_definition/template/{{project_name}}.gemspec +37 -0
- metadata +112 -55
- data/test/data/test1/actual_output/lib/project_aaa/cls_fn.rb +0 -13
- data/test/data/test1/actual_output/lib/project_aaa.rb +0 -1
- data/test/data/test1/actual_output/test_/_test_cls_fn.rb +0 -20
- data/test/data/test1/expected_output/lib/project_aaa/cls_fn.rb +0 -13
- data/test/data/test1/expected_output/lib/project_aaa.rb +0 -1
- data/test/data/test1/expected_output/test_/_test_cls_fn.rb +0 -20
- data/test/data/test_append/actual_output/lib/project_aaa/cls1_fn.rb +0 -13
- data/test/data/test_append/actual_output/lib/project_aaa/cls2_fn.rb +0 -13
- data/test/data/test_append/actual_output/lib/project_aaa/cls3_fn.rb +0 -13
- data/test/data/test_append/actual_output/lib/project_aaa.rb +0 -3
- data/test/data/test_append/actual_output/test_/_test_cls1_fn.rb +0 -20
- data/test/data/test_append/actual_output/test_/_test_cls2_fn.rb +0 -20
- data/test/data/test_append/actual_output/test_/_test_cls3_fn.rb +0 -20
- data/test/data/test_append/expected_output/lib/project_aaa/cls1_fn.rb +0 -13
- data/test/data/test_append/expected_output/lib/project_aaa/cls2_fn.rb +0 -13
- data/test/data/test_append/expected_output/lib/project_aaa/cls3_fn.rb +0 -13
- data/test/data/test_append/expected_output/lib/project_aaa.rb +0 -3
- data/test/data/test_append/expected_output/test_/_test_cls1_fn.rb +0 -20
- data/test/data/test_append/expected_output/test_/_test_cls2_fn.rb +0 -20
- data/test/data/test_append/expected_output/test_/_test_cls3_fn.rb +0 -20
- data/test/data/test_append/template/lib/>>{{project_name}}.rb +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 626ca58b9e4faf9f2cb6ba96da02cba05864bfbd
|
4
|
+
data.tar.gz: 52f57ef1f7d0fbd8e093af2576baa9d4aaf3f17f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 04bb836061c35a0664cca5e46146e5232b6c148706b9f74faa1f1dd976b8e93760e1e127f1487dc330e297b3c39bfacfa9962bec4e7ed8282d7cb080bb94fca4
|
7
|
+
data.tar.gz: 38e9911a5d5dd67d83ef891d4cc22c260eecd05652b80f5b83035b6c3f22cd8998173f9f80b80b81072969bbd71f3e1d5e17bebb094e96dea0b3a74542e7c63d
|
data/Gemfile
CHANGED
@@ -1,11 +1,13 @@
|
|
1
1
|
# =============================================================================
|
2
|
-
#
|
2
|
+
#
|
3
3
|
# MODULE : Gemfile
|
4
|
-
|
5
|
-
# DESCRIPTION :
|
4
|
+
# PROJECT : FolderTemplate
|
5
|
+
# DESCRIPTION :
|
6
6
|
#
|
7
7
|
# Copyright (c) 2016, Marc-Antoine Argenton. All rights reserved.
|
8
8
|
# =============================================================================
|
9
9
|
|
10
|
+
|
11
|
+
|
10
12
|
source 'https://rubygems.org'
|
11
13
|
gemspec
|
data/README.md
CHANGED
@@ -1,8 +1,11 @@
|
|
1
1
|
# FolderTemplate
|
2
2
|
|
3
|
-
[![Gem Version](https://badge.fury.io/rb/
|
4
|
-
[![Build Status](https://travis-ci.org/
|
5
|
-
[![Code Climate
|
3
|
+
[![Gem Version](https://badge.fury.io/rb/folder_template.svg)](https://badge.fury.io/rb/folder_template)
|
4
|
+
[![Build Status](https://travis-ci.org/marcus999/folder_template.svg?branch=master)](https://travis-ci.org/marcus999/folder_template)
|
5
|
+
[![Code Climate](https://codeclimate.com/github/Marcus999/folder_template/badges/gpa.svg)](https://codeclimate.com/github/Marcus999/folder_template)
|
6
|
+
[![Issue Count](https://codeclimate.com/github/Marcus999/folder_template/badges/issue_count.svg)](https://codeclimate.com/github/Marcus999/folder_template)
|
7
|
+
|
8
|
+
|
6
9
|
|
7
10
|
|
8
11
|
FolderTemplate is a minimalistic template engine that generates files and
|
@@ -53,3 +56,13 @@ Default implementation of `FsAdapter` accepts a few options:
|
|
53
56
|
| ------------------ |---------|-----------------------|
|
54
57
|
| `verbose` | `false` | When `true`, log each operation that is performed |
|
55
58
|
| `overwrite_files` | `false` | When `true`, replace existing files with content generated from template |
|
59
|
+
|
60
|
+
|
61
|
+
|
62
|
+
## Contributing
|
63
|
+
|
64
|
+
1. Fork it ( https://github.com/[my-github-username]/__project__/fork )
|
65
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
66
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
67
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
68
|
+
5. Create a new Pull Request
|
data/bin/setup_folder
ADDED
data/folder_template.gemspec
CHANGED
@@ -25,14 +25,18 @@ Gem::Specification.new do |spec|
|
|
25
25
|
|
26
26
|
spec.files = Dir['[A-Z]*', 'rakefile.rb', '*.gemspec'].reject { |f| f =~ /.lock/ }
|
27
27
|
spec.files += Dir['bin/**', 'lib/**/*.rb', 'test/**/*.rb', 'spec/**/*.rb', 'features/**/*.rb']
|
28
|
+
spec.files += Dir['test_data/**/*']
|
29
|
+
spec.files += Dir['templates/**/*']
|
28
30
|
spec.executables = spec.files.grep( %r{^bin/} ) { |f| File.basename(f) }
|
29
31
|
spec.test_files = spec.files.grep( %r{^(test|spec|features)/} )
|
30
32
|
|
31
|
-
|
33
|
+
spec.add_runtime_dependency 'facets', '~> 3.0'
|
32
34
|
# spec.add_runtime_dependency 'mustache', '~> 1.0'
|
33
35
|
|
34
36
|
spec.add_development_dependency 'bundler', '~> 1.7'
|
35
37
|
spec.add_development_dependency 'rake', '~> 10.0'
|
36
38
|
spec.add_development_dependency 'watch', '~> 0.1'
|
37
39
|
spec.add_development_dependency 'rr', '~> 1.1'
|
40
|
+
spec.add_development_dependency 'minitest', '~> 5.3'
|
41
|
+
spec.add_development_dependency 'minitest-reporters', '~> 1.1'
|
38
42
|
end
|
@@ -0,0 +1,124 @@
|
|
1
|
+
# =============================================================================
|
2
|
+
#
|
3
|
+
# MODULE : lib/folder_template/context.rb
|
4
|
+
# PROJECT : FolderTemplate
|
5
|
+
# DESCRIPTION :
|
6
|
+
#
|
7
|
+
# Copyright (c) 2016, Marc-Antoine Argenton. All rights reserved.
|
8
|
+
# =============================================================================
|
9
|
+
|
10
|
+
|
11
|
+
module FolderTemplate
|
12
|
+
class Context
|
13
|
+
attr_reader :definitions
|
14
|
+
|
15
|
+
def initialize()
|
16
|
+
@definitions = Hash.new()
|
17
|
+
@values_cache = {}
|
18
|
+
end
|
19
|
+
|
20
|
+
def initialize_copy( other )
|
21
|
+
@definitions = other.definitions.dup
|
22
|
+
@values_cache = {}
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.load( filename )
|
26
|
+
load_from_content( File.read( filename ), filename )
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.load_from_content( content, filename )
|
30
|
+
ctx = new
|
31
|
+
ctx.instance_eval( content, filename )
|
32
|
+
ctx
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
|
37
|
+
# -----------------------------------
|
38
|
+
# Hash-like API
|
39
|
+
# -----------------------------------
|
40
|
+
|
41
|
+
def [](key)
|
42
|
+
return _value_for_key( key )
|
43
|
+
end
|
44
|
+
|
45
|
+
def []=( key, value )
|
46
|
+
@definitions[key] = value
|
47
|
+
_clear_values_cache()
|
48
|
+
self
|
49
|
+
end
|
50
|
+
|
51
|
+
def keys
|
52
|
+
return @definitions.keys
|
53
|
+
end
|
54
|
+
|
55
|
+
def values
|
56
|
+
return @definitions.keys.map { |k| _value_for_key(k) }
|
57
|
+
end
|
58
|
+
|
59
|
+
def each
|
60
|
+
return enum_for(:each) unless block_given?
|
61
|
+
@definitions.keys.each do |k|
|
62
|
+
v = _value_for_key(k)
|
63
|
+
yield k, v
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def merge!( h )
|
68
|
+
h.each do |k,v|
|
69
|
+
@definitions[k] = v
|
70
|
+
end
|
71
|
+
_clear_values_cache()
|
72
|
+
self
|
73
|
+
end
|
74
|
+
|
75
|
+
def merge( h )
|
76
|
+
self.dup.merge!( h )
|
77
|
+
end
|
78
|
+
|
79
|
+
|
80
|
+
# -----------------------------------
|
81
|
+
# DSL exposed methods
|
82
|
+
# -----------------------------------
|
83
|
+
|
84
|
+
def let( key, &definition )
|
85
|
+
@definitions[key] = definition
|
86
|
+
_clear_values_cache()
|
87
|
+
self
|
88
|
+
end
|
89
|
+
|
90
|
+
|
91
|
+
|
92
|
+
# -----------------------------------
|
93
|
+
# Support methods for DSL implementation
|
94
|
+
# -----------------------------------
|
95
|
+
|
96
|
+
def method_missing( method, *args )
|
97
|
+
return super unless args.empty?
|
98
|
+
_value_for_key( method )
|
99
|
+
end
|
100
|
+
|
101
|
+
private
|
102
|
+
def _value_for_key( key )
|
103
|
+
return @values_cache[key] if @values_cache.include?( key )
|
104
|
+
value = _evaluate_value_for_key( key )
|
105
|
+
@values_cache[key] = value
|
106
|
+
value
|
107
|
+
end
|
108
|
+
|
109
|
+
def _evaluate_value_for_key( key )
|
110
|
+
value = @definitions[key]
|
111
|
+
case value
|
112
|
+
when Proc
|
113
|
+
instance_eval( &value )
|
114
|
+
else
|
115
|
+
value
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def _clear_values_cache
|
120
|
+
@values_cache = {} if !@values_cache.empty?
|
121
|
+
end
|
122
|
+
|
123
|
+
end # class Context
|
124
|
+
end # module FolderTemplate
|
@@ -1,8 +1,8 @@
|
|
1
1
|
# =============================================================================
|
2
|
-
#
|
2
|
+
#
|
3
3
|
# MODULE : lib/folder_template/fs_adapter.rb
|
4
4
|
# PROJECT : FolderTemplate
|
5
|
-
# DESCRIPTION :
|
5
|
+
# DESCRIPTION :
|
6
6
|
#
|
7
7
|
# Copyright (c) 2016, Marc-Antoine Argenton. All rights reserved.
|
8
8
|
# =============================================================================
|
@@ -25,11 +25,11 @@ module FolderTemplate
|
|
25
25
|
puts "Creating diectory #{dirname} ..." if opts[:verbose]
|
26
26
|
FileUtils.makedirs( target )
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
29
|
def write_to_file( filename, content )
|
30
30
|
target = File.join( base_path, filename )
|
31
|
-
|
32
|
-
if ( File.
|
31
|
+
|
32
|
+
if ( File.exist?( target ) && ! opts[:overwrite_files] )
|
33
33
|
puts "Skiping file #{filename} ..." if opts[:verbose]
|
34
34
|
else
|
35
35
|
puts "Generating file #{filename} ..." if opts[:verbose]
|
@@ -40,25 +40,11 @@ module FolderTemplate
|
|
40
40
|
|
41
41
|
def append_to_file( filename, content )
|
42
42
|
target = File.join( base_path, filename )
|
43
|
-
|
43
|
+
|
44
44
|
puts "Appending content to file #{filename} ..." if opts[:verbose]
|
45
45
|
FileUtils.makedirs( File.dirname( target ) )
|
46
46
|
File.open( target, "a" ) { |f| f.write( content ) }
|
47
47
|
end
|
48
48
|
end # class FsAdapter
|
49
|
-
|
50
|
-
end
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
49
|
|
50
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# =============================================================================
|
2
|
+
#
|
3
|
+
# MODULE : lib/folder_template/setup_folder_cmd.rb
|
4
|
+
# PROJECT : FolderTemplate
|
5
|
+
# DESCRIPTION :
|
6
|
+
#
|
7
|
+
# Copyright (c) 2016, Marc-Antoine Argenton. All rights reserved.
|
8
|
+
# =============================================================================
|
9
|
+
|
10
|
+
|
11
|
+
module FolderTemplate
|
12
|
+
class SetupFolderCmd
|
13
|
+
attr_reader :target_path
|
14
|
+
attr_reader :template_name
|
15
|
+
attr_reader :variables
|
16
|
+
|
17
|
+
attr_reader :registry
|
18
|
+
attr_reader :template_path
|
19
|
+
|
20
|
+
def initialize( *args )
|
21
|
+
parse_args( args.flatten )
|
22
|
+
@registry = TemplateRegistry.registry_with_default_locations()
|
23
|
+
@template_path = registry.path_for_template( template_name )
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.run( *args, **env )
|
27
|
+
self.new( args ).run( env )
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
def run( **env )
|
32
|
+
template = FolderTemplate::TemplateFolder.new( template_path )
|
33
|
+
fs = FolderTemplate::FsAdapter.new( target_path, verbose:true )
|
34
|
+
template.generate( fs, variables.merge( target_path:target_path ).merge( env ) )
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
def parse_args( args )
|
39
|
+
raise "Missing required target_path and template_name arguments" unless args.count >= 2
|
40
|
+
|
41
|
+
@target_path = File.expand_path( args.shift )
|
42
|
+
@template_name = args.shift
|
43
|
+
|
44
|
+
@variables = {}
|
45
|
+
args.delete_if do |s|
|
46
|
+
m = /(\w+)=(.*)/.match(s)
|
47
|
+
@variables[m[1].to_sym] = m[2] if m
|
48
|
+
m
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end # class SetupFolderCmd
|
52
|
+
end # module FolderTemplate
|
@@ -1,8 +1,8 @@
|
|
1
1
|
# =============================================================================
|
2
|
-
#
|
2
|
+
#
|
3
3
|
# MODULE : lib/folder_template/template_folder.rb
|
4
4
|
# PROJECT : FolderTemplate
|
5
|
-
# DESCRIPTION :
|
5
|
+
# DESCRIPTION :
|
6
6
|
#
|
7
7
|
# Copyright (c) 2016, Marc-Antoine Argenton. All rights reserved.
|
8
8
|
# =============================================================================
|
@@ -10,29 +10,42 @@
|
|
10
10
|
module FolderTemplate
|
11
11
|
|
12
12
|
class TemplateFolder
|
13
|
-
attr_reader :
|
14
|
-
|
13
|
+
attr_reader :base_path
|
14
|
+
attr_reader :file_templates
|
15
|
+
attr_reader :context
|
16
|
+
|
15
17
|
def initialize( path )
|
16
|
-
@
|
18
|
+
@base_path = path
|
19
|
+
|
20
|
+
file_templates_path = File.join( path, "template" )
|
21
|
+
@file_templates = _load_template( file_templates_path )
|
22
|
+
|
23
|
+
context_filename = File.join( path, "context.rb" )
|
24
|
+
@context = Context.load( context_filename ) if File.readable?( context_filename )
|
25
|
+
@context ||= Context.new
|
17
26
|
end
|
18
|
-
|
27
|
+
|
19
28
|
def variables
|
20
|
-
@variables ||=
|
29
|
+
@variables ||= @file_templates.each_with_object( Set.new ) do |e, variables|
|
21
30
|
variables.merge( e.variables )
|
22
31
|
end
|
23
32
|
end
|
24
33
|
|
25
|
-
def generate( fs,
|
26
|
-
|
27
|
-
entry.generate( fs, env )
|
34
|
+
def generate( fs, env )
|
35
|
+
file_templates.each do |entry|
|
36
|
+
entry.generate( fs, context.merge( env ) )
|
28
37
|
end
|
29
38
|
end
|
30
|
-
|
39
|
+
|
40
|
+
def self.validate_template_path( path )
|
41
|
+
File.readable?( File.join( path.to_s, "context.rb" ) ) &&
|
42
|
+
File.directory?( File.join( path.to_s, "template" ) )
|
43
|
+
end
|
31
44
|
|
32
45
|
private
|
33
46
|
def _load_template( path )
|
34
47
|
prefix = File.join( path, "" )
|
35
|
-
|
48
|
+
|
36
49
|
Dir[File.join( path, "**", "*")].map do |source|
|
37
50
|
filename = source.gsub( prefix, '' )
|
38
51
|
content = File.read( source ) if !File.directory?( source )
|
@@ -42,17 +55,3 @@ module FolderTemplate
|
|
42
55
|
end # class TemplateFolder
|
43
56
|
|
44
57
|
end
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# =============================================================================
|
2
|
+
#
|
3
|
+
# MODULE : lib/folder_template/template_registry.rb
|
4
|
+
# PROJECT : FolderTemplate
|
5
|
+
# DESCRIPTION :
|
6
|
+
#
|
7
|
+
# Copyright (c) 2016, Marc-Antoine Argenton. All rights reserved.
|
8
|
+
# =============================================================================
|
9
|
+
|
10
|
+
|
11
|
+
|
12
|
+
module FolderTemplate
|
13
|
+
class TemplateRegistry
|
14
|
+
|
15
|
+
attr_reader :template_locations
|
16
|
+
|
17
|
+
def initialize
|
18
|
+
@template_locations = {}
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.registry_with_default_locations()
|
22
|
+
r = TemplateRegistry.new
|
23
|
+
r.scan_location( File.join( BASE_PATH, "templates" ) )
|
24
|
+
r.scan_location( File.expand_path( "~/.folder_template" ) )
|
25
|
+
r
|
26
|
+
end
|
27
|
+
|
28
|
+
def scan_location( path )
|
29
|
+
_list_template_folders( path ).each do |path|
|
30
|
+
_register_template_path( path )
|
31
|
+
end
|
32
|
+
self
|
33
|
+
end
|
34
|
+
|
35
|
+
def path_for_template( template_name )
|
36
|
+
path_list = @template_locations[template_name]
|
37
|
+
path_list.first if path_list
|
38
|
+
end
|
39
|
+
|
40
|
+
# def upscan_location( base_path )
|
41
|
+
# end
|
42
|
+
|
43
|
+
|
44
|
+
private
|
45
|
+
def _list_template_folders( base_path )
|
46
|
+
Dir[File.join( base_path, "*")].select do |path|
|
47
|
+
File.directory?(path) && TemplateFolder.validate_template_path( path )
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def _register_template_path( path )
|
52
|
+
template_name = File.basename( path )
|
53
|
+
@template_locations[template_name] ||= []
|
54
|
+
@template_locations[template_name].unshift( path )
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
# def upscan_directories( start_path )
|
59
|
+
# path = File.expand_path( start_path )
|
60
|
+
# result = []
|
61
|
+
# loop do
|
62
|
+
# result << path
|
63
|
+
# parent_path = File.dirname( path )
|
64
|
+
# break if parent_path == path
|
65
|
+
# path = parent_path
|
66
|
+
# end
|
67
|
+
# result
|
68
|
+
# end
|
69
|
+
|
70
|
+
end # class TemplateLocator
|
71
|
+
end # module FolderTemplate
|
@@ -17,7 +17,7 @@ module FolderTemplate
|
|
17
17
|
@content = _parse( template )
|
18
18
|
when Array
|
19
19
|
@content = template.select do |fragment|
|
20
|
-
!fragment.nil? && !fragment.empty?
|
20
|
+
!fragment.nil? && !fragment.to_s.empty?
|
21
21
|
end
|
22
22
|
when TemplateString
|
23
23
|
@content = template.content
|
@@ -28,7 +28,7 @@ module FolderTemplate
|
|
28
28
|
@variables ||= _extract_variables( @content )
|
29
29
|
end
|
30
30
|
|
31
|
-
def expand(
|
31
|
+
def expand( env )
|
32
32
|
fragments = content.map do |fragment|
|
33
33
|
case fragment
|
34
34
|
when Symbol
|
@@ -36,7 +36,7 @@ module FolderTemplate
|
|
36
36
|
else
|
37
37
|
fragment
|
38
38
|
end
|
39
|
-
end.select { |fragment| !fragment.nil? && !fragment.empty? }
|
39
|
+
end.select { |fragment| !fragment.nil? && !fragment.to_s.empty? }
|
40
40
|
TemplateString.new( fragments )
|
41
41
|
end
|
42
42
|
|
@@ -53,7 +53,7 @@ module FolderTemplate
|
|
53
53
|
result = []
|
54
54
|
tail = template
|
55
55
|
loop do
|
56
|
-
head,
|
56
|
+
head, _token, tail = tail.partition( VARIABLE_PATTERN )
|
57
57
|
result << head if !head.empty?
|
58
58
|
break if $1.nil?
|
59
59
|
result << $1.to_sym
|
data/lib/folder_template.rb
CHANGED
@@ -1,13 +1,15 @@
|
|
1
1
|
# =============================================================================
|
2
|
-
#
|
2
|
+
#
|
3
3
|
# MODULE : lib/ruby_project_generator.rb
|
4
4
|
# PROJECT : RubyProjectGenerator
|
5
|
-
# DESCRIPTION :
|
5
|
+
# DESCRIPTION :
|
6
6
|
#
|
7
7
|
# Copyright (c) 2016, Marc-Antoine Argenton. All rights reserved.
|
8
8
|
# =============================================================================
|
9
9
|
|
10
10
|
require 'fileutils'
|
11
|
+
require 'facets'
|
12
|
+
|
11
13
|
|
12
14
|
module FolderTemplate
|
13
15
|
BASE_PATH = File.expand_path( File.join( File.dirname( __FILE__ ), ".." ) )
|
@@ -18,3 +20,7 @@ require_relative 'folder_template/fs_adapter.rb'
|
|
18
20
|
require_relative 'folder_template/template_string.rb'
|
19
21
|
require_relative 'folder_template/template_folder_entry.rb'
|
20
22
|
require_relative 'folder_template/template_folder.rb'
|
23
|
+
require_relative 'folder_template/context.rb'
|
24
|
+
|
25
|
+
require_relative 'folder_template/template_registry.rb'
|
26
|
+
require_relative 'folder_template/setup_folder_cmd.rb'
|
data/rakefile.rb
CHANGED
@@ -1,42 +1,110 @@
|
|
1
1
|
# =============================================================================
|
2
|
-
#
|
2
|
+
#
|
3
3
|
# MODULE : rakefile.rb
|
4
4
|
# PROJECT : FolderTemplate
|
5
|
-
# DESCRIPTION :
|
5
|
+
# DESCRIPTION :
|
6
6
|
#
|
7
7
|
# Copyright (c) 2016, Marc-Antoine Argenton. All rights reserved.
|
8
8
|
# =============================================================================
|
9
9
|
|
10
|
+
|
10
11
|
require 'bundler/gem_tasks'
|
11
12
|
require 'rake/testtask'
|
12
13
|
|
14
|
+
task default: [:test, :build]
|
15
|
+
|
13
16
|
Rake::TestTask.new do |t|
|
14
17
|
t.libs << '.' << 'test'
|
15
18
|
t.test_files = FileList['test/**/test_*.rb']
|
16
19
|
t.verbose = false
|
17
20
|
end
|
18
21
|
|
22
|
+
|
23
|
+
|
24
|
+
# ----------------------------------------------------------------------------
|
25
|
+
# Definitions to help formating 'rake watch' results
|
26
|
+
# ----------------------------------------------------------------------------
|
27
|
+
|
28
|
+
TERM_WIDTH = `tput cols`.to_i || 80
|
29
|
+
|
30
|
+
def tty_red(str); "\e[31m#{str}\e[0m" end
|
31
|
+
def tty_green(str); "\e[32m#{str}\e[0m" end
|
32
|
+
def tty_blink(str); "\e[5m#{str}\e[25m" end
|
33
|
+
def tty_reverse_color(str); "\e[7m#{str}\e[27m" end
|
34
|
+
|
35
|
+
def print_separator( success = true )
|
36
|
+
if success
|
37
|
+
puts tty_green( "-" * TERM_WIDTH )
|
38
|
+
else
|
39
|
+
puts tty_reverse_color(tty_red( "-" * TERM_WIDTH ))
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
|
45
|
+
# ----------------------------------------------------------------------------
|
46
|
+
# Definition of watch task, that monitors the project folder for any relevant
|
47
|
+
# file change and runs the unit test of the project.
|
48
|
+
# ----------------------------------------------------------------------------
|
49
|
+
|
19
50
|
begin
|
20
51
|
require 'watch'
|
21
|
-
|
22
|
-
|
23
|
-
def tty_red(str); "\e[31m#{str}\e[0m" end
|
24
|
-
def tty_green(str); "\e[32m#{str}\e[0m" end
|
25
|
-
def tty_blink(str); "\e[5m#{str}\e[25m" end
|
26
|
-
def tty_reverse_color(str); "\e[7m#{str}\e[27m" end
|
27
|
-
|
28
|
-
|
52
|
+
|
29
53
|
desc 'Run unit tests everytime a source or test file is changed'
|
30
|
-
task :
|
54
|
+
task :watch do
|
31
55
|
Watch.new( '**/*.rb' ) do
|
32
56
|
success = system "clear && rake test"
|
33
|
-
|
34
|
-
puts tty_green( "-" * w ) if success
|
35
|
-
puts tty_reverse_color(tty_red( "-" * w )) if !success
|
57
|
+
print_separator( success )
|
36
58
|
end
|
37
59
|
end
|
38
60
|
|
39
|
-
rescue
|
61
|
+
rescue LoadError
|
62
|
+
|
63
|
+
desc 'Run unit tests everytime a source or test file is changed'
|
64
|
+
task :watch do
|
65
|
+
puts
|
66
|
+
puts "'rake watch' requires the watch gem to be available"
|
67
|
+
puts
|
68
|
+
puts "To install:"
|
69
|
+
puts " gem install watch"
|
70
|
+
puts " or "
|
71
|
+
puts " sudo gem install watch"
|
72
|
+
puts
|
73
|
+
fail
|
74
|
+
end
|
40
75
|
end
|
41
76
|
|
42
|
-
|
77
|
+
|
78
|
+
|
79
|
+
# ----------------------------------------------------------------------------
|
80
|
+
# Definition of add_class[class_name] task, that uses folder_template to add
|
81
|
+
# a new class to a ruvy project
|
82
|
+
# ----------------------------------------------------------------------------
|
83
|
+
|
84
|
+
PROJECT_CONTEXT = {
|
85
|
+
project_name: "folder_template",
|
86
|
+
project_namespace: "FolderTemplate",
|
87
|
+
copyright_owner: "Marc-Antoine Argenton",
|
88
|
+
copyright_year: "2016",
|
89
|
+
}
|
90
|
+
|
91
|
+
begin
|
92
|
+
require_relative 'lib/folder_template'
|
93
|
+
|
94
|
+
task :add_class, :class_name do |t, args|
|
95
|
+
context = PROJECT_CONTEXT.merge( name:args[:class_name])
|
96
|
+
FolderTemplate::SetupFolderCmd.run( '.', 'rubyclass', context )
|
97
|
+
end
|
98
|
+
rescue LoadError
|
99
|
+
task :add_class, :class_name do |t, args|
|
100
|
+
puts
|
101
|
+
puts "'rake add_class[class_name]' task requires the folder_template gem to be available"
|
102
|
+
puts
|
103
|
+
puts "To install:"
|
104
|
+
puts " gem install folder_template"
|
105
|
+
puts " or "
|
106
|
+
puts " sudo gem install folder_template"
|
107
|
+
puts
|
108
|
+
fail
|
109
|
+
end
|
110
|
+
end
|