folder_template 0.1.1 → 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.
- 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
|
-
[](https://badge.fury.io/rb/folder_template)
|
4
|
+
[](https://travis-ci.org/marcus999/folder_template)
|
5
|
+
[](https://codeclimate.com/github/Marcus999/folder_template)
|
6
|
+
[](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
|