acting 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.
- checksums.yaml +7 -0
- data/.gitignore +3 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +17 -0
- data/README.md +46 -0
- data/Rakefile +14 -0
- data/acting.gemspec +21 -0
- data/lib/acting.rb +87 -0
- data/lib/acting/version.rb +3 -0
- data/spec/acting_spec.rb +28 -0
- data/spec/helper.rb +4 -0
- metadata +84 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: ef5b67668bb5848b366ab7b029fca9ea5a2c6d9b
|
4
|
+
data.tar.gz: 5eb68911bb33de5f3ff5afaece87bad4413c437d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 7ea10a69df14c3ee6000b2c4c91f5c6c1d3feec6b89c90c4f2ce37a6d6dced813289b02d692d46a36508e68f034f6fa30ae6c2b328d825298fed687b5338f47a
|
7
|
+
data.tar.gz: 15cc11a46691c3270cb9793798f3dbd7c44b360703df8f1a4195e8bd0dcdd5b7e9eadbb33e0586a82ebc5ab49f1093a0b661cea7058d3fd6f588bfb295f1576f
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
data/README.md
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
# Acting
|
2
|
+
|
3
|
+
Acting lets your objects play a role. But just for a specific duration.
|
4
|
+
One of the main-concepts for a clean DCI implementation.
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
|
8
|
+
Add this line to your application's Gemfile:
|
9
|
+
|
10
|
+
gem 'acting'
|
11
|
+
|
12
|
+
And then execute:
|
13
|
+
|
14
|
+
$ bundle
|
15
|
+
|
16
|
+
Or install it yourself as:
|
17
|
+
|
18
|
+
$ gem install acting
|
19
|
+
|
20
|
+
## Usage
|
21
|
+
|
22
|
+
It is as simple as this:
|
23
|
+
|
24
|
+
```ruby
|
25
|
+
module Positivist
|
26
|
+
def speak; 'YES'; end
|
27
|
+
end
|
28
|
+
|
29
|
+
module Negativist
|
30
|
+
def speak; 'NO'; end
|
31
|
+
end
|
32
|
+
|
33
|
+
Acting.new(user1 => Positivist, user2 => Negativist).play do
|
34
|
+
model1.speak # => 'YES'
|
35
|
+
model2.speak # => 'NO'
|
36
|
+
end
|
37
|
+
|
38
|
+
model1.speak # => NoMethodError
|
39
|
+
```
|
40
|
+
## Contributing
|
41
|
+
|
42
|
+
1. Fork it
|
43
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
44
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
45
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
46
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
require "rake/testtask"
|
3
|
+
|
4
|
+
Rake::TestTask.new(:spec) do |t|
|
5
|
+
t.libs << 'lib'
|
6
|
+
t.libs << 'spec'
|
7
|
+
t.pattern = 'spec/**/*_spec.rb'
|
8
|
+
t.verbose = false
|
9
|
+
end
|
10
|
+
|
11
|
+
# alias ofr convenience
|
12
|
+
task :test => :spec
|
13
|
+
|
14
|
+
task :default => :spec
|
data/acting.gemspec
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'acting/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "acting"
|
8
|
+
spec.version = Acting::VERSION
|
9
|
+
spec.authors = ["Jakob Holderbaum"]
|
10
|
+
spec.email = ["jakob@featurefabrik.de"]
|
11
|
+
spec.summary = %q{Let your objects play an acting - just for a while}
|
12
|
+
spec.homepage = ""
|
13
|
+
spec.license = "MIT"
|
14
|
+
|
15
|
+
spec.files = `git ls-files`.split($/)
|
16
|
+
spec.test_files = spec.files.grep(%r{^(spec)/})
|
17
|
+
spec.require_paths = ["lib"]
|
18
|
+
|
19
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
20
|
+
spec.add_development_dependency "rake"
|
21
|
+
end
|
data/lib/acting.rb
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
class Acting
|
2
|
+
def initialize(cast)
|
3
|
+
actors = cast.map do |actor, role|
|
4
|
+
Actor.new(actor, role)
|
5
|
+
end
|
6
|
+
|
7
|
+
@cast = Cast.new(actors)
|
8
|
+
end
|
9
|
+
|
10
|
+
def play(&block)
|
11
|
+
@cast.play
|
12
|
+
|
13
|
+
block.call
|
14
|
+
|
15
|
+
ensure
|
16
|
+
@cast.quit
|
17
|
+
end
|
18
|
+
|
19
|
+
class Cast
|
20
|
+
def initialize(actors)
|
21
|
+
@actors = actors
|
22
|
+
end
|
23
|
+
|
24
|
+
def play
|
25
|
+
@actors.each(&:play)
|
26
|
+
end
|
27
|
+
|
28
|
+
def quit
|
29
|
+
@actors.each(&:quit)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class Actor
|
34
|
+
def initialize(actor, role)
|
35
|
+
@actor = actor
|
36
|
+
@role = role
|
37
|
+
end
|
38
|
+
|
39
|
+
def play
|
40
|
+
assign_behaviour
|
41
|
+
end
|
42
|
+
|
43
|
+
def quit
|
44
|
+
revoke_behaviour
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
def actor_singleton_class
|
49
|
+
@singleton_class ||= (class << @actor; self; end)
|
50
|
+
end
|
51
|
+
|
52
|
+
def role_methods
|
53
|
+
unless @role_methods
|
54
|
+
if RUBY_VERSION =~ /^2/
|
55
|
+
object = @role
|
56
|
+
retrieval = :instance_method
|
57
|
+
method_names = @role.instance_methods
|
58
|
+
else
|
59
|
+
object = Object.new
|
60
|
+
object.extend @role
|
61
|
+
retrieval = :method
|
62
|
+
method_names = object.methods - Object.methods
|
63
|
+
end
|
64
|
+
|
65
|
+
@role_methods = method_names.map do |name|
|
66
|
+
object.send retrieval, name
|
67
|
+
end
|
68
|
+
end
|
69
|
+
@role_methods
|
70
|
+
end
|
71
|
+
|
72
|
+
def assign_behaviour
|
73
|
+
role_methods.each do |method|
|
74
|
+
actor_singleton_class.send :define_method, method.name, method
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
def revoke_behaviour
|
80
|
+
role_methods.each do |method|
|
81
|
+
if @actor.respond_to?(method.name)
|
82
|
+
actor_singleton_class.send :remove_method, method.name
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
data/spec/acting_spec.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe Acting do
|
4
|
+
it 'lets the whole cast play for duration of a block' do
|
5
|
+
Positivist = Module.new do
|
6
|
+
def speak
|
7
|
+
'YES'
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
Negativist = Module.new do
|
12
|
+
def speak
|
13
|
+
'NO'
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
model1 = Object.new
|
18
|
+
model2 = Object.new
|
19
|
+
|
20
|
+
Acting.new(model1 => Positivist, model2 => Negativist).play do
|
21
|
+
assert_equal 'YES', model1.speak
|
22
|
+
assert_equal 'NO', model2.speak
|
23
|
+
end
|
24
|
+
|
25
|
+
refute model1.respond_to?(:speak)
|
26
|
+
refute model2.respond_to?(:speak)
|
27
|
+
end
|
28
|
+
end
|
data/spec/helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: acting
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jakob Holderbaum
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-07-05 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.3'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.3'
|
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:
|
42
|
+
email:
|
43
|
+
- jakob@featurefabrik.de
|
44
|
+
executables: []
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files: []
|
47
|
+
files:
|
48
|
+
- .gitignore
|
49
|
+
- Gemfile
|
50
|
+
- Gemfile.lock
|
51
|
+
- README.md
|
52
|
+
- Rakefile
|
53
|
+
- acting.gemspec
|
54
|
+
- lib/acting.rb
|
55
|
+
- lib/acting/version.rb
|
56
|
+
- spec/acting_spec.rb
|
57
|
+
- spec/helper.rb
|
58
|
+
homepage: ''
|
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.0.3
|
79
|
+
signing_key:
|
80
|
+
specification_version: 4
|
81
|
+
summary: Let your objects play an acting - just for a while
|
82
|
+
test_files:
|
83
|
+
- spec/acting_spec.rb
|
84
|
+
- spec/helper.rb
|