diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
new file mode 100644
index 0000000..bc19194
--- /dev/null
+++ b/.github/workflows/main.yml
@@ -0,0 +1,30 @@
+name: Ruby
+
+on:
+ push:
+ branches:
+ - master
+
+ pull_request:
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ name: Ruby ${{ matrix.ruby }}
+ strategy:
+ matrix:
+ ruby:
+ - '3.0.3'
+ - '3.1.2'
+ - '3.2.3'
+ - '3.3.0'
+
+ steps:
+ - uses: actions/checkout@v3
+ - name: Set up Ruby
+ uses: ruby/setup-ruby@v1
+ with:
+ ruby-version: ${{ matrix.ruby }}
+ bundler-cache: true
+ - name: Run the default task
+ run: bundle exec rake
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 0d74704..a1b4b38 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,3 +15,10 @@ tmp
*.gem
Gemfile.lock
gemfiles/*.lock
+
+spec/dummy/db/schema.rb
+spec/dummy/storage/*.sqlite3
+spec/dummy/storage/*.sqlite3-*
+spec/dummy/log/*
+spec/dummy/tmp/*coverage
+spec/dummy/tmp/restart.txt
\ No newline at end of file
diff --git a/.rubocop.yml b/.rubocop.yml
new file mode 100644
index 0000000..b17b4fa
--- /dev/null
+++ b/.rubocop.yml
@@ -0,0 +1,69 @@
+AllCops:
+ TargetRubyVersion: 2.7
+ NewCops: disable
+ SuggestExtensions: false
+ Exclude:
+ - "spec/dummy/bin/*"
+
+Style/HashSyntax:
+ EnforcedStyle: ruby19_no_mixed_keys
+ EnforcedShorthandSyntax: never
+
+Style/GuardClause:
+ Enabled: false
+
+# Configuration parameters: EnforcedStyle, SingleLineConditionsOnly, IncludeTernaryExpressions.
+# SupportedStyles: assign_to_condition, assign_inside_condition
+Style/ConditionalAssignment:
+ Enabled: false
+
+# Configuration parameters: AllowedConstants.
+Style/Documentation:
+ Enabled: false
+
+Style/IfUnlessModifier:
+ Enabled: false
+
+# Configuration parameters: EnforcedStyle, ConsistentQuotesInMultiline.
+# SupportedStyles: single_quotes, double_quotes
+Style/StringLiterals:
+ EnforcedStyle: double_quotes
+ ConsistentQuotesInMultiline: true
+
+# Configuration parameters: EnforcedStyle.
+# SupportedStyles: both, prefix, postfix
+Style/NegatedIf:
+ Enabled: false
+
+Style/RedundantBegin:
+ Enabled: false
+
+# Configuration parameters: MinDigits, Strict, AllowedNumbers, AllowedPatterns.
+Style/NumericLiterals:
+ Exclude:
+ - 'spec/dummy/db/*.rb'
+
+# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, AllowedPatterns.
+# URISchemes: http, https
+Layout/LineLength:
+ Max: 150
+
+# Configuration parameters: NamePrefix, ForbiddenPrefixes, AllowedMethods, MethodDefinitionMacros.
+# NamePrefix: is_, has_, have_
+# ForbiddenPrefixes: is_, has_, have_
+# AllowedMethods: is_a?
+# MethodDefinitionMacros: define_method, define_singleton_method
+Naming/PredicateName:
+ Exclude:
+ - 'spec/**/*'
+
+Metrics/AbcSize:
+ Max: 30
+
+# Configuration parameters: CountComments, CountAsOne, AllowedMethods, AllowedPatterns.
+# AllowedMethods: refine
+Metrics/BlockLength:
+ CountComments: false
+ Max: 30
+ Exclude:
+ - 'spec/**/*'
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 1f525be..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,6 +0,0 @@
----
-language: ruby
-cache: bundler
-rvm:
- - 2.7.0
-before_install: gem install bundler -v 2.1.2
diff --git a/Gemfile b/Gemfile
index 95b325e..9e38300 100644
--- a/Gemfile
+++ b/Gemfile
@@ -1,7 +1,12 @@
+# frozen_string_literal: true
+
source "https://rubygems.org"
# Specify your gem's dependencies in administrate-field-tinymce.gemspec
gemspec
-gem "rake", "~> 12.0"
-gem "rspec", "~> 3.0"
+gem "rake", "~> 13.2", ">= 13.2.1"
+
+gem "tinymce-rails", "~> 6.8", ">= 6.8.3"
+
+gem "rubocop", "~> 1.21"
diff --git a/Gemfile.lock b/Gemfile.lock
index 5b9ea50..057e8d6 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -1,158 +1,212 @@
PATH
remote: .
specs:
- administrate-field-tinymce (0.0.1)
+ administrate-field-tinymce (2.0.1)
administrate (< 1.0.0)
- rails (>= 4.1)
- tinymce-rails (>= 4.4.3)
+ rails (>= 5, < 8)
+ tinymce-rails (~> 6.8, >= 6.8.3)
GEM
remote: https://rubygems.org/
specs:
- actioncable (6.0.3.4)
- actionpack (= 6.0.3.4)
+ actioncable (7.1.3.2)
+ actionpack (= 7.1.3.2)
+ activesupport (= 7.1.3.2)
nio4r (~> 2.0)
websocket-driver (>= 0.6.1)
- actionmailbox (6.0.3.4)
- actionpack (= 6.0.3.4)
- activejob (= 6.0.3.4)
- activerecord (= 6.0.3.4)
- activestorage (= 6.0.3.4)
- activesupport (= 6.0.3.4)
+ zeitwerk (~> 2.6)
+ actionmailbox (7.1.3.2)
+ actionpack (= 7.1.3.2)
+ activejob (= 7.1.3.2)
+ activerecord (= 7.1.3.2)
+ activestorage (= 7.1.3.2)
+ activesupport (= 7.1.3.2)
mail (>= 2.7.1)
- actionmailer (6.0.3.4)
- actionpack (= 6.0.3.4)
- actionview (= 6.0.3.4)
- activejob (= 6.0.3.4)
+ net-imap
+ net-pop
+ net-smtp
+ actionmailer (7.1.3.2)
+ actionpack (= 7.1.3.2)
+ actionview (= 7.1.3.2)
+ activejob (= 7.1.3.2)
+ activesupport (= 7.1.3.2)
mail (~> 2.5, >= 2.5.4)
- rails-dom-testing (~> 2.0)
- actionpack (6.0.3.4)
- actionview (= 6.0.3.4)
- activesupport (= 6.0.3.4)
- rack (~> 2.0, >= 2.0.8)
+ net-imap
+ net-pop
+ net-smtp
+ rails-dom-testing (~> 2.2)
+ actionpack (7.1.3.2)
+ actionview (= 7.1.3.2)
+ activesupport (= 7.1.3.2)
+ nokogiri (>= 1.8.5)
+ racc
+ rack (>= 2.2.4)
+ rack-session (>= 1.0.1)
rack-test (>= 0.6.3)
- rails-dom-testing (~> 2.0)
- rails-html-sanitizer (~> 1.0, >= 1.2.0)
- actiontext (6.0.3.4)
- actionpack (= 6.0.3.4)
- activerecord (= 6.0.3.4)
- activestorage (= 6.0.3.4)
- activesupport (= 6.0.3.4)
+ rails-dom-testing (~> 2.2)
+ rails-html-sanitizer (~> 1.6)
+ actiontext (7.1.3.2)
+ actionpack (= 7.1.3.2)
+ activerecord (= 7.1.3.2)
+ activestorage (= 7.1.3.2)
+ activesupport (= 7.1.3.2)
+ globalid (>= 0.6.0)
nokogiri (>= 1.8.5)
- actionview (6.0.3.4)
- activesupport (= 6.0.3.4)
+ actionview (7.1.3.2)
+ activesupport (= 7.1.3.2)
builder (~> 3.1)
- erubi (~> 1.4)
- rails-dom-testing (~> 2.0)
- rails-html-sanitizer (~> 1.1, >= 1.2.0)
- activejob (6.0.3.4)
- activesupport (= 6.0.3.4)
+ erubi (~> 1.11)
+ rails-dom-testing (~> 2.2)
+ rails-html-sanitizer (~> 1.6)
+ activejob (7.1.3.2)
+ activesupport (= 7.1.3.2)
globalid (>= 0.3.6)
- activemodel (6.0.3.4)
- activesupport (= 6.0.3.4)
- activerecord (6.0.3.4)
- activemodel (= 6.0.3.4)
- activesupport (= 6.0.3.4)
- activestorage (6.0.3.4)
- actionpack (= 6.0.3.4)
- activejob (= 6.0.3.4)
- activerecord (= 6.0.3.4)
- marcel (~> 0.3.1)
- activesupport (6.0.3.4)
+ activemodel (7.1.3.2)
+ activesupport (= 7.1.3.2)
+ activerecord (7.1.3.2)
+ activemodel (= 7.1.3.2)
+ activesupport (= 7.1.3.2)
+ timeout (>= 0.4.0)
+ activestorage (7.1.3.2)
+ actionpack (= 7.1.3.2)
+ activejob (= 7.1.3.2)
+ activerecord (= 7.1.3.2)
+ activesupport (= 7.1.3.2)
+ marcel (~> 1.0)
+ activesupport (7.1.3.2)
+ base64
+ bigdecimal
concurrent-ruby (~> 1.0, >= 1.0.2)
- i18n (>= 0.7, < 2)
- minitest (~> 5.1)
- tzinfo (~> 1.1)
- zeitwerk (~> 2.2, >= 2.2.2)
- administrate (0.14.0)
- actionpack (>= 4.2)
- actionview (>= 4.2)
- activerecord (>= 4.2)
- autoprefixer-rails (>= 6.0)
- datetime_picker_rails (~> 0.0.7)
- jquery-rails (>= 4.0)
- kaminari (>= 1.0)
- momentjs-rails (~> 2.8)
+ connection_pool (>= 2.2.5)
+ drb
+ i18n (>= 1.6, < 2)
+ minitest (>= 5.1)
+ mutex_m
+ tzinfo (~> 2.0)
+ administrate (0.20.1)
+ actionpack (>= 6.0, < 8.0)
+ actionview (>= 6.0, < 8.0)
+ activerecord (>= 6.0, < 8.0)
+ jquery-rails (~> 4.6.0)
+ kaminari (~> 1.2.2)
sassc-rails (~> 2.1)
selectize-rails (~> 0.6)
- autoprefixer-rails (10.0.1.0)
- execjs
+ ast (2.4.2)
+ base64 (0.2.0)
+ bigdecimal (3.1.7)
builder (3.2.4)
- concurrent-ruby (1.1.7)
+ concurrent-ruby (1.2.3)
+ connection_pool (2.4.1)
crass (1.0.6)
- datetime_picker_rails (0.0.7)
- momentjs-rails (>= 2.8.1)
+ date (3.3.4)
diff-lcs (1.4.4)
- erubi (1.9.0)
- execjs (2.7.0)
- ffi (1.13.1)
- globalid (0.4.2)
- activesupport (>= 4.2.0)
- i18n (1.8.5)
+ drb (2.2.1)
+ erubi (1.12.0)
+ ffi (1.16.3)
+ globalid (1.2.1)
+ activesupport (>= 6.1)
+ i18n (1.14.4)
concurrent-ruby (~> 1.0)
- jquery-rails (4.4.0)
+ io-console (0.7.2)
+ irb (1.12.0)
+ rdoc
+ reline (>= 0.4.2)
+ jquery-rails (4.6.0)
rails-dom-testing (>= 1, < 3)
railties (>= 4.2.0)
thor (>= 0.14, < 2.0)
- kaminari (1.2.1)
+ json (2.7.2)
+ kaminari (1.2.2)
activesupport (>= 4.1.0)
- kaminari-actionview (= 1.2.1)
- kaminari-activerecord (= 1.2.1)
- kaminari-core (= 1.2.1)
- kaminari-actionview (1.2.1)
+ 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.1)
- kaminari-activerecord (1.2.1)
+ kaminari-core (= 1.2.2)
+ kaminari-activerecord (1.2.2)
activerecord
- kaminari-core (= 1.2.1)
- kaminari-core (1.2.1)
- loofah (2.7.0)
+ 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.5.9)
- mail (2.7.1)
+ nokogiri (>= 1.12.0)
+ mail (2.8.1)
mini_mime (>= 0.1.1)
- marcel (0.3.3)
- mimemagic (~> 0.3.2)
- method_source (1.0.0)
- mimemagic (0.3.5)
- mini_mime (1.0.2)
- mini_portile2 (2.4.0)
- minitest (5.14.2)
- momentjs-rails (2.20.1)
- railties (>= 3.1)
- nio4r (2.5.4)
- nokogiri (1.10.10)
- mini_portile2 (~> 2.4.0)
- rack (2.2.3)
- rack-test (1.1.0)
- rack (>= 1.0, < 3)
- rails (6.0.3.4)
- actioncable (= 6.0.3.4)
- actionmailbox (= 6.0.3.4)
- actionmailer (= 6.0.3.4)
- actionpack (= 6.0.3.4)
- actiontext (= 6.0.3.4)
- actionview (= 6.0.3.4)
- activejob (= 6.0.3.4)
- activemodel (= 6.0.3.4)
- activerecord (= 6.0.3.4)
- activestorage (= 6.0.3.4)
- activesupport (= 6.0.3.4)
- bundler (>= 1.3.0)
- railties (= 6.0.3.4)
- sprockets-rails (>= 2.0.0)
- rails-dom-testing (2.0.3)
- activesupport (>= 4.2.0)
+ net-imap
+ net-pop
+ net-smtp
+ marcel (1.0.4)
+ mini_mime (1.1.5)
+ mini_portile2 (2.8.5)
+ minitest (5.22.3)
+ mutex_m (0.2.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.0)
+ net-protocol
+ nio4r (2.7.1)
+ nokogiri (1.16.4)
+ mini_portile2 (~> 2.8.2)
+ racc (~> 1.4)
+ parallel (1.24.0)
+ parser (3.3.0.5)
+ ast (~> 2.4.1)
+ racc
+ psych (5.1.2)
+ stringio
+ racc (1.7.3)
+ rack (3.0.10)
+ rack-session (2.0.0)
+ rack (>= 3.0.0)
+ rack-test (2.1.0)
+ rack (>= 1.3)
+ rackup (2.1.0)
+ rack (>= 3)
+ webrick (~> 1.8)
+ rails (7.1.3.2)
+ actioncable (= 7.1.3.2)
+ actionmailbox (= 7.1.3.2)
+ actionmailer (= 7.1.3.2)
+ actionpack (= 7.1.3.2)
+ actiontext (= 7.1.3.2)
+ actionview (= 7.1.3.2)
+ activejob (= 7.1.3.2)
+ activemodel (= 7.1.3.2)
+ activerecord (= 7.1.3.2)
+ activestorage (= 7.1.3.2)
+ activesupport (= 7.1.3.2)
+ bundler (>= 1.15.0)
+ railties (= 7.1.3.2)
+ rails-dom-testing (2.2.0)
+ activesupport (>= 5.0.0)
+ minitest
nokogiri (>= 1.6)
- rails-html-sanitizer (1.3.0)
- loofah (~> 2.3)
- railties (6.0.3.4)
- actionpack (= 6.0.3.4)
- activesupport (= 6.0.3.4)
- method_source
- rake (>= 0.8.7)
- thor (>= 0.20.3, < 2.0)
- rake (12.3.3)
+ rails-html-sanitizer (1.6.0)
+ loofah (~> 2.21)
+ nokogiri (~> 1.14)
+ railties (7.1.3.2)
+ actionpack (= 7.1.3.2)
+ activesupport (= 7.1.3.2)
+ 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)
+ rdoc (6.6.3.1)
+ psych (>= 4.0.0)
+ regexp_parser (2.9.0)
+ reline (0.5.1)
+ io-console (~> 0.5)
+ rexml (3.2.6)
rspec (3.9.0)
rspec-core (~> 3.9.0)
rspec-expectations (~> 3.9.0)
@@ -165,7 +219,29 @@ GEM
rspec-mocks (3.9.1)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.9.0)
+ rspec-rails (4.0.1)
+ actionpack (>= 4.2)
+ activesupport (>= 4.2)
+ railties (>= 4.2)
+ rspec-core (~> 3.9)
+ rspec-expectations (~> 3.9)
+ rspec-mocks (~> 3.9)
+ rspec-support (~> 3.9)
rspec-support (3.9.3)
+ rubocop (1.62.1)
+ 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.31.1, < 2.0)
+ ruby-progressbar (~> 1.7)
+ unicode-display_width (>= 2.4.0, < 3.0)
+ rubocop-ast (1.31.2)
+ parser (>= 3.3.0.4)
+ ruby-progressbar (1.13.0)
sassc (2.4.0)
ffi (~> 1.9)
sassc-rails (2.1.2)
@@ -175,32 +251,41 @@ GEM
sprockets-rails
tilt
selectize-rails (0.12.6)
- sprockets (4.0.2)
+ sprockets (4.2.1)
concurrent-ruby (~> 1.0)
- rack (> 1, < 3)
- sprockets-rails (3.2.2)
- actionpack (>= 4.0)
- activesupport (>= 4.0)
+ rack (>= 2.2.4, < 4)
+ sprockets-rails (3.4.2)
+ actionpack (>= 5.2)
+ activesupport (>= 5.2)
sprockets (>= 3.0.0)
- thor (1.0.1)
- thread_safe (0.3.6)
- tilt (2.0.10)
- tinymce-rails (5.5.1)
+ sqlite3 (1.7.3)
+ mini_portile2 (~> 2.8.0)
+ stringio (3.1.0)
+ thor (1.3.1)
+ tilt (2.3.0)
+ timeout (0.4.1)
+ tinymce-rails (6.8.3)
railties (>= 3.1.1)
- tzinfo (1.2.7)
- thread_safe (~> 0.1)
- websocket-driver (0.7.3)
+ 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)
- zeitwerk (2.4.0)
+ zeitwerk (2.6.13)
PLATFORMS
ruby
DEPENDENCIES
administrate-field-tinymce!
- rake (~> 12.0)
- rspec (~> 3.0)
+ rake (~> 13.2, >= 13.2.1)
+ rspec
+ rspec-rails
+ rubocop (~> 1.21)
+ sqlite3
+ tinymce-rails (~> 6.8, >= 6.8.3)
BUNDLED WITH
- 2.1.2
+ 2.5.9
diff --git a/README.md b/README.md
index bf3b38d..3c3b582 100644
--- a/README.md
+++ b/README.md
@@ -7,7 +7,7 @@ A plugin for adding [TinyMCE] support in [Administrate].
Add [tinymce-rails] and administrate-field-tinymce to your `Gemfile`:
```ruby
-gem "tinymce-rails"
+gem "tinymce-rails", "~> 6.8", ">= 6.8.3"
gem "administrate-field-tinymce", "~> 0.0.1"
```
diff --git a/Rakefile b/Rakefile
index b7e9ed5..dcdeab9 100644
--- a/Rakefile
+++ b/Rakefile
@@ -1,6 +1,12 @@
+# frozen_string_literal: true
+
require "bundler/gem_tasks"
require "rspec/core/rake_task"
RSpec::Core::RakeTask.new(:spec)
-task :default => :spec
+require "rubocop/rake_task"
+
+RuboCop::RakeTask.new
+
+task default: %i[rubocop spec]
diff --git a/administrate-field-tinymce.gemspec b/administrate-field-tinymce.gemspec
index 6ef544b..4c26a2c 100644
--- a/administrate-field-tinymce.gemspec
+++ b/administrate-field-tinymce.gemspec
@@ -1,27 +1,33 @@
+# frozen_string_literal: true
+
Gem::Specification.new do |spec|
- spec.name = 'administrate-field-tinymce'
- spec.version = '1.0.0'
- spec.authors = ['Keshav Biswa']
- spec.email = ['keshavbiswa21@gmail.com']
+ spec.name = "administrate-field-tinymce"
+ spec.version = "2.0.1"
+ spec.authors = ["Keshav Biswa"]
+ spec.email = ["keshavbiswa21@gmail.com"]
- spec.summary = 'Administrate Plugin to add tinymce editor to administrate field.'
- spec.homepage = 'https://github.com/keshavbiswa/administrate-field-tinymce'
- spec.license = 'MIT'
- spec.required_ruby_version = Gem::Requirement.new('>= 2.3.0')
+ spec.summary = "Administrate Plugin to add tinymce editor to administrate field."
+ spec.homepage = "https://github.com/keshavbiswa/administrate-field-tinymce"
+ spec.license = "MIT"
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.7.7")
- spec.metadata['homepage_uri'] = spec.homepage
- spec.metadata['source_code_uri'] = 'https://github.com/keshavbiswa/administrate-field-tinymce'
+ spec.metadata["homepage_uri"] = spec.homepage
+ spec.metadata["source_code_uri"] = "https://github.com/keshavbiswa/administrate-field-tinymce"
# Specify which files should be added to the gem when it is released.
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
spec.files = Dir.chdir(File.expand_path(__dir__)) do
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
end
- spec.bindir = 'exe'
+ spec.bindir = "exe"
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
- spec.require_paths = ['lib']
+ spec.require_paths = ["lib"]
+
+ spec.add_dependency "administrate", "< 1.0.0"
+ spec.add_dependency "rails", ">= 5", "< 8"
+ spec.add_dependency "tinymce-rails", "~> 6.8", ">= 6.8.3"
- spec.add_runtime_dependency 'administrate', '< 1.0.0'
- spec.add_runtime_dependency 'rails', '~> 4.1'
- spec.add_runtime_dependency 'tinymce-rails', '~> 4.4', '>= 4.4.3'
+ spec.add_development_dependency "rspec"
+ spec.add_development_dependency "rspec-rails"
+ spec.add_development_dependency "sqlite3"
end
diff --git a/app/assets/javascripts/administrate-field-tinymce/application.js b/app/assets/javascripts/administrate-field-tinymce/application.js
index 3a4a5fe..76f4075 100644
--- a/app/assets/javascripts/administrate-field-tinymce/application.js
+++ b/app/assets/javascripts/administrate-field-tinymce/application.js
@@ -1,5 +1,4 @@
//= require tinymce
-//= require tinymce-jquery
tinyMCE.init({
selector: 'textarea'
diff --git a/bin/console b/bin/console
index 8649057..f596d60 100755
--- a/bin/console
+++ b/bin/console
@@ -1,4 +1,5 @@
#!/usr/bin/env ruby
+# frozen_string_literal: true
require "bundler/setup"
require "administrate/field/tinymce"
diff --git a/lib/administrate/field/tinymce.rb b/lib/administrate/field/tinymce.rb
index 5747207..1e6186b 100644
--- a/lib/administrate/field/tinymce.rb
+++ b/lib/administrate/field/tinymce.rb
@@ -1,11 +1,14 @@
-require 'administrate/field/base'
-require 'rails'
+# frozen_string_literal: true
+
+require "rails"
+require "administrate/field/base"
+require "administrate/engine"
module Administrate
module Field
class Tinymce < Administrate::Field::Base
class Engine < ::Rails::Engine
- Administrate::Engine.add_javascript 'administrate-field-tinymce/application'
+ Administrate::Engine.add_javascript "administrate-field-tinymce/application"
end
def to_s
@@ -21,4 +24,4 @@ def columns
end
end
end
-end
\ No newline at end of file
+end
diff --git a/spec/administrate/field/tinymce_spec.rb b/spec/administrate/field/tinymce_spec.rb
index dda818d..b82f7d2 100644
--- a/spec/administrate/field/tinymce_spec.rb
+++ b/spec/administrate/field/tinymce_spec.rb
@@ -1,9 +1,47 @@
+# frozen_string_literal: true
+
+require "spec_helper"
+
RSpec.describe Administrate::Field::Tinymce do
- it "has a version number" do
- expect(Administrate::Field::Tinymce::VERSION).not_to be nil
+ describe "options handling" do
+ let(:record) { double("Record") }
+ let(:data) { "Sample Text" }
+
+ context "default options" do
+ let(:options) { {} }
+ subject { described_class.new(:tinymce, data, record, options) }
+
+ it "defaults rows to 40" do
+ expect(subject.rows).to eq(40)
+ end
+
+ it "defaults columns to 120" do
+ expect(subject.columns).to eq(120)
+ end
+ end
+
+ context "custom options" do
+ let(:options) { { rows: 100, columns: 80 } }
+ subject { described_class.new(:tinymce, data, record, options) }
+
+ it "uses the provided rows option" do
+ expect(subject.rows).to eq(100)
+ end
+
+ it "uses the provided columns option" do
+ expect(subject.columns).to eq(80)
+ end
+ end
end
- it "does something useful" do
- expect(false).to eq(true)
+ describe "#to_s" do
+ let(:record) { double("Record") }
+ let(:data) { "Test data" }
+ let(:options) { {} }
+ subject { described_class.new(:tinymce, data, record, options) }
+
+ it "returns the data as a string" do
+ expect(subject.to_s).to eq("Test data")
+ end
end
end
diff --git a/spec/dummy/Rakefile b/spec/dummy/Rakefile
new file mode 100644
index 0000000..d2a78aa
--- /dev/null
+++ b/spec/dummy/Rakefile
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+
+# Add your own tasks in files placed in lib/tasks ending in .rake,
+# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
+
+require_relative "config/application"
+
+Rails.application.load_tasks
diff --git a/spec/dummy/app/assets/config/manifest.js b/spec/dummy/app/assets/config/manifest.js
new file mode 100644
index 0000000..e694c75
--- /dev/null
+++ b/spec/dummy/app/assets/config/manifest.js
@@ -0,0 +1,3 @@
+ //= link_tree ../images
+ //= link_directory ../javascripts .js
+ //= link_directory ../stylesheets .css
\ No newline at end of file
diff --git a/spec/dummy/app/assets/images/.keep b/spec/dummy/app/assets/images/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/spec/dummy/app/assets/javascripts/application.js b/spec/dummy/app/assets/javascripts/application.js
new file mode 100644
index 0000000..1b4b03f
--- /dev/null
+++ b/spec/dummy/app/assets/javascripts/application.js
@@ -0,0 +1 @@
+//= link administrate-field-tinymce/application.js
\ No newline at end of file
diff --git a/spec/dummy/app/assets/stylesheets/application.css b/spec/dummy/app/assets/stylesheets/application.css
new file mode 100644
index 0000000..dcd7273
--- /dev/null
+++ b/spec/dummy/app/assets/stylesheets/application.css
@@ -0,0 +1 @@
+/* Application styles */
diff --git a/spec/dummy/app/channels/application_cable/channel.rb b/spec/dummy/app/channels/application_cable/channel.rb
new file mode 100644
index 0000000..9aec230
--- /dev/null
+++ b/spec/dummy/app/channels/application_cable/channel.rb
@@ -0,0 +1,6 @@
+# frozen_string_literal: true
+
+module ApplicationCable
+ class Channel < ActionCable::Channel::Base
+ end
+end
diff --git a/spec/dummy/app/channels/application_cable/connection.rb b/spec/dummy/app/channels/application_cable/connection.rb
new file mode 100644
index 0000000..8d6c2a1
--- /dev/null
+++ b/spec/dummy/app/channels/application_cable/connection.rb
@@ -0,0 +1,6 @@
+# frozen_string_literal: true
+
+module ApplicationCable
+ class Connection < ActionCable::Connection::Base
+ end
+end
diff --git a/spec/dummy/app/controllers/admin/application_controller.rb b/spec/dummy/app/controllers/admin/application_controller.rb
new file mode 100644
index 0000000..2c82ea2
--- /dev/null
+++ b/spec/dummy/app/controllers/admin/application_controller.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+# All Administrate controllers inherit from this
+# `Administrate::ApplicationController`, making it the ideal place to put
+# authentication logic or other before_actions.
+#
+# If you want to add pagination or other controller-level concerns,
+# you're free to overwrite the RESTful controller actions.
+module Admin
+ class ApplicationController < Administrate::ApplicationController
+ before_action :authenticate_admin
+
+ def authenticate_admin
+ # TODO: Add authentication logic here.
+ end
+
+ # Override this value to specify the number of elements to display at a time
+ # on index pages. Defaults to 20.
+ # def records_per_page
+ # params[:per_page] || 20
+ # end
+ end
+end
diff --git a/spec/dummy/app/controllers/admin/posts_controller.rb b/spec/dummy/app/controllers/admin/posts_controller.rb
new file mode 100644
index 0000000..dac8477
--- /dev/null
+++ b/spec/dummy/app/controllers/admin/posts_controller.rb
@@ -0,0 +1,48 @@
+# frozen_string_literal: true
+
+module Admin
+ class PostsController < Admin::ApplicationController
+ # Overwrite any of the RESTful controller actions to implement custom behavior
+ # For example, you may want to send an email after a foo is updated.
+ #
+ # def update
+ # super
+ # send_foo_updated_email(requested_resource)
+ # end
+
+ # Override this method to specify custom lookup behavior.
+ # This will be used to set the resource for the `show`, `edit`, and `update`
+ # actions.
+ #
+ # def find_resource(param)
+ # Foo.find_by!(slug: param)
+ # end
+
+ # The result of this lookup will be available as `requested_resource`
+
+ # Override this if you have certain roles that require a subset
+ # this will be used to set the records shown on the `index` action.
+ #
+ # def scoped_resource
+ # if current_user.super_admin?
+ # resource_class
+ # else
+ # resource_class.with_less_stuff
+ # end
+ # end
+
+ # Override `resource_params` if you want to transform the submitted
+ # data before it's persisted. For example, the following would turn all
+ # empty values into nil values. It uses other APIs such as `resource_class`
+ # and `dashboard`:
+ #
+ # def resource_params
+ # params.require(resource_class.model_name.param_key).
+ # permit(dashboard.permitted_attributes(action_name)).
+ # transform_values { |value| value == "" ? nil : value }
+ # end
+
+ # See https://administrate-demo.herokuapp.com/customizing_controller_actions
+ # for more information
+ end
+end
diff --git a/spec/dummy/app/controllers/application_controller.rb b/spec/dummy/app/controllers/application_controller.rb
new file mode 100644
index 0000000..7944f9f
--- /dev/null
+++ b/spec/dummy/app/controllers/application_controller.rb
@@ -0,0 +1,4 @@
+# frozen_string_literal: true
+
+class ApplicationController < ActionController::Base
+end
diff --git a/spec/dummy/app/controllers/concerns/.keep b/spec/dummy/app/controllers/concerns/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/spec/dummy/app/controllers/posts_controller.rb b/spec/dummy/app/controllers/posts_controller.rb
new file mode 100644
index 0000000..89144fc
--- /dev/null
+++ b/spec/dummy/app/controllers/posts_controller.rb
@@ -0,0 +1,59 @@
+# frozen_string_literal: true
+
+class PostsController < ApplicationController
+ before_action :set_post, only: %i[show edit update destroy]
+
+ # GET /posts
+ def index
+ @posts = Post.all
+ end
+
+ # GET /posts/1
+ def show; end
+
+ # GET /posts/new
+ def new
+ @post = Post.new
+ end
+
+ # GET /posts/1/edit
+ def edit; end
+
+ # POST /posts
+ def create
+ @post = Post.new(post_params)
+
+ if @post.save
+ redirect_to @post, notice: "Post was successfully created."
+ else
+ render :new, status: :unprocessable_entity
+ end
+ end
+
+ # PATCH/PUT /posts/1
+ def update
+ if @post.update(post_params)
+ redirect_to @post, notice: "Post was successfully updated.", status: :see_other
+ else
+ render :edit, status: :unprocessable_entity
+ end
+ end
+
+ # DELETE /posts/1
+ def destroy
+ @post.destroy!
+ redirect_to posts_url, notice: "Post was successfully destroyed.", status: :see_other
+ end
+
+ private
+
+ # Use callbacks to share common setup or constraints between actions.
+ def set_post
+ @post = Post.find(params[:id])
+ end
+
+ # Only allow a list of trusted parameters through.
+ def post_params
+ params.require(:post).permit(:title, :content)
+ end
+end
diff --git a/spec/dummy/app/dashboards/post_dashboard.rb b/spec/dummy/app/dashboards/post_dashboard.rb
new file mode 100644
index 0000000..8ff12a0
--- /dev/null
+++ b/spec/dummy/app/dashboards/post_dashboard.rb
@@ -0,0 +1,68 @@
+# frozen_string_literal: true
+
+require "administrate/base_dashboard"
+
+class PostDashboard < Administrate::BaseDashboard
+ # ATTRIBUTE_TYPES
+ # a hash that describes the type of each of the model's fields.
+ #
+ # Each different type represents an Administrate::Field object,
+ # which determines how the attribute is displayed
+ # on pages throughout the dashboard.
+ ATTRIBUTE_TYPES = {
+ id: Field::Number,
+ title: Field::Tinymce,
+ content: Field::Tinymce.with_options(columns: 100, rows: 100),
+ created_at: Field::DateTime,
+ updated_at: Field::DateTime
+ }.freeze
+
+ # COLLECTION_ATTRIBUTES
+ # an array of attributes that will be displayed on the model's index page.
+ #
+ # By default, it's limited to four items to reduce clutter on index pages.
+ # Feel free to add, remove, or rearrange items.
+ COLLECTION_ATTRIBUTES = %i[
+ id
+ content
+ title
+ created_at
+ ].freeze
+
+ # SHOW_PAGE_ATTRIBUTES
+ # an array of attributes that will be displayed on the model's show page.
+ SHOW_PAGE_ATTRIBUTES = %i[
+ id
+ content
+ title
+ created_at
+ updated_at
+ ].freeze
+
+ # FORM_ATTRIBUTES
+ # an array of attributes that will be displayed
+ # on the model's form (`new` and `edit`) pages.
+ FORM_ATTRIBUTES = %i[
+ content
+ title
+ ].freeze
+
+ # COLLECTION_FILTERS
+ # a hash that defines filters that can be used while searching via the search
+ # field of the dashboard.
+ #
+ # For example to add an option to search for open resources by typing "open:"
+ # in the search field:
+ #
+ # COLLECTION_FILTERS = {
+ # open: ->(resources) { resources.where(open: true) }
+ # }.freeze
+ COLLECTION_FILTERS = {}.freeze
+
+ # Overwrite this method to customize how posts are displayed
+ # across all pages of the admin dashboard.
+ #
+ # def display_resource(post)
+ # "Post ##{post.id}"
+ # end
+end
diff --git a/spec/dummy/app/helpers/application_helper.rb b/spec/dummy/app/helpers/application_helper.rb
new file mode 100644
index 0000000..15b06f0
--- /dev/null
+++ b/spec/dummy/app/helpers/application_helper.rb
@@ -0,0 +1,4 @@
+# frozen_string_literal: true
+
+module ApplicationHelper
+end
diff --git a/spec/dummy/app/helpers/posts_helper.rb b/spec/dummy/app/helpers/posts_helper.rb
new file mode 100644
index 0000000..f7f4697
--- /dev/null
+++ b/spec/dummy/app/helpers/posts_helper.rb
@@ -0,0 +1,4 @@
+# frozen_string_literal: true
+
+module PostsHelper
+end
diff --git a/spec/dummy/app/jobs/application_job.rb b/spec/dummy/app/jobs/application_job.rb
new file mode 100644
index 0000000..bef3959
--- /dev/null
+++ b/spec/dummy/app/jobs/application_job.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class ApplicationJob < ActiveJob::Base
+ # Automatically retry jobs that encountered a deadlock
+ # retry_on ActiveRecord::Deadlocked
+
+ # Most jobs are safe to ignore if the underlying records are no longer available
+ # discard_on ActiveJob::DeserializationError
+end
diff --git a/spec/dummy/app/mailers/application_mailer.rb b/spec/dummy/app/mailers/application_mailer.rb
new file mode 100644
index 0000000..5cc63a0
--- /dev/null
+++ b/spec/dummy/app/mailers/application_mailer.rb
@@ -0,0 +1,6 @@
+# frozen_string_literal: true
+
+class ApplicationMailer < ActionMailer::Base
+ default from: "from@example.com"
+ layout "mailer"
+end
diff --git a/spec/dummy/app/models/application_record.rb b/spec/dummy/app/models/application_record.rb
new file mode 100644
index 0000000..08dc537
--- /dev/null
+++ b/spec/dummy/app/models/application_record.rb
@@ -0,0 +1,5 @@
+# frozen_string_literal: true
+
+class ApplicationRecord < ActiveRecord::Base
+ primary_abstract_class
+end
diff --git a/spec/dummy/app/models/concerns/.keep b/spec/dummy/app/models/concerns/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/spec/dummy/app/models/post.rb b/spec/dummy/app/models/post.rb
new file mode 100644
index 0000000..a9c55bd
--- /dev/null
+++ b/spec/dummy/app/models/post.rb
@@ -0,0 +1,4 @@
+# frozen_string_literal: true
+
+class Post < ApplicationRecord
+end
diff --git a/spec/dummy/app/views/layouts/application.html.erb b/spec/dummy/app/views/layouts/application.html.erb
new file mode 100644
index 0000000..f72b4ef
--- /dev/null
+++ b/spec/dummy/app/views/layouts/application.html.erb
@@ -0,0 +1,15 @@
+
+
+
+ Dummy
+
+ <%= csrf_meta_tags %>
+ <%= csp_meta_tag %>
+
+ <%= stylesheet_link_tag "application" %>
+
+
+
+ <%= yield %>
+
+
diff --git a/spec/dummy/app/views/layouts/mailer.html.erb b/spec/dummy/app/views/layouts/mailer.html.erb
new file mode 100644
index 0000000..3aac900
--- /dev/null
+++ b/spec/dummy/app/views/layouts/mailer.html.erb
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+ <%= yield %>
+
+
diff --git a/spec/dummy/app/views/layouts/mailer.text.erb b/spec/dummy/app/views/layouts/mailer.text.erb
new file mode 100644
index 0000000..37f0bdd
--- /dev/null
+++ b/spec/dummy/app/views/layouts/mailer.text.erb
@@ -0,0 +1 @@
+<%= yield %>
diff --git a/spec/dummy/app/views/posts/_form.html.erb b/spec/dummy/app/views/posts/_form.html.erb
new file mode 100644
index 0000000..9072159
--- /dev/null
+++ b/spec/dummy/app/views/posts/_form.html.erb
@@ -0,0 +1,27 @@
+<%= form_with(model: post) do |form| %>
+ <% if post.errors.any? %>
+
+
<%= pluralize(post.errors.count, "error") %> prohibited this post from being saved:
+
+
+ <% post.errors.each do |error| %>
+ - <%= error.full_message %>
+ <% end %>
+
+
+ <% end %>
+
+
+ <%= form.label :title, style: "display: block" %>
+ <%= form.text_field :title %>
+
+
+
+ <%= form.label :content, style: "display: block" %>
+ <%= form.text_field :content %>
+
+
+
+ <%= form.submit %>
+
+<% end %>
diff --git a/spec/dummy/app/views/posts/_post.html.erb b/spec/dummy/app/views/posts/_post.html.erb
new file mode 100644
index 0000000..af766cc
--- /dev/null
+++ b/spec/dummy/app/views/posts/_post.html.erb
@@ -0,0 +1,12 @@
+
+
+ Title:
+ <%= post.title %>
+
+
+
+ Content:
+ <%= post.content %>
+
+
+
diff --git a/spec/dummy/app/views/posts/edit.html.erb b/spec/dummy/app/views/posts/edit.html.erb
new file mode 100644
index 0000000..4caff36
--- /dev/null
+++ b/spec/dummy/app/views/posts/edit.html.erb
@@ -0,0 +1,10 @@
+Editing post
+
+<%= render "form", post: @post %>
+
+
+
+
+ <%= link_to "Show this post", @post %> |
+ <%= link_to "Back to posts", posts_path %>
+
diff --git a/spec/dummy/app/views/posts/index.html.erb b/spec/dummy/app/views/posts/index.html.erb
new file mode 100644
index 0000000..c19360a
--- /dev/null
+++ b/spec/dummy/app/views/posts/index.html.erb
@@ -0,0 +1,14 @@
+<%= notice %>
+
+Posts
+
+
+ <% @posts.each do |post| %>
+ <%= render post %>
+
+ <%= link_to "Show this post", post %>
+
+ <% end %>
+
+
+<%= link_to "New post", new_post_path %>
diff --git a/spec/dummy/app/views/posts/new.html.erb b/spec/dummy/app/views/posts/new.html.erb
new file mode 100644
index 0000000..2bfb4e8
--- /dev/null
+++ b/spec/dummy/app/views/posts/new.html.erb
@@ -0,0 +1,9 @@
+New post
+
+<%= render "form", post: @post %>
+
+
+
+
+ <%= link_to "Back to posts", posts_path %>
+
diff --git a/spec/dummy/app/views/posts/show.html.erb b/spec/dummy/app/views/posts/show.html.erb
new file mode 100644
index 0000000..c3ba772
--- /dev/null
+++ b/spec/dummy/app/views/posts/show.html.erb
@@ -0,0 +1,10 @@
+<%= notice %>
+
+<%= render @post %>
+
+
+ <%= link_to "Edit this post", edit_post_path(@post) %> |
+ <%= link_to "Back to posts", posts_path %>
+
+ <%= button_to "Destroy this post", @post, method: :delete %>
+
diff --git a/spec/dummy/bin/rails b/spec/dummy/bin/rails
new file mode 100755
index 0000000..efc0377
--- /dev/null
+++ b/spec/dummy/bin/rails
@@ -0,0 +1,4 @@
+#!/usr/bin/env ruby
+APP_PATH = File.expand_path("../config/application", __dir__)
+require_relative "../config/boot"
+require "rails/commands"
diff --git a/spec/dummy/bin/rake b/spec/dummy/bin/rake
new file mode 100755
index 0000000..4fbf10b
--- /dev/null
+++ b/spec/dummy/bin/rake
@@ -0,0 +1,4 @@
+#!/usr/bin/env ruby
+require_relative "../config/boot"
+require "rake"
+Rake.application.run
diff --git a/spec/dummy/bin/setup b/spec/dummy/bin/setup
new file mode 100755
index 0000000..3cd5a9d
--- /dev/null
+++ b/spec/dummy/bin/setup
@@ -0,0 +1,33 @@
+#!/usr/bin/env ruby
+require "fileutils"
+
+# path to your application root.
+APP_ROOT = File.expand_path("..", __dir__)
+
+def system!(*args)
+ system(*args, exception: true)
+end
+
+FileUtils.chdir APP_ROOT do
+ # This script is a way to set up or update your development environment automatically.
+ # This script is idempotent, so that you can run it at any time and get an expectable outcome.
+ # Add necessary setup steps to this file.
+
+ puts "== Installing dependencies =="
+ system! "gem install bundler --conservative"
+ system("bundle check") || system!("bundle install")
+
+ # puts "\n== Copying sample files =="
+ # unless File.exist?("config/database.yml")
+ # FileUtils.cp "config/database.yml.sample", "config/database.yml"
+ # end
+
+ puts "\n== Preparing database =="
+ system! "bin/rails db:prepare"
+
+ puts "\n== Removing old logs and tempfiles =="
+ system! "bin/rails log:clear tmp:clear"
+
+ puts "\n== Restarting application server =="
+ system! "bin/rails restart"
+end
diff --git a/spec/dummy/config.ru b/spec/dummy/config.ru
new file mode 100644
index 0000000..2e03084
--- /dev/null
+++ b/spec/dummy/config.ru
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+
+# This file is used by Rack-based servers to start the application.
+
+require_relative "config/environment"
+
+run Rails.application
+Rails.application.load_server
diff --git a/spec/dummy/config/application.rb b/spec/dummy/config/application.rb
new file mode 100644
index 0000000..743512b
--- /dev/null
+++ b/spec/dummy/config/application.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+require_relative "boot"
+
+require "rails/all"
+
+# Require the gems listed in Gemfile, including any gems
+# you've limited to :test, :development, or :production.
+Bundler.require(*Rails.groups)
+
+module Dummy
+ class Application < Rails::Application
+ config.load_defaults Rails::VERSION::STRING.to_f
+
+ # Please, add to the `ignore` list any other `lib` subdirectories that do
+ # not contain `.rb` files, or that should not be reloaded or eager loaded.
+ # Common ones are `templates`, `generators`, or `middleware`, for example.
+ config.autoload_lib(ignore: %w[assets tasks])
+
+ # Configuration for the application, engines, and railties goes here.
+ #
+ # These settings can be overridden in specific environments using the files
+ # in config/environments, which are processed later.
+ #
+ # config.time_zone = "Central Time (US & Canada)"
+ # config.eager_load_paths << Rails.root.join("extras")
+ config.assets.css_compressor = nil
+ end
+end
diff --git a/spec/dummy/config/boot.rb b/spec/dummy/config/boot.rb
new file mode 100644
index 0000000..59459d4
--- /dev/null
+++ b/spec/dummy/config/boot.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+# Set up gems listed in the Gemfile.
+ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../../Gemfile", __dir__)
+
+require "bundler/setup" if File.exist?(ENV["BUNDLE_GEMFILE"])
+$LOAD_PATH.unshift File.expand_path("../../../lib", __dir__)
diff --git a/spec/dummy/config/cable.yml b/spec/dummy/config/cable.yml
new file mode 100644
index 0000000..98367f8
--- /dev/null
+++ b/spec/dummy/config/cable.yml
@@ -0,0 +1,10 @@
+development:
+ adapter: async
+
+test:
+ adapter: test
+
+production:
+ adapter: redis
+ url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %>
+ channel_prefix: dummy_production
diff --git a/spec/dummy/config/database.yml b/spec/dummy/config/database.yml
new file mode 100644
index 0000000..796466b
--- /dev/null
+++ b/spec/dummy/config/database.yml
@@ -0,0 +1,25 @@
+# SQLite. Versions 3.8.0 and up are supported.
+# gem install sqlite3
+#
+# Ensure the SQLite 3 gem is defined in your Gemfile
+# gem "sqlite3"
+#
+default: &default
+ adapter: sqlite3
+ pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
+ timeout: 5000
+
+development:
+ <<: *default
+ database: storage/development.sqlite3
+
+# Warning: The database defined as "test" will be erased and
+# re-generated from your development database when you run "rake".
+# Do not set this db to the same as development or production.
+test:
+ <<: *default
+ database: storage/test.sqlite3
+
+production:
+ <<: *default
+ database: storage/production.sqlite3
diff --git a/spec/dummy/config/environment.rb b/spec/dummy/config/environment.rb
new file mode 100644
index 0000000..7df99e8
--- /dev/null
+++ b/spec/dummy/config/environment.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+# Load the Rails application.
+require_relative "application"
+
+# Initialize the Rails application.
+Rails.application.initialize!
diff --git a/spec/dummy/config/environments/development.rb b/spec/dummy/config/environments/development.rb
new file mode 100644
index 0000000..d9ddea3
--- /dev/null
+++ b/spec/dummy/config/environments/development.rb
@@ -0,0 +1,75 @@
+# frozen_string_literal: true
+
+require "active_support/core_ext/integer/time"
+
+Rails.application.configure do
+ # Settings specified here will take precedence over those in config/application.rb.
+
+ # In the development environment your application's code is reloaded any time
+ # it changes. This slows down response time but is perfect for development
+ # since you don't have to restart the web server when you make code changes.
+ config.enable_reloading = true
+
+ # Do not eager load code on boot.
+ config.eager_load = false
+
+ # Show full error reports.
+ config.consider_all_requests_local = true
+
+ # Enable server timing
+ config.server_timing = true
+
+ # Enable/disable caching. By default caching is disabled.
+ # Run rails dev:cache to toggle caching.
+ if Rails.root.join("tmp/caching-dev.txt").exist?
+ config.action_controller.perform_caching = true
+ config.action_controller.enable_fragment_cache_logging = true
+
+ config.cache_store = :memory_store
+ config.public_file_server.headers = {
+ "Cache-Control" => "public, max-age=#{2.days.to_i}"
+ }
+ else
+ config.action_controller.perform_caching = false
+
+ config.cache_store = :null_store
+ end
+
+ # Store uploaded files on the local file system (see config/storage.yml for options).
+ config.active_storage.service = :local
+
+ # Don't care if the mailer can't send.
+ config.action_mailer.raise_delivery_errors = false
+
+ config.action_mailer.perform_caching = false
+
+ # Print deprecation notices to the Rails logger.
+ config.active_support.deprecation = :log
+
+ # Raise exceptions for disallowed deprecations.
+ config.active_support.disallowed_deprecation = :raise
+
+ # Tell Active Support which deprecation messages to disallow.
+ config.active_support.disallowed_deprecation_warnings = []
+
+ # Raise an error on page load if there are pending migrations.
+ config.active_record.migration_error = :page_load
+
+ # Highlight code that triggered database queries in logs.
+ config.active_record.verbose_query_logs = true
+
+ # Highlight code that enqueued background job in logs.
+ config.active_job.verbose_enqueue_logs = true
+
+ # Raises error for missing translations.
+ # config.i18n.raise_on_missing_translations = true
+
+ # Annotate rendered view with file names.
+ # config.action_view.annotate_rendered_view_with_filenames = true
+
+ # Uncomment if you wish to allow Action Cable access from any origin.
+ # config.action_cable.disable_request_forgery_protection = true
+
+ # Raise error when a before_action's only/except options reference missing actions
+ config.action_controller.raise_on_missing_callback_actions = true
+end
diff --git a/spec/dummy/config/environments/production.rb b/spec/dummy/config/environments/production.rb
new file mode 100644
index 0000000..2ea38c3
--- /dev/null
+++ b/spec/dummy/config/environments/production.rb
@@ -0,0 +1,93 @@
+# frozen_string_literal: true
+
+require "active_support/core_ext/integer/time"
+
+Rails.application.configure do
+ # Settings specified here will take precedence over those in config/application.rb.
+
+ # Code is not reloaded between requests.
+ config.enable_reloading = false
+
+ # Eager load code on boot. This eager loads most of Rails and
+ # your application in memory, allowing both threaded web servers
+ # and those relying on copy on write to perform better.
+ # Rake tasks automatically ignore this option for performance.
+ config.eager_load = true
+
+ # Full error reports are disabled and caching is turned on.
+ config.consider_all_requests_local = false
+ config.action_controller.perform_caching = true
+
+ # Ensures that a master key has been made available in ENV["RAILS_MASTER_KEY"], config/master.key, or an environment
+ # key such as config/credentials/production.key. This key is used to decrypt credentials (and other encrypted files).
+ # config.require_master_key = true
+
+ # Disable serving static files from `public/`, relying on NGINX/Apache to do so instead.
+ # config.public_file_server.enabled = false
+
+ # Enable serving of images, stylesheets, and JavaScripts from an asset server.
+ # config.asset_host = "http://assets.example.com"
+
+ # Specifies the header that your server uses for sending files.
+ # config.action_dispatch.x_sendfile_header = "X-Sendfile" # for Apache
+ # config.action_dispatch.x_sendfile_header = "X-Accel-Redirect" # for NGINX
+
+ # Store uploaded files on the local file system (see config/storage.yml for options).
+ config.active_storage.service = :local
+
+ # Mount Action Cable outside main process or domain.
+ # config.action_cable.mount_path = nil
+ # config.action_cable.url = "wss://example.com/cable"
+ # config.action_cable.allowed_request_origins = [ "http://example.com", /http:\/\/example.*/ ]
+
+ # Assume all access to the app is happening through a SSL-terminating reverse proxy.
+ # Can be used together with config.force_ssl for Strict-Transport-Security and secure cookies.
+ # config.assume_ssl = true
+
+ # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
+ config.force_ssl = true
+
+ # Log to STDOUT by default
+ config.logger = ActiveSupport::Logger.new($stdout)
+ .tap { |logger| logger.formatter = ::Logger::Formatter.new }
+ .then { |logger| ActiveSupport::TaggedLogging.new(logger) }
+
+ # Prepend all log lines with the following tags.
+ config.log_tags = [:request_id]
+
+ # "info" includes generic and useful information about system operation, but avoids logging too much
+ # information to avoid inadvertent exposure of personally identifiable information (PII). If you
+ # want to log everything, set the level to "debug".
+ config.log_level = ENV.fetch("RAILS_LOG_LEVEL", "info")
+
+ # Use a different cache store in production.
+ # config.cache_store = :mem_cache_store
+
+ # Use a real queuing backend for Active Job (and separate queues per environment).
+ # config.active_job.queue_adapter = :resque
+ # config.active_job.queue_name_prefix = "dummy_production"
+
+ config.action_mailer.perform_caching = false
+
+ # Ignore bad email addresses and do not raise email delivery errors.
+ # Set this to true and configure the email server for immediate delivery to raise delivery errors.
+ # config.action_mailer.raise_delivery_errors = false
+
+ # Enable locale fallbacks for I18n (makes lookups for any locale fall back to
+ # the I18n.default_locale when a translation cannot be found).
+ config.i18n.fallbacks = true
+
+ # Don't log any deprecations.
+ config.active_support.report_deprecations = false
+
+ # Do not dump schema after migrations.
+ config.active_record.dump_schema_after_migration = false
+
+ # Enable DNS rebinding protection and other `Host` header attacks.
+ # config.hosts = [
+ # "example.com", # Allow requests from example.com
+ # /.*\.example\.com/ # Allow requests from subdomains like `www.example.com`
+ # ]
+ # Skip DNS rebinding protection for the default health check endpoint.
+ # config.host_authorization = { exclude: ->(request) { request.path == "/up" } }
+end
diff --git a/spec/dummy/config/environments/test.rb b/spec/dummy/config/environments/test.rb
new file mode 100644
index 0000000..8a33329
--- /dev/null
+++ b/spec/dummy/config/environments/test.rb
@@ -0,0 +1,66 @@
+# frozen_string_literal: true
+
+require "active_support/core_ext/integer/time"
+
+# The test environment is used exclusively to run your application's
+# test suite. You never need to work with it otherwise. Remember that
+# your test database is "scratch space" for the test suite and is wiped
+# and recreated between test runs. Don't rely on the data there!
+
+Rails.application.configure do
+ # Settings specified here will take precedence over those in config/application.rb.
+
+ # While tests run files are not watched, reloading is not necessary.
+ config.enable_reloading = false
+
+ # Eager loading loads your entire application. When running a single test locally,
+ # this is usually not necessary, and can slow down your test suite. However, it's
+ # recommended that you enable it in continuous integration systems to ensure eager
+ # loading is working properly before deploying your code.
+ config.eager_load = ENV["CI"].present?
+
+ # Configure public file server for tests with Cache-Control for performance.
+ config.public_file_server.enabled = true
+ config.public_file_server.headers = {
+ "Cache-Control" => "public, max-age=#{1.hour.to_i}"
+ }
+
+ # Show full error reports and disable caching.
+ config.consider_all_requests_local = true
+ config.action_controller.perform_caching = false
+ config.cache_store = :null_store
+
+ # Render exception templates for rescuable exceptions and raise for other exceptions.
+ config.action_dispatch.show_exceptions = :rescuable
+
+ # Disable request forgery protection in test environment.
+ config.action_controller.allow_forgery_protection = false
+
+ # Store uploaded files on the local file system in a temporary directory.
+ config.active_storage.service = :test
+
+ config.action_mailer.perform_caching = false
+
+ # Tell Action Mailer not to deliver emails to the real world.
+ # The :test delivery method accumulates sent emails in the
+ # ActionMailer::Base.deliveries array.
+ config.action_mailer.delivery_method = :test
+
+ # Print deprecation notices to the stderr.
+ config.active_support.deprecation = :stderr
+
+ # Raise exceptions for disallowed deprecations.
+ config.active_support.disallowed_deprecation = :raise
+
+ # Tell Active Support which deprecation messages to disallow.
+ config.active_support.disallowed_deprecation_warnings = []
+
+ # Raises error for missing translations.
+ # config.i18n.raise_on_missing_translations = true
+
+ # Annotate rendered view with file names.
+ # config.action_view.annotate_rendered_view_with_filenames = true
+
+ # Raise error when a before_action's only/except options reference missing actions
+ config.action_controller.raise_on_missing_callback_actions = true
+end
diff --git a/spec/dummy/config/initializers/content_security_policy.rb b/spec/dummy/config/initializers/content_security_policy.rb
new file mode 100644
index 0000000..35ab3fd
--- /dev/null
+++ b/spec/dummy/config/initializers/content_security_policy.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+# Be sure to restart your server when you modify this file.
+
+# Define an application-wide content security policy.
+# See the Securing Rails Applications Guide for more information:
+# https://guides.rubyonrails.org/security.html#content-security-policy-header
+
+# Rails.application.configure do
+# config.content_security_policy do |policy|
+# policy.default_src :self, :https
+# policy.font_src :self, :https, :data
+# policy.img_src :self, :https, :data
+# policy.object_src :none
+# policy.script_src :self, :https
+# policy.style_src :self, :https
+# # Specify URI for violation reports
+# # policy.report_uri "/csp-violation-report-endpoint"
+# end
+#
+# # Generate session nonces for permitted importmap, inline scripts, and inline styles.
+# config.content_security_policy_nonce_generator = ->(request) { request.session.id.to_s }
+# config.content_security_policy_nonce_directives = %w(script-src style-src)
+#
+# # Report violations without enforcing the policy.
+# # config.content_security_policy_report_only = true
+# end
diff --git a/spec/dummy/config/initializers/filter_parameter_logging.rb b/spec/dummy/config/initializers/filter_parameter_logging.rb
new file mode 100644
index 0000000..c416e6a
--- /dev/null
+++ b/spec/dummy/config/initializers/filter_parameter_logging.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+# Be sure to restart your server when you modify this file.
+
+# Configure parameters to be partially matched (e.g. passw matches password) and filtered from the log file.
+# Use this to limit dissemination of sensitive information.
+# See the ActiveSupport::ParameterFilter documentation for supported notations and behaviors.
+Rails.application.config.filter_parameters += %i[
+ passw secret token _key crypt salt certificate otp ssn
+]
diff --git a/spec/dummy/config/initializers/inflections.rb b/spec/dummy/config/initializers/inflections.rb
new file mode 100644
index 0000000..9e049dc
--- /dev/null
+++ b/spec/dummy/config/initializers/inflections.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+# Be sure to restart your server when you modify this file.
+
+# Add new inflection rules using the following format. Inflections
+# are locale specific, and you may define rules for as many different
+# locales as you wish. All of these examples are active by default:
+# ActiveSupport::Inflector.inflections(:en) do |inflect|
+# inflect.plural /^(ox)$/i, "\\1en"
+# inflect.singular /^(ox)en/i, "\\1"
+# inflect.irregular "person", "people"
+# inflect.uncountable %w( fish sheep )
+# end
+
+# These inflection rules are supported but not enabled by default:
+# ActiveSupport::Inflector.inflections(:en) do |inflect|
+# inflect.acronym "RESTful"
+# end
diff --git a/spec/dummy/config/initializers/permissions_policy.rb b/spec/dummy/config/initializers/permissions_policy.rb
new file mode 100644
index 0000000..e8d0b2a
--- /dev/null
+++ b/spec/dummy/config/initializers/permissions_policy.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+# Be sure to restart your server when you modify this file.
+
+# Define an application-wide HTTP permissions policy. For further
+# information see: https://developers.google.com/web/updates/2018/06/feature-policy
+
+# Rails.application.config.permissions_policy do |policy|
+# policy.camera :none
+# policy.gyroscope :none
+# policy.microphone :none
+# policy.usb :none
+# policy.fullscreen :self
+# policy.payment :self, "https://secure.example.com"
+# end
diff --git a/spec/dummy/config/locales/en.yml b/spec/dummy/config/locales/en.yml
new file mode 100644
index 0000000..6c349ae
--- /dev/null
+++ b/spec/dummy/config/locales/en.yml
@@ -0,0 +1,31 @@
+# Files in the config/locales directory are used for internationalization and
+# are automatically loaded by Rails. If you want to use locales other than
+# English, add the necessary files in this directory.
+#
+# To use the locales, use `I18n.t`:
+#
+# I18n.t "hello"
+#
+# In views, this is aliased to just `t`:
+#
+# <%= t("hello") %>
+#
+# To use a different locale, set it with `I18n.locale`:
+#
+# I18n.locale = :es
+#
+# This would use the information in config/locales/es.yml.
+#
+# To learn more about the API, please read the Rails Internationalization guide
+# at https://guides.rubyonrails.org/i18n.html.
+#
+# Be aware that YAML interprets the following case-insensitive strings as
+# booleans: `true`, `false`, `on`, `off`, `yes`, `no`. Therefore, these strings
+# must be quoted to be interpreted as strings. For example:
+#
+# en:
+# "yes": yup
+# enabled: "ON"
+
+en:
+ hello: "Hello world"
diff --git a/spec/dummy/config/puma.rb b/spec/dummy/config/puma.rb
new file mode 100644
index 0000000..600872c
--- /dev/null
+++ b/spec/dummy/config/puma.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+# This configuration file will be evaluated by Puma. The top-level methods that
+# are invoked here are part of Puma's configuration DSL. For more information
+# about methods provided by the DSL, see https://puma.io/puma/Puma/DSL.html.
+
+# Puma can serve each request in a thread from an internal thread pool.
+# The `threads` method setting takes two numbers: a minimum and maximum.
+# Any libraries that use thread pools should be configured to match
+# the maximum value specified for Puma. Default is set to 5 threads for minimum
+# and maximum; this matches the default thread size of Active Record.
+max_threads_count = ENV.fetch("RAILS_MAX_THREADS", 5)
+min_threads_count = ENV.fetch("RAILS_MIN_THREADS") { max_threads_count }
+threads min_threads_count, max_threads_count
+
+# Specifies that the worker count should equal the number of processors in production.
+if ENV["RAILS_ENV"] == "production"
+ require "concurrent-ruby"
+ worker_count = Integer(ENV.fetch("WEB_CONCURRENCY") { Concurrent.physical_processor_count })
+ workers worker_count if worker_count > 1
+end
+
+# Specifies the `worker_timeout` threshold that Puma will use to wait before
+# terminating a worker in development environments.
+worker_timeout 3600 if ENV.fetch("RAILS_ENV", "development") == "development"
+
+# Specifies the `port` that Puma will listen on to receive requests; default is 3000.
+port ENV.fetch("PORT", 3000)
+
+# Specifies the `environment` that Puma will run in.
+environment ENV.fetch("RAILS_ENV", "development")
+
+# Specifies the `pidfile` that Puma will use.
+pidfile ENV.fetch("PIDFILE", "tmp/pids/server.pid")
+
+# Allow puma to be restarted by `bin/rails restart` command.
+plugin :tmp_restart
diff --git a/spec/dummy/config/routes.rb b/spec/dummy/config/routes.rb
new file mode 100644
index 0000000..da4be55
--- /dev/null
+++ b/spec/dummy/config/routes.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+Rails.application.routes.draw do
+ namespace :admin do
+ resources :posts
+
+ root to: "posts#index"
+ end
+ resources :posts
+ # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html
+
+ # Reveal health status on /up that returns 200 if the app boots with no exceptions, otherwise 500.
+ # Can be used by load balancers and uptime monitors to verify that the app is live.
+ get "up" => "rails/health#show", :as => :rails_health_check
+
+ # Defines the root path route ("/")
+ # root "posts#index"
+end
diff --git a/spec/dummy/config/storage.yml b/spec/dummy/config/storage.yml
new file mode 100644
index 0000000..4942ab6
--- /dev/null
+++ b/spec/dummy/config/storage.yml
@@ -0,0 +1,34 @@
+test:
+ service: Disk
+ root: <%= Rails.root.join("tmp/storage") %>
+
+local:
+ service: Disk
+ root: <%= Rails.root.join("storage") %>
+
+# Use bin/rails credentials:edit to set the AWS secrets (as aws:access_key_id|secret_access_key)
+# amazon:
+# service: S3
+# access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %>
+# secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %>
+# region: us-east-1
+# bucket: your_own_bucket-<%= Rails.env %>
+
+# Remember not to checkin your GCS keyfile to a repository
+# google:
+# service: GCS
+# project: your_project
+# credentials: <%= Rails.root.join("path/to/gcs.keyfile") %>
+# bucket: your_own_bucket-<%= Rails.env %>
+
+# Use bin/rails credentials:edit to set the Azure Storage secret (as azure_storage:storage_access_key)
+# microsoft:
+# service: AzureStorage
+# storage_account_name: your_account_name
+# storage_access_key: <%= Rails.application.credentials.dig(:azure_storage, :storage_access_key) %>
+# container: your_container_name-<%= Rails.env %>
+
+# mirror:
+# service: Mirror
+# primary: local
+# mirrors: [ amazon, google, microsoft ]
diff --git a/spec/dummy/db/migrate/20240414125514_create_posts.rb b/spec/dummy/db/migrate/20240414125514_create_posts.rb
new file mode 100644
index 0000000..e0ed6e6
--- /dev/null
+++ b/spec/dummy/db/migrate/20240414125514_create_posts.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+class CreatePosts < ActiveRecord::Migration[7.1]
+ def change
+ create_table :posts do |t|
+ t.string :title
+ t.string :content
+
+ t.timestamps
+ end
+ end
+end
diff --git a/spec/dummy/db/schema.rb b/spec/dummy/db/schema.rb
new file mode 100644
index 0000000..823f563
--- /dev/null
+++ b/spec/dummy/db/schema.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+# 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[7.1].define(version: 2024_04_14_125514) do
+ create_table "posts", force: :cascade do |t|
+ t.string "title"
+ t.string "content"
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ end
+end
diff --git a/spec/dummy/public/404.html b/spec/dummy/public/404.html
new file mode 100644
index 0000000..2be3af2
--- /dev/null
+++ b/spec/dummy/public/404.html
@@ -0,0 +1,67 @@
+
+
+
+ The page you were looking for doesn't exist (404)
+
+
+
+
+
+
+
+
+
The page you were looking for doesn't exist.
+
You may have mistyped the address or the page may have moved.
+
+
If you are the application owner check the logs for more information.
+
+
+
diff --git a/spec/dummy/public/422.html b/spec/dummy/public/422.html
new file mode 100644
index 0000000..c08eac0
--- /dev/null
+++ b/spec/dummy/public/422.html
@@ -0,0 +1,67 @@
+
+
+
+ The change you wanted was rejected (422)
+
+
+
+
+
+
+
+
+
The change you wanted was rejected.
+
Maybe you tried to change something you didn't have access to.
+
+
If you are the application owner check the logs for more information.
+
+
+
diff --git a/spec/dummy/public/500.html b/spec/dummy/public/500.html
new file mode 100644
index 0000000..78a030a
--- /dev/null
+++ b/spec/dummy/public/500.html
@@ -0,0 +1,66 @@
+
+
+
+ We're sorry, but something went wrong (500)
+
+
+
+
+
+
+
+
+
We're sorry, but something went wrong.
+
+
If you are the application owner check the logs for more information.
+
+
+
diff --git a/spec/dummy/public/apple-touch-icon-precomposed.png b/spec/dummy/public/apple-touch-icon-precomposed.png
new file mode 100644
index 0000000..e69de29
diff --git a/spec/dummy/public/apple-touch-icon.png b/spec/dummy/public/apple-touch-icon.png
new file mode 100644
index 0000000..e69de29
diff --git a/spec/dummy/public/favicon.ico b/spec/dummy/public/favicon.ico
new file mode 100644
index 0000000..e69de29
diff --git a/spec/dummy/storage/.keep b/spec/dummy/storage/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/spec/integration/dashboard_integration_spec.rb b/spec/integration/dashboard_integration_spec.rb
new file mode 100644
index 0000000..21f1a25
--- /dev/null
+++ b/spec/integration/dashboard_integration_spec.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+require "rails_helper"
+
+RSpec.describe "Dashboard" do
+ it "registers Tinymce field within PostDashboard ATTRIBUTE_TYPES" do
+ expect(PostDashboard::ATTRIBUTE_TYPES[:title]).to eq(Administrate::Field::Tinymce)
+ end
+
+ it "registers content field with Field::Tinymce.with_options" do
+ expect(PostDashboard::ATTRIBUTE_TYPES[:content].options).to eq({ columns: 100, rows: 100 })
+ end
+end
diff --git a/spec/integration/view_post_spec.rb b/spec/integration/view_post_spec.rb
new file mode 100644
index 0000000..b2e2de9
--- /dev/null
+++ b/spec/integration/view_post_spec.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+require "rails_helper"
+
+RSpec.describe "View Post", type: :request do
+ let(:post) { Post.create(title: "My Post", content: "My post content") }
+
+ it "adds tinymce to the content field" do
+ get admin_post_path(post)
+ expect(response.body).to include(post.title)
+ expect(response.body).to include(post.content)
+ expect(response.body).to include("attribute-data--tinymce")
+ end
+end
diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb
new file mode 100644
index 0000000..22908d2
--- /dev/null
+++ b/spec/rails_helper.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+require "spec_helper"
+require "rails"
+
+Rails.env = "test"
+require File.expand_path("dummy/config/environment", __dir__)
+
+require "rspec/rails"
+
+RSpec.configure do |config|
+ config.before(:suite) do
+ ActiveRecord::Migration.check_pending!
+ ActiveRecord::Migration.maintain_test_schema!
+ end
+
+ config.use_transactional_fixtures = true
+end
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index af0306c..40b838c 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
require "bundler/setup"
require "administrate/field/tinymce"