penchant 0.0.1

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/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,10 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in penchant.gemspec
4
+ gemspec
5
+
6
+ gem 'guard'
7
+ gem 'guard-rspec'
8
+ gem 'mocha'
9
+ gem 'fakefs'
10
+ gem 'rspec', '~> 2.6.0'
data/Guardfile ADDED
@@ -0,0 +1,9 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard 'rspec', :cli => '-c', :version => 2 do
5
+ watch(%r{^spec/.+_spec\.rb$})
6
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
7
+ watch('spec/spec_helper.rb') { "spec" }
8
+ end
9
+
data/README.md ADDED
@@ -0,0 +1,65 @@
1
+ # I have a penchant for setting up all my projects so they work the same.
2
+
3
+ I like to do these things in all my projects:
4
+
5
+ * Have all my tests run before committing. I don't like buying ice cream for the team on test failures.
6
+ * If I'm developing gems alongside this project, I use a `Gemfile.erb` to get around the "one gem, one source" issue in
7
+ current versions of Bundler.
8
+ * If I'm moving to different machines or (heaven forbid!) having other developers work on the project, I want to make
9
+ getting all those local gems as easy as possible.
10
+
11
+ This gem makes that easier!
12
+
13
+ ## What's it do?
14
+
15
+ Installs a bunch of scripts into the `scripts` directory of your project:
16
+
17
+ * `gemfile` which switches between `Gemfile.erb` environments
18
+ * `install-git-hooks` which will do just what it says
19
+ * `hooks/pre-commit`, one of the hooks the prior script installs
20
+ * `initialize-environment`, which bootstraps your local environment so you can get up and running
21
+
22
+ ## initialize-environment
23
+
24
+ It will also try to run `rake bootstrap`, so add a `:bootstrap` task for things that should happen when you start going
25
+ (make databases, other stuff, etc, whatever). This won't run if the `:bootstrap` task is not there.
26
+
27
+ ## Gemfile.erb?!
28
+
29
+ Yeah, it's a `Gemfile` with ERB in it:
30
+
31
+ ``` erb
32
+ <% env :local do %>
33
+ gem 'guard', :path => '../guard'
34
+ <% end %>
35
+
36
+ <% env :remote do %>
37
+ gem 'guard', :git => 'git://github.com/johnbintz/guard.git'
38
+ <% end %>
39
+ ```
40
+
41
+ Use `script/gemfile local` to get at the local ones, and `script/gemfile remote` to get at the remote ones.
42
+ It then runs `bundle install`.
43
+
44
+ You can also run `penchant gemfile ENV`.
45
+
46
+ ### What environment are you currently using in that Gemfile?
47
+
48
+ `head -n 1` that puppy, or `penchant gemfile-env`.
49
+
50
+ ## git hook?!
51
+
52
+ It runs `penchant gemfile remote` then runs `bundle exec rake`. Make sure your default Rake task for the project runs your
53
+ tests and performs any other magic necessary before each commit. Your re-environmented Gemfile and Gemfile.lock will be added
54
+ to your commit if they've changed.
55
+
56
+ ## How?!
57
+
58
+ * `gem install penchant`
59
+ * `cd` to your project directory
60
+
61
+ And then one of the following:
62
+
63
+ * `penchant install` for a new project (`--dir=WHEREVER` will install the scripts to a directory other than `$PWD/scripts`)
64
+ * `penchant convert` for an existing project (`--dir=WHEVEVER` works here, too)
65
+
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
data/bin/penchant ADDED
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'thor'
5
+ require 'penchant'
6
+
7
+ class PenchantCLI < Thor
8
+ include Thor::Actions
9
+ source_root File.expand_path('../..', __FILE__)
10
+
11
+ desc "install", "Copy the common scripts to the project"
12
+ method_options :dir => 'script'
13
+ def install
14
+ directory 'template/script', options[:dir]
15
+ Dir[File.join(options[:dir], '**/*')].each { |file| File.chmod(0755, file) }
16
+ end
17
+
18
+ desc "convert", "Make an existing project Penchant-isized"
19
+ method_options :dir => 'script'
20
+ def convert
21
+ install
22
+ copy_file 'Gemfile', 'Gemfile.erb'
23
+ remove_file 'Gemfile'
24
+ gemfile(:remote)
25
+ end
26
+
27
+ desc "gemfile ENV", "Switch the gemfile environment"
28
+ def gemfile(env)
29
+ Penchant::Gemfile.do_full_env_switch!(env)
30
+ end
31
+
32
+ desc "gemfile-env", "Get the gemfile environment"
33
+ def gemfile_env
34
+ gemfile = Penchant::Gemfile.new
35
+ puts gemfile.environment
36
+ end
37
+ end
38
+
39
+ PenchantCLI.start
@@ -0,0 +1,65 @@
1
+ require 'erb'
2
+
3
+ module Penchant
4
+ class Gemfile
5
+ attr_reader :path
6
+
7
+ class << self
8
+ def do_full_env_switch!(env)
9
+ gemfile = Penchant::Gemfile.new
10
+ if !gemfile.has_gemfile_erb?
11
+ puts "Not using Gemfile.erb, exiting."
12
+ return false
13
+ end
14
+
15
+ gemfile.switch_to!(env)
16
+ system %{bundle}
17
+ end
18
+ end
19
+
20
+ def initialize(path = Dir.pwd)
21
+ @path = path
22
+ end
23
+
24
+ def gemfile_path
25
+ file_in_path('Gemfile')
26
+ end
27
+
28
+ def has_gemfile?
29
+ File.file?('Gemfile')
30
+ end
31
+
32
+ def gemfile_erb_path
33
+ file_in_path('Gemfile.erb')
34
+ end
35
+
36
+ def has_gemfile_erb?
37
+ File.file?(gemfile_erb_path)
38
+ end
39
+
40
+ def environment
41
+ File.readlines(gemfile_path).first.strip[%r{environment: (.*)}, 1]
42
+ end
43
+
44
+ def switch_to!(gemfile_env = nil)
45
+ @env = gemfile_env
46
+ template = File.read(gemfile_erb_path)
47
+
48
+ File.open(gemfile_path, 'wb') do |fh|
49
+ fh.puts "# generated by penchant, environment: #{@env}"
50
+
51
+ fh.print ERB.new(template).result(binding)
52
+ end
53
+ end
54
+
55
+ private
56
+ def file_in_path(file)
57
+ File.join(@path, file)
58
+ end
59
+
60
+ def env(check, &block)
61
+ instance_eval(&block) if check.to_s == @env.to_s
62
+ end
63
+ end
64
+ end
65
+
@@ -0,0 +1,3 @@
1
+ module Penchant
2
+ VERSION = "0.0.1"
3
+ end
data/lib/penchant.rb ADDED
@@ -0,0 +1,3 @@
1
+ module Penchant
2
+ autoload :Gemfile, 'penchant/gemfile'
3
+ end
data/penchant.gemspec ADDED
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "penchant/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "penchant"
7
+ s.version = Penchant::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["John Bintz"]
10
+ s.email = ["john@coswellproductions.com"]
11
+ s.homepage = ""
12
+ s.summary = %q{Things I do for my Rails projects to get up to speed in new environments fast}
13
+ s.description = %q{Things I do for my Rails projects to get up to speed in new environments fast}
14
+
15
+ s.rubyforge_project = "penchant"
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+ end
@@ -0,0 +1,109 @@
1
+ require 'spec_helper'
2
+
3
+ describe Penchant::Gemfile do
4
+ include FakeFS::SpecHelpers
5
+
6
+ let(:dir) { File.expand_path(Dir.pwd) }
7
+ let(:gemfile) { described_class.new(dir) }
8
+
9
+ let(:gemfile_path) { File.join(dir, 'Gemfile') }
10
+ let(:gemfile_erb_path) { File.join(dir, 'Gemfile.erb') }
11
+
12
+ def write_file(path, content = nil)
13
+ File.open(path, 'wb') do |fh|
14
+ content = yield if block_given?
15
+ fh.print content
16
+ end
17
+ end
18
+
19
+ subject { gemfile }
20
+
21
+ context 'with no gemfile' do
22
+ it { should_not have_gemfile }
23
+ it { should_not have_gemfile_erb }
24
+ end
25
+
26
+ context 'with gemfile' do
27
+ let(:data) { "whatever" }
28
+
29
+ before do
30
+ write_file(gemfile_path) { data }
31
+ end
32
+
33
+ describe 'existence' do
34
+ it { should have_gemfile }
35
+ it { should_not have_gemfile_erb }
36
+ end
37
+
38
+ describe '#environment' do
39
+ context 'not defined' do
40
+ its(:environment) { should be_nil }
41
+ end
42
+
43
+ context 'defined' do
44
+ let(:environment) { 'test' }
45
+ let(:data) { <<-GEMFILE }
46
+ # generated by penchant, environment: #{environment}
47
+ GEMFILE
48
+
49
+ its(:environment) { should == environment }
50
+ end
51
+ end
52
+
53
+ describe '#switch_to!' do
54
+ it 'should raise an exception' do
55
+ expect { subject.switch_to!(:whatever) }.to raise_error(Errno::ENOENT)
56
+ end
57
+ end
58
+ end
59
+
60
+ context 'with gemfile.erb' do
61
+ let(:erb_data) { 'whatever' }
62
+
63
+ before do
64
+ write_file(gemfile_erb_path) { erb_data }
65
+ end
66
+
67
+ it { should_not have_gemfile }
68
+ it { should have_gemfile_erb }
69
+
70
+ describe '#switch_to!' do
71
+ let(:erb_data) { <<-ERB }
72
+ <% env :test do %>
73
+ test
74
+ <% end %>
75
+
76
+ <% env :not do %>
77
+ not
78
+ <% end %>
79
+
80
+ all
81
+ ERB
82
+
83
+ it 'should render test data' do
84
+ subject.switch_to!(:test)
85
+
86
+ File.read('Gemfile').should include('test')
87
+ File.read('Gemfile').should_not include('not')
88
+ File.read('Gemfile').should include('all')
89
+ end
90
+
91
+ it 'should not render test data' do
92
+ subject.switch_to!(:not)
93
+
94
+ File.read('Gemfile').should_not include('test')
95
+ File.read('Gemfile').should include('not')
96
+ File.read('Gemfile').should include('all')
97
+ end
98
+
99
+ it 'should not render either' do
100
+ subject.switch_to!
101
+
102
+ File.read('Gemfile').should_not include('test')
103
+ File.read('Gemfile').should_not include('not')
104
+ File.read('Gemfile').should include('all')
105
+ end
106
+ end
107
+ end
108
+ end
109
+
File without changes
@@ -0,0 +1,6 @@
1
+ require 'fakefs/spec_helpers'
2
+ require 'penchant'
3
+
4
+ RSpec.configure do |c|
5
+ c.mock_with :mocha
6
+ end
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'penchant'
5
+
6
+ if Penchant::Gemfile.do_full_env_switch!(ARGV[0])
7
+ puts "Gemfile switched to #{ARGV[0]}"
8
+ else
9
+ exit 0
10
+ end
11
+
@@ -0,0 +1,15 @@
1
+ #!/bin/bash
2
+
3
+ OLD_GIT_DIR=$GIT_DIR
4
+
5
+ if [ $(penchant gemfile-env) != "remote" ]; then
6
+ unset GIT_DIR
7
+ penchant gemfile remote
8
+ GIT_DIR=$OLD_GIT_DIR
9
+ git add Gemfile*
10
+ fi
11
+
12
+ bundle exec rake
13
+ R=$?
14
+ if [ $R -ne 0 ]; then exit $R; fi
15
+
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ if File.file?('Gemfile.erb')
4
+ pwd = Dir.pwd
5
+
6
+ Dir.chdir '..' do
7
+ File.readlines(File.join(pwd, 'Gemfile.erb')).find_all { |line| line[':git'] }.each do |line|
8
+ repo = line[%r{:git => (['"])(.*)\1}, 2]
9
+
10
+ puts "Installing #{repo}"
11
+ system %{git clone #{repo}}
12
+ end
13
+ end
14
+
15
+ puts "Bundling for local environment"
16
+ system %{script/gemfile local}
17
+ else
18
+ puts "Bundling..."
19
+ system %{bundle}
20
+ end
21
+
22
+ puts "Installing git hooks"
23
+ system %{script/install-git-hooks}
24
+
25
+ bundle = File.file?('Gemfile') ? 'bundle exec' : ''
26
+
27
+ command = [ bundle, 'rake', '-s', '-T', 'bootstrap' ]
28
+
29
+ if !(%x{#{command.join(' ')}}).empty?
30
+ puts "Trying to run rake bootstrap..."
31
+ system %{#{bundle} rake bootstrap}
32
+ end
33
+
34
+ puts "Done!"
35
+
@@ -0,0 +1,6 @@
1
+ #!/bin/bash
2
+
3
+ for hook in script/hooks/* ; do
4
+ ln -sf $PWD/$hook .git/hooks/${hook##*/}
5
+ done
6
+
metadata ADDED
@@ -0,0 +1,65 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: penchant
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - John Bintz
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-08-18 00:00:00.000000000Z
13
+ dependencies: []
14
+ description: Things I do for my Rails projects to get up to speed in new environments
15
+ fast
16
+ email:
17
+ - john@coswellproductions.com
18
+ executables:
19
+ - penchant
20
+ extensions: []
21
+ extra_rdoc_files: []
22
+ files:
23
+ - .gitignore
24
+ - Gemfile
25
+ - Guardfile
26
+ - README.md
27
+ - Rakefile
28
+ - bin/penchant
29
+ - lib/penchant.rb
30
+ - lib/penchant/gemfile.rb
31
+ - lib/penchant/version.rb
32
+ - penchant.gemspec
33
+ - spec/lib/penchant/gemfile_spec.rb
34
+ - spec/lib/penchant_spec.rb
35
+ - spec/spec_helper.rb
36
+ - template/script/gemfile
37
+ - template/script/hooks/pre-commit
38
+ - template/script/initialize-environment
39
+ - template/script/install-git-hooks
40
+ homepage: ''
41
+ licenses: []
42
+ post_install_message:
43
+ rdoc_options: []
44
+ require_paths:
45
+ - lib
46
+ required_ruby_version: !ruby/object:Gem::Requirement
47
+ none: false
48
+ requirements:
49
+ - - ! '>='
50
+ - !ruby/object:Gem::Version
51
+ version: '0'
52
+ required_rubygems_version: !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ! '>='
56
+ - !ruby/object:Gem::Version
57
+ version: '0'
58
+ requirements: []
59
+ rubyforge_project: penchant
60
+ rubygems_version: 1.8.6
61
+ signing_key:
62
+ specification_version: 3
63
+ summary: Things I do for my Rails projects to get up to speed in new environments
64
+ fast
65
+ test_files: []