rails_tasker 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/config.yml +43 -0
  3. data/.gitignore +11 -0
  4. data/.rspec +3 -0
  5. data/.rubocop.yml +10 -0
  6. data/Gemfile +5 -0
  7. data/Gemfile.lock +69 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +61 -0
  10. data/Rakefile +12 -0
  11. data/bin/console +15 -0
  12. data/bin/setup +8 -0
  13. data/examples/lib/rails_tasker/tasks/12345_example_task.rb +7 -0
  14. data/examples/lib/rails_tasker/tasks/1234_example_task.rb +7 -0
  15. data/examples/lib/rails_tasker/tasks/3_example_task.rb +7 -0
  16. data/examples/lib/rails_tasker/tasks/example_without_timestamp_task.rb +7 -0
  17. data/lib/rails_tasker/base.rb +9 -0
  18. data/lib/rails_tasker/generators/install/install_generator.rb +33 -0
  19. data/lib/rails_tasker/generators/install/templates/migration.erb +7 -0
  20. data/lib/rails_tasker/generators/install/templates/rails_tasker.erb +4 -0
  21. data/lib/rails_tasker/generators/task/task_generator.rb +33 -0
  22. data/lib/rails_tasker/generators/task/templates/task.erb +5 -0
  23. data/lib/rails_tasker/models/task.rb +17 -0
  24. data/lib/rails_tasker/railtie.rb +19 -0
  25. data/lib/rails_tasker/rake_tasks/run.rake +17 -0
  26. data/lib/rails_tasker/rake_tasks/status.rake +9 -0
  27. data/lib/rails_tasker/serviceable.rb +19 -0
  28. data/lib/rails_tasker/services/task/fetch_pending_service.rb +22 -0
  29. data/lib/rails_tasker/services/task/fetch_service.rb +21 -0
  30. data/lib/rails_tasker/services/task/run_pending_service.rb +30 -0
  31. data/lib/rails_tasker/services/task/run_service.rb +35 -0
  32. data/lib/rails_tasker/services/task/status_service.rb +25 -0
  33. data/lib/rails_tasker/task_file.rb +77 -0
  34. data/lib/rails_tasker/version.rb +5 -0
  35. data/lib/rails_tasker.rb +9 -0
  36. data/rails_tasker.gemspec +38 -0
  37. metadata +178 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 4f56beed957610ed0d2f7dd3b18bdecfaa0a790d55de79fe02ebd6d798a19168
