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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 118d01c238106a4db76b383d058edba59999634dd378d5e3242286f16cab4d8d
4
- data.tar.gz: 119108e45c1c61f4180d9e449faf3e63f54a7b6d9459b2b50a83e6fa12ee38ab
3
+ metadata.gz: b819ce3e2d6fb0f84fd16e4eb754802ca3c655810179225c9f4ba9cff3d8f068
4
+ data.tar.gz: ab2a5b0a1e9f3beb29c1ba8437de4b50be42f395c79cc833985c7da082c572f4
5
5
  SHA512:
6
- metadata.gz: 4f561a760b96120969cedf5e8d1012031595bc90f77da8388be858309a4cfa8e5469881b864698491eab016fdbdd92fc056ce603e0c899ce40120d6b42634a0f
7
- data.tar.gz: 4ec66c575a6c3fc4999d0ac3a835e225ed74a23dc4f7a5da27feaf2bf35fc7908772088b6bd8570eca868b7c1a0698b413499265e96b4707f66a97ce3b9e0218
6
+ metadata.gz: ae433f9f555ceee2b68121953086c7de1e340773ccd1dc802a254126a7bcee94f7f77d2f28427b29e89a6f2e738f9b7aeb5ec709951eb84c150de49bff58ef9c
7
+ data.tar.gz: 65a9c8f2be649a18223f3f97caf10b628155f6e0ac54b7891aba504616084eaa6ef85f79f7ac96ff55d7d057d18070bc3a84e527a0ba4b0faac276c80509e74b
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.pre2)
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,74 @@
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.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
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Riker
4
+ class Error < StandardError; end
5
+ end
@@ -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
@@ -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.pre3'
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.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-23 00:00:00.000000000 Z
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: