rails-brotli-cache 0.0.1 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +34 -0
  3. data/.gitignore +9 -0
  4. data/README.md +91 -2
  5. data/Rakefile +5 -0
  6. data/docker-compose.yml.sample +11 -0
  7. data/lib/rails-brotli-cache/version.rb +3 -1
  8. data/lib/rails-brotli-cache.rb +69 -1
  9. data/rails-brotli-cache.gemspec +6 -2
  10. data/spec/dummy/Gemfile +45 -0
  11. data/spec/dummy/README.md +24 -0
  12. data/spec/dummy/Rakefile +6 -0
  13. data/spec/dummy/app/assets/config/manifest.js +2 -0
  14. data/spec/dummy/app/assets/images/.keep +0 -0
  15. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  16. data/spec/dummy/app/controllers/application_controller.rb +2 -0
  17. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  18. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  19. data/spec/dummy/app/models/concerns/.keep +0 -0
  20. data/spec/dummy/app/views/layouts/application.html.erb +15 -0
  21. data/spec/dummy/bin/bundle +114 -0
  22. data/spec/dummy/bin/rails +4 -0
  23. data/spec/dummy/bin/rake +4 -0
  24. data/spec/dummy/bin/setup +25 -0
  25. data/spec/dummy/config/application.rb +37 -0
  26. data/spec/dummy/config/boot.rb +3 -0
  27. data/spec/dummy/config/credentials.yml.enc +1 -0
  28. data/spec/dummy/config/environment.rb +5 -0
  29. data/spec/dummy/config/environments/development.rb +41 -0
  30. data/spec/dummy/config/environments/production.rb +72 -0
  31. data/spec/dummy/config/environments/test.rb +50 -0
  32. data/spec/dummy/config/initializers/assets.rb +12 -0
  33. data/spec/dummy/config/initializers/content_security_policy.rb +25 -0
  34. data/spec/dummy/config/initializers/filter_parameter_logging.rb +8 -0
  35. data/spec/dummy/config/initializers/inflections.rb +16 -0
  36. data/spec/dummy/config/initializers/permissions_policy.rb +11 -0
  37. data/spec/dummy/config/locales/en.yml +33 -0
  38. data/spec/dummy/config/master.key +1 -0
  39. data/spec/dummy/config/puma.rb +43 -0
  40. data/spec/dummy/config/routes.rb +6 -0
  41. data/spec/dummy/config.ru +6 -0
  42. data/spec/dummy/lib/assets/.keep +0 -0
  43. data/spec/dummy/lib/tasks/.keep +0 -0
  44. data/spec/dummy/public/404.html +67 -0
  45. data/spec/dummy/public/422.html +67 -0
  46. data/spec/dummy/public/500.html +66 -0
  47. data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
  48. data/spec/dummy/public/apple-touch-icon.png +0 -0
  49. data/spec/dummy/public/favicon.ico +0 -0
  50. data/spec/dummy/public/robots.txt +1 -0
  51. data/spec/dummy/vendor/.keep +0 -0
  52. data/spec/fixtures/sample.json +1 -0
  53. data/spec/rails-brotli-cache/common_spec.rb +58 -0
  54. data/spec/rails-brotli-cache/redis_spec.rb +41 -0
  55. data/spec/spec_helper.rb +7 -0
  56. metadata +152 -8
  57. data/Gemfile.lock +0 -172
  58. data/lib/rails-brotli-cache/main.rb +0 -5
  59. data/spec/rails-brotli-cache/main_spec.rb +0 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7d098c81efe4a27494a1fe24ca629a6b15626b422562d0a730a49391bfda6c89
4
- data.tar.gz: fa966f9fed6b7b3af70b4813c1913f90e1f8676fdcca1002be50fa0489d22829
3
+ metadata.gz: 16016a858334a3110d884e44bf6ce43fce75ac926c75973980f189a1477152b3
4
+ data.tar.gz: 58756fbc6b6da6bde9144f07352302814d638664b567ad9f51ad069073ac0b35
5
5
  SHA512:
