bently 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ .DS_Store
2
+ .rvmrc
3
+ *.swap
4
+ *.swo
5
+ *.swp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in vimgolf.gemspec
4
+ # gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,8 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+
5
+ PLATFORMS
6
+ ruby
7
+
8
+ DEPENDENCIES
data/README.md ADDED
File without changes
data/bently.gemspec ADDED
@@ -0,0 +1,16 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'bently'
3
+ s.version = '0.0.0'
4
+ s.date = '2012-09-15'
5
+ s.summary = "Bently executes (bakes) predefined formulas (recipes)"
6
+ s.description = "Bently executes (bakes) predefined formulas (recipes) for trivial stuff you do a lot"
7
+ s.authors = ["Benjamin Sullivan"]
8
+ s.email = 'bsullivan2@gmail.com'
9
+ s.homepage = 'http://github.com/bonsaiben/bently'
10
+
11
+ s.add_dependency "thor", ">= 0.14.6"
12
+
13
+ s.files = `git ls-files`.split("\n")
14
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
15
+ s.require_paths = ["lib"]
16
+ end
data/bin/bently ADDED
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ lib = File.expand_path(File.dirname(__FILE__) + '/../lib')
4
+ $LOAD_PATH.unshift(lib) if File.directory?(lib) && !$LOAD_PATH.include?(lib)
5
+
6
+ require 'bently'
7
+ #begin
8
+ Bently::CLI.start
9
+ #rescue
10
+ # puts "Unexpected error. Quitting..."
11
+ # exit(1)
12
+ #end
data/lib/bently/cli.rb ADDED
@@ -0,0 +1,27 @@
1
+ module Bently
2
+
3
+ class CLI < Thor
4
+ include Thor::Actions
5
+
6
+ desc 'list', 'list recipes'
7
+ def list
8
+ Recipe.list.each {|f| puts f }
9
+ end
10
+
11
+ desc 'read [RECIPE]', 'display a recipe'
12
+ def read recipe_name
13
+ bake recipe_name, true
14
+ end
15
+
16
+ desc 'bake [RECIPE]', 'execute a recipe'
17
+ def bake(recipe_name, read_only=false)
18
+ if Recipe.list.include?(recipe_name)
19
+ recipe = Recipe.from_name(recipe_name).new(:read_only => read_only)
20
+ recipe.bake
21
+ else
22
+ puts "Recipe not found."
23
+ end
24
+ end
25
+ end
26
+
27
+ end
@@ -0,0 +1,40 @@
1
+ # some methods borrowed from ActiveSupport
2
+ # https://github.com/rails/rails/tree/master/activesupport
3
+ # MIT License (http://www.opensource.org/licenses/MIT)
4
+
5
+ class String
6
+
7
+ def camelize
8
+ string = self
9
+ string = string.sub(/^[a-z\d]*/) { $&.capitalize }
10
+ string = string.gsub(/\-/,'_')
11
+ string.gsub(/(?:_|(\/))([a-z\d]*)/i) { "#{$1}#{$2.capitalize}" }.gsub('/', '::')
12
+ end
13
+
14
+ def constantize
15
+ names = self.split('::')
16
+ names.shift if names.empty? || names.first.empty?
17
+
18
+ names.inject(Object) do |constant, name|
19
+ if constant == Object
20
+ constant.const_get(name)
21
+ else
22
+ candidate = constant.const_get(name)
23
+ next candidate if constant.const_defined?(name, false)
24
+ next candidate unless Object.const_defined?(name)
25
+
26
+ # Go down the ancestors to check it it's owned
27
+ # directly before we reach Object or the end of ancestors.
28
+ constant = constant.ancestors.inject do |const, ancestor|
29
+ break const if ancestor == Object
30
+ break ancestor if ancestor.const_defined?(name, false)
31
+ const
32
+ end
33
+
34
+ # owner is in Object, so raise
35
+ constant.const_get(name, false)
36
+ end
37
+ end
38
+ end
39
+
40
+ end
@@ -0,0 +1,3 @@
1
+ module Bently
2
+ BENTLY_REPOSITORY = File.expand_path(File.dirname(__FILE__) + '/../..')
3
+ end
@@ -0,0 +1,18 @@
1
+ module Bently
2
+
3
+ class Devise < Recipe
4
+ GEMFILE_DEF = "gem 'devise'"
5
+ RAILS_GENERATOR = "rails g devise:install"
6
+ MODEL_GENERATOR = "rails g devise"
7
+ ASK_MODEL_GENERATOR = "Model name:"
8
+
9
+ def bake
10
+ add_gem(GEMFILE_DEF) || return
11
+ bundle_install
12
+ command RAILS_GENERATOR
13
+ ask_command("#{MODEL_GENERATOR} MODEL", ASK_MODEL_GENERATOR){|a| "#{MODEL_GENERATOR} #{a}" }
14
+ super
15
+ end
16
+ end
17
+
18
+ end
@@ -0,0 +1,18 @@
1
+ module Bently
2
+
3
+ class Gitignore < Recipe
4
+
5
+ GITIGNORE =
6
+ %{.DS_Store
7
+ .rvmrc
8
+ *.swap
9
+ *.swo
10
+ *.swp
11
+ }
12
+
13
+ def bake
14
+ create_file ".gitignore", GITIGNORE
15
+ super
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,16 @@
1
+ module Bently
2
+
3
+ class HamlRails < Recipe
4
+
5
+ GEM_DEF =
6
+ %{gem 'haml'
7
+ gem 'haml-rails'}
8
+
9
+ def bake
10
+ add_gem GEM_DEF
11
+ bundle_install
12
+ super
13
+ end
14
+ end
15
+
16
+ end
@@ -0,0 +1,6 @@
1
+ module Bently
2
+
3
+ class Resque < Recipe
4
+ end
5
+
6
+ end
@@ -0,0 +1,18 @@
1
+ module Bently
2
+
3
+ class RspecRails < Recipe
4
+ GEMFILE_DEF = %{group :test, :development do
5
+ gem "rspec-rails", "~> 2.0"
6
+ end
7
+ }
8
+ RAILS_GENERATOR = "rails g rspec:install"
9
+
10
+ def bake
11
+ add_gem(GEMFILE_DEF)
12
+ bundle_install
13
+ command RAILS_GENERATOR
14
+ super
15
+ end
16
+ end
17
+
18
+ end
@@ -0,0 +1,17 @@
1
+ module Bently
2
+
3
+ class TwitterBootstrapRails < Recipe
4
+
5
+ GEMFILE_DEF = "gem \"twitter-bootstrap-rails\", :group => :assets"
6
+ RAILS_GENERATOR = "rails g bootstrap:install"
7
+
8
+ def bake
9
+ add_gem(GEMFILE_DEF) || return
10
+ bundle_install
11
+ command RAILS_GENERATOR
12
+ super
13
+ end
14
+
15
+ end
16
+
17
+ end
@@ -0,0 +1,18 @@
1
+ module Bently
2
+
3
+ class WelcomeIndex < Recipe
4
+
5
+ RAILS_GENERATE = 'bundle exec rails g controller welcome index'
6
+ ROUTES_FILE = 'config/routes.rb'
7
+ GSUB_SEARCH = /#\s*(root :to => 'welcome#index')/
8
+ GSUB_REPLACE = '\1'
9
+
10
+ def bake
11
+ command RAILS_GENERATE
12
+ gsub_file ROUTES_FILE, GSUB_SEARCH, GSUB_REPLACE
13
+ super
14
+ end
15
+
16
+ end
17
+
18
+ end
@@ -0,0 +1,133 @@
1
+ module Bently
2
+
3
+ class Recipe
4
+
5
+ BUNDLE_INSTALL = "bundle install"
6
+ RECIPE_DIR = "#{BENTLY_REPOSITORY}/lib/bently/recipe/*.rb"
7
+
8
+ # list all recipes
9
+ def self.list
10
+ Dir[RECIPE_DIR].map{ |f| File.basename f, '.rb' }.sort
11
+ end
12
+
13
+ # get recipe class from name
14
+ def self.from_name name
15
+ "Bently::#{name.camelize}".constantize
16
+ end
17
+
18
+
19
+
20
+ def initialize options={}
21
+ @read_only = options[:read_only]
22
+ end
23
+
24
+ # bake a recipe
25
+ def bake
26
+ puts_step "Done!"
27
+ end
28
+
29
+ protected
30
+
31
+ # instance to CLI
32
+ # for access to Thor helper methods
33
+ def cli; @cli ||= CLI.new end
34
+
35
+ # add a gem to the Gemfile
36
+ def add_gem gem_def
37
+ unless @read_only
38
+ if confirm_step "Add to Gemfile"
39
+ begin
40
+ cli.append_to_file 'Gemfile', gem_def
41
+ rescue
42
+ puts "Gemfile was not found. Aborting.."
43
+ return false
44
+ end
45
+ end
46
+ else
47
+ puts_quote_step "Add to Gemfile", gem_def
48
+ end
49
+ true
50
+ end
51
+
52
+ # run bundle install
53
+ def bundle_install
54
+ command BUNDLE_INSTALL
55
+ end
56
+
57
+ # execute a command
58
+ def command cmd
59
+ unless @read_only
60
+ puts `#{cmd}` if confirm_step cmd
61
+ else
62
+ puts_step cmd
63
+ end
64
+ end
65
+
66
+ # executes a command with user input
67
+ def ask_command cmd, prompt
68
+ unless @read_only
69
+ if confirm_step cmd
70
+ resp = cli.ask prompt
71
+ puts `#{yield resp}`
72
+ end
73
+ else
74
+ puts_step cmd
75
+ end
76
+ end
77
+
78
+ # creates a file
79
+ def create_file destination, data
80
+ unless @read_only
81
+ cli.create_file destination, data if confirm_step "Touch #{destination}"
82
+ else
83
+ puts_quote_step "Touch #{destination}", data
84
+ end
85
+ end
86
+
87
+ # gsubs a file
88
+ def gsub_file file, search, replace
89
+ unless @read_only
90
+ if confirm_step "Edit #{file}"
91
+ cli.gsub_file file, search, replace
92
+ end
93
+ else
94
+ puts_step "Edit #{file}"
95
+ end
96
+ end
97
+
98
+ # outputs a step with a blockquote
99
+ def puts_quote_step text, quote
100
+ puts_step "#{text}"
101
+ puts
102
+ puts "#{quote}"
103
+ puts
104
+ end
105
+
106
+ # outputs a step for confirmation
107
+ def confirm_step text
108
+ cli.yes? "#{magenta('==>')} #{bold(text)}?"
109
+ end
110
+
111
+ # outputs a step
112
+ def puts_step text
113
+ puts "#{magenta('==>')} #{bold(text)}"
114
+ end
115
+
116
+ # colorizes text
117
+ def colorize(text, color_code)
118
+ "#{color_code}#{text}\033[0m"
119
+ end
120
+
121
+ def red(text); colorize(text, "\033[31m"); end
122
+ def green(text); colorize(text, "\033[32m"); end
123
+ def magenta(text); colorize(text, "\033[35m"); end
124
+ def light_green(text); colorize(text, "\033[32m"); end
125
+ def bold(text); "\033[1m#{text}\033[22m"; end
126
+
127
+ end
128
+ end
129
+
130
+ # load recipes
131
+ Dir["#{Bently::BENTLY_REPOSITORY}/lib/bently/recipe/*.rb"].map{ |f| File.basename f, '.rb' }.each do |f|
132
+ require 'bently/recipe/' + f
133
+ end
data/lib/bently.rb ADDED
@@ -0,0 +1,7 @@
1
+ require 'thor'
2
+
3
+ require 'bently/core_ext/string'
4
+ require 'bently/globals'
5
+ require 'bently/cli'
6
+ require 'bently/recipe'
7
+
metadata ADDED
@@ -0,0 +1,76 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bently
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Benjamin Sullivan
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-09-15 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: thor
16
+ requirement: &2151891060 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 0.14.6
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *2151891060
25
+ description: Bently executes (bakes) predefined formulas (recipes) for trivial stuff
26
+ you do a lot
27
+ email: bsullivan2@gmail.com
28
+ executables:
29
+ - bently
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - .gitignore
34
+ - Gemfile
35
+ - Gemfile.lock
36
+ - README.md
37
+ - bently.gemspec
38
+ - bin/bently
39
+ - lib/bently.rb
40
+ - lib/bently/cli.rb
41
+ - lib/bently/core_ext/string.rb
42
+ - lib/bently/globals.rb
43
+ - lib/bently/recipe.rb
44
+ - lib/bently/recipe/devise.rb
45
+ - lib/bently/recipe/gitignore.rb
46
+ - lib/bently/recipe/haml-rails.rb
47
+ - lib/bently/recipe/resque.rb
48
+ - lib/bently/recipe/rspec-rails.rb
49
+ - lib/bently/recipe/twitter-bootstrap-rails.rb
50
+ - lib/bently/recipe/welcome-index.rb
51
+ homepage: http://github.com/bonsaiben/bently
52
+ licenses: []
53
+ post_install_message:
54
+ rdoc_options: []
55
+ require_paths:
56
+ - lib
57
+ required_ruby_version: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ required_rubygems_version: !ruby/object:Gem::Requirement
64
+ none: false
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ requirements: []
70
+ rubyforge_project:
71
+ rubygems_version: 1.8.17
72
+ signing_key:
73
+ specification_version: 3
74
+ summary: Bently executes (bakes) predefined formulas (recipes)
75
+ test_files: []
76
+ has_rdoc: