Skip to content

Commit 8a9b839

Browse files
committed
Drop EOL versions, switch to Cuprite, modernize CI
- Drop Ruby < 3.1, Rails < 7.1, ActiveAdmin < 3.0 - Replace selenium-webdriver/webdrivers with Cuprite - Replace coveralls with direct test runs - Update sqlite3 ~> 1.4 to ~> 2.0 - Move sprockets-rails/sass-rails out of test group - Fix rails_template.rb for Rails 7.1+ (require_relative) - Fix ambiguous calendar selectors for Cuprite - Add ActiveRecord::Migration.maintain_test_schema! - Update CI matrix: Ruby 3.2-3.4, Rails 7.1-7.2, AA 3.2-3.3 - Use bundler-cache in CI, remove bundler < 2 constraint
1 parent d318dfb commit 8a9b839

File tree

8 files changed

+127
-117
lines changed

8 files changed

+127
-117
lines changed

.github/workflows/ci.yml

Lines changed: 71 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,33 +2,26 @@ name: CI
22
on:
33
pull_request:
44
push:
5-
branches:
6-
- master
5+
branches: [master]
6+
7+
permissions:
8+
contents: read
9+
pages: write
10+
id-token: write
11+
712
jobs:
813
test:
9-
name: Tests with Ruby ${{ matrix.ruby }} Rails ${{ matrix.rails }} Active Admin ${{ matrix.activeadmin }}
14+
name: Ruby ${{ matrix.ruby }} / Rails ${{ matrix.rails }} / AA ${{ matrix.activeadmin }}
1015
runs-on: ubuntu-latest
1116
strategy:
17+
fail-fast: false
1218
matrix:
13-
ruby:
14-
- '3.0.0'
15-
- '3.1.0'
16-
- '3.2.0'
17-
- '3.3.0'
18-
rails:
19-
- '6.1.0'
20-
- '7.0.0'
21-
- '7.1.0'
22-
activeadmin:
23-
- '2.14.0'
24-
- '3.0.0'
25-
- '3.1.0'
26-
- '3.2.0'
19+
ruby: ['3.2', '3.3', '3.4']
20+
rails: ['7.1.0', '7.2.0', '8.0.0']
21+
activeadmin: ['3.2.0', '3.3.0', '3.4.0', '3.5.1']
2722
exclude:
28-
- rails: '7.1.0'
29-
activeadmin: '2.14.0'
30-
- rails: '7.1.0'
31-
activeadmin: '3.0.0'
23+
- rails: '8.0.0'
24+
activeadmin: '3.2.0'
3225
env:
3326
RAILS: ${{ matrix.rails }}
3427
AA: ${{ matrix.activeadmin }}
@@ -37,8 +30,62 @@ jobs:
3730
- uses: ruby/setup-ruby@v1
3831
with:
3932
ruby-version: ${{ matrix.ruby }}
33+
bundler-cache: true
4034
- name: Run tests
35+
run: bundle exec rspec spec
36+
37+
- name: Generate badge.json
38+
if: matrix.ruby == '3.4' && matrix.rails == '8.0.0' && matrix.activeadmin == '3.5.1'
4139
run: |
42-
gem install bundler -v '< 2'
43-
bundle install
44-
bundle exec rspec spec
40+
LAST_RUN="coverage/.last_run.json"
41+
if [ ! -f "$LAST_RUN" ]; then
42+
mkdir -p badge
43+
echo '{"schemaVersion":1,"label":"coverage","message":"unknown","color":"lightgrey"}' > badge/badge.json
44+
exit 0
45+
fi
46+
PERCENT=$(ruby -rjson -e "puts JSON.parse(File.read('$LAST_RUN')).dig('result','line').round(1)")
47+
PERCENT_NUM=$(ruby -rjson -e "puts JSON.parse(File.read('$LAST_RUN')).dig('result','line')")
48+
if ruby -e "exit(($PERCENT_NUM >= 90) ? 0 : 1)"; then COLOR="brightgreen"
49+
elif ruby -e "exit(($PERCENT_NUM >= 75) ? 0 : 1)"; then COLOR="green"
50+
elif ruby -e "exit(($PERCENT_NUM >= 60) ? 0 : 1)"; then COLOR="yellow"
51+
else COLOR="red"; fi
52+
mkdir -p badge
53+
echo "{\"schemaVersion\":1,\"label\":\"coverage\",\"message\":\"${PERCENT}%\",\"color\":\"${COLOR}\"}" > badge/badge.json
54+
55+
- name: Upload badge artifact
56+
if: matrix.ruby == '3.4' && matrix.rails == '8.0.0' && matrix.activeadmin == '3.5.1'
57+
uses: actions/upload-artifact@v4
58+
with:
59+
name: coverage-badge
60+
path: badge
61+
62+
deploy-coverage:
63+
needs: test
64+
if: github.ref == 'refs/heads/master' && github.event_name == 'push'
65+
runs-on: ubuntu-latest
66+
environment:
67+
name: github-pages
68+
url: ${{ steps.deployment.outputs.page_url }}
69+
70+
steps:
71+
- uses: actions/checkout@v4
72+
with:
73+
ref: gh-pages
74+
75+
- name: Download coverage badge
76+
uses: actions/download-artifact@v4
77+
with:
78+
name: coverage-badge
79+
path: .
80+
81+
- name: Setup Pages
82+
uses: actions/configure-pages@v5
83+
84+
- name: Upload Pages artifact
85+
uses: actions/upload-pages-artifact@v3
86+
with:
87+
path: .
88+
89+
- name: Deploy to GitHub Pages
90+
id: deployment
91+
uses: actions/deploy-pages@v4