6
- metadata.gz: 8243b75dcc06ce8be2abe75b205257a2c753392fd12e29490d55b2c8137a8ce9c5ab6742da28adf4de5469cdf87670bf4fa65eafc1264aee20e73addceef8314
7
- data.tar.gz: 5db4acf073dcbc191acc8cfa60397c95009e6630fb6243bb7bebe78951516d85565b445d28ab9b6522883f09b20f44fabd4dfd31e7f171c4fcbaca3bf444f751
6
+ metadata.gz: 7276bf3a52a7861fc80c3be8772c190bbc153c26b26f88c152bce44083aae5cfb294b6720d23f40a0f6766905b6b17431d7c1295781604224af9f6738741a68a
7
+ data.tar.gz: 4c784d5e0ce3fbe2c7242d875b4be25b87b2984148e54ab981d47069613d165b0065e57b0336f933e4bb7206453eb95cb66870dc2eb37d7b2bba005b52bf4e9f
@@ -0,0 +1,34 @@
1
+ version: 2
2
+ jobs:
3
+ test:
4
+ docker:
5
+ - image: cimg/ruby:2.7.6
6
+ - image: redis:alpine
7
+ - image: memcached:alpine
8
+ parallelism: 1
9
+ steps:
10
+ - checkout
11
+ - run: gem update --system
12
+ - run: gem install bundler
13
+ - run: sudo apt-get update --allow-releaseinfo-change
14
+ - run: bundle config set --local path 'vendor/bundle'
15
+ - run: bundle install
16
+ - run: sleep 5
17
+ - run:
18
+ name: Run specs for redis cache store
19
+ environment:
20
+ TEST_CACHE_STORE: redis_cache_store
21
+ command: bundle exec rspec spec/
22
+ - run:
23
+ name: Run specs for memcached cache store
24
+ environment:
25
+ TEST_CACHE_STORE: mem_cache_store
26
+ command: bundle exec rspec spec/
27
+ - run:
28
+ name: Run specs for in-memory cache store
29
+ command: bundle exec rspec spec/
30
+ workflows:
31
+ version: 2
32
+ test:
33
+ jobs:
34
+ - test
data/.gitignore CHANGED
@@ -1,3 +1,12 @@
1
1
  .tool-versions
2
2
  coverage/
3
+ pkg/
4
+ Gemfile.lock
5
+ .ruby-version
6
+ pkg/
7
+ *.gem
8
+ docker-compose.yml
9
+ .byebug_history
10
+ spec/dummy/log/
11
+ spec/dummy/tmp/
3
12
 
data/README.md CHANGED
@@ -1,3 +1,92 @@
1
- # Rails Brotli Cache
1
+ # Rails Brotli Cache [![Gem Version](https://badge.fury.io/rb/rails-brotli-cache.svg)](https://badge.fury.io/rb/rails-brotli-cache) [![CircleCI](https://circleci.com/gh/pawurb/rails-brotli-cache.svg?style=svg)](https://circleci.com/gh/pawurb/rails-brotli-cache)
2
2
 
