22 Коммитов

Автор SHA1 Сообщение Дата
Mattia Roccoberton
f291f7e7e6 Merge pull request #62 from blocknotes/chore/bump-to-2.0.0
Bump version to 2.0.0
2025-04-16 22:02:34 +02:00
Mattia Roccoberton
df944277b5 chore: Bump version to 2.0.0 2025-04-16 12:55:31 +02:00
Mattia Roccoberton
3cc5683d44 Merge pull request #63 from blocknotes/chore/internal-improvements
Update Quill imageUploader plugin
2025-04-16 12:52:49 +02:00
Mattia Roccoberton
498cbbd0c9 build: Update Quill imageUploader 2025-04-16 09:03:32 +02:00
Mattia Roccoberton
bfc2e997f1 chore: Minor changes to dummy app migrations 2025-04-16 09:03:24 +02:00
Mattia Roccoberton
9bda446762 chore: internal improvements to quill editor input js 2025-04-16 08:52:13 +02:00
Mattia Roccoberton
533471c0d6 Merge pull request #61 from blocknotes/build/update-quill-to-2.0.3
Update Quill to version 2.0.3
2025-04-15 08:12:47 +02:00
Mattia Roccoberton
3617aab7f2 test: Improve some tests 2025-04-14 13:44:35 +02:00
Mattia Roccoberton
5196a8811a build: Update quill.imageUploader plugin 2025-04-14 13:44:35 +02:00
Mattia Roccoberton
5e9a3b6c5a build: Update Quill to version 2.0.3 2025-04-13 18:14:10 +02:00
Mattia Roccoberton
181aab7fd6 Merge pull request #60 from blocknotes/test/improve-tests
Improve tests
2025-04-13 16:36:07 +02:00
Mattia Roccoberton
300b4a0a03 test: Improve tests 2025-04-13 16:35:14 +02:00
Mattia Roccoberton
451a225277 Merge pull request #59 from blocknotes/build/improve-dev-setup
Improve dev and test setup
2025-04-13 15:04:13 +02:00
Mattia Roccoberton
6cbb39daad test: Improve test suite setup 2025-04-13 15:00:22 +02:00
Mattia Roccoberton
d19fc7ddfc build: Improve dev setup 2025-04-13 14:54:13 +02:00
Mattia Roccoberton
74790fc115 Merge pull request #58 from blocknotes/test/update-build-setup
test: Update build setup
2025-04-05 09:32:24 +02:00
Mattia Roccoberton
c3b129a212 ci: Update GitHub workflows 2025-04-05 09:25:11 +02:00
Mattia Roccoberton
ab858f7c6f test: Remove Appraisal dependency 2025-04-05 09:25:11 +02:00
Mattia Roccoberton
6cf744b84c test: Update build setup 2025-04-05 09:25:11 +02:00
Mattia Roccoberton
0ae4ce2035 Merge pull request #57 from blocknotes/test/setup-coverage
Test: setup coverage
2025-03-22 09:14:34 +01:00
Mattia Roccoberton
dd9aa22cf5 test: Install Appraisal dependencies 2025-03-22 09:10:47 +01:00
Mattia Roccoberton
b6f3c0c3a6 test: Setup coverage 2025-03-22 09:08:36 +01:00
84 изменённых файлов: 1066 добавлений и 25621 удалений

2
.env
Просмотреть файл

@@ -1,2 +0,0 @@
UID=1000
GID=1000

22
.github/workflows/linters.yml поставляемый
Просмотреть файл

@@ -2,31 +2,35 @@
name: Linters name: Linters
on: on:
push:
branches:
- main
pull_request: pull_request:
branches: [main]
push:
branches: [main]
jobs: jobs:
reviewdog: reviewdog:
name: reviewdog name: Reviewdog
runs-on: ubuntu-latest runs-on: ubuntu-latest
env:
RAILS_VERSION: 7.0
steps: steps:
- name: Check out code - name: Checkout repository
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Set up Ruby - name: Set up Ruby
uses: ruby/setup-ruby@v1 uses: ruby/setup-ruby@v1
with: with:
ruby-version: '3.0' ruby-version: 3.0
bundler-cache: true # runs 'bundle install' and caches installed gems automatically bundler-cache: true
- uses: reviewdog/action-setup@v1 - name: Set up Reviewdog
uses: reviewdog/action-setup@v1
with: with:
reviewdog_version: latest reviewdog_version: latest
- name: Run reviewdog - name: Run Reviewdog
env: env:
REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: | run: |

21
.github/workflows/specs_rails61.yml поставляемый
Просмотреть файл

@@ -1,25 +1,23 @@
--- ---
name: Specs Rails 6.1 name: Specs Rails 6.1 with ActiveAdmin 2.9
on: on:
push:
branches:
- main
pull_request: pull_request:
branches: branches: [main]
- main push:
branches: [main]
jobs: jobs:
tests: test:
runs-on: ubuntu-latest runs-on: ubuntu-latest
strategy: strategy:
matrix: matrix:
ruby: ['3.2'] ruby: ['3.0']
gemfile: ['rails61_activeadmin29', 'rails61_activeadmin']
env: env:
BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/${{ matrix.gemfile }}.gemfile RAILS_VERSION: 6.0
ACTIVEADMIN_VERSION: 2.9.0
steps: steps:
- name: Checkout repository - name: Checkout repository
@@ -31,6 +29,9 @@ jobs:
ruby-version: ${{ matrix.ruby }} ruby-version: ${{ matrix.ruby }}
bundler-cache: true bundler-cache: true
- name: Database setup
run: bin/rails db:create db:migrate db:test:prepare
- name: Run tests - name: Run tests
run: bundle exec rspec --profile run: bundle exec rspec --profile

18
.github/workflows/specs_rails70.yml поставляемый
Просмотреть файл

@@ -2,24 +2,21 @@
name: Specs Rails 7.0 name: Specs Rails 7.0
on: on:
push:
branches:
- main
pull_request: pull_request:
branches: branches: [main]
- main push:
branches: [main]
jobs: jobs:
tests: test:
runs-on: ubuntu-latest runs-on: ubuntu-latest
strategy: strategy:
matrix: matrix:
ruby: ['3.3'] ruby: ['3.0', '3.2']
gemfile: ['rails70_activeadmin']
env: env:
BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/${{ matrix.gemfile }}.gemfile RAILS_VERSION: 7.0
steps: steps:
- name: Checkout repository - name: Checkout repository
@@ -31,6 +28,9 @@ jobs:
ruby-version: ${{ matrix.ruby }} ruby-version: ${{ matrix.ruby }}
bundler-cache: true bundler-cache: true
- name: Database setup
run: bin/rails db:create db:migrate db:test:prepare
- name: Run tests - name: Run tests
run: bundle exec rspec --profile run: bundle exec rspec --profile

16
.github/workflows/specs_rails71.yml поставляемый
Просмотреть файл

@@ -2,24 +2,21 @@
name: Specs Rails 7.1 name: Specs Rails 7.1
on: on:
push:
branches:
- main
pull_request: pull_request:
branches: branches: [main]
- main push:
branches: [main]
jobs: jobs:
tests: test:
runs-on: ubuntu-latest runs-on: ubuntu-latest
strategy: strategy:
matrix: matrix:
ruby: ['3.2', '3.4'] ruby: ['3.2', '3.4']
gemfile: ['rails71_activeadmin']
env: env:
BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/${{ matrix.gemfile }}.gemfile RAILS_VERSION: 7.1
steps: steps:
- name: Checkout repository - name: Checkout repository
@@ -31,6 +28,9 @@ jobs:
ruby-version: ${{ matrix.ruby }} ruby-version: ${{ matrix.ruby }}
bundler-cache: true bundler-cache: true
- name: Database setup
run: bin/rails db:create db:migrate db:test:prepare
- name: Run tests - name: Run tests
run: bundle exec rspec --profile run: bundle exec rspec --profile

16
.github/workflows/specs_rails72.yml поставляемый
Просмотреть файл

@@ -2,24 +2,21 @@
name: Specs Rails 7.2 name: Specs Rails 7.2
on: on:
push:
branches:
- main
pull_request: pull_request:
branches: branches: [main]
- main push:
branches: [main]
jobs: jobs:
tests: test:
runs-on: ubuntu-latest runs-on: ubuntu-latest
strategy: strategy:
matrix: matrix:
ruby: ['3.2', '3.4'] ruby: ['3.2', '3.4']
gemfile: ['rails72_activeadmin']
env: env:
BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/${{ matrix.gemfile }}.gemfile RAILS_VERSION: 7.2
steps: steps:
- name: Checkout repository - name: Checkout repository
@@ -31,6 +28,9 @@ jobs:
ruby-version: ${{ matrix.ruby }} ruby-version: ${{ matrix.ruby }}
bundler-cache: true bundler-cache: true
- name: Database setup
run: bin/rails db:create db:migrate db:test:prepare
- name: Run tests - name: Run tests
run: bundle exec rspec --profile run: bundle exec rspec --profile

16
.github/workflows/specs_rails80.yml поставляемый
Просмотреть файл

@@ -2,24 +2,21 @@
name: Specs Rails 8.0 name: Specs Rails 8.0
on: on:
push:
branches:
- main
pull_request: pull_request:
branches: branches: [main]
- main push:
branches: [main]
jobs: jobs:
tests: test:
runs-on: ubuntu-latest runs-on: ubuntu-latest
strategy: strategy:
matrix: matrix:
ruby: ['3.2', '3.4'] ruby: ['3.2', '3.4']
gemfile: ['rails80_activeadmin']
env: env:
BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/${{ matrix.gemfile }}.gemfile RAILS_VERSION: 8.0
steps: steps:
- name: Checkout repository - name: Checkout repository
@@ -31,6 +28,9 @@ jobs:
ruby-version: ${{ matrix.ruby }} ruby-version: ${{ matrix.ruby }}
bundler-cache: true bundler-cache: true
- name: Database setup
run: bin/rails db:create db:migrate db:test:prepare
- name: Run tests - name: Run tests
run: bundle exec rspec --profile run: bundle exec rspec --profile

2
.gitignore поставляемый
Просмотреть файл

