lepidoptera 0.2.0 → 0.3.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.
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: []