├── .circleci └── config.yml ├── .github └── CODEOWNERS ├── .gitignore ├── .ruby-version ├── CHANGELOG.md ├── CONTRIBUTING.md ├── Gemfile ├── Gemfile.lock ├── LICENSE ├── README.md ├── README_example.gif ├── Rakefile ├── app ├── assets │ ├── config │ │ └── rake_ui_manifest.js │ └── stylesheets │ │ └── rake_ui │ │ └── application.css ├── controllers │ └── rake_ui │ │ ├── application_controller.rb │ │ ├── rake_task_logs_controller.rb │ │ └── rake_tasks_controller.rb ├── helpers │ └── rake_ui │ │ └── application_helper.rb ├── models │ └── rake_ui │ │ ├── .keep │ │ ├── rake_task.rb │ │ └── rake_task_log.rb └── views │ ├── layouts │ └── rake_ui │ │ └── application.html.erb │ ├── partials │ └── rake_ui │ │ └── _table_filterable.html │ └── rake_ui │ ├── rake_task_logs │ ├── index.html.erb │ └── show.html.erb │ └── rake_tasks │ ├── index.html.erb │ └── show.html.erb ├── bin └── rails ├── config └── routes.rb ├── lib ├── rake-ui.rb ├── rake-ui │ ├── engine.rb │ └── version.rb └── tasks │ └── rake_ui │ └── tasks.rake ├── rake-ui.gemspec ├── test ├── dummy │ ├── Rakefile │ ├── app │ │ ├── assets │ │ │ ├── config │ │ │ │ └── manifest.js │ │ │ ├── images │ │ │ │ └── .keep │ │ │ └── stylesheets │ │ │ │ └── application.css │ │ ├── channels │ │ │ └── application_cable │ │ │ │ ├── channel.rb │ │ │ │ └── connection.rb │ │ ├── controllers │ │ │ ├── application_controller.rb │ │ │ └── concerns │ │ │ │ └── .keep │ │ ├── helpers │ │ │ └── application_helper.rb │ │ ├── javascript │ │ │ └── packs │ │ │ │ └── application.js │ │ ├── jobs │ │ │ └── application_job.rb │ │ ├── mailers │ │ │ └── application_mailer.rb │ │ ├── models │ │ │ ├── application_record.rb │ │ │ └── concerns │ │ │ │ └── .keep │ │ └── views │ │ │ └── layouts │ │ │ ├── application.html.erb │ │ │ ├── mailer.html.erb │ │ │ └── mailer.text.erb │ ├── bin │ │ ├── rails │ │ ├── rake │ │ └── setup │ ├── config.ru │ ├── config │ │ ├── application.rb │ │ ├── boot.rb │ │ ├── cable.yml │ │ ├── database.yml │ │ ├── environment.rb │ │ ├── environments │ │ │ ├── development.rb │ │ │ ├── production.rb │ │ │ └── test.rb │ │ ├── initializers │ │ │ ├── application_controller_renderer.rb │ │ │ ├── assets.rb │ │ │ ├── backtrace_silencers.rb │ │ │ ├── content_security_policy.rb │ │ │ ├── cookies_serializer.rb │ │ │ ├── filter_parameter_logging.rb │ │ │ ├── inflections.rb │ │ │ ├── mime_types.rb │ │ │ ├── permissions_policy.rb │ │ │ └── wrap_parameters.rb │ │ ├── locales │ │ │ └── en.yml │ │ ├── puma.rb │ │ └── routes.rb │ ├── lib │ │ ├── assets │ │ │ └── .keep │ │ └── tasks │ │ │ ├── double_nested_tasks.rake │ │ │ ├── nested_tasks.rake │ │ │ └── regular.rake │ ├── log │ │ └── .keep │ ├── public │ │ ├── 404.html │ │ ├── 422.html │ │ ├── 500.html │ │ ├── apple-touch-icon-precomposed.png │ │ ├── apple-touch-icon.png │ │ └── favicon.ico │ └── tmp │ │ └── rake_ui │ │ └── 2021-02-07-09-34-04-0600____nested%3Athe_nested_task.txt ├── integration │ ├── rake_task_logs_request_test.rb │ └── rake_tasks_request_test.rb ├── rake_ui │ ├── rake_task_log_test.rb │ ├── rake_task_test.rb │ └── rake_ui_test.rb └── test_helper.rb └── vendor └── cache ├── actioncable-6.1.7.4.gem ├── actionmailbox-6.1.7.4.gem ├── actionmailer-6.1.7.4.gem ├── actionpack-6.1.7.4.gem ├── actiontext-6.1.7.4.gem ├── actionview-6.1.7.4.gem ├── activejob-6.1.7.4.gem ├── activemodel-6.1.7.4.gem ├── activerecord-6.1.7.4.gem ├── activestorage-6.1.7.4.gem ├── activesupport-6.1.7.4.gem ├── ast-2.4.2.gem ├── builder-3.2.4.gem ├── coderay-1.1.3.gem ├── concurrent-ruby-1.2.2.gem ├── crass-1.0.6.gem ├── date-3.3.3.gem ├── erubi-1.12.0.gem ├── globalid-1.1.0.gem ├── i18n-1.14.1.gem ├── loofah-2.21.3.gem ├── mail-2.8.1.gem ├── marcel-1.0.2.gem ├── method_source-1.0.0.gem ├── mini_mime-1.1.2.gem ├── mini_portile2-2.8.2.gem ├── minitest-5.18.1.gem ├── net-imap-0.3.6.gem ├── net-pop-0.1.2.gem ├── net-protocol-0.2.1.gem ├── net-smtp-0.3.3.gem ├── nio4r-2.5.9.gem ├── nokogiri-1.15.2-arm64-darwin.gem ├── nokogiri-1.15.2-x86_64-linux.gem ├── nokogiri-1.15.2.gem ├── parallel-1.21.0.gem ├── parser-3.1.0.0.gem ├── pry-0.14.1.gem ├── racc-1.7.1.gem ├── rack-2.2.7.gem ├── rack-test-2.1.0.gem ├── rails-6.1.7.4.gem ├── rails-dom-testing-2.0.3.gem ├── rails-html-sanitizer-1.6.0.gem ├── railties-6.1.7.4.gem ├── rainbow-3.1.1.gem ├── rake-13.0.6.gem ├── regexp_parser-2.2.0.gem ├── rexml-3.2.5.gem ├── rubocop-1.25.0.gem ├── rubocop-ast-1.15.1.gem ├── rubocop-performance-1.13.2.gem ├── ruby-progressbar-1.11.0.gem ├── sprockets-4.2.0.gem ├── sprockets-rails-3.4.2.gem ├── sqlite3-1.4.2.gem ├── standard-1.7.0.gem ├── standardrb-1.0.1.gem ├── thor-1.2.2.gem ├── timeout-0.4.0.gem ├── tzinfo-2.0.6.gem ├── unicode-display_width-2.1.0.gem ├── websocket-driver-0.7.5.gem ├── websocket-extensions-0.1.5.gem └── zeitwerk-2.6.8.gem /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | version: 2.1 4 | 5 | executors: 6 | ruby-latest: 7 | resource_class: small 8 | docker: 9 | - image: circleci/ruby:2.7.2 10 | 11 | # yaml anchor filters 12 | master_only: &master_only 13 | filters: 14 | branches: 15 | only: master 16 | tags: 17 | ignore: /.*/ 18 | pr_only: &pr_only 19 | filters: 20 | branches: 21 | ignore: master 22 | tags: 23 | ignore: /.*/ 24 | version_tags_only: &version_tags_only 25 | filters: 26 | branches: 27 | ignore: /.*/ 28 | tags: 29 | only: /^v.*/ 30 | 31 | jobs: 32 | build: 33 | executor: ruby-latest 34 | steps: 35 | - checkout 36 | - run: 37 | name: Install Bundler specific version 38 | command: | 39 | gem install bundler --version "${BUNDLE_VERSION}" --force 40 | bundle config set --local path 'vendor/bundle' 41 | bundle config set --local frozen 'true' 42 | bundle config set --local jobs '4' 43 | bundle config set --local retry '3' 44 | - run: 45 | name: Install Ruby Dependencies 46 | command: bundle install --local --jobs=4 --retry=3 47 | - run: 48 | name: Run Tests 49 | command: bundle exec rake test 50 | - store_test_results: 51 | name: Store test results 52 | path: tmp/test-results 53 | - run: 54 | name: Run StandardRB 55 | command: bundle exec standardrb 56 | - store_artifacts: 57 | name: Saves documentation 58 | path: doc 59 | - persist_to_workspace: 60 | root: . 61 | paths: 62 | - vendor/bundle 63 | 64 | workflows: 65 | version: 2 66 | 67 | pull-requests: 68 | jobs: 69 | - build: 70 | <<: *pr_only 71 | 72 | trunk: 73 | jobs: 74 | - build: 75 | <<: *master_only 76 | 77 | final-release: 78 | jobs: 79 | - build: 80 | <<: *version_tags_only 81 | -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | 2 | # Infra Automation 3 | /.circleci @doximity/infra_automation_reviewers 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.bundle/ 2 | /doc/ 3 | /log/*.log 4 | /pkg/ 5 | /tmp/ 6 | /test/dummy/db/*.sqlite3 7 | /test/dummy/db/*.sqlite3-* 8 | /test/dummy/log/*.log 9 | /test/dummy/tmp/rake_ui/* 10 | /test/dummy/storage/ 11 | /test/dummy/tmp/cache/ 12 | /test/dummy/tmp/development_secret.txt 13 | 14 | .byebug_history 15 | -------------------------------------------------------------------------------- /.ruby-version: -------------------------------------------------------------------------------- 1 | 2.7.6 2 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). 6 | 7 | ## [0.1.0] 8 | * Update the referenced rails version for testing 9 | [#22](https://github.com/doximity/rake-ui/pull/22) 10 | * Adds `allow_production` configuration option 11 | [#20](https://github.com/doximity/rake-ui/pull/20) 12 | 13 | ## [0.0.1] 14 | * Setup CI and Gem Publishing, add better form Validations 15 | [#10](https://github.com/doximity/rake-ui/pull/10) 16 | * Add Search Filtering, Remove Jbuilder and Fix Bug in Dir Existing 17 | [#12](https://github.com/doximity/rake-ui/pull/12) 18 | * Add StandardRB 19 | [#10](https://github.com/doximity/rake-ui/pull/11) 20 | * Fix But with FILE_ITEM_SEPARATOR reference 21 | [#9](https://github.com/doximity/rake-ui/pull/9) 22 | * Add View for Rake Task Logs 23 | [#8](https://github.com/doximity/rake-ui/pull/8) 24 | * Add VitalCSS 25 | [#7](https://github.com/doximity/rake-ui/pull/7) 26 | * Add Ability to track task execution status 27 | [#6](https://github.com/doximity/rake-ui/pull/6) 28 | * Add RakeTaskLog model 29 | [#4](https://github.com/doximity/rake-ui/pull/4) 30 | * Add ability to execute a RakeTask 31 | [#3](https://github.com/doximity/rake-ui/pull/3) 32 | * Add RakeTask Model 33 | [#2](https://github.com/doximity/rake-ui/pull/2) 34 | * Initialize Rake UI Engine 35 | [#1](https://github.com/doximity/rake-ui/pull/1) 36 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to Doximity 2 | 3 | We welcome contributions to this repository. Feel free to submit issues for bugs you encounter and pull requests for code and documentation contributions. 4 | In order to prevent licensing issues, Doximity Inc. (“Doximity”, “we”, “us”) requires all contributors to agree to an Individual Contributor License Agreement (“CLA”), which is reproduced below. By submitting your contributions to us, you agree that you have read and are bound by the CLA. If you do not agree with the CLA, you may not submit contributions. 5 | 6 | ## Doximity Individual Contributor License Agreement 7 | 8 | This license is for your protection as a Contributor as well as the protection of Doximity; it does not change your rights to use your own Contributions for any other purpose. 9 | 10 | You accept and agree to the following terms and conditions for Your present and future Contributions submitted to Doximity. Except for the license granted herein to Doximity and recipients of software distributed by Doximity, You reserve all right, titles, and interests in and to Your Contributions. 11 | 12 | ### Definitions 13 | 14 | "You" (or "Your" or the “Contributor”) shall mean the copyright owner or legal entity authorized by the copyright owner that is making this Agreement with Doximity. For legal entities, the entity making a Contribution and all other entities that control, are controlled by, or are under common control with that entity are considered to be a single Contributor. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. 15 | 16 | 1. "Contribution" shall mean the code, documentation, or any original work of authorship, including any modifications or additions to an existing work, that is intentionally submitted by You to Doximity for inclusion in, or documentation of, any of the products owned or managed by Doximity (the "Work"). For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to Doximity or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, Doximity for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by You as "Not a Contribution." 17 | 18 | 2. Grant of Copyright License. Subject to the terms and conditions of this Agreement, You hereby grant to Doximity and to recipients of software distributed by Doximity a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Your Contributions and such derivative works. 19 | 20 | 3. Grant of Patent License. Subject to the terms and conditions of this Agreement, You hereby grant to Doximity and to recipients of software distributed by Doximity a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by You that are necessarily infringed by Your Contribution(s) alone or by a combination of Your Contribution(s) with the Work to which such Contribution(s) was submitted. If any entity institutes patent litigation against You or any other entity (including a cross-claim or counterclaim in a lawsuit) alleging that your Contribution, or the Work to which you have contributed, constitutes a direct or contributory patent infringement, then any patent licenses granted to that entity under this Agreement for that Contribution or Work shall terminate as of the date such litigation is filed. 21 | 22 | 4. You represent that You are legally entitled to grant the above license. If your employer(s) has rights to intellectual property that you create that includes your Contributions, you represent that you have received permission to make Contributions on behalf of that employer, that your employer has waived such rights for your Contributions to Doximity, or that your employer has executed a separate Corporate CLA with Doximity. 23 | 24 | 5. You represent that each of Your Contributions is Your original creation (see section 7 for submissions on behalf of others). You represent that Your Contribution submissions include complete details of any third-party license or other restriction (including, but not limited to, related patents and trademarks) of which you are personally aware and which are associated with any part of Your Contributions. 25 | 26 | 6. You are not expected to provide support for Your Contributions, except to the extent You desire to provide support. You may provide support for free, for a fee, or not at all. Unless required by applicable law or agreed to in writing, You provide Your Contributions on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. 27 | 28 | 7. Should You wish to submit work that is not Your original creation, You may submit it to Doximity separately from any Contribution, identifying the complete details of its source and of any license or other restriction (including, but not limited to, related patents, trademarks, and license agreements) of which you are personally aware, and conspicuously marking the work as "Submitted on behalf of a third-party: [named here]". 29 | 30 | 8. You agree to notify Doximity of any facts or circumstances of which you become aware that would make these representations inaccurate in any respect. 31 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | git_source(:github) { |repo| "https://github.com/#{repo}.git" } 3 | 4 | # Specify your gem's dependencies in rake-ui.gemspec. 5 | gemspec 6 | 7 | group :development do 8 | gem "sqlite3" 9 | end 10 | 11 | gem "pry", group: [:development, :test], require: false 12 | gem "rails", "~> 6.1.7.4", group: [:development, :test], require: false 13 | -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | PATH 2 | remote: . 3 | specs: 4 | rake-ui (0.1.0) 5 | actionpack 6 | activesupport 7 | railties 8 | rake 9 | 10 | GEM 11 | remote: https://rubygems.org/ 12 | specs: 13 | actioncable (6.1.7.4) 14 | actionpack (= 6.1.7.4) 15 | activesupport (= 6.1.7.4) 16 | nio4r (~> 2.0) 17 | websocket-driver (>= 0.6.1) 18 | actionmailbox (6.1.7.4) 19 | actionpack (= 6.1.7.4) 20 | activejob (= 6.1.7.4) 21 | activerecord (= 6.1.7.4) 22 | activestorage (= 6.1.7.4) 23 | activesupport (= 6.1.7.4) 24 | mail (>= 2.7.1) 25 | actionmailer (6.1.7.4) 26 | actionpack (= 6.1.7.4) 27 | actionview (= 6.1.7.4) 28 | activejob (= 6.1.7.4) 29 | activesupport (= 6.1.7.4) 30 | mail (~> 2.5, >= 2.5.4) 31 | rails-dom-testing (~> 2.0) 32 | actionpack (6.1.7.4) 33 | actionview (= 6.1.7.4) 34 | activesupport (= 6.1.7.4) 35 | rack (~> 2.0, >= 2.0.9) 36 | rack-test (>= 0.6.3) 37 | rails-dom-testing (~> 2.0) 38 | rails-html-sanitizer (~> 1.0, >= 1.2.0) 39 | actiontext (6.1.7.4) 40 | actionpack (= 6.1.7.4) 41 | activerecord (= 6.1.7.4) 42 | activestorage (= 6.1.7.4) 43 | activesupport (= 6.1.7.4) 44 | nokogiri (>= 1.8.5) 45 | actionview (6.1.7.4) 46 | activesupport (= 6.1.7.4) 47 | builder (~> 3.1) 48 | erubi (~> 1.4) 49 | rails-dom-testing (~> 2.0) 50 | rails-html-sanitizer (~> 1.1, >= 1.2.0) 51 | activejob (6.1.7.4) 52 | activesupport (= 6.1.7.4) 53 | globalid (>= 0.3.6) 54 | activemodel (6.1.7.4) 55 | activesupport (= 6.1.7.4) 56 | activerecord (6.1.7.4) 57 | activemodel (= 6.1.7.4) 58 | activesupport (= 6.1.7.4) 59 | activestorage (6.1.7.4) 60 | actionpack (= 6.1.7.4) 61 | activejob (= 6.1.7.4) 62 | activerecord (= 6.1.7.4) 63 | activesupport (= 6.1.7.4) 64 | marcel (~> 1.0) 65 | mini_mime (>= 1.1.0) 66 | activesupport (6.1.7.4) 67 | concurrent-ruby (~> 1.0, >= 1.0.2) 68 | i18n (>= 1.6, < 2) 69 | minitest (>= 5.1) 70 | tzinfo (~> 2.0) 71 | zeitwerk (~> 2.3) 72 | ast (2.4.2) 73 | builder (3.2.4) 74 | coderay (1.1.3) 75 | concurrent-ruby (1.2.2) 76 | crass (1.0.6) 77 | date (3.3.3) 78 | erubi (1.12.0) 79 | globalid (1.1.0) 80 | activesupport (>= 5.0) 81 | i18n (1.14.1) 82 | concurrent-ruby (~> 1.0) 83 | loofah (2.21.3) 84 | crass (~> 1.0.2) 85 | nokogiri (>= 1.12.0) 86 | mail (2.8.1) 87 | mini_mime (>= 0.1.1) 88 | net-imap 89 | net-pop 90 | net-smtp 91 | marcel (1.0.2) 92 | method_source (1.0.0) 93 | mini_mime (1.1.2) 94 | mini_portile2 (2.8.2) 95 | minitest (5.18.1) 96 | net-imap (0.3.6) 97 | date 98 | net-protocol 99 | net-pop (0.1.2) 100 | net-protocol 101 | net-protocol (0.2.1) 102 | timeout 103 | net-smtp (0.3.3) 104 | net-protocol 105 | nio4r (2.5.9) 106 | nokogiri (1.15.2) 107 | mini_portile2 (~> 2.8.2) 108 | racc (~> 1.4) 109 | nokogiri (1.15.2-x86_64-linux) 110 | racc (~> 1.4) 111 | parallel (1.21.0) 112 | parser (3.1.0.0) 113 | ast (~> 2.4.1) 114 | pry (0.14.1) 115 | coderay (~> 1.1) 116 | method_source (~> 1.0) 117 | racc (1.7.1) 118 | rack (2.2.7) 119 | rack-test (2.1.0) 120 | rack (>= 1.3) 121 | rails (6.1.7.4) 122 | actioncable (= 6.1.7.4) 123 | actionmailbox (= 6.1.7.4) 124 | actionmailer (= 6.1.7.4) 125 | actionpack (= 6.1.7.4) 126 | actiontext (= 6.1.7.4) 127 | actionview (= 6.1.7.4) 128 | activejob (= 6.1.7.4) 129 | activemodel (= 6.1.7.4) 130 | activerecord (= 6.1.7.4) 131 | activestorage (= 6.1.7.4) 132 | activesupport (= 6.1.7.4) 133 | bundler (>= 1.15.0) 134 | railties (= 6.1.7.4) 135 | sprockets-rails (>= 2.0.0) 136 | rails-dom-testing (2.0.3) 137 | activesupport (>= 4.2.0) 138 | nokogiri (>= 1.6) 139 | rails-html-sanitizer (1.6.0) 140 | loofah (~> 2.21) 141 | nokogiri (~> 1.14) 142 | railties (6.1.7.4) 143 | actionpack (= 6.1.7.4) 144 | activesupport (= 6.1.7.4) 145 | method_source 146 | rake (>= 12.2) 147 | thor (~> 1.0) 148 | rainbow (3.1.1) 149 | rake (13.0.6) 150 | regexp_parser (2.2.0) 151 | rexml (3.2.5) 152 | rubocop (1.25.0) 153 | parallel (~> 1.10) 154 | parser (>= 3.1.0.0) 155 | rainbow (>= 2.2.2, < 4.0) 156 | regexp_parser (>= 1.8, < 3.0) 157 | rexml 158 | rubocop-ast (>= 1.15.1, < 2.0) 159 | ruby-progressbar (~> 1.7) 160 | unicode-display_width (>= 1.4.0, < 3.0) 161 | rubocop-ast (1.15.1) 162 | parser (>= 3.0.1.1) 163 | rubocop-performance (1.13.2) 164 | rubocop (>= 1.7.0, < 2.0) 165 | rubocop-ast (>= 0.4.0) 166 | ruby-progressbar (1.11.0) 167 | sprockets (4.2.0) 168 | concurrent-ruby (~> 1.0) 169 | rack (>= 2.2.4, < 4) 170 | sprockets-rails (3.4.2) 171 | actionpack (>= 5.2) 172 | activesupport (>= 5.2) 173 | sprockets (>= 3.0.0) 174 | sqlite3 (1.4.2) 175 | standard (1.7.0) 176 | rubocop (= 1.25.0) 177 | rubocop-performance (= 1.13.2) 178 | standardrb (1.0.1) 179 | standard 180 | thor (1.2.2) 181 | timeout (0.4.0) 182 | tzinfo (2.0.6) 183 | concurrent-ruby (~> 1.0) 184 | unicode-display_width (2.1.0) 185 | websocket-driver (0.7.5) 186 | websocket-extensions (>= 0.1.0) 187 | websocket-extensions (0.1.5) 188 | zeitwerk (2.6.8) 189 | 190 | PLATFORMS 191 | ruby 192 | x86_64-linux 193 | 194 | DEPENDENCIES 195 | pry 196 | rails (~> 6.1.7.4) 197 | rake-ui! 198 | sqlite3 199 | standardrb 200 | 201 | BUNDLED WITH 202 | 2.4.3 203 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright {yyyy} {name of copyright owner} 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # RakeUi 2 | Rake UI is a Rails engine that enables the discovery and execution rake tasks in a UI. 3 | 4 | ![Example](./README_example.gif) 5 | 6 | ## Routes 7 | 8 | NOTE: Relative to mountpoint in application 9 | 10 | - GET /rake_tasks(.html/.json) - list all available rake tasks 11 | - GET /rake_tasks/:id(.html/.json) - list info a single tasks 12 | - POST /rake_tasks/:id/execute - execute a rake task 13 | - GET /rake_task_logs(.html/.json) - list rake task history 14 | - GET /rake_task_logs/:id(.html/.json) - list a single rake task history 15 | 16 | ## Installation 17 | Add this line to your application's Gemfile: 18 | 19 | ```ruby 20 | gem 'rake-ui' 21 | ``` 22 | 23 | And then execute: 24 | ```bash 25 | $ bundle 26 | ``` 27 | 28 | Or install it yourself as: 29 | ```bash 30 | $ gem install rake-ui 31 | ``` 32 | 33 | once it is installed, mount the engine 34 | ```rb 35 | Rails.application.routes.draw do 36 | # only mounting when defined will allow us only include in development/test 37 | if defined? RakeUi::Engine 38 | mount RakeUi::Engine => "/rake-ui" 39 | end 40 | end 41 | ``` 42 | 43 | ### Securing RakeUi 44 | 45 | This tool is built to enable developer productivity in development. It exposes rake tasks through a UI. 46 | 47 | This tool will currently not work in production because we add a guard in the root controller to respond not found if the environment is development or test. You may override this guard clause with the following configuration. 48 | 49 | ```rb 50 | RakeUi.configuration do |config| 51 | config.allow_production = true 52 | end 53 | ``` 54 | 55 | We recommend adding guards in your route to ensure that the proper authentication is in place to ensure that users are authenticated so that if this were ever to be rendered in production, you would be covered. The best way for that is [router constraints](https://guides.rubyonrails.org/routing.html#specifying-constraints) 56 | 57 | ## Testing 58 | 59 | `bundle exec rake test` 60 | 61 | To iterate on this fast i normally install nodemon, you can also use guard minitest. 62 | 63 | ``` 64 | # Example with nodemon, you don't have to use this 65 | npm install -g nodemon 66 | 67 | # Running a single test whenever models change 68 | nodemon -w ./app/models/* -e "rb" --exec "rake test TEST=test/rake_ui/rake_task_log_test.rb" 69 | ``` 70 | 71 | ## Contributing 72 | See [CONTRIBUTING](./CONTRIBUTING.md) 73 | 74 | ## License 75 | The gem is available as open source under the terms of the [Apache 2.0 License](./LICENSE). 76 | -------------------------------------------------------------------------------- /README_example.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/README_example.gif -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | require "bundler/setup" 2 | 3 | APP_RAKEFILE = File.expand_path("test/dummy/Rakefile", __dir__) 4 | load "rails/tasks/engine.rake" 5 | 6 | load "rails/tasks/statistics.rake" 7 | 8 | require "bundler/gem_tasks" 9 | 10 | require "rake/testtask" 11 | 12 | Rake::TestTask.new(:test) do |t| 13 | t.libs << "test" 14 | t.pattern = "test/**/*_test.rb" 15 | t.verbose = false 16 | end 17 | 18 | task default: :test 19 | -------------------------------------------------------------------------------- /app/assets/config/rake_ui_manifest.js: -------------------------------------------------------------------------------- 1 | //= link_directory ../stylesheets/rake_ui 2 | -------------------------------------------------------------------------------- /app/assets/stylesheets/rake_ui/application.css: -------------------------------------------------------------------------------- 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 file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets, 6 | * or any plugin's 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/SCSS 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 | */ 16 | -------------------------------------------------------------------------------- /app/controllers/rake_ui/application_controller.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | module RakeUi 4 | class ApplicationController < ActionController::Base 5 | before_action :black_hole_production 6 | 7 | private 8 | 9 | def black_hole_production 10 | return if Rails.env.test? || Rails.env.development? || RakeUi.configuration.allow_production 11 | 12 | raise ActionController::RoutingError, "Not Found" 13 | end 14 | end 15 | end 16 | -------------------------------------------------------------------------------- /app/controllers/rake_ui/rake_task_logs_controller.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | module RakeUi 4 | class RakeTaskLogsController < ApplicationController 5 | RAKE_TASK_LOG_ATTRS = [:id, 6 | :name, 7 | :args, 8 | :environment, 9 | :rake_command, 10 | :rake_definition_file, 11 | :log_file_name, 12 | :log_file_full_path].freeze 13 | 14 | def index 15 | @rake_task_logs = RakeUi::RakeTaskLog.all.sort_by(&:id) 16 | 17 | respond_to do |format| 18 | format.html 19 | format.json do 20 | render json: { 21 | rake_task_logs: rake_task_logs_as_json(@rake_task_logs) 22 | } 23 | end 24 | end 25 | end 26 | 27 | def show 28 | @rake_task_log = RakeUi::RakeTaskLog.find_by_id(params[:id]) 29 | 30 | @rake_task_log_content = @rake_task_log.file_contents.gsub("\n", "
") 31 | @rake_task_log_content_url = rake_task_log_path(@rake_task_log.id, format: :json) 32 | @is_rake_task_log_finished = @rake_task_log.finished? 33 | 34 | respond_to do |format| 35 | format.html 36 | format.json do 37 | render json: { 38 | rake_task_log: rake_task_log_as_json(@rake_task_log), 39 | rake_task_log_content: @rake_task_log_content, 40 | rake_task_log_content_url: @rake_task_log_content_url, 41 | is_rake_task_log_finished: @is_rake_task_log_finished 42 | } 43 | end 44 | end 45 | end 46 | 47 | private 48 | 49 | def rake_task_log_as_json(task) 50 | RAKE_TASK_LOG_ATTRS.each_with_object({}) do |param, obj| 51 | obj[param] = task.send(param) 52 | end 53 | end 54 | 55 | def rake_task_logs_as_json(tasks = []) 56 | tasks.map { |task| rake_task_log_as_json(task) } 57 | end 58 | end 59 | end 60 | -------------------------------------------------------------------------------- /app/controllers/rake_ui/rake_tasks_controller.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | module RakeUi 4 | class RakeTasksController < RakeUi::ApplicationController 5 | RAKE_TASK_ATTRS = [:id, 6 | :name, 7 | :name_with_args, 8 | :arg_description, 9 | :full_comment, 10 | :locations, 11 | :is_internal_task, 12 | :sources].freeze 13 | 14 | def index 15 | @rake_tasks = RakeUi::RakeTask.all 16 | 17 | unless params[:show_all] 18 | @rake_tasks = @rake_tasks.select(&:internal_task?) 19 | end 20 | 21 | respond_to do |format| 22 | format.html 23 | format.json do 24 | render json: { 25 | rake_tasks: rake_tasks_as_json(@rake_tasks) 26 | } 27 | end 28 | end 29 | end 30 | 31 | def show 32 | @rake_task = RakeUi::RakeTask.find_by_id(params[:id]) 33 | 34 | respond_to do |format| 35 | format.html 36 | format.json do 37 | render json: { 38 | rake_task: rake_task_as_json(@rake_task) 39 | } 40 | end 41 | end 42 | end 43 | 44 | def execute 45 | @rake_task = RakeUi::RakeTask.find_by_id(params[:id]) 46 | 47 | rake_task_log = @rake_task.call(args: params[:args], environment: params[:environment]) 48 | 49 | redirect_to rake_task_log_path rake_task_log.id 50 | end 51 | 52 | private 53 | 54 | def rake_task_as_json(task) 55 | RAKE_TASK_ATTRS.each_with_object({}) do |param, obj| 56 | obj[param] = task.send(param) 57 | end 58 | end 59 | 60 | def rake_tasks_as_json(tasks) 61 | tasks.map { |task| rake_task_as_json(task) } 62 | end 63 | end 64 | end 65 | -------------------------------------------------------------------------------- /app/helpers/rake_ui/application_helper.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | module RakeUi 4 | module ApplicationHelper 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /app/models/rake_ui/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/app/models/rake_ui/.keep -------------------------------------------------------------------------------- /app/models/rake_ui/rake_task.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | module RakeUi 4 | class RakeTask 5 | def self.to_safe_identifier(id) 6 | CGI.escape(id) 7 | end 8 | 9 | def self.from_safe_identifier(id) 10 | CGI.unescape(id) 11 | end 12 | 13 | def self.load 14 | # Enables 'desc' to show up as full_comments 15 | if Rake::TaskManager.respond_to? :record_task_metadata 16 | Rake::TaskManager.record_task_metadata = true 17 | end 18 | 19 | Rails.application.load_tasks 20 | Rake::Task.tasks 21 | end 22 | 23 | def self.all 24 | self.load.map do |task| 25 | new(task) 26 | end 27 | end 28 | 29 | def self.internal 30 | self.load.map { |task| 31 | new(task) 32 | }.select(&:is_internal_task) 33 | end 34 | 35 | def self.find_by_id(id) 36 | t = all 37 | i = from_safe_identifier(id) 38 | 39 | t.find do |task| 40 | task.name == i 41 | end 42 | end 43 | 44 | attr_reader :task 45 | delegate :name, :actions, :name_with_args, :arg_description, :full_comment, :locations, :sources, to: :task 46 | 47 | def initialize(task) 48 | @task = task 49 | end 50 | 51 | def id 52 | RakeUi::RakeTask.to_safe_identifier(name) 53 | end 54 | 55 | # actions will be something like # 56 | def rake_definition_file 57 | definition = actions.first || "" 58 | 59 | if definition.respond_to?(:source_location) 60 | definition.source_location.join(":") 61 | else 62 | definition 63 | end 64 | rescue 65 | "unable_to_determine_defining_file" 66 | end 67 | 68 | def is_internal_task 69 | internal_task? 70 | end 71 | 72 | # thinking this is the sanest way to discern application vs gem defined tasks (like rails, devise etc) 73 | def internal_task? 74 | actions.any? { |a| !a.to_s.include? "/ruby/gems" } 75 | 76 | # this was my initial thought here, leaving for posterity in case we need to or the definition of custom 77 | # from initial investigation the actions seemed like the most consistent as locations is sometimes empty 78 | # locations.any? do |location| 79 | # !location.match(/\/bundle\/gems/) 80 | # end 81 | end 82 | 83 | def call(args: nil, environment: nil) 84 | rake_command = build_rake_command(args: args, environment: environment) 85 | 86 | rake_task_log = RakeUi::RakeTaskLog.build_new_for_command( 87 | name: name, 88 | args: args, 89 | environment: environment, 90 | rake_command: rake_command, 91 | rake_definition_file: rake_definition_file, 92 | raker_id: id 93 | ) 94 | 95 | puts "[rake_ui] [rake_task] [forked] #{rake_task_log.rake_command_with_logging}" 96 | 97 | fork do 98 | system(rake_task_log.rake_command_with_logging) 99 | 100 | system(rake_task_log.command_to_mark_log_finished) 101 | end 102 | 103 | rake_task_log 104 | end 105 | 106 | # returns an invokable rake command 107 | # FOO=bar rake create_something[1,2,3] 108 | # rake create_something[1,2,3] 109 | # rake create_something 110 | def build_rake_command(args: nil, environment: nil) 111 | command = "" 112 | 113 | if environment 114 | command += "#{environment} " 115 | end 116 | 117 | command += "rake #{name}" 118 | 119 | if args 120 | command += "[#{args}]" 121 | end 122 | 123 | command 124 | end 125 | end 126 | end 127 | -------------------------------------------------------------------------------- /app/models/rake_ui/rake_task_log.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | module RakeUi 4 | class RakeTaskLog < OpenStruct 5 | # year-month-day-hour(24hour time)-minute-second-utc 6 | ID_DATE_FORMAT = "%Y-%m-%d-%H-%M-%S%z" 7 | REPOSITORY_DIR = Rails.root.join("tmp", "rake_ui") 8 | FILE_DELIMITER = "____" 9 | FINISHED_STRING = "+++++ COMMAND FINISHED +++++" 10 | TASK_HEADER_OUTPUT_DELIMITER = "-------------------------------" 11 | FILE_ITEM_SEPARATOR = ": " 12 | 13 | def self.create_tmp_file_dir 14 | FileUtils.mkdir_p(REPOSITORY_DIR.to_s) 15 | end 16 | 17 | def self.truncate 18 | FileUtils.rm_rf(Dir.glob(REPOSITORY_DIR.to_s + "/*")) 19 | end 20 | 21 | def self.build_from_file(log_file_name) 22 | log_file_name.split(FILE_DELIMITER) 23 | 24 | new( 25 | id: log_file_name.gsub(".txt", ""), 26 | log_file_name: log_file_name, 27 | log_file_full_path: Rails.root.join(REPOSITORY_DIR, log_file_name).to_s 28 | ) 29 | end 30 | 31 | def self.build_new_for_command(name:, rake_definition_file:, rake_command:, raker_id:, args: nil, environment: nil) 32 | create_tmp_file_dir 33 | 34 | date = Time.now.strftime(ID_DATE_FORMAT) 35 | id = "#{date}#{FILE_DELIMITER}#{raker_id}" 36 | log_file_name = "#{id}.txt" 37 | log_file_full_path = REPOSITORY_DIR.join(log_file_name).to_s 38 | 39 | File.open(log_file_full_path, "w+") do |f| 40 | f.puts "id#{FILE_ITEM_SEPARATOR}#{id}" 41 | f.puts "name#{FILE_ITEM_SEPARATOR}#{name}" 42 | f.puts "date#{FILE_ITEM_SEPARATOR}#{date}" 43 | f.puts "args#{FILE_ITEM_SEPARATOR}#{args}" 44 | f.puts "environment#{FILE_ITEM_SEPARATOR}#{environment}" 45 | f.puts "rake_command#{FILE_ITEM_SEPARATOR}#{rake_command}" 46 | f.puts "rake_definition_file#{FILE_ITEM_SEPARATOR}#{rake_definition_file}" 47 | f.puts "log_file_name#{FILE_ITEM_SEPARATOR}#{log_file_name}" 48 | f.puts "log_file_full_path#{FILE_ITEM_SEPARATOR}#{log_file_full_path}" 49 | 50 | f.puts TASK_HEADER_OUTPUT_DELIMITER.to_s 51 | f.puts " INVOKED RAKE TASK OUTPUT BELOW" 52 | f.puts TASK_HEADER_OUTPUT_DELIMITER.to_s 53 | end 54 | 55 | new(id: id, 56 | name: name, 57 | args: args, 58 | environment: environment, 59 | rake_command: rake_command, 60 | rake_definition_file: rake_definition_file, 61 | log_file_name: log_file_name, 62 | log_file_full_path: log_file_full_path) 63 | end 64 | 65 | def self.all 66 | create_tmp_file_dir 67 | 68 | Dir.entries(REPOSITORY_DIR).reject { |file| 69 | file == "." || file == ".." 70 | }.map do |log| 71 | RakeUi::RakeTaskLog.build_from_file(log) 72 | end 73 | end 74 | 75 | def self.find_by_id(id) 76 | all.find do |a| 77 | a.id == id || a.id == RakeUi::RakeTask.to_safe_identifier(id) 78 | end 79 | end 80 | 81 | def self.for(rake_ui_rake_task) 82 | all.select do |history| 83 | history.id == rake_ui_rake_task.id 84 | end 85 | end 86 | 87 | def name 88 | super || parsed_log_file_name[:name] || parsed_file_contents[:name] 89 | end 90 | 91 | def date 92 | super || parsed_log_file_name[:date] || parsed_file_contents[:date] 93 | end 94 | 95 | def args 96 | super || parsed_file_contents[:args] 97 | end 98 | 99 | def environment 100 | super || parsed_file_contents[:environment] 101 | end 102 | 103 | def rake_command 104 | super || parsed_file_contents[:rake_command] 105 | end 106 | 107 | def rake_definition_file 108 | super || parsed_file_contents[:rake_definition_file] 109 | end 110 | 111 | def log_file_name 112 | super || parsed_file_contents[:log_file_name] 113 | end 114 | 115 | def log_file_full_path 116 | super || parsed_file_contents[:log_file_full_path] 117 | end 118 | 119 | def rake_command_with_logging 120 | "#{rake_command} 2>&1 >> #{log_file_full_path}" 121 | end 122 | 123 | def file_contents 124 | @file_contents ||= File.read(log_file_full_path) 125 | end 126 | 127 | def command_to_mark_log_finished 128 | "echo #{FINISHED_STRING} >> #{log_file_full_path}" 129 | end 130 | 131 | def finished? 132 | file_contents.include? FINISHED_STRING 133 | end 134 | 135 | private 136 | 137 | # converts standard formatted file id into an object 138 | def parsed_log_file_name 139 | @parsed_log_file_name ||= {}.tap do |parsed| 140 | date, name = id.split(FILE_DELIMITER, 2) 141 | parsed[:date] = date 142 | parsed[:name] = RakeUi::RakeTask.from_safe_identifier(name) 143 | end 144 | end 145 | 146 | # converts our persisted rake logs files into an object 147 | # name: foo 148 | # id: baz 149 | # 150 | # into 151 | # 152 | # { name: 'foo', id: 'baz' } 153 | def parsed_file_contents 154 | return @parsed_file_contents if defined? @parsed_file_contents 155 | 156 | @parsed_file_contents = {}.tap do |parsed| 157 | File.foreach(log_file_full_path).first(9).each do |line| 158 | name, value = line.split(FILE_ITEM_SEPARATOR, 2) 159 | next unless name 160 | 161 | parsed[name] = value && value.delete("\n") 162 | end 163 | end.with_indifferent_access 164 | end 165 | end 166 | end 167 | -------------------------------------------------------------------------------- /app/views/layouts/rake_ui/application.html.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Rake ui 5 | <%= csrf_meta_tags %> 6 | <%= csp_meta_tag %> 7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 |
15 | 21 |
22 |
23 | 24 |