@@ -6,7 +6,9 @@
/Gemfile.lock /Gemfile.lock
/_misc/ /_misc/
/coverage/
/spec/dummy/db/*.sqlite3* /spec/dummy/db/*.sqlite3*
/spec/dummy/db/schema-dev.rb
/spec/dummy/log/ /spec/dummy/log/
/spec/dummy/storage/ /spec/dummy/storage/
/spec/dummy/tmp/ /spec/dummy/tmp/

Просмотреть файл

@@ -4,14 +4,12 @@ inherit_from:
plugins: plugins:
- rubocop-capybara - rubocop-capybara
- rubocop-packaging
- rubocop-performance - rubocop-performance
- rubocop-rails - rubocop-rails
- rubocop-rspec - rubocop-rspec
- rubocop-rspec_rails - rubocop-rspec_rails
require:
- rubocop-packaging
AllCops: AllCops:
Exclude: Exclude:
- bin/* - bin/*
@@ -29,3 +27,7 @@ RSpec/ExampleLength:
RSpec/MultipleExpectations: RSpec/MultipleExpectations:
# default 1 # default 1
Max: 4 Max: 4
RSpec/MultipleMemoizedHelpers:
# default 5
Max: 10

Просмотреть файл

@@ -1 +0,0 @@
ruby 3.4.2

Просмотреть файл

@@ -1,33 +0,0 @@
# frozen_string_literal: true
appraise 'rails61-activeadmin29' do
gem 'activeadmin', '~> 2.9.0'
gem 'rails', '~> 6.1.0'
end
appraise 'rails61-activeadmin' do
gem 'activeadmin'
gem 'rails', '~> 6.1.0'
end
appraise 'rails70-activeadmin' do
gem 'activeadmin'
gem 'rails', '~> 7.0.0'
gem 'sqlite3', '~> 1.3'
end
appraise 'rails71-activeadmin' do
gem 'activeadmin'
gem 'rails', '~> 7.1.0'
end
appraise 'rails72-activeadmin' do
gem 'activeadmin'
gem 'rails', '~> 7.2.0'
end
appraise 'rails80-activeadmin' do
gem 'activeadmin'
gem 'rails', '~> 8.0.0'
end

Просмотреть файл

@@ -2,6 +2,10 @@
An Active Admin plugin to use Quill Rich Text Editor. An Active Admin plugin to use Quill Rich Text Editor.
## v2.0.0 - 2025-04-15
- Update Quill from 1.3.7 to 2.0.3
## v1.3.0 - 2025-03-18 ## v1.3.0 - 2025-03-18
- Javascript API: expose Quill editor query functions - Javascript API: expose Quill editor query functions

45
Gemfile
Просмотреть файл

@@ -2,27 +2,41 @@
source 'https://rubygems.org' source 'https://rubygems.org'
if ENV['DEVEL'] == '1' def eval_version(dependency, version)
# for Docker dev return [dependency] if version.empty?
rails_ver = ENV.fetch('RAILS_VERSION')
gem 'rails', rails_ver
gem 'activeadmin', ENV.fetch('ACTIVEADMIN_VERSION') version.count('.') < 2 ? [dependency, "~> #{version}.0"] : [dependency, version]
gem 'activeadmin_quill_editor', path: './'
if rails_ver.start_with?('7.0')
gem 'concurrent-ruby', '1.3.4'
gem 'sqlite3', '~> 1.4'
else
gem 'sqlite3'
end end
if ENV['DEVEL'] == '1'
gem 'activeadmin_quill_editor', path: './'
else else
gemspec gemspec
gem 'sqlite3'
end end
ruby_ver = ENV.fetch('RUBY_VERSION', '')
rails_ver = ENV.fetch('RAILS_VERSION', '')
rails = eval_version('rails', rails_ver)
gem(*rails)
active_admin_ver = ENV.fetch('ACTIVEADMIN_VERSION', '')
active_admin = eval_version('activeadmin', active_admin_ver)
gem(*active_admin)
ruby32 = ruby_ver.empty? || Gem::Version.new(ruby_ver) >= Gem::Version.new('3.2')
rails72 = rails_ver.empty? || Gem::Version.new(rails_ver) >= Gem::Version.new('7.2')
sqlite3 = ruby32 && rails72 ? ['sqlite3'] : ['sqlite3', '~> 1.4']
gem(*sqlite3)
gem 'zeitwerk', '~> 2.6.18' unless ruby32
# NOTE: to avoid error: uninitialized constant ActiveSupport::LoggerThreadSafeLevel::Logger
gem 'concurrent-ruby', '1.3.4'
# Misc
gem 'bigdecimal' gem 'bigdecimal'
gem 'csv'
gem 'mutex_m' gem 'mutex_m'
gem 'puma' gem 'puma'
gem 'sassc' gem 'sassc'
@@ -33,7 +47,8 @@ gem 'capybara'
gem 'cuprite' gem 'cuprite'
gem 'rspec_junit_formatter' gem 'rspec_junit_formatter'
gem 'rspec-rails' gem 'rspec-rails'
gem 'rspec-retry' gem 'simplecov', require: false
gem 'super_diff'
# Linters # Linters
gem 'fasterer' gem 'fasterer'

Просмотреть файл

@@ -1,38 +1,47 @@
include extra/.env
help: help:
@echo "Main targets: up / down / console / shell" @echo -e "${COMPOSE_PROJECT_NAME} - Main project commands:\n\
make up # starts the dev services (optional env vars: RUBY / RAILS / ACTIVEADMIN)\n\
make specs # run the tests (after up)\n\
make lint # run the linters (after up)\n\
make server # run the server (after up)\n\
make shell # open a shell (after up)\n\
make down # cleanup (after up)\n\
Example: RUBY=3.2 RAILS=7.1 ACTIVEADMIN=3.2.0 make up"
# Docker commands # System commands
down:
docker compose down
up: build:
docker compose up @rm -f Gemfile.lock spec/dummy/db/*.sqlite3
@docker compose -f extra/docker-compose.yml build
attach: db_reset:
docker compose attach app @docker compose -f extra/docker-compose.yml run --rm app bin/rails db:create db:migrate db:test:prepare
up_attach: up: build db_reset
docker compose up -d && docker compose attach app @docker compose -f extra/docker-compose.yml up
cleanup:
docker container rm -f activeadmin_quill_editor_app && docker image rm -f activeadmin_quill_editor-app
# Rails specific commands
console:
docker compose exec -e "PAGER=more" app bin/rails console
routes:
docker compose exec app bin/rails routes
specs:
docker compose exec app bin/rspec --fail-fast
# Other commands
bundle:
docker compose exec app bundle
shell: shell:
docker compose exec -e "PAGER=more" app bash @docker compose -f extra/docker-compose.yml exec app bash
down:
@docker compose -f extra/docker-compose.yml down --volumes --rmi local --remove-orphans
# App commands
seed:
@docker compose -f extra/docker-compose.yml exec app bin/rails db:seed
console: seed
@docker compose -f extra/docker-compose.yml exec app bin/rails console
lint: lint:
docker compose exec app bin/rubocop @docker compose -f extra/docker-compose.yml exec app bin/rubocop
server: seed
@rm -f spec/dummy/tmp/pids/server.pid
@docker compose -f extra/docker-compose.yml exec app bin/rails server -b 0.0.0.0 -p ${SERVER_PORT}
specs:
@docker compose -f extra/docker-compose.yml exec app bin/rspec --fail-fast

Просмотреть файл

@@ -17,7 +17,7 @@ Please :star: if you like it.
## Install ## Install
_NOTE_: Ruby 2.7 is supported until version 1.1.0 _NOTE_: the gem 2.x provide Quill 2.x, while Quill 1.x is provided with the gem version 1.x
After installing Active Admin, add to your Gemfile: `gem 'activeadmin_quill_editor'` (and execute *bundle*) After installing Active Admin, add to your Gemfile: `gem 'activeadmin_quill_editor'` (and execute *bundle*)
@@ -35,8 +35,6 @@ If you installed Active Admin without Webpacker support (default for now):
//= require activeadmin/quill_editor_input //= require activeadmin/quill_editor_input
``` ```
> **UPDATE FROM VERSION <= 2.0**: please add to your _app/assets/stylesheets/active_admin.scss_ the line `@import 'activeadmin/quill_editor/quill.snow';`
If you installed Active Admin with Webpacker support: If you installed Active Admin with Webpacker support:
- Execute in your project root: - Execute in your project root:
@@ -117,50 +115,7 @@ Some methods are provided for advanced use cases:
Project created by [Mattia Roccoberton](http://blocknot.es), thanks also to the good guys that opened issues and pull requests from time to time. Project created by [Mattia Roccoberton](http://blocknot.es), thanks also to the good guys that opened issues and pull requests from time to time.
There 3 ways to interact with this project: For development information please check [this document](extra/development.md).
1) Using Docker:
```sh
# Run rails server on the dummy app (=> http://localhost:3000 to access to ActiveAdmin):
make up
# Enter in a Rails console (with the dummy app started):
make console
# Enter in a shell (with the dummy app started):
make shell
# Run the linter on the project (with the dummy app started):
make lint
# Run the test suite (with the dummy app started):
make specs
# Remove container and image:
make cleanup
# To try different versions of Ruby/Rails/ActiveAdmin edit docker-compose.yml
# For more commands please check the Makefile
```
2) Using Appraisal:
```sh
export RAILS_ENV=development
# Install dependencies
bin/appraisal
# Run server (or any command)
bin/appraisal rails s
# Or with specific versions
bin/appraisal rails71-activeadmin rails s
```
3) With a local setup:
```sh
# Dev setup (set the required envs)
source extra/dev_setup.sh
# Install dependencies
bundle
# Run server (or any command)
bin/rails s
# To try different versions of Rails/ActiveAdmin edit extra/dev_setup.sh
```
## Do you like it? Star it! ## Do you like it? Star it!

Просмотреть файл

@@ -1,5 +1,16 @@
# frozen_string_literal: true # frozen_string_literal: true
begin
require 'bundler/setup'
rescue LoadError
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
end
APP_RAKEFILE = File.expand_path("spec/dummy/Rakefile", __dir__)
load 'rails/tasks/engine.rake'
load 'rails/tasks/statistics.rake'
require 'bundler/gem_tasks' require 'bundler/gem_tasks'
begin begin

Просмотреть файл

@@ -26,6 +26,4 @@ Gem::Specification.new do |spec|
spec.require_paths = ['lib'] spec.require_paths = ['lib']
spec.add_runtime_dependency 'activeadmin', '>= 2.9', '< 4' # rubocop:disable Gemspec/AddRuntimeDependency spec.add_runtime_dependency 'activeadmin', '>= 2.9', '< 4' # rubocop:disable Gemspec/AddRuntimeDependency
spec.add_development_dependency 'appraisal', '~> 2.4' # rubocop:disable Gemspec/DevelopmentDependencies
end end

Просмотреть файл

@@ -0,0 +1,362 @@
/******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ }
/******/ };
/******/
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 8|1: behave like require
/******/ __webpack_require__.t = function(value, mode) {
/******/ if(mode & 1) value = __webpack_require__(value);
/******/ if(mode & 8) return value;
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ var ns = Object.create(null);
/******/ __webpack_require__.r(ns);
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ return ns;
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 0);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _blots_image_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);
/* harmony import */ var _quill_imageUploader_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3);
/* harmony import */ var _quill_imageUploader_css__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_quill_imageUploader_css__WEBPACK_IMPORTED_MODULE_1__);
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var ImageUploader = function () {
function ImageUploader(quill, options) {
_classCallCheck(this, ImageUploader);
this.quill = quill;
this.options = options;
this.range = null;
if (typeof this.options.upload !== "function") {
console.warn("[Missing config] upload function that returns a promise is required");
}
if (this.options.loadingClass) {
_blots_image_js__WEBPACK_IMPORTED_MODULE_0__["default"].className = this.options.loadingClass;
}
var toolbar = this.quill.getModule("toolbar");
toolbar.addHandler("image", this.selectLocalImage.bind(this));
this.handleDrop = this.handleDrop.bind(this);
this.handlePaste = this.handlePaste.bind(this);
this.quill.root.addEventListener("drop", this.handleDrop, false);
this.quill.root.addEventListener("paste", this.handlePaste, false);
}
_createClass(ImageUploader, [{
key: "selectLocalImage",
value: function selectLocalImage() {
var _this = this;
this.range = this.quill.getSelection();
this.fileHolder = document.createElement("input");
this.fileHolder.setAttribute("type", "file");
this.fileHolder.setAttribute("accept", "image/*");
this.fileHolder.setAttribute("style", "visibility:hidden");
this.fileHolder.onchange = this.fileChanged.bind(this);
document.body.appendChild(this.fileHolder);
this.fileHolder.click();
window.requestAnimationFrame(function () {
document.body.removeChild(_this.fileHolder);
});
}
}, {
key: "handleDrop",
value: function handleDrop(evt) {
var _this2 = this;
evt.stopPropagation();
evt.preventDefault();
if (evt.dataTransfer && evt.dataTransfer.files && evt.dataTransfer.files.length) {
if (document.caretRangeFromPoint) {
var selection = document.getSelection();
var range = document.caretRangeFromPoint(evt.clientX, evt.clientY);
if (selection && range) {
selection.setBaseAndExtent(range.startContainer, range.startOffset, range.startContainer, range.startOffset);
}
} else {
var _selection = document.getSelection();
var _range = document.caretPositionFromPoint(evt.clientX, evt.clientY);
if (_selection && _range) {
_selection.setBaseAndExtent(_range.offsetNode, _range.offset, _range.offsetNode, _range.offset);
}
}
this.range = this.quill.getSelection();
var file = evt.dataTransfer.files[0];
setTimeout(function () {
_this2.range = _this2.quill.getSelection();
_this2.readAndUploadFile(file);
}, 0);
}
}
}, {
key: "handlePaste",
value: function handlePaste(evt) {
var _this3 = this;
var clipboard = evt.clipboardData || window.clipboardData;
// IE 11 is .files other browsers are .items
if (clipboard && (clipboard.items || clipboard.files)) {
var items = clipboard.items || clipboard.files;
var IMAGE_MIME_REGEX = /^image\/(jpe?g|gif|png|svg|webp)$/i;
for (var i = 0; i < items.length; i++) {
if (IMAGE_MIME_REGEX.test(items[i].type)) {
(function () {
var file = items[i].getAsFile ? items[i].getAsFile() : items[i];
if (file) {
_this3.range = _this3.quill.getSelection();
evt.preventDefault();
setTimeout(function () {
_this3.range = _this3.quill.getSelection();
_this3.readAndUploadFile(file);
}, 0);
}
})();
}
}
}
}
}, {
key: "readAndUploadFile",
value: function readAndUploadFile(file) {
var _this4 = this;
var isUploadReject = false;
var fileReader = new FileReader();
fileReader.addEventListener("load", function () {
if (!isUploadReject) {
var base64ImageSrc = fileReader.result;
_this4.insertBase64Image(base64ImageSrc);
}
}, false);
if (file) {
fileReader.readAsDataURL(file);
}
this.options.upload(file).then(function (imageUrl) {
_this4.insertToEditor(imageUrl);
}, function (error) {
isUploadReject = true;
_this4.removeBase64Image();
console.warn(error);
});
}
}, {
key: "fileChanged",
value: function fileChanged() {
var file = this.fileHolder.files[0];
this.readAndUploadFile(file);
}
}, {
key: "insertBase64Image",
value: function insertBase64Image(url) {
var range = this.range;
this.quill.insertEmbed(range.index, _blots_image_js__WEBPACK_IMPORTED_MODULE_0__["default"].blotName, "" + url, "user");
}
}, {
key: "insertToEditor",
value: function insertToEditor(url) {
var range = this.range;
// Delete the placeholder image
this.quill.deleteText(range.index, 3, "user");
// Insert the server saved image
this.quill.insertEmbed(range.index, "image", "" + url, "user");
range.index++;
this.quill.setSelection(range, "user");
}
}, {
key: "removeBase64Image",
value: function removeBase64Image() {
var range = this.range;
this.quill.deleteText(range.index, 3, "user");
}
}]);
return ImageUploader;
}();
window.ImageUploader = ImageUploader;
/* harmony default export */ __webpack_exports__["default"] = (ImageUploader);
/***/ }),
/* 1 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var quill__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
/* harmony import */ var quill__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(quill__WEBPACK_IMPORTED_MODULE_0__);
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var InlineBlot = quill__WEBPACK_IMPORTED_MODULE_0___default.a.import('blots/block');
var LoadingImage = function (_InlineBlot) {
_inherits(LoadingImage, _InlineBlot);
function LoadingImage() {
_classCallCheck(this, LoadingImage);
return _possibleConstructorReturn(this, (LoadingImage.__proto__ || Object.getPrototypeOf(LoadingImage)).apply(this, arguments));
}
_createClass(LoadingImage, [{
key: 'deleteAt',
value: function deleteAt(index, length) {
_get(LoadingImage.prototype.__proto__ || Object.getPrototypeOf(LoadingImage.prototype), 'deleteAt', this).call(this, index, length);
this.cache = {};
}
}], [{
key: 'create',
value: function create(src) {
var node = _get(LoadingImage.__proto__ || Object.getPrototypeOf(LoadingImage), 'create', this).call(this, src);
if (src === true) return node;
var image = document.createElement('img');
image.setAttribute('src', src);
node.appendChild(image);
return node;
}
}, {
key: 'value',
value: function value(domNode) {
var _domNode$dataset = domNode.dataset,
src = _domNode$dataset.src,
custom = _domNode$dataset.custom;
return { src: src, custom: custom };
}
}]);
return LoadingImage;
}(InlineBlot);
LoadingImage.blotName = 'imageBlot';
LoadingImage.className = 'quill-image-uploading';
LoadingImage.tagName = 'span';
quill__WEBPACK_IMPORTED_MODULE_0___default.a.register({ 'formats/imageBlot': LoadingImage });
/* harmony default export */ __webpack_exports__["default"] = (LoadingImage);
/***/ }),
/* 2 */
/***/ (function(module, exports) {
module.exports = Quill;
/***/ }),
/* 3 */
/***/ (function(module, exports) {
// removed by extract-text-webpack-plugin
/***/ })
/******/ ]);

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@@ -1,11 +1,11 @@
/* eslint-disable no-undef */ /* globals $ Quill ImageUploader */
(function () { (function () {
'use strict' 'use strict';
// --- functions --------------------------------------------------------------- // --- functions ---------------------------------------------------------------
function initQuillEditors() { const initQuillEditors = () => {
let default_theme = 'snow' const defaultTheme = 'snow';
let default_toolbar = [ const defaultToolbar = [
['bold', 'italic', 'underline'], ['bold', 'italic', 'underline'],
['link', 'blockquote', 'code-block'], ['link', 'blockquote', 'code-block'],
[{ 'script': 'sub' }, { 'script': 'super' }], [{ 'script': 'sub' }, { 'script': 'super' }],
@@ -13,59 +13,65 @@
[{ 'color': [] }, { 'background': [] }], [{ 'color': [] }, { 'background': [] }],
['image'], ['image'],
['clean'], ['clean'],
] ];
let editors = document.querySelectorAll('[data-aa-quill-editor]') const editors = document.querySelectorAll('[data-aa-quill-editor]');
let registered_plugins = {} const registeredPlugins = {};
for (let i = 0; i < editors.length; i++) { for (let i = 0; i < editors.length; i++) {
let content = editors[i].querySelector('[data-aa-quill-content]') const content = editors[i].querySelector('[data-aa-quill-content]');
let isActive = editors[i].classList.contains('quill-editor--active') const isActive = editors[i].classList.contains('quill-editor--active');
if (content && !isActive) { if (content && !isActive) {
// Setup editor options // Setup editor options
let options = editors[i].getAttribute('data-options') ? JSON.parse(editors[i].getAttribute('data-options')) : {} const options = editors[i].getAttribute('data-options') ? JSON.parse(editors[i].getAttribute('data-options')) : {};
if (!options.theme) options.theme = default_theme
if (!options.modules) options.modules = {} if (!options.theme) options.theme = defaultTheme;
if (!options.modules.toolbar) options.modules.toolbar = default_toolbar if (!options.modules) options.modules = {};
if (!options.modules.toolbar) options.modules.toolbar = defaultToolbar;
// Setup plugin options // Setup plugin options
let plugin_options = editors[i].getAttribute('data-plugins') ? JSON.parse(editors[i].getAttribute('data-plugins')) : {} const pluginOptions = editors[i].getAttribute('data-plugins') ? JSON.parse(editors[i].getAttribute('data-plugins')) : {};
if (plugin_options.image_uploader && plugin_options.image_uploader.server_url) {
if (!registered_plugins.image_uploader) { if (pluginOptions.image_uploader && pluginOptions.image_uploader.server_url) {
Quill.register('modules/imageUploader', ImageUploader) if (!registeredPlugins.image_uploader) {
registered_plugins.image_uploader = true Quill.register('modules/imageUploader', ImageUploader);
registeredPlugins.image_uploader = true;
} }
let opts = plugin_options.image_uploader const opts = pluginOptions.image_uploader;
options.modules.imageUploader = setupImageUploader(opts.server_url, opts.field_name)
options.modules.imageUploader = setupImageUploader(opts.server_url, opts.field_name);
} }
// Init editor // Init editor
editors[i]['_quill-editor'] = new Quill(content, options) editors[i]['_quill-editor'] = new Quill(content, options);
editors[i].classList += ' quill-editor--active' editors[i].classList += ' quill-editor--active';
} }
} }
let formtastic = document.querySelector('form.formtastic') const formtastic = document.querySelector('form.formtastic');
if (formtastic) { if (formtastic) {
formtastic.onsubmit = () => { formtastic.onsubmit = () => {
for (let i = 0; i < editors.length; i++) { for (let i = 0; i < editors.length; i++) {
let input = editors[i].querySelector('input[type="hidden"]') const input = editors[i].querySelector('input[type="hidden"]');
if (editors[i]['_quill-editor'].editor.isBlank()) { if (editors[i]['_quill-editor'].editor.isBlank()) {
input.value = '' input.value = '';
} else { } else {
input.value = editors[i]['_quill-editor'].root.innerHTML input.value = editors[i]['_quill-editor'].root.innerHTML;
} }
} }
}; };
} }
} };
function setupImageUploader(server_url, field_name) { const setupImageUploader = (server_url, field_name) => {
return { return {
upload: file => { upload: (file) => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const formData = new FormData() const formData = new FormData();
formData.append(field_name || 'file_upload', file)
formData.append(field_name || 'file_upload', file);
fetch(server_url, { fetch(server_url, {
body: formData, body: formData,
headers: { headers: {
@@ -75,13 +81,13 @@
}).then(response => response.json()) }).then(response => response.json())
.then(result => { .then(result => {
if (!result.url) { if (!result.url) {
reject('Upload failed') reject('Upload failed');
} }
resolve(result.url); resolve(result.url);
}) })
.catch(error => { .catch(error => {
reject('Upload failed') reject('Upload failed');
console.error('Error: ', error) console.error('Error: ', error);
}) })
}) })
} }
@@ -90,27 +96,28 @@
// --- public functions -------------------------------------------------------- // --- public functions --------------------------------------------------------
window.getQuillEditors = function() { window.getQuillEditors = function() {
const editors = document.querySelectorAll('[data-aa-quill-editor]') const editors = document.querySelectorAll('[data-aa-quill-editor]');
let list = [] const list = [];
editors.forEach(function(editor) { list.push(editor['_quill-editor']) }) editors.forEach(function(editor) { list.push(editor['_quill-editor']) });
return list
return list;
} }
window.getQuillEditorByIndex = function(index) { window.getQuillEditorByIndex = function(index) {
const editors = document.querySelectorAll('[data-aa-quill-editor]') const editors = document.querySelectorAll('[data-aa-quill-editor]');
return (index >= 0 && index < editors.length) ? editors[index]['_quill-editor'] : null return (index >= 0 && index < editors.length) ? editors[index]['_quill-editor'] : null;
} }
window.getQuillEditorByElementId = function(id) { window.getQuillEditorByElementId = function(id) {
const editor = document.querySelector(`[data-aa-quill-editor]#${id}`) const editor = document.querySelector(`[data-aa-quill-editor]#${id}`);
return editor ? editor['_quill-editor'] : null return editor ? editor['_quill-editor'] : null;
} }
// --- events ------------------------------------------------------------------ // --- events ------------------------------------------------------------------
$(document).ready(initQuillEditors) $(document).ready(initQuillEditors);
$(document).on('has_many_add:after', '.has_many_container', initQuillEditors) $(document).on('has_many_add:after', '.has_many_container', initQuillEditors);
$(document).on('turbolinks:load', initQuillEditors) $(document).on('turbolinks:load', initQuillEditors);
})() })();

Просмотреть файл

@@ -1,15 +1,15 @@
.image-uploading { .quill-image-uploading {
position: relative; position: relative;
display: inline-block; display: inline-block;
} }
.image-uploading img { .quill-image-uploading img {
max-width: 98% !important; max-width: 98% !important;
filter: blur(5px); filter: blur(5px);
opacity: 0.3; opacity: 0.3;
} }
.image-uploading::before { .quill-image-uploading::before {
content: ""; content: "";
box-sizing: border-box; box-sizing: border-box;
position: absolute; position: absolute;
@@ -21,7 +21,7 @@
margin-left: -15px; margin-left: -15px;
border-radius: 50%; border-radius: 50%;
border: 3px solid #ccc; border: 3px solid #ccc;
border-top-color: #1e986c; border-top-color: #1e40af;
z-index: 1; z-index: 1;
animation: spinner 0.6s linear infinite; animation: spinner 0.6s linear infinite;
} }

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@@ -1,29 +0,0 @@
#!/usr/bin/env ruby
# frozen_string_literal: true
#
# This file was generated by Bundler.
#
# The application 'appraisal' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require "pathname"
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
Pathname.new(__FILE__).realpath)
bundle_binstub = File.expand_path("../bundle", __FILE__)
if File.file?(bundle_binstub)
if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
load(bundle_binstub)
else
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
end
end
require "rubygems"
require "bundler/setup"
load Gem.bin_path("appraisal", "appraisal")

Просмотреть файл

@@ -2,7 +2,7 @@
# This command will automatically be run when you run "rails" with Rails gems # This command will automatically be run when you run "rails" with Rails gems
# installed from the root of your application. # installed from the root of your application.
ENV['RAILS_ENV'] ||= 'test' ENV['RAILS_ENV'] ||= 'development'
ENGINE_ROOT = File.expand_path('..', __dir__) ENGINE_ROOT = File.expand_path('..', __dir__)
ENGINE_PATH = File.expand_path('../lib/activeadmin/quill_editor/engine', __dir__) ENGINE_PATH = File.expand_path('../lib/activeadmin/quill_editor/engine', __dir__)

Просмотреть файл

@@ -1,25 +0,0 @@
services:
app:
container_name: 'activeadmin_quill_editor_app'
build:
context: .
dockerfile: ./extra/Dockerfile
# dockerfile: ./extra/Dockerfile_alpine
args:
# Debian-based Ruby image:
RUBY_IMAGE: ruby:3.4-slim
UID: ${UID}
environment:
ACTIVEADMIN_VERSION: ~> 3.3
RAILS_VERSION: ~> 8.0
user: "${UID}:${GID}"
ports:
- '3000:3000'
working_dir: '/app'
volumes:
- '.:/app'
stdin_open: true
tty: true
entrypoint:
- /bin/sh
- ./extra/entrypoint.sh

3
extra/.bashrc Обычный файл
Просмотреть файл

@@ -0,0 +1,3 @@
alias ls='ls --color'
alias ll='ls -l'
alias la='ls -la'

7
extra/.env Обычный файл
Просмотреть файл

@@ -0,0 +1,7 @@
COMPOSE_PROJECT_NAME=activeadmin_quill_editor
BUNDLER_VERSION=2.5.23
SERVER_PORT=4000
UID=1000
GID=1000

Просмотреть файл

@@ -1,21 +1,31 @@
ARG RUBY_IMAGE=ruby:3 ARG RUBY_IMAGE=ruby:3
FROM ${RUBY_IMAGE} FROM ${RUBY_IMAGE}
ARG UID ENV DEBIAN_FRONTEND=noninteractive
ENV DEVEL=1 ENV DEVEL=1
ENV LANG=C.UTF-8 ENV LANG=C.UTF-8
ENV RAILS_ENV=development
RUN apt-get update -qq RUN apt-get update -qq
RUN DEBIAN_FRONTEND=noninteractive apt-get install -yqq --no-install-recommends build-essential chromium libyaml-dev nano RUN apt-get install -yqq --no-install-recommends build-essential chromium less libyaml-dev nano netcat-traditional pkg-config
RUN gem install bundler ARG BUNDLER_VERSION
RUN gem install bundler -v ${BUNDLER_VERSION}
RUN echo 'gem: --no-document' > /etc/gemrc RUN echo 'gem: --no-document' > /etc/gemrc
RUN useradd -u ${UID} --shell /bin/bash app ARG UID
RUN mkdir -p /home/app && chown -R app:app /home/app RUN useradd -u $UID --shell /bin/bash app
RUN chown -R app /usr/local/bundle
USER ${UID} RUN mkdir -p /home/app && chown -R app:app /home/app
ARG RAILS_VERSION
ENV RAILS_VERSION=$RAILS_VERSION
ARG ACTIVEADMIN_VERSION
ENV ACTIVEADMIN_VERSION=$ACTIVEADMIN_VERSION
WORKDIR /app
COPY . /app COPY . /app
RUN bundle install
RUN chown -R app:app /usr/local/bundle
RUN ln -s /app/extra/.bashrc /home/app/.bashrc

6
extra/Dockerfile.dockerignore Обычный файл
Просмотреть файл

