cooperator 0.1.0

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 6671fcd41b0cea041ba1f0191cd5760d1cf2bab3
4
+ data.tar.gz: 9beb667615a70908cecba636f6ae3b0a80d9d119
5
+ SHA512:
6
+ metadata.gz: e2779ddbd074fc07515eeb3ec9494f2367463627748826df8a71747eacb1dcd96c12e5e253ba94cb7d77ba79f43cfca38619af734c60b317fbf3d40c1db18fd3
7
+ data.tar.gz: fcc74dba7a8c3e156ffd3095a8c521b41fb22c26a42bba8054dd0e38f393b130d9bb9c1a195b452d643bb726610777b1b46b97d661da08735dbf9f4bf6236e8a
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .gs
6
+ .yardoc
7
+ Gemfile.lock
8
+ InstalledFiles
9
+ _yardoc
10
+ coverage
11
+ doc/
12
+ lib/bundler/man
13
+ pkg
14
+ rdoc
15
+ spec/reports
16
+ test/tmp
17
+ test/version_tmp
18
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in cooperator.gemspec
4
+ gemspec
5
+
6
+ gem 'specter', github: 'Erol/specter', branch: 'master'
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Erol Fornoles
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,37 @@
1
+ [![Code Climate](https://codeclimate.com/github/Erol/cooperator.png)](https://codeclimate.com/github/Erol/cooperator)
2
+
3
+ # Cooperator
4
+
5
+ Simple cooperative interactors for Ruby
6
+
7
+ Inspired by the following:
8
+
9
+ * [LightService](https://github.com/adomokos/light-service) by [Atilla Domokos](https://github.com/adomokos)
10
+ * [Interactor](https://github.com/collectiveidea/interactor) from [Collective Idea](https://github.com/collectiveidea)
11
+
12
+ ## Installation
13
+
14
+ Add this line to your application's Gemfile:
15
+
16
+ gem 'cooperator'
17
+
18
+ And then execute:
19
+
20
+ $ bundle
21
+
22
+ Or install it yourself as:
23
+
24
+ $ gem install cooperator
25
+
26
+ ## Usage
27
+
28
+ TODO: Write usage instructions here
29
+
30
+ ## Contributing
31
+
32
+ 1. Fork it
33
+ 2. Create your feature branch ( `git checkout -b my-new-feature` )
34
+ 3. Create tests and make them pass ( `rake test` )
35
+ 4. Commit your changes ( `git commit -am 'Added some feature'` )
36
+ 5. Push to the branch ( `git push origin my-new-feature` )
37
+ 6. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,23 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'cooperator/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'cooperator'
8
+ spec.version = Cooperator::VERSION
9
+ spec.authors = ['Erol Fornoles']
10
+ spec.email = ['erol.fornoles@gmail.com']
11
+ spec.summary = %q{Simple cooperative interactors for Ruby}
12
+ spec.description = %q{Simple cooperative interactors for Ruby}
13
+ spec.homepage = ''
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency 'bundler', "~> 1.5"
22
+ spec.add_development_dependency 'rake'
23
+ end
@@ -0,0 +1,57 @@
1
+ module Cooperator
2
+ class Context
3
+ def initialize(attributes = {})
4
+ @_attributes = {_failure: false}
5
+
6
+ attributes.each do |k, v|
7
+ send :"#{k}=", v
8
+ end
9
+ end
10
+
11
+ def errors
12
+ @_errors ||= []
13
+ end
14
+
15
+ def success!
16
+ self._failure = false
17
+ end
18
+
19
+ def failure!(*args)
20
+ args.each do |error|
21
+ errors.push error
22
+ end
23
+
24
+ self._failure = true
25
+ end
26
+
27
+ def success?
28
+ not failure?
29
+ end
30
+
31
+ def failure?
32
+ _failure
33
+ end
34
+
35
+ def include?(key)
36
+ @_attributes.include? key
37
+ end
38
+
39
+ def method_missing(method, *args, &block)
40
+ return @_attributes.fetch method if @_attributes.include? method
41
+
42
+ name = String method
43
+
44
+ if name.include? '='
45
+ name.gsub!(/=/, '')
46
+
47
+ @_attributes[:"#{name}"] = args.shift
48
+ else
49
+ super
50
+ end
51
+ end
52
+
53
+ def respond_to_missing?(method, private = false)
54
+ @_attributes.include?(method) || super
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,3 @@
1
+ module Cooperator
2
+ VERSION = '0.1.0'
3
+ end
data/lib/cooperator.rb ADDED
@@ -0,0 +1,58 @@
1
+ require 'cooperator/version'
2
+ require 'cooperator/context'
3
+
4
+ module Cooperator
5
+ module ClassMethods
6
+ def perform(context = {})
7
+ action = new context
8
+
9
+ catch :_finish do
10
+ action.perform
11
+ end
12
+
13
+ action.context
14
+ end
15
+ end
16
+
17
+ def context
18
+ @_context
19
+ end
20
+
21
+ def initialize(context = Context.new)
22
+ @_context = if context.is_a? Context
23
+ context
24
+ else
25
+ Context.new context
26
+ end
27
+ end
28
+
29
+ def cooperate(*actions)
30
+ actions.each do |action|
31
+ action.perform context
32
+
33
+ break if context.failure?
34
+ end
35
+ end
36
+
37
+ def self.prepended(base)
38
+ base.extend ClassMethods
39
+ end
40
+
41
+ private
42
+
43
+ def success!
44
+ context.success!
45
+ throw :_finish
46
+ end
47
+
48
+ def failure!
49
+ context.failure!
50
+ throw :_finish
51
+ end
52
+
53
+ def method_missing(method, *args, &block)
54
+ return context.send method, *args, &block if context.respond_to? method
55
+
56
+ super
57
+ end
58
+ end
data/spec/context.rb ADDED
@@ -0,0 +1,57 @@
1
+ require 'cooperator'
2
+
3
+ subject Cooperator::Context
4
+
5
+ spec 'dynamic setter and getter' do
6
+ context = Cooperator::Context.new
7
+ context.name = 'Apple'
8
+
9
+ assert context.name, :==, 'Apple'
10
+ end
11
+
12
+ spec '.new accepts a hash' do
13
+ context = Cooperator::Context.new name: 'Apple'
14
+
15
+ assert context.name, :==, 'Apple'
16
+ end
17
+
18
+ spec '#errors is an array' do
19
+ context = Cooperator::Context.new
20
+
21
+ assert context.errors, :is_a?, Array
22
+ end
23
+
24
+ spec '#success! marks the context as a success' do
25
+ context = Cooperator::Context.new
26
+ context.success!
27
+
28
+ assert context, :success?
29
+ refute context, :failure?
30
+ end
31
+
32
+ spec '#failure! marks the context as a failure' do
33
+ context = Cooperator::Context.new
34
+ context.failure!
35
+
36
+ assert context, :failure?
37
+ refute context, :success?
38
+ end
39
+
40
+ spec '#failure! accepts an error message' do
41
+ context = Cooperator::Context.new
42
+ context.failure! 'Failure!'
43
+
44
+ assert context.errors, :include?, 'Failure!'
45
+ end
46
+
47
+ spec '#include? returns true for an existing attribute' do
48
+ context = Cooperator::Context.new name: 'Apple'
49
+
50
+ assert context, :include?, :name
51
+ end
52
+
53
+ spec '#include? returns false for a non-existing attribute' do
54
+ context = Cooperator::Context.new
55
+
56
+ refute context, :include?, :name
57
+ end
data/spec/cooperate.rb ADDED
@@ -0,0 +1,77 @@
1
+ require 'cooperator'
2
+
3
+ class First
4
+ prepend Cooperator
5
+
6
+ def perform
7
+ context.first = 'first'
8
+ end
9
+ end
10
+
11
+ class Second
12
+ prepend Cooperator
13
+
14
+ def perform
15
+ context.second = 'second'
16
+ end
17
+ end
18
+
19
+ class Third
20
+ prepend Cooperator
21
+
22
+ def perform
23
+ context.third = 'third'
24
+ failure!
25
+ end
26
+ end
27
+
28
+ class Fourth
29
+ prepend Cooperator
30
+
31
+ def perform
32
+ context.fourth = 'fourth'
33
+ end
34
+ end
35
+
36
+ class Success
37
+ prepend Cooperator
38
+
39
+ def perform
40
+ cooperate First,
41
+ Second
42
+ end
43
+ end
44
+
45
+ class Failure
46
+ prepend Cooperator
47
+
48
+ def perform
49
+ cooperate First,
50
+ Second,
51
+ Third,
52
+ Fourth
53
+ end
54
+ end
55
+
56
+ subject Cooperator
57
+
58
+ scope 'no failure' do
59
+ spec '#cooperate performs the given actions' do
60
+ context = Success.perform
61
+
62
+ assert context.first, :==, 'first'
63
+ assert context.second, :==, 'second'
64
+ end
65
+ end
66
+
67
+ scope 'has failure' do
68
+ spec '#cooperate performs the given actions until a failure is met' do
69
+ context = Failure.perform
70
+
71
+ assert context.first, :==, 'first'
72
+ assert context.second, :==, 'second'
73
+ assert context.third, :==, 'third'
74
+ refute context, :include?, :fourth
75
+ end
76
+ end
77
+
@@ -0,0 +1,47 @@
1
+ require 'cooperator'
2
+
3
+ class Interactor
4
+ prepend Cooperator
5
+ end
6
+
7
+ subject Cooperator
8
+
9
+ spec '#success? delegates to context.success?' do
10
+ interactor = Interactor.new
11
+
12
+ interactor.context.success!
13
+
14
+ assert interactor, :success?
15
+
16
+ interactor.context.failure!
17
+
18
+ refute interactor, :success?
19
+ end
20
+
21
+ spec '#failure? delegates to context.failure?' do
22
+ interactor = Interactor.new
23
+
24
+ interactor.context.failure!
25
+
26
+ assert interactor, :failure?
27
+
28
+ interactor.context.success!
29
+
30
+ refute interactor, :failure?
31
+ end
32
+
33
+ spec '#include? delegates to context.include?' do
34
+ interactor = Interactor.new
35
+
36
+ refute interactor, :include?, :name
37
+
38
+ interactor.context.name = 'Apple'
39
+
40
+ assert interactor, :include?, :name
41
+ end
42
+
43
+ spec 'delegate to the current context' do
44
+ interactor = Interactor.new name: 'Apple'
45
+
46
+ assert interactor.name, :==, 'Apple'
47
+ end
data/spec/failure.rb ADDED
@@ -0,0 +1,32 @@
1
+ require 'cooperator'
2
+
3
+ class Failure
4
+ prepend Cooperator
5
+
6
+ def perform
7
+ $before = true
8
+ failure!
9
+ $after = true
10
+ end
11
+ end
12
+
13
+ prepare do
14
+ $before = false
15
+ $after = false
16
+ end
17
+
18
+ subject Cooperator
19
+
20
+ spec '.perform runs until #failure! is called' do
21
+ Failure.perform
22
+
23
+ assert $before
24
+ refute $after
25
+ end
26
+
27
+ spec '.perform returns a failure context' do
28
+ context = Failure.perform
29
+
30
+ assert context, :failure?
31
+ refute context, :success?
32
+ end
data/spec/success.rb ADDED
@@ -0,0 +1,59 @@
1
+ require 'cooperator'
2
+
3
+ class ImplicitSuccess
4
+ prepend Cooperator
5
+
6
+ def perform
7
+ $before = true
8
+ $after = true
9
+ end
10
+ end
11
+
12
+ class ExplicitSuccess
13
+ prepend Cooperator
14
+
15
+ def perform
16
+ $before = true
17
+ success!
18
+ $after = true
19
+ end
20
+ end
21
+
22
+ prepare do
23
+ $before = false
24
+ $after = false
25
+ end
26
+
27
+ subject Cooperator
28
+
29
+ scope 'implicit success' do
30
+ spec '.perform runs until #success! is called' do
31
+ ImplicitSuccess.perform
32
+
33
+ assert $before
34
+ assert $after
35
+ end
36
+
37
+ spec '.perform returns a success context' do
38
+ context = ImplicitSuccess.perform
39
+
40
+ assert context, :success?
41
+ refute context, :failure?
42
+ end
43
+ end
44
+
45
+ scope 'explicit success' do
46
+ spec '.perform runs until #success! is called' do
47
+ ExplicitSuccess.perform
48
+
49
+ assert $before
50
+ refute $after
51
+ end
52
+
53
+ spec '.perform returns a success context' do
54
+ context = ExplicitSuccess.perform
55
+
56
+ assert context, :success?
57
+ refute context, :failure?
58
+ end
59
+ end
metadata ADDED
@@ -0,0 +1,91 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cooperator
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Erol Fornoles
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-05-07 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.5'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.5'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
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: Simple cooperative interactors for Ruby
42
+ email:
43
+ - erol.fornoles@gmail.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - ".gitignore"
49
+ - Gemfile
50
+ - LICENSE.txt
51
+ - README.md
52
+ - Rakefile
53
+ - cooperator.gemspec
54
+ - lib/cooperator.rb
55
+ - lib/cooperator/context.rb
56
+ - lib/cooperator/version.rb
57
+ - spec/context.rb
58
+ - spec/cooperate.rb
59
+ - spec/cooperator.rb
60
+ - spec/failure.rb
61
+ - spec/success.rb
62
+ homepage: ''
63
+ licenses:
64
+ - MIT
65
+ metadata: {}
66
+ post_install_message:
67
+ rdoc_options: []
68
+ require_paths:
69
+ - lib
70
+ required_ruby_version: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ required_rubygems_version: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
80
+ requirements: []
81
+ rubyforge_project:
82
+ rubygems_version: 2.2.0
83
+ signing_key:
84
+ specification_version: 4
85
+ summary: Simple cooperative interactors for Ruby
86
+ test_files:
87
+ - spec/context.rb
88
+ - spec/cooperate.rb
89
+ - spec/cooperator.rb
90
+ - spec/failure.rb
91
+ - spec/success.rb