4
+ data.tar.gz: 48b97ff0d7cb603886188ebad6434b4bd4ab853e595457d27af4cd93862ee4b8
5
+ SHA512:
6
+ metadata.gz: 5dcd771e25d2bbb119a9d643e4fc109f4a00c2eed4ba688d83707f575fd2b5b11a6f5f470ef363e2809fc52a7de8689ae27c0363db9166be1ad41411e4c97dab
7
+ data.tar.gz: be6dea6a064a02f1f6a835cfaf28fb6419ea005aa952fef4a76956413f34be4449f4bac38031ef3596ddc26644c9c1b0c5d72324c4022aef72833ee173ff1f7d
@@ -0,0 +1,43 @@
1
+ # Use the latest 2.1 version of CircleCI pipeline process engine.
2
+ # See: https://circleci.com/docs/2.0/configuration-reference
3
+ version: 2.1
4
+
5
+ jobs:
6
+ build:
7
+ docker:
8
+ - image: cimg/ruby:3.1.2
9
+ steps:
10
+ - run:
11
+ name: Configure Bundler - use the same bundler version used in Gemfile.lock
12
+ command: |
13
+ echo 'export BUNDLER_VERSION=$(cat Gemfile.lock | tail -1 | tr -d " ")' >> $BASH_ENV
14
+ source $BASH_ENV
15
+ sudo gem update --no-document --system
16
+ gem install bundler --no-document -v "$BUNDLER_VERSION"
17
+ - run:
18
+ name: Clone repo and checkout branch
19
+ command: |
20
+ git clone https://github.com/mawilmouth/rails_tasker.git ~/src
21
+ cd ~/src
22
+ git fetch origin << pipeline.git.branch >>
23
+ git checkout << pipeline.git.branch >>
24
+ - run:
25
+ name: Bundle Install
26
+ command: cd ~/src && bundle install
27
+ - run:
28
+ name: Install Code Climate Test Reporter
29
+ command: |
30
+ curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ~/src/cc-test-reporter
31
+ chmod +x ~/src/cc-test-reporter
32
+ - run:
33
+ name: RSpec and upload coverage
34
+ command: |
35
+ cd ~/src
36
+ ./cc-test-reporter before-build
37
+ bundle exec rspec -- spec
38
+ ./cc-test-reporter after-build -t simplecov
39
+
40
+ workflows:
41
+ build-workflow:
42
+ jobs:
43
+ - build
data/.gitignore ADDED
@@ -0,0 +1,11 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ # rspec failure tracking
11
+ .rspec_status
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,10 @@
1
+ Style/StringLiterals:
2
+ Enabled: true
3
+ EnforcedStyle: double_quotes
4
+
5
+ Style/StringLiteralsInInterpolation:
6
+ Enabled: true
7
+ EnforcedStyle: double_quotes
8
+
9
+ Layout/LineLength:
10
+ Max: 120
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,69 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ rails_tasker (1.0.0)
5
+ colorize
6
+ table_print
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ ast (2.4.2)
12
+ colorize (0.8.1)
13
+ diff-lcs (1.5.0)
14
+ docile (1.4.0)
15
+ parallel (1.21.0)
16
+ parser (3.1.1.0)
17
+ ast (~> 2.4.1)
18
+ rainbow (3.1.1)
19
+ rake (13.0.6)
20
+ regexp_parser (2.2.1)
21
+ rexml (3.2.5)
22
+ rspec (3.11.0)
23
+ rspec-core (~> 3.11.0)
24
+ rspec-expectations (~> 3.11.0)
25
+ rspec-mocks (~> 3.11.0)
26
+ rspec-core (3.11.0)
27
+ rspec-support (~> 3.11.0)
28
+ rspec-expectations (3.11.0)
29
+ diff-lcs (>= 1.2.0, < 2.0)
30
+ rspec-support (~> 3.11.0)
31
+ rspec-mocks (3.11.0)
32
+ diff-lcs (>= 1.2.0, < 2.0)
33
+ rspec-support (~> 3.11.0)
34
+ rspec-support (3.11.0)
35
+ rubocop (0.93.1)
36
+ parallel (~> 1.10)
37
+ parser (>= 2.7.1.5)
38
+ rainbow (>= 2.2.2, < 4.0)
39
+ regexp_parser (>= 1.8)
40
+ rexml
41
+ rubocop-ast (>= 0.6.0)
42
+ ruby-progressbar (~> 1.7)
43
+ unicode-display_width (>= 1.4.0, < 2.0)
44
+ rubocop-ast (1.16.0)
45
+ parser (>= 3.1.1.0)
46
+ ruby-progressbar (1.11.0)
47
+ simplecov (0.21.2)
48
+ docile (~> 1.1)
49
+ simplecov-html (~> 0.11)
50
+ simplecov_json_formatter (~> 0.1)
51
+ simplecov-html (0.12.3)
52
+ simplecov_json_formatter (0.1.4)
53
+ table_print (1.5.7)
54
+ timecop (0.9.5)
55
+ unicode-display_width (1.8.0)
56
+
57
+ PLATFORMS
58
+ x86_64-darwin-21
59
+
60
+ DEPENDENCIES
61
+ rails_tasker!
62
+ rake (~> 13.0)
63
+ rspec (~> 3.0)
64
+ rubocop (~> 0.80)
65
+ simplecov
66
+ timecop (~> 0.9.5)
67
+
68
+ BUNDLED WITH
69
+ 2.2.3
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2022 Michael Wilmouth
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,61 @@
1
+ # RailsTasker
2
+
3
+ `rails_tasker` provides a system to automate your post-deploy tasks as Plain Old Ruby Objects that are easy to test and create.
4
+
5
+ A new database table (`rails_tasker_tasks`) is created in order to keep track of the state of each task in a similar way to how rails maintains the states of migrations.
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'rails_tasker'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ $ bundle install
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install rails_tasker
22
+
23
+ Run the install generator to create the needed configurations and migration:
24
+
25
+ $ rails generate rails_tasker:install
26
+
27
+ Run the migration:
28
+
29
+ $ rails db:migrate
30
+
31
+ ## Usage
32
+
33
+ ###### Create a new task
34
+
35
+ $ rails generate rails_tasker:task new_task_name
36
+ - This will create the following task file: `lib/rails_tasker/tasks/<current_timestamp>_new_task_name.rb`
37
+
38
+ ###### Add the logic to the task
39
+ - Each task must implement a `#call` instance method.
40
+ - This is the main method that will be called in order execute your new task.
41
+
42
+ ###### Run all pending tasks
43
+
44
+ $ rake rails_tasker:run
45
+
46
+ ###### Or run a specific task
47
+
48
+ $ rake rails_tasker:run[version]
49
+
50
+ ###### Note
51
+ It is recommended to run this after the migrations in the deployment process.
52
+
53
+ That's it. A very simple system for post-deploy tasks.
54
+
55
+ ## Contributing
56
+
57
+ Bug reports and pull requests are welcome on GitHub at https://github.com/mawilmouth/rails_tasker.
58
+
59
+ ## License
60
+
61
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ require "rspec/core/rake_task"
5
+
6
+ RSpec::Core::RakeTask.new(:spec)
7
+
8
+ require "rubocop/rake_task"
9
+
10
+ RuboCop::RakeTask.new
11
+
12
+ task default: %i[spec rubocop]
data/bin/console ADDED
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "bundler/setup"
5
+ require "rails_tasker"
6
+
7
+ # You can add fixtures and/or initialization code here to make experimenting
8
+ # with your gem easier. You can also use a different console, if you like.
9
+
10
+ # (If you use this, don't forget to add pry to your Gemfile!)
11
+ # require "pry"
12
+ # Pry.start
13
+
14
+ require "irb"
15
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_tasker/base'
4
+
5
+ class ExampleTaskDuplicate < RailsTasker::Base
6
+ def call; end
7
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_tasker/base'
4
+
5
+ class ExampleTask < RailsTasker::Base
6
+ def call; end
7
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_tasker/base'
4
+
5
+ class ExampleTask < RailsTasker::Base
6
+ def call; end
7
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_tasker/base'
4
+
5
+ class ExampleWithoutTimeStampTask < RailsTasker::Base
6
+ def call; end
7
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_tasker/serviceable'
4
+
5
+ module RailsTasker
6
+ class Base
7
+ include Serviceable
8
+ end
9
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_tasker/models/task'
4
+
5
+ module RailsTasker
6
+ module Generators
7
+ class InstallGenerator < Rails::Generators::Base
8
+ source_root File.expand_path('../templates', __FILE__)
9
+
10
+ def create_initializer_file
11
+ template 'rails_tasker.erb', 'config/initializers/rails_tasker.rb'
12
+ end
13
+
14
+ def copy_migration
15
+ template 'migration.erb', "db/migrate/#{timestamp}_create_#{table_name}.rb"
16
+ end
17
+
18
+ private
19
+
20
+ def timestamp
21
+ @timestamp ||= Time.now.utc.strftime('%Y%m%d%H%M%S')
22
+ end
23
+
24
+ def rails_version_for_migration
25
+ "#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}"
26
+ end
27
+
28
+ def table_name
29
+ RailsTasker::Task.table_name
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,7 @@
1
+ class CreateRailsTaskerTasks < ActiveRecord::Migration[<%=rails_version_for_migration%>]
2
+ def change
3
+ create_table :<%= table_name %>, id: false do |t|
4
+ t.string :version, null: false
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,4 @@
1
+ RailsTasker.setup do |config|
2
+ # Require needed model files
3
+ require 'rails_tasker/models/task.rb'
4
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_tasker/models/task'
4
+
5
+ module RailsTasker
6
+ module Generators
7
+ class TaskGenerator < Rails::Generators::Base
8
+ source_root(File.expand_path('../templates', __FILE__))
9
+ argument(:name, type: :string)
10
+
11
+ def create_task_file
12
+ template(
13
+ 'task.erb',
14
+ "lib/rails_tasker/tasks/#{timestamp}_#{task_name}.rb"
15
+ )
16
+ end
17
+
18
+ private
19
+
20
+ def timestamp
21
+ @timestamp ||= Time.now.utc.strftime('%Y%m%d%H%M%S')
22
+ end
23
+
24
+ def task_name
25
+ @task_name ||= name.downcase
26
+ end
27
+
28
+ def task_name_pascal
29
+ @task_name_pascal ||= task_name.split('_').map(&:capitalize).join
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,5 @@
1
+ class <%= task_name_pascal %> < RailsTasker::Base
2
+ def call
3
+ # This is the method that will be called without args to run this task
4
+ end
5
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailsTasker
4
+ class Task < ActiveRecord::Base
5
+ self.table_name = 'rails_tasker_tasks'
6
+
7
+ FILE_LOCATION = File.join(Rails.root, 'lib/rails_tasker/tasks/*.rb')
8
+
9
+ def self.completed_task?(version:)
10
+ !find_by(version: version).nil?
11
+ end
12
+
13
+ def self.complete!(version:)
14
+ find_or_create_by!(version: version)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailsTasker
4
+ class Railtie < Rails::Railtie
5
+ rake_tasks do
6
+ load 'rails_tasker/rake_tasks/run.rake'
7
+ load 'rails_tasker/rake_tasks/status.rake'
8
+ end
9
+
10
+ initializer 'load_task_record_models' do
11
+ require 'rails_tasker/models/task'
12
+ end
13
+
14
+ generators do
15
+ require 'rails_tasker/generators/install/install_generator'
16
+ require 'rails_tasker/generators/task/task_generator'
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,17 @@
1
+ require 'rake'
2
+ require 'rails_tasker/services/task/run_pending_service'
3
+ require 'rails_tasker/services/task/run_service'
4
+
5
+ namespace :rails_tasker do
6
+ desc(
7
+ 'Runs all pending rails_tasker tasks ordered by the timestamp'\
8
+ ' in their filename or a specific task by the timestamp passed'
9
+ )
10
+ task :run, %i[version] => :environment do |_task, args|
11
+ if args.version.nil?
12
+ RailsTasker::Task::RunPendingService.call
13
+ else
14
+ RailsTasker::Task::RunService.call(version: args.version)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,9 @@
1
+ require 'rake'
2
+ require 'rails_tasker/services/task/status_service'
3
+
4
+ namespace :rails_tasker do
5
+ desc 'Prints up/down status of all tasks'
6
+ task :status => :environment do
7
+ RailsTasker::Task::StatusService.call
8
+ end
9
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailsTasker
4
+ module Serviceable
5
+ def self.included(klass)
6
+ klass.extend ClassMethods
7
+ end
8
+
9
+ def call
10
+ raise NotImplementedError
11
+ end
12
+
13
+ module ClassMethods
14
+ def call(**args)
15
+ new.call(**args)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_tasker/serviceable'
4
+ require 'rails_tasker/services/task/fetch_service'
5
+
6
+ module RailsTasker
7
+ class Task
8
+ class FetchPendingService
9
+ include Serviceable
10
+
11
+ def call
12
+ pending_tasks
13
+ end
14
+
15
+ private
16
+
17
+ def pending_tasks
18
+ @pending_tasks ||= FetchService.call.select(&:pending?)
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_tasker/models/task'
4
+ require 'rails_tasker/task_file'
5
+ require 'rails_tasker/serviceable'
6
+
7
+ module RailsTasker
8
+ class Task
9
+ class FetchService
10
+ include Serviceable
11
+
12
+ def call
13
+ Dir[Task::FILE_LOCATION].map do |filename|
14
+ TaskFile.new(filename: filename)
15
+ end.select do |task|
16
+ !task.timestamp.empty?
17
+ end.sort_by { |task| task.timestamp.to_i }
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'colorize'
4
+ require 'rails_tasker/services/task/fetch_pending_service'
5
+ require 'rails_tasker/serviceable'
6
+
7
+ module RailsTasker
8
+ class Task
9
+ class RunPendingService
10
+ include Serviceable
11
+
12
+ def call
13
+ puts "Running pending tasks...\n".cyan
14
+ pending_tasks.map do |task|
15
+ puts(
16
+ "Running Version: #{task.timestamp} Name: #{task.task_name}".magenta
17
+ )
18
+ print 'Output: '.green, task.call, "\n\n"
19
+ end
20
+ puts "Successfully ran #{pending_tasks.length} tasks...".green
21
+ end
22
+
23
+ private
24
+
25
+ def pending_tasks
26
+ @pending_tasks ||= FetchPendingService.call
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'colorize'
4
+ require 'rails_tasker/services/task/fetch_service'
5
+ require 'rails_tasker/serviceable'
6
+
7
+ module RailsTasker
8
+ class Task
9
+ class RunService
10
+ include Serviceable
11
+
12
+ def call(version:)
13
+ @version = version
14
+
15
+ if task.nil?
16
+ puts "Task with version: #{version} cannot be found...".magenta
17
+ return
18
+ else
19
+ puts(
20
+ "Running Version: #{task.timestamp} Name: #{task.task_name}".magenta
21
+ )
22
+ print 'Output: '.green, task.call, "\n\n"
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ attr_reader :version
29
+
30
+ def task
31
+ @task ||= FetchService.call.find { |task| task.timestamp == version }
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'table_print'
4
+ require 'rails_tasker/serviceable'
5
+ require 'rails_tasker/services/task/fetch_service'
6
+
7
+ module RailsTasker
8
+ class Task
9
+ class StatusService
10
+ COLUMNS = %w[status timestamp task_name].freeze
11
+
12
+ include Serviceable
13
+
14
+ def call
15
+ tp(tasks, *COLUMNS)
16
+ end
17
+
18
+ private
19
+
20
+ def tasks
21
+ @tasks ||= FetchService.call
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_tasker/models/task'
4
+ require 'rails_tasker/base'
5
+
6
+ module RailsTasker
7
+ class TaskFile
8
+ UP_STATUS = 'up'.freeze
9
+ DOWN_STATUS = 'down'.freeze
10
+
11
+ def initialize(filename: '')
12
+ @filename = filename
13
+ @timestamp, @task_name = parse_filename
14
+ end
15
+
16
+ attr_reader :filename, :timestamp, :task_name
17
+
18
+ def pending?
19
+ @is_pending ||= !timestamp.empty? && !Task.completed_task?(
20
+ version: timestamp
21
+ )
22
+ end
23
+
24
+ def status
25
+ pending? ? DOWN_STATUS : UP_STATUS
26
+ end
27
+
28
+ def call
29
+ load_object
30
+ output = nil
31
+
32
+ unless task_klass.nil?
33
+ output = task_klass.call
34
+ complete_task!
35
+
36
+ unload_object
37
+ end
38
+
39
+ output
40
+ end
41
+
42
+ private
43
+
44
+ def complete_task!
45
+ Task.complete!(version: timestamp)
46
+ end
47
+
48
+ def load_object
49
+ require(filename)
50
+ end
51
+
52
+ def unload_object
53
+ ::Object.send(:remove_const, task_klass.to_s)
54
+ end
55
+
56
+ def task_klass_name
57
+ @task_klass_name ||= task_name.split('_').map(&:capitalize).join
58
+ end
59
+
60
+ def task_klass
61
+ @task_klass ||= task_klass_name.empty? ?
62
+ nil : ::Object.const_get(task_klass_name)
63
+ end
64
+
65
+ def parse_filename
66
+ timestamp = ''
67
+ task_name = ''
68
+
69
+ /(\d+)_(.+)\.rb/.match(Pathname(@filename).basename.to_s) do |m|
70
+ timestamp = m[1]
71
+ task_name = m[2]
72
+ end
73
+
74
+ [timestamp, task_name]
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailsTasker
4
+ VERSION = '1.0.0'
5
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailsTasker
4
+ require_relative 'rails_tasker/railtie' if defined?(Rails::Railtie)
5
+
6
+ def self.setup
7
+ yield self
8
+ end
9
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/rails_tasker/version'
4
+
5
+ Gem::Specification.new do |gem|
6
+ gem.name = 'rails_tasker'
7
+ gem.version = RailsTasker::VERSION
8
+ gem.authors = ['Michael Wilmouth']
9
+ gem.email = ['wilmouthworks@gmail.com']
10
+
11
+ gem.summary = 'Automate your Rails after-deployment tasks with rails_tasker'
12
+ gem.description = gem.summary
13
+ gem.homepage = 'https://github.com/mawilmouth/rails_tasker'
14
+ gem.license = 'MIT'
15
+ gem.required_ruby_version = Gem::Requirement.new('>= 2.3.0')
16
+
17
+ gem.metadata['homepage_uri'] = gem.homepage
18
+ gem.metadata['source_code_uri'] = 'https://github.com/mawilmouth/rails_tasker'
19
+
20
+ # Specify which files should be added to the gem when it is released.
21
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
22
+ gem.files = Dir.chdir(File.expand_path(__dir__)) do
23
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features)/}) }
24
+ end
25
+
26
+ gem.bindir = 'exe'
27
+ gem.executables = gem.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
28
+ gem.require_paths = ['lib']
29
+
30
+ gem.add_dependency 'colorize'
31
+ gem.add_dependency 'table_print'
32
+
33
+ gem.add_development_dependency 'rake', '~> 13.0'
34
+ gem.add_development_dependency 'rspec', '~> 3.0'
35
+ gem.add_development_dependency 'timecop', '~> 0.9.5'
36
+ gem.add_development_dependency 'rubocop', '~> 0.80'
37
+ gem.add_development_dependency 'simplecov'
38
+ end
metadata ADDED
@@ -0,0 +1,178 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rails_tasker
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Michael Wilmouth
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2022-06-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: colorize
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: table_print
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '13.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '13.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: timecop
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 0.9.5
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 0.9.5
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.80'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0.80'
97
+ - !ruby/object:Gem::Dependency
98
+ name: simplecov
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ description: Automate your Rails after-deployment tasks with rails_tasker
112
+ email:
113
+ - wilmouthworks@gmail.com
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - ".circleci/config.yml"
119
+ - ".gitignore"
120
+ - ".rspec"
121
+ - ".rubocop.yml"
122
+ - Gemfile
123
+ - Gemfile.lock
124
+ - LICENSE.txt
125
+ - README.md
126
+ - Rakefile
127
+ - bin/console
128
+ - bin/setup
129
+ - examples/lib/rails_tasker/tasks/12345_example_task.rb
130
+ - examples/lib/rails_tasker/tasks/1234_example_task.rb
131
+ - examples/lib/rails_tasker/tasks/3_example_task.rb
132
+ - examples/lib/rails_tasker/tasks/example_without_timestamp_task.rb
133
+ - lib/rails_tasker.rb
134
+ - lib/rails_tasker/base.rb
135
+ - lib/rails_tasker/generators/install/install_generator.rb
136
+ - lib/rails_tasker/generators/install/templates/migration.erb
137
+ - lib/rails_tasker/generators/install/templates/rails_tasker.erb
138
+ - lib/rails_tasker/generators/task/task_generator.rb
139
+ - lib/rails_tasker/generators/task/templates/task.erb
140
+ - lib/rails_tasker/models/task.rb
141
+ - lib/rails_tasker/railtie.rb
142
+ - lib/rails_tasker/rake_tasks/run.rake
143
+ - lib/rails_tasker/rake_tasks/status.rake
144
+ - lib/rails_tasker/serviceable.rb
145
+ - lib/rails_tasker/services/task/fetch_pending_service.rb
146
+ - lib/rails_tasker/services/task/fetch_service.rb
147
+ - lib/rails_tasker/services/task/run_pending_service.rb
148
+ - lib/rails_tasker/services/task/run_service.rb
149
+ - lib/rails_tasker/services/task/status_service.rb
150
+ - lib/rails_tasker/task_file.rb
151
+ - lib/rails_tasker/version.rb
152
+ - rails_tasker.gemspec
153
+ homepage: https://github.com/mawilmouth/rails_tasker
154
+ licenses:
155
+ - MIT
156
+ metadata:
157
+ homepage_uri: https://github.com/mawilmouth/rails_tasker
158
+ source_code_uri: https://github.com/mawilmouth/rails_tasker
159
+ post_install_message:
160
+ rdoc_options: []
161
+ require_paths:
162
+ - lib
163
+ required_ruby_version: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - ">="
166
+ - !ruby/object:Gem::Version
167
+ version: 2.3.0
168
+ required_rubygems_version: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - ">="
171
+ - !ruby/object:Gem::Version
172
+ version: '0'
173
+ requirements: []
174
+ rubygems_version: 3.2.3
175
+ signing_key:
176
+ specification_version: 4
177
+ summary: Automate your Rails after-deployment tasks with rails_tasker
178
+ test_files: []