lepidoptera 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -10,16 +10,18 @@ Lepidoptera /ˌlɛpɪˈdɒptərə/
10
10
  What is lepidoptera?
11
11
  --------------------
12
12
 
13
- Lepidoptera is a very simple and easy extensible __code generator for common every day projects__.
13
+ Lepidoptera is a simple and easy to extend __code generator for common every day projects__.
14
14
  Technically, Lepidoptera is a wrapper for [rubigen][r] which allows setting up code templates for arbitrary projects.
15
15
 
16
- Code generators integrated into Lepidoptera are structured in __generator groups__, whereas every group can have multiple __generator types__.
16
+ Lepidopteras code generators are structured in __generator groups__. A generators group is just a container for multiple generators, where as a generator is also called a __generator type__.
17
17
 
18
- For the time being, Lepidoptera has code generators for the following projects (more to come):
18
+ For the time being, Lepidoptera has code generators for the following project types (more to come):
19
19
 
20
- * [jquery][j] plugins,
21
- * static pages hosted on [heroku][h],
22
- * [sinatra][s] application hosted on [heroku][h].
20
+ * [jquery][j] generators:
21
+ * jquery plugin
22
+ * [heroku][h] generators:
23
+ * static pages
24
+ * a [sinatra][s] application
23
25
 
24
26
  Installation
25
27
  ------------
@@ -28,68 +30,75 @@ Installation
28
30
 
29
31
  As [lep][wiki-2] (/ˈlɛp/) is a short for [lepidoptera][wiki-1], this gem will install an executable `lep`
30
32
 
31
- For aesthetic reasons, you may also set a synonym executable `butterfly` alias in your `.bashrc` file:
33
+ For aesthetic reason, you may also set a synonym alias `butterfly` in your `.bashrc` file:
32
34
 
33
- $ alias butterfly='lep $1'
35
+ alias butterfly='lep $1'
34
36
 
35
37
  Usage
36
38
  -----
37
39
 
38
- for grouped code generators:
39
-
40
- lep [options] <generator-group> <generator-type> <project-name>
41
-
42
- or for ungrouped code generators:
43
-
44
- lep [options] <generator-type> <project-name>
40
+ $ lep [options] <generator-group> <generator-type> <project-name>
45
41
 
46
42
  with the following __options__:
47
43
 
48
44
  -q, --quiet Suppress status output.
45
+ -n, --new Create a new code generator stub in ~/.lepidoptera.
49
46
  -g, --git Create a git repository after code generation.
50
- -n, --new Add a new code generator in ~/.lepidoptera
51
47
  -h, --help Print generator's options and usage.
52
48
 
53
- and - for the time being - the following __code generators__ which are included in this gem:
49
+ ### Helpers
54
50
 
55
- heroku static
56
- heroku sinatra
57
- jquery plugin
58
-
59
- Helpers
60
- -------
61
-
62
- Get a list of all code generators grouped by generator-groups:
51
+ Get a list of all local code generator groups:
63
52
 
64
53
  $ lep
65
54
 
66
- Get a list of all code generator-types for a given generator-group:
55
+ Get a list of all code generators for a given generator group:
67
56
 
68
57
  $ lep <generator-group>
69
58
 
70
- Extending Code Generators
71
- -------------------------
59
+ Extending with own Code Generators
60
+ ----------------------------------
72
61
 
73
62
  Since lepidoptera is based on _Nic Williams_ Ruby generator framework [rubigen][r], it is very simple to add new own private code generators.
74
63
 
75
- You may include new code generators by putting the following code structure into `~/.lepidoptera`:
64
+ ### 1. Manual creation of new a code generator
65
+
66
+ Your own private code generators must reside in a folder `~/.lepidoptera`.
67
+
68
+ A new generator must satisfy the following code structure:
76
69
 
77
- ~/.lepidoptera
78
- └─ name
79
- ├─ INFO
80
- ├─ name_generator.rb
81
- └─ template
82
- ├─ a file
83
- ├─ ...
84
- └─ a folder
70
+ .lepidoptera
71
+ └─ <generator-group>_generators
72
+ └─ <generator-type>
73
+ ├─ INFO
74
+ ├─ <generator-type>_generator.rb
75
+ └─ templates
76
+ ├─ ...
77
+ └─ ...
85
78
 
