railman 0.2.0 → 0.3.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2452bb4c3c783b6efe3694e9582281bbcd8bc5f9
4
- data.tar.gz: 63fbcfea9787bb517762ccc91b06a183de7844ca
3
+ metadata.gz: e1ecb9d6bcb4c0a2dbd78093cd8892efe6b89884
4
+ data.tar.gz: 9a65f64857c7dd6e9dd27e451addebb774d4eb86
5
5
  SHA512:
6
- metadata.gz: 4b0ecbc34ee75ad020c4516b20615515aeaad8ad67083d3f2b26bcd367f76581bb9397285fcc9bc8af9d7f5c688bcc70fb8fa9aedce93110289a0c4688375b74
7
- data.tar.gz: 21daa85a4cbc6f3c4e6c154a94c83d64a92518bcc904aaf500fa26333a0f57a98d4ec28f37e4bfff7111c6c7bbd7f84076f0ba0c84318e823c451233ed46badc
6
+ metadata.gz: 9d436a33a67ad227d9975bb7059ae627aa9133c75af7cd6b3f4d3cea50b4547ffe81f3e716313af694cc3c3d9549b81364a496f4faea32612c4d0681994716f2
7
+ data.tar.gz: 8370baad6e71bf1d1436e25c299e188359496c1ca80739b25e5d3613272c4df32e4813be9dcdb1b35bf1c5ee02beac411e50eeac28f2e3bf474bba55ecc120c1
data/README.md CHANGED
@@ -35,6 +35,7 @@ Or install it yourself as:
35
35
  ## Usage
36
36
 
37
37
  Run `railman new APP_NAME` to create new rails application.
38
+ Run `railman upgrade APP_NAME` to upgrade existing rails application.
38
39
 
39
40
 
40
41
  ## Development
data/lib/railman/cli.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  require 'thor'
2
+ require 'yaml'
2
3
  require 'creategem'
4
+ require 'railman/config'
3
5
  require 'railman/secret'
4
6
 
5
7
  module Railman
@@ -17,50 +19,74 @@ module Railman
17
19
  desc "new APPNAME", "Create new rails application named APPNAME"
18
20
  def new(app_name)
19
21
  say "Create a new rails application named: #{app_name}", :green
20
- apply_rails_template(app_name)
22
+ config = create_config(app_name)
23
+ apply_rails_template(config)
21
24
  say "The rails application '#{app_name}' was successfully created.", :green
22
25
  say "Please check the settings in .env", :blue
23
26
  end
24
27
 
25
28
  desc "upgrade APPNAME", "Upgrade the rails upplication named APPNAME"
26
29
  def upgrade(app_name)
27
- puts "TODO upgrade the rails application: #{app_name}"
28
- apply_rails_template(app_name, false)
30
+ puts "Upgrade the rails application: #{app_name}"
31
+ config = load_config(app_name)
32
+ apply_rails_template(config, false)
29
33
  say "The rails application '#{app_name}' was successfully upgraded.", :green
30
34
  say "Please check the settings in .env", :blue
31
35
  end
32
36
 
33
37
  private
34
38
 
35
- def apply_rails_template(app_name, create = true)
36
- @app_name = app_name
37
- @class_name = Thor::Util.camel_case(app_name)
38
- @admin_email = ask("What is the adminitrator email address?")
39
- @domain = ask("What is the url of the application (without http and www)?")
40
- if yes?("Do you want me to configure www.#{@domain} domain to be redirected to #{@domain}? (y/n)")
41
- @www_domain = "www.#{@domain}"
42
- @domains = [@domain, @www_domain]
39
+ def create_config(app_name)
40
+ config = Railman::Config.new
41
+ config.app_name = app_name
42
+ config.class_name = Thor::Util.camel_case(app_name)
43
+ config.admin_email = ask("What is the adminitrator email address?")
44
+ config.domain = ask("What is the url of the application (without http and www)?")
45
+ if yes?("Do you want me to configure www.#{config.domain} domain to be redirected to #{config.domain}? (y/n)")
46
+ config.www_domain = "www.#{config.domain}"
47
+ config.domains = [config.domain, config.www_domain]
43
48
  else
44
- @www_domain = nil
45
- @domains = [@domain]
49
+ config.www_domain = nil
50
+ config.domains = [config.domain]
46
51
  end