<%= notice %>

25 | 26 | 27 |
28 | <%= yield %> 29 |
30 | 31 | 32 | -------------------------------------------------------------------------------- /app/views/partials/rake_ui/_table_filterable.html: -------------------------------------------------------------------------------- 1 | 48 | -------------------------------------------------------------------------------- /app/views/rake_ui/rake_task_logs/index.html.erb: -------------------------------------------------------------------------------- 1 |
2 |
3 |

Status

4 | 5 |
6 | 7 |
8 |

9 | Filter Table 10 |

11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | <% @rake_task_logs.each do |rake_task_log| %> 24 | 25 | 26 | 27 | 28 | 29 | <% end %> 30 | 31 |
ActionsDate RanRake Task
<%= link_to "View Logs", rake_task_log_path(rake_task_log.id), { class: 'btn' } %><%= rake_task_log.date %><%= link_to rake_task_log.name, rake_task_log_path(rake_task_log.id) %>
32 |
33 |
34 | 35 | <%= render "partials/rake_ui/table_filterable" %> 36 | -------------------------------------------------------------------------------- /app/views/rake_ui/rake_task_logs/show.html.erb: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |

Rake Task Log

5 | 6 |
7 | 8 |
9 | <%= @rake_task_log_content.html_safe %> 10 |
11 | 12 | 41 |
42 |
-------------------------------------------------------------------------------- /app/views/rake_ui/rake_tasks/index.html.erb: -------------------------------------------------------------------------------- 1 |
2 |
3 |

