schienenzeppelin 0.1

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.
Files changed (117) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/main.yml +17 -0
  3. data/.github/workflows/outdated.yml +20 -0
  4. data/.gitignore +282 -0
  5. data/.rspec_status +3 -0
  6. data/.rubocop.yml +28 -0
  7. data/.tool-versions +1 -0
  8. data/CODE_OF_CONDUCT.md +84 -0
  9. data/GALLERY.md +29 -0
  10. data/Gemfile +13 -0
  11. data/Gemfile.lock +184 -0
  12. data/LICENSE +21 -0
  13. data/LICENSE.txt +21 -0
  14. data/README.md +174 -0
  15. data/Rakefile +12 -0
  16. data/TODO.md +32 -0
  17. data/bin/console +15 -0
  18. data/bin/setup +8 -0
  19. data/exe/sz +25 -0
  20. data/images/create.png +0 -0
  21. data/images/error.png +0 -0
  22. data/images/home.png +0 -0
  23. data/images/index.png +0 -0
  24. data/images/login.png +0 -0
  25. data/images/mobile.png +0 -0
  26. data/lib/schienenzeppelin.rb +18 -0
  27. data/lib/schienenzeppelin/app_builder.rb +88 -0
  28. data/lib/schienenzeppelin/app_generator.rb +95 -0
  29. data/lib/schienenzeppelin/helper_base.rb +28 -0
  30. data/lib/schienenzeppelin/helpers/annotate.rb +11 -0
  31. data/lib/schienenzeppelin/helpers/capistrano.rb +35 -0
  32. data/lib/schienenzeppelin/helpers/continuous_integration.rb +12 -0
  33. data/lib/schienenzeppelin/helpers/credentials.rb +49 -0
  34. data/lib/schienenzeppelin/helpers/devise.rb +45 -0
  35. data/lib/schienenzeppelin/helpers/errors.rb +67 -0
  36. data/lib/schienenzeppelin/helpers/factory_bot.rb +13 -0
  37. data/lib/schienenzeppelin/helpers/generators.rb +26 -0
  38. data/lib/schienenzeppelin/helpers/high_voltage.rb +11 -0
  39. data/lib/schienenzeppelin/helpers/home.rb +17 -0
  40. data/lib/schienenzeppelin/helpers/hotwire.rb +11 -0
  41. data/lib/schienenzeppelin/helpers/pundit.rb +12 -0
  42. data/lib/schienenzeppelin/helpers/rspec.rb +13 -0
  43. data/lib/schienenzeppelin/helpers/rubocop.rb +11 -0
  44. data/lib/schienenzeppelin/helpers/scaffold.rb +11 -0
  45. data/lib/schienenzeppelin/helpers/services.rb +11 -0
  46. data/lib/schienenzeppelin/helpers/sidekiq.rb +13 -0
  47. data/lib/schienenzeppelin/helpers/stimulus.rb +11 -0
  48. data/lib/schienenzeppelin/helpers/stimulus_components.rb +29 -0
  49. data/lib/schienenzeppelin/helpers/tailwind.rb +18 -0
  50. data/lib/schienenzeppelin/version.rb +7 -0
  51. data/schienenzeppelin.gemspec +37 -0
  52. data/schienenzeppelin.jpg +0 -0
  53. data/script.md +104 -0
  54. data/templates/.dockerignore.erb +51 -0
  55. data/templates/.entrypoint.sh.erb +16 -0
  56. data/templates/.env.development.erb +3 -0
  57. data/templates/.foreman.erb +1 -0
  58. data/templates/.github/workflows/build.yml.erb +49 -0
  59. data/templates/.gitignore.erb +285 -0
  60. data/templates/.irbrc.erb +12 -0
  61. data/templates/.rubocop.yml.erb +37 -0
  62. data/templates/.tool-versions.erb +1 -0
  63. data/templates/Capfile.erb +24 -0
  64. data/templates/Dockerfile.erb +45 -0
  65. data/templates/Gemfile.erb +122 -0
  66. data/templates/Procfile.dev.erb +6 -0
  67. data/templates/Procfile.erb +2 -0
  68. data/templates/README.md.erb +43 -0
  69. data/templates/app/controllers/authorized_controller.rb.erb +10 -0
  70. data/templates/app/controllers/errors_controller.rb.erb +24 -0
  71. data/templates/app/javascript/images/checkmark.svg +1 -0
  72. data/templates/app/javascript/images/logo.svg +1 -0
  73. data/templates/app/javascript/stylesheets/components.scss +206 -0
  74. data/templates/app/policies/application_policy.rb +55 -0
  75. data/templates/app/services/application_service.rb +14 -0
  76. data/templates/app/views/devise/confirmations/new.html.erb +24 -0
  77. data/templates/app/views/devise/passwords/edit.html.erb +34 -0
  78. data/templates/app/views/devise/passwords/new.html.erb +23 -0
  79. data/templates/app/views/devise/registrations/edit.html.erb +62 -0
  80. data/templates/app/views/devise/registrations/new.html.erb +45 -0
  81. data/templates/app/views/devise/sessions/new.html.erb +33 -0
  82. data/templates/app/views/devise/shared/_error_messages.html.erb +15 -0
  83. data/templates/app/views/devise/shared/_form_wrap.html.erb +5 -0
  84. data/templates/app/views/devise/shared/_links.html.erb +25 -0
  85. data/templates/app/views/devise/unlocks/new.html.erb +22 -0
  86. data/templates/app/views/errors/internal_error.html.erb +14 -0
  87. data/templates/app/views/errors/not_found.html.erb +14 -0
  88. data/templates/app/views/errors/unacceptable.html.erb +14 -0
  89. data/templates/app/views/layouts/application.html.erb.tt +30 -0
  90. data/templates/app/views/pages/home.html.erb.tt +20 -0
  91. data/templates/app/views/shared/_flashes.html.erb.tt +12 -0
  92. data/templates/app/views/shared/_footer.html.erb.tt +21 -0
  93. data/templates/app/views/shared/_navbar.html.erb.tt +40 -0
  94. data/templates/bin/setup.erb +146 -0
  95. data/templates/config/credentials.yml.erb +7 -0
  96. data/templates/config/initializers/high_voltage.rb +6 -0
  97. data/templates/config/initializers/lograge.rb +5 -0
  98. data/templates/config/initializers/sidekiq.rb +10 -0
  99. data/templates/config/postgresql.yml.erb +23 -0
  100. data/templates/docker-compose.yml.erb +21 -0
  101. data/templates/lib/capistrano/tasks/seeds.rake +12 -0
  102. data/templates/lib/capistrano/tasks/sidekiq.rake +36 -0
  103. data/templates/lib/generators/rails/navigation/USAGE +6 -0
  104. data/templates/lib/generators/rails/navigation/navigation_generator.rb +15 -0
  105. data/templates/lib/generators/rails/scaffold_controller_generator.rb +12 -0
  106. data/templates/lib/tasks/auto_annotate_models.rake +58 -0
  107. data/templates/lib/templates/erb/scaffold/_form.html.erb +39 -0
  108. data/templates/lib/templates/erb/scaffold/edit.html.erb +7 -0
  109. data/templates/lib/templates/erb/scaffold/index.html.erb +34 -0
  110. data/templates/lib/templates/erb/scaffold/new.html.erb +7 -0
  111. data/templates/lib/templates/erb/scaffold/show.html.erb +18 -0
  112. data/templates/public/500.html.erb +26 -0
  113. data/templates/spec/rails_helper.rb +26 -0
  114. data/templates/spec/spec_helper.rb +61 -0
  115. data/templates/spec/support/factory_bot.rb +5 -0
  116. data/templates/spec/support/shoulda_matchers.rb +8 -0
  117. metadata +179 -0
