qyu 1.0.1 → 1.0.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA256:
3
- metadata.gz: f98e891b68c01847f3ca695ed2fb92823c2c2bbfc57081e84fe47ee8709adde6
4
- data.tar.gz: 2a166836847513af0227096430f9a7e08c0755fcc2eb20f77c96cc5726b5ffc5
2
+ SHA1:
3
+ metadata.gz: 856ddbf8f80f887606bc72bc83bc901f5c8516a2
4
+ data.tar.gz: 026e1996fb30e4e3d8fe45febefabae331196a61
5
5
  SHA512:
6
- metadata.gz: bbcfd3dfffc5e084a1b250c15d06772b6b6acb8c0178d02e3fbdbe3538946397c27bd55ab18e11f91fe83cdb926612d00df9ca48eebcb7496e54e8dacd7d271a
7
- data.tar.gz: 0a5ddbd2392e6a317c094d4ae5126b63f411f953cc50cda9ec57fc5d38621a42b0536c3143dd9baf802f0e313f08894838ced017eeeba95c9823ba1f5a3b809f
6
+ metadata.gz: 56aef9a753f450f32e9e33fa398b6758bee60dcc62e7b79aa04527d623f40416a117bc343ac94c45f020c9c54da706ae6cefa86e687ae0a001e59df144f83131
7
+ data.tar.gz: 8e7b894defa30e3e183d90db0be04ac8b88a6a58bc1b3b6d66adca8505d9b530a8cd6d029240b1a8b6b1252fed6adcd823ef8f365906a618a99378a3ee01ccf7
data/.gitignore CHANGED
@@ -54,3 +54,6 @@ Gemfile.lock
54
54
 
55
55
  # byebug history
56
56
  .byebug_history
