simple_command_dispatcher 1.1.1 → 1.2.1

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
  SHA1:
3
- metadata.gz: 978601fab3ba1ceb4f717b3b4d1d6fb13ea649f0
4
- data.tar.gz: ceae85997bb18d8479845f89bf324c4d15fd4eb6
3
+ metadata.gz: 86113bb49021916a8a1352875961117ee7323c31
4
+ data.tar.gz: b3341892eaeba98ec82a42795ac9b30e2dd2cb5d
5
5
  SHA512:
6
- metadata.gz: 7df1d6310235fbe4ea04e82f95f7a00d40e5790ddaf8f6a4a1722cb59b642b2ba6b209231b4497ed81edfc0da9d214bb62e6bbf307b9ff415f2bfea53f7e01b6
7
- data.tar.gz: 4272706508300aa3a2e7d0760c717e5621d4db0c73cab6736eb0a5f197c192c0b4696371bc307e8882ee52d6645691036c848a8ae761c52691bb2e9004ad8b97
6
+ metadata.gz: 2a147390f419be6ae76819fc5b781d05ff330fe60ab8ae6104251de6e4abb5c05c8603e3a5bbc6fbbb5aa092c15abe42deb147d20a7c3c2ad575c46d9c111c08
7
+ data.tar.gz: cf4ca4296568d38f35959730967c6030dd511b9099f14dc8682d356bf9cf7e26df138d7ed7d3b38b58d810d9b3b05822ba1dfaaaf4e90aedc9ef33fd6d3c5690
data/CHANGELOG.md ADDED
@@ -0,0 +1,19 @@
1
+ ### Version 1.2.1
2
+ * Configuration class
3
+ * Added the new Configuration class that exposes the #allow_custom_classes property which takes a Boolean allowing/disallowing the use of custom commands to be used. See the documentation for details and usage.
4
+ * Custom commands
5
+ * Allow ability for users to use custom commands (i.e. classes that do not prepend the SimpleCommand module) as long as the command class respond_to? the ::call public class method. Note: Configuration#allow_custom_commands must be set to true to use custom commands.
6
+ * Documentation updates
7
+ * Add documentation for new Configuration class and miscellaneous other code additions/changes.
8
+
9
+ ### Version 1.1.1
10
+ * Documentation updates
11
+ * Add example code in README.md to include clarification on command namespacing, and how to autoload command classes to avoid NameError exceptions when SimpleCommand::Dispatcher.call(...) is call due to uninitialized command constants.
12
+
13
+ ## Version 1.1.0 - 2016-11-01 [YANKED]
14
+ ## Version 1.0.0 - 2016-11-01 [YANKED]
15
+ ## Version 0.2.0 - 2016-11-01 [YANKED]
16
+ ## Version 0.1.3 - 2016-11-01 [YANKED]
17
+ ## Version 0.1.2 - 2016-10-29 [YANKED]
18
+ ## Version 0.1.1 - 2016-10-29 [YANKED]
19
+ ## Version 0.1.0 - 2016-10-29 [YANKED]
data/README.md CHANGED
@@ -1,11 +1,22 @@
1
1
  [![GitHub version](https://badge.fury.io/gh/gangelo%2Fsimple_command_dispatcher.svg)](https://badge.fury.io/gh/gangelo%2Fsimple_command_dispatcher)
2
2
  [![Gem Version](https://badge.fury.io/rb/simple_command_dispatcher.svg)](https://badge.fury.io/rb/simple_command_dispatcher)
3
3
 
4
+ ![](http://ruby-gem-downloads-badge.herokuapp.com/simple_command_dispatcher?type=total)
5
+ [![Documentation](http://img.shields.io/badge/docs-rdoc.info-blue.svg)](http://www.rubydoc.info/gems/simple_command_dispatcher/)
6
+
7
+ [![Report Issues](https://img.shields.io/badge/report-issues-red.svg)](https://github.com/gangelo/simple_command_dispatcher/issues)
8
+
9
+ [![License](http://img.shields.io/badge/license-MIT-yellowgreen.svg)](#license)
10
+
4
11
  # Q. simple_command_dispatcher - what is it?
5
12
  # A. It's a Ruby gem!
6
13
 
7
14
  ## Overview
8
- __simple_command_dispatcher__ (SCD) allows you to execute __simple_command__ commands in a more dynamic way. If you are not familiar with the _simple_command_ gem, check it out [here][simple-command]. SCD was written specifically with the [rails-api][rails-api] in mind; however, you can use SDC wherever you use simple_command commands.
15
+ __simple_command_dispatcher__ (SCD) allows you to execute __simple_command__ commands (and now _custom commands_ as of version 1.2.1) in a more dynamic way. If you are not familiar with the _simple_command_ gem, check it out [here][simple-command]. SCD was written specifically with the [rails-api][rails-api] in mind; however, you can use SDC wherever you would use simple_command commands.
16
+
17
+ ## Update as of Version 1.2.1
18
+ ### Custom Commands
19
+ SCD now allows you to execute _custom commands_ (i.e. classes that do not prepend the _SimpleCommand_ module) by setting `Configuration#allow_custom_commands = true` (see the __Custom Commands__ section below for details).
9
20
 
10
21
  ## Example
11
22
  The below example is from a `rails-api` API that uses token-based authentication and services two mobile applications, identified as *__my_app1__* and *__my_app2__*, in this example.
@@ -124,6 +135,12 @@ Rails.application.config.to_prepare do
124
135
  ActionDispatch::Reloader.to_prepare { reloader.execute_if_updated }
125
136
  reloader.execute
126
137
  end
138
+
139
+ # Optionally set our configuration setting to allow
140
+ # for custom command execution.
141
+ SimpleCommand::Dispatcher.configure do |config|
142
+ config.allow_custom_commands = true
143
+ end
127
144
  ```
128
145
 
129
146
  ```ruby
@@ -169,6 +186,90 @@ class ApplicationController < ActionController::API
169
186
  end
170
187
  ```
171
188
 
189
+ ## Custom Commands
190
+
191
+ As of __Version 1.2.1__ simple_command_dispatcher (SCD) allows you to execute _custom commands_ (i.e. classes that do not prepend the _SimpleCommand_ module) by setting `Configuration#allow_custom_commands = true`.
192
+
193
+ In order to execute _custom commands_, there are three (3) requirements:
194
+ 1. Create a _custom command_. Your _custom command_ class must expose a public `::call` class method.
195
+ 2. Set the `Configuration#allow_custom_commands` property to `true`.
196
+ 3. Execute your _custom command_ by calling the `::call` class method.
197
+
198
+ ### Custom Command Example
199
+
200
+ #### 1. Create a Custom Command
201
+ ```ruby
202
+ # /api/my_app/v1/custom_command.rb
203
+
204
+ module Api
205
+ module MyApp
206
+ module V1
207
+
208
+ # This is a custom command that does not prepend SimpleCommand.
209
+ class CustomCommand
210
+
211
+ def self.call(*args)
212
+ command = self.new(*args)
213
+ if command
214
+ command.send(:execute)
215
+ else
216
+ false
217
+ end
218
+ end
219
+
220
+ private
221
+
222
+ def initialize(params = {})
223
+ @param1 = params[:param1]
224
+ end
225
+
226
+ private
227
+
228
+ attr_accessor :param1
229
+
230
+ def execute
231
+ if (param1 == :param1)
232
+ return true
233
+ end
234
+
235
+ return false
236
+ end
237
+ end
238
+
239
+ end
240
+ end
241
+ end
242
+ ```
243
+ #### 2. Set the `Configuration#allow_custom_commands` property to `true`
244
+ ```ruby
245
+ # In your rails, rails-api app, etc...
246
+ # /config/initializers/simple_command_dispatcher.rb
247
+
248
+ SimpleCommand::Dispatcher.configure do |config|
249
+ config.allow_custom_commands = true
250
+ end
251
+ ```
252
+
253
+ #### 3. Execute your _Custom Command_
254
+ Executing your _custom command_ is no different than executing a __SimpleCommand__ command with the exception that you must properly handle the return object that results from calling your _custom command_; being a _custom command_, there is no guarantee that the return object will be the command object as is the case when calling a SimpleCommand command.
255
+ ```ruby
256
+ # /app/controllers/some_controller.rb
257
+
258
+ require 'simple_command_dispatcher'
259
+
260
+ class SomeController < ApplicationController::API
261
+ public
262
+
263
+ def some_api
264
+ success = SimpleCommand::Dispatcher.call(:CustomCommand, get_command_path, { camelize: true}, request.headers)
265
+ if success
266
+ # Do something...
267
+ else
268
+ # Do something else...
269
+ end
270
+ end
271
+ end
272
+ ```
172
273
 
173
274
  ## Installation
174
275
 
@@ -1,4 +1,7 @@
1
1
  class String
2
+ # Returns a copy of string with all spaces removed.
3
+ #
4
+ # @return [String] with all spaces trimmed which includes all leading, trailing and embedded spaces.
2
5
  def trim_all
3
6
  self.gsub(/\s+/, "")
4
7
  end
@@ -13,9 +13,9 @@ end
13
13
 
14
14
  module SimpleCommand
15
15
 
16
- # Provides a way to call SimpleCommand commands in a more dymanic manner.
16
+ # Provides a way to call SimpleCommands or your own custom commands in a more dymanic manner.
17
17
  #
18
- # For information about the simple_command gem, visit https://rubygems.org/gems/simple_command
18
+ # For information about the simple_command gem, visit {https://rubygems.org/gems/simple_command}
19
19
  #
20
20
  module Dispatcher
21
21
 
@@ -24,9 +24,9 @@ module SimpleCommand
24
24
 
25
25
  public
26
26
 
27
- # Calls a *SimpleCommand* given the command name, the modules the command belongs to and the parameters to pass to the command.
27
+ # Calls a *SimpleCommand* or *Command* given the command name, the modules the command belongs to and the parameters to pass to the command.
28
28
  #
29
- # @param command [Symbol, String] the name of the SimpleCommand to call.
29
+ # @param command [Symbol, String] the name of the SimpleCommand or Command to call.
30
30
  #
31
31
  # @param command_modules [Hash, Array] the ruby modules that qualify the SimpleCommand to call. When passing a Hash, the Hash
32
32
  # keys serve as documentation only. For example, ['Api', 'AppName', 'V1'] and { :api :Api, app_name: :AppName, api_version: :V1 }
@@ -41,10 +41,10 @@ module SimpleCommand
41
41
  # @option options [Boolean] :module_titleize (false) determines whether or not module names should be titleized.
42
42
  # @option options [Boolean] :module_camelized (false) determines whether or not module names should be camelized.
43
43
  #
44
- # @param command_parameters [*] the parameters to pass to the call method of the SimpleCommand. This parameter is simply
45
- # passed through to the call method of the SimpleCommand.
44
+ # @param command_parameters [Array<Symbol>] the parameters to pass to the call method of the SimpleCommand . This parameter is simply
45
+ # passed through to the call method of the SimpleCommand/Command.
46
46
  #
47
- # @return [SimpleCommand] the SimpleCommand returned as a result from calling the SimpleCommand#call method.
47
+ # @return [SimpleCommand, Object] the SimpleCommand or Object returned as a result of calling the SimpleCommand#call method or the Command#call method respectfully.
48
48
  #
49
49
  # @example
50
50
  #
@@ -61,33 +61,67 @@ module SimpleCommand
61
61
  def call(command = "", command_modules = {}, options = {}, *command_parameters)
62
62
 
63
63
  # Create a constantized class from our command and command_modules...
64
- simple_command_class_constant = to_constantized_class(command, command_modules, options)
64
+ command_class_constant = to_constantized_class(command, command_modules, options)
65
65
 
66
- # Calling is_simple_command? returns true if the class pointed to by
67
- # simple_command_class_constant is a valid SimpleCommand class; that is,
68
- # if it prepends module SimpleCommand::ClassMethods.
69
- if !is_simple_command?(simple_command_class_constant)
70
- raise ArgumentError.new('Class does not prepend module SimpleCommand.')
66
+ # If we're NOT allowing custom commands, make sure we're dealing with a a command class
67
+ # that prepends the SimpleCommand module.
68
+ if !SimpleCommand::Dispatcher.configuration.allow_custom_commands
69
+ # Calling is_simple_command? returns true if the class pointed to by
70
+ # command_class_constant is a valid SimpleCommand class; that is,
71
+ # if it prepends module SimpleCommand::ClassMethods.
72
+ if !is_simple_command?(command_class_constant)
73
+ raise ArgumentError.new("Class \"#{command_class_constant}\" must prepend module SimpleCommand if Configuration#allow_custom_commands is true.")
74
+ end
71
75
  end
72
76
 
73
- # We know we have a valid SimpleCommand; all we need to do is call #call,
74
- # pass the command_parameter variable arguments to the call, and return the results.
75
- simple_command_class_constant.call(*command_parameters)
77
+ if is_valid_command(command_class_constant)
78
+ # We know we have a valid SimpleCommand; all we need to do is call #call,
79
+ # pass the command_parameter variable arguments to the call, and return the results.
80
+ run_command(command_class_constant, command_parameters)
81
+ else
82
+ raise NameError.new("Class \"#{command_class_constant}\" does not respond_to? method ::call.")
83
+ end
76
84
  end
77
85
 
78
86
  private
79
87
 
80
- # @!visibility public
88
+ # Returns true or false depending on whether or not the class constant has a public
89
+ # class method named ::call defined. Commands that do not have a public class method
90
+ # named ::call, are considered invalid.
91
+ #
92
+ # @param klass_constant [String] a class constant that will be validated to see whether or not the class is a valid command.
93
+ #
94
+ # @return [Boolean] true if klass_constant has a public class method named ::call defined, false otherwise.
81
95
  #
96
+ # @!visibility public
97
+ def is_valid_command(klass_constant)
98
+ klass_constant.eigenclass.public_method_defined?(:call)
99
+ end
100
+
82
101
  # Returns true or false depending on whether or not the class constant prepends module SimpleCommand::ClassMethods.
83
102
  #
84
103
  # @param klass_constant [String] a class constant that will be validated to see whether or not the class prepends module SimpleCommand::ClassMethods.
85
104
  #
86
105
  # @return [Boolean] true if klass_constant prepends Module SimpleCommand::ClassMethods, false otherwise.
87
106
  #
107
+ # @!visibility public
88
108
  def is_simple_command?(klass_constant)
89
109
  klass_constant.eigenclass.included_modules.include? SimpleCommand::ClassMethods
90
110
  end
111
+
112
+ # Runs the command given the parameters and returns the result.
113
+ #
114
+ # @param klass_constant [String] a class constant that will be called.
115
+ # @param parameters [Array] an array of parameters to pass to the command that will be called.
116
+ #
117
+ # @return [Object] returns the object (if any) that results from calling the command.
118
+ #
119
+ # @!visibility public
120
+ def run_command(klass_constant, parameters)
121
+ klass_constant.call(*parameters)
122
+ #rescue NameError
123
+ # raise NameError.new("Class \"#{klass_constant}\" does not respond_to? method ::call.")
124
+ end
91
125
  end
92
126
  end
93
127
  end
@@ -0,0 +1,45 @@
1
+ module SimpleCommand
2
+ module Dispatcher
3
+
4
+ # Gem configuration settings class. Use this class to configure this gem.
5
+ #
6
+ # To configure this gem in your application, simply add the following code in your application and set the
7
+ # appropriate configuration settings.
8
+ #
9
+ # @example
10
+ #
11
+ # SimpleCommand::Dispatcher.configure do |config|
12
+ # config.allow_custom_commands = true
13
+ # end
14
+ #
15
+ class Configuration
16
+ # Gets/sets the *allow_custom_commands* configuration setting (defaults to false).
17
+ # If this setting is set to *false*, only command classes that prepend the *SimpleCommand* module
18
+ # will be considered acceptable to run, all other command classes will fail to run. If this
19
+ # setting is set to *true*, any command class will be considered acceptable to run, regardless of
20
+ # whether or not the class prepends the *SimpleCommand* module.
21
+ #
22
+ # For information about the simple_command gem, visit {https://rubygems.org/gems/simple_command}
23
+ #
24
+ # @return [Boolean] the value.
25
+ #
26
+ attr_accessor :allow_custom_commands
27
+
28
+ def initialize
29
+ # The default is to use any command that exposes a ::call class method.
30
+ reset
31
+ end
32
+
33
+ public
34
+
35
+ # Resets the configuration to use the default values.
36
+ #
37
+ # @return [nil] returns nil.
38
+ #
39
+ def reset
40
+ @allow_custom_commands = false
41
+ nil
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,18 @@
1
+ module SimpleCommand
2
+ module Dispatcher
3
+ class << self
4
+ attr_writer :configuration
5
+ end
6
+
7
+ # Returns the application configuration object.
8
+ #
9
+ # @return [Configuration] the application Configuration object.
10
+ def self.configuration
11
+ @configuration ||= Configuration.new
12
+ end
13
+
14
+ def self.configure
15
+ yield(configuration)
16
+ end
17
+ end
18
+ end
@@ -199,7 +199,7 @@ module SimpleCommand
199
199
  #
200
200
  def validate_klass(klass, options)
201
201
  if !(klass.is_a?(Symbol) || klass.is_a?(String))
202
- raise ArgumentError.new('Class is not a String or Symbol. Class must equal the name of the SimpleCommand to call in the form of a String or Symbol.')
202
+ raise ArgumentError.new('Class is not a String or Symbol. Class must equal the class name of the SimpleCommand or Command to call in the form of a String or Symbol.')
203
203
  end
204
204
 
205
205
  klass = klass.to_s.strip
@@ -1,5 +1,5 @@
1
1
  module SimpleCommand
2
2
  module Dispatcher
3
- VERSION = "1.1.1"
3
+ VERSION = "1.2.1"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple_command_dispatcher
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gene M. Angelo, Jr.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-11-02 00:00:00.000000000 Z
11
+ date: 2017-08-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -144,7 +144,7 @@ files:
144
144
  - ".rspec"
145
145
  - ".ruby-version"
146
146
  - ".travis.yml"
147
- - CHANGELOG.mb
147
+ - CHANGELOG.md
148
148
  - CODE_OF_CONDUCT.md
149
149
  - Gemfile
150
150
  - LICENSE.txt
@@ -154,6 +154,8 @@ files:
154
154
  - bin/setup
155
155
  - lib/core_extensions/string.rb
156
156
  - lib/simple_command_dispatcher.rb
157
+ - lib/simple_command_dispatcher/configuration.rb
158
+ - lib/simple_command_dispatcher/configure.rb
157
159
  - lib/simple_command_dispatcher/klass_transform.rb
158
160
  - lib/simple_command_dispatcher/version.rb
159
161
  - lib/tasks/simple_command_dispatcher_sandbox.rake
data/CHANGELOG.mb DELETED
@@ -1,32 +0,0 @@
1
- ### Unreleased
2
- * Upcoming features
3
- * whitelist for allowable namespaces
4
-
5
- ### 1.1.1
6
- * Documentation updates
7
- * Add example code in README.md to include clarification on command namespacing, and how to autoload command classes to avoid NameError exceptions when SimpleCommand::Dispatcher.call(...) is call due to uninitialized command constants.
8
-
9
- ### 1.1.0
10
- * Bug fix lib/core_extensions/string.rb not included in SimpleCommand::Dispatcher, causing exception.
11
-
12
- ### 1.0.0
13
- * Limit support to ruby >= 2.2.2
14
-
15
- ### 0.2.0
16
- * Yanked
17
-
18
- ### 0.1.3
19
- * Documentation updates
20
- * Add `SimpleCommand::KlassTransform` rake task sandbox to test the below listed `SimpleCommand::KlassTransform` members; run the rake tasks for usage; these rake tasks are simply a playground to see how simple_command_dispatcher transforms parameters into output when calling SimpleCommand::Dispatcher.call(...):
21
- * `SimpleCommand::KlassTransform#to_class_string`
22
- * $ rake to_class_string
23
- * `SimpleCommand::KlassTransform#to_modules_string`
24
- * $ rake to_modules_string
25
- * `SimpleCommand::KlassTransform#to_constantized_class_string`
26
- * $ rake to_constantized_class_string
27
-
28
- ### 0.1.2
29
- * Documentation updates
30
-
31
- ### 0.1.1
32
- * Documentation updates