data/GALLERY.md ADDED
@@ -0,0 +1,29 @@
1
+ # Gallery
2
+
3
+ Schienenzeppelin comes with a nice and unobstrusive UI to get you started quickly.
4
+
5
+ ## Home
6
+
7
+ TailwindCSS and responsive views already done. Minimalism first, so these things stay out of your way.
8
+
9
+ ![home](./images/home.png)
10
+ ![home_mobile](./images/mobile.png)
11
+
12
+ ## Devise
13
+
14
+ All devise forms (login, sign up, profile...) feature the same simple design.
15
+
16
+ ![devise](./images/login.png)
17
+
18
+ ## Scaffold
19
+
20
+ Adding new views via `rails scaffold` tends to result in a ton of work to get those to look nice. Not anymore!
21
+
22
+ ![scaffold](images/index.png)
23
+ ![create](images/create.png)
24
+
25
+ ## Error Pages
26
+
27
+ Even if things go wrong, they should look nice, right?
28
+
29
+ ![error](images/error.png)
data/Gemfile ADDED
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ # Specify your gem's dependencies in schienenzeppelin.gemspec
6
+ gemspec
7
+
8
+ gem 'rake', '~> 13.0'
9
+
10
+ gem 'rspec', '~> 3.10'
11
+
12
+ gem 'rubocop', '~> 1.9'
13
+ gem 'rubocop-rspec', '~> 1.40'
data/Gemfile.lock ADDED
@@ -0,0 +1,184 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ schienenzeppelin (0.1)
5
+ rails (~> 6.1.2)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ actioncable (6.1.2.1)
11
+ actionpack (= 6.1.2.1)
12
+ activesupport (= 6.1.2.1)
13
+ nio4r (~> 2.0)
14
+ websocket-driver (>= 0.6.1)
15
+ actionmailbox (6.1.2.1)
16
+ actionpack (= 6.1.2.1)
17
+ activejob (= 6.1.2.1)
18
+ activerecord (= 6.1.2.1)
19
+ activestorage (= 6.1.2.1)
20
+ activesupport (= 6.1.2.1)
21
+ mail (>= 2.7.1)
22
+ actionmailer (6.1.2.1)
23
+ actionpack (= 6.1.2.1)
24
+ actionview (= 6.1.2.1)
25
+ activejob (= 6.1.2.1)
26
+ activesupport (= 6.1.2.1)
27
+ mail (~> 2.5, >= 2.5.4)
28
+ rails-dom-testing (~> 2.0)
29
+ actionpack (6.1.2.1)
30
+ actionview (= 6.1.2.1)
31
+ activesupport (= 6.1.2.1)
32
+ rack (~> 2.0, >= 2.0.9)
33
+ rack-test (>= 0.6.3)
34
+ rails-dom-testing (~> 2.0)
35
+ rails-html-sanitizer (~> 1.0, >= 1.2.0)
36
+ actiontext (6.1.2.1)
37
+ actionpack (= 6.1.2.1)
38
+ activerecord (= 6.1.2.1)
39
+ activestorage (= 6.1.2.1)
40
+ activesupport (= 6.1.2.1)
41
+ nokogiri (>= 1.8.5)
42
+ actionview (6.1.2.1)
43
+ activesupport (= 6.1.2.1)
44
+ builder (~> 3.1)
45
+ erubi (~> 1.4)
46
+ rails-dom-testing (~> 2.0)
47
+ rails-html-sanitizer (~> 1.1, >= 1.2.0)
48
+ activejob (6.1.2.1)
49
+ activesupport (= 6.1.2.1)
50
+ globalid (>= 0.3.6)
51
+ activemodel (6.1.2.1)
52
+ activesupport (= 6.1.2.1)
53
+ activerecord (6.1.2.1)
54
+ activemodel (= 6.1.2.1)
55
+ activesupport (= 6.1.2.1)
56
+ activestorage (6.1.2.1)
57
+ actionpack (= 6.1.2.1)
58
+ activejob (= 6.1.2.1)
59
+ activerecord (= 6.1.2.1)
60
+ activesupport (= 6.1.2.1)
61
+ marcel (~> 0.3.1)
62
+ mimemagic (~> 0.3.2)
63
+ activesupport (6.1.2.1)
64
+ concurrent-ruby (~> 1.0, >= 1.0.2)
65
+ i18n (>= 1.6, < 2)
66
+ minitest (>= 5.1)
67
+ tzinfo (~> 2.0)
68
+ zeitwerk (~> 2.3)
69
+ ast (2.4.2)
70
+ builder (3.2.4)
71
+ concurrent-ruby (1.1.8)
72
+ crass (1.0.6)
73
+ diff-lcs (1.4.4)
74
+ erubi (1.10.0)
75
+ globalid (0.4.2)
76
+ activesupport (>= 4.2.0)
77
+ i18n (1.8.9)
78
+ concurrent-ruby (~> 1.0)
79
+ loofah (2.9.0)
80
+ crass (~> 1.0.2)
81
+ nokogiri (>= 1.5.9)
82
+ mail (2.7.1)
83
+ mini_mime (>= 0.1.1)
84
+ marcel (0.3.3)
85
+ mimemagic (~> 0.3.2)
86
+ method_source (1.0.0)
87
+ mimemagic (0.3.5)
88
+ mini_mime (1.0.2)
89
+ minitest (5.14.3)
90
+ nio4r (2.5.5)
91
+ nokogiri (1.11.1-x86_64-linux)
92
+ racc (~> 1.4)
93
+ parallel (1.20.1)
94
+ parser (3.0.0.0)
95
+ ast (~> 2.4.1)
96
+ racc (1.5.2)
97
+ rack (2.2.3)
98
+ rack-test (1.1.0)
99
+ rack (>= 1.0, < 3)
100
+ rails (6.1.2.1)
101
+ actioncable (= 6.1.2.1)
102
+ actionmailbox (= 6.1.2.1)
103
+ actionmailer (= 6.1.2.1)
104
+ actionpack (= 6.1.2.1)
105
+ actiontext (= 6.1.2.1)
106
+ actionview (= 6.1.2.1)
107
+ activejob (= 6.1.2.1)
108
+ activemodel (= 6.1.2.1)
109
+ activerecord (= 6.1.2.1)
110
+ activestorage (= 6.1.2.1)
111
+ activesupport (= 6.1.2.1)
112
+ bundler (>= 1.15.0)
113
+ railties (= 6.1.2.1)
114
+ sprockets-rails (>= 2.0.0)
115
+ rails-dom-testing (2.0.3)
116
+ activesupport (>= 4.2.0)
117
+ nokogiri (>= 1.6)
118
+ rails-html-sanitizer (1.3.0)
119
+ loofah (~> 2.3)
120
+ railties (6.1.2.1)
121
+ actionpack (= 6.1.2.1)
122
+ activesupport (= 6.1.2.1)
123
+ method_source
124
+ rake (>= 0.8.7)
125
+ thor (~> 1.0)
126
+ rainbow (3.0.0)
127
+ rake (13.0.3)
128
+ regexp_parser (2.0.3)
129
+ rexml (3.2.4)
130
+ rspec (3.10.0)
131
+ rspec-core (~> 3.10.0)
132
+ rspec-expectations (~> 3.10.0)
133
+ rspec-mocks (~> 3.10.0)
134
+ rspec-core (3.10.1)
135
+ rspec-support (~> 3.10.0)
136
+ rspec-expectations (3.10.1)
137
+ diff-lcs (>= 1.2.0, < 2.0)
138
+ rspec-support (~> 3.10.0)
139
+ rspec-mocks (3.10.1)
140
+ diff-lcs (>= 1.2.0, < 2.0)
141
+ rspec-support (~> 3.10.0)
142
+ rspec-support (3.10.1)
143
+ rubocop (1.9.1)
144
+ parallel (~> 1.10)
145
+ parser (>= 3.0.0.0)
146
+ rainbow (>= 2.2.2, < 4.0)
147
+ regexp_parser (>= 1.8, < 3.0)
148
+ rexml
149
+ rubocop-ast (>= 1.2.0, < 2.0)
150
+ ruby-progressbar (~> 1.7)
151
+ unicode-display_width (>= 1.4.0, < 3.0)
152
+ rubocop-ast (1.4.1)
153
+ parser (>= 2.7.1.5)
154
+ rubocop-rspec (1.42.0)
155
+ rubocop (>= 0.87.0)
156
+ ruby-progressbar (1.11.0)
157
+ sprockets (4.0.2)
158
+ concurrent-ruby (~> 1.0)
159
+ rack (> 1, < 3)
160
+ sprockets-rails (3.2.2)
161
+ actionpack (>= 4.0)
162
+ activesupport (>= 4.0)
163
+ sprockets (>= 3.0.0)
164
+ thor (1.1.0)
165
+ tzinfo (2.0.4)
166
+ concurrent-ruby (~> 1.0)
167
+ unicode-display_width (2.0.0)
168
+ websocket-driver (0.7.3)
169
+ websocket-extensions (>= 0.1.0)
170
+ websocket-extensions (0.1.5)
171
+ zeitwerk (2.4.2)
172
+
173
+ PLATFORMS
174
+ x86_64-linux
175
+
176
+ DEPENDENCIES
177
+ rake (~> 13.0)
178
+ rspec (~> 3.10)
179
+ rubocop (~> 1.9)
180
+ rubocop-rspec (~> 1.40)
181
+ schienenzeppelin!
182
+
183
+ BUNDLED WITH
184
+ 2.2.7
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2021 Hans-Jörg Schnedlitz
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/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2021 hschne
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
13
+ all 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
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,174 @@
1
+ <h1 align="center">Schienenzeppelin</h1>
2
+
3
+ <p align="center">
4
+ <img src="https://github.com/hschne/schienenzeppelin/workflows/Ruby/badge.svg"/>
5
+ <img src="https://badge.fury.io/rb/pundit.svg"/>
6
+ </p>
7
+
8
+ The Ruby on Rails app generator to get you started quickly. Includes TailwindCSS,
9
+ Devise, Capistrano and much more. Check out these [screenshots](GALLERY.md) and [What's in the Box](#whats-in-the-box) to find out more.
10
+
11
+ ![zeppelin](./schienenzeppelin.jpg)
12
+
13
+ ## Getting Started
14
+
15
+ Install the Schienenzeppelin gem:
16
+
17
+ ```
18
+ gem install schienenzeppelin
19
+ ```
20
+
21
+ Make sure you have [Ruby](https://www.ruby-lang.org/en/) and [ Yarn ](https://yarnpkg.com/) installed. Then run:
22
+
23
+ ```
24
+ sz <app-name>
25
+ ```
26
+
27
+ ## What's in the Box?
28
+
29
+ Loads of things!
30
+
31
+ Schienenzeppelin provides you with a ready-to-go Rails app that you can take to production in a matter of minutes. It comes pre-configured with several gems and utilities that - while kind of standard - are not included in the default Rails app generator. Some highlights include:
32
+
33
+ - Fully responsive pages using [TailwindCSS](https://tailwindcss.com/) and [High Voltage](https://github.com/thoughtbot/high_voltage) out of the box. And custom scaffolds to boot! :sparkles:
34
+ - Authentication & Authorization comes standard. Starting your app with Schienenzeppelin means [Devise](https://github.com/heartcombo/devise) is already set up :+1:
35
+ - Dockerized everything. That includes a Dockerfile to get you started with containerizing your app, and a [docker-compose](https://docs.docker.com/compose/)-powered development environment :whale:
36
+ - Deploying your app is easy as pie. All the basic [Capistrano](https://capistranorb.com/) configuration is done already, just put in your server location and you are off to the races :rocket:
37
+
38
+ ### Frontend
39
+
40
+ The nice thing about Schienenzeppelin is that it sets you up with basic pages that don't look like garbage - allowing you to focus on other things than design.
41
+
42
+ Curious what that looks like? Check out these [screenshots](GALLERY.md).
43
+
44
+ #### Tailwind CSS
45
+
46
+ Schienenzeppelin comes pre-configured with [tailwindcss-rails](https://github.com/rails/tailwindcss-rails). We provide several UI components as a starting point in `app/javascript/stylesheets/components.scss` - easy to adapt, and easy to add your own.
47
+
48
+ #### Custom Views
49
+
50
+ [High Voltage](https://github.com/thoughtbot/high_voltage) offers an easy way to add static pages - no controllers needed. Out of the box, Schienenzeppelin provides a mobile-friendly home page and an improved application layout.
51
+
52
+ #### Custom Scaffold
53
+
54
+ Schienenzeppelin adds a bunch of scaffolds that you adapt to suit your own needs in `lib/scaffolds`. These scaffolds take advantage of Tailwind to match the look of the rest of your application.
55
+
56
+ #### Turbo
57
+
58
+ [Hotwire](https://hotwire.dev/) is the new hotness. Starting with Schienenzeppelin means that Hotwire and its components such as [Stimulus](https://github.com/hotwired/stimulus) are already added to your application.
59
+
60
+ Schienenzeppelin also takes advantage of [Tailwind-Stimulus-Components](https://github.com/excid3/tailwindcss-stimulus-components) to provide interactive componenets (Dropdowns, Alerts...) out of the box.
61
+
62
+ ### Backend
63
+
64
+ Modern web apps need tons of functionality out of the box. Authentication, Authorization, APIs and much more. Schienenzeppelin comes with some basics to get you started quickly.
65
+
66
+ #### Authentication
67
+
68
+ Devise is already configured if you start your application with Schienenzeppelin. For a smooth first start, `db/seeds.rb` create an admin user, and your navigation bar already contains links where users can sign in or sign up.
69
+
70
+ #### Authorization
71
+
72
+ [Pundit](https://github.com/varvet/pundit) provides a simple way to encapsulate authorization logic in your application. You can add new policies to the `app/policies` folder. To generate a new policy run `rails generate pundit:policy`.
73
+
74
+ #### Background Jobs
75
+
76
+ Schienenzeppelin per default foregoes ActiveJob in favor of [Sidekiq](https://github.com/mperham/sidekiq).
77
+
78
+ #### OJ
79
+
80
+ To serialize and deserialize to and from Json [OJ](https://github.com/ohler55/oj) is pretty much standard. Schienenzeppelin already comes pre-configured with it.
81
+
82
+ #### JB
83
+
84
+ For rendering JSON views we use [JB](https://github.com/amatsuda/jb) instead of [JBuilder](https://github.com/rails/jbuilder), as it is both faster and simpler to use.
85
+
86
+ #### Service Objects
87
+
88
+ [Service Objects](https://www.toptal.com/ruby-on-rails/rails-service-objects-tutorial) are a simple, straight-forward way to encapsulate your business logic and keep your controllers and models nice and slim.
89
+
90
+ Schienenzeppelin provides a basic service object base class you can inherit from to add your own service objects in `app/services`.
91
+
92
+ ### Development
93
+
94
+ #### Setup Script
95
+
96
+ A setup script that allows for easy setup of the application on a new machine is provided. It is automatically tailored to your specific
97
+ app configuration.
98
+
99
+ #### Start Script
100
+
101
+ Once you have set up everything your application can be started with a single command-line call - using Foreman. All necessary procfiles are generated.
102
+
103
+ #### Better Rails Console
104
+
105
+ Schienenzeppelin comes with a custom `.irbrc` that adds history and syntax completion. [Factory Bot](#factory_bot) methods will also be available in the console.
106
+
107
+ #### Annotate
108
+
109
+ [Annotate](https://github.com/ctran/annotate_models) adds comments to your models to show the current table schema. Automatically run during each migration.
110
+
111
+ #### Database
112
+
113
+ PostgreSQL is already configured if you start your app - in such a way that it plays nicely with other utilities such as `dotenv` and `docker-compose` too!
114
+
115
+ #### Dotenv
116
+
117
+ [Dotenv](https://github.com/bkeepers/dotenv) is a nifty gem that makes environment variables easier to manage.
118
+
119
+ #### Docker
120
+
121
+ Docker is incredibly helpful when developing and deploying your application. Schienenzeppelin provides a `docker-compose` file
122
+ as well as an optimized `Dockerfile` (with complementary `.dockerignore`) to get you started.
123
+
124
+ #### Version Manager Support
125
+
126
+ We added support for the [asdf version manager](https://asdf-vm.com/#/). A `.tool-versions` file is automatically included in your app.
127
+
128
+ #### Improved Gitignore
129
+
130
+ Schienenzeppelin provides a custom `.gitignore` that is tailored to your app.
131
+
132
+ #### Rubocop
133
+
134
+ Creating your app with Schienenzeppelin will automatically add Rubocop and a minimal set of Rubocop rules for both your production and test code.
135
+
136
+ #### Improved Credentials
137
+
138
+ While Rails secrets are usually prepared for development, Schienezeppelin sets up everything for production as well.
139
+
140
+ #### Rspec
141
+
142
+ [Rspec](https://github.com/rspec/rspec) and its helpers [rspec-mocks](https://github.com/rspec/rspec-mocks) and [shoulda](https://github.com/thoughtbot/shoulda) come standard.
143
+
144
+ #### Factorybot
145
+
146
+ [Factorybot](https://github.com/thoughtbot/factory_bot) provides an easy way to create test data.
147
+
148
+ ### Deployment & CI
149
+
150
+ #### Github Actions
151
+
152
+ Schienenzeppelin already comes with a workflow file that should cover your basic need. A good starting point for further customization.
153
+
154
+ #### Capistrano
155
+
156
+ Capistrano is already set up. Deploy to a server of your choice with minimal effort.
157
+
158
+ ## FAQ
159
+
160
+ #### Why another template generator?
161
+
162
+ I wanted something that fits the way I like to write my Rails app. There are many application templates, but this one is mine.
163
+
164
+ #### What's with the German gibberish name?
165
+
166
+ I'm so glad you asked. The [Schienenzeppelin](https://en.wikipedia.org/wiki/Schienenzeppelin) was an experimental railcar that was briefly in operation during the 1930s. It was pretty fast, and it ran on Rails. Get it? :zany_face:
167
+
168
+ #### Credits
169
+
170
+ This idea is nothing new, and there are tons of other projects I took inspiration from.
171
+
172
+ Special shout out to Chris Oliver, whose [Jumpstart Pro](https://jumpstartrails.com/) is crazy good. You should get it.
173
+
174
+ [Suspenders](https://github.com/thoughtbot/suspenders) was where I first came across the idea to try my hand at custom template generators.