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.
Files changed (101) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +5 -3
  3. data/README.md +16 -3
  4. data/bin/setup_folder +5 -0
  5. data/folder_template.gemspec +5 -1
  6. data/lib/folder_template/context.rb +124 -0
  7. data/lib/folder_template/fs_adapter.rb +7 -21
  8. data/lib/folder_template/setup_folder_cmd.rb +52 -0
  9. data/lib/folder_template/template_folder.rb +25 -26
  10. data/lib/folder_template/template_folder_entry.rb +1 -1
  11. data/lib/folder_template/template_registry.rb +71 -0
  12. data/lib/folder_template/template_string.rb +4 -4
  13. data/lib/folder_template/version.rb +1 -1
  14. data/lib/folder_template.rb +8 -2
  15. data/rakefile.rb +84 -16
  16. data/templates/rubyclass/context.rb +15 -0
  17. data/{test/data/test1 → templates/rubyclass}/template/lib/>>{{project_name}}.rb +0 -0
  18. data/{test/data/test_append → templates/rubyclass}/template/lib/{{project_name}}/{{class_filename}}.rb +7 -5
  19. data/{test/data/test1/template/test_/_test_{{class_filename}}.rb → templates/rubyclass/template/test/test_{{class_filename}}.rb} +9 -6
  20. data/templates/rubygem/context.rb +15 -0
  21. data/templates/rubygem/template/Gemfile +13 -0
  22. data/templates/rubygem/template/LICENSE +22 -0
  23. data/templates/rubygem/template/README.md +49 -0
  24. data/{test/data/test1/template/lib/{{project_name}}/{{class_filename}}.rb → templates/rubygem/template/lib/{{project_name}}/version.rb} +4 -5
  25. data/templates/rubygem/template/lib/{{project_name}}.rb +12 -0
  26. data/templates/rubygem/template/rakefile.rb +110 -0
  27. data/templates/rubygem/template/test/_test_env.rb +27 -0
  28. data/{test/data/test_append/template/test_/_test_{{class_filename}}.rb → templates/rubygem/template/test/test_version.rb} +13 -10
  29. data/templates/rubygem/template/{{_}}.codeclimate.yml +25 -0
  30. data/templates/rubygem/template/{{_}}.gitignore +4 -0
  31. data/templates/rubygem/template/{{_}}.rubocop.yml +1156 -0
  32. data/templates/rubygem/template/{{_}}.travis.yml +7 -0
  33. data/templates/rubygem/template/{{project_name}}.gemspec +37 -0
  34. data/test/_test_env.rb +7 -7
  35. data/test/test_context.rb +116 -0
  36. data/test/test_fs_adapter.rb +8 -10
  37. data/test/test_setup_folder_cmd.rb +44 -0
  38. data/test/test_template_folder.rb +22 -27
  39. data/test/test_template_string.rb +24 -10
  40. data/test_data/rubygem/actual_output/Gemfile +13 -0
  41. data/test_data/rubygem/actual_output/LICENSE +22 -0
  42. data/test_data/rubygem/actual_output/README.md +108 -0
  43. data/test_data/rubygem/actual_output/_.codeclimate.yml +25 -0
  44. data/test_data/rubygem/actual_output/_.gitignore +4 -0
  45. data/test_data/rubygem/actual_output/_.rubocop.yml +1156 -0
  46. data/test_data/rubygem/actual_output/_.travis.yml +7 -0
  47. data/test_data/rubygem/actual_output/folder_name.gemspec +37 -0
  48. data/test_data/rubygem/actual_output/lib/folder_name/version.rb +12 -0
  49. data/test_data/rubygem/actual_output/lib/folder_name.rb +12 -0
  50. data/test_data/rubygem/actual_output/rakefile.rb +56 -0
  51. data/test_data/rubygem/actual_output/test/_test_env.rb +27 -0
  52. data/test_data/rubygem/actual_output/test/test_version.rb +23 -0
  53. data/test_data/rubygem/expected_output/Gemfile +13 -0
  54. data/test_data/rubygem/expected_output/LICENSE +22 -0
  55. data/test_data/rubygem/expected_output/README.md +108 -0
  56. data/test_data/rubygem/expected_output/_.codeclimate.yml +25 -0
  57. data/test_data/rubygem/expected_output/_.gitignore +4 -0
  58. data/test_data/rubygem/expected_output/_.rubocop.yml +1156 -0
  59. data/test_data/rubygem/expected_output/_.travis.yml +7 -0
  60. data/test_data/rubygem/expected_output/folder_name.gemspec +37 -0
  61. data/test_data/rubygem/expected_output/lib/folder_name/version.rb +12 -0
  62. data/test_data/rubygem/expected_output/lib/folder_name.rb +12 -0
  63. data/test_data/rubygem/expected_output/rakefile.rb +56 -0
  64. data/test_data/rubygem/expected_output/test/_test_env.rb +27 -0
  65. data/test_data/rubygem/expected_output/test/test_version.rb +23 -0
  66. data/test_data/rubygem/template_definition/context.rb +13 -0
  67. data/test_data/rubygem/template_definition/template/Gemfile +13 -0
  68. data/test_data/rubygem/template_definition/template/LICENSE +22 -0
  69. data/test_data/rubygem/template_definition/template/README.md +108 -0
  70. data/test_data/rubygem/template_definition/template/lib/{{project_name}}/version.rb +12 -0
  71. data/test_data/rubygem/template_definition/template/lib/{{project_name}}.rb +12 -0
  72. data/test_data/rubygem/template_definition/template/rakefile.rb +56 -0
  73. data/test_data/rubygem/template_definition/template/test/_test_env.rb +27 -0
  74. data/test_data/rubygem/template_definition/template/test/test_version.rb +23 -0
  75. data/test_data/rubygem/template_definition/template/{{_}}.codeclimate.yml +25 -0
  76. data/test_data/rubygem/template_definition/template/{{_}}.gitignore +4 -0
  77. data/test_data/rubygem/template_definition/template/{{_}}.rubocop.yml +1156 -0
  78. data/test_data/rubygem/template_definition/template/{{_}}.travis.yml +7 -0
  79. data/test_data/rubygem/template_definition/template/{{project_name}}.gemspec +37 -0
  80. metadata +112 -55
  81. data/test/data/test1/actual_output/lib/project_aaa/cls_fn.rb +0 -13
  82. data/test/data/test1/actual_output/lib/project_aaa.rb +0 -1
  83. data/test/data/test1/actual_output/test_/_test_cls_fn.rb +0 -20
  84. data/test/data/test1/expected_output/lib/project_aaa/cls_fn.rb +0 -13
  85. data/test/data/test1/expected_output/lib/project_aaa.rb +0 -1
  86. data/test/data/test1/expected_output/test_/_test_cls_fn.rb +0 -20
  87. data/test/data/test_append/actual_output/lib/project_aaa/cls1_fn.rb +0 -13
  88. data/test/data/test_append/actual_output/lib/project_aaa/cls2_fn.rb +0 -13
  89. data/test/data/test_append/actual_output/lib/project_aaa/cls3_fn.rb +0 -13
  90. data/test/data/test_append/actual_output/lib/project_aaa.rb +0 -3
  91. data/test/data/test_append/actual_output/test_/_test_cls1_fn.rb +0 -20
  92. data/test/data/test_append/actual_output/test_/_test_cls2_fn.rb +0 -20
  93. data/test/data/test_append/actual_output/test_/_test_cls3_fn.rb +0 -20
  94. data/test/data/test_append/expected_output/lib/project_aaa/cls1_fn.rb +0 -13
  95. data/test/data/test_append/expected_output/lib/project_aaa/cls2_fn.rb +0 -13
  96. data/test/data/test_append/expected_output/lib/project_aaa/cls3_fn.rb +0 -13
  97. data/test/data/test_append/expected_output/lib/project_aaa.rb +0 -3
  98. data/test/data/test_append/expected_output/test_/_test_cls1_fn.rb +0 -20
  99. data/test/data/test_append/expected_output/test_/_test_cls2_fn.rb +0 -20
  100. data/test/data/test_append/expected_output/test_/_test_cls3_fn.rb +0 -20
  101. 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: 57f1ea5e547be1744282bff8cd884c09025ce012
