orchestrate_flow 0.1.0 → 0.1.1
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 +4 -4
- data/Gemfile.lock +59 -0
- data/README.md +41 -1
- data/lib/orchestrate_flow/version.rb +1 -1
- data/lib/orchestrate_flow/workflow.rb +75 -0
- data/lib/orchestrate_flow.rb +3 -3
- data/orchestrate_flow.gemspec +41 -0
- metadata +20 -5
- data/.rspec +0 -3
- data/.rubocop.yml +0 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8e6805b3b41e73cd47820f9cb2bcfc27045c26b043615b3fef3531893b2591b7
|
4
|
+
data.tar.gz: 48baaf4ddee5bce3face34173297f3dba9c65ca200c887a29d4fa6c2524046a0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ab0a2cebf92c3d6b5821776a068443068c7f5411cf2841d35ef522798c7b92b113a5c1674f6b333c6d7770067b8303fb07f86eb54985e154edd683c745cbbe66
|
7
|
+
data.tar.gz: 6423392a96dd5daef74f18095f49e989830bd2c4242cb4f3deaa0efca95f1dd71c0dad522786e051a998ac1b573f5f9caf8de1bb70e0189d1c1a33df18d6e520
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
orchestrate_flow (0.1.0)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: https://rubygems.org/
|
8
|
+
specs:
|
9
|
+
ast (2.4.2)
|
10
|
+
diff-lcs (1.5.1)
|
11
|
+
json (2.7.5)
|
12
|
+
language_server-protocol (3.17.0.3)
|
13
|
+
parallel (1.26.3)
|
14
|
+
parser (3.3.5.1)
|
15
|
+
ast (~> 2.4.1)
|
16
|
+
racc
|
17
|
+
racc (1.8.1)
|
18
|
+
rainbow (3.1.1)
|
19
|
+
rake (13.2.1)
|
20
|
+
regexp_parser (2.9.2)
|
21
|
+
rspec (3.13.0)
|
22
|
+
rspec-core (~> 3.13.0)
|
23
|
+
rspec-expectations (~> 3.13.0)
|
24
|
+
rspec-mocks (~> 3.13.0)
|
25
|
+
rspec-core (3.13.2)
|
26
|
+
rspec-support (~> 3.13.0)
|
27
|
+
rspec-expectations (3.13.3)
|
28
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
29
|
+
rspec-support (~> 3.13.0)
|
30
|
+
rspec-mocks (3.13.2)
|
31
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
32
|
+
rspec-support (~> 3.13.0)
|
33
|
+
rspec-support (3.13.1)
|
34
|
+
rubocop (1.68.0)
|
35
|
+
json (~> 2.3)
|
36
|
+
language_server-protocol (>= 3.17.0)
|
37
|
+
parallel (~> 1.10)
|
38
|
+
parser (>= 3.3.0.2)
|
39
|
+
rainbow (>= 2.2.2, < 4.0)
|
40
|
+
regexp_parser (>= 2.4, < 3.0)
|
41
|
+
rubocop-ast (>= 1.32.2, < 2.0)
|
42
|
+
ruby-progressbar (~> 1.7)
|
43
|
+
unicode-display_width (>= 2.4.0, < 3.0)
|
44
|
+
rubocop-ast (1.33.1)
|
45
|
+
parser (>= 3.3.1.0)
|
46
|
+
ruby-progressbar (1.13.0)
|
47
|
+
unicode-display_width (2.6.0)
|
48
|
+
|
49
|
+
PLATFORMS
|
50
|
+
arm64-darwin-21
|
51
|
+
|
52
|
+
DEPENDENCIES
|
53
|
+
orchestrate_flow!
|
54
|
+
rake (~> 13.0)
|
55
|
+
rspec (~> 3.0)
|
56
|
+
rubocop (~> 1.21)
|
57
|
+
|
58
|
+
BUNDLED WITH
|
59
|
+
2.2.32
|
data/README.md
CHANGED
@@ -27,7 +27,47 @@ Or install it yourself as:
|
|
27
27
|
|
28
28
|
## Usage
|
29
29
|
|
30
|
-
|
30
|
+
### Defining a Workflow
|
31
|
+
You can define states, transitions, and event actions as follows
|
32
|
+
|
33
|
+
```ruby
|
34
|
+
# Usage Example
|
35
|
+
|
36
|
+
# Define a custom workflow class
|
37
|
+
class MyWorkflow < OrchestrateFlow::Workflow
|
38
|
+
# Define possible states
|
39
|
+
state :pending
|
40
|
+
state :in_progress
|
41
|
+
state :completed
|
42
|
+
state :failed
|
43
|
+
|
44
|
+
# Define transitions between states
|
45
|
+
transition event: :start, from: :pending, to: :in_progress
|
46
|
+
transition event: :complete, from: :in_progress, to: :completed
|
47
|
+
transition event: :fail, from: :in_progress, to: :failed
|
48
|
+
|
49
|
+
# Define actions to trigger on specific events
|
50
|
+
on :start do
|
51
|
+
puts "Workflow started!"
|
52
|
+
end
|
53
|
+
|
54
|
+
on :complete do
|
55
|
+
puts "Workflow completed successfully!"
|
56
|
+
end
|
57
|
+
|
58
|
+
on :fail do
|
59
|
+
puts "Workflow failed. Please try again."
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# Initialize the workflow and trigger events
|
64
|
+
workflow = MyWorkflow.new
|
65
|
+
puts workflow.state # => :pending
|
66
|
+
workflow.trigger(:start) # => Workflow started!
|
67
|
+
puts workflow.state # => :in_progress
|
68
|
+
workflow.trigger(:complete) # => Workflow completed successfully!
|
69
|
+
puts workflow.state # => :completed
|
70
|
+
```
|
31
71
|
|
32
72
|
## Development
|
33
73
|
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module OrchestrateFlow
|
4
|
+
# The Workflow class represents a basic state machine for defining workflows
|
5
|
+
# with states, transitions, and event-driven actions. It allows developers
|
6
|
+
# to manage complex workflows using defined states and triggers.
|
7
|
+
class Workflow
|
8
|
+
attr_reader :state
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@state = :pending
|
12
|
+
@transitions = {}
|
13
|
+
@event_actions = {}
|
14
|
+
end
|
15
|
+
|
16
|
+
# Define a new state
|
17
|
+
def self.state(name)
|
18
|
+
@states ||= []
|
19
|
+
@states << name
|
20
|
+
define_method("#{name}?") { @state == name }
|
21
|
+
end
|
22
|
+
|
23
|
+
# Define a transition between states
|
24
|
+
def self.transition(event:, from:, to:)
|
25
|
+
@transitions ||= {}
|
26
|
+
@transitions[event] = { from: from, to: to }
|
27
|
+
end
|
28
|
+
|
29
|
+
# Define actions to trigger on events
|
30
|
+
def self.on(event, &action)
|
31
|
+
@event_actions ||= {}
|
32
|
+
@event_actions[event] = action
|
33
|
+
end
|
34
|
+
|
35
|
+
# Execute a transition event
|
36
|
+
def trigger(event)
|
37
|
+
unless valid_transition?(event)
|
38
|
+
raise InvalidTransitionError, "Cannot transition from #{@state} using event #{event}"
|
39
|
+
end
|
40
|
+
|
41
|
+
execute_event_action(event)
|
42
|
+
@state = self.class.transitions[event][:to]
|
43
|
+
end
|
44
|
+
|
45
|
+
# Accessors for states, transitions, and event actions
|
46
|
+
class << self
|
47
|
+
attr_reader :states
|
48
|
+
end
|
49
|
+
|
50
|
+
class << self
|
51
|
+
attr_reader :transitions
|
52
|
+
end
|
53
|
+
|
54
|
+
class << self
|
55
|
+
attr_reader :event_actions
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
# Validate if a transition is allowed
|
61
|
+
def valid_transition?(event)
|
62
|
+
transition = self.class.transitions[event]
|
63
|
+
transition && transition[:from] == @state
|
64
|
+
end
|
65
|
+
|
66
|
+
# Execute an event action if defined
|
67
|
+
def execute_event_action(event)
|
68
|
+
action = self.class.event_actions[event]
|
69
|
+
action&.call
|
70
|
+
end
|
71
|
+
|
72
|
+
# Custom error for invalid transitions
|
73
|
+
class InvalidTransitionError < StandardError; end
|
74
|
+
end
|
75
|
+
end
|
data/lib/orchestrate_flow.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative "orchestrate_flow/version"
|
4
|
+
require_relative "orchestrate_flow/workflow"
|
4
5
|
|
6
|
+
# OrchestrateFlow is a Ruby gem module for managing complex workflows and task orchestration.
|
7
|
+
# It provides tools for defining states, transitions, and event-driven actions.
|
5
8
|
module OrchestrateFlow
|
6
|
-
def self.hello
|
7
|
-
"Hello, World from OrchestrateFlow!"
|
8
|
-
end
|
9
9
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "lib/orchestrate_flow/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "orchestrate_flow"
|
7
|
+
spec.version = OrchestrateFlow::VERSION
|
8
|
+
spec.authors = ["Daniel Morales"]
|
9
|
+
spec.email = ["danielmorales1202@gmail.com"]
|
10
|
+
|
11
|
+
spec.summary = "Native orchestration in Ruby with advanced workflow capabilities"
|
12
|
+
spec.description = "Ruby gem for managing complex workflows and orchestrating tasks."
|
13
|
+
spec.homepage = "https://compensix.com"
|
14
|
+
spec.license = "MIT"
|
15
|
+
spec.required_ruby_version = ">= 2.6.0"
|
16
|
+
|
17
|
+
# spec.metadata["allowed_push_host"] = "TODO: Set to your gem server 'https://example.com'"
|
18
|
+
|
19
|
+
spec.metadata["homepage_uri"] = spec.homepage
|
20
|
+
spec.metadata["source_code_uri"] = "https://github.com/danielmoralesp/orchestrate_flow"
|
21
|
+
spec.metadata["changelog_uri"] = "https://github.com/danielmoralesp/orchestrate_flow/CHANGELOG.md"
|
22
|
+
|
23
|
+
# Specify which files should be added to the gem when it is released.
|
24
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
25
|
+
spec.files = Dir.glob("**/*").reject do |file|
|
26
|
+
file.match(%r{\A(?:test|spec|features)/}) ||
|
27
|
+
file.match(/\A\.(git|travis|circleci|appveyor)/) ||
|
28
|
+
file.match(/\.gem$/) # Exclude .gem files from the gem package
|
29
|
+
end
|
30
|
+
|
31
|
+
spec.bindir = "exe"
|
32
|
+
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
|
33
|
+
spec.require_paths = ["lib"]
|
34
|
+
|
35
|
+
# Uncomment to register a new dependency of your gem
|
36
|
+
# spec.add_dependency "example-gem", "~> 1.0"
|
37
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
38
|
+
|
39
|
+
# For more information and examples about making a new gem, checkout our
|
40
|
+
# guide at: https://bundler.io/guides/creating_gem.html
|
41
|
+
end
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: orchestrate_flow
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Morales
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
12
|
-
dependencies:
|
11
|
+
date: 2024-11-04 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rspec
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3.0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '3.0'
|
13
27
|
description: Ruby gem for managing complex workflows and orchestrating tasks.
|
14
28
|
email:
|
15
29
|
- danielmorales1202@gmail.com
|
@@ -17,11 +31,10 @@ executables: []
|
|
17
31
|
extensions: []
|
18
32
|
extra_rdoc_files: []
|
19
33
|
files:
|
20
|
-
- ".rspec"
|
21
|
-
- ".rubocop.yml"
|
22
34
|
- CHANGELOG.md
|
23
35
|
- CODE_OF_CONDUCT.md
|
24
36
|
- Gemfile
|
37
|
+
- Gemfile.lock
|
25
38
|
- LICENSE.txt
|
26
39
|
- README.md
|
27
40
|
- Rakefile
|
@@ -29,6 +42,8 @@ files:
|
|
29
42
|
- bin/setup
|
30
43
|
- lib/orchestrate_flow.rb
|
31
44
|
- lib/orchestrate_flow/version.rb
|
45
|
+
- lib/orchestrate_flow/workflow.rb
|
46
|
+
- orchestrate_flow.gemspec
|
32
47
|
homepage: https://compensix.com
|
33
48
|
licenses:
|
34
49
|
- MIT
|
data/.rspec
DELETED
data/.rubocop.yml
DELETED