47
- @server = ask("What is the name of the production server?")
52
+ config
53
+ end
54
+
55
+ def load_config(app_name)
56
+ if File.exists? File.join(app_name, ".railman")
57
+ YAML::load_file File.join(app_name, ".railman")
58
+ else
59
+ create_config(app_name)
60
+ end
61
+ end
62
+
63
+ def save_config(config)
64
+ File.open File.join(config.app_name, ".railman"), "w" do |file|
65
+ file.write config.to_yaml
66
+ end
67
+ end
68
+
69
+ def apply_rails_template(config, create = true)
70
+ @config = config
48
71
  @repository = Creategem::Repository.new(vendor: :bitbucket,
49
72
  user: git_repository_user_name(:bitbucket),
50
- name: app_name,
73
+ name: @config.app_name,
51
74
  gem_server_url: gem_server_url(:bitbucket))
52
75
  @rake_secret = "TODO: generate with: rake secret"
53
76
  @unicorn_behind_nginx = true
54
- directory "rails_app", app_name
55
- @rake_secret = Railman::Secret.generate_secret
56
- @unicorn_behind_nginx = false
57
- template "rails_app/.env.example.development.tt", "#{app_name}/.env"
58
- Dir.chdir app_name do
77
+ directory "rails_app", @config.app_name
78
+ if create
79
+ @rake_secret = Railman::Secret.generate_secret
80
+ @unicorn_behind_nginx = false
81
+ template "rails_app/.env.example.development.tt", "#{@config.app_name}/.env"
82
+ save_config(@config)
83
+ end
84
+ Dir.chdir @config.app_name do
59
85
  run "bundle install"
60
86
  run "chmod +x bin/*"
61
87
  if create
62
88
  create_local_git_repository
63
- create_remote_git_repository(@repository) if yes?("Do you want me to create bitbucket repository named #{app_name}? (y/n)")
89
+ create_remote_git_repository(@repository) if yes?("Do you want me to create bitbucket repository named #{@config.app_name}? (y/n)")
64
90
  end
65
91
  end
66
92
  end
@@ -0,0 +1,9 @@
1
+ require 'yaml'
2
+
3
+ # Railman::Config contains configuration parameters used to generate the rails application
4
+ # It is saved in .railman in the generated application, so that it can be used to upgrade the application later.
5
+ module Railman
6
+ class Config
7
+ attr_accessor :app_name, :class_name, :admin_email, :domain, :www_domain, :domains, :server
8
+ end
9
+ end
@@ -1,3 +1,3 @@
1
1
  module Railman
2
- VERSION = '0.2.0'
2
+ VERSION = '0.3.0'
3
3
  end
@@ -3,7 +3,7 @@
3
3
  # Don't commit this file to Git !!! Copy from .env.example.development and modify for each machine
4
4
 
5
5
  # Application settings
6
- APP_NAME = '<%= app_name %>'
6
+ APP_NAME = '<%= @config.app_name %>'
7
7
 
8
8
 
9
9
  # Database settings
@@ -16,12 +16,12 @@ SECRET_TOKEN = '<%= @rake_secret %>'
16
16
 
17
17
 
18
18
  # Where to send exceptions and other admin emails
19
- ADMIN_EMAIL = '<%= @admin_email %>'
19
+ ADMIN_EMAIL = '<%= @config.admin_email %>'
20
20
 
21
21
 
22
22
  # Exception notification settings
23
- EXCEPTION_NOTIFICATION_EMAIL_PREFIX = '[<%= @class_name %>] '
24
- EXCEPTION_NOTIFICATION_SENDER = 'server@<%= @domain %>'
23
+ EXCEPTION_NOTIFICATION_EMAIL_PREFIX = '[<%= @config.class_name %>] '
24
+ EXCEPTION_NOTIFICATION_SENDER = 'server@<%= @config.domain %>'
25
25
 
26
26
 
27
27
  # Unicorn settings
@@ -3,7 +3,7 @@
3
3
  # Don't commit this file to Git !!! Copy from .env.example.production and modify for each machine
4
4
 
5
5
  # Application settings
6
- APP_NAME = '<%= app_name %>'
6
+ APP_NAME = '<%= @config.app_name %>'
7
7
 
8
8
 
9
9
  # Database settings
@@ -16,20 +16,20 @@ SECRET_TOKEN = '<%= @rake_secret %>'
16
16
 
17
17
 
18
18
  # SMTP server settings
19
- SMTP_SERVER = 'mail.<%= @domain %>'
20
- SMTP_USER = 'server@<%= @domain %>'
19
+ SMTP_SERVER = 'mail.<%= @config.domain %>'
20
+ SMTP_USER = 'server@<%= @config.domain %>'
21
21
  SMTP_PASSWORD = '*****'