@@ -0,0 +1,6 @@
# Ignore everything but the required files for bundle install
/**/*
!/*.gemspec
!/Gemfile
!/lib

Просмотреть файл

@@ -1,18 +0,0 @@
FROM ruby:3.3-alpine
ARG UID
ENV DEVEL=1
ENV LANG=C.UTF-8
ENV RAILS_ENV=development
RUN apk update && apk add --no-cache build-base chromium tzdata yaml-dev
RUN gem install bundler
RUN echo 'gem: --no-document' > /etc/gemrc
RUN adduser -u ${UID} -D app
RUN mkdir -p /home/app && chown -R app:app /home/app
RUN chown -R app /usr/local/bundle
COPY . /app

Просмотреть файл

@@ -1,21 +0,0 @@
# Development
Overcommit can be used to ensure that Conventional commits are good.
## Releases
```sh
# Update version.rb with the new version
# Update the gemfiles:
bin/appraisal
```
## Testing
```sh
# Running specs using a specific configuration:
bin/appraisal rails60-activeadmin22 rspec
# Using latest activeadmin version:
bin/appraisal rails60-activeadmin rspec
# See gemfiles for more configurations
```

Просмотреть файл

@@ -4,5 +4,3 @@ export DEVEL=1
export RAILS_VERSION=7.2.2.1 export RAILS_VERSION=7.2.2.1
export ACTIVEADMIN_VERSION=3.3.0 export ACTIVEADMIN_VERSION=3.3.0
export RAILS_ENV=development

50
extra/development.md Обычный файл
Просмотреть файл

@@ -0,0 +1,50 @@
## Development
### Dev setup
There are 2 ways to interact with this project:
1) Using Docker:
```sh
make up # starts the dev services (optional env vars: RUBY / RAILS / ACTIVEADMIN)
make specs # run the tests (after up)
make lint # run the linters (after up)
make server # run the server (after up)
make shell # open a shell (after up)
make down # cleanup (after up)
# Example using specific versions:
RUBY=3.2 RAILS=7.1 ACTIVEADMIN=3.2.0 make up
```
2) With a local setup:
```sh
# Dev setup (set the required envs):
source extra/dev_setup.sh
# Install dependencies:
bundle update
# Run server (or any command):
bin/rails s
# To try different versions of Rails/ActiveAdmin edit extra/dev_setup.sh
```
### Update the editor
- Update the CSS/JS editor assets:
```sh
wget "https://cdn.jsdelivr.net/npm/quill@2/dist/quill.snow.css" -O "app/assets/stylesheets/activeadmin/quill_editor/quill.snow.css"
wget "https://cdn.jsdelivr.net/npm/quill@2/dist/quill.bubble.css" -O "app/assets/stylesheets/activeadmin/quill_editor/quill.bubble.css"
wget "https://cdn.jsdelivr.net/npm/quill@2/dist/quill.core.css" -O "app/assets/stylesheets/activeadmin/quill_editor/quill.core.css"
wget "https://cdn.jsdelivr.net/npm/quill@2/dist/quill.js" -O "app/assets/javascripts/activeadmin/quill_editor/quill.js"
wget "https://cdn.jsdelivr.net/npm/quill@2/dist/quill.core.js" -O "app/assets/javascripts/activeadmin/quill_editor/quill.core.js"
wget "https://github.com/valentsea/quill2-image-uploader/raw/refs/heads/master/dist/quill.imageUploader.min.js" -O "app/assets/javascripts/activeadmin/quill.imageUploader.min.js"
wget "https://github.com/valentsea/quill2-image-uploader/raw/refs/heads/master/dist/quill.imageUploader.min.css" -O "app/assets/stylesheets/activeadmin/quill.imageUploader.min.css"
```
- Check the changes, most of them should be for updated files plus some new / removed file

19
extra/docker-compose.yml Обычный файл
Просмотреть файл

@@ -0,0 +1,19 @@
services:
app:
build:
context: ..
dockerfile: extra/Dockerfile
args:
BUNDLER_VERSION: ${BUNDLER_VERSION}
RUBY_IMAGE: ruby:${RUBY:-3.4}-slim
RAILS_VERSION: ${RAILS:-}
ACTIVEADMIN_VERSION: ${ACTIVEADMIN:-}
UID: ${UID}
user: ${UID}:${GID}
ports:
- ${SERVER_PORT}:${SERVER_PORT}
working_dir: /app
volumes:
- ..:/app
stdin_open: true
tty: true

Просмотреть файл

@@ -1,8 +0,0 @@
echo "> Install dependencies"
rm -f Gemfile.lock && bundle install
echo "> Run pending migrations"
cd spec/dummy && bundle exec rails db:migrate
echo "> Start Rails server"
cd /app && rm -f spec/dummy/tmp/pids/server.pid && bundle exec rails s -b 0.0.0.0

Просмотреть файл

@@ -1,2 +0,0 @@
---
BUNDLE_RETRY: "1"

Просмотреть файл

@@ -1,28 +0,0 @@
# This file was generated by Appraisal
source "https://rubygems.org"
gem "sqlite3"
gem "bigdecimal"
gem "mutex_m"
gem "puma"
gem "sassc"
gem "sprockets-rails"
gem "capybara"
gem "cuprite"
gem "rspec_junit_formatter"
gem "rspec-rails"
gem "rspec-retry"
gem "fasterer"
gem "rubocop"
gem "rubocop-capybara"
gem "rubocop-packaging"
gem "rubocop-performance"
gem "rubocop-rails"
gem "rubocop-rspec"
gem "rubocop-rspec_rails"
gem "pry-rails"
gem "activeadmin"
gem "rails", "~> 6.1.0"
gemspec path: "../"

Просмотреть файл

@@ -1,352 +0,0 @@
PATH
remote: ..
specs:
activeadmin_quill_editor (1.3.0)
activeadmin (>= 2.9, < 4)
GEM
remote: https://rubygems.org/
specs:
actioncable (6.1.7.7)
actionpack (= 6.1.7.7)
activesupport (= 6.1.7.7)
nio4r (~> 2.0)
websocket-driver (>= 0.6.1)
actionmailbox (6.1.7.7)
actionpack (= 6.1.7.7)
activejob (= 6.1.7.7)
activerecord (= 6.1.7.7)
activestorage (= 6.1.7.7)
activesupport (= 6.1.7.7)
mail (>= 2.7.1)
actionmailer (6.1.7.7)
actionpack (= 6.1.7.7)
actionview (= 6.1.7.7)
activejob (= 6.1.7.7)
activesupport (= 6.1.7.7)
mail (~> 2.5, >= 2.5.4)
rails-dom-testing (~> 2.0)
actionpack (6.1.7.7)
actionview (= 6.1.7.7)
activesupport (= 6.1.7.7)
rack (~> 2.0, >= 2.0.9)
rack-test (>= 0.6.3)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.2.0)
actiontext (6.1.7.7)
actionpack (= 6.1.7.7)
activerecord (= 6.1.7.7)
activestorage (= 6.1.7.7)
activesupport (= 6.1.7.7)
nokogiri (>= 1.8.5)
actionview (6.1.7.7)
activesupport (= 6.1.7.7)
builder (~> 3.1)
erubi (~> 1.4)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.1, >= 1.2.0)
activeadmin (3.2.0)
arbre (~> 1.2, >= 1.2.1)
formtastic (>= 3.1)
formtastic_i18n (>= 0.4)
inherited_resources (~> 1.7)
jquery-rails (>= 4.2)
kaminari (>= 1.2.1)
railties (>= 6.1)
ransack (>= 4.0)
activejob (6.1.7.7)
activesupport (= 6.1.7.7)
globalid (>= 0.3.6)
activemodel (6.1.7.7)
activesupport (= 6.1.7.7)
activerecord (6.1.7.7)
activemodel (= 6.1.7.7)
activesupport (= 6.1.7.7)
activestorage (6.1.7.7)
actionpack (= 6.1.7.7)
activejob (= 6.1.7.7)
activerecord (= 6.1.7.7)
activesupport (= 6.1.7.7)
marcel (~> 1.0)
mini_mime (>= 1.1.0)
activesupport (6.1.7.7)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 1.6, < 2)
minitest (>= 5.1)
tzinfo (~> 2.0)
zeitwerk (~> 2.3)
addressable (2.8.6)
public_suffix (>= 2.0.2, < 6.0)
appraisal (2.5.0)
bundler
rake
thor (>= 0.14.0)
arbre (1.7.0)
activesupport (>= 3.0.0)
ruby2_keywords (>= 0.0.2)
ast (2.4.2)
bigdecimal (3.1.9)
builder (3.2.4)
capybara (3.40.0)
addressable
matrix
mini_mime (>= 0.1.3)
nokogiri (~> 1.11)
rack (>= 1.6.0)
rack-test (>= 0.6.3)
regexp_parser (>= 1.5, < 3.0)
xpath (~> 3.2)
coderay (1.1.3)
concurrent-ruby (1.2.3)
crass (1.0.6)
cuprite (0.15)
capybara (~> 3.0)
ferrum (~> 0.14.0)
date (3.3.4)
diff-lcs (1.5.1)
erubi (1.12.0)
fasterer (0.11.0)
ruby_parser (>= 3.19.1)
ferrum (0.14)
addressable (~> 2.5)
concurrent-ruby (~> 1.1)
webrick (~> 1.7)
websocket-driver (>= 0.6, < 0.8)
ffi (1.16.3)
formtastic (5.0.0)
actionpack (>= 6.0.0)
formtastic_i18n (0.7.0)
globalid (1.2.1)
activesupport (>= 6.1)
has_scope (0.8.2)
actionpack (>= 5.2)
activesupport (>= 5.2)
i18n (1.14.1)
concurrent-ruby (~> 1.0)
inherited_resources (1.14.0)
actionpack (>= 6.0)
has_scope (>= 0.6)
railties (>= 6.0)
responders (>= 2)
jquery-rails (4.6.0)
rails-dom-testing (>= 1, < 3)
railties (>= 4.2.0)
thor (>= 0.14, < 2.0)
json (2.7.1)
kaminari (1.2.2)
activesupport (>= 4.1.0)
kaminari-actionview (= 1.2.2)
kaminari-activerecord (= 1.2.2)
kaminari-core (= 1.2.2)
kaminari-actionview (1.2.2)
actionview
kaminari-core (= 1.2.2)
kaminari-activerecord (1.2.2)
activerecord
kaminari-core (= 1.2.2)
kaminari-core (1.2.2)
language_server-protocol (3.17.0.3)
loofah (2.22.0)
crass (~> 1.0.2)
nokogiri (>= 1.12.0)
mail (2.8.1)
mini_mime (>= 0.1.1)
net-imap
net-pop
net-smtp
marcel (1.0.2)
matrix (0.4.2)
method_source (1.0.0)
mini_mime (1.1.5)
minitest (5.22.2)
mutex_m (0.3.0)
net-imap (0.4.10)
date
net-protocol
net-pop (0.1.2)
net-protocol
net-protocol (0.2.2)
timeout
net-smtp (0.4.0.1)
net-protocol
nio4r (2.7.0)
nokogiri (1.16.2-arm64-darwin)
racc (~> 1.4)
nokogiri (1.16.2-x86_64-darwin)
racc (~> 1.4)
nokogiri (1.16.2-x86_64-linux)
racc (~> 1.4)
parallel (1.24.0)
parser (3.3.0.5)
ast (~> 2.4.1)
racc
pry (0.14.2)
coderay (~> 1.1)
method_source (~> 1.0)
pry-rails (0.3.9)
pry (>= 0.10.4)
public_suffix (5.0.4)
puma (6.4.2)
nio4r (~> 2.0)
racc (1.7.3)
rack (2.2.8.1)
rack-test (2.1.0)
rack (>= 1.3)
rails (6.1.7.7)
actioncable (= 6.1.7.7)
actionmailbox (= 6.1.7.7)
actionmailer (= 6.1.7.7)
actionpack (= 6.1.7.7)
actiontext (= 6.1.7.7)
actionview (= 6.1.7.7)
activejob (= 6.1.7.7)
activemodel (= 6.1.7.7)
activerecord (= 6.1.7.7)
activestorage (= 6.1.7.7)
activesupport (= 6.1.7.7)
bundler (>= 1.15.0)
railties (= 6.1.7.7)
sprockets-rails (>= 2.0.0)
rails-dom-testing (2.2.0)
activesupport (>= 5.0.0)
minitest
nokogiri (>= 1.6)
rails-html-sanitizer (1.6.0)
loofah (~> 2.21)
nokogiri (~> 1.14)
railties (6.1.7.7)
actionpack (= 6.1.7.7)
activesupport (= 6.1.7.7)
method_source
rake (>= 12.2)
thor (~> 1.0)
rainbow (3.1.1)
rake (13.1.0)
ransack (4.1.1)
activerecord (>= 6.1.5)
activesupport (>= 6.1.5)
i18n
regexp_parser (2.9.0)
responders (3.1.1)
actionpack (>= 5.2)
railties (>= 5.2)
rexml (3.2.6)
rspec-core (3.13.0)
rspec-support (~> 3.13.0)
rspec-expectations (3.13.0)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.13.0)
rspec-mocks (3.13.0)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.13.0)
rspec-rails (6.1.1)
actionpack (>= 6.1)
activesupport (>= 6.1)
railties (>= 6.1)
rspec-core (~> 3.12)
rspec-expectations (~> 3.12)
rspec-mocks (~> 3.12)
rspec-support (~> 3.12)
rspec-retry (0.6.2)
rspec-core (> 3.3)
rspec-support (3.13.1)
rspec_junit_formatter (0.6.0)
rspec-core (>= 2, < 4, != 2.12.0)
rubocop (1.60.2)
json (~> 2.3)
language_server-protocol (>= 3.17.0)
parallel (~> 1.10)
parser (>= 3.3.0.2)
rainbow (>= 2.2.2, < 4.0)
regexp_parser (>= 1.8, < 3.0)
rexml (>= 3.2.5, < 4.0)
rubocop-ast (>= 1.30.0, < 2.0)
ruby-progressbar (~> 1.7)
unicode-display_width (>= 2.4.0, < 3.0)
rubocop-ast (1.30.0)
parser (>= 3.2.1.0)
rubocop-capybara (2.20.0)
rubocop (~> 1.41)
rubocop-factory_bot (2.25.1)
rubocop (~> 1.41)
rubocop-packaging (0.5.2)
rubocop (>= 1.33, < 2.0)
rubocop-performance (1.20.2)
rubocop (>= 1.48.1, < 2.0)
rubocop-ast (>= 1.30.0, < 2.0)
rubocop-rails (2.23.1)
activesupport (>= 4.2.0)
rack (>= 1.1)
rubocop (>= 1.33.0, < 2.0)
rubocop-ast (>= 1.30.0, < 2.0)
rubocop-rspec (2.26.1)
rubocop (~> 1.40)
rubocop-capybara (~> 2.17)
rubocop-factory_bot (~> 2.22)
rubocop-rspec_rails (2.28.3)
rubocop (~> 1.40)
ruby-progressbar (1.13.0)
ruby2_keywords (0.0.5)
ruby_parser (3.21.0)
racc (~> 1.5)
sexp_processor (~> 4.16)
sassc (2.4.0)
ffi (~> 1.9)
sexp_processor (4.17.1)
sprockets (4.2.1)
concurrent-ruby (~> 1.0)
rack (>= 2.2.4, < 4)
sprockets-rails (3.4.2)
actionpack (>= 5.2)
activesupport (>= 5.2)
sprockets (>= 3.0.0)
sqlite3 (1.7.2-arm64-darwin)
sqlite3 (1.7.2-x86_64-darwin)
sqlite3 (1.7.2-x86_64-linux)
thor (1.3.0)
timeout (0.4.1)
tzinfo (2.0.6)
concurrent-ruby (~> 1.0)
unicode-display_width (2.5.0)
webrick (1.8.1)
websocket-driver (0.7.6)
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.5)
xpath (3.2.0)
nokogiri (~> 1.8)
zeitwerk (2.6.13)
PLATFORMS
arm64-darwin-22
arm64-darwin-23
x86_64-darwin-21
x86_64-linux
DEPENDENCIES
activeadmin
activeadmin_quill_editor!
appraisal (~> 2.4)
bigdecimal
capybara
cuprite
fasterer
mutex_m
pry-rails
puma
rails (~> 6.1.0)
rspec-rails
rspec-retry
rspec_junit_formatter
rubocop
rubocop-capybara
rubocop-packaging
rubocop-performance
rubocop-rails
rubocop-rspec
rubocop-rspec_rails
sassc
sprockets-rails
sqlite3
BUNDLED WITH
2.3.8

Просмотреть файл

@@ -1,28 +0,0 @@
# This file was generated by Appraisal
source "https://rubygems.org"
gem "sqlite3"
gem "bigdecimal"
gem "mutex_m"
gem "puma"
gem "sassc"
gem "sprockets-rails"
gem "capybara"
gem "cuprite"
gem "rspec_junit_formatter"
gem "rspec-rails"
gem "rspec-retry"
gem "fasterer"
gem "rubocop"
gem "rubocop-capybara"
gem "rubocop-packaging"
gem "rubocop-performance"
gem "rubocop-rails"
gem "rubocop-rspec"
gem "rubocop-rspec_rails"
gem "pry-rails"
gem "activeadmin", "~> 2.9.0"
gem "rails", "~> 6.1.0"
gemspec path: "../"

Просмотреть файл

@@ -1,352 +0,0 @@
PATH
remote: ..
specs:
activeadmin_quill_editor (1.3.0)
activeadmin (>= 2.9, < 4)
GEM
remote: https://rubygems.org/
specs:
actioncable (6.1.7.7)
actionpack (= 6.1.7.7)
activesupport (= 6.1.7.7)
nio4r (~> 2.0)
websocket-driver (>= 0.6.1)
actionmailbox (6.1.7.7)
actionpack (= 6.1.7.7)
activejob (= 6.1.7.7)
activerecord (= 6.1.7.7)
activestorage (= 6.1.7.7)
activesupport (= 6.1.7.7)
mail (>= 2.7.1)
actionmailer (6.1.7.7)
actionpack (= 6.1.7.7)
actionview (= 6.1.7.7)
activejob (= 6.1.7.7)
activesupport (= 6.1.7.7)
mail (~> 2.5, >= 2.5.4)
rails-dom-testing (~> 2.0)
actionpack (6.1.7.7)
actionview (= 6.1.7.7)
activesupport (= 6.1.7.7)
rack (~> 2.0, >= 2.0.9)
rack-test (>= 0.6.3)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.2.0)
actiontext (6.1.7.7)
actionpack (= 6.1.7.7)
activerecord (= 6.1.7.7)
activestorage (= 6.1.7.7)
activesupport (= 6.1.7.7)
nokogiri (>= 1.8.5)
actionview (6.1.7.7)
activesupport (= 6.1.7.7)
builder (~> 3.1)
erubi (~> 1.4)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.1, >= 1.2.0)
activeadmin (2.9.0)
arbre (~> 1.2, >= 1.2.1)
formtastic (>= 3.1, < 5.0)
formtastic_i18n (~> 0.4)
inherited_resources (~> 1.7)
jquery-rails (~> 4.2)
kaminari (~> 1.0, >= 1.2.1)
railties (>= 5.2, < 6.2)
ransack (~> 2.1, >= 2.1.1)
activejob (6.1.7.7)
activesupport (= 6.1.7.7)
globalid (>= 0.3.6)
activemodel (6.1.7.7)
activesupport (= 6.1.7.7)
activerecord (6.1.7.7)
activemodel (= 6.1.7.7)
activesupport (= 6.1.7.7)
activestorage (6.1.7.7)
actionpack (= 6.1.7.7)
activejob (= 6.1.7.7)
activerecord (= 6.1.7.7)
activesupport (= 6.1.7.7)
marcel (~> 1.0)
mini_mime (>= 1.1.0)
activesupport (6.1.7.7)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 1.6, < 2)
minitest (>= 5.1)
tzinfo (~> 2.0)
zeitwerk (~> 2.3)
addressable (2.8.6)
public_suffix (>= 2.0.2, < 6.0)
appraisal (2.5.0)
bundler
rake
thor (>= 0.14.0)
arbre (1.7.0)
activesupport (>= 3.0.0)
ruby2_keywords (>= 0.0.2)
ast (2.4.2)
bigdecimal (3.1.9)
builder (3.2.4)
capybara (3.40.0)
addressable
matrix
mini_mime (>= 0.1.3)
nokogiri (~> 1.11)
rack (>= 1.6.0)
rack-test (>= 0.6.3)
regexp_parser (>= 1.5, < 3.0)
xpath (~> 3.2)
coderay (1.1.3)
concurrent-ruby (1.2.3)
crass (1.0.6)
cuprite (0.15)
capybara (~> 3.0)
ferrum (~> 0.14.0)
date (3.3.4)
diff-lcs (1.5.1)
erubi (1.12.0)
fasterer (0.11.0)
ruby_parser (>= 3.19.1)
ferrum (0.14)
addressable (~> 2.5)
concurrent-ruby (~> 1.1)
webrick (~> 1.7)
websocket-driver (>= 0.6, < 0.8)
ffi (1.16.3)
formtastic (4.0.0)
actionpack (>= 5.2.0)
formtastic_i18n (0.7.0)
globalid (1.2.1)
activesupport (>= 6.1)
has_scope (0.8.2)
actionpack (>= 5.2)
activesupport (>= 5.2)
i18n (1.14.1)
concurrent-ruby (~> 1.0)
inherited_resources (1.14.0)
actionpack (>= 6.0)
has_scope (>= 0.6)
railties (>= 6.0)
responders (>= 2)
jquery-rails (4.6.0)
rails-dom-testing (>= 1, < 3)
railties (>= 4.2.0)
thor (>= 0.14, < 2.0)
json (2.7.1)
kaminari (1.2.2)
activesupport (>= 4.1.0)
kaminari-actionview (= 1.2.2)
kaminari-activerecord (= 1.2.2)
kaminari-core (= 1.2.2)
kaminari-actionview (1.2.2)
actionview
kaminari-core (= 1.2.2)
kaminari-activerecord (1.2.2)
activerecord
kaminari-core (= 1.2.2)
kaminari-core (1.2.2)
language_server-protocol (3.17.0.3)
loofah (2.22.0)
crass (~> 1.0.2)
nokogiri (>= 1.12.0)
mail (2.8.1)
mini_mime (>= 0.1.1)
net-imap
net-pop
net-smtp
marcel (1.0.2)
matrix (0.4.2)
method_source (1.0.0)
mini_mime (1.1.5)
minitest (5.22.2)
mutex_m (0.3.0)
net-imap (0.4.10)
date
net-protocol
net-pop (0.1.2)
net-protocol
net-protocol (0.2.2)
timeout
net-smtp (0.4.0.1)
net-protocol
nio4r (2.7.0)
nokogiri (1.16.2-arm64-darwin)
racc (~> 1.4)
nokogiri (1.16.2-x86_64-darwin)
racc (~> 1.4)
nokogiri (1.16.2-x86_64-linux)
racc (~> 1.4)
parallel (1.24.0)
parser (3.3.0.5)
ast (~> 2.4.1)
racc
pry (0.14.2)
coderay (~> 1.1)
method_source (~> 1.0)
pry-rails (0.3.9)
pry (>= 0.10.4)
public_suffix (5.0.4)
puma (6.4.2)
nio4r (~> 2.0)
racc (1.7.3)
rack (2.2.8.1)
rack-test (2.1.0)
rack (>= 1.3)
rails (6.1.7.7)
actioncable (= 6.1.7.7)
actionmailbox (= 6.1.7.7)
actionmailer (= 6.1.7.7)
actionpack (= 6.1.7.7)
actiontext (= 6.1.7.7)
actionview (= 6.1.7.7)
activejob (= 6.1.7.7)
activemodel (= 6.1.7.7)
activerecord (= 6.1.7.7)
activestorage (= 6.1.7.7)
activesupport (= 6.1.7.7)
bundler (>= 1.15.0)
railties (= 6.1.7.7)
sprockets-rails (>= 2.0.0)
rails-dom-testing (2.2.0)
activesupport (>= 5.0.0)
minitest
nokogiri (>= 1.6)
rails-html-sanitizer (1.6.0)
loofah (~> 2.21)
nokogiri (~> 1.14)
railties (6.1.7.7)
actionpack (= 6.1.7.7)
activesupport (= 6.1.7.7)
method_source
rake (>= 12.2)
thor (~> 1.0)
rainbow (3.1.1)
rake (13.1.0)
ransack (2.6.0)
activerecord (>= 6.0.4)
activesupport (>= 6.0.4)
i18n
regexp_parser (2.9.0)
responders (3.1.1)
actionpack (>= 5.2)
railties (>= 5.2)
rexml (3.2.6)
rspec-core (3.13.0)
rspec-support (~> 3.13.0)
rspec-expectations (3.13.0)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.13.0)
rspec-mocks (3.13.0)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.13.0)
rspec-rails (6.1.1)
actionpack (>= 6.1)
activesupport (>= 6.1)
railties (>= 6.1)
rspec-core (~> 3.12)
rspec-expectations (~> 3.12)
rspec-mocks (~> 3.12)
rspec-support (~> 3.12)
rspec-retry (0.6.2)
rspec-core (> 3.3)
rspec-support (3.13.1)
rspec_junit_formatter (0.6.0)
rspec-core (>= 2, < 4, != 2.12.0)
rubocop (1.60.2)
json (~> 2.3)
language_server-protocol (>= 3.17.0)
parallel (~> 1.10)
parser (>= 3.3.0.2)
rainbow (>= 2.2.2, < 4.0)
regexp_parser (>= 1.8, < 3.0)
rexml (>= 3.2.5, < 4.0)
rubocop-ast (>= 1.30.0, < 2.0)
ruby-progressbar (~> 1.7)
unicode-display_width (>= 2.4.0, < 3.0)
rubocop-ast (1.30.0)
parser (>= 3.2.1.0)
rubocop-capybara (2.20.0)
rubocop (~> 1.41)
rubocop-factory_bot (2.25.1)
rubocop (~> 1.41)
rubocop-packaging (0.5.2)
rubocop (>= 1.33, < 2.0)
rubocop-performance (1.20.2)
rubocop (>= 1.48.1, < 2.0)
rubocop-ast (>= 1.30.0, < 2.0)
rubocop-rails (2.23.1)
activesupport (>= 4.2.0)
rack (>= 1.1)
rubocop (>= 1.33.0, < 2.0)
rubocop-ast (>= 1.30.0, < 2.0)
rubocop-rspec (2.26.1)
rubocop (~> 1.40)
rubocop-capybara (~> 2.17)
rubocop-factory_bot (~> 2.22)
rubocop-rspec_rails (2.28.3)
rubocop (~> 1.40)
ruby-progressbar (1.13.0)
ruby2_keywords (0.0.5)
ruby_parser (3.21.0)
racc (~> 1.5)
sexp_processor (~> 4.16)
sassc (2.4.0)
ffi (~> 1.9)
sexp_processor (4.17.1)
sprockets (4.2.1)
concurrent-ruby (~> 1.0)
rack (>= 2.2.4, < 4)
sprockets-rails (3.4.2)
actionpack (>= 5.2)
activesupport (>= 5.2)
sprockets (>= 3.0.0)
sqlite3 (1.7.2-arm64-darwin)
sqlite3 (1.7.2-x86_64-darwin)
sqlite3 (1.7.2-x86_64-linux)
thor (1.3.0)
timeout (0.4.1)
tzinfo (2.0.6)
concurrent-ruby (~> 1.0)
unicode-display_width (2.5.0)
webrick (1.8.1)
websocket-driver (0.7.6)
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.5)
xpath (3.2.0)
nokogiri (~> 1.8)
zeitwerk (2.6.13)
PLATFORMS
arm64-darwin-22
arm64-darwin-23
x86_64-darwin-21
x86_64-linux
DEPENDENCIES
activeadmin (~> 2.9.0)
activeadmin_quill_editor!
appraisal (~> 2.4)
bigdecimal
capybara
cuprite
fasterer
mutex_m
pry-rails
puma
rails (~> 6.1.0)
rspec-rails
rspec-retry
rspec_junit_formatter
rubocop
rubocop-capybara
rubocop-packaging
rubocop-performance
rubocop-rails
rubocop-rspec
rubocop-rspec_rails
sassc
sprockets-rails
sqlite3
BUNDLED WITH
2.3.8

Просмотреть файл

@@ -1,28 +0,0 @@
# This file was generated by Appraisal
source "https://rubygems.org"
gem "sqlite3"
gem "bigdecimal"
gem "mutex_m"
gem "puma"
gem "sassc"
gem "sprockets-rails"
gem "capybara"
gem "cuprite"
gem "rspec_junit_formatter"
gem "rspec-rails"
gem "rspec-retry"
gem "fasterer"
gem "rubocop"
gem "rubocop-capybara"
gem "rubocop-packaging"
gem "rubocop-performance"
gem "rubocop-rails"
gem "rubocop-rspec"
gem "rubocop-rspec_rails"
gem "pry-rails"
gem "activeadmin"
gem "rails", "~> 7.0.0"
gemspec path: "../"

Просмотреть файл

@@ -1,354 +0,0 @@
PATH
remote: ..
specs:
activeadmin_quill_editor (1.3.0)
activeadmin (>= 2.9, < 4)
GEM
remote: https://rubygems.org/
specs:
actioncable (7.0.8.1)
actionpack (= 7.0.8.1)
activesupport (= 7.0.8.1)
nio4r (~> 2.0)
websocket-driver (>= 0.6.1)
actionmailbox (7.0.8.1)
actionpack (= 7.0.8.1)
activejob (= 7.0.8.1)
activerecord (= 7.0.8.1)
activestorage (= 7.0.8.1)
activesupport (= 7.0.8.1)
mail (>= 2.7.1)
net-imap
net-pop
net-smtp
actionmailer (7.0.8.1)
actionpack (= 7.0.8.1)
actionview (= 7.0.8.1)
activejob (= 7.0.8.1)
activesupport (= 7.0.8.1)
mail (~> 2.5, >= 2.5.4)
net-imap
net-pop
net-smtp
rails-dom-testing (~> 2.0)
actionpack (7.0.8.1)
actionview (= 7.0.8.1)
activesupport (= 7.0.8.1)
rack (~> 2.0, >= 2.2.4)
rack-test (>= 0.6.3)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.2.0)
actiontext (7.0.8.1)
actionpack (= 7.0.8.1)
activerecord (= 7.0.8.1)
activestorage (= 7.0.8.1)
activesupport (= 7.0.8.1)
globalid (>= 0.6.0)
nokogiri (>= 1.8.5)
actionview (7.0.8.1)
activesupport (= 7.0.8.1)
builder (~> 3.1)
erubi (~> 1.4)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.1, >= 1.2.0)
activeadmin (3.2.0)
arbre (~> 1.2, >= 1.2.1)
formtastic (>= 3.1)
formtastic_i18n (>= 0.4)
inherited_resources (~> 1.7)
jquery-rails (>= 4.2)
kaminari (>= 1.2.1)
railties (>= 6.1)
ransack (>= 4.0)
activejob (7.0.8.1)
activesupport (= 7.0.8.1)
globalid (>= 0.3.6)
activemodel (7.0.8.1)
activesupport (= 7.0.8.1)
activerecord (7.0.8.1)
activemodel (= 7.0.8.1)
activesupport (= 7.0.8.1)
activestorage (7.0.8.1)
actionpack (= 7.0.8.1)
activejob (= 7.0.8.1)
activerecord (= 7.0.8.1)
activesupport (= 7.0.8.1)
marcel (~> 1.0)
mini_mime (>= 1.1.0)
activesupport (7.0.8.1)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 1.6, < 2)
minitest (>= 5.1)
tzinfo (~> 2.0)
addressable (2.8.6)
public_suffix (>= 2.0.2, < 6.0)
appraisal (2.5.0)
bundler
rake
thor (>= 0.14.0)
arbre (1.7.0)
activesupport (>= 3.0.0)
ruby2_keywords (>= 0.0.2)
ast (2.4.2)
bigdecimal (3.1.9)
builder (3.2.4)
capybara (3.40.0)
addressable
matrix
mini_mime (>= 0.1.3)
nokogiri (~> 1.11)
rack (>= 1.6.0)
rack-test (>= 0.6.3)
regexp_parser (>= 1.5, < 3.0)
xpath (~> 3.2)
coderay (1.1.3)
concurrent-ruby (1.2.3)
crass (1.0.6)
cuprite (0.15)
capybara (~> 3.0)
ferrum (~> 0.14.0)
date (3.3.4)
diff-lcs (1.5.1)
erubi (1.12.0)
fasterer (0.11.0)
ruby_parser (>= 3.19.1)
ferrum (0.14)
addressable (~> 2.5)
concurrent-ruby (~> 1.1)
webrick (~> 1.7)
websocket-driver (>= 0.6, < 0.8)
ffi (1.16.3)
formtastic (5.0.0)
actionpack (>= 6.0.0)
formtastic_i18n (0.7.0)
globalid (1.2.1)
activesupport (>= 6.1)
has_scope (0.8.2)
actionpack (>= 5.2)
activesupport (>= 5.2)
i18n (1.14.1)
concurrent-ruby (~> 1.0)
inherited_resources (1.14.0)
actionpack (>= 6.0)
has_scope (>= 0.6)
railties (>= 6.0)
responders (>= 2)
jquery-rails (4.6.0)
rails-dom-testing (>= 1, < 3)
railties (>= 4.2.0)
thor (>= 0.14, < 2.0)
json (2.7.1)
kaminari (1.2.2)
activesupport (>= 4.1.0)
kaminari-actionview (= 1.2.2)
kaminari-activerecord (= 1.2.2)
kaminari-core (= 1.2.2)
kaminari-actionview (1.2.2)
actionview
kaminari-core (= 1.2.2)
kaminari-activerecord (1.2.2)
activerecord
kaminari-core (= 1.2.2)
kaminari-core (1.2.2)
language_server-protocol (3.17.0.3)
loofah (2.22.0)
crass (~> 1.0.2)
nokogiri (>= 1.12.0)
mail (2.8.1)
mini_mime (>= 0.1.1)
net-imap
net-pop
net-smtp
marcel (1.0.2)
matrix (0.4.2)
method_source (1.0.0)
mini_mime (1.1.5)
mini_portile2 (2.8.8)
minitest (5.22.2)
mutex_m (0.3.0)
net-imap (0.4.10)
date
net-protocol
net-pop (0.1.2)
net-protocol
net-protocol (0.2.2)
timeout
net-smtp (0.5.1)
net-protocol
nio4r (2.7.0)
nokogiri (1.16.2)
mini_portile2 (~> 2.8.2)
racc (~> 1.4)
parallel (1.24.0)
parser (3.3.0.5)
ast (~> 2.4.1)
racc
pry (0.14.2)
coderay (~> 1.1)
method_source (~> 1.0)
pry-rails (0.3.9)
pry (>= 0.10.4)
public_suffix (5.0.4)
puma (6.4.2)
nio4r (~> 2.0)
racc (1.7.3)
rack (2.2.8.1)
rack-test (2.1.0)
rack (>= 1.3)
rails (7.0.8.1)
actioncable (= 7.0.8.1)
actionmailbox (= 7.0.8.1)
actionmailer (= 7.0.8.1)
actionpack (= 7.0.8.1)
actiontext (= 7.0.8.1)
actionview (= 7.0.8.1)
activejob (= 7.0.8.1)
activemodel (= 7.0.8.1)
activerecord (= 7.0.8.1)
activestorage (= 7.0.8.1)
activesupport (= 7.0.8.1)
bundler (>= 1.15.0)
railties (= 7.0.8.1)
rails-dom-testing (2.2.0)
activesupport (>= 5.0.0)
minitest
nokogiri (>= 1.6)
rails-html-sanitizer (1.6.0)
loofah (~> 2.21)
nokogiri (~> 1.14)
railties (7.0.8.1)
actionpack (= 7.0.8.1)
activesupport (= 7.0.8.1)
method_source
rake (>= 12.2)
thor (~> 1.0)
zeitwerk (~> 2.5)
rainbow (3.1.1)
rake (13.1.0)
ransack (4.1.1)
activerecord (>= 6.1.5)
activesupport (>= 6.1.5)
i18n
regexp_parser (2.9.0)
responders (3.1.1)
actionpack (>= 5.2)
railties (>= 5.2)
rexml (3.2.6)
rspec-core (3.13.0)
rspec-support (~> 3.13.0)
rspec-expectations (3.13.0)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.13.0)
rspec-mocks (3.13.0)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.13.0)
rspec-rails (6.1.1)
actionpack (>= 6.1)
activesupport (>= 6.1)
railties (>= 6.1)
rspec-core (~> 3.12)
rspec-expectations (~> 3.12)
rspec-mocks (~> 3.12)
rspec-support (~> 3.12)
rspec-retry (0.6.2)
rspec-core (> 3.3)
rspec-support (3.13.1)
rspec_junit_formatter (0.6.0)
rspec-core (>= 2, < 4, != 2.12.0)
rubocop (1.60.2)
json (~> 2.3)
language_server-protocol (>= 3.17.0)
parallel (~> 1.10)
parser (>= 3.3.0.2)
rainbow (>= 2.2.2, < 4.0)
regexp_parser (>= 1.8, < 3.0)
rexml (>= 3.2.5, < 4.0)
rubocop-ast (>= 1.30.0, < 2.0)
ruby-progressbar (~> 1.7)
unicode-display_width (>= 2.4.0, < 3.0)
rubocop-ast (1.30.0)
parser (>= 3.2.1.0)
rubocop-capybara (2.20.0)
rubocop (~> 1.41)
rubocop-factory_bot (2.25.1)
rubocop (~> 1.41)
rubocop-packaging (0.5.2)
rubocop (>= 1.33, < 2.0)
rubocop-performance (1.20.2)
rubocop (>= 1.48.1, < 2.0)
rubocop-ast (>= 1.30.0, < 2.0)
rubocop-rails (2.23.1)
activesupport (>= 4.2.0)
rack (>= 1.1)
rubocop (>= 1.33.0, < 2.0)
rubocop-ast (>= 1.30.0, < 2.0)
rubocop-rspec (2.26.1)
rubocop (~> 1.40)
rubocop-capybara (~> 2.17)
rubocop-factory_bot (~> 2.22)
rubocop-rspec_rails (2.28.3)
rubocop (~> 1.40)
ruby-progressbar (1.13.0)
ruby2_keywords (0.0.5)
ruby_parser (3.21.0)
racc (~> 1.5)
sexp_processor (~> 4.16)
sassc (2.4.0)
ffi (~> 1.9)
sexp_processor (4.17.1)
sprockets (4.2.1)
concurrent-ruby (~> 1.0)
rack (>= 2.2.4, < 4)
sprockets-rails (3.4.2)
actionpack (>= 5.2)
activesupport (>= 5.2)
sprockets (>= 3.0.0)
sqlite3 (1.7.2)
mini_portile2 (~> 2.8.0)
thor (1.3.0)
timeout (0.4.1)
tzinfo (2.0.6)
concurrent-ruby (~> 1.0)
unicode-display_width (2.5.0)
webrick (1.8.1)
websocket-driver (0.7.6)
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.5)
xpath (3.2.0)
nokogiri (~> 1.8)
zeitwerk (2.6.13)
PLATFORMS
arm64-darwin-22
arm64-darwin-23
x86_64-linux
DEPENDENCIES
activeadmin
activeadmin_quill_editor!
appraisal (~> 2.4)
bigdecimal
capybara
cuprite
fasterer
mutex_m
pry-rails
puma
rails (~> 7.0.0)
rspec-rails
rspec-retry
rspec_junit_formatter
rubocop
rubocop-capybara
rubocop-packaging
rubocop-performance
rubocop-rails
rubocop-rspec
rubocop-rspec_rails
sassc
sprockets-rails
sqlite3
BUNDLED WITH
2.3.8

Просмотреть файл

@@ -1,28 +0,0 @@
# This file was generated by Appraisal
source "https://rubygems.org"
gem "sqlite3"
gem "bigdecimal"
gem "mutex_m"
gem "puma"
gem "sassc"
gem "sprockets-rails"
gem "capybara"
gem "cuprite"
gem "rspec_junit_formatter"
gem "rspec-rails"
gem "rspec-retry"
gem "fasterer"
gem "rubocop"
gem "rubocop-capybara"
gem "rubocop-packaging"
gem "rubocop-performance"
gem "rubocop-rails"
gem "rubocop-rspec"
gem "rubocop-rspec_rails"
gem "pry-rails"
gem "activeadmin"
gem "rails", "~> 7.1.0"
gemspec path: "../"

Просмотреть файл

@@ -1,401 +0,0 @@
PATH
remote: ..
specs:
activeadmin_quill_editor (1.3.0)
activeadmin (>= 2.9, < 4)
GEM
remote: https://rubygems.org/
specs:
actioncable (7.1.5.1)
actionpack (= 7.1.5.1)
activesupport (= 7.1.5.1)
nio4r (~> 2.0)
websocket-driver (>= 0.6.1)
zeitwerk (~> 2.6)
actionmailbox (7.1.5.1)
actionpack (= 7.1.5.1)
activejob (= 7.1.5.1)
activerecord (= 7.1.5.1)
activestorage (= 7.1.5.1)
activesupport (= 7.1.5.1)
mail (>= 2.7.1)
net-imap
net-pop
net-smtp
actionmailer (7.1.5.1)
actionpack (= 7.1.5.1)
actionview (= 7.1.5.1)
activejob (= 7.1.5.1)
activesupport (= 7.1.5.1)
mail (~> 2.5, >= 2.5.4)
net-imap
net-pop
net-smtp
rails-dom-testing (~> 2.2)
actionpack (7.1.5.1)
actionview (= 7.1.5.1)
activesupport (= 7.1.5.1)
nokogiri (>= 1.8.5)
racc
rack (>= 2.2.4)
rack-session (>= 1.0.1)
rack-test (>= 0.6.3)
rails-dom-testing (~> 2.2)
rails-html-sanitizer (~> 1.6)
actiontext (7.1.5.1)
actionpack (= 7.1.5.1)
activerecord (= 7.1.5.1)
activestorage (= 7.1.5.1)
activesupport (= 7.1.5.1)
globalid (>= 0.6.0)
nokogiri (>= 1.8.5)
actionview (7.1.5.1)
activesupport (= 7.1.5.1)
builder (~> 3.1)
erubi (~> 1.11)
rails-dom-testing (~> 2.2)
rails-html-sanitizer (~> 1.6)
activeadmin (3.3.0)
arbre (~> 1.2, >= 1.2.1)
csv
formtastic (>= 3.1)
formtastic_i18n (>= 0.4)
inherited_resources (~> 1.7)
jquery-rails (>= 4.2)
kaminari (>= 1.2.1)
railties (>= 6.1)
ransack (>= 4.0)
activejob (7.1.5.1)
activesupport (= 7.1.5.1)
globalid (>= 0.3.6)
activemodel (7.1.5.1)
activesupport (= 7.1.5.1)
activerecord (7.1.5.1)
activemodel (= 7.1.5.1)
activesupport (= 7.1.5.1)
timeout (>= 0.4.0)
activestorage (7.1.5.1)
actionpack (= 7.1.5.1)
activejob (= 7.1.5.1)
activerecord (= 7.1.5.1)
activesupport (= 7.1.5.1)
marcel (~> 1.0)
activesupport (7.1.5.1)
base64
benchmark (>= 0.3)
bigdecimal
concurrent-ruby (~> 1.0, >= 1.0.2)
connection_pool (>= 2.2.5)
drb
i18n (>= 1.6, < 2)
logger (>= 1.4.2)
minitest (>= 5.1)
mutex_m
securerandom (>= 0.3)
tzinfo (~> 2.0)
addressable (2.8.7)
public_suffix (>= 2.0.2, < 7.0)
appraisal (2.5.0)
bundler
rake
thor (>= 0.14.0)
arbre (1.7.0)
activesupport (>= 3.0.0)
ruby2_keywords (>= 0.0.2)
ast (2.4.2)
base64 (0.2.0)
benchmark (0.4.0)
bigdecimal (3.1.9)
builder (3.3.0)
capybara (3.40.0)
addressable
matrix
mini_mime (>= 0.1.3)
nokogiri (~> 1.11)
rack (>= 1.6.0)
rack-test (>= 0.6.3)
regexp_parser (>= 1.5, < 3.0)
xpath (~> 3.2)
coderay (1.1.3)
concurrent-ruby (1.3.5)
connection_pool (2.5.0)
crass (1.0.6)
csv (3.3.2)
cuprite (0.15.1)
capybara (~> 3.0)
ferrum (~> 0.15.0)
date (3.4.1)
diff-lcs (1.6.0)
drb (2.2.1)
erubi (1.13.1)
fasterer (0.11.0)
ruby_parser (>= 3.19.1)
ferrum (0.15)
addressable (~> 2.5)
concurrent-ruby (~> 1.1)
webrick (~> 1.7)
websocket-driver (~> 0.7)
ffi (1.17.1-arm64-darwin)
ffi (1.17.1-x86_64-linux-gnu)
formtastic (5.0.0)
actionpack (>= 6.0.0)
formtastic_i18n (0.7.0)
globalid (1.2.1)
activesupport (>= 6.1)
has_scope (0.8.2)
actionpack (>= 5.2)
activesupport (>= 5.2)
i18n (1.14.7)
concurrent-ruby (~> 1.0)
inherited_resources (1.14.0)
actionpack (>= 6.0)
has_scope (>= 0.6)
railties (>= 6.0)
responders (>= 2)
io-console (0.8.0)
irb (1.15.1)
pp (>= 0.6.0)
rdoc (>= 4.0.0)
reline (>= 0.4.2)
jquery-rails (4.6.0)
rails-dom-testing (>= 1, < 3)
railties (>= 4.2.0)
thor (>= 0.14, < 2.0)
json (2.10.2)
kaminari (1.2.2)
activesupport (>= 4.1.0)
kaminari-actionview (= 1.2.2)
kaminari-activerecord (= 1.2.2)
kaminari-core (= 1.2.2)
kaminari-actionview (1.2.2)
actionview
kaminari-core (= 1.2.2)
kaminari-activerecord (1.2.2)
activerecord
kaminari-core (= 1.2.2)
kaminari-core (1.2.2)
language_server-protocol (3.17.0.4)
lint_roller (1.1.0)
logger (1.6.6)
loofah (2.24.0)
crass (~> 1.0.2)
nokogiri (>= 1.12.0)
mail (2.8.1)
mini_mime (>= 0.1.1)
net-imap
net-pop
net-smtp
marcel (1.0.4)
matrix (0.4.2)
method_source (1.1.0)
mini_mime (1.1.5)
minitest (5.25.5)
mutex_m (0.3.0)
net-imap (0.5.6)
date
net-protocol
net-pop (0.1.2)
net-protocol
net-protocol (0.2.2)
timeout
net-smtp (0.5.1)
net-protocol
nio4r (2.7.4)
nokogiri (1.18.4-arm64-darwin)
racc (~> 1.4)
nokogiri (1.18.4-x86_64-linux-gnu)
racc (~> 1.4)
parallel (1.26.3)
parser (3.3.7.1)
ast (~> 2.4.1)
racc
pp (0.6.2)
prettyprint
prettyprint (0.2.0)
pry (0.15.2)
coderay (~> 1.1)
method_source (~> 1.0)
pry-rails (0.3.11)
pry (>= 0.13.0)
psych (5.2.3)
date
stringio
public_suffix (6.0.1)
puma (6.6.0)
nio4r (~> 2.0)
racc (1.8.1)
rack (3.1.12)
rack-session (2.1.0)
base64 (>= 0.1.0)
rack (>= 3.0.0)
rack-test (2.2.0)
rack (>= 1.3)
rackup (2.2.1)
rack (>= 3)
rails (7.1.5.1)
actioncable (= 7.1.5.1)
actionmailbox (= 7.1.5.1)
actionmailer (= 7.1.5.1)
actionpack (= 7.1.5.1)
actiontext (= 7.1.5.1)
actionview (= 7.1.5.1)
activejob (= 7.1.5.1)
activemodel (= 7.1.5.1)
activerecord (= 7.1.5.1)
activestorage (= 7.1.5.1)
activesupport (= 7.1.5.1)
bundler (>= 1.15.0)
railties (= 7.1.5.1)
rails-dom-testing (2.2.0)
activesupport (>= 5.0.0)
minitest
nokogiri (>= 1.6)
rails-html-sanitizer (1.6.2)
loofah (~> 2.21)
nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0)
railties (7.1.5.1)
actionpack (= 7.1.5.1)
activesupport (= 7.1.5.1)
irb
rackup (>= 1.0.0)
rake (>= 12.2)
thor (~> 1.0, >= 1.2.2)
zeitwerk (~> 2.6)
rainbow (3.1.1)
rake (13.2.1)
ransack (4.3.0)
activerecord (>= 6.1.5)
activesupport (>= 6.1.5)
i18n
rdoc (6.12.0)
psych (>= 4.0.0)
regexp_parser (2.10.0)
reline (0.6.0)
io-console (~> 0.5)
responders (3.1.1)
actionpack (>= 5.2)
railties (>= 5.2)
rspec-core (3.13.3)
rspec-support (~> 3.13.0)
rspec-expectations (3.13.3)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.13.0)
rspec-mocks (3.13.2)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.13.0)
rspec-rails (7.1.1)
actionpack (>= 7.0)
activesupport (>= 7.0)
railties (>= 7.0)
rspec-core (~> 3.13)
rspec-expectations (~> 3.13)
rspec-mocks (~> 3.13)
rspec-support (~> 3.13)
rspec-retry (0.6.2)
rspec-core (> 3.3)
rspec-support (3.13.2)
rspec_junit_formatter (0.6.0)
rspec-core (>= 2, < 4, != 2.12.0)
rubocop (1.74.0)
json (~> 2.3)
language_server-protocol (~> 3.17.0.2)
lint_roller (~> 1.1.0)
parallel (~> 1.10)
parser (>= 3.3.0.2)
rainbow (>= 2.2.2, < 4.0)
regexp_parser (>= 2.9.3, < 3.0)
rubocop-ast (>= 1.38.0, < 2.0)
ruby-progressbar (~> 1.7)
unicode-display_width (>= 2.4.0, < 4.0)
rubocop-ast (1.39.0)
parser (>= 3.3.1.0)
rubocop-capybara (2.22.1)
lint_roller (~> 1.1)
rubocop (~> 1.72, >= 1.72.1)
rubocop-packaging (0.5.2)
rubocop (>= 1.33, < 2.0)
rubocop-performance (1.24.0)
lint_roller (~> 1.1)
rubocop (>= 1.72.1, < 2.0)
rubocop-ast (>= 1.38.0, < 2.0)
rubocop-rails (2.30.3)
activesupport (>= 4.2.0)
lint_roller (~> 1.1)
rack (>= 1.1)
rubocop (>= 1.72.1, < 2.0)
rubocop-ast (>= 1.38.0, < 2.0)
rubocop-rspec (3.5.0)
lint_roller (~> 1.1)
rubocop (~> 1.72, >= 1.72.1)
rubocop-rspec_rails (2.31.0)
lint_roller (~> 1.1)
rubocop (~> 1.72, >= 1.72.1)
rubocop-rspec (~> 3.5)
ruby-progressbar (1.13.0)
ruby2_keywords (0.0.5)
ruby_parser (3.21.1)
racc (~> 1.5)
sexp_processor (~> 4.16)
sassc (2.4.0)
ffi (~> 1.9)
securerandom (0.4.1)
sexp_processor (4.17.3)
sprockets (4.2.1)
concurrent-ruby (~> 1.0)
rack (>= 2.2.4, < 4)
sprockets-rails (3.5.2)
actionpack (>= 6.1)
activesupport (>= 6.1)
sprockets (>= 3.0.0)
sqlite3 (2.6.0-arm64-darwin)
sqlite3 (2.6.0-x86_64-linux-gnu)
stringio (3.1.5)
thor (1.3.2)
timeout (0.4.3)
tzinfo (2.0.6)
concurrent-ruby (~> 1.0)
unicode-display_width (3.1.4)
unicode-emoji (~> 4.0, >= 4.0.4)
unicode-emoji (4.0.4)
webrick (1.9.1)
websocket-driver (0.7.7)
base64
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.5)
xpath (3.2.0)
nokogiri (~> 1.8)
zeitwerk (2.6.18)
PLATFORMS
arm64-darwin-23
x86_64-linux
DEPENDENCIES
activeadmin
activeadmin_quill_editor!
appraisal (~> 2.4)
bigdecimal
capybara
cuprite
fasterer
mutex_m
pry-rails
puma
rails (~> 7.1.0)
rspec-rails
rspec-retry
rspec_junit_formatter
rubocop
rubocop-capybara
rubocop-packaging
rubocop-performance
rubocop-rails
rubocop-rspec
rubocop-rspec_rails
sassc
sprockets-rails
sqlite3
BUNDLED WITH
2.4.19

Просмотреть файл

@@ -1,28 +0,0 @@
# This file was generated by Appraisal
source "https://rubygems.org"
gem "sqlite3"
gem "bigdecimal"
gem "mutex_m"
gem "puma"
gem "sassc"
gem "sprockets-rails"
gem "capybara"
gem "cuprite"
gem "rspec_junit_formatter"
gem "rspec-rails"
gem "rspec-retry"
gem "fasterer"
gem "rubocop"
gem "rubocop-capybara"
gem "rubocop-packaging"
gem "rubocop-performance"
gem "rubocop-rails"
gem "rubocop-rspec"
gem "rubocop-rspec_rails"
gem "pry-rails"
gem "activeadmin"
gem "rails", "~> 7.2.0"
gemspec path: "../"

Просмотреть файл

@@ -1,426 +0,0 @@
PATH
remote: ..
specs:
activeadmin_quill_editor (1.3.0)
activeadmin (>= 2.9, < 4)
GEM
remote: https://rubygems.org/
specs:
actioncable (7.2.2.1)
actionpack (= 7.2.2.1)
activesupport (= 7.2.2.1)
nio4r (~> 2.0)
websocket-driver (>= 0.6.1)
zeitwerk (~> 2.6)
actionmailbox (7.2.2.1)
actionpack (= 7.2.2.1)
activejob (= 7.2.2.1)
activerecord (= 7.2.2.1)
activestorage (= 7.2.2.1)
activesupport (= 7.2.2.1)
mail (>= 2.8.0)
actionmailer (7.2.2.1)
actionpack (= 7.2.2.1)
actionview (= 7.2.2.1)
activejob (= 7.2.2.1)
activesupport (= 7.2.2.1)
mail (>= 2.8.0)
rails-dom-testing (~> 2.2)
actionpack (7.2.2.1)
actionview (= 7.2.2.1)
activesupport (= 7.2.2.1)
nokogiri (>= 1.8.5)
racc
rack (>= 2.2.4, < 3.2)
rack-session (>= 1.0.1)
rack-test (>= 0.6.3)
rails-dom-testing (~> 2.2)
rails-html-sanitizer (~> 1.6)
useragent (~> 0.16)
actiontext (7.2.2.1)
actionpack (= 7.2.2.1)
activerecord (= 7.2.2.1)
activestorage (= 7.2.2.1)
activesupport (= 7.2.2.1)
globalid (>= 0.6.0)
nokogiri (>= 1.8.5)
actionview (7.2.2.1)
activesupport (= 7.2.2.1)
builder (~> 3.1)
erubi (~> 1.11)
rails-dom-testing (~> 2.2)
rails-html-sanitizer (~> 1.6)
activeadmin (3.3.0)
arbre (~> 1.2, >= 1.2.1)
csv
formtastic (>= 3.1)
formtastic_i18n (>= 0.4)
inherited_resources (~> 1.7)
jquery-rails (>= 4.2)
kaminari (>= 1.2.1)
railties (>= 6.1)
ransack (>= 4.0)
activejob (7.2.2.1)
activesupport (= 7.2.2.1)
globalid (>= 0.3.6)
activemodel (7.2.2.1)
activesupport (= 7.2.2.1)
activerecord (7.2.2.1)
activemodel (= 7.2.2.1)
activesupport (= 7.2.2.1)
timeout (>= 0.4.0)
activestorage (7.2.2.1)
actionpack (= 7.2.2.1)
activejob (= 7.2.2.1)
activerecord (= 7.2.2.1)
activesupport (= 7.2.2.1)
marcel (~> 1.0)
activesupport (7.2.2.1)
base64
benchmark (>= 0.3)
bigdecimal
concurrent-ruby (~> 1.0, >= 1.3.1)
connection_pool (>= 2.2.5)
drb
i18n (>= 1.6, < 2)
logger (>= 1.4.2)
minitest (>= 5.1)
securerandom (>= 0.3)
tzinfo (~> 2.0, >= 2.0.5)
addressable (2.8.7)
public_suffix (>= 2.0.2, < 7.0)
appraisal (2.5.0)
bundler
rake
thor (>= 0.14.0)
arbre (1.7.0)
activesupport (>= 3.0.0)
ruby2_keywords (>= 0.0.2)
ast (2.4.2)
base64 (0.2.0)
benchmark (0.4.0)
bigdecimal (3.1.9)
builder (3.3.0)
capybara (3.40.0)
addressable
matrix
mini_mime (>= 0.1.3)
nokogiri (~> 1.11)
rack (>= 1.6.0)
rack-test (>= 0.6.3)
regexp_parser (>= 1.5, < 3.0)
xpath (~> 3.2)
coderay (1.1.3)
concurrent-ruby (1.3.5)
connection_pool (2.5.0)
crass (1.0.6)
csv (3.3.2)
cuprite (0.15.1)
capybara (~> 3.0)
ferrum (~> 0.15.0)
date (3.4.1)
diff-lcs (1.6.0)
drb (2.2.1)
erubi (1.13.1)
fasterer (0.11.0)
ruby_parser (>= 3.19.1)
ferrum (0.15)
addressable (~> 2.5)
concurrent-ruby (~> 1.1)
webrick (~> 1.7)
websocket-driver (~> 0.7)
ffi (1.17.1-aarch64-linux-gnu)
ffi (1.17.1-aarch64-linux-musl)
ffi (1.17.1-arm-linux-gnu)
ffi (1.17.1-arm-linux-musl)
ffi (1.17.1-arm64-darwin)
ffi (1.17.1-x86_64-darwin)
ffi (1.17.1-x86_64-linux-gnu)
ffi (1.17.1-x86_64-linux-musl)
formtastic (5.0.0)
actionpack (>= 6.0.0)
formtastic_i18n (0.7.0)
globalid (1.2.1)
activesupport (>= 6.1)
has_scope (0.8.2)
actionpack (>= 5.2)
activesupport (>= 5.2)
i18n (1.14.7)
concurrent-ruby (~> 1.0)
inherited_resources (1.14.0)
actionpack (>= 6.0)
has_scope (>= 0.6)
railties (>= 6.0)
responders (>= 2)
io-console (0.8.0)
irb (1.15.1)
pp (>= 0.6.0)
rdoc (>= 4.0.0)
reline (>= 0.4.2)
jquery-rails (4.6.0)
rails-dom-testing (>= 1, < 3)
railties (>= 4.2.0)
thor (>= 0.14, < 2.0)
json (2.10.2)
kaminari (1.2.2)
activesupport (>= 4.1.0)
kaminari-actionview (= 1.2.2)
kaminari-activerecord (= 1.2.2)
kaminari-core (= 1.2.2)
kaminari-actionview (1.2.2)
actionview
kaminari-core (= 1.2.2)
kaminari-activerecord (1.2.2)
activerecord
kaminari-core (= 1.2.2)
kaminari-core (1.2.2)
language_server-protocol (3.17.0.4)
lint_roller (1.1.0)
logger (1.6.6)
loofah (2.24.0)
crass (~> 1.0.2)
nokogiri (>= 1.12.0)
mail (2.8.1)
mini_mime (>= 0.1.1)
net-imap
net-pop
net-smtp
marcel (1.0.4)
matrix (0.4.2)
method_source (1.1.0)
mini_mime (1.1.5)
minitest (5.25.5)
mutex_m (0.3.0)
net-imap (0.5.6)
date
net-protocol
net-pop (0.1.2)
net-protocol
net-protocol (0.2.2)
timeout
net-smtp (0.5.1)
net-protocol
nio4r (2.7.4)
nokogiri (1.18.4-aarch64-linux-gnu)
racc (~> 1.4)
nokogiri (1.18.4-aarch64-linux-musl)
racc (~> 1.4)
nokogiri (1.18.4-arm-linux-gnu)
racc (~> 1.4)
nokogiri (1.18.4-arm-linux-musl)
racc (~> 1.4)
nokogiri (1.18.4-arm64-darwin)
racc (~> 1.4)
nokogiri (1.18.4-x86_64-darwin)
racc (~> 1.4)
nokogiri (1.18.4-x86_64-linux-gnu)
racc (~> 1.4)
nokogiri (1.18.4-x86_64-linux-musl)
racc (~> 1.4)
parallel (1.26.3)
parser (3.3.7.1)
ast (~> 2.4.1)
racc
pp (0.6.2)
prettyprint
prettyprint (0.2.0)
pry (0.15.2)
coderay (~> 1.1)
method_source (~> 1.0)
pry-rails (0.3.11)
pry (>= 0.13.0)
psych (5.2.3)
date
stringio
public_suffix (6.0.1)
puma (6.6.0)
nio4r (~> 2.0)
racc (1.8.1)
rack (3.1.12)
rack-session (2.1.0)
base64 (>= 0.1.0)
rack (>= 3.0.0)
rack-test (2.2.0)
rack (>= 1.3)
rackup (2.2.1)
rack (>= 3)
rails (7.2.2.1)
actioncable (= 7.2.2.1)
actionmailbox (= 7.2.2.1)
actionmailer (= 7.2.2.1)
actionpack (= 7.2.2.1)
actiontext (= 7.2.2.1)
actionview (= 7.2.2.1)
activejob (= 7.2.2.1)
activemodel (= 7.2.2.1)
activerecord (= 7.2.2.1)
activestorage (= 7.2.2.1)
activesupport (= 7.2.2.1)
bundler (>= 1.15.0)
railties (= 7.2.2.1)
rails-dom-testing (2.2.0)
activesupport (>= 5.0.0)
minitest
nokogiri (>= 1.6)
rails-html-sanitizer (1.6.2)
loofah (~> 2.21)
nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0)
railties (7.2.2.1)
actionpack (= 7.2.2.1)
activesupport (= 7.2.2.1)
irb (~> 1.13)
rackup (>= 1.0.0)
rake (>= 12.2)
thor (~> 1.0, >= 1.2.2)
zeitwerk (~> 2.6)
rainbow (3.1.1)
rake (13.2.1)
ransack (4.3.0)
activerecord (>= 6.1.5)
activesupport (>= 6.1.5)
i18n
rdoc (6.12.0)
psych (>= 4.0.0)
regexp_parser (2.10.0)
reline (0.6.0)
io-console (~> 0.5)
responders (3.1.1)
actionpack (>= 5.2)
railties (>= 5.2)
rspec-core (3.13.3)
rspec-support (~> 3.13.0)
rspec-expectations (3.13.3)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.13.0)
rspec-mocks (3.13.2)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.13.0)
rspec-rails (7.1.1)
actionpack (>= 7.0)
activesupport (>= 7.0)
railties (>= 7.0)
rspec-core (~> 3.13)
rspec-expectations (~> 3.13)
rspec-mocks (~> 3.13)
rspec-support (~> 3.13)
rspec-retry (0.6.2)
rspec-core (> 3.3)
rspec-support (3.13.2)
rspec_junit_formatter (0.6.0)
rspec-core (>= 2, < 4, != 2.12.0)
rubocop (1.74.0)
json (~> 2.3)
language_server-protocol (~> 3.17.0.2)
lint_roller (~> 1.1.0)
parallel (~> 1.10)
parser (>= 3.3.0.2)
rainbow (>= 2.2.2, < 4.0)
regexp_parser (>= 2.9.3, < 3.0)
rubocop-ast (>= 1.38.0, < 2.0)
ruby-progressbar (~> 1.7)
unicode-display_width (>= 2.4.0, < 4.0)
rubocop-ast (1.39.0)
parser (>= 3.3.1.0)
rubocop-capybara (2.22.1)
lint_roller (~> 1.1)
rubocop (~> 1.72, >= 1.72.1)
rubocop-packaging (0.5.2)
rubocop (>= 1.33, < 2.0)
rubocop-performance (1.24.0)
lint_roller (~> 1.1)
rubocop (>= 1.72.1, < 2.0)
rubocop-ast (>= 1.38.0, < 2.0)
rubocop-rails (2.30.3)
activesupport (>= 4.2.0)
lint_roller (~> 1.1)
rack (>= 1.1)
rubocop (>= 1.72.1, < 2.0)
rubocop-ast (>= 1.38.0, < 2.0)
rubocop-rspec (3.5.0)
lint_roller (~> 1.1)
rubocop (~> 1.72, >= 1.72.1)
rubocop-rspec_rails (2.31.0)
lint_roller (~> 1.1)
rubocop (~> 1.72, >= 1.72.1)
rubocop-rspec (~> 3.5)
ruby-progressbar (1.13.0)
ruby2_keywords (0.0.5)
ruby_parser (3.21.1)
racc (~> 1.5)
sexp_processor (~> 4.16)
sassc (2.4.0)
ffi (~> 1.9)
securerandom (0.4.1)
sexp_processor (4.17.3)
sprockets (4.2.1)
concurrent-ruby (~> 1.0)
rack (>= 2.2.4, < 4)
sprockets-rails (3.5.2)
actionpack (>= 6.1)
activesupport (>= 6.1)
sprockets (>= 3.0.0)
sqlite3 (2.6.0-aarch64-linux-gnu)
sqlite3 (2.6.0-aarch64-linux-musl)
sqlite3 (2.6.0-arm-linux-gnu)
sqlite3 (2.6.0-arm-linux-musl)
sqlite3 (2.6.0-arm64-darwin)
sqlite3 (2.6.0-x86_64-darwin)
sqlite3 (2.6.0-x86_64-linux-gnu)
sqlite3 (2.6.0-x86_64-linux-musl)
stringio (3.1.5)
thor (1.3.2)
timeout (0.4.3)
tzinfo (2.0.6)
concurrent-ruby (~> 1.0)
unicode-display_width (3.1.4)
unicode-emoji (~> 4.0, >= 4.0.4)
unicode-emoji (4.0.4)
useragent (0.16.11)
webrick (1.9.1)
websocket-driver (0.7.7)
base64
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.5)
xpath (3.2.0)
nokogiri (~> 1.8)
zeitwerk (2.6.18)
PLATFORMS
aarch64-linux-gnu
aarch64-linux-musl
arm-linux-gnu
arm-linux-musl
arm64-darwin
x86_64-darwin
x86_64-linux-gnu
x86_64-linux-musl
DEPENDENCIES
activeadmin
activeadmin_quill_editor!
appraisal (~> 2.4)
bigdecimal
capybara
cuprite
fasterer
mutex_m
pry-rails
puma
rails (~> 7.2.0)
rspec-rails
rspec-retry
rspec_junit_formatter
rubocop
rubocop-capybara
rubocop-packaging
rubocop-performance
rubocop-rails
rubocop-rspec
rubocop-rspec_rails
sassc
sprockets-rails
sqlite3
BUNDLED WITH
2.6.6

Просмотреть файл

@@ -1,28 +0,0 @@
# This file was generated by Appraisal
source "https://rubygems.org"
gem "sqlite3"
gem "bigdecimal"
gem "mutex_m"
gem "puma"
gem "sassc"
gem "sprockets-rails"
gem "capybara"
gem "cuprite"
gem "rspec_junit_formatter"
gem "rspec-rails"
gem "rspec-retry"
gem "fasterer"
gem "rubocop"
gem "rubocop-capybara"
gem "rubocop-packaging"
gem "rubocop-performance"
gem "rubocop-rails"
gem "rubocop-rspec"
gem "rubocop-rspec_rails"
gem "pry-rails"
gem "activeadmin"
gem "rails", "~> 8.0.0"
gemspec path: "../"

Просмотреть файл

@@ -1,427 +0,0 @@
PATH
remote: ..
specs:
activeadmin_quill_editor (1.3.0)
activeadmin (>= 2.9, < 4)
GEM
remote: https://rubygems.org/
specs:
actioncable (8.0.2)
actionpack (= 8.0.2)
activesupport (= 8.0.2)
nio4r (~> 2.0)
websocket-driver (>= 0.6.1)
zeitwerk (~> 2.6)
actionmailbox (8.0.2)
actionpack (= 8.0.2)
activejob (= 8.0.2)
activerecord (= 8.0.2)
activestorage (= 8.0.2)
activesupport (= 8.0.2)
mail (>= 2.8.0)
actionmailer (8.0.2)
actionpack (= 8.0.2)
actionview (= 8.0.2)
activejob (= 8.0.2)
activesupport (= 8.0.2)
mail (>= 2.8.0)
rails-dom-testing (~> 2.2)
actionpack (8.0.2)
actionview (= 8.0.2)
activesupport (= 8.0.2)
nokogiri (>= 1.8.5)
rack (>= 2.2.4)
rack-session (>= 1.0.1)
rack-test (>= 0.6.3)
rails-dom-testing (~> 2.2)
rails-html-sanitizer (~> 1.6)
useragent (~> 0.16)
actiontext (8.0.2)
actionpack (= 8.0.2)
activerecord (= 8.0.2)
activestorage (= 8.0.2)
activesupport (= 8.0.2)
globalid (>= 0.6.0)
nokogiri (>= 1.8.5)
actionview (8.0.2)
activesupport (= 8.0.2)
builder (~> 3.1)
erubi (~> 1.11)
rails-dom-testing (~> 2.2)
rails-html-sanitizer (~> 1.6)
activeadmin (3.3.0)
arbre (~> 1.2, >= 1.2.1)
csv
formtastic (>= 3.1)
formtastic_i18n (>= 0.4)
inherited_resources (~> 1.7)
jquery-rails (>= 4.2)
kaminari (>= 1.2.1)
railties (>= 6.1)
ransack (>= 4.0)
activejob (8.0.2)
activesupport (= 8.0.2)
globalid (>= 0.3.6)
activemodel (8.0.2)
activesupport (= 8.0.2)
activerecord (8.0.2)
activemodel (= 8.0.2)
activesupport (= 8.0.2)
timeout (>= 0.4.0)
activestorage (8.0.2)
actionpack (= 8.0.2)
activejob (= 8.0.2)
activerecord (= 8.0.2)
activesupport (= 8.0.2)
marcel (~> 1.0)
activesupport (8.0.2)
base64
benchmark (>= 0.3)
bigdecimal
concurrent-ruby (~> 1.0, >= 1.3.1)
connection_pool (>= 2.2.5)
drb
i18n (>= 1.6, < 2)
logger (>= 1.4.2)
minitest (>= 5.1)
securerandom (>= 0.3)
tzinfo (~> 2.0, >= 2.0.5)
uri (>= 0.13.1)
addressable (2.8.7)
public_suffix (>= 2.0.2, < 7.0)
appraisal (2.5.0)
bundler
rake
thor (>= 0.14.0)
arbre (1.7.0)
activesupport (>= 3.0.0)
ruby2_keywords (>= 0.0.2)
ast (2.4.2)
base64 (0.2.0)
benchmark (0.4.0)
bigdecimal (3.1.9)
builder (3.3.0)
capybara (3.40.0)
addressable
matrix
mini_mime (>= 0.1.3)
nokogiri (~> 1.11)
rack (>= 1.6.0)
rack-test (>= 0.6.3)
regexp_parser (>= 1.5, < 3.0)
xpath (~> 3.2)
coderay (1.1.3)
concurrent-ruby (1.3.5)
connection_pool (2.5.0)
crass (1.0.6)
csv (3.3.2)
cuprite (0.15.1)
capybara (~> 3.0)
ferrum (~> 0.15.0)
date (3.4.1)
diff-lcs (1.6.0)
drb (2.2.1)
erubi (1.13.1)
fasterer (0.11.0)
ruby_parser (>= 3.19.1)
ferrum (0.15)
addressable (~> 2.5)
concurrent-ruby (~> 1.1)
webrick (~> 1.7)
websocket-driver (~> 0.7)
ffi (1.17.1-aarch64-linux-gnu)
ffi (1.17.1-aarch64-linux-musl)
ffi (1.17.1-arm-linux-gnu)
ffi (1.17.1-arm-linux-musl)
ffi (1.17.1-arm64-darwin)
ffi (1.17.1-x86_64-darwin)
ffi (1.17.1-x86_64-linux-gnu)
ffi (1.17.1-x86_64-linux-musl)
formtastic (5.0.0)
actionpack (>= 6.0.0)
formtastic_i18n (0.7.0)
globalid (1.2.1)
activesupport (>= 6.1)
has_scope (0.8.2)
actionpack (>= 5.2)
activesupport (>= 5.2)
i18n (1.14.7)
concurrent-ruby (~> 1.0)
inherited_resources (1.14.0)
actionpack (>= 6.0)
has_scope (>= 0.6)
railties (>= 6.0)
responders (>= 2)
io-console (0.8.0)
irb (1.15.1)
pp (>= 0.6.0)
rdoc (>= 4.0.0)
reline (>= 0.4.2)
jquery-rails (4.6.0)
rails-dom-testing (>= 1, < 3)
railties (>= 4.2.0)
thor (>= 0.14, < 2.0)
json (2.10.2)
kaminari (1.2.2)
activesupport (>= 4.1.0)
kaminari-actionview (= 1.2.2)
kaminari-activerecord (= 1.2.2)
kaminari-core (= 1.2.2)
kaminari-actionview (1.2.2)
actionview
kaminari-core (= 1.2.2)
kaminari-activerecord (1.2.2)
activerecord
kaminari-core (= 1.2.2)
kaminari-core (1.2.2)
language_server-protocol (3.17.0.4)
lint_roller (1.1.0)
logger (1.6.6)
loofah (2.24.0)
crass (~> 1.0.2)
nokogiri (>= 1.12.0)
mail (2.8.1)
mini_mime (>= 0.1.1)
net-imap
net-pop
net-smtp
marcel (1.0.4)
matrix (0.4.2)
method_source (1.1.0)
mini_mime (1.1.5)
minitest (5.25.5)
mutex_m (0.3.0)
net-imap (0.5.6)
date
net-protocol
net-pop (0.1.2)
net-protocol
net-protocol (0.2.2)
timeout
net-smtp (0.5.1)
net-protocol
nio4r (2.7.4)
nokogiri (1.18.4-aarch64-linux-gnu)
racc (~> 1.4)
nokogiri (1.18.4-aarch64-linux-musl)
racc (~> 1.4)
nokogiri (1.18.4-arm-linux-gnu)
racc (~> 1.4)
nokogiri (1.18.4-arm-linux-musl)
racc (~> 1.4)
nokogiri (1.18.4-arm64-darwin)
racc (~> 1.4)
nokogiri (1.18.4-x86_64-darwin)
racc (~> 1.4)
nokogiri (1.18.4-x86_64-linux-gnu)
racc (~> 1.4)
nokogiri (1.18.4-x86_64-linux-musl)
racc (~> 1.4)
parallel (1.26.3)
parser (3.3.7.1)
ast (~> 2.4.1)
racc
pp (0.6.2)
prettyprint
prettyprint (0.2.0)
pry (0.15.2)
coderay (~> 1.1)
method_source (~> 1.0)
pry-rails (0.3.11)
pry (>= 0.13.0)
psych (5.2.3)
date
stringio
public_suffix (6.0.1)
puma (6.6.0)
nio4r (~> 2.0)
racc (1.8.1)
rack (3.1.12)
rack-session (2.1.0)
base64 (>= 0.1.0)
rack (>= 3.0.0)
rack-test (2.2.0)
rack (>= 1.3)
rackup (2.2.1)
rack (>= 3)
rails (8.0.2)
actioncable (= 8.0.2)
actionmailbox (= 8.0.2)
actionmailer (= 8.0.2)
actionpack (= 8.0.2)
actiontext (= 8.0.2)
actionview (= 8.0.2)
activejob (= 8.0.2)
activemodel (= 8.0.2)
activerecord (= 8.0.2)
activestorage (= 8.0.2)
activesupport (= 8.0.2)
bundler (>= 1.15.0)
railties (= 8.0.2)
rails-dom-testing (2.2.0)
activesupport (>= 5.0.0)
minitest
nokogiri (>= 1.6)
rails-html-sanitizer (1.6.2)
loofah (~> 2.21)
nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0)
railties (8.0.2)
actionpack (= 8.0.2)
activesupport (= 8.0.2)
irb (~> 1.13)
rackup (>= 1.0.0)
rake (>= 12.2)
thor (~> 1.0, >= 1.2.2)
zeitwerk (~> 2.6)
rainbow (3.1.1)
rake (13.2.1)
ransack (4.3.0)
activerecord (>= 6.1.5)
activesupport (>= 6.1.5)
i18n
rdoc (6.12.0)
psych (>= 4.0.0)
regexp_parser (2.10.0)
reline (0.6.0)
io-console (~> 0.5)
responders (3.1.1)
actionpack (>= 5.2)
railties (>= 5.2)
rspec-core (3.13.3)
rspec-support (~> 3.13.0)
rspec-expectations (3.13.3)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.13.0)
rspec-mocks (3.13.2)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.13.0)
rspec-rails (7.1.1)
actionpack (>= 7.0)
activesupport (>= 7.0)
railties (>= 7.0)
rspec-core (~> 3.13)
rspec-expectations (~> 3.13)
rspec-mocks (~> 3.13)
rspec-support (~> 3.13)
rspec-retry (0.6.2)
rspec-core (> 3.3)
rspec-support (3.13.2)
rspec_junit_formatter (0.6.0)
rspec-core (>= 2, < 4, != 2.12.0)
rubocop (1.74.0)
json (~> 2.3)
language_server-protocol (~> 3.17.0.2)
lint_roller (~> 1.1.0)
parallel (~> 1.10)
parser (>= 3.3.0.2)
rainbow (>= 2.2.2, < 4.0)
regexp_parser (>= 2.9.3, < 3.0)
rubocop-ast (>= 1.38.0, < 2.0)
ruby-progressbar (~> 1.7)
unicode-display_width (>= 2.4.0, < 4.0)
rubocop-ast (1.39.0)
parser (>= 3.3.1.0)
rubocop-capybara (2.22.1)
lint_roller (~> 1.1)
rubocop (~> 1.72, >= 1.72.1)
rubocop-packaging (0.5.2)
rubocop (>= 1.33, < 2.0)
rubocop-performance (1.24.0)
lint_roller (~> 1.1)
rubocop (>= 1.72.1, < 2.0)
rubocop-ast (>= 1.38.0, < 2.0)
rubocop-rails (2.30.3)
activesupport (>= 4.2.0)
lint_roller (~> 1.1)
rack (>= 1.1)
rubocop (>= 1.72.1, < 2.0)
rubocop-ast (>= 1.38.0, < 2.0)
rubocop-rspec (3.5.0)
lint_roller (~> 1.1)
rubocop (~> 1.72, >= 1.72.1)
rubocop-rspec_rails (2.31.0)
lint_roller (~> 1.1)
rubocop (~> 1.72, >= 1.72.1)
rubocop-rspec (~> 3.5)
ruby-progressbar (1.13.0)
ruby2_keywords (0.0.5)
ruby_parser (3.21.1)
racc (~> 1.5)
sexp_processor (~> 4.16)
sassc (2.4.0)
ffi (~> 1.9)
securerandom (0.4.1)
sexp_processor (4.17.3)
sprockets (4.2.1)
concurrent-ruby (~> 1.0)
rack (>= 2.2.4, < 4)
sprockets-rails (3.5.2)
actionpack (>= 6.1)
activesupport (>= 6.1)
sprockets (>= 3.0.0)
sqlite3 (2.6.0-aarch64-linux-gnu)
sqlite3 (2.6.0-aarch64-linux-musl)
sqlite3 (2.6.0-arm-linux-gnu)
sqlite3 (2.6.0-arm-linux-musl)
sqlite3 (2.6.0-arm64-darwin)
sqlite3 (2.6.0-x86_64-darwin)
sqlite3 (2.6.0-x86_64-linux-gnu)
sqlite3 (2.6.0-x86_64-linux-musl)
stringio (3.1.5)
thor (1.3.2)
timeout (0.4.3)
tzinfo (2.0.6)
concurrent-ruby (~> 1.0)
unicode-display_width (3.1.4)
unicode-emoji (~> 4.0, >= 4.0.4)
unicode-emoji (4.0.4)
uri (1.0.3)
useragent (0.16.11)
webrick (1.9.1)
websocket-driver (0.7.7)
base64
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.5)
xpath (3.2.0)
nokogiri (~> 1.8)
zeitwerk (2.7.2)
PLATFORMS
aarch64-linux-gnu
aarch64-linux-musl
arm-linux-gnu
arm-linux-musl
arm64-darwin
x86_64-darwin
x86_64-linux-gnu
x86_64-linux-musl
DEPENDENCIES
activeadmin
activeadmin_quill_editor!
appraisal (~> 2.4)
bigdecimal
capybara
cuprite
fasterer
mutex_m
pry-rails
puma
rails (~> 8.0.0)
rspec-rails
rspec-retry
rspec_junit_formatter
rubocop
rubocop-capybara
rubocop-packaging
rubocop-performance
rubocop-rails
rubocop-rspec
rubocop-rspec_rails
sassc
sprockets-rails
sqlite3
BUNDLED WITH
2.6.6

Просмотреть файл

@@ -2,7 +2,7 @@
module ActiveAdmin module ActiveAdmin
module QuillEditor module QuillEditor
VERSION = '1.3.0' VERSION = '2.0.0'
QUILL_VERSION = '1.3.7' QUILL_VERSION = '2.0.3'
end end
end end

Просмотреть файл

@@ -1,6 +1,6 @@
{ {
"name": "activeadmin_quill_editor", "name": "activeadmin_quill_editor",
"version": "1.3.0", "version": "2.0.0",
"description": "Quill Editor for ActiveAdmin", "description": "Quill Editor for ActiveAdmin",
"author": "Mattia Roccoberton <mat@blocknot.es>", "author": "Mattia Roccoberton <mat@blocknot.es>",
"license": "MIT", "license": "MIT",

Просмотреть файл

@@ -3,6 +3,12 @@
ActiveAdmin.register Post do ActiveAdmin.register Post do
permit_params :author_id, :title, :summary, :description, :category, :dt, :position, :published, tag_ids: [] permit_params :author_id, :title, :summary, :description, :category, :dt, :position, :published, tag_ids: []
member_action :upload, method: [:post] do
result = { success: resource.images.attach(params[:file_upload]) }
result[:url] = url_for(resource.images.last) if result[:success]
render json: result
end
index do index do
selectable_column selectable_column
id_column id_column
@@ -44,7 +50,12 @@ ActiveAdmin.register Post do
f.input :author f.input :author
f.input :title f.input :title
f.input :summary, as: :quill_editor, input_html: { data: { options: { modules: { toolbar: toolbar } } } } f.input :summary, as: :quill_editor, input_html: { data: { options: { modules: { toolbar: toolbar } } } }
f.input :description, as: :quill_editor, input_html: { data: { options: { modules: { toolbar: toolbar } } } } if object.new_record?
f.input :description, as: :quill_editor # using default options
else
plugin_opts = { image_uploader: { server_url: upload_admin_post_path(object.id), field_name: 'file_upload' } }
f.input :description, as: :quill_editor, input_html: { data: { plugins: plugin_opts } }
end
f.input :category f.input :category
f.input :dt f.input :dt
f.input :position f.input :position

Просмотреть файл

@@ -1,4 +1,5 @@
# frozen_string_literal: true # frozen_string_literal: true
ActiveAdmin.register Tag do ActiveAdmin.register Tag do
permit_params :name
end end

Просмотреть файл

@@ -2,3 +2,5 @@
//= require activeadmin/quill_editor/quill //= require activeadmin/quill_editor/quill
//= require activeadmin/quill_editor_input //= require activeadmin/quill_editor_input
//= require activeadmin/quill.imageUploader.min

Просмотреть файл

@@ -14,6 +14,8 @@
@import 'activeadmin/quill_editor/quill.snow'; @import 'activeadmin/quill_editor/quill.snow';
@import 'activeadmin/quill_editor_input'; @import 'activeadmin/quill_editor_input';
@import 'activeadmin/quill.imageUploader.min';
// Overriding any non-variable SASS must be done after the fact. // Overriding any non-variable SASS must be done after the fact.
// For example, to change the default status-tag color: // For example, to change the default status-tag color:
// //

Просмотреть файл

@@ -1,8 +1,6 @@
# frozen_string_literal: true # frozen_string_literal: true
class Post < ApplicationRecord class Post < ApplicationRecord
# enum state: %i[available unavailable arriving]
belongs_to :author, inverse_of: :posts, autosave: true belongs_to :author, inverse_of: :posts, autosave: true
has_one :author_profile, through: :author, source: :profile has_one :author_profile, through: :author, source: :profile
@@ -28,12 +26,12 @@ class Post < ApplicationRecord
end end
class << self class << self
def ransackable_attributes(auth_object = nil) def ransackable_associations(_auth_object = nil)
%w[author_id category created_at description dt id position published summary title updated_at] %w[author author_profile post_tags tags images_attachments images_blobs]
end end
def ransackable_associations(auth_object = nil) def ransackable_attributes(_auth_object = nil)
%w[author author_profile images_attachments images_blobs post_tags tags] %w[author_id category created_at description dt id position published title summary updated_at]
end end
end end
end end

Просмотреть файл

@@ -3,14 +3,12 @@
class Profile < ApplicationRecord class Profile < ApplicationRecord
belongs_to :author, inverse_of: :profile, touch: true belongs_to :author, inverse_of: :profile, touch: true
# has_rich_text :description def to_s
description
# def to_s end
# description
# end
class << self class << self
def ransackable_associations(auth_object = nil) def ransackable_associations(_auth_object = nil)
%w[author] %w[author]
end end

Просмотреть файл

@@ -1,26 +1,23 @@
require_relative 'boot' require_relative 'boot'
require 'rails/all' require 'rails/all'
require 'sprockets/railtie'
Bundler.require(*Rails.groups) Bundler.require(*Rails.groups)
module Dummy module Dummy
class Application < Rails::Application class Application < Rails::Application
# Initialize configuration defaults for originally generated Rails version. config.load_defaults Rails::VERSION::STRING.to_f
config.load_defaults 6.0 if Rails::VERSION::MAJOR == 6
# Settings in config/environments/* take precedence over those specified here. config.active_support.deprecation = :raise
# Application configuration can go into files in config/initializers
# -- all .rb files in that directory are automatically loaded after loading
# the framework and any gems in your application.
### if Gem::Version.new(Rails.version) < Gem::Version.new('7.1')
config.active_record.legacy_connection_handling = false
config.active_record.legacy_connection_handling = false if Gem::Version.new(Rails.version) < Gem::Version.new('7.1') end
if Gem::Version.new(Rails.version) > Gem::Version.new('7.0')
config.before_configuration do config.before_configuration do
ActiveSupport::Cache.format_version = 7.0 if Gem::Version.new(Rails.version) > Gem::Version.new('7.0') ActiveSupport::Cache.format_version = 7.0
end
end end
end end
end end

Просмотреть файл

@@ -6,7 +6,7 @@ default: &default
development: development:
<<: *default <<: *default
database: db/development.sqlite3 database: db/development.sqlite3
schema_dump: schema_development.rb schema_dump: schema-dev.rb
test: test:
<<: *default <<: *default

Просмотреть файл

@@ -1,7 +1,9 @@
ActiveSupport::Reloader.to_prepare do Rails.application.reloader.to_prepare do
ActiveStorage::Attachment.class_eval do ActiveStorage::Attachment.class_eval do
def self.ransackable_attributes(auth_object = nil) class << self
def ransackable_attributes(auth_object = nil)
%w[blob_id created_at id name record_id record_type] %w[blob_id created_at id name record_id record_type]
end end
end end
end end
end

Просмотреть файл

@@ -1,27 +0,0 @@
# This migration comes from active_storage (originally 20170806125915)
class CreateActiveStorageTables < ActiveRecord::Migration[5.2]
def change
create_table :active_storage_blobs do |t|
t.string :key, null: false
t.string :filename, null: false
t.string :content_type
t.text :metadata
t.bigint :byte_size, null: false
t.string :checksum, null: false
t.datetime :created_at, null: false
t.index [ :key ], unique: true
end
create_table :active_storage_attachments do |t|
t.string :name, null: false
t.references :record, null: false, polymorphic: true, index: false
t.references :blob, null: false
t.datetime :created_at, null: false
t.index [ :record_type, :record_id, :name, :blob_id ], name: "index_active_storage_attachments_uniqueness", unique: true
t.foreign_key :active_storage_blobs, column: :blob_id
end
end
end

Просмотреть файл

@@ -1,3 +1,5 @@
# frozen_string_literal: true
class CreateActiveAdminComments < ActiveRecord::Migration[6.0] class CreateActiveAdminComments < ActiveRecord::Migration[6.0]
def self.up def self.up
create_table :active_admin_comments do |t| create_table :active_admin_comments do |t|

Просмотреть файл

@@ -0,0 +1,59 @@
# frozen_string_literal: true
# This migration comes from active_storage (originally 20170806125915)
class CreateActiveStorageTables < ActiveRecord::Migration[6.0]
def change
# Use Active Record's configured type for primary and foreign keys
primary_key_type, foreign_key_type = primary_and_foreign_key_types
create_table :active_storage_blobs, id: primary_key_type do |t|
t.string :key, null: false
t.string :filename, null: false
t.string :content_type
t.text :metadata
t.string :service_name, null: false
t.bigint :byte_size, null: false
t.string :checksum
if connection.supports_datetime_with_precision?
t.datetime :created_at, precision: 6, null: false
else
t.datetime :created_at, null: false
end
t.index [ :key ], unique: true
end
create_table :active_storage_attachments, id: primary_key_type do |t|
t.string :name, null: false
t.references :record, null: false, polymorphic: true, index: false, type: foreign_key_type
t.references :blob, null: false, type: foreign_key_type
if connection.supports_datetime_with_precision?
t.datetime :created_at, precision: 6, null: false
else
t.datetime :created_at, null: false
end
t.index [ :record_type, :record_id, :name, :blob_id ], name: :index_active_storage_attachments_uniqueness, unique: true
t.foreign_key :active_storage_blobs, column: :blob_id
end
create_table :active_storage_variant_records, id: primary_key_type do |t|
t.belongs_to :blob, null: false, index: false, type: foreign_key_type
t.string :variation_digest, null: false
t.index [ :blob_id, :variation_digest ], name: :index_active_storage_variant_records_uniqueness, unique: true
t.foreign_key :active_storage_blobs, column: :blob_id
end
end
private
def primary_and_foreign_key_types
config = Rails.configuration.generators
setting = config.options[config.orm][:primary_key_type]
primary_key_type = setting || :primary_key
foreign_key_type = setting || :bigint
[ primary_key_type, foreign_key_type ]
end
end

Просмотреть файл

@@ -1,6 +1,6 @@
# frozen_string_literal: true # frozen_string_literal: true
class CreateAuthors < ActiveRecord::Migration[5.2] class CreateAuthors < ActiveRecord::Migration[6.0]
def change def change
create_table :authors do |t| create_table :authors do |t|
t.string :name t.string :name

Просмотреть файл

@@ -1,6 +1,6 @@
# frozen_string_literal: true # frozen_string_literal: true
class CreateProfiles < ActiveRecord::Migration[5.2] class CreateProfiles < ActiveRecord::Migration[6.0]
def change def change
create_table :profiles do |t| create_table :profiles do |t|
t.text :description t.text :description

Просмотреть файл

@@ -1,6 +1,6 @@
# frozen_string_literal: true # frozen_string_literal: true
class CreateTags < ActiveRecord::Migration[5.2] class CreateTags < ActiveRecord::Migration[6.0]
def change def change
create_table :tags do |t| create_table :tags do |t|
t.string :name t.string :name

Просмотреть файл

@@ -1,6 +1,6 @@
# frozen_string_literal: true # frozen_string_literal: true
class CreatePostTags < ActiveRecord::Migration[5.2] class CreatePostTags < ActiveRecord::Migration[6.0]
def change def change
create_table :post_tags do |t| create_table :post_tags do |t|
t.belongs_to :post, foreign_key: true t.belongs_to :post, foreign_key: true

Просмотреть файл

@@ -1,6 +1,6 @@
# frozen_string_literal: true # frozen_string_literal: true
class CreatePosts < ActiveRecord::Migration[5.2] class CreatePosts < ActiveRecord::Migration[6.0]
def change def change
create_table :posts do |t| create_table :posts do |t|
t.string :title t.string :title

Просмотреть файл

@@ -11,16 +11,15 @@
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 2018_06_07_053739) do ActiveRecord::Schema.define(version: 2018_06_07_053739) do
create_table "active_admin_comments", force: :cascade do |t| create_table "active_admin_comments", force: :cascade do |t|
t.string "namespace" t.string "namespace"
t.text "body" t.text "body"
t.string "resource_type" t.string "resource_type"
t.bigint "resource_id" t.integer "resource_id"
t.string "author_type" t.string "author_type"
t.bigint "author_id" t.integer "author_id"
t.datetime "created_at", precision: 6, null: false t.datetime "created_at", null: false
t.datetime "updated_at", precision: 6, null: false t.datetime "updated_at", null: false
t.index ["author_type", "author_id"], name: "index_active_admin_comments_on_author_type_and_author_id" t.index ["author_type", "author_id"], name: "index_active_admin_comments_on_author_type_and_author_id"
t.index ["namespace"], name: "index_active_admin_comments_on_namespace" t.index ["namespace"], name: "index_active_admin_comments_on_namespace"
t.index ["resource_type", "resource_id"], name: "index_active_admin_comments_on_resource_type_and_resource_id" t.index ["resource_type", "resource_id"], name: "index_active_admin_comments_on_resource_type_and_resource_id"
@@ -29,8 +28,8 @@ ActiveRecord::Schema.define(version: 2018_06_07_053739) do
create_table "active_storage_attachments", force: :cascade do |t| create_table "active_storage_attachments", force: :cascade do |t|
t.string "name", null: false t.string "name", null: false
t.string "record_type", null: false t.string "record_type", null: false
t.integer "record_id", null: false t.bigint "record_id", null: false
t.integer "blob_id", null: false t.bigint "blob_id", null: false
t.datetime "created_at", null: false t.datetime "created_at", null: false
t.index ["blob_id"], name: "index_active_storage_attachments_on_blob_id" t.index ["blob_id"], name: "index_active_storage_attachments_on_blob_id"
t.index ["record_type", "record_id", "name", "blob_id"], name: "index_active_storage_attachments_uniqueness", unique: true t.index ["record_type", "record_id", "name", "blob_id"], name: "index_active_storage_attachments_uniqueness", unique: true
@@ -41,25 +40,32 @@ ActiveRecord::Schema.define(version: 2018_06_07_053739) do
t.string "filename", null: false t.string "filename", null: false
t.string "content_type" t.string "content_type"
t.text "metadata" t.text "metadata"
t.string "service_name", null: false
t.bigint "byte_size", null: false t.bigint "byte_size", null: false
t.string "checksum", null: false t.string "checksum"
t.datetime "created_at", null: false t.datetime "created_at", null: false
t.index ["key"], name: "index_active_storage_blobs_on_key", unique: true t.index ["key"], name: "index_active_storage_blobs_on_key", unique: true
end end
create_table "active_storage_variant_records", force: :cascade do |t|
t.bigint "blob_id", null: false
t.string "variation_digest", null: false
t.index ["blob_id", "variation_digest"], name: "index_active_storage_variant_records_uniqueness", unique: true
end
create_table "authors", force: :cascade do |t| create_table "authors", force: :cascade do |t|
t.string "name" t.string "name"
t.integer "age" t.integer "age"
t.string "email" t.string "email"
t.datetime "created_at", null: false t.datetime "created_at", precision: nil, null: false
t.datetime "updated_at", null: false t.datetime "updated_at", precision: nil, null: false
end end
create_table "post_tags", force: :cascade do |t| create_table "post_tags", force: :cascade do |t|
t.integer "post_id" t.integer "post_id"
t.integer "tag_id" t.integer "tag_id"
t.datetime "created_at", null: false t.datetime "created_at", precision: nil, null: false
t.datetime "updated_at", null: false t.datetime "updated_at", precision: nil, null: false
t.index ["post_id"], name: "index_post_tags_on_post_id" t.index ["post_id"], name: "index_post_tags_on_post_id"
t.index ["tag_id"], name: "index_post_tags_on_tag_id" t.index ["tag_id"], name: "index_post_tags_on_tag_id"
end end
@@ -70,29 +76,30 @@ ActiveRecord::Schema.define(version: 2018_06_07_053739) do
t.text "description" t.text "description"
t.integer "author_id" t.integer "author_id"
t.string "category" t.string "category"
t.datetime "dt" t.datetime "dt", precision: nil
t.float "position" t.float "position"
t.boolean "published" t.boolean "published"
t.datetime "created_at", null: false t.datetime "created_at", precision: nil, null: false
t.datetime "updated_at", null: false t.datetime "updated_at", precision: nil, null: false
t.index ["author_id"], name: "index_posts_on_author_id" t.index ["author_id"], name: "index_posts_on_author_id"
end end
create_table "profiles", force: :cascade do |t| create_table "profiles", force: :cascade do |t|
t.text "description" t.text "description"
t.integer "author_id" t.integer "author_id"
t.datetime "created_at", null: false t.datetime "created_at", precision: nil, null: false
t.datetime "updated_at", null: false t.datetime "updated_at", precision: nil, null: false
t.index ["author_id"], name: "index_profiles_on_author_id" t.index ["author_id"], name: "index_profiles_on_author_id"
end end
create_table "tags", force: :cascade do |t| create_table "tags", force: :cascade do |t|
t.string "name" t.string "name"
t.datetime "created_at", null: false t.datetime "created_at", precision: nil, null: false
t.datetime "updated_at", null: false t.datetime "updated_at", precision: nil, null: false
end end
add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id" add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id"
add_foreign_key "active_storage_variant_records", "active_storage_blobs", column: "blob_id"
add_foreign_key "post_tags", "posts" add_foreign_key "post_tags", "posts"
add_foreign_key "post_tags", "tags" add_foreign_key "post_tags", "tags"
add_foreign_key "posts", "authors" add_foreign_key "posts", "authors"

Просмотреть файл

@@ -1,99 +0,0 @@
# This file is auto-generated from the current state of the database. Instead
# of editing this file, please use the migrations feature of Active Record to
# incrementally modify your database, and then regenerate this schema definition.
#
# This file is the source Rails uses to define your schema when running `bin/rails
# db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to
# be faster and is potentially less error prone than running all of your
# migrations from scratch. Old migrations may fail to apply correctly if those
# migrations use external dependencies or application code.
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema[8.0].define(version: 2018_06_07_053739) do
create_table "active_admin_comments", force: :cascade do |t|
t.string "namespace"
t.text "body"
t.string "resource_type"
t.integer "resource_id"
t.string "author_type"
t.integer "author_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["author_type", "author_id"], name: "index_active_admin_comments_on_author_type_and_author_id"
t.index ["namespace"], name: "index_active_admin_comments_on_namespace"
t.index ["resource_type", "resource_id"], name: "index_active_admin_comments_on_resource_type_and_resource_id"
end
create_table "active_storage_attachments", force: :cascade do |t|
t.string "name", null: false
t.string "record_type", null: false
t.integer "record_id", null: false
t.integer "blob_id", null: false
t.datetime "created_at", precision: nil, null: false
t.index ["blob_id"], name: "index_active_storage_attachments_on_blob_id"
t.index ["record_type", "record_id", "name", "blob_id"], name: "index_active_storage_attachments_uniqueness", unique: true
end
create_table "active_storage_blobs", force: :cascade do |t|
t.string "key", null: false
t.string "filename", null: false
t.string "content_type"
t.text "metadata"
t.bigint "byte_size", null: false
t.string "checksum", null: false
t.datetime "created_at", precision: nil, null: false
t.index ["key"], name: "index_active_storage_blobs_on_key", unique: true
end
create_table "authors", force: :cascade do |t|
t.string "name"
t.integer "age"
t.string "email"
t.datetime "created_at", precision: nil, null: false
t.datetime "updated_at", precision: nil, null: false
end
create_table "post_tags", force: :cascade do |t|
t.integer "post_id"
t.integer "tag_id"
t.datetime "created_at", precision: nil, null: false
t.datetime "updated_at", precision: nil, null: false
t.index ["post_id"], name: "index_post_tags_on_post_id"
t.index ["tag_id"], name: "index_post_tags_on_tag_id"
end
create_table "posts", force: :cascade do |t|
t.string "title"
t.text "summary"
t.text "description"
t.integer "author_id"
t.string "category"
t.datetime "dt", precision: nil
t.float "position"
t.boolean "published"
t.datetime "created_at", precision: nil, null: false
t.datetime "updated_at", precision: nil, null: false
t.index ["author_id"], name: "index_posts_on_author_id"
end
create_table "profiles", force: :cascade do |t|
t.text "description"
t.integer "author_id"
t.datetime "created_at", precision: nil, null: false
t.datetime "updated_at", precision: nil, null: false
t.index ["author_id"], name: "index_profiles_on_author_id"
end
create_table "tags", force: :cascade do |t|
t.string "name"
t.datetime "created_at", precision: nil, null: false
t.datetime "updated_at", precision: nil, null: false
end
add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id"
add_foreign_key "post_tags", "posts"
add_foreign_key "post_tags", "tags"
add_foreign_key "posts", "authors"
add_foreign_key "profiles", "authors"
end

Просмотреть файл

@@ -1,22 +1,18 @@
# frozen_string_literal: true # frozen_string_literal: true
puts 'Seeds:'
puts 'Tags...'
(11..16).each do |i| (11..16).each do |i|
Tag.find_or_create_by!(name: "Tag #{i}") Tag.find_or_create_by!(name: "Tag #{i}")
end end
puts 'Authors...'
(11..20).each do |i| (11..20).each do |i|
age = 21 + 3 * (i - 10) age = 21 + 3 * (i - 10)
attrs = { name: "Author #{i}", age: age, email: "some@email#{i}.com" } attrs = { name: "Author #{i}", age: age, email: "some@email#{i}.com" }
Author.find_or_create_by!(attrs) do |author| Author.find_or_create_by!(name: "Author #{i}") do |author|
author.assign_attributes(attrs)
author.profile = Profile.new(description: "Profile description for Author #{i}") if (i % 3).zero? author.profile = Profile.new(description: "Profile description for Author #{i}") if (i % 3).zero?
end end
end end
puts 'Posts...'
authors = Author.pluck(:id) authors = Author.pluck(:id)
tags = Tag.where.not(name: 'A test tag').pluck(:id) tags = Tag.where.not(name: 'A test tag').pluck(:id)
(11..40).each do |i| (11..40).each do |i|
@@ -24,6 +20,8 @@ tags = Tag.where.not(name: 'A test tag').pluck(:id)
title: "Post #{i}", title: "Post #{i}",
author_id: authors.sample, author_id: authors.sample,
position: rand(100), position: rand(100),
summary: "<p><em>Summary</em> for post #{i}</p>",
description: "<p><strong>Some bold</strong> <em>Some italic</em> <u>Some underline</u> [#{i}]</p>",
created_at: Time.now - rand(3600).seconds created_at: Time.now - rand(3600).seconds
} }
attrs[:category] = 'news' if (i % 4).zero? attrs[:category] = 'news' if (i % 4).zero?
@@ -38,4 +36,4 @@ end
Author.find_or_create_by!(name: 'A test author', email: 'aaa@bbb.ccc', age: 30) Author.find_or_create_by!(name: 'A test author', email: 'aaa@bbb.ccc', age: 30)
Tag.find_or_create_by!(name: 'A test tag') Tag.find_or_create_by!(name: 'A test tag')
puts 'done.' puts '> Seeds: done.'

Просмотреть файл

@@ -1,7 +1,5 @@
# frozen_string_literal: true # frozen_string_literal: true
require_relative '../../base_page'
module Admin module Admin
module Authors module Authors
class EditPage < BasePage class EditPage < BasePage

Просмотреть файл

@@ -1,7 +1,5 @@
# frozen_string_literal: true # frozen_string_literal: true
require_relative '../../base_page'
module Admin module Admin
module Posts module Posts
class EditPage < BasePage class EditPage < BasePage

Просмотреть файл

@@ -12,4 +12,8 @@ class BasePage
def load def load
visit(path) visit(path)
end end
def lookup_editor(editor_container:)
@editor = Shared::QuillEditor.new(editor_container)
end
end end

Просмотреть файл

@@ -1,7 +1,6 @@
# frozen_string_literal: true # frozen_string_literal: true
require_relative '../base_object' module Shared
class HtmlEditor < BaseObject class HtmlEditor < BaseObject
def content_element def content_element
raise NotImplementedError raise NotImplementedError
@@ -33,3 +32,4 @@ class HtmlEditor < BaseObject
self self
end end
end end
end

Просмотреть файл

@@ -1,44 +1,64 @@
# frozen_string_literal: true # frozen_string_literal: true
module Shared
class QuillEditor < HtmlEditor class QuillEditor < HtmlEditor
SELECTOR = '.ql-container' attr_reader :editor_selector, :toolbar_selector
TOOLBAR_SELECTOR = '.ql-toolbar'
attr_reader :toolbar, :toolbar_selector def initialize(container)
@editor_selector = "#{container} .ql-container"
def initialize(selector: SELECTOR, toolbar_selector: TOOLBAR_SELECTOR) @toolbar_selector = "#{container} .ql-toolbar"
super(selector: selector) super(selector: editor_selector)
@toolbar = find(toolbar_selector)
@toolbar_selector = toolbar_selector
end end
def content = content_element['innerHTML']
def content_element def content_element
@content_element ||= find("#{selector} .ql-editor") @content_element ||= find("#{selector} .ql-editor")
end end
def control_selector(control) def open_dropdown(dropdown)
case control&.to_sym find("#{toolbar_selector} .ql-#{dropdown} .ql-picker-label").click
when :bold then "#{toolbar_selector} button.ql-bold" self
when :italic then "#{toolbar_selector} button.ql-italic"
when :underline then "#{toolbar_selector} button.ql-underline"
when :link then "#{toolbar_selector} button.ql-link"
else raise "Invalid control #{control}"
end
end end
def toggle_bold def toggle_bold
find(control_selector(:bold)).click find("#{toolbar_selector} button.ql-bold").click
end end
def toggle_italic def toggle_italic
find(control_selector(:italic)).click find("#{toolbar_selector} button.ql-italic").click
end end
def toggle_underline def toggle_underline
find(control_selector(:underline)).click find("#{toolbar_selector} button.ql-underline").click
end end
def toggle_link def toggle_link
find(control_selector(:link)).click find("#{toolbar_selector} button.ql-link").click
end
def toggle_blockquote
find("#{toolbar_selector} button.ql-blockquote").click
end
def toggle_code_block
find("#{toolbar_selector} button.ql-code-block").click
end
def toggle_sub
find("#{toolbar_selector} button.ql-script[value='sub']").click
end
def toggle_super
find("#{toolbar_selector} button.ql-script[value='super']").click
end
def toggle_align_right
find("#{toolbar_selector} .ql-picker-item[data-value='right']").click
end
def tooltip_editing
find("#{editor_selector} .ql-tooltip.ql-editing")
end
end end
end end

Просмотреть файл

@@ -1,25 +1,28 @@
# frozen_string_literal: true # frozen_string_literal: true
require 'super_diff/rspec'
require 'zeitwerk'
loader = Zeitwerk::Loader.new
loader.push_dir("#{__dir__}/page_objects")
loader.setup
require_relative 'spec_helper' require_relative 'spec_helper'
ENV['RAILS_ENV'] = 'test' ENV['RAILS_ENV'] = 'test'
require 'simplecov'
SimpleCov.start 'rails'
require File.expand_path('dummy/config/environment.rb', __dir__) require File.expand_path('dummy/config/environment.rb', __dir__)
abort('The Rails environment is running in production mode!') if Rails.env.production? abort('The Rails environment is running in production mode!') if Rails.env.production?
require 'rspec/rails' require 'rspec/rails'
require 'capybara/rails' require 'capybara/rails'
require 'rspec/retry'
Rails.root.glob("../support/**/*.rb").each { |f| require_relative f } Dir[File.expand_path('support/**/*.rb', __dir__)].each { |f| require_relative f }
Rails.root.glob("../page_objects/**/*.rb").each { |f| require_relative f }
# Force deprecations to raise an exception.
# ActiveSupport::Deprecation.behavior = :raise
# Checks for pending migrations and applies them before tests are run.
# If you are not using ActiveRecord, you can remove these lines.
begin begin
ActiveRecord::Migration.maintain_test_schema! ActiveRecord::Migration.maintain_test_schema!
rescue ActiveRecord::PendingMigrationError => e rescue ActiveRecord::PendingMigrationError => e
@@ -28,6 +31,12 @@ rescue ActiveRecord::PendingMigrationError => e
end end
RSpec.configure do |config| RSpec.configure do |config|
if Gem::Version.new(Rails.version) >= Gem::Version.new('7.1')
config.fixture_paths = [Rails.root.join('spec/fixtures')]
else
config.fixture_path = Rails.root.join('spec/fixtures')
end
config.infer_spec_type_from_file_location! config.infer_spec_type_from_file_location!
config.filter_rails_from_backtrace! config.filter_rails_from_backtrace!
@@ -35,8 +44,6 @@ RSpec.configure do |config|
config.use_instantiated_fixtures = false config.use_instantiated_fixtures = false
config.render_views = false config.render_views = false
config.default_retry_count = 2
config.before(:suite) do config.before(:suite) do
intro = ('-' * 80) intro = ('-' * 80)
intro << "\n" intro << "\n"

