potassium 1.3.5 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (138) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rspec +3 -0
  4. data/.rubocop.yml +1 -1
  5. data/.ruby_style.yml +6 -2
  6. data/CHANGELOG.md +19 -1
  7. data/README.md +79 -74
  8. data/circle.yml +9 -0
  9. data/docs/CONTRIBUTING.md +132 -0
  10. data/docs/{dsl.md → DSL.md} +146 -18
  11. data/lib/potassium/{templates/application/assets → assets}/.bowerrc +0 -0
  12. data/lib/potassium/assets/.buildpacks +3 -0
  13. data/lib/potassium/{templates/application/assets → assets}/.editorconfig +0 -0
  14. data/lib/potassium/assets/.env.example.erb +8 -0
  15. data/lib/potassium/assets/.hound.yml +2 -0
  16. data/lib/potassium/{templates/application/assets → assets}/.pryrc +0 -0
  17. data/lib/potassium/assets/.rubocop.yml +3 -0
  18. data/lib/potassium/assets/.ruby_style.yml +0 -0
  19. data/lib/potassium/assets/Dockerfile.ci +4 -0
  20. data/lib/potassium/assets/Procfile +1 -0
  21. data/lib/potassium/assets/README.md.erb +2 -0
  22. data/lib/potassium/assets/README.yml +83 -0
  23. data/lib/potassium/{templates/application/assets → assets}/active_admin/active_admin.js.coffee +0 -0
  24. data/lib/potassium/{templates/application/assets → assets}/active_admin/admin_user_policy.rb +0 -0
  25. data/lib/potassium/{templates/application/assets → assets}/active_admin/comment_policy.rb +0 -0
  26. data/lib/potassium/{templates/application/assets → assets}/active_admin/init_activeadmin_angular.rb +0 -0
  27. data/lib/potassium/{templates/application/assets → assets}/active_admin/pundit_page_policy.rb +0 -0
  28. data/lib/potassium/{templates/application/assets → assets}/api/api_error_concern.rb +0 -0
  29. data/lib/potassium/{templates/application/assets → assets}/api/base_controller.rb +0 -0
  30. data/lib/potassium/{templates/application/assets → assets}/api/responder.rb +0 -0
  31. data/lib/potassium/assets/bin/cibuild.erb +27 -0
  32. data/lib/potassium/assets/bin/setup.erb +22 -0
  33. data/lib/potassium/assets/bin/setup_heroku.erb +21 -0
  34. data/lib/potassium/{templates/application/assets → assets}/bower.json +0 -0
  35. data/lib/potassium/assets/circle.yml +16 -0
  36. data/lib/potassium/assets/config/database_mysql.yml.erb +25 -0
  37. data/lib/potassium/assets/config/database_postgresql.yml.erb +25 -0
  38. data/lib/potassium/assets/config/environments/staging.rb +5 -0
  39. data/lib/potassium/assets/config/puma.rb +29 -0
  40. data/lib/potassium/assets/config/secrets.yml.erb +14 -0
  41. data/lib/potassium/assets/docker-compose.ci.yml +6 -0
  42. data/lib/potassium/{templates/application/assets → assets}/es.yml +0 -0
  43. data/lib/potassium/{templates/application/assets → assets}/testing/.rspec +0 -0
  44. data/lib/potassium/{templates/application/assets → assets}/testing/rails_helper.rb +0 -0
  45. data/lib/potassium/cli/commands/create.rb +55 -4
  46. data/lib/potassium/cli/commands/install.rb +27 -13
  47. data/lib/potassium/{templates/application/generator.rb → generators/application.rb} +7 -2
  48. data/lib/potassium/{templates/application/recipe_generator.rb → generators/recipe.rb} +11 -2
  49. data/lib/potassium/helpers/answer-helpers.rb +21 -0
  50. data/lib/potassium/{templates/application/helpers → helpers}/callback-helpers.rb +0 -0
  51. data/lib/potassium/helpers/docker-helpers.rb +37 -0
  52. data/lib/potassium/{templates/application/helpers → helpers}/environment-helpers.rb +0 -0
  53. data/lib/potassium/{templates/application/helpers → helpers}/gem-helpers.rb +6 -2
  54. data/lib/potassium/helpers/info-helpers.rb +16 -0
  55. data/lib/potassium/helpers/readme-helpers.rb +85 -0
  56. data/lib/potassium/{templates/application/helpers → helpers}/template-dsl.rb +8 -0
  57. data/lib/potassium/helpers/template-helpers.rb +97 -0
  58. data/lib/potassium/{templates/application/helpers → helpers}/variable-helpers.rb +0 -0
  59. data/lib/potassium/recipe.rb +2 -0
  60. data/lib/potassium/{templates/application/recipes → recipes}/admin.rb +36 -6
  61. data/lib/potassium/recipes/angular_admin.rb +56 -0
  62. data/lib/potassium/recipes/api.rb +43 -0
  63. data/lib/potassium/recipes/aws_sdk.rb +5 -0
  64. data/lib/potassium/recipes/bower.rb +13 -0
  65. data/lib/potassium/recipes/ci.rb +42 -0
  66. data/lib/potassium/recipes/cleanup.rb +10 -0
  67. data/lib/potassium/recipes/database.rb +42 -0
  68. data/lib/potassium/recipes/delayed_job.rb +41 -0
  69. data/lib/potassium/recipes/devise.rb +64 -0
  70. data/lib/potassium/recipes/editorconfig.rb +5 -0
  71. data/lib/potassium/recipes/env.rb +10 -0
  72. data/lib/potassium/recipes/git.rb +13 -0
  73. data/lib/potassium/recipes/github.rb +27 -0
  74. data/lib/potassium/recipes/heroku.rb +138 -0
  75. data/lib/potassium/recipes/i18n.rb +26 -0
  76. data/lib/potassium/recipes/paperclip.rb +37 -0
  77. data/lib/potassium/recipes/production.rb +7 -0
  78. data/lib/potassium/recipes/pry.rb +10 -0
  79. data/lib/potassium/recipes/puma.rb +19 -0
  80. data/lib/potassium/recipes/pundit.rb +61 -0
  81. data/lib/potassium/recipes/rack_cors.rb +21 -0
  82. data/lib/potassium/recipes/readme.rb +7 -0
  83. data/lib/potassium/recipes/ruby.rb +23 -0
  84. data/lib/potassium/recipes/script.rb +16 -0
  85. data/lib/potassium/recipes/secrets.rb +5 -0
  86. data/lib/potassium/recipes/staging.rb +5 -0
  87. data/lib/potassium/recipes/style.rb +13 -0
  88. data/lib/potassium/recipes/testing.rb +37 -0
  89. data/lib/potassium/templates/application.rb +67 -0
  90. data/lib/potassium/templates/recipe.rb +12 -0
  91. data/lib/potassium/text_spinner.rb +0 -5
  92. data/lib/potassium/version.rb +2 -1
  93. data/potassium.gemspec +3 -0
  94. data/spec/fakes/bin/heroku +5 -0
  95. data/spec/fakes/bin/hub +5 -0
  96. data/spec/features/ci_spec.rb +14 -0
  97. data/spec/features/github_spec.rb +22 -0
  98. data/spec/features/heroku_spec.rb +61 -0
  99. data/spec/features/new_project_spec.rb +38 -0
  100. data/spec/spec_helper.rb +33 -0
  101. data/spec/support/fake_github.rb +25 -0
  102. data/spec/support/fake_heroku.rb +77 -0
  103. data/spec/support/potassium_test_helpers.rb +98 -0
  104. metadata +149 -62
  105. data/lib/potassium/templates/application/assets/.rbenv-vars.example +0 -8
  106. data/lib/potassium/templates/application/assets/config/database_mysql.yml +0 -40
  107. data/lib/potassium/templates/application/assets/config/database_postgresql.yml +0 -26
  108. data/lib/potassium/templates/application/helpers/recipe-helpers.rb +0 -5
  109. data/lib/potassium/templates/application/helpers/template-helpers.rb +0 -35
  110. data/lib/potassium/templates/application/recipe_template.rb +0 -23
  111. data/lib/potassium/templates/application/recipes/angular_admin.rb +0 -26
  112. data/lib/potassium/templates/application/recipes/api.rb +0 -22
  113. data/lib/potassium/templates/application/recipes/asks/admin.rb +0 -9
  114. data/lib/potassium/templates/application/recipes/asks/api.rb +0 -2
  115. data/lib/potassium/templates/application/recipes/asks/database.rb +0 -9
  116. data/lib/potassium/templates/application/recipes/asks/devise.rb +0 -10
  117. data/lib/potassium/templates/application/recipes/asks/i18n.rb +0 -8
  118. data/lib/potassium/templates/application/recipes/asks/paperclip.rb +0 -2
  119. data/lib/potassium/templates/application/recipes/asks/pundit.rb +0 -4
  120. data/lib/potassium/templates/application/recipes/aws_sdk.rb +0 -1
  121. data/lib/potassium/templates/application/recipes/bower.rb +0 -3
  122. data/lib/potassium/templates/application/recipes/checks/devise.rb +0 -1
  123. data/lib/potassium/templates/application/recipes/database.rb +0 -22
  124. data/lib/potassium/templates/application/recipes/dependencies/admin.rb +0 -3
  125. data/lib/potassium/templates/application/recipes/devise.rb +0 -28
  126. data/lib/potassium/templates/application/recipes/editorconfig.rb +0 -1
  127. data/lib/potassium/templates/application/recipes/git.rb +0 -9
  128. data/lib/potassium/templates/application/recipes/i18n.rb +0 -9
  129. data/lib/potassium/templates/application/recipes/paperclip.rb +0 -20
  130. data/lib/potassium/templates/application/recipes/production.rb +0 -3
  131. data/lib/potassium/templates/application/recipes/pry.rb +0 -6
  132. data/lib/potassium/templates/application/recipes/pundit.rb +0 -33
  133. data/lib/potassium/templates/application/recipes/rack-cors.rb +0 -15
  134. data/lib/potassium/templates/application/recipes/rbenv.rb +0 -23
  135. data/lib/potassium/templates/application/recipes/readme.rb +0 -2
  136. data/lib/potassium/templates/application/recipes/testing.rb +0 -32
  137. data/lib/potassium/templates/application/recipes/unicorn.rb +0 -5
  138. data/lib/potassium/templates/application/template.rb +0 -58