Rake Tasks

4 | 5 |
6 | 7 |
8 | <%= link_to "Show all tasks", rake_tasks_path(show_all: "yes"), { class: 'btn' } %> 9 | <%= link_to "Show only internal tasks", rake_tasks_path, { class: 'btn' } %> 10 |
11 | 12 |
13 |

14 | Filter Table 15 |

16 |
17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | <% @rake_tasks.each do |rake_task| %> 29 | 30 | 31 | 39 | 40 | <% end %> 41 | 42 |
ActionsName
<%= link_to "Go Here", rake_task_path(rake_task.id), { class: 'btn' } %> 32 | <%= link_to rake_task.name_with_args, rake_task_path(rake_task.id) %> 33 | 34 | <% if rake_task.full_comment %> 35 |
36 |

Desc: <%= rake_task.full_comment %>

37 | <% end %> 38 |
43 |
44 |
45 |
46 | 47 | <%= render "partials/rake_ui/table_filterable" %> 48 | -------------------------------------------------------------------------------- /app/views/rake_ui/rake_tasks/show.html.erb: -------------------------------------------------------------------------------- 1 |
2 |
3 |

Submit Rake Task

4 |

Task: <%= @rake_task.name_with_args %>

5 | 6 | <% if @rake_task.full_comment %> 7 |

