direction 0.0.2 → 0.0.3
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 +4 -4
- data/README.md +17 -2
- data/lib/direction.rb +16 -1
- data/lib/direction/version.rb +1 -1
- data/test/direction_test.rb +43 -1
- data/test/sample.rb +83 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 727eb9585c633d12cc9995c9c73cc524eeba82ff
|
4
|
+
data.tar.gz: d069923519bf447766d13afbe2ab621137d229b4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c5e95f10ed99d01e632041d81d2157da594d5c46c8f3a85895b1ce70e47119345b66b77d29cd846582ae4c4b9bbe00b4766e7ebf21996bfbfb38e0ce58cfad8c
|
7
|
+
data.tar.gz: b84abee5835f01a005bfc615585e3bb71ba454088b012a63eac26a4f539c7afd7a907eb80e12ff0e6df96b506649e8663679868def45d6ce2902fec3931fd527
|
data/README.md
CHANGED
@@ -11,11 +11,26 @@ Provide a feature like the Forwardable library, but set the return value to self
|
|
11
11
|
It provides a class level "command" method to do message forwarding.
|
12
12
|
|
13
13
|
```ruby
|
14
|
-
class
|
14
|
+
class Person
|
15
15
|
extend Direction
|
16
16
|
|
17
|
-
command [:
|
17
|
+
command [:print_address] => :home
|
18
|
+
|
19
|
+
attr_accessor :home
|
20
|
+
end
|
21
|
+
|
22
|
+
class Home
|
23
|
+
def print_address(template)
|
24
|
+
template << "... the address.."
|
25
|
+
end
|
18
26
|
end
|
27
|
+
|
28
|
+
template = STDOUT
|
29
|
+
person = Person.new
|
30
|
+
person.home = Home.new
|
31
|
+
#commands won't leak internal structure and return the receiver of the command
|
32
|
+
person.print_address(template) #=> person
|
33
|
+
|
19
34
|
```
|
20
35
|
|
21
36
|
This will define methods on instances that forward to the provided receiver while enforcing encapsulation of the relationship between objects.
|
data/lib/direction.rb
CHANGED
@@ -7,7 +7,8 @@ require "direction/version"
|
|
7
7
|
# class SomeClass
|
8
8
|
# extend Direction
|
9
9
|
#
|
10
|
-
# command [:
|
10
|
+
# command [:print_details, :setup_things] => :collaborator
|
11
|
+
# query [:name, :id] => :collaborator, :type => :@partner
|
11
12
|
# end
|
12
13
|
#
|
13
14
|
# This will define methods on instances that forward to the
|
@@ -28,4 +29,18 @@ module Direction
|
|
28
29
|
end
|
29
30
|
self.class_eval method_defs.join(' '), __FILE__, __LINE__
|
30
31
|
end
|
32
|
+
|
33
|
+
def query(options)
|
34
|
+
method_defs = []
|
35
|
+
options.each_pair do |key, value|
|
36
|
+
Array(key).map do |command_name|
|
37
|
+
method_defs.unshift %{
|
38
|
+
def #{command_name}(*args, &block)
|
39
|
+
#{value}.__send__(:#{command_name}, *args, &block)
|
40
|
+
end
|
41
|
+
}
|
42
|
+
end
|
43
|
+
end
|
44
|
+
self.class_eval method_defs.join(' '), __FILE__, __LINE__
|
45
|
+
end
|
31
46
|
end
|
data/lib/direction/version.rb
CHANGED
data/test/direction_test.rb
CHANGED
@@ -3,6 +3,7 @@ require 'test_helper'
|
|
3
3
|
class Person
|
4
4
|
extend Direction
|
5
5
|
command [:make_me_a_sandwich, :cook] => :@friend
|
6
|
+
query [:activities, :go] => :friend
|
6
7
|
attr_accessor :friend
|
7
8
|
end
|
8
9
|
|
@@ -14,6 +15,14 @@ class Friend
|
|
14
15
|
def cook(what)
|
15
16
|
Menu.record what
|
16
17
|
end
|
18
|
+
|
19
|
+
def activities
|
20
|
+
'running, biking, hiking'
|
21
|
+
end
|
22
|
+
|
23
|
+
def go(do_what)
|
24
|
+
Activities.record do_what
|
25
|
+
end
|
17
26
|
end
|
18
27
|
|
19
28
|
module Menu
|
@@ -28,7 +37,19 @@ module Menu
|
|
28
37
|
end
|
29
38
|
end
|
30
39
|
|
31
|
-
|
40
|
+
module Activities
|
41
|
+
def self.record(text)
|
42
|
+
list << text
|
43
|
+
end
|
44
|
+
def self.list
|
45
|
+
@list ||= []
|
46
|
+
end
|
47
|
+
def self.clear
|
48
|
+
@list = []
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe Direction, 'command' do
|
32
53
|
let(:friend){ Friend.new }
|
33
54
|
let(:person){ person = Person.new
|
34
55
|
person.friend = friend
|
@@ -52,4 +73,25 @@ describe Direction do
|
|
52
73
|
person.cook('yum')
|
53
74
|
assert_includes Menu.list, "yum"
|
54
75
|
end
|
76
|
+
end
|
77
|
+
|
78
|
+
describe Direction, 'query' do
|
79
|
+
let(:friend){ Friend.new }
|
80
|
+
let(:person){ person = Person.new
|
81
|
+
person.friend = friend
|
82
|
+
person
|
83
|
+
}
|
84
|
+
before do
|
85
|
+
Activities.clear
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'forwards a message to another object' do
|
89
|
+
assert_includes person.activities, "running, biking, hiking"
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'forwards additional arguments' do
|
93
|
+
assert_equal [], Activities.list
|
94
|
+
person.go('have fun')
|
95
|
+
assert_includes Activities.list, "have fun"
|
96
|
+
end
|
55
97
|
end
|
data/test/sample.rb
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'direction'
|
2
|
+
|
3
|
+
class MicroManager
|
4
|
+
def initialize(server)
|
5
|
+
@server = server
|
6
|
+
end
|
7
|
+
attr_accessor :server
|
8
|
+
end
|
9
|
+
|
10
|
+
class Server
|
11
|
+
def initialize(kitchen)
|
12
|
+
@kitchen = kitchen
|
13
|
+
@accountant = kitchen.accountant
|
14
|
+
end
|
15
|
+
attr_reader :kitchen
|
16
|
+
attr_accessor :customer
|
17
|
+
|
18
|
+
def order_food(food)
|
19
|
+
puts "I'll put that order in for you right now"
|
20
|
+
sleep(2)
|
21
|
+
kitchen.make_food(food)
|
22
|
+
serve_food(food)
|
23
|
+
end
|
24
|
+
|
25
|
+
def serve_food(food)
|
26
|
+
retrieve_food(food)
|
27
|
+
sleep(2)
|
28
|
+
puts " <Server retrieved #{food}>"
|
29
|
+
return_to_customer(food)
|
30
|
+
end
|
31
|
+
|
32
|
+
def retrieve_food(food)
|
33
|
+
kitchen.provide_food(food)
|
34
|
+
end
|
35
|
+
|
36
|
+
def return_to_customer(food)
|
37
|
+
puts "Here's your order of #{food}"
|
38
|
+
end
|
39
|
+
|
40
|
+
def pay_bill
|
41
|
+
@accountant.accept_funds
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
class Kitchen
|
46
|
+
def make_food(food)
|
47
|
+
puts " <Kitchen preparing #{food}>"
|
48
|
+
sleep(3)
|
49
|
+
puts " <Kitchen made #{food}>"
|
50
|
+
end
|
51
|
+
|
52
|
+
def provide_food(food)
|
53
|
+
puts " <Kitchen served up #{food}>"
|
54
|
+
end
|
55
|
+
|
56
|
+
def accountant
|
57
|
+
@accountant ||= Accountant.new
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
class Accountant
|
62
|
+
def accept_funds
|
63
|
+
puts " $$$ Cha-ching!"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
class Customer
|
68
|
+
extend Direction
|
69
|
+
def initialize(server)
|
70
|
+
@server = server
|
71
|
+
end
|
72
|
+
attr_accessor :server
|
73
|
+
|
74
|
+
command [:order_food, :pay_bill] => :server
|
75
|
+
end
|
76
|
+
|
77
|
+
def setup
|
78
|
+
@kitchen = Kitchen.new
|
79
|
+
@server = Server.new(@kitchen)
|
80
|
+
@manager = MicroManager.new(@server)
|
81
|
+
@customer = Customer.new(@server)
|
82
|
+
@manager
|
83
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: direction
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- "'Jim Gay'"
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-08-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -54,6 +54,7 @@ files:
|
|
54
54
|
- lib/direction.rb
|
55
55
|
- lib/direction/version.rb
|
56
56
|
- test/direction_test.rb
|
57
|
+
- test/sample.rb
|
57
58
|
- test/test_helper.rb
|
58
59
|
homepage: ''
|
59
60
|
licenses:
|
@@ -81,4 +82,5 @@ specification_version: 4
|
|
81
82
|
summary: Forward messages to collaborators in East-oriented style.
|
82
83
|
test_files:
|
83
84
|
- test/direction_test.rb
|
85
|
+
- test/sample.rb
|
84
86
|
- test/test_helper.rb
|