Gemfile

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,20 @@
11
source 'https://rubygems.org'
2-
3-
# Specify your gem's dependencies in active_admin_datetimepicker.gemspec
42
gemspec
53

6-
group :test do
7-
default_rails_version = '7.1.0'
8-
default_activeadmin_version = '3.1.0'
4+
default_rails_version = '7.1.0'
5+
default_activeadmin_version = '3.2.0'
96

10-
gem 'rails', "~> #{ENV['RAILS'] || default_rails_version}"
11-
gem 'activeadmin', "~> #{ENV['AA'] || default_activeadmin_version}"
7+
gem 'rails', "~> #{ENV['RAILS'] || default_rails_version}"
8+
gem 'activeadmin', "~> #{ENV['AA'] || default_activeadmin_version}"
9+
gem 'sprockets-rails'
10+
gem 'sass-rails'
1211

13-
gem 'sprockets-rails'
12+
group :test do
13+
gem 'simplecov', require: false
1414
gem 'rspec-rails'
15-
gem 'coveralls_reborn', require: false
16-
gem 'sass-rails'
17-
gem 'sqlite3', '~> 1.4.0'
18-
gem 'launchy'
15+
gem 'sqlite3', '~> 2.0'
1916
gem 'database_cleaner'
2017
gem 'capybara'
21-
gem 'webdrivers'
22-
gem 'byebug'
18+
gem 'cuprite'
2319
gem 'webrick', require: false
2420
end

active_admin_datetimepicker.gemspec

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,12 @@ Gem::Specification.new do |spec|
1414
spec.homepage = "https://github.com/activeadmin-plugins/activeadmin_datetimepicker"
1515
spec.license = "MIT"
1616

17+
spec.required_ruby_version = '>= 3.1.0'
18+
1719
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
1820
spec.bindir = "bin"
1921
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
2022
spec.require_paths = ["lib"]
2123

22-
spec.add_dependency "activeadmin", ">= 2.14.0", "< 4.0"
24+
spec.add_dependency "activeadmin", ">= 3.0", "< 4.0"
2325
end

spec/edit_form_spec.rb

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,12 @@
1212

1313
before do
1414
page.find('#author_birthday').click
15+
sleep 0.3
1516

16-
page.find('.xdsoft_datetimepicker', visible: true)
17-
.find('.xdsoft_calendar td.xdsoft_date[data-date="1"]').click
18-
page.find('.xdsoft_datetimepicker', visible: true)
19-
.find('.xdsoft_timepicker.active .xdsoft_time.xdsoft_current').click
17+
picker = page.find('.xdsoft_datetimepicker', visible: true)
18+
picker.find('.xdsoft_calendar td.xdsoft_date[data-date="1"]', match: :first).click
19+
sleep 0.2
20+
picker.find('.xdsoft_timepicker.active .xdsoft_time.xdsoft_current').click
2021
end
2122

2223
it 'can set birthday' do

spec/filter_form_spec.rb

Lines changed: 16 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11
require 'spec_helper'
22

