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.
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