22
- SMTP_DOMAIN = '<%= @domain %>'
23
- SMTP_DEFAULT_URL = '<%= @domain %>'
22
+ SMTP_DOMAIN = '<%= @config.domain %>'
23
+ SMTP_DEFAULT_URL = '<%= @config.domain %>'
24
24
 
25
25
 
26
26
  # Where to send exceptions and other admin emails
27
- ADMIN_EMAIL = '<%= @admin_email %>'
27
+ ADMIN_EMAIL = '<%= @config.admin_email %>'
28
28
 
29
29
 
30
30
  # Exception notification settings
31
- EXCEPTION_NOTIFICATION_EMAIL_PREFIX = '[<%= @class_name %>] '
32
- EXCEPTION_NOTIFICATION_SENDER = 'server@<%= @domain %>'
31
+ EXCEPTION_NOTIFICATION_EMAIL_PREFIX = '[<%= @config.class_name %>] '
32
+ EXCEPTION_NOTIFICATION_SENDER = 'server@<%= @config.domain %>'
33
33
 
34
34
 
35
35
  # Unicorn settings
@@ -1,9 +1,9 @@
1
1
  # Eye configuration file (https://github.com/kostya/eye)
2
2
  # Load with: 'eye l Eyefile'
3
3
  # Watch processes: 'eye w'
4
- # Stop all processes: 'eye stop <%= app_name %>'
5
- # Start all processes: 'eye start <%= app_name %>'
6
- # Restart unicorn: 'eye restart <%= app_name %>:unicorn'
4
+ # Stop all processes: 'eye stop <%= @config.app_name %>'
5
+ # Start all processes: 'eye start <%= @config.app_name %>'
6
+ # Restart unicorn: 'eye restart <%= @config.app_name %>:unicorn'
7
7
 
8
8
  APP_ROOT = File.expand_path('..', __FILE__)
9
9
 
@@ -1 +1 @@
1
- <p>Welcome to: <%= @class_name %></p>
1
+ <p>Welcome to: <%= @config.class_name %></p>
@@ -6,7 +6,7 @@
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1">
7
7
  <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
8
8
 
9
- <title><%= @class_name %></title>
9
+ <title><%= @config.class_name %></title>
10
10
  <%%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
11
11
  <%%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
12
12
 
@@ -6,7 +6,7 @@ require 'rails/all'
6
6
  # you've limited to :test, :development, or :production.
7
7
  Bundler.require(*Rails.groups)
8
8
 
9
- module <%= @class_name %>
9
+ module <%= @config.class_name %>
10
10
  class Application < Rails::Application
11
11
  # Settings in config/environments/* take precedence over those specified here.
12
12
  # Application configuration should go into files in config/initializers
@@ -3,7 +3,7 @@ development:
3
3
  encoding: unicode
4
4
  port: 5432
5
5
  host: localhost
6
- database: <%= app_name %>_development
6
+ database: <%= @config.app_name %>_development
7
7
  username: <%%= ENV['DB_USER'] %>
8
8
  password: <%%= ENV['DB_PASSWORD'] %>
9
9
  pool: 5
@@ -14,7 +14,7 @@ test:
14
14
  encoding: unicode
15
15
  port: 5432
16
16
  host: localhost
17
- database: <%= app_name %>_test
17
+ database: <%= @config.app_name %>_test
18
18
  username: <%%= ENV['DB_USER'] %>
19
19
  password: <%%= ENV['DB_PASSWORD'] %>
20
20
  pool: 5
@@ -25,7 +25,7 @@ production:
25
25
  encoding: unicode
26
26
  port: 5432
27
27
  host: localhost
28
- database: <%= app_name %>_production
28
+ database: <%= @config.app_name %>_production
29
29
  username: <%%= ENV['DB_USER'] %>
30
30
  password: <%%= ENV['DB_PASSWORD'] %>
31
31
  pool: 15
@@ -1,7 +1,9 @@
1
1
  # Capistrano deployment tasks
2
2
  lock '3.4.1'
3
3
 
4
- set :application, '<%= app_name %>'
4
+ require 'securerandom'
5
+
6
+ set :application, '<%= @config.app_name %>'
5
7
  set :repo_url, '<%= @repository.origin %>'
6
8
  set :deploy_to, "/home/deploy/apps/#{fetch(:application)}"
7
9
  set :rbenv_home, '/home/deploy/.rbenv'
@@ -45,7 +47,9 @@ task :setup do
45
47
  execute :eye, :start, fetch(:application)
