arq 0.1.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: a4e1c4a65e159a4c635f1a1bee0bc1b0797dbe99a01d16b9a515bc6f1a2060bd
4
+ data.tar.gz: 4dca5b5179826aa0161b8ae619407533ded39112db29bec87c8c7c744ca41e99
5
+ SHA512:
6
+ metadata.gz: 253883d41ea384035d6e9ebadc41e9c9a94f752b16eb28d0aad0f368406a7ca413ae14bb6f5c4f973f6806ca58531c70de82e20c9208a5ae951e2c7142efcef8
7
+ data.tar.gz: 741d201875b5fdeded240b28961a8b4367c224048f0e3cfcf1d90085d0269d847ccaef0e4aecde774cc4c648054a82f8b28be1b088c440b14869ce8f14e9d8c1
data/lib/arq/action.rb ADDED
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arq
4
+ # Module to extend to create an action. Exposes confing functions #call, #params, and #returns.
5
+ module Action
6
+ def call(ctx)
7
+ ctx = transform_input_context(ctx)
8
+
9
+ generate_runnable(ctx).call
10
+
11
+ ctx
12
+ end
13
+
14
+ def params(*keys)
15
+ params_list.concat(keys).compact
16
+ end
17
+
18
+ def returns(*keys)
19
+ returns_list.concat(keys).compact
20
+ end
21
+
22
+ def run(&block)
23
+ @run_block = block
24
+ end
25
+
26
+ private
27
+
28
+ def transform_input_context(ctx)
29
+ case ctx
30
+ when Arq::Context
31
+ ctx
32
+ when Hash
33
+ Arq::Context.new(ctx)
34
+ else
35
+ raise Arq::InvalidContextParameterError
36
+ end
37
+ end
38
+
39
+ def generate_runnable(ctx)
40
+ Arq::Runnable.new(ctx, params_list, returns_list, &run_block)
41
+ end
42
+
43
+ def params_list
44
+ @params_list ||= []
45
+ end
46
+
47
+ def returns_list
48
+ @returns_list ||= []
49
+ end
50
+
51
+ def run_block
52
+ @run_block ||= nil
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arq
4
+ # Light wrapper around Hash with additional properties for action results.
5
+ class Context < Hash
6
+ def initialize(params = {})
7
+ super(nil)
8
+ merge!(params)
9
+ end
10
+
11
+ def fail!(message = nil)
12
+ @failure = true
13
+ @message = message
14
+ end
15
+
16
+ def fail_now!(message = nil)
17
+ fail!(message)
18
+ raise Arq::FailureError
19
+ end
20
+
21
+ def failure?
22
+ @failure ||= false
23
+ end
24
+
25
+ def success?
26
+ !failure?
27
+ end
28
+
29
+ def message
30
+ @message ||= ""
31
+ end
32
+ end
33
+ end
data/lib/arq/errors.rb ADDED
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arq
4
+ # Raised when the context for an action is not a Arq::Context or a Hash.
5
+ class InvalidContextParameterError < StandardError
6
+ def initialize
7
+ super("Must be a Arq::Context or Hash")
8
+ end
9
+ end
10
+
11
+ # Raised when action parameters do not exist within the passed context.
12
+ class ParametersNotInContextError < StandardError
13
+ def initialize(params)
14
+ super(params.join(", "))
15
+ end
16
+ end
17
+
18
+ # Raised when action return keys do not exist within the passed context.
19
+ class ReturnValuesNotInContextError < StandardError
20
+ def initialize(returns)
21
+ super(returns.join(", "))
22
+ end
23
+ end
24
+
25
+ # Raised internally in [Arq::Runnable#hard_fail!] to escape the current action.
26
+ class FailureError < StandardError
27
+ end
28
+ end
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arq
4
+ # Represents a process to run with a given context, parameters, and returns.
5
+ # A Runnable is generated from an Action.
6
+ class Runnable
7
+ def initialize(ctx, params = [], returns = [], &block)
8
+ @ctx = ctx
9
+ @params = params
10
+ @returns = returns
11
+ @block = block
12
+ end
13
+
14
+ def call
15
+ return if @ctx.failure?
16
+
17
+ validate_required_params
18
+
19
+ import_context
20
+ val = run_block
21
+ export_context
22
+
23
+ # If the block returned an array, attempt to run
24
+ run_sequence(val) if val.is_a?(Array)
25
+
26
+ # Only validate returns if context is successful
27
+ validate_required_returns if @ctx.success?
28
+
29
+ val
30
+ end
31
+
32
+ def run(&block)
33
+ Arq::Runnable.new(@ctx, [], [], &block)
34
+ end
35
+
36
+ def fail!(message)
37
+ @ctx.fail!(message)
38
+ end
39
+
40
+ def fail_now!(message)
41
+ @ctx.fail_now!(message)
42
+ end
43
+
44
+ private
45
+
46
+ def run_block
47
+ instance_eval(&@block)
48
+ rescue Arq::FailureError
49
+ nil
50
+ end
51
+
52
+ def run_sequence(sequence)
53
+ sequence.each do |e|
54
+ case e
55
+ when Arq::Action
56
+ e.call(@ctx)
57
+ when Arq::Runnable
58
+ e.call
59
+ end
60
+ end
61
+ end
62
+
63
+ def import_context
64
+ @ctx.each do |key, val|
65
+ instance_variable_set(:"@#{key}", val)
66
+ end
67
+ end
68
+
69
+ def export_context
70
+ keys = [*@ctx.keys, *@returns]
71
+
72
+ keys.each do |key|
73
+ instance_key = :"@#{key}"
74
+ # Must check for existence since getting non-existent
75
+ # instance variables will return nil.
76
+ @ctx[key] = instance_variable_get(instance_key) if instance_variables.include?(instance_key)
77
+ end
78
+ end
79
+
80
+ def validate_required_params
81
+ missing_params = (@params - @ctx.keys)
82
+ raise Arq::ParametersNotInContextError, missing_params unless missing_params.empty?
83
+ end
84
+
85
+ def validate_required_returns
86
+ missing_returns = (@returns - @ctx.keys)
87
+ raise Arq::ReturnValuesNotInContextError, missing_returns unless missing_returns.empty?
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arq
4
+ VERSION = "0.1.0"
5
+ end
data/lib/arq.rb ADDED
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "arq/version"
4
+ require "arq/errors"
5
+ require "arq/context"
6
+ require "arq/runnable"
7
+ require "arq/action"
metadata ADDED
@@ -0,0 +1,54 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: arq
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Kavin Phan
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2022-09-05 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: A service skeleton framework heavily inspired by LightService with the
14
+ primary goal of being less verbose.
15
+ email:
16
+ - kavin@kphan.tech
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - lib/arq.rb
22
+ - lib/arq/action.rb
23
+ - lib/arq/context.rb
24
+ - lib/arq/errors.rb
25
+ - lib/arq/runnable.rb
26
+ - lib/arq/version.rb
27
+ homepage: https://github.com/kphan32/arq
28
+ licenses:
29
+ - MIT
30
+ metadata:
31
+ homepage_uri: https://github.com/kphan32/arq
32
+ source_code_uri: https://github.com/kphan32/arq
33
+ changelog_uri: https://github.com/kphan32/arq/blob/main/CODE_OF_CONDUCT.md
34
+ rubygems_mfa_required: 'true'
35
+ post_install_message:
36
+ rdoc_options: []
37
+ require_paths:
38
+ - lib
39
+ required_ruby_version: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: 3.0.3
44
+ required_rubygems_version: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ requirements: []
50
+ rubygems_version: 3.2.32
51
+ signing_key:
52
+ specification_version: 4
53
+ summary: A simple service skeleton framework
54
+ test_files: []