Comments: <%= @rake_task.full_comment %>

8 | <% end %> 9 | 10 |
11 | 12 |

13 | 14 |

15 | 16 | <%= form_with url: rake_task_execute_path(@rake_task.id), method: :post, class: 'full-width-forms', data: {"rake-form": true} do |f| %> 17 | 21 | 22 |
23 | 24 | 28 | 29 |

30 | Skip Argument and Environment Validations: 31 |

32 | 33 | <%= f.submit "Submit", class: "btn solid blue" %> 34 | <% end %> 35 |
36 |
37 | 38 | -------------------------------------------------------------------------------- /bin/rails: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | # This command will automatically be run when you run "rails" with Rails gems 3 | # installed from the root of your application. 4 | 5 | ENGINE_ROOT = File.expand_path('..', __dir__) 6 | ENGINE_PATH = File.expand_path('../lib/rake_ui/engine', __dir__) 7 | APP_PATH = File.expand_path('../test/dummy/config/application', __dir__) 8 | 9 | # Set up gems listed in the Gemfile. 10 | ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) 11 | require "bundler/setup" if File.exist?(ENV["BUNDLE_GEMFILE"]) 12 | 13 | require "rails/all" 14 | require "rails/engine/commands" 15 | -------------------------------------------------------------------------------- /config/routes.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | RakeUi::Engine.routes.draw do 4 | root to: "rake_tasks#index" 5 | 6 | resources :rake_tasks, only: [:index, :show] 7 | 8 | post "/rake_tasks/:id/execute", to: "rake_tasks#execute", as: "rake_task_execute" 9 | 10 | resources :rake_task_logs, only: [:index, :show] 11 | end 12 | -------------------------------------------------------------------------------- /lib/rake-ui.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | require "rake-ui/engine" 4 | 5 | module RakeUi 6 | mattr_accessor :allow_production 7 | self.allow_production = false 8 | 9 | def self.configuration 10 | yield(self) if block_given? 11 | self 12 | end 13 | end 14 | -------------------------------------------------------------------------------- /lib/rake-ui/engine.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | require "rake" 4 | require "fileutils" 5 | require "open3" 6 | 7 | module RakeUi 8 | class Engine < ::Rails::Engine 9 | isolate_namespace RakeUi 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /lib/rake-ui/version.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | module RakeUi 4 | VERSION = "0.1.0" 5 | end 6 | -------------------------------------------------------------------------------- /lib/tasks/rake_ui/tasks.rake: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # desc "Explaining what the task does" 4 | # task :rake_ui do 5 | # # Task goes here 6 | # end 7 | -------------------------------------------------------------------------------- /rake-ui.gemspec: -------------------------------------------------------------------------------- 1 | require_relative "lib/rake-ui/version" 2 | 3 | Gem::Specification.new do |spec| 4 | spec.name = "rake-ui" 5 | spec.version = RakeUi::VERSION 6 | spec.authors = ["Austin Story"] 7 | spec.email = ["lonnieastory@gmail.com"] 8 | spec.homepage = "https://github.com/doximity/rake-ui" 9 | spec.summary = "A Mountable Rails Engine to manage Rake Tasks through a UI" 10 | spec.description = "This gem creates a Web Interface for interacting with Rake tasks." 11 | spec.license = "Apache-2.0" 12 | 13 | spec.metadata["homepage_uri"] = spec.homepage 14 | spec.metadata["source_code_uri"] = "https://github.com/doximity/rake-ui" 15 | spec.metadata["changelog_uri"] = "https://github.com/doximity/rake-ui/CHANGELOG.md" 16 | 17 | spec.files = Dir["{app,config,db,lib}/**/*", "LICENSE", "Rakefile", "README.md"] 18 | 19 | spec.add_dependency "activesupport" 20 | spec.add_dependency "actionpack" 21 | spec.add_dependency "railties" 22 | spec.add_dependency "rake" 23 | 24 | spec.add_development_dependency "standardrb" 25 | end 26 | -------------------------------------------------------------------------------- /test/dummy/Rakefile: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # Add your own tasks in files placed in lib/tasks ending in .rake, 4 | # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. 5 | 6 | require_relative "config/application" 7 | 8 | Rails.application.load_tasks 9 | -------------------------------------------------------------------------------- /test/dummy/app/assets/config/manifest.js: -------------------------------------------------------------------------------- 1 | //= link_tree ../images 2 | //= link_directory ../stylesheets .css 3 | //= link rake_ui_manifest.js 4 | -------------------------------------------------------------------------------- /test/dummy/app/assets/images/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/test/dummy/app/assets/images/.keep -------------------------------------------------------------------------------- /test/dummy/app/assets/stylesheets/application.css: -------------------------------------------------------------------------------- 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 file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets, 6 | * or any plugin's 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/SCSS 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 | */ 16 | -------------------------------------------------------------------------------- /test/dummy/app/channels/application_cable/channel.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | module ApplicationCable 4 | class Channel < ActionCable::Channel::Base 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /test/dummy/app/channels/application_cable/connection.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | module ApplicationCable 4 | class Connection < ActionCable::Connection::Base 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /test/dummy/app/controllers/application_controller.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class ApplicationController < ActionController::Base 4 | end 5 | -------------------------------------------------------------------------------- /test/dummy/app/controllers/concerns/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/test/dummy/app/controllers/concerns/.keep -------------------------------------------------------------------------------- /test/dummy/app/helpers/application_helper.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | module ApplicationHelper 4 | end 5 | -------------------------------------------------------------------------------- /test/dummy/app/javascript/packs/application.js: -------------------------------------------------------------------------------- 1 | // This is a manifest file that'll be compiled into application.js, which will include all the files 2 | // listed below. 3 | // 4 | // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts, 5 | // or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path. 6 | // 7 | // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the 8 | // compiled file. JavaScript code in this file should be added after the last require_* statement. 9 | // 10 | // Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details 11 | // about supported directives. 12 | // 13 | //= require rails-ujs 14 | //= require_tree . 15 | -------------------------------------------------------------------------------- /test/dummy/app/jobs/application_job.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class ApplicationJob < ActiveJob::Base 4 | # Automatically retry jobs that encountered a deadlock 5 | # retry_on ActiveRecord::Deadlocked 6 | 7 | # Most jobs are safe to ignore if the underlying records are no longer available 8 | # discard_on ActiveJob::DeserializationError 9 | end 10 | -------------------------------------------------------------------------------- /test/dummy/app/mailers/application_mailer.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class ApplicationMailer < ActionMailer::Base 4 | default from: "from@example.com" 5 | layout "mailer" 6 | end 7 | -------------------------------------------------------------------------------- /test/dummy/app/models/application_record.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | class ApplicationRecord < ActiveRecord::Base 4 | self.abstract_class = true 5 | end 6 | -------------------------------------------------------------------------------- /test/dummy/app/models/concerns/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/test/dummy/app/models/concerns/.keep -------------------------------------------------------------------------------- /test/dummy/app/views/layouts/application.html.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Dummy 5 | 6 | <%= csrf_meta_tags %> 7 | <%= csp_meta_tag %> 8 | 9 | <%= stylesheet_link_tag 'application', media: 'all' %> 10 | 11 | 12 | 13 | <%= yield %> 14 | 15 | 16 | -------------------------------------------------------------------------------- /test/dummy/app/views/layouts/mailer.html.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | 9 | 10 | 11 | <%= yield %> 12 | 13 | 14 | -------------------------------------------------------------------------------- /test/dummy/app/views/layouts/mailer.text.erb: -------------------------------------------------------------------------------- 1 | <%= yield %> 2 | -------------------------------------------------------------------------------- /test/dummy/bin/rails: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | APP_PATH = File.expand_path("../config/application", __dir__) 3 | require_relative "../config/boot" 4 | require "rails/commands" 5 | -------------------------------------------------------------------------------- /test/dummy/bin/rake: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | require_relative "../config/boot" 3 | require "rake" 4 | Rake.application.run 5 | -------------------------------------------------------------------------------- /test/dummy/bin/setup: -------------------------------------------------------------------------------- 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== Copying sample files ==" 21 | # unless File.exist?('config/database.yml') 22 | # FileUtils.cp 'config/database.yml.sample', 'config/database.yml' 23 | # end 24 | 25 | puts "\n== Preparing database ==" 26 | system! "bin/rails db:prepare" 27 | 28 | puts "\n== Removing old logs and tempfiles ==" 29 | system! "bin/rails log:clear tmp:clear" 30 | 31 | puts "\n== Restarting application server ==" 32 | system! "bin/rails restart" 33 | end 34 | -------------------------------------------------------------------------------- /test/dummy/config.ru: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # This file is used by Rack-based servers to start the application. 4 | 5 | require_relative "config/environment" 6 | 7 | run Rails.application 8 | 9 | if Rails.application.respond_to? :load_server 10 | Rails.application.load_server 11 | end 12 | -------------------------------------------------------------------------------- /test/dummy/config/application.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | require_relative "boot" 4 | 5 | require "rails/all" 6 | 7 | # Require the gems listed in Gemfile, including any gems 8 | # you've limited to :test, :development, or :production. 9 | Bundler.require(*Rails.groups) 10 | require "rake-ui" 11 | 12 | module Dummy 13 | class Application < Rails::Application 14 | config.load_defaults Rails::VERSION::STRING.to_f 15 | 16 | # Configuration for the application, engines, and railties goes here. 17 | # 18 | # These settings can be overridden in specific environments using the files 19 | # in config/environments, which are processed later. 20 | # 21 | # config.time_zone = "Central Time (US & Canada)" 22 | # config.eager_load_paths << Rails.root.join("extras") 23 | end 24 | end 25 | -------------------------------------------------------------------------------- /test/dummy/config/boot.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # Set up gems listed in the Gemfile. 4 | ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../../Gemfile", __dir__) 5 | 6 | require "bundler/setup" if File.exist?(ENV["BUNDLE_GEMFILE"]) 7 | $LOAD_PATH.unshift File.expand_path("../../../lib", __dir__) 8 | -------------------------------------------------------------------------------- /test/dummy/config/cable.yml: -------------------------------------------------------------------------------- 1 | development: 2 | adapter: async 3 | 4 | test: 5 | adapter: test 6 | 7 | production: 8 | adapter: redis 9 | url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %> 10 | channel_prefix: dummy_production 11 | -------------------------------------------------------------------------------- /test/dummy/config/database.yml: -------------------------------------------------------------------------------- 1 | # SQLite. Versions 3.8.0 and up are supported. 2 | # gem install sqlite3 3 | # 4 | # Ensure the SQLite 3 gem is defined in your Gemfile 5 | # gem 'sqlite3' 6 | # 7 | default: &default 8 | adapter: sqlite3 9 | pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> 10 | timeout: 5000 11 | 12 | development: 13 | <<: *default 14 | database: db/development.sqlite3 15 | 16 | # Warning: The database defined as "test" will be erased and 17 | # re-generated from your development database when you run "rake". 18 | # Do not set this db to the same as development or production. 19 | test: 20 | <<: *default 21 | database: db/test.sqlite3 22 | 23 | production: 24 | <<: *default 25 | database: db/production.sqlite3 26 | -------------------------------------------------------------------------------- /test/dummy/config/environment.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # Load the Rails application. 4 | require_relative "application" 5 | 6 | # Initialize the Rails application. 7 | Rails.application.initialize! 8 | -------------------------------------------------------------------------------- /test/dummy/config/environments/development.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | require "active_support/core_ext/integer/time" 4 | 5 | Rails.application.configure do 6 | # Settings specified here will take precedence over those in config/application.rb. 7 | 8 | # In the development environment your application's code is reloaded any time 9 | # it changes. This slows down response time but is perfect for development 10 | # since you don't have to restart the web server when you make code changes. 11 | config.cache_classes = false 12 | 13 | # Do not eager load code on boot. 14 | config.eager_load = false 15 | 16 | # Show full error reports. 17 | config.consider_all_requests_local = true 18 | 19 | # Enable/disable caching. By default caching is disabled. 20 | # Run rails dev:cache to toggle caching. 21 | if Rails.root.join("tmp", "caching-dev.txt").exist? 22 | config.action_controller.perform_caching = true 23 | config.action_controller.enable_fragment_cache_logging = true 24 | 25 | config.cache_store = :memory_store 26 | config.public_file_server.headers = { 27 | "Cache-Control" => "public, max-age=#{2.days.to_i}" 28 | } 29 | else 30 | config.action_controller.perform_caching = false 31 | 32 | config.cache_store = :null_store 33 | end 34 | 35 | # Store uploaded files on the local file system (see config/storage.yml for options). 36 | config.active_storage.service = :local 37 | 38 | # Don't care if the mailer can't send. 39 | config.action_mailer.raise_delivery_errors = false 40 | 41 | config.action_mailer.perform_caching = false 42 | 43 | # Print deprecation notices to the Rails logger. 44 | config.active_support.deprecation = :log 45 | 46 | # Raise exceptions for disallowed deprecations. 47 | config.active_support.disallowed_deprecation = :raise 48 | 49 | # Tell Active Support which deprecation messages to disallow. 50 | config.active_support.disallowed_deprecation_warnings = [] 51 | 52 | # Raise an error on page load if there are pending migrations. 53 | config.active_record.migration_error = :page_load 54 | 55 | # Highlight code that triggered database queries in logs. 56 | config.active_record.verbose_query_logs = true 57 | 58 | # Debug mode disables concatenation and preprocessing of assets. 59 | # This option may cause significant delays in view rendering with a large 60 | # number of complex assets. 61 | config.assets.debug = true 62 | 63 | # Suppress logger output for asset requests. 64 | config.assets.quiet = true 65 | 66 | # Raises error for missing translations. 67 | # config.i18n.raise_on_missing_translations = true 68 | 69 | # Annotate rendered view with file names. 70 | # config.action_view.annotate_rendered_view_with_filenames = true 71 | 72 | # Use an evented file watcher to asynchronously detect changes in source code, 73 | # routes, locales, etc. This feature depends on the listen gem. 74 | # config.file_watcher = ActiveSupport::EventedFileUpdateChecker 75 | 76 | # Uncomment if you wish to allow Action Cable access from any origin. 77 | # config.action_cable.disable_request_forgery_protection = true 78 | end 79 | -------------------------------------------------------------------------------- /test/dummy/config/environments/production.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | require "active_support/core_ext/integer/time" 4 | 5 | Rails.application.configure do 6 | # Settings specified here will take precedence over those in config/application.rb. 7 | 8 | # Code is not reloaded between requests. 9 | config.cache_classes = true 10 | 11 | # Eager load code on boot. This eager loads most of Rails and 12 | # your application in memory, allowing both threaded web servers 13 | # and those relying on copy on write to perform better. 14 | # Rake tasks automatically ignore this option for performance. 15 | config.eager_load = true 16 | 17 | # Full error reports are disabled and caching is turned on. 18 | config.consider_all_requests_local = false 19 | config.action_controller.perform_caching = true 20 | 21 | # Ensures that a master key has been made available in either ENV["RAILS_MASTER_KEY"] 22 | # or in config/master.key. This key is used to decrypt credentials (and other encrypted files). 23 | # config.require_master_key = true 24 | 25 | # Disable serving static files from the `/public` folder by default since 26 | # Apache or NGINX already handles this. 27 | config.public_file_server.enabled = ENV["RAILS_SERVE_STATIC_FILES"].present? 28 | 29 | # Compress CSS using a preprocessor. 30 | # config.assets.css_compressor = :sass 31 | 32 | # Do not fallback to assets pipeline if a precompiled asset is missed. 33 | config.assets.compile = false 34 | 35 | # Enable serving of images, stylesheets, and JavaScripts from an asset server. 36 | # config.asset_host = 'http://assets.example.com' 37 | 38 | # Specifies the header that your server uses for sending files. 39 | # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache 40 | # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX 41 | 42 | # Store uploaded files on the local file system (see config/storage.yml for options). 43 | config.active_storage.service = :local 44 | 45 | # Mount Action Cable outside main process or domain. 46 | # config.action_cable.mount_path = nil 47 | # config.action_cable.url = 'wss://example.com/cable' 48 | # config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ] 49 | 50 | # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. 51 | # config.force_ssl = true 52 | 53 | # Include generic and useful information about system operation, but avoid logging too much 54 | # information to avoid inadvertent exposure of personally identifiable information (PII). 55 | config.log_level = :info 56 | 57 | # Prepend all log lines with the following tags. 58 | config.log_tags = [:request_id] 59 | 60 | # Use a different cache store in production. 61 | # config.cache_store = :mem_cache_store 62 | 63 | # Use a real queuing backend for Active Job (and separate queues per environment). 64 | # config.active_job.queue_adapter = :resque 65 | # config.active_job.queue_name_prefix = "dummy_production" 66 | 67 | config.action_mailer.perform_caching = false 68 | 69 | # Ignore bad email addresses and do not raise email delivery errors. 70 | # Set this to true and configure the email server for immediate delivery to raise delivery errors. 71 | # config.action_mailer.raise_delivery_errors = false 72 | 73 | # Enable locale fallbacks for I18n (makes lookups for any locale fall back to 74 | # the I18n.default_locale when a translation cannot be found). 75 | config.i18n.fallbacks = true 76 | 77 | # Send deprecation notices to registered listeners. 78 | config.active_support.deprecation = :notify 79 | 80 | # Log disallowed deprecations. 81 | config.active_support.disallowed_deprecation = :log 82 | 83 | # Tell Active Support which deprecation messages to disallow. 84 | config.active_support.disallowed_deprecation_warnings = [] 85 | 86 | # Use default logging formatter so that PID and timestamp are not suppressed. 87 | config.log_formatter = ::Logger::Formatter.new 88 | 89 | # Use a different logger for distributed setups. 90 | # require "syslog/logger" 91 | # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name') 92 | 93 | if ENV["RAILS_LOG_TO_STDOUT"].present? 94 | logger = ActiveSupport::Logger.new($stdout) 95 | logger.formatter = config.log_formatter 96 | config.logger = ActiveSupport::TaggedLogging.new(logger) 97 | end 98 | 99 | # Do not dump schema after migrations. 100 | config.active_record.dump_schema_after_migration = false 101 | 102 | # Inserts middleware to perform automatic connection switching. 103 | # The `database_selector` hash is used to pass options to the DatabaseSelector 104 | # middleware. The `delay` is used to determine how long to wait after a write 105 | # to send a subsequent read to the primary. 106 | # 107 | # The `database_resolver` class is used by the middleware to determine which 108 | # database is appropriate to use based on the time delay. 109 | # 110 | # The `database_resolver_context` class is used by the middleware to set 111 | # timestamps for the last write to the primary. The resolver uses the context 112 | # class timestamps to determine how long to wait before reading from the 113 | # replica. 114 | # 115 | # By default Rails will store a last write timestamp in the session. The 116 | # DatabaseSelector middleware is designed as such you can define your own 117 | # strategy for connection switching and pass that into the middleware through 118 | # these configuration options. 119 | # config.active_record.database_selector = { delay: 2.seconds } 120 | # config.active_record.database_resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver 121 | # config.active_record.database_resolver_context = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session 122 | end 123 | -------------------------------------------------------------------------------- /test/dummy/config/environments/test.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | require "active_support/core_ext/integer/time" 4 | 5 | # The test environment is used exclusively to run your application's 6 | # test suite. You never need to work with it otherwise. Remember that 7 | # your test database is "scratch space" for the test suite and is wiped 8 | # and recreated between test runs. Don't rely on the data there! 9 | 10 | Rails.application.configure do 11 | # Settings specified here will take precedence over those in config/application.rb. 12 | 13 | config.cache_classes = true 14 | 15 | # Do not eager load code on boot. This avoids loading your whole application 16 | # just for the purpose of running a single test. If you are using a tool that 17 | # preloads Rails for running tests, you may have to set it to true. 18 | config.eager_load = false 19 | 20 | # Configure public file server for tests with Cache-Control for performance. 21 | config.public_file_server.enabled = true 22 | config.public_file_server.headers = { 23 | "Cache-Control" => "public, max-age=#{1.hour.to_i}" 24 | } 25 | 26 | # Show full error reports and disable caching. 27 | config.consider_all_requests_local = true 28 | config.action_controller.perform_caching = false 29 | config.cache_store = :null_store 30 | 31 | # Raise exceptions instead of rendering exception templates. 32 | config.action_dispatch.show_exceptions = false 33 | 34 | # Disable request forgery protection in test environment. 35 | config.action_controller.allow_forgery_protection = false 36 | 37 | # Store uploaded files on the local file system in a temporary directory. 38 | config.active_storage.service = :test 39 | 40 | config.action_mailer.perform_caching = false 41 | 42 | # Tell Action Mailer not to deliver emails to the real world. 43 | # The :test delivery method accumulates sent emails in the 44 | # ActionMailer::Base.deliveries array. 45 | config.action_mailer.delivery_method = :test 46 | 47 | # Print deprecation notices to the stderr. 48 | config.active_support.deprecation = :stderr 49 | 50 | # Raise exceptions for disallowed deprecations. 51 | config.active_support.disallowed_deprecation = :raise 52 | 53 | # Tell Active Support which deprecation messages to disallow. 54 | config.active_support.disallowed_deprecation_warnings = [] 55 | 56 | # Raises error for missing translations. 57 | # config.i18n.raise_on_missing_translations = true 58 | 59 | # Annotate rendered view with file names. 60 | # config.action_view.annotate_rendered_view_with_filenames = true 61 | end 62 | -------------------------------------------------------------------------------- /test/dummy/config/initializers/application_controller_renderer.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # Be sure to restart your server when you modify this file. 4 | 5 | # ActiveSupport::Reloader.to_prepare do 6 | # ApplicationController.renderer.defaults.merge!( 7 | # http_host: 'example.org', 8 | # https: false 9 | # ) 10 | # end 11 | -------------------------------------------------------------------------------- /test/dummy/config/initializers/assets.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # Be sure to restart your server when you modify this file. 4 | 5 | # Version of your assets, change this if you want to expire all your assets. 6 | Rails.application.config.assets.version = "1.0" 7 | 8 | # Add additional assets to the asset load path. 9 | # Rails.application.config.assets.paths << Emoji.images_path 10 | 11 | # Precompile additional assets. 12 | # application.js, application.css, and all non-JS/CSS in the app/assets 13 | # folder are already added. 14 | # Rails.application.config.assets.precompile += %w( admin.js admin.css ) 15 | -------------------------------------------------------------------------------- /test/dummy/config/initializers/backtrace_silencers.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # Be sure to restart your server when you modify this file. 4 | 5 | # You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. 6 | # Rails.backtrace_cleaner.add_silencer { |line| /my_noisy_library/.match?(line) } 7 | 8 | # You can also remove all the silencers if you're trying to debug a problem that might stem from framework code 9 | # by setting BACKTRACE=1 before calling your invocation, like "BACKTRACE=1 ./bin/rails runner 'MyClass.perform'". 10 | Rails.backtrace_cleaner.remove_silencers! if ENV["BACKTRACE"] 11 | -------------------------------------------------------------------------------- /test/dummy/config/initializers/content_security_policy.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # Be sure to restart your server when you modify this file. 4 | 5 | # Define an application-wide content security policy 6 | # For further information see the following documentation 7 | # https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy 8 | 9 | # Rails.application.config.content_security_policy do |policy| 10 | # policy.default_src :self, :https 11 | # policy.font_src :self, :https, :data 12 | # policy.img_src :self, :https, :data 13 | # policy.object_src :none 14 | # policy.script_src :self, :https 15 | # policy.style_src :self, :https 16 | 17 | # # Specify URI for violation reports 18 | # # policy.report_uri "/csp-violation-report-endpoint" 19 | # end 20 | 21 | # If you are using UJS then enable automatic nonce generation 22 | # Rails.application.config.content_security_policy_nonce_generator = -> request { SecureRandom.base64(16) } 23 | 24 | # Set the nonce only to specific directives 25 | # Rails.application.config.content_security_policy_nonce_directives = %w(script-src) 26 | 27 | # Report CSP violations to a specified URI 28 | # For further information see the following documentation: 29 | # https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy-Report-Only 30 | # Rails.application.config.content_security_policy_report_only = true 31 | -------------------------------------------------------------------------------- /test/dummy/config/initializers/cookies_serializer.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # Be sure to restart your server when you modify this file. 4 | 5 | # Specify a serializer for the signed and encrypted cookie jars. 6 | # Valid options are :json, :marshal, and :hybrid. 7 | Rails.application.config.action_dispatch.cookies_serializer = :json 8 | -------------------------------------------------------------------------------- /test/dummy/config/initializers/filter_parameter_logging.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # Be sure to restart your server when you modify this file. 4 | 5 | # Configure sensitive parameters which will be filtered from the log file. 6 | Rails.application.config.filter_parameters += [ 7 | :passw, :secret, :token, :_key, :crypt, :salt, :certificate, :otp, :ssn 8 | ] 9 | -------------------------------------------------------------------------------- /test/dummy/config/initializers/inflections.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # Be sure to restart your server when you modify this file. 4 | 5 | # Add new inflection rules using the following format. Inflections 6 | # are locale specific, and you may define rules for as many different 7 | # locales as you wish. All of these examples are active by default: 8 | # ActiveSupport::Inflector.inflections(:en) do |inflect| 9 | # inflect.plural /^(ox)$/i, '\1en' 10 | # inflect.singular /^(ox)en/i, '\1' 11 | # inflect.irregular 'person', 'people' 12 | # inflect.uncountable %w( fish sheep ) 13 | # end 14 | 15 | # These inflection rules are supported but not enabled by default: 16 | # ActiveSupport::Inflector.inflections(:en) do |inflect| 17 | # inflect.acronym 'RESTful' 18 | # end 19 | -------------------------------------------------------------------------------- /test/dummy/config/initializers/mime_types.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # Be sure to restart your server when you modify this file. 4 | 5 | # Add new mime types for use in respond_to blocks: 6 | # Mime::Type.register "text/richtext", :rtf 7 | -------------------------------------------------------------------------------- /test/dummy/config/initializers/permissions_policy.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # Define an application-wide HTTP permissions policy. For further 4 | # information see https://developers.google.com/web/updates/2018/06/feature-policy 5 | # 6 | # Rails.application.config.permissions_policy do |f| 7 | # f.camera :none 8 | # f.gyroscope :none 9 | # f.microphone :none 10 | # f.usb :none 11 | # f.fullscreen :self 12 | # f.payment :self, "https://secure.example.com" 13 | # end 14 | -------------------------------------------------------------------------------- /test/dummy/config/initializers/wrap_parameters.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # Be sure to restart your server when you modify this file. 4 | 5 | # This file contains settings for ActionController::ParamsWrapper which 6 | # is enabled by default. 7 | 8 | # Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array. 9 | ActiveSupport.on_load(:action_controller) do 10 | wrap_parameters format: [:json] 11 | end 12 | 13 | # To enable root element in JSON for ActiveRecord objects. 14 | # ActiveSupport.on_load(:active_record) do 15 | # self.include_root_in_json = true 16 | # end 17 | -------------------------------------------------------------------------------- /test/dummy/config/locales/en.yml: -------------------------------------------------------------------------------- 1 | # Files in the config/locales directory are used for internationalization 2 | # and are automatically loaded by Rails. If you want to use locales other 3 | # than English, add the necessary files in this directory. 4 | # 5 | # To use the locales, use `I18n.t`: 6 | # 7 | # I18n.t 'hello' 8 | # 9 | # In views, this is aliased to just `t`: 10 | # 11 | # <%= t('hello') %> 12 | # 13 | # To use a different locale, set it with `I18n.locale`: 14 | # 15 | # I18n.locale = :es 16 | # 17 | # This would use the information in config/locales/es.yml. 18 | # 19 | # The following keys must be escaped otherwise they will not be retrieved by 20 | # the default I18n backend: 21 | # 22 | # true, false, on, off, yes, no 23 | # 24 | # Instead, surround them with single quotes. 25 | # 26 | # en: 27 | # 'true': 'foo' 28 | # 29 | # To learn more, please read the Rails Internationalization guide 30 | # available at https://guides.rubyonrails.org/i18n.html. 31 | 32 | en: 33 | hello: "Hello world" 34 | -------------------------------------------------------------------------------- /test/dummy/config/puma.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # Puma can serve each request in a thread from an internal thread pool. 4 | # The `threads` method setting takes two numbers: a minimum and maximum. 5 | # Any libraries that use thread pools should be configured to match 6 | # the maximum value specified for Puma. Default is set to 5 threads for minimum 7 | # and maximum; this matches the default thread size of Active Record. 8 | # 9 | max_threads_count = ENV.fetch("RAILS_MAX_THREADS", 5) 10 | min_threads_count = ENV.fetch("RAILS_MIN_THREADS", max_threads_count) 11 | threads min_threads_count, max_threads_count 12 | 13 | # Specifies the `worker_timeout` threshold that Puma will use to wait before 14 | # terminating a worker in development environments. 15 | # 16 | worker_timeout 3600 if ENV.fetch("RAILS_ENV", "development") == "development" 17 | 18 | # Specifies the `port` that Puma will listen on to receive requests; default is 3000. 19 | # 20 | port ENV.fetch("PORT", 3000) 21 | 22 | # Specifies the `environment` that Puma will run in. 23 | # 24 | environment ENV.fetch("RAILS_ENV", "development") 25 | 26 | # Specifies the `pidfile` that Puma will use. 27 | pidfile ENV.fetch("PIDFILE", "tmp/pids/server.pid") 28 | 29 | # Specifies the number of `workers` to boot in clustered mode. 30 | # Workers are forked web server processes. If using threads and workers together 31 | # the concurrency of the application would be max `threads` * `workers`. 32 | # Workers do not work on JRuby or Windows (both of which do not support 33 | # processes). 34 | # 35 | # workers ENV.fetch("WEB_CONCURRENCY") { 2 } 36 | 37 | # Use the `preload_app!` method when specifying a `workers` number. 38 | # This directive tells Puma to first boot the application and load code 39 | # before forking the application. This takes advantage of Copy On Write 40 | # process behavior so workers use less memory. 41 | # 42 | # preload_app! 43 | 44 | # Allow puma to be restarted by `rails restart` command. 45 | plugin :tmp_restart 46 | -------------------------------------------------------------------------------- /test/dummy/config/routes.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | Rails.application.routes.draw do 4 | mount RakeUi::Engine => "/rake-ui" 5 | 6 | root to: redirect("/rake-ui") 7 | end 8 | -------------------------------------------------------------------------------- /test/dummy/lib/assets/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/test/dummy/lib/assets/.keep -------------------------------------------------------------------------------- /test/dummy/lib/tasks/double_nested_tasks.rake: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | namespace :double_nested do 4 | namespace :inside_double_nested do 5 | desc "Doubley Nested Task" 6 | task :double_nested_task, [:user_id] => [:environment] do |_t, args| 7 | puts "double_nested_task start" 8 | puts args 9 | puts "double_nested_task end" 10 | end 11 | namespace :something_esle do 12 | desc "Something specific and stuff" 13 | task :double_nested_taskdouble_nested_taskdouble_nested_task, [:user_id, :foo_id] => [:environment] do |_t, args| 14 | puts "double_nested_task start" 15 | puts args 16 | puts "double_nested_task end" 17 | end 18 | end 19 | end 20 | end 21 | -------------------------------------------------------------------------------- /test/dummy/lib/tasks/nested_tasks.rake: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | namespace :nested do 4 | desc "nested tasks" 5 | task :the_nested_task, [:user_id] => [:environment] do |_t, args| 6 | puts "the_nested_task start" 7 | puts args 8 | puts "the_nested_task end" * 10 9 | end 10 | end 11 | -------------------------------------------------------------------------------- /test/dummy/lib/tasks/regular.rake: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | desc "This is a regular rake task with no environment" 4 | task :regular do |args| 5 | 30.times do |i| 6 | puts "Iterating! #{i}" 7 | sleep 1 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /test/dummy/log/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/test/dummy/log/.keep -------------------------------------------------------------------------------- /test/dummy/public/404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | The page you were looking for doesn't exist (404) 5 | 6 | 55 | 56 | 57 | 58 | 59 |
60 |
61 |

The page you were looking for doesn't exist.

62 |

You may have mistyped the address or the page may have moved.

63 |
64 |

If you are the application owner check the logs for more information.

65 |
66 | 67 | 68 | -------------------------------------------------------------------------------- /test/dummy/public/422.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | The change you wanted was rejected (422) 5 | 6 | 55 | 56 | 57 | 58 | 59 |
60 |
61 |

The change you wanted was rejected.

62 |

Maybe you tried to change something you didn't have access to.

63 |
64 |

If you are the application owner check the logs for more information.

65 |
66 | 67 | 68 | -------------------------------------------------------------------------------- /test/dummy/public/500.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | We're sorry, but something went wrong (500) 5 | 6 | 55 | 56 | 57 | 58 | 59 |
60 |
61 |

We're sorry, but something went wrong.

62 |
63 |

If you are the application owner check the logs for more information.

64 |
65 | 66 | 67 | -------------------------------------------------------------------------------- /test/dummy/public/apple-touch-icon-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/test/dummy/public/apple-touch-icon-precomposed.png -------------------------------------------------------------------------------- /test/dummy/public/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/test/dummy/public/apple-touch-icon.png -------------------------------------------------------------------------------- /test/dummy/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/test/dummy/public/favicon.ico -------------------------------------------------------------------------------- /test/dummy/tmp/rake_ui/2021-02-07-09-34-04-0600____nested%3Athe_nested_task.txt: -------------------------------------------------------------------------------- 1 | id: 2021-02-07-09-34-04-0600____nested%3Athe_nested_task 2 | name: nested:the_nested_task 3 | args: 1 4 | environment: FOO=bar BAZ=biz 5 | rake_command: FOO=bar BAZ=biz rake nested:the_nested_task[1] 6 | rake_definition_file: # 7 | log_file_name: 2021-02-07-09-34-04-0600____nested%3Athe_nested_task.txt 8 | log_file_full_path: /test/dummy/tmp/rake_ui/2021-02-07-09-34-04-0600____nested%3Athe_nested_task.txt 9 | ------------------------------- 10 | INVOKED RAKE TASK OUTPUT BELOW 11 | ------------------------------- 12 | the_nested_task start 13 | # 14 | the_nested_task endthe_nested_task endthe_nested_task endthe_nested_task endthe_nested_task endthe_nested_task endthe_nested_task endthe_nested_task endthe_nested_task endthe_nested_task end 15 | +++++ COMMAND FINISHED +++++ 16 | -------------------------------------------------------------------------------- /test/integration/rake_task_logs_request_test.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | require "test_helper" 4 | 5 | class RakeTaskLogsRequestTest < ActionDispatch::IntegrationTest 6 | test "index html responds successfully" do 7 | get "/rake-ui/rake_task_logs" 8 | 9 | assert_equal 200, status 10 | end 11 | 12 | test "index json responds successfully" do 13 | get "/rake-ui/rake_task_logs.json" 14 | 15 | assert_equal 200, status 16 | assert_instance_of Array, json_response[:rake_task_logs] 17 | end 18 | 19 | test "show html responds with the content" do 20 | log = RakeUi::RakeTaskLog.all.first 21 | get "/rake-ui/rake_task_logs/#{log.id}" 22 | 23 | assert_equal 200, status 24 | assert_includes response.body, "INVOKED RAKE TASK OUTPUT BELOW" 25 | end 26 | 27 | test "show json responds with the content and task log meta" do 28 | log = RakeUi::RakeTaskLog.all.first 29 | get "/rake-ui/rake_task_logs/#{log.id}.json" 30 | 31 | assert_equal 200, status 32 | assert_equal log.id, json_response[:rake_task_log][:id] 33 | assert_equal log.log_file_name, json_response[:rake_task_log][:log_file_name] 34 | 35 | assert_includes json_response[:rake_task_log_content], log.id 36 | end 37 | end 38 | -------------------------------------------------------------------------------- /test/integration/rake_tasks_request_test.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | require "test_helper" 4 | 5 | class RakeTasksRequestTest < ActionDispatch::IntegrationTest 6 | test "index html responds successfully" do 7 | get "/rake-ui/rake_tasks" 8 | 9 | assert_equal 200, status 10 | end 11 | 12 | test "index json responds with rake tasks" do 13 | get "/rake-ui/rake_tasks.json" 14 | 15 | assert_equal 200, status 16 | assert_instance_of Array, json_response[:rake_tasks] 17 | end 18 | 19 | test "show html responds successfully" do 20 | task = RakeUi::RakeTask.internal.first 21 | 22 | get "/rake-ui/rake_tasks/#{task.id}.json" 23 | 24 | assert_equal 200, status 25 | end 26 | 27 | test "json finds the task by id" do 28 | task = RakeUi::RakeTask.internal.first 29 | 30 | get "/rake-ui/rake_tasks/#{task.id}.json" 31 | assert_equal 200, status 32 | 33 | assert_equal task.id, json_response[:rake_task][:id] 34 | assert_equal task.name_with_args, json_response[:rake_task][:name_with_args] 35 | end 36 | 37 | test "post executes the task" do 38 | mock_task = Minitest::Mock.new 39 | def mock_task.id 40 | "some_identifier" 41 | end 42 | mock_task.expect(:call, OpenStruct.new(id: "1234_path"), {args: "1,2,3", environment: "FOO=bar"}) 43 | 44 | mock_find_by_id = lambda do |args| 45 | assert args, "some_identifier" 46 | 47 | mock_task 48 | end 49 | 50 | RakeUi::RakeTask.stub :find_by_id, mock_find_by_id do 51 | post "/rake-ui/rake_tasks/#{mock_task.id}/execute", params: {environment: "FOO=bar", 52 | args: "1,2,3"} 53 | 54 | assert_redirected_to "/rake-ui/rake_task_logs/1234_path" 55 | end 56 | end 57 | end 58 | -------------------------------------------------------------------------------- /test/rake_ui/rake_task_log_test.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | require "test_helper" 4 | 5 | class RakeTaskLogTest < ActiveSupport::TestCase 6 | test "loads a log file correctly into an instance of RakeTaskLog" do 7 | id = "2021-02-07-09-34-04-0600____nested%3Athe_nested_task" 8 | log = RakeUi::RakeTaskLog.find_by_id(id) 9 | 10 | assert_equal log.id, id 11 | assert_equal log.name, "nested:the_nested_task" 12 | assert_equal log.args, "1" 13 | assert_equal log.environment, "FOO=bar BAZ=biz" 14 | assert_equal log.rake_command, "FOO=bar BAZ=biz rake nested:the_nested_task[1]" 15 | assert_equal log.rake_definition_file, "#" 16 | assert_equal log.log_file_name, "2021-02-07-09-34-04-0600____nested%3Athe_nested_task.txt" 17 | assert_includes log.log_file_full_path, "/test/dummy/tmp/rake_ui/2021-02-07-09-34-04-0600____nested%3Athe_nested_task.txt" 18 | end 19 | 20 | test "is able to decode some date, id and name so that we don't have to read the full contents of file" do 21 | id = "2021-02-07-09-34-04-0600____nested%3Athe_nested_task" 22 | log = RakeUi::RakeTaskLog.find_by_id(id) 23 | 24 | log.stub(:parsed_file_contents, {}) do 25 | assert_equal log.id, id 26 | assert_equal log.name, "nested:the_nested_task" 27 | assert_equal log.date, "2021-02-07-09-34-04-0600" 28 | end 29 | end 30 | end 31 | -------------------------------------------------------------------------------- /test/rake_ui/rake_task_test.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | require "test_helper" 4 | 5 | class RakeTaskTest < ActiveSupport::TestCase 6 | test "is able to build valid rake commands" do 7 | task = get_double_nested_task 8 | 9 | plain_rake = "rake #{task.name}" 10 | assert_equal plain_rake, task.build_rake_command 11 | 12 | full_rake_command = "FOO=bar rake #{task.name}[1,2,3]" 13 | assert_equal full_rake_command, task.build_rake_command(args: "1,2,3", environment: "FOO=bar") 14 | 15 | no_arguments = "FOO=bar rake #{task.name}" 16 | assert_equal no_arguments, task.build_rake_command(environment: "FOO=bar") 17 | 18 | no_environment = "rake #{task.name}[1,2,3]" 19 | assert_equal no_environment, task.build_rake_command(args: "1,2,3") 20 | end 21 | 22 | test "scrubs rake_definition_file to be html safe" do 23 | task = get_double_nested_task 24 | 25 | assert_includes task.rake_definition_file, "/test/dummy/lib/tasks/double_nested_tasks.rake:6" 26 | end 27 | 28 | test "returns the desc as full_comments" do 29 | task = get_double_nested_task 30 | 31 | assert_equal task.full_comment, "Doubley Nested Task" 32 | end 33 | 34 | test "to_safe_identifier escapes" do 35 | id = RakeUi::RakeTask.to_safe_identifier("foo bar:baz") 36 | 37 | assert_equal id, "foo+bar%3Abaz" 38 | end 39 | 40 | test "from_safe_identifier unescapes" do 41 | id = RakeUi::RakeTask.from_safe_identifier("foo+bar%3Abaz") 42 | 43 | assert_equal id, "foo bar:baz" 44 | end 45 | 46 | test "it encodes the task name as the id" do 47 | task = get_double_nested_task 48 | 49 | assert_equal task.id, RakeUi::RakeTask.to_safe_identifier(task.name) 50 | end 51 | 52 | def get_double_nested_task 53 | id = RakeUi::RakeTask.to_safe_identifier("double_nested:inside_double_nested:double_nested_task") 54 | 55 | RakeUi::RakeTask.find_by_id(id) 56 | end 57 | end 58 | -------------------------------------------------------------------------------- /test/rake_ui/rake_ui_test.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | require "test_helper" 4 | 5 | class RakeUiTest < ActiveSupport::TestCase 6 | test "it has a version number" do 7 | assert RakeUi::VERSION 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /test/test_helper.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | # Configure Rails Environment 4 | ENV["RAILS_ENV"] = "test" 5 | 6 | require_relative "../test/dummy/config/environment" 7 | ActiveRecord::Migrator.migrations_paths = [File.expand_path("../test/dummy/db/migrate", __dir__)] 8 | ActiveRecord::Migrator.migrations_paths << File.expand_path("../db/migrate", __dir__) 9 | require "rails/test_help" 10 | require "minitest/mock" 11 | 12 | # Load fixtures from the engine 13 | if ActiveSupport::TestCase.respond_to?(:fixture_path=) 14 | ActiveSupport::TestCase.fixture_path = File.expand_path("fixtures", __dir__) 15 | ActionDispatch::IntegrationTest.fixture_path = ActiveSupport::TestCase.fixture_path 16 | ActiveSupport::TestCase.file_fixture_path = ActiveSupport::TestCase.fixture_path + "/files" 17 | ActiveSupport::TestCase.fixtures :all 18 | end 19 | 20 | def json_response 21 | JSON.parse(response.body).with_indifferent_access 22 | end 23 | -------------------------------------------------------------------------------- /vendor/cache/actioncable-6.1.7.4.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/actioncable-6.1.7.4.gem -------------------------------------------------------------------------------- /vendor/cache/actionmailbox-6.1.7.4.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/actionmailbox-6.1.7.4.gem -------------------------------------------------------------------------------- /vendor/cache/actionmailer-6.1.7.4.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/actionmailer-6.1.7.4.gem -------------------------------------------------------------------------------- /vendor/cache/actionpack-6.1.7.4.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/actionpack-6.1.7.4.gem -------------------------------------------------------------------------------- /vendor/cache/actiontext-6.1.7.4.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/actiontext-6.1.7.4.gem -------------------------------------------------------------------------------- /vendor/cache/actionview-6.1.7.4.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/actionview-6.1.7.4.gem -------------------------------------------------------------------------------- /vendor/cache/activejob-6.1.7.4.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/activejob-6.1.7.4.gem -------------------------------------------------------------------------------- /vendor/cache/activemodel-6.1.7.4.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/activemodel-6.1.7.4.gem -------------------------------------------------------------------------------- /vendor/cache/activerecord-6.1.7.4.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/activerecord-6.1.7.4.gem -------------------------------------------------------------------------------- /vendor/cache/activestorage-6.1.7.4.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/activestorage-6.1.7.4.gem -------------------------------------------------------------------------------- /vendor/cache/activesupport-6.1.7.4.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/activesupport-6.1.7.4.gem -------------------------------------------------------------------------------- /vendor/cache/ast-2.4.2.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/ast-2.4.2.gem -------------------------------------------------------------------------------- /vendor/cache/builder-3.2.4.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/builder-3.2.4.gem -------------------------------------------------------------------------------- /vendor/cache/coderay-1.1.3.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/coderay-1.1.3.gem -------------------------------------------------------------------------------- /vendor/cache/concurrent-ruby-1.2.2.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/concurrent-ruby-1.2.2.gem -------------------------------------------------------------------------------- /vendor/cache/crass-1.0.6.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/crass-1.0.6.gem -------------------------------------------------------------------------------- /vendor/cache/date-3.3.3.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/date-3.3.3.gem -------------------------------------------------------------------------------- /vendor/cache/erubi-1.12.0.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/erubi-1.12.0.gem -------------------------------------------------------------------------------- /vendor/cache/globalid-1.1.0.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/globalid-1.1.0.gem -------------------------------------------------------------------------------- /vendor/cache/i18n-1.14.1.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/i18n-1.14.1.gem -------------------------------------------------------------------------------- /vendor/cache/loofah-2.21.3.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/loofah-2.21.3.gem -------------------------------------------------------------------------------- /vendor/cache/mail-2.8.1.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/mail-2.8.1.gem -------------------------------------------------------------------------------- /vendor/cache/marcel-1.0.2.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/marcel-1.0.2.gem -------------------------------------------------------------------------------- /vendor/cache/method_source-1.0.0.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/method_source-1.0.0.gem -------------------------------------------------------------------------------- /vendor/cache/mini_mime-1.1.2.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/mini_mime-1.1.2.gem -------------------------------------------------------------------------------- /vendor/cache/mini_portile2-2.8.2.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/mini_portile2-2.8.2.gem -------------------------------------------------------------------------------- /vendor/cache/minitest-5.18.1.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/minitest-5.18.1.gem -------------------------------------------------------------------------------- /vendor/cache/net-imap-0.3.6.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/net-imap-0.3.6.gem -------------------------------------------------------------------------------- /vendor/cache/net-pop-0.1.2.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/net-pop-0.1.2.gem -------------------------------------------------------------------------------- /vendor/cache/net-protocol-0.2.1.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/net-protocol-0.2.1.gem -------------------------------------------------------------------------------- /vendor/cache/net-smtp-0.3.3.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/net-smtp-0.3.3.gem -------------------------------------------------------------------------------- /vendor/cache/nio4r-2.5.9.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/nio4r-2.5.9.gem -------------------------------------------------------------------------------- /vendor/cache/nokogiri-1.15.2-arm64-darwin.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/nokogiri-1.15.2-arm64-darwin.gem -------------------------------------------------------------------------------- /vendor/cache/nokogiri-1.15.2-x86_64-linux.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/nokogiri-1.15.2-x86_64-linux.gem -------------------------------------------------------------------------------- /vendor/cache/nokogiri-1.15.2.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/nokogiri-1.15.2.gem -------------------------------------------------------------------------------- /vendor/cache/parallel-1.21.0.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/parallel-1.21.0.gem -------------------------------------------------------------------------------- /vendor/cache/parser-3.1.0.0.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/parser-3.1.0.0.gem -------------------------------------------------------------------------------- /vendor/cache/pry-0.14.1.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/pry-0.14.1.gem -------------------------------------------------------------------------------- /vendor/cache/racc-1.7.1.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/racc-1.7.1.gem -------------------------------------------------------------------------------- /vendor/cache/rack-2.2.7.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/rack-2.2.7.gem -------------------------------------------------------------------------------- /vendor/cache/rack-test-2.1.0.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/rack-test-2.1.0.gem -------------------------------------------------------------------------------- /vendor/cache/rails-6.1.7.4.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/rails-6.1.7.4.gem -------------------------------------------------------------------------------- /vendor/cache/rails-dom-testing-2.0.3.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/rails-dom-testing-2.0.3.gem -------------------------------------------------------------------------------- /vendor/cache/rails-html-sanitizer-1.6.0.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/rails-html-sanitizer-1.6.0.gem -------------------------------------------------------------------------------- /vendor/cache/railties-6.1.7.4.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/railties-6.1.7.4.gem -------------------------------------------------------------------------------- /vendor/cache/rainbow-3.1.1.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/rainbow-3.1.1.gem -------------------------------------------------------------------------------- /vendor/cache/rake-13.0.6.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/rake-13.0.6.gem -------------------------------------------------------------------------------- /vendor/cache/regexp_parser-2.2.0.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/regexp_parser-2.2.0.gem -------------------------------------------------------------------------------- /vendor/cache/rexml-3.2.5.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/rexml-3.2.5.gem -------------------------------------------------------------------------------- /vendor/cache/rubocop-1.25.0.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/rubocop-1.25.0.gem -------------------------------------------------------------------------------- /vendor/cache/rubocop-ast-1.15.1.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/rubocop-ast-1.15.1.gem -------------------------------------------------------------------------------- /vendor/cache/rubocop-performance-1.13.2.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/rubocop-performance-1.13.2.gem -------------------------------------------------------------------------------- /vendor/cache/ruby-progressbar-1.11.0.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/ruby-progressbar-1.11.0.gem -------------------------------------------------------------------------------- /vendor/cache/sprockets-4.2.0.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/sprockets-4.2.0.gem -------------------------------------------------------------------------------- /vendor/cache/sprockets-rails-3.4.2.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/sprockets-rails-3.4.2.gem -------------------------------------------------------------------------------- /vendor/cache/sqlite3-1.4.2.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/sqlite3-1.4.2.gem -------------------------------------------------------------------------------- /vendor/cache/standard-1.7.0.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/standard-1.7.0.gem -------------------------------------------------------------------------------- /vendor/cache/standardrb-1.0.1.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/standardrb-1.0.1.gem -------------------------------------------------------------------------------- /vendor/cache/thor-1.2.2.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/thor-1.2.2.gem -------------------------------------------------------------------------------- /vendor/cache/timeout-0.4.0.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/timeout-0.4.0.gem -------------------------------------------------------------------------------- /vendor/cache/tzinfo-2.0.6.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/tzinfo-2.0.6.gem -------------------------------------------------------------------------------- /vendor/cache/unicode-display_width-2.1.0.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/unicode-display_width-2.1.0.gem -------------------------------------------------------------------------------- /vendor/cache/websocket-driver-0.7.5.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/websocket-driver-0.7.5.gem -------------------------------------------------------------------------------- /vendor/cache/websocket-extensions-0.1.5.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/websocket-extensions-0.1.5.gem -------------------------------------------------------------------------------- /vendor/cache/zeitwerk-2.6.8.gem: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doximity/rake-ui/216cef0fb952496ec5c679ebf69bd002353b498e/vendor/cache/zeitwerk-2.6.8.gem --------------------------------------------------------------------------------