4
- data.tar.gz: 2aab075e18769cc2c8fecaf5207ca790e0e8f698
3
+ metadata.gz: 626ca58b9e4faf9f2cb6ba96da02cba05864bfbd
4
+ data.tar.gz: 52f57ef1f7d0fbd8e093af2576baa9d4aaf3f17f
5
5
  SHA512:
6
- metadata.gz: b33c362595bc85d82e41bb541dff05d47f1d47a6ad995e414e46726b5dc8f5ba84e871e6d6c0df34be9cedb0780cfcbcdf6619da5386095a7d37be8675e44d2c
7
- data.tar.gz: 561c584694d6c79071b507f7d06f6e47826aa3fd99695444e68c90aaf12b9e4f8f1abf382cdd2ef173d228a01f3ecc687b618fae4411d8088b5e25e84f049215
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
- \# PROJECT : FolderTemplate
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/rr.svg)](http://badge.fury.io/rb/rr)
4
- [![Build Status](https://travis-ci.org/rr/rr.svg?branch=master)](https://travis-ci.org/rr/rr)
5
- [![Code Climate GPA](https://codeclimate.com/github/rr/rr.svg)](https://codeclimate.com/github/rr/rr)
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
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative '../lib/folder_template.rb'
4
+
5
+ FolderTemplate::SetupFolderCmd.run( ARGV )
@@ -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
- # spec.add_runtime_dependency 'facets', '~> 3.0'
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.exists?( target ) && ! opts[:overwrite_files] )
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 :entries
14
-
13
+ attr_reader :base_path
14
+ attr_reader :file_templates
15
+ attr_reader :context
16
+
15
17
  def initialize( path )
16
- @entries = _load_template( path )
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 ||= entries.each_with_object( Set.new ) do |e, 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, **env )
26
- entries.each do |entry|
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
-
@@ -29,7 +29,7 @@ module FolderTemplate
29
29
  end
30
30
 
31
31
 
32
- def generate( fs, **env )
32
+ def generate( fs, env )
33
33
  filename = filename_template.expand( env ).to_s
34
34
  basename = File.basename( filename, File.extname( filename ) )
35
35
 
@@ -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( **env )
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, token, tail = tail.partition( VARIABLE_PATTERN )
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
@@ -8,5 +8,5 @@
8
8
  # =============================================================================
9
9
 
10
10
  module FolderTemplate
11
- VERSION = '0.1.1'
11
+ VERSION = '1.0.0'
12
12
  end
@@ -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
- w = `tput cols`.to_i || 80
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 :autotest do
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 Exception => e
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
- task :default => [:test, :build]
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