86
- Much more easy is to use a generator generator which generates the above code generator stub into `~/.lepidoptera`: (TODO)
79
+ whereas every code generator type must contain the following files:
80
+
81
+ * an optional `INFO` file containing some additional project info to be displayed after the generation.
82
+ * a required generator file `<generator-type>_generator.rb` which contains the generation rules.
83
+ * a required templates folder `templates` which may contain multiple ERB templates for the code to be generated.
84
+ These ERB templates may contain variables as placeholders for the following information:
85
+ * `<%= name %>`: Name of the project.
86
+ * `<%= author %>`: Author of the project (OS Username).
87
+
88
+ ### 2. Automatic creation of new a code generator
89
+
90
+ An easier way to create a new code generator is to automatically generate the above code generator stub into `~/.lepidoptera`.
91
+
92
+ To create a new code generator stub, use the `--new` option and provide a __generator group__ and a __generator type__:
93
+
94
+ $ lep -n <generator-group> <generator-type>
95
+
96
+ If the generator group does not exist already, a group folder `<generator-group>_generators` will be created.
87
97
 
88
- $ lep -n <type-of-code-generator>
89
- $ lep -n <code-generator-group> <type-of-code-generator>
98
+ Embedded Code Generators
99
+ ========================
90
100
 
91
- Integrated Code Generators
92
- ==========================
101
+ The following code generators are currently embedded within this project:
93
102
 
94
103
  jQuery Generators
95
104
  -----------------
data/bin/lep CHANGED
@@ -23,6 +23,7 @@ YELLOW = "\033[0;33m"
23
23
  RED = "\033[0;31m"
24
24
 
25
25
 
26
+
26
27
  ### Set up generators
27
28
 
28
29
  # get code generators
@@ -38,6 +39,37 @@ parser = Butterfly::Options::Parser.new(generators)
38
39
  options = parser.parse(ARGV)
39
40
 
40
41
 
42
+
43
+ ### new-option? create a new code generator stub
44
+ if options[:new] then
45
+
46
+ # show common help if no argument is provided
47
+ parser.ask_for_new_generator if ARGV.empty?
48
+
49
+ # show prticular help if only a generator group is provideds
50
+ parser.ask_for_new_generator_type(ARGV[0]) if ARGV.length == 1
51
+
52
+ # create dotfolder for local code generators if not exist already
53
+ dot_folder = File.join(Dir.home, Butterfly::DOTFOLDER)
54
+ Dir.mkdir(dot_folder) if !Dir.exists?(dot_folder)
55
+
56
+
57
+ generator_group = ARGV[0]
58
+ generator_type = ARGV[1]
59
+ generator_type_folder = File.join(dot_folder, "#{generator_group}_generators", generator_type)
60
+
61
+ if !Dir.exists?(generator_type_folder)
62
+ stub_generator = RubiGen::PathSource.new(:app, File.dirname(__FILE__) + "/../lib/stub_generators")
63
+ RubiGen::Base.prepend_sources(stub_generator)
64
+ RubiGen::Scripts::Generate.new.run([generator_type_folder], :generator => 'stub')
65
+ else
66
+ raise Butterfly::GeneratorFolderExists, "#{RED}generator '#{generator_group}_generators/#{generator_type}' does already exist!#{WHITE}"
67
+ end
68
+ exit
69
+ end
70
+
71
+
72
+
41
73
  # After parsing the options,
42
74
  # * first argument should be <generator-group>
43
75
  # * second argument should be <generator-type>
@@ -98,13 +130,6 @@ end
98
130
  project_name = ARGV[0]
99
131
 
100
132
 
101
- # DEBUG
102
- #puts "generator group: #{generator_group}"
103
- #puts "generator type: #{generator_type}"
104
- #puts "project name: #{project_name}"
105
- #puts "options: #{options}"
106
-
107
-
108
133
  ### generate code!
109
134
 
110
135
  # Add only the code generator of the selected generator-group to the beginning of a list of sources.
data/lepidoptera.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{lepidoptera}
8
- s.version = "0.2.0"
8
+ s.version = "0.3.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Thomas Duerr"]
12
- s.date = %q{2010-11-07}
12
+ s.date = %q{2010-11-10}
13
13
  s.default_executable = %q{lep}
14
14
  s.description = %q{Lepidoptera is a very simple and easy extensible code generator for common every day projects.}
15
15
  s.email = %q{thomduerr@gmail.com}
@@ -43,7 +43,12 @@ Gem::Specification.new do |s|
43
43
  "lepidoptera.gemspec",
44
44
  "lib/base.rb",
45
45
  "lib/butterfly.rb",
46
- "lib/options.rb"
46
+ "lib/options.rb",
47
+ "lib/stub_generators/stub/INFO",
48
+ "lib/stub_generators/stub/stub_generator.rb",
49
+ "lib/stub_generators/stub/templates/generator-type_INFO",
50
+ "lib/stub_generators/stub/templates/generator-type_README.txt",
51
+ "lib/stub_generators/stub/templates/generator-type_generator.rb"
47
52
  ]
