jackdempsey-beet 0.0.2
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/LICENSE +20 -0
- data/README.rdoc +13 -0
- data/Rakefile +48 -0
- data/TODO +0 -0
- data/VERSION +1 -0
- data/beet.gemspec +61 -0
- data/bin/beet +61 -0
- data/lib/beet/capistrano.rb +14 -0
- data/lib/beet/execution.rb +37 -0
- data/lib/beet/executor.rb +43 -0
- data/lib/beet/file_system.rb +112 -0
- data/lib/beet/interaction.rb +36 -0
- data/lib/beet/logging.rb +14 -0
- data/lib/beet/rails.rb +146 -0
- data/lib/beet/scm/git.rb +15 -0
- data/lib/beet/scm/svn.rb +5 -0
- data/lib/beet/scm.rb +36 -0
- data/lib/beet/templates/rails/clean_files.rb +4 -0
- data/lib/beet/templates/rails/git.rb +24 -0
- data/lib/beet/templates/rails/jquery.rb +2 -0
- data/lib/beet.rb +9 -0
- data/spec/beet_spec.rb +7 -0
- data/spec/spec_helper.rb +9 -0
- metadata +77 -0
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 Jack Dempsey
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
= beet
|
2
|
+
|
3
|
+
Beet is a simple project/app generator, with its roots and underlying infrastructure heavily influenced from Rails Templates.
|
4
|
+
|
5
|
+
Currently Beet will focus on Rails template generation, but there's no reason not to extend it to build out any sort of project.
|
6
|
+
The goal is to have a variety of core level methods to allow for building of higher level concepts that make sense in whatever
|
7
|
+
your project needs.
|
8
|
+
|
9
|
+
Eventually I would love to see strategies/templates for sinatra, merb, iPhone apps, etc. The sky is the limit.
|
10
|
+
|
11
|
+
== Copyright
|
12
|
+
|
13
|
+
Copyright (c) 2009 Jack Dempsey. See LICENSE for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'jeweler'
|
6
|
+
Jeweler::Tasks.new do |gem|
|
7
|
+
gem.name = "beet"
|
8
|
+
gem.summary = %Q{A gem to help with easily generating projects}
|
9
|
+
gem.email = "jack.dempsey@gmail.com"
|
10
|
+
gem.homepage = "http://github.com/jackdempsey/beet"
|
11
|
+
gem.authors = ["Jack Dempsey"]
|
12
|
+
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
13
|
+
end
|
14
|
+
|
15
|
+
rescue LoadError
|
16
|
+
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
17
|
+
end
|
18
|
+
|
19
|
+
require 'spec/rake/spectask'
|
20
|
+
Spec::Rake::SpecTask.new(:spec) do |spec|
|
21
|
+
spec.libs << 'lib' << 'spec'
|
22
|
+
spec.spec_files = FileList['spec/**/*_spec.rb']
|
23
|
+
end
|
24
|
+
|
25
|
+
Spec::Rake::SpecTask.new(:rcov) do |spec|
|
26
|
+
spec.libs << 'lib' << 'spec'
|
27
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
28
|
+
spec.rcov = true
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
task :default => :spec
|
33
|
+
|
34
|
+
require 'rake/rdoctask'
|
35
|
+
Rake::RDocTask.new do |rdoc|
|
36
|
+
if File.exist?('VERSION.yml')
|
37
|
+
config = YAML.load(File.read('VERSION.yml'))
|
38
|
+
version = "#{config[:major]}.#{config[:minor]}.#{config[:patch]}"
|
39
|
+
else
|
40
|
+
version = ""
|
41
|
+
end
|
42
|
+
|
43
|
+
rdoc.rdoc_dir = 'rdoc'
|
44
|
+
rdoc.title = "beet #{version}"
|
45
|
+
rdoc.rdoc_files.include('README*')
|
46
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
47
|
+
end
|
48
|
+
|
data/TODO
ADDED
File without changes
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.2
|
data/beet.gemspec
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{beet}
|
5
|
+
s.version = "0.0.2"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Jack Dempsey"]
|
9
|
+
s.date = %q{2009-05-20}
|
10
|
+
s.default_executable = %q{beet}
|
11
|
+
s.email = %q{jack.dempsey@gmail.com}
|
12
|
+
s.executables = ["beet"]
|
13
|
+
s.extra_rdoc_files = [
|
14
|
+
"LICENSE",
|
15
|
+
"README.rdoc"
|
16
|
+
]
|
17
|
+
s.files = [
|
18
|
+
"LICENSE",
|
19
|
+
"README.rdoc",
|
20
|
+
"Rakefile",
|
21
|
+
"TODO",
|
22
|
+
"VERSION",
|
23
|
+
"beet.gemspec",
|
24
|
+
"bin/beet",
|
25
|
+
"lib/beet.rb",
|
26
|
+
"lib/beet/capistrano.rb",
|
27
|
+
"lib/beet/execution.rb",
|
28
|
+
"lib/beet/executor.rb",
|
29
|
+
"lib/beet/file_system.rb",
|
30
|
+
"lib/beet/interaction.rb",
|
31
|
+
"lib/beet/logging.rb",
|
32
|
+
"lib/beet/rails.rb",
|
33
|
+
"lib/beet/scm.rb",
|
34
|
+
"lib/beet/scm/git.rb",
|
35
|
+
"lib/beet/scm/svn.rb",
|
36
|
+
"lib/beet/templates/rails/clean_files.rb",
|
37
|
+
"lib/beet/templates/rails/git.rb",
|
38
|
+
"lib/beet/templates/rails/jquery.rb",
|
39
|
+
"spec/beet_spec.rb",
|
40
|
+
"spec/spec_helper.rb"
|
41
|
+
]
|
42
|
+
s.homepage = %q{http://github.com/jackdempsey/beet}
|
43
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
44
|
+
s.require_paths = ["lib"]
|
45
|
+
s.rubygems_version = %q{1.3.3}
|
46
|
+
s.summary = %q{A gem to help with easily generating projects}
|
47
|
+
s.test_files = [
|
48
|
+
"spec/beet_spec.rb",
|
49
|
+
"spec/spec_helper.rb"
|
50
|
+
]
|
51
|
+
|
52
|
+
if s.respond_to? :specification_version then
|
53
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
54
|
+
s.specification_version = 3
|
55
|
+
|
56
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
57
|
+
else
|
58
|
+
end
|
59
|
+
else
|
60
|
+
end
|
61
|
+
end
|
data/bin/beet
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'thor'
|
5
|
+
require 'ruby-debug'
|
6
|
+
$:.unshift(File.dirname(__FILE__) + '/../lib')
|
7
|
+
require 'beet'
|
8
|
+
|
9
|
+
class BeetRunner < Thor
|
10
|
+
default_task :help
|
11
|
+
|
12
|
+
map "-g" => :generate
|
13
|
+
map "-h" => :help
|
14
|
+
map "-v" => :version
|
15
|
+
|
16
|
+
desc 'generate [app_name]', "the main app generate method"
|
17
|
+
method_options :templates => :optional
|
18
|
+
def generate(app_name, type=:rails)
|
19
|
+
case type
|
20
|
+
when :rails
|
21
|
+
puts "Generating rails project #{app_name}..."
|
22
|
+
system("rails #{app_name}")
|
23
|
+
if options[:templates]
|
24
|
+
executor = Beet::Executor.new(options[:templates], app_name)
|
25
|
+
executor.run_templates
|
26
|
+
end
|
27
|
+
else
|
28
|
+
puts "type not recognized!"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
desc 'version', "the current version of beet"
|
33
|
+
def version
|
34
|
+
version_file = Dir.pwd + '/VERSION'
|
35
|
+
if File.exists?(version_file) and version = File.read(version_file)
|
36
|
+
puts "Beet version: #{version}"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
desc 'help', 'help output'
|
41
|
+
def help
|
42
|
+
puts %{
|
43
|
+
Usage: #{$0} /path/to/your/app [options]
|
44
|
+
|
45
|
+
Options:
|
46
|
+
|
47
|
+
Beet Info:
|
48
|
+
-v, --version Show the Beet version number and quit.
|
49
|
+
-h, --help Show this help message and quit.
|
50
|
+
|
51
|
+
General Options:
|
52
|
+
|
53
|
+
Description:
|
54
|
+
Beet is used to quickly generate applications.
|
55
|
+
|
56
|
+
Example:
|
57
|
+
beet example_app --git --clean_files
|
58
|
+
}
|
59
|
+
end
|
60
|
+
end
|
61
|
+
BeetRunner.start
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Beet
|
2
|
+
module Execution
|
3
|
+
# Executes a command
|
4
|
+
#
|
5
|
+
# ==== Example
|
6
|
+
#
|
7
|
+
# inside('vendor') do
|
8
|
+
# run('ln -s ~/edge rails)
|
9
|
+
# end
|
10
|
+
#
|
11
|
+
def run(command, log_action = true)
|
12
|
+
log 'executing', "#{command} from #{Dir.pwd}" if log_action
|
13
|
+
`#{command}`
|
14
|
+
end
|
15
|
+
|
16
|
+
# Executes a ruby script (taking into account WIN32 platform quirks)
|
17
|
+
def run_ruby_script(command, log_action = true)
|
18
|
+
ruby_command = RUBY_PLATFORM=~ /win32/ ? 'ruby ' : ''
|
19
|
+
run("#{ruby_command}#{command}", log_action)
|
20
|
+
end
|
21
|
+
|
22
|
+
# Runs the supplied rake task
|
23
|
+
#
|
24
|
+
# ==== Example
|
25
|
+
#
|
26
|
+
# rake("db:migrate")
|
27
|
+
# rake("db:migrate", :env => "production")
|
28
|
+
# rake("gems:install", :sudo => true)
|
29
|
+
#
|
30
|
+
def rake(command, options = {})
|
31
|
+
log 'rake', command
|
32
|
+
env = options[:env] || 'development'
|
33
|
+
sudo = options[:sudo] ? 'sudo ' : ''
|
34
|
+
in_root { run("#{sudo}rake #{command} RAILS_ENV=#{env}", false) }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'open-uri'
|
2
|
+
module Beet
|
3
|
+
class Executor
|
4
|
+
include Beet::Execution
|
5
|
+
include Beet::FileSystem
|
6
|
+
include Beet::Interaction
|
7
|
+
include Beet::Logging
|
8
|
+
|
9
|
+
# TODO create a better way to mixin things from rails/whatever as needed
|
10
|
+
include Beet::Rails
|
11
|
+
include Beet::Capistrano
|
12
|
+
include Beet::SCM
|
13
|
+
|
14
|
+
attr_reader :root
|
15
|
+
attr_writer :logger
|
16
|
+
attr_accessor :templates, :app_name
|
17
|
+
|
18
|
+
def initialize(templates, app_name) # :nodoc:
|
19
|
+
@root = File.expand_path(File.join(Dir.pwd, app_name))
|
20
|
+
@templates = []
|
21
|
+
templates.split(/[\s,]+/).each do |template|
|
22
|
+
@templates << (if !File.exists?(template) and !template.include?('http')
|
23
|
+
# they're trying to use a named template from the templates directory
|
24
|
+
File.expand_path(File.join(File.dirname(__FILE__), 'templates', "#{template}.rb"))
|
25
|
+
else
|
26
|
+
template
|
27
|
+
end)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def run_templates
|
32
|
+
@templates.each do |template|
|
33
|
+
begin
|
34
|
+
code = open(template).read
|
35
|
+
in_root { self.instance_eval(code) }
|
36
|
+
rescue LoadError, Errno::ENOENT => e
|
37
|
+
raise "The template [#{template}] could not be loaded. Error: #{e}"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
module Beet
|
3
|
+
module FileSystem
|
4
|
+
# Create a new file in the project folder. Specify the
|
5
|
+
# relative path from the project's root. Data is the return value of a block
|
6
|
+
# or a data string.
|
7
|
+
#
|
8
|
+
# ==== Examples
|
9
|
+
#
|
10
|
+
# file("lib/fun_party.rb") do
|
11
|
+
# hostname = ask("What is the virtual hostname I should use?")
|
12
|
+
# "vhost.name = #{hostname}"
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
# file("config/apach.conf", "your apache config")
|
16
|
+
#
|
17
|
+
def file(filename, data = nil, log_action = true, &block)
|
18
|
+
log 'file', filename if log_action
|
19
|
+
dir, file = [File.dirname(filename), File.basename(filename)]
|
20
|
+
|
21
|
+
inside(dir) do
|
22
|
+
File.open(file, "w") do |f|
|
23
|
+
if block_given?
|
24
|
+
f.write(block.call)
|
25
|
+
else
|
26
|
+
f.write(data)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# Create a new file in the lib/ directory. Code can be specified
|
33
|
+
# in a block or a data string can be given.
|
34
|
+
#
|
35
|
+
# ==== Examples
|
36
|
+
#
|
37
|
+
# lib("crypto.rb") do
|
38
|
+
# "crypted_special_value = '#{rand}--#{Time.now}--#{rand(1337)}--'"
|
39
|
+
# end
|
40
|
+
#
|
41
|
+
# lib("foreign.rb", "# Foreign code is fun")
|
42
|
+
#
|
43
|
+
def lib(filename, data = nil, &block)
|
44
|
+
log 'lib', filename
|
45
|
+
file("lib/#{filename}", data, false, &block)
|
46
|
+
end
|
47
|
+
|
48
|
+
# Create a new Rakefile with the provided code (either in a block or a string).
|
49
|
+
#
|
50
|
+
# ==== Examples
|
51
|
+
#
|
52
|
+
# rakefile("bootstrap.rake") do
|
53
|
+
# project = ask("What is the UNIX name of your project?")
|
54
|
+
#
|
55
|
+
# <<-TASK
|
56
|
+
# namespace :#{project} do
|
57
|
+
# task :bootstrap do
|
58
|
+
# puts "i like boots!"
|
59
|
+
# end
|
60
|
+
# end
|
61
|
+
# TASK
|
62
|
+
# end
|
63
|
+
#
|
64
|
+
# rakefile("seed.rake", "puts 'im plantin ur seedz'")
|
65
|
+
#
|
66
|
+
def rakefile(filename, data = nil, &block)
|
67
|
+
log 'rakefile', filename
|
68
|
+
file("lib/tasks/#{filename}", data, false, &block)
|
69
|
+
end
|
70
|
+
|
71
|
+
# Do something in the root of the project or
|
72
|
+
# a provided subfolder; the full path is yielded to the block you provide.
|
73
|
+
# The path is set back to the previous path when the method exits.
|
74
|
+
def inside(dir = '', &block)
|
75
|
+
folder = File.join(root, dir)
|
76
|
+
FileUtils.mkdir_p(folder) unless File.exist?(folder)
|
77
|
+
FileUtils.cd(folder) { block.arity == 1 ? yield(folder) : yield }
|
78
|
+
end
|
79
|
+
|
80
|
+
def in_root
|
81
|
+
FileUtils.cd(root) { yield }
|
82
|
+
end
|
83
|
+
|
84
|
+
# Run a regular expression replacement on a file
|
85
|
+
#
|
86
|
+
# ==== Example
|
87
|
+
#
|
88
|
+
# gsub_file 'app/controllers/application_controller.rb', /#\s*(filter_parameter_logging :password)/, '\1'
|
89
|
+
#
|
90
|
+
def gsub_file(relative_destination, regexp, *args, &block)
|
91
|
+
path = destination_path(relative_destination)
|
92
|
+
content = File.read(path).gsub(regexp, *args, &block)
|
93
|
+
File.open(path, 'wb') { |file| file.write(content) }
|
94
|
+
end
|
95
|
+
|
96
|
+
# Append text to a file
|
97
|
+
#
|
98
|
+
# ==== Example
|
99
|
+
#
|
100
|
+
# append_file 'config/environments/test.rb', 'config.gem "rspec"'
|
101
|
+
#
|
102
|
+
def append_file(relative_destination, data)
|
103
|
+
path = destination_path(relative_destination)
|
104
|
+
File.open(path, 'ab') { |file| file.write(data) }
|
105
|
+
end
|
106
|
+
|
107
|
+
def destination_path(relative_destination)
|
108
|
+
File.join(root, relative_destination)
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
112
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Beet
|
2
|
+
module Interaction
|
3
|
+
# Get a user's input
|
4
|
+
#
|
5
|
+
# ==== Example
|
6
|
+
#
|
7
|
+
# answer = ask("Should I freeze the latest Rails?")
|
8
|
+
# freeze! if ask("Should I freeze the latest Rails?") == "yes"
|
9
|
+
#
|
10
|
+
def ask(string)
|
11
|
+
log '', string
|
12
|
+
STDIN.gets.strip
|
13
|
+
end
|
14
|
+
|
15
|
+
# Helper to test if the user says yes(y)?
|
16
|
+
#
|
17
|
+
# ==== Example
|
18
|
+
#
|
19
|
+
# freeze! if yes?("Should I freeze the latest Rails?")
|
20
|
+
#
|
21
|
+
def yes?(question)
|
22
|
+
answer = ask(question).downcase
|
23
|
+
answer == "y" || answer == "yes"
|
24
|
+
end
|
25
|
+
|
26
|
+
# Helper to test if the user does NOT say yes(y)?
|
27
|
+
#
|
28
|
+
# ==== Example
|
29
|
+
#
|
30
|
+
# capify! if no?("Will you be using vlad to deploy your application?")
|
31
|
+
#
|
32
|
+
def no?(question)
|
33
|
+
!yes?(question)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/beet/logging.rb
ADDED
data/lib/beet/rails.rb
ADDED
@@ -0,0 +1,146 @@
|
|
1
|
+
module Beet
|
2
|
+
module Rails
|
3
|
+
# Make an entry in Rails routing file conifg/routes.rb
|
4
|
+
#
|
5
|
+
# === Example
|
6
|
+
#
|
7
|
+
# route "map.root :controller => :welcome"
|
8
|
+
#
|
9
|
+
def route(routing_code)
|
10
|
+
log 'route', routing_code
|
11
|
+
sentinel = 'ActionController::Routing::Routes.draw do |map|'
|
12
|
+
|
13
|
+
in_root do
|
14
|
+
gsub_file 'config/routes.rb', /(#{Regexp.escape(sentinel)})/mi do |match|
|
15
|
+
"#{match}\n #{routing_code}\n"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# Add Rails to /vendor/rails
|
21
|
+
#
|
22
|
+
# ==== Example
|
23
|
+
#
|
24
|
+
# freeze!
|
25
|
+
#
|
26
|
+
def freeze!(args = {})
|
27
|
+
log 'vendor', 'rails edge'
|
28
|
+
in_root { run('rake rails:freeze:edge', false) }
|
29
|
+
end
|
30
|
+
|
31
|
+
# Install a plugin. You must provide either a Subversion url or Git url.
|
32
|
+
# For a Git-hosted plugin, you can specify if it should be added as a submodule instead of cloned.
|
33
|
+
#
|
34
|
+
# ==== Examples
|
35
|
+
#
|
36
|
+
# plugin 'restful-authentication', :git => 'git://github.com/technoweenie/restful-authentication.git'
|
37
|
+
# plugin 'restful-authentication', :git => 'git://github.com/technoweenie/restful-authentication.git', :submodule => true
|
38
|
+
# plugin 'restful-authentication', :svn => 'svn://svnhub.com/technoweenie/restful-authentication/trunk'
|
39
|
+
#
|
40
|
+
def plugin(name, options)
|
41
|
+
log 'plugin', name
|
42
|
+
|
43
|
+
if options[:git] && options[:submodule]
|
44
|
+
in_root do
|
45
|
+
Git.run("submodule add #{options[:git]} vendor/plugins/#{name}")
|
46
|
+
end
|
47
|
+
elsif options[:git] || options[:svn]
|
48
|
+
in_root do
|
49
|
+
run_ruby_script("script/plugin install #{options[:svn] || options[:git]}", false)
|
50
|
+
end
|
51
|
+
else
|
52
|
+
log "! no git or svn provided for #{name}. skipping..."
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# Adds an entry into config/environment.rb for the supplied gem :
|
57
|
+
def gem(name, options = {})
|
58
|
+
log 'gem', name
|
59
|
+
env = options.delete(:env)
|
60
|
+
|
61
|
+
gems_code = "config.gem '#{name}'"
|
62
|
+
|
63
|
+
if options.any?
|
64
|
+
opts = options.inject([]) {|result, h| result << [":#{h[0]} => #{h[1].inspect.gsub('"',"'")}"] }.sort.join(", ")
|
65
|
+
gems_code << ", #{opts}"
|
66
|
+
end
|
67
|
+
|
68
|
+
environment gems_code, :env => env
|
69
|
+
end
|
70
|
+
|
71
|
+
# Adds a line inside the Initializer block for config/environment.rb. Used by #gem
|
72
|
+
# If options :env is specified, the line is appended to the corresponding
|
73
|
+
# file in config/environments/#{env}.rb
|
74
|
+
def environment(data = nil, options = {}, &block)
|
75
|
+
sentinel = 'Rails::Initializer.run do |config|'
|
76
|
+
|
77
|
+
data = block.call if !data && block_given?
|
78
|
+
|
79
|
+
in_root do
|
80
|
+
if options[:env].nil?
|
81
|
+
gsub_file 'config/environment.rb', /(#{Regexp.escape(sentinel)})/mi do |match|
|
82
|
+
"#{match}\n " << data
|
83
|
+
end
|
84
|
+
else
|
85
|
+
Array.wrap(options[:env]).each do|env|
|
86
|
+
append_file "config/environments/#{env}.rb", "\n#{data}"
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
# Create a new file in the vendor/ directory. Code can be specified
|
93
|
+
# in a block or a data string can be given.
|
94
|
+
#
|
95
|
+
# ==== Examples
|
96
|
+
#
|
97
|
+
# vendor("sekrit.rb") do
|
98
|
+
# sekrit_salt = "#{Time.now}--#{3.years.ago}--#{rand}--"
|
99
|
+
# "salt = '#{sekrit_salt}'"
|
100
|
+
# end
|
101
|
+
#
|
102
|
+
# vendor("foreign.rb", "# Foreign code is fun")
|
103
|
+
#
|
104
|
+
def vendor(filename, data = nil, &block)
|
105
|
+
log 'vendoring', filename
|
106
|
+
file("vendor/#{filename}", data, false, &block)
|
107
|
+
end
|
108
|
+
|
109
|
+
|
110
|
+
# Create a new initializer with the provided code (either in a block or a string).
|
111
|
+
#
|
112
|
+
# ==== Examples
|
113
|
+
#
|
114
|
+
# initializer("globals.rb") do
|
115
|
+
# data = ""
|
116
|
+
#
|
117
|
+
# ['MY_WORK', 'ADMINS', 'BEST_COMPANY_EVAR'].each do
|
118
|
+
# data << "#{const} = :entp"
|
119
|
+
# end
|
120
|
+
#
|
121
|
+
# data
|
122
|
+
# end
|
123
|
+
#
|
124
|
+
# initializer("api.rb", "API_KEY = '123456'")
|
125
|
+
#
|
126
|
+
def initializer(filename, data = nil, &block)
|
127
|
+
log 'initializer', filename
|
128
|
+
file("config/initializers/#{filename}", data, false, &block)
|
129
|
+
end
|
130
|
+
|
131
|
+
# Generate something using a generator from Rails or a plugin.
|
132
|
+
# The second parameter is the argument string that is passed to
|
133
|
+
# the generator or an Array that is joined.
|
134
|
+
#
|
135
|
+
# ==== Example
|
136
|
+
#
|
137
|
+
# generate(:authenticated, "user session")
|
138
|
+
#
|
139
|
+
def generate(what, *args)
|
140
|
+
log 'generating', what
|
141
|
+
argument = args.map {|arg| arg.to_s }.flatten.join(" ")
|
142
|
+
|
143
|
+
in_root { run_ruby_script("script/generate #{what} #{argument}", false) }
|
144
|
+
end
|
145
|
+
end # Rails
|
146
|
+
end # Beet
|
data/lib/beet/scm/git.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
class Git < Scm
|
2
|
+
def self.clone(repos, branch=nil)
|
3
|
+
system("git clone #{repos}")
|
4
|
+
|
5
|
+
if branch
|
6
|
+
system("cd #{repos.split('/').last}/")
|
7
|
+
system("git checkout #{branch}")
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.run(command)
|
12
|
+
system("git #{command}")
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
data/lib/beet/scm/svn.rb
ADDED
data/lib/beet/scm.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
class Scm
|
2
|
+
|
3
|
+
private
|
4
|
+
|
5
|
+
def self.hash_to_parameters(hash)
|
6
|
+
hash.collect { |key, value| "--#{key} #{(value.kind_of?(String) ? value : "")}"}.join(" ")
|
7
|
+
end
|
8
|
+
end
|
9
|
+
require File.dirname(__FILE__) + '/scm/git'
|
10
|
+
require File.dirname(__FILE__) + '/scm/svn'
|
11
|
+
|
12
|
+
module Beet
|
13
|
+
module SCM
|
14
|
+
# Run a command in git.
|
15
|
+
#
|
16
|
+
# ==== Examples
|
17
|
+
#
|
18
|
+
# git :init
|
19
|
+
# git :add => "this.file that.rb"
|
20
|
+
# git :add => "onefile.rb", :rm => "badfile.cxx"
|
21
|
+
#
|
22
|
+
def git(command = {})
|
23
|
+
in_root do
|
24
|
+
if command.is_a?(Symbol)
|
25
|
+
log 'running', "git #{command}"
|
26
|
+
Git.run(command.to_s)
|
27
|
+
else
|
28
|
+
command.each do |command, options|
|
29
|
+
log 'running', "git #{command} #{options}"
|
30
|
+
Git.run("#{command} #{options}")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
["./tmp/pids", "./tmp/sessions", "./tmp/sockets", "./tmp/cache"].each do |f|
|
2
|
+
run("rmdir ./#{f}")
|
3
|
+
end
|
4
|
+
|
5
|
+
run("find . \\( -type d -empty \\) -and \\( -not -regex ./\\.git.* \\) -exec touch {}/.gitignore \\;")
|
6
|
+
|
7
|
+
git :init
|
8
|
+
|
9
|
+
file '.gitignore', <<-CODE
|
10
|
+
log/\\*.log
|
11
|
+
log/\\*.pid
|
12
|
+
db/\\*.db
|
13
|
+
db/\\*.sqlite3
|
14
|
+
db/schema.rb
|
15
|
+
tmp/\\*\\*/\\*
|
16
|
+
.DS_Store
|
17
|
+
doc/api
|
18
|
+
doc/app
|
19
|
+
config/database.yml
|
20
|
+
CODE
|
21
|
+
|
22
|
+
git :add => "."
|
23
|
+
|
24
|
+
git :commit => "-m 'Initial commit. Enjoy.'"
|
data/lib/beet.rb
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
# TODO similarly, figure out how to require things as needed by the template
|
2
|
+
require 'beet/execution'
|
3
|
+
require 'beet/file_system'
|
4
|
+
require 'beet/interaction'
|
5
|
+
require 'beet/logging'
|
6
|
+
require 'beet/capistrano'
|
7
|
+
require 'beet/rails'
|
8
|
+
require 'beet/scm'
|
9
|
+
require 'beet/executor'
|
data/spec/beet_spec.rb
ADDED
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: jackdempsey-beet
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jack Dempsey
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-05-20 00:00:00 -07:00
|
13
|
+
default_executable: beet
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description:
|
17
|
+
email: jack.dempsey@gmail.com
|
18
|
+
executables:
|
19
|
+
- beet
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files:
|
23
|
+
- LICENSE
|
24
|
+
- README.rdoc
|
25
|
+
files:
|
26
|
+
- LICENSE
|
27
|
+
- README.rdoc
|
28
|
+
- Rakefile
|
29
|
+
- TODO
|
30
|
+
- VERSION
|
31
|
+
- beet.gemspec
|
32
|
+
- bin/beet
|
33
|
+
- lib/beet.rb
|
34
|
+
- lib/beet/capistrano.rb
|
35
|
+
- lib/beet/execution.rb
|
36
|
+
- lib/beet/executor.rb
|
37
|
+
- lib/beet/file_system.rb
|
38
|
+
- lib/beet/interaction.rb
|
39
|
+
- lib/beet/logging.rb
|
40
|
+
- lib/beet/rails.rb
|
41
|
+
- lib/beet/scm.rb
|
42
|
+
- lib/beet/scm/git.rb
|
43
|
+
- lib/beet/scm/svn.rb
|
44
|
+
- lib/beet/templates/rails/clean_files.rb
|
45
|
+
- lib/beet/templates/rails/git.rb
|
46
|
+
- lib/beet/templates/rails/jquery.rb
|
47
|
+
- spec/beet_spec.rb
|
48
|
+
- spec/spec_helper.rb
|
49
|
+
has_rdoc: false
|
50
|
+
homepage: http://github.com/jackdempsey/beet
|
51
|
+
post_install_message:
|
52
|
+
rdoc_options:
|
53
|
+
- --charset=UTF-8
|
54
|
+
require_paths:
|
55
|
+
- lib
|
56
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: "0"
|
61
|
+
version:
|
62
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - ">="
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: "0"
|
67
|
+
version:
|
68
|
+
requirements: []
|
69
|
+
|
70
|
+
rubyforge_project:
|
71
|
+
rubygems_version: 1.2.0
|
72
|
+
signing_key:
|
73
|
+
specification_version: 3
|
74
|
+
summary: A gem to help with easily generating projects
|
75
|
+
test_files:
|
76
|
+
- spec/beet_spec.rb
|
77
|
+
- spec/spec_helper.rb
|