riker 0.1.0.pre1 → 0.1.0.pre2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 118d01c238106a4db76b383d058edba59999634dd378d5e3242286f16cab4d8d
4
- data.tar.gz: 119108e45c1c61f4180d9e449faf3e63f54a7b6d9459b2b50a83e6fa12ee38ab
3
+ metadata.gz: 86f0741a4cd82edba656094d41663f3a119ee7a6e6019d2417d3f12ef459dcdc
4
+ data.tar.gz: b82ff16ca094921419d09c2c4e8f2888dc35b228d086916135b6977ff2138656
5
5
  SHA512:
6
- metadata.gz: 4f561a760b96120969cedf5e8d1012031595bc90f77da8388be858309a4cfa8e5469881b864698491eab016fdbdd92fc056ce603e0c899ce40120d6b42634a0f
7
- data.tar.gz: 4ec66c575a6c3fc4999d0ac3a835e225ed74a23dc4f7a5da27feaf2bf35fc7908772088b6bd8570eca868b7c1a0698b413499265e96b4707f66a97ce3b9e0218
6
+ metadata.gz: acde908c28b815b7e77d75e0a8a68cb94c2f106b03bcb56fb608dc812465de8692ffd630c080279a7eb275a90b37a414c25699e1091d77a2632dbb78c18da576
7
+ data.tar.gz: 21b81e7a1f99bd1236d60b4603b6614751fad3e1158eaf39fe3593536d7a21d4b81bc9b2d492beed713b4a24a4ccb256ba6b3bf53582db0dd69d1199f330dea2
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- riker (0.1.0)
4
+ riker (0.1.0.pre1)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -46,6 +46,7 @@ GEM
46
46
 
47
47
  PLATFORMS
48
48
  x86_64-darwin-20
49
+ x86_64-linux
49
50
 
50
51
  DEPENDENCIES
51
52
  rake (~> 13.0)
data/README.md CHANGED
@@ -1,5 +1,41 @@
1
1
  # Riker
2
2
 
3
+ [![Version](https://img.shields.io/gem/v/riker.svg?style=flat-square)](https://rubygems.org/gems/riker)
4
+ [![Test](https://img.shields.io/github/workflow/status/benfalk/riker/Test?label=Test&style=flat-square)](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.pre2'
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
+
27
+ execute do
28
+ "Hello #{first_name} #{last_name}".strip
29
+ end
30
+ end
31
+ ```
32
+
33
+ ### In use:
34
+
35
+ ```ruby
36
+ SimpleGreeting.run!(first_name: 'Will')
37
+ # => "Hello Will
38
+
39
+ SimpleGreeting.run!(first_name: 'Will', last_name: 'Riker')
40
+ # => "Hello Will Riker
41
+ ```
@@ -0,0 +1,54 @@
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::Parameters]
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_init!(klass)
24
+ define_run_bang!(klass)
25
+ define_attr_readers!(klass)
26
+ end
27
+
28
+ private
29
+
30
+ # @param klass [Class]
31
+ def define_init!(klass)
32
+ klass.class_eval(<<~RUBY, __FILE__, __LINE__ + 1)
33
+ def initialize(#{parameters.ctor_args}) # def initialize(foo:)
34
+ #{parameters.variable_sets} # @foo = foo
35
+ end # end
36
+ RUBY
37
+ end
38
+
39
+ # @param klass [Class]
40
+ def define_run_bang!(klass)
41
+ klass.class_eval(<<~RUBY, __FILE__, __LINE__ + 1)
42
+ def self.run!(**arguments) # def initialize(**arguments)
43
+ command = new(**arguments) # command = new(**arguments)
44
+ command.execute # command.execute
45
+ end # end
46
+ RUBY
47
+ end
48
+
49
+ # @param klass [Class]
50
+ def define_attr_readers!(klass)
51
+ klass.attr_reader(*parameters.map(&:name))
52
+ end
53
+ end
54
+ 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
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Riker
4
+ class Error < StandardError; end
5
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Riker
4
+ # Single Command Parameter
5
+ #
6
+ class Parameter
7
+ # @return [Symbol]
8
+ attr_reader :name
9
+
10
+ # @param name [Symbol]
11
+ # @param required [Boolean]
12
+ def initialize(name, required: true)
13
+ @name = name
14
+ @required = required
15
+ end
16
+
17
+ # @return [Boolean]
18
+ def required?
19
+ @required
20
+ end
21
+
22
+ # @return [String]
23
+ def ctor_arg
24
+ @ctor_arg ||= "#{name}: #{fallback_default}"
25
+ end
26
+
27
+ # @return [String]
28
+ def variable_set
29
+ @variable_set ||= "@#{name} = #{name}"
30
+ end
31
+
32
+ private
33
+
34
+ def fallback_default
35
+ return if required?
36
+
37
+ 'nil'
38
+ end
39
+ end
40
+ end
data/lib/riker/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Riker
4
- VERSION = '0.1.0.pre1'
4
+ VERSION = '0.1.0.pre2'
5
5
  end
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
- class Error < StandardError; end
7
- # Your code goes here...
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.pre1
4
+ version: 0.1.0.pre2
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-23 00:00:00.000000000 Z
11
+ date: 2022-09-26 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: