riker 0.1.0.pre1 → 0.1.0.pre3
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 +2 -1
- data/README.md +69 -0
- data/lib/riker/command.rb +62 -0
- data/lib/riker/command_parameters.rb +52 -0
- data/lib/riker/error.rb +5 -0
- data/lib/riker/parameter.rb +52 -0
- data/lib/riker/version.rb +1 -1
- data/lib/riker.rb +25 -2
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b819ce3e2d6fb0f84fd16e4eb754802ca3c655810179225c9f4ba9cff3d8f068
|
4
|
+
data.tar.gz: ab2a5b0a1e9f3beb29c1ba8437de4b50be42f395c79cc833985c7da082c572f4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ae433f9f555ceee2b68121953086c7de1e340773ccd1dc802a254126a7bcee94f7f77d2f28427b29e89a6f2e738f9b7aeb5ec709951eb84c150de49bff58ef9c
|
7
|
+
data.tar.gz: 65a9c8f2be649a18223f3f97caf10b628155f6e0ac54b7891aba504616084eaa6ef85f79f7ac96ff55d7d057d18070bc3a84e527a0ba4b0faac276c80509e74b
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,74 @@
|
|
1
1
|
# Riker
|
2
2
|
|
3
|
+
[](https://rubygems.org/gems/riker)
|
4
|
+
[](https://github.com/benfalk/riker/actions?query=workflow%3ATest)
|
5
|
+
|
3
6
|
<img src="./assets/commander-riker.jpeg" />
|
4
7
|
|
5
8
|
High-Performance, Dependency-Free Command Pattern For Ruby
|
9
|
+
|
10
|
+
## Simple Usage
|
11
|
+
|
12
|
+
### In your gemfile:
|
13
|
+
|
14
|
+
```ruby
|
15
|
+
gem 'riker', '0.1.0.pre3'
|
16
|
+
```
|
17
|
+
|
18
|
+
### In your code:
|
19
|
+
|
20
|
+
```ruby
|
21
|
+
class SimpleGreeting
|
22
|
+
extend Riker
|
23
|
+
|
24
|
+
param :first_name
|
25
|
+
param :last_name, required: false
|
26
|
+
param :punctuation, default: '.'
|
27
|
+
|
28
|
+
execute do
|
29
|
+
return "Hello #{first_name}#{punctuation}" if last_name.nil?
|
30
|
+
|
31
|
+
"Hello #{first_name} #{last_name}#{punctuation}"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
```
|
35
|
+
|
36
|
+
### In use:
|
37
|
+
|
38
|
+
```ruby
|
39
|
+
SimpleGreeting.run!(first_name: 'Will')
|
40
|
+
# => "Hello Will."
|
41
|
+
|
42
|
+
SimpleGreeting.run!(first_name: 'Will', last_name: 'Riker')
|
43
|
+
# => "Hello Will Riker."
|
44
|
+
|
45
|
+
SimpleGreeting.run!(first_name: 'Will', last_name: 'Riker', punctuation: '!')
|
46
|
+
# => "Hello Will Riker!"
|
47
|
+
```
|
48
|
+
|
49
|
+
## Default Procs
|
50
|
+
|
51
|
+
### In your code:
|
52
|
+
|
53
|
+
```ruby
|
54
|
+
class CaptainsLog
|
55
|
+
extend Riker
|
56
|
+
|
57
|
+
param :stardate, default: -> { Time.now.to_f }
|
58
|
+
param :message
|
59
|
+
|
60
|
+
execute do
|
61
|
+
"Captain's Log; Stardate: #{stardate}\n\n#{message}"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
```
|
65
|
+
|
66
|
+
### In use:
|
67
|
+
|
68
|
+
```ruby
|
69
|
+
CaptainsLog.run!(message: "The Borg are attacking!")
|
70
|
+
# => "Captain's Log; Stardate: 1664393978.915553\n\nThe Borg are attacking!"
|
71
|
+
|
72
|
+
CaptainsLog.run(message: "We've traveled back in time!", stardate: 42.1337)
|
73
|
+
# => "Captain's Log; Stardate: 42.1337\n\nWe've traveled back in time!"
|
74
|
+
```
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Riker
|
4
|
+
# Command Builder
|
5
|
+
#
|
6
|
+
# This is responsible for orchestrating and keeping
|
7
|
+
# track of the build of a command in your application
|
8
|
+
#
|
9
|
+
class Command
|
10
|
+
# @return [Riker::CommandParameters]
|
11
|
+
attr_reader :parameters
|
12
|
+
|
13
|
+
# @return [Proc, nil]
|
14
|
+
attr_accessor :execute_block
|
15
|
+
|
16
|
+
def initialize
|
17
|
+
@parameters = CommandParameters.new
|
18
|
+
end
|
19
|
+
|
20
|
+
# @param klass [Class]
|
21
|
+
def build!(klass)
|
22
|
+
klass.define_method(:execute, &execute_block)
|
23
|
+
define_default_setters!(klass)
|
24
|
+
define_init!(klass)
|
25
|
+
define_run_bang!(klass)
|
26
|
+
define_attr_readers!(klass)
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
# @param klass [Class]
|
32
|
+
def define_init!(klass)
|
33
|
+
klass.class_eval(<<~RUBY, __FILE__, __LINE__ + 1)
|
34
|
+
def initialize(#{parameters.ctor_args}) # def initialize(foo:)
|
35
|
+
#{parameters.variable_sets} # @foo = foo
|
36
|
+
end # end
|
37
|
+
RUBY
|
38
|
+
end
|
39
|
+
|
40
|
+
# @param klass [Class]
|
41
|
+
def define_run_bang!(klass)
|
42
|
+
klass.class_eval(<<~RUBY, __FILE__, __LINE__ + 1)
|
43
|
+
def self.run!(**arguments) # def initialize(**arguments)
|
44
|
+
command = new(**arguments) # command = new(**arguments)
|
45
|
+
command.execute # command.execute
|
46
|
+
end # end
|
47
|
+
RUBY
|
48
|
+
end
|
49
|
+
|
50
|
+
# @param klass [Class]
|
51
|
+
def define_attr_readers!(klass)
|
52
|
+
klass.attr_reader(*parameters.map(&:name))
|
53
|
+
end
|
54
|
+
|
55
|
+
# @param klass [Class]
|
56
|
+
def define_default_setters!(klass)
|
57
|
+
parameters.each do |param|
|
58
|
+
param.default.build_default_function!(klass)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Riker
|
4
|
+
# Command Parameters
|
5
|
+
#
|
6
|
+
# This is responsible for keeping track of the command's
|
7
|
+
# parameters. This includes how they are used and applied
|
8
|
+
# to the construction of a command.
|
9
|
+
#
|
10
|
+
class CommandParameters
|
11
|
+
include Enumerable
|
12
|
+
class ParamNameTaken < ::Riker::Error; end
|
13
|
+
class InvalidParamName < ::Riker::Error; end
|
14
|
+
|
15
|
+
def initialize
|
16
|
+
# @var [Hash<Symbol, Parameter>]
|
17
|
+
@params = {}
|
18
|
+
end
|
19
|
+
|
20
|
+
# @param name [Symbol]
|
21
|
+
# @return [Parameters]
|
22
|
+
#
|
23
|
+
def add(name, **options)
|
24
|
+
validate_name!(name)
|
25
|
+
@params[name] = Parameter.new(name, **options)
|
26
|
+
|
27
|
+
self
|
28
|
+
end
|
29
|
+
|
30
|
+
# @return [String]
|
31
|
+
def ctor_args
|
32
|
+
map(&:ctor_arg).join(', ')
|
33
|
+
end
|
34
|
+
|
35
|
+
# @return [String]
|
36
|
+
def variable_sets
|
37
|
+
map(&:variable_set).join("\n")
|
38
|
+
end
|
39
|
+
|
40
|
+
# @yield [Parameter]
|
41
|
+
def each(&block)
|
42
|
+
@params.values.each(&block)
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def validate_name!(name)
|
48
|
+
raise InvalidParamName unless name.is_a?(Symbol)
|
49
|
+
raise ParamNameTaken if @params.key?(name)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/lib/riker/error.rb
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'parameter/default_value'
|
4
|
+
|
5
|
+
module Riker
|
6
|
+
# Single Command Parameter
|
7
|
+
#
|
8
|
+
class Parameter
|
9
|
+
# @return [Symbol]
|
10
|
+
attr_reader :name
|
11
|
+
|
12
|
+
# @return [DefaultValue]
|
13
|
+
attr_reader :default
|
14
|
+
|
15
|
+
# @param name [Symbol]
|
16
|
+
# @param required [Boolean]
|
17
|
+
# @param default [Object, Proc]
|
18
|
+
def initialize(
|
19
|
+
name,
|
20
|
+
required: true,
|
21
|
+
default: DefaultValue.no_value
|
22
|
+
)
|
23
|
+
@name = name
|
24
|
+
@required = required
|
25
|
+
@default = DefaultValue.new(name, default)
|
26
|
+
end
|
27
|
+
|
28
|
+
# @return [Boolean]
|
29
|
+
def required?
|
30
|
+
@required
|
31
|
+
end
|
32
|
+
|
33
|
+
# @return [String]
|
34
|
+
def ctor_arg
|
35
|
+
@ctor_arg ||= "#{name}: #{fallback_default}"
|
36
|
+
end
|
37
|
+
|
38
|
+
# @return [String]
|
39
|
+
def variable_set
|
40
|
+
@variable_set ||= "@#{name} = #{name}"
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def fallback_default
|
46
|
+
return default.function_name if default.present?
|
47
|
+
return if required?
|
48
|
+
|
49
|
+
'nil'
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/lib/riker/version.rb
CHANGED
data/lib/riker.rb
CHANGED
@@ -1,8 +1,31 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative 'riker/version'
|
4
|
+
require_relative 'riker/error'
|
5
|
+
require_relative 'riker/command'
|
6
|
+
require_relative 'riker/command_parameters'
|
7
|
+
require_relative 'riker/parameter'
|
4
8
|
|
9
|
+
# The Commander of the USS Enterprise
|
5
10
|
module Riker
|
6
|
-
|
7
|
-
|
11
|
+
# @param klass [Class]
|
12
|
+
def self.extended(klass)
|
13
|
+
klass.instance_variable_set(:@command, Command.new)
|
14
|
+
end
|
15
|
+
|
16
|
+
# @return [Riker::Command]
|
17
|
+
attr_reader :command
|
18
|
+
|
19
|
+
# @param name [Symbol]
|
20
|
+
def param(name, **options)
|
21
|
+
command.parameters.add(name, **options)
|
22
|
+
end
|
23
|
+
|
24
|
+
# @block the logic of the command
|
25
|
+
def execute(&block)
|
26
|
+
raise Error, "execute block already called for #{self}!" if command.execute_block
|
27
|
+
|
28
|
+
command.execute_block = block
|
29
|
+
command.build!(self)
|
30
|
+
end
|
8
31
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: riker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.0.
|
4
|
+
version: 0.1.0.pre3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Benjamin Falk
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-09-
|
11
|
+
date: 2022-09-28 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: High-Performance, Dependency-Free Command Pattern For Ruby
|
14
14
|
email:
|
@@ -28,6 +28,10 @@ files:
|
|
28
28
|
- bin/console
|
29
29
|
- bin/setup
|
30
30
|
- lib/riker.rb
|
31
|
+
- lib/riker/command.rb
|
32
|
+
- lib/riker/command_parameters.rb
|
33
|
+
- lib/riker/error.rb
|
34
|
+
- lib/riker/parameter.rb
|
31
35
|
- lib/riker/version.rb
|
32
36
|
- sig/riker.rbs
|
33
37
|
homepage:
|