hoboken 0.0.1 → 0.9.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 +5 -5
- data/.github/dependabot.yml +7 -0
- data/.github/workflows/ruby.yml +28 -0
- data/.rubocop.yml +33 -0
- data/.ruby-version +1 -0
- data/Gemfile +2 -0
- data/IDEAS.md +57 -0
- data/LICENSE.txt +1 -1
- data/README.md +21 -10
- data/Rakefile +14 -6
- data/bin/hoboken +2 -1
- data/hoboken.gemspec +53 -16
- data/lib/hoboken.rb +110 -23
- data/lib/hoboken/actions.rb +10 -6
- data/lib/hoboken/add_ons/github_action.rb +14 -0
- data/lib/hoboken/add_ons/heroku.rb +8 -23
- data/lib/hoboken/add_ons/internationalization.rb +10 -6
- data/lib/hoboken/add_ons/metrics.rb +39 -14
- data/lib/hoboken/add_ons/omniauth.rb +114 -47
- data/lib/hoboken/add_ons/rubocop.rb +40 -0
- data/lib/hoboken/add_ons/sequel.rb +76 -47
- data/lib/hoboken/add_ons/sprockets.rb +67 -65
- data/lib/hoboken/add_ons/travis.rb +6 -2
- data/lib/hoboken/add_ons/twbs.rb +80 -0
- data/lib/hoboken/generate.rb +112 -38
- data/lib/hoboken/templates/Gemfile.erb.tt +33 -10
- data/lib/hoboken/templates/README.md.tt +105 -35
- data/lib/hoboken/templates/Rakefile.tt +10 -22
- data/lib/hoboken/templates/classic.rb.tt +35 -8
- data/lib/hoboken/templates/config.ru.tt +5 -3
- data/lib/hoboken/templates/console.sh +5 -0
- data/lib/hoboken/templates/db.rb.tt +24 -0
- data/lib/hoboken/templates/github_action.tt +28 -0
- data/lib/hoboken/templates/gitignore +8 -1
- data/lib/hoboken/templates/metrics.rake.tt +10 -9
- data/lib/hoboken/templates/modular.rb.tt +40 -11
- data/lib/hoboken/templates/puma.rb.tt +21 -0
- data/lib/hoboken/templates/rspec.rake.tt +5 -0
- data/lib/hoboken/templates/rubocop.yml.tt +31 -0
- data/lib/hoboken/templates/sequel.rake +6 -4
- data/lib/hoboken/templates/server.sh +12 -0
- data/lib/hoboken/templates/setup.sh +7 -0
- data/lib/hoboken/templates/spec/app_spec.rb.tt +15 -0
- data/lib/hoboken/templates/spec/rack_matchers.rb.tt +56 -0
- data/lib/hoboken/templates/spec/spec_helper.rb.tt +41 -0
- data/lib/hoboken/templates/sprockets.rake +13 -7
- data/lib/hoboken/templates/sprockets_chain.rb +7 -3
- data/lib/hoboken/templates/sprockets_helper.rb +14 -10
- data/lib/hoboken/templates/support/rack_helpers.rb.tt +55 -0
- data/lib/hoboken/templates/support/rack_test_assertions.rb.tt +111 -0
- data/lib/hoboken/templates/test/test_helper.rb.tt +38 -27
- data/lib/hoboken/templates/test/unit/app_test.rb.tt +11 -3
- data/lib/hoboken/templates/test_unit.rake.tt +18 -0
- data/lib/hoboken/templates/views/index.erb.tt +10 -3
- data/lib/hoboken/templates/views/layout.erb.tt +4 -1
- data/lib/hoboken/version.rb +3 -1
- data/test/fixtures/Gemfile +3 -3
- data/test/fixtures/Gemfile.pristine +3 -2
- data/test/integration/add_on_test.rb +399 -136
- data/test/integration/generate_test.rb +170 -38
- data/test/test_helper.rb +54 -23
- data/test/unit/hoboken_actions_test.rb +70 -61
- metadata +441 -16
- data/.travis.yml +0 -5
- data/lib/hoboken/templates/test/support/rack_test_assertions.rb.tt +0 -92
@@ -1,79 +1,108 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Hoboken
|
2
4
|
module AddOns
|
5
|
+
# Database access via Sequel gem.
|
6
|
+
#
|
3
7
|
class Sequel < ::Hoboken::Group
|
4
8
|
def add_gems
|
5
|
-
gem
|
6
|
-
gem
|
9
|
+
gem 'sequel', version: '5.43'
|
10
|
+
gem 'sqlite3', version: '1.4', group: %i[development test]
|
7
11
|
end
|
8
12
|
|
9
13
|
def setup_directories
|
10
|
-
empty_directory(
|
11
|
-
empty_directory(
|
14
|
+
empty_directory('db/migrate')
|
15
|
+
empty_directory('tasks')
|
16
|
+
empty_directory('tmp')
|
12
17
|
end
|
13
18
|
|
14
19
|
def copy_rake_task
|
15
|
-
copy_file(
|
20
|
+
copy_file('hoboken/templates/sequel.rake', 'tasks/sequel.rake')
|
21
|
+
end
|
22
|
+
|
23
|
+
def setup_db_config
|
24
|
+
template('hoboken/templates/db.rb.tt', 'config/db.rb')
|
16
25
|
end
|
17
26
|
|
18
|
-
def
|
19
|
-
|
20
|
-
|
27
|
+
def require_db_config
|
28
|
+
location = classic? ? 'configure do' : 'module'
|
29
|
+
insert_into_file('app.rb', before: location) do
|
30
|
+
"require_relative 'config/db'\n\n"
|
21
31
|
end
|
32
|
+
end
|
22
33
|
|
23
|
-
|
34
|
+
def setup_puma_config
|
35
|
+
insert_into_file('config/puma.rb', after: 'before_fork do') do
|
36
|
+
"\n DB.disconnect if defined?(DB)"
|
37
|
+
end
|
38
|
+
end
|
24
39
|
|
25
|
-
|
26
|
-
|
40
|
+
# rubocop:disable Metrics/MethodLength
|
41
|
+
def add_database_test_helper_class
|
42
|
+
return if rspec?
|
27
43
|
|
28
|
-
|
29
|
-
|
30
|
-
|
44
|
+
insert_into_file('test/test_helper.rb', before: /ENV\['RACK_ENV'\] = 'test'/) do
|
45
|
+
"ENV['DATABASE_URL'] = 'sqlite://db/test.db'\n"
|
46
|
+
end
|
31
47
|
|
32
|
-
|
33
|
-
|
34
|
-
run app
|
35
|
-
CODE
|
48
|
+
insert_into_file('test/test_helper.rb', after: %r{require 'test/unit'}) do
|
49
|
+
"\nrequire 'sequel'"
|
36
50
|
end
|
37
|
-
end
|
38
51
|
|
39
|
-
|
40
|
-
|
41
|
-
|
52
|
+
append_file('test/test_helper.rb') do
|
53
|
+
<<~CODE
|
54
|
+
|
55
|
+
module Test
|
56
|
+
module Database
|
57
|
+
class TestCase < Test::Unit::TestCase
|
58
|
+
def run(*args, &block)
|
59
|
+
result = nil
|
60
|
+
DB.transaction(rollback: :always) { result = super }
|
61
|
+
result
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
CODE
|
42
67
|
end
|
68
|
+
end
|
69
|
+
# rubocop:enable Metrics/MethodLength
|
43
70
|
|
44
|
-
|
45
|
-
|
71
|
+
# rubocop:disable Metrics/MethodLength
|
72
|
+
def add_database_spec_helper
|
73
|
+
return unless rspec?
|
46
74
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
result = nil
|
51
|
-
database.transaction(rollback: :always) { result = super }
|
52
|
-
result
|
53
|
-
end
|
75
|
+
insert_into_file('spec/spec_helper.rb', before: /ENV\['RACK_ENV'\] = 'test'/) do
|
76
|
+
"ENV['DATABASE_URL'] = 'sqlite://db/test.db'\n"
|
77
|
+
end
|
54
78
|
|
55
|
-
|
79
|
+
snippet_rack = <<~CODE
|
80
|
+
config.around(:example, rack: true) do |example|
|
81
|
+
DB.transaction(rollback: :always) { example.run }
|
82
|
+
end
|
83
|
+
CODE
|
56
84
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
85
|
+
snippet_database = <<~CODE
|
86
|
+
config.around(:example, database: true) do |example|
|
87
|
+
DB.transaction(rollback: :always) { example.run }
|
88
|
+
end
|
89
|
+
CODE
|
90
|
+
|
91
|
+
location = /RSpec\.configure do \|config\|\n/
|
92
|
+
insert_into_file('spec/spec_helper.rb', after: location) do
|
93
|
+
"#{indent(snippet_rack, 2)}\n#{indent(snippet_database, 2)}\n"
|
66
94
|
end
|
67
95
|
end
|
96
|
+
# rubocop:enable Metrics/MethodLength
|
68
97
|
|
69
98
|
def reminders
|
70
99
|
say "\nGemfile updated... don't forget to 'bundle install'"
|
71
|
-
say
|
72
|
-
|
73
|
-
Notes:
|
74
|
-
* The sqlite3 gem has been installed for dev and test environments only. You will need to specify a gem to use for production.
|
75
|
-
* You will need to specify an environment variable 'DATABASE_URL' (either add it to .env or export it)
|
76
|
-
TEXT
|
100
|
+
say <<~TEXT
|
101
|
+
#{' '}
|
102
|
+
Notes:
|
103
|
+
* The sqlite3 gem has been installed for dev and test environments only. You will need to specify a gem to use for production.
|
104
|
+
* You will need to specify an environment variable 'DATABASE_URL' (either add it to .env or export it)
|
105
|
+
TEXT
|
77
106
|
end
|
78
107
|
end
|
79
108
|
end
|
@@ -1,97 +1,99 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Hoboken
|
2
4
|
module AddOns
|
5
|
+
# Rack-based asset packaging system.
|
6
|
+
#
|
3
7
|
class Sprockets < ::Hoboken::Group
|
4
8
|
def create_assets_folder
|
5
|
-
empty_directory(
|
6
|
-
FileUtils.cp(
|
7
|
-
FileUtils.cp(
|
9
|
+
empty_directory('assets')
|
10
|
+
FileUtils.cp('public/css/styles.css', 'assets/styles.scss')
|
11
|
+
FileUtils.cp('public/js/app.js', 'assets/app.js')
|
8
12
|
end
|
9
13
|
|
10
14
|
def add_gems
|
11
|
-
gem
|
12
|
-
gem
|
13
|
-
gem
|
15
|
+
gem 'sassc', version: '2.4', group: :assets
|
16
|
+
gem 'sprockets', version: '4.0', group: :assets
|
17
|
+
gem 'uglifier', version: '4.2', group: :assets
|
18
|
+
gem 'yui-compressor', version: '0.12', group: :assets
|
14
19
|
end
|
15
20
|
|
16
21
|
def copy_sprockets_helpers
|
17
|
-
copy_file(
|
18
|
-
copy_file(
|
19
|
-
copy_file(
|
22
|
+
copy_file('hoboken/templates/sprockets.rake', 'tasks/sprockets.rake')
|
23
|
+
copy_file('hoboken/templates/sprockets_chain.rb', 'middleware/sprockets_chain.rb')
|
24
|
+
copy_file('hoboken/templates/sprockets_helper.rb', 'helpers/sprockets.rb')
|
20
25
|
end
|
21
26
|
|
22
27
|
def update_app
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
28
|
+
snippet = <<~CODE
|
29
|
+
require File.expand_path('middleware/sprockets_chain', settings.root)
|
30
|
+
use Middleware::SprocketsChain, %r{/assets} do |env|
|
31
|
+
%w[assets vendor].each do |f|
|
32
|
+
env.append_path File.expand_path("../\#{f}", __FILE__)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
CODE
|
36
|
+
|
37
|
+
indentation = classic? ? 2 : 6
|
38
|
+
insert_into_file('app.rb', after: /configure :development do\n/) do
|
39
|
+
"#{indent(snippet, indentation)}\n"
|
33
40
|
end
|
34
41
|
|
35
|
-
insert_into_file(
|
36
|
-
"
|
37
|
-
end
|
38
|
-
|
39
|
-
gsub_file("app.rb", /require "sinatra\/reloader" if development\?/) do
|
40
|
-
<<CODE
|
41
|
-
if development?
|
42
|
-
require "sinatra/reloader"
|
43
|
-
|
44
|
-
require File.expand_path('middleware/sprockets_chain', settings.root)
|
45
|
-
use Middleware::SprocketsChain, %r{/assets} do |env|
|
46
|
-
%w(assets vendor).each do |f|
|
47
|
-
env.append_path File.expand_path("../\#{f}", __FILE__)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
helpers Helpers::Sprockets
|
53
|
-
CODE
|
42
|
+
insert_into_file('app.rb', after: /configure do\n/) do
|
43
|
+
"#{indent("helpers Helpers::Sprockets\n", indentation)}\n"
|
54
44
|
end
|
55
45
|
end
|
56
46
|
|
47
|
+
# rubocop:disable Metrics/MethodLength
|
57
48
|
def adjust_link_tags
|
58
|
-
insert_into_file(
|
59
|
-
<<HTML
|
60
|
-
|
61
|
-
|
62
|
-
<%= javascript_tag :app %>
|
49
|
+
insert_into_file('views/layout.erb', before: %r{</head>}) do
|
50
|
+
<<HTML
|
51
|
+
<%== stylesheet_tag :styles %>
|
52
|
+
<%== javascript_tag :app %>
|
63
53
|
HTML
|
64
54
|
end
|
65
55
|
|
66
|
-
gsub_file(
|
67
|
-
|
56
|
+
gsub_file(
|
57
|
+
'views/layout.erb',
|
58
|
+
%r{<link rel="stylesheet" type="text/css" href="css/styles.css">},
|
59
|
+
''
|
60
|
+
)
|
61
|
+
|
62
|
+
gsub_file(
|
63
|
+
'views/layout.erb',
|
64
|
+
%r{<script type="text/javascript" src="js/app.js"></script>},
|
65
|
+
''
|
66
|
+
)
|
68
67
|
end
|
68
|
+
# rubocop:enable Metrics/MethodLength
|
69
69
|
|
70
|
+
# rubocop:disable Metrics/MethodLength
|
70
71
|
def directions
|
71
|
-
text =
|
72
|
-
|
73
|
-
Run `bundle install` to get the sprockets gem and its
|
74
|
-
dependencies.
|
75
|
-
|
76
|
-
Running the server in development mode will serve css
|
77
|
-
and js files from /assets. In order to serve assets in
|
78
|
-
production, you must run `rake assets:precompile`. Read
|
79
|
-
the important note below before running this rake task.
|
80
|
-
TEXT
|
81
|
-
|
82
|
-
important =
|
83
|
-
|
84
|
-
Important Note:
|
85
|
-
Any css or js files from the /public folder have been copied
|
86
|
-
to /assets, the original files remain intact in /public, but
|
87
|
-
will be replaced the first time you run `rake assets:precompile`.
|
88
|
-
You may want to backup those files if they are not under source
|
89
|
-
control before running the Rake command.
|
90
|
-
TEXT
|
72
|
+
text = <<~TEXT
|
73
|
+
#{' '}
|
74
|
+
Run `bundle install` to get the sprockets gem and its
|
75
|
+
dependencies.
|
76
|
+
#{' '}
|
77
|
+
Running the server in development mode will serve css
|
78
|
+
and js files from /assets. In order to serve assets in
|
79
|
+
production, you must run `rake assets:precompile`. Read
|
80
|
+
the important note below before running this rake task.
|
81
|
+
TEXT
|
82
|
+
|
83
|
+
important = <<~TEXT
|
84
|
+
#{' '}
|
85
|
+
Important Note:
|
86
|
+
Any css or js files from the /public folder have been copied
|
87
|
+
to /assets, the original files remain intact in /public, but
|
88
|
+
will be replaced the first time you run `rake assets:precompile`.
|
89
|
+
You may want to backup those files if they are not under source
|
90
|
+
control before running the Rake command.
|
91
|
+
TEXT
|
91
92
|
|
92
93
|
say text
|
93
94
|
say important, :red
|
94
95
|
end
|
96
|
+
# rubocop:enable Metrics/MethodLength
|
95
97
|
end
|
96
98
|
end
|
97
99
|
end
|
@@ -1,9 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Hoboken
|
2
4
|
module AddOns
|
5
|
+
# Basic Travis-CI YAML config.
|
6
|
+
#
|
3
7
|
class Travis < ::Hoboken::Group
|
4
8
|
def travis_yml
|
5
|
-
create_file(
|
6
|
-
|
9
|
+
create_file('.travis.yml') do
|
10
|
+
'language: ruby'
|
7
11
|
end
|
8
12
|
end
|
9
13
|
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Hoboken
|
4
|
+
module AddOns
|
5
|
+
# Twitter Bootstrap support.
|
6
|
+
#
|
7
|
+
class TwitterBootstrap < ::Hoboken::Group
|
8
|
+
def add_gem
|
9
|
+
return unless sprockets?
|
10
|
+
|
11
|
+
gem 'bootstrap', version: '5.0.0.beta3', group: :assets
|
12
|
+
end
|
13
|
+
|
14
|
+
def update_app
|
15
|
+
return unless sprockets?
|
16
|
+
|
17
|
+
indentation = classic? ? 2 : 6
|
18
|
+
insert_into_file('app.rb', after: /require.*sprockets_chain.*\n/) do
|
19
|
+
indent("require 'bootstrap'\n", indentation)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def update_asset_files
|
24
|
+
return unless sprockets?
|
25
|
+
|
26
|
+
prepend_file('assets/styles.scss') do
|
27
|
+
<<~CODE
|
28
|
+
@import "bootstrap";
|
29
|
+
|
30
|
+
CODE
|
31
|
+
end
|
32
|
+
|
33
|
+
prepend_file('assets/app.js') do
|
34
|
+
<<~CODE
|
35
|
+
//= require popper
|
36
|
+
//= require bootstrap-sprockets
|
37
|
+
CODE
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def update_sprockets_rake_tasks
|
42
|
+
return unless sprockets?
|
43
|
+
|
44
|
+
insert_into_file('tasks/sprockets.rake', after: /require 'sprockets'\n/) do
|
45
|
+
" require 'bootstrap'\n"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def remove_normalize_css
|
50
|
+
return unless sprockets?
|
51
|
+
|
52
|
+
gsub_file(
|
53
|
+
'views/layout.erb',
|
54
|
+
'<link rel="stylesheet" type="text/css" ' \
|
55
|
+
'href="//cdnjs.cloudflare.com/ajax/libs/normalize/2.1.3/normalize.min.css">',
|
56
|
+
''
|
57
|
+
)
|
58
|
+
end
|
59
|
+
|
60
|
+
def reminders
|
61
|
+
if sprockets?
|
62
|
+
say "\nGemfile updated... don't forget to 'bundle install'"
|
63
|
+
else
|
64
|
+
text = <<~TEXT
|
65
|
+
Sprockets is required. Please install the Sprockets add-on
|
66
|
+
first (hoboken add:sprockets).
|
67
|
+
TEXT
|
68
|
+
|
69
|
+
say text, :red
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
private
|
74
|
+
|
75
|
+
def sprockets?
|
76
|
+
Dir.exist?('assets')
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
data/lib/hoboken/generate.rb
CHANGED
@@ -1,6 +1,11 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rbconfig'
|
2
4
|
|
3
5
|
module Hoboken
|
6
|
+
# Main project generator.
|
7
|
+
#
|
8
|
+
# rubocop:disable Metrics/ClassLength
|
4
9
|
class Generate < Thor::Group
|
5
10
|
include Thor::Actions
|
6
11
|
|
@@ -10,90 +15,152 @@ module Hoboken
|
|
10
15
|
|
11
16
|
class_option :ruby_version,
|
12
17
|
type: :string,
|
13
|
-
desc:
|
18
|
+
desc: 'Ruby version for Gemfile',
|
14
19
|
default: RUBY_VERSION
|
15
20
|
|
16
21
|
class_option :tiny,
|
17
22
|
type: :boolean,
|
18
|
-
desc:
|
23
|
+
desc: 'Generate views inline; do not create /public folder',
|
19
24
|
default: false
|
20
25
|
|
21
26
|
class_option :type,
|
22
27
|
type: :string,
|
23
|
-
desc:
|
28
|
+
desc: 'Architecture type (classic or modular)',
|
24
29
|
default: :classic
|
25
30
|
|
26
31
|
class_option :git,
|
27
32
|
type: :boolean,
|
28
|
-
desc:
|
33
|
+
desc: 'Create a Git repository and make initial commit',
|
34
|
+
default: false
|
35
|
+
|
36
|
+
class_option :api_only,
|
37
|
+
type: :boolean,
|
38
|
+
desc: 'API only, no views, public folder, etc.',
|
29
39
|
default: false
|
30
40
|
|
41
|
+
class_option :test_framework,
|
42
|
+
type: :string,
|
43
|
+
desc: 'Testing framework; can be either test-unit or rspec',
|
44
|
+
default: 'test-unit'
|
45
|
+
|
31
46
|
def self.source_root
|
32
47
|
File.dirname(__FILE__)
|
33
48
|
end
|
34
49
|
|
35
50
|
def app_folder
|
36
51
|
empty_directory(snake_name)
|
37
|
-
apply_template(
|
38
|
-
apply_template(
|
39
|
-
apply_template(
|
40
|
-
apply_template(
|
41
|
-
apply_template(
|
52
|
+
apply_template('classic.rb.tt', 'app.rb')
|
53
|
+
apply_template('Gemfile.erb.tt', 'Gemfile')
|
54
|
+
apply_template('config.ru.tt', 'config.ru')
|
55
|
+
apply_template('README.md.tt', 'README.md')
|
56
|
+
apply_template('Rakefile.tt', 'Rakefile')
|
57
|
+
|
58
|
+
create_file("#{snake_name}/Procfile") do
|
59
|
+
'web: bundle exec puma -C config/puma.rb'
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def bin_folder
|
64
|
+
empty_directory("#{snake_name}/bin")
|
65
|
+
%w[console server setup].each do |f|
|
66
|
+
target = "#{snake_name}/bin/#{f}"
|
67
|
+
copy_file("templates/#{f}.sh", target)
|
68
|
+
chmod(target, 0o755)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def config_folder
|
73
|
+
empty_directory("#{snake_name}/config")
|
74
|
+
apply_template('puma.rb.tt', 'config/puma.rb')
|
42
75
|
end
|
43
76
|
|
44
77
|
def view_folder
|
78
|
+
return if options[:api_only]
|
79
|
+
|
45
80
|
empty_directory("#{snake_name}/views")
|
46
|
-
apply_template(
|
47
|
-
apply_template(
|
81
|
+
apply_template('views/layout.erb.tt', 'views/layout.erb')
|
82
|
+
apply_template('views/index.erb.tt', 'views/index.erb')
|
48
83
|
end
|
49
84
|
|
50
85
|
def public_folder
|
51
|
-
return if options[:tiny]
|
86
|
+
return if options[:tiny] || options[:api_only]
|
87
|
+
|
52
88
|
inside snake_name do
|
53
|
-
empty_directory(
|
54
|
-
%w
|
89
|
+
empty_directory('public')
|
90
|
+
%w[css img js].each { |f| empty_directory("public/#{f}") }
|
55
91
|
end
|
56
|
-
apply_template("styles.css.tt", "public/css/styles.css")
|
57
|
-
create_file("#{snake_name}/public/js/app.js", "")
|
58
92
|
|
59
|
-
|
93
|
+
apply_template('styles.css.tt', 'public/css/styles.css')
|
94
|
+
create_file("#{snake_name}/public/js/app.js", '')
|
95
|
+
|
96
|
+
%w[favicon hoboken sinatra].each do |f|
|
60
97
|
copy_file("templates/#{f}.png", "#{snake_name}/public/img/#{f}.png")
|
61
98
|
end
|
62
99
|
end
|
63
100
|
|
64
101
|
def test_folder
|
102
|
+
return unless 'test-unit' == options[:test_framework]
|
103
|
+
|
65
104
|
empty_directory("#{snake_name}/test/unit")
|
66
105
|
empty_directory("#{snake_name}/test/integration")
|
67
106
|
empty_directory("#{snake_name}/test/support")
|
68
|
-
apply_template(
|
69
|
-
apply_template(
|
70
|
-
apply_template(
|
107
|
+
apply_template('test_unit.rake.tt', 'tasks/test_unit.rake')
|
108
|
+
apply_template('test/test_helper.rb.tt', 'test/test_helper.rb')
|
109
|
+
apply_template('test/unit/app_test.rb.tt', 'test/unit/app_test.rb')
|
110
|
+
apply_template('support/rack_helpers.rb.tt', 'test/support/rack_helpers.rb')
|
111
|
+
apply_template('support/rack_test_assertions.rb.tt',
|
112
|
+
'test/support/rack_test_assertions.rb')
|
113
|
+
end
|
114
|
+
|
115
|
+
def rspec_setup
|
116
|
+
return unless 'rspec' == options[:test_framework]
|
117
|
+
|
118
|
+
empty_directory("#{snake_name}/spec")
|
119
|
+
empty_directory("#{snake_name}/spec/support")
|
120
|
+
create_file("#{snake_name}/.rspec") { '--require spec_helper' }
|
121
|
+
apply_template('rspec.rake.tt', 'tasks/rspec.rake')
|
122
|
+
apply_template('spec/app_spec.rb.tt', 'spec/app_spec.rb')
|
123
|
+
apply_template('spec/spec_helper.rb.tt', 'spec/spec_helper.rb')
|
124
|
+
apply_template('support/rack_helpers.rb.tt', 'spec/support/rack_helpers.rb')
|
125
|
+
apply_template('spec/rack_matchers.rb.tt', 'spec/support/rack_matchers.rb')
|
71
126
|
end
|
72
127
|
|
73
128
|
def env_file
|
74
129
|
inside snake_name do
|
75
|
-
create_file(
|
130
|
+
create_file('.env') do
|
76
131
|
"RACK_ENV=development\nPORT=9292"
|
77
132
|
end
|
78
133
|
end
|
79
134
|
end
|
80
135
|
|
136
|
+
# rubocop:disable Metrics/AbcSize
|
81
137
|
def make_modular
|
82
|
-
return unless
|
138
|
+
return unless 'modular' == options[:type]
|
139
|
+
|
83
140
|
empty_directory("#{snake_name}/helpers")
|
84
141
|
remove_file("#{snake_name}/app.rb")
|
85
|
-
apply_template(
|
86
|
-
|
142
|
+
apply_template('modular.rb.tt', 'app.rb')
|
143
|
+
|
144
|
+
files = [].tap do |f|
|
145
|
+
f << 'config.ru'
|
146
|
+
f << 'test/support/rack_helpers.rb' if 'test-unit' == options[:test_framework]
|
147
|
+
f << 'spec/support/rack_helpers.rb' if 'rspec' == options[:test_framework]
|
148
|
+
end
|
149
|
+
|
150
|
+
files.each do |f|
|
87
151
|
path = File.join(snake_name, f)
|
88
152
|
gsub_file(path, /Sinatra::Application/, "#{camel_name}::App")
|
89
153
|
end
|
90
154
|
end
|
155
|
+
# rubocop:enable Metrics/AbcSize
|
91
156
|
|
92
157
|
def inline_views
|
93
158
|
return unless options[:tiny]
|
94
|
-
|
159
|
+
return if options[:api_only]
|
160
|
+
|
161
|
+
combined_views = %w[layout index].map { |f|
|
95
162
|
"@@#{f}\n" + File.read("#{snake_name}/views/#{f}.erb")
|
96
|
-
|
163
|
+
}.join("\n")
|
97
164
|
|
98
165
|
append_to_file("#{snake_name}/app.rb", "\n__END__\n\n#{combined_views}")
|
99
166
|
remove_dir("#{snake_name}/views")
|
@@ -101,20 +168,26 @@ module Hoboken
|
|
101
168
|
|
102
169
|
def create_git_repository
|
103
170
|
return unless options[:git]
|
104
|
-
|
105
|
-
|
171
|
+
|
172
|
+
if git?
|
173
|
+
copy_file('templates/gitignore', "#{snake_name}/.gitignore")
|
106
174
|
inside snake_name do
|
107
|
-
run(
|
108
|
-
run(
|
109
|
-
run(
|
175
|
+
run('git init .')
|
176
|
+
run('git add .')
|
177
|
+
run('git commit -m "Initial commit."')
|
110
178
|
end
|
111
179
|
else
|
112
|
-
say "\nYou asked that a Git repository be created for the
|
180
|
+
say "\nYou asked that a Git repository be created for the " \
|
181
|
+
'project, but no Git executable could be found.'
|
113
182
|
end
|
114
183
|
end
|
115
184
|
|
116
185
|
def directions
|
117
|
-
say "\nSuccessfully created #{name}.
|
186
|
+
say "\nSuccessfully created #{name}."
|
187
|
+
end
|
188
|
+
|
189
|
+
def self.exit_on_failure?
|
190
|
+
true
|
118
191
|
end
|
119
192
|
|
120
193
|
private
|
@@ -124,15 +197,15 @@ module Hoboken
|
|
124
197
|
end
|
125
198
|
|
126
199
|
def camel_name
|
127
|
-
Thor::Util.camel_case(name.split(
|
200
|
+
Thor::Util.camel_case(name.split('/').last)
|
128
201
|
end
|
129
202
|
|
130
203
|
def titleized_name
|
131
|
-
snake_name.split(
|
204
|
+
snake_name.split('_').map(&:capitalize).join(' ')
|
132
205
|
end
|
133
206
|
|
134
207
|
def author
|
135
|
-
if
|
208
|
+
if git?
|
136
209
|
`git config user.name`.chomp
|
137
210
|
else
|
138
211
|
say "\nNo Git executable found. Using result of `whoami` as author name."
|
@@ -140,7 +213,7 @@ module Hoboken
|
|
140
213
|
end
|
141
214
|
end
|
142
215
|
|
143
|
-
def
|
216
|
+
def git?
|
144
217
|
system("git --version >#{NULL} 2>&1")
|
145
218
|
end
|
146
219
|
|
@@ -148,4 +221,5 @@ module Hoboken
|
|
148
221
|
template("templates/#{src}", "#{snake_name}/#{dest}")
|
149
222
|
end
|
150
223
|
end
|
224
|
+
# rubocop:enable Metrics/ClassLength
|
151
225
|
end
|