diff --git a/.github/workflows/ci-simple.yml b/.github/workflows/ci-simple.yml new file mode 100644 index 0000000..63a59e9 --- /dev/null +++ b/.github/workflows/ci-simple.yml @@ -0,0 +1,79 @@ +name: CI + +on: + push: + branches: [ master, main ] + pull_request: + branches: [ master, main ] + +jobs: + test: + name: Test Suite + runs-on: ubuntu-latest + + services: + postgres: + image: postgres:15 + env: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + POSTGRES_DB: sqlquery_test + ports: + - 5432:5432 + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + + env: + CI: true + PGHOST: localhost + PGUSER: postgres + PGPASSWORD: postgres + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Ruby 3.2 + uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.2' + bundler-cache: true + + - name: Run tests + run: bundle exec rspec + + - name: Check coverage + run: | + echo "Coverage report generated at coverage/index.html" + if [ -f coverage/.last_run.json ]; then + echo "Coverage summary:" + cat coverage/.last_run.json + fi + + - name: Upload coverage report + uses: actions/upload-artifact@v4 + if: always() + with: + name: coverage-report + path: coverage/ + retention-days: 7 + + lint: + name: RuboCop + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Ruby 3.2 + uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.2' + bundler-cache: true + + - name: Run RuboCop + run: bundle exec rubocop --format progress diff --git a/.github/workflows/test-matrix.yml b/.github/workflows/test-matrix.yml new file mode 100644 index 0000000..9e19ecd --- /dev/null +++ b/.github/workflows/test-matrix.yml @@ -0,0 +1,122 @@ +name: Test Matrix + +on: + push: + branches: [ master, main ] + pull_request: + branches: [ master, main ] + +jobs: + test: + name: Ruby ${{ matrix.ruby }} / Rails ${{ matrix.rails }} + runs-on: ubuntu-latest + + strategy: + fail-fast: false + matrix: + ruby: ['2.7', '3.2'] + rails: ['4.2', '5.2', '6.0', '6.1', '7.0', '7.1', '8.0'] + exclude: + # Ruby 2.7 officially supports Rails 4.2-7.0 + - ruby: '2.7' + rails: '7.1' + - ruby: '2.7' + rails: '8.0' + # Ruby 3.2 requires Rails 7.0+ + - ruby: '3.2' + rails: '4.2' + - ruby: '3.2' + rails: '5.2' + - ruby: '3.2' + rails: '6.0' + - ruby: '3.2' + rails: '6.1' + + services: + postgres: + image: postgres:15 + env: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + POSTGRES_DB: sqlquery_test + ports: + - 5432:5432 + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + + env: + CI: true + PGHOST: localhost + PGUSER: postgres + PGPASSWORD: postgres + RAILS_VERSION: ${{ matrix.rails }} + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: ${{ matrix.ruby }} + bundler-cache: false + + - name: Install dependencies with specific Rails version + run: | + if [ "${{ matrix.rails }}" = "4.2" ]; then + bundle install --gemfile=gemfiles/4.2.gemfile --jobs=4 --retry=3 + elif [ "${{ matrix.rails }}" = "5.2" ]; then + bundle install --gemfile=gemfiles/5.2.gemfile --jobs=4 --retry=3 + elif [ "${{ matrix.rails }}" = "6.0" ]; then + bundle install --gemfile=gemfiles/6.0.gemfile --jobs=4 --retry=3 + elif [ "${{ matrix.rails }}" = "6.1" ]; then + bundle install --gemfile=gemfiles/6.1.gemfile --jobs=4 --retry=3 + elif [ "${{ matrix.rails }}" = "7.0" ]; then + bundle install --gemfile=gemfiles/7.0.gemfile --jobs=4 --retry=3 + elif [ "${{ matrix.rails }}" = "7.1" ]; then + bundle install --gemfile=gemfiles/7.1.gemfile --jobs=4 --retry=3 + elif [ "${{ matrix.rails }}" = "8.0" ]; then + bundle install --gemfile=gemfiles/8.0.gemfile --jobs=4 --retry=3 + else + bundle install --jobs=4 --retry=3 + fi + + - name: Run tests + run: | + if [ "${{ matrix.rails }}" = "4.2" ]; then + bundle exec --gemfile=gemfiles/4.2.gemfile rspec + elif [ "${{ matrix.rails }}" = "5.2" ]; then + bundle exec --gemfile=gemfiles/5.2.gemfile rspec + elif [ "${{ matrix.rails }}" = "6.0" ]; then + bundle exec --gemfile=gemfiles/6.0.gemfile rspec + elif [ "${{ matrix.rails }}" = "6.1" ]; then + bundle exec --gemfile=gemfiles/6.1.gemfile rspec + elif [ "${{ matrix.rails }}" = "7.0" ]; then + bundle exec --gemfile=gemfiles/7.0.gemfile rspec + elif [ "${{ matrix.rails }}" = "7.1" ]; then + bundle exec --gemfile=gemfiles/7.1.gemfile rspec + elif [ "${{ matrix.rails }}" = "8.0" ]; then + bundle exec --gemfile=gemfiles/8.0.gemfile rspec + else + bundle exec rspec + fi + + lint: + name: RuboCop + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.2' + bundler-cache: true + + - name: Run RuboCop + run: bundle exec rubocop --format progress diff --git a/.rubocop.yml b/.rubocop.yml new file mode 100644 index 0000000..45757c1 --- /dev/null +++ b/.rubocop.yml @@ -0,0 +1,33 @@ +AllCops: + NewCops: enable + TargetRubyVersion: 3.2 + Exclude: + - 'vendor/**/*' + - 'gemfiles/**/*' + +# Style - Documentation not required for small gems +Style/Documentation: + Enabled: false + +# Style - Optional boolean parameters are acceptable in this API +Style/OptionalBooleanParameter: + Enabled: false + +# Metrics - Allow longer blocks in specs +Metrics/BlockLength: + Exclude: + - 'spec/**/*.rb' + - '**/*.gemspec' + +# Lint - Allow constant definition in RSpec blocks +Lint/ConstantDefinitionInBlock: + Exclude: + - 'spec/**/*.rb' + +# Gemspec - Ruby version is intentionally broad for compatibility +Gemspec/RequiredRubyVersion: + Enabled: false + +# Gemspec - Development dependencies in gemspec is acceptable for gems +Gemspec/DevelopmentDependencies: + Enabled: false diff --git a/.ruby-version b/.ruby-version index 0bee604..be94e6f 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -2.3.3 +3.2.2 diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 5ec63b9..0000000 --- a/.travis.yml +++ /dev/null @@ -1,28 +0,0 @@ -language: ruby -cache: bundler -before_install: - - gem uninstall -v '>= 2' -i $(rvm gemdir)@global -ax bundler || true - - gem install bundler -v '< 2' - - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter - - chmod +x ./cc-test-reporter - -gemfile: - - gemfiles/3.2.gemfile - - gemfiles/4.0.gemfile - - gemfiles/4.1.gemfile - - gemfiles/4.2.gemfile - - gemfiles/5.0.gemfile - -rvm: - - '2.6.0' - -addons: - postgresql: '9.4' - -env: - - BUILDER=travis -before_script: - - psql -c 'create database travis_ci_test;' -U postgres - - ./cc-test-reporter before-build -after_script: - - ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT -r 743bf63d7a422064551b35931628682c6cad81a30743edee7ff9ea8af061397d diff --git a/Appraisals b/Appraisals index b0f396e..9985795 100644 --- a/Appraisals +++ b/Appraisals @@ -1,21 +1,40 @@ # frozen_string_literal: true -appraise '3.2' do - gem 'activerecord', '~> 3.2.21' +appraise '4.2' do + gem 'activerecord', '~> 4.2.0' + gem 'with_model', '~> 2.0.0' + gem 'pg', '~> 0.21' end -appraise '4.0' do - gem 'activerecord', '~> 4.0.0' +appraise '5.2' do + gem 'activerecord', '~> 5.2.0' + gem 'with_model', '~> 2.1.6' + gem 'pg', '~> 1.1' end -appraise '4.1' do - gem 'activerecord', '~> 4.1.0' +appraise '6.0' do + gem 'activerecord', '~> 6.0.0' + gem 'with_model', '~> 2.1.6' + gem 'pg', '~> 1.1' end -appraise '4.2' do - gem 'activerecord', '~> 4.2.0' +appraise '6.1' do + gem 'activerecord', '~> 6.1.0' + gem 'with_model', '~> 2.1.6' + gem 'pg', '~> 1.1' +end + +appraise '7.0' do + gem 'activerecord', '~> 7.0.0' + gem 'with_model', '~> 2.1.7' +end + +appraise '7.1' do + gem 'activerecord', '~> 7.1.0' + gem 'with_model', '~> 2.1.7' end -appraise '5.0' do - gem 'activerecord', '~> 5.0.0' +appraise '8.0' do + gem 'activerecord', '~> 8.0.0' + gem 'with_model', '~> 2.1.7' end diff --git a/gemfiles/3.2.gemfile b/gemfiles/3.2.gemfile deleted file mode 100644 index b497013..0000000 --- a/gemfiles/3.2.gemfile +++ /dev/null @@ -1,9 +0,0 @@ -# frozen_string_literal: true - -# This file was generated by Appraisal - -source 'https://rubygems.org' - -gem 'activerecord', '~> 3.2.21' - -gemspec path: '../' diff --git a/gemfiles/4.0.gemfile b/gemfiles/4.0.gemfile deleted file mode 100644 index 50d72ed..0000000 --- a/gemfiles/4.0.gemfile +++ /dev/null @@ -1,9 +0,0 @@ -# frozen_string_literal: true - -# This file was generated by Appraisal - -source 'https://rubygems.org' - -gem 'activerecord', '~> 4.0.0' - -gemspec path: '../' diff --git a/gemfiles/4.1.gemfile b/gemfiles/4.1.gemfile deleted file mode 100644 index 6fbbfc6..0000000 --- a/gemfiles/4.1.gemfile +++ /dev/null @@ -1,9 +0,0 @@ -# frozen_string_literal: true - -# This file was generated by Appraisal - -source 'https://rubygems.org' - -gem 'activerecord', '~> 4.1.0' - -gemspec path: '../' diff --git a/gemfiles/4.2.gemfile b/gemfiles/4.2.gemfile index 9c45f5b..3024630 100644 --- a/gemfiles/4.2.gemfile +++ b/gemfiles/4.2.gemfile @@ -1,9 +1,9 @@ -# frozen_string_literal: true - # This file was generated by Appraisal -source 'https://rubygems.org' +source "https://rubygems.org" -gem 'activerecord', '~> 4.2.0' +gem "activerecord", "~> 4.2.0" +gem "with_model", "~> 2.0.0" +gem "pg", "~> 0.21" -gemspec path: '../' +gemspec path: "../" diff --git a/gemfiles/5.0.gemfile b/gemfiles/5.0.gemfile deleted file mode 100644 index 53a444a..0000000 --- a/gemfiles/5.0.gemfile +++ /dev/null @@ -1,9 +0,0 @@ -# frozen_string_literal: true - -# This file was generated by Appraisal - -source 'https://rubygems.org' - -gem 'activerecord', '~> 5.0.0' - -gemspec path: '../' diff --git a/gemfiles/5.2.gemfile b/gemfiles/5.2.gemfile new file mode 100644 index 0000000..138bbd8 --- /dev/null +++ b/gemfiles/5.2.gemfile @@ -0,0 +1,9 @@ +# This file was generated by Appraisal + +source "https://rubygems.org" + +gem "activerecord", "~> 5.2.0" +gem "with_model", "~> 2.1.6" +gem "pg", "~> 1.1" + +gemspec path: "../" diff --git a/gemfiles/6.0.gemfile b/gemfiles/6.0.gemfile new file mode 100644 index 0000000..fd90c8a --- /dev/null +++ b/gemfiles/6.0.gemfile @@ -0,0 +1,9 @@ +# This file was generated by Appraisal + +source "https://rubygems.org" + +gem "activerecord", "~> 6.0.0" +gem "with_model", "~> 2.1.6" +gem "pg", "~> 1.1" + +gemspec path: "../" diff --git a/gemfiles/6.1.gemfile b/gemfiles/6.1.gemfile new file mode 100644 index 0000000..76e0df3 --- /dev/null +++ b/gemfiles/6.1.gemfile @@ -0,0 +1,9 @@ +# This file was generated by Appraisal + +source "https://rubygems.org" + +gem "activerecord", "~> 6.1.0" +gem "with_model", "~> 2.1.6" +gem "pg", "~> 1.1" + +gemspec path: "../" diff --git a/gemfiles/7.0.gemfile b/gemfiles/7.0.gemfile new file mode 100644 index 0000000..a6295cb --- /dev/null +++ b/gemfiles/7.0.gemfile @@ -0,0 +1,8 @@ +# This file was generated by Appraisal + +source "https://rubygems.org" + +gem "activerecord", "~> 7.0.0" +gem "with_model", "~> 2.1.7" + +gemspec path: "../" diff --git a/gemfiles/7.1.gemfile b/gemfiles/7.1.gemfile new file mode 100644 index 0000000..00b9986 --- /dev/null +++ b/gemfiles/7.1.gemfile @@ -0,0 +1,8 @@ +# This file was generated by Appraisal + +source "https://rubygems.org" + +gem "activerecord", "~> 7.1.0" +gem "with_model", "~> 2.1.7" + +gemspec path: "../" diff --git a/gemfiles/8.0.gemfile b/gemfiles/8.0.gemfile new file mode 100644 index 0000000..983c3b8 --- /dev/null +++ b/gemfiles/8.0.gemfile @@ -0,0 +1,8 @@ +# This file was generated by Appraisal + +source "https://rubygems.org" + +gem "activerecord", "~> 8.0.0" +gem "with_model", "~> 2.1.7" + +gemspec path: "../" diff --git a/lib/sql_query.rb b/lib/sql_query.rb index 09c7627..23b7b04 100644 --- a/lib/sql_query.rb +++ b/lib/sql_query.rb @@ -46,7 +46,7 @@ def quote(value) end def prepared_for_logs - @sql_for_logs ||= prepare_query(true) + @prepared_for_logs ||= prepare_query(true) end def partial(partial_name, partial_options = {}) @@ -56,6 +56,7 @@ def partial(partial_name, partial_options = {}) end attr_writer :config + def self.config @config ||= Config.new end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 8c7137b..67a4845 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -5,9 +5,20 @@ add_filter '/spec/' end +# Fix BigDecimal.new deprecation for Ruby 2.6-2.7 with Rails < 5.0 +if RUBY_VERSION >= '2.6' && RUBY_VERSION < '3.0' + require 'bigdecimal' + unless BigDecimal.respond_to?(:new) + def BigDecimal.new(...) + BigDecimal(...) + end + end +end + +require 'logger' require 'active_record' require 'sql_query' -#require 'pry' +# require 'pry' SqlQuery.configure do |config| config.path = '/spec/sql_queries' @@ -22,13 +33,25 @@ mocks.verify_partial_doubles = true end - connection = if ENV['BUILDER'] == 'travis' - 'postgres://postgres@localhost/travis_ci_test' - else - 'postgres://sqlquery:sqlquery@localhost/sqlquery' - end - - ActiveRecord::Base.establish_connection(connection) + connection_config = if ENV['CI'] + { + adapter: 'postgresql', + host: 'localhost', + username: 'postgres', + password: 'postgres', + database: 'sqlquery_test' + } + else + { + adapter: 'postgresql', + host: 'localhost', + username: 'sqlquery', + password: 'sqlquery', + database: 'sqlquery' + } + end + + ActiveRecord::Base.establish_connection(connection_config) ActiveRecord::Base.connection.execute( 'CREATE TABLE IF NOT EXISTS players (email text);' diff --git a/sql_query.gemspec b/sql_query.gemspec index 80db516..b162036 100644 --- a/sql_query.gemspec +++ b/sql_query.gemspec @@ -16,9 +16,12 @@ Gem::Specification.new do |spec| spec.homepage = 'https://github.com/sufleR/sql_query' spec.license = 'MIT' + spec.metadata = { + 'rubygems_mfa_required' => 'true' + } + spec.files = `git ls-files -z`.split("\x0") spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } - spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) spec.require_paths = ['lib'] spec.required_ruby_version = '>= 1.9.3' @@ -26,10 +29,10 @@ Gem::Specification.new do |spec| spec.add_dependency 'activerecord', '>= 3.2' spec.add_development_dependency 'appraisal' spec.add_development_dependency 'bundler' - spec.add_development_dependency 'pg', '~> 0.18' + spec.add_development_dependency 'pg', '~> 1.5' spec.add_development_dependency 'rake', '~> 13.0' - spec.add_development_dependency 'rspec', '~> 3.4' - spec.add_development_dependency 'rubocop', '<= 0.81' + spec.add_development_dependency 'rspec', '~> 3.12' + spec.add_development_dependency 'rubocop', '~> 1.60' spec.add_development_dependency 'simplecov' - spec.add_development_dependency 'with_model', '~> 1.2' + spec.add_development_dependency 'with_model' end