Просмотреть файл

@@ -9,10 +9,10 @@ Capybara.register_driver(:capybara_cuprite) do |app|
Capybara::Cuprite::Driver.new( Capybara::Cuprite::Driver.new(
app, app,
window_size: [1600, 1280], window_size: [1600, 1024],
browser_options: browser_options, browser_options: browser_options,
process_timeout: 20, process_timeout: 30,
timeout: 20, timeout: 30,
inspector: true, inspector: true,
headless: !ENV['CUPRITE_HEADLESS'].in?(%w[n 0 no false]) headless: !ENV['CUPRITE_HEADLESS'].in?(%w[n 0 no false])
) )

10
spec/support/string_clean_multiline.rb Обычный файл
Просмотреть файл

@@ -0,0 +1,10 @@
# frozen_string_literal: true
module StringCleanMultiline
refine String do
def clean_multiline
# Get rid of newlines and indentation spaces
strip.gsub(/\s*\n\s*/, "")
end
end
end

Просмотреть файл

@@ -1,114 +1,149 @@
# frozen_string_literal: true # frozen_string_literal: true
using StringCleanMultiline
RSpec.describe 'Quill editor' do RSpec.describe 'Quill editor' do
def lookup_editor(field:) let(:author) { Author.create!(email: 'some_email@example.com', name: 'John Doe', age: 30) }
selector = ["##{field}_input.quill_editor", QuillEditor::SELECTOR].join(' ') let(:post) do
toolbar_selector = ["##{field}_input.quill_editor", QuillEditor::TOOLBAR_SELECTOR].join(' ') Post.create!(title: 'Test', author: author, description: '<p>Some content</p>', summary: '<p>Post summary</p>')
QuillEditor.new(selector: selector, toolbar_selector: toolbar_selector)
end end
let(:author) { Author.create!(email: 'some_email@example.com', name: 'John Doe', age: 30) } let(:submit_button) { find('#post_submit_action [type="submit"]') }
let!(:post) { Post.create!(title: 'Test', author: author, description: '') }
context 'with a Quill editor' do context 'with a Quill editor' do
let(:editor) { lookup_editor(field: 'post_description') } let(:edit_page) do
path = edit_admin_post_path(post)
Admin::Posts::EditPage.new(path: path)
end
let(:editor) { edit_page.lookup_editor(editor_container: '#post_description_input') }
let(:input_field) { find('#post_description[data-aa-quill-editor]') }
before do before do
path = edit_admin_post_path(post) edit_page.load
Admin::Posts::EditPage.new(path: path).load
end end
it 'adds some text to the description', :aggregate_failures do it 'initializes the editor', :aggregate_failures do
expect(page).to have_css('#post_description[data-aa-quill-editor]') expect(editor.content_element).to be_present
editor << 'Some content...' expect(editor.content).to eq('<p>Some content</p>')
%i[bold italic underline link].each do |control| expect(input_field).to be_present
expect(page).to have_css editor.control_selector(control)
end
expect(editor.content_element).to have_content('Some content...')
expect { find('[type="submit"]').click }
.to change { post.reload.description }.to '<p>Some content...</p>'
end end
it 'adds some bold text to the description', :aggregate_failures do it 'edits some content using the editor' do
editor.toolbar_control(:bold)
editor << 'Some bold text'
expect(editor.content_element).to have_content('Some bold text')
expect { find('[type="submit"]').click }
.to change { post.reload.description }.to '<p><strong>Some bold text</strong></p>'
end
it 'adds some italic text to the description', :aggregate_failures do
editor.toolbar_control(:italic)
editor << 'Some italic text'
expect(editor.content_element).to have_content('Some italic text')
expect { find('[type="submit"]').click }
.to change { post.reload.description }.to '<p><em>Some italic text</em></p>'
end
it 'adds some underline text to the description', :aggregate_failures do
editor.toolbar_control(:underline)
editor << 'Some underline text'
expect(editor.content_element).to have_content('Some underline text')
expect { find('[type="submit"]').click }
.to change { post.reload.description }.to '<p><u>Some underline text</u></p>'
end
it 'adds a link to the description', :aggregate_failures do
editor << "Just a link"
editor.select_all editor.select_all
editor.toolbar_control(:link) editor.toggle_link
editor.element.find('[data-link]').send_keys("https://www.google.com", :return) editor.tooltip_editing.send_keys(["https://blocknot.es", :return])
expect(editor.content_element).to have_content('Just a link') editor << :right << :return << 'More content'
html = '<p><a href="Just a linkhttps://www.google.com" rel="noopener noreferrer" target="_blank">Just a link</a></p>' editor.toggle_bold
expect { find('[type="submit"]').click }.to change { post.reload.description }.to html editor << 'Some bold'
editor.toggle_italic
editor << 'Some italic'
editor.toggle_underline
editor << 'Some underline' << :return
editor.toggle_blockquote
editor << 'blockquote enabled' << :return
editor.toggle_blockquote
editor.toggle_code_block
editor << 'code block enabled' << :return
editor.toggle_code_block
editor << "Some text"
editor.toggle_sub
editor << "sub text"
editor.toggle_sub
editor << " More text"
editor.toggle_super
editor << "sup text"
editor.toggle_super
editor << :return
editor.open_dropdown(:align).toggle_align_right
editor << "Text aligned on the right"
expect(editor.content).to eq <<~HTML.clean_multiline
<p><a href="https://blocknot.es" rel="noopener noreferrer" target="_blank">Some content</a></p>
<p>More content<strong>Some bold<em>Some italic<u>Some underline</u></em></strong></p>
<blockquote>blockquote enabled</blockquote>
<div class="ql-code-block-container" spellcheck="false">
<div class="ql-code-block">code block enabled</div>
</div>
<p>Some text<sub>sub text</sub> More text<sup>sup text</sup></p>
<p class="ql-align-right">Text aligned on the right</p>
HTML
end
it 'updates the field when submitting', :aggregate_failures do
editor.toggle_bold
editor << 'More content'
before = '<p>Some content</p>'
after = '<p><strong>More content</strong>Some content</p>'
expect { submit_button.click }.to change { post.reload.description }.from(before).to(after)
expect(page).to have_content('was successfully updated')
end end
end end
context 'with 2 Quill editors' do context 'with 2 Quill editors' do
before do let(:edit_page) do
path = edit_admin_post_path(post) path = edit_admin_post_path(post)
Admin::Posts::EditPage.new(path: path).load Admin::Posts::EditPage.new(path: path)
end
let(:first_editor) { edit_page.lookup_editor(editor_container: '#post_description_input') }
let(:second_editor) { edit_page.lookup_editor(editor_container: '#post_summary_input') }
before do
edit_page.load
end end
it 'updates some HTML content for 2 fields', :aggregate_failures do it 'updates some HTML content for 2 fields', :aggregate_failures do
editor1 = lookup_editor(field: 'post_description') # Check the initial states
editor1.clear.toolbar_control(:bold) expect(first_editor.content).to eq('<p>Some content</p>')
editor1 << "Some description" expect(second_editor.content).to eq('<p>Post summary</p>')
editor2 = lookup_editor(field: 'post_summary') # Add some content to both the editors
editor2.clear.toolbar_control(:italic) first_editor.toggle_bold
editor2 << "Some summary" first_editor << 'Some bold'
find('[type="submit"]').click second_editor.toggle_italic
post.reload second_editor << 'Some italic'
expect(post.description).to eq '<p><strong>Some description</strong></p>' # Check that both the fields change
expect(post.summary).to eq '<p><em>Some summary</em></p>' before = '<p>Some content</p>'
after = '<p><strong>Some bold</strong>Some content</p>'
expect { submit_button.click }.to change { post.reload.description }.from(before).to(after)
expect(post.summary).to eq '<p><em>Some italic</em>Post summary</p>'
end end
end end
context 'with a Quill editor in a nested resource' do context 'with a Quill editor in a nested resource' do
before do let(:edit_page) do
path = edit_admin_author_path(author) path = edit_admin_author_path(author)
Admin::Authors::EditPage.new(path: path).load Admin::Authors::EditPage.new(path: path)
end
let(:submit_button) { find('#author_submit_action [type="submit"]') }
before do
post
edit_page.load
end end
it 'updates some HTML content of a new nested resource', :aggregate_failures do it 'updates some HTML content of a new nested resource', :aggregate_failures do
find('.posts.has_many_container .has_many_add').click click_on 'Add New Post'
expect(page).to have_css('.posts.has_many_container .ql-editor', count: 2)
editor = lookup_editor(field: 'author_posts_attributes_1_description') first_editor = edit_page.lookup_editor(editor_container: '#author_posts_attributes_0_description_input')
editor << "Some post text" expect(first_editor.content).to eq('<p>Some content</p>')
fill_in('author[posts_attributes][1][title]', with: 'A new post') fill_in('author[posts_attributes][1][title]', with: 'Some title')
find('[type="submit"]').click second_editor = edit_page.lookup_editor(editor_container: '#author_posts_attributes_1_description_input')
second_editor.toggle_underline
second_editor << 'Some underline'
expect(page).to have_content('was successfully updated') expect { submit_button.click }.to change(Post, :count).by(1)
expect(author.posts.last.description).to eq '<p>Some post text</p>' expect(Post.last.description).to eq '<p><u>Some underline</u></p>'
end end
end end
end end