3+
def pick_date(input_selector, date_num)
4+
page.find(input_selector).click
5+
sleep 0.3
6+
picker = page.find('.xdsoft_datetimepicker', visible: true)
7+
picker.find(".xdsoft_calendar td.xdsoft_date[data-date=\"#{date_num}\"]", match: :first).click
8+
sleep 0.2
9+
picker.find('.xdsoft_timepicker.active .xdsoft_time.xdsoft_current').click
10+
sleep 0.2
11+
end
12+
313
describe 'authors index', type: :feature, js: true do
414
before do
515
add_author_resource
@@ -12,19 +22,8 @@
1222

1323
context 'filter by Date column' do
1424
before do
15-
page.find('input#q_birthday_gteq').click
16-
17-
page.find('.xdsoft_datetimepicker', visible: true)
18-
.find('.xdsoft_calendar td.xdsoft_date[data-date="1"]').click
19-
page.find('.xdsoft_datetimepicker', visible: true)
20-
.find('.xdsoft_timepicker.active .xdsoft_time.xdsoft_current').click
21-
22-
page.find('input#q_birthday_lteq').click
23-
24-
page.find('.xdsoft_datetimepicker', visible: true)
25-
.find('.xdsoft_calendar td.xdsoft_date[data-date="20"]').click
26-
page.find('.xdsoft_datetimepicker', visible: true)
27-
.find('.xdsoft_timepicker.active .xdsoft_time.xdsoft_current').click
25+
pick_date('input#q_birthday_gteq', 1)
26+
pick_date('input#q_birthday_lteq', 20)
2827
end
2928

3029
it 'can set date from/to' do
@@ -55,21 +54,8 @@
5554
last_name: "from-the-future",
5655
created_at: (Time.now.change(day: 20) + 2.hours).to_formatted_s(:db))
5756

58-
# chose 01 and 20 day of the current month
59-
60-
page.find('input#q_created_at_gteq_datetime_picker').click
61-
62-
page.find('.xdsoft_datetimepicker', visible: true)
63-
.find('.xdsoft_calendar td.xdsoft_date[data-date="1"]').click
64-
page.find('.xdsoft_datetimepicker', visible: true)
65-
.find('.xdsoft_timepicker.active .xdsoft_time.xdsoft_current').click
66-
67-
page.find('input#q_created_at_lteq_datetime_picker').click
68-
69-
page.find('.xdsoft_datetimepicker', visible: true)
70-
.find('.xdsoft_calendar td.xdsoft_date[data-date="20"]').click
71-
page.find('.xdsoft_datetimepicker', visible: true)
72-
.find('.xdsoft_timepicker.active .xdsoft_time.xdsoft_current').click
57+
pick_date('input#q_created_at_gteq_datetime_picker', 1)
58+
pick_date('input#q_created_at_lteq_datetime_picker', 20)
7359

7460
@value_from = page.find('#q_created_at_gteq_datetime_picker').value
7561
@value_to = page.find('#q_created_at_lteq_datetime_picker').value
@@ -99,18 +85,8 @@
9985
Author.create!(name: 'Ron', last_name: 'Two', updated_at: (Time.now.change(day: 20) - 1.hour).to_formatted_s(:db))
10086
Author.create!(name: 'Rey', last_name: 'future', updated_at: Time.now.change(day: 21).to_formatted_s(:db))
10187

102-
# chose 01 and 20 day of the current month
103-
page.find('input#q_last_seen_at_gteq_datetime_picker').click
104-
page.find('.xdsoft_datetimepicker', visible: true)
105-
.find('.xdsoft_calendar td.xdsoft_date[data-date="1"]').click
106-
page.find('.xdsoft_datetimepicker', visible: true)
107-
.find('.xdsoft_timepicker.active .xdsoft_time.xdsoft_current').click
108-
109-
page.find('input#q_last_seen_at_lteq_datetime_picker').click
110-
page.find('.xdsoft_datetimepicker', visible: true)
111-
.find('.xdsoft_calendar td.xdsoft_date[data-date="20"]').click
112-
page.find('.xdsoft_datetimepicker', visible: true)
113-
.find('.xdsoft_timepicker.active .xdsoft_time.xdsoft_current').click
88+
pick_date('input#q_last_seen_at_gteq_datetime_picker', 1)
89+
pick_date('input#q_last_seen_at_lteq_datetime_picker', 20)
11490

