template_builder 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt ADDED
@@ -0,0 +1,4 @@
1
+ == 1.0.0 / 2010-11-21
2
+
3
+ * 1 major enhancement
4
+ * Birthday!
data/README.txt ADDED
@@ -0,0 +1,46 @@
1
+ template_builder
2
+ by Anthony Laibe
3
+ https://github.com/alaibe/template_builder
4
+
5
+ == DESCRIPTION:
6
+
7
+ Generate a template for your ruby on rails project
8
+
9
+ == FEATURES/PROBLEMS:
10
+
11
+
12
+ == SYNOPSIS:
13
+
14
+ template_builder foo
15
+
16
+ == REQUIREMENTS:
17
+
18
+
19
+ == INSTALL:
20
+
21
+ gem install template_builder
22
+
23
+ == LICENSE:
24
+
25
+ (The MIT License)
26
+
27
+ Copyright (c) 2009
28
+
29
+ Permission is hereby granted, free of charge, to any person obtaining
30
+ a copy of this software and associated documentation files (the
31
+ 'Software'), to deal in the Software without restriction, including
32
+ without limitation the rights to use, copy, modify, merge, publish,
33
+ distribute, sublicense, and/or sell copies of the Software, and to
34
+ permit persons to whom the Software is furnished to do so, subject to
35
+ the following conditions:
36
+
37
+ The above copyright notice and this permission notice shall be
38
+ included in all copies or substantial portions of the Software.
39
+
40
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
41
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
42
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
43
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
44
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
45
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
46
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,18 @@
1
+
2
+ begin
3
+ require 'bones'
4
+ rescue LoadError
5
+ abort '### Please install the "bones" gem ###'
6
+ end
7
+
8
+ task :default => 'test:run'
9
+ task 'gem:release' => 'test:run'
10
+
11
+ Bones {
12
+ name 'template_builder'
13
+ authors 'Anthony'
14
+ email 'anthony.laibe@gmail.com'
15
+ url 'https://github.com/alaibe/template_builder'
16
+ ignore_file '.gitignore'
17
+ }
18
+
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ root = File.expand_path(File.join(File.dirname(__FILE__), '..'))
4
+
5
+ begin
6
+ require File.join(root, %w[lib template_builder])
7
+ rescue LoadError
8
+ require 'template_builder'
9
+ end
10
+
11
+ TemplateBuilder::App.initialize_plugins
12
+ TemplateBuilder::App.run
13
+
@@ -0,0 +1,22 @@
1
+ devise :
2
+ devise :
3
+ version :
4
+ source :
5
+ command :
6
+ action : [generate 'devise:install',
7
+ "case template['orm']\n
8
+ when 'mongo_mapper'\n
9
+ gem 'mm-devise'\n
10
+ gsub_file 'config/intializers/devise.rb', 'devise/orm/active_record', 'devise/orm/mongo_mapper_active_model'\n
11
+ when 'mongoid'\n
12
+ gsub_file 'config/intializers/devise.rb', 'devise/orm/active_record', 'devise/orm/mongoid'\n
13
+ when 'active_record'\n\n",
14
+ generate 'devise user']
15
+
16
+ omniauth :
17
+ omniauth :
18
+ version :
19
+ source :
20
+ command :
21
+ action : ["file \"app/controllers/sessions_controller.rb\", \"class SessionsController < ApplicationController\n def callback\n auth \n end\n\n def auth; request.env['omniauth'] end\nend\"",
22
+ "route \"match '/auth/:provider/callback', :to => 'sessions#callback'\""]
data/conf/css.yml ADDED
@@ -0,0 +1,17 @@
1
+ sass :
2
+ haml:
3
+ version : >= 3.0.0
4
+ source :
5
+ command :
6
+ action : []
7
+
8
+ css :
9
+ command :
10
+ action : []
11
+
12
+ less :
13
+ less:
14
+ source :
15
+ version :
16
+ command :
17
+ action : []
data/conf/database.yml ADDED
@@ -0,0 +1,21 @@
1
+ sqlite :
2
+ command : sqlite3
3
+ action : []
4
+ oracle :
5
+ command : -d oracle
6
+ action : []
7
+ mongo :
8
+ command :
9
+ action : []
10
+ ibm_db :
11
+ command : -d ibm_db
12
+ action : []
13
+ redis :
14
+ command :
15
+ action : []
16
+ postgres :
17
+ command : -d postgresql
18
+ action : []
19
+ mysql :
20
+ command : -d mysql
21
+ action : []
@@ -0,0 +1,9 @@
1
+ cucumber :
2
+ cucumber-rails :
3
+ version :
4
+ source :
5
+ capybara :
6
+ version :
7
+ source :
8
+ command :
9
+ action : [generate "cucumber:install --capybara#{' --rspec' if recipes.include?('rspec')}#{' -D' unless recipes.include?('activerecord')}"]
@@ -0,0 +1,14 @@
1
+ prototype :
2
+ command :
3
+ action : []
4
+
5
+ jquery :
6
+ command : -J
7
+ action : ['get "https://github.com/rails/jquery-ujs/raw/master/src/rails.js" , "public/javascript/rails.js"',
8
+ 'get http://code.jquery.com/jquery-1.4.2.min.js, "public/javascript/jquery.js"']
9
+
10
+ mootools :
11
+ command : -J
12
+ action : ['get http://ajax.googleapis.com/ajax/libs/mootools/1.2.5/mootools-yui-compressed.js, "public/javascript/mootools.js"',
13
+ 'get https://github.com/kevinvaldek/mootools-ujs/raw/master/Source/rails.js, "public/javascript/rails.js"',
14
+ 'gsub_file "config/application.rb", "jquery", "mootools"']
data/conf/orm.yml ADDED
@@ -0,0 +1,59 @@
1
+ active_record :
2
+ command :
3
+ action : []
4
+
5
+ data_mapper:
6
+ dm-migrations:
7
+ version :
8
+ source :
9
+ dm-types:
10
+ version :
11
+ source :
12
+ dm-validations:
13
+ version :
14
+ source :
15
+ dm-constraints:
16
+ version :
17
+ source :
18
+ dm-transactions:
19
+ version :
20
+ source :
21
+ dm-aggregates:
22
+ version :
23
+ source :
24
+ dm-timestamps:
25
+ version :
26
+ source :
27
+ dm-observer:
28
+ version :
29
+ source :
30
+ command : -O
31
+ action : []
32
+
33
+ mongo_mapper :
34
+ mongo_mapper-rails3 :
35
+ version :
36
+ source :
37
+ action : gsub_file 'config/initializers/session_store.rb', 'active_record_store', 'mongo_mapper_store'
38
+ bson_ext :
39
+ version :
40
+ source :
41
+ mongo_mapper :
42
+ source :
43
+ version :
44
+ command : -O
45
+ action : [generate 'mongo_mapper:config']
46
+
47
+ mongoid :
48
+ mongoid :
49
+ version : >= 2.0.0.beta.19
50
+ source :
51
+ bson_ext :
52
+ version :
53
+ source :
54
+ mongo_session_store :
55
+ source :
56
+ version :
57
+ action : gsub_file 'config/initializers/session_store.rb', 'active_record_store', 'mongoid_store'
58
+ command : -O
59
+ action : [generate 'mongoid:config']
@@ -0,0 +1,27 @@
1
+ database :
2
+ help : set the database you want to use
3
+ priority : 1
4
+ orm :
5
+ help : set the orm framework you want to use
6
+ priority : 2
7
+ javascript :
8
+ help : set the javascript framework you want to use
9
+ priority : 2
10
+ templating :
11
+ help : set the templating framework you want to use
12
+ priority : 2
13
+ css :
14
+ help : set the css framework you want to use
15
+ priority : 2
16
+ unit_testing :
17
+ help : set the unit testing framework you want to use
18
+ priority : 3
19
+ integration_testing :
20
+ help : set the integration testing framework you want to use
21
+ priority : 3
22
+ authentication :
23
+ help : set the authentication framework you want to use
24
+ priority : 4
25
+
26
+
27
+
@@ -0,0 +1,25 @@
1
+ erb :
2
+ command :
3
+ action : []
4
+ haml :
5
+ haml:
6
+ version : >= 3.0.0
7
+ source :
8
+ haml-rails :
9
+ version :
10
+ source :
11
+ rails3-generators :
12
+ version :
13
+ source : git => 'git://github.com/indirect/rails3-generators.git'
14
+ command :
15
+ action : []
16
+
17
+ slim :
18
+ slim:
19
+ version :
20
+ source :
21
+ slim-rails :
22
+ version :
23
+ source :
24
+ command :
25
+ action : []
@@ -0,0 +1,10 @@
1
+ test_unit :
2
+ command :
3
+ action : []
4
+
5
+ rspec :
6
+ rspec-rails :
7
+ version :
8
+ source :
9
+ command : -T
10
+ action : [generate 'rspec:install']
@@ -0,0 +1,211 @@
1
+
2
+ module TemplateBuilder::App
3
+ class Command
4
+
5
+ # :startdoc:
6
+ attr_reader :stdout
7
+ attr_reader :stderr
8
+ attr_reader :config
9
+
10
+ def initialize( opts = {} )
11
+ @stdout = opts[:stdout] || $stdout
12
+ @stderr = opts[:stderr] || $stderr
13
+
14
+ @config = {:name => nil, :force => nil, :verbose =>nil}
15
+ @config_param = {}
16
+ @command = []
17
+ standard_parameters.each_key{ |key| @config_param[key] = TemplateBuilder::App::Helper::Parameter.new(:priority=>priority(key)) }
18
+ end
19
+
20
+ def run( args )
21
+ raise NotImplementedError
22
+ end
23
+
24
+ def priority(key)
25
+ FileAnalyzer.load_priority key
26
+ end
27
+ # The project name from the command line.
28
+ #
29
+ def name
30
+ @config[:name]
31
+ end
32
+
33
+ def force
34
+ @config[:force]
35
+ end
36
+
37
+ # Returns +true+ if the user has requested verbose messages.
38
+ #
39
+ def verbose?
40
+ @config[:verbose]
41
+ end
42
+ #
43
+ #
44
+ def standard_options
45
+ Command.standard_options
46
+ end
47
+
48
+ def standard_parameters
49
+ Command.standard_parameters
50
+ end
51
+
52
+ #
53
+ #
54
+ def parse( args )
55
+ opts = OptionParser.new
56
+
57
+ opts.banner = 'NAME'
58
+ opts.separator " template_builder v#{::TemplateBuilder.version}"
59
+ opts.separator ''
60
+ if self.class.synopsis
61
+ opts.separator 'SYNOPSIS'
62
+ self.class.synopsis.split("\n").each { |line| opts.separator " #{line.strip}" }
63
+ opts.separator ''
64
+ end
65
+
66
+ if self.class.description
67
+ opts.separator 'DESCRIPTION'
68
+ self.class.description.split("\n").each { |line| opts.separator " #{line.strip}" }
69
+ opts.separator ''
70
+ end
71
+ if self.class.parameters and not self.class.parameters.empty?
72
+ opts.separator 'PARAMETER'
73
+ self.class.parameters.each { |parameter|
74
+ case parameter
75
+ when Array
76
+ parameter << method(parameter.pop) if parameter.last =~ %r/^__/
77
+ opts.on(*parameter)
78
+ when String
79
+ opts.separator(" #{parameter.strip}")
80
+ else opts.separator('') end
81
+ }
82
+ opts.separator ''
83
+ end
84
+ if self.class.options and not self.class.options.empty?
85
+ opts.separator 'OPTION'
86
+ self.class.options.each { |option|
87
+ case option
88
+ when Array
89
+ option << method(option.pop) if option.last =~ %r/^__/
90
+ opts.on(*option)
91
+ when String
92
+ opts.separator(" #{option.strip}")
93
+ else opts.separator('') end
94
+ }
95
+ opts.separator ''
96
+ end
97
+ opts.separator ' Common Options:'
98
+ opts.on_tail( '-h', '--help', 'show this message' ) {
99
+ stdout.puts opts
100
+ exit
101
+ }
102
+ opts.on_tail ''
103
+ opts.parse! args
104
+ return opts
105
+ end
106
+
107
+ #
108
+ #
109
+ def self.standard_options
110
+ @standard_options = {:verbose => ['-v', '--verbose', 'Enable verbose output.',
111
+ lambda { config[:verbose] = true }],
112
+ :force => ['-f', '--force', 'Force creating file.',
113
+ lambda { config[:force] = true }] }
114
+ end
115
+
116
+ def self.standard_parameters
117
+ return @standard_parameters if @standard_parameters
118
+ @standard_parameters = FileAnalyzer.load_standard_parameters
119
+ @standard_parameters
120
+ end
121
+
122
+ def ask_for(framework_name)
123
+ all_frameworks = FileAnalyzer.all_frameworks_for framework_name
124
+ puts "Choose your "+framework_name.to_s+" framework ? (enter 0 for none)"
125
+ until @config_param[framework_name].name
126
+ all_frameworks.each_with_index{ |value,index| puts "("+(index+1).to_s+") "+value.to_s+"\r\n" }
127
+ answer = STDIN.gets
128
+ @config_param[framework_name].name = all_frameworks[answer.to_i-1] if (1..all_frameworks.length).include? answer.to_i
129
+ @config_param[framework_name] = "none" if 0 == answer
130
+ end
131
+
132
+ end
133
+
134
+ def run_framework(fileManager, opts = {})
135
+ framework = FileAnalyzer.load_framework opts
136
+ fileManager.write_framework_introduction opts[:name]
137
+ framework.run fileManager
138
+ special_case_data_mapper fileManager if @config_param[:orm].name == "data_mapper"
139
+ @command << framework.command
140
+ end
141
+
142
+ def special_case_data_mapper(fileManager)
143
+ fileManager.write "gem 'dm-"+@config_param[:database].name.to_s+"-adapter'"
144
+ end
145
+
146
+ module ClassMethods
147
+ def synopsis( *args )
148
+ @synopsis = args.join("\n") unless args.empty?
149
+ @synopsis
150
+ end
151
+
152
+ def description( *args )
153
+ @description = args.join("\n") unless args.empty?
154
+ @description
155
+ end
156
+
157
+ def summary( *args )
158
+ @summary = args.join("\n") unless args.empty?
159
+ @summary
160
+ end
161
+
162
+ def option( *args, &block )
163
+ args.flatten!
164
+ block = args.pop if block.nil? and Proc === args.last
165
+ if block
166
+ args.each { |val|
167
+ next unless val.instance_of? String
168
+ next unless val =~ %r/^--(\w+)/
169
+ args << "__#$1"
170
+ define_method(args.last.to_sym, &block)
171
+ options << args
172
+ break
173
+ }
174
+ else
175
+ options << (args.length > 1 ? args : args.first )
176
+ end
177
+ end
178
+
179
+ def parameter(*args)
180
+ args.flatten!
181
+ block = args.pop if block.nil? and Proc === args.last
182
+ if block
183
+ args.each { |val|
184
+ next unless val.instance_of? String
185
+ next unless val =~ %r/^--(\w+)/
186
+ args << "__#$1"
187
+ define_method(args.last.to_sym, &block)
188
+ parameters << args
189
+ break
190
+ }
191
+ else
192
+ parameters << (args.length > 1 ? args : args.first )
193
+ end
194
+ end
195
+
196
+ def parameters
197
+ @parameters ||= []
198
+ end
199
+
200
+ def options
201
+ @options ||= []
202
+ end
203
+ end
204
+
205
+ def self.inherited( other )
206
+ other.extend ClassMethods
207
+ end
208
+
209
+ end # class TemplateBuilder::App::Command
210
+ end
211
+ # EOF
@@ -0,0 +1,90 @@
1
+ require "singleton"
2
+
3
+ module TemplateBuilder::App::FileAnalyzer
4
+
5
+ def self.load_standard_parameters
6
+ FileParameter.instance.parameters
7
+ end
8
+
9
+ def self.all_parameters
10
+ FileParameter.instance.parameters_names
11
+ end
12
+
13
+ def self.load_priority(type_name)
14
+ FileParameter.instance.priority type_name
15
+ end
16
+
17
+ def self.load_conf_file(file_name)
18
+ YAML.load_file(File.join(TemplateBuilder::PATH,"/conf/"+file_name.to_s+".yml"))
19
+ end
20
+
21
+ def self.all_frameworks_for(name)
22
+ FileFramework.new(name).all_frameworks
23
+ end
24
+
25
+ def self.load_framework(opts = {})
26
+ FileFramework.new(opts[:type]).load_framework opts[:name]
27
+ end
28
+
29
+ class FileParameter
30
+ include Singleton
31
+
32
+ attr_reader :parameters
33
+
34
+ def initialize
35
+ @parameters = {}
36
+ load_conf_file
37
+ analyse_file
38
+ end
39
+
40
+ def analyse_file
41
+ @config_file.each{ |k,v| @parameters[k.to_sym] = ["-#{k[0..0].to_s}", "--#{k} FRAMEWORK", "#{v['help'].capitalize} .",
42
+ lambda { |item| @config_param[k.to_sym] = Parameter.new :priority=>0,:name=>item }] }
43
+ end
44
+
45
+ def load_conf_file
46
+ @config_file = TemplateBuilder::App::FileAnalyzer.load_conf_file "parameter_file"
47
+ end
48
+
49
+ def parameters_names
50
+ @parameters.each_key.to_a
51
+ end
52
+
53
+ def priority(type_name)
54
+ @config_file[type_name.to_s]["priority"]
55
+ end
56
+ end
57
+
58
+ class FileFramework
59
+
60
+ def initialize(args)
61
+ @name = args
62
+ load_conf_file
63
+ end
64
+
65
+ def all_frameworks
66
+ @config_file.each_key.to_a
67
+ end
68
+
69
+ def load_conf_file
70
+ @config_file = TemplateBuilder::App::FileAnalyzer.load_conf_file @name
71
+ end
72
+
73
+ def load_framework(name)
74
+ opts = {:name => name, :gems =>[]}
75
+ puts name
76
+ @config_file[name].each do |key, value|
77
+ if ["command","action"].include? key
78
+ opts[key.to_sym] = value
79
+ else
80
+ gem = {:name => key}
81
+ value.each {|key,value| gem[key.to_sym] = value}
82
+ opts[:gems] << gem
83
+ end
84
+ end
85
+ TemplateBuilder::App::Helper.framework_factory opts
86
+ end
87
+
88
+ end
89
+
90
+ end
@@ -0,0 +1,73 @@
1
+ module TemplateBuilder::App
2
+ class FileManager
3
+
4
+ Error = Class.new(StandardError)
5
+
6
+ attr_accessor :file, :verbose, :file_name
7
+ alias :verbose? :verbose
8
+
9
+ def initialize( opts = {} )
10
+ self.file_name = opts[:file]
11
+ self.verbose = opts[:verbose]
12
+ self.file = File.new(self.file_name, "w+")
13
+ @out = opts[:stdout] || $stdout
14
+ @err = opts[:stderr] || $stderr
15
+ end
16
+
17
+ def start_file(config_file)
18
+ write "# This template was generated by template_builder, the amazing and awesome Rails
19
+ # application builder.
20
+ #
21
+ initializer 'generators.rb', <<-RUBY
22
+ Rails.application.config.generators do |g|
23
+ end
24
+ RUBY"
25
+
26
+ template = "template = {"
27
+ config_file.each do |key, value|
28
+ template += "'"+key.to_s+"'=>'"+value.name+"',"
29
+ end
30
+ write template[0..template.length-2]+"}"
31
+
32
+ write"recipes = template.values.flatten
33
+
34
+ @after = []
35
+ def after_bundler(&block); @after << block; end"
36
+ end
37
+
38
+ def end_file(name, command)
39
+ write "
40
+ # >-----------------------------[ Run Bundler ]-------------------------------<
41
+
42
+ say 'Running Bundler install. This will take a while.'
43
+ run 'bundle install'
44
+ say 'Running after Bundler callbacks.'
45
+ @after.each{|b| b.call}
46
+
47
+ # >---------------------------[ Install Command ]-----------------------------<
48
+ # rails new APP_NAME -m "+name+" "+command.to_s+" -f
49
+ # >---------------------------------------------------------------------------<"
50
+ end
51
+
52
+ def write(content)
53
+ self.file.write content+"\n"
54
+ end
55
+
56
+ def write_gem(gem)
57
+ write "gem "+gem
58
+ end
59
+
60
+ def write_action(action)
61
+ write "after_bundler do\n"
62
+ action.each{ |act| write "\t"+act.to_s }
63
+ write "end"
64
+ end
65
+
66
+ def write_framework_introduction(name)
67
+ write "
68
+ # ---------------------------------------------------------------------------
69
+ # >----------------------------[ "+name+"]------------------------------<"
70
+ end
71
+
72
+ end
73
+ end
@@ -0,0 +1,49 @@
1
+
2
+ module TemplateBuilder::App::Helper
3
+
4
+ def self.framework_factory(opts = {})
5
+ gems = []
6
+ opts[:gems].each { |gem| gems<< Gem.new(gem) }
7
+ opts[:gems] = gems
8
+ Framework.new opts
9
+ end
10
+
11
+ class Framework
12
+ attr_reader :command
13
+ def initialize(opts = {})
14
+ @name = opts[:name]
15
+ @gems = opts[:gems]
16
+ @action = opts[:action]
17
+ @command = opts[:command]
18
+ end
19
+
20
+ def run(fileManager)
21
+ @gems.each { |gem| fileManager.write_gem gem.to_s }
22
+ fileManager.write_action action if action.length>0
23
+ end
24
+
25
+ def action
26
+ ret = []
27
+ @gems.each { |gem| ret << gem.action if gem.action}
28
+ @action.each { |act| ret << act if act}
29
+ ret
30
+ end
31
+ end
32
+
33
+ class Gem
34
+ attr_reader :action
35
+ def initialize(opts = {})
36
+ @version = opts[:version]
37
+ @source = opts[:source]
38
+ @name = opts[:name]
39
+ @action = opts[:action]
40
+ end
41
+
42
+ def to_s
43
+ gem = "'"+@name+"'"
44
+ gem += ", '"+@version+"'" if @version
45
+ gem += ", :"+@source+"" if @source
46
+ gem
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,10 @@
1
+ module TemplateBuilder::App::Helper
2
+ class Parameter
3
+ attr_reader :priority
4
+ attr_accessor :name
5
+ def initialize(opts={})
6
+ @name = opts[:name]
7
+ @priority = opts[:priority]
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,63 @@
1
+
2
+ module TemplateBuilder::App
3
+ class New < Command
4
+
5
+ def self.initialize_new
6
+ synopsis 'template_builder new [name] [parameter type parameter type] [options]'
7
+
8
+ summary 'create a new template for your rails application.'
9
+
10
+ description <<-__
11
+ create a new template for your rails application. You can add a lot
12
+ of option as the database, the javascript framework etc ..
13
+ __
14
+
15
+ FileAnalyzer.all_parameters.each {|item|
16
+ parameter(standard_parameters[item])
17
+ }
18
+ option(standard_options[:verbose])
19
+ option(standard_options[:force])
20
+ end
21
+
22
+ def run
23
+ raise Error, "File #{name} already exists." if !force and test ?e, name
24
+ file_manager = FileManager.new(
25
+ :file => name,
26
+ :stdout => stdout,
27
+ :stderr => stderr,
28
+ :verbose => verbose?
29
+ )
30
+ announce
31
+ sorted_param = @config_param.sort{|a,b| a[1].priority <=> b[1].priority }.map
32
+ sorted_param.each{ |k,v| ask_for k unless v.name }
33
+
34
+ file_manager.start_file sorted_param
35
+
36
+ sorted_param.each{ |k,v| run_framework file_manager, :type=>k, :name=>v.name unless v.name == "none"}
37
+
38
+ file_manager.end_file name, @command
39
+
40
+ end
41
+
42
+ def parse( args )
43
+ opts = super args
44
+ config[:name] = args.empty? ? nil : args.join('_')
45
+ if name.nil?
46
+ stdout.puts opts
47
+ exit 1
48
+ end
49
+ end
50
+
51
+ def announce
52
+ complete_name = name.split("/")
53
+ file = complete_name.last
54
+ output_dir = complete_name[0..complete_name.length-2]
55
+ msg = "Created '#{file}'"
56
+ msg << " in directory '#{output_dir}'" if name.to_s != output_dir.to_s
57
+ stdout.puts msg
58
+ end
59
+
60
+ end # class Create
61
+ end # module TemplateBuilder::App
62
+
63
+ # EOF
@@ -0,0 +1,58 @@
1
+ module TemplateBuilder::App
2
+ class Show < Command
3
+ def self.initialize_show
4
+ synopsis 'template_builder show [parameter]'
5
+
6
+ summary 'Show all kind of awesome framework available .'
7
+
8
+ description <<-__
9
+ Show all kind of awesome framework available you can use with template builder
10
+ and for each type, can show you a description of all plugin available
11
+ __
12
+
13
+ FileAnalyzer.all_parameters.each {|item|
14
+ parameter(item.to_s)
15
+ }
16
+ option(standard_options[:verbose])
17
+ option(standard_options[:force])
18
+ end
19
+
20
+ def run
21
+ # raise Error, "File #{name} doesn't exists." if !force and !test ?e, name
22
+ # file_manager = FileManager.new(
23
+ # :file => name,
24
+ # :stdout => stdout,
25
+ # :stderr => stderr,
26
+ # :verbose => verbose?
27
+ # )
28
+ # announce
29
+ # sorted_param = @config_param.sort{|a,b| a[1].priority <=> b[1].priority }.map
30
+ # sorted_param.each{ |k,v| ask_for k unless v.name }
31
+ #
32
+ # file_manager.start_file sorted_param
33
+ #
34
+ # sorted_param.each{ |k,v| run_framework file_manager, :type=>k, :name=>v.name unless v.name == "none"}
35
+ #
36
+ # file_manager.end_file name, @command
37
+
38
+ end
39
+
40
+ def parse( args )
41
+ opts = super args
42
+ config[:name] = args.empty? ? nil : args.join('_')
43
+ if name.nil?
44
+ stdout.puts opts
45
+ exit 1
46
+ end
47
+ end
48
+
49
+ def announce
50
+ complete_name = name.split("/")
51
+ file = complete_name.last
52
+ output_dir = complete_name[0..complete_name.length-2]
53
+ msg = "Editing '#{file}'"
54
+ msg << " in directory '#{output_dir}'" if name.to_s != output_dir.to_s
55
+ stdout.puts msg
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,118 @@
1
+ require 'net/http'
2
+ require 'uri'
3
+
4
+ module TemplateBuilder::App
5
+ extend LittlePlugger(:path => 'template_builder/app', :module => TemplateBuilder::App)
6
+
7
+ disregard_plugins :command, :file_manager, :file_analyzer
8
+
9
+ Error = Class.new(StandardError)
10
+
11
+ # Create a new instance of Main, and run the +template_builder+ application given
12
+ # the command line _args_.
13
+ #
14
+ def self.run( args = nil )
15
+ args ||= ARGV.dup.map! { |v| v.dup }
16
+ ::TemplateBuilder::App::Main.new.run args
17
+ end
18
+
19
+ class Main
20
+ attr_reader :stdout
21
+ attr_reader :stderr
22
+
23
+ # Create a new Main application instance. Options can be passed to
24
+ # configuret he stdout and stderr IO streams (very useful for testing).
25
+ #
26
+ def initialize( opts = {} )
27
+ opts[:stdout] ||= $stdout
28
+ opts[:stderr] ||= $stderr
29
+
30
+ @opts = opts
31
+ @stdout = opts[:stdout]
32
+ @stderr = opts[:stderr]
33
+ end
34
+
35
+ # Parse the desired user command and run that command object.
36
+ #
37
+ def run( args )
38
+ commands = []
39
+ @all_commands = ::TemplateBuilder::App.plugins
40
+ @all_commands.each { |k,v| commands << k.to_s if v < ::TemplateBuilder::App::Command }
41
+ cmd_str = args.shift
42
+ cmd = case cmd_str
43
+ when *commands
44
+ key = cmd_str.to_sym
45
+ @all_commands[key].new @opts
46
+ when nil, '-h', '--help'
47
+ help
48
+ when '-v', '--version'
49
+ stdout.puts "TemplateBuilder v#{::TemplateBuilder.version}"
50
+ else
51
+ help
52
+ raise Error, "Unknown command #{cmd_str.inspect}"
53
+ end
54
+
55
+ if cmd
56
+ cmd.parse args
57
+ cmd.run
58
+ end
59
+
60
+ # rescue TemplateBuilder::App::Error => err
61
+ # stderr.puts "ERROR: While executing template builder ..."
62
+ # stderr.puts " #{err.message}"
63
+ # exit 1
64
+ # rescue StandardError => err
65
+ # stderr.puts "ERROR: While executing template builder ... (#{err.class})"
66
+ # stderr.puts " #{err.to_s}"
67
+ # exit 1
68
+ end
69
+
70
+ # Show the toplevel Template builder help message.
71
+ #
72
+ def help
73
+ msg = <<-MSG
74
+ NAME
75
+ Template_builder v#{::TemplateBuilder.version}
76
+
77
+ DESCRIPTION
78
+ Template-builder is a handy tool that builds a template for your new Ruby
79
+ on Rails projects. The template contains all you need to build the RoR
80
+ project that you want.
81
+
82
+ Usage:
83
+ template_builder -h/--help
84
+ template_builder -v/--version
85
+ template_builder [command] [parameter type parameter type] [options]
86
+
87
+ Examples:
88
+ template_builder new <new_template_file>
89
+ template_builder edit<old_template_file>
90
+
91
+ Commands:
92
+ MSG
93
+ fmt = lambda { |cmd|
94
+ if @all_commands[cmd] < ::TemplateBuilder::App::Command
95
+ msg << " template_builder %-15s %s\n" % [cmd, @all_commands[cmd].summary]
96
+ puts msg
97
+ end
98
+ }
99
+ ary = [:new, :show]
100
+ ary.each(&fmt)
101
+ (@all_commands.keys - ary).each(&fmt)
102
+ msg.concat <<-MSG
103
+
104
+ Further Help:
105
+ Each command has a '--help' option that will provide detailed
106
+ information for that command.
107
+
108
+ http://github.com/alaibe/template_builder
109
+
110
+ MSG
111
+
112
+ stdout.puts msg
113
+ end
114
+
115
+ end # class Main
116
+ end # module Bones::App
117
+
118
+ # EOF
@@ -0,0 +1,67 @@
1
+ require 'yaml'
2
+ require 'rubygems'
3
+ require 'little-plugger'
4
+
5
+ module TemplateBuilder
6
+
7
+ # :stopdoc:
8
+ LIBPATH = ::File.expand_path(::File.dirname(__FILE__)) + ::File::SEPARATOR
9
+ PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR
10
+ # :startdoc:
11
+
12
+ # Returns the version string for the library.
13
+ #
14
+ def self.version
15
+ @version ||= File.read(path('version.txt')).strip
16
+ end
17
+
18
+ # Returns the library path for the module. If any arguments are given,
19
+ # they will be joined to the end of the libray path using
20
+ # <tt>File.join</tt>.
21
+ #
22
+ def self.libpath( *args, &block )
23
+ rv = args.empty? ? LIBPATH : ::File.join(LIBPATH, args.flatten)
24
+ if block
25
+ begin
26
+ $LOAD_PATH.unshift LIBPATH
27
+ rv = block.call
28
+ ensure
29
+ $LOAD_PATH.shift
30
+ end
31
+ end
32
+ return rv
33
+ end
34
+
35
+ # Returns the lpath for the module. If any arguments are given,
36
+ # they will be joined to the end of the path using
37
+ # <tt>File.join</tt>.
38
+ #
39
+ def self.path( *args, &block )
40
+ rv = args.empty? ? PATH : ::File.join(PATH, args.flatten)
41
+ if block
42
+ begin
43
+ $LOAD_PATH.unshift PATH
44
+ rv = block.call
45
+ ensure
46
+ $LOAD_PATH.shift
47
+ end
48
+ end
49
+ return rv
50
+ end
51
+
52
+ # Utility method used to require all files ending in .rb that lie in the
53
+ # directory below this file that has the same name as the filename passed
54
+ # in. Optionally, a specific _directory_ name can be passed in such that
55
+ # the _filename_ does not have to be equivalent to the directory.
56
+ #
57
+ def self.require_all_libs_relative_to( fname, dir = nil )
58
+ dir ||= ::File.basename(fname, '.*')
59
+ search_me = ::File.expand_path(
60
+ ::File.join(::File.dirname(fname), dir, '**', '*.rb'))
61
+ Dir.glob(search_me).sort.each {|rb| require rb}
62
+ end
63
+
64
+ end # module TemplateBuilder
65
+
66
+ TemplateBuilder.require_all_libs_relative_to(__FILE__)
67
+
File without changes
data/version.txt ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
metadata ADDED
@@ -0,0 +1,109 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: template_builder
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 0
10
+ version: 0.1.0
11
+ platform: ruby
12
+ authors:
13
+ - Anthony
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-12-20 00:00:00 +01:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: bones
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 17
30
+ segments:
31
+ - 3
32
+ - 5
33
+ - 1
34
+ version: 3.5.1
35
+ type: :development
36
+ version_requirements: *id001
37
+ description: Generate a template for your ruby on rails project
38
+ email: anthony.laibe@gmail.com
39
+ executables:
40
+ - template_builder
41
+ extensions: []
42
+
43
+ extra_rdoc_files:
44
+ - History.txt
45
+ - README.txt
46
+ - bin/template_builder
47
+ - version.txt
48
+ files:
49
+ - History.txt
50
+ - README.txt
51
+ - Rakefile
52
+ - bin/template_builder
53
+ - conf/authentication.yml
54
+ - conf/css.yml
55
+ - conf/database.yml
56
+ - conf/integration_testing.yml
57
+ - conf/javascript.yml
58
+ - conf/orm.yml
59
+ - conf/parameter_file.yml
60
+ - conf/templating.yml
61
+ - conf/unit_testing.yml
62
+ - lib/template_builder.rb
63
+ - lib/template_builder/app.rb
64
+ - lib/template_builder/app/command.rb
65
+ - lib/template_builder/app/file_analyzer.rb
66
+ - lib/template_builder/app/file_manager.rb
67
+ - lib/template_builder/app/helper/framework.rb
68
+ - lib/template_builder/app/helper/parameter.rb
69
+ - lib/template_builder/app/new.rb
70
+ - lib/template_builder/app/show.rb
71
+ - version.txt
72
+ - test/test_template_builder.rb
73
+ has_rdoc: true
74
+ homepage: https://github.com/alaibe/template_builder
75
+ licenses: []
76
+
77
+ post_install_message:
78
+ rdoc_options:
79
+ - --main
80
+ - README.txt
81
+ require_paths:
82
+ - lib
83
+ required_ruby_version: !ruby/object:Gem::Requirement
84
+ none: false
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ hash: 3
89
+ segments:
90
+ - 0
91
+ version: "0"
92
+ required_rubygems_version: !ruby/object:Gem::Requirement
93
+ none: false
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ hash: 3
98
+ segments:
99
+ - 0
100
+ version: "0"
101
+ requirements: []
102
+
103
+ rubyforge_project: template_builder
104
+ rubygems_version: 1.3.7
105
+ signing_key:
106
+ specification_version: 3
107
+ summary: Generate a template for your ruby on rails project
108
+ test_files:
109
+ - test/test_template_builder.rb