qyu 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
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