46
48
  execute :service, "nginx restart"
47
49
  else
48
- warn "TODO: Create .env on the server by copying from .env.example.production and modify your database and smtp settings."
50
+ execute :cp, '.env.example.production', '.env'
51
+ execute "sed -i -e 's/TODO: generate with: rake secret/#{SecureRandom.hex(64)}/g' .en"
52
+ warn "TODO: Edit .env and modify your database and smtp settings."
49
53
  warn "TODO: Create rails secret token with 'rake secret' and insert it into .env"
50
54
  warn "TODO: Create ssl certificates by running the following command as root: /etc/letsencrypt/generate_letsencrypt.sh"
51
55
  warn "TODO: Run 'cap ENV setup' again!"
@@ -1,4 +1,4 @@
1
1
  # production server configuration for capistrano
2
- set :server, '<%= @server %>'
2
+ set :server, '<%= @config.server %>'
3
3
  set :user, 'deploy'
4
4
  server fetch(:server), user: fetch(:user), roles: %w{web app db}
@@ -56,7 +56,7 @@ Rails.application.configure do
56
56
 
57
57
  # Use a different cache store in production.
58
58
  # config.cache_store = :mem_cache_store
59
- config.cache_store = :dalli_store, { namespace: ENV['APP_NAME'] }
59
+ config.cache_store = :dalli_store, { namespace: '<%= @config.app_name %>:' }
60
60
 
61
61
  # Enable serving of images, stylesheets, and JavaScripts from an asset server.
62
62
  # config.action_controller.asset_host = 'http://assets.example.com'
@@ -1,6 +1,6 @@
1
1
  # Be sure to restart your server when you modify this file.
2
2
 
3
3
  Rails.application.config.session_store :redis_session_store, {
4
- key: "_<%= app_name %>_session",
5
- redis: { key_prefix: "<%= app_name %>:", expire_after: 2.minutes }
4
+ key: "_<%= @config.app_name %>_session",
5
+ redis: { key_prefix: "<%= @config.app_name %>:", expire_after: 2.minutes }
6
6
  }
@@ -1,7 +1,7 @@
1
1
  require 'sidekiq/scheduler'
2
2
 
3
- # Configure Sidekiq Redis connection to use the '<%= app_name %>' namespace
4
- redis_config = { url: 'redis://localhost:6379', namespace: '<%= app_name %>' }
3
+ # Configure Sidekiq Redis connection to use the '<%= @config.app_name %>' namespace
4
+ redis_config = { url: 'redis://localhost:6379', namespace: '<%= @config.app_name %>:' }
5
5
 
6
6
  Sidekiq.configure_server do |config|
7
7
  config.redis = redis_config
@@ -2,13 +2,13 @@
2
2
  rsa-key-size = 4096
3
3
 
4
4
  # this address will receive renewal reminders, IIRC
5
- email = <%= @admin_email %>
5
+ email = <%= @config.admin_email %>
6
6
 
7
7
  # Generate certificates for the specified domains
8
- domains = <%= @domains.join(',') %>
8
+ domains = <%= @config.domains.join(',') %>
9
9
 
10
10
  # turn off the ncurses UI, we want this to be run as a cronjob
11
11
  text = True
12
12
 
13
13
  # authenticate by placing a file in the webroot (under .well-known/acme-challenge/) and then letting LE fetch it
