codeland-starter 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +22 -0
- data/.rspec +3 -0
- data/.travis.yml +6 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +56 -0
- data/Rakefile +13 -0
- data/bin/codeland-starter +5 -0
- data/codeland-starter.gemspec +33 -0
- data/lib/codeland/starter.rb +50 -0
- data/lib/codeland/starter/cli.rb +33 -0
- data/lib/codeland/starter/codeland-starter.yml +5 -0
- data/lib/codeland/starter/configuration.rb +37 -0
- data/lib/codeland/starter/integrations/heroku.rb +87 -0
- data/lib/codeland/starter/version.rb +5 -0
- data/spec/fixtures/heroku_app.json +30 -0
- data/spec/spec_helper.rb +111 -0
- data/spec/starter/configuration_spec.rb +64 -0
- data/spec/starter/integrations/heroku_spec.rb +177 -0
- data/spec/starter/starter_spec.rb +62 -0
- data/template/codeland.rb +276 -0
- data/template/files/Procfile +1 -0
- data/template/files/app/assets/javascripts/flash.js.coffee.erb +11 -0
- data/template/files/app/assets/stylesheets/application.scss +18 -0
- data/template/files/app/assets/stylesheets/atoms/.keep +0 -0
- data/template/files/app/assets/stylesheets/base/_base.scss +0 -0
- data/template/files/app/assets/stylesheets/base/_typography.scss +0 -0
- data/template/files/app/assets/stylesheets/base/_utility.scss +0 -0
- data/template/files/app/assets/stylesheets/base/_variables-colors.scss +3 -0
- data/template/files/app/assets/stylesheets/base/_variables.scss +0 -0
- data/template/files/app/assets/stylesheets/molecules/_flash.scss +21 -0
- data/template/files/app/assets/stylesheets/organisms/_footer.scss +0 -0
- data/template/files/app/assets/stylesheets/organisms/_header.scss +0 -0
- data/template/files/app/views/layouts/_flash.html.slim +6 -0
- data/template/files/app/views/layouts/application.html.slim.erb +19 -0
- data/template/files/app/views/partials/_footer.html.slim +0 -0
- data/template/files/app/views/partials/_header.html.slim +0 -0
- metadata +244 -0
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,111 @@
|
|
1
|
+
require 'bundler/setup'
|
2
|
+
Bundler.setup
|
3
|
+
|
4
|
+
require 'simplecov'
|
5
|
+
require 'simplecov-console'
|
6
|
+
formaters = [
|
7
|
+
SimpleCov::Formatter::HTMLFormatter,
|
8
|
+
SimpleCov::Formatter::Console
|
9
|
+
]
|
10
|
+
if ENV['CI']
|
11
|
+
require 'codeclimate-test-reporter'
|
12
|
+
formaters << CodeClimate::TestReporter::Formatter
|
13
|
+
end
|
14
|
+
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[*formaters]
|
15
|
+
SimpleCov.start
|
16
|
+
|
17
|
+
require 'webmock/rspec'
|
18
|
+
WebMock.disable_net_connect!(:allow => 'codeclimate.com') if ENV['CI']
|
19
|
+
require 'codeland/starter'
|
20
|
+
|
21
|
+
# This file was generated by the `rspec --init` command. Conventionally, all
|
22
|
+
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
|
23
|
+
# The generated `.rspec` file contains `--require spec_helper` which will cause this
|
24
|
+
# file to always be loaded, without a need to explicitly require it in any files.
|
25
|
+
#
|
26
|
+
# Given that it is always loaded, you are encouraged to keep this file as
|
27
|
+
# light-weight as possible. Requiring heavyweight dependencies from this file
|
28
|
+
# will add to the boot time of your test suite on EVERY test run, even for an
|
29
|
+
# individual file that may not need all of that loaded. Instead, consider making
|
30
|
+
# a separate helper file that requires the additional dependencies and performs
|
31
|
+
# the additional setup, and require it from the spec files that actually need it.
|
32
|
+
#
|
33
|
+
# The `.rspec` file also contains a few flags that are not defaults but that
|
34
|
+
# users commonly want.
|
35
|
+
#
|
36
|
+
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
37
|
+
RSpec.configure do |config|
|
38
|
+
# rspec-expectations config goes here. You can use an alternate
|
39
|
+
# assertion/expectation library such as wrong or the stdlib/minitest
|
40
|
+
# assertions if you prefer.
|
41
|
+
config.expect_with :rspec do |expectations|
|
42
|
+
# This option will default to `true` in RSpec 4. It makes the `description`
|
43
|
+
# and `failure_message` of custom matchers include text for helper methods
|
44
|
+
# defined using `chain`, e.g.:
|
45
|
+
# be_bigger_than(2).and_smaller_than(4).description
|
46
|
+
# # => "be bigger than 2 and smaller than 4"
|
47
|
+
# ...rather than:
|
48
|
+
# # => "be bigger than 2"
|
49
|
+
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
50
|
+
end
|
51
|
+
|
52
|
+
# rspec-mocks config goes here. You can use an alternate test double
|
53
|
+
# library (such as bogus or mocha) by changing the `mock_with` option here.
|
54
|
+
config.mock_with :rspec do |mocks|
|
55
|
+
# Prevents you from mocking or stubbing a method that does not exist on
|
56
|
+
# a real object. This is generally recommended, and will default to
|
57
|
+
# `true` in RSpec 4.
|
58
|
+
mocks.verify_partial_doubles = true
|
59
|
+
end
|
60
|
+
|
61
|
+
# The settings below are suggested to provide a good initial experience
|
62
|
+
# with RSpec, but feel free to customize to your heart's content.
|
63
|
+
=begin
|
64
|
+
# These two settings work together to allow you to limit a spec run
|
65
|
+
# to individual examples or groups you care about by tagging them with
|
66
|
+
# `:focus` metadata. When nothing is tagged with `:focus`, all examples
|
67
|
+
# get run.
|
68
|
+
config.filter_run :focus
|
69
|
+
config.run_all_when_everything_filtered = true
|
70
|
+
|
71
|
+
# Limits the available syntax to the non-monkey patched syntax that is recommended.
|
72
|
+
# For more details, see:
|
73
|
+
# - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax
|
74
|
+
# - http://teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
|
75
|
+
# - http://myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3#new__config_option_to_disable_rspeccore_monkey_patching
|
76
|
+
config.disable_monkey_patching!
|
77
|
+
|
78
|
+
# This setting enables warnings. It's recommended, but in some cases may
|
79
|
+
# be too noisy due to issues in dependencies.
|
80
|
+
config.warnings = true
|
81
|
+
|
82
|
+
# Many RSpec users commonly either run the entire suite or an individual
|
83
|
+
# file, and it's useful to allow more verbose output when running an
|
84
|
+
# individual spec file.
|
85
|
+
if config.files_to_run.one?
|
86
|
+
# Use the documentation formatter for detailed output,
|
87
|
+
# unless a formatter has already been configured
|
88
|
+
# (e.g. via a command-line flag).
|
89
|
+
config.default_formatter = 'doc'
|
90
|
+
end
|
91
|
+
|
92
|
+
# Print the 10 slowest examples and example groups at the
|
93
|
+
# end of the spec run, to help surface which specs are running
|
94
|
+
# particularly slow.
|
95
|
+
config.profile_examples = 10
|
96
|
+
=end
|
97
|
+
|
98
|
+
# Run specs in random order to surface order dependencies. If you find an
|
99
|
+
# order dependency and want to debug it, you can fix the order by providing
|
100
|
+
# the seed, which is printed after each run.
|
101
|
+
# --seed 1234
|
102
|
+
config.order = :random
|
103
|
+
|
104
|
+
=begin
|
105
|
+
# Seed global randomization in this process using the `--seed` CLI option.
|
106
|
+
# Setting this allows you to use `--seed` to deterministically reproduce
|
107
|
+
# test failures related to randomization by passing the same `--seed` value
|
108
|
+
# as the one that triggered the failure.
|
109
|
+
Kernel.srand config.seed
|
110
|
+
=end
|
111
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Codeland::Starter::Configuration do
|
4
|
+
let!(:installed_yaml) { File.join(File.dirname(__FILE__), '..', '..', 'lib', 'codeland', 'starter', 'codeland-starter.yml') }
|
5
|
+
|
6
|
+
describe '::DEFAULT_FILENAME' do
|
7
|
+
it { expect(described_class::DEFAULT_FILENAME).to eq('codeland-starter.yml') }
|
8
|
+
end
|
9
|
+
|
10
|
+
describe 'initialize' do
|
11
|
+
context '@yaml' do
|
12
|
+
let!(:other_yaml) { 'otherfile.yml' }
|
13
|
+
|
14
|
+
context 'installed' do
|
15
|
+
context 'argument file exists' do
|
16
|
+
subject { described_class.new(other_yaml) }
|
17
|
+
|
18
|
+
before do
|
19
|
+
expect(File).to receive(:exists?).with(other_yaml).and_return(true)
|
20
|
+
expect(File).to receive(:open).with(other_yaml).and_return(other_yaml)
|
21
|
+
expect(YAML).to receive(:load_file).with(other_yaml).and_return(other_yaml)
|
22
|
+
end
|
23
|
+
|
24
|
+
it { expect(subject.yaml).to eq(other_yaml) }
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'argument dont exists' do
|
28
|
+
let!(:default_yaml) { File.join(Dir.home, described_class::DEFAULT_FILENAME) }
|
29
|
+
|
30
|
+
before do
|
31
|
+
expect(File).to receive(:exists?).with(other_yaml).and_return(false)
|
32
|
+
expect(File).to receive(:exists?).with(default_yaml).and_return(true)
|
33
|
+
expect(File).to receive(:open).with(default_yaml).and_return(default_yaml)
|
34
|
+
expect(YAML).to receive(:load_file).with(default_yaml).and_return(default_yaml)
|
35
|
+
end
|
36
|
+
|
37
|
+
subject { described_class.new(other_yaml) }
|
38
|
+
|
39
|
+
it { expect(subject.yaml).to eq(subject.default_yaml_file) }
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context 'not installed' do
|
44
|
+
before { expect(File).to receive(:exists?).exactly(2).times.and_return(false) }
|
45
|
+
|
46
|
+
it { expect{ described_class.new(installed_yaml) }.to raise_error(Codeland::Starter::MissingYAML) }
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe '#default_yaml_file' do
|
52
|
+
subject { described_class.new(file).default_yaml_file }
|
53
|
+
|
54
|
+
let!(:file) { File.open(File.join(File.dirname(__FILE__), '..', '..', 'lib', 'codeland', 'starter', 'codeland-starter.yml')) }
|
55
|
+
|
56
|
+
it { is_expected.to eq(File.join(Dir.home, described_class::DEFAULT_FILENAME)) }
|
57
|
+
end
|
58
|
+
|
59
|
+
describe '#integrations' do
|
60
|
+
subject { described_class.new(installed_yaml).integrations }
|
61
|
+
|
62
|
+
it { is_expected.to be_a(Array) }
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,177 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Codeland::Starter::Integrations::Heroku do
|
4
|
+
def stub_heroku(content = nil, status = 201, app_name = name)
|
5
|
+
stub_request(:post, 'https://api.heroku.com/apps')
|
6
|
+
.with(
|
7
|
+
:body => { :name => name, :region => 'us', :stack => 'cedar' },
|
8
|
+
:headers => {
|
9
|
+
'Accept' => 'application/vnd.heroku+json; version=3',
|
10
|
+
'Authorization' => "Bearer #{heroku_token}",
|
11
|
+
'Content-Type' => 'application/json',
|
12
|
+
'Host' => 'api.heroku.com:443',
|
13
|
+
'User-Agent' => "excon/#{Excon::VERSION}"
|
14
|
+
}
|
15
|
+
).to_return(:status => status, :body => content)
|
16
|
+
end
|
17
|
+
|
18
|
+
def stub_heroku_error(error, app_name = name)
|
19
|
+
stub_request(:post, 'https://api.heroku.com/apps')
|
20
|
+
.with(
|
21
|
+
:body => { :name => app_name, :region => 'us', :stack => 'cedar' },
|
22
|
+
:headers => {
|
23
|
+
'Accept' => 'application/vnd.heroku+json; version=3',
|
24
|
+
'Authorization' => "Bearer #{heroku_token}",
|
25
|
+
'Content-Type' => 'application/json',
|
26
|
+
'Host' => 'api.heroku.com:443',
|
27
|
+
'User-Agent' => "excon/#{Excon::VERSION}"
|
28
|
+
}
|
29
|
+
).to_raise(error)
|
30
|
+
end
|
31
|
+
|
32
|
+
let!(:heroku_token) { 'HEROKU_OAUTH_TOKEN' }
|
33
|
+
|
34
|
+
let!(:heroku_file) do
|
35
|
+
File.open(File.dirname(__FILE__) + '/../../fixtures/heroku_app.json', 'rb')
|
36
|
+
end
|
37
|
+
|
38
|
+
let!(:installed_yaml) { File.join(File.dirname(__FILE__), '..', '..', '..', 'lib', 'codeland', 'starter', 'codeland-starter.yml') }
|
39
|
+
|
40
|
+
|
41
|
+
describe '#initialize' do
|
42
|
+
let!(:name) { 'MyAppName' }
|
43
|
+
|
44
|
+
context 'api' do
|
45
|
+
context 'with heroku key in YAML' do
|
46
|
+
before { expect(Codeland::Starter::Configuration).to receive(:[]).with('heroku').exactly(2).times.and_return({'oauth_token' => heroku_token}) }
|
47
|
+
|
48
|
+
it 'sets @api' do
|
49
|
+
expected_kind = PlatformAPI::Client
|
50
|
+
expect(subject.instance_variable_get(:@api)).to be_a(expected_kind)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
context 'without heroku key in YAML' do
|
55
|
+
before do
|
56
|
+
expect(Codeland::Starter::Configuration).to receive(:[]).with('heroku').once.and_return(nil)
|
57
|
+
expect(Codeland::Starter).to receive(:config).and_return(Codeland::Starter::Configuration.new(installed_yaml))
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'raises missing yaml' do
|
61
|
+
expect{ described_class.new }.to raise_error(Codeland::Starter::MissingYAML)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
describe '#create' do
|
68
|
+
before do
|
69
|
+
expect(Codeland::Starter).to receive(:name).and_return(name)
|
70
|
+
end
|
71
|
+
|
72
|
+
subject { described_class.new.create }
|
73
|
+
|
74
|
+
context 'wrong oauth token' do
|
75
|
+
let!(:name) { 'MyAppName' }
|
76
|
+
before { stub_heroku_error(Excon::Errors::Unauthorized) }
|
77
|
+
before { expect(Codeland::Starter).to receive(:config).and_return(Codeland::Starter::Configuration.new(installed_yaml)) }
|
78
|
+
before { expect(Codeland::Starter::Configuration).to receive(:[]).with('heroku').exactly(2).times.and_return({'oauth_token' => heroku_token}) }
|
79
|
+
before { allow_any_instance_of(described_class).to receive(:add_git_remote).and_return(nil) }
|
80
|
+
|
81
|
+
it 'raises MissingYAML' do
|
82
|
+
expect{ subject }.to raise_error(Codeland::Starter::MissingYAML)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
context 'app with name taken' do
|
87
|
+
subject { described_class.new }
|
88
|
+
let!(:name) { 'codeland' }
|
89
|
+
before do
|
90
|
+
expect(Codeland::Starter::Configuration).to receive(:[]).with('heroku').exactly(2).times.and_return({'oauth_token' => heroku_token})
|
91
|
+
error = Excon::Errors::UnprocessableEntity.new("UnprocessableEntity")
|
92
|
+
stub_heroku_error(error, name)
|
93
|
+
stub_heroku(heroku_file, 201, nil)
|
94
|
+
is_expected.to receive(:create_app).with(name).once.and_raise(error)
|
95
|
+
is_expected.to receive(:create_app).with(no_args).once
|
96
|
+
allow_any_instance_of(described_class).to receive(:add_git_remote).and_return(nil)
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'calls create with empty name' do
|
100
|
+
subject.create
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
context 'app with new unique name' do
|
105
|
+
before { expect(Codeland::Starter::Configuration).to receive(:[]).with('heroku').exactly(2).times.and_return({'oauth_token' => heroku_token}) }
|
106
|
+
before { stub_heroku(heroku_file) }
|
107
|
+
|
108
|
+
subject { described_class.new }
|
109
|
+
|
110
|
+
let!(:name) { 'new-app-for-codeland' }
|
111
|
+
|
112
|
+
context 'returned json have some keys' do
|
113
|
+
before { subject.create }
|
114
|
+
before { allow_any_instance_of(described_class).to receive(:add_git_remote).and_return(nil) }
|
115
|
+
|
116
|
+
%w(git_url id name web_url).each do |key|
|
117
|
+
it "includes #{key} key" do
|
118
|
+
expect(JSON.parse(subject.app)).to have_key('id')
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
context 'git remote' do
|
124
|
+
before do
|
125
|
+
expected = "git remote add heroku git_url"
|
126
|
+
expect(subject).to receive(:system).with(expected).once
|
127
|
+
end
|
128
|
+
|
129
|
+
it 'calls git remote add heroku' do
|
130
|
+
subject.create
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
describe '#output' do
|
137
|
+
before { expect(Codeland::Starter).to receive(:config).exactly(4).times.and_return(Codeland::Starter::Configuration.new(installed_yaml)) }
|
138
|
+
|
139
|
+
context 'default' do
|
140
|
+
it { expect(subject.output).to be_nil }
|
141
|
+
end
|
142
|
+
|
143
|
+
context 'successfull' do
|
144
|
+
it 'prints a message' do
|
145
|
+
expect(subject).to receive(:success?).and_return(true)
|
146
|
+
expect(STDOUT).to receive(:puts)
|
147
|
+
subject.output
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
describe '#perform' do
|
153
|
+
before { expect(Codeland::Starter).to receive(:config).exactly(4).times.and_return(Codeland::Starter::Configuration.new(installed_yaml)) }
|
154
|
+
|
155
|
+
context '#create' do
|
156
|
+
before do
|
157
|
+
expect_any_instance_of(Codeland::Starter::Integrations::Heroku).to receive(:create).once
|
158
|
+
expect_any_instance_of(Codeland::Starter::Integrations::Heroku).to receive(:output).once.and_return(nil)
|
159
|
+
end
|
160
|
+
|
161
|
+
it 'calls #create' do
|
162
|
+
subject.perform
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
context '#output' do
|
167
|
+
before do
|
168
|
+
expect_any_instance_of(Codeland::Starter::Integrations::Heroku).to receive(:create).once.and_return(nil)
|
169
|
+
expect_any_instance_of(Codeland::Starter::Integrations::Heroku).to receive(:output).once
|
170
|
+
end
|
171
|
+
|
172
|
+
it 'calls #output' do
|
173
|
+
subject.perform
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Codeland::Starter do
|
4
|
+
describe '.create_project' do
|
5
|
+
before do
|
6
|
+
allow(Codeland::Starter).to receive(:create_rails_project).and_return(true)
|
7
|
+
end
|
8
|
+
let!(:name) { 'app-name' }
|
9
|
+
let!(:installed_yaml) { File.join(File.dirname(__FILE__), '..', '..', 'lib', 'codeland', 'starter', 'codeland-starter.yml') }
|
10
|
+
|
11
|
+
context 'name' do
|
12
|
+
before { expect_any_instance_of(Codeland::Starter::Configuration).to receive(:integrations).exactly(2).times.and_return([]) }
|
13
|
+
|
14
|
+
it 'sets @name' do
|
15
|
+
subject.create_project(name, installed_yaml)
|
16
|
+
expect(subject.name).to eq(name)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'integrations' do
|
21
|
+
context 'with correct yaml' do
|
22
|
+
context 'empty integrations on yaml' do
|
23
|
+
before { expect_any_instance_of(Codeland::Starter::Configuration).to receive(:integrations).and_return([]) }
|
24
|
+
|
25
|
+
end
|
26
|
+
context 'with integrations' do
|
27
|
+
after { subject.create_project(name, installed_yaml) }
|
28
|
+
|
29
|
+
context 'defined integrations' do
|
30
|
+
let!(:integration) { 'heroku' }
|
31
|
+
let!(:integration_class) { Codeland::Starter::Integrations::Heroku }
|
32
|
+
before do
|
33
|
+
expect_any_instance_of(Codeland::Starter::Configuration).to receive(:integrations).exactly(2).times.and_return([integration])
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'calls integration#perform' do
|
37
|
+
expect_any_instance_of(integration_class).to receive(:perform).and_return(nil)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context 'not existing yaml' do
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe '.create_rails_project' do
|
49
|
+
subject { described_class }
|
50
|
+
let!(:app_name) { 'my-cool-app' }
|
51
|
+
before do
|
52
|
+
is_expected.to receive(:name).and_return(app_name).at_least(1).times
|
53
|
+
expected = "rails new #{app_name} --database=postgresql --template=#{File.join(described_class::ROOT_PATH, 'template', 'codeland.rb')} --skip-bundle --skip-test-unit"
|
54
|
+
expect(described_class).to receive(:system).with(expected).once.and_return(nil)
|
55
|
+
expect(Dir).to receive(:chdir).with(app_name).once.and_return(nil)
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'calls rails new app_name with correct options' do
|
59
|
+
subject.create_rails_project
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,276 @@
|
|
1
|
+
def source_paths
|
2
|
+
[
|
3
|
+
File.join(File.expand_path(File.dirname(__FILE__)), 'files')
|
4
|
+
] + Array(super)
|
5
|
+
end
|
6
|
+
|
7
|
+
def rails_4?
|
8
|
+
Rails.gem_version >= Gem::Version.new('4.2')
|
9
|
+
end
|
10
|
+
|
11
|
+
run 'bundle install --quiet'
|
12
|
+
git :init
|
13
|
+
git :add => '.'
|
14
|
+
git :commit => %Q{ -m 'Initial commit' --quiet }
|
15
|
+
|
16
|
+
# Ruby and Rails check
|
17
|
+
if Gem::Version.new(RUBY_VERSION) > Gem::Version.new('2.0')
|
18
|
+
if yes?("You are using #{RUBY_VERSION}. Is the version of the project?")
|
19
|
+
insert_into_file 'Gemfile', "ruby '#{RUBY_VERSION}'\n", :after => "source 'https://rubygems.org'\n\n"
|
20
|
+
end
|
21
|
+
else
|
22
|
+
puts '******* WARNING *******'
|
23
|
+
puts "Your Ruby version #{RUBY_VERSION} is too old"
|
24
|
+
puts 'Please upgrade to ruby 2.2 or more'
|
25
|
+
end
|
26
|
+
|
27
|
+
gem_group :development, :test do
|
28
|
+
unless rails_4?
|
29
|
+
gem 'pry-rails', '~> 0.3.2'
|
30
|
+
end
|
31
|
+
gem 'machinist', '~> 2.0'
|
32
|
+
gem 'rspec-rails', '~> 3.2.0'
|
33
|
+
gem 'awesome_print', '~> 1.6.1', :require => false
|
34
|
+
gem 'spring-commands-rspec', '~> 1.0.4'
|
35
|
+
gem 'thin', '~> 1.6.3'
|
36
|
+
end
|
37
|
+
|
38
|
+
gem_group :test do
|
39
|
+
gem 'simplecov', '~> 0.9.2', :require => false
|
40
|
+
gem 'database_cleaner', '~> 1.4.1'
|
41
|
+
gem 'shoulda-matchers', '~> 2.8.0', :require => false
|
42
|
+
gem 'capybara'
|
43
|
+
gem 'selenium-webdriver'
|
44
|
+
end
|
45
|
+
run 'bundle install --quiet'
|
46
|
+
run 'bundle exec spring binstub rspec'
|
47
|
+
generate :'machinist:install'
|
48
|
+
generate :'rspec:install'
|
49
|
+
inside 'spec' do
|
50
|
+
insert_into_file 'rails_helper.rb', "\nrequire 'shoulda-matchers'", :after => "require 'rspec/rails'"
|
51
|
+
insert_into_file 'rails_helper.rb', "\nrequire 'capybara/rspec'", :after => "require 'rspec/rails'"
|
52
|
+
insert_into_file 'rails_helper.rb', "\nrequire 'capybara/rails'", :after => "require 'rspec/rails'"
|
53
|
+
insert_into_file 'rails_helper.rb', "\nrequire Rails.root.join('spec', 'support', 'blueprints.rb')
|
54
|
+
|
55
|
+
Capybara.javascript_driver = :selenium
|
56
|
+
Capybara.server_port = 52662
|
57
|
+
Capybara.exact = true\n", :after => "require 'shoulda-matchers'"
|
58
|
+
insert_into_file 'rails_helper.rb', "require 'simplecov'
|
59
|
+
SimpleCov.start('rails')\n", :before => "require 'spec_helper'"
|
60
|
+
|
61
|
+
insert_into_file 'rails_helper.rb', "\nconfig.before(:suite) do
|
62
|
+
DatabaseCleaner.strategy = :transaction
|
63
|
+
DatabaseCleaner.clean_with(:truncation)
|
64
|
+
end
|
65
|
+
|
66
|
+
config.before(:each) do
|
67
|
+
DatabaseCleaner.start
|
68
|
+
end
|
69
|
+
|
70
|
+
config.after(:each) do
|
71
|
+
DatabaseCleaner.clean
|
72
|
+
end", :after => 'config.infer_spec_type_from_file_location!'
|
73
|
+
end
|
74
|
+
append_to_file '.gitignore', "coverage/\n"
|
75
|
+
append_to_file '.gitignore', "public/uploads/\n"
|
76
|
+
git :add => '.'
|
77
|
+
git :commit => %Q{ -m 'Development & test setup (specs and utilities)' --quiet }
|
78
|
+
|
79
|
+
application <<-CONFIG
|
80
|
+
config.generators do |g|
|
81
|
+
g.javascripts false
|
82
|
+
g.stylesheets false
|
83
|
+
g.helper false
|
84
|
+
g.template_engine :slim
|
85
|
+
g.test_framework :rspec,
|
86
|
+
view_specs: false,
|
87
|
+
helper_specs: false
|
88
|
+
g.fixtures_replacement :machinist
|
89
|
+
end
|
90
|
+
CONFIG
|
91
|
+
git :add => '.'
|
92
|
+
git :commit => %Q{ -m 'Configure generators' --quiet }
|
93
|
+
|
94
|
+
gem 'initjs', '~> 2.1.2'
|
95
|
+
run 'bundle install --quiet'
|
96
|
+
generate :'initjs:install'
|
97
|
+
inside 'app' do
|
98
|
+
inside 'assets' do
|
99
|
+
inside 'javascripts' do
|
100
|
+
gsub_file 'application.js', 'require_tree .', "require_tree ./#{@app_name.underscore}"
|
101
|
+
create_file 'lib/.keep'
|
102
|
+
insert_into_file 'application.js', "//= require_tree ./lib\n", :after => "//= require turbolinks\n"
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
git :add => '.'
|
107
|
+
git :commit => %Q{ -m 'Install Initjs' --quiet }
|
108
|
+
|
109
|
+
gem 'rails-i18n', '~> 4.0.4'
|
110
|
+
run 'bundle install --quiet'
|
111
|
+
|
112
|
+
if yes?('Config for pt-BR?')
|
113
|
+
application %Q{config.i18n.enforce_available_locales = false}
|
114
|
+
application %Q{config.i18n.available_locales = %i(pt-BR en)}
|
115
|
+
application %Q{config.i18n.default_locale = :'pt-BR'}
|
116
|
+
application %Q{config.i18n.locale = :'pt-BR'}
|
117
|
+
application %Q{config.time_zone = 'Brasilia'}
|
118
|
+
end
|
119
|
+
git :add => '.'
|
120
|
+
git :commit => %Q{ -m 'Install Rails-i18n' --quiet }
|
121
|
+
|
122
|
+
gem 'slim-rails', '~> 3.0.1'
|
123
|
+
run 'bundle install --quiet'
|
124
|
+
application %Q(config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }), :env => 'development'
|
125
|
+
application 'Slim::Engine.set_options pretty: true', :env => 'development'
|
126
|
+
git :add => '.'
|
127
|
+
git :commit => %Q{ -m 'Install Slim-rails' --quiet }
|
128
|
+
|
129
|
+
if yes?('Install Devise?')
|
130
|
+
gem 'devise', '~> 3.4.1'
|
131
|
+
gem 'devise-i18n'
|
132
|
+
run 'bundle install --quiet'
|
133
|
+
generate :'devise:install'
|
134
|
+
git :add => '.'
|
135
|
+
git :commit => %Q{ -m 'Install Devise' --quiet }
|
136
|
+
end
|
137
|
+
|
138
|
+
if yes?('Install ActiveAdmin?')
|
139
|
+
gem 'activeadmin', :github => 'gregbell/active_admin'
|
140
|
+
run 'bundle install --quiet'
|
141
|
+
generate :'active_admin:install'
|
142
|
+
git :add => '.'
|
143
|
+
git :commit => %Q{ -m 'Install Activeadmin' --quiet }
|
144
|
+
end
|
145
|
+
|
146
|
+
if yes?('Install Simpleform?')
|
147
|
+
gem 'simple_form', '~> 3.1.0'
|
148
|
+
run 'bundle install --quiet'
|
149
|
+
generate :'simple_form:install', '--bootstrap'
|
150
|
+
|
151
|
+
git :add => '.'
|
152
|
+
git :commit => %Q{ -m 'Install Simpleform' --quiet }
|
153
|
+
end
|
154
|
+
|
155
|
+
if yes?('Install Pundit?')
|
156
|
+
gem 'pundit', '~> 0.3.0'
|
157
|
+
run 'bundle install --quiet'
|
158
|
+
generate :'pundit:install'
|
159
|
+
inside 'app' do
|
160
|
+
inside 'controllers' do
|
161
|
+
insert_into_file 'application_controller.rb', " include Pundit\n", :after => "class ApplicationController < ActionController::Base\n"
|
162
|
+
insert_into_file 'application_controller.rb', '
|
163
|
+
rescue_from Pundit::NotAuthorizedError, with: :user_not_authorized
|
164
|
+
|
165
|
+
private
|
166
|
+
|
167
|
+
def user_not_authorized
|
168
|
+
flash[:error] = "Você não tem permissão para fazer isso."
|
169
|
+
redirect_to(request.referrer || root_path)
|
170
|
+
end
|
171
|
+
', :after => "protect_from_forgery with: :exception\n"
|
172
|
+
end
|
173
|
+
end
|
174
|
+
git :add => '.'
|
175
|
+
git :commit => %Q{ -m 'Install Pundit' --quiet }
|
176
|
+
end
|
177
|
+
|
178
|
+
# Front-end stuffs
|
179
|
+
|
180
|
+
gem 'autoprefixer-rails'
|
181
|
+
gem 'bootstrap-sass', '~> 3.3.3'
|
182
|
+
gem 'font-awesome-rails'
|
183
|
+
run 'bundle install --quiet'
|
184
|
+
|
185
|
+
inside 'app' do
|
186
|
+
inside 'assets' do
|
187
|
+
inside 'stylesheets' do
|
188
|
+
directory 'base'
|
189
|
+
directory 'organisms'
|
190
|
+
directory 'molecules'
|
191
|
+
directory 'atoms'
|
192
|
+
remove_file 'application.css'
|
193
|
+
copy_file 'application.scss'
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
inside 'views' do
|
198
|
+
directory 'partials'
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
if yes?('Install NProgress?')
|
203
|
+
gem 'nprogress-rails'
|
204
|
+
run 'bundle install --quiet'
|
205
|
+
inside 'app' do
|
206
|
+
inside 'assets' do
|
207
|
+
inside 'javascripts' do
|
208
|
+
insert_into_file 'application.js', "//= require nprogress\n", :after => "//= require turbolinks\n"
|
209
|
+
insert_into_file 'application.js', "//= require nprogress-turbolinks\n", :after => "//= require nprogress\n"
|
210
|
+
end
|
211
|
+
|
212
|
+
inside 'stylesheets' do
|
213
|
+
append_to_file 'application.scss', <<NPROGRESS
|
214
|
+
|
215
|
+
// ==== NProgress
|
216
|
+
// $nprogress-color : ;
|
217
|
+
// $nprogress-height: ;
|
218
|
+
@import "nprogress";
|
219
|
+
NPROGRESS
|
220
|
+
end
|
221
|
+
end
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
git :add => '.'
|
226
|
+
git :commit => %Q{ -m 'Setup front-end files' --quiet }
|
227
|
+
|
228
|
+
inside 'app' do
|
229
|
+
inside 'assets' do
|
230
|
+
inside 'javascripts' do
|
231
|
+
template 'flash.js.coffee.erb', "#{app_name.underscore}/flash.js.coffee"
|
232
|
+
gsub_file "#{app_name.underscore}/#{app_name.underscore}.js.coffee", ' modules: -> []', <<MODULE
|
233
|
+
modules: ->
|
234
|
+
[
|
235
|
+
#{app_const_base}.Flash
|
236
|
+
]
|
237
|
+
MODULE
|
238
|
+
end
|
239
|
+
end
|
240
|
+
inside 'views' do
|
241
|
+
inside 'layouts' do
|
242
|
+
copy_file '_flash.html.slim'
|
243
|
+
template 'application.html.slim.erb', 'application.html.slim'
|
244
|
+
remove_file 'application.html.erb'
|
245
|
+
end
|
246
|
+
end
|
247
|
+
end
|
248
|
+
|
249
|
+
git :add => '.'
|
250
|
+
git :commit => %Q{ -m 'Setup default flash messages' --quiet }
|
251
|
+
|
252
|
+
gem_group :production do
|
253
|
+
gem 'rails_12factor', '~> 0.0.3'
|
254
|
+
gem 'passenger', '~> 5.0'
|
255
|
+
end
|
256
|
+
run 'bundle install --quiet'
|
257
|
+
copy_file 'Procfile'
|
258
|
+
git :add => '.'
|
259
|
+
git :commit => %Q{ -m 'Heroku setup' --quiet }
|
260
|
+
|
261
|
+
append_to_file '.gitignore', "config/database.yml\n"
|
262
|
+
inside 'config' do
|
263
|
+
git :mv => %Q{ database.yml database.yml.sample }
|
264
|
+
end
|
265
|
+
git :commit => %Q{ -a -m 'Ignore database.yml in favor of a example' --quiet }
|
266
|
+
|
267
|
+
inside 'bin' do
|
268
|
+
uncomment_lines 'setup', /(Copying|end$|config\/database)/
|
269
|
+
insert_into_file 'setup', " system \"vi config/database.yml\"\n", :after => "config/database.yml\"\n"
|
270
|
+
end
|
271
|
+
|
272
|
+
git :commit => %Q{ -a -m 'Change bin/setup to copy database.yml' --quiet }
|
273
|
+
|
274
|
+
puts '=' * 60
|
275
|
+
puts 'Project created. Run `bin/setup` to complete the installation.'
|
276
|
+
puts '=' * 60
|