riker 0.1.0.pre1 → 0.1.0.pre2

Sign up to get free protection for your applications and to get access to all the features.
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: