riker 0.1.0.pre3 → 0.1.0.pre4
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 +1 -1
- data/README.md +1 -1
- data/lib/riker/command/function.rb +33 -0
- data/lib/riker/command/function_details.rb +27 -0
- data/lib/riker/command/function_writer.rb +62 -0
- data/lib/riker/command/initialize_function.rb +25 -0
- data/lib/riker/command/parameters.rb +54 -0
- data/lib/riker/command/run_bang_function.rb +26 -0
- data/lib/riker/command.rb +11 -44
- data/lib/riker/parameter/default_value.rb +48 -0
- data/lib/riker/version.rb +1 -1
- data/lib/riker.rb +1 -2
- metadata +10 -4
- data/lib/riker/command_parameters.rb +0 -52
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e87101245bca559270ab4ae68b854ddedcf0bcd3a946bdae50571ddb9717b074
|
4
|
+
data.tar.gz: 702df1dedeacc6dd92dda5a9e90f0640fb1763d9c766e613c4e9669727cae002
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4fa7e7eef30b47313061ed59cf958b7fb94ca4db2ea461ca94485b9253a3b52223734729ef51fe97bb33456403731aa68281255486aef21218625db708b06609
|
7
|
+
data.tar.gz: 7c24626c3b722677bd57cb5f83fd092e042b2b06fa170b7edc7fa1e18e2c1eb2cb06cd871bcabfd0cba06046502e9a47eb112f2882c40ee16daabceeac5c9514
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Riker
|
4
|
+
class Command
|
5
|
+
# Individual Function
|
6
|
+
#
|
7
|
+
# Repsonible for debugging and writing out functions
|
8
|
+
# for a command to provide the needed functionality
|
9
|
+
# that is setup for it.
|
10
|
+
#
|
11
|
+
class Function
|
12
|
+
# @param command [Riker::Command]
|
13
|
+
def initialize(command)
|
14
|
+
@command = command
|
15
|
+
end
|
16
|
+
|
17
|
+
# @return [Symbol]
|
18
|
+
def name
|
19
|
+
raise NotImplementedError
|
20
|
+
end
|
21
|
+
|
22
|
+
# @return [Riker::Command::FunctionDetails]
|
23
|
+
def details
|
24
|
+
raise NotImplementedError
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
# @return [Riker::Command]
|
30
|
+
attr_reader :command
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Riker
|
4
|
+
class Command
|
5
|
+
# Function Detail Data
|
6
|
+
#
|
7
|
+
# Holds information needed to write a function to a class
|
8
|
+
# with `class_eval` on a class object.
|
9
|
+
#
|
10
|
+
class FunctionDetails
|
11
|
+
# @return [String]
|
12
|
+
attr_reader :code
|
13
|
+
|
14
|
+
# @return [String]
|
15
|
+
attr_reader :file
|
16
|
+
|
17
|
+
# @return [Integer]
|
18
|
+
attr_reader :line
|
19
|
+
|
20
|
+
def initialize(code, file, line)
|
21
|
+
@code = code
|
22
|
+
@file = file
|
23
|
+
@line = line
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'run_bang_function'
|
4
|
+
require_relative 'initialize_function'
|
5
|
+
|
6
|
+
module Riker
|
7
|
+
class Command
|
8
|
+
# Function Writer
|
9
|
+
#
|
10
|
+
# This is responsible for creating the functions that
|
11
|
+
# are needed to create a command pattern class.
|
12
|
+
#
|
13
|
+
class FunctionWriter
|
14
|
+
DEFAULT_FUNCTIONS = [
|
15
|
+
RunBangFunction,
|
16
|
+
InitializeFunction
|
17
|
+
].freeze
|
18
|
+
|
19
|
+
# @return [Riker::Command]
|
20
|
+
attr_reader :command
|
21
|
+
|
22
|
+
# @return [Array<Riker::Command::Function>]
|
23
|
+
attr_reader :functions
|
24
|
+
|
25
|
+
# @param command [Riker::Command]
|
26
|
+
def initialize(command)
|
27
|
+
@command = command
|
28
|
+
@functions = DEFAULT_FUNCTIONS.map { |func| func.new(command) }
|
29
|
+
end
|
30
|
+
|
31
|
+
# @param klass [Class]
|
32
|
+
def write!(klass)
|
33
|
+
klass.define_method(:execute, &command.execute_block)
|
34
|
+
define_default_setters!(klass)
|
35
|
+
define_attr_readers!(klass)
|
36
|
+
write_functions!(klass)
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
# @param klass [Class]
|
42
|
+
def write_functions!(klass)
|
43
|
+
functions.each do |function|
|
44
|
+
details = function.details
|
45
|
+
klass.class_eval(details.code, details.file, details.line)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# @param klass [Class]
|
50
|
+
def define_attr_readers!(klass)
|
51
|
+
klass.attr_reader(*command.parameters.map(&:name))
|
52
|
+
end
|
53
|
+
|
54
|
+
# @param klass [Class]
|
55
|
+
def define_default_setters!(klass)
|
56
|
+
command.parameters.each do |param|
|
57
|
+
param.default.build_default_function!(klass)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Riker
|
4
|
+
class Command
|
5
|
+
# Run!
|
6
|
+
#
|
7
|
+
# Represents the `initialize` method for your command
|
8
|
+
#
|
9
|
+
class InitializeFunction < Function
|
10
|
+
# @return [Symbol]
|
11
|
+
def name
|
12
|
+
:initialize
|
13
|
+
end
|
14
|
+
|
15
|
+
# @return [Riker::Command::FunctionDetails]
|
16
|
+
def details
|
17
|
+
FunctionDetails.new(<<~RUBY, __FILE__, __LINE__ + 1)
|
18
|
+
def initialize(#{command.parameters.ctor_args}) # def initialize(foo:)
|
19
|
+
#{command.parameters.variable_sets} # @foo = foo
|
20
|
+
end # end
|
21
|
+
RUBY
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Riker
|
4
|
+
class Command
|
5
|
+
# Command Parameters
|
6
|
+
#
|
7
|
+
# This is responsible for keeping track of the command's
|
8
|
+
# parameters. This includes how they are used and applied
|
9
|
+
# to the construction of a command.
|
10
|
+
#
|
11
|
+
class Parameters
|
12
|
+
include Enumerable
|
13
|
+
class ParamNameTaken < ::Riker::Error; end
|
14
|
+
class InvalidParamName < ::Riker::Error; end
|
15
|
+
|
16
|
+
def initialize
|
17
|
+
# @var [Hash<Symbol, Parameter>]
|
18
|
+
@params = {}
|
19
|
+
end
|
20
|
+
|
21
|
+
# @param name [Symbol]
|
22
|
+
# @return [Parameters]
|
23
|
+
#
|
24
|
+
def add(name, **options)
|
25
|
+
validate_name!(name)
|
26
|
+
@params[name] = Parameter.new(name, **options)
|
27
|
+
|
28
|
+
self
|
29
|
+
end
|
30
|
+
|
31
|
+
# @return [String]
|
32
|
+
def ctor_args
|
33
|
+
map(&:ctor_arg).join(', ')
|
34
|
+
end
|
35
|
+
|
36
|
+
# @return [String]
|
37
|
+
def variable_sets
|
38
|
+
map(&:variable_set).join("\n")
|
39
|
+
end
|
40
|
+
|
41
|
+
# @yield [Parameter]
|
42
|
+
def each(&block)
|
43
|
+
@params.values.each(&block)
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def validate_name!(name)
|
49
|
+
raise InvalidParamName unless name.is_a?(Symbol)
|
50
|
+
raise ParamNameTaken if @params.key?(name)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Riker
|
4
|
+
class Command
|
5
|
+
# Run!
|
6
|
+
#
|
7
|
+
# Represents the `run!` static method for your command
|
8
|
+
#
|
9
|
+
class RunBangFunction < Function
|
10
|
+
# @return [Symbol]
|
11
|
+
def name
|
12
|
+
:run!
|
13
|
+
end
|
14
|
+
|
15
|
+
# @return [Riker::Command::FunctionDetails]
|
16
|
+
def details
|
17
|
+
FunctionDetails.new(<<~RUBY, __FILE__, __LINE__ + 1)
|
18
|
+
def self.run!(**arguments) # def initialize(**arguments)
|
19
|
+
command = new(**arguments) # command = new(**arguments)
|
20
|
+
command.execute # command.execute
|
21
|
+
end # end
|
22
|
+
RUBY
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/riker/command.rb
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require_relative 'command/parameters'
|
4
|
+
require_relative 'command/function'
|
5
|
+
require_relative 'command/function_details'
|
6
|
+
require_relative 'command/function_writer'
|
7
|
+
|
3
8
|
module Riker
|
4
9
|
# Command Builder
|
5
10
|
#
|
@@ -7,56 +12,18 @@ module Riker
|
|
7
12
|
# track of the build of a command in your application
|
8
13
|
#
|
9
14
|
class Command
|
10
|
-
# @return [Riker::
|
15
|
+
# @return [Riker::Command::Parameters]
|
11
16
|
attr_reader :parameters
|
12
17
|
|
18
|
+
# @return [Riker::Command::FunctionWriter]
|
19
|
+
attr_reader :function_writer
|
20
|
+
|
13
21
|
# @return [Proc, nil]
|
14
22
|
attr_accessor :execute_block
|
15
23
|
|
16
24
|
def initialize
|
17
|
-
@parameters =
|
18
|
-
|
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
|
25
|
+
@parameters = Parameters.new
|
26
|
+
@function_writer = FunctionWriter.new(self)
|
60
27
|
end
|
61
28
|
end
|
62
29
|
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Riker
|
4
|
+
class Parameter
|
5
|
+
# Default Parameter Value
|
6
|
+
#
|
7
|
+
# Sometimes we want to have parameters default to sensible
|
8
|
+
# defaults. This class's responsibility is to keep track
|
9
|
+
# this and set's up work to ensure defaults setup properly.
|
10
|
+
#
|
11
|
+
class DefaultValue
|
12
|
+
# @return [Symbol]
|
13
|
+
attr_reader :name
|
14
|
+
|
15
|
+
# @return [BasicObject]
|
16
|
+
def self.no_value
|
17
|
+
:__no_default__
|
18
|
+
end
|
19
|
+
|
20
|
+
# @param name [Symbol]
|
21
|
+
# @param value [Object, Proc]
|
22
|
+
def initialize(name, value)
|
23
|
+
@name = name
|
24
|
+
@present = value != :__no_default__
|
25
|
+
@value_proc = value.is_a?(Proc) ? value : -> { value }
|
26
|
+
end
|
27
|
+
|
28
|
+
# @return [Boolean]
|
29
|
+
def present?
|
30
|
+
@present
|
31
|
+
end
|
32
|
+
|
33
|
+
# @return [Symbol, nil]
|
34
|
+
def function_name
|
35
|
+
return unless present?
|
36
|
+
|
37
|
+
@function_name ||= :"default_value_for_#{name}"
|
38
|
+
end
|
39
|
+
|
40
|
+
def build_default_function!(klass)
|
41
|
+
return unless present?
|
42
|
+
|
43
|
+
klass.define_method(function_name, &@value_proc)
|
44
|
+
klass.send(:private, function_name)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/lib/riker/version.rb
CHANGED
data/lib/riker.rb
CHANGED
@@ -3,7 +3,6 @@
|
|
3
3
|
require_relative 'riker/version'
|
4
4
|
require_relative 'riker/error'
|
5
5
|
require_relative 'riker/command'
|
6
|
-
require_relative 'riker/command_parameters'
|
7
6
|
require_relative 'riker/parameter'
|
8
7
|
|
9
8
|
# The Commander of the USS Enterprise
|
@@ -26,6 +25,6 @@ module Riker
|
|
26
25
|
raise Error, "execute block already called for #{self}!" if command.execute_block
|
27
26
|
|
28
27
|
command.execute_block = block
|
29
|
-
command.
|
28
|
+
command.function_writer.write!(self)
|
30
29
|
end
|
31
30
|
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.pre4
|
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-
|
11
|
+
date: 2022-10-07 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: High-Performance, Dependency-Free Command Pattern For Ruby
|
14
14
|
email:
|
@@ -29,9 +29,15 @@ files:
|
|
29
29
|
- bin/setup
|
30
30
|
- lib/riker.rb
|
31
31
|
- lib/riker/command.rb
|
32
|
-
- lib/riker/
|
32
|
+
- lib/riker/command/function.rb
|
33
|
+
- lib/riker/command/function_details.rb
|
34
|
+
- lib/riker/command/function_writer.rb
|
35
|
+
- lib/riker/command/initialize_function.rb
|
36
|
+
- lib/riker/command/parameters.rb
|
37
|
+
- lib/riker/command/run_bang_function.rb
|
33
38
|
- lib/riker/error.rb
|
34
39
|
- lib/riker/parameter.rb
|
40
|
+
- lib/riker/parameter/default_value.rb
|
35
41
|
- lib/riker/version.rb
|
36
42
|
- sig/riker.rbs
|
37
43
|
homepage:
|
@@ -55,7 +61,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
55
61
|
- !ruby/object:Gem::Version
|
56
62
|
version: 1.3.1
|
57
63
|
requirements: []
|
58
|
-
rubygems_version: 3.
|
64
|
+
rubygems_version: 3.3.7
|
59
65
|
signing_key:
|
60
66
|
specification_version: 4
|
61
67
|
summary: High-Performance, Dependency-Free Command Pattern For Ruby
|
@@ -1,52 +0,0 @@
|
|
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
|