potassium 7.0.0 → 7.1.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 +4 -4
- data/.circleci/config.yml +9 -1
- data/.node-version +1 -1
- data/.rubocop.yml +4 -0
- data/CHANGELOG.md +17 -0
- data/docs/CONTRIBUTING.md +6 -6
- data/lib/potassium/assets/.circleci/config.yml.erb +14 -14
- data/lib/potassium/assets/.env.development.erb +1 -0
- data/lib/potassium/assets/.env.test.erb +1 -0
- data/lib/potassium/assets/.eslintrc.json +1 -2
- data/lib/potassium/assets/.rubocop.yml +4 -0
- data/lib/potassium/assets/app/frontend/api/__mocks__/index.mock.ts +1 -1
- data/lib/potassium/assets/config/initializers/session_store.rb +20 -0
- data/lib/potassium/assets/lib/environment_variables.rb +9 -0
- data/lib/potassium/assets/testing/simplecov_config.rb +1 -0
- data/lib/potassium/assets/tsconfig.config.json +13 -3
- data/lib/potassium/assets/tsconfig.json +11 -5
- data/lib/potassium/helpers/rubocop-helpers.rb +6 -12
- data/lib/potassium/recipes/admin.rb +1 -0
- data/lib/potassium/recipes/background_processor.rb +0 -30
- data/lib/potassium/recipes/ci.rb +4 -0
- data/lib/potassium/recipes/coverage.rb +1 -1
- data/lib/potassium/recipes/environment_variables.rb +18 -0
- data/lib/potassium/recipes/front_end_vite.rb +3 -1
- data/lib/potassium/recipes/mailer.rb +1 -1
- data/lib/potassium/recipes/rails.rb +2 -0
- data/lib/potassium/recipes/redis.rb +57 -0
- data/lib/potassium/recipes/style.rb +3 -3
- data/lib/potassium/recipes/vue_admin.rb +11 -1
- data/lib/potassium/templates/application.rb +7 -5
- data/lib/potassium/version.rb +3 -2
- data/spec/features/ci_spec.rb +10 -3
- data/spec/features/coverage_spec.rb +0 -4
- data/spec/features/environment_variables_spec.rb +28 -0
- data/spec/features/mailer_spec.rb +1 -3
- data/spec/features/new_project_spec.rb +1 -7
- data/spec/features/node_spec.rb +1 -1
- data/spec/features/redis_spec.rb +43 -0
- data/spec/front_end_vite_spec.rb +1 -3
- data/spec/support/potassium_test_helpers.rb +0 -6
- metadata +12 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bf8fa48bec3abe9c9a5a0b78b1bce9e5d3a16a7ae2026ca7675a46b4cd65900e
|
4
|
+
data.tar.gz: d0eb6c8fbc7d0efec8f2920ad3b94c240ec344ee8e0a5606072016193889f5e3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 555b3a8191c0eb1cee82b0fab20796827ee7e9a2191e61c9e462ab907ded83279e5e4a3472160db52cb43068dd5d969c07a9712767dedfafa769c436f647416f
|
7
|
+
data.tar.gz: 2e7358f4f012301fa59add914bc80692a3e135025bab6fc96c007c50f46808fcc19b33c21cca2876475f3f7ce978b0a9d0b4a01b8ac9f65113620427314c2569
|
data/.circleci/config.yml
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
version: 2.1
|
2
2
|
|
3
|
-
ruby-image: &ruby-image cimg/ruby:2.7
|
3
|
+
ruby-image: &ruby-image cimg/ruby:2.7
|
4
4
|
env-vars: &env-vars
|
5
5
|
BUNDLE_JOBS: 4
|
6
6
|
RAILS_ENV: test
|
@@ -32,6 +32,14 @@ commands:
|
|
32
32
|
gem install bundler:2.1.4
|
33
33
|
bundle _2.1.4_ install
|
34
34
|
|
35
|
+
- run:
|
36
|
+
name: Install node and yarn
|
37
|
+
command: |
|
38
|
+
curl -sL https://deb.nodesource.com/setup_$(cat .node-version).x | sudo -E bash -
|
39
|
+
sudo apt-get install -y nodejs
|
40
|
+
curl -o- -sL https://yarnpkg.com/install.sh | bash
|
41
|
+
sudo ln -s $HOME/.yarn/bin/yarn /usr/local/bin/yarn
|
42
|
+
|
35
43
|
- save_cache:
|
36
44
|
key: potassium-vendor-bundle-{{ .Branch }}
|
37
45
|
paths:
|
data/.node-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
20
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,23 @@
|
|
2
2
|
|
3
3
|
## Unreleased
|
4
4
|
|
5
|
+
## 7.1.0
|
6
|
+
Features
|
7
|
+
- Add environment variables module recipe [#435](https://github.com/platanus/potassium/pull/435)
|
8
|
+
- Run [Brakeman](https://brakemanscanner.org/) with reviewdog on CI [#440](https://github.com/platanus/potassium/pull/440)
|
9
|
+
- Changes to a couple of rspec rubocop rules [#441](https://github.com/platanus/potassium/pull/441)
|
10
|
+
- Update node to 20 [#447](https://github.com/platanus/potassium/pull/447)
|
11
|
+
|
12
|
+
Fixes
|
13
|
+
- Fix CircleCI config [#434](https://github.com/platanus/potassium/pull/434)
|
14
|
+
- Fix `cannot load such file -- sassc` error [#436](https://github.com/platanus/potassium/pull/436)
|
15
|
+
- Set jsdom version for node compatibility [#436](https://github.com/platanus/potassium/pull/436)
|
16
|
+
- Fix `uninitialized constant RubocopHelpers::RuboCop` [#436](https://github.com/platanus/potassium/pull/436)
|
17
|
+
- Use Redis for sessions to address security issues [#437](https://github.com/platanus/potassium/pull/437)
|
18
|
+
- Comment vue mount in admin js to address security issues [#438](https://github.com/platanus/potassium/pull/438)
|
19
|
+
- Remove ActiveAdmin comments to address security issues [#439](https://github.com/platanus/potassium/pull/439)
|
20
|
+
- Various fixes related to TS, vite and vitest [#444](https://github.com/platanus/potassium/pull/444)
|
21
|
+
|
5
22
|
## 7.0.0
|
6
23
|
|
7
24
|
Features
|
data/docs/CONTRIBUTING.md
CHANGED
@@ -14,13 +14,13 @@ Now, to add some behavior, thanks to the [DSL](/docs/DSL.md) we have a kind of s
|
|
14
14
|
4. Install the gems, filling the `Gemfile` before with all the gathered gems.
|
15
15
|
5. Finally, create the database.
|
16
16
|
|
17
|
-
The main step is the 3rd, when we call the `create` methods from the recipes. A recipe can do anything (because is a ruby script) but their
|
17
|
+
The main step is the 3rd, when we call the `create` methods from the recipes. A recipe can do anything (because is a ruby script) but their responsibility should be to gather gems and register callbacks for the process.
|
18
18
|
|
19
19
|
### Recipe
|
20
20
|
|
21
21
|
The recipes are classes defined in the `Recipes` module that inherit from
|
22
22
|
`Rails::AppBuilder` and by convention can implement some of the following
|
23
|
-
methods `ask`, `create` and `install`.
|
23
|
+
methods `ask`, `create` and `install`. They take this form.
|
24
24
|
|
25
25
|
```ruby
|
26
26
|
class Recipes::MyRecipe < Rails::AppBuilder
|
@@ -73,7 +73,7 @@ This method is used if you need to ask something to the user before doing someth
|
|
73
73
|
|
74
74
|
We'll call this method to add specific functionality to the rails project.
|
75
75
|
|
76
|
-
1. In the `create` method register a gem using `gather_gem` and create a callback to be called after the `gem_install` action
|
76
|
+
1. In the `create` method register a gem using `gather_gem` and create a callback to be called after the `gem_install` action succeeds to run the generator. `gem_install` is one of the main actions that should be easily visible with a sneak peek in [the template][the-template].
|
77
77
|
|
78
78
|
```ruby
|
79
79
|
def create
|
@@ -99,8 +99,8 @@ We'll call this method to add specific functionality to the rails project.
|
|
99
99
|
##### | `install`
|
100
100
|
|
101
101
|
The install method will be called when you use the `install` command from potassium.
|
102
|
-
For example if you run `
|
103
|
-
[the recipe template](/lib/potassium/templates/recipe.rb) to load
|
102
|
+
For example, if you run `potassium install devise` this will use
|
103
|
+
[the recipe template](/lib/potassium/templates/recipe.rb) to load and execute the
|
104
104
|
`install` method for the **devise** recipe.
|
105
105
|
|
106
106
|
You can define the main functionallity of a recipe in a private method and call
|
@@ -127,6 +127,6 @@ end
|
|
127
127
|
|
128
128
|
To see further documentation of what we added to the rails template's DSL, check the [DSL documentation](/docs/DSL.md).
|
129
129
|
|
130
|
-
> Remember that the DSL we are documenting is an extension over the [Rails Application Template DSL](http://edgeguides.rubyonrails.org/rails_application_templates.html), that itself is a
|
130
|
+
> Remember that the DSL we are documenting is an extension over the [Rails Application Template DSL](http://edgeguides.rubyonrails.org/rails_application_templates.html), that itself is a DSL based on [Thor](https://github.com/erikhuda/thor/wiki).
|
131
131
|
|
132
132
|
[the-template]: /lib/potassium/templates/application.rb
|
@@ -4,9 +4,7 @@ ruby-image: &ruby-image cimg/ruby:<%= ruby_version %>
|
|
4
4
|
<%- if selected?(:database, :postgresql) -%>
|
5
5
|
postgres-image: &postgres-image postgres:<%= Potassium::POSTGRES_VERSION %>
|
6
6
|
<%- end -%>
|
7
|
-
|
8
|
-
redis-image: &redis-image redis
|
9
|
-
<%- end -%>
|
7
|
+
redis-image: &redis-image cimg/redis:6.2.12
|
10
8
|
env-vars: &env-vars
|
11
9
|
BUNDLE_JOBS: 4
|
12
10
|
BUNDLE_PATH: vendor/bundle
|
@@ -23,9 +21,7 @@ executors:
|
|
23
21
|
<%- if selected?(:database, :postgresql) -%>
|
24
22
|
- image: *postgres-image
|
25
23
|
<%- end -%>
|
26
|
-
<%- if selected?(:background_processor) -%>
|
27
24
|
- image: *redis-image
|
28
|
-
<%- end -%>
|
29
25
|
|
30
26
|
lint-executor:
|
31
27
|
docker:
|
@@ -94,11 +90,10 @@ jobs:
|
|
94
90
|
- browser-tools/install-chrome
|
95
91
|
- browser-tools/install-chromedriver
|
96
92
|
|
97
|
-
<%- if selected?(:background_processor) -%>
|
98
93
|
- run:
|
99
94
|
name: Wait for redis service
|
100
95
|
command: dockerize -wait tcp://localhost:6379 -timeout 1m
|
101
|
-
|
96
|
+
|
102
97
|
<%- if selected?(:database, :postgresql) -%>
|
103
98
|
- run:
|
104
99
|
name: Wait for postgres service
|
@@ -122,7 +117,7 @@ jobs:
|
|
122
117
|
|
123
118
|
- run:
|
124
119
|
name: POST extracted data to nest
|
125
|
-
command: bin/rake "repo_analyzer:analyze[platanus/<%= get(:
|
120
|
+
command: bin/rake "repo_analyzer:analyze[platanus/<%= get(:github_repo_name) || get(:dasherized_app_name) %>]"
|
126
121
|
|
127
122
|
- run:
|
128
123
|
name: Run simplecov
|
@@ -137,12 +132,10 @@ jobs:
|
|
137
132
|
RSPEC_FORMAT_ARGS="--tag type:system -f progress --no-color -p 10"
|
138
133
|
bundle exec rspec spec $RSPEC_FORMAT_ARGS $RSPEC_JUNIT_ARGS
|
139
134
|
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
./node_modules/.bin/format-coverage coverage/input_vitest.txt coverage/output_vitest.txt /home/circleci/project/app/frontend
|
145
|
-
cat coverage/output_vitest.txt | ./bin/reviewdog -reporter=github-pr-review -efm="%f:%l:%c: %m"
|
135
|
+
- run:
|
136
|
+
name: Run vitest
|
137
|
+
command: |
|
138
|
+
yarn run test
|
146
139
|
|
147
140
|
- store_test_results:
|
148
141
|
path: test_results
|
@@ -152,6 +145,13 @@ jobs:
|
|
152
145
|
steps:
|
153
146
|
- setup
|
154
147
|
|
148
|
+
- run:
|
149
|
+
name: Run brakeman
|
150
|
+
shell: /bin/bash
|
151
|
+
command: |
|
152
|
+
bundle exec brakeman --quiet --format tabs --no-exit-on-warn --no-exit-on-error --output "tmp/brakeman_report"; \
|
153
|
+
./bin/reviewdog < "tmp/brakeman_report" -reporter=github-pr-review -f=brakeman -name="Brakeman"
|
154
|
+
|
155
155
|
- run:
|
156
156
|
name: Get files to lint
|
157
157
|
command: git diff origin/master --name-only --diff-filter=d > tmp/files_to_lint
|
@@ -0,0 +1 @@
|
|
1
|
+
APPLICATION_HOST=localhost:3000
|
@@ -3,14 +3,13 @@
|
|
3
3
|
"browser": true,
|
4
4
|
"es2021": true,
|
5
5
|
"node": true,
|
6
|
-
"jest/globals": true,
|
7
6
|
"vue/setup-compiler-macros": true
|
8
7
|
},
|
9
8
|
"parserOptions": {
|
10
9
|
"ecmaVersion": 2020,
|
11
10
|
"sourceType": "module"
|
12
11
|
},
|
13
|
-
"plugins": ["import", "
|
12
|
+
"plugins": ["import", "tailwindcss"],
|
14
13
|
"settings": {
|
15
14
|
"import/resolver": {
|
16
15
|
"node": {
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# https://github.com/redis-store/redis-store/issues/358#issuecomment-1537920008
|
2
|
+
class RedisClient::Config
|
3
|
+
alias original_initialize initialize
|
4
|
+
|
5
|
+
def initialize(**kwargs)
|
6
|
+
# remove not supported kwargs
|
7
|
+
original_initialize(
|
8
|
+
**kwargs.except(:raw, :serializer, :marshalling, :namespace, :scheme)
|
9
|
+
)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
Rails.application.config.session_store :redis_store, {
|
14
|
+
servers: [{
|
15
|
+
url: ENV['REDIS_URL']
|
16
|
+
}],
|
17
|
+
expire_after: 30.days,
|
18
|
+
key: '_app_session',
|
19
|
+
secure: Rails.env.production?
|
20
|
+
}
|
@@ -1,8 +1,18 @@
|
|
1
1
|
{
|
2
|
-
"extends":
|
3
|
-
|
2
|
+
"extends": [
|
3
|
+
"@tsconfig/node14/tsconfig.json",
|
4
|
+
"@vue/tsconfig/tsconfig.json"
|
5
|
+
],
|
6
|
+
"include": [
|
7
|
+
"vite.config.*",
|
8
|
+
"vitest.config.*",
|
9
|
+
"cypress.config.*",
|
10
|
+
"playwright.config.*"
|
11
|
+
],
|
4
12
|
"compilerOptions": {
|
5
13
|
"composite": true,
|
6
|
-
"types": [
|
14
|
+
"types": [
|
15
|
+
"node"
|
16
|
+
]
|
7
17
|
}
|
8
18
|
}
|
@@ -1,13 +1,19 @@
|
|
1
1
|
{
|
2
|
-
"extends": "@vue/tsconfig/tsconfig.
|
3
|
-
"include": [
|
2
|
+
"extends": "@vue/tsconfig/tsconfig.dom.json",
|
3
|
+
"include": [
|
4
|
+
"env.d.ts",
|
5
|
+
"app/**/*",
|
6
|
+
"app/**/*.vue"
|
7
|
+
],
|
4
8
|
"compilerOptions": {
|
5
9
|
"baseUrl": ".",
|
6
10
|
"paths": {
|
7
|
-
"@/*": [
|
8
|
-
|
11
|
+
"@/*": [
|
12
|
+
"./app/frontend/*"
|
13
|
+
]
|
14
|
+
},
|
15
|
+
"types": ["vitest/globals", "vite/client"]
|
9
16
|
},
|
10
|
-
|
11
17
|
"references": [
|
12
18
|
{
|
13
19
|
"path": "./tsconfig.config.json"
|
@@ -1,15 +1,9 @@
|
|
1
|
-
|
2
|
-
def rubocop_revision
|
3
|
-
fix_environments
|
4
|
-
end
|
1
|
+
require "rubocop"
|
5
2
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
production = File.read(file_name)
|
12
|
-
production.gsub!("config.log_tags = [ :request_id ]", "config.log_tags = [:request_id]")
|
13
|
-
File.open(file_name, "w") { |file| file.write(production) }
|
3
|
+
module RubocopHelpers
|
4
|
+
def run_rubocop
|
5
|
+
options, paths = RuboCop::Options.new.parse(["-A"])
|
6
|
+
runner = RuboCop::Runner.new(options, RuboCop::ConfigStore.new)
|
7
|
+
runner.run(paths)
|
14
8
|
end
|
15
9
|
end
|
@@ -14,8 +14,6 @@ class Recipes::BackgroundProcessor < Rails::AppBuilder
|
|
14
14
|
def create
|
15
15
|
if get(:background_processor)
|
16
16
|
add_sidekiq
|
17
|
-
add_docker_compose_redis_config
|
18
|
-
set_redis_dot_env
|
19
17
|
end
|
20
18
|
end
|
21
19
|
|
@@ -40,7 +38,6 @@ class Recipes::BackgroundProcessor < Rails::AppBuilder
|
|
40
38
|
append_to_file(".env.development", "DB_POOL=25\n")
|
41
39
|
template("../assets/sidekiq.rb.erb", "config/initializers/sidekiq.rb", force: true)
|
42
40
|
copy_file("../assets/sidekiq.yml", "config/sidekiq.yml", force: true)
|
43
|
-
copy_file("../assets/redis.yml", "config/redis.yml", force: true)
|
44
41
|
recipe.mount_sidekiq_routes
|
45
42
|
end
|
46
43
|
end
|
@@ -68,33 +65,6 @@ class Recipes::BackgroundProcessor < Rails::AppBuilder
|
|
68
65
|
|
69
66
|
private
|
70
67
|
|
71
|
-
def add_docker_compose_redis_config
|
72
|
-
compose = DockerHelpers.new('docker-compose.yml')
|
73
|
-
|
74
|
-
service_definition =
|
75
|
-
<<~YAML
|
76
|
-
image: redis
|
77
|
-
ports:
|
78
|
-
- 6379
|
79
|
-
volumes:
|
80
|
-
- redis_data:/data
|
81
|
-
YAML
|
82
|
-
|
83
|
-
compose.add_service('redis', service_definition)
|
84
|
-
compose.add_volume('redis_data')
|
85
|
-
end
|
86
|
-
|
87
|
-
def set_redis_dot_env
|
88
|
-
append_to_file(
|
89
|
-
'.env.development',
|
90
|
-
<<~TEXT
|
91
|
-
REDIS_HOST=127.0.0.1
|
92
|
-
REDIS_PORT=COMMAND_EXPAND(make services-port SERVICE=redis PORT=6379)
|
93
|
-
REDIS_URL=redis://${REDIS_HOST}:${REDIS_PORT}/1
|
94
|
-
TEXT
|
95
|
-
)
|
96
|
-
end
|
97
|
-
|
98
68
|
def enabled_mailer?
|
99
69
|
mailer_answer = get(:email_service)
|
100
70
|
mailer_answer && ![:none, :None].include?(mailer_answer.to_sym)
|
data/lib/potassium/recipes/ci.rb
CHANGED
@@ -7,6 +7,10 @@ class Recipes::Ci < Rails::AppBuilder
|
|
7
7
|
gather_gem 'rspec_junit_formatter', '~> 0.4'
|
8
8
|
end
|
9
9
|
|
10
|
+
gather_gems(:development, :test) do
|
11
|
+
gather_gem('brakeman')
|
12
|
+
end
|
13
|
+
|
10
14
|
add_readme_header :ci
|
11
15
|
application 'config.assets.js_compressor = :uglifier', env: 'test'
|
12
16
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class Recipes::EnvironmentVariables < Rails::AppBuilder
|
2
|
+
def create
|
3
|
+
template '../assets/.env.test.erb', '.env.test'
|
4
|
+
copy_file '../assets/lib/environment_variables.rb', 'lib/environment_variables.rb'
|
5
|
+
|
6
|
+
application(before_configuration_require)
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def before_configuration_require
|
12
|
+
<<~RUBY
|
13
|
+
config.before_configuration do
|
14
|
+
require Rails.root.join('lib/environment_variables.rb')
|
15
|
+
end
|
16
|
+
RUBY
|
17
|
+
end
|
18
|
+
end
|
@@ -4,6 +4,7 @@ class Recipes::FrontEndVite < Rails::AppBuilder
|
|
4
4
|
TAILWINDCSS_VERSION = Potassium::TAILWINDCSS_VERSION
|
5
5
|
AUTOPREFIXER_VERSION = Potassium::AUTOPREFIXER_VERSION
|
6
6
|
VUE_TEST_UTILS_VERSION = Potassium::VUE_TEST_UTILS_VERSION
|
7
|
+
JSDOM_VERSION = Potassium::JSDOM_VERSION
|
7
8
|
|
8
9
|
DEPENDENCIES = {
|
9
10
|
tailwind: [
|
@@ -22,6 +23,7 @@ class Recipes::FrontEndVite < Rails::AppBuilder
|
|
22
23
|
"vue@#{VUE_VERSION}"
|
23
24
|
],
|
24
25
|
vue_dev: [
|
26
|
+
"@tsconfig/node14",
|
25
27
|
"@vitejs/plugin-vue",
|
26
28
|
"@vue/tsconfig",
|
27
29
|
"vue-tsc"
|
@@ -29,7 +31,7 @@ class Recipes::FrontEndVite < Rails::AppBuilder
|
|
29
31
|
vitest_dev: [
|
30
32
|
"vitest",
|
31
33
|
"@vue/test-utils@#{VUE_TEST_UTILS_VERSION}",
|
32
|
-
"jsdom"
|
34
|
+
"jsdom@#{JSDOM_VERSION}"
|
33
35
|
],
|
34
36
|
api: [
|
35
37
|
"axios",
|
@@ -74,7 +74,7 @@ class Recipes::Mailer < Rails::AppBuilder
|
|
74
74
|
RUBY
|
75
75
|
application asset_host_prod, env: "production"
|
76
76
|
mailer_config = <<~RUBY
|
77
|
-
require Rails.root.join("config
|
77
|
+
require Rails.root.join("config/mailer")
|
78
78
|
RUBY
|
79
79
|
|
80
80
|
prepend_file "config/environments/production.rb", mailer_config
|
@@ -1,6 +1,8 @@
|
|
1
1
|
class Recipes::Rails < Rails::AppBuilder
|
2
2
|
def create
|
3
3
|
gather_gem("bootsnap", require: false)
|
4
|
+
gather_gem("sassc", github: "sass/sassc-ruby", ref: 'refs/pull/233/head')
|
5
|
+
gather_gem("sassc-embedded")
|
4
6
|
environment 'config.force_ssl = true', env: 'production'
|
5
7
|
disable_automatic_nonce_generation
|
6
8
|
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
class Recipes::Redis < Rails::AppBuilder
|
2
|
+
def create
|
3
|
+
add_redis
|
4
|
+
add_docker_compose_redis_config
|
5
|
+
set_redis_dot_env
|
6
|
+
add_session_store_config
|
7
|
+
end
|
8
|
+
|
9
|
+
def install
|
10
|
+
create
|
11
|
+
end
|
12
|
+
|
13
|
+
def installed?
|
14
|
+
gem_exists?(/redis-actionpack/)
|
15
|
+
end
|
16
|
+
|
17
|
+
def add_redis
|
18
|
+
run_action(:install_redis) do
|
19
|
+
gather_gem("redis-actionpack")
|
20
|
+
copy_file("../assets/redis.yml", "config/redis.yml", force: true)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def add_docker_compose_redis_config
|
27
|
+
compose = DockerHelpers.new('docker-compose.yml')
|
28
|
+
|
29
|
+
service_definition =
|
30
|
+
<<~YAML
|
31
|
+
image: redis:6.2.12
|
32
|
+
ports:
|
33
|
+
- 6379
|
34
|
+
volumes:
|
35
|
+
- redis_data:/data
|
36
|
+
YAML
|
37
|
+
|
38
|
+
compose.add_service('redis', service_definition)
|
39
|
+
compose.add_volume('redis_data')
|
40
|
+
end
|
41
|
+
|
42
|
+
def set_redis_dot_env
|
43
|
+
append_to_file(
|
44
|
+
'.env.development',
|
45
|
+
<<~TEXT
|
46
|
+
REDIS_HOST=127.0.0.1
|
47
|
+
REDIS_PORT=COMMAND_EXPAND(make services-port SERVICE=redis PORT=6379)
|
48
|
+
REDIS_URL=redis://${REDIS_HOST}:${REDIS_PORT}/1
|
49
|
+
TEXT
|
50
|
+
)
|
51
|
+
end
|
52
|
+
|
53
|
+
def add_session_store_config
|
54
|
+
copy_file("../assets/config/initializers/session_store.rb",
|
55
|
+
"config/initializers/session_store.rb", force: true)
|
56
|
+
end
|
57
|
+
end
|
@@ -22,9 +22,9 @@ class Recipes::Style < Rails::AppBuilder
|
|
22
22
|
|
23
23
|
after(:vite_install) do
|
24
24
|
run "yarn add --dev stylelint eslint eslint-plugin-import "\
|
25
|
-
"@typescript-eslint/eslint-plugin
|
26
|
-
"eslint-plugin-
|
27
|
-
"
|
25
|
+
"@typescript-eslint/eslint-plugin @typescript-eslint/parser "\
|
26
|
+
"eslint-plugin-platanus eslint-plugin-vue @vue/eslint-config-typescript "\
|
27
|
+
"eslint-plugin-tailwindcss"
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
@@ -136,7 +136,17 @@ class Recipes::VueAdmin < Rails::AppBuilder
|
|
136
136
|
},
|
137
137
|
});
|
138
138
|
app.component('admin_component', AdminComponent);
|
139
|
-
|
139
|
+
|
140
|
+
// Avoid using '#wrapper' as the mount point, as that includes the entire admin page,
|
141
|
+
// which could be used for Client-Side Template Injection (CSTI) attacks. Limit the
|
142
|
+
// mount point to specific areas where you need Vue components.
|
143
|
+
|
144
|
+
// DO NOT mount Vue in elements that contain user input rendered by
|
145
|
+
// ActiveAdmin.
|
146
|
+
// By default ActiveAdmin doesn't escape {{ }} in user input, so it's
|
147
|
+
// possible to inject arbitrary JavaScript code into the page.
|
148
|
+
|
149
|
+
// app.mount('#wrapper');
|
140
150
|
}
|
141
151
|
|
142
152
|
return null;
|
@@ -4,10 +4,6 @@ set :titleized_app_name, get(:app_name).titleize
|
|
4
4
|
set :underscorized_app_name, get(:app_name).underscore
|
5
5
|
set :dasherized_app_name, get(:app_name).dasherize
|
6
6
|
|
7
|
-
run_action(:after_create_rails) do
|
8
|
-
rubocop_revision
|
9
|
-
end
|
10
|
-
|
11
7
|
run_action(:cleaning) do
|
12
8
|
clean_gemfile
|
13
9
|
end
|
@@ -36,7 +32,6 @@ run_action(:recipe_loading) do
|
|
36
32
|
create :spring
|
37
33
|
create :readme
|
38
34
|
create :heroku
|
39
|
-
create :ci
|
40
35
|
create :style
|
41
36
|
create :puma
|
42
37
|
create :env
|
@@ -50,6 +45,7 @@ run_action(:recipe_loading) do
|
|
50
45
|
create :yarn
|
51
46
|
create :editorconfig
|
52
47
|
create :mailer
|
48
|
+
create :redis
|
53
49
|
create :background_processor
|
54
50
|
create :schedule
|
55
51
|
create :i18n
|
@@ -71,6 +67,7 @@ run_action(:recipe_loading) do
|
|
71
67
|
create :tzinfo
|
72
68
|
create :script
|
73
69
|
create :github
|
70
|
+
create :ci
|
74
71
|
create :cleanup
|
75
72
|
create :google_tag_manager
|
76
73
|
create :mjml
|
@@ -78,6 +75,7 @@ run_action(:recipe_loading) do
|
|
78
75
|
create :front_end_vite
|
79
76
|
create :admin
|
80
77
|
create :vue_admin
|
78
|
+
create :environment_variables
|
81
79
|
end
|
82
80
|
|
83
81
|
info "Gathered enough information. Applying the template. Wait a minute."
|
@@ -91,3 +89,7 @@ run_action(:database_creation) do
|
|
91
89
|
run "bundle exec rails db:create db:migrate"
|
92
90
|
run "RACK_ENV=test bundle exec rails db:create db:migrate"
|
93
91
|
end
|
92
|
+
|
93
|
+
run_action(:rubocop_revision) do
|
94
|
+
run_rubocop
|
95
|
+
end
|
data/lib/potassium/version.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
module Potassium
|
2
|
-
VERSION = "7.
|
2
|
+
VERSION = "7.1.0"
|
3
3
|
RUBY_VERSION = "2.7.0"
|
4
4
|
RAILS_VERSION = "~> 7.0.4.2"
|
5
5
|
RUBOCOP_VERSION = "~> 1.9"
|
6
6
|
RUBOCOP_RSPEC_VERSION = "~> 2.2"
|
7
7
|
POSTGRES_VERSION = "11.3"
|
8
8
|
MYSQL_VERSION = "5.7"
|
9
|
-
NODE_VERSION = "
|
9
|
+
NODE_VERSION = "20"
|
10
10
|
TAILWINDCSS_VERSION = "^3.2.7"
|
11
11
|
POSTCSS_VERSION = "^8.4.21"
|
12
12
|
AUTOPREFIXER_VERSION = "^10.4.13"
|
@@ -14,4 +14,5 @@ module Potassium
|
|
14
14
|
VUE_LOADER_VERSION = "^16.8.3"
|
15
15
|
VUE_TEST_UTILS_VERSION = "^2.0.2"
|
16
16
|
JEST_VERSION = "^29.0.0"
|
17
|
+
JSDOM_VERSION = "^21.1.2"
|
17
18
|
end
|
data/spec/features/ci_spec.rb
CHANGED
@@ -13,11 +13,18 @@ RSpec.describe 'CI' do
|
|
13
13
|
create_dummy_project
|
14
14
|
end
|
15
15
|
|
16
|
+
it "adds brakeman to Gemfile" do
|
17
|
+
content = IO.read("#{project_path}/Gemfile")
|
18
|
+
expect(content).to include("brakeman")
|
19
|
+
end
|
20
|
+
|
16
21
|
it "correctly bundles the config file" do
|
17
|
-
expect(ci_config).to include('cimg/ruby', 'cache', 'rspec', 'reviewdog')
|
22
|
+
expect(ci_config).to include('cimg/ruby', 'cache', 'rspec', 'reviewdog', 'brakeman')
|
18
23
|
end
|
19
24
|
|
20
|
-
it "
|
21
|
-
expect(ci_config).to include(
|
25
|
+
it "uses dasherized app name for repo analyzer" do
|
26
|
+
expect(ci_config).to include(
|
27
|
+
"repo_analyzer:analyze[platanus/#{PotassiumTestHelpers::APP_NAME.dasherize}]"
|
28
|
+
)
|
22
29
|
end
|
23
30
|
end
|
@@ -36,9 +36,5 @@ RSpec.describe "Coverage" do
|
|
36
36
|
it "adds vitest coverage configuration" do
|
37
37
|
expect(vite_config).to include("provider: 'c8',")
|
38
38
|
end
|
39
|
-
|
40
|
-
it "adds jest text formatter package" do
|
41
|
-
expect(node_modules_file).to include('jest-text-formatter')
|
42
|
-
end
|
43
39
|
end
|
44
40
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe 'EnvironmentVariables' do
|
4
|
+
let(:environment_variables) { IO.read("#{project_path}/lib/environment_variables.rb") }
|
5
|
+
|
6
|
+
before :all do
|
7
|
+
drop_dummy_database
|
8
|
+
remove_project_directory
|
9
|
+
create_dummy_project
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'creates a .env.test file' do
|
13
|
+
expect(File.exists?("#{project_path}/.env.test")).to eq(true)
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'creates an EnvironmentVariables module with a constant and its method' do
|
17
|
+
expect(environment_variables).to include(
|
18
|
+
'module EnvironmentVariables',
|
19
|
+
"APPLICATION_HOST = ENV.fetch('APPLICATION_HOST')",
|
20
|
+
'def application_host'
|
21
|
+
)
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'requires module in application configuration' do
|
25
|
+
expect(File.read("#{project_path}/config/application.rb"))
|
26
|
+
.to include("require Rails.root.join('lib/environment_variables.rb')")
|
27
|
+
end
|
28
|
+
end
|
@@ -1,4 +1,3 @@
|
|
1
|
-
# rubocop:disable Rspec/MultipleMemoizedHelpers
|
2
1
|
require "spec_helper"
|
3
2
|
|
4
3
|
RSpec.describe "Mailer" do
|
@@ -18,7 +17,7 @@ RSpec.describe "Mailer" do
|
|
18
17
|
end
|
19
18
|
let(:mailer_config_text) do
|
20
19
|
<<~RUBY
|
21
|
-
require Rails.root.join("config
|
20
|
+
require Rails.root.join("config/mailer")
|
22
21
|
RUBY
|
23
22
|
end
|
24
23
|
|
@@ -102,4 +101,3 @@ RSpec.describe "Mailer" do
|
|
102
101
|
end
|
103
102
|
end
|
104
103
|
end
|
105
|
-
# rubocop:enable Rspec/MultipleMemoizedHelpers
|
@@ -9,15 +9,9 @@ RSpec.describe "A new project" do
|
|
9
9
|
end
|
10
10
|
|
11
11
|
it "is correctly bundled" do
|
12
|
-
expect { on_project { `bundle exec rails -v` } }.
|
12
|
+
expect { on_project { `bundle exec rails -v` } }.not_to output.to_stderr
|
13
13
|
end
|
14
14
|
|
15
|
-
# it "is a valid rubocop project" do
|
16
|
-
# on_project do
|
17
|
-
# expect(run_rubocop).to eq(true)
|
18
|
-
# end
|
19
|
-
# end
|
20
|
-
|
21
15
|
it "configures postgresql" do
|
22
16
|
database_config_file = IO.read("#{project_path}/config/database.yml")
|
23
17
|
gemfile = IO.read("#{project_path}/Gemfile")
|
data/spec/features/node_spec.rb
CHANGED
@@ -0,0 +1,43 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
RSpec.describe "RedisProcessor" do
|
5
|
+
before :all do
|
6
|
+
drop_dummy_database
|
7
|
+
remove_project_directory
|
8
|
+
create_dummy_project("heroku" => true)
|
9
|
+
end
|
10
|
+
|
11
|
+
context "when installed" do
|
12
|
+
it "adds redis-actionpack gem to Gemfile" do
|
13
|
+
gemfile_content = IO.read("#{project_path}/Gemfile")
|
14
|
+
expect(gemfile_content).to include("redis-actionpack")
|
15
|
+
end
|
16
|
+
|
17
|
+
it "adds ENV vars" do
|
18
|
+
content = IO.read("#{project_path}/.env.development")
|
19
|
+
expect(content).to include('REDIS_HOST=127.0.0.1')
|
20
|
+
expect(content).to include(
|
21
|
+
'REDIS_PORT=COMMAND_EXPAND(make services-port SERVICE=redis PORT=6379)'
|
22
|
+
)
|
23
|
+
expect(content).to include('REDIS_URL=redis://${REDIS_HOST}:${REDIS_PORT}/1')
|
24
|
+
end
|
25
|
+
|
26
|
+
it "adds redis.yml file" do
|
27
|
+
content = IO.read("#{project_path}/config/redis.yml")
|
28
|
+
expect(content).to include("REDIS_URL")
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'adds redis to docker-compose' do
|
32
|
+
compose_file = IO.read("#{project_path}/docker-compose.yml")
|
33
|
+
compose_content = YAML.safe_load(compose_file, symbolize_names: true)
|
34
|
+
|
35
|
+
expect(compose_content[:services]).to include(:redis)
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'copies session store config' do
|
39
|
+
content = IO.read("#{project_path}/config/initializers/session_store.rb")
|
40
|
+
expect(content).to include("RedisClient::Config")
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/spec/front_end_vite_spec.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
# rubocop:disable RSpec/MultipleMemoizedHelpers
|
2
1
|
require 'spec_helper'
|
3
2
|
|
4
3
|
RSpec.describe 'Front end' do
|
@@ -70,7 +69,7 @@ RSpec.describe 'Front end' do
|
|
70
69
|
end
|
71
70
|
|
72
71
|
it 'includes mock example' do
|
73
|
-
expect(mock_example_file).to include('
|
72
|
+
expect(mock_example_file).to include('vi.fn()')
|
74
73
|
end
|
75
74
|
|
76
75
|
it 'includes the dotenv monkeypatch' do
|
@@ -78,4 +77,3 @@ RSpec.describe 'Front end' do
|
|
78
77
|
expect(File.exists?(File.join(project_path, 'lib/dotenv_monkeypatch.rb'))).to be(true)
|
79
78
|
end
|
80
79
|
end
|
81
|
-
# rubocop:enable RSpec/MultipleMemoizedHelpers
|
@@ -97,10 +97,4 @@ module PotassiumTestHelpers
|
|
97
97
|
def run_command(command)
|
98
98
|
system(command)
|
99
99
|
end
|
100
|
-
|
101
|
-
def run_rubocop
|
102
|
-
options, paths = RuboCop::Options.new.parse(["."])
|
103
|
-
runner = RuboCop::Runner.new(options, RuboCop::ConfigStore.new)
|
104
|
-
runner.run(paths)
|
105
|
-
end
|
106
100
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: potassium
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 7.
|
4
|
+
version: 7.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- juliogarciag
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-03
|
11
|
+
date: 2023-07-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -266,6 +266,7 @@ files:
|
|
266
266
|
- lib/potassium/assets/.dockerignore
|
267
267
|
- lib/potassium/assets/.editorconfig
|
268
268
|
- lib/potassium/assets/.env.development.erb
|
269
|
+
- lib/potassium/assets/.env.test.erb
|
269
270
|
- lib/potassium/assets/.eslintrc.json
|
270
271
|
- lib/potassium/assets/.github/pull_request_template.md
|
271
272
|
- lib/potassium/assets/.pryrc
|
@@ -311,6 +312,7 @@ files:
|
|
311
312
|
- lib/potassium/assets/bin/update.erb
|
312
313
|
- lib/potassium/assets/config/database_mysql.yml.erb
|
313
314
|
- lib/potassium/assets/config/database_postgresql.yml.erb
|
315
|
+
- lib/potassium/assets/config/initializers/session_store.rb
|
314
316
|
- lib/potassium/assets/config/initializers/shrine/plugins/image_handling_utilities.rb
|
315
317
|
- lib/potassium/assets/config/mailer.rb.erb
|
316
318
|
- lib/potassium/assets/config/puma.rb
|
@@ -321,6 +323,7 @@ files:
|
|
321
323
|
- lib/potassium/assets/docker-compose.yml
|
322
324
|
- lib/potassium/assets/es-CL.yml
|
323
325
|
- lib/potassium/assets/lib/dotenv_monkeypatch.rb
|
326
|
+
- lib/potassium/assets/lib/environment_variables.rb
|
324
327
|
- lib/potassium/assets/lib/tasks/auto_annotate_models.rake
|
325
328
|
- lib/potassium/assets/package.json
|
326
329
|
- lib/potassium/assets/public/mails/platanus-logo.png
|
@@ -382,6 +385,7 @@ files:
|
|
382
385
|
- lib/potassium/recipes/draper.rb
|
383
386
|
- lib/potassium/recipes/editorconfig.rb
|
384
387
|
- lib/potassium/recipes/env.rb
|
388
|
+
- lib/potassium/recipes/environment_variables.rb
|
385
389
|
- lib/potassium/recipes/error_reporting.rb
|
386
390
|
- lib/potassium/recipes/file_storage.rb
|
387
391
|
- lib/potassium/recipes/front_end_vite.rb
|
@@ -401,6 +405,7 @@ files:
|
|
401
405
|
- lib/potassium/recipes/rack_cors.rb
|
402
406
|
- lib/potassium/recipes/rails.rb
|
403
407
|
- lib/potassium/recipes/readme.rb
|
408
|
+
- lib/potassium/recipes/redis.rb
|
404
409
|
- lib/potassium/recipes/ruby.rb
|
405
410
|
- lib/potassium/recipes/schedule.rb
|
406
411
|
- lib/potassium/recipes/script.rb
|
@@ -430,6 +435,7 @@ files:
|
|
430
435
|
- spec/features/database_container_spec.rb
|
431
436
|
- spec/features/database_spec.rb
|
432
437
|
- spec/features/draper_spec.rb
|
438
|
+
- spec/features/environment_variables_spec.rb
|
433
439
|
- spec/features/error_reporting_spec.rb
|
434
440
|
- spec/features/file_storage_spec.rb
|
435
441
|
- spec/features/github_spec.rb
|
@@ -442,6 +448,7 @@ files:
|
|
442
448
|
- spec/features/node_spec.rb
|
443
449
|
- spec/features/power_types_spec.rb
|
444
450
|
- spec/features/pundit_spec.rb
|
451
|
+
- spec/features/redis_spec.rb
|
445
452
|
- spec/features/schedule_spec.rb
|
446
453
|
- spec/features/testing_spec.rb
|
447
454
|
- spec/features/vue_admin_spec.rb
|
@@ -472,7 +479,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
472
479
|
- !ruby/object:Gem::Version
|
473
480
|
version: '0'
|
474
481
|
requirements: []
|
475
|
-
rubygems_version: 3.
|
482
|
+
rubygems_version: 3.4.10
|
476
483
|
signing_key:
|
477
484
|
specification_version: 4
|
478
485
|
summary: An application generator from Platanus
|
@@ -488,6 +495,7 @@ test_files:
|
|
488
495
|
- spec/features/database_container_spec.rb
|
489
496
|
- spec/features/database_spec.rb
|
490
497
|
- spec/features/draper_spec.rb
|
498
|
+
- spec/features/environment_variables_spec.rb
|
491
499
|
- spec/features/error_reporting_spec.rb
|
492
500
|
- spec/features/file_storage_spec.rb
|
493
501
|
- spec/features/github_spec.rb
|
@@ -500,6 +508,7 @@ test_files:
|
|
500
508
|
- spec/features/node_spec.rb
|
501
509
|
- spec/features/power_types_spec.rb
|
502
510
|
- spec/features/pundit_spec.rb
|
511
|
+
- spec/features/redis_spec.rb
|
503
512
|
- spec/features/schedule_spec.rb
|
504
513
|
- spec/features/testing_spec.rb
|
505
514
|
- spec/features/vue_admin_spec.rb
|