57
+
58
+ # macOS Finder
59
+ .DS_Store
@@ -0,0 +1,31 @@
1
+ # Changelog
2
+ - All notable changes to this project will be documented in this file.
3
+ - This project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
4
+
5
+ ---
6
+
7
+ [Unreleased]: https://github.com/QyuTeam/qyu/compare/v1.0.2...HEAD
8
+ ## [Unreleased]
9
+
10
+ [v1.0.2]: https://github.com/QyuTeam/qyu/compare/v1.0.1...v1.0.2
11
+ ## [v1.0.2]
12
+ ### Added
13
+ - Added first `CHANGELOG.md`
14
+ - [TESTS] WorkflowDescriptorValidator tests
15
+
16
+ ### Changed
17
+ - [BUGFIX] WorkflowDescriptorValidator: Validation was not working due to a missed `&&`
18
+ - [BUGFIX] Fix error name `Qyu::Errors::WorkflowDescriptorValidationError`
19
+
20
+ ---
21
+
22
+ [Template]: https://github.com/QyuTeam/qyu/compare/release-1...release-2
23
+ ## [Template]
24
+ ### Added
25
+ - Added something
26
+
27
+ ### Changed
28
+ - Changed something
29
+
30
+ ### Removed
31
+ - Removed something
data/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  [![Gem Version](https://img.shields.io/gem/v/qyu.svg)](https://rubygems.org/gems/qyu)
4
4
  [![Build Status](https://travis-ci.org/FindHotel/qyu.svg)](https://travis-ci.org/FindHotel/qyu)
5
+ [![Maintainability](https://api.codeclimate.com/v1/badges/88b8e0a8621d1da5c237/maintainability)](https://codeclimate.com/github/QyuTeam/qyu/maintainability)
6
+ [![Press](https://img.shields.io/badge/RubyWeekly-Blog%20Post-green.svg)](https://rubyweekly.com/link/44495/web)
5
7
 
6
8
  ## Requirements:
7
9
  * Ruby 2.4.0 or newer
@@ -39,7 +41,49 @@ Qyu.configure(
39
41
  ```
40
42
 
41
43
  ## Usage
42
- TODO: Write usage instructions here
44
+ [1] Connect all instances to the same state store and message queue
45
+ [2] Create a workflow
46
+ [3] Initialize a worker as follows
47
+
48
+ ```ruby
49
+ w = Qyu::Worker.new do
50
+ # callbacks
51
+ callback :execute, :before do
52
+ Qyu.logger.info 'Waiting for task..'
53
+ end
54
+
55
+ callback :execute, :after do
56
+ Qyu.logger.info 'Done'
57
+ end
58
+
59
+ # payload validation
60
+ validates :times, presence: true, type: :integer
61
+
62
+ # failure queue
63
+ failure_queue false
64
+ end
65
+
66
+ w.work('queue-name') do |task|
67
+ # to get the payload passed to the task
68
+ task.payload
69
+ # = { 'param_1' => true, 'param_2': [10, 11, 12], 'param_3' => 2 }
70
+
71
+ # get the job
72
+ task.job
73
+
74
+ # to manually start a task
75
+ task.job.create_task(task, 'next-task-name', payload)
76
+ rescue StandardError => ex
77
+ # If you rescue the error for debugging or reporting purposes, you have to raise it at the end
78
+ #
79
+ # do something
80
+ #
81
+ raise ex
82
+ end
83
+ ```
84
+
85
+ [4] Start worker
86
+ [5] Start creating Jobs using the previously created workflow
43
87
 
44
88
  ## Plugins
45
89
  The memory queue and store is just for testing purposes. For production; use one of the following:
@@ -87,4 +131,4 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
87
131
 
88
132
  ## Contributing
89
133
 
90
- Bug reports and pull requests are welcome on GitHub at https://github.com/FindHotel/qyu.
134
+ Bug reports and pull requests are welcome on GitHub at https://github.com/QyuTeam/qyu.
@@ -7,14 +7,25 @@ module Qyu
7
7
 
8
8
  class ServiceConfig
9
9
  class << self
10
+ # Register a service (Queue/Store)
11
+ #
12
+ # @param adapter_class [Class] service Class to Register
13
+ # @return [Class] service Class to Register
10
14
  def register(adapter_class)
11
15
  types[adapter_class::TYPE] = adapter_class
12
16
  end
13
17
 
18
+ # Validate provided config
19
+ #
20
+ # @param config [Hash] configuration
21
+ # @return [Boolean]
14
22
  def valid?(config)
15
23
  types[config[:type]].valid_config?(config)
16
24
  end
17
25
 
26
+ # Get registered services
27
+ #
28
+ # @return [Hash] registereds services
18
29
  def types
19
30
  @__types ||= {}
20
31
  end
@@ -2,11 +2,11 @@
2
2
 
3
3
  module Qyu
4
4
  module Errors
5
- # Qyu::Errors::WorkflowDescriptorValidatorationError
6
- class WorkflowDescriptorValidatorationError < Base
5
+ # Qyu::Errors::WorkflowDescriptorValidationError
6
+ class WorkflowDescriptorValidationError < Base
7
7
  attr_reader :validation_errors
8
8
  def initialize(validation_errors)
9
- super('Invalid Job descriptor.')
9
+ super("invalid workflow descriptor: #{validation_errors.join(', ')}")
10
10
  @validation_errors = validation_errors
11
11
  end
12
12
  end
@@ -2,17 +2,27 @@
2
2
 
3
3
  module Qyu
4
4
  # Qyu::Factory
5
- class Factory
5
+ class Factory #:nodoc:
6
6
  class ServiceFactory
7
7
  class << self
8
+ # Register a service (Queue/Store)
9
+ #
10
+ # @param adapter_class [Class] service Class to Register
11
+ # @return [Class] service Class to Register
8
12
  def register(adapter_class)
9
13
  types[adapter_class::TYPE] = adapter_class
10
14
  end
11
15
 
16
+ # Get registered services
17
+ #
18
+ # @return [Hash] registereds services
12
19
  def types
13
20
  @__types ||= {}
14
21
  end
15
22
 
23
+ # Initialize Queue/Store service with provided configuration
24
+ #
25
+ # @return [Object] an adapter
16
26
  def get(config)
17
27
  Qyu.logger.info "Got factory #{types[config[:type]]}"
18
28
  types[config[:type]].new(config)
@@ -12,6 +12,9 @@ module Qyu
12
12
  @errors = []
13
13
  end
14
14
 
15
+ # validates a workflow's descriptor
16
+ #
17
+ # @return [Boolean]
15
18
  def valid?
16
19
  validate
17
20
  @errors.empty?
@@ -28,19 +31,19 @@ module Qyu
28
31
 
29
32
  tasks.keys.each do |task_name|
30
33
  unless validate_queue_presence(task_name)
31
- @errors << "#{task_name} must have a valid queue."
34
+ @errors << "#{task_name} must have a valid queue"
32
35
  end
33
36
  unless validate_task_keys(task_name)
34
- @errors << "#{task_name} must only contain the following keys: #{ALLOWED_KEYS}."
37
+ @errors << "#{task_name} must only contain the following keys: #{ALLOWED_KEYS}"
35
38
  end
36
39
  unless validate_task_reference_formats(task_name)
37
- @errors << "#{task_name} must follow the reference declaration format."
40
+ @errors << "#{task_name} must follow the reference declaration format"
38
41
  end
39
- unless validate_task_references(task_name)
40
- @errors << "#{task_name} must list existing tasks in its references."
42
+ unless validate_referenced_tasks(task_name)
43
+ @errors << "#{task_name} must list existing tasks in its references"
41
44
  end
42
45
  unless validate_sync_condition_params(task_name)
43
- @errors << "#{task_name} must pass the correct parameters to the sync task."
46
+ @errors << "#{task_name} must pass the correct parameters to the sync task"
44
47
  end
45
48
  end
46
49
  rescue => ex
@@ -81,17 +84,17 @@ module Qyu
81
84
  end
82
85
 
83
86
  def validate_task_reference_formats(task_name)
84
- (tasks[task_name]['starts'].nil? || tasks[task_name]['starts'].is_a?(Array)) &&
85
- (tasks[task_name]['starts_manually'].nil? || tasks[task_name]['starts_manually'].is_a?(Array)) &&
86
- (tasks[task_name]['starts_with_params'].nil? || tasks[task_name]['starts_with_params'].is_a?(Hash))
87
- (tasks[task_name]['waits_for'].nil? || tasks[task_name]['waits_for'].is_a?(Hash))
87
+ validate_format(task_name, 'starts', Array) &&
88
+ validate_format(task_name, 'starts_manually', Array) &&
89
+ validate_format(task_name, 'starts_with_params', Hash) &&
90
+ validate_format(task_name, 'waits_for', Hash)
88
91
  end
89
92
 
90
- def validate_task_references(task_name)
91
- (tasks[task_name]['starts'] || []).all? { |t_name| tasks[t_name].is_a?(Hash) } &&
92
- (tasks[task_name]['starts_manually'] || []).all? { |t_name| tasks[t_name].is_a?(Hash) } &&
93
- (tasks[task_name]['starts_with_params'] || {}).all? { |t_name, _| tasks[t_name].is_a?(Hash) }
94
- (tasks[task_name]['waits_for'] || {}).all? { |t_name, _| tasks[t_name].is_a?(Hash) }
93
+ def validate_referenced_tasks(task_name)
94
+ validate_presence_of_reference_tasks(task_name, 'starts', Array) &&
95
+ validate_presence_of_reference_tasks(task_name, 'starts_manually', Array) &&
96
+ validate_presence_of_reference_tasks(task_name, 'starts_with_params', Hash) &&
97
+ validate_presence_of_reference_tasks(task_name, 'waits_for', Hash)
95
98
  end
96
99
 
97
100
  def validate_sync_condition_params(task_name)
@@ -105,6 +108,28 @@ module Qyu
105
108
  end
106
109
  end
107
110
 
111
+ # checks whether a task reference key is present and in valid format
112
+ #
113
+ # @param task_name [String] name of task currently being validated
114
+ # @param reference_key [String] reference key to validate tasks in it
115
+ # @param klass [Class] class to validate against
116
+ # @return [Boolean]
117
+ def validate_format(task_name, reference_key, klass)
118
+ (tasks[task_name][reference_key].nil? || tasks[task_name][reference_key].is_a?(klass))
119
+ end
120
+
121
+ # validates that a task descriptor is present and is a Hash
122
+ #
123
+ # @param task_name [String] name of task currently being validated
124
+ # @param reference_key [String] reference key to validate tasks in it
125
+ # @param klass [Class] how this reference key is represented
126
+ # @return [Boolean]
127
+ def validate_presence_of_reference_tasks(task_name, reference_key, klass)
128
+ task_names = (tasks[task_name][reference_key] || klass.new)
129
+ task_names = task_names.keys if klass.eql?(Hash)
130
+ task_names.all? { |t_name| tasks[t_name].is_a?(Hash) }
131
+ end
132
+
108
133
  def entry_points
109
134
  @descriptor['starts']
110
135
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Qyu
4
+ # Qyu::Status
4
5
  class Status
5
6
  COMPLETED = 'completed'
6
7
  QUEUED = 'queued'
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Qyu
4
+ # Qyu::Job
4
5
  class Job
5
6
  attr_reader :descriptor, :payload, :id, :created_at, :updated_at
6
7
 
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Qyu
4
+ # Qyu::Task
4
5
  # A Task represents a unit of work in a workflow.
5
6
  # Conceptually a Task:
6
7
  # - may not exist outside the context of a queue.
@@ -1,13 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Qyu
4
+ # Qyu::Workflow
4
5
  class Workflow
5
6
  attr_reader :id, :name, :descriptor, :created_at, :updated_at
6
7
 
7
8
  class << self
8
9
  def create(name:, descriptor:)
9
10
  validator = Qyu::Concerns::WorkflowDescriptorValidator.new(descriptor)
10
- fail Qyu::Errors::WorkflowDescriptorValidatorationError, validator.errors unless validator.valid?
11
+ fail Qyu::Errors::WorkflowDescriptorValidationError, validator.errors unless validator.valid?
11
12
  id = persist(name, descriptor)
12
13
  time = Time.now
13
14
  new(id, name, descriptor, time, time)
@@ -3,6 +3,7 @@
3
3
  module Qyu
4
4
  module Queue
5
5
  module Memory
6
+ # Qyu::Queue::Memory::Adapter
6
7
  class Adapter < Qyu::Queue::Base
7
8
  TYPE = :memory
8
9
 
@@ -3,6 +3,7 @@
3
3
  module Qyu
4
4
  module Store
5
5
  module Memory
6
+ # Qyu::Store::Memory::Adapter
6
7
  class Adapter < Qyu::Store::Base
7
8
  TYPE = :memory
8
9
 
@@ -3,7 +3,7 @@
3
3
  require 'sinatra'
4
4
  require 'qyu/ui/helpers/pagination'
5
5
 
6
- module Qyu
6
+ module Qyu #:nodoc: all
7
7
  class UI < Sinatra::Base
8
8
  set :port, ENV['PORT'] || 3000
9
9
  set :host, ENV['HOST'] || '0.0.0.0'
@@ -3,6 +3,7 @@
3
3
  module Qyu
4
4
  module Helpers
5
5
  module Pagination
6
+ # Qyu::Helpers::Pagination::PaginatableArray
6
7
  class PaginatableArray < Array
7
8
  attr_accessor :limit, :offset, :total_count, :page
8
9
 
@@ -1,15 +1,28 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Qyu
4
+ # Qyu::Utils
4
5
  module Utils
6
+ # Calculates end time after a number of seconds
7
+ #
8
+ # @param seconds [Integer] number of seconds after time
9
+ # @param start_time [Time] time to start from
10
+ # @return [Time] end time
5
11
  def self.seconds_after_time(seconds, start_time = Time.now)
6
12
  start_time + seconds
7
13
  end
8
14
 
15
+ # Generates a unique UUID
16
+ #
17
+ # @return [String] UUID
9
18
  def self.uuid
10
19
  SecureRandom.uuid
11
20
  end
12
21
 
22
+ # Convert all hash keys to strings
23
+ #
24
+ # @param object [Hash] Hash to stringify its keys
25
+ # @return [String] Hash with string keys
13
26
  def self.stringify_hash_keys(object)
14
27
  object.map { |k, v| [k.to_s, v] }.to_h
15
28
  end
@@ -1,3 +1,3 @@
1
1
  module Qyu
2
- VERSION = '1.0.1'
2
+ VERSION = '1.0.2'
3
3
  end
@@ -2,6 +2,24 @@
2
2
 
3
3
  module Qyu
4
4
  module Workers
5
+ # Qyu::Workers::Base
6
+ # A Worker is sitting on a queue, waiting for something.
7
+ # Qyu::Worker#work(queue_name)
8
+ #
9
+ # Worker lifecycle:
10
+ # - Start an infinte loop:
11
+ # while (true)
12
+ # - Fetch a message (Task) from its queue:
13
+ # t = Task.fetch(queue_name)
14
+ # - Check the completion:
15
+ # if t.completed? t.acknowledge_message
16
+ # - Lock it:
17
+ # t.lock! && t.mark_working
18
+ # - Works: yield(t)
19
+ # - Create the next steps/tasks:
20
+ # t.job.create_next_tasks(t, t.job.payload (...))
21
+ # - Finish:
22
+ # t.unlock! && t.mark_finished && t.acknowledge_message
5
23
  class Base
6
24
  include Concerns::Callback
7
25
  include Concerns::PayloadValidator
@@ -3,18 +3,36 @@
3
3
  module Qyu
4
4
  module Workers
5
5
  module Concerns
6
+ # Qyu::Workers::Concerns::Callback
7
+ #
8
+ # Meant to add callbacks to Qyu::Worker
9
+ #
10
+ # Usage:
11
+ #
12
+ # Qyu::Worker.new do
13
+ # callback :execute, :after do
14
+ # # Do something after execution
15
+ # end
16
+ # end
17
+ #
6
18
  module Callback
7
- # Meant to add callbacks to Qyu::Worker
19
+ # Adds a callback option to worker
8
20
  #
9
- # Usage:
10
- #
11
- # Qyu::Worker.new do
12
21
  # callback :execute, :after do
13
22
  # # Do something after execution
14
23
  # end
15
- # end
16
24
  #
17
-
25
+ # callback :execute, :before do
26
+ # # Do something before execution
27
+ # end
28
+ #
29
+ # callback :execute, :around do
30
+ # # Do something around execution
31
+ # end
32
+ #
33
+ # @param [Symbol] just :execute for now
34
+ # @param [Symbol] callback type
35
+ # @param [block] block to execute as callback
18
36
  def callback(method, type, &block)
19
37
  @_callbacks ||= {}
20
38
  @_callbacks[method] ||= {}
@@ -3,17 +3,24 @@
3
3
  module Qyu
4
4
  module Workers
5
5
  module Concerns
6
- # Qyu::Concerns::FailureQueue
6
+ # Qyu::Workers::Concerns::FailureQueue
7
+ #
8
+ # Adds ability to workers enqueue failed task to another queue
9
+ #
10
+ # Qyu::Worker.new do
11
+ # failure_queue true
12
+ # # or
13
+ # failure_queue false
14
+ # end
15
+ #
7
16
  module FailureQueue
8
- # Adds ability to workers enqueue failed task to another queue
17
+
18
+ # Configures failure queue
9
19
  #
10
- # Qyu::Worker.new do
20
+ # failure_queue false # default
11
21
  # failure_queue true
12
- # # or
13
- # failure_queue false
14
- # end
15
22
  #
16
-
23
+ # @param [Boolean]
17
24
  def failure_queue(fq)
18
25
  @failure_queue = fq
19
26
  end
@@ -3,26 +3,43 @@
3
3
  module Qyu
4
4
  module Workers
5
5
  module Concerns
6
- # Qyu::Concerns::PayloadValidator
6
+ # Qyu::Workers::Concerns::PayloadValidator
7
+ #
8
+ # Adds ability to workers to perform validations on
9
+ # params for the task to be processed
10
+ #
11
+ # Usage:
12
+ #
13
+ # Qyu::Worker.new do
14
+ # validates :user_id, presence: true, type: :integer, unless: :no_user
15
+ # validates :name, presence: true, type: :string
16
+ # validates :hotels, presence: true, type: :array
17
+ # validates :account_id, absence: true, if: :customer_id
18
+ # validates :account_id, presence: true, unless: :customer_id
19
+ # end
20
+ #
7
21
  module PayloadValidator
8
- # Adds ability to workers to perform validations on
9
- # params for the task to be processed
22
+ # Adds a validation option to worker
10
23
  #
11
- # Usage:
12
- #
13
- # Qyu::Worker.new do
14
24
  # validates :user_id, presence: true, type: :integer, unless: :no_user
15
25
  # validates :name, presence: true, type: :string
16
26
  # validates :account_id, absence: true, if: :customer_id
17
27
  # validates :account_id, presence: true, unless: :customer_id
18
- # end
19
28
  #
20
-
29
+ # @param [Symbol] payload key to validate
30
+ # @param [Hash] options for validation
31
+ # @return [Hash] registereds services
21
32
  def validates(parameter, opts = {})
22
33
  @_validations ||= {}
23
34
  @_validations[parameter.to_s] = Qyu::Utils.stringify_hash_keys(opts)
24
35
  end
25
36
 
37
+ # Validates payload in processing task and raises a Qyu::Errors::PayloadValidationError
38
+ # if any of the conditions do not hold up
39
+ #
40
+ # @param [Task] task with payload
41
+ # @return [nil]
42
+ # @raise [Qyu::Errors::PayloadValidationError]
26
43
  def validate_payload!(model)
27
44
  return unless @_validations
28
45
  payload = Qyu::Utils.stringify_hash_keys(model.payload || {})
@@ -48,6 +65,7 @@ module Qyu
48
65
 
49
66
  private
50
67
 
68
+ # :nodoc:
51
69
  def run_validation(option, param, value)
52
70
  # Skip if and unless conditionals (return nil)
53
71
  return if option.eql?('if')
@@ -2,6 +2,7 @@
2
2
 
3
3
  module Qyu
4
4
  module Workers
5
+ # Qyu::Workers::Sync
5
6
  class Sync < Base
6
7
  def work(queue_name)
7
8
  super do |task|
@@ -21,6 +21,8 @@ Gem::Specification.new do |spec|
21
21
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
22
  spec.require_paths = ["lib"]
23
23
 
24
+ spec.metadata["yard.run"] = "yri"
25
+
24
26
  spec.add_runtime_dependency 'activesupport', '~> 5.1'
25
27
 
26
28
  spec.add_development_dependency 'bundler', '~> 1.16'
@@ -28,9 +30,9 @@ Gem::Specification.new do |spec|
28
30
  spec.add_development_dependency 'rack-test'
29
31
  spec.add_development_dependency 'pry'
30
32
  spec.add_development_dependency 'pry-byebug'
31
- spec.add_development_dependency 'rake', '~> 10.0'
32
- spec.add_development_dependency 'rspec', '~> 3.5'
33
+ spec.add_development_dependency 'rake', '~> 12.0'
34
+ spec.add_development_dependency 'rspec', '~> 3.7'
33
35
  spec.add_development_dependency 'simplecov'
34
36
  spec.add_development_dependency 'sinatra'
35
- spec.add_development_dependency 'timecop', '~> 0.8'
37
+ spec.add_development_dependency 'timecop', '~> 0.9'
36
38
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: qyu
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elod Peter
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2018-02-23 00:00:00.000000000 Z
12
+ date: 2018-03-27 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -101,28 +101,28 @@ dependencies:
101
101
  requirements:
102
102
  - - "~>"
103
103
  - !ruby/object:Gem::Version
104
- version: '10.0'
104
+ version: '12.0'
105
105
  type: :development
106
106
  prerelease: false
107
107
  version_requirements: !ruby/object:Gem::Requirement
108
108
  requirements:
109
109
  - - "~>"
110
110
  - !ruby/object:Gem::Version
111
- version: '10.0'
111
+ version: '12.0'
112
112
  - !ruby/object:Gem::Dependency
113
113
  name: rspec
114
114
  requirement: !ruby/object:Gem::Requirement
115
115
  requirements:
116
116
  - - "~>"
117
117
  - !ruby/object:Gem::Version
118
- version: '3.5'
118
+ version: '3.7'
119
119
  type: :development
120
120
  prerelease: false
121
121
  version_requirements: !ruby/object:Gem::Requirement
122
122
  requirements:
123
123
  - - "~>"
124
124
  - !ruby/object:Gem::Version
125
- version: '3.5'
125
+ version: '3.7'
126
126
  - !ruby/object:Gem::Dependency
127
127
  name: simplecov
128
128
  requirement: !ruby/object:Gem::Requirement
@@ -157,14 +157,14 @@ dependencies:
157
157
  requirements:
158
158
  - - "~>"
159
159
  - !ruby/object:Gem::Version
160
- version: '0.8'
160
+ version: '0.9'
161
161
  type: :development
162
162
  prerelease: false
163
163
  version_requirements: !ruby/object:Gem::Requirement
164
164
  requirements:
165
165
  - - "~>"
166
166
  - !ruby/object:Gem::Version
167
- version: '0.8'
167
+ version: '0.9'
168
168
  description: Distributed task execution system for complex workflows
169
169
  email:
170
170
  - bejmuller@gmail.com
@@ -176,6 +176,7 @@ files:
176
176
  - ".gitignore"
177
177
  - ".rspec"
178
178
  - ".travis.yml"
179
+ - CHANGELOG.md
179
180
  - CODE_OF_CONDUCT.md
180
181
  - Gemfile
181
182
  - LICENSE
@@ -254,7 +255,8 @@ files:
254
255
  - qyu.gemspec
255
256
  homepage: https://github.com/FindHotel/qyu
256
257
  licenses: []
257
- metadata: {}
258
+ metadata:
259
+ yard.run: yri
258
260
  post_install_message:
259
261
  rdoc_options: []
260
262
  require_paths:
@@ -271,7 +273,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
271
273
  version: '0'
272
274
  requirements: []
273
275
  rubyforge_project:
274
- rubygems_version: 2.7.3
276
+ rubygems_version: 2.6.8
275
277
  signing_key:
276
278
  specification_version: 4
277
279
  summary: Distributed task execution system for complex workflows