48
53
  s.homepage = %q{http://github.com/thomd/lepidoptera/}
49
54
  s.rdoc_options = ["--charset=UTF-8"]
data/lib/base.rb CHANGED
@@ -45,4 +45,33 @@ module Butterfly
45
45
 
46
46
  end
47
47
 
48
+ end
49
+
50
+
51
+ module Butterfly
52
+ module Stub
53
+
54
+ # extend Base class wwith base functionality for the code stub generator generator
55
+ class Base < RubiGen::Base
56
+
57
+ attr_reader :target, :name, :author, :group, :date
58
+
59
+ def initialize(runtime_args, runtime_options = {})
60
+ super
61
+ @destination_root = File.expand_path(args.shift)
62
+ @name = base_name
63
+ @author = ENV['USER']
64
+ @target = @destination_root
65
+ @group = @destination_root.match(/\/(\w+)_generators\//)[1]
66
+ @date = Time.now.strftime("%Y-%m-%d")
67
+ end
68
+
69
+ # do some final things after generation
70
+ def after_generate
71
+ info = File.read(File.join(spec.path, 'INFO')) rescue ''
72
+ template = ERB.new(info, nil, '<>')
73
+ puts "\n#{template.result(binding)}"
74
+ end
75
+ end
76
+ end
48
77
  end
data/lib/butterfly.rb CHANGED
@@ -7,20 +7,26 @@ require 'rubigen'
7
7
  module Butterfly
8
8
 
9
9
  # Current version
10
- VERSION = '0.2.0'
10
+ VERSION = '0.3.0'
11
+
12
+ # local lepidoptera folder
13
+ DOTFOLDER = '.lepidoptera'
11
14
 
12
15
  # path of build-in code generators
13
- GENERATORS_PATH = File.join(File.dirname(__FILE__), '..', '*_generators')
16
+ GENERATOR_GROUPS = File.join(File.dirname(__FILE__), '..', '*_generators')
14
17
 
15
- # path of user code generators
16
- USER_PATH = File.join(Dir.user_home, '.lepidoptera', '*_generators')
18
+ # path of user code generator groups
19
+ USER_GROUPS = File.join(Dir.home, DOTFOLDER, '*_generators')
17
20
 
18
21
 
19
22
  # Error handling
20
23
  class GeneratorError < StandardError
21
24
  end
22
25
 
23
- class GeneratorSourceMissingError < StandardError
26
+ class GeneratorSourceMissingError < GeneratorError
27
+ end
28
+
29
+ class GeneratorFolderExists < GeneratorError
24
30
  end
25
31
 
26
32
 
@@ -32,8 +38,8 @@ module Butterfly
32
38
  def initialize
33
39
  @generators = []
34
40
 
35
- # loop through build in code generators and user code generators
36
- [GENERATORS_PATH, USER_PATH].each do |path|
41
+ # loop through build in code generator groups and user code generator groups
42
+ [GENERATOR_GROUPS, USER_GROUPS].each do |path|
37
43
  Dir[path].each do |file|
38
44
  @generators.push(GeneratorGroup.new(file)) if File.directory?(file)
39
45
  end
@@ -74,13 +80,12 @@ module Butterfly
74
80
  # a generator-group contains a generator name, its path and its generator-types
75
81
  class GeneratorGroup
76
82
 
77
- attr_accessor :name, :source, :types, :label
83
+ attr_accessor :name, :source, :types
78
84
 
79
85
  def initialize(file)
80
86
  @name = File.basename(file).gsub(/_generators$/, '')
81
87
  @source = RubiGen::PathSource.new(:app, file)
82
88
  @types = @source.names(:visible)
83
- @label = @source.label
84
89
  end
85
90
  end
86
91
 
data/lib/options.rb CHANGED
@@ -11,20 +11,24 @@ class OptionParser
11
11
  def add_default(opts)
12
12
  self.separator ""
13
13
 
14
- # self.on("-n", "--new", "Add a new code generator in ~/.lepidoptera") do
15
- # opts[:new] = true
16
- # end
14
+ self.on("-n", "--new", "Create a new code generator stub in ~/.lepidoptera") do
15
+ opts[:new] = true
16
+ end
17
17
 
18
18
  self.on("-q", "--quiet", "Suppress status output") do
19
19
  opts[:quiet] = true
20
20
  end
21
21
 
22
- self.on("-g", "--git","Create a git repository after code generation") do
22
+ self.on("-g", "--git", "Create a git repository after code generation") do
23
23
  opts[:gitinit] = true
24
24
  end
25
25
 
26
- # self.on("-s", "--svn [URL]","Initial import into a given svn repository") do |url|
26
+ # self.on("-s", "--svn [URL]", "Initial import into a given svn repository") do |url|
27
27
  # opts[:svnimport] = url
28
+ # end
29
+
30
+ # self.on("-l", "--list", "List all code generators") do
31
+ # opts[:list] = true
28
32
  # end
29
33
 
30
34
  self.on("-h", "--help", "Show help") do
@@ -107,6 +111,30 @@ module Butterfly
107
111
  exit
108
112
  end
109
113
 
114
+ def ask_for_new_generator
115
+ parser = OptionParser.new do |opts|
116
+ opts.banner = "Usage: #{PURPLE}#{File.basename($0)}#{WHITE} --new #{BLUE}<generator-group>#{WHITE} #{BLUE}<generator-type>#{WHITE}"
117
+ opts.separator ""
118
+ opts.define_head "Go, create a new code generator!"
119
+ opts.define_head ""
120
+ opts.separator "#{BLUE}Please enter a <generator-group> name and a <generator-type> name#{WHITE}"
121
+ end
122
+ parser.parse(["-h"])
123
+ exit
124
+ end
125
+
126
+ def ask_for_new_generator_type(generator_group)
127
+ parser = OptionParser.new do |opts|
128
+ opts.banner = "Usage: #{PURPLE}#{File.basename($0)}#{WHITE} --new #{generator_group} #{BLUE}<generator-type>#{WHITE}"
129
+ opts.separator ""
130
+ opts.define_head "Go, create a new code generator in the #{generator_group} group!"
131
+ opts.define_head ""
132
+ opts.separator "#{BLUE}Please enter a <generator-type> name#{WHITE}"
133
+ end
134
+ parser.parse(["-h"])
135
+ exit
136
+ end
137
+
110
138
  end
111
139
  end
112
140
  end
@@ -0,0 +1,17 @@
1
+ ----------
2
+
3
+ (1) now, copy all your template files into:
4
+ <%= target %>
5
+
6
+ (2) edit your templates and insert some placeholders.
7
+ you have the following ERB placeholders available in your templates:
8
+
9
+ <%%= group %>: name of the generator group (<%= group %>)
10
+ <%%= name %>: name of the generator (<%= name %>)
11
+ <%%= author %>: author of the project (<%= author %>)
12
+
13
+ (3) write some INFO which will then be displayed after code generation.
14
+
15
+ (4) test your new <%= name %> code generator:
16
+ $ lep <%= group %>
17
+ $ lep <%= group %> <%= name %> <project-name>
@@ -0,0 +1,17 @@
1
+ class StubGenerator < Butterfly::Stub::Base
2
+
3
+ def manifest
4
+ record do |m|
5
+
6
+ # create templates folder
7
+ m.directory "templates"
8
+
9
+ # create templates
10
+ m.template "generator-type_INFO", "INFO"
11
+ m.template "generator-type_generator.rb", "#{name}_generator.rb"
12
+ m.template "generator-type_README.txt", "templates/README.txt"
13
+ end
14
+ end
15
+
16
+ end
17
+
@@ -0,0 +1,4 @@
1
+ ----------
2
+ <%= name %> code generator by <%= author %> (c) <%= date %>
3
+
4
+ some INFO text
@@ -0,0 +1,2 @@
1
+ <%%= name %>
2
+ ============
@@ -0,0 +1,15 @@
1
+ class <%= name.capitalize %>Generator < Butterfly::Base
2
+
3
+ def manifest
4
+ record do |m|
5
+
6
+ # create folder
7
+ m.directory ""
8
+
9
+ # create templates
10
+ m.template "README.txt", "README.md"
11
+ end
12
+ end
13
+
14
+ end
15
+
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 2
7
+ - 3
8
8
  - 0
9
- version: 0.2.0
9
+ version: 0.3.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Thomas Duerr
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-11-07 00:00:00 +01:00
17
+ date: 2010-11-10 00:00:00 +01:00
18
18
  default_executable: lep
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -97,6 +97,11 @@ files:
97
97
  - lib/base.rb
98
98
  - lib/butterfly.rb
99
99
  - lib/options.rb
100
+ - lib/stub_generators/stub/INFO
101
+ - lib/stub_generators/stub/stub_generator.rb
102
+ - lib/stub_generators/stub/templates/generator-type_INFO
103
+ - lib/stub_generators/stub/templates/generator-type_README.txt
104
+ - lib/stub_generators/stub/templates/generator-type_generator.rb
100
105
  has_rdoc: true
101
106
  homepage: http://github.com/thomd/lepidoptera/
102
107
  licenses: []