11591
@value_from = page.find('#q_last_seen_at_gteq_datetime_picker').value
11692
@value_to = page.find('#q_last_seen_at_lteq_datetime_picker').value

spec/spec_helper.rb

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
require 'coveralls'
2-
Coveralls.wear!
1+
require 'simplecov'
2+
SimpleCov.start do
3+
add_filter '/spec/'
4+
end
35

46
$LOAD_PATH.unshift(File.dirname(__FILE__))
57
$LOAD_PATH << File.expand_path('../support', __FILE__)
@@ -33,15 +35,14 @@
3335
require 'rspec/rails'
3436
require 'capybara/rails'
3537
require 'capybara/rspec'
36-
require 'selenium-webdriver'
37-
3838
require 'support/admin'
3939
require 'support/capybara'
4040

4141
RSpec.configure do |config|
4242
config.use_transactional_fixtures = false
4343

4444
config.before(:suite) do
45+
ActiveRecord::Migration.maintain_test_schema!
4546
DatabaseCleaner.strategy = :truncation
4647
DatabaseCleaner.clean_with(:truncation)
4748
end

spec/support/capybara.rb

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,8 @@
1-
Capybara.server = :webrick
2-
3-
Capybara.configure do |config|
4-
config.match = :prefer_exact
5-
end
1+
require 'capybara/cuprite'
62

7-
Capybara.register_driver :selenium_chrome do |app|
8-
options = Selenium::WebDriver::Chrome::Options.new(
9-
args: %w[headless disable-gpu no-sandbox]
10-
)
11-
Capybara::Selenium::Driver.new(app, browser: :chrome, options: options)
3+
Capybara.server = :webrick
4+
Capybara.register_driver :cuprite do |app|
5+
Capybara::Cuprite::Driver.new(app, headless: true, window_size: [1280, 800])
126
end
13-
14-
Capybara.javascript_driver = :selenium_chrome
7+
Capybara.javascript_driver = :cuprite
8+
Capybara.default_max_wait_time = 5

spec/support/rails_template.rb

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Rails template to build the sample app for specs
22

3-
generate :model, 'author name:string{10}:uniq last_name:string birthday:date'
4-
generate :model, 'post title:string:uniq body:text author:references'
3+
generate :model, 'author name:string{10}:uniq last_name:string birthday:date --force'
4+
generate :model, 'post title:string:uniq body:text author:references --force'
55

66
# Compatibility with old ransack
77
inject_into_file "app/models/application_record.rb", after: "primary_abstract_class\n" do
@@ -47,24 +47,17 @@ def self.ransackable_attributes(auth_object=nil)
4747
STRING
4848
end
4949

50-
# Configure default_url_options in test environment
51-
inject_into_file "config/environments/test.rb", after: "config.cache_classes = true\n" do
52-
" config.action_mailer.default_url_options = { :host => 'example.com' }\n"
53-
end
54-
55-
# Add our local Active Admin to the load path
56-
inject_into_file "config/environment.rb", after: "require File.expand_path('../application', __FILE__)" do
57-
"\n$LOAD_PATH.unshift('#{File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'lib'))}')\nrequire \"active_admin\"\n"
58-
end
59-
60-
run "rm Gemfile"
50+
# Add our local Active Admin to the load path (Rails 7.1+ uses require_relative)
51+
gsub_file "config/environment.rb",
52+
'require_relative "application"',
53+
"require_relative \"application\"\n$LOAD_PATH.unshift('#{File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'lib'))}')\nrequire \"active_admin\"\n"
6154

6255
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
6356

6457
generate :'active_admin:install --skip-users'
6558
generate :'formtastic:install'
6659

67-
# Install active_admin_date_time_datetimepicker assets
60+
# Install active_admin_datetimepicker assets
6861
inject_into_file "app/assets/stylesheets/active_admin.scss" do
6962
"@import \"active_admin_datetimepicker\";\n"
7063
end
@@ -73,9 +66,9 @@ def self.ransackable_attributes(auth_object=nil)
7366
"//= require active_admin_datetimepicker\n"
7467
end
7568

76-
run "rm -r test"
77-
run "rm -r spec"
78-
69+
run "rm -rf test"
7970
route "root :to => 'admin/dashboard#index'"
80-
8171
rake "db:migrate"
72+
73+
# Remove Gemfile last so rake/route/generate work during template
74+
run "rm -f Gemfile Gemfile.lock"

0 commit comments

Comments
 (0)