riker 0.1.0.pre1 → 0.1.0.pre3

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: 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: