├── .rspec ├── lib ├── bool_at │ ├── version.rb │ └── macro.rb └── bool_at.rb ├── bin ├── setup └── console ├── spec ├── bool_at_spec.rb ├── spec_helper.rb └── bool_at │ └── macro_spec.rb ├── db └── config.yml ├── gemfiles ├── rails_6.gemfile └── rails_7.gemfile ├── Gemfile ├── CHANGELOG.md ├── .gitignore ├── .rubocop.yml ├── Rakefile ├── LICENSE.txt ├── .circleci └── config.yml ├── bool_at.gemspec ├── README.md ├── CODE_OF_CONDUCT.md └── Gemfile.lock /.rspec: -------------------------------------------------------------------------------- 1 | --format documentation 2 | --color 3 | --require spec_helper 4 | -------------------------------------------------------------------------------- /lib/bool_at/version.rb: -------------------------------------------------------------------------------- 1 | module BoolAt 2 | VERSION = "0.2.3".freeze 3 | end 4 | -------------------------------------------------------------------------------- /bin/setup: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -euo pipefail 3 | IFS=$'\n\t' 4 | set -vx 5 | 6 | bundle install 7 | -------------------------------------------------------------------------------- /spec/bool_at_spec.rb: -------------------------------------------------------------------------------- 1 | RSpec.describe BoolAt do 2 | it "has a version number" do 3 | expect(BoolAt::VERSION).not_to be nil 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/config.yml: -------------------------------------------------------------------------------- 1 | default: &default 2 | adapter: sqlite3 3 | database: bool_at 4 | 5 | development: 6 | <<: *default 7 | 8 | test: 9 | <<: *default 10 | -------------------------------------------------------------------------------- /gemfiles/rails_6.gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | gemspec path: "../" 4 | 5 | gem "activerecord", "~> 6.1.4.4" 6 | gem "activesupport", "~> 6.1.4.4" 7 | -------------------------------------------------------------------------------- /gemfiles/rails_7.gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | gemspec path: "../" 4 | 5 | gem "activerecord", "~> 7.0.1" 6 | gem "activesupport", "~> 7.0.1" 7 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | git_source(:github) { |repo_name| "https://github.com/#{repo_name}" } 4 | 5 | # Specify your gem's dependencies in bool_at.gemspec 6 | gemspec 7 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # 0.2.3 Avoid updating `_at` attr when already set 21 Sept 2023 2 | 3 | https://github.com/elithecho/bool_at/pull/4 4 | 5 | - Avoid overwriting the `_at` attribute when it is already set 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.bundle/ 2 | /.yardoc 3 | /_yardoc/ 4 | /coverage/ 5 | /doc/ 6 | /pkg/ 7 | /spec/reports/ 8 | /tmp/ 9 | 10 | # rspec failure tracking 11 | .rspec_status 12 | 13 | .DS_Store 14 | 15 | .byebug_history 16 | bool_at_test 17 | -------------------------------------------------------------------------------- /.rubocop.yml: -------------------------------------------------------------------------------- 1 | Style/StringLiterals: 2 | EnforcedStyle: double_quotes 3 | 4 | Style/Documentation: 5 | Enabled: false 6 | 7 | Metrics/BlockLength: 8 | Max: 50 9 | 10 | Metrics/MethodLength: 11 | Max: 20 12 | 13 | Metrics/ClassLength: 14 | Max: 1500 15 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | require "rubygems" 2 | require "bundler/gem_tasks" 3 | require "rspec/core/rake_task" 4 | # require "rubocop/rake_task" 5 | require "standalone_migrations" 6 | StandaloneMigrations::Tasks.load_tasks 7 | 8 | RSpec::Core::RakeTask.new(:spec) 9 | # RuboCop::RakeTask.new 10 | 11 | task default: %i[spec] 12 | -------------------------------------------------------------------------------- /lib/bool_at.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | require "active_record" 4 | require "active_support" 5 | 6 | require "bool_at/version" 7 | require "bool_at/macro" 8 | 9 | module BoolAt 10 | extend ActiveSupport::Concern 11 | include Macro 12 | end 13 | 14 | ActiveSupport.on_load(:active_record) do 15 | ActiveRecord::Base.include BoolAt 16 | end 17 | -------------------------------------------------------------------------------- /bin/console: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | 3 | require "bundler/setup" 4 | require "bool_at" 5 | require "rspec" 6 | 7 | dbconfig = YAML.safe_load(File.open("db/config.yml")) 8 | ActiveRecord::Base.establish_connection(dbconfig["development"]) 9 | 10 | # You can add fixtures and/or initialization code here to make experimenting 11 | # with your gem easier. You can also use a different console, if you like. 12 | 13 | # (If you use this, don't forget to add pry to your Gemfile!) 14 | # require "pry" 15 | # Pry.start 16 | 17 | require "irb" 18 | IRB.start(__FILE__) 19 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2018 Chong Hui 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | # Use the latest 2.1 version of CircleCI pipeline process engine. 2 | # See: https://circleci.com/docs/2.0/configuration-reference 3 | version: 2.1 4 | 5 | # Orbs are reusable packages of CircleCI configuration that you may share across projects, enabling you to create encapsulated, parameterized commands, jobs, and executors that can be used across multiple projects. 6 | # See: https://circleci.com/docs/2.0/orb-intro/ 7 | orbs: 8 | ruby: circleci/ruby@1.4.0 9 | 10 | # Define a job to be invoked later in a workflow. 11 | # See: https://circleci.com/docs/2.0/configuration-reference/#jobs 12 | jobs: 13 | build-test: 14 | docker: 15 | - image: cimg/ruby:3.1.0 16 | executor: ruby/default 17 | steps: 18 | - checkout 19 | - run: 20 | name: Which bundler? 21 | command: bundle -v 22 | - run: bundle install 23 | - run: bundle exec rspec 24 | 25 | # Invoke jobs via workflows 26 | # See: https://circleci.com/docs/2.0/configuration-reference/#workflows 27 | workflows: 28 | test: # This is the name of the workflow, feel free to change it to better match your workflow. 29 | # Inside the workflow, you define the jobs you want to run. 30 | jobs: 31 | - build-test 32 | 33 | -------------------------------------------------------------------------------- /bool_at.gemspec: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | lib = File.expand_path("lib", __dir__) 4 | $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) 5 | require "bool_at/version" 6 | 7 | Gem::Specification.new do |spec| 8 | spec.name = "bool_at" 9 | spec.version = BoolAt::VERSION 10 | spec.authors = ["Chong Hui"] 11 | spec.email = ["iamchoonggg@gmail.com"] 12 | 13 | spec.summary = "Convert datetime to boolean in ActiveRecord" 14 | spec.description = "Convert datetime to boolean in ActiveRecord." 15 | spec.homepage = "https://github.com/choonggg/bool_at" 16 | spec.license = "MIT" 17 | 18 | spec.files = `git ls-files -z`.split("\x0") 19 | spec.bindir = "exe" 20 | spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) } 21 | spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) 22 | spec.require_paths = ["lib"] 23 | 24 | # Not recommending old ActiveRecord version 25 | spec.add_dependency 'activerecord', '>= 6' 26 | 27 | spec.add_development_dependency "bundler", "~> 2.3.6" 28 | spec.add_development_dependency "pry", "~>0.11.3" 29 | spec.add_development_dependency "rspec", "~> 3.10" 30 | spec.add_development_dependency "rubocop", "~> 1.25.0" 31 | spec.add_development_dependency "sqlite3", "1.4.2" 32 | spec.add_development_dependency "standalone_migrations", ">= 6" 33 | end 34 | -------------------------------------------------------------------------------- /spec/spec_helper.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | require "bool_at" 4 | 5 | $LOAD_PATH.unshift File.expand_path("../../lib", __FILE__) 6 | ActiveRecord::Base.logger = Logger.new(STDERR) 7 | ActiveRecord::Base.logger.level = 3 8 | 9 | class Post < ActiveRecord::Base; end 10 | 11 | RSpec.configure do |config| 12 | # Enable flags like --only-failures and --next-failure 13 | config.example_status_persistence_file_path = ".rspec_status" 14 | 15 | # Disable RSpec exposing methods globally on `Module` and `main` 16 | config.disable_monkey_patching! 17 | 18 | config.expect_with :rspec do |c| 19 | c.syntax = :expect 20 | end 21 | 22 | config.before(:all) do 23 | Time.zone = "Singapore" 24 | 25 | ActiveRecord::Base.establish_connection( 26 | adapter: "sqlite3", 27 | encoding: "unicode", 28 | database: "bool_at_test" 29 | ) 30 | create_database 31 | end 32 | 33 | config.after(:all) do 34 | drop_database 35 | end 36 | 37 | config.after(:each) do 38 | Post.delete_all 39 | end 40 | end 41 | 42 | def create_database 43 | ActiveRecord::Schema.define(version: 1) do 44 | create_table :posts do |t| 45 | t.timestamp :published_at 46 | t.timestamps null: true 47 | end 48 | end 49 | end 50 | 51 | def drop_database 52 | ActiveRecord::Base.connection.tables.each do |table| 53 | ActiveRecord::Base.connection.drop_table(table) 54 | end 55 | end 56 | -------------------------------------------------------------------------------- /lib/bool_at/macro.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | module BoolAt 4 | module Macro 5 | module ClassMethods 6 | def bool_at(*attrs) 7 | attrs.each do |attr| 8 | at_attribute = "#{attr}_at" 9 | at_setter = "#{attr}_at=" 10 | setter = "#{attr}=" 11 | predicate = "#{attr}?" 12 | 13 | attribute attr, :boolean, default: false 14 | 15 | after_initialize do 16 | self[attr] = send(attr) 17 | end 18 | 19 | # Changes dirty state in virtual attribute 20 | define_method setter do |value| 21 | super(value) 22 | send(at_setter, self[attr] ? self[at_attribute] || Time.now : nil) 23 | end 24 | 25 | define_method attr do 26 | send(at_attribute).present? if respond_to?(at_attribute) 27 | end 28 | 29 | define_method at_setter do |value| 30 | self[attr] = value.present? 31 | super(value) 32 | end 33 | 34 | alias_method predicate, attr 35 | 36 | scope attr, -> { where("#{table_name}.#{attr}_at IS NOT NULL") } 37 | scope :"not_#{attr}", -> { where("#{table_name}.#{attr}_at IS NULL") } 38 | scope :"order_#{attr}", -> { order("#{table_name}.#{attr}_at DESC") } 39 | scope :"reverse_#{attr}", -> { order("#{table_name}.#{attr}_at ASC") } 40 | end 41 | end 42 | end 43 | end 44 | end 45 | -------------------------------------------------------------------------------- /spec/bool_at/macro_spec.rb: -------------------------------------------------------------------------------- 1 | require "spec_helper" 2 | 3 | RSpec.describe BoolAt::Macro do 4 | before do 5 | Post.bool_at :published 6 | end 7 | 8 | describe "#bool_at" do 9 | it "defines bool_at to Model" do 10 | post = Post.new 11 | expect(post.published?).to be false 12 | end 13 | 14 | describe "#bool?" do 15 | it "is false when boo_at nil" do 16 | post = Post.new(published_at: nil) 17 | expect(post.published?).to be false 18 | end 19 | 20 | it "is true when date_time is defined in key_attribute" do 21 | post = Post.new(published_at: Time.now) 22 | expect(post.published?).to be true 23 | end 24 | end 25 | 26 | describe "setter" do 27 | it "sets time on current value" do 28 | post = Post.new 29 | post.published = true 30 | expect(post.published?).to be true 31 | expect(post.published_at).to be_a(Time) 32 | end 33 | 34 | it "removes value if nil" do 35 | post = Post.new(published_at: Time.current) 36 | post.published = false 37 | expect(post.published?).to be false 38 | end 39 | 40 | it "keep time if already set" do 41 | past_date = 2.days.ago.to_time 42 | post = Post.new(published_at: past_date) 43 | post.published = true 44 | expect(post.published?).to be true 45 | expect(post.published_at).to be past_date 46 | end 47 | end 48 | end 49 | end 50 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![CircleCI](https://circleci.com/gh/elithecho/bool_at/tree/master.svg?style=svg)](https://circleci.com/gh/elithecho/bool_at/tree/master) 2 | 3 | ## Installation 4 | 5 | Add this line to your application's Gemfile: 6 | 7 | ```ruby 8 | gem 'bool_at' 9 | ``` 10 | 11 | And then execute: 12 | 13 | $ bundle 14 | 15 | Or install it yourself as: 16 | 17 | $ gem install bool_at 18 | 19 | ## Usage 20 | 21 | bool_at converts timestamps `time_at` methods into boolean 22 | 23 | Add `bool_at` to your model 24 | 25 | ``` 26 | class Post < ActiveRecord::Base 27 | bool_at :published_at 28 | end 29 | ``` 30 | 31 | These methods will be available 32 | 33 | ``` 34 | post = Post.new 35 | post.published? #=> false 36 | 37 | post.published = true 38 | post.published? #=> true 39 | post.published_at #=> Will be set when published was assigned true 40 | ``` 41 | 42 | It also adds scope to your Rails model. 43 | 44 | ``` 45 | Post.published 46 | Post.not_published 47 | Post.order_published 48 | Post.reverse_published 49 | ``` 50 | 51 | ### Methods 52 | 53 | It adds and `?` method to your timestamps without `_at` prefix 54 | 55 | ## Development 56 | 57 | After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment. 58 | 59 | To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org). 60 | 61 | ## Contributing 62 | 63 | Bug reports and pull requests are welcome on GitHub at https://github.com/elithecho/bool_at. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct. 64 | 65 | ## License 66 | 67 | The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT). 68 | 69 | ## Code of Conduct 70 | 71 | Everyone interacting in the BoolAt project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/elithecho/bool_at/blob/master/CODE_OF_CONDUCT.md). 72 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, gender identity and expression, level of experience, 9 | nationality, personal appearance, race, religion, or sexual identity and 10 | orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | * Using welcoming and inclusive language 18 | * Being respectful of differing viewpoints and experiences 19 | * Gracefully accepting constructive criticism 20 | * Focusing on what is best for the community 21 | * Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | * The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | * Trolling, insulting/derogatory comments, and personal or political attacks 28 | * Public or private harassment 29 | * Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | * Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team at iamchoonggg@gmail.com. All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 | available at [http://contributor-covenant.org/version/1/4][version] 72 | 73 | [homepage]: http://contributor-covenant.org 74 | [version]: http://contributor-covenant.org/version/1/4/ 75 | -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | PATH 2 | remote: . 3 | specs: 4 | bool_at (0.2.3) 5 | activerecord (>= 6) 6 | 7 | GEM 8 | remote: https://rubygems.org/ 9 | specs: 10 | actionpack (6.1.5) 11 | actionview (= 6.1.5) 12 | activesupport (= 6.1.5) 13 | rack (~> 2.0, >= 2.0.9) 14 | rack-test (>= 0.6.3) 15 | rails-dom-testing (~> 2.0) 16 | rails-html-sanitizer (~> 1.0, >= 1.2.0) 17 | actionview (6.1.5) 18 | activesupport (= 6.1.5) 19 | builder (~> 3.1) 20 | erubi (~> 1.4) 21 | rails-dom-testing (~> 2.0) 22 | rails-html-sanitizer (~> 1.1, >= 1.2.0) 23 | activemodel (6.1.5) 24 | activesupport (= 6.1.5) 25 | activerecord (6.1.5) 26 | activemodel (= 6.1.5) 27 | activesupport (= 6.1.5) 28 | activesupport (6.1.5) 29 | concurrent-ruby (~> 1.0, >= 1.0.2) 30 | i18n (>= 1.6, < 2) 31 | minitest (>= 5.1) 32 | tzinfo (~> 2.0) 33 | zeitwerk (~> 2.3) 34 | ast (2.4.2) 35 | builder (3.2.4) 36 | coderay (1.1.3) 37 | concurrent-ruby (1.1.9) 38 | crass (1.0.6) 39 | diff-lcs (1.5.0) 40 | erubi (1.10.0) 41 | i18n (1.10.0) 42 | concurrent-ruby (~> 1.0) 43 | loofah (2.15.0) 44 | crass (~> 1.0.2) 45 | nokogiri (>= 1.5.9) 46 | method_source (0.9.2) 47 | mini_portile2 (2.8.0) 48 | minitest (5.15.0) 49 | nokogiri (1.13.4) 50 | mini_portile2 (~> 2.8.0) 51 | racc (~> 1.4) 52 | parallel (1.21.0) 53 | parser (3.1.0.0) 54 | ast (~> 2.4.1) 55 | pry (0.11.3) 56 | coderay (~> 1.1.0) 57 | method_source (~> 0.9.0) 58 | racc (1.6.0) 59 | rack (2.2.3) 60 | rack-test (1.1.0) 61 | rack (>= 1.0, < 3) 62 | rails-dom-testing (2.0.3) 63 | activesupport (>= 4.2.0) 64 | nokogiri (>= 1.6) 65 | rails-html-sanitizer (1.4.2) 66 | loofah (~> 2.3) 67 | railties (6.1.5) 68 | actionpack (= 6.1.5) 69 | activesupport (= 6.1.5) 70 | method_source 71 | rake (>= 12.2) 72 | thor (~> 1.0) 73 | rainbow (3.1.1) 74 | rake (13.0.6) 75 | regexp_parser (2.2.0) 76 | rexml (3.2.5) 77 | rspec (3.10.0) 78 | rspec-core (~> 3.10.0) 79 | rspec-expectations (~> 3.10.0) 80 | rspec-mocks (~> 3.10.0) 81 | rspec-core (3.10.2) 82 | rspec-support (~> 3.10.0) 83 | rspec-expectations (3.10.2) 84 | diff-lcs (>= 1.2.0, < 2.0) 85 | rspec-support (~> 3.10.0) 86 | rspec-mocks (3.10.3) 87 | diff-lcs (>= 1.2.0, < 2.0) 88 | rspec-support (~> 3.10.0) 89 | rspec-support (3.10.3) 90 | rubocop (1.25.0) 91 | parallel (~> 1.10) 92 | parser (>= 3.1.0.0) 93 | rainbow (>= 2.2.2, < 4.0) 94 | regexp_parser (>= 1.8, < 3.0) 95 | rexml 96 | rubocop-ast (>= 1.15.1, < 2.0) 97 | ruby-progressbar (~> 1.7) 98 | unicode-display_width (>= 1.4.0, < 3.0) 99 | rubocop-ast (1.15.1) 100 | parser (>= 3.0.1.1) 101 | ruby-progressbar (1.11.0) 102 | sqlite3 (1.4.2) 103 | standalone_migrations (6.1.0) 104 | activerecord (>= 4.2.7, < 6.2.0, != 5.2.3.rc1, != 5.2.3) 105 | railties (>= 4.2.7, < 6.2.0, != 5.2.3.rc1, != 5.2.3) 106 | rake (>= 10.0) 107 | thor (1.2.1) 108 | tzinfo (2.0.4) 109 | concurrent-ruby (~> 1.0) 110 | unicode-display_width (2.1.0) 111 | zeitwerk (2.5.4) 112 | 113 | PLATFORMS 114 | ruby 115 | 116 | DEPENDENCIES 117 | bool_at! 118 | bundler (~> 2.3.6) 119 | pry (~> 0.11.3) 120 | rspec (~> 3.10) 121 | rubocop (~> 1.25.0) 122 | sqlite3 (= 1.4.2) 123 | standalone_migrations (>= 6) 124 | 125 | BUNDLED WITH 126 | 2.3.9 127 | --------------------------------------------------------------------------------