@@ -0,0 +1,26 @@
1
+ class Recipes::I18n < Rails::AppBuilder
2
+ def ask
3
+ languages = {
4
+ es: "Spanish",
5
+ en: "English"
6
+ }
7
+
8
+ lang = answer(:lang) do
9
+ languages.keys[Ask.list("What is the main language of your app?", languages.values)]
10
+ end
11
+
12
+ set(:lang, lang)
13
+ end
14
+
15
+ def create
16
+ gather_gem('rails-i18n')
17
+
18
+ if equals?(:lang, :es)
19
+ template('../assets/es.yml', 'config/locales/es.yml')
20
+ end
21
+
22
+ gsub_file 'config/application.rb', /# config\.i18n\.default_locale =[^\n]+\n/ do
23
+ "config.i18n.default_locale = :#{get(:lang)}\n"
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,37 @@
1
+ class Recipes::Paperclip < Rails::AppBuilder
2
+ def ask
3
+ paperclip = answer(:paperclip) { Ask.confirm("Do you want to use Paperclip for uploads?") }
4
+ set(:paperclip, paperclip)
5
+ end
6
+
7
+ def create
8
+ add_paperclip if selected?(:paperclip)
9
+ end
10
+
11
+ def install
12
+ add_paperclip
13
+ end
14
+
15
+ def installed?
16
+ gem_exists?(/paperclip/)
17
+ end
18
+
19
+ private
20
+
21
+ def add_paperclip
22
+ gather_gem 'paperclip', '~> 4.3'
23
+ paperclip_config =
24
+ <<-RUBY.gsub(/^ {7}/, '')
25
+ config.paperclip_defaults = {
26
+ storage: :s3,
27
+ s3_credentials: {
28
+ bucket: ENV['AWS_BUCKET']
29
+ }
30
+ }
31
+ RUBY
32
+ application paperclip_config.strip, env: 'production'
33
+ append_to_file '.env.example', 'AWS_BUCKET='
34
+ append_to_file '.env', 'AWS_BUCKET='
35
+ add_readme_section :internal_dependencies, :paperclip
36
+ end
37
+ end
@@ -0,0 +1,7 @@
1
+ class Recipes::Production < Rails::AppBuilder
2
+ def create
3
+ gsub_file "config/environments/production.rb", /(\# config.action_mailer.+)/i do |match|
4
+ "#{match}\n config.action_mailer.default_options = { from: ENV['DEFAULT_EMAIL_ADDRESS'] }\n"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,10 @@
1
+ class Recipes::Pry < Rails::AppBuilder
2
+ def create
3
+ gather_gems(:development, :test) do
4
+ gather_gem('pry-rails')
5
+ gather_gem('pry-byebug')
6
+ end
7
+
8
+ template '../assets/.pryrc', '.pryrc'
9
+ end
10
+ end
@@ -0,0 +1,19 @@
1
+ class Recipes::Puma < Rails::AppBuilder
2
+ def create
3
+ gather_gem 'puma'
4
+
5
+ gather_gems(:production, :staging) do
6
+ gather_gem 'rack-timeout'
7
+ end
8
+
9
+ copy_file '../assets/config/puma.rb', 'config/puma.rb'
10
+
11
+ # Configure rack-timout
12
+ rack_timeout_config =
13
+ <<-RUBY.gsub(/^ {9}/, '')
14
+ Rack::Timeout.timeout = (ENV["RACK_TIMEOUT"] || 10).to_i
15
+ RUBY
16
+
17
+ append_file "config/environments/production.rb", rack_timeout_config
18
+ end
19
+ end
@@ -0,0 +1,61 @@
1
+ class Recipes::Pundit < Rails::AppBuilder
2
+ def ask
3
+ if get(:authentication).present?
4
+ use_pundit = answer(:pundit) { Ask.confirm("Do you want to use Pundit for authorization?") }
5
+ set(:authorization, use_pundit)
6
+ end
7
+ end
8
+
9
+ def create
10
+ if selected?(:authorization)
11
+ run_pundit_installer
12
+ recipe = self
13
+
14
+ if selected?(:admin_mode)
15
+ after(:admin_install) do
16
+ recipe.install_admin_pundit
17
+ end
18
+ end
19
+ end
20
+ end
21
+
22
+ def install
23
+ run_pundit_installer
24
+
25
+ active_admin = load_recipe(:admin)
26
+ install_admin_pundit if active_admin.installed?
27
+ end
28
+
29
+ def installed?
30
+ gem_exists?(/pundit/)
31
+ end
32
+
33
+ private
34
+
35
+ def run_pundit_installer
36
+ gather_gem 'pundit'
37
+
38
+ after(:gem_install) do
39
+ application_controller = "app/controllers/application_controller.rb"
40
+ gsub_file application_controller, "protect_from_forgery" do
41
+ "include Pundit\n protect_from_forgery"
42
+ end
43
+ generate "pundit:install"
44
+ add_readme_section :internal_dependencies, :pundit
45
+ end
46
+ end
47
+
48
+ def install_admin_pundit
49
+ initializer = "config/initializers/active_admin.rb"
50
+ gsub_file initializer, /# config\.authorization_adapter =[^\n]+\n/ do
51
+ "config.authorization_adapter = ActiveAdmin::PunditAdapter\n"
52
+ end
53
+
54
+ template "../assets/active_admin/pundit_page_policy.rb",
55
+ "app/policies/active_admin/page_policy.rb"
56
+ template "../assets/active_admin/comment_policy.rb",
57
+ "app/policies/active_admin/comment_policy.rb"
58
+ template "../assets/active_admin/admin_user_policy.rb",
59
+ "app/policies/admin_user_policy.rb"
60
+ end
61
+ end
@@ -0,0 +1,21 @@
1
+ class Recipes::RackCors < Rails::AppBuilder
2
+ def create
3
+ gather_gem('rack-cors', '~> 0.4.0')
4
+ after(:gem_install) do
5
+ rack_cors_config =
6
+ <<-RUBY.gsub(/^ {7}/, '')
7
+ config.middleware.insert_before 0, "Rack::Cors" do
8
+ allow do
9
+ origins '*'
10
+ resource '*',
11
+ headers: :any,
12
+ expose: ['X-Page', 'X-PageTotal'],
13
+ methods: [:get, :post, :delete, :put, :options]
14
+ end
15
+ end
16
+ RUBY
17
+
18
+ application rack_cors_config.strip
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,7 @@
1
+ class Recipes::Readme < Rails::AppBuilder
2
+ def create
3
+ remove_file "README.md"
4
+ template '../assets/README.md.erb', 'README.md'
5
+ add_readme_header :installation
6
+ end
7
+ end
@@ -0,0 +1,23 @@
1
+ require 'net/http'
2
+ require 'semantic'
3
+
4
+ class Recipes::Ruby < Rails::AppBuilder
5
+ def create
6
+ info 'Getting platanus latest ruby version...'
7
+ info "Using ruby version #{version_alias}"
8
+ create_file '.ruby-version', version_alias
9
+ end
10
+
11
+ private
12
+
13
+ def latest
14
+ Net::HTTP.get(URI.parse('http://ruby.platan.us/latest'))
15
+ rescue
16
+ RUBY_VERSION
17
+ end
18
+
19
+ def version_alias
20
+ version = latest
21
+ Semantic::Version.new(version).instance_eval { "#{major}.#{minor}" }
22
+ end
23
+ end
@@ -0,0 +1,16 @@
1
+ class Recipes::Script < Rails::AppBuilder
2
+ def create
3
+ template "../assets/bin/setup.erb", "bin/setup", force: true
4
+ run "chmod a+x bin/setup"
5
+ end
6
+
7
+ def install
8
+ heroku = load_recipe(:heroku)
9
+ set(:heroku, heroku.installed?)
10
+ create
11
+ end
12
+
13
+ def installed?
14
+ file_exist?("bin/setup")
15
+ end
16
+ end
@@ -0,0 +1,5 @@
1
+ class Recipes::Secrets < Rails::AppBuilder
2
+ def create
3
+ template '../assets/config/secrets.yml.erb', 'config/secrets.yml', force: true
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class Recipes::Staging < Rails::AppBuilder
2
+ def create
3
+ copy_file '../assets/config/environments/staging.rb', "config/environments/staging.rb"
4
+ end
5
+ end
@@ -0,0 +1,13 @@
1
+ class Recipes::Style < Rails::AppBuilder
2
+ def create
3
+ copy_file '../assets/.rubocop.yml', '.rubocop.yml'
4
+ copy_file '../assets/.ruby_style.yml', '.ruby_style.yml'
5
+ copy_file '../assets/.hound.yml', '.hound.yml'
6
+ append_to_file '.gitignore', '.rubocop-http*\n'
7
+ add_readme_header :style_guide
8
+ end
9
+
10
+ def install
11
+ create
12
+ end
13
+ end
@@ -0,0 +1,37 @@
1
+ class Recipes::Testing < Rails::AppBuilder
2
+ def create
3
+ gather_gems(:development, :test) do
4
+ gather_gem('rspec-rails')
5
+ gather_gem('factory_girl_rails')
6
+ gather_gem('guard-rspec', require: false)
7
+ gather_gem('rspec-nc', require: false)
8
+ end
9
+
10
+ gather_gems(:test) do
11
+ gather_gem('shoulda-matchers', require: false)
12
+ end
13
+
14
+ after(:gem_install) do
15
+ remove_dir 'test'
16
+
17
+ generate "rspec:install"
18
+
19
+ remove_file 'spec/rails_helper.rb'
20
+ copy_file '../assets/testing/rails_helper.rb', 'spec/rails_helper.rb'
21
+
22
+ remove_file '.rspec'
23
+ copy_file '../assets/testing/.rspec', '.rspec'
24
+
25
+ empty_directory 'spec/support'
26
+ create_file 'spec/support/.keep'
27
+
28
+ run "bundle exec guard init"
29
+ run "bundle binstubs rspec-core"
30
+ end
31
+
32
+ raise_delivery_errors_regexp = /config.action_mailer.raise_delivery_errors = false\n/
33
+ gsub_file 'config/environments/development.rb', raise_delivery_errors_regexp do
34
+ "config.action_mailer.raise_delivery_errors = true"
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,67 @@
1
+ set :app_name, app_name
2
+ set :titleized_app_name, get(:app_name).titleize
3
+ set :underscorized_app_name, get(:app_name).underscore
4
+ set :dasherized_app_name, get(:app_name).dasherize
5
+
6
+ run_action(:cleaning) do
7
+ clean_gemfile
8
+ gather_gem("spring")
9
+ end
10
+
11
+ run_action(:asking) do
12
+ ask :database
13
+ ask :devise
14
+ ask :admin
15
+ ask :angular_admin
16
+ ask :delayed_job
17
+ ask :pundit
18
+ ask :i18n
19
+ ask :api
20
+ ask :paperclip
21
+ ask :heroku
22
+ ask :github
23
+ end
24
+
25
+ run_action(:recipe_loading) do
26
+ create :readme
27
+ create :heroku
28
+ create :ci
29
+ create :style
30
+ create :puma
31
+ create :database
32
+ create :ruby
33
+ create :env
34
+ create :bower
35
+ create :editorconfig
36
+ create :aws_sdk
37
+ create :i18n
38
+ create :pry
39
+ create :devise
40
+ create :admin
41
+ create :angular_admin
42
+ create :delayed_job
43
+ create :pundit
44
+ create :testing
45
+ create :production
46
+ create :staging
47
+ create :secrets
48
+ create :git
49
+ create :api
50
+ create :rack_cors
51
+ create :paperclip
52
+ create :script
53
+ create :github
54
+ create :cleanup
55
+ end
56
+
57
+ info "Gathered enough information. Applying the template. Wait a minute."
58
+
59
+ run_action(:gem_install) do
60
+ build_gemfile
61
+ run "bundle install"
62
+ end
63
+
64
+ run_action(:database_creation) do
65
+ run "rake db:create db:migrate"
66
+ run "RAILS_ENV=test rake db:create db:migrate"
67
+ end
@@ -0,0 +1,12 @@
1
+ set :app_name, app_name
2
+ set :titleized_app_name, get(:app_name).titleize
3
+ set :underscorized_app_name, get(:app_name).underscore
4
+ set :dasherized_app_name, get(:app_name).dasherize
5
+ recipe_name = ARGV.first
6
+
7
+ run_action(:recipe_loading) do
8
+ install recipe_name.to_sym
9
+ run_action(:gem_install) do
10
+ run "bundle install" if build_gemfile
11
+ end
12
+ end
@@ -30,7 +30,6 @@ module Potassium
30
30
  sleep interval
31
31
  self.counter += 1
32
32
  end
33
- clear_message
34
33
  self.started = false
35
34
  end
36
35
  end
@@ -44,10 +43,6 @@ module Potassium
44
43
  print "\r#{base_message}#{message_continuation}"
45
44
  end
46
45
 
47
- def clear_message
48
- print "\r#{' ' * (base_message.size * 2)}\r"
49
- end
50
-
51
46
  def already_started_message
52
47
  "Please don't start this text spinner while is running. It can cause race conditions."
53
48
  end
@@ -1,4 +1,5 @@
1
1
  module Potassium
2
- VERSION = "1.3.5"
2
+ VERSION = "2.0.0"
3
3
  RAILS_VERSION = "~> 4.2.0"
4
+ RUBOCOP_VERSION = "~> 0.38.0"
4
5
  end
data/potassium.gemspec CHANGED
@@ -20,6 +20,9 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_development_dependency "bundler", "~> 1.7"
22
22
  spec.add_development_dependency "rake", "~> 10.0"
23
+ spec.add_development_dependency "rspec", "~> 3.4.0"
24
+ spec.add_development_dependency "pry", "~> 0.10.3"
25
+ spec.add_development_dependency "rubocop", Potassium::RUBOCOP_VERSION
23
26
  spec.add_runtime_dependency "rails", Potassium::RAILS_VERSION
24
27
  spec.add_runtime_dependency "gli", "~> 2.12.2"
25
28
  spec.add_runtime_dependency "inquirer", "~> 0.2"
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.expand_path(File.join('..', '..', 'support', 'fake_heroku'), File.dirname(__FILE__))
4
+
5
+ FakeHeroku.new(ARGV).run!
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.expand_path(File.join('..', '..', 'support', 'fake_github'), File.dirname(__FILE__))
4
+
5
+ FakeGithub.new(ARGV).run!