3
- WIP
3
+ This gem enables support for compressing Ruby on Rails cache entries using the [Brotli compression algorithm](https://github.com/google/brotli). Brotli is a modern compression algorithm developed by Google that provides superior compression ratios and performance compared to the default Gzip algorithm.
4
+
5
+ **The gem is currently in an early stage of development. Ideas on how to improve it and PRs are welcome.**
6
+
7
+ ## Benchmarks
8
+
9
+ Brotli offers a better compression and faster performance.
10
+
11
+ **~25%** better compression of a sample JSON object:
12
+
13
+ ```ruby
14
+ json = File.read("sample.json") # sample 565kb JSON text
15
+ json.size # => 562033
16
+ Rails.cache.write("json", json)
17
+ RailsBrotliCache.write("json", json)
18
+
19
+ ## Check the size of cache entry stored in Redis
20
+ $redis.get("json").size # => 41697
21
+ $redis.get("br-json").size # => 31601
22
+ ```
23
+
24
+ **~20%** better compression of a sample ActiveRecord objects array:
25
+
26
+ ```ruby
27
+ users = User.limit(100).to_a # 100 ActiveRecord objects
28
+ Rails.cache.write("users", users)
29
+ RailsBrotliCache.write("users", users)
30
+ $redis.get("users").size # => 12331
31
+ $redis.get("br-users").size # => 10299
32
+ ```
33
+
34
+
35
+ **~25%** faster performance for reading/writing a larger JSON file:
36
+
37
+ ```ruby
38
+ json = File.read("sample.json") # sample 565kb JSON text
39
+
40
+ Benchmark.bm do |x|
41
+ x.report("Rails.cache") do
42
+ 1000.times do
43
+ Rails.cache.write("test", json)
44
+ Rails.cache.read("test")
45
+ end
46
+ end
47
+
48
+ x.report("RailsBrotliCache") do
49
+ 1000.times do
50
+ RailsBrotliCache.write("test", json)
51
+ RailsBrotliCache.read("test")
52
+ end
53
+ end
54
+ end
55
+
56
+ # user system total real
57
+ # Rails.cache 5.177678 0.216435 5.394113 ( 8.296072)
58
+ # RailsBrotliCache 3.513312 0.323601 3.836913 ( 6.114179)
59
+ ```
60
+
61
+ ## API
62
+
63
+ `RailsBrotliCache` module exposes methods that are compatible with the default `Rails.cache`. Values are stored in the underlying `Rails.cache` store but precompressed with Brotli algorithm.
64
+
65
+ You can use it just like the default `Rails.cache` API:
66
+
67
+ ```ruby
68
+ RailsBrotliCache.read("test-key") # => nil
69
+ RailsBrotliCache.fetch("test-key") { 123 } # => 123
70
+ RailsBrotliCache.delete("test-key")
71
+ RailsBrotliCache.read("test-key") # => nil
72
+ RailsBrotliCache.write("test-key", 123, expires_in: 5.seconds)
73
+ sleep 6
74
+ RailsBrotliCache.read("test-key") # => nil
75
+
76
+ ```
77
+
78
+ Gem appends `br-` to the cache key names to prevent conflicts with previously saved cache entries. You can disable this behaviour by adding the following initializer file:
79
+
80
+ `app/config/initializers/rails-brotli-cache.rb`
81
+
82
+ ```ruby
83
+ RailsBrotliCache.disable_prefix!
84
+ ```
85
+
86
+ ## Testing
87
+
88
+ ```bash
89
+ cp docker-compose.yml.sample docker-compose.yml
90
+ docker compose up -d
91
+ rake test_all
92
+ ```
data/Rakefile CHANGED
@@ -4,3 +4,8 @@ require 'rspec/core/rake_task'
4
4
  RSpec::Core::RakeTask.new(:spec)
5
5
 
6
6
  task default: :spec
7
+
8
+ desc 'Test all cache_stores'
9
+ task :test_all do
10
+ system("TEST_CACHE_STORE=redis_cache_store bundle exec rspec spec/ && TEST_CACHE_STORE=mem_cache_store bundle exec rspec spec/ && bundle exec rspec spec/")
11
+ end
@@ -0,0 +1,11 @@
1
+ version: '3'
2
+
3
+ services:
4
+ redis:
5
+ image: redis:alpine
6
+ ports:
7
+ - '6379:6379'
8
+ memcached:
9
+ image: memcached:alpine
10
+ ports:
11
+ - '11211:11211'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsBrotliCache
2
- VERSION = "0.0.1"
4
+ VERSION = "0.1.1"
3
5
  end
@@ -1,5 +1,73 @@
1
- require 'rails-brotli-cache/main'
1
+ # frozen_string_literal: true
2
+
2
3
  require 'rails-brotli-cache/version'
4
+ require 'brotli'
3
5
 
4
6
  module RailsBrotliCache
7
+ COMPRESS_THRESHOLD = ENV.fetch("BR_CACHE_COMPRESS_THRESHOLD", 1).to_f * 1024.0
8
+ COMPRESS_QUALITY = ENV.fetch("BR_CACHE_COMPRESS_QUALITY", 5).to_i
9
+ MARK_BR_COMPRESSED = "\x02".b
10
+ @@prefix = "br-"
11
+
12
+ def self.fetch(name, options = nil, &block)
13
+ value = read(name, options)
14
+ return value if value.present?
15
+
16
+ if block_given?
17
+ value = block.call
18
+ write(name, value, options)
19
+
20
+ value
21
+ elsif options && options[:force]
22
+ raise ArgumentError, "Missing block: Calling `Cache#fetch` with `force: true` requires a block."
23
+ else
24
+ read(name, options)
25
+ end
26
+ end
27
+
28
+ def self.write(name, value, options = nil)
29
+ serialized = Marshal.dump(value)
30
+
31
+ payload = if serialized.bytesize >= COMPRESS_THRESHOLD
32
+ MARK_BR_COMPRESSED + ::Brotli.deflate(serialized, quality: COMPRESS_QUALITY)
33
+ else
34
+ serialized
35
+ end
36
+
37
+ Rails.cache.write(
38
+ cache_key(name),
39
+ payload,
40
+ (options || {}).merge(compress: false)
41
+ )
42
+ end
43
+
44
+ def self.read(name, options = nil)
45
+ payload = Rails.cache.read(
46
+ cache_key(name),
47
+ options
48
+ )
49
+
50
+ return nil unless payload.present?
51
+
52
+ serialized = if payload.start_with?(MARK_BR_COMPRESSED)
53
+ ::Brotli.inflate(payload.byteslice(1..-1))
54
+ else
55
+ payload
56
+ end
57
+
58
+ Marshal.load(serialized)
59
+ end
60
+
61
+ def self.delete(name, options = nil)
62
+ Rails.cache.delete(cache_key(name), options)
63
+ end
64
+
65
+ def self.disable_prefix!
66
+ @@prefix = nil
67
+ end
68
+
69
+ def self.cache_key(name)
70
+ "#{@@prefix}#{name}"
71
+ end
5
72
  end
73
+
@@ -8,13 +8,17 @@ Gem::Specification.new do |gem|
8
8
  gem.version = RailsBrotliCache::VERSION
9
9
  gem.authors = ["pawurb"]
10
10
  gem.email = ["contact@pawelurbanek.com"]
11
- gem.summary = %q{ Rails cache using Brotli compression algorithm }
12
- gem.description = %q{ rails-brotli-cache allows to reduce storage needed for Rails cache by using Brotli compression which can produce outputs smaller by ~20% }
11
+ gem.summary = %q{ Rails cache using Brotli algorithm offers better compression and performance. }
12
+ gem.description = %q{ rails-brotli-cache allows to reduce storage needed for Rails cache by using Brotli compression which can produce outputs smaller by ~20%. }
13
13
  gem.homepage = "https://github.com/pawurb/rails-brotli-cache"
14
14
  gem.files = `git ls-files`.split("\n")
15
15
  gem.test_files = gem.files.grep(%r{^(spec)/})
16
16
  gem.require_paths = ["lib"]
17
17
  gem.license = "MIT"
18
18
  gem.add_dependency "rails"
19
+ gem.add_dependency "brotli"
19
20
  gem.add_development_dependency "rspec"
21
+ gem.add_development_dependency "redis"
22
+ gem.add_development_dependency "dalli"
23
+ gem.add_development_dependency "byebug"
20
24
  end
@@ -0,0 +1,45 @@
1
+ source "https://rubygems.org"
2
+ git_source(:github) { |repo| "https://github.com/#{repo}.git" }
3
+
4
+ ruby "2.7.5"
5
+
6
+ # Bundle edge Rails instead: gem "rails", github: "rails/rails", branch: "main"
7
+ gem "rails", "~> 7.0.4", ">= 7.0.4.3"
8
+
9
+ # The original asset pipeline for Rails [https://github.com/rails/sprockets-rails]
10
+ gem "sprockets-rails"
11
+
12
+ # Use the Puma web server [https://github.com/puma/puma]
13
+ gem "puma", "~> 5.0"
14
+
15
+ # Build JSON APIs with ease [https://github.com/rails/jbuilder]
16
+ gem "jbuilder"
17
+
18
+ # Use Kredis to get higher-level data types in Redis [https://github.com/rails/kredis]
19
+ # gem "kredis"
20
+
21
+ # Use Active Model has_secure_password [https://guides.rubyonrails.org/active_model_basics.html#securepassword]
22
+ # gem "bcrypt", "~> 3.1.7"
23
+
24
+ # Windows does not include zoneinfo files, so bundle the tzinfo-data gem
25
+ gem "tzinfo-data", platforms: %i[ mingw mswin x64_mingw jruby ]
26
+
27
+ # Use Sass to process CSS
28
+ # gem "sassc-rails"
29
+
30
+ group :development, :test do
31
+ # See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem
32
+ gem "debug", platforms: %i[ mri mingw x64_mingw ]
33
+ end
34
+
35
+ group :development do
36
+ # Use console on exceptions pages [https://github.com/rails/web-console]
37
+ gem "web-console"
38
+
39
+ # Add speed badges [https://github.com/MiniProfiler/rack-mini-profiler]
40
+ # gem "rack-mini-profiler"
41
+
42
+ # Speed up commands on slow machines / big apps [https://github.com/rails/spring]
43
+ # gem "spring"
44
+ end
45
+
@@ -0,0 +1,24 @@
1
+ # README
2
+
3
+ This README would normally document whatever steps are necessary to get the
4
+ application up and running.
5
+
6
+ Things you may want to cover:
7
+
8
+ * Ruby version
9
+
10
+ * System dependencies
11
+
12
+ * Configuration
13
+
14
+ * Database creation
15
+
16
+ * Database initialization
17
+
18
+ * How to run the test suite
19
+
20
+ * Services (job queues, cache servers, search engines, etc.)
21
+
22
+ * Deployment instructions
23
+
24
+ * ...
@@ -0,0 +1,6 @@
1
+ # Add your own tasks in files placed in lib/tasks ending in .rake,
2
+ # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
3
+
4
+ require_relative "config/application"
5
+
6
+ Rails.application.load_tasks
@@ -0,0 +1,2 @@
1
+ //= link_tree ../images
2
+ //= link_directory ../stylesheets .css
File without changes
@@ -0,0 +1,15 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS (and SCSS, if configured) file within this directory, lib/assets/stylesheets, or any plugin's
6
+ * vendor/assets/stylesheets directory can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any other CSS
10
+ * files in this directory. Styles in this file should be added after the last require_* statement.
11
+ * It is generally better to create a new file per style scope.
12
+ *
13
+ *= require_tree .
14
+ *= require_self
15
+ */
@@ -0,0 +1,2 @@
1
+ class ApplicationController < ActionController::Base
2
+ end
File without changes
@@ -0,0 +1,2 @@
1
+ module ApplicationHelper
2
+ end
File without changes
@@ -0,0 +1,15 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Dummy</title>
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <%= csrf_meta_tags %>
7
+ <%= csp_meta_tag %>
8
+
9
+ <%= stylesheet_link_tag "application" %>
10
+ </head>
11
+
12
+ <body>
13
+ <%= yield %>
14
+ </body>
15
+ </html>
@@ -0,0 +1,114 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'bundle' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "rubygems"
12
+
13
+ m = Module.new do
14
+ module_function
15
+
16
+ def invoked_as_script?
17
+ File.expand_path($0) == File.expand_path(__FILE__)
18
+ end
19
+
20
+ def env_var_version
21
+ ENV["BUNDLER_VERSION"]
22
+ end
23
+
24
+ def cli_arg_version
25
+ return unless invoked_as_script? # don't want to hijack other binstubs
26
+ return unless "update".start_with?(ARGV.first || " ") # must be running `bundle update`
27
+ bundler_version = nil
28
+ update_index = nil
29
+ ARGV.each_with_index do |a, i|
30
+ if update_index && update_index.succ == i && a =~ Gem::Version::ANCHORED_VERSION_PATTERN
31
+ bundler_version = a
32
+ end
33
+ next unless a =~ /\A--bundler(?:[= ](#{Gem::Version::VERSION_PATTERN}))?\z/
34
+ bundler_version = $1
35
+ update_index = i
36
+ end
37
+ bundler_version
38
+ end
39
+
40
+ def gemfile
41
+ gemfile = ENV["BUNDLE_GEMFILE"]
42
+ return gemfile if gemfile && !gemfile.empty?
43
+
44
+ File.expand_path("../../Gemfile", __FILE__)
45
+ end
46
+
47
+ def lockfile
48
+ lockfile =
49
+ case File.basename(gemfile)
50
+ when "gems.rb" then gemfile.sub(/\.rb$/, gemfile)
51
+ else "#{gemfile}.lock"
52
+ end
53
+ File.expand_path(lockfile)
54
+ end
55
+
56
+ def lockfile_version
57
+ return unless File.file?(lockfile)
58
+ lockfile_contents = File.read(lockfile)
59
+ return unless lockfile_contents =~ /\n\nBUNDLED WITH\n\s{2,}(#{Gem::Version::VERSION_PATTERN})\n/
60
+ Regexp.last_match(1)
61
+ end
62
+
63
+ def bundler_version
64
+ @bundler_version ||=
65
+ env_var_version || cli_arg_version ||
66
+ lockfile_version
67
+ end
68
+
69
+ def bundler_requirement
70
+ return "#{Gem::Requirement.default}.a" unless bundler_version
71
+
72
+ bundler_gem_version = Gem::Version.new(bundler_version)
73
+
74
+ requirement = bundler_gem_version.approximate_recommendation
75
+
76
+ return requirement unless Gem::Version.new(Gem::VERSION) < Gem::Version.new("2.7.0")
77
+
78
+ requirement += ".a" if bundler_gem_version.prerelease?
79
+
80
+ requirement
81
+ end
82
+
83
+ def load_bundler!
84
+ ENV["BUNDLE_GEMFILE"] ||= gemfile
85
+
86
+ activate_bundler
87
+ end
88
+
89
+ def activate_bundler
90
+ gem_error = activation_error_handling do
91
+ gem "bundler", bundler_requirement
92
+ end
93
+ return if gem_error.nil?
94
+ require_error = activation_error_handling do
95
+ require "bundler/version"
96
+ end
97
+ return if require_error.nil? && Gem::Requirement.new(bundler_requirement).satisfied_by?(Gem::Version.new(Bundler::VERSION))
98
+ warn "Activating bundler (#{bundler_requirement}) failed:\n#{gem_error.message}\n\nTo install the version of bundler this project requires, run `gem install bundler -v '#{bundler_requirement}'`"
99
+ exit 42
100
+ end
101
+
102
+ def activation_error_handling
103
+ yield
104
+ nil
105
+ rescue StandardError, LoadError => e
106
+ e
107
+ end
108
+ end
109
+
110
+ m.load_bundler!
111
+
112
+ if m.invoked_as_script?
113
+ load Gem.bin_path("bundler", "bundle")
114
+ end
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ APP_PATH = File.expand_path("../config/application", __dir__)
3
+ require_relative "../config/boot"
4
+ require "rails/commands"
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ require_relative "../config/boot"
3
+ require "rake"
4
+ Rake.application.run
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env ruby
2
+ require "fileutils"
3
+
4
+ # path to your application root.
5
+ APP_ROOT = File.expand_path("..", __dir__)
6
+
7
+ def system!(*args)
8
+ system(*args) || abort("\n== Command #{args} failed ==")
9
+ end
10
+
11
+ FileUtils.chdir APP_ROOT do
12
+ # This script is a way to set up or update your development environment automatically.
13
+ # This script is idempotent, so that you can run it at any time and get an expectable outcome.
14
+ # Add necessary setup steps to this file.
15
+
16
+ puts "== Installing dependencies =="
17
+ system! "gem install bundler --conservative"
18
+ system("bundle check") || system!("bundle install")
19
+
20
+ puts "\n== Removing old logs and tempfiles =="
21
+ system! "bin/rails log:clear tmp:clear"
22
+
23
+ puts "\n== Restarting application server =="
24
+ system! "bin/rails restart"
25
+ end
@@ -0,0 +1,37 @@
1
+ require_relative "boot"
2
+
3
+ require "rails"
4
+ # Pick the frameworks you want:
5
+ require "active_model/railtie"
6
+ # require "active_job/railtie"
7
+ # require "active_record/railtie"
8
+ # require "active_storage/engine"
9
+ require "action_controller/railtie"
10
+ # require "action_mailer/railtie"
11
+ # require "action_mailbox/engine"
12
+ # require "action_text/engine"
13
+ require "action_view/railtie"
14
+ # require "action_cable/engine"
15
+ # require "rails/test_unit/railtie"
16
+
17
+ # Require the gems listed in Gemfile, including any gems
18
+ # you've limited to :test, :development, or :production.
19
+ Bundler.require(*Rails.groups)
20
+
21
+ module Dummy
22
+ class Application < Rails::Application
23
+ # Initialize configuration defaults for originally generated Rails version.
24
+ config.load_defaults 7.0
25
+
26
+ # Configuration for the application, engines, and railties goes here.
27
+ #
28
+ # These settings can be overridden in specific environments using the files
29
+ # in config/environments, which are processed later.
30
+ #
31
+ # config.time_zone = "Central Time (US & Canada)"
32
+ # config.eager_load_paths << Rails.root.join("extras")
33
+
34
+ # Don't generate system test files.
35
+ config.generators.system_tests = nil
36
+ end
37
+ end
@@ -0,0 +1,3 @@
1
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__)
2
+
3
+ require "bundler/setup" # Set up gems listed in the Gemfile.
@@ -0,0 +1 @@
1
+ 3QQlVtTisvLrhKqInPlY1i4jP47tE/OO4pM8zGjpgX0rFN57s0RLVpVIzclaCygn8Yz1l+JIDeGoghd8Nqilu/AvBwGgsb4Mlsq8MSN4sWfQYtZBkqtzsZ4WgWGdfj/LFTh1OGm+PWTPf7hA596k2plDC6oZA+p/C00d5Gs0KjDk2qBeItWN2Oyp4UBkQiDwYV+ZSMPgeLddhpR9w1rfXD6XhKM/bzSLwsh+Bq0/DqJ41ukO53S4CdgIAm9JIv4hGsG1jgOrrcFY3Uaw3rA5DQLQ5FPeJvOgeXMHs1F/xZMcTnQ7u3wBHLS2qmnVvYYHPYaxD7ZCP0EU2fkTh9ywdM+jYLOjVBHm9s1n4iOjX0T0zr55oZ932wdYSQtAjdU2EKn202Mftl0S5Xx+/8F1+bdS9oj8EttydK94--n17oCtetNlFexV2+--5L+PDgO0y2VKHQBrSd3AdQ==
@@ -0,0 +1,5 @@
1
+ # Load the Rails application.
2
+ require_relative "application"
3
+
4
+ # Initialize the Rails application.
5
+ Rails.application.initialize!
@@ -0,0 +1,41 @@
1
+ require "active_support/core_ext/integer/time"
2
+
3
+ Rails.application.configure do
4
+ # Settings specified here will take precedence over those in config/application.rb.
5
+
6
+ # In the development environment your application's code is reloaded any time
7
+ # it changes. This slows down response time but is perfect for development
8
+ # since you don't have to restart the web server when you make code changes.
9
+ config.cache_classes = false
10
+
11
+ # Do not eager load code on boot.
12
+ config.eager_load = false
13
+
14
+ # Show full error reports.
15
+ config.consider_all_requests_local = true
16
+
17
+ # Enable server timing
18
+ config.server_timing = true
19
+
20
+ # Enable/disable caching. By default caching is disabled.
21
+ # Run rails dev:cache to toggle caching.
22
+ config.cache_store = (ENV["TEST_CACHE_STORE"] || :memory_store).to_sym
23
+
24
+ # Print deprecation notices to the Rails logger.
25
+ config.active_support.deprecation = :log
26
+
27
+ # Raise exceptions for disallowed deprecations.
28
+ config.active_support.disallowed_deprecation = :raise
29
+
30
+ # Tell Active Support which deprecation messages to disallow.
31
+ config.active_support.disallowed_deprecation_warnings = []
32
+
33
+ # Raises error for missing translations.
34
+ # config.i18n.raise_on_missing_translations = true
35
+
36
+ # Annotate rendered view with file names.
37
+ # config.action_view.annotate_rendered_view_with_filenames = true
38
+
39
+ # Uncomment if you wish to allow Action Cable access from any origin.
40
+ # config.action_cable.disable_request_forgery_protection = true
41
+ end