trokko 0.2.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 +7 -0
- data/.rspec +3 -0
- data/.rubocop.yml +20 -0
- data/.rubocop_todo.yml +17 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +43 -0
- data/Gemfile +17 -0
- data/Gemfile.lock +76 -0
- data/LICENSE +21 -0
- data/README.md +50 -0
- data/Rakefile +17 -0
- data/docs/images/cover-image.png +0 -0
- data/exe/trokko +4 -0
- data/lib/trokko/cli.rb +162 -0
- data/lib/trokko/scaffolders/config/database.rb +37 -0
- data/lib/trokko/scaffolders/docker_compose.rb +44 -0
- data/lib/trokko/scaffolders/dockerfile.rb +38 -0
- data/lib/trokko/scaffolders/entrypoint.rb +23 -0
- data/lib/trokko/scaffolders/gemfile.rb +24 -0
- data/lib/trokko/templates/Dockerfile.erb +17 -0
- data/lib/trokko/templates/Gemfile.erb +2 -0
- data/lib/trokko/templates/config/database/mysql.yml.erb +4 -0
- data/lib/trokko/templates/config/database/postgresql.yml.erb +3 -0
- data/lib/trokko/templates/config/database.yml.erb +18 -0
- data/lib/trokko/templates/docker-compose.yml.erb +23 -0
- data/lib/trokko/templates/docker_compose/mysql/app_service.erb +2 -0
- data/lib/trokko/templates/docker_compose/mysql/db_service.erb +8 -0
- data/lib/trokko/templates/docker_compose/postgresql/app_service.erb +0 -0
- data/lib/trokko/templates/docker_compose/postgresql/db_service.erb +5 -0
- data/lib/trokko/templates/entrypoint.sh.erb +12 -0
- data/lib/trokko/version.rb +5 -0
- data/lib/trokko.rb +13 -0
- data/sig/trokko.rbs +4 -0
- metadata +96 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 66ea7fb21c0fcfa9f41f7bff08b4d3cbc55353a281ad0fe229dbfa25e1680673
|
|
4
|
+
data.tar.gz: c4f79262437fb593cee9ce35f168791de1c59ccd7da9ecce76224741ae235ddd
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 6da449d463753931d070908a0a52033842fcb2cb1325d5d6640ea11fcb7b7dbbb0e4b72473b94793d983b63119ae923580c02a5d6ab15871d39907cca8ed87b6
|
|
7
|
+
data.tar.gz: 2f620fd05c86246c7e895e03f9059cf590662cd04ffd34d9f6299af96c5aada134b15493402024725fac67cd46fde2e141dd6fd7b43a106eb9b27ddc9aafe3a4
|
data/.rspec
ADDED
data/.rubocop.yml
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
require:
|
|
2
|
+
- rubocop-rspec
|
|
3
|
+
- rubocop-rake
|
|
4
|
+
|
|
5
|
+
inherit_from: .rubocop_todo.yml
|
|
6
|
+
|
|
7
|
+
AllCops:
|
|
8
|
+
TargetRubyVersion: 2.7
|
|
9
|
+
NewCops: enable
|
|
10
|
+
Exclude:
|
|
11
|
+
- exe/**/*
|
|
12
|
+
- vendor/**/*
|
|
13
|
+
- sandbox/**/*
|
|
14
|
+
|
|
15
|
+
Layout/LineLength:
|
|
16
|
+
Max: 120
|
|
17
|
+
|
|
18
|
+
Metrics/BlockLength:
|
|
19
|
+
Exclude:
|
|
20
|
+
- spec/**/*_spec.rb
|
data/.rubocop_todo.yml
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# This configuration was generated by
|
|
2
|
+
# `rubocop --auto-gen-config`
|
|
3
|
+
# on 2022-06-25 14:58:22 UTC using RuboCop version 1.30.1.
|
|
4
|
+
# The point is for the user to remove these configuration records
|
|
5
|
+
# one by one as the offenses are removed from the code base.
|
|
6
|
+
# Note that changes in the inspected code, or installation of new
|
|
7
|
+
# versions of RuboCop, may require this file to be generated again.
|
|
8
|
+
|
|
9
|
+
# Offense count: 1
|
|
10
|
+
# Configuration parameters: CountComments, CountAsOne.
|
|
11
|
+
Metrics/ClassLength:
|
|
12
|
+
Max: 111
|
|
13
|
+
|
|
14
|
+
# Offense count: 1
|
|
15
|
+
# Configuration parameters: CountComments, CountAsOne, ExcludedMethods, IgnoredMethods.
|
|
16
|
+
Metrics/MethodLength:
|
|
17
|
+
Max: 18
|
data/.ruby-version
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
2.7.6
|
data/CHANGELOG.md
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## [v0.2.0](https://github.com/snaka/trokko/tree/v0.2.0) (2022-07-01)
|
|
4
|
+
|
|
5
|
+
[Full Changelog](https://github.com/snaka/trokko/compare/v0.1.0...v0.2.0)
|
|
6
|
+
|
|
7
|
+
**Closed issues:**
|
|
8
|
+
|
|
9
|
+
- A gem with the same name already exists [\#16](https://github.com/snaka/trokko/issues/16)
|
|
10
|
+
|
|
11
|
+
**Merged pull requests:**
|
|
12
|
+
|
|
13
|
+
- Bump version to 0.2.0 [\#21](https://github.com/snaka/trokko/pull/21) ([snaka](https://github.com/snaka))
|
|
14
|
+
- Support ruby 2.7 [\#20](https://github.com/snaka/trokko/pull/20) ([snaka](https://github.com/snaka))
|
|
15
|
+
- Rename to `trokko` [\#19](https://github.com/snaka/trokko/pull/19) ([snaka](https://github.com/snaka))
|
|
16
|
+
- Test cli [\#18](https://github.com/snaka/trokko/pull/18) ([snaka](https://github.com/snaka))
|
|
17
|
+
- refine gemspec text [\#17](https://github.com/snaka/trokko/pull/17) ([snaka](https://github.com/snaka))
|
|
18
|
+
|
|
19
|
+
## [v0.1.0](https://github.com/snaka/trokko/tree/v0.1.0) (2022-06-29)
|
|
20
|
+
|
|
21
|
+
[Full Changelog](https://github.com/snaka/trokko/compare/bf6b53382c31098eddcd4f1e393810b2c5dea43b...v0.1.0)
|
|
22
|
+
|
|
23
|
+
**Merged pull requests:**
|
|
24
|
+
|
|
25
|
+
- Centerize cover image [\#15](https://github.com/snaka/trokko/pull/15) ([snaka](https://github.com/snaka))
|
|
26
|
+
- Add version option [\#14](https://github.com/snaka/trokko/pull/14) ([snaka](https://github.com/snaka))
|
|
27
|
+
- fix undefined identifier [\#13](https://github.com/snaka/trokko/pull/13) ([snaka](https://github.com/snaka))
|
|
28
|
+
- A unique label is added to the Docker volume to be created. [\#12](https://github.com/snaka/trokko/pull/12) ([snaka](https://github.com/snaka))
|
|
29
|
+
- Fix docker compose template [\#11](https://github.com/snaka/trokko/pull/11) ([snaka](https://github.com/snaka))
|
|
30
|
+
- Fix Gemfile.lock location [\#10](https://github.com/snaka/trokko/pull/10) ([snaka](https://github.com/snaka))
|
|
31
|
+
- refine README [\#9](https://github.com/snaka/trokko/pull/9) ([snaka](https://github.com/snaka))
|
|
32
|
+
- Templatization [\#8](https://github.com/snaka/trokko/pull/8) ([snaka](https://github.com/snaka))
|
|
33
|
+
- Add --skip-build option [\#7](https://github.com/snaka/trokko/pull/7) ([snaka](https://github.com/snaka))
|
|
34
|
+
- Remove unnecessary require 'debug' [\#6](https://github.com/snaka/trokko/pull/6) ([snaka](https://github.com/snaka))
|
|
35
|
+
- Remove unnecessary nodejs installation from the Dockerfile [\#5](https://github.com/snaka/trokko/pull/5) ([snaka](https://github.com/snaka))
|
|
36
|
+
- Maintain readme [\#4](https://github.com/snaka/trokko/pull/4) ([snaka](https://github.com/snaka))
|
|
37
|
+
- fix typo [\#3](https://github.com/snaka/trokko/pull/3) ([snaka](https://github.com/snaka))
|
|
38
|
+
- Implement CLI [\#2](https://github.com/snaka/trokko/pull/2) ([snaka](https://github.com/snaka))
|
|
39
|
+
- Implement scaffolders [\#1](https://github.com/snaka/trokko/pull/1) ([snaka](https://github.com/snaka))
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
\* *This Changelog was automatically generated by [github_changelog_generator](https://github.com/github-changelog-generator/github-changelog-generator)*
|
data/Gemfile
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
source 'https://rubygems.org'
|
|
4
|
+
|
|
5
|
+
# Specify your gem's dependencies in trokko.gemspec
|
|
6
|
+
gemspec
|
|
7
|
+
|
|
8
|
+
gem 'rake', '~> 13.0'
|
|
9
|
+
|
|
10
|
+
gem 'rspec', '~> 3.0'
|
|
11
|
+
gem 'rspec-temp_dir', '~> 1.1'
|
|
12
|
+
|
|
13
|
+
gem 'rubocop', '~> 1.21'
|
|
14
|
+
gem 'rubocop-rake', '~> 0.6'
|
|
15
|
+
gem 'rubocop-rspec', '~> 2.11'
|
|
16
|
+
|
|
17
|
+
gem 'debug', '~> 1.0'
|
data/Gemfile.lock
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
PATH
|
|
2
|
+
remote: .
|
|
3
|
+
specs:
|
|
4
|
+
trokko (0.2.0)
|
|
5
|
+
thor (~> 1.2.0)
|
|
6
|
+
|
|
7
|
+
GEM
|
|
8
|
+
remote: https://rubygems.org/
|
|
9
|
+
specs:
|
|
10
|
+
ast (2.4.2)
|
|
11
|
+
debug (1.0.0)
|
|
12
|
+
irb
|
|
13
|
+
reline (>= 0.2.7)
|
|
14
|
+
diff-lcs (1.5.0)
|
|
15
|
+
io-console (0.5.11)
|
|
16
|
+
irb (1.4.1)
|
|
17
|
+
reline (>= 0.3.0)
|
|
18
|
+
parallel (1.22.1)
|
|
19
|
+
parser (3.1.2.0)
|
|
20
|
+
ast (~> 2.4.1)
|
|
21
|
+
rainbow (3.1.1)
|
|
22
|
+
rake (13.0.6)
|
|
23
|
+
regexp_parser (2.5.0)
|
|
24
|
+
reline (0.3.1)
|
|
25
|
+
io-console (~> 0.5)
|
|
26
|
+
rexml (3.2.5)
|
|
27
|
+
rspec (3.11.0)
|
|
28
|
+
rspec-core (~> 3.11.0)
|
|
29
|
+
rspec-expectations (~> 3.11.0)
|
|
30
|
+
rspec-mocks (~> 3.11.0)
|
|
31
|
+
rspec-core (3.11.0)
|
|
32
|
+
rspec-support (~> 3.11.0)
|
|
33
|
+
rspec-expectations (3.11.0)
|
|
34
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
|
35
|
+
rspec-support (~> 3.11.0)
|
|
36
|
+
rspec-mocks (3.11.1)
|
|
37
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
|
38
|
+
rspec-support (~> 3.11.0)
|
|
39
|
+
rspec-support (3.11.0)
|
|
40
|
+
rspec-temp_dir (1.1.1)
|
|
41
|
+
rspec (>= 3.0)
|
|
42
|
+
rubocop (1.30.1)
|
|
43
|
+
parallel (~> 1.10)
|
|
44
|
+
parser (>= 3.1.0.0)
|
|
45
|
+
rainbow (>= 2.2.2, < 4.0)
|
|
46
|
+
regexp_parser (>= 1.8, < 3.0)
|
|
47
|
+
rexml (>= 3.2.5, < 4.0)
|
|
48
|
+
rubocop-ast (>= 1.18.0, < 2.0)
|
|
49
|
+
ruby-progressbar (~> 1.7)
|
|
50
|
+
unicode-display_width (>= 1.4.0, < 3.0)
|
|
51
|
+
rubocop-ast (1.18.0)
|
|
52
|
+
parser (>= 3.1.1.0)
|
|
53
|
+
rubocop-rake (0.6.0)
|
|
54
|
+
rubocop (~> 1.0)
|
|
55
|
+
rubocop-rspec (2.11.1)
|
|
56
|
+
rubocop (~> 1.19)
|
|
57
|
+
ruby-progressbar (1.11.0)
|
|
58
|
+
thor (1.2.1)
|
|
59
|
+
unicode-display_width (2.1.0)
|
|
60
|
+
|
|
61
|
+
PLATFORMS
|
|
62
|
+
ruby
|
|
63
|
+
x86_64-linux
|
|
64
|
+
|
|
65
|
+
DEPENDENCIES
|
|
66
|
+
debug (~> 1.0)
|
|
67
|
+
rake (~> 13.0)
|
|
68
|
+
rspec (~> 3.0)
|
|
69
|
+
rspec-temp_dir (~> 1.1)
|
|
70
|
+
rubocop (~> 1.21)
|
|
71
|
+
rubocop-rake (~> 0.6)
|
|
72
|
+
rubocop-rspec (~> 2.11)
|
|
73
|
+
trokko!
|
|
74
|
+
|
|
75
|
+
BUNDLED WITH
|
|
76
|
+
2.3.14
|
data/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2022 Shinji Nakamatsu
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
data/README.md
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="docs/images/cover-image.png?raw=true" width="600px">
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
# Trokko
|
|
6
|
+
|
|
7
|
+
Do you think the steps involved in building a Rails application development environment with Docker are too complicated?
|
|
8
|
+
|
|
9
|
+
The `trokko` command solves this for you.
|
|
10
|
+
|
|
11
|
+
The `trokko` command prepares the specified `Gemfile` template.
|
|
12
|
+
It will prepare a `Dockerfile` or `docker-compose.yml` depending on the specified DBMS.
|
|
13
|
+
Then, it runs `rails new` and gets you ready to start development right away.
|
|
14
|
+
It takes about a minute.
|
|
15
|
+
|
|
16
|
+
## Installation
|
|
17
|
+
|
|
18
|
+
The installation process is as follows
|
|
19
|
+
|
|
20
|
+
$ gem install trokko
|
|
21
|
+
|
|
22
|
+
## Usage
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
Usage:
|
|
26
|
+
trokko generate [NAME]
|
|
27
|
+
|
|
28
|
+
Options:
|
|
29
|
+
[--ruby-version=RUBY_VERSION] # Ruby version (docker image tag)
|
|
30
|
+
# Default: latest
|
|
31
|
+
[--db=DB]
|
|
32
|
+
# Default: mysql
|
|
33
|
+
# Possible values: mysql, postgresql
|
|
34
|
+
[--skip-build], [--no-skip-build] # Skip build
|
|
35
|
+
[--force] # Force to execute
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Development
|
|
39
|
+
|
|
40
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
|
41
|
+
|
|
42
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
|
43
|
+
|
|
44
|
+
## Contributing
|
|
45
|
+
|
|
46
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/snaka/trokko.
|
|
47
|
+
|
|
48
|
+
## License
|
|
49
|
+
|
|
50
|
+
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/Rakefile
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'bundler/gem_tasks'
|
|
4
|
+
require 'rspec/core/rake_task'
|
|
5
|
+
|
|
6
|
+
RSpec::Core::RakeTask.new(:spec)
|
|
7
|
+
|
|
8
|
+
require 'rubocop/rake_task'
|
|
9
|
+
|
|
10
|
+
RuboCop::RakeTask.new
|
|
11
|
+
|
|
12
|
+
task default: %i[spec rubocop]
|
|
13
|
+
|
|
14
|
+
desc 'Execute sandbox test'
|
|
15
|
+
task :sandbox do
|
|
16
|
+
system 'bundle exec exe/trokko generate sandbox --force'
|
|
17
|
+
end
|
|
Binary file
|
data/exe/trokko
ADDED
data/lib/trokko/cli.rb
ADDED
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'fileutils'
|
|
4
|
+
require 'thor'
|
|
5
|
+
require 'trokko'
|
|
6
|
+
|
|
7
|
+
module Trokko
|
|
8
|
+
# Generate rails application
|
|
9
|
+
class Generate < Thor::Group
|
|
10
|
+
include Thor::Actions
|
|
11
|
+
|
|
12
|
+
desc 'Generate rails application on docker'
|
|
13
|
+
|
|
14
|
+
argument :name, type: :string, required: false
|
|
15
|
+
|
|
16
|
+
class_option :ruby_version, default: 'latest', desc: 'Ruby version (docker image tag)'
|
|
17
|
+
class_option :db, default: 'mysql', enum: %w[mysql postgresql], desc: 'DBMS to use'
|
|
18
|
+
class_option :skip_build, type: :boolean, default: false, desc: 'Skip build'
|
|
19
|
+
class_option :force, type: :boolean, default: false, desc: 'Force to execute'
|
|
20
|
+
|
|
21
|
+
def self.source_root
|
|
22
|
+
File.dirname(__FILE__)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def ask_project_name
|
|
26
|
+
@name = ask('Project name:') unless name
|
|
27
|
+
return unless @name.empty?
|
|
28
|
+
|
|
29
|
+
CLI.command_help(shell, 'generate')
|
|
30
|
+
say 'Stop executing task', :red
|
|
31
|
+
raise Thor::InvocationError, '[ERROR] Project name is required'
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def confirm
|
|
35
|
+
say "- Project name: #{name}", :cyan
|
|
36
|
+
say "- Ruby version: #{ruby_version}", :cyan
|
|
37
|
+
say "- Database: #{db}", :cyan
|
|
38
|
+
|
|
39
|
+
return if ask('Are you sure to execute the settings described above?', limited_to: %w[y n]) == 'y'
|
|
40
|
+
|
|
41
|
+
say 'Stop executing task', :red
|
|
42
|
+
raise Thor::InvocationError, 'You choose *NOT* to execute.'
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def check_directory
|
|
46
|
+
say 'check directory...', :yellow
|
|
47
|
+
say File.exist?(name)
|
|
48
|
+
return unless File.exist?(name)
|
|
49
|
+
FileUtils.remove_dir(name) and return if force
|
|
50
|
+
|
|
51
|
+
say 'Stop executing task', :red
|
|
52
|
+
raise Thor::InvocationError,
|
|
53
|
+
"[ERROR] Directory '#{name}' already exists. " \
|
|
54
|
+
"If you are sure executing is OK, specify the '--force' option. The directory will be removed."
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def dockerfile
|
|
58
|
+
say 'Generating Dockerfile...', :yellow
|
|
59
|
+
Scaffolders::Dockerfile.new(ruby_version: ruby_version, db: db, thor: self).generate
|
|
60
|
+
Scaffolders::Entrypoint.new(thor: self).generate
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def gemfile
|
|
64
|
+
say 'Generating Gemfile...', :yellow
|
|
65
|
+
Scaffolders::Gemfile.new(rails_version: '7.0.0', thor: self).generate
|
|
66
|
+
inside name do
|
|
67
|
+
FileUtils.touch 'Gemfile.lock'
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def docker_compose
|
|
72
|
+
say 'Generating docker-compose.yml...', :yellow
|
|
73
|
+
Scaffolders::DockerCompose.new(db: db, thor: self).generate
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def rails_new
|
|
77
|
+
say 'Generating rails application...', :yellow
|
|
78
|
+
inside name do
|
|
79
|
+
unless system(
|
|
80
|
+
"docker compose run --no-deps --entrypoint '' --rm app" \
|
|
81
|
+
" bundle exec rails new . --database=#{db} --force"
|
|
82
|
+
)
|
|
83
|
+
say 'Stop executing task', :red
|
|
84
|
+
raise Thor::InvocationError, '[ERROR] Failed to generate rails application'
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
return if File.stat('config').uid == uid
|
|
88
|
+
|
|
89
|
+
unless system(
|
|
90
|
+
"docker compose run --no-deps --entrypoint '' --rm app" \
|
|
91
|
+
" chown -R #{uid}:#{gid} ."
|
|
92
|
+
)
|
|
93
|
+
say 'Stop executing task', :red
|
|
94
|
+
raise Thor::InvocationError, '[ERROR] Failed to change owner of generated files'
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def post_rails_new
|
|
100
|
+
say 'Generating database.yml...', :yellow
|
|
101
|
+
Scaffolders::Config::Database.new(db: db, thor: self).generate
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def docker
|
|
105
|
+
return if skip_build
|
|
106
|
+
|
|
107
|
+
say 'Building docker image...', :yellow
|
|
108
|
+
inside name do
|
|
109
|
+
return if system('docker compose build')
|
|
110
|
+
|
|
111
|
+
say 'Stop executing task', :red
|
|
112
|
+
raise Thor::InvocationError, '[ERROR] Failed to build docker image'
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def finished
|
|
117
|
+
say 'Finished!', :green
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
private
|
|
121
|
+
|
|
122
|
+
def force
|
|
123
|
+
options[:force]
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def ruby_version
|
|
127
|
+
options[:ruby_version]
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def db
|
|
131
|
+
options[:db]
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def skip_build
|
|
135
|
+
options[:skip_build]
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def uid
|
|
139
|
+
Process.uid
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def gid
|
|
143
|
+
Process.gid
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
# CLI for Trokko
|
|
148
|
+
class CLI < Thor
|
|
149
|
+
def self.exit_on_failure?
|
|
150
|
+
true
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
register(Generate, 'generate', 'generate [NAME]', 'Generate a Rails application with the specified name')
|
|
154
|
+
tasks['generate'].options = Generate.class_options
|
|
155
|
+
|
|
156
|
+
desc 'version', 'Show version'
|
|
157
|
+
def version
|
|
158
|
+
say "trokko #{Trokko::VERSION}"
|
|
159
|
+
end
|
|
160
|
+
map %w[-v --version] => :version
|
|
161
|
+
end
|
|
162
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Trokko
|
|
4
|
+
module Scaffolders
|
|
5
|
+
module Config
|
|
6
|
+
# Generating config/database.yml file according to configurations
|
|
7
|
+
class Database
|
|
8
|
+
attr_reader :db, :thor
|
|
9
|
+
|
|
10
|
+
def initialize(db:, thor:)
|
|
11
|
+
@db = db
|
|
12
|
+
@thor = thor
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def generate
|
|
16
|
+
thor.template(
|
|
17
|
+
'templates/config/database.yml.erb',
|
|
18
|
+
"#{thor.name}/config/database.yml",
|
|
19
|
+
force: true,
|
|
20
|
+
context: binding
|
|
21
|
+
)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
private
|
|
25
|
+
|
|
26
|
+
def db_config
|
|
27
|
+
erb_source = File.read("#{source_root}/templates/config/database/#{db}.yml.erb")
|
|
28
|
+
ERB.new(erb_source).result(binding)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def source_root
|
|
32
|
+
thor.class.source_root
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Trokko
|
|
4
|
+
module Scaffolders
|
|
5
|
+
# Generating docker-compose file according to configuration
|
|
6
|
+
class DockerCompose
|
|
7
|
+
attr_reader :db, :thor
|
|
8
|
+
|
|
9
|
+
def initialize(db:, thor:)
|
|
10
|
+
@db = db
|
|
11
|
+
@thor = thor
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def generate
|
|
15
|
+
thor.template(
|
|
16
|
+
'templates/docker-compose.yml.erb',
|
|
17
|
+
"#{thor.name}/docker-compose.yml",
|
|
18
|
+
force: true,
|
|
19
|
+
context: binding
|
|
20
|
+
)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
private
|
|
24
|
+
|
|
25
|
+
def db_service_config
|
|
26
|
+
erb_source = File.read("#{source_root}/templates/docker_compose/#{db}/db_service.erb")
|
|
27
|
+
ERB.new(erb_source).result(binding)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def app_service_config
|
|
31
|
+
erb_source = File.read("#{source_root}/templates/docker_compose/#{db}/app_service.erb")
|
|
32
|
+
ERB.new(erb_source).result(binding)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def source_root
|
|
36
|
+
thor.class.source_root
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def project_name
|
|
40
|
+
thor.name
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Trokko
|
|
4
|
+
module Scaffolders
|
|
5
|
+
# Generating Dockerfile according to configurations
|
|
6
|
+
class Dockerfile
|
|
7
|
+
attr_reader :ruby_version, :db, :thor
|
|
8
|
+
|
|
9
|
+
def initialize(ruby_version:, db:, thor:)
|
|
10
|
+
@ruby_version = ruby_version
|
|
11
|
+
@db = db
|
|
12
|
+
@thor = thor
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def generate
|
|
16
|
+
thor.template(
|
|
17
|
+
'templates/Dockerfile.erb',
|
|
18
|
+
"#{thor.name}/Dockerfile",
|
|
19
|
+
force: true,
|
|
20
|
+
context: binding
|
|
21
|
+
)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
private
|
|
25
|
+
|
|
26
|
+
def db_dependencies
|
|
27
|
+
case db
|
|
28
|
+
when 'mysql'
|
|
29
|
+
''
|
|
30
|
+
when 'postgresql'
|
|
31
|
+
'libpq-dev'
|
|
32
|
+
else
|
|
33
|
+
raise "Unknown database: #{db}"
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Trokko
|
|
4
|
+
module Scaffolders
|
|
5
|
+
# Generating entrypoint.sh file according to configurations
|
|
6
|
+
class Entrypoint
|
|
7
|
+
attr_reader :thor
|
|
8
|
+
|
|
9
|
+
def initialize(thor:)
|
|
10
|
+
@thor = thor
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def generate
|
|
14
|
+
thor.template(
|
|
15
|
+
'templates/entrypoint.sh.erb',
|
|
16
|
+
"#{thor.name}/entrypoint.sh",
|
|
17
|
+
force: true,
|
|
18
|
+
context: binding
|
|
19
|
+
)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Trokko
|
|
4
|
+
module Scaffolders
|
|
5
|
+
# Generationg Gemfile according to configurations
|
|
6
|
+
class Gemfile
|
|
7
|
+
attr_reader :rails_version, :thor
|
|
8
|
+
|
|
9
|
+
def initialize(rails_version:, thor:)
|
|
10
|
+
@rails_version = rails_version
|
|
11
|
+
@thor = thor
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def generate
|
|
15
|
+
thor.template(
|
|
16
|
+
'templates/Gemfile.erb',
|
|
17
|
+
"#{thor.name}/Gemfile",
|
|
18
|
+
force: true,
|
|
19
|
+
context: binding
|
|
20
|
+
)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
FROM ruby:<%= ruby_version %>
|
|
2
|
+
|
|
3
|
+
RUN apt-get update -qq && apt-get install -y build-essential <%= db_dependencies %>
|
|
4
|
+
|
|
5
|
+
RUN mkdir /app
|
|
6
|
+
WORKDIR /app
|
|
7
|
+
COPY Gemfile /app/Gemfile
|
|
8
|
+
COPY Gemfile.lock /app/Gemfile.lock
|
|
9
|
+
RUN gem update bundler && bundle install
|
|
10
|
+
COPY . /app
|
|
11
|
+
|
|
12
|
+
COPY entrypoint.sh /usr/bin/
|
|
13
|
+
RUN chmod +x /usr/bin/entrypoint.sh
|
|
14
|
+
ENTRYPOINT ["entrypoint.sh"]
|
|
15
|
+
EXPOSE 3000
|
|
16
|
+
|
|
17
|
+
CMD ["bundle", "exec", "rails", "server", "--binding", "0.0.0.0"]
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
default: &default
|
|
2
|
+
<%= db_config %>
|
|
3
|
+
host: db
|
|
4
|
+
pool: <%%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
|
|
5
|
+
|
|
6
|
+
development:
|
|
7
|
+
<<: *default
|
|
8
|
+
database: app_development
|
|
9
|
+
|
|
10
|
+
test:
|
|
11
|
+
<<: *default
|
|
12
|
+
database: app_test
|
|
13
|
+
|
|
14
|
+
production:
|
|
15
|
+
<<: *default
|
|
16
|
+
database: app_production
|
|
17
|
+
username: app
|
|
18
|
+
password: <%%= ENV["APP_DATABASE_PASSWORD"] %>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
version: '3'
|
|
2
|
+
services:
|
|
3
|
+
db:
|
|
4
|
+
<%= db_service_config %>
|
|
5
|
+
app:
|
|
6
|
+
build: .
|
|
7
|
+
volumes:
|
|
8
|
+
- .:/app
|
|
9
|
+
- bundle:/usr/local/bundle
|
|
10
|
+
ports:
|
|
11
|
+
- "3000:3000"
|
|
12
|
+
depends_on:
|
|
13
|
+
- db
|
|
14
|
+
<%= app_service_config %>
|
|
15
|
+
volumes:
|
|
16
|
+
database:
|
|
17
|
+
driver: local
|
|
18
|
+
labels:
|
|
19
|
+
info.snaka.trokko.project: "<%= project_name %>"
|
|
20
|
+
bundle:
|
|
21
|
+
driver: local
|
|
22
|
+
labels:
|
|
23
|
+
info.snaka.trokko.project: "<%= project_name %>"
|
|
File without changes
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -e
|
|
3
|
+
set -u
|
|
4
|
+
set -o pipefail
|
|
5
|
+
|
|
6
|
+
bundle install
|
|
7
|
+
|
|
8
|
+
# Remove a potentially pre-existing server.pid for Rails.
|
|
9
|
+
rm -f /app/tmp/pids/server.pid
|
|
10
|
+
|
|
11
|
+
# Then exec the container's main process (what's set as CMD in the Dockerfile).
|
|
12
|
+
exec "$@"
|
data/lib/trokko.rb
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'trokko/version'
|
|
4
|
+
require_relative 'trokko/scaffolders/dockerfile'
|
|
5
|
+
require_relative 'trokko/scaffolders/docker_compose'
|
|
6
|
+
require_relative 'trokko/scaffolders/gemfile'
|
|
7
|
+
require_relative 'trokko/scaffolders/entrypoint'
|
|
8
|
+
require_relative 'trokko/scaffolders/config/database'
|
|
9
|
+
|
|
10
|
+
module Trokko
|
|
11
|
+
class Error < StandardError; end
|
|
12
|
+
# Your code goes here...
|
|
13
|
+
end
|
data/sig/trokko.rbs
ADDED
metadata
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: trokko
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.2.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- S.Nakamatsu
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: exe
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2022-07-01 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: thor
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - "~>"
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: 1.2.0
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - "~>"
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: 1.2.0
|
|
27
|
+
description: |
|
|
28
|
+
The `trokko` command prepares the specified `Gemfile` template.
|
|
29
|
+
It will prepare a `Dockerfile` or `docker-compose.yml` depending on the specified DBMS.
|
|
30
|
+
Then, it runs `rails new` and gets you ready to start development right away.
|
|
31
|
+
It takes about a minute.
|
|
32
|
+
email:
|
|
33
|
+
- 19329+snaka@users.noreply.github.com
|
|
34
|
+
executables:
|
|
35
|
+
- trokko
|
|
36
|
+
extensions: []
|
|
37
|
+
extra_rdoc_files: []
|
|
38
|
+
files:
|
|
39
|
+
- ".rspec"
|
|
40
|
+
- ".rubocop.yml"
|
|
41
|
+
- ".rubocop_todo.yml"
|
|
42
|
+
- ".ruby-version"
|
|
43
|
+
- CHANGELOG.md
|
|
44
|
+
- Gemfile
|
|
45
|
+
- Gemfile.lock
|
|
46
|
+
- LICENSE
|
|
47
|
+
- README.md
|
|
48
|
+
- Rakefile
|
|
49
|
+
- docs/images/cover-image.png
|
|
50
|
+
- exe/trokko
|
|
51
|
+
- lib/trokko.rb
|
|
52
|
+
- lib/trokko/cli.rb
|
|
53
|
+
- lib/trokko/scaffolders/config/database.rb
|
|
54
|
+
- lib/trokko/scaffolders/docker_compose.rb
|
|
55
|
+
- lib/trokko/scaffolders/dockerfile.rb
|
|
56
|
+
- lib/trokko/scaffolders/entrypoint.rb
|
|
57
|
+
- lib/trokko/scaffolders/gemfile.rb
|
|
58
|
+
- lib/trokko/templates/Dockerfile.erb
|
|
59
|
+
- lib/trokko/templates/Gemfile.erb
|
|
60
|
+
- lib/trokko/templates/config/database.yml.erb
|
|
61
|
+
- lib/trokko/templates/config/database/mysql.yml.erb
|
|
62
|
+
- lib/trokko/templates/config/database/postgresql.yml.erb
|
|
63
|
+
- lib/trokko/templates/docker-compose.yml.erb
|
|
64
|
+
- lib/trokko/templates/docker_compose/mysql/app_service.erb
|
|
65
|
+
- lib/trokko/templates/docker_compose/mysql/db_service.erb
|
|
66
|
+
- lib/trokko/templates/docker_compose/postgresql/app_service.erb
|
|
67
|
+
- lib/trokko/templates/docker_compose/postgresql/db_service.erb
|
|
68
|
+
- lib/trokko/templates/entrypoint.sh.erb
|
|
69
|
+
- lib/trokko/version.rb
|
|
70
|
+
- sig/trokko.rbs
|
|
71
|
+
homepage: https://github.com/snaka/trokko
|
|
72
|
+
licenses:
|
|
73
|
+
- MIT
|
|
74
|
+
metadata:
|
|
75
|
+
homepage_uri: https://github.com/snaka/trokko
|
|
76
|
+
rubygems_mfa_required: 'true'
|
|
77
|
+
post_install_message:
|
|
78
|
+
rdoc_options: []
|
|
79
|
+
require_paths:
|
|
80
|
+
- lib
|
|
81
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
82
|
+
requirements:
|
|
83
|
+
- - ">="
|
|
84
|
+
- !ruby/object:Gem::Version
|
|
85
|
+
version: 2.7.0
|
|
86
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
87
|
+
requirements:
|
|
88
|
+
- - ">="
|
|
89
|
+
- !ruby/object:Gem::Version
|
|
90
|
+
version: '0'
|
|
91
|
+
requirements: []
|
|
92
|
+
rubygems_version: 3.3.14
|
|
93
|
+
signing_key:
|
|
94
|
+
specification_version: 4
|
|
95
|
+
summary: Set up a Rails development environment with Docker in 1 minute
|
|
96
|
+
test_files: []
|