From ed4f8ad6d96fec99d98820cc5475cc7c4d4ec287 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javi=20Mart=C3=ADn?= Date: Sat, 22 Jul 2023 03:03:42 +0200 Subject: [PATCH 1/5] Simplify development environment setup Rails provides a script that already did most of the steps. --- README.md | 7 +------ README_ES.md | 7 +------ bin/setup | 13 +++++++++---- 3 files changed, 11 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 5d580d5ce..8275db92b 100644 --- a/README.md +++ b/README.md @@ -43,13 +43,8 @@ Prerequisites: install git, Ruby 3.1.4, CMake, pkg-config, shared-mime-info, Nod ```bash git clone https://github.com/consuldemocracy/consuldemocracy.git cd consuldemocracy -bundle install -cp config/database.yml.example config/database.yml -cp config/secrets.yml.example config/secrets.yml -bin/rake db:create -bin/rake db:migrate +bin/setup bin/rake db:dev_seed -RAILS_ENV=test rake db:setup ``` Run the app locally: diff --git a/README_ES.md b/README_ES.md index 0704e6f98..ad8c5e105 100644 --- a/README_ES.md +++ b/README_ES.md @@ -41,13 +41,8 @@ Prerequisitos: tener instalado git, Ruby 3.1.4, CMake, pkg-config, shared-mime-i ```bash git clone https://github.com/consuldemocracy/consuldemocracy.git cd consuldemocracy -bundle install -cp config/database.yml.example config/database.yml -cp config/secrets.yml.example config/secrets.yml -bin/rake db:create -bin/rake db:migrate +bin/setup bin/rake db:dev_seed -RAILS_ENV=test rake db:setup ``` Para ejecutar la aplicación en local: diff --git a/bin/setup b/bin/setup index 50fe75198..0fa8d7173 100755 --- a/bin/setup +++ b/bin/setup @@ -17,13 +17,18 @@ FileUtils.chdir APP_ROOT do system! "gem install bundler --conservative" system("bundle check") || system!("bundle install") - # puts "\n== Copying sample files ==" - # unless File.exist?('config/database.yml') - # FileUtils.cp 'config/database.yml.sample', 'config/database.yml' - # end + puts "\n== Copying sample files ==" + unless File.exist?("config/database.yml") + FileUtils.cp "config/database.yml.example", "config/database.yml" + end + + unless File.exist?("config/secrets.yml") + FileUtils.cp "config/secrets.yml.example", "config/secrets.yml" + end puts "\n== Preparing database ==" system! "bin/rails db:prepare" + system! "RAILS_ENV=test bin/rails db:prepare" puts "\n== Removing old logs and tempfiles ==" system! "bin/rails log:clear tmp:clear" From ad166fba4c39092af3468f692cdb324c30e85aba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javi=20Mart=C3=ADn?= Date: Sat, 22 Jul 2023 03:22:08 +0200 Subject: [PATCH 2/5] Setup NPM with an empty package.json file Note that, even if we're excluding the `node_modules/` folder from version control, we aren't adding it to Capistrano's shared folders because, when `node_modules` is a symbolic link, NPM removes it when running `npm install`. --- .dockerignore | 1 + .github/workflows/tests.yml | 3 +++ .gitignore | 1 + .gitlab-ci.yml | 1 + Dockerfile | 3 +++ bin/setup | 3 +++ config/application.rb | 1 + package-lock.json | 10 ++++++++++ package.json | 3 +++ 9 files changed, 26 insertions(+) create mode 100644 package-lock.json create mode 100644 package.json diff --git a/.dockerignore b/.dockerignore index 8c75b254c..c9b8c5bec 100644 --- a/.dockerignore +++ b/.dockerignore @@ -24,6 +24,7 @@ public/tenants/*/sitemap.xml public/assets/ public/machine_learning/data/ public/tenants/*/machine_learning/data/ +node_modules/ # Bundler config, cache and gemsets **/.bundle/ diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 57cb41e4a..8b35ff2d9 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -42,7 +42,10 @@ jobs: - name: Setup NPM uses: actions/setup-node@v3 with: + cache: "npm" node-version-file: ".node-version" + - name: Install node packages + run: npm clean-install - name: Copy secrets and database files run: for i in config/*.example; do cp "$i" "${i/.example}"; done - name: Setup database diff --git a/.gitignore b/.gitignore index 28d1c676c..ee42703e8 100644 --- a/.gitignore +++ b/.gitignore @@ -26,6 +26,7 @@ tmp/ /public/assets/ /public/machine_learning/data/ /public/tenants/*/machine_learning/data/ +/node_modules/ # Bundler config, cache and gemsets .bundle/ diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f0253b5ec..ffa5da70f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -23,6 +23,7 @@ tests: - bundle --without development - bundle exec rake db:setup - bundle exec rake assets:precompile > /dev/null 2>&1 + - npm clean-install - bin/knapsack_pro_rspec artifacts: when: on_failure diff --git a/Dockerfile b/Dockerfile index a3bfa8450..d2a08ad54 100644 --- a/Dockerfile +++ b/Dockerfile @@ -51,6 +51,9 @@ RUN curl -sL https://github.com/nodenv/node-build/archive/master.tar.gz | tar xz COPY Gemfile* ./ RUN bundle install +COPY package* ./ +RUN npm install + # Copy the Rails application into place COPY . . diff --git a/bin/setup b/bin/setup index 0fa8d7173..025afb7d7 100755 --- a/bin/setup +++ b/bin/setup @@ -17,6 +17,9 @@ FileUtils.chdir APP_ROOT do system! "gem install bundler --conservative" system("bundle check") || system!("bundle install") + # Install JavaScript dependencies + system!("npm install") + puts "\n== Copying sample files ==" unless File.exist?("config/database.yml") FileUtils.cp "config/database.yml.example", "config/database.yml" diff --git a/config/application.rb b/config/application.rb index 039211877..41571981c 100644 --- a/config/application.rb +++ b/config/application.rb @@ -117,6 +117,7 @@ module Consul config.assets.paths << Rails.root.join("app", "assets", "fonts") config.assets.paths << Rails.root.join("vendor", "assets", "fonts") + config.assets.paths << Rails.root.join("node_modules") # Add lib to the autoload path config.autoload_paths << Rails.root.join("lib") diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..40dc9185a --- /dev/null +++ b/package-lock.json @@ -0,0 +1,10 @@ +{ + "name": "consuldemocracy", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "consuldemocracy" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 000000000..2a38b2ee1 --- /dev/null +++ b/package.json @@ -0,0 +1,3 @@ +{ + "name": "consuldemocracy" +} From daf960add46239c80c8fd1fb447dd5738eb1338b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javi=20Mart=C3=ADn?= Date: Sat, 22 Jul 2023 03:34:27 +0200 Subject: [PATCH 3/5] Run npm:install when deploying with Capistrano --- Capfile | 1 + Gemfile | 1 + Gemfile.lock | 3 +++ 3 files changed, 5 insertions(+) diff --git a/Capfile b/Capfile index ddb830a70..028f66767 100644 --- a/Capfile +++ b/Capfile @@ -5,6 +5,7 @@ require "capistrano/setup" require "capistrano/deploy" require "capistrano/bundler" +require "capistrano/npm" require "capistrano/rails/assets" require "capistrano/rails/migrations" #require "capistrano/passenger" diff --git a/Gemfile b/Gemfile index f2664feef..be5779c08 100644 --- a/Gemfile +++ b/Gemfile @@ -96,6 +96,7 @@ end group :development do gem "capistrano", "~> 3.17.3", require: false gem "capistrano-bundler", "~> 2.1.0", require: false + gem "capistrano-npm", "~> 1.0.3", require: false gem "capistrano-rails", "~> 1.6.3", require: false gem "capistrano3-delayed-job", "~> 1.7.6" gem "capistrano3-puma", "~> 5.2.0" diff --git a/Gemfile.lock b/Gemfile.lock index d47091592..82c4283f2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -120,6 +120,8 @@ GEM sshkit (>= 1.9.0) capistrano-bundler (2.1.0) capistrano (~> 3.1) + capistrano-npm (1.0.3) + capistrano (>= 3.0.0) capistrano-rails (1.6.3) capistrano (~> 3.1) capistrano-bundler (>= 1.1, < 3) @@ -692,6 +694,7 @@ DEPENDENCIES cancancan (~> 3.5.0) capistrano (~> 3.17.3) capistrano-bundler (~> 2.1.0) + capistrano-npm (~> 1.0.3) capistrano-rails (~> 1.6.3) capistrano3-delayed-job (~> 1.7.6) capistrano3-puma (~> 5.2.0) From 421cbe5441225ab9a823164dd3c735f598fddd4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javi=20Mart=C3=ADn?= Date: Wed, 6 Sep 2023 19:43:25 +0200 Subject: [PATCH 4/5] Use dependabot to update NPM packages Just like we do with gems. --- .github/dependabot.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 25c7963f4..b88c4b665 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -5,3 +5,8 @@ updates: schedule: interval: monthly open-pull-requests-limit: 50 +- package-ecosystem: npm + directory: "/" + schedule: + interval: monthly + open-pull-requests-limit: 50 From 3b6fb85c519d2580d4c0f7e38502c5b486d95683 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javi=20Mart=C3=ADn?= Date: Fri, 8 Sep 2023 16:02:35 +0200 Subject: [PATCH 5/5] Use node packages to install jQuery and jQuery UI Other packages depend on jQuery, so that's why these are the first one we move from the Gemfile to the package.json file. This way we can also test whether dependabot correctly opens pull requests to update Node packages. I've tried several configuration options for the asset pipeline in order to be able to include images referenced in jQuery UI CSS files. So far, adding the `node_modules/jquery-ui/themes/base` folder to the assets paths is the only way I've found to make it work. Hopefully we can find a better solution in the future so we don't have to study the internals of every Node package in order to integrate it with the assets pipeline. --- Gemfile | 2 - Gemfile.lock | 8 --- app/assets/javascripts/application.js | 69 ++++++++++++++----------- app/assets/stylesheets/application.scss | 7 +-- config/application.rb | 1 + package-lock.json | 25 ++++++++- package.json | 7 ++- 7 files changed, 75 insertions(+), 44 deletions(-) diff --git a/Gemfile b/Gemfile index be5779c08..897cdf8ff 100644 --- a/Gemfile +++ b/Gemfile @@ -33,8 +33,6 @@ gem "image_processing", "~> 1.12.2" gem "initialjs-rails", "~> 0.2.0.9" gem "invisible_captcha", "~> 2.1.0" gem "jquery-fileupload-rails" -gem "jquery-rails", "~> 4.6.0" -gem "jquery-ui-rails", "~> 6.0.1" gem "kaminari", "~> 1.2.2" gem "leaflet-rails", "~> 1.9.3" gem "mini_magick", "~> 4.12.0" diff --git a/Gemfile.lock b/Gemfile.lock index 82c4283f2..141fb84e6 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -287,12 +287,6 @@ GEM actionpack (>= 3.1) railties (>= 3.1) sassc - jquery-rails (4.6.0) - rails-dom-testing (>= 1, < 3) - railties (>= 4.2.0) - thor (>= 0.14, < 2.0) - jquery-ui-rails (6.0.1) - railties (>= 3.2.16) json (2.6.3) jwt (2.7.1) kaminari (1.2.2) @@ -727,8 +721,6 @@ DEPENDENCIES initialjs-rails (~> 0.2.0.9) invisible_captcha (~> 2.1.0) jquery-fileupload-rails - jquery-rails (~> 4.6.0) - jquery-ui-rails (~> 6.0.1) kaminari (~> 1.2.2) knapsack_pro (~> 5.7.0) launchy (~> 2.5.2) diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 0b8813002..3353e6652 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -10,35 +10,46 @@ // Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details // about supported directives. // -//= require jquery3 -//= require jquery_ujs -//= require jquery-ui/widgets/datepicker -//= require jquery-ui/i18n/datepicker-ar -//= require jquery-ui/i18n/datepicker-bs -//= require jquery-ui/i18n/datepicker-cs -//= require jquery-ui/i18n/datepicker-da -//= require jquery-ui/i18n/datepicker-de -//= require jquery-ui/i18n/datepicker-el -//= require jquery-ui/i18n/datepicker-es -//= require jquery-ui/i18n/datepicker-fa -//= require jquery-ui/i18n/datepicker-fr -//= require jquery-ui/i18n/datepicker-gl -//= require jquery-ui/i18n/datepicker-he -//= require jquery-ui/i18n/datepicker-hr -//= require jquery-ui/i18n/datepicker-id -//= require jquery-ui/i18n/datepicker-it -//= require jquery-ui/i18n/datepicker-nl -//= require jquery-ui/i18n/datepicker-pl -//= require jquery-ui/i18n/datepicker-pt-BR -//= require jquery-ui/i18n/datepicker-ru -//= require jquery-ui/i18n/datepicker-sl -//= require jquery-ui/i18n/datepicker-sq -//= require jquery-ui/i18n/datepicker-sv -//= require jquery-ui/i18n/datepicker-zh-CN -//= require jquery-ui/i18n/datepicker-zh-TW -//= require jquery-ui/i18n/datepicker-en-GB -//= require jquery-ui/widgets/autocomplete -//= require jquery-ui/widgets/sortable +//= require jquery +//= require jquery-ujs +//= require jquery-ui/ui/version +//= require jquery-ui/ui/data +//= require jquery-ui/ui/ie +//= require jquery-ui/ui/keycode +//= require jquery-ui/ui/position +//= require jquery-ui/ui/safe-active-element +//= require jquery-ui/ui/scroll-parent +//= require jquery-ui/ui/unique-id +//= require jquery-ui/ui/widget +//= require jquery-ui/ui/widgets/menu +//= require jquery-ui/ui/widgets/mouse +//= require jquery-ui/ui/widgets/datepicker +//= require jquery-ui/ui/i18n/datepicker-ar +//= require jquery-ui/ui/i18n/datepicker-bs +//= require jquery-ui/ui/i18n/datepicker-cs +//= require jquery-ui/ui/i18n/datepicker-da +//= require jquery-ui/ui/i18n/datepicker-de +//= require jquery-ui/ui/i18n/datepicker-el +//= require jquery-ui/ui/i18n/datepicker-es +//= require jquery-ui/ui/i18n/datepicker-fa +//= require jquery-ui/ui/i18n/datepicker-fr +//= require jquery-ui/ui/i18n/datepicker-gl +//= require jquery-ui/ui/i18n/datepicker-he +//= require jquery-ui/ui/i18n/datepicker-hr +//= require jquery-ui/ui/i18n/datepicker-id +//= require jquery-ui/ui/i18n/datepicker-it +//= require jquery-ui/ui/i18n/datepicker-nl +//= require jquery-ui/ui/i18n/datepicker-pl +//= require jquery-ui/ui/i18n/datepicker-pt-BR +//= require jquery-ui/ui/i18n/datepicker-ru +//= require jquery-ui/ui/i18n/datepicker-sl +//= require jquery-ui/ui/i18n/datepicker-sq +//= require jquery-ui/ui/i18n/datepicker-sv +//= require jquery-ui/ui/i18n/datepicker-zh-CN +//= require jquery-ui/ui/i18n/datepicker-zh-TW +//= require jquery-ui/ui/i18n/datepicker-en-GB +//= require jquery-ui/ui/widgets/autocomplete +//= require jquery-ui/ui/widgets/sortable //= require jquery-fileupload/basic //= require foundation //= require turbolinks diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 383d13091..068a33797 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -7,9 +7,10 @@ @import "font-awesome/path"; @import "font-awesome/mixins"; @import "font-awesome/core"; -@import "jquery-ui/autocomplete"; -@import "jquery-ui/datepicker"; -@import "jquery-ui/sortable"; +@import "jquery-ui/themes/base/theme"; +@import "jquery-ui/themes/base/autocomplete"; +@import "jquery-ui/themes/base/datepicker"; +@import "jquery-ui/themes/base/sortable"; @import "leaflet"; @import "foundation_and_overrides"; diff --git a/config/application.rb b/config/application.rb index 41571981c..9a37609a9 100644 --- a/config/application.rb +++ b/config/application.rb @@ -117,6 +117,7 @@ module Consul config.assets.paths << Rails.root.join("app", "assets", "fonts") config.assets.paths << Rails.root.join("vendor", "assets", "fonts") + config.assets.paths << Rails.root.join("node_modules", "jquery-ui", "themes", "base") config.assets.paths << Rails.root.join("node_modules") # Add lib to the autoload path diff --git a/package-lock.json b/package-lock.json index 40dc9185a..ac8a092f3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,7 +4,30 @@ "requires": true, "packages": { "": { - "name": "consuldemocracy" + "name": "consuldemocracy", + "dependencies": { + "jquery": "^3.6.0", + "jquery-ui": "^1.12.1", + "jquery-ujs": "^1.2.2" + } + }, + "node_modules/jquery": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", + "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" + }, + "node_modules/jquery-ui": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.12.1.tgz", + "integrity": "sha512-K/kDBMXkTky5LH+gqbMvttU1ipqCTaecKyAFjwHjUnPTVfm5I5PZC7We31iNR3yWtAHNqoxkLoit06lR/gKVlA==" + }, + "node_modules/jquery-ujs": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jquery-ujs/-/jquery-ujs-1.2.2.tgz", + "integrity": "sha512-8AlF0ww/8mDdrT/Z2Nmv16r9LI2Xw/H3LiHNpPJYp4gnk/zIAfJTnhLcBRm6FZqQ/bWfW/rPl6j16lhO35DvOg==", + "dependencies": { + "jquery": ">=1.8.0" + } } } } diff --git a/package.json b/package.json index 2a38b2ee1..7f108272f 100644 --- a/package.json +++ b/package.json @@ -1,3 +1,8 @@ { - "name": "consuldemocracy" + "name": "consuldemocracy", + "dependencies": { + "jquery": "^3.6.0", + "jquery-ui": "^1.12.1", + "jquery-ujs": "^1.2.2" + } }