role_playing 0.1.0 → 0.1.2
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 +1 -0
- data/.travis.yml +7 -0
- data/README.md +74 -58
- data/lib/role_playing.rb +2 -1
- data/lib/role_playing/context.rb +1 -1
- data/lib/role_playing/railtie.rb +9 -3
- data/lib/role_playing/version.rb +1 -1
- data/role_playing.gemspec +1 -1
- metadata +16 -25
- data/lib/role_playing/engine.rb +0 -4
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 0bb79da3d2d1f840906ef6a9b5007a4c3341a354
|
4
|
+
data.tar.gz: 116bd8cddd8b97b7bf4b47fedf49d2090c8fbf70
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a6e6e30ede28a81b584185b3d4e113f81bcb5a33ab96f5e74d285404f5b504ae7d0d982c4e0944345faf83796b4321123104d1652f54f28afc30686edbedf025
|
7
|
+
data.tar.gz: 558d0d07a4bfe621689d2524f6bf33ecb608523f5d3a3819dc3b3dafa0db3ed53d1b28fdc94c9a62a8f0c3a8b127a1cf69adc2d16293940b97e9c18cdd601bb5
|
data/.gitignore
CHANGED
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
[](https://travis-ci.org/johnae/role_playing)
|
2
|
+
|
1
3
|
# RolePlaying
|
2
4
|
|
3
5
|
A ruby DCI implementation using SimpleDelegator. This was extracted from a Rails app I'm working on. It's a very simple and straightforward implementation.
|
@@ -15,7 +17,9 @@ A further comment on 2 is that it means EVERY time you call extend it blows Ruby
|
|
15
17
|
|
16
18
|
Add this line to your application's Gemfile:
|
17
19
|
|
18
|
-
|
20
|
+
```ruby
|
21
|
+
gem 'role_playing'
|
22
|
+
```
|
19
23
|
|
20
24
|
And then execute:
|
21
25
|
|
@@ -29,85 +33,97 @@ Or install it yourself as:
|
|
29
33
|
|
30
34
|
Using it is as simple as defining (usually) a context like so:
|
31
35
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
end
|
48
|
-
|
49
|
-
role :SourceAccount do
|
50
|
-
def withdraw(amount)
|
51
|
-
self.amount=self.amount-amount
|
52
|
-
amount
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
role :DestinationAccount do
|
57
|
-
def deposit(amount)
|
58
|
-
self.amount=self.amount+amount
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
36
|
+
```ruby
|
37
|
+
class MoneyTransferring
|
38
|
+
include RolePlaying::Context
|
39
|
+
|
40
|
+
def initialize(from_account, to_account)
|
41
|
+
@from_account = from_account
|
42
|
+
@to_account = to_account
|
43
|
+
end
|
44
|
+
def call(amount)
|
45
|
+
## this is a little contrived I know
|
46
|
+
## it could be easily implemented using
|
47
|
+
## increment/decrement methods - just
|
48
|
+
## showing the block syntax here
|
49
|
+
SourceAccount(@from_account) do |source_account|
|
50
|
+
DestinationAccount(@to_account).deposit(source_account.withdraw(amount))
|
62
51
|
end
|
52
|
+
end
|
63
53
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
end
|
54
|
+
role :SourceAccount do
|
55
|
+
def withdraw(amount)
|
56
|
+
self.amount=self.amount-amount
|
57
|
+
amount
|
69
58
|
end
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
59
|
+
end
|
60
|
+
|
61
|
+
role :DestinationAccount do
|
62
|
+
def deposit(amount)
|
63
|
+
self.amount=self.amount+amount
|
74
64
|
end
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
```
|
69
|
+
|
70
|
+
Or roles by themselves like so:
|
71
|
+
|
72
|
+
```ruby
|
73
|
+
class MyRole < RolePlaying::Role
|
74
|
+
def my_additional_method
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
class MyOtherRole < RolePlaying::Role
|
79
|
+
def my_other_method
|
80
|
+
end
|
81
|
+
end
|
82
|
+
```
|
75
83
|
|
76
84
|
And, if defined by themselves, they can be applied in a few ways:
|
77
85
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
86
|
+
```ruby
|
87
|
+
## our data object which will play different roles (eg. get new/different behavior within a context)
|
88
|
+
class MyDataObject
|
89
|
+
end
|
90
|
+
|
91
|
+
MyRole.played_by(MyDataObject) do |role|
|
92
|
+
role.my_additional_method
|
93
|
+
end
|
94
|
+
```
|
85
95
|
|
86
96
|
or
|
87
97
|
|
88
|
-
|
89
|
-
|
98
|
+
```ruby
|
99
|
+
role = MyRole.played_by(MyDataObject)
|
100
|
+
role.my_additional_method
|
101
|
+
```
|
90
102
|
|
91
103
|
several roles can be applied too like so:
|
92
104
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
105
|
+
```ruby
|
106
|
+
[MyRole, MyOtherRole].played_by(MyDataObject) do |role|
|
107
|
+
role.my_additional_method
|
108
|
+
role.my_other_method
|
109
|
+
end
|
110
|
+
```
|
97
111
|
|
98
112
|
or
|
99
113
|
|
100
|
-
|
101
|
-
|
102
|
-
|
114
|
+
```ruby
|
115
|
+
role = [MyRole, MyOtherRole].played_by(MyDataObject)
|
116
|
+
role.my_additional_method
|
117
|
+
role.my_other_method
|
118
|
+
```
|
103
119
|
|
104
|
-
Within a context a role is defined by the role class method. The syntax sugar of applying a role - eg. MyRole(MyDataObject) do |role| - is only available within classes including the
|
120
|
+
Within a context a role is defined by the role class method. The syntax sugar of applying a role - eg. MyRole(MyDataObject) do |role| - is only available within classes including the RolePlaying::Context module. This was the way I envisioned it - to basically keep all code concerning a context within the same file (and inside the context class).
|
105
121
|
|
106
122
|
Please read the specs for a better understanding. Also please look up DCI (data, context, interaction) for a better understanding of what this is trying to accomplish.
|
107
123
|
|
108
124
|
## RSpec
|
109
125
|
|
110
|
-
|
126
|
+
There's an RSpec extension included which basically aliases RSpecs context to role so the language used in RSpec can be closer to DCI when testing these things.
|
111
127
|
To use that extension just do require 'role_playing/rspec_role' in your spec_helper. Look at the specs in this gem to see what I mean.
|
112
128
|
|
113
129
|
## Rails
|
data/lib/role_playing.rb
CHANGED
data/lib/role_playing/context.rb
CHANGED
@@ -4,7 +4,7 @@ module RolePlaying
|
|
4
4
|
base.extend(ClassMethods)
|
5
5
|
end
|
6
6
|
module ClassMethods
|
7
|
-
## this seemed
|
7
|
+
## this seemed too dangerous to use
|
8
8
|
## it enabled us to use Constants when
|
9
9
|
## defining roles but would also not
|
10
10
|
## warn about missing constants - which is pretty bad
|
data/lib/role_playing/railtie.rb
CHANGED
@@ -1,9 +1,15 @@
|
|
1
|
-
require 'rails'
|
1
|
+
require 'rails/railtie'
|
2
2
|
|
3
3
|
module RolePlaying
|
4
|
-
class Railtie <
|
5
|
-
|
4
|
+
class Railtie < Rails::Railtie #:nodoc:
|
5
|
+
|
6
|
+
config.after_initialize do |app|
|
6
7
|
config.autoload_paths += %W(#{config.root}/app/contexts)
|
8
|
+
## this seems necessary
|
9
|
+
Dir["#{config.root}/app/contexts/*"].each do |ctx|
|
10
|
+
require_dependency ctx
|
11
|
+
end
|
7
12
|
end
|
13
|
+
|
8
14
|
end
|
9
15
|
end
|
data/lib/role_playing/version.rb
CHANGED
data/role_playing.gemspec
CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |gem|
|
|
18
18
|
gem.require_paths = ["lib"]
|
19
19
|
|
20
20
|
gem.add_development_dependency("rspec", ">= 2.12.0")
|
21
|
-
gem.add_development_dependency("bundler"
|
21
|
+
gem.add_development_dependency("bundler")
|
22
22
|
|
23
23
|
gem.add_dependency("activesupport", ">= 3.0.0")
|
24
24
|
end
|
metadata
CHANGED
@@ -1,62 +1,55 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: role_playing
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
5
|
-
prerelease:
|
4
|
+
version: 0.1.2
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- John Axel Eriksson
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-02
|
11
|
+
date: 2013-09-02 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: rspec
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: 2.12.0
|
22
20
|
type: :development
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - '>='
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: 2.12.0
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: bundler
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - '>='
|
36
32
|
- !ruby/object:Gem::Version
|
37
|
-
version:
|
33
|
+
version: '0'
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - '>='
|
44
39
|
- !ruby/object:Gem::Version
|
45
|
-
version:
|
40
|
+
version: '0'
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: activesupport
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- -
|
45
|
+
- - '>='
|
52
46
|
- !ruby/object:Gem::Version
|
53
47
|
version: 3.0.0
|
54
48
|
type: :runtime
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- -
|
52
|
+
- - '>='
|
60
53
|
- !ruby/object:Gem::Version
|
61
54
|
version: 3.0.0
|
62
55
|
description: A ruby DCI implementation
|
@@ -67,6 +60,7 @@ extensions: []
|
|
67
60
|
extra_rdoc_files: []
|
68
61
|
files:
|
69
62
|
- .gitignore
|
63
|
+
- .travis.yml
|
70
64
|
- Gemfile
|
71
65
|
- LICENSE.txt
|
72
66
|
- README.md
|
@@ -74,7 +68,6 @@ files:
|
|
74
68
|
- lib/role_playing.rb
|
75
69
|
- lib/role_playing/context.rb
|
76
70
|
- lib/role_playing/core_ext.rb
|
77
|
-
- lib/role_playing/engine.rb
|
78
71
|
- lib/role_playing/railtie.rb
|
79
72
|
- lib/role_playing/role.rb
|
80
73
|
- lib/role_playing/rspec_role.rb
|
@@ -84,29 +77,27 @@ files:
|
|
84
77
|
- spec/spec_helper.rb
|
85
78
|
homepage: ''
|
86
79
|
licenses: []
|
80
|
+
metadata: {}
|
87
81
|
post_install_message:
|
88
82
|
rdoc_options: []
|
89
83
|
require_paths:
|
90
84
|
- lib
|
91
85
|
required_ruby_version: !ruby/object:Gem::Requirement
|
92
|
-
none: false
|
93
86
|
requirements:
|
94
|
-
- -
|
87
|
+
- - '>='
|
95
88
|
- !ruby/object:Gem::Version
|
96
89
|
version: '0'
|
97
90
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
98
|
-
none: false
|
99
91
|
requirements:
|
100
|
-
- -
|
92
|
+
- - '>='
|
101
93
|
- !ruby/object:Gem::Version
|
102
94
|
version: '0'
|
103
95
|
requirements: []
|
104
96
|
rubyforge_project:
|
105
|
-
rubygems_version:
|
97
|
+
rubygems_version: 2.0.2
|
106
98
|
signing_key:
|
107
|
-
specification_version:
|
99
|
+
specification_version: 4
|
108
100
|
summary: A ruby DCI implementation
|
109
101
|
test_files:
|
110
102
|
- spec/role_playing/role_playing_spec.rb
|
111
103
|
- spec/spec_helper.rb
|
112
|
-
has_rdoc:
|
data/lib/role_playing/engine.rb
DELETED