14
- webroot-path = /home/deploy/apps/<%= app_name %>
14
+ webroot-path = /home/deploy/apps/<%= @config.app_name %>
@@ -1,4 +1,4 @@
1
- /home/deploy/apps/<%= app_name %>/log/*.log {
1
+ /home/deploy/apps/<%= @config.app_name %>/log/*.log {
2
2
  daily
3
3
  missingok
4
4
  rotate 9
@@ -1,13 +1,13 @@
1
- upstream <%= app_name %> {
2
- server unix:/tmp/unicorn.<%= app_name %>.sock fail_timeout=0;
1
+ upstream <%= @config.app_name %> {
2
+ server unix:/tmp/unicorn.<%= @config.app_name %>.sock fail_timeout=0;
3
3
  }
4
4
 
5
5
  server {
6
6
  listen 443 ssl;
7
- server_name <%= @domain %>;
7
+ server_name <%= @config.domain %>;
8
8
 
9
9
  index index.html;
10
- root /home/deploy/apps/<%= app_name %>/public;
10
+ root /home/deploy/apps/<%= @config.app_name %>/public;
11
11
  try_files $uri/index.html $uri @app;
12
12
 
13
13
  location @app {
@@ -18,7 +18,7 @@ server {
18
18
 
19
19
  proxy_set_header Host $http_host;
20
20
  proxy_redirect off;
21
- proxy_pass http://<%= app_name %>;
21
+ proxy_pass http://<%= @config.app_name %>;
22
22
  }
23
23
 
24
24
  client_max_body_size 100m;
@@ -37,17 +37,17 @@ server {
37
37
  }
38
38
 
39
39
  location ~ ^/(assets)/ {
40
- root /home/deploy/apps/<%= app_name %>/public;
40
+ root /home/deploy/apps/<%= @config.app_name %>/public;
41
41
  gzip_static on; # to serve pre-gzipped version
42
42
  expires max;
43
43
  add_header Cache-Control public;
44
44
  }
45
45
 
46
46
  # Let's Encrypt certificates
47
- ssl_certificate /etc/letsencrypt/live/<%= @domain %>/fullchain.pem;
48
- ssl_certificate_key /etc/letsencrypt/live/<%= @domain %>/privkey.pem;
47
+ ssl_certificate /etc/letsencrypt/live/<%= @config.domain %>/fullchain.pem;
48
+ ssl_certificate_key /etc/letsencrypt/live/<%= @config.domain %>/privkey.pem;
49
49
 
50
- location /home/deploy/apps/<%= app_name %>/public/.well-known {
50
+ location /home/deploy/apps/<%= @config.app_name %>/public/.well-known {
51
51
  allow all;
52
52
  }
53
53
  }
@@ -55,18 +55,18 @@ server {
55
55
 
56
56
  server {
57
57
  listen 80;
58
- server_name <%= @domains.join(' ') %>;
59
- return 301 https://<%= @domain %>$request_uri;
58
+ server_name <%= @config.domains.join(' ') %>;
59
+ return 301 https://<%= @config.domain %>$request_uri;
60
60
  }
61
61
 
62
- <% if @www_domain %>
62
+ <% if @config.www_domain %>
63
63
  server {
64
64
  listen 443 ssl;
65
- server_name <%= @www_domain %>;
66
- return 301 $scheme://<%= @domain %>$request_uri;
65
+ server_name <%= @config.www_domain %>;
66
+ return 301 $scheme://<%= @config.domain %>$request_uri;
67
67
 
68
68
  # Let's Encrypt certificates
69
- ssl_certificate /etc/letsencrypt/live/<%= @domain %>/fullchain.pem;
70
- ssl_certificate_key /etc/letsencrypt/live/<%= @domain %>/privkey.pem;
69
+ ssl_certificate /etc/letsencrypt/live/<%= @config.domain %>/fullchain.pem;
70
+ ssl_certificate_key /etc/letsencrypt/live/<%= @config.domain %>/privkey.pem;
71
71
  }
72
72
  <% end %>
@@ -6,7 +6,7 @@ require 'dotenv'
6
6
  Dotenv.load
7
7
 
8
8
  if ENV['UNICORN_BEHIND_NGINX']
9
- listen '/tmp/unicorn.<%= app_name %>.sock'
9
+ listen '/tmp/unicorn.<%= @config.app_name %>.sock'
10
10
  else
11
11
  listen Integer(ENV['UNICORN_PORT'] || 3000)
12
12
  end
@@ -4,6 +4,6 @@ class HomepageTest < WebTest
4
4
  test 'homepage' do
5
5
  visit '/'
6
6
  screenshot 'homepage'
7
- must_have_content 'Welcome to: <%= @class_name %>'
7
+ must_have_content 'Welcome to: <%= @config.class_name %>'
8
8
  end
9
9
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: railman
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Igor Jancev
@@ -157,6 +157,7 @@ files:
157
157
  - exe/railman
158
158
  - lib/railman.rb
159
159
  - lib/railman/cli.rb
160
+ - lib/railman/config.rb
160
161
  - lib/railman/secret.rb
161
162
  - lib/railman/version.rb
162
163
  - railman.gemspec
@@ -205,7 +206,7 @@ files:
205
206
  - templates/rails_app/config/deploy/production.rb.tt
206
207
  - templates/rails_app/config/environment.rb
207
208
  - templates/rails_app/config/environments/development.rb
208
- - templates/rails_app/config/environments/production.rb
209
+ - templates/rails_app/config/environments/production.rb.tt
209
210
  - templates/rails_app/config/environments/test.rb
210
211
  - templates/rails_app/config/initializers/assets.rb
211
212
  - templates/rails_app/config/initializers/backtrace_silencers.rb