mini_tools 0.0.1

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 7e2e7b08f84dd78b66b910afdca999cdd290f448
4
+ data.tar.gz: 6505ac0a2b4ed5da4d0390b2cb144ad28e823600
5
+ SHA512:
6
+ metadata.gz: f79242651ae5ec09e4a6cd2768d59b5daf8153524216c6eb0aaf9403a4acecff1c7f14049190e32b8f2dba9566406e40a9aa307a91cdf069dae76f5793dd04ef
7
+ data.tar.gz: caeff60a929d70380562bc18ccb836b621b6378fb513c8eca28bd0844668f1abb029dd247ae724423661314f80de4307830d5ff0d5c0f42c81ce69b449776709
@@ -0,0 +1,3 @@
1
+ require 'mini_tools/command'
2
+ require 'mini_tools/configuration'
3
+ require 'mini_tools/item_factory'
@@ -0,0 +1,26 @@
1
+ require 'mini_tools/response'
2
+
3
+ module MiniTools
4
+ # Creates a very simple command object using the MiniTools::Response class
5
+ #
6
+ # ```
7
+ # class SimpleCommand
8
+ # def call value
9
+ # yield response :success, 'It worked' if value == true
10
+ # yield response :failure, 'It failed' if value == false
11
+ # end
12
+ # end
13
+ # ```
14
+ #
15
+ # Then use with
16
+ #
17
+ # SimpleCommand.new.call some_value do |response|
18
+ # response.on(:success) ->(message) { puts 'Successful'; puts message }
19
+ # response.on(:failure) ->(message) { puts 'Unsuccessful'; puts message }
20
+ # end
21
+ module Command
22
+ def response result, *args
23
+ Response.new(result, *args)
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,56 @@
1
+ module MiniTools
2
+ # Used to build simple configuration objects.
3
+ #
4
+ # ```
5
+ # class SimpleConfig
6
+ # include MiniTools::Configuration
7
+ #
8
+ # allow :value_1, value_2
9
+ # allow :value_3
10
+ # end
11
+ # ```
12
+ #
13
+ # Then we can set the values with
14
+ #
15
+ # ```
16
+ # SimpleConfig.configure do |config|
17
+ # config.value_1 = 'some-value'
18
+ # config.value_2 = 'another-value'
19
+ # config.value_3 = 'a-third-value'
20
+ # end
21
+ # ```
22
+ #
23
+ # and access the values with
24
+ #
25
+ # ```
26
+ # SimpleConfig.config.value_1 # some-value
27
+ # ```
28
+ module Configuration
29
+ def self.included(base)
30
+ base.extend ClassMethods
31
+ end
32
+
33
+ module ClassMethods
34
+ # Adds values to the allowed list of settings. Accepts either a single
35
+ # settings key or array and can be called multiple times.
36
+ def allow *values
37
+ @settings = settings.concat(values).uniq
38
+ end
39
+
40
+ # Returns the configuration object
41
+ def config
42
+ @config ||= Struct.new(*settings).new
43
+ end
44
+
45
+ # Accepts a block of configuration values
46
+ def configure
47
+ yield config
48
+ end
49
+
50
+ # Returns an array of allowed settings
51
+ def settings
52
+ @settings ||= []
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,67 @@
1
+ module MiniTools
2
+ # The ItemFactory is used for creating instances of classes based on a map
3
+ # of keys to classes. For example, assume we a list of commands to be run
4
+ # that looks something like this
5
+ # ```
6
+ # commands = [
7
+ # [:notification_email, 'someone@somewhere.co.uk'],
8
+ # [:update_account, account_instance],
9
+ # ]
10
+ # ```
11
+ # Each of these commands has an associated Command object.
12
+ # Then we can create an ItemFactory to dynamically build the instances we
13
+ # need
14
+ #
15
+ # ```
16
+ # class CommandFactory
17
+ # include MiniTools::ItemFactory
18
+ #
19
+ # map(
20
+ # notification_email: EmailNotifier,
21
+ # update_account: AccountUpdater
22
+ # )
23
+ # end
24
+ #
25
+ # commands.each do |command, args|
26
+ # CommandFactory.build(command).execute(args)
27
+ # end
28
+ # ```
29
+ #
30
+ module ItemFactory
31
+ def self.included(base)
32
+ base.extend(ClassMethods)
33
+ end
34
+
35
+ module ClassMethods
36
+ attr_reader :default_klass
37
+
38
+ # Builds the appropriate item based on `value`. Any additional args are
39
+ # passed on to the item's initializer
40
+ def build value, *args
41
+ klass_for(value).new(*args)
42
+ end
43
+
44
+ # Defines the map of values to class types
45
+ def map values
46
+ @klass_map = values
47
+ end
48
+
49
+ # Sets the default class if there is no match in the map
50
+ def default klass
51
+ @default_klass = klass
52
+ end
53
+
54
+ private
55
+
56
+ def klass_map
57
+ @klass_map ||= {}
58
+ end
59
+
60
+ def klass_for value
61
+ value = value.call if value.respond_to? :call
62
+ return klass_map[value] if klass_map.has_key? value
63
+ return default_klass
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,14 @@
1
+ module MiniTools
2
+ class Response
3
+ attr_reader :result, :args
4
+
5
+ def initialize result, *args
6
+ @result = result
7
+ @args = args
8
+ end
9
+
10
+ def on *outcome
11
+ yield(*args) if outcome.include?(result)
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,3 @@
1
+ module MiniTools
2
+ VERSION = '0.0.1'
3
+ end
@@ -0,0 +1,97 @@
1
+ require 'spec_helper'
2
+
3
+ require 'mini_tools/command'
4
+
5
+ describe MiniTools::Command do
6
+ class TestCommand
7
+ include MiniTools::Command
8
+
9
+ def call param
10
+ yield response :success, 'OK' and return if param == 1
11
+ yield response :error, 'Fail' and return if param == 0
12
+ yield response :unknown, 'Other' if ![0, 1].include?(param)
13
+ end
14
+ end
15
+
16
+ subject { TestCommand.new }
17
+
18
+ describe 'response yielding' do
19
+ describe 'when the interaction is successful' do
20
+ it 'should yield a success response' do
21
+ call_with 1
22
+ assert_equal 'success', @state
23
+ assert_equal 'OK', @message
24
+ end
25
+ end
26
+
27
+ describe 'when the interaction errors' do
28
+ it 'should yield an error response' do
29
+ call_with 0
30
+ assert_equal 'error', @state
31
+ assert_equal 'Fail', @message
32
+ end
33
+ end
34
+
35
+ describe 'when there is an unknown response' do
36
+ it 'should yield an unknown response' do
37
+ call_with 2
38
+ assert_equal 'unknown', @state
39
+ assert_equal 'Other', @message
40
+ end
41
+ end
42
+
43
+ describe 'when handling multiple responses with the same block' do
44
+ it 'should work with the first case' do
45
+ subject.call 0 do |response|
46
+ response.on(:error, :unknown) do
47
+ @state = 'handled'
48
+ end
49
+ end
50
+
51
+ assert_equal 'handled', @state
52
+ end
53
+
54
+ it 'should work with the second case' do
55
+ subject.call 2 do |response|
56
+ response.on(:error, :unknown) do
57
+ @state = 'handled'
58
+ end
59
+ end
60
+
61
+ assert_equal 'handled', @state
62
+ end
63
+
64
+ it 'should not handle other cases' do
65
+ subject.call 1 do |response|
66
+ response.on(:error, :unknown) do
67
+ @state = 'handled'
68
+ end
69
+ end
70
+
71
+ assert_nil @state
72
+ end
73
+ end
74
+ end
75
+
76
+ def call_with param
77
+ @state = false
78
+ @message = nil
79
+
80
+ subject.call param do |response|
81
+ response.on(:success) do |m|
82
+ @state = 'success'
83
+ @message = m
84
+ end
85
+
86
+ response.on(:error) do |m|
87
+ @state = 'error'
88
+ @message = m
89
+ end
90
+
91
+ response.on(:unknown) do |m|
92
+ @state = 'unknown'
93
+ @message = m
94
+ end
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,50 @@
1
+ require 'spec_helper'
2
+
3
+ require 'mini_tools/configuration'
4
+
5
+ describe MiniTools::Configuration do
6
+ class TestConfig
7
+ include MiniTools::Configuration
8
+
9
+ allow :setting_1, :setting_2
10
+ allow :setting_3
11
+ end
12
+
13
+ subject { TestConfig }
14
+
15
+ describe 'configuration' do
16
+ it 'should be configurable using a config block' do
17
+ TestConfig.configure do |config|
18
+ config.setting_1 = 'a-setting'
19
+ config.setting_2 = 'another-setting'
20
+ config.setting_3 = 'a-third-setting'
21
+ end
22
+
23
+ assert_equal 'a-setting', TestConfig.config.setting_1
24
+ assert_equal 'another-setting', TestConfig.config.setting_2
25
+ assert_equal 'a-third-setting', TestConfig.config.setting_3
26
+ end
27
+
28
+ it 'should raise an error when an unknown setting is used' do
29
+ assert_raises NoMethodError do
30
+ TestConfig.configure do |config|
31
+ config.unkown_setting = 'unknown-setting'
32
+ end
33
+ end
34
+ end
35
+
36
+ it 'should be updateable once set' do
37
+ TestConfig.configure do |config|
38
+ config.setting_1 = 'a-setting'
39
+ config.setting_2 = 'another-setting'
40
+ end
41
+
42
+ TestConfig.configure do |config|
43
+ config.setting_1 = 'a-revised-setting'
44
+ end
45
+
46
+ assert_equal 'a-revised-setting', TestConfig.config.setting_1
47
+ assert_equal 'another-setting', TestConfig.config.setting_2
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,47 @@
1
+ require 'spec_helper'
2
+
3
+ require 'mini_tools/item_factory'
4
+
5
+ describe MiniTools::ItemFactory do
6
+ class TestItemFactory
7
+ class BaseItem; def initialize(arg1, arg2); end; end
8
+ class CoolItem; def initialize(arg1, arg2); end; end
9
+
10
+ include MiniTools::ItemFactory
11
+
12
+ map(
13
+ cool_item: CoolItem
14
+ )
15
+
16
+ default BaseItem
17
+ end
18
+
19
+ describe 'building items' do
20
+ it 'should return the default item for unknown values passing on any extra args' do
21
+ TestItemFactory::BaseItem
22
+ .stubs(:new)
23
+ .with(:arg1, :arg2)
24
+ .returns('base-item')
25
+
26
+ assert_equal 'base-item', TestItemFactory.build(:any_item, :arg1, :arg2)
27
+ end
28
+
29
+ it 'should return the specific item if set' do
30
+ TestItemFactory::CoolItem
31
+ .stubs(:new)
32
+ .with(:arg1, :arg2)
33
+ .returns('cool-item')
34
+
35
+ assert_equal 'cool-item', TestItemFactory.build(:cool_item, :arg1, :arg2)
36
+ end
37
+
38
+ it 'should accept a proc that returns the value' do
39
+ TestItemFactory::CoolItem
40
+ .stubs(:new)
41
+ .with(:arg1, :arg2)
42
+ .returns('cool-item')
43
+
44
+ assert_equal 'cool-item', TestItemFactory.build(->{:cool_item}, :arg1, :arg2)
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,8 @@
1
+ testdir = File.dirname(__FILE__)
2
+ $LOAD_PATH.unshift testdir unless $LOAD_PATH.include?(testdir)
3
+
4
+ libdir = File.dirname(File.dirname(__FILE__)) + '/lib'
5
+ $LOAD_PATH.unshift libdir unless $LOAD_PATH.include?(libdir)
6
+
7
+ require 'minitest/autorun'
8
+ require 'mocha/mini_test'
metadata ADDED
@@ -0,0 +1,86 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mini_tools
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Adam Phillips
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-07-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: minitest
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: mocha
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: A set of simple lightweight tools to demonstrate some useful object patterns
42
+ in Ruby
43
+ email: adam@29ways.co.uk
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - lib/mini_tools.rb
49
+ - lib/mini_tools/command.rb
50
+ - lib/mini_tools/configuration.rb
51
+ - lib/mini_tools/item_factory.rb
52
+ - lib/mini_tools/response.rb
53
+ - lib/mini_tools/version.rb
54
+ - spec/command_spec.rb
55
+ - spec/configuration_spec.rb
56
+ - spec/item_factory_spec.rb
57
+ - spec/spec_helper.rb
58
+ homepage: https://github.com/adamphillips/mini_tools
59
+ licenses:
60
+ - MIT
61
+ metadata: {}
62
+ post_install_message:
63
+ rdoc_options: []
64
+ require_paths:
65
+ - lib
66
+ required_ruby_version: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ required_rubygems_version: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ requirements: []
77
+ rubyforge_project:
78
+ rubygems_version: 2.4.3
79
+ signing_key:
80
+ specification_version: 4
81
+ summary: A set of simple lightweight tools to demonstrate patterns in Ruby
82
+ test_files:
83
+ - spec/command_spec.rb
84
+ - spec/configuration_spec.rb
85
+ - spec/item_factory_spec.rb